From 261f28698a8d5d4326813bbf65d944bae9aaea58 Mon Sep 17 00:00:00 2001 From: Casper Warden <216465704+casperwardensl@users.noreply.github.com> Date: Fri, 24 Nov 2017 17:45:34 +0000 Subject: [PATCH] Latest packet handling, parsing, enums, generators, etc.. --- example/npm-debug.log | 48 - example/testBot.js | 3 + lib/LoginHandler.ts | 2 +- lib/classes/Circuit.ts | 7 + lib/classes/IPAddress.ts | 34 + lib/classes/LoginResponse.ts | 1 - lib/classes/MessageClasses.ts | 966 ++++++++++++++++++ lib/classes/MessageDecoder.ts | 14 + lib/classes/Packet.ts | 2 + lib/classes/Quaternion.ts | 33 + lib/classes/Region.ts | 1 + lib/classes/UUID.ts | 19 +- lib/classes/Vector3.ts | 51 + lib/classes/Vector4.ts | 30 + lib/classes/packets/AbortXfer.ts | 30 + lib/classes/packets/AcceptCallingCard.ts | 58 ++ lib/classes/packets/AcceptFriendship.ts | 58 ++ lib/classes/packets/ActivateGestures.ts | 66 ++ lib/classes/packets/ActivateGroup.ts | 34 + lib/classes/packets/AddCircuitCode.ts | 34 + lib/classes/packets/AgentAlertMessage.ts | 36 + lib/classes/packets/AgentAnimation.ts | 72 ++ lib/classes/packets/AgentCachedTexture.ts | 58 ++ .../packets/AgentCachedTextureResponse.ts | 64 ++ lib/classes/packets/AgentDataUpdate.ts | 60 ++ lib/classes/packets/AgentDataUpdateRequest.ts | 28 + lib/classes/packets/AgentDropGroup.ts | 28 + lib/classes/packets/AgentFOV.ts | 50 + lib/classes/packets/AgentGroupDataUpdate.ts | 72 ++ lib/classes/packets/AgentHeightWidth.ts | 56 + lib/classes/packets/AgentIsNowWearing.ts | 52 + lib/classes/packets/AgentMovementComplete.ts | 68 ++ lib/classes/packets/AgentPause.ts | 34 + lib/classes/packets/AgentQuitCopy.ts | 38 + lib/classes/packets/AgentRequestSit.ts | 44 + lib/classes/packets/AgentResume.ts | 34 + lib/classes/packets/AgentSetAppearance.ts | 92 ++ lib/classes/packets/AgentSit.ts | 28 + lib/classes/packets/AgentThrottle.ts | 50 + lib/classes/packets/AgentUpdate.ts | 84 ++ lib/classes/packets/AgentWearablesRequest.ts | 28 + lib/classes/packets/AgentWearablesUpdate.ts | 64 ++ lib/classes/packets/AlertMessage.ts | 68 ++ lib/classes/packets/AssetUploadComplete.ts | 30 + lib/classes/packets/AssetUploadRequest.ts | 40 + lib/classes/packets/AtomicPassObject.ts | 26 + lib/classes/packets/AttachedSound.ts | 44 + .../packets/AttachedSoundGainChange.ts | 28 + lib/classes/packets/AvatarAnimation.ts | 88 ++ lib/classes/packets/AvatarAppearance.ts | 104 ++ lib/classes/packets/AvatarClassifiedReply.ts | 54 + lib/classes/packets/AvatarGroupsReply.ts | 86 ++ lib/classes/packets/AvatarInterestsReply.ts | 62 ++ lib/classes/packets/AvatarInterestsUpdate.ts | 62 ++ lib/classes/packets/AvatarNotesReply.ts | 38 + lib/classes/packets/AvatarNotesUpdate.ts | 44 + lib/classes/packets/AvatarPickerReply.ts | 60 ++ lib/classes/packets/AvatarPickerRequest.ts | 44 + .../packets/AvatarPickerRequestBackend.ts | 48 + lib/classes/packets/AvatarPicksReply.ts | 54 + lib/classes/packets/AvatarPropertiesReply.ts | 86 ++ .../packets/AvatarPropertiesRequest.ts | 34 + .../packets/AvatarPropertiesRequestBackend.ts | 36 + lib/classes/packets/AvatarPropertiesUpdate.ts | 70 ++ lib/classes/packets/AvatarSitResponse.ts | 58 ++ lib/classes/packets/AvatarTextureUpdate.ts | 76 ++ lib/classes/packets/BulkUpdateInventory.ts | 202 ++++ lib/classes/packets/BuyObjectInventory.ts | 50 + lib/classes/packets/CameraConstraint.ts | 22 + lib/classes/packets/CancelAuction.ts | 32 + .../packets/ChangeInventoryItemFlags.ts | 54 + lib/classes/packets/ChangeUserRights.ts | 48 + lib/classes/packets/ChatFromSimulator.ts | 58 ++ lib/classes/packets/ChatFromViewer.ts | 48 + lib/classes/packets/ChatPass.ts | 70 ++ lib/classes/packets/CheckParcelAuctions.ts | 34 + lib/classes/packets/CheckParcelSales.ts | 34 + lib/classes/packets/ChildAgentAlive.ts | 42 + lib/classes/packets/ChildAgentDying.ts | 28 + .../packets/ChildAgentPositionUpdate.ts | 88 ++ lib/classes/packets/ChildAgentUnknown.ts | 28 + lib/classes/packets/ChildAgentUpdate.ts | 344 +++++++ lib/classes/packets/ClassifiedDelete.ts | 38 + lib/classes/packets/ClassifiedGodDelete.ts | 44 + lib/classes/packets/ClassifiedInfoReply.ts | 114 +++ lib/classes/packets/ClassifiedInfoRequest.ts | 38 + lib/classes/packets/ClassifiedInfoUpdate.ts | 90 ++ .../packets/ClearFollowCamProperties.ts | 22 + lib/classes/packets/CloseCircuit.ts | 10 + lib/classes/packets/CoarseLocationUpdate.ts | 74 ++ lib/classes/packets/CompleteAgentMovement.ts | 34 + lib/classes/packets/CompleteAuction.ts | 32 + lib/classes/packets/CompletePingCheck.ts | 20 + lib/classes/packets/ConfirmAuctionStart.ts | 28 + lib/classes/packets/ConfirmEnableSimulator.ts | 28 + lib/classes/packets/ConfirmXferPacket.ts | 30 + .../packets/CopyInventoryFromNotecard.ts | 70 ++ lib/classes/packets/CopyInventoryItem.ts | 72 ++ lib/classes/packets/CreateGroupReply.ts | 42 + lib/classes/packets/CreateGroupRequest.ts | 72 ++ .../packets/CreateGroupRequestExtended.ts | 78 ++ lib/classes/packets/CreateInventoryFolder.ts | 54 + lib/classes/packets/CreateInventoryItem.ts | 80 ++ lib/classes/packets/CreateLandmarkForEvent.ts | 54 + .../packets/CreateNewOutfitAttachments.ts | 64 ++ lib/classes/packets/CreateTrustedCircuit.ts | 28 + lib/classes/packets/CrossedRegion.ts | 74 ++ lib/classes/packets/DataHomeLocationReply.ts | 42 + .../packets/DataHomeLocationRequest.ts | 38 + lib/classes/packets/DataServerLogout.ts | 38 + lib/classes/packets/DeRezAck.ts | 26 + lib/classes/packets/DeRezObject.ts | 82 ++ lib/classes/packets/DeactivateGestures.ts | 60 ++ lib/classes/packets/DeclineCallingCard.ts | 38 + lib/classes/packets/DeclineFriendship.ts | 38 + lib/classes/packets/DenyTrustedCircuit.ts | 22 + lib/classes/packets/DerezContainer.ts | 26 + .../packets/DetachAttachmentIntoInv.ts | 28 + lib/classes/packets/DirClassifiedQuery.ts | 62 ++ .../packets/DirClassifiedQueryBackend.ts | 66 ++ lib/classes/packets/DirClassifiedReply.ts | 100 ++ lib/classes/packets/DirEventsReply.ts | 102 ++ lib/classes/packets/DirFindQuery.ts | 56 + lib/classes/packets/DirFindQueryBackend.ts | 60 ++ lib/classes/packets/DirGroupsReply.ts | 70 ++ lib/classes/packets/DirLandQuery.ts | 68 ++ lib/classes/packets/DirLandQueryBackend.ts | 72 ++ lib/classes/packets/DirLandReply.ts | 78 ++ lib/classes/packets/DirPeopleReply.ts | 80 ++ lib/classes/packets/DirPlacesQuery.ts | 66 ++ lib/classes/packets/DirPlacesQueryBackend.ts | 70 ++ lib/classes/packets/DirPlacesReply.ts | 102 ++ lib/classes/packets/DirPopularQuery.ts | 44 + lib/classes/packets/DirPopularQueryBackend.ts | 48 + lib/classes/packets/DirPopularReply.ts | 64 ++ lib/classes/packets/DisableSimulator.ts | 10 + lib/classes/packets/EconomyData.ts | 118 +++ lib/classes/packets/EconomyDataRequest.ts | 10 + lib/classes/packets/EdgeDataPacket.ts | 30 + lib/classes/packets/EjectGroupMemberReply.ts | 40 + .../packets/EjectGroupMemberRequest.ts | 58 ++ lib/classes/packets/EjectUser.ts | 44 + lib/classes/packets/EmailMessageReply.ts | 58 ++ lib/classes/packets/EmailMessageRequest.ts | 34 + lib/classes/packets/EnableSimulator.ts | 36 + lib/classes/packets/Error.ts | 62 ++ lib/classes/packets/EstateCovenantReply.ts | 40 + lib/classes/packets/EstateCovenantRequest.ts | 28 + lib/classes/packets/EstateOwnerMessage.ts | 70 ++ lib/classes/packets/EventGodDelete.ts | 66 ++ lib/classes/packets/EventInfoReply.ts | 104 ++ lib/classes/packets/EventInfoRequest.ts | 38 + lib/classes/packets/EventLocationReply.ts | 42 + lib/classes/packets/EventLocationRequest.ts | 32 + .../packets/EventNotificationAddRequest.ts | 38 + .../packets/EventNotificationRemoveRequest.ts | 38 + lib/classes/packets/FeatureDisabled.ts | 34 + lib/classes/packets/FetchInventory.ts | 54 + .../packets/FetchInventoryDescendents.ts | 58 ++ lib/classes/packets/FetchInventoryReply.ts | 154 +++ lib/classes/packets/FindAgent.ts | 60 ++ lib/classes/packets/ForceObjectSelect.ts | 40 + .../packets/ForceScriptControlRelease.ts | 28 + lib/classes/packets/FormFriendship.ts | 28 + lib/classes/packets/FreezeUser.ts | 44 + lib/classes/packets/GenericMessage.ts | 70 ++ lib/classes/packets/GetScriptRunning.ts | 28 + lib/classes/packets/GodKickUser.ts | 46 + lib/classes/packets/GodUpdateRegionInfo.ts | 102 ++ lib/classes/packets/GodlikeMessage.ts | 70 ++ lib/classes/packets/GrantGodlikePowers.ts | 42 + lib/classes/packets/GrantUserRights.ts | 54 + .../packets/GroupAccountDetailsReply.ts | 82 ++ .../packets/GroupAccountDetailsRequest.ts | 56 + .../packets/GroupAccountSummaryReply.ts | 152 +++ .../packets/GroupAccountSummaryRequest.ts | 56 + .../packets/GroupAccountTransactionsReply.ts | 100 ++ .../GroupAccountTransactionsRequest.ts | 56 + .../packets/GroupActiveProposalItemReply.ts | 116 +++ .../packets/GroupActiveProposalsRequest.ts | 48 + lib/classes/packets/GroupDataUpdate.ts | 52 + lib/classes/packets/GroupMembersReply.ts | 94 ++ lib/classes/packets/GroupMembersRequest.ts | 44 + lib/classes/packets/GroupNoticeAdd.ts | 60 ++ lib/classes/packets/GroupNoticeRequest.ts | 38 + lib/classes/packets/GroupNoticesListReply.ts | 74 ++ .../packets/GroupNoticesListRequest.ts | 38 + lib/classes/packets/GroupProfileReply.ts | 116 +++ lib/classes/packets/GroupProfileRequest.ts | 38 + lib/classes/packets/GroupProposalBallot.ts | 50 + lib/classes/packets/GroupRoleChanges.ts | 66 ++ lib/classes/packets/GroupRoleDataReply.ts | 96 ++ lib/classes/packets/GroupRoleDataRequest.ts | 44 + lib/classes/packets/GroupRoleMembersReply.ts | 66 ++ .../packets/GroupRoleMembersRequest.ts | 44 + lib/classes/packets/GroupRoleUpdate.ts | 84 ++ lib/classes/packets/GroupTitleUpdate.ts | 40 + lib/classes/packets/GroupTitlesReply.ts | 64 ++ lib/classes/packets/GroupTitlesRequest.ts | 40 + .../packets/GroupVoteHistoryItemReply.ts | 140 +++ .../packets/GroupVoteHistoryRequest.ts | 48 + lib/classes/packets/HealthMessage.ts | 22 + lib/classes/packets/ImageData.ts | 48 + lib/classes/packets/ImageNotInDatabase.ts | 22 + lib/classes/packets/ImagePacket.ts | 38 + lib/classes/packets/ImprovedInstantMessage.ts | 108 ++ .../packets/ImprovedTerseObjectUpdate.ts | 56 + lib/classes/packets/InitiateDownload.ts | 38 + lib/classes/packets/InternalScriptMail.ts | 40 + lib/classes/packets/InventoryAssetResponse.ts | 32 + lib/classes/packets/InventoryDescendents.ts | 214 ++++ lib/classes/packets/InviteGroupRequest.ts | 64 ++ lib/classes/packets/InviteGroupResponse.ts | 56 + lib/classes/packets/JoinGroupReply.ts | 36 + lib/classes/packets/JoinGroupRequest.ts | 38 + .../packets/JoinGroupRequestExtended.ts | 44 + lib/classes/packets/KickUser.ts | 50 + lib/classes/packets/KickUserAck.ts | 28 + lib/classes/packets/KillChildAgents.ts | 22 + lib/classes/packets/KillObject.ts | 32 + lib/classes/packets/LandStatReply.ts | 96 ++ lib/classes/packets/LandStatRequest.ts | 56 + lib/classes/packets/LayerData.ts | 30 + lib/classes/packets/LeaveGroupReply.ts | 36 + lib/classes/packets/LeaveGroupRequest.ts | 38 + lib/classes/packets/LinkInventoryItem.ts | 76 ++ lib/classes/packets/LiveHelpGroupReply.ts | 34 + lib/classes/packets/LiveHelpGroupRequest.ts | 28 + lib/classes/packets/LoadURL.ts | 50 + lib/classes/packets/LogDwellTime.ts | 60 ++ .../packets/LogFailedMoneyTransaction.ts | 78 ++ lib/classes/packets/LogParcelChanges.ts | 80 ++ lib/classes/packets/LogTextMessage.ts | 62 ++ lib/classes/packets/LogoutReply.ts | 48 + lib/classes/packets/LogoutRequest.ts | 28 + lib/classes/packets/MapBlockReply.ts | 84 ++ lib/classes/packets/MapBlockRequest.ts | 72 ++ lib/classes/packets/MapItemReply.ts | 88 ++ lib/classes/packets/MapItemRequest.ts | 62 ++ lib/classes/packets/MapLayerReply.ts | 72 ++ lib/classes/packets/MapLayerRequest.ts | 44 + lib/classes/packets/MapNameRequest.ts | 54 + lib/classes/packets/MeanCollisionAlert.ts | 54 + lib/classes/packets/MergeParcel.ts | 42 + lib/classes/packets/ModifyLand.ts | 116 +++ lib/classes/packets/MoneyBalanceReply.ts | 98 ++ lib/classes/packets/MoneyBalanceRequest.ts | 38 + lib/classes/packets/MoneyTransferBackend.ts | 88 ++ lib/classes/packets/MoneyTransferRequest.ts | 74 ++ lib/classes/packets/MoveInventoryFolder.ts | 58 ++ lib/classes/packets/MoveInventoryItem.ts | 64 ++ lib/classes/packets/MoveTaskInventory.ts | 50 + lib/classes/packets/MultipleObjectUpdate.ts | 58 ++ lib/classes/packets/MuteListRequest.ts | 38 + lib/classes/packets/MuteListUpdate.ts | 28 + lib/classes/packets/NameValuePair.ts | 42 + .../packets/NearestLandingRegionReply.ts | 24 + .../packets/NearestLandingRegionRequest.ts | 24 + .../packets/NearestLandingRegionUpdated.ts | 24 + lib/classes/packets/NeighborList.ts | 64 ++ lib/classes/packets/NetTest.ts | 22 + lib/classes/packets/ObjectAdd.ts | 176 ++++ lib/classes/packets/ObjectAttach.ts | 58 ++ lib/classes/packets/ObjectBuy.ts | 70 ++ lib/classes/packets/ObjectCategory.ts | 54 + lib/classes/packets/ObjectClickAction.ts | 52 + lib/classes/packets/ObjectDeGrab.ts | 88 ++ lib/classes/packets/ObjectDelete.ts | 52 + lib/classes/packets/ObjectDelink.ts | 48 + lib/classes/packets/ObjectDescription.ts | 54 + lib/classes/packets/ObjectDeselect.ts | 48 + lib/classes/packets/ObjectDetach.ts | 48 + lib/classes/packets/ObjectDrop.ts | 48 + lib/classes/packets/ObjectDuplicate.ts | 70 ++ lib/classes/packets/ObjectDuplicateOnRay.ts | 94 ++ lib/classes/packets/ObjectExportSelected.ts | 54 + lib/classes/packets/ObjectExtraParams.ts | 70 ++ lib/classes/packets/ObjectFlagUpdate.ts | 92 ++ lib/classes/packets/ObjectGrab.ts | 94 ++ lib/classes/packets/ObjectGrabUpdate.ts | 106 ++ lib/classes/packets/ObjectGroup.ts | 54 + lib/classes/packets/ObjectImage.ts | 60 ++ lib/classes/packets/ObjectIncludeInSearch.ts | 52 + lib/classes/packets/ObjectLink.ts | 48 + lib/classes/packets/ObjectMaterial.ts | 52 + lib/classes/packets/ObjectName.ts | 54 + lib/classes/packets/ObjectOwner.ts | 68 ++ lib/classes/packets/ObjectPermissions.ts | 70 ++ lib/classes/packets/ObjectPosition.ts | 54 + lib/classes/packets/ObjectProperties.ts | 182 ++++ lib/classes/packets/ObjectPropertiesFamily.ts | 110 ++ lib/classes/packets/ObjectRotation.ts | 54 + lib/classes/packets/ObjectSaleInfo.ts | 58 ++ lib/classes/packets/ObjectScale.ts | 54 + lib/classes/packets/ObjectSelect.ts | 48 + lib/classes/packets/ObjectShape.ts | 130 +++ lib/classes/packets/ObjectSpinStart.ts | 38 + lib/classes/packets/ObjectSpinStop.ts | 38 + lib/classes/packets/ObjectSpinUpdate.ts | 44 + lib/classes/packets/ObjectUpdate.ts | 282 +++++ lib/classes/packets/ObjectUpdateCached.ts | 62 ++ lib/classes/packets/ObjectUpdateCompressed.ts | 56 + lib/classes/packets/OfferCallingCard.ts | 44 + lib/classes/packets/OfflineNotification.ts | 32 + lib/classes/packets/OnlineNotification.ts | 32 + lib/classes/packets/OpenCircuit.ts | 28 + lib/classes/packets/PacketAck.ts | 32 + lib/classes/packets/ParcelAccessListReply.ts | 72 ++ .../packets/ParcelAccessListRequest.ts | 50 + lib/classes/packets/ParcelAccessListUpdate.ts | 94 ++ lib/classes/packets/ParcelAuctions.ts | 38 + lib/classes/packets/ParcelBuy.ts | 72 ++ lib/classes/packets/ParcelBuyPass.ts | 38 + lib/classes/packets/ParcelClaim.ts | 84 ++ lib/classes/packets/ParcelDeedToGroup.ts | 44 + lib/classes/packets/ParcelDisableObjects.ts | 84 ++ lib/classes/packets/ParcelDivide.ts | 56 + lib/classes/packets/ParcelDwellReply.ts | 44 + lib/classes/packets/ParcelDwellRequest.ts | 44 + lib/classes/packets/ParcelGodForceOwner.ts | 44 + lib/classes/packets/ParcelGodMarkAsContent.ts | 38 + lib/classes/packets/ParcelInfoReply.ts | 114 +++ lib/classes/packets/ParcelInfoRequest.ts | 38 + lib/classes/packets/ParcelJoin.ts | 56 + .../packets/ParcelMediaCommandMessage.ts | 34 + lib/classes/packets/ParcelMediaUpdate.ts | 64 ++ .../packets/ParcelObjectOwnersReply.ts | 46 + .../packets/ParcelObjectOwnersRequest.ts | 38 + lib/classes/packets/ParcelOverlay.ts | 28 + lib/classes/packets/ParcelProperties.ts | 306 ++++++ .../packets/ParcelPropertiesRequest.ts | 66 ++ .../packets/ParcelPropertiesRequestByID.ts | 44 + lib/classes/packets/ParcelPropertiesUpdate.ts | 140 +++ lib/classes/packets/ParcelReclaim.ts | 38 + lib/classes/packets/ParcelRelease.ts | 38 + lib/classes/packets/ParcelRename.ts | 38 + lib/classes/packets/ParcelReturnObjects.ts | 84 ++ lib/classes/packets/ParcelSales.ts | 38 + lib/classes/packets/ParcelSelectObjects.ts | 64 ++ .../packets/ParcelSetOtherCleanTime.ts | 44 + lib/classes/packets/PayPriceReply.ts | 48 + lib/classes/packets/PickDelete.ts | 38 + lib/classes/packets/PickGodDelete.ts | 44 + lib/classes/packets/PickInfoReply.ts | 100 ++ lib/classes/packets/PickInfoUpdate.ts | 88 ++ lib/classes/packets/PlacesQuery.ts | 70 ++ lib/classes/packets/PlacesReply.ts | 128 +++ lib/classes/packets/PreloadSound.ts | 44 + .../packets/PurgeInventoryDescendents.ts | 38 + lib/classes/packets/RebakeAvatarTextures.ts | 22 + lib/classes/packets/Redo.ts | 54 + lib/classes/packets/RegionHandleRequest.ts | 22 + lib/classes/packets/RegionHandshake.ts | 230 +++++ lib/classes/packets/RegionHandshakeReply.ts | 38 + lib/classes/packets/RegionIDAndHandleReply.ts | 30 + lib/classes/packets/RegionInfo.ts | 178 ++++ .../packets/RegionPresenceRequestByHandle.ts | 34 + .../RegionPresenceRequestByRegionID.ts | 32 + lib/classes/packets/RegionPresenceResponse.ts | 70 ++ lib/classes/packets/RemoveAttachment.ts | 42 + lib/classes/packets/RemoveInventoryFolder.ts | 48 + lib/classes/packets/RemoveInventoryItem.ts | 48 + lib/classes/packets/RemoveInventoryObjects.ts | 68 ++ lib/classes/packets/RemoveMuteListEntry.ts | 44 + lib/classes/packets/RemoveNameValuePair.ts | 42 + lib/classes/packets/RemoveParcel.ts | 32 + lib/classes/packets/RemoveTaskInventory.ts | 44 + lib/classes/packets/ReplyTaskInventory.ts | 34 + lib/classes/packets/ReportAutosaveCrash.ts | 28 + lib/classes/packets/RequestGodlikePowers.ts | 42 + lib/classes/packets/RequestImage.ts | 68 ++ lib/classes/packets/RequestInventoryAsset.ts | 40 + lib/classes/packets/RequestMultipleObjects.ts | 52 + .../packets/RequestObjectPropertiesFamily.ts | 44 + lib/classes/packets/RequestParcelTransfer.ts | 100 ++ lib/classes/packets/RequestPayPrice.ts | 22 + lib/classes/packets/RequestRegionInfo.ts | 28 + lib/classes/packets/RequestTaskInventory.ts | 38 + lib/classes/packets/RequestTrustedCircuit.ts | 10 + lib/classes/packets/RequestXfer.ts | 54 + lib/classes/packets/RetrieveIMsExtended.ts | 32 + .../packets/RetrieveInstantMessages.ts | 28 + lib/classes/packets/RevokePermissions.ts | 44 + .../packets/RezMultipleAttachmentsFromInv.ts | 112 ++ lib/classes/packets/RezObject.ts | 224 ++++ lib/classes/packets/RezObjectFromNotecard.ts | 138 +++ lib/classes/packets/RezRestoreToWorld.ts | 150 +++ lib/classes/packets/RezScript.ts | 170 +++ .../packets/RezSingleAttachmentFromInv.ts | 84 ++ .../packets/RoutedMoneyBalanceReply.ts | 114 +++ lib/classes/packets/RpcChannelReply.ts | 34 + lib/classes/packets/RpcChannelRequest.ts | 40 + lib/classes/packets/RpcScriptReplyInbound.ts | 46 + .../packets/RpcScriptRequestInbound.ts | 62 ++ .../packets/RpcScriptRequestInboundForward.ts | 58 ++ lib/classes/packets/SaveAssetIntoInventory.ts | 38 + lib/classes/packets/ScriptAnswerYes.ts | 50 + lib/classes/packets/ScriptControlChange.ts | 40 + lib/classes/packets/ScriptDataReply.ts | 40 + lib/classes/packets/ScriptDataRequest.ts | 44 + lib/classes/packets/ScriptDialog.ts | 98 ++ lib/classes/packets/ScriptDialogReply.ts | 56 + lib/classes/packets/ScriptMailRegistration.ts | 40 + lib/classes/packets/ScriptQuestion.ts | 56 + lib/classes/packets/ScriptReset.ts | 44 + lib/classes/packets/ScriptRunningReply.ts | 32 + lib/classes/packets/ScriptSensorReply.ts | 90 ++ lib/classes/packets/ScriptSensorRequest.ts | 82 ++ lib/classes/packets/ScriptTeleportRequest.ts | 40 + lib/classes/packets/SendPostcard.ts | 78 ++ lib/classes/packets/SendXferPacket.ts | 40 + lib/classes/packets/SetAlwaysRun.ts | 32 + lib/classes/packets/SetCPURatio.ts | 20 + lib/classes/packets/SetFollowCamProperties.ts | 48 + lib/classes/packets/SetGroupAcceptNotices.ts | 50 + lib/classes/packets/SetGroupContribution.ts | 44 + lib/classes/packets/SetScriptRunning.ts | 48 + .../packets/SetSimPresenceInDatabase.ts | 64 ++ lib/classes/packets/SetSimStatusInDatabase.ts | 64 ++ lib/classes/packets/SetStartLocation.ts | 54 + .../packets/SetStartLocationRequest.ts | 56 + lib/classes/packets/SimCrashed.ts | 48 + lib/classes/packets/SimStats.ts | 98 ++ lib/classes/packets/SimStatus.ts | 36 + lib/classes/packets/SimWideDeletes.ts | 44 + lib/classes/packets/SimulatorLoad.ts | 60 ++ lib/classes/packets/SimulatorMapUpdate.ts | 22 + .../packets/SimulatorPresentAtLocation.ts | 126 +++ lib/classes/packets/SimulatorReady.ts | 64 ++ lib/classes/packets/SimulatorSetMap.ts | 36 + .../packets/SimulatorShutdownRequest.ts | 10 + .../packets/SimulatorViewerTimeMessage.ts | 54 + lib/classes/packets/SoundTrigger.ts | 60 ++ lib/classes/packets/StartAuction.ts | 44 + lib/classes/packets/StartGroupProposal.ts | 62 ++ lib/classes/packets/StartLure.ts | 62 ++ lib/classes/packets/StartPingCheck.ts | 26 + lib/classes/packets/StateSave.ts | 38 + lib/classes/packets/SubscribeLoad.ts | 10 + lib/classes/packets/SystemKickUser.ts | 32 + lib/classes/packets/SystemMessage.ts | 54 + lib/classes/packets/TallyVotes.ts | 10 + lib/classes/packets/TelehubInfo.ts | 60 ++ lib/classes/packets/TeleportCancel.ts | 28 + lib/classes/packets/TeleportFailed.ts | 54 + lib/classes/packets/TeleportFinish.ts | 64 ++ .../packets/TeleportLandingStatusChanged.ts | 24 + .../packets/TeleportLandmarkRequest.ts | 34 + lib/classes/packets/TeleportLocal.ts | 46 + .../packets/TeleportLocationRequest.ts | 52 + lib/classes/packets/TeleportLureRequest.ts | 40 + lib/classes/packets/TeleportProgress.ts | 38 + lib/classes/packets/TeleportRequest.ts | 50 + lib/classes/packets/TeleportStart.ts | 22 + lib/classes/packets/TerminateFriendship.ts | 38 + lib/classes/packets/TestMessage.ts | 52 + lib/classes/packets/TrackAgent.ts | 38 + lib/classes/packets/TransferAbort.ts | 28 + lib/classes/packets/TransferInfo.ts | 52 + lib/classes/packets/TransferInventory.ts | 72 ++ lib/classes/packets/TransferInventoryAck.ts | 28 + lib/classes/packets/TransferPacket.ts | 46 + lib/classes/packets/TransferRequest.ts | 46 + lib/classes/packets/UUIDGroupNameReply.ts | 38 + lib/classes/packets/UUIDGroupNameRequest.ts | 32 + lib/classes/packets/UUIDNameReply.ts | 44 + lib/classes/packets/UUIDNameRequest.ts | 32 + lib/classes/packets/Undo.ts | 54 + lib/classes/packets/UndoLand.ts | 28 + lib/classes/packets/UnsubscribeLoad.ts | 10 + lib/classes/packets/UpdateAttachment.ts | 170 +++ .../packets/UpdateCreateInventoryItem.ts | 170 +++ lib/classes/packets/UpdateGroupInfo.ts | 72 ++ lib/classes/packets/UpdateInventoryFolder.ts | 64 ++ lib/classes/packets/UpdateInventoryItem.ts | 172 ++++ lib/classes/packets/UpdateMuteListEntry.ts | 56 + lib/classes/packets/UpdateParcel.ts | 130 +++ lib/classes/packets/UpdateSimulator.ts | 38 + lib/classes/packets/UpdateTaskInventory.ts | 164 +++ lib/classes/packets/UpdateUserInfo.ts | 42 + lib/classes/packets/UseCachedMuteList.ts | 22 + lib/classes/packets/UseCircuitCode.ts | 34 + lib/classes/packets/UserInfoReply.ts | 42 + lib/classes/packets/UserInfoRequest.ts | 28 + lib/classes/packets/UserReport.ts | 98 ++ lib/classes/packets/UserReportInternal.ts | 114 +++ lib/classes/packets/VelocityInterpolateOff.ts | 28 + lib/classes/packets/VelocityInterpolateOn.ts | 28 + lib/classes/packets/ViewerEffect.ts | 76 ++ lib/classes/packets/ViewerFrozenMessage.ts | 20 + lib/classes/packets/ViewerStartAuction.ts | 44 + lib/classes/packets/ViewerStats.ts | 228 +++++ lib/enums/Message.ts | 480 +++++++++ package-lock.json | 19 +- package.json | 3 +- tools/writePacketClasses.js | 496 +++++++++ 496 files changed, 30448 insertions(+), 57 deletions(-) delete mode 100644 example/npm-debug.log create mode 100644 lib/classes/MessageClasses.ts create mode 100644 lib/classes/MessageDecoder.ts create mode 100644 lib/enums/Message.ts diff --git a/example/npm-debug.log b/example/npm-debug.log deleted file mode 100644 index ae090d0..0000000 --- a/example/npm-debug.log +++ /dev/null @@ -1,48 +0,0 @@ -0 info it worked if it ends with ok -1 verbose cli [ 'C:\\Program Files\\nodejs\\node.exe', -1 verbose cli 'C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js', -1 verbose cli 'run', -1 verbose cli 'build' ] -2 info using npm@3.10.10 -3 info using node@v6.11.1 -4 verbose run-script [ 'prebuild', 'build', 'postbuild' ] -5 info lifecycle node-metaverse@0.0.1~prebuild: node-metaverse@0.0.1 -6 silly lifecycle node-metaverse@0.0.1~prebuild: no script for prebuild, continuing -7 info lifecycle node-metaverse@0.0.1~build: node-metaverse@0.0.1 -8 verbose lifecycle node-metaverse@0.0.1~build: unsafe-perm in lifecycle true -9 verbose lifecycle node-metaverse@0.0.1~build: PATH: C:\Program Files\nodejs\node_modules\npm\bin\node-gyp-bin;C:\Projects\node-metaverse\node_modules\.bin;C:\Program Files\ImageMagick-6.9.8-Q16;C:\Program Files (x86)\Common Files\Intel\Shared Libraries\redist\intel64\compiler;C:\Program Files\Oculus\Support\oculus-runtime;C:\ProgramData\Oracle\Java\javapath;C:\Program Files (x86)\Intel\iCLS Client\;C:\Program Files\Intel\iCLS Client\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\PuTTY\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\OpenVPN\bin;C:\Program Files (x86)\Skype\Phone\;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files\Intel\Intel(R) Management Engine Components\DAL;C:\Program Files (x86)\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\Intel\Intel(R) Management Engine Components\IPT;C:\Program Files\TortoiseGit\bin;C:\Program Files\nodejs\;C:\Program Files\Java\jdk1.8.0_141\bin;C:\ApacheAnt\bin;C:\Users\Tom\AppData\local\Android\sdk\tools;C:\Users\Tom\AppData\local\Android\sdk\platform-tools;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files (x86)\QuickTime\QTSystem\;C:\Program Files\Microsoft SQL Server\130\Tools\Binn\;C:\Program Files\Git\cmd;C:\Program Files (x86)\GtkSharp\2.12\bin;C:\ffmpeg\bin;C:\Python27;C:\php;C:\ProgramData\ComposerSetup\bin;C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;C:\WINDOWS\System32\WindowsPowerShell\v1.0\;C:\Users\Tom\AppData\Local\Microsoft\WindowsApps;C:\Users\Tom\AppData\Roaming\npm;C:\Users\Tom\AppData\Roaming\Composer\vendor\bin -10 verbose lifecycle node-metaverse@0.0.1~build: CWD: C:\Projects\node-metaverse -11 silly lifecycle node-metaverse@0.0.1~build: Args: [ '/d /s /c', 'tsc --removeComments' ] -12 silly lifecycle node-metaverse@0.0.1~build: Returned: code: 2 signal: null -13 info lifecycle node-metaverse@0.0.1~build: Failed to exec build script -14 verbose stack Error: node-metaverse@0.0.1 build: `tsc --removeComments` -14 verbose stack Exit status 2 -14 verbose stack at EventEmitter. (C:\Program Files\nodejs\node_modules\npm\lib\utils\lifecycle.js:255:16) -14 verbose stack at emitTwo (events.js:106:13) -14 verbose stack at EventEmitter.emit (events.js:191:7) -14 verbose stack at ChildProcess. (C:\Program Files\nodejs\node_modules\npm\lib\utils\spawn.js:40:14) -14 verbose stack at emitTwo (events.js:106:13) -14 verbose stack at ChildProcess.emit (events.js:191:7) -14 verbose stack at maybeClose (internal/child_process.js:891:16) -14 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:226:5) -15 verbose pkgid node-metaverse@0.0.1 -16 verbose cwd C:\Projects\node-metaverse\example -17 error Windows_NT 10.0.16299 -18 error argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "run" "build" -19 error node v6.11.1 -20 error npm v3.10.10 -21 error code ELIFECYCLE -22 error node-metaverse@0.0.1 build: `tsc --removeComments` -22 error Exit status 2 -23 error Failed at the node-metaverse@0.0.1 build script 'tsc --removeComments'. -23 error Make sure you have the latest version of node.js and npm installed. -23 error If you do, this is most likely a problem with the node-metaverse package, -23 error not with npm itself. -23 error Tell the author that this fails on your system: -23 error tsc --removeComments -23 error You can get information on how to open an issue for this project with: -23 error npm bugs node-metaverse -23 error Or if that isn't available, you can get their info via: -23 error npm owner ls node-metaverse -23 error There is likely additional logging output above. -24 verbose exit [ 1, true ] diff --git a/example/testBot.js b/example/testBot.js index ba8e064..10df363 100644 --- a/example/testBot.js +++ b/example/testBot.js @@ -13,5 +13,8 @@ const bot = new nmv.Bot(loginParameters); bot.Login().then(() => { +}).catch((error) => +{ + console.error(error); }); diff --git a/lib/LoginHandler.ts b/lib/LoginHandler.ts index 5b3a8fa..9501f39 100644 --- a/lib/LoginHandler.ts +++ b/lib/LoginHandler.ts @@ -1,8 +1,8 @@ import * as xmlrpc from 'xmlrpc'; import * as crypto from 'crypto'; -import * as uuid from 'uuid'; import {LoginParameters} from './classes/LoginParameters'; import {LoginResponse} from './classes/LoginResponse'; +const uuid = require('uuid'); export class LoginHandler { diff --git a/lib/classes/Circuit.ts b/lib/classes/Circuit.ts index c54d2f1..982e180 100644 --- a/lib/classes/Circuit.ts +++ b/lib/classes/Circuit.ts @@ -1,4 +1,5 @@ import {UUID} from './UUID'; +import {MessageDecoder} from './MessageDecoder'; export class Circuit { @@ -8,4 +9,10 @@ export class Circuit udpBlacklist: string[]; timestamp: number; seedCapability: string; + decoder: MessageDecoder; + + constructor() + { + this.decoder = new MessageDecoder(); + } } diff --git a/lib/classes/IPAddress.ts b/lib/classes/IPAddress.ts index c13843b..f35bd45 100644 --- a/lib/classes/IPAddress.ts +++ b/lib/classes/IPAddress.ts @@ -1,4 +1,38 @@ +const ipaddr = require('ipaddr.js'); + export class IPAddress { + ip: any = null; + static zero(): IPAddress + { + return new IPAddress('0.0.0.0'); + } + + constructor(buf?: Buffer | string, pos?: number) + { + if (buf !== undefined && buf instanceof Buffer) + { + if (pos !== undefined) + { + const bytes = buf.slice(pos, 4); + this.ip = ipaddr.fromByteArray(bytes); + } + else + { + if (ipaddr.isValid(buf)) + { + this.ip = ipaddr.parse(buf); + } + } + } + } + writeToBuffer(buf: Buffer, pos: number) + { + const bytes: Uint8Array = this.ip.toByteArray(); + buf.writeUInt8(bytes[0], pos++); + buf.writeUInt8(bytes[1], pos++); + buf.writeUInt8(bytes[2], pos++); + buf.writeUInt8(bytes[3], pos); + } } diff --git a/lib/classes/LoginResponse.ts b/lib/classes/LoginResponse.ts index 140bb90..0156741 100644 --- a/lib/classes/LoginResponse.ts +++ b/lib/classes/LoginResponse.ts @@ -325,6 +325,5 @@ export class LoginResponse } }); - console.log(this); } } diff --git a/lib/classes/MessageClasses.ts b/lib/classes/MessageClasses.ts new file mode 100644 index 0000000..fc684f4 --- /dev/null +++ b/lib/classes/MessageClasses.ts @@ -0,0 +1,966 @@ +// This file has been automatically generated by writePacketClasses.js + +export * from './packets/TestMessage'; +export * from './packets/PacketAck'; +export * from './packets/OpenCircuit'; +export * from './packets/CloseCircuit'; +export * from './packets/StartPingCheck'; +export * from './packets/CompletePingCheck'; +export * from './packets/AddCircuitCode'; +export * from './packets/UseCircuitCode'; +export * from './packets/NeighborList'; +export * from './packets/AvatarTextureUpdate'; +export * from './packets/SimulatorMapUpdate'; +export * from './packets/SimulatorSetMap'; +export * from './packets/SubscribeLoad'; +export * from './packets/UnsubscribeLoad'; +export * from './packets/SimulatorReady'; +export * from './packets/TelehubInfo'; +export * from './packets/SimulatorPresentAtLocation'; +export * from './packets/SimulatorLoad'; +export * from './packets/SimulatorShutdownRequest'; +export * from './packets/RegionPresenceRequestByRegionID'; +export * from './packets/RegionPresenceRequestByHandle'; +export * from './packets/RegionPresenceResponse'; +export * from './packets/UpdateSimulator'; +export * from './packets/LogDwellTime'; +export * from './packets/FeatureDisabled'; +export * from './packets/LogFailedMoneyTransaction'; +export * from './packets/UserReportInternal'; +export * from './packets/SetSimStatusInDatabase'; +export * from './packets/SetSimPresenceInDatabase'; +export * from './packets/EconomyDataRequest'; +export * from './packets/EconomyData'; +export * from './packets/AvatarPickerRequest'; +export * from './packets/AvatarPickerRequestBackend'; +export * from './packets/AvatarPickerReply'; +export * from './packets/PlacesQuery'; +export * from './packets/PlacesReply'; +export * from './packets/DirFindQuery'; +export * from './packets/DirFindQueryBackend'; +export * from './packets/DirPlacesQuery'; +export * from './packets/DirPlacesQueryBackend'; +export * from './packets/DirPlacesReply'; +export * from './packets/DirPeopleReply'; +export * from './packets/DirEventsReply'; +export * from './packets/DirGroupsReply'; +export * from './packets/DirClassifiedQuery'; +export * from './packets/DirClassifiedQueryBackend'; +export * from './packets/DirClassifiedReply'; +export * from './packets/AvatarClassifiedReply'; +export * from './packets/ClassifiedInfoRequest'; +export * from './packets/ClassifiedInfoReply'; +export * from './packets/ClassifiedInfoUpdate'; +export * from './packets/ClassifiedDelete'; +export * from './packets/ClassifiedGodDelete'; +export * from './packets/DirLandQuery'; +export * from './packets/DirLandQueryBackend'; +export * from './packets/DirLandReply'; +export * from './packets/DirPopularQuery'; +export * from './packets/DirPopularQueryBackend'; +export * from './packets/DirPopularReply'; +export * from './packets/ParcelInfoRequest'; +export * from './packets/ParcelInfoReply'; +export * from './packets/ParcelObjectOwnersRequest'; +export * from './packets/ParcelObjectOwnersReply'; +export * from './packets/GroupNoticesListRequest'; +export * from './packets/GroupNoticesListReply'; +export * from './packets/GroupNoticeRequest'; +export * from './packets/GroupNoticeAdd'; +export * from './packets/TeleportRequest'; +export * from './packets/TeleportLocationRequest'; +export * from './packets/TeleportLocal'; +export * from './packets/TeleportLandmarkRequest'; +export * from './packets/TeleportProgress'; +export * from './packets/DataHomeLocationRequest'; +export * from './packets/DataHomeLocationReply'; +export * from './packets/TeleportFinish'; +export * from './packets/StartLure'; +export * from './packets/TeleportLureRequest'; +export * from './packets/TeleportCancel'; +export * from './packets/TeleportStart'; +export * from './packets/TeleportFailed'; +export * from './packets/Undo'; +export * from './packets/Redo'; +export * from './packets/UndoLand'; +export * from './packets/AgentPause'; +export * from './packets/AgentResume'; +export * from './packets/AgentUpdate'; +export * from './packets/ChatFromViewer'; +export * from './packets/AgentThrottle'; +export * from './packets/AgentFOV'; +export * from './packets/AgentHeightWidth'; +export * from './packets/AgentSetAppearance'; +export * from './packets/AgentAnimation'; +export * from './packets/AgentRequestSit'; +export * from './packets/AgentSit'; +export * from './packets/AgentQuitCopy'; +export * from './packets/RequestImage'; +export * from './packets/ImageNotInDatabase'; +export * from './packets/RebakeAvatarTextures'; +export * from './packets/SetAlwaysRun'; +export * from './packets/ObjectAdd'; +export * from './packets/ObjectDelete'; +export * from './packets/ObjectDuplicate'; +export * from './packets/ObjectDuplicateOnRay'; +export * from './packets/MultipleObjectUpdate'; +export * from './packets/RequestMultipleObjects'; +export * from './packets/ObjectPosition'; +export * from './packets/ObjectScale'; +export * from './packets/ObjectRotation'; +export * from './packets/ObjectFlagUpdate'; +export * from './packets/ObjectClickAction'; +export * from './packets/ObjectImage'; +export * from './packets/ObjectMaterial'; +export * from './packets/ObjectShape'; +export * from './packets/ObjectExtraParams'; +export * from './packets/ObjectOwner'; +export * from './packets/ObjectGroup'; +export * from './packets/ObjectBuy'; +export * from './packets/BuyObjectInventory'; +export * from './packets/DerezContainer'; +export * from './packets/ObjectPermissions'; +export * from './packets/ObjectSaleInfo'; +export * from './packets/ObjectName'; +export * from './packets/ObjectDescription'; +export * from './packets/ObjectCategory'; +export * from './packets/ObjectSelect'; +export * from './packets/ObjectDeselect'; +export * from './packets/ObjectAttach'; +export * from './packets/ObjectDetach'; +export * from './packets/ObjectDrop'; +export * from './packets/ObjectLink'; +export * from './packets/ObjectDelink'; +export * from './packets/ObjectGrab'; +export * from './packets/ObjectGrabUpdate'; +export * from './packets/ObjectDeGrab'; +export * from './packets/ObjectSpinStart'; +export * from './packets/ObjectSpinUpdate'; +export * from './packets/ObjectSpinStop'; +export * from './packets/ObjectExportSelected'; +export * from './packets/ModifyLand'; +export * from './packets/VelocityInterpolateOn'; +export * from './packets/VelocityInterpolateOff'; +export * from './packets/StateSave'; +export * from './packets/ReportAutosaveCrash'; +export * from './packets/SimWideDeletes'; +export * from './packets/RequestObjectPropertiesFamily'; +export * from './packets/TrackAgent'; +export * from './packets/ViewerStats'; +export * from './packets/ScriptAnswerYes'; +export * from './packets/UserReport'; +export * from './packets/AlertMessage'; +export * from './packets/AgentAlertMessage'; +export * from './packets/MeanCollisionAlert'; +export * from './packets/ViewerFrozenMessage'; +export * from './packets/HealthMessage'; +export * from './packets/ChatFromSimulator'; +export * from './packets/SimStats'; +export * from './packets/RequestRegionInfo'; +export * from './packets/RegionInfo'; +export * from './packets/GodUpdateRegionInfo'; +export * from './packets/NearestLandingRegionRequest'; +export * from './packets/NearestLandingRegionReply'; +export * from './packets/NearestLandingRegionUpdated'; +export * from './packets/TeleportLandingStatusChanged'; +export * from './packets/RegionHandshake'; +export * from './packets/RegionHandshakeReply'; +export * from './packets/CoarseLocationUpdate'; +export * from './packets/ImageData'; +export * from './packets/ImagePacket'; +export * from './packets/LayerData'; +export * from './packets/ObjectUpdate'; +export * from './packets/ObjectUpdateCompressed'; +export * from './packets/ObjectUpdateCached'; +export * from './packets/ImprovedTerseObjectUpdate'; +export * from './packets/KillObject'; +export * from './packets/CrossedRegion'; +export * from './packets/SimulatorViewerTimeMessage'; +export * from './packets/EnableSimulator'; +export * from './packets/DisableSimulator'; +export * from './packets/ConfirmEnableSimulator'; +export * from './packets/TransferRequest'; +export * from './packets/TransferInfo'; +export * from './packets/TransferPacket'; +export * from './packets/TransferAbort'; +export * from './packets/RequestXfer'; +export * from './packets/SendXferPacket'; +export * from './packets/ConfirmXferPacket'; +export * from './packets/AbortXfer'; +export * from './packets/AvatarAnimation'; +export * from './packets/AvatarAppearance'; +export * from './packets/AvatarSitResponse'; +export * from './packets/SetFollowCamProperties'; +export * from './packets/ClearFollowCamProperties'; +export * from './packets/CameraConstraint'; +export * from './packets/ObjectProperties'; +export * from './packets/ObjectPropertiesFamily'; +export * from './packets/RequestPayPrice'; +export * from './packets/PayPriceReply'; +export * from './packets/KickUser'; +export * from './packets/KickUserAck'; +export * from './packets/GodKickUser'; +export * from './packets/SystemKickUser'; +export * from './packets/EjectUser'; +export * from './packets/FreezeUser'; +export * from './packets/AvatarPropertiesRequest'; +export * from './packets/AvatarPropertiesRequestBackend'; +export * from './packets/AvatarPropertiesReply'; +export * from './packets/AvatarInterestsReply'; +export * from './packets/AvatarGroupsReply'; +export * from './packets/AvatarPropertiesUpdate'; +export * from './packets/AvatarInterestsUpdate'; +export * from './packets/AvatarNotesReply'; +export * from './packets/AvatarNotesUpdate'; +export * from './packets/AvatarPicksReply'; +export * from './packets/EventInfoRequest'; +export * from './packets/EventInfoReply'; +export * from './packets/EventNotificationAddRequest'; +export * from './packets/EventNotificationRemoveRequest'; +export * from './packets/EventGodDelete'; +export * from './packets/PickInfoReply'; +export * from './packets/PickInfoUpdate'; +export * from './packets/PickDelete'; +export * from './packets/PickGodDelete'; +export * from './packets/ScriptQuestion'; +export * from './packets/ScriptControlChange'; +export * from './packets/ScriptDialog'; +export * from './packets/ScriptDialogReply'; +export * from './packets/ForceScriptControlRelease'; +export * from './packets/RevokePermissions'; +export * from './packets/LoadURL'; +export * from './packets/ScriptTeleportRequest'; +export * from './packets/ParcelOverlay'; +export * from './packets/ParcelPropertiesRequest'; +export * from './packets/ParcelPropertiesRequestByID'; +export * from './packets/ParcelProperties'; +export * from './packets/ParcelPropertiesUpdate'; +export * from './packets/ParcelReturnObjects'; +export * from './packets/ParcelSetOtherCleanTime'; +export * from './packets/ParcelDisableObjects'; +export * from './packets/ParcelSelectObjects'; +export * from './packets/EstateCovenantRequest'; +export * from './packets/EstateCovenantReply'; +export * from './packets/ForceObjectSelect'; +export * from './packets/ParcelBuyPass'; +export * from './packets/ParcelDeedToGroup'; +export * from './packets/ParcelReclaim'; +export * from './packets/ParcelClaim'; +export * from './packets/ParcelJoin'; +export * from './packets/ParcelDivide'; +export * from './packets/ParcelRelease'; +export * from './packets/ParcelBuy'; +export * from './packets/ParcelGodForceOwner'; +export * from './packets/ParcelAccessListRequest'; +export * from './packets/ParcelAccessListReply'; +export * from './packets/ParcelAccessListUpdate'; +export * from './packets/ParcelDwellRequest'; +export * from './packets/ParcelDwellReply'; +export * from './packets/RequestParcelTransfer'; +export * from './packets/UpdateParcel'; +export * from './packets/RemoveParcel'; +export * from './packets/MergeParcel'; +export * from './packets/LogParcelChanges'; +export * from './packets/CheckParcelSales'; +export * from './packets/ParcelSales'; +export * from './packets/ParcelGodMarkAsContent'; +export * from './packets/ViewerStartAuction'; +export * from './packets/StartAuction'; +export * from './packets/ConfirmAuctionStart'; +export * from './packets/CompleteAuction'; +export * from './packets/CancelAuction'; +export * from './packets/CheckParcelAuctions'; +export * from './packets/ParcelAuctions'; +export * from './packets/UUIDNameRequest'; +export * from './packets/UUIDNameReply'; +export * from './packets/UUIDGroupNameRequest'; +export * from './packets/UUIDGroupNameReply'; +export * from './packets/ChatPass'; +export * from './packets/EdgeDataPacket'; +export * from './packets/SimStatus'; +export * from './packets/ChildAgentUpdate'; +export * from './packets/ChildAgentAlive'; +export * from './packets/ChildAgentPositionUpdate'; +export * from './packets/ChildAgentDying'; +export * from './packets/ChildAgentUnknown'; +export * from './packets/AtomicPassObject'; +export * from './packets/KillChildAgents'; +export * from './packets/GetScriptRunning'; +export * from './packets/ScriptRunningReply'; +export * from './packets/SetScriptRunning'; +export * from './packets/ScriptReset'; +export * from './packets/ScriptSensorRequest'; +export * from './packets/ScriptSensorReply'; +export * from './packets/CompleteAgentMovement'; +export * from './packets/AgentMovementComplete'; +export * from './packets/DataServerLogout'; +export * from './packets/LogoutRequest'; +export * from './packets/LogoutReply'; +export * from './packets/ImprovedInstantMessage'; +export * from './packets/RetrieveInstantMessages'; +export * from './packets/FindAgent'; +export * from './packets/RequestGodlikePowers'; +export * from './packets/GrantGodlikePowers'; +export * from './packets/GodlikeMessage'; +export * from './packets/EstateOwnerMessage'; +export * from './packets/GenericMessage'; +export * from './packets/MuteListRequest'; +export * from './packets/UpdateMuteListEntry'; +export * from './packets/RemoveMuteListEntry'; +export * from './packets/CopyInventoryFromNotecard'; +export * from './packets/UpdateInventoryItem'; +export * from './packets/UpdateCreateInventoryItem'; +export * from './packets/MoveInventoryItem'; +export * from './packets/CopyInventoryItem'; +export * from './packets/RemoveInventoryItem'; +export * from './packets/ChangeInventoryItemFlags'; +export * from './packets/SaveAssetIntoInventory'; +export * from './packets/CreateInventoryFolder'; +export * from './packets/UpdateInventoryFolder'; +export * from './packets/MoveInventoryFolder'; +export * from './packets/RemoveInventoryFolder'; +export * from './packets/FetchInventoryDescendents'; +export * from './packets/InventoryDescendents'; +export * from './packets/FetchInventory'; +export * from './packets/FetchInventoryReply'; +export * from './packets/BulkUpdateInventory'; +export * from './packets/RequestInventoryAsset'; +export * from './packets/InventoryAssetResponse'; +export * from './packets/RemoveInventoryObjects'; +export * from './packets/PurgeInventoryDescendents'; +export * from './packets/UpdateTaskInventory'; +export * from './packets/RemoveTaskInventory'; +export * from './packets/MoveTaskInventory'; +export * from './packets/RequestTaskInventory'; +export * from './packets/ReplyTaskInventory'; +export * from './packets/DeRezObject'; +export * from './packets/DeRezAck'; +export * from './packets/RezObject'; +export * from './packets/RezObjectFromNotecard'; +export * from './packets/TransferInventory'; +export * from './packets/TransferInventoryAck'; +export * from './packets/AcceptFriendship'; +export * from './packets/DeclineFriendship'; +export * from './packets/FormFriendship'; +export * from './packets/TerminateFriendship'; +export * from './packets/OfferCallingCard'; +export * from './packets/AcceptCallingCard'; +export * from './packets/DeclineCallingCard'; +export * from './packets/RezScript'; +export * from './packets/CreateInventoryItem'; +export * from './packets/CreateLandmarkForEvent'; +export * from './packets/EventLocationRequest'; +export * from './packets/EventLocationReply'; +export * from './packets/RegionHandleRequest'; +export * from './packets/RegionIDAndHandleReply'; +export * from './packets/MoneyTransferRequest'; +export * from './packets/MoneyTransferBackend'; +export * from './packets/MoneyBalanceRequest'; +export * from './packets/MoneyBalanceReply'; +export * from './packets/RoutedMoneyBalanceReply'; +export * from './packets/ActivateGestures'; +export * from './packets/DeactivateGestures'; +export * from './packets/MuteListUpdate'; +export * from './packets/UseCachedMuteList'; +export * from './packets/GrantUserRights'; +export * from './packets/ChangeUserRights'; +export * from './packets/OnlineNotification'; +export * from './packets/OfflineNotification'; +export * from './packets/SetStartLocationRequest'; +export * from './packets/SetStartLocation'; +export * from './packets/NetTest'; +export * from './packets/SetCPURatio'; +export * from './packets/SimCrashed'; +export * from './packets/NameValuePair'; +export * from './packets/RemoveNameValuePair'; +export * from './packets/UpdateAttachment'; +export * from './packets/RemoveAttachment'; +export * from './packets/SoundTrigger'; +export * from './packets/AttachedSound'; +export * from './packets/AttachedSoundGainChange'; +export * from './packets/PreloadSound'; +export * from './packets/AssetUploadRequest'; +export * from './packets/AssetUploadComplete'; +export * from './packets/EmailMessageRequest'; +export * from './packets/EmailMessageReply'; +export * from './packets/InternalScriptMail'; +export * from './packets/ScriptDataRequest'; +export * from './packets/ScriptDataReply'; +export * from './packets/CreateGroupRequest'; +export * from './packets/CreateGroupReply'; +export * from './packets/UpdateGroupInfo'; +export * from './packets/GroupRoleChanges'; +export * from './packets/JoinGroupRequest'; +export * from './packets/JoinGroupReply'; +export * from './packets/EjectGroupMemberRequest'; +export * from './packets/EjectGroupMemberReply'; +export * from './packets/LeaveGroupRequest'; +export * from './packets/LeaveGroupReply'; +export * from './packets/InviteGroupRequest'; +export * from './packets/InviteGroupResponse'; +export * from './packets/GroupProfileRequest'; +export * from './packets/GroupProfileReply'; +export * from './packets/GroupAccountSummaryRequest'; +export * from './packets/GroupAccountSummaryReply'; +export * from './packets/GroupAccountDetailsRequest'; +export * from './packets/GroupAccountDetailsReply'; +export * from './packets/GroupAccountTransactionsRequest'; +export * from './packets/GroupAccountTransactionsReply'; +export * from './packets/GroupActiveProposalsRequest'; +export * from './packets/GroupActiveProposalItemReply'; +export * from './packets/GroupVoteHistoryRequest'; +export * from './packets/GroupVoteHistoryItemReply'; +export * from './packets/StartGroupProposal'; +export * from './packets/GroupProposalBallot'; +export * from './packets/TallyVotes'; +export * from './packets/GroupMembersRequest'; +export * from './packets/GroupMembersReply'; +export * from './packets/ActivateGroup'; +export * from './packets/SetGroupContribution'; +export * from './packets/SetGroupAcceptNotices'; +export * from './packets/GroupRoleDataRequest'; +export * from './packets/GroupRoleDataReply'; +export * from './packets/GroupRoleMembersRequest'; +export * from './packets/GroupRoleMembersReply'; +export * from './packets/GroupTitlesRequest'; +export * from './packets/GroupTitlesReply'; +export * from './packets/GroupTitleUpdate'; +export * from './packets/GroupRoleUpdate'; +export * from './packets/LiveHelpGroupRequest'; +export * from './packets/LiveHelpGroupReply'; +export * from './packets/AgentWearablesRequest'; +export * from './packets/AgentWearablesUpdate'; +export * from './packets/AgentIsNowWearing'; +export * from './packets/AgentCachedTexture'; +export * from './packets/AgentCachedTextureResponse'; +export * from './packets/AgentDataUpdateRequest'; +export * from './packets/AgentDataUpdate'; +export * from './packets/GroupDataUpdate'; +export * from './packets/AgentGroupDataUpdate'; +export * from './packets/AgentDropGroup'; +export * from './packets/LogTextMessage'; +export * from './packets/ViewerEffect'; +export * from './packets/CreateTrustedCircuit'; +export * from './packets/DenyTrustedCircuit'; +export * from './packets/RequestTrustedCircuit'; +export * from './packets/RezSingleAttachmentFromInv'; +export * from './packets/RezMultipleAttachmentsFromInv'; +export * from './packets/DetachAttachmentIntoInv'; +export * from './packets/CreateNewOutfitAttachments'; +export * from './packets/UserInfoRequest'; +export * from './packets/UserInfoReply'; +export * from './packets/UpdateUserInfo'; +export * from './packets/ParcelRename'; +export * from './packets/InitiateDownload'; +export * from './packets/SystemMessage'; +export * from './packets/MapLayerRequest'; +export * from './packets/MapLayerReply'; +export * from './packets/MapBlockRequest'; +export * from './packets/MapNameRequest'; +export * from './packets/MapBlockReply'; +export * from './packets/MapItemRequest'; +export * from './packets/MapItemReply'; +export * from './packets/SendPostcard'; +export * from './packets/RpcChannelRequest'; +export * from './packets/RpcChannelReply'; +export * from './packets/RpcScriptRequestInbound'; +export * from './packets/RpcScriptRequestInboundForward'; +export * from './packets/RpcScriptReplyInbound'; +export * from './packets/ScriptMailRegistration'; +export * from './packets/ParcelMediaCommandMessage'; +export * from './packets/ParcelMediaUpdate'; +export * from './packets/LandStatRequest'; +export * from './packets/LandStatReply'; +export * from './packets/Error'; +export * from './packets/ObjectIncludeInSearch'; +export * from './packets/RezRestoreToWorld'; +export * from './packets/LinkInventoryItem'; +export * from './packets/RetrieveIMsExtended'; +export * from './packets/JoinGroupRequestExtended'; +export * from './packets/CreateGroupRequestExtended'; +import {Message} from '../enums/Message'; + +const messages: {[index: number]: string} = {}; +messages[Message.TestMessage] = 'TestMessagePacket'; +messages[Message.PacketAck] = 'PacketAckPacket'; +messages[Message.OpenCircuit] = 'OpenCircuitPacket'; +messages[Message.CloseCircuit] = 'CloseCircuitPacket'; +messages[Message.StartPingCheck] = 'StartPingCheckPacket'; +messages[Message.CompletePingCheck] = 'CompletePingCheckPacket'; +messages[Message.AddCircuitCode] = 'AddCircuitCodePacket'; +messages[Message.UseCircuitCode] = 'UseCircuitCodePacket'; +messages[Message.NeighborList] = 'NeighborListPacket'; +messages[Message.AvatarTextureUpdate] = 'AvatarTextureUpdatePacket'; +messages[Message.SimulatorMapUpdate] = 'SimulatorMapUpdatePacket'; +messages[Message.SimulatorSetMap] = 'SimulatorSetMapPacket'; +messages[Message.SubscribeLoad] = 'SubscribeLoadPacket'; +messages[Message.UnsubscribeLoad] = 'UnsubscribeLoadPacket'; +messages[Message.SimulatorReady] = 'SimulatorReadyPacket'; +messages[Message.TelehubInfo] = 'TelehubInfoPacket'; +messages[Message.SimulatorPresentAtLocation] = 'SimulatorPresentAtLocationPacket'; +messages[Message.SimulatorLoad] = 'SimulatorLoadPacket'; +messages[Message.SimulatorShutdownRequest] = 'SimulatorShutdownRequestPacket'; +messages[Message.RegionPresenceRequestByRegionID] = 'RegionPresenceRequestByRegionIDPacket'; +messages[Message.RegionPresenceRequestByHandle] = 'RegionPresenceRequestByHandlePacket'; +messages[Message.RegionPresenceResponse] = 'RegionPresenceResponsePacket'; +messages[Message.UpdateSimulator] = 'UpdateSimulatorPacket'; +messages[Message.LogDwellTime] = 'LogDwellTimePacket'; +messages[Message.FeatureDisabled] = 'FeatureDisabledPacket'; +messages[Message.LogFailedMoneyTransaction] = 'LogFailedMoneyTransactionPacket'; +messages[Message.UserReportInternal] = 'UserReportInternalPacket'; +messages[Message.SetSimStatusInDatabase] = 'SetSimStatusInDatabasePacket'; +messages[Message.SetSimPresenceInDatabase] = 'SetSimPresenceInDatabasePacket'; +messages[Message.EconomyDataRequest] = 'EconomyDataRequestPacket'; +messages[Message.EconomyData] = 'EconomyDataPacket'; +messages[Message.AvatarPickerRequest] = 'AvatarPickerRequestPacket'; +messages[Message.AvatarPickerRequestBackend] = 'AvatarPickerRequestBackendPacket'; +messages[Message.AvatarPickerReply] = 'AvatarPickerReplyPacket'; +messages[Message.PlacesQuery] = 'PlacesQueryPacket'; +messages[Message.PlacesReply] = 'PlacesReplyPacket'; +messages[Message.DirFindQuery] = 'DirFindQueryPacket'; +messages[Message.DirFindQueryBackend] = 'DirFindQueryBackendPacket'; +messages[Message.DirPlacesQuery] = 'DirPlacesQueryPacket'; +messages[Message.DirPlacesQueryBackend] = 'DirPlacesQueryBackendPacket'; +messages[Message.DirPlacesReply] = 'DirPlacesReplyPacket'; +messages[Message.DirPeopleReply] = 'DirPeopleReplyPacket'; +messages[Message.DirEventsReply] = 'DirEventsReplyPacket'; +messages[Message.DirGroupsReply] = 'DirGroupsReplyPacket'; +messages[Message.DirClassifiedQuery] = 'DirClassifiedQueryPacket'; +messages[Message.DirClassifiedQueryBackend] = 'DirClassifiedQueryBackendPacket'; +messages[Message.DirClassifiedReply] = 'DirClassifiedReplyPacket'; +messages[Message.AvatarClassifiedReply] = 'AvatarClassifiedReplyPacket'; +messages[Message.ClassifiedInfoRequest] = 'ClassifiedInfoRequestPacket'; +messages[Message.ClassifiedInfoReply] = 'ClassifiedInfoReplyPacket'; +messages[Message.ClassifiedInfoUpdate] = 'ClassifiedInfoUpdatePacket'; +messages[Message.ClassifiedDelete] = 'ClassifiedDeletePacket'; +messages[Message.ClassifiedGodDelete] = 'ClassifiedGodDeletePacket'; +messages[Message.DirLandQuery] = 'DirLandQueryPacket'; +messages[Message.DirLandQueryBackend] = 'DirLandQueryBackendPacket'; +messages[Message.DirLandReply] = 'DirLandReplyPacket'; +messages[Message.DirPopularQuery] = 'DirPopularQueryPacket'; +messages[Message.DirPopularQueryBackend] = 'DirPopularQueryBackendPacket'; +messages[Message.DirPopularReply] = 'DirPopularReplyPacket'; +messages[Message.ParcelInfoRequest] = 'ParcelInfoRequestPacket'; +messages[Message.ParcelInfoReply] = 'ParcelInfoReplyPacket'; +messages[Message.ParcelObjectOwnersRequest] = 'ParcelObjectOwnersRequestPacket'; +messages[Message.ParcelObjectOwnersReply] = 'ParcelObjectOwnersReplyPacket'; +messages[Message.GroupNoticesListRequest] = 'GroupNoticesListRequestPacket'; +messages[Message.GroupNoticesListReply] = 'GroupNoticesListReplyPacket'; +messages[Message.GroupNoticeRequest] = 'GroupNoticeRequestPacket'; +messages[Message.GroupNoticeAdd] = 'GroupNoticeAddPacket'; +messages[Message.TeleportRequest] = 'TeleportRequestPacket'; +messages[Message.TeleportLocationRequest] = 'TeleportLocationRequestPacket'; +messages[Message.TeleportLocal] = 'TeleportLocalPacket'; +messages[Message.TeleportLandmarkRequest] = 'TeleportLandmarkRequestPacket'; +messages[Message.TeleportProgress] = 'TeleportProgressPacket'; +messages[Message.DataHomeLocationRequest] = 'DataHomeLocationRequestPacket'; +messages[Message.DataHomeLocationReply] = 'DataHomeLocationReplyPacket'; +messages[Message.TeleportFinish] = 'TeleportFinishPacket'; +messages[Message.StartLure] = 'StartLurePacket'; +messages[Message.TeleportLureRequest] = 'TeleportLureRequestPacket'; +messages[Message.TeleportCancel] = 'TeleportCancelPacket'; +messages[Message.TeleportStart] = 'TeleportStartPacket'; +messages[Message.TeleportFailed] = 'TeleportFailedPacket'; +messages[Message.Undo] = 'UndoPacket'; +messages[Message.Redo] = 'RedoPacket'; +messages[Message.UndoLand] = 'UndoLandPacket'; +messages[Message.AgentPause] = 'AgentPausePacket'; +messages[Message.AgentResume] = 'AgentResumePacket'; +messages[Message.AgentUpdate] = 'AgentUpdatePacket'; +messages[Message.ChatFromViewer] = 'ChatFromViewerPacket'; +messages[Message.AgentThrottle] = 'AgentThrottlePacket'; +messages[Message.AgentFOV] = 'AgentFOVPacket'; +messages[Message.AgentHeightWidth] = 'AgentHeightWidthPacket'; +messages[Message.AgentSetAppearance] = 'AgentSetAppearancePacket'; +messages[Message.AgentAnimation] = 'AgentAnimationPacket'; +messages[Message.AgentRequestSit] = 'AgentRequestSitPacket'; +messages[Message.AgentSit] = 'AgentSitPacket'; +messages[Message.AgentQuitCopy] = 'AgentQuitCopyPacket'; +messages[Message.RequestImage] = 'RequestImagePacket'; +messages[Message.ImageNotInDatabase] = 'ImageNotInDatabasePacket'; +messages[Message.RebakeAvatarTextures] = 'RebakeAvatarTexturesPacket'; +messages[Message.SetAlwaysRun] = 'SetAlwaysRunPacket'; +messages[Message.ObjectAdd] = 'ObjectAddPacket'; +messages[Message.ObjectDelete] = 'ObjectDeletePacket'; +messages[Message.ObjectDuplicate] = 'ObjectDuplicatePacket'; +messages[Message.ObjectDuplicateOnRay] = 'ObjectDuplicateOnRayPacket'; +messages[Message.MultipleObjectUpdate] = 'MultipleObjectUpdatePacket'; +messages[Message.RequestMultipleObjects] = 'RequestMultipleObjectsPacket'; +messages[Message.ObjectPosition] = 'ObjectPositionPacket'; +messages[Message.ObjectScale] = 'ObjectScalePacket'; +messages[Message.ObjectRotation] = 'ObjectRotationPacket'; +messages[Message.ObjectFlagUpdate] = 'ObjectFlagUpdatePacket'; +messages[Message.ObjectClickAction] = 'ObjectClickActionPacket'; +messages[Message.ObjectImage] = 'ObjectImagePacket'; +messages[Message.ObjectMaterial] = 'ObjectMaterialPacket'; +messages[Message.ObjectShape] = 'ObjectShapePacket'; +messages[Message.ObjectExtraParams] = 'ObjectExtraParamsPacket'; +messages[Message.ObjectOwner] = 'ObjectOwnerPacket'; +messages[Message.ObjectGroup] = 'ObjectGroupPacket'; +messages[Message.ObjectBuy] = 'ObjectBuyPacket'; +messages[Message.BuyObjectInventory] = 'BuyObjectInventoryPacket'; +messages[Message.DerezContainer] = 'DerezContainerPacket'; +messages[Message.ObjectPermissions] = 'ObjectPermissionsPacket'; +messages[Message.ObjectSaleInfo] = 'ObjectSaleInfoPacket'; +messages[Message.ObjectName] = 'ObjectNamePacket'; +messages[Message.ObjectDescription] = 'ObjectDescriptionPacket'; +messages[Message.ObjectCategory] = 'ObjectCategoryPacket'; +messages[Message.ObjectSelect] = 'ObjectSelectPacket'; +messages[Message.ObjectDeselect] = 'ObjectDeselectPacket'; +messages[Message.ObjectAttach] = 'ObjectAttachPacket'; +messages[Message.ObjectDetach] = 'ObjectDetachPacket'; +messages[Message.ObjectDrop] = 'ObjectDropPacket'; +messages[Message.ObjectLink] = 'ObjectLinkPacket'; +messages[Message.ObjectDelink] = 'ObjectDelinkPacket'; +messages[Message.ObjectGrab] = 'ObjectGrabPacket'; +messages[Message.ObjectGrabUpdate] = 'ObjectGrabUpdatePacket'; +messages[Message.ObjectDeGrab] = 'ObjectDeGrabPacket'; +messages[Message.ObjectSpinStart] = 'ObjectSpinStartPacket'; +messages[Message.ObjectSpinUpdate] = 'ObjectSpinUpdatePacket'; +messages[Message.ObjectSpinStop] = 'ObjectSpinStopPacket'; +messages[Message.ObjectExportSelected] = 'ObjectExportSelectedPacket'; +messages[Message.ModifyLand] = 'ModifyLandPacket'; +messages[Message.VelocityInterpolateOn] = 'VelocityInterpolateOnPacket'; +messages[Message.VelocityInterpolateOff] = 'VelocityInterpolateOffPacket'; +messages[Message.StateSave] = 'StateSavePacket'; +messages[Message.ReportAutosaveCrash] = 'ReportAutosaveCrashPacket'; +messages[Message.SimWideDeletes] = 'SimWideDeletesPacket'; +messages[Message.RequestObjectPropertiesFamily] = 'RequestObjectPropertiesFamilyPacket'; +messages[Message.TrackAgent] = 'TrackAgentPacket'; +messages[Message.ViewerStats] = 'ViewerStatsPacket'; +messages[Message.ScriptAnswerYes] = 'ScriptAnswerYesPacket'; +messages[Message.UserReport] = 'UserReportPacket'; +messages[Message.AlertMessage] = 'AlertMessagePacket'; +messages[Message.AgentAlertMessage] = 'AgentAlertMessagePacket'; +messages[Message.MeanCollisionAlert] = 'MeanCollisionAlertPacket'; +messages[Message.ViewerFrozenMessage] = 'ViewerFrozenMessagePacket'; +messages[Message.HealthMessage] = 'HealthMessagePacket'; +messages[Message.ChatFromSimulator] = 'ChatFromSimulatorPacket'; +messages[Message.SimStats] = 'SimStatsPacket'; +messages[Message.RequestRegionInfo] = 'RequestRegionInfoPacket'; +messages[Message.RegionInfo] = 'RegionInfoPacket'; +messages[Message.GodUpdateRegionInfo] = 'GodUpdateRegionInfoPacket'; +messages[Message.NearestLandingRegionRequest] = 'NearestLandingRegionRequestPacket'; +messages[Message.NearestLandingRegionReply] = 'NearestLandingRegionReplyPacket'; +messages[Message.NearestLandingRegionUpdated] = 'NearestLandingRegionUpdatedPacket'; +messages[Message.TeleportLandingStatusChanged] = 'TeleportLandingStatusChangedPacket'; +messages[Message.RegionHandshake] = 'RegionHandshakePacket'; +messages[Message.RegionHandshakeReply] = 'RegionHandshakeReplyPacket'; +messages[Message.CoarseLocationUpdate] = 'CoarseLocationUpdatePacket'; +messages[Message.ImageData] = 'ImageDataPacket'; +messages[Message.ImagePacket] = 'ImagePacketPacket'; +messages[Message.LayerData] = 'LayerDataPacket'; +messages[Message.ObjectUpdate] = 'ObjectUpdatePacket'; +messages[Message.ObjectUpdateCompressed] = 'ObjectUpdateCompressedPacket'; +messages[Message.ObjectUpdateCached] = 'ObjectUpdateCachedPacket'; +messages[Message.ImprovedTerseObjectUpdate] = 'ImprovedTerseObjectUpdatePacket'; +messages[Message.KillObject] = 'KillObjectPacket'; +messages[Message.CrossedRegion] = 'CrossedRegionPacket'; +messages[Message.SimulatorViewerTimeMessage] = 'SimulatorViewerTimeMessagePacket'; +messages[Message.EnableSimulator] = 'EnableSimulatorPacket'; +messages[Message.DisableSimulator] = 'DisableSimulatorPacket'; +messages[Message.ConfirmEnableSimulator] = 'ConfirmEnableSimulatorPacket'; +messages[Message.TransferRequest] = 'TransferRequestPacket'; +messages[Message.TransferInfo] = 'TransferInfoPacket'; +messages[Message.TransferPacket] = 'TransferPacketPacket'; +messages[Message.TransferAbort] = 'TransferAbortPacket'; +messages[Message.RequestXfer] = 'RequestXferPacket'; +messages[Message.SendXferPacket] = 'SendXferPacketPacket'; +messages[Message.ConfirmXferPacket] = 'ConfirmXferPacketPacket'; +messages[Message.AbortXfer] = 'AbortXferPacket'; +messages[Message.AvatarAnimation] = 'AvatarAnimationPacket'; +messages[Message.AvatarAppearance] = 'AvatarAppearancePacket'; +messages[Message.AvatarSitResponse] = 'AvatarSitResponsePacket'; +messages[Message.SetFollowCamProperties] = 'SetFollowCamPropertiesPacket'; +messages[Message.ClearFollowCamProperties] = 'ClearFollowCamPropertiesPacket'; +messages[Message.CameraConstraint] = 'CameraConstraintPacket'; +messages[Message.ObjectProperties] = 'ObjectPropertiesPacket'; +messages[Message.ObjectPropertiesFamily] = 'ObjectPropertiesFamilyPacket'; +messages[Message.RequestPayPrice] = 'RequestPayPricePacket'; +messages[Message.PayPriceReply] = 'PayPriceReplyPacket'; +messages[Message.KickUser] = 'KickUserPacket'; +messages[Message.KickUserAck] = 'KickUserAckPacket'; +messages[Message.GodKickUser] = 'GodKickUserPacket'; +messages[Message.SystemKickUser] = 'SystemKickUserPacket'; +messages[Message.EjectUser] = 'EjectUserPacket'; +messages[Message.FreezeUser] = 'FreezeUserPacket'; +messages[Message.AvatarPropertiesRequest] = 'AvatarPropertiesRequestPacket'; +messages[Message.AvatarPropertiesRequestBackend] = 'AvatarPropertiesRequestBackendPacket'; +messages[Message.AvatarPropertiesReply] = 'AvatarPropertiesReplyPacket'; +messages[Message.AvatarInterestsReply] = 'AvatarInterestsReplyPacket'; +messages[Message.AvatarGroupsReply] = 'AvatarGroupsReplyPacket'; +messages[Message.AvatarPropertiesUpdate] = 'AvatarPropertiesUpdatePacket'; +messages[Message.AvatarInterestsUpdate] = 'AvatarInterestsUpdatePacket'; +messages[Message.AvatarNotesReply] = 'AvatarNotesReplyPacket'; +messages[Message.AvatarNotesUpdate] = 'AvatarNotesUpdatePacket'; +messages[Message.AvatarPicksReply] = 'AvatarPicksReplyPacket'; +messages[Message.EventInfoRequest] = 'EventInfoRequestPacket'; +messages[Message.EventInfoReply] = 'EventInfoReplyPacket'; +messages[Message.EventNotificationAddRequest] = 'EventNotificationAddRequestPacket'; +messages[Message.EventNotificationRemoveRequest] = 'EventNotificationRemoveRequestPacket'; +messages[Message.EventGodDelete] = 'EventGodDeletePacket'; +messages[Message.PickInfoReply] = 'PickInfoReplyPacket'; +messages[Message.PickInfoUpdate] = 'PickInfoUpdatePacket'; +messages[Message.PickDelete] = 'PickDeletePacket'; +messages[Message.PickGodDelete] = 'PickGodDeletePacket'; +messages[Message.ScriptQuestion] = 'ScriptQuestionPacket'; +messages[Message.ScriptControlChange] = 'ScriptControlChangePacket'; +messages[Message.ScriptDialog] = 'ScriptDialogPacket'; +messages[Message.ScriptDialogReply] = 'ScriptDialogReplyPacket'; +messages[Message.ForceScriptControlRelease] = 'ForceScriptControlReleasePacket'; +messages[Message.RevokePermissions] = 'RevokePermissionsPacket'; +messages[Message.LoadURL] = 'LoadURLPacket'; +messages[Message.ScriptTeleportRequest] = 'ScriptTeleportRequestPacket'; +messages[Message.ParcelOverlay] = 'ParcelOverlayPacket'; +messages[Message.ParcelPropertiesRequest] = 'ParcelPropertiesRequestPacket'; +messages[Message.ParcelPropertiesRequestByID] = 'ParcelPropertiesRequestByIDPacket'; +messages[Message.ParcelProperties] = 'ParcelPropertiesPacket'; +messages[Message.ParcelPropertiesUpdate] = 'ParcelPropertiesUpdatePacket'; +messages[Message.ParcelReturnObjects] = 'ParcelReturnObjectsPacket'; +messages[Message.ParcelSetOtherCleanTime] = 'ParcelSetOtherCleanTimePacket'; +messages[Message.ParcelDisableObjects] = 'ParcelDisableObjectsPacket'; +messages[Message.ParcelSelectObjects] = 'ParcelSelectObjectsPacket'; +messages[Message.EstateCovenantRequest] = 'EstateCovenantRequestPacket'; +messages[Message.EstateCovenantReply] = 'EstateCovenantReplyPacket'; +messages[Message.ForceObjectSelect] = 'ForceObjectSelectPacket'; +messages[Message.ParcelBuyPass] = 'ParcelBuyPassPacket'; +messages[Message.ParcelDeedToGroup] = 'ParcelDeedToGroupPacket'; +messages[Message.ParcelReclaim] = 'ParcelReclaimPacket'; +messages[Message.ParcelClaim] = 'ParcelClaimPacket'; +messages[Message.ParcelJoin] = 'ParcelJoinPacket'; +messages[Message.ParcelDivide] = 'ParcelDividePacket'; +messages[Message.ParcelRelease] = 'ParcelReleasePacket'; +messages[Message.ParcelBuy] = 'ParcelBuyPacket'; +messages[Message.ParcelGodForceOwner] = 'ParcelGodForceOwnerPacket'; +messages[Message.ParcelAccessListRequest] = 'ParcelAccessListRequestPacket'; +messages[Message.ParcelAccessListReply] = 'ParcelAccessListReplyPacket'; +messages[Message.ParcelAccessListUpdate] = 'ParcelAccessListUpdatePacket'; +messages[Message.ParcelDwellRequest] = 'ParcelDwellRequestPacket'; +messages[Message.ParcelDwellReply] = 'ParcelDwellReplyPacket'; +messages[Message.RequestParcelTransfer] = 'RequestParcelTransferPacket'; +messages[Message.UpdateParcel] = 'UpdateParcelPacket'; +messages[Message.RemoveParcel] = 'RemoveParcelPacket'; +messages[Message.MergeParcel] = 'MergeParcelPacket'; +messages[Message.LogParcelChanges] = 'LogParcelChangesPacket'; +messages[Message.CheckParcelSales] = 'CheckParcelSalesPacket'; +messages[Message.ParcelSales] = 'ParcelSalesPacket'; +messages[Message.ParcelGodMarkAsContent] = 'ParcelGodMarkAsContentPacket'; +messages[Message.ViewerStartAuction] = 'ViewerStartAuctionPacket'; +messages[Message.StartAuction] = 'StartAuctionPacket'; +messages[Message.ConfirmAuctionStart] = 'ConfirmAuctionStartPacket'; +messages[Message.CompleteAuction] = 'CompleteAuctionPacket'; +messages[Message.CancelAuction] = 'CancelAuctionPacket'; +messages[Message.CheckParcelAuctions] = 'CheckParcelAuctionsPacket'; +messages[Message.ParcelAuctions] = 'ParcelAuctionsPacket'; +messages[Message.UUIDNameRequest] = 'UUIDNameRequestPacket'; +messages[Message.UUIDNameReply] = 'UUIDNameReplyPacket'; +messages[Message.UUIDGroupNameRequest] = 'UUIDGroupNameRequestPacket'; +messages[Message.UUIDGroupNameReply] = 'UUIDGroupNameReplyPacket'; +messages[Message.ChatPass] = 'ChatPassPacket'; +messages[Message.EdgeDataPacket] = 'EdgeDataPacketPacket'; +messages[Message.SimStatus] = 'SimStatusPacket'; +messages[Message.ChildAgentUpdate] = 'ChildAgentUpdatePacket'; +messages[Message.ChildAgentAlive] = 'ChildAgentAlivePacket'; +messages[Message.ChildAgentPositionUpdate] = 'ChildAgentPositionUpdatePacket'; +messages[Message.ChildAgentDying] = 'ChildAgentDyingPacket'; +messages[Message.ChildAgentUnknown] = 'ChildAgentUnknownPacket'; +messages[Message.AtomicPassObject] = 'AtomicPassObjectPacket'; +messages[Message.KillChildAgents] = 'KillChildAgentsPacket'; +messages[Message.GetScriptRunning] = 'GetScriptRunningPacket'; +messages[Message.ScriptRunningReply] = 'ScriptRunningReplyPacket'; +messages[Message.SetScriptRunning] = 'SetScriptRunningPacket'; +messages[Message.ScriptReset] = 'ScriptResetPacket'; +messages[Message.ScriptSensorRequest] = 'ScriptSensorRequestPacket'; +messages[Message.ScriptSensorReply] = 'ScriptSensorReplyPacket'; +messages[Message.CompleteAgentMovement] = 'CompleteAgentMovementPacket'; +messages[Message.AgentMovementComplete] = 'AgentMovementCompletePacket'; +messages[Message.DataServerLogout] = 'DataServerLogoutPacket'; +messages[Message.LogoutRequest] = 'LogoutRequestPacket'; +messages[Message.LogoutReply] = 'LogoutReplyPacket'; +messages[Message.ImprovedInstantMessage] = 'ImprovedInstantMessagePacket'; +messages[Message.RetrieveInstantMessages] = 'RetrieveInstantMessagesPacket'; +messages[Message.FindAgent] = 'FindAgentPacket'; +messages[Message.RequestGodlikePowers] = 'RequestGodlikePowersPacket'; +messages[Message.GrantGodlikePowers] = 'GrantGodlikePowersPacket'; +messages[Message.GodlikeMessage] = 'GodlikeMessagePacket'; +messages[Message.EstateOwnerMessage] = 'EstateOwnerMessagePacket'; +messages[Message.GenericMessage] = 'GenericMessagePacket'; +messages[Message.MuteListRequest] = 'MuteListRequestPacket'; +messages[Message.UpdateMuteListEntry] = 'UpdateMuteListEntryPacket'; +messages[Message.RemoveMuteListEntry] = 'RemoveMuteListEntryPacket'; +messages[Message.CopyInventoryFromNotecard] = 'CopyInventoryFromNotecardPacket'; +messages[Message.UpdateInventoryItem] = 'UpdateInventoryItemPacket'; +messages[Message.UpdateCreateInventoryItem] = 'UpdateCreateInventoryItemPacket'; +messages[Message.MoveInventoryItem] = 'MoveInventoryItemPacket'; +messages[Message.CopyInventoryItem] = 'CopyInventoryItemPacket'; +messages[Message.RemoveInventoryItem] = 'RemoveInventoryItemPacket'; +messages[Message.ChangeInventoryItemFlags] = 'ChangeInventoryItemFlagsPacket'; +messages[Message.SaveAssetIntoInventory] = 'SaveAssetIntoInventoryPacket'; +messages[Message.CreateInventoryFolder] = 'CreateInventoryFolderPacket'; +messages[Message.UpdateInventoryFolder] = 'UpdateInventoryFolderPacket'; +messages[Message.MoveInventoryFolder] = 'MoveInventoryFolderPacket'; +messages[Message.RemoveInventoryFolder] = 'RemoveInventoryFolderPacket'; +messages[Message.FetchInventoryDescendents] = 'FetchInventoryDescendentsPacket'; +messages[Message.InventoryDescendents] = 'InventoryDescendentsPacket'; +messages[Message.FetchInventory] = 'FetchInventoryPacket'; +messages[Message.FetchInventoryReply] = 'FetchInventoryReplyPacket'; +messages[Message.BulkUpdateInventory] = 'BulkUpdateInventoryPacket'; +messages[Message.RequestInventoryAsset] = 'RequestInventoryAssetPacket'; +messages[Message.InventoryAssetResponse] = 'InventoryAssetResponsePacket'; +messages[Message.RemoveInventoryObjects] = 'RemoveInventoryObjectsPacket'; +messages[Message.PurgeInventoryDescendents] = 'PurgeInventoryDescendentsPacket'; +messages[Message.UpdateTaskInventory] = 'UpdateTaskInventoryPacket'; +messages[Message.RemoveTaskInventory] = 'RemoveTaskInventoryPacket'; +messages[Message.MoveTaskInventory] = 'MoveTaskInventoryPacket'; +messages[Message.RequestTaskInventory] = 'RequestTaskInventoryPacket'; +messages[Message.ReplyTaskInventory] = 'ReplyTaskInventoryPacket'; +messages[Message.DeRezObject] = 'DeRezObjectPacket'; +messages[Message.DeRezAck] = 'DeRezAckPacket'; +messages[Message.RezObject] = 'RezObjectPacket'; +messages[Message.RezObjectFromNotecard] = 'RezObjectFromNotecardPacket'; +messages[Message.TransferInventory] = 'TransferInventoryPacket'; +messages[Message.TransferInventoryAck] = 'TransferInventoryAckPacket'; +messages[Message.AcceptFriendship] = 'AcceptFriendshipPacket'; +messages[Message.DeclineFriendship] = 'DeclineFriendshipPacket'; +messages[Message.FormFriendship] = 'FormFriendshipPacket'; +messages[Message.TerminateFriendship] = 'TerminateFriendshipPacket'; +messages[Message.OfferCallingCard] = 'OfferCallingCardPacket'; +messages[Message.AcceptCallingCard] = 'AcceptCallingCardPacket'; +messages[Message.DeclineCallingCard] = 'DeclineCallingCardPacket'; +messages[Message.RezScript] = 'RezScriptPacket'; +messages[Message.CreateInventoryItem] = 'CreateInventoryItemPacket'; +messages[Message.CreateLandmarkForEvent] = 'CreateLandmarkForEventPacket'; +messages[Message.EventLocationRequest] = 'EventLocationRequestPacket'; +messages[Message.EventLocationReply] = 'EventLocationReplyPacket'; +messages[Message.RegionHandleRequest] = 'RegionHandleRequestPacket'; +messages[Message.RegionIDAndHandleReply] = 'RegionIDAndHandleReplyPacket'; +messages[Message.MoneyTransferRequest] = 'MoneyTransferRequestPacket'; +messages[Message.MoneyTransferBackend] = 'MoneyTransferBackendPacket'; +messages[Message.MoneyBalanceRequest] = 'MoneyBalanceRequestPacket'; +messages[Message.MoneyBalanceReply] = 'MoneyBalanceReplyPacket'; +messages[Message.RoutedMoneyBalanceReply] = 'RoutedMoneyBalanceReplyPacket'; +messages[Message.ActivateGestures] = 'ActivateGesturesPacket'; +messages[Message.DeactivateGestures] = 'DeactivateGesturesPacket'; +messages[Message.MuteListUpdate] = 'MuteListUpdatePacket'; +messages[Message.UseCachedMuteList] = 'UseCachedMuteListPacket'; +messages[Message.GrantUserRights] = 'GrantUserRightsPacket'; +messages[Message.ChangeUserRights] = 'ChangeUserRightsPacket'; +messages[Message.OnlineNotification] = 'OnlineNotificationPacket'; +messages[Message.OfflineNotification] = 'OfflineNotificationPacket'; +messages[Message.SetStartLocationRequest] = 'SetStartLocationRequestPacket'; +messages[Message.SetStartLocation] = 'SetStartLocationPacket'; +messages[Message.NetTest] = 'NetTestPacket'; +messages[Message.SetCPURatio] = 'SetCPURatioPacket'; +messages[Message.SimCrashed] = 'SimCrashedPacket'; +messages[Message.NameValuePair] = 'NameValuePairPacket'; +messages[Message.RemoveNameValuePair] = 'RemoveNameValuePairPacket'; +messages[Message.UpdateAttachment] = 'UpdateAttachmentPacket'; +messages[Message.RemoveAttachment] = 'RemoveAttachmentPacket'; +messages[Message.SoundTrigger] = 'SoundTriggerPacket'; +messages[Message.AttachedSound] = 'AttachedSoundPacket'; +messages[Message.AttachedSoundGainChange] = 'AttachedSoundGainChangePacket'; +messages[Message.PreloadSound] = 'PreloadSoundPacket'; +messages[Message.AssetUploadRequest] = 'AssetUploadRequestPacket'; +messages[Message.AssetUploadComplete] = 'AssetUploadCompletePacket'; +messages[Message.EmailMessageRequest] = 'EmailMessageRequestPacket'; +messages[Message.EmailMessageReply] = 'EmailMessageReplyPacket'; +messages[Message.InternalScriptMail] = 'InternalScriptMailPacket'; +messages[Message.ScriptDataRequest] = 'ScriptDataRequestPacket'; +messages[Message.ScriptDataReply] = 'ScriptDataReplyPacket'; +messages[Message.CreateGroupRequest] = 'CreateGroupRequestPacket'; +messages[Message.CreateGroupReply] = 'CreateGroupReplyPacket'; +messages[Message.UpdateGroupInfo] = 'UpdateGroupInfoPacket'; +messages[Message.GroupRoleChanges] = 'GroupRoleChangesPacket'; +messages[Message.JoinGroupRequest] = 'JoinGroupRequestPacket'; +messages[Message.JoinGroupReply] = 'JoinGroupReplyPacket'; +messages[Message.EjectGroupMemberRequest] = 'EjectGroupMemberRequestPacket'; +messages[Message.EjectGroupMemberReply] = 'EjectGroupMemberReplyPacket'; +messages[Message.LeaveGroupRequest] = 'LeaveGroupRequestPacket'; +messages[Message.LeaveGroupReply] = 'LeaveGroupReplyPacket'; +messages[Message.InviteGroupRequest] = 'InviteGroupRequestPacket'; +messages[Message.InviteGroupResponse] = 'InviteGroupResponsePacket'; +messages[Message.GroupProfileRequest] = 'GroupProfileRequestPacket'; +messages[Message.GroupProfileReply] = 'GroupProfileReplyPacket'; +messages[Message.GroupAccountSummaryRequest] = 'GroupAccountSummaryRequestPacket'; +messages[Message.GroupAccountSummaryReply] = 'GroupAccountSummaryReplyPacket'; +messages[Message.GroupAccountDetailsRequest] = 'GroupAccountDetailsRequestPacket'; +messages[Message.GroupAccountDetailsReply] = 'GroupAccountDetailsReplyPacket'; +messages[Message.GroupAccountTransactionsRequest] = 'GroupAccountTransactionsRequestPacket'; +messages[Message.GroupAccountTransactionsReply] = 'GroupAccountTransactionsReplyPacket'; +messages[Message.GroupActiveProposalsRequest] = 'GroupActiveProposalsRequestPacket'; +messages[Message.GroupActiveProposalItemReply] = 'GroupActiveProposalItemReplyPacket'; +messages[Message.GroupVoteHistoryRequest] = 'GroupVoteHistoryRequestPacket'; +messages[Message.GroupVoteHistoryItemReply] = 'GroupVoteHistoryItemReplyPacket'; +messages[Message.StartGroupProposal] = 'StartGroupProposalPacket'; +messages[Message.GroupProposalBallot] = 'GroupProposalBallotPacket'; +messages[Message.TallyVotes] = 'TallyVotesPacket'; +messages[Message.GroupMembersRequest] = 'GroupMembersRequestPacket'; +messages[Message.GroupMembersReply] = 'GroupMembersReplyPacket'; +messages[Message.ActivateGroup] = 'ActivateGroupPacket'; +messages[Message.SetGroupContribution] = 'SetGroupContributionPacket'; +messages[Message.SetGroupAcceptNotices] = 'SetGroupAcceptNoticesPacket'; +messages[Message.GroupRoleDataRequest] = 'GroupRoleDataRequestPacket'; +messages[Message.GroupRoleDataReply] = 'GroupRoleDataReplyPacket'; +messages[Message.GroupRoleMembersRequest] = 'GroupRoleMembersRequestPacket'; +messages[Message.GroupRoleMembersReply] = 'GroupRoleMembersReplyPacket'; +messages[Message.GroupTitlesRequest] = 'GroupTitlesRequestPacket'; +messages[Message.GroupTitlesReply] = 'GroupTitlesReplyPacket'; +messages[Message.GroupTitleUpdate] = 'GroupTitleUpdatePacket'; +messages[Message.GroupRoleUpdate] = 'GroupRoleUpdatePacket'; +messages[Message.LiveHelpGroupRequest] = 'LiveHelpGroupRequestPacket'; +messages[Message.LiveHelpGroupReply] = 'LiveHelpGroupReplyPacket'; +messages[Message.AgentWearablesRequest] = 'AgentWearablesRequestPacket'; +messages[Message.AgentWearablesUpdate] = 'AgentWearablesUpdatePacket'; +messages[Message.AgentIsNowWearing] = 'AgentIsNowWearingPacket'; +messages[Message.AgentCachedTexture] = 'AgentCachedTexturePacket'; +messages[Message.AgentCachedTextureResponse] = 'AgentCachedTextureResponsePacket'; +messages[Message.AgentDataUpdateRequest] = 'AgentDataUpdateRequestPacket'; +messages[Message.AgentDataUpdate] = 'AgentDataUpdatePacket'; +messages[Message.GroupDataUpdate] = 'GroupDataUpdatePacket'; +messages[Message.AgentGroupDataUpdate] = 'AgentGroupDataUpdatePacket'; +messages[Message.AgentDropGroup] = 'AgentDropGroupPacket'; +messages[Message.LogTextMessage] = 'LogTextMessagePacket'; +messages[Message.ViewerEffect] = 'ViewerEffectPacket'; +messages[Message.CreateTrustedCircuit] = 'CreateTrustedCircuitPacket'; +messages[Message.DenyTrustedCircuit] = 'DenyTrustedCircuitPacket'; +messages[Message.RequestTrustedCircuit] = 'RequestTrustedCircuitPacket'; +messages[Message.RezSingleAttachmentFromInv] = 'RezSingleAttachmentFromInvPacket'; +messages[Message.RezMultipleAttachmentsFromInv] = 'RezMultipleAttachmentsFromInvPacket'; +messages[Message.DetachAttachmentIntoInv] = 'DetachAttachmentIntoInvPacket'; +messages[Message.CreateNewOutfitAttachments] = 'CreateNewOutfitAttachmentsPacket'; +messages[Message.UserInfoRequest] = 'UserInfoRequestPacket'; +messages[Message.UserInfoReply] = 'UserInfoReplyPacket'; +messages[Message.UpdateUserInfo] = 'UpdateUserInfoPacket'; +messages[Message.ParcelRename] = 'ParcelRenamePacket'; +messages[Message.InitiateDownload] = 'InitiateDownloadPacket'; +messages[Message.SystemMessage] = 'SystemMessagePacket'; +messages[Message.MapLayerRequest] = 'MapLayerRequestPacket'; +messages[Message.MapLayerReply] = 'MapLayerReplyPacket'; +messages[Message.MapBlockRequest] = 'MapBlockRequestPacket'; +messages[Message.MapNameRequest] = 'MapNameRequestPacket'; +messages[Message.MapBlockReply] = 'MapBlockReplyPacket'; +messages[Message.MapItemRequest] = 'MapItemRequestPacket'; +messages[Message.MapItemReply] = 'MapItemReplyPacket'; +messages[Message.SendPostcard] = 'SendPostcardPacket'; +messages[Message.RpcChannelRequest] = 'RpcChannelRequestPacket'; +messages[Message.RpcChannelReply] = 'RpcChannelReplyPacket'; +messages[Message.RpcScriptRequestInbound] = 'RpcScriptRequestInboundPacket'; +messages[Message.RpcScriptRequestInboundForward] = 'RpcScriptRequestInboundForwardPacket'; +messages[Message.RpcScriptReplyInbound] = 'RpcScriptReplyInboundPacket'; +messages[Message.ScriptMailRegistration] = 'ScriptMailRegistrationPacket'; +messages[Message.ParcelMediaCommandMessage] = 'ParcelMediaCommandMessagePacket'; +messages[Message.ParcelMediaUpdate] = 'ParcelMediaUpdatePacket'; +messages[Message.LandStatRequest] = 'LandStatRequestPacket'; +messages[Message.LandStatReply] = 'LandStatReplyPacket'; +messages[Message.Error] = 'ErrorPacket'; +messages[Message.ObjectIncludeInSearch] = 'ObjectIncludeInSearchPacket'; +messages[Message.RezRestoreToWorld] = 'RezRestoreToWorldPacket'; +messages[Message.LinkInventoryItem] = 'LinkInventoryItemPacket'; +messages[Message.RetrieveIMsExtended] = 'RetrieveIMsExtendedPacket'; +messages[Message.JoinGroupRequestExtended] = 'JoinGroupRequestExtendedPacket'; +messages[Message.CreateGroupRequestExtended] = 'CreateGroupRequestExtendedPacket'; + +export function nameFromID(id: Message): string +{ + return messages[id]; +} diff --git a/lib/classes/MessageDecoder.ts b/lib/classes/MessageDecoder.ts new file mode 100644 index 0000000..a5bc023 --- /dev/null +++ b/lib/classes/MessageDecoder.ts @@ -0,0 +1,14 @@ +import {Packet} from './Packet'; +import {Message} from '../enums/Message'; +import * as MessageClass from './MessageClasses'; +import {nameFromID} from './MessageClasses'; + +export class MessageDecoder +{ + constructor() + { + //let pk: Packet = new Messages['UseCircuitCode']() as Packet; + let pk: Packet = new (MessageClass)[nameFromID(Message.UseCircuitCode)]() as Packet; + console.log(pk.name); + } +} diff --git a/lib/classes/Packet.ts b/lib/classes/Packet.ts index 316b476..fdb1325 100644 --- a/lib/classes/Packet.ts +++ b/lib/classes/Packet.ts @@ -7,4 +7,6 @@ export interface Packet id: number; getSize(): number; + writeToBuffer(buf: Buffer, pos: number): number; + readFromBuffer(buf: Buffer, pos: number): number; } diff --git a/lib/classes/Quaternion.ts b/lib/classes/Quaternion.ts index a460015..e4a74fc 100644 --- a/lib/classes/Quaternion.ts +++ b/lib/classes/Quaternion.ts @@ -2,5 +2,38 @@ import {quat} from '../tsm/quat'; export class Quaternion extends quat { + static getIdentity(): Quaternion + { + const q = new Quaternion(); + q.setIdentity(); + return q; + } + constructor(buf?: Buffer | number[], pos?: number) + { + if (buf !== undefined && pos !== undefined && buf instanceof Buffer) + { + const x = buf.readFloatLE(pos); + const y = buf.readFloatLE(pos + 4); + const z = buf.readFloatLE(pos + 8); + const xyzsum = 1.0 - x * x - y * y - z * z; + const w = (xyzsum > 0.0) ? Math.sqrt(xyzsum) : 0; + super([x, y, z, w]); + } + else if (buf !== undefined && Array.isArray(buf)) + { + super(buf); + } + else + { + super(); + } + } + writeToBuffer(buf: Buffer, pos: number) + { + const q: quat = this.normalize(); + buf.writeFloatLE(q.x, pos); + buf.writeFloatLE(q.y, pos + 4); + buf.writeFloatLE(q.z, pos + 4); + } } diff --git a/lib/classes/Region.ts b/lib/classes/Region.ts index 0d64680..cc6fdc2 100644 --- a/lib/classes/Region.ts +++ b/lib/classes/Region.ts @@ -10,6 +10,7 @@ export class Region constructor() { + console.log("Creating circuit"); this.circuit = new Circuit(); } } diff --git a/lib/classes/UUID.ts b/lib/classes/UUID.ts index 5381a7d..7cae35a 100644 --- a/lib/classes/UUID.ts +++ b/lib/classes/UUID.ts @@ -1,4 +1,5 @@ import * as validator from 'validator'; +const uuid = require('uuid'); export class UUID { @@ -9,11 +10,18 @@ export class UUID return new UUID(); } - constructor(val?: string) + constructor(buf?: Buffer | string, pos?: number) { - if (val !== undefined) + if (buf !== undefined) { - this.setUUID(val); + if (typeof buf === 'string') + { + this.setUUID(buf); + } + else if (pos !== undefined) + { + this.mUUID = uuid.unparse(buf, pos); + } } } @@ -30,5 +38,10 @@ export class UUID public toString = (): string => { return this.mUUID; + }; + + writeToBuffer(buf: Buffer, pos: number) + { + uuid.parse(this.mUUID, buf, pos); } } diff --git a/lib/classes/Vector3.ts b/lib/classes/Vector3.ts index 6789964..6e05775 100644 --- a/lib/classes/Vector3.ts +++ b/lib/classes/Vector3.ts @@ -2,5 +2,56 @@ import {vec3} from '../tsm/vec3'; export class Vector3 extends vec3 { + static getZero(): Vector3 + { + return new Vector3(); + } + constructor(buf?: Buffer | number[], pos?: number, double?: boolean) + { + if (double === undefined) + { + double = false; + } + if (buf !== undefined && pos !== undefined && buf instanceof Buffer) + { + if (!double) + { + const x = buf.readFloatLE(pos); + const y = buf.readFloatLE(pos + 4); + const z = buf.readFloatLE(pos + 8); + super([x, y, z]); + } + else + { + const x = buf.readDoubleLE(pos); + const y = buf.readDoubleLE(pos + 8); + const z = buf.readDoubleLE(pos + 16); + super([x, y, z]); + } + } + else if (buf !== undefined && Array.isArray(buf)) + { + super(buf); + } + else + { + super(); + } + } + writeToBuffer(buf: Buffer, pos: number, double: boolean) + { + if (double) + { + buf.writeDoubleLE(this.x, pos); + buf.writeDoubleLE(this.y, pos + 8); + buf.writeDoubleLE(this.x, pos + 16); + } + else + { + buf.writeFloatLE(this.x, pos); + buf.writeFloatLE(this.y, pos + 4); + buf.writeFloatLE(this.x, pos + 8); + } + } } diff --git a/lib/classes/Vector4.ts b/lib/classes/Vector4.ts index 2555da8..9402b9b 100644 --- a/lib/classes/Vector4.ts +++ b/lib/classes/Vector4.ts @@ -2,5 +2,35 @@ import {vec4} from '../tsm/vec4'; export class Vector4 extends vec4 { + static getZero(): Vector4 + { + return new Vector4(); + } + constructor(buf?: Buffer | number[], pos?: number) + { + if (buf !== undefined && pos !== undefined && buf instanceof Buffer) + { + const x = buf.readFloatLE(pos); + const y = buf.readFloatLE(pos + 4); + const z = buf.readFloatLE(pos + 8); + const w = buf.readFloatLE(pos + 12); + super([x, y, z, w]); + } + else if (buf !== undefined && Array.isArray(buf)) + { + super(buf); + } + else + { + super(); + } + } + writeToBuffer(buf: Buffer, pos: number) + { + buf.writeFloatLE(this.x, pos); + buf.writeFloatLE(this.y, pos + 4); + buf.writeFloatLE(this.x, pos + 8); + buf.writeFloatLE(this.w, pos + 12); + } } diff --git a/lib/classes/packets/AbortXfer.ts b/lib/classes/packets/AbortXfer.ts index d0ba88c..2c20ff7 100644 --- a/lib/classes/packets/AbortXfer.ts +++ b/lib/classes/packets/AbortXfer.ts @@ -20,4 +20,34 @@ export class AbortXferPacket implements Packet return 12; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.XferID['ID'].low, pos); + pos += 4; + buf.writeInt32LE(this.XferID['ID'].high, pos); + pos += 4; + buf.writeInt32LE(this.XferID['Result'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjXferID: { + ID: Long, + Result: number + } = { + ID: Long.ZERO, + Result: 0 + }; + newObjXferID['ID'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjXferID['Result'] = buf.readInt32LE(pos); + pos += 4; + this.XferID = newObjXferID; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AcceptCallingCard.ts b/lib/classes/packets/AcceptCallingCard.ts index d5fde3c..c04fe5a 100644 --- a/lib/classes/packets/AcceptCallingCard.ts +++ b/lib/classes/packets/AcceptCallingCard.ts @@ -26,4 +26,62 @@ export class AcceptCallingCardPacket implements Packet return ((16) * this.FolderData.length) + 49; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.TransactionBlock['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.FolderData.length; + buf.writeUInt8(this.FolderData.length, pos++); + for (let i = 0; i < count; i++) + { + this.FolderData[i]['FolderID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjTransactionBlock: { + TransactionID: UUID + } = { + TransactionID: UUID.zero() + }; + newObjTransactionBlock['TransactionID'] = new UUID(buf, pos); + pos += 16; + this.TransactionBlock = newObjTransactionBlock; + const count = buf.readUInt8(pos++); + this.FolderData = []; + for (let i = 0; i < count; i++) + { + const newObjFolderData: { + FolderID: UUID + } = { + FolderID: UUID.zero() + }; + newObjFolderData['FolderID'] = new UUID(buf, pos); + pos += 16; + this.FolderData.push(newObjFolderData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/AcceptFriendship.ts b/lib/classes/packets/AcceptFriendship.ts index 6611b30..4cbd2e1 100644 --- a/lib/classes/packets/AcceptFriendship.ts +++ b/lib/classes/packets/AcceptFriendship.ts @@ -26,4 +26,62 @@ export class AcceptFriendshipPacket implements Packet return ((16) * this.FolderData.length) + 49; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.TransactionBlock['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.FolderData.length; + buf.writeUInt8(this.FolderData.length, pos++); + for (let i = 0; i < count; i++) + { + this.FolderData[i]['FolderID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjTransactionBlock: { + TransactionID: UUID + } = { + TransactionID: UUID.zero() + }; + newObjTransactionBlock['TransactionID'] = new UUID(buf, pos); + pos += 16; + this.TransactionBlock = newObjTransactionBlock; + const count = buf.readUInt8(pos++); + this.FolderData = []; + for (let i = 0; i < count; i++) + { + const newObjFolderData: { + FolderID: UUID + } = { + FolderID: UUID.zero() + }; + newObjFolderData['FolderID'] = new UUID(buf, pos); + pos += 16; + this.FolderData.push(newObjFolderData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ActivateGestures.ts b/lib/classes/packets/ActivateGestures.ts index 8557175..e88ee0f 100644 --- a/lib/classes/packets/ActivateGestures.ts +++ b/lib/classes/packets/ActivateGestures.ts @@ -26,4 +26,70 @@ export class ActivateGesturesPacket implements Packet return ((36) * this.Data.length) + 37; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AgentData['Flags'], pos); + pos += 4; + const count = this.Data.length; + buf.writeUInt8(this.Data.length, pos++); + for (let i = 0; i < count; i++) + { + this.Data[i]['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.Data[i]['AssetID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.Data[i]['GestureFlags'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + Flags: number + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + Flags: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.Data = []; + for (let i = 0; i < count; i++) + { + const newObjData: { + ItemID: UUID, + AssetID: UUID, + GestureFlags: number + } = { + ItemID: UUID.zero(), + AssetID: UUID.zero(), + GestureFlags: 0 + }; + newObjData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjData['AssetID'] = new UUID(buf, pos); + pos += 16; + newObjData['GestureFlags'] = buf.readUInt32LE(pos); + pos += 4; + this.Data.push(newObjData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ActivateGroup.ts b/lib/classes/packets/ActivateGroup.ts index 6b5d400..2f3c76e 100644 --- a/lib/classes/packets/ActivateGroup.ts +++ b/lib/classes/packets/ActivateGroup.ts @@ -21,4 +21,38 @@ export class ActivateGroupPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AddCircuitCode.ts b/lib/classes/packets/AddCircuitCode.ts index 0911379..912132e 100644 --- a/lib/classes/packets/AddCircuitCode.ts +++ b/lib/classes/packets/AddCircuitCode.ts @@ -21,4 +21,38 @@ export class AddCircuitCodePacket implements Packet return 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt32LE(this.CircuitCode['Code'], pos); + pos += 4; + this.CircuitCode['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.CircuitCode['AgentID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjCircuitCode: { + Code: number, + SessionID: UUID, + AgentID: UUID + } = { + Code: 0, + SessionID: UUID.zero(), + AgentID: UUID.zero() + }; + newObjCircuitCode['Code'] = buf.readUInt32LE(pos); + pos += 4; + newObjCircuitCode['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjCircuitCode['AgentID'] = new UUID(buf, pos); + pos += 16; + this.CircuitCode = newObjCircuitCode; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentAlertMessage.ts b/lib/classes/packets/AgentAlertMessage.ts index 26bc972..8861a48 100644 --- a/lib/classes/packets/AgentAlertMessage.ts +++ b/lib/classes/packets/AgentAlertMessage.ts @@ -23,4 +23,40 @@ export class AgentAlertMessagePacket implements Packet return (this.AlertData['Message'].length + 1) + 17; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.AlertData['Modal']) ? 1 : 0, pos++); + buf.write(this.AlertData['Message'], pos); + pos += this.AlertData['Message'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjAlertData: { + Modal: boolean, + Message: string + } = { + Modal: false, + Message: '' + }; + newObjAlertData['Modal'] = (buf.readUInt8(pos++) === 1); + newObjAlertData['Message'] = buf.toString('utf8', pos, length); + pos += length; + this.AlertData = newObjAlertData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentAnimation.ts b/lib/classes/packets/AgentAnimation.ts index f23394c..0a41d84 100644 --- a/lib/classes/packets/AgentAnimation.ts +++ b/lib/classes/packets/AgentAnimation.ts @@ -37,4 +37,76 @@ export class AgentAnimationPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + let count = this.AnimationList.length; + buf.writeUInt8(this.AnimationList.length, pos++); + for (let i = 0; i < count; i++) + { + this.AnimationList[i]['AnimID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.AnimationList[i]['StartAnim']) ? 1 : 0, pos++); + } + count = this.PhysicalAvatarEventList.length; + buf.writeUInt8(this.PhysicalAvatarEventList.length, pos++); + for (let i = 0; i < count; i++) + { + buf.write(this.PhysicalAvatarEventList[i]['TypeData'], pos); + pos += this.PhysicalAvatarEventList[i]['TypeData'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + let count = buf.readUInt8(pos++); + this.AnimationList = []; + for (let i = 0; i < count; i++) + { + const newObjAnimationList: { + AnimID: UUID, + StartAnim: boolean + } = { + AnimID: UUID.zero(), + StartAnim: false + }; + newObjAnimationList['AnimID'] = new UUID(buf, pos); + pos += 16; + newObjAnimationList['StartAnim'] = (buf.readUInt8(pos++) === 1); + this.AnimationList.push(newObjAnimationList); + } + count = buf.readUInt8(pos++); + this.PhysicalAvatarEventList = []; + for (let i = 0; i < count; i++) + { + const newObjPhysicalAvatarEventList: { + TypeData: string + } = { + TypeData: '' + }; + newObjPhysicalAvatarEventList['TypeData'] = buf.toString('utf8', pos, length); + pos += length; + this.PhysicalAvatarEventList.push(newObjPhysicalAvatarEventList); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentCachedTexture.ts b/lib/classes/packets/AgentCachedTexture.ts index 3d6fedd..7a6214e 100644 --- a/lib/classes/packets/AgentCachedTexture.ts +++ b/lib/classes/packets/AgentCachedTexture.ts @@ -25,4 +25,62 @@ export class AgentCachedTexturePacket implements Packet return ((17) * this.WearableData.length) + 37; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.AgentData['SerialNum'], pos); + pos += 4; + const count = this.WearableData.length; + buf.writeUInt8(this.WearableData.length, pos++); + for (let i = 0; i < count; i++) + { + this.WearableData[i]['ID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.WearableData[i]['TextureIndex'], pos++); + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + SerialNum: number + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + SerialNum: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SerialNum'] = buf.readInt32LE(pos); + pos += 4; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.WearableData = []; + for (let i = 0; i < count; i++) + { + const newObjWearableData: { + ID: UUID, + TextureIndex: number + } = { + ID: UUID.zero(), + TextureIndex: 0 + }; + newObjWearableData['ID'] = new UUID(buf, pos); + pos += 16; + newObjWearableData['TextureIndex'] = buf.readUInt8(pos++); + this.WearableData.push(newObjWearableData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentCachedTextureResponse.ts b/lib/classes/packets/AgentCachedTextureResponse.ts index 9202715..7b5c90d 100644 --- a/lib/classes/packets/AgentCachedTextureResponse.ts +++ b/lib/classes/packets/AgentCachedTextureResponse.ts @@ -36,4 +36,68 @@ export class AgentCachedTextureResponsePacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.AgentData['SerialNum'], pos); + pos += 4; + const count = this.WearableData.length; + buf.writeUInt8(this.WearableData.length, pos++); + for (let i = 0; i < count; i++) + { + this.WearableData[i]['TextureID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.WearableData[i]['TextureIndex'], pos++); + buf.write(this.WearableData[i]['HostName'], pos); + pos += this.WearableData[i]['HostName'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + SerialNum: number + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + SerialNum: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SerialNum'] = buf.readInt32LE(pos); + pos += 4; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.WearableData = []; + for (let i = 0; i < count; i++) + { + const newObjWearableData: { + TextureID: UUID, + TextureIndex: number, + HostName: string + } = { + TextureID: UUID.zero(), + TextureIndex: 0, + HostName: '' + }; + newObjWearableData['TextureID'] = new UUID(buf, pos); + pos += 16; + newObjWearableData['TextureIndex'] = buf.readUInt8(pos++); + newObjWearableData['HostName'] = buf.toString('utf8', pos, length); + pos += length; + this.WearableData.push(newObjWearableData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentDataUpdate.ts b/lib/classes/packets/AgentDataUpdate.ts index c11a215..266d37e 100644 --- a/lib/classes/packets/AgentDataUpdate.ts +++ b/lib/classes/packets/AgentDataUpdate.ts @@ -26,4 +26,64 @@ export class AgentDataUpdatePacket implements Packet return (this.AgentData['FirstName'].length + 1 + this.AgentData['LastName'].length + 1 + this.AgentData['GroupTitle'].length + 1 + this.AgentData['GroupName'].length + 1) + 40; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.AgentData['FirstName'], pos); + pos += this.AgentData['FirstName'].length; + buf.write(this.AgentData['LastName'], pos); + pos += this.AgentData['LastName'].length; + buf.write(this.AgentData['GroupTitle'], pos); + pos += this.AgentData['GroupTitle'].length; + this.AgentData['ActiveGroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.AgentData['GroupPowers'].low, pos); + pos += 4; + buf.writeInt32LE(this.AgentData['GroupPowers'].high, pos); + pos += 4; + buf.write(this.AgentData['GroupName'], pos); + pos += this.AgentData['GroupName'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + FirstName: string, + LastName: string, + GroupTitle: string, + ActiveGroupID: UUID, + GroupPowers: Long, + GroupName: string + } = { + AgentID: UUID.zero(), + FirstName: '', + LastName: '', + GroupTitle: '', + ActiveGroupID: UUID.zero(), + GroupPowers: Long.ZERO, + GroupName: '' + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['FirstName'] = buf.toString('utf8', pos, length); + pos += length; + newObjAgentData['LastName'] = buf.toString('utf8', pos, length); + pos += length; + newObjAgentData['GroupTitle'] = buf.toString('utf8', pos, length); + pos += length; + newObjAgentData['ActiveGroupID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupPowers'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjAgentData['GroupName'] = buf.toString('utf8', pos, length); + pos += length; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentDataUpdateRequest.ts b/lib/classes/packets/AgentDataUpdateRequest.ts index b2c183b..1c4f702 100644 --- a/lib/classes/packets/AgentDataUpdateRequest.ts +++ b/lib/classes/packets/AgentDataUpdateRequest.ts @@ -20,4 +20,32 @@ export class AgentDataUpdateRequestPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentDropGroup.ts b/lib/classes/packets/AgentDropGroup.ts index e8e512a..edf5688 100644 --- a/lib/classes/packets/AgentDropGroup.ts +++ b/lib/classes/packets/AgentDropGroup.ts @@ -20,4 +20,32 @@ export class AgentDropGroupPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentFOV.ts b/lib/classes/packets/AgentFOV.ts index 1552385..61071d4 100644 --- a/lib/classes/packets/AgentFOV.ts +++ b/lib/classes/packets/AgentFOV.ts @@ -25,4 +25,54 @@ export class AgentFOVPacket implements Packet return 44; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AgentData['CircuitCode'], pos); + pos += 4; + buf.writeUInt32LE(this.FOVBlock['GenCounter'], pos); + pos += 4; + buf.writeFloatLE(this.FOVBlock['VerticalAngle'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + CircuitCode: number + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + CircuitCode: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['CircuitCode'] = buf.readUInt32LE(pos); + pos += 4; + this.AgentData = newObjAgentData; + const newObjFOVBlock: { + GenCounter: number, + VerticalAngle: number + } = { + GenCounter: 0, + VerticalAngle: 0 + }; + newObjFOVBlock['GenCounter'] = buf.readUInt32LE(pos); + pos += 4; + newObjFOVBlock['VerticalAngle'] = buf.readFloatLE(pos); + pos += 4; + this.FOVBlock = newObjFOVBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentGroupDataUpdate.ts b/lib/classes/packets/AgentGroupDataUpdate.ts index c8d1fb3..da064a1 100644 --- a/lib/classes/packets/AgentGroupDataUpdate.ts +++ b/lib/classes/packets/AgentGroupDataUpdate.ts @@ -38,4 +38,76 @@ export class AgentGroupDataUpdatePacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.GroupData.length; + buf.writeUInt8(this.GroupData.length, pos++); + for (let i = 0; i < count; i++) + { + this.GroupData[i]['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.GroupData[i]['GroupPowers'].low, pos); + pos += 4; + buf.writeInt32LE(this.GroupData[i]['GroupPowers'].high, pos); + pos += 4; + buf.writeUInt8((this.GroupData[i]['AcceptNotices']) ? 1 : 0, pos++); + this.GroupData[i]['GroupInsigniaID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.GroupData[i]['Contribution'], pos); + pos += 4; + buf.write(this.GroupData[i]['GroupName'], pos); + pos += this.GroupData[i]['GroupName'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.GroupData = []; + for (let i = 0; i < count; i++) + { + const newObjGroupData: { + GroupID: UUID, + GroupPowers: Long, + AcceptNotices: boolean, + GroupInsigniaID: UUID, + Contribution: number, + GroupName: string + } = { + GroupID: UUID.zero(), + GroupPowers: Long.ZERO, + AcceptNotices: false, + GroupInsigniaID: UUID.zero(), + Contribution: 0, + GroupName: '' + }; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['GroupPowers'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjGroupData['AcceptNotices'] = (buf.readUInt8(pos++) === 1); + newObjGroupData['GroupInsigniaID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['Contribution'] = buf.readInt32LE(pos); + pos += 4; + newObjGroupData['GroupName'] = buf.toString('utf8', pos, length); + pos += length; + this.GroupData.push(newObjGroupData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentHeightWidth.ts b/lib/classes/packets/AgentHeightWidth.ts index 8e72b0a..83265e0 100644 --- a/lib/classes/packets/AgentHeightWidth.ts +++ b/lib/classes/packets/AgentHeightWidth.ts @@ -26,4 +26,60 @@ export class AgentHeightWidthPacket implements Packet return 44; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AgentData['CircuitCode'], pos); + pos += 4; + buf.writeUInt32LE(this.HeightWidthBlock['GenCounter'], pos); + pos += 4; + buf.writeUInt16LE(this.HeightWidthBlock['Height'], pos); + pos += 2; + buf.writeUInt16LE(this.HeightWidthBlock['Width'], pos); + pos += 2; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + CircuitCode: number + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + CircuitCode: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['CircuitCode'] = buf.readUInt32LE(pos); + pos += 4; + this.AgentData = newObjAgentData; + const newObjHeightWidthBlock: { + GenCounter: number, + Height: number, + Width: number + } = { + GenCounter: 0, + Height: 0, + Width: 0 + }; + newObjHeightWidthBlock['GenCounter'] = buf.readUInt32LE(pos); + pos += 4; + newObjHeightWidthBlock['Height'] = buf.readUInt16LE(pos); + pos += 2; + newObjHeightWidthBlock['Width'] = buf.readUInt16LE(pos); + pos += 2; + this.HeightWidthBlock = newObjHeightWidthBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentIsNowWearing.ts b/lib/classes/packets/AgentIsNowWearing.ts index 7695e22..41f8c4c 100644 --- a/lib/classes/packets/AgentIsNowWearing.ts +++ b/lib/classes/packets/AgentIsNowWearing.ts @@ -24,4 +24,56 @@ export class AgentIsNowWearingPacket implements Packet return ((17) * this.WearableData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.WearableData.length; + buf.writeUInt8(this.WearableData.length, pos++); + for (let i = 0; i < count; i++) + { + this.WearableData[i]['ItemID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.WearableData[i]['WearableType'], pos++); + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.WearableData = []; + for (let i = 0; i < count; i++) + { + const newObjWearableData: { + ItemID: UUID, + WearableType: number + } = { + ItemID: UUID.zero(), + WearableType: 0 + }; + newObjWearableData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjWearableData['WearableType'] = buf.readUInt8(pos++); + this.WearableData.push(newObjWearableData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentMovementComplete.ts b/lib/classes/packets/AgentMovementComplete.ts index 3d72339..87cf2f4 100644 --- a/lib/classes/packets/AgentMovementComplete.ts +++ b/lib/classes/packets/AgentMovementComplete.ts @@ -31,4 +31,72 @@ export class AgentMovementCompletePacket implements Packet return (this.SimData['ChannelVersion'].length + 2) + 68; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['Position'].writeToBuffer(buf, pos, false); + pos += 12; + this.Data['LookAt'].writeToBuffer(buf, pos, false); + pos += 12; + buf.writeInt32LE(this.Data['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.Data['RegionHandle'].high, pos); + pos += 4; + buf.writeUInt32LE(this.Data['Timestamp'], pos); + pos += 4; + buf.write(this.SimData['ChannelVersion'], pos); + pos += this.SimData['ChannelVersion'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + Position: Vector3, + LookAt: Vector3, + RegionHandle: Long, + Timestamp: number + } = { + Position: Vector3.getZero(), + LookAt: Vector3.getZero(), + RegionHandle: Long.ZERO, + Timestamp: 0 + }; + newObjData['Position'] = new Vector3(buf, pos, false); + pos += 12; + newObjData['LookAt'] = new Vector3(buf, pos, false); + pos += 12; + newObjData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjData['Timestamp'] = buf.readUInt32LE(pos); + pos += 4; + this.Data = newObjData; + const newObjSimData: { + ChannelVersion: string + } = { + ChannelVersion: '' + }; + newObjSimData['ChannelVersion'] = buf.toString('utf8', pos, length); + pos += length; + this.SimData = newObjSimData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentPause.ts b/lib/classes/packets/AgentPause.ts index 40f67a7..f54ef72 100644 --- a/lib/classes/packets/AgentPause.ts +++ b/lib/classes/packets/AgentPause.ts @@ -21,4 +21,38 @@ export class AgentPausePacket implements Packet return 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AgentData['SerialNum'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + SerialNum: number + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + SerialNum: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SerialNum'] = buf.readUInt32LE(pos); + pos += 4; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentQuitCopy.ts b/lib/classes/packets/AgentQuitCopy.ts index b1131fa..db99618 100644 --- a/lib/classes/packets/AgentQuitCopy.ts +++ b/lib/classes/packets/AgentQuitCopy.ts @@ -23,4 +23,42 @@ export class AgentQuitCopyPacket implements Packet return 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.FuseBlock['ViewerCircuitCode'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjFuseBlock: { + ViewerCircuitCode: number + } = { + ViewerCircuitCode: 0 + }; + newObjFuseBlock['ViewerCircuitCode'] = buf.readUInt32LE(pos); + pos += 4; + this.FuseBlock = newObjFuseBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentRequestSit.ts b/lib/classes/packets/AgentRequestSit.ts index c24c4fc..71f7a26 100644 --- a/lib/classes/packets/AgentRequestSit.ts +++ b/lib/classes/packets/AgentRequestSit.ts @@ -25,4 +25,48 @@ export class AgentRequestSitPacket implements Packet return 60; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.TargetObject['TargetID'].writeToBuffer(buf, pos); + pos += 16; + this.TargetObject['Offset'].writeToBuffer(buf, pos, false); + pos += 12; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjTargetObject: { + TargetID: UUID, + Offset: Vector3 + } = { + TargetID: UUID.zero(), + Offset: Vector3.getZero() + }; + newObjTargetObject['TargetID'] = new UUID(buf, pos); + pos += 16; + newObjTargetObject['Offset'] = new Vector3(buf, pos, false); + pos += 12; + this.TargetObject = newObjTargetObject; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentResume.ts b/lib/classes/packets/AgentResume.ts index 02d5024..066e91b 100644 --- a/lib/classes/packets/AgentResume.ts +++ b/lib/classes/packets/AgentResume.ts @@ -21,4 +21,38 @@ export class AgentResumePacket implements Packet return 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AgentData['SerialNum'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + SerialNum: number + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + SerialNum: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SerialNum'] = buf.readUInt32LE(pos); + pos += 4; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentSetAppearance.ts b/lib/classes/packets/AgentSetAppearance.ts index 473dd60..d177b77 100644 --- a/lib/classes/packets/AgentSetAppearance.ts +++ b/lib/classes/packets/AgentSetAppearance.ts @@ -33,4 +33,96 @@ export class AgentSetAppearancePacket implements Packet return ((17) * this.WearableData.length) + (this.ObjectData['TextureEntry'].length + 2) + ((1) * this.VisualParam.length) + 50; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AgentData['SerialNum'], pos); + pos += 4; + this.AgentData['Size'].writeToBuffer(buf, pos, false); + pos += 12; + let count = this.WearableData.length; + buf.writeUInt8(this.WearableData.length, pos++); + for (let i = 0; i < count; i++) + { + this.WearableData[i]['CacheID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.WearableData[i]['TextureIndex'], pos++); + } + buf.write(this.ObjectData['TextureEntry'], pos); + pos += this.ObjectData['TextureEntry'].length; + count = this.VisualParam.length; + buf.writeUInt8(this.VisualParam.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt8(this.VisualParam[i]['ParamValue'], pos++); + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + SerialNum: number, + Size: Vector3 + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + SerialNum: 0, + Size: Vector3.getZero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SerialNum'] = buf.readUInt32LE(pos); + pos += 4; + newObjAgentData['Size'] = new Vector3(buf, pos, false); + pos += 12; + this.AgentData = newObjAgentData; + let count = buf.readUInt8(pos++); + this.WearableData = []; + for (let i = 0; i < count; i++) + { + const newObjWearableData: { + CacheID: UUID, + TextureIndex: number + } = { + CacheID: UUID.zero(), + TextureIndex: 0 + }; + newObjWearableData['CacheID'] = new UUID(buf, pos); + pos += 16; + newObjWearableData['TextureIndex'] = buf.readUInt8(pos++); + this.WearableData.push(newObjWearableData); + } + const newObjObjectData: { + TextureEntry: string + } = { + TextureEntry: '' + }; + newObjObjectData['TextureEntry'] = buf.toString('utf8', pos, length); + pos += length; + this.ObjectData = newObjObjectData; + count = buf.readUInt8(pos++); + this.VisualParam = []; + for (let i = 0; i < count; i++) + { + const newObjVisualParam: { + ParamValue: number + } = { + ParamValue: 0 + }; + newObjVisualParam['ParamValue'] = buf.readUInt8(pos++); + this.VisualParam.push(newObjVisualParam); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentSit.ts b/lib/classes/packets/AgentSit.ts index 8370255..42cb0cc 100644 --- a/lib/classes/packets/AgentSit.ts +++ b/lib/classes/packets/AgentSit.ts @@ -20,4 +20,32 @@ export class AgentSitPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentThrottle.ts b/lib/classes/packets/AgentThrottle.ts index 151897b..b3a2ca7 100644 --- a/lib/classes/packets/AgentThrottle.ts +++ b/lib/classes/packets/AgentThrottle.ts @@ -25,4 +25,54 @@ export class AgentThrottlePacket implements Packet return (this.Throttle['Throttles'].length + 1) + 40; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AgentData['CircuitCode'], pos); + pos += 4; + buf.writeUInt32LE(this.Throttle['GenCounter'], pos); + pos += 4; + buf.write(this.Throttle['Throttles'], pos); + pos += this.Throttle['Throttles'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + CircuitCode: number + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + CircuitCode: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['CircuitCode'] = buf.readUInt32LE(pos); + pos += 4; + this.AgentData = newObjAgentData; + const newObjThrottle: { + GenCounter: number, + Throttles: string + } = { + GenCounter: 0, + Throttles: '' + }; + newObjThrottle['GenCounter'] = buf.readUInt32LE(pos); + pos += 4; + newObjThrottle['Throttles'] = buf.toString('utf8', pos, length); + pos += length; + this.Throttle = newObjThrottle; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentUpdate.ts b/lib/classes/packets/AgentUpdate.ts index 4beac01..5d17192 100644 --- a/lib/classes/packets/AgentUpdate.ts +++ b/lib/classes/packets/AgentUpdate.ts @@ -32,4 +32,88 @@ export class AgentUpdatePacket implements Packet return 114; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['BodyRotation'].writeToBuffer(buf, pos); + pos += 12; + this.AgentData['HeadRotation'].writeToBuffer(buf, pos); + pos += 12; + buf.writeUInt8(this.AgentData['State'], pos++); + this.AgentData['CameraCenter'].writeToBuffer(buf, pos, false); + pos += 12; + this.AgentData['CameraAtAxis'].writeToBuffer(buf, pos, false); + pos += 12; + this.AgentData['CameraLeftAxis'].writeToBuffer(buf, pos, false); + pos += 12; + this.AgentData['CameraUpAxis'].writeToBuffer(buf, pos, false); + pos += 12; + buf.writeFloatLE(this.AgentData['Far'], pos); + pos += 4; + buf.writeUInt32LE(this.AgentData['ControlFlags'], pos); + pos += 4; + buf.writeUInt8(this.AgentData['Flags'], pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + BodyRotation: Quaternion, + HeadRotation: Quaternion, + State: number, + CameraCenter: Vector3, + CameraAtAxis: Vector3, + CameraLeftAxis: Vector3, + CameraUpAxis: Vector3, + Far: number, + ControlFlags: number, + Flags: number + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + BodyRotation: Quaternion.getIdentity(), + HeadRotation: Quaternion.getIdentity(), + State: 0, + CameraCenter: Vector3.getZero(), + CameraAtAxis: Vector3.getZero(), + CameraLeftAxis: Vector3.getZero(), + CameraUpAxis: Vector3.getZero(), + Far: 0, + ControlFlags: 0, + Flags: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['BodyRotation'] = new Quaternion(buf, pos); + pos += 12; + newObjAgentData['HeadRotation'] = new Quaternion(buf, pos); + pos += 12; + newObjAgentData['State'] = buf.readUInt8(pos++); + newObjAgentData['CameraCenter'] = new Vector3(buf, pos, false); + pos += 12; + newObjAgentData['CameraAtAxis'] = new Vector3(buf, pos, false); + pos += 12; + newObjAgentData['CameraLeftAxis'] = new Vector3(buf, pos, false); + pos += 12; + newObjAgentData['CameraUpAxis'] = new Vector3(buf, pos, false); + pos += 12; + newObjAgentData['Far'] = buf.readFloatLE(pos); + pos += 4; + newObjAgentData['ControlFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjAgentData['Flags'] = buf.readUInt8(pos++); + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentWearablesRequest.ts b/lib/classes/packets/AgentWearablesRequest.ts index 9329935..01e7c43 100644 --- a/lib/classes/packets/AgentWearablesRequest.ts +++ b/lib/classes/packets/AgentWearablesRequest.ts @@ -20,4 +20,32 @@ export class AgentWearablesRequestPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AgentWearablesUpdate.ts b/lib/classes/packets/AgentWearablesUpdate.ts index f2c0477..3858aa3 100644 --- a/lib/classes/packets/AgentWearablesUpdate.ts +++ b/lib/classes/packets/AgentWearablesUpdate.ts @@ -26,4 +26,68 @@ export class AgentWearablesUpdatePacket implements Packet return ((33) * this.WearableData.length) + 37; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AgentData['SerialNum'], pos); + pos += 4; + const count = this.WearableData.length; + buf.writeUInt8(this.WearableData.length, pos++); + for (let i = 0; i < count; i++) + { + this.WearableData[i]['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.WearableData[i]['AssetID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.WearableData[i]['WearableType'], pos++); + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + SerialNum: number + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + SerialNum: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SerialNum'] = buf.readUInt32LE(pos); + pos += 4; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.WearableData = []; + for (let i = 0; i < count; i++) + { + const newObjWearableData: { + ItemID: UUID, + AssetID: UUID, + WearableType: number + } = { + ItemID: UUID.zero(), + AssetID: UUID.zero(), + WearableType: 0 + }; + newObjWearableData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjWearableData['AssetID'] = new UUID(buf, pos); + pos += 16; + newObjWearableData['WearableType'] = buf.readUInt8(pos++); + this.WearableData.push(newObjWearableData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/AlertMessage.ts b/lib/classes/packets/AlertMessage.ts index 63089f9..8422411 100644 --- a/lib/classes/packets/AlertMessage.ts +++ b/lib/classes/packets/AlertMessage.ts @@ -36,4 +36,72 @@ export class AlertMessagePacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.write(this.AlertData['Message'], pos); + pos += this.AlertData['Message'].length; + let count = this.AlertInfo.length; + buf.writeUInt8(this.AlertInfo.length, pos++); + for (let i = 0; i < count; i++) + { + buf.write(this.AlertInfo[i]['Message'], pos); + pos += this.AlertInfo[i]['Message'].length; + buf.write(this.AlertInfo[i]['ExtraParams'], pos); + pos += this.AlertInfo[i]['ExtraParams'].length; + } + count = this.AgentInfo.length; + buf.writeUInt8(this.AgentInfo.length, pos++); + for (let i = 0; i < count; i++) + { + this.AgentInfo[i]['AgentID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAlertData: { + Message: string + } = { + Message: '' + }; + newObjAlertData['Message'] = buf.toString('utf8', pos, length); + pos += length; + this.AlertData = newObjAlertData; + let count = buf.readUInt8(pos++); + this.AlertInfo = []; + for (let i = 0; i < count; i++) + { + const newObjAlertInfo: { + Message: string, + ExtraParams: string + } = { + Message: '', + ExtraParams: '' + }; + newObjAlertInfo['Message'] = buf.toString('utf8', pos, length); + pos += length; + newObjAlertInfo['ExtraParams'] = buf.toString('utf8', pos, length); + pos += length; + this.AlertInfo.push(newObjAlertInfo); + } + count = buf.readUInt8(pos++); + this.AgentInfo = []; + for (let i = 0; i < count; i++) + { + const newObjAgentInfo: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentInfo['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentInfo.push(newObjAgentInfo); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/AssetUploadComplete.ts b/lib/classes/packets/AssetUploadComplete.ts index e8c4b37..cef24c8 100644 --- a/lib/classes/packets/AssetUploadComplete.ts +++ b/lib/classes/packets/AssetUploadComplete.ts @@ -21,4 +21,34 @@ export class AssetUploadCompletePacket implements Packet return 18; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AssetBlock['UUID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt8(this.AssetBlock['Type'], pos++); + buf.writeUInt8((this.AssetBlock['Success']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAssetBlock: { + UUID: UUID, + Type: number, + Success: boolean + } = { + UUID: UUID.zero(), + Type: 0, + Success: false + }; + newObjAssetBlock['UUID'] = new UUID(buf, pos); + pos += 16; + newObjAssetBlock['Type'] = buf.readInt8(pos++); + newObjAssetBlock['Success'] = (buf.readUInt8(pos++) === 1); + this.AssetBlock = newObjAssetBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AssetUploadRequest.ts b/lib/classes/packets/AssetUploadRequest.ts index 4fc70c7..5f7952e 100644 --- a/lib/classes/packets/AssetUploadRequest.ts +++ b/lib/classes/packets/AssetUploadRequest.ts @@ -23,4 +23,44 @@ export class AssetUploadRequestPacket implements Packet return (this.AssetBlock['AssetData'].length + 2) + 19; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AssetBlock['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt8(this.AssetBlock['Type'], pos++); + buf.writeUInt8((this.AssetBlock['Tempfile']) ? 1 : 0, pos++); + buf.writeUInt8((this.AssetBlock['StoreLocal']) ? 1 : 0, pos++); + buf.write(this.AssetBlock['AssetData'], pos); + pos += this.AssetBlock['AssetData'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAssetBlock: { + TransactionID: UUID, + Type: number, + Tempfile: boolean, + StoreLocal: boolean, + AssetData: string + } = { + TransactionID: UUID.zero(), + Type: 0, + Tempfile: false, + StoreLocal: false, + AssetData: '' + }; + newObjAssetBlock['TransactionID'] = new UUID(buf, pos); + pos += 16; + newObjAssetBlock['Type'] = buf.readInt8(pos++); + newObjAssetBlock['Tempfile'] = (buf.readUInt8(pos++) === 1); + newObjAssetBlock['StoreLocal'] = (buf.readUInt8(pos++) === 1); + newObjAssetBlock['AssetData'] = buf.toString('utf8', pos, length); + pos += length; + this.AssetBlock = newObjAssetBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AtomicPassObject.ts b/lib/classes/packets/AtomicPassObject.ts index 47d2222..f41de95 100644 --- a/lib/classes/packets/AtomicPassObject.ts +++ b/lib/classes/packets/AtomicPassObject.ts @@ -20,4 +20,30 @@ export class AtomicPassObjectPacket implements Packet return 17; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.TaskData['TaskID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.TaskData['AttachmentNeedsSave']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjTaskData: { + TaskID: UUID, + AttachmentNeedsSave: boolean + } = { + TaskID: UUID.zero(), + AttachmentNeedsSave: false + }; + newObjTaskData['TaskID'] = new UUID(buf, pos); + pos += 16; + newObjTaskData['AttachmentNeedsSave'] = (buf.readUInt8(pos++) === 1); + this.TaskData = newObjTaskData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AttachedSound.ts b/lib/classes/packets/AttachedSound.ts index d16d0cb..1272818 100644 --- a/lib/classes/packets/AttachedSound.ts +++ b/lib/classes/packets/AttachedSound.ts @@ -23,4 +23,48 @@ export class AttachedSoundPacket implements Packet return 53; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.DataBlock['SoundID'].writeToBuffer(buf, pos); + pos += 16; + this.DataBlock['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + this.DataBlock['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeFloatLE(this.DataBlock['Gain'], pos); + pos += 4; + buf.writeUInt8(this.DataBlock['Flags'], pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjDataBlock: { + SoundID: UUID, + ObjectID: UUID, + OwnerID: UUID, + Gain: number, + Flags: number + } = { + SoundID: UUID.zero(), + ObjectID: UUID.zero(), + OwnerID: UUID.zero(), + Gain: 0, + Flags: 0 + }; + newObjDataBlock['SoundID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['Gain'] = buf.readFloatLE(pos); + pos += 4; + newObjDataBlock['Flags'] = buf.readUInt8(pos++); + this.DataBlock = newObjDataBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AttachedSoundGainChange.ts b/lib/classes/packets/AttachedSoundGainChange.ts index bba4433..dfd3b05 100644 --- a/lib/classes/packets/AttachedSoundGainChange.ts +++ b/lib/classes/packets/AttachedSoundGainChange.ts @@ -20,4 +20,32 @@ export class AttachedSoundGainChangePacket implements Packet return 20; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.DataBlock['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeFloatLE(this.DataBlock['Gain'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjDataBlock: { + ObjectID: UUID, + Gain: number + } = { + ObjectID: UUID.zero(), + Gain: 0 + }; + newObjDataBlock['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['Gain'] = buf.readFloatLE(pos); + pos += 4; + this.DataBlock = newObjDataBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AvatarAnimation.ts b/lib/classes/packets/AvatarAnimation.ts index e6a23b1..a693090 100644 --- a/lib/classes/packets/AvatarAnimation.ts +++ b/lib/classes/packets/AvatarAnimation.ts @@ -39,4 +39,92 @@ export class AvatarAnimationPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Sender['ID'].writeToBuffer(buf, pos); + pos += 16; + let count = this.AnimationList.length; + buf.writeUInt8(this.AnimationList.length, pos++); + for (let i = 0; i < count; i++) + { + this.AnimationList[i]['AnimID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.AnimationList[i]['AnimSequenceID'], pos); + pos += 4; + } + count = this.AnimationSourceList.length; + buf.writeUInt8(this.AnimationSourceList.length, pos++); + for (let i = 0; i < count; i++) + { + this.AnimationSourceList[i]['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + } + count = this.PhysicalAvatarEventList.length; + buf.writeUInt8(this.PhysicalAvatarEventList.length, pos++); + for (let i = 0; i < count; i++) + { + buf.write(this.PhysicalAvatarEventList[i]['TypeData'], pos); + pos += this.PhysicalAvatarEventList[i]['TypeData'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjSender: { + ID: UUID + } = { + ID: UUID.zero() + }; + newObjSender['ID'] = new UUID(buf, pos); + pos += 16; + this.Sender = newObjSender; + let count = buf.readUInt8(pos++); + this.AnimationList = []; + for (let i = 0; i < count; i++) + { + const newObjAnimationList: { + AnimID: UUID, + AnimSequenceID: number + } = { + AnimID: UUID.zero(), + AnimSequenceID: 0 + }; + newObjAnimationList['AnimID'] = new UUID(buf, pos); + pos += 16; + newObjAnimationList['AnimSequenceID'] = buf.readInt32LE(pos); + pos += 4; + this.AnimationList.push(newObjAnimationList); + } + count = buf.readUInt8(pos++); + this.AnimationSourceList = []; + for (let i = 0; i < count; i++) + { + const newObjAnimationSourceList: { + ObjectID: UUID + } = { + ObjectID: UUID.zero() + }; + newObjAnimationSourceList['ObjectID'] = new UUID(buf, pos); + pos += 16; + this.AnimationSourceList.push(newObjAnimationSourceList); + } + count = buf.readUInt8(pos++); + this.PhysicalAvatarEventList = []; + for (let i = 0; i < count; i++) + { + const newObjPhysicalAvatarEventList: { + TypeData: string + } = { + TypeData: '' + }; + newObjPhysicalAvatarEventList['TypeData'] = buf.toString('utf8', pos, length); + pos += length; + this.PhysicalAvatarEventList.push(newObjPhysicalAvatarEventList); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/AvatarAppearance.ts b/lib/classes/packets/AvatarAppearance.ts index c0c2833..5c53bd6 100644 --- a/lib/classes/packets/AvatarAppearance.ts +++ b/lib/classes/packets/AvatarAppearance.ts @@ -35,4 +35,108 @@ export class AvatarAppearancePacket implements Packet return (this.ObjectData['TextureEntry'].length + 2) + ((1) * this.VisualParam.length) + ((9) * this.AppearanceData.length) + ((12) * this.AppearanceHover.length) + 20; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Sender['ID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.Sender['IsTrial']) ? 1 : 0, pos++); + buf.write(this.ObjectData['TextureEntry'], pos); + pos += this.ObjectData['TextureEntry'].length; + let count = this.VisualParam.length; + buf.writeUInt8(this.VisualParam.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt8(this.VisualParam[i]['ParamValue'], pos++); + } + count = this.AppearanceData.length; + buf.writeUInt8(this.AppearanceData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt8(this.AppearanceData[i]['AppearanceVersion'], pos++); + buf.writeInt32LE(this.AppearanceData[i]['CofVersion'], pos); + pos += 4; + buf.writeUInt32LE(this.AppearanceData[i]['Flags'], pos); + pos += 4; + } + count = this.AppearanceHover.length; + buf.writeUInt8(this.AppearanceHover.length, pos++); + for (let i = 0; i < count; i++) + { + this.AppearanceHover[i]['HoverHeight'].writeToBuffer(buf, pos, false); + pos += 12; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjSender: { + ID: UUID, + IsTrial: boolean + } = { + ID: UUID.zero(), + IsTrial: false + }; + newObjSender['ID'] = new UUID(buf, pos); + pos += 16; + newObjSender['IsTrial'] = (buf.readUInt8(pos++) === 1); + this.Sender = newObjSender; + const newObjObjectData: { + TextureEntry: string + } = { + TextureEntry: '' + }; + newObjObjectData['TextureEntry'] = buf.toString('utf8', pos, length); + pos += length; + this.ObjectData = newObjObjectData; + let count = buf.readUInt8(pos++); + this.VisualParam = []; + for (let i = 0; i < count; i++) + { + const newObjVisualParam: { + ParamValue: number + } = { + ParamValue: 0 + }; + newObjVisualParam['ParamValue'] = buf.readUInt8(pos++); + this.VisualParam.push(newObjVisualParam); + } + count = buf.readUInt8(pos++); + this.AppearanceData = []; + for (let i = 0; i < count; i++) + { + const newObjAppearanceData: { + AppearanceVersion: number, + CofVersion: number, + Flags: number + } = { + AppearanceVersion: 0, + CofVersion: 0, + Flags: 0 + }; + newObjAppearanceData['AppearanceVersion'] = buf.readUInt8(pos++); + newObjAppearanceData['CofVersion'] = buf.readInt32LE(pos); + pos += 4; + newObjAppearanceData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + this.AppearanceData.push(newObjAppearanceData); + } + count = buf.readUInt8(pos++); + this.AppearanceHover = []; + for (let i = 0; i < count; i++) + { + const newObjAppearanceHover: { + HoverHeight: Vector3 + } = { + HoverHeight: Vector3.getZero() + }; + newObjAppearanceHover['HoverHeight'] = new Vector3(buf, pos, false); + pos += 12; + this.AppearanceHover.push(newObjAppearanceHover); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/AvatarClassifiedReply.ts b/lib/classes/packets/AvatarClassifiedReply.ts index 40d5efb..188f035 100644 --- a/lib/classes/packets/AvatarClassifiedReply.ts +++ b/lib/classes/packets/AvatarClassifiedReply.ts @@ -34,4 +34,58 @@ export class AvatarClassifiedReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['TargetID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.Data.length; + buf.writeUInt8(this.Data.length, pos++); + for (let i = 0; i < count; i++) + { + this.Data[i]['ClassifiedID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.Data[i]['Name'], pos); + pos += this.Data[i]['Name'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + TargetID: UUID + } = { + AgentID: UUID.zero(), + TargetID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['TargetID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.Data = []; + for (let i = 0; i < count; i++) + { + const newObjData: { + ClassifiedID: UUID, + Name: string + } = { + ClassifiedID: UUID.zero(), + Name: '' + }; + newObjData['ClassifiedID'] = new UUID(buf, pos); + pos += 16; + newObjData['Name'] = buf.toString('utf8', pos, length); + pos += length; + this.Data.push(newObjData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/AvatarGroupsReply.ts b/lib/classes/packets/AvatarGroupsReply.ts index 5cc7dbe..51bf6a5 100644 --- a/lib/classes/packets/AvatarGroupsReply.ts +++ b/lib/classes/packets/AvatarGroupsReply.ts @@ -42,4 +42,90 @@ export class AvatarGroupsReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['AvatarID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.GroupData.length; + buf.writeUInt8(this.GroupData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeInt32LE(this.GroupData[i]['GroupPowers'].low, pos); + pos += 4; + buf.writeInt32LE(this.GroupData[i]['GroupPowers'].high, pos); + pos += 4; + buf.writeUInt8((this.GroupData[i]['AcceptNotices']) ? 1 : 0, pos++); + buf.write(this.GroupData[i]['GroupTitle'], pos); + pos += this.GroupData[i]['GroupTitle'].length; + this.GroupData[i]['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.GroupData[i]['GroupName'], pos); + pos += this.GroupData[i]['GroupName'].length; + this.GroupData[i]['GroupInsigniaID'].writeToBuffer(buf, pos); + pos += 16; + } + buf.writeUInt8((this.NewGroupData['ListInProfile']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + AvatarID: UUID + } = { + AgentID: UUID.zero(), + AvatarID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['AvatarID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.GroupData = []; + for (let i = 0; i < count; i++) + { + const newObjGroupData: { + GroupPowers: Long, + AcceptNotices: boolean, + GroupTitle: string, + GroupID: UUID, + GroupName: string, + GroupInsigniaID: UUID + } = { + GroupPowers: Long.ZERO, + AcceptNotices: false, + GroupTitle: '', + GroupID: UUID.zero(), + GroupName: '', + GroupInsigniaID: UUID.zero() + }; + newObjGroupData['GroupPowers'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjGroupData['AcceptNotices'] = (buf.readUInt8(pos++) === 1); + newObjGroupData['GroupTitle'] = buf.toString('utf8', pos, length); + pos += length; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['GroupName'] = buf.toString('utf8', pos, length); + pos += length; + newObjGroupData['GroupInsigniaID'] = new UUID(buf, pos); + pos += 16; + this.GroupData.push(newObjGroupData); + } + const newObjNewGroupData: { + ListInProfile: boolean + } = { + ListInProfile: false + }; + newObjNewGroupData['ListInProfile'] = (buf.readUInt8(pos++) === 1); + this.NewGroupData = newObjNewGroupData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AvatarInterestsReply.ts b/lib/classes/packets/AvatarInterestsReply.ts index 6691bde..fcc1609 100644 --- a/lib/classes/packets/AvatarInterestsReply.ts +++ b/lib/classes/packets/AvatarInterestsReply.ts @@ -27,4 +27,66 @@ export class AvatarInterestsReplyPacket implements Packet return (this.PropertiesData['WantToText'].length + 1 + this.PropertiesData['SkillsText'].length + 1 + this.PropertiesData['LanguagesText'].length + 1) + 40; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['AvatarID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.PropertiesData['WantToMask'], pos); + pos += 4; + buf.write(this.PropertiesData['WantToText'], pos); + pos += this.PropertiesData['WantToText'].length; + buf.writeUInt32LE(this.PropertiesData['SkillsMask'], pos); + pos += 4; + buf.write(this.PropertiesData['SkillsText'], pos); + pos += this.PropertiesData['SkillsText'].length; + buf.write(this.PropertiesData['LanguagesText'], pos); + pos += this.PropertiesData['LanguagesText'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + AvatarID: UUID + } = { + AgentID: UUID.zero(), + AvatarID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['AvatarID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjPropertiesData: { + WantToMask: number, + WantToText: string, + SkillsMask: number, + SkillsText: string, + LanguagesText: string + } = { + WantToMask: 0, + WantToText: '', + SkillsMask: 0, + SkillsText: '', + LanguagesText: '' + }; + newObjPropertiesData['WantToMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjPropertiesData['WantToText'] = buf.toString('utf8', pos, length); + pos += length; + newObjPropertiesData['SkillsMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjPropertiesData['SkillsText'] = buf.toString('utf8', pos, length); + pos += length; + newObjPropertiesData['LanguagesText'] = buf.toString('utf8', pos, length); + pos += length; + this.PropertiesData = newObjPropertiesData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AvatarInterestsUpdate.ts b/lib/classes/packets/AvatarInterestsUpdate.ts index a651077..3beed50 100644 --- a/lib/classes/packets/AvatarInterestsUpdate.ts +++ b/lib/classes/packets/AvatarInterestsUpdate.ts @@ -27,4 +27,66 @@ export class AvatarInterestsUpdatePacket implements Packet return (this.PropertiesData['WantToText'].length + 1 + this.PropertiesData['SkillsText'].length + 1 + this.PropertiesData['LanguagesText'].length + 1) + 40; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.PropertiesData['WantToMask'], pos); + pos += 4; + buf.write(this.PropertiesData['WantToText'], pos); + pos += this.PropertiesData['WantToText'].length; + buf.writeUInt32LE(this.PropertiesData['SkillsMask'], pos); + pos += 4; + buf.write(this.PropertiesData['SkillsText'], pos); + pos += this.PropertiesData['SkillsText'].length; + buf.write(this.PropertiesData['LanguagesText'], pos); + pos += this.PropertiesData['LanguagesText'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjPropertiesData: { + WantToMask: number, + WantToText: string, + SkillsMask: number, + SkillsText: string, + LanguagesText: string + } = { + WantToMask: 0, + WantToText: '', + SkillsMask: 0, + SkillsText: '', + LanguagesText: '' + }; + newObjPropertiesData['WantToMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjPropertiesData['WantToText'] = buf.toString('utf8', pos, length); + pos += length; + newObjPropertiesData['SkillsMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjPropertiesData['SkillsText'] = buf.toString('utf8', pos, length); + pos += length; + newObjPropertiesData['LanguagesText'] = buf.toString('utf8', pos, length); + pos += length; + this.PropertiesData = newObjPropertiesData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AvatarNotesReply.ts b/lib/classes/packets/AvatarNotesReply.ts index 877253f..a5c726f 100644 --- a/lib/classes/packets/AvatarNotesReply.ts +++ b/lib/classes/packets/AvatarNotesReply.ts @@ -23,4 +23,42 @@ export class AvatarNotesReplyPacket implements Packet return (this.Data['Notes'].length + 2) + 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['TargetID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.Data['Notes'], pos); + pos += this.Data['Notes'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + TargetID: UUID, + Notes: string + } = { + TargetID: UUID.zero(), + Notes: '' + }; + newObjData['TargetID'] = new UUID(buf, pos); + pos += 16; + newObjData['Notes'] = buf.toString('utf8', pos, length); + pos += length; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AvatarNotesUpdate.ts b/lib/classes/packets/AvatarNotesUpdate.ts index 6a5e37b..9ea79b8 100644 --- a/lib/classes/packets/AvatarNotesUpdate.ts +++ b/lib/classes/packets/AvatarNotesUpdate.ts @@ -24,4 +24,48 @@ export class AvatarNotesUpdatePacket implements Packet return (this.Data['Notes'].length + 2) + 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['TargetID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.Data['Notes'], pos); + pos += this.Data['Notes'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + TargetID: UUID, + Notes: string + } = { + TargetID: UUID.zero(), + Notes: '' + }; + newObjData['TargetID'] = new UUID(buf, pos); + pos += 16; + newObjData['Notes'] = buf.toString('utf8', pos, length); + pos += length; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AvatarPickerReply.ts b/lib/classes/packets/AvatarPickerReply.ts index 4cc79dd..2436cbb 100644 --- a/lib/classes/packets/AvatarPickerReply.ts +++ b/lib/classes/packets/AvatarPickerReply.ts @@ -35,4 +35,64 @@ export class AvatarPickerReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.Data.length; + buf.writeUInt8(this.Data.length, pos++); + for (let i = 0; i < count; i++) + { + this.Data[i]['AvatarID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.Data[i]['FirstName'], pos); + pos += this.Data[i]['FirstName'].length; + buf.write(this.Data[i]['LastName'], pos); + pos += this.Data[i]['LastName'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + QueryID: UUID + } = { + AgentID: UUID.zero(), + QueryID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['QueryID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.Data = []; + for (let i = 0; i < count; i++) + { + const newObjData: { + AvatarID: UUID, + FirstName: string, + LastName: string + } = { + AvatarID: UUID.zero(), + FirstName: '', + LastName: '' + }; + newObjData['AvatarID'] = new UUID(buf, pos); + pos += 16; + newObjData['FirstName'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['LastName'] = buf.toString('utf8', pos, length); + pos += length; + this.Data.push(newObjData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/AvatarPickerRequest.ts b/lib/classes/packets/AvatarPickerRequest.ts index 2199e76..566e11d 100644 --- a/lib/classes/packets/AvatarPickerRequest.ts +++ b/lib/classes/packets/AvatarPickerRequest.ts @@ -24,4 +24,48 @@ export class AvatarPickerRequestPacket implements Packet return (this.Data['Name'].length + 1) + 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.Data['Name'], pos); + pos += this.Data['Name'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + QueryID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + QueryID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['QueryID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + Name: string + } = { + Name: '' + }; + newObjData['Name'] = buf.toString('utf8', pos, length); + pos += length; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AvatarPickerRequestBackend.ts b/lib/classes/packets/AvatarPickerRequestBackend.ts index de4731b..82703b8 100644 --- a/lib/classes/packets/AvatarPickerRequestBackend.ts +++ b/lib/classes/packets/AvatarPickerRequestBackend.ts @@ -25,4 +25,52 @@ export class AvatarPickerRequestBackendPacket implements Packet return (this.Data['Name'].length + 1) + 49; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.AgentData['GodLevel'], pos++); + buf.write(this.Data['Name'], pos); + pos += this.Data['Name'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + QueryID: UUID, + GodLevel: number + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + QueryID: UUID.zero(), + GodLevel: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['QueryID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GodLevel'] = buf.readUInt8(pos++); + this.AgentData = newObjAgentData; + const newObjData: { + Name: string + } = { + Name: '' + }; + newObjData['Name'] = buf.toString('utf8', pos, length); + pos += length; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AvatarPicksReply.ts b/lib/classes/packets/AvatarPicksReply.ts index f3496fb..956755d 100644 --- a/lib/classes/packets/AvatarPicksReply.ts +++ b/lib/classes/packets/AvatarPicksReply.ts @@ -34,4 +34,58 @@ export class AvatarPicksReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['TargetID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.Data.length; + buf.writeUInt8(this.Data.length, pos++); + for (let i = 0; i < count; i++) + { + this.Data[i]['PickID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.Data[i]['PickName'], pos); + pos += this.Data[i]['PickName'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + TargetID: UUID + } = { + AgentID: UUID.zero(), + TargetID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['TargetID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.Data = []; + for (let i = 0; i < count; i++) + { + const newObjData: { + PickID: UUID, + PickName: string + } = { + PickID: UUID.zero(), + PickName: '' + }; + newObjData['PickID'] = new UUID(buf, pos); + pos += 16; + newObjData['PickName'] = buf.toString('utf8', pos, length); + pos += length; + this.Data.push(newObjData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/AvatarPropertiesReply.ts b/lib/classes/packets/AvatarPropertiesReply.ts index 82946af..2faf819 100644 --- a/lib/classes/packets/AvatarPropertiesReply.ts +++ b/lib/classes/packets/AvatarPropertiesReply.ts @@ -31,4 +31,90 @@ export class AvatarPropertiesReplyPacket implements Packet return (this.PropertiesData['AboutText'].length + 2 + this.PropertiesData['FLAboutText'].length + 1 + this.PropertiesData['BornOn'].length + 1 + this.PropertiesData['ProfileURL'].length + 1 + this.PropertiesData['CharterMember'].length + 1) + 84; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['AvatarID'].writeToBuffer(buf, pos); + pos += 16; + this.PropertiesData['ImageID'].writeToBuffer(buf, pos); + pos += 16; + this.PropertiesData['FLImageID'].writeToBuffer(buf, pos); + pos += 16; + this.PropertiesData['PartnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.PropertiesData['AboutText'], pos); + pos += this.PropertiesData['AboutText'].length; + buf.write(this.PropertiesData['FLAboutText'], pos); + pos += this.PropertiesData['FLAboutText'].length; + buf.write(this.PropertiesData['BornOn'], pos); + pos += this.PropertiesData['BornOn'].length; + buf.write(this.PropertiesData['ProfileURL'], pos); + pos += this.PropertiesData['ProfileURL'].length; + buf.write(this.PropertiesData['CharterMember'], pos); + pos += this.PropertiesData['CharterMember'].length; + buf.writeUInt32LE(this.PropertiesData['Flags'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + AvatarID: UUID + } = { + AgentID: UUID.zero(), + AvatarID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['AvatarID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjPropertiesData: { + ImageID: UUID, + FLImageID: UUID, + PartnerID: UUID, + AboutText: string, + FLAboutText: string, + BornOn: string, + ProfileURL: string, + CharterMember: string, + Flags: number + } = { + ImageID: UUID.zero(), + FLImageID: UUID.zero(), + PartnerID: UUID.zero(), + AboutText: '', + FLAboutText: '', + BornOn: '', + ProfileURL: '', + CharterMember: '', + Flags: 0 + }; + newObjPropertiesData['ImageID'] = new UUID(buf, pos); + pos += 16; + newObjPropertiesData['FLImageID'] = new UUID(buf, pos); + pos += 16; + newObjPropertiesData['PartnerID'] = new UUID(buf, pos); + pos += 16; + newObjPropertiesData['AboutText'] = buf.toString('utf8', pos, length); + pos += length; + newObjPropertiesData['FLAboutText'] = buf.toString('utf8', pos, length); + pos += length; + newObjPropertiesData['BornOn'] = buf.toString('utf8', pos, length); + pos += length; + newObjPropertiesData['ProfileURL'] = buf.toString('utf8', pos, length); + pos += length; + newObjPropertiesData['CharterMember'] = buf.toString('utf8', pos, length); + pos += length; + newObjPropertiesData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + this.PropertiesData = newObjPropertiesData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AvatarPropertiesRequest.ts b/lib/classes/packets/AvatarPropertiesRequest.ts index dd517dd..656f9ea 100644 --- a/lib/classes/packets/AvatarPropertiesRequest.ts +++ b/lib/classes/packets/AvatarPropertiesRequest.ts @@ -21,4 +21,38 @@ export class AvatarPropertiesRequestPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['AvatarID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + AvatarID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + AvatarID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['AvatarID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AvatarPropertiesRequestBackend.ts b/lib/classes/packets/AvatarPropertiesRequestBackend.ts index 83547b3..a68d3b7 100644 --- a/lib/classes/packets/AvatarPropertiesRequestBackend.ts +++ b/lib/classes/packets/AvatarPropertiesRequestBackend.ts @@ -22,4 +22,40 @@ export class AvatarPropertiesRequestBackendPacket implements Packet return 34; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['AvatarID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.AgentData['GodLevel'], pos++); + buf.writeUInt8((this.AgentData['WebProfilesDisabled']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + AvatarID: UUID, + GodLevel: number, + WebProfilesDisabled: boolean + } = { + AgentID: UUID.zero(), + AvatarID: UUID.zero(), + GodLevel: 0, + WebProfilesDisabled: false + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['AvatarID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GodLevel'] = buf.readUInt8(pos++); + newObjAgentData['WebProfilesDisabled'] = (buf.readUInt8(pos++) === 1); + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AvatarPropertiesUpdate.ts b/lib/classes/packets/AvatarPropertiesUpdate.ts index 2d7995a..5406d22 100644 --- a/lib/classes/packets/AvatarPropertiesUpdate.ts +++ b/lib/classes/packets/AvatarPropertiesUpdate.ts @@ -29,4 +29,74 @@ export class AvatarPropertiesUpdatePacket implements Packet return (this.PropertiesData['AboutText'].length + 2 + this.PropertiesData['FLAboutText'].length + 1 + this.PropertiesData['ProfileURL'].length + 1) + 66; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.PropertiesData['ImageID'].writeToBuffer(buf, pos); + pos += 16; + this.PropertiesData['FLImageID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.PropertiesData['AboutText'], pos); + pos += this.PropertiesData['AboutText'].length; + buf.write(this.PropertiesData['FLAboutText'], pos); + pos += this.PropertiesData['FLAboutText'].length; + buf.writeUInt8((this.PropertiesData['AllowPublish']) ? 1 : 0, pos++); + buf.writeUInt8((this.PropertiesData['MaturePublish']) ? 1 : 0, pos++); + buf.write(this.PropertiesData['ProfileURL'], pos); + pos += this.PropertiesData['ProfileURL'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjPropertiesData: { + ImageID: UUID, + FLImageID: UUID, + AboutText: string, + FLAboutText: string, + AllowPublish: boolean, + MaturePublish: boolean, + ProfileURL: string + } = { + ImageID: UUID.zero(), + FLImageID: UUID.zero(), + AboutText: '', + FLAboutText: '', + AllowPublish: false, + MaturePublish: false, + ProfileURL: '' + }; + newObjPropertiesData['ImageID'] = new UUID(buf, pos); + pos += 16; + newObjPropertiesData['FLImageID'] = new UUID(buf, pos); + pos += 16; + newObjPropertiesData['AboutText'] = buf.toString('utf8', pos, length); + pos += length; + newObjPropertiesData['FLAboutText'] = buf.toString('utf8', pos, length); + pos += length; + newObjPropertiesData['AllowPublish'] = (buf.readUInt8(pos++) === 1); + newObjPropertiesData['MaturePublish'] = (buf.readUInt8(pos++) === 1); + newObjPropertiesData['ProfileURL'] = buf.toString('utf8', pos, length); + pos += length; + this.PropertiesData = newObjPropertiesData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AvatarSitResponse.ts b/lib/classes/packets/AvatarSitResponse.ts index 3a7eef5..46e2d33 100644 --- a/lib/classes/packets/AvatarSitResponse.ts +++ b/lib/classes/packets/AvatarSitResponse.ts @@ -29,4 +29,62 @@ export class AvatarSitResponsePacket implements Packet return 66; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.SitObject['ID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.SitTransform['AutoPilot']) ? 1 : 0, pos++); + this.SitTransform['SitPosition'].writeToBuffer(buf, pos, false); + pos += 12; + this.SitTransform['SitRotation'].writeToBuffer(buf, pos); + pos += 12; + this.SitTransform['CameraEyeOffset'].writeToBuffer(buf, pos, false); + pos += 12; + this.SitTransform['CameraAtOffset'].writeToBuffer(buf, pos, false); + pos += 12; + buf.writeUInt8((this.SitTransform['ForceMouselook']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjSitObject: { + ID: UUID + } = { + ID: UUID.zero() + }; + newObjSitObject['ID'] = new UUID(buf, pos); + pos += 16; + this.SitObject = newObjSitObject; + const newObjSitTransform: { + AutoPilot: boolean, + SitPosition: Vector3, + SitRotation: Quaternion, + CameraEyeOffset: Vector3, + CameraAtOffset: Vector3, + ForceMouselook: boolean + } = { + AutoPilot: false, + SitPosition: Vector3.getZero(), + SitRotation: Quaternion.getIdentity(), + CameraEyeOffset: Vector3.getZero(), + CameraAtOffset: Vector3.getZero(), + ForceMouselook: false + }; + newObjSitTransform['AutoPilot'] = (buf.readUInt8(pos++) === 1); + newObjSitTransform['SitPosition'] = new Vector3(buf, pos, false); + pos += 12; + newObjSitTransform['SitRotation'] = new Quaternion(buf, pos); + pos += 12; + newObjSitTransform['CameraEyeOffset'] = new Vector3(buf, pos, false); + pos += 12; + newObjSitTransform['CameraAtOffset'] = new Vector3(buf, pos, false); + pos += 12; + newObjSitTransform['ForceMouselook'] = (buf.readUInt8(pos++) === 1); + this.SitTransform = newObjSitTransform; + return pos - startPos; + } } + diff --git a/lib/classes/packets/AvatarTextureUpdate.ts b/lib/classes/packets/AvatarTextureUpdate.ts index 7ea1c81..982873d 100644 --- a/lib/classes/packets/AvatarTextureUpdate.ts +++ b/lib/classes/packets/AvatarTextureUpdate.ts @@ -38,4 +38,80 @@ export class AvatarTextureUpdatePacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.AgentData['TexturesChanged']) ? 1 : 0, pos++); + let count = this.WearableData.length; + buf.writeUInt8(this.WearableData.length, pos++); + for (let i = 0; i < count; i++) + { + this.WearableData[i]['CacheID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.WearableData[i]['TextureIndex'], pos++); + buf.write(this.WearableData[i]['HostName'], pos); + pos += this.WearableData[i]['HostName'].length; + } + count = this.TextureData.length; + buf.writeUInt8(this.TextureData.length, pos++); + for (let i = 0; i < count; i++) + { + this.TextureData[i]['TextureID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + TexturesChanged: boolean + } = { + AgentID: UUID.zero(), + TexturesChanged: false + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['TexturesChanged'] = (buf.readUInt8(pos++) === 1); + this.AgentData = newObjAgentData; + let count = buf.readUInt8(pos++); + this.WearableData = []; + for (let i = 0; i < count; i++) + { + const newObjWearableData: { + CacheID: UUID, + TextureIndex: number, + HostName: string + } = { + CacheID: UUID.zero(), + TextureIndex: 0, + HostName: '' + }; + newObjWearableData['CacheID'] = new UUID(buf, pos); + pos += 16; + newObjWearableData['TextureIndex'] = buf.readUInt8(pos++); + newObjWearableData['HostName'] = buf.toString('utf8', pos, length); + pos += length; + this.WearableData.push(newObjWearableData); + } + count = buf.readUInt8(pos++); + this.TextureData = []; + for (let i = 0; i < count; i++) + { + const newObjTextureData: { + TextureID: UUID + } = { + TextureID: UUID.zero() + }; + newObjTextureData['TextureID'] = new UUID(buf, pos); + pos += 16; + this.TextureData.push(newObjTextureData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/BulkUpdateInventory.ts b/lib/classes/packets/BulkUpdateInventory.ts index 93d886f..eee0031 100644 --- a/lib/classes/packets/BulkUpdateInventory.ts +++ b/lib/classes/packets/BulkUpdateInventory.ts @@ -60,4 +60,206 @@ export class BulkUpdateInventoryPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + let count = this.FolderData.length; + buf.writeUInt8(this.FolderData.length, pos++); + for (let i = 0; i < count; i++) + { + this.FolderData[i]['FolderID'].writeToBuffer(buf, pos); + pos += 16; + this.FolderData[i]['ParentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt8(this.FolderData[i]['Type'], pos++); + buf.write(this.FolderData[i]['Name'], pos); + pos += this.FolderData[i]['Name'].length; + } + count = this.ItemData.length; + buf.writeUInt8(this.ItemData.length, pos++); + for (let i = 0; i < count; i++) + { + this.ItemData[i]['ItemID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.ItemData[i]['CallbackID'], pos); + pos += 4; + this.ItemData[i]['FolderID'].writeToBuffer(buf, pos); + pos += 16; + this.ItemData[i]['CreatorID'].writeToBuffer(buf, pos); + pos += 16; + this.ItemData[i]['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + this.ItemData[i]['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.ItemData[i]['BaseMask'], pos); + pos += 4; + buf.writeUInt32LE(this.ItemData[i]['OwnerMask'], pos); + pos += 4; + buf.writeUInt32LE(this.ItemData[i]['GroupMask'], pos); + pos += 4; + buf.writeUInt32LE(this.ItemData[i]['EveryoneMask'], pos); + pos += 4; + buf.writeUInt32LE(this.ItemData[i]['NextOwnerMask'], pos); + pos += 4; + buf.writeUInt8((this.ItemData[i]['GroupOwned']) ? 1 : 0, pos++); + this.ItemData[i]['AssetID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt8(this.ItemData[i]['Type'], pos++); + buf.writeInt8(this.ItemData[i]['InvType'], pos++); + buf.writeUInt32LE(this.ItemData[i]['Flags'], pos); + pos += 4; + buf.writeUInt8(this.ItemData[i]['SaleType'], pos++); + buf.writeInt32LE(this.ItemData[i]['SalePrice'], pos); + pos += 4; + buf.write(this.ItemData[i]['Name'], pos); + pos += this.ItemData[i]['Name'].length; + buf.write(this.ItemData[i]['Description'], pos); + pos += this.ItemData[i]['Description'].length; + buf.writeInt32LE(this.ItemData[i]['CreationDate'], pos); + pos += 4; + buf.writeUInt32LE(this.ItemData[i]['CRC'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + TransactionID: UUID + } = { + AgentID: UUID.zero(), + TransactionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['TransactionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + let count = buf.readUInt8(pos++); + this.FolderData = []; + for (let i = 0; i < count; i++) + { + const newObjFolderData: { + FolderID: UUID, + ParentID: UUID, + Type: number, + Name: string + } = { + FolderID: UUID.zero(), + ParentID: UUID.zero(), + Type: 0, + Name: '' + }; + newObjFolderData['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjFolderData['ParentID'] = new UUID(buf, pos); + pos += 16; + newObjFolderData['Type'] = buf.readInt8(pos++); + newObjFolderData['Name'] = buf.toString('utf8', pos, length); + pos += length; + this.FolderData.push(newObjFolderData); + } + count = buf.readUInt8(pos++); + this.ItemData = []; + for (let i = 0; i < count; i++) + { + const newObjItemData: { + ItemID: UUID, + CallbackID: number, + FolderID: UUID, + CreatorID: UUID, + OwnerID: UUID, + GroupID: UUID, + BaseMask: number, + OwnerMask: number, + GroupMask: number, + EveryoneMask: number, + NextOwnerMask: number, + GroupOwned: boolean, + AssetID: UUID, + Type: number, + InvType: number, + Flags: number, + SaleType: number, + SalePrice: number, + Name: string, + Description: string, + CreationDate: number, + CRC: number + } = { + ItemID: UUID.zero(), + CallbackID: 0, + FolderID: UUID.zero(), + CreatorID: UUID.zero(), + OwnerID: UUID.zero(), + GroupID: UUID.zero(), + BaseMask: 0, + OwnerMask: 0, + GroupMask: 0, + EveryoneMask: 0, + NextOwnerMask: 0, + GroupOwned: false, + AssetID: UUID.zero(), + Type: 0, + InvType: 0, + Flags: 0, + SaleType: 0, + SalePrice: 0, + Name: '', + Description: '', + CreationDate: 0, + CRC: 0 + }; + newObjItemData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjItemData['CallbackID'] = buf.readUInt32LE(pos); + pos += 4; + newObjItemData['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjItemData['CreatorID'] = new UUID(buf, pos); + pos += 16; + newObjItemData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjItemData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjItemData['BaseMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjItemData['OwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjItemData['GroupMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjItemData['EveryoneMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjItemData['NextOwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjItemData['GroupOwned'] = (buf.readUInt8(pos++) === 1); + newObjItemData['AssetID'] = new UUID(buf, pos); + pos += 16; + newObjItemData['Type'] = buf.readInt8(pos++); + newObjItemData['InvType'] = buf.readInt8(pos++); + newObjItemData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + newObjItemData['SaleType'] = buf.readUInt8(pos++); + newObjItemData['SalePrice'] = buf.readInt32LE(pos); + pos += 4; + newObjItemData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjItemData['Description'] = buf.toString('utf8', pos, length); + pos += length; + newObjItemData['CreationDate'] = buf.readInt32LE(pos); + pos += 4; + newObjItemData['CRC'] = buf.readUInt32LE(pos); + pos += 4; + this.ItemData.push(newObjItemData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/BuyObjectInventory.ts b/lib/classes/packets/BuyObjectInventory.ts index 13b794c..42dfeac 100644 --- a/lib/classes/packets/BuyObjectInventory.ts +++ b/lib/classes/packets/BuyObjectInventory.ts @@ -25,4 +25,54 @@ export class BuyObjectInventoryPacket implements Packet return 80; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['FolderID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + ObjectID: UUID, + ItemID: UUID, + FolderID: UUID + } = { + ObjectID: UUID.zero(), + ItemID: UUID.zero(), + FolderID: UUID.zero() + }; + newObjData['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjData['FolderID'] = new UUID(buf, pos); + pos += 16; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/CameraConstraint.ts b/lib/classes/packets/CameraConstraint.ts index 47b049d..5dc88d8 100644 --- a/lib/classes/packets/CameraConstraint.ts +++ b/lib/classes/packets/CameraConstraint.ts @@ -19,4 +19,26 @@ export class CameraConstraintPacket implements Packet return 16; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.CameraCollidePlane['Plane'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjCameraCollidePlane: { + Plane: Vector4 + } = { + Plane: Vector4.getZero() + }; + newObjCameraCollidePlane['Plane'] = new Vector4(buf, pos); + pos += 16; + this.CameraCollidePlane = newObjCameraCollidePlane; + return pos - startPos; + } } + diff --git a/lib/classes/packets/CancelAuction.ts b/lib/classes/packets/CancelAuction.ts index 0590a52..ae62ab4 100644 --- a/lib/classes/packets/CancelAuction.ts +++ b/lib/classes/packets/CancelAuction.ts @@ -19,4 +19,36 @@ export class CancelAuctionPacket implements Packet return ((16) * this.ParcelData.length) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.ParcelData.length; + buf.writeUInt8(this.ParcelData.length, pos++); + for (let i = 0; i < count; i++) + { + this.ParcelData[i]['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.ParcelData = []; + for (let i = 0; i < count; i++) + { + const newObjParcelData: { + ParcelID: UUID + } = { + ParcelID: UUID.zero() + }; + newObjParcelData['ParcelID'] = new UUID(buf, pos); + pos += 16; + this.ParcelData.push(newObjParcelData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ChangeInventoryItemFlags.ts b/lib/classes/packets/ChangeInventoryItemFlags.ts index 89ecefb..2edf877 100644 --- a/lib/classes/packets/ChangeInventoryItemFlags.ts +++ b/lib/classes/packets/ChangeInventoryItemFlags.ts @@ -24,4 +24,58 @@ export class ChangeInventoryItemFlagsPacket implements Packet return ((20) * this.InventoryData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.InventoryData.length; + buf.writeUInt8(this.InventoryData.length, pos++); + for (let i = 0; i < count; i++) + { + this.InventoryData[i]['ItemID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.InventoryData[i]['Flags'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.InventoryData = []; + for (let i = 0; i < count; i++) + { + const newObjInventoryData: { + ItemID: UUID, + Flags: number + } = { + ItemID: UUID.zero(), + Flags: 0 + }; + newObjInventoryData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + this.InventoryData.push(newObjInventoryData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ChangeUserRights.ts b/lib/classes/packets/ChangeUserRights.ts index c832cfb..6f6fd55 100644 --- a/lib/classes/packets/ChangeUserRights.ts +++ b/lib/classes/packets/ChangeUserRights.ts @@ -23,4 +23,52 @@ export class ChangeUserRightsPacket implements Packet return ((20) * this.Rights.length) + 17; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.Rights.length; + buf.writeUInt8(this.Rights.length, pos++); + for (let i = 0; i < count; i++) + { + this.Rights[i]['AgentRelated'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.Rights[i]['RelatedRights'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.Rights = []; + for (let i = 0; i < count; i++) + { + const newObjRights: { + AgentRelated: UUID, + RelatedRights: number + } = { + AgentRelated: UUID.zero(), + RelatedRights: 0 + }; + newObjRights['AgentRelated'] = new UUID(buf, pos); + pos += 16; + newObjRights['RelatedRights'] = buf.readInt32LE(pos); + pos += 4; + this.Rights.push(newObjRights); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ChatFromSimulator.ts b/lib/classes/packets/ChatFromSimulator.ts index 1956b91..0bca31d 100644 --- a/lib/classes/packets/ChatFromSimulator.ts +++ b/lib/classes/packets/ChatFromSimulator.ts @@ -27,4 +27,62 @@ export class ChatFromSimulatorPacket implements Packet return (this.ChatData['FromName'].length + 1 + this.ChatData['Message'].length + 2) + 47; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.write(this.ChatData['FromName'], pos); + pos += this.ChatData['FromName'].length; + this.ChatData['SourceID'].writeToBuffer(buf, pos); + pos += 16; + this.ChatData['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.ChatData['SourceType'], pos++); + buf.writeUInt8(this.ChatData['ChatType'], pos++); + buf.writeUInt8(this.ChatData['Audible'], pos++); + this.ChatData['Position'].writeToBuffer(buf, pos, false); + pos += 12; + buf.write(this.ChatData['Message'], pos); + pos += this.ChatData['Message'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjChatData: { + FromName: string, + SourceID: UUID, + OwnerID: UUID, + SourceType: number, + ChatType: number, + Audible: number, + Position: Vector3, + Message: string + } = { + FromName: '', + SourceID: UUID.zero(), + OwnerID: UUID.zero(), + SourceType: 0, + ChatType: 0, + Audible: 0, + Position: Vector3.getZero(), + Message: '' + }; + newObjChatData['FromName'] = buf.toString('utf8', pos, length); + pos += length; + newObjChatData['SourceID'] = new UUID(buf, pos); + pos += 16; + newObjChatData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjChatData['SourceType'] = buf.readUInt8(pos++); + newObjChatData['ChatType'] = buf.readUInt8(pos++); + newObjChatData['Audible'] = buf.readUInt8(pos++); + newObjChatData['Position'] = new Vector3(buf, pos, false); + pos += 12; + newObjChatData['Message'] = buf.toString('utf8', pos, length); + pos += length; + this.ChatData = newObjChatData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ChatFromViewer.ts b/lib/classes/packets/ChatFromViewer.ts index 6928a3b..1232e5c 100644 --- a/lib/classes/packets/ChatFromViewer.ts +++ b/lib/classes/packets/ChatFromViewer.ts @@ -25,4 +25,52 @@ export class ChatFromViewerPacket implements Packet return (this.ChatData['Message'].length + 2) + 37; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.ChatData['Message'], pos); + pos += this.ChatData['Message'].length; + buf.writeUInt8(this.ChatData['Type'], pos++); + buf.writeInt32LE(this.ChatData['Channel'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjChatData: { + Message: string, + Type: number, + Channel: number + } = { + Message: '', + Type: 0, + Channel: 0 + }; + newObjChatData['Message'] = buf.toString('utf8', pos, length); + pos += length; + newObjChatData['Type'] = buf.readUInt8(pos++); + newObjChatData['Channel'] = buf.readInt32LE(pos); + pos += 4; + this.ChatData = newObjChatData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ChatPass.ts b/lib/classes/packets/ChatPass.ts index a8b1053..f139f5f 100644 --- a/lib/classes/packets/ChatPass.ts +++ b/lib/classes/packets/ChatPass.ts @@ -29,4 +29,74 @@ export class ChatPassPacket implements Packet return (this.ChatData['Name'].length + 1 + this.ChatData['Message'].length + 2) + 55; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.ChatData['Channel'], pos); + pos += 4; + this.ChatData['Position'].writeToBuffer(buf, pos, false); + pos += 12; + this.ChatData['ID'].writeToBuffer(buf, pos); + pos += 16; + this.ChatData['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.ChatData['Name'], pos); + pos += this.ChatData['Name'].length; + buf.writeUInt8(this.ChatData['SourceType'], pos++); + buf.writeUInt8(this.ChatData['Type'], pos++); + buf.writeFloatLE(this.ChatData['Radius'], pos); + pos += 4; + buf.writeUInt8(this.ChatData['SimAccess'], pos++); + buf.write(this.ChatData['Message'], pos); + pos += this.ChatData['Message'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjChatData: { + Channel: number, + Position: Vector3, + ID: UUID, + OwnerID: UUID, + Name: string, + SourceType: number, + Type: number, + Radius: number, + SimAccess: number, + Message: string + } = { + Channel: 0, + Position: Vector3.getZero(), + ID: UUID.zero(), + OwnerID: UUID.zero(), + Name: '', + SourceType: 0, + Type: 0, + Radius: 0, + SimAccess: 0, + Message: '' + }; + newObjChatData['Channel'] = buf.readInt32LE(pos); + pos += 4; + newObjChatData['Position'] = new Vector3(buf, pos, false); + pos += 12; + newObjChatData['ID'] = new UUID(buf, pos); + pos += 16; + newObjChatData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjChatData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjChatData['SourceType'] = buf.readUInt8(pos++); + newObjChatData['Type'] = buf.readUInt8(pos++); + newObjChatData['Radius'] = buf.readFloatLE(pos); + pos += 4; + newObjChatData['SimAccess'] = buf.readUInt8(pos++); + newObjChatData['Message'] = buf.toString('utf8', pos, length); + pos += length; + this.ChatData = newObjChatData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/CheckParcelAuctions.ts b/lib/classes/packets/CheckParcelAuctions.ts index f563c1c..a86bd10 100644 --- a/lib/classes/packets/CheckParcelAuctions.ts +++ b/lib/classes/packets/CheckParcelAuctions.ts @@ -19,4 +19,38 @@ export class CheckParcelAuctionsPacket implements Packet return ((8) * this.RegionData.length) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.RegionData.length; + buf.writeUInt8(this.RegionData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeInt32LE(this.RegionData[i]['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.RegionData[i]['RegionHandle'].high, pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.RegionData = []; + for (let i = 0; i < count; i++) + { + const newObjRegionData: { + RegionHandle: Long + } = { + RegionHandle: Long.ZERO + }; + newObjRegionData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + this.RegionData.push(newObjRegionData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/CheckParcelSales.ts b/lib/classes/packets/CheckParcelSales.ts index fab5963..8933461 100644 --- a/lib/classes/packets/CheckParcelSales.ts +++ b/lib/classes/packets/CheckParcelSales.ts @@ -19,4 +19,38 @@ export class CheckParcelSalesPacket implements Packet return ((8) * this.RegionData.length) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.RegionData.length; + buf.writeUInt8(this.RegionData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeInt32LE(this.RegionData[i]['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.RegionData[i]['RegionHandle'].high, pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.RegionData = []; + for (let i = 0; i < count; i++) + { + const newObjRegionData: { + RegionHandle: Long + } = { + RegionHandle: Long.ZERO + }; + newObjRegionData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + this.RegionData.push(newObjRegionData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ChildAgentAlive.ts b/lib/classes/packets/ChildAgentAlive.ts index 3f3f96c..2958cb5 100644 --- a/lib/classes/packets/ChildAgentAlive.ts +++ b/lib/classes/packets/ChildAgentAlive.ts @@ -23,4 +23,46 @@ export class ChildAgentAlivePacket implements Packet return 44; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.AgentData['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.AgentData['RegionHandle'].high, pos); + pos += 4; + buf.writeUInt32LE(this.AgentData['ViewerCircuitCode'], pos); + pos += 4; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + RegionHandle: Long, + ViewerCircuitCode: number, + AgentID: UUID, + SessionID: UUID + } = { + RegionHandle: Long.ZERO, + ViewerCircuitCode: 0, + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjAgentData['ViewerCircuitCode'] = buf.readUInt32LE(pos); + pos += 4; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ChildAgentDying.ts b/lib/classes/packets/ChildAgentDying.ts index 3646864..6c72dac 100644 --- a/lib/classes/packets/ChildAgentDying.ts +++ b/lib/classes/packets/ChildAgentDying.ts @@ -20,4 +20,32 @@ export class ChildAgentDyingPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ChildAgentPositionUpdate.ts b/lib/classes/packets/ChildAgentPositionUpdate.ts index 3ac599b..cbae2e2 100644 --- a/lib/classes/packets/ChildAgentPositionUpdate.ts +++ b/lib/classes/packets/ChildAgentPositionUpdate.ts @@ -32,4 +32,92 @@ export class ChildAgentPositionUpdatePacket implements Packet return 129; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.AgentData['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.AgentData['RegionHandle'].high, pos); + pos += 4; + buf.writeUInt32LE(this.AgentData['ViewerCircuitCode'], pos); + pos += 4; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['AgentPos'].writeToBuffer(buf, pos, false); + pos += 12; + this.AgentData['AgentVel'].writeToBuffer(buf, pos, false); + pos += 12; + this.AgentData['Center'].writeToBuffer(buf, pos, false); + pos += 12; + this.AgentData['Size'].writeToBuffer(buf, pos, false); + pos += 12; + this.AgentData['AtAxis'].writeToBuffer(buf, pos, false); + pos += 12; + this.AgentData['LeftAxis'].writeToBuffer(buf, pos, false); + pos += 12; + this.AgentData['UpAxis'].writeToBuffer(buf, pos, false); + pos += 12; + buf.writeUInt8((this.AgentData['ChangedGrid']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + RegionHandle: Long, + ViewerCircuitCode: number, + AgentID: UUID, + SessionID: UUID, + AgentPos: Vector3, + AgentVel: Vector3, + Center: Vector3, + Size: Vector3, + AtAxis: Vector3, + LeftAxis: Vector3, + UpAxis: Vector3, + ChangedGrid: boolean + } = { + RegionHandle: Long.ZERO, + ViewerCircuitCode: 0, + AgentID: UUID.zero(), + SessionID: UUID.zero(), + AgentPos: Vector3.getZero(), + AgentVel: Vector3.getZero(), + Center: Vector3.getZero(), + Size: Vector3.getZero(), + AtAxis: Vector3.getZero(), + LeftAxis: Vector3.getZero(), + UpAxis: Vector3.getZero(), + ChangedGrid: false + }; + newObjAgentData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjAgentData['ViewerCircuitCode'] = buf.readUInt32LE(pos); + pos += 4; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['AgentPos'] = new Vector3(buf, pos, false); + pos += 12; + newObjAgentData['AgentVel'] = new Vector3(buf, pos, false); + pos += 12; + newObjAgentData['Center'] = new Vector3(buf, pos, false); + pos += 12; + newObjAgentData['Size'] = new Vector3(buf, pos, false); + pos += 12; + newObjAgentData['AtAxis'] = new Vector3(buf, pos, false); + pos += 12; + newObjAgentData['LeftAxis'] = new Vector3(buf, pos, false); + pos += 12; + newObjAgentData['UpAxis'] = new Vector3(buf, pos, false); + pos += 12; + newObjAgentData['ChangedGrid'] = (buf.readUInt8(pos++) === 1); + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ChildAgentUnknown.ts b/lib/classes/packets/ChildAgentUnknown.ts index 337bba1..8b51aab 100644 --- a/lib/classes/packets/ChildAgentUnknown.ts +++ b/lib/classes/packets/ChildAgentUnknown.ts @@ -20,4 +20,32 @@ export class ChildAgentUnknownPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ChildAgentUpdate.ts b/lib/classes/packets/ChildAgentUpdate.ts index a1993ea..cfb0fcc 100644 --- a/lib/classes/packets/ChildAgentUpdate.ts +++ b/lib/classes/packets/ChildAgentUpdate.ts @@ -85,4 +85,348 @@ export class ChildAgentUpdatePacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.AgentData['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.AgentData['RegionHandle'].high, pos); + pos += 4; + buf.writeUInt32LE(this.AgentData['ViewerCircuitCode'], pos); + pos += 4; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['AgentPos'].writeToBuffer(buf, pos, false); + pos += 12; + this.AgentData['AgentVel'].writeToBuffer(buf, pos, false); + pos += 12; + this.AgentData['Center'].writeToBuffer(buf, pos, false); + pos += 12; + this.AgentData['Size'].writeToBuffer(buf, pos, false); + pos += 12; + this.AgentData['AtAxis'].writeToBuffer(buf, pos, false); + pos += 12; + this.AgentData['LeftAxis'].writeToBuffer(buf, pos, false); + pos += 12; + this.AgentData['UpAxis'].writeToBuffer(buf, pos, false); + pos += 12; + buf.writeUInt8((this.AgentData['ChangedGrid']) ? 1 : 0, pos++); + buf.writeFloatLE(this.AgentData['Far'], pos); + pos += 4; + buf.writeFloatLE(this.AgentData['Aspect'], pos); + pos += 4; + buf.write(this.AgentData['Throttles'], pos); + pos += this.AgentData['Throttles'].length; + buf.writeUInt32LE(this.AgentData['LocomotionState'], pos); + pos += 4; + this.AgentData['HeadRotation'].writeToBuffer(buf, pos); + pos += 12; + this.AgentData['BodyRotation'].writeToBuffer(buf, pos); + pos += 12; + buf.writeUInt32LE(this.AgentData['ControlFlags'], pos); + pos += 4; + buf.writeFloatLE(this.AgentData['EnergyLevel'], pos); + pos += 4; + buf.writeUInt8(this.AgentData['GodLevel'], pos++); + buf.writeUInt8((this.AgentData['AlwaysRun']) ? 1 : 0, pos++); + this.AgentData['PreyAgent'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.AgentData['AgentAccess'], pos++); + buf.write(this.AgentData['AgentTextures'], pos); + pos += this.AgentData['AgentTextures'].length; + this.AgentData['ActiveGroupID'].writeToBuffer(buf, pos); + pos += 16; + let count = this.GroupData.length; + buf.writeUInt8(this.GroupData.length, pos++); + for (let i = 0; i < count; i++) + { + this.GroupData[i]['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.GroupData[i]['GroupPowers'].low, pos); + pos += 4; + buf.writeInt32LE(this.GroupData[i]['GroupPowers'].high, pos); + pos += 4; + buf.writeUInt8((this.GroupData[i]['AcceptNotices']) ? 1 : 0, pos++); + } + count = this.AnimationData.length; + buf.writeUInt8(this.AnimationData.length, pos++); + for (let i = 0; i < count; i++) + { + this.AnimationData[i]['Animation'].writeToBuffer(buf, pos); + pos += 16; + this.AnimationData[i]['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + } + count = this.GranterBlock.length; + buf.writeUInt8(this.GranterBlock.length, pos++); + for (let i = 0; i < count; i++) + { + this.GranterBlock[i]['GranterID'].writeToBuffer(buf, pos); + pos += 16; + } + count = this.NVPairData.length; + buf.writeUInt8(this.NVPairData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.write(this.NVPairData[i]['NVPairs'], pos); + pos += this.NVPairData[i]['NVPairs'].length; + } + count = this.VisualParam.length; + buf.writeUInt8(this.VisualParam.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt8(this.VisualParam[i]['ParamValue'], pos++); + } + count = this.AgentAccess.length; + buf.writeUInt8(this.AgentAccess.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt8(this.AgentAccess[i]['AgentLegacyAccess'], pos++); + buf.writeUInt8(this.AgentAccess[i]['AgentMaxAccess'], pos++); + } + count = this.AgentInfo.length; + buf.writeUInt8(this.AgentInfo.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.AgentInfo[i]['Flags'], pos); + pos += 4; + } + count = this.AgentInventoryHost.length; + buf.writeUInt8(this.AgentInventoryHost.length, pos++); + for (let i = 0; i < count; i++) + { + buf.write(this.AgentInventoryHost[i]['InventoryHost'], pos); + pos += this.AgentInventoryHost[i]['InventoryHost'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + RegionHandle: Long, + ViewerCircuitCode: number, + AgentID: UUID, + SessionID: UUID, + AgentPos: Vector3, + AgentVel: Vector3, + Center: Vector3, + Size: Vector3, + AtAxis: Vector3, + LeftAxis: Vector3, + UpAxis: Vector3, + ChangedGrid: boolean, + Far: number, + Aspect: number, + Throttles: string, + LocomotionState: number, + HeadRotation: Quaternion, + BodyRotation: Quaternion, + ControlFlags: number, + EnergyLevel: number, + GodLevel: number, + AlwaysRun: boolean, + PreyAgent: UUID, + AgentAccess: number, + AgentTextures: string, + ActiveGroupID: UUID + } = { + RegionHandle: Long.ZERO, + ViewerCircuitCode: 0, + AgentID: UUID.zero(), + SessionID: UUID.zero(), + AgentPos: Vector3.getZero(), + AgentVel: Vector3.getZero(), + Center: Vector3.getZero(), + Size: Vector3.getZero(), + AtAxis: Vector3.getZero(), + LeftAxis: Vector3.getZero(), + UpAxis: Vector3.getZero(), + ChangedGrid: false, + Far: 0, + Aspect: 0, + Throttles: '', + LocomotionState: 0, + HeadRotation: Quaternion.getIdentity(), + BodyRotation: Quaternion.getIdentity(), + ControlFlags: 0, + EnergyLevel: 0, + GodLevel: 0, + AlwaysRun: false, + PreyAgent: UUID.zero(), + AgentAccess: 0, + AgentTextures: '', + ActiveGroupID: UUID.zero() + }; + newObjAgentData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjAgentData['ViewerCircuitCode'] = buf.readUInt32LE(pos); + pos += 4; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['AgentPos'] = new Vector3(buf, pos, false); + pos += 12; + newObjAgentData['AgentVel'] = new Vector3(buf, pos, false); + pos += 12; + newObjAgentData['Center'] = new Vector3(buf, pos, false); + pos += 12; + newObjAgentData['Size'] = new Vector3(buf, pos, false); + pos += 12; + newObjAgentData['AtAxis'] = new Vector3(buf, pos, false); + pos += 12; + newObjAgentData['LeftAxis'] = new Vector3(buf, pos, false); + pos += 12; + newObjAgentData['UpAxis'] = new Vector3(buf, pos, false); + pos += 12; + newObjAgentData['ChangedGrid'] = (buf.readUInt8(pos++) === 1); + newObjAgentData['Far'] = buf.readFloatLE(pos); + pos += 4; + newObjAgentData['Aspect'] = buf.readFloatLE(pos); + pos += 4; + newObjAgentData['Throttles'] = buf.toString('utf8', pos, length); + pos += length; + newObjAgentData['LocomotionState'] = buf.readUInt32LE(pos); + pos += 4; + newObjAgentData['HeadRotation'] = new Quaternion(buf, pos); + pos += 12; + newObjAgentData['BodyRotation'] = new Quaternion(buf, pos); + pos += 12; + newObjAgentData['ControlFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjAgentData['EnergyLevel'] = buf.readFloatLE(pos); + pos += 4; + newObjAgentData['GodLevel'] = buf.readUInt8(pos++); + newObjAgentData['AlwaysRun'] = (buf.readUInt8(pos++) === 1); + newObjAgentData['PreyAgent'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['AgentAccess'] = buf.readUInt8(pos++); + newObjAgentData['AgentTextures'] = buf.toString('utf8', pos, length); + pos += length; + newObjAgentData['ActiveGroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + let count = buf.readUInt8(pos++); + this.GroupData = []; + for (let i = 0; i < count; i++) + { + const newObjGroupData: { + GroupID: UUID, + GroupPowers: Long, + AcceptNotices: boolean + } = { + GroupID: UUID.zero(), + GroupPowers: Long.ZERO, + AcceptNotices: false + }; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['GroupPowers'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjGroupData['AcceptNotices'] = (buf.readUInt8(pos++) === 1); + this.GroupData.push(newObjGroupData); + } + count = buf.readUInt8(pos++); + this.AnimationData = []; + for (let i = 0; i < count; i++) + { + const newObjAnimationData: { + Animation: UUID, + ObjectID: UUID + } = { + Animation: UUID.zero(), + ObjectID: UUID.zero() + }; + newObjAnimationData['Animation'] = new UUID(buf, pos); + pos += 16; + newObjAnimationData['ObjectID'] = new UUID(buf, pos); + pos += 16; + this.AnimationData.push(newObjAnimationData); + } + count = buf.readUInt8(pos++); + this.GranterBlock = []; + for (let i = 0; i < count; i++) + { + const newObjGranterBlock: { + GranterID: UUID + } = { + GranterID: UUID.zero() + }; + newObjGranterBlock['GranterID'] = new UUID(buf, pos); + pos += 16; + this.GranterBlock.push(newObjGranterBlock); + } + count = buf.readUInt8(pos++); + this.NVPairData = []; + for (let i = 0; i < count; i++) + { + const newObjNVPairData: { + NVPairs: string + } = { + NVPairs: '' + }; + newObjNVPairData['NVPairs'] = buf.toString('utf8', pos, length); + pos += length; + this.NVPairData.push(newObjNVPairData); + } + count = buf.readUInt8(pos++); + this.VisualParam = []; + for (let i = 0; i < count; i++) + { + const newObjVisualParam: { + ParamValue: number + } = { + ParamValue: 0 + }; + newObjVisualParam['ParamValue'] = buf.readUInt8(pos++); + this.VisualParam.push(newObjVisualParam); + } + count = buf.readUInt8(pos++); + this.AgentAccess = []; + for (let i = 0; i < count; i++) + { + const newObjAgentAccess: { + AgentLegacyAccess: number, + AgentMaxAccess: number + } = { + AgentLegacyAccess: 0, + AgentMaxAccess: 0 + }; + newObjAgentAccess['AgentLegacyAccess'] = buf.readUInt8(pos++); + newObjAgentAccess['AgentMaxAccess'] = buf.readUInt8(pos++); + this.AgentAccess.push(newObjAgentAccess); + } + count = buf.readUInt8(pos++); + this.AgentInfo = []; + for (let i = 0; i < count; i++) + { + const newObjAgentInfo: { + Flags: number + } = { + Flags: 0 + }; + newObjAgentInfo['Flags'] = buf.readUInt32LE(pos); + pos += 4; + this.AgentInfo.push(newObjAgentInfo); + } + count = buf.readUInt8(pos++); + this.AgentInventoryHost = []; + for (let i = 0; i < count; i++) + { + const newObjAgentInventoryHost: { + InventoryHost: string + } = { + InventoryHost: '' + }; + newObjAgentInventoryHost['InventoryHost'] = buf.toString('utf8', pos, length); + pos += length; + this.AgentInventoryHost.push(newObjAgentInventoryHost); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ClassifiedDelete.ts b/lib/classes/packets/ClassifiedDelete.ts index 76ee9bb..f03821e 100644 --- a/lib/classes/packets/ClassifiedDelete.ts +++ b/lib/classes/packets/ClassifiedDelete.ts @@ -23,4 +23,42 @@ export class ClassifiedDeletePacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['ClassifiedID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + ClassifiedID: UUID + } = { + ClassifiedID: UUID.zero() + }; + newObjData['ClassifiedID'] = new UUID(buf, pos); + pos += 16; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ClassifiedGodDelete.ts b/lib/classes/packets/ClassifiedGodDelete.ts index 620b5b8..82196f2 100644 --- a/lib/classes/packets/ClassifiedGodDelete.ts +++ b/lib/classes/packets/ClassifiedGodDelete.ts @@ -24,4 +24,48 @@ export class ClassifiedGodDeletePacket implements Packet return 64; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['ClassifiedID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['QueryID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + ClassifiedID: UUID, + QueryID: UUID + } = { + ClassifiedID: UUID.zero(), + QueryID: UUID.zero() + }; + newObjData['ClassifiedID'] = new UUID(buf, pos); + pos += 16; + newObjData['QueryID'] = new UUID(buf, pos); + pos += 16; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ClassifiedInfoReply.ts b/lib/classes/packets/ClassifiedInfoReply.ts index 4ec80cd..9700812 100644 --- a/lib/classes/packets/ClassifiedInfoReply.ts +++ b/lib/classes/packets/ClassifiedInfoReply.ts @@ -37,4 +37,118 @@ export class ClassifiedInfoReplyPacket implements Packet return (this.Data['Name'].length + 1 + this.Data['Desc'].length + 2 + this.Data['SimName'].length + 1 + this.Data['ParcelName'].length + 1) + 125; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['ClassifiedID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['CreatorID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.Data['CreationDate'], pos); + pos += 4; + buf.writeUInt32LE(this.Data['ExpirationDate'], pos); + pos += 4; + buf.writeUInt32LE(this.Data['Category'], pos); + pos += 4; + buf.write(this.Data['Name'], pos); + pos += this.Data['Name'].length; + buf.write(this.Data['Desc'], pos); + pos += this.Data['Desc'].length; + this.Data['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.Data['ParentEstate'], pos); + pos += 4; + this.Data['SnapshotID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.Data['SimName'], pos); + pos += this.Data['SimName'].length; + this.Data['PosGlobal'].writeToBuffer(buf, pos, true); + pos += 24; + buf.write(this.Data['ParcelName'], pos); + pos += this.Data['ParcelName'].length; + buf.writeUInt8(this.Data['ClassifiedFlags'], pos++); + buf.writeInt32LE(this.Data['PriceForListing'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + ClassifiedID: UUID, + CreatorID: UUID, + CreationDate: number, + ExpirationDate: number, + Category: number, + Name: string, + Desc: string, + ParcelID: UUID, + ParentEstate: number, + SnapshotID: UUID, + SimName: string, + PosGlobal: Vector3, + ParcelName: string, + ClassifiedFlags: number, + PriceForListing: number + } = { + ClassifiedID: UUID.zero(), + CreatorID: UUID.zero(), + CreationDate: 0, + ExpirationDate: 0, + Category: 0, + Name: '', + Desc: '', + ParcelID: UUID.zero(), + ParentEstate: 0, + SnapshotID: UUID.zero(), + SimName: '', + PosGlobal: Vector3.getZero(), + ParcelName: '', + ClassifiedFlags: 0, + PriceForListing: 0 + }; + newObjData['ClassifiedID'] = new UUID(buf, pos); + pos += 16; + newObjData['CreatorID'] = new UUID(buf, pos); + pos += 16; + newObjData['CreationDate'] = buf.readUInt32LE(pos); + pos += 4; + newObjData['ExpirationDate'] = buf.readUInt32LE(pos); + pos += 4; + newObjData['Category'] = buf.readUInt32LE(pos); + pos += 4; + newObjData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['Desc'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['ParcelID'] = new UUID(buf, pos); + pos += 16; + newObjData['ParentEstate'] = buf.readUInt32LE(pos); + pos += 4; + newObjData['SnapshotID'] = new UUID(buf, pos); + pos += 16; + newObjData['SimName'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['PosGlobal'] = new Vector3(buf, pos, true); + pos += 24; + newObjData['ParcelName'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['ClassifiedFlags'] = buf.readUInt8(pos++); + newObjData['PriceForListing'] = buf.readInt32LE(pos); + pos += 4; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ClassifiedInfoRequest.ts b/lib/classes/packets/ClassifiedInfoRequest.ts index 161b8a7..350feaa 100644 --- a/lib/classes/packets/ClassifiedInfoRequest.ts +++ b/lib/classes/packets/ClassifiedInfoRequest.ts @@ -23,4 +23,42 @@ export class ClassifiedInfoRequestPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['ClassifiedID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + ClassifiedID: UUID + } = { + ClassifiedID: UUID.zero() + }; + newObjData['ClassifiedID'] = new UUID(buf, pos); + pos += 16; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ClassifiedInfoUpdate.ts b/lib/classes/packets/ClassifiedInfoUpdate.ts index 01b240e..6a491c2 100644 --- a/lib/classes/packets/ClassifiedInfoUpdate.ts +++ b/lib/classes/packets/ClassifiedInfoUpdate.ts @@ -33,4 +33,94 @@ export class ClassifiedInfoUpdatePacket implements Packet return (this.Data['Name'].length + 1 + this.Data['Desc'].length + 2) + 117; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['ClassifiedID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.Data['Category'], pos); + pos += 4; + buf.write(this.Data['Name'], pos); + pos += this.Data['Name'].length; + buf.write(this.Data['Desc'], pos); + pos += this.Data['Desc'].length; + this.Data['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.Data['ParentEstate'], pos); + pos += 4; + this.Data['SnapshotID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['PosGlobal'].writeToBuffer(buf, pos, true); + pos += 24; + buf.writeUInt8(this.Data['ClassifiedFlags'], pos++); + buf.writeInt32LE(this.Data['PriceForListing'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + ClassifiedID: UUID, + Category: number, + Name: string, + Desc: string, + ParcelID: UUID, + ParentEstate: number, + SnapshotID: UUID, + PosGlobal: Vector3, + ClassifiedFlags: number, + PriceForListing: number + } = { + ClassifiedID: UUID.zero(), + Category: 0, + Name: '', + Desc: '', + ParcelID: UUID.zero(), + ParentEstate: 0, + SnapshotID: UUID.zero(), + PosGlobal: Vector3.getZero(), + ClassifiedFlags: 0, + PriceForListing: 0 + }; + newObjData['ClassifiedID'] = new UUID(buf, pos); + pos += 16; + newObjData['Category'] = buf.readUInt32LE(pos); + pos += 4; + newObjData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['Desc'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['ParcelID'] = new UUID(buf, pos); + pos += 16; + newObjData['ParentEstate'] = buf.readUInt32LE(pos); + pos += 4; + newObjData['SnapshotID'] = new UUID(buf, pos); + pos += 16; + newObjData['PosGlobal'] = new Vector3(buf, pos, true); + pos += 24; + newObjData['ClassifiedFlags'] = buf.readUInt8(pos++); + newObjData['PriceForListing'] = buf.readInt32LE(pos); + pos += 4; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ClearFollowCamProperties.ts b/lib/classes/packets/ClearFollowCamProperties.ts index 032159a..d12ac78 100644 --- a/lib/classes/packets/ClearFollowCamProperties.ts +++ b/lib/classes/packets/ClearFollowCamProperties.ts @@ -19,4 +19,26 @@ export class ClearFollowCamPropertiesPacket implements Packet return 16; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.ObjectData['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjObjectData: { + ObjectID: UUID + } = { + ObjectID: UUID.zero() + }; + newObjObjectData['ObjectID'] = new UUID(buf, pos); + pos += 16; + this.ObjectData = newObjObjectData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/CloseCircuit.ts b/lib/classes/packets/CloseCircuit.ts index 26f8d39..a1a61b5 100644 --- a/lib/classes/packets/CloseCircuit.ts +++ b/lib/classes/packets/CloseCircuit.ts @@ -15,4 +15,14 @@ export class CloseCircuitPacket implements Packet return 0; } + writeToBuffer(buf: Buffer, pos: number): number + { + return 0; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + return 0; + } } + diff --git a/lib/classes/packets/CoarseLocationUpdate.ts b/lib/classes/packets/CoarseLocationUpdate.ts index 0d9a606..acb913c 100644 --- a/lib/classes/packets/CoarseLocationUpdate.ts +++ b/lib/classes/packets/CoarseLocationUpdate.ts @@ -28,4 +28,78 @@ export class CoarseLocationUpdatePacket implements Packet return ((3) * this.Location.length) + ((16) * this.AgentData.length) + 6; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + let count = this.Location.length; + buf.writeUInt8(this.Location.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt8(this.Location[i]['X'], pos++); + buf.writeUInt8(this.Location[i]['Y'], pos++); + buf.writeUInt8(this.Location[i]['Z'], pos++); + } + buf.writeInt16LE(this.Index['You'], pos); + pos += 2; + buf.writeInt16LE(this.Index['Prey'], pos); + pos += 2; + count = this.AgentData.length; + buf.writeUInt8(this.AgentData.length, pos++); + for (let i = 0; i < count; i++) + { + this.AgentData[i]['AgentID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + let count = buf.readUInt8(pos++); + this.Location = []; + for (let i = 0; i < count; i++) + { + const newObjLocation: { + X: number, + Y: number, + Z: number + } = { + X: 0, + Y: 0, + Z: 0 + }; + newObjLocation['X'] = buf.readUInt8(pos++); + newObjLocation['Y'] = buf.readUInt8(pos++); + newObjLocation['Z'] = buf.readUInt8(pos++); + this.Location.push(newObjLocation); + } + const newObjIndex: { + You: number, + Prey: number + } = { + You: 0, + Prey: 0 + }; + newObjIndex['You'] = buf.readInt16LE(pos); + pos += 2; + newObjIndex['Prey'] = buf.readInt16LE(pos); + pos += 2; + this.Index = newObjIndex; + count = buf.readUInt8(pos++); + this.AgentData = []; + for (let i = 0; i < count; i++) + { + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData.push(newObjAgentData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/CompleteAgentMovement.ts b/lib/classes/packets/CompleteAgentMovement.ts index 710e61f..8470f42 100644 --- a/lib/classes/packets/CompleteAgentMovement.ts +++ b/lib/classes/packets/CompleteAgentMovement.ts @@ -21,4 +21,38 @@ export class CompleteAgentMovementPacket implements Packet return 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AgentData['CircuitCode'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + CircuitCode: number + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + CircuitCode: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['CircuitCode'] = buf.readUInt32LE(pos); + pos += 4; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/CompleteAuction.ts b/lib/classes/packets/CompleteAuction.ts index 0f872d0..6db6f80 100644 --- a/lib/classes/packets/CompleteAuction.ts +++ b/lib/classes/packets/CompleteAuction.ts @@ -19,4 +19,36 @@ export class CompleteAuctionPacket implements Packet return ((16) * this.ParcelData.length) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.ParcelData.length; + buf.writeUInt8(this.ParcelData.length, pos++); + for (let i = 0; i < count; i++) + { + this.ParcelData[i]['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.ParcelData = []; + for (let i = 0; i < count; i++) + { + const newObjParcelData: { + ParcelID: UUID + } = { + ParcelID: UUID.zero() + }; + newObjParcelData['ParcelID'] = new UUID(buf, pos); + pos += 16; + this.ParcelData.push(newObjParcelData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/CompletePingCheck.ts b/lib/classes/packets/CompletePingCheck.ts index eb810be..0463881 100644 --- a/lib/classes/packets/CompletePingCheck.ts +++ b/lib/classes/packets/CompletePingCheck.ts @@ -18,4 +18,24 @@ export class CompletePingCheckPacket implements Packet return 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt8(this.PingID['PingID'], pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjPingID: { + PingID: number + } = { + PingID: 0 + }; + newObjPingID['PingID'] = buf.readUInt8(pos++); + this.PingID = newObjPingID; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ConfirmAuctionStart.ts b/lib/classes/packets/ConfirmAuctionStart.ts index c3629b1..42805a6 100644 --- a/lib/classes/packets/ConfirmAuctionStart.ts +++ b/lib/classes/packets/ConfirmAuctionStart.ts @@ -20,4 +20,32 @@ export class ConfirmAuctionStartPacket implements Packet return 20; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AuctionData['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AuctionData['AuctionID'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAuctionData: { + ParcelID: UUID, + AuctionID: number + } = { + ParcelID: UUID.zero(), + AuctionID: 0 + }; + newObjAuctionData['ParcelID'] = new UUID(buf, pos); + pos += 16; + newObjAuctionData['AuctionID'] = buf.readUInt32LE(pos); + pos += 4; + this.AuctionData = newObjAuctionData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ConfirmEnableSimulator.ts b/lib/classes/packets/ConfirmEnableSimulator.ts index 8b29c16..62b42f9 100644 --- a/lib/classes/packets/ConfirmEnableSimulator.ts +++ b/lib/classes/packets/ConfirmEnableSimulator.ts @@ -20,4 +20,32 @@ export class ConfirmEnableSimulatorPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ConfirmXferPacket.ts b/lib/classes/packets/ConfirmXferPacket.ts index 35881e9..c75b88e 100644 --- a/lib/classes/packets/ConfirmXferPacket.ts +++ b/lib/classes/packets/ConfirmXferPacket.ts @@ -20,4 +20,34 @@ export class ConfirmXferPacketPacket implements Packet return 12; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.XferID['ID'].low, pos); + pos += 4; + buf.writeInt32LE(this.XferID['ID'].high, pos); + pos += 4; + buf.writeUInt32LE(this.XferID['Packet'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjXferID: { + ID: Long, + Packet: number + } = { + ID: Long.ZERO, + Packet: 0 + }; + newObjXferID['ID'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjXferID['Packet'] = buf.readUInt32LE(pos); + pos += 4; + this.XferID = newObjXferID; + return pos - startPos; + } } + diff --git a/lib/classes/packets/CopyInventoryFromNotecard.ts b/lib/classes/packets/CopyInventoryFromNotecard.ts index ff0ac25..e0d72c4 100644 --- a/lib/classes/packets/CopyInventoryFromNotecard.ts +++ b/lib/classes/packets/CopyInventoryFromNotecard.ts @@ -28,4 +28,74 @@ export class CopyInventoryFromNotecardPacket implements Packet return ((32) * this.InventoryData.length) + 65; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.NotecardData['NotecardItemID'].writeToBuffer(buf, pos); + pos += 16; + this.NotecardData['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.InventoryData.length; + buf.writeUInt8(this.InventoryData.length, pos++); + for (let i = 0; i < count; i++) + { + this.InventoryData[i]['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData[i]['FolderID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjNotecardData: { + NotecardItemID: UUID, + ObjectID: UUID + } = { + NotecardItemID: UUID.zero(), + ObjectID: UUID.zero() + }; + newObjNotecardData['NotecardItemID'] = new UUID(buf, pos); + pos += 16; + newObjNotecardData['ObjectID'] = new UUID(buf, pos); + pos += 16; + this.NotecardData = newObjNotecardData; + const count = buf.readUInt8(pos++); + this.InventoryData = []; + for (let i = 0; i < count; i++) + { + const newObjInventoryData: { + ItemID: UUID, + FolderID: UUID + } = { + ItemID: UUID.zero(), + FolderID: UUID.zero() + }; + newObjInventoryData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['FolderID'] = new UUID(buf, pos); + pos += 16; + this.InventoryData.push(newObjInventoryData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/CopyInventoryItem.ts b/lib/classes/packets/CopyInventoryItem.ts index ff85ffb..1577c49 100644 --- a/lib/classes/packets/CopyInventoryItem.ts +++ b/lib/classes/packets/CopyInventoryItem.ts @@ -37,4 +37,76 @@ export class CopyInventoryItemPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.InventoryData.length; + buf.writeUInt8(this.InventoryData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.InventoryData[i]['CallbackID'], pos); + pos += 4; + this.InventoryData[i]['OldAgentID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData[i]['OldItemID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData[i]['NewFolderID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.InventoryData[i]['NewName'], pos); + pos += this.InventoryData[i]['NewName'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.InventoryData = []; + for (let i = 0; i < count; i++) + { + const newObjInventoryData: { + CallbackID: number, + OldAgentID: UUID, + OldItemID: UUID, + NewFolderID: UUID, + NewName: string + } = { + CallbackID: 0, + OldAgentID: UUID.zero(), + OldItemID: UUID.zero(), + NewFolderID: UUID.zero(), + NewName: '' + }; + newObjInventoryData['CallbackID'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['OldAgentID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['OldItemID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['NewFolderID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['NewName'] = buf.toString('utf8', pos, length); + pos += length; + this.InventoryData.push(newObjInventoryData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/CreateGroupReply.ts b/lib/classes/packets/CreateGroupReply.ts index 1973635..303f60e 100644 --- a/lib/classes/packets/CreateGroupReply.ts +++ b/lib/classes/packets/CreateGroupReply.ts @@ -24,4 +24,46 @@ export class CreateGroupReplyPacket implements Packet return (this.ReplyData['Message'].length + 1) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.ReplyData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.ReplyData['Success']) ? 1 : 0, pos++); + buf.write(this.ReplyData['Message'], pos); + pos += this.ReplyData['Message'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjReplyData: { + GroupID: UUID, + Success: boolean, + Message: string + } = { + GroupID: UUID.zero(), + Success: false, + Message: '' + }; + newObjReplyData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjReplyData['Success'] = (buf.readUInt8(pos++) === 1); + newObjReplyData['Message'] = buf.toString('utf8', pos, length); + pos += length; + this.ReplyData = newObjReplyData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/CreateGroupRequest.ts b/lib/classes/packets/CreateGroupRequest.ts index fa01944..1976880 100644 --- a/lib/classes/packets/CreateGroupRequest.ts +++ b/lib/classes/packets/CreateGroupRequest.ts @@ -30,4 +30,76 @@ export class CreateGroupRequestPacket implements Packet return (this.GroupData['Name'].length + 1 + this.GroupData['Charter'].length + 2) + 56; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.GroupData['Name'], pos); + pos += this.GroupData['Name'].length; + buf.write(this.GroupData['Charter'], pos); + pos += this.GroupData['Charter'].length; + buf.writeUInt8((this.GroupData['ShowInList']) ? 1 : 0, pos++); + this.GroupData['InsigniaID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.GroupData['MembershipFee'], pos); + pos += 4; + buf.writeUInt8((this.GroupData['OpenEnrollment']) ? 1 : 0, pos++); + buf.writeUInt8((this.GroupData['AllowPublish']) ? 1 : 0, pos++); + buf.writeUInt8((this.GroupData['MaturePublish']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjGroupData: { + Name: string, + Charter: string, + ShowInList: boolean, + InsigniaID: UUID, + MembershipFee: number, + OpenEnrollment: boolean, + AllowPublish: boolean, + MaturePublish: boolean + } = { + Name: '', + Charter: '', + ShowInList: false, + InsigniaID: UUID.zero(), + MembershipFee: 0, + OpenEnrollment: false, + AllowPublish: false, + MaturePublish: false + }; + newObjGroupData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjGroupData['Charter'] = buf.toString('utf8', pos, length); + pos += length; + newObjGroupData['ShowInList'] = (buf.readUInt8(pos++) === 1); + newObjGroupData['InsigniaID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['MembershipFee'] = buf.readInt32LE(pos); + pos += 4; + newObjGroupData['OpenEnrollment'] = (buf.readUInt8(pos++) === 1); + newObjGroupData['AllowPublish'] = (buf.readUInt8(pos++) === 1); + newObjGroupData['MaturePublish'] = (buf.readUInt8(pos++) === 1); + this.GroupData = newObjGroupData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/CreateGroupRequestExtended.ts b/lib/classes/packets/CreateGroupRequestExtended.ts index ad86e03..1818081 100644 --- a/lib/classes/packets/CreateGroupRequestExtended.ts +++ b/lib/classes/packets/CreateGroupRequestExtended.ts @@ -31,4 +31,82 @@ export class CreateGroupRequestExtendedPacket implements Packet return (this.GroupData['Name'].length + 1 + this.GroupData['Charter'].length + 2) + 60; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.AgentData['GroupLimit'], pos); + pos += 4; + buf.write(this.GroupData['Name'], pos); + pos += this.GroupData['Name'].length; + buf.write(this.GroupData['Charter'], pos); + pos += this.GroupData['Charter'].length; + buf.writeUInt8((this.GroupData['ShowInList']) ? 1 : 0, pos++); + this.GroupData['InsigniaID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.GroupData['MembershipFee'], pos); + pos += 4; + buf.writeUInt8((this.GroupData['OpenEnrollment']) ? 1 : 0, pos++); + buf.writeUInt8((this.GroupData['AllowPublish']) ? 1 : 0, pos++); + buf.writeUInt8((this.GroupData['MaturePublish']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + GroupLimit: number + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + GroupLimit: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupLimit'] = buf.readInt32LE(pos); + pos += 4; + this.AgentData = newObjAgentData; + const newObjGroupData: { + Name: string, + Charter: string, + ShowInList: boolean, + InsigniaID: UUID, + MembershipFee: number, + OpenEnrollment: boolean, + AllowPublish: boolean, + MaturePublish: boolean + } = { + Name: '', + Charter: '', + ShowInList: false, + InsigniaID: UUID.zero(), + MembershipFee: 0, + OpenEnrollment: false, + AllowPublish: false, + MaturePublish: false + }; + newObjGroupData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjGroupData['Charter'] = buf.toString('utf8', pos, length); + pos += length; + newObjGroupData['ShowInList'] = (buf.readUInt8(pos++) === 1); + newObjGroupData['InsigniaID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['MembershipFee'] = buf.readInt32LE(pos); + pos += 4; + newObjGroupData['OpenEnrollment'] = (buf.readUInt8(pos++) === 1); + newObjGroupData['AllowPublish'] = (buf.readUInt8(pos++) === 1); + newObjGroupData['MaturePublish'] = (buf.readUInt8(pos++) === 1); + this.GroupData = newObjGroupData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/CreateInventoryFolder.ts b/lib/classes/packets/CreateInventoryFolder.ts index 2fa3b03..73f6fad 100644 --- a/lib/classes/packets/CreateInventoryFolder.ts +++ b/lib/classes/packets/CreateInventoryFolder.ts @@ -26,4 +26,58 @@ export class CreateInventoryFolderPacket implements Packet return (this.FolderData['Name'].length + 1) + 65; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.FolderData['FolderID'].writeToBuffer(buf, pos); + pos += 16; + this.FolderData['ParentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt8(this.FolderData['Type'], pos++); + buf.write(this.FolderData['Name'], pos); + pos += this.FolderData['Name'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjFolderData: { + FolderID: UUID, + ParentID: UUID, + Type: number, + Name: string + } = { + FolderID: UUID.zero(), + ParentID: UUID.zero(), + Type: 0, + Name: '' + }; + newObjFolderData['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjFolderData['ParentID'] = new UUID(buf, pos); + pos += 16; + newObjFolderData['Type'] = buf.readInt8(pos++); + newObjFolderData['Name'] = buf.toString('utf8', pos, length); + pos += length; + this.FolderData = newObjFolderData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/CreateInventoryItem.ts b/lib/classes/packets/CreateInventoryItem.ts index fc87e1f..27ff9c5 100644 --- a/lib/classes/packets/CreateInventoryItem.ts +++ b/lib/classes/packets/CreateInventoryItem.ts @@ -31,4 +31,84 @@ export class CreateInventoryItemPacket implements Packet return (this.InventoryBlock['Name'].length + 1 + this.InventoryBlock['Description'].length + 1) + 75; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.InventoryBlock['CallbackID'], pos); + pos += 4; + this.InventoryBlock['FolderID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryBlock['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.InventoryBlock['NextOwnerMask'], pos); + pos += 4; + buf.writeInt8(this.InventoryBlock['Type'], pos++); + buf.writeInt8(this.InventoryBlock['InvType'], pos++); + buf.writeUInt8(this.InventoryBlock['WearableType'], pos++); + buf.write(this.InventoryBlock['Name'], pos); + pos += this.InventoryBlock['Name'].length; + buf.write(this.InventoryBlock['Description'], pos); + pos += this.InventoryBlock['Description'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjInventoryBlock: { + CallbackID: number, + FolderID: UUID, + TransactionID: UUID, + NextOwnerMask: number, + Type: number, + InvType: number, + WearableType: number, + Name: string, + Description: string + } = { + CallbackID: 0, + FolderID: UUID.zero(), + TransactionID: UUID.zero(), + NextOwnerMask: 0, + Type: 0, + InvType: 0, + WearableType: 0, + Name: '', + Description: '' + }; + newObjInventoryBlock['CallbackID'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryBlock['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryBlock['TransactionID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryBlock['NextOwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryBlock['Type'] = buf.readInt8(pos++); + newObjInventoryBlock['InvType'] = buf.readInt8(pos++); + newObjInventoryBlock['WearableType'] = buf.readUInt8(pos++); + newObjInventoryBlock['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjInventoryBlock['Description'] = buf.toString('utf8', pos, length); + pos += length; + this.InventoryBlock = newObjInventoryBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/CreateLandmarkForEvent.ts b/lib/classes/packets/CreateLandmarkForEvent.ts index 80476fb..0e05fc4 100644 --- a/lib/classes/packets/CreateLandmarkForEvent.ts +++ b/lib/classes/packets/CreateLandmarkForEvent.ts @@ -27,4 +27,58 @@ export class CreateLandmarkForEventPacket implements Packet return (this.InventoryBlock['Name'].length + 1) + 52; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.EventData['EventID'], pos); + pos += 4; + this.InventoryBlock['FolderID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.InventoryBlock['Name'], pos); + pos += this.InventoryBlock['Name'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjEventData: { + EventID: number + } = { + EventID: 0 + }; + newObjEventData['EventID'] = buf.readUInt32LE(pos); + pos += 4; + this.EventData = newObjEventData; + const newObjInventoryBlock: { + FolderID: UUID, + Name: string + } = { + FolderID: UUID.zero(), + Name: '' + }; + newObjInventoryBlock['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryBlock['Name'] = buf.toString('utf8', pos, length); + pos += length; + this.InventoryBlock = newObjInventoryBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/CreateNewOutfitAttachments.ts b/lib/classes/packets/CreateNewOutfitAttachments.ts index 64913fa..835b7a9 100644 --- a/lib/classes/packets/CreateNewOutfitAttachments.ts +++ b/lib/classes/packets/CreateNewOutfitAttachments.ts @@ -27,4 +27,68 @@ export class CreateNewOutfitAttachmentsPacket implements Packet return ((32) * this.ObjectData.length) + 49; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.HeaderData['NewFolderID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + this.ObjectData[i]['OldItemID'].writeToBuffer(buf, pos); + pos += 16; + this.ObjectData[i]['OldFolderID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjHeaderData: { + NewFolderID: UUID + } = { + NewFolderID: UUID.zero() + }; + newObjHeaderData['NewFolderID'] = new UUID(buf, pos); + pos += 16; + this.HeaderData = newObjHeaderData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + OldItemID: UUID, + OldFolderID: UUID + } = { + OldItemID: UUID.zero(), + OldFolderID: UUID.zero() + }; + newObjObjectData['OldItemID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['OldFolderID'] = new UUID(buf, pos); + pos += 16; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/CreateTrustedCircuit.ts b/lib/classes/packets/CreateTrustedCircuit.ts index ccafe13..b559358 100644 --- a/lib/classes/packets/CreateTrustedCircuit.ts +++ b/lib/classes/packets/CreateTrustedCircuit.ts @@ -20,4 +20,32 @@ export class CreateTrustedCircuitPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.DataBlock['EndPointID'].writeToBuffer(buf, pos); + pos += 16; + this.DataBlock['Digest'].copy(buf, pos); + pos += 32; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjDataBlock: { + EndPointID: UUID, + Digest: Buffer + } = { + EndPointID: UUID.zero(), + Digest: Buffer.allocUnsafe(0) + }; + newObjDataBlock['EndPointID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['Digest'] = buf.slice(pos, pos + 32); + pos += 32; + this.DataBlock = newObjDataBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/CrossedRegion.ts b/lib/classes/packets/CrossedRegion.ts index efd7f6f..648151a 100644 --- a/lib/classes/packets/CrossedRegion.ts +++ b/lib/classes/packets/CrossedRegion.ts @@ -33,4 +33,78 @@ export class CrossedRegionPacket implements Packet return (this.RegionData['SeedCapability'].length + 2) + 70; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.RegionData['SimIP'].writeToBuffer(buf, pos); + pos += 4; + buf.writeUInt16LE(this.RegionData['SimPort'], pos); + pos += 2; + buf.writeInt32LE(this.RegionData['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.RegionData['RegionHandle'].high, pos); + pos += 4; + buf.write(this.RegionData['SeedCapability'], pos); + pos += this.RegionData['SeedCapability'].length; + this.Info['Position'].writeToBuffer(buf, pos, false); + pos += 12; + this.Info['LookAt'].writeToBuffer(buf, pos, false); + pos += 12; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjRegionData: { + SimIP: IPAddress, + SimPort: number, + RegionHandle: Long, + SeedCapability: string + } = { + SimIP: IPAddress.zero(), + SimPort: 0, + RegionHandle: Long.ZERO, + SeedCapability: '' + }; + newObjRegionData['SimIP'] = new IPAddress(buf, pos); + pos += 4; + newObjRegionData['SimPort'] = buf.readUInt16LE(pos); + pos += 2; + newObjRegionData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjRegionData['SeedCapability'] = buf.toString('utf8', pos, length); + pos += length; + this.RegionData = newObjRegionData; + const newObjInfo: { + Position: Vector3, + LookAt: Vector3 + } = { + Position: Vector3.getZero(), + LookAt: Vector3.getZero() + }; + newObjInfo['Position'] = new Vector3(buf, pos, false); + pos += 12; + newObjInfo['LookAt'] = new Vector3(buf, pos, false); + pos += 12; + this.Info = newObjInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/DataHomeLocationReply.ts b/lib/classes/packets/DataHomeLocationReply.ts index be8e39d..5aa86de 100644 --- a/lib/classes/packets/DataHomeLocationReply.ts +++ b/lib/classes/packets/DataHomeLocationReply.ts @@ -24,4 +24,46 @@ export class DataHomeLocationReplyPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Info['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.Info['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.Info['RegionHandle'].high, pos); + pos += 4; + this.Info['Position'].writeToBuffer(buf, pos, false); + pos += 12; + this.Info['LookAt'].writeToBuffer(buf, pos, false); + pos += 12; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjInfo: { + AgentID: UUID, + RegionHandle: Long, + Position: Vector3, + LookAt: Vector3 + } = { + AgentID: UUID.zero(), + RegionHandle: Long.ZERO, + Position: Vector3.getZero(), + LookAt: Vector3.getZero() + }; + newObjInfo['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjInfo['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjInfo['Position'] = new Vector3(buf, pos, false); + pos += 12; + newObjInfo['LookAt'] = new Vector3(buf, pos, false); + pos += 12; + this.Info = newObjInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/DataHomeLocationRequest.ts b/lib/classes/packets/DataHomeLocationRequest.ts index ab99881..970bbc2 100644 --- a/lib/classes/packets/DataHomeLocationRequest.ts +++ b/lib/classes/packets/DataHomeLocationRequest.ts @@ -23,4 +23,42 @@ export class DataHomeLocationRequestPacket implements Packet return 24; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Info['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.Info['KickedFromEstateID'], pos); + pos += 4; + buf.writeUInt32LE(this.AgentInfo['AgentEffectiveMaturity'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjInfo: { + AgentID: UUID, + KickedFromEstateID: number + } = { + AgentID: UUID.zero(), + KickedFromEstateID: 0 + }; + newObjInfo['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjInfo['KickedFromEstateID'] = buf.readUInt32LE(pos); + pos += 4; + this.Info = newObjInfo; + const newObjAgentInfo: { + AgentEffectiveMaturity: number + } = { + AgentEffectiveMaturity: 0 + }; + newObjAgentInfo['AgentEffectiveMaturity'] = buf.readUInt32LE(pos); + pos += 4; + this.AgentInfo = newObjAgentInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/DataServerLogout.ts b/lib/classes/packets/DataServerLogout.ts index 2a04fa6..064ead9 100644 --- a/lib/classes/packets/DataServerLogout.ts +++ b/lib/classes/packets/DataServerLogout.ts @@ -23,4 +23,42 @@ export class DataServerLogoutPacket implements Packet return 37; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.UserData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.UserData['ViewerIP'].writeToBuffer(buf, pos); + pos += 4; + buf.writeUInt8((this.UserData['Disconnect']) ? 1 : 0, pos++); + this.UserData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjUserData: { + AgentID: UUID, + ViewerIP: IPAddress, + Disconnect: boolean, + SessionID: UUID + } = { + AgentID: UUID.zero(), + ViewerIP: IPAddress.zero(), + Disconnect: false, + SessionID: UUID.zero() + }; + newObjUserData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjUserData['ViewerIP'] = new IPAddress(buf, pos); + pos += 4; + newObjUserData['Disconnect'] = (buf.readUInt8(pos++) === 1); + newObjUserData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.UserData = newObjUserData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/DeRezAck.ts b/lib/classes/packets/DeRezAck.ts index 8bf9b17..2b98afb 100644 --- a/lib/classes/packets/DeRezAck.ts +++ b/lib/classes/packets/DeRezAck.ts @@ -20,4 +20,30 @@ export class DeRezAckPacket implements Packet return 17; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.TransactionData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.TransactionData['Success']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjTransactionData: { + TransactionID: UUID, + Success: boolean + } = { + TransactionID: UUID.zero(), + Success: false + }; + newObjTransactionData['TransactionID'] = new UUID(buf, pos); + pos += 16; + newObjTransactionData['Success'] = (buf.readUInt8(pos++) === 1); + this.TransactionData = newObjTransactionData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/DeRezObject.ts b/lib/classes/packets/DeRezObject.ts index 587e5f4..8b962f5 100644 --- a/lib/classes/packets/DeRezObject.ts +++ b/lib/classes/packets/DeRezObject.ts @@ -31,4 +31,86 @@ export class DeRezObjectPacket implements Packet return ((4) * this.ObjectData.length) + 84; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentBlock['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.AgentBlock['Destination'], pos++); + this.AgentBlock['DestinationID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentBlock['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.AgentBlock['PacketCount'], pos++); + buf.writeUInt8(this.AgentBlock['PacketNumber'], pos++); + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjAgentBlock: { + GroupID: UUID, + Destination: number, + DestinationID: UUID, + TransactionID: UUID, + PacketCount: number, + PacketNumber: number + } = { + GroupID: UUID.zero(), + Destination: 0, + DestinationID: UUID.zero(), + TransactionID: UUID.zero(), + PacketCount: 0, + PacketNumber: 0 + }; + newObjAgentBlock['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjAgentBlock['Destination'] = buf.readUInt8(pos++); + newObjAgentBlock['DestinationID'] = new UUID(buf, pos); + pos += 16; + newObjAgentBlock['TransactionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentBlock['PacketCount'] = buf.readUInt8(pos++); + newObjAgentBlock['PacketNumber'] = buf.readUInt8(pos++); + this.AgentBlock = newObjAgentBlock; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number + } = { + ObjectLocalID: 0 + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/DeactivateGestures.ts b/lib/classes/packets/DeactivateGestures.ts index cc7e43d..5c7309e 100644 --- a/lib/classes/packets/DeactivateGestures.ts +++ b/lib/classes/packets/DeactivateGestures.ts @@ -25,4 +25,64 @@ export class DeactivateGesturesPacket implements Packet return ((20) * this.Data.length) + 37; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AgentData['Flags'], pos); + pos += 4; + const count = this.Data.length; + buf.writeUInt8(this.Data.length, pos++); + for (let i = 0; i < count; i++) + { + this.Data[i]['ItemID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.Data[i]['GestureFlags'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + Flags: number + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + Flags: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.Data = []; + for (let i = 0; i < count; i++) + { + const newObjData: { + ItemID: UUID, + GestureFlags: number + } = { + ItemID: UUID.zero(), + GestureFlags: 0 + }; + newObjData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjData['GestureFlags'] = buf.readUInt32LE(pos); + pos += 4; + this.Data.push(newObjData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/DeclineCallingCard.ts b/lib/classes/packets/DeclineCallingCard.ts index cf058c0..8e3b314 100644 --- a/lib/classes/packets/DeclineCallingCard.ts +++ b/lib/classes/packets/DeclineCallingCard.ts @@ -23,4 +23,42 @@ export class DeclineCallingCardPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.TransactionBlock['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjTransactionBlock: { + TransactionID: UUID + } = { + TransactionID: UUID.zero() + }; + newObjTransactionBlock['TransactionID'] = new UUID(buf, pos); + pos += 16; + this.TransactionBlock = newObjTransactionBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/DeclineFriendship.ts b/lib/classes/packets/DeclineFriendship.ts index d773bcb..d606f40 100644 --- a/lib/classes/packets/DeclineFriendship.ts +++ b/lib/classes/packets/DeclineFriendship.ts @@ -23,4 +23,42 @@ export class DeclineFriendshipPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.TransactionBlock['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjTransactionBlock: { + TransactionID: UUID + } = { + TransactionID: UUID.zero() + }; + newObjTransactionBlock['TransactionID'] = new UUID(buf, pos); + pos += 16; + this.TransactionBlock = newObjTransactionBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/DenyTrustedCircuit.ts b/lib/classes/packets/DenyTrustedCircuit.ts index 73644d5..47a1e8a 100644 --- a/lib/classes/packets/DenyTrustedCircuit.ts +++ b/lib/classes/packets/DenyTrustedCircuit.ts @@ -19,4 +19,26 @@ export class DenyTrustedCircuitPacket implements Packet return 16; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.DataBlock['EndPointID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjDataBlock: { + EndPointID: UUID + } = { + EndPointID: UUID.zero() + }; + newObjDataBlock['EndPointID'] = new UUID(buf, pos); + pos += 16; + this.DataBlock = newObjDataBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/DerezContainer.ts b/lib/classes/packets/DerezContainer.ts index c7b751a..473ab3a 100644 --- a/lib/classes/packets/DerezContainer.ts +++ b/lib/classes/packets/DerezContainer.ts @@ -20,4 +20,30 @@ export class DerezContainerPacket implements Packet return 17; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Data['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.Data['Delete']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjData: { + ObjectID: UUID, + Delete: boolean + } = { + ObjectID: UUID.zero(), + Delete: false + }; + newObjData['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjData['Delete'] = (buf.readUInt8(pos++) === 1); + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/DetachAttachmentIntoInv.ts b/lib/classes/packets/DetachAttachmentIntoInv.ts index b3ee715..d634510 100644 --- a/lib/classes/packets/DetachAttachmentIntoInv.ts +++ b/lib/classes/packets/DetachAttachmentIntoInv.ts @@ -20,4 +20,32 @@ export class DetachAttachmentIntoInvPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.ObjectData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.ObjectData['ItemID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjObjectData: { + AgentID: UUID, + ItemID: UUID + } = { + AgentID: UUID.zero(), + ItemID: UUID.zero() + }; + newObjObjectData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['ItemID'] = new UUID(buf, pos); + pos += 16; + this.ObjectData = newObjObjectData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/DirClassifiedQuery.ts b/lib/classes/packets/DirClassifiedQuery.ts index ee1af8b..3e64b33 100644 --- a/lib/classes/packets/DirClassifiedQuery.ts +++ b/lib/classes/packets/DirClassifiedQuery.ts @@ -27,4 +27,66 @@ export class DirClassifiedQueryPacket implements Packet return (this.QueryData['QueryText'].length + 1) + 60; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.QueryData['QueryText'], pos); + pos += this.QueryData['QueryText'].length; + buf.writeUInt32LE(this.QueryData['QueryFlags'], pos); + pos += 4; + buf.writeUInt32LE(this.QueryData['Category'], pos); + pos += 4; + buf.writeInt32LE(this.QueryData['QueryStart'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjQueryData: { + QueryID: UUID, + QueryText: string, + QueryFlags: number, + Category: number, + QueryStart: number + } = { + QueryID: UUID.zero(), + QueryText: '', + QueryFlags: 0, + Category: 0, + QueryStart: 0 + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + newObjQueryData['QueryText'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryData['QueryFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryData['Category'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryData['QueryStart'] = buf.readInt32LE(pos); + pos += 4; + this.QueryData = newObjQueryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/DirClassifiedQueryBackend.ts b/lib/classes/packets/DirClassifiedQueryBackend.ts index 5f760cc..b8d9007 100644 --- a/lib/classes/packets/DirClassifiedQueryBackend.ts +++ b/lib/classes/packets/DirClassifiedQueryBackend.ts @@ -28,4 +28,70 @@ export class DirClassifiedQueryBackendPacket implements Packet return (this.QueryData['QueryText'].length + 1) + 49; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.QueryData['QueryText'], pos); + pos += this.QueryData['QueryText'].length; + buf.writeUInt32LE(this.QueryData['QueryFlags'], pos); + pos += 4; + buf.writeUInt32LE(this.QueryData['Category'], pos); + pos += 4; + buf.writeUInt32LE(this.QueryData['EstateID'], pos); + pos += 4; + buf.writeUInt8((this.QueryData['Godlike']) ? 1 : 0, pos++); + buf.writeInt32LE(this.QueryData['QueryStart'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjQueryData: { + QueryID: UUID, + QueryText: string, + QueryFlags: number, + Category: number, + EstateID: number, + Godlike: boolean, + QueryStart: number + } = { + QueryID: UUID.zero(), + QueryText: '', + QueryFlags: 0, + Category: 0, + EstateID: 0, + Godlike: false, + QueryStart: 0 + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + newObjQueryData['QueryText'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryData['QueryFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryData['Category'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryData['EstateID'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryData['Godlike'] = (buf.readUInt8(pos++) === 1); + newObjQueryData['QueryStart'] = buf.readInt32LE(pos); + pos += 4; + this.QueryData = newObjQueryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/DirClassifiedReply.ts b/lib/classes/packets/DirClassifiedReply.ts index 8b8e045..30d99f9 100644 --- a/lib/classes/packets/DirClassifiedReply.ts +++ b/lib/classes/packets/DirClassifiedReply.ts @@ -43,4 +43,104 @@ export class DirClassifiedReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + let count = this.QueryReplies.length; + buf.writeUInt8(this.QueryReplies.length, pos++); + for (let i = 0; i < count; i++) + { + this.QueryReplies[i]['ClassifiedID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.QueryReplies[i]['Name'], pos); + pos += this.QueryReplies[i]['Name'].length; + buf.writeUInt8(this.QueryReplies[i]['ClassifiedFlags'], pos++); + buf.writeUInt32LE(this.QueryReplies[i]['CreationDate'], pos); + pos += 4; + buf.writeUInt32LE(this.QueryReplies[i]['ExpirationDate'], pos); + pos += 4; + buf.writeInt32LE(this.QueryReplies[i]['PriceForListing'], pos); + pos += 4; + } + count = this.StatusData.length; + buf.writeUInt8(this.StatusData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.StatusData[i]['Status'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjQueryData: { + QueryID: UUID + } = { + QueryID: UUID.zero() + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + this.QueryData = newObjQueryData; + let count = buf.readUInt8(pos++); + this.QueryReplies = []; + for (let i = 0; i < count; i++) + { + const newObjQueryReplies: { + ClassifiedID: UUID, + Name: string, + ClassifiedFlags: number, + CreationDate: number, + ExpirationDate: number, + PriceForListing: number + } = { + ClassifiedID: UUID.zero(), + Name: '', + ClassifiedFlags: 0, + CreationDate: 0, + ExpirationDate: 0, + PriceForListing: 0 + }; + newObjQueryReplies['ClassifiedID'] = new UUID(buf, pos); + pos += 16; + newObjQueryReplies['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryReplies['ClassifiedFlags'] = buf.readUInt8(pos++); + newObjQueryReplies['CreationDate'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryReplies['ExpirationDate'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryReplies['PriceForListing'] = buf.readInt32LE(pos); + pos += 4; + this.QueryReplies.push(newObjQueryReplies); + } + count = buf.readUInt8(pos++); + this.StatusData = []; + for (let i = 0; i < count; i++) + { + const newObjStatusData: { + Status: number + } = { + Status: 0 + }; + newObjStatusData['Status'] = buf.readUInt32LE(pos); + pos += 4; + this.StatusData.push(newObjStatusData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/DirEventsReply.ts b/lib/classes/packets/DirEventsReply.ts index fe129b6..698d2b4 100644 --- a/lib/classes/packets/DirEventsReply.ts +++ b/lib/classes/packets/DirEventsReply.ts @@ -43,4 +43,106 @@ export class DirEventsReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + let count = this.QueryReplies.length; + buf.writeUInt8(this.QueryReplies.length, pos++); + for (let i = 0; i < count; i++) + { + this.QueryReplies[i]['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.QueryReplies[i]['Name'], pos); + pos += this.QueryReplies[i]['Name'].length; + buf.writeUInt32LE(this.QueryReplies[i]['EventID'], pos); + pos += 4; + buf.write(this.QueryReplies[i]['Date'], pos); + pos += this.QueryReplies[i]['Date'].length; + buf.writeUInt32LE(this.QueryReplies[i]['UnixTime'], pos); + pos += 4; + buf.writeUInt32LE(this.QueryReplies[i]['EventFlags'], pos); + pos += 4; + } + count = this.StatusData.length; + buf.writeUInt8(this.StatusData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.StatusData[i]['Status'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjQueryData: { + QueryID: UUID + } = { + QueryID: UUID.zero() + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + this.QueryData = newObjQueryData; + let count = buf.readUInt8(pos++); + this.QueryReplies = []; + for (let i = 0; i < count; i++) + { + const newObjQueryReplies: { + OwnerID: UUID, + Name: string, + EventID: number, + Date: string, + UnixTime: number, + EventFlags: number + } = { + OwnerID: UUID.zero(), + Name: '', + EventID: 0, + Date: '', + UnixTime: 0, + EventFlags: 0 + }; + newObjQueryReplies['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjQueryReplies['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryReplies['EventID'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryReplies['Date'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryReplies['UnixTime'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryReplies['EventFlags'] = buf.readUInt32LE(pos); + pos += 4; + this.QueryReplies.push(newObjQueryReplies); + } + count = buf.readUInt8(pos++); + this.StatusData = []; + for (let i = 0; i < count; i++) + { + const newObjStatusData: { + Status: number + } = { + Status: 0 + }; + newObjStatusData['Status'] = buf.readUInt32LE(pos); + pos += 4; + this.StatusData.push(newObjStatusData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/DirFindQuery.ts b/lib/classes/packets/DirFindQuery.ts index fcf8d5c..6c383ff 100644 --- a/lib/classes/packets/DirFindQuery.ts +++ b/lib/classes/packets/DirFindQuery.ts @@ -26,4 +26,60 @@ export class DirFindQueryPacket implements Packet return (this.QueryData['QueryText'].length + 1) + 56; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.QueryData['QueryText'], pos); + pos += this.QueryData['QueryText'].length; + buf.writeUInt32LE(this.QueryData['QueryFlags'], pos); + pos += 4; + buf.writeInt32LE(this.QueryData['QueryStart'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjQueryData: { + QueryID: UUID, + QueryText: string, + QueryFlags: number, + QueryStart: number + } = { + QueryID: UUID.zero(), + QueryText: '', + QueryFlags: 0, + QueryStart: 0 + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + newObjQueryData['QueryText'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryData['QueryFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryData['QueryStart'] = buf.readInt32LE(pos); + pos += 4; + this.QueryData = newObjQueryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/DirFindQueryBackend.ts b/lib/classes/packets/DirFindQueryBackend.ts index bd88075..69e9151 100644 --- a/lib/classes/packets/DirFindQueryBackend.ts +++ b/lib/classes/packets/DirFindQueryBackend.ts @@ -27,4 +27,64 @@ export class DirFindQueryBackendPacket implements Packet return (this.QueryData['QueryText'].length + 1) + 45; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.QueryData['QueryText'], pos); + pos += this.QueryData['QueryText'].length; + buf.writeUInt32LE(this.QueryData['QueryFlags'], pos); + pos += 4; + buf.writeInt32LE(this.QueryData['QueryStart'], pos); + pos += 4; + buf.writeUInt32LE(this.QueryData['EstateID'], pos); + pos += 4; + buf.writeUInt8((this.QueryData['Godlike']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjQueryData: { + QueryID: UUID, + QueryText: string, + QueryFlags: number, + QueryStart: number, + EstateID: number, + Godlike: boolean + } = { + QueryID: UUID.zero(), + QueryText: '', + QueryFlags: 0, + QueryStart: 0, + EstateID: 0, + Godlike: false + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + newObjQueryData['QueryText'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryData['QueryFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryData['QueryStart'] = buf.readInt32LE(pos); + pos += 4; + newObjQueryData['EstateID'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryData['Godlike'] = (buf.readUInt8(pos++) === 1); + this.QueryData = newObjQueryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/DirGroupsReply.ts b/lib/classes/packets/DirGroupsReply.ts index 54428e1..a8165c8 100644 --- a/lib/classes/packets/DirGroupsReply.ts +++ b/lib/classes/packets/DirGroupsReply.ts @@ -38,4 +38,74 @@ export class DirGroupsReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.QueryReplies.length; + buf.writeUInt8(this.QueryReplies.length, pos++); + for (let i = 0; i < count; i++) + { + this.QueryReplies[i]['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.QueryReplies[i]['GroupName'], pos); + pos += this.QueryReplies[i]['GroupName'].length; + buf.writeInt32LE(this.QueryReplies[i]['Members'], pos); + pos += 4; + buf.writeFloatLE(this.QueryReplies[i]['SearchOrder'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjQueryData: { + QueryID: UUID + } = { + QueryID: UUID.zero() + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + this.QueryData = newObjQueryData; + const count = buf.readUInt8(pos++); + this.QueryReplies = []; + for (let i = 0; i < count; i++) + { + const newObjQueryReplies: { + GroupID: UUID, + GroupName: string, + Members: number, + SearchOrder: number + } = { + GroupID: UUID.zero(), + GroupName: '', + Members: 0, + SearchOrder: 0 + }; + newObjQueryReplies['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjQueryReplies['GroupName'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryReplies['Members'] = buf.readInt32LE(pos); + pos += 4; + newObjQueryReplies['SearchOrder'] = buf.readFloatLE(pos); + pos += 4; + this.QueryReplies.push(newObjQueryReplies); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/DirLandQuery.ts b/lib/classes/packets/DirLandQuery.ts index 278830f..c80660c 100644 --- a/lib/classes/packets/DirLandQuery.ts +++ b/lib/classes/packets/DirLandQuery.ts @@ -28,4 +28,72 @@ export class DirLandQueryPacket implements Packet return 68; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.QueryData['QueryFlags'], pos); + pos += 4; + buf.writeUInt32LE(this.QueryData['SearchType'], pos); + pos += 4; + buf.writeInt32LE(this.QueryData['Price'], pos); + pos += 4; + buf.writeInt32LE(this.QueryData['Area'], pos); + pos += 4; + buf.writeInt32LE(this.QueryData['QueryStart'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjQueryData: { + QueryID: UUID, + QueryFlags: number, + SearchType: number, + Price: number, + Area: number, + QueryStart: number + } = { + QueryID: UUID.zero(), + QueryFlags: 0, + SearchType: 0, + Price: 0, + Area: 0, + QueryStart: 0 + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + newObjQueryData['QueryFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryData['SearchType'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryData['Price'] = buf.readInt32LE(pos); + pos += 4; + newObjQueryData['Area'] = buf.readInt32LE(pos); + pos += 4; + newObjQueryData['QueryStart'] = buf.readInt32LE(pos); + pos += 4; + this.QueryData = newObjQueryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/DirLandQueryBackend.ts b/lib/classes/packets/DirLandQueryBackend.ts index dd034ab..e6f0a92 100644 --- a/lib/classes/packets/DirLandQueryBackend.ts +++ b/lib/classes/packets/DirLandQueryBackend.ts @@ -29,4 +29,76 @@ export class DirLandQueryBackendPacket implements Packet return 57; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.QueryData['QueryFlags'], pos); + pos += 4; + buf.writeUInt32LE(this.QueryData['SearchType'], pos); + pos += 4; + buf.writeInt32LE(this.QueryData['Price'], pos); + pos += 4; + buf.writeInt32LE(this.QueryData['Area'], pos); + pos += 4; + buf.writeInt32LE(this.QueryData['QueryStart'], pos); + pos += 4; + buf.writeUInt32LE(this.QueryData['EstateID'], pos); + pos += 4; + buf.writeUInt8((this.QueryData['Godlike']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjQueryData: { + QueryID: UUID, + QueryFlags: number, + SearchType: number, + Price: number, + Area: number, + QueryStart: number, + EstateID: number, + Godlike: boolean + } = { + QueryID: UUID.zero(), + QueryFlags: 0, + SearchType: 0, + Price: 0, + Area: 0, + QueryStart: 0, + EstateID: 0, + Godlike: false + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + newObjQueryData['QueryFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryData['SearchType'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryData['Price'] = buf.readInt32LE(pos); + pos += 4; + newObjQueryData['Area'] = buf.readInt32LE(pos); + pos += 4; + newObjQueryData['QueryStart'] = buf.readInt32LE(pos); + pos += 4; + newObjQueryData['EstateID'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryData['Godlike'] = (buf.readUInt8(pos++) === 1); + this.QueryData = newObjQueryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/DirLandReply.ts b/lib/classes/packets/DirLandReply.ts index 09aec1b..7bed8b9 100644 --- a/lib/classes/packets/DirLandReply.ts +++ b/lib/classes/packets/DirLandReply.ts @@ -40,4 +40,82 @@ export class DirLandReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.QueryReplies.length; + buf.writeUInt8(this.QueryReplies.length, pos++); + for (let i = 0; i < count; i++) + { + this.QueryReplies[i]['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.QueryReplies[i]['Name'], pos); + pos += this.QueryReplies[i]['Name'].length; + buf.writeUInt8((this.QueryReplies[i]['Auction']) ? 1 : 0, pos++); + buf.writeUInt8((this.QueryReplies[i]['ForSale']) ? 1 : 0, pos++); + buf.writeInt32LE(this.QueryReplies[i]['SalePrice'], pos); + pos += 4; + buf.writeInt32LE(this.QueryReplies[i]['ActualArea'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjQueryData: { + QueryID: UUID + } = { + QueryID: UUID.zero() + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + this.QueryData = newObjQueryData; + const count = buf.readUInt8(pos++); + this.QueryReplies = []; + for (let i = 0; i < count; i++) + { + const newObjQueryReplies: { + ParcelID: UUID, + Name: string, + Auction: boolean, + ForSale: boolean, + SalePrice: number, + ActualArea: number + } = { + ParcelID: UUID.zero(), + Name: '', + Auction: false, + ForSale: false, + SalePrice: 0, + ActualArea: 0 + }; + newObjQueryReplies['ParcelID'] = new UUID(buf, pos); + pos += 16; + newObjQueryReplies['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryReplies['Auction'] = (buf.readUInt8(pos++) === 1); + newObjQueryReplies['ForSale'] = (buf.readUInt8(pos++) === 1); + newObjQueryReplies['SalePrice'] = buf.readInt32LE(pos); + pos += 4; + newObjQueryReplies['ActualArea'] = buf.readInt32LE(pos); + pos += 4; + this.QueryReplies.push(newObjQueryReplies); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/DirPeopleReply.ts b/lib/classes/packets/DirPeopleReply.ts index c86261b..e71e33b 100644 --- a/lib/classes/packets/DirPeopleReply.ts +++ b/lib/classes/packets/DirPeopleReply.ts @@ -40,4 +40,84 @@ export class DirPeopleReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.QueryReplies.length; + buf.writeUInt8(this.QueryReplies.length, pos++); + for (let i = 0; i < count; i++) + { + this.QueryReplies[i]['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.QueryReplies[i]['FirstName'], pos); + pos += this.QueryReplies[i]['FirstName'].length; + buf.write(this.QueryReplies[i]['LastName'], pos); + pos += this.QueryReplies[i]['LastName'].length; + buf.write(this.QueryReplies[i]['Group'], pos); + pos += this.QueryReplies[i]['Group'].length; + buf.writeUInt8((this.QueryReplies[i]['Online']) ? 1 : 0, pos++); + buf.writeInt32LE(this.QueryReplies[i]['Reputation'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjQueryData: { + QueryID: UUID + } = { + QueryID: UUID.zero() + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + this.QueryData = newObjQueryData; + const count = buf.readUInt8(pos++); + this.QueryReplies = []; + for (let i = 0; i < count; i++) + { + const newObjQueryReplies: { + AgentID: UUID, + FirstName: string, + LastName: string, + Group: string, + Online: boolean, + Reputation: number + } = { + AgentID: UUID.zero(), + FirstName: '', + LastName: '', + Group: '', + Online: false, + Reputation: 0 + }; + newObjQueryReplies['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjQueryReplies['FirstName'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryReplies['LastName'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryReplies['Group'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryReplies['Online'] = (buf.readUInt8(pos++) === 1); + newObjQueryReplies['Reputation'] = buf.readInt32LE(pos); + pos += 4; + this.QueryReplies.push(newObjQueryReplies); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/DirPlacesQuery.ts b/lib/classes/packets/DirPlacesQuery.ts index 6b2d98b..0efdb1d 100644 --- a/lib/classes/packets/DirPlacesQuery.ts +++ b/lib/classes/packets/DirPlacesQuery.ts @@ -28,4 +28,70 @@ export class DirPlacesQueryPacket implements Packet return (this.QueryData['QueryText'].length + 1 + this.QueryData['SimName'].length + 1) + 57; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.QueryData['QueryText'], pos); + pos += this.QueryData['QueryText'].length; + buf.writeUInt32LE(this.QueryData['QueryFlags'], pos); + pos += 4; + buf.writeInt8(this.QueryData['Category'], pos++); + buf.write(this.QueryData['SimName'], pos); + pos += this.QueryData['SimName'].length; + buf.writeInt32LE(this.QueryData['QueryStart'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjQueryData: { + QueryID: UUID, + QueryText: string, + QueryFlags: number, + Category: number, + SimName: string, + QueryStart: number + } = { + QueryID: UUID.zero(), + QueryText: '', + QueryFlags: 0, + Category: 0, + SimName: '', + QueryStart: 0 + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + newObjQueryData['QueryText'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryData['QueryFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryData['Category'] = buf.readInt8(pos++); + newObjQueryData['SimName'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryData['QueryStart'] = buf.readInt32LE(pos); + pos += 4; + this.QueryData = newObjQueryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/DirPlacesQueryBackend.ts b/lib/classes/packets/DirPlacesQueryBackend.ts index 9e2d92b..708f634 100644 --- a/lib/classes/packets/DirPlacesQueryBackend.ts +++ b/lib/classes/packets/DirPlacesQueryBackend.ts @@ -29,4 +29,74 @@ export class DirPlacesQueryBackendPacket implements Packet return (this.QueryData['QueryText'].length + 1 + this.QueryData['SimName'].length + 1) + 46; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.QueryData['QueryText'], pos); + pos += this.QueryData['QueryText'].length; + buf.writeUInt32LE(this.QueryData['QueryFlags'], pos); + pos += 4; + buf.writeInt8(this.QueryData['Category'], pos++); + buf.write(this.QueryData['SimName'], pos); + pos += this.QueryData['SimName'].length; + buf.writeUInt32LE(this.QueryData['EstateID'], pos); + pos += 4; + buf.writeUInt8((this.QueryData['Godlike']) ? 1 : 0, pos++); + buf.writeInt32LE(this.QueryData['QueryStart'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjQueryData: { + QueryID: UUID, + QueryText: string, + QueryFlags: number, + Category: number, + SimName: string, + EstateID: number, + Godlike: boolean, + QueryStart: number + } = { + QueryID: UUID.zero(), + QueryText: '', + QueryFlags: 0, + Category: 0, + SimName: '', + EstateID: 0, + Godlike: false, + QueryStart: 0 + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + newObjQueryData['QueryText'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryData['QueryFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryData['Category'] = buf.readInt8(pos++); + newObjQueryData['SimName'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryData['EstateID'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryData['Godlike'] = (buf.readUInt8(pos++) === 1); + newObjQueryData['QueryStart'] = buf.readInt32LE(pos); + pos += 4; + this.QueryData = newObjQueryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/DirPlacesReply.ts b/lib/classes/packets/DirPlacesReply.ts index 599cd88..4fbe505 100644 --- a/lib/classes/packets/DirPlacesReply.ts +++ b/lib/classes/packets/DirPlacesReply.ts @@ -42,4 +42,106 @@ export class DirPlacesReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + let count = this.QueryData.length; + buf.writeUInt8(this.QueryData.length, pos++); + for (let i = 0; i < count; i++) + { + this.QueryData[i]['QueryID'].writeToBuffer(buf, pos); + pos += 16; + } + count = this.QueryReplies.length; + buf.writeUInt8(this.QueryReplies.length, pos++); + for (let i = 0; i < count; i++) + { + this.QueryReplies[i]['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.QueryReplies[i]['Name'], pos); + pos += this.QueryReplies[i]['Name'].length; + buf.writeUInt8((this.QueryReplies[i]['ForSale']) ? 1 : 0, pos++); + buf.writeUInt8((this.QueryReplies[i]['Auction']) ? 1 : 0, pos++); + buf.writeFloatLE(this.QueryReplies[i]['Dwell'], pos); + pos += 4; + } + count = this.StatusData.length; + buf.writeUInt8(this.StatusData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.StatusData[i]['Status'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + let count = buf.readUInt8(pos++); + this.QueryData = []; + for (let i = 0; i < count; i++) + { + const newObjQueryData: { + QueryID: UUID + } = { + QueryID: UUID.zero() + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + this.QueryData.push(newObjQueryData); + } + count = buf.readUInt8(pos++); + this.QueryReplies = []; + for (let i = 0; i < count; i++) + { + const newObjQueryReplies: { + ParcelID: UUID, + Name: string, + ForSale: boolean, + Auction: boolean, + Dwell: number + } = { + ParcelID: UUID.zero(), + Name: '', + ForSale: false, + Auction: false, + Dwell: 0 + }; + newObjQueryReplies['ParcelID'] = new UUID(buf, pos); + pos += 16; + newObjQueryReplies['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryReplies['ForSale'] = (buf.readUInt8(pos++) === 1); + newObjQueryReplies['Auction'] = (buf.readUInt8(pos++) === 1); + newObjQueryReplies['Dwell'] = buf.readFloatLE(pos); + pos += 4; + this.QueryReplies.push(newObjQueryReplies); + } + count = buf.readUInt8(pos++); + this.StatusData = []; + for (let i = 0; i < count; i++) + { + const newObjStatusData: { + Status: number + } = { + Status: 0 + }; + newObjStatusData['Status'] = buf.readUInt32LE(pos); + pos += 4; + this.StatusData.push(newObjStatusData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/DirPopularQuery.ts b/lib/classes/packets/DirPopularQuery.ts index e741317..cf750f0 100644 --- a/lib/classes/packets/DirPopularQuery.ts +++ b/lib/classes/packets/DirPopularQuery.ts @@ -24,4 +24,48 @@ export class DirPopularQueryPacket implements Packet return 52; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.QueryData['QueryFlags'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjQueryData: { + QueryID: UUID, + QueryFlags: number + } = { + QueryID: UUID.zero(), + QueryFlags: 0 + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + newObjQueryData['QueryFlags'] = buf.readUInt32LE(pos); + pos += 4; + this.QueryData = newObjQueryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/DirPopularQueryBackend.ts b/lib/classes/packets/DirPopularQueryBackend.ts index e870f93..c0b1897 100644 --- a/lib/classes/packets/DirPopularQueryBackend.ts +++ b/lib/classes/packets/DirPopularQueryBackend.ts @@ -25,4 +25,52 @@ export class DirPopularQueryBackendPacket implements Packet return 41; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.QueryData['QueryFlags'], pos); + pos += 4; + buf.writeUInt32LE(this.QueryData['EstateID'], pos); + pos += 4; + buf.writeUInt8((this.QueryData['Godlike']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjQueryData: { + QueryID: UUID, + QueryFlags: number, + EstateID: number, + Godlike: boolean + } = { + QueryID: UUID.zero(), + QueryFlags: 0, + EstateID: 0, + Godlike: false + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + newObjQueryData['QueryFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryData['EstateID'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryData['Godlike'] = (buf.readUInt8(pos++) === 1); + this.QueryData = newObjQueryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/DirPopularReply.ts b/lib/classes/packets/DirPopularReply.ts index 7d3d8f3..0beed87 100644 --- a/lib/classes/packets/DirPopularReply.ts +++ b/lib/classes/packets/DirPopularReply.ts @@ -37,4 +37,68 @@ export class DirPopularReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.QueryReplies.length; + buf.writeUInt8(this.QueryReplies.length, pos++); + for (let i = 0; i < count; i++) + { + this.QueryReplies[i]['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.QueryReplies[i]['Name'], pos); + pos += this.QueryReplies[i]['Name'].length; + buf.writeFloatLE(this.QueryReplies[i]['Dwell'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjQueryData: { + QueryID: UUID + } = { + QueryID: UUID.zero() + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + this.QueryData = newObjQueryData; + const count = buf.readUInt8(pos++); + this.QueryReplies = []; + for (let i = 0; i < count; i++) + { + const newObjQueryReplies: { + ParcelID: UUID, + Name: string, + Dwell: number + } = { + ParcelID: UUID.zero(), + Name: '', + Dwell: 0 + }; + newObjQueryReplies['ParcelID'] = new UUID(buf, pos); + pos += 16; + newObjQueryReplies['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryReplies['Dwell'] = buf.readFloatLE(pos); + pos += 4; + this.QueryReplies.push(newObjQueryReplies); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/DisableSimulator.ts b/lib/classes/packets/DisableSimulator.ts index 41fa65d..7d62185 100644 --- a/lib/classes/packets/DisableSimulator.ts +++ b/lib/classes/packets/DisableSimulator.ts @@ -15,4 +15,14 @@ export class DisableSimulatorPacket implements Packet return 0; } + writeToBuffer(buf: Buffer, pos: number): number + { + return 0; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + return 0; + } } + diff --git a/lib/classes/packets/EconomyData.ts b/lib/classes/packets/EconomyData.ts index 1c301a8..a90923f 100644 --- a/lib/classes/packets/EconomyData.ts +++ b/lib/classes/packets/EconomyData.ts @@ -34,4 +34,122 @@ export class EconomyDataPacket implements Packet return 68; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.Info['ObjectCapacity'], pos); + pos += 4; + buf.writeInt32LE(this.Info['ObjectCount'], pos); + pos += 4; + buf.writeInt32LE(this.Info['PriceEnergyUnit'], pos); + pos += 4; + buf.writeInt32LE(this.Info['PriceObjectClaim'], pos); + pos += 4; + buf.writeInt32LE(this.Info['PricePublicObjectDecay'], pos); + pos += 4; + buf.writeInt32LE(this.Info['PricePublicObjectDelete'], pos); + pos += 4; + buf.writeInt32LE(this.Info['PriceParcelClaim'], pos); + pos += 4; + buf.writeFloatLE(this.Info['PriceParcelClaimFactor'], pos); + pos += 4; + buf.writeInt32LE(this.Info['PriceUpload'], pos); + pos += 4; + buf.writeInt32LE(this.Info['PriceRentLight'], pos); + pos += 4; + buf.writeInt32LE(this.Info['TeleportMinPrice'], pos); + pos += 4; + buf.writeFloatLE(this.Info['TeleportPriceExponent'], pos); + pos += 4; + buf.writeFloatLE(this.Info['EnergyEfficiency'], pos); + pos += 4; + buf.writeFloatLE(this.Info['PriceObjectRent'], pos); + pos += 4; + buf.writeFloatLE(this.Info['PriceObjectScaleFactor'], pos); + pos += 4; + buf.writeInt32LE(this.Info['PriceParcelRent'], pos); + pos += 4; + buf.writeInt32LE(this.Info['PriceGroupCreate'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjInfo: { + ObjectCapacity: number, + ObjectCount: number, + PriceEnergyUnit: number, + PriceObjectClaim: number, + PricePublicObjectDecay: number, + PricePublicObjectDelete: number, + PriceParcelClaim: number, + PriceParcelClaimFactor: number, + PriceUpload: number, + PriceRentLight: number, + TeleportMinPrice: number, + TeleportPriceExponent: number, + EnergyEfficiency: number, + PriceObjectRent: number, + PriceObjectScaleFactor: number, + PriceParcelRent: number, + PriceGroupCreate: number + } = { + ObjectCapacity: 0, + ObjectCount: 0, + PriceEnergyUnit: 0, + PriceObjectClaim: 0, + PricePublicObjectDecay: 0, + PricePublicObjectDelete: 0, + PriceParcelClaim: 0, + PriceParcelClaimFactor: 0, + PriceUpload: 0, + PriceRentLight: 0, + TeleportMinPrice: 0, + TeleportPriceExponent: 0, + EnergyEfficiency: 0, + PriceObjectRent: 0, + PriceObjectScaleFactor: 0, + PriceParcelRent: 0, + PriceGroupCreate: 0 + }; + newObjInfo['ObjectCapacity'] = buf.readInt32LE(pos); + pos += 4; + newObjInfo['ObjectCount'] = buf.readInt32LE(pos); + pos += 4; + newObjInfo['PriceEnergyUnit'] = buf.readInt32LE(pos); + pos += 4; + newObjInfo['PriceObjectClaim'] = buf.readInt32LE(pos); + pos += 4; + newObjInfo['PricePublicObjectDecay'] = buf.readInt32LE(pos); + pos += 4; + newObjInfo['PricePublicObjectDelete'] = buf.readInt32LE(pos); + pos += 4; + newObjInfo['PriceParcelClaim'] = buf.readInt32LE(pos); + pos += 4; + newObjInfo['PriceParcelClaimFactor'] = buf.readFloatLE(pos); + pos += 4; + newObjInfo['PriceUpload'] = buf.readInt32LE(pos); + pos += 4; + newObjInfo['PriceRentLight'] = buf.readInt32LE(pos); + pos += 4; + newObjInfo['TeleportMinPrice'] = buf.readInt32LE(pos); + pos += 4; + newObjInfo['TeleportPriceExponent'] = buf.readFloatLE(pos); + pos += 4; + newObjInfo['EnergyEfficiency'] = buf.readFloatLE(pos); + pos += 4; + newObjInfo['PriceObjectRent'] = buf.readFloatLE(pos); + pos += 4; + newObjInfo['PriceObjectScaleFactor'] = buf.readFloatLE(pos); + pos += 4; + newObjInfo['PriceParcelRent'] = buf.readInt32LE(pos); + pos += 4; + newObjInfo['PriceGroupCreate'] = buf.readInt32LE(pos); + pos += 4; + this.Info = newObjInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/EconomyDataRequest.ts b/lib/classes/packets/EconomyDataRequest.ts index ecedbec..190e816 100644 --- a/lib/classes/packets/EconomyDataRequest.ts +++ b/lib/classes/packets/EconomyDataRequest.ts @@ -15,4 +15,14 @@ export class EconomyDataRequestPacket implements Packet return 0; } + writeToBuffer(buf: Buffer, pos: number): number + { + return 0; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + return 0; + } } + diff --git a/lib/classes/packets/EdgeDataPacket.ts b/lib/classes/packets/EdgeDataPacket.ts index 343514d..f587bae 100644 --- a/lib/classes/packets/EdgeDataPacket.ts +++ b/lib/classes/packets/EdgeDataPacket.ts @@ -20,4 +20,34 @@ export class EdgeDataPacketPacket implements Packet return (this.EdgeData['LayerData'].length + 2) + 2; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt8(this.EdgeData['LayerType'], pos++); + buf.writeUInt8(this.EdgeData['Direction'], pos++); + buf.write(this.EdgeData['LayerData'], pos); + pos += this.EdgeData['LayerData'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjEdgeData: { + LayerType: number, + Direction: number, + LayerData: string + } = { + LayerType: 0, + Direction: 0, + LayerData: '' + }; + newObjEdgeData['LayerType'] = buf.readUInt8(pos++); + newObjEdgeData['Direction'] = buf.readUInt8(pos++); + newObjEdgeData['LayerData'] = buf.toString('utf8', pos, length); + pos += length; + this.EdgeData = newObjEdgeData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/EjectGroupMemberReply.ts b/lib/classes/packets/EjectGroupMemberReply.ts index 656e759..7d26bf9 100644 --- a/lib/classes/packets/EjectGroupMemberReply.ts +++ b/lib/classes/packets/EjectGroupMemberReply.ts @@ -25,4 +25,44 @@ export class EjectGroupMemberReplyPacket implements Packet return 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.EjectData['Success']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjGroupData: { + GroupID: UUID + } = { + GroupID: UUID.zero() + }; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.GroupData = newObjGroupData; + const newObjEjectData: { + Success: boolean + } = { + Success: false + }; + newObjEjectData['Success'] = (buf.readUInt8(pos++) === 1); + this.EjectData = newObjEjectData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/EjectGroupMemberRequest.ts b/lib/classes/packets/EjectGroupMemberRequest.ts index bf241c0..7a4b676 100644 --- a/lib/classes/packets/EjectGroupMemberRequest.ts +++ b/lib/classes/packets/EjectGroupMemberRequest.ts @@ -26,4 +26,62 @@ export class EjectGroupMemberRequestPacket implements Packet return ((16) * this.EjectData.length) + 49; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.EjectData.length; + buf.writeUInt8(this.EjectData.length, pos++); + for (let i = 0; i < count; i++) + { + this.EjectData[i]['EjecteeID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjGroupData: { + GroupID: UUID + } = { + GroupID: UUID.zero() + }; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.GroupData = newObjGroupData; + const count = buf.readUInt8(pos++); + this.EjectData = []; + for (let i = 0; i < count; i++) + { + const newObjEjectData: { + EjecteeID: UUID + } = { + EjecteeID: UUID.zero() + }; + newObjEjectData['EjecteeID'] = new UUID(buf, pos); + pos += 16; + this.EjectData.push(newObjEjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/EjectUser.ts b/lib/classes/packets/EjectUser.ts index 722580a..0ec5821 100644 --- a/lib/classes/packets/EjectUser.ts +++ b/lib/classes/packets/EjectUser.ts @@ -24,4 +24,48 @@ export class EjectUserPacket implements Packet return 52; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['TargetID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.Data['Flags'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + TargetID: UUID, + Flags: number + } = { + TargetID: UUID.zero(), + Flags: 0 + }; + newObjData['TargetID'] = new UUID(buf, pos); + pos += 16; + newObjData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/EmailMessageReply.ts b/lib/classes/packets/EmailMessageReply.ts index f2dcd99..5ec2f4d 100644 --- a/lib/classes/packets/EmailMessageReply.ts +++ b/lib/classes/packets/EmailMessageReply.ts @@ -25,4 +25,62 @@ export class EmailMessageReplyPacket implements Packet return (this.DataBlock['FromAddress'].length + 1 + this.DataBlock['Subject'].length + 1 + this.DataBlock['Data'].length + 2 + this.DataBlock['MailFilter'].length + 1) + 24; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.DataBlock['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.DataBlock['More'], pos); + pos += 4; + buf.writeUInt32LE(this.DataBlock['Time'], pos); + pos += 4; + buf.write(this.DataBlock['FromAddress'], pos); + pos += this.DataBlock['FromAddress'].length; + buf.write(this.DataBlock['Subject'], pos); + pos += this.DataBlock['Subject'].length; + buf.write(this.DataBlock['Data'], pos); + pos += this.DataBlock['Data'].length; + buf.write(this.DataBlock['MailFilter'], pos); + pos += this.DataBlock['MailFilter'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjDataBlock: { + ObjectID: UUID, + More: number, + Time: number, + FromAddress: string, + Subject: string, + Data: string, + MailFilter: string + } = { + ObjectID: UUID.zero(), + More: 0, + Time: 0, + FromAddress: '', + Subject: '', + Data: '', + MailFilter: '' + }; + newObjDataBlock['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['More'] = buf.readUInt32LE(pos); + pos += 4; + newObjDataBlock['Time'] = buf.readUInt32LE(pos); + pos += 4; + newObjDataBlock['FromAddress'] = buf.toString('utf8', pos, length); + pos += length; + newObjDataBlock['Subject'] = buf.toString('utf8', pos, length); + pos += length; + newObjDataBlock['Data'] = buf.toString('utf8', pos, length); + pos += length; + newObjDataBlock['MailFilter'] = buf.toString('utf8', pos, length); + pos += length; + this.DataBlock = newObjDataBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/EmailMessageRequest.ts b/lib/classes/packets/EmailMessageRequest.ts index f4bb5f6..1973eec 100644 --- a/lib/classes/packets/EmailMessageRequest.ts +++ b/lib/classes/packets/EmailMessageRequest.ts @@ -21,4 +21,38 @@ export class EmailMessageRequestPacket implements Packet return (this.DataBlock['FromAddress'].length + 1 + this.DataBlock['Subject'].length + 1) + 16; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.DataBlock['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.DataBlock['FromAddress'], pos); + pos += this.DataBlock['FromAddress'].length; + buf.write(this.DataBlock['Subject'], pos); + pos += this.DataBlock['Subject'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjDataBlock: { + ObjectID: UUID, + FromAddress: string, + Subject: string + } = { + ObjectID: UUID.zero(), + FromAddress: '', + Subject: '' + }; + newObjDataBlock['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['FromAddress'] = buf.toString('utf8', pos, length); + pos += length; + newObjDataBlock['Subject'] = buf.toString('utf8', pos, length); + pos += length; + this.DataBlock = newObjDataBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/EnableSimulator.ts b/lib/classes/packets/EnableSimulator.ts index 0cdb315..d649d96 100644 --- a/lib/classes/packets/EnableSimulator.ts +++ b/lib/classes/packets/EnableSimulator.ts @@ -22,4 +22,40 @@ export class EnableSimulatorPacket implements Packet return 14; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.SimulatorInfo['Handle'].low, pos); + pos += 4; + buf.writeInt32LE(this.SimulatorInfo['Handle'].high, pos); + pos += 4; + this.SimulatorInfo['IP'].writeToBuffer(buf, pos); + pos += 4; + buf.writeUInt16LE(this.SimulatorInfo['Port'], pos); + pos += 2; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjSimulatorInfo: { + Handle: Long, + IP: IPAddress, + Port: number + } = { + Handle: Long.ZERO, + IP: IPAddress.zero(), + Port: 0 + }; + newObjSimulatorInfo['Handle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjSimulatorInfo['IP'] = new IPAddress(buf, pos); + pos += 4; + newObjSimulatorInfo['Port'] = buf.readUInt16LE(pos); + pos += 2; + this.SimulatorInfo = newObjSimulatorInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/Error.ts b/lib/classes/packets/Error.ts index 52b1777..71c683f 100644 --- a/lib/classes/packets/Error.ts +++ b/lib/classes/packets/Error.ts @@ -27,4 +27,66 @@ export class ErrorPacket implements Packet return (this.Data['Token'].length + 1 + this.Data['System'].length + 1 + this.Data['Message'].length + 2 + this.Data['Data'].length + 2) + 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.Data['Code'], pos); + pos += 4; + buf.write(this.Data['Token'], pos); + pos += this.Data['Token'].length; + this.Data['ID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.Data['System'], pos); + pos += this.Data['System'].length; + buf.write(this.Data['Message'], pos); + pos += this.Data['Message'].length; + buf.write(this.Data['Data'], pos); + pos += this.Data['Data'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + Code: number, + Token: string, + ID: UUID, + System: string, + Message: string, + Data: string + } = { + Code: 0, + Token: '', + ID: UUID.zero(), + System: '', + Message: '', + Data: '' + }; + newObjData['Code'] = buf.readInt32LE(pos); + pos += 4; + newObjData['Token'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['ID'] = new UUID(buf, pos); + pos += 16; + newObjData['System'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['Message'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['Data'] = buf.toString('utf8', pos, length); + pos += length; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/EstateCovenantReply.ts b/lib/classes/packets/EstateCovenantReply.ts index d98d9d1..03a4c5f 100644 --- a/lib/classes/packets/EstateCovenantReply.ts +++ b/lib/classes/packets/EstateCovenantReply.ts @@ -22,4 +22,44 @@ export class EstateCovenantReplyPacket implements Packet return (this.Data['EstateName'].length + 1) + 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Data['CovenantID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.Data['CovenantTimestamp'], pos); + pos += 4; + buf.write(this.Data['EstateName'], pos); + pos += this.Data['EstateName'].length; + this.Data['EstateOwnerID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjData: { + CovenantID: UUID, + CovenantTimestamp: number, + EstateName: string, + EstateOwnerID: UUID + } = { + CovenantID: UUID.zero(), + CovenantTimestamp: 0, + EstateName: '', + EstateOwnerID: UUID.zero() + }; + newObjData['CovenantID'] = new UUID(buf, pos); + pos += 16; + newObjData['CovenantTimestamp'] = buf.readUInt32LE(pos); + pos += 4; + newObjData['EstateName'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['EstateOwnerID'] = new UUID(buf, pos); + pos += 16; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/EstateCovenantRequest.ts b/lib/classes/packets/EstateCovenantRequest.ts index 2be51fe..31ab3e6 100644 --- a/lib/classes/packets/EstateCovenantRequest.ts +++ b/lib/classes/packets/EstateCovenantRequest.ts @@ -20,4 +20,32 @@ export class EstateCovenantRequestPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/EstateOwnerMessage.ts b/lib/classes/packets/EstateOwnerMessage.ts index a236a30..81952e0 100644 --- a/lib/classes/packets/EstateOwnerMessage.ts +++ b/lib/classes/packets/EstateOwnerMessage.ts @@ -38,4 +38,74 @@ export class EstateOwnerMessagePacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.MethodData['Method'], pos); + pos += this.MethodData['Method'].length; + this.MethodData['Invoice'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ParamList.length; + buf.writeUInt8(this.ParamList.length, pos++); + for (let i = 0; i < count; i++) + { + buf.write(this.ParamList[i]['Parameter'], pos); + pos += this.ParamList[i]['Parameter'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + TransactionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + TransactionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['TransactionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjMethodData: { + Method: string, + Invoice: UUID + } = { + Method: '', + Invoice: UUID.zero() + }; + newObjMethodData['Method'] = buf.toString('utf8', pos, length); + pos += length; + newObjMethodData['Invoice'] = new UUID(buf, pos); + pos += 16; + this.MethodData = newObjMethodData; + const count = buf.readUInt8(pos++); + this.ParamList = []; + for (let i = 0; i < count; i++) + { + const newObjParamList: { + Parameter: string + } = { + Parameter: '' + }; + newObjParamList['Parameter'] = buf.toString('utf8', pos, length); + pos += length; + this.ParamList.push(newObjParamList); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/EventGodDelete.ts b/lib/classes/packets/EventGodDelete.ts index 70c6005..e7deacc 100644 --- a/lib/classes/packets/EventGodDelete.ts +++ b/lib/classes/packets/EventGodDelete.ts @@ -29,4 +29,70 @@ export class EventGodDeletePacket implements Packet return (this.QueryData['QueryText'].length + 1) + 60; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.EventData['EventID'], pos); + pos += 4; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.QueryData['QueryText'], pos); + pos += this.QueryData['QueryText'].length; + buf.writeUInt32LE(this.QueryData['QueryFlags'], pos); + pos += 4; + buf.writeInt32LE(this.QueryData['QueryStart'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjEventData: { + EventID: number + } = { + EventID: 0 + }; + newObjEventData['EventID'] = buf.readUInt32LE(pos); + pos += 4; + this.EventData = newObjEventData; + const newObjQueryData: { + QueryID: UUID, + QueryText: string, + QueryFlags: number, + QueryStart: number + } = { + QueryID: UUID.zero(), + QueryText: '', + QueryFlags: 0, + QueryStart: 0 + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + newObjQueryData['QueryText'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryData['QueryFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryData['QueryStart'] = buf.readInt32LE(pos); + pos += 4; + this.QueryData = newObjQueryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/EventInfoReply.ts b/lib/classes/packets/EventInfoReply.ts index bd8dcba..836d162 100644 --- a/lib/classes/packets/EventInfoReply.ts +++ b/lib/classes/packets/EventInfoReply.ts @@ -35,4 +35,108 @@ export class EventInfoReplyPacket implements Packet return (this.EventData['Creator'].length + 1 + this.EventData['Name'].length + 1 + this.EventData['Category'].length + 1 + this.EventData['Desc'].length + 2 + this.EventData['Date'].length + 1 + this.EventData['SimName'].length + 1) + 64; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.EventData['EventID'], pos); + pos += 4; + buf.write(this.EventData['Creator'], pos); + pos += this.EventData['Creator'].length; + buf.write(this.EventData['Name'], pos); + pos += this.EventData['Name'].length; + buf.write(this.EventData['Category'], pos); + pos += this.EventData['Category'].length; + buf.write(this.EventData['Desc'], pos); + pos += this.EventData['Desc'].length; + buf.write(this.EventData['Date'], pos); + pos += this.EventData['Date'].length; + buf.writeUInt32LE(this.EventData['DateUTC'], pos); + pos += 4; + buf.writeUInt32LE(this.EventData['Duration'], pos); + pos += 4; + buf.writeUInt32LE(this.EventData['Cover'], pos); + pos += 4; + buf.writeUInt32LE(this.EventData['Amount'], pos); + pos += 4; + buf.write(this.EventData['SimName'], pos); + pos += this.EventData['SimName'].length; + this.EventData['GlobalPos'].writeToBuffer(buf, pos, true); + pos += 24; + buf.writeUInt32LE(this.EventData['EventFlags'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjEventData: { + EventID: number, + Creator: string, + Name: string, + Category: string, + Desc: string, + Date: string, + DateUTC: number, + Duration: number, + Cover: number, + Amount: number, + SimName: string, + GlobalPos: Vector3, + EventFlags: number + } = { + EventID: 0, + Creator: '', + Name: '', + Category: '', + Desc: '', + Date: '', + DateUTC: 0, + Duration: 0, + Cover: 0, + Amount: 0, + SimName: '', + GlobalPos: Vector3.getZero(), + EventFlags: 0 + }; + newObjEventData['EventID'] = buf.readUInt32LE(pos); + pos += 4; + newObjEventData['Creator'] = buf.toString('utf8', pos, length); + pos += length; + newObjEventData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjEventData['Category'] = buf.toString('utf8', pos, length); + pos += length; + newObjEventData['Desc'] = buf.toString('utf8', pos, length); + pos += length; + newObjEventData['Date'] = buf.toString('utf8', pos, length); + pos += length; + newObjEventData['DateUTC'] = buf.readUInt32LE(pos); + pos += 4; + newObjEventData['Duration'] = buf.readUInt32LE(pos); + pos += 4; + newObjEventData['Cover'] = buf.readUInt32LE(pos); + pos += 4; + newObjEventData['Amount'] = buf.readUInt32LE(pos); + pos += 4; + newObjEventData['SimName'] = buf.toString('utf8', pos, length); + pos += length; + newObjEventData['GlobalPos'] = new Vector3(buf, pos, true); + pos += 24; + newObjEventData['EventFlags'] = buf.readUInt32LE(pos); + pos += 4; + this.EventData = newObjEventData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/EventInfoRequest.ts b/lib/classes/packets/EventInfoRequest.ts index 33bf7f8..23d1f7e 100644 --- a/lib/classes/packets/EventInfoRequest.ts +++ b/lib/classes/packets/EventInfoRequest.ts @@ -23,4 +23,42 @@ export class EventInfoRequestPacket implements Packet return 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.EventData['EventID'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjEventData: { + EventID: number + } = { + EventID: 0 + }; + newObjEventData['EventID'] = buf.readUInt32LE(pos); + pos += 4; + this.EventData = newObjEventData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/EventLocationReply.ts b/lib/classes/packets/EventLocationReply.ts index 81f9387..505a6d6 100644 --- a/lib/classes/packets/EventLocationReply.ts +++ b/lib/classes/packets/EventLocationReply.ts @@ -25,4 +25,46 @@ export class EventLocationReplyPacket implements Packet return 45; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.EventData['Success']) ? 1 : 0, pos++); + this.EventData['RegionID'].writeToBuffer(buf, pos); + pos += 16; + this.EventData['RegionPos'].writeToBuffer(buf, pos, false); + pos += 12; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjQueryData: { + QueryID: UUID + } = { + QueryID: UUID.zero() + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + this.QueryData = newObjQueryData; + const newObjEventData: { + Success: boolean, + RegionID: UUID, + RegionPos: Vector3 + } = { + Success: false, + RegionID: UUID.zero(), + RegionPos: Vector3.getZero() + }; + newObjEventData['Success'] = (buf.readUInt8(pos++) === 1); + newObjEventData['RegionID'] = new UUID(buf, pos); + pos += 16; + newObjEventData['RegionPos'] = new Vector3(buf, pos, false); + pos += 12; + this.EventData = newObjEventData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/EventLocationRequest.ts b/lib/classes/packets/EventLocationRequest.ts index 41fbfeb..3965f80 100644 --- a/lib/classes/packets/EventLocationRequest.ts +++ b/lib/classes/packets/EventLocationRequest.ts @@ -22,4 +22,36 @@ export class EventLocationRequestPacket implements Packet return 20; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.EventData['EventID'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjQueryData: { + QueryID: UUID + } = { + QueryID: UUID.zero() + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + this.QueryData = newObjQueryData; + const newObjEventData: { + EventID: number + } = { + EventID: 0 + }; + newObjEventData['EventID'] = buf.readUInt32LE(pos); + pos += 4; + this.EventData = newObjEventData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/EventNotificationAddRequest.ts b/lib/classes/packets/EventNotificationAddRequest.ts index c6c59e0..d8760d6 100644 --- a/lib/classes/packets/EventNotificationAddRequest.ts +++ b/lib/classes/packets/EventNotificationAddRequest.ts @@ -23,4 +23,42 @@ export class EventNotificationAddRequestPacket implements Packet return 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.EventData['EventID'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjEventData: { + EventID: number + } = { + EventID: 0 + }; + newObjEventData['EventID'] = buf.readUInt32LE(pos); + pos += 4; + this.EventData = newObjEventData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/EventNotificationRemoveRequest.ts b/lib/classes/packets/EventNotificationRemoveRequest.ts index 3bb1952..0482444 100644 --- a/lib/classes/packets/EventNotificationRemoveRequest.ts +++ b/lib/classes/packets/EventNotificationRemoveRequest.ts @@ -23,4 +23,42 @@ export class EventNotificationRemoveRequestPacket implements Packet return 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.EventData['EventID'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjEventData: { + EventID: number + } = { + EventID: 0 + }; + newObjEventData['EventID'] = buf.readUInt32LE(pos); + pos += 4; + this.EventData = newObjEventData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/FeatureDisabled.ts b/lib/classes/packets/FeatureDisabled.ts index 118fad5..d27858a 100644 --- a/lib/classes/packets/FeatureDisabled.ts +++ b/lib/classes/packets/FeatureDisabled.ts @@ -21,4 +21,38 @@ export class FeatureDisabledPacket implements Packet return (this.FailureInfo['ErrorMessage'].length + 1) + 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.write(this.FailureInfo['ErrorMessage'], pos); + pos += this.FailureInfo['ErrorMessage'].length; + this.FailureInfo['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.FailureInfo['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjFailureInfo: { + ErrorMessage: string, + AgentID: UUID, + TransactionID: UUID + } = { + ErrorMessage: '', + AgentID: UUID.zero(), + TransactionID: UUID.zero() + }; + newObjFailureInfo['ErrorMessage'] = buf.toString('utf8', pos, length); + pos += length; + newObjFailureInfo['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjFailureInfo['TransactionID'] = new UUID(buf, pos); + pos += 16; + this.FailureInfo = newObjFailureInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/FetchInventory.ts b/lib/classes/packets/FetchInventory.ts index 52ffc6a..b59dfb7 100644 --- a/lib/classes/packets/FetchInventory.ts +++ b/lib/classes/packets/FetchInventory.ts @@ -24,4 +24,58 @@ export class FetchInventoryPacket implements Packet return ((32) * this.InventoryData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.InventoryData.length; + buf.writeUInt8(this.InventoryData.length, pos++); + for (let i = 0; i < count; i++) + { + this.InventoryData[i]['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData[i]['ItemID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.InventoryData = []; + for (let i = 0; i < count; i++) + { + const newObjInventoryData: { + OwnerID: UUID, + ItemID: UUID + } = { + OwnerID: UUID.zero(), + ItemID: UUID.zero() + }; + newObjInventoryData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['ItemID'] = new UUID(buf, pos); + pos += 16; + this.InventoryData.push(newObjInventoryData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/FetchInventoryDescendents.ts b/lib/classes/packets/FetchInventoryDescendents.ts index 2ba7156..044ec34 100644 --- a/lib/classes/packets/FetchInventoryDescendents.ts +++ b/lib/classes/packets/FetchInventoryDescendents.ts @@ -27,4 +27,62 @@ export class FetchInventoryDescendentsPacket implements Packet return 70; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['FolderID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.InventoryData['SortOrder'], pos); + pos += 4; + buf.writeUInt8((this.InventoryData['FetchFolders']) ? 1 : 0, pos++); + buf.writeUInt8((this.InventoryData['FetchItems']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjInventoryData: { + FolderID: UUID, + OwnerID: UUID, + SortOrder: number, + FetchFolders: boolean, + FetchItems: boolean + } = { + FolderID: UUID.zero(), + OwnerID: UUID.zero(), + SortOrder: 0, + FetchFolders: false, + FetchItems: false + }; + newObjInventoryData['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['SortOrder'] = buf.readInt32LE(pos); + pos += 4; + newObjInventoryData['FetchFolders'] = (buf.readUInt8(pos++) === 1); + newObjInventoryData['FetchItems'] = (buf.readUInt8(pos++) === 1); + this.InventoryData = newObjInventoryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/FetchInventoryReply.ts b/lib/classes/packets/FetchInventoryReply.ts index 08211c5..1c5a0d2 100644 --- a/lib/classes/packets/FetchInventoryReply.ts +++ b/lib/classes/packets/FetchInventoryReply.ts @@ -52,4 +52,158 @@ export class FetchInventoryReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.InventoryData.length; + buf.writeUInt8(this.InventoryData.length, pos++); + for (let i = 0; i < count; i++) + { + this.InventoryData[i]['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData[i]['FolderID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData[i]['CreatorID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData[i]['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData[i]['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.InventoryData[i]['BaseMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData[i]['OwnerMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData[i]['GroupMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData[i]['EveryoneMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData[i]['NextOwnerMask'], pos); + pos += 4; + buf.writeUInt8((this.InventoryData[i]['GroupOwned']) ? 1 : 0, pos++); + this.InventoryData[i]['AssetID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt8(this.InventoryData[i]['Type'], pos++); + buf.writeInt8(this.InventoryData[i]['InvType'], pos++); + buf.writeUInt32LE(this.InventoryData[i]['Flags'], pos); + pos += 4; + buf.writeUInt8(this.InventoryData[i]['SaleType'], pos++); + buf.writeInt32LE(this.InventoryData[i]['SalePrice'], pos); + pos += 4; + buf.write(this.InventoryData[i]['Name'], pos); + pos += this.InventoryData[i]['Name'].length; + buf.write(this.InventoryData[i]['Description'], pos); + pos += this.InventoryData[i]['Description'].length; + buf.writeInt32LE(this.InventoryData[i]['CreationDate'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData[i]['CRC'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.InventoryData = []; + for (let i = 0; i < count; i++) + { + const newObjInventoryData: { + ItemID: UUID, + FolderID: UUID, + CreatorID: UUID, + OwnerID: UUID, + GroupID: UUID, + BaseMask: number, + OwnerMask: number, + GroupMask: number, + EveryoneMask: number, + NextOwnerMask: number, + GroupOwned: boolean, + AssetID: UUID, + Type: number, + InvType: number, + Flags: number, + SaleType: number, + SalePrice: number, + Name: string, + Description: string, + CreationDate: number, + CRC: number + } = { + ItemID: UUID.zero(), + FolderID: UUID.zero(), + CreatorID: UUID.zero(), + OwnerID: UUID.zero(), + GroupID: UUID.zero(), + BaseMask: 0, + OwnerMask: 0, + GroupMask: 0, + EveryoneMask: 0, + NextOwnerMask: 0, + GroupOwned: false, + AssetID: UUID.zero(), + Type: 0, + InvType: 0, + Flags: 0, + SaleType: 0, + SalePrice: 0, + Name: '', + Description: '', + CreationDate: 0, + CRC: 0 + }; + newObjInventoryData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['CreatorID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['BaseMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['OwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['GroupMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['EveryoneMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['NextOwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['GroupOwned'] = (buf.readUInt8(pos++) === 1); + newObjInventoryData['AssetID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['Type'] = buf.readInt8(pos++); + newObjInventoryData['InvType'] = buf.readInt8(pos++); + newObjInventoryData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['SaleType'] = buf.readUInt8(pos++); + newObjInventoryData['SalePrice'] = buf.readInt32LE(pos); + pos += 4; + newObjInventoryData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjInventoryData['Description'] = buf.toString('utf8', pos, length); + pos += length; + newObjInventoryData['CreationDate'] = buf.readInt32LE(pos); + pos += 4; + newObjInventoryData['CRC'] = buf.readUInt32LE(pos); + pos += 4; + this.InventoryData.push(newObjInventoryData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/FindAgent.ts b/lib/classes/packets/FindAgent.ts index 01486d2..cc02eed 100644 --- a/lib/classes/packets/FindAgent.ts +++ b/lib/classes/packets/FindAgent.ts @@ -26,4 +26,64 @@ export class FindAgentPacket implements Packet return ((16) * this.LocationBlock.length) + 37; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentBlock['Hunter'].writeToBuffer(buf, pos); + pos += 16; + this.AgentBlock['Prey'].writeToBuffer(buf, pos); + pos += 16; + this.AgentBlock['SpaceIP'].writeToBuffer(buf, pos); + pos += 4; + const count = this.LocationBlock.length; + buf.writeUInt8(this.LocationBlock.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeDoubleLE(this.LocationBlock[i]['GlobalX'], pos); + pos += 8; + buf.writeDoubleLE(this.LocationBlock[i]['GlobalY'], pos); + pos += 8; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentBlock: { + Hunter: UUID, + Prey: UUID, + SpaceIP: IPAddress + } = { + Hunter: UUID.zero(), + Prey: UUID.zero(), + SpaceIP: IPAddress.zero() + }; + newObjAgentBlock['Hunter'] = new UUID(buf, pos); + pos += 16; + newObjAgentBlock['Prey'] = new UUID(buf, pos); + pos += 16; + newObjAgentBlock['SpaceIP'] = new IPAddress(buf, pos); + pos += 4; + this.AgentBlock = newObjAgentBlock; + const count = buf.readUInt8(pos++); + this.LocationBlock = []; + for (let i = 0; i < count; i++) + { + const newObjLocationBlock: { + GlobalX: number, + GlobalY: number + } = { + GlobalX: 0, + GlobalY: 0 + }; + newObjLocationBlock['GlobalX'] = buf.readDoubleLE(pos); + pos += 8; + newObjLocationBlock['GlobalY'] = buf.readDoubleLE(pos); + pos += 8; + this.LocationBlock.push(newObjLocationBlock); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ForceObjectSelect.ts b/lib/classes/packets/ForceObjectSelect.ts index b703b30..c1311bd 100644 --- a/lib/classes/packets/ForceObjectSelect.ts +++ b/lib/classes/packets/ForceObjectSelect.ts @@ -21,4 +21,44 @@ export class ForceObjectSelectPacket implements Packet return ((4) * this.Data.length) + 2; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt8((this.Header['ResetList']) ? 1 : 0, pos++); + const count = this.Data.length; + buf.writeUInt8(this.Data.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.Data[i]['LocalID'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjHeader: { + ResetList: boolean + } = { + ResetList: false + }; + newObjHeader['ResetList'] = (buf.readUInt8(pos++) === 1); + this.Header = newObjHeader; + const count = buf.readUInt8(pos++); + this.Data = []; + for (let i = 0; i < count; i++) + { + const newObjData: { + LocalID: number + } = { + LocalID: 0 + }; + newObjData['LocalID'] = buf.readUInt32LE(pos); + pos += 4; + this.Data.push(newObjData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ForceScriptControlRelease.ts b/lib/classes/packets/ForceScriptControlRelease.ts index fc54084..800c9c9 100644 --- a/lib/classes/packets/ForceScriptControlRelease.ts +++ b/lib/classes/packets/ForceScriptControlRelease.ts @@ -20,4 +20,32 @@ export class ForceScriptControlReleasePacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/FormFriendship.ts b/lib/classes/packets/FormFriendship.ts index e4a20bb..71a98d0 100644 --- a/lib/classes/packets/FormFriendship.ts +++ b/lib/classes/packets/FormFriendship.ts @@ -20,4 +20,32 @@ export class FormFriendshipPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentBlock['SourceID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentBlock['DestID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentBlock: { + SourceID: UUID, + DestID: UUID + } = { + SourceID: UUID.zero(), + DestID: UUID.zero() + }; + newObjAgentBlock['SourceID'] = new UUID(buf, pos); + pos += 16; + newObjAgentBlock['DestID'] = new UUID(buf, pos); + pos += 16; + this.AgentBlock = newObjAgentBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/FreezeUser.ts b/lib/classes/packets/FreezeUser.ts index a34814b..0605912 100644 --- a/lib/classes/packets/FreezeUser.ts +++ b/lib/classes/packets/FreezeUser.ts @@ -24,4 +24,48 @@ export class FreezeUserPacket implements Packet return 52; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['TargetID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.Data['Flags'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + TargetID: UUID, + Flags: number + } = { + TargetID: UUID.zero(), + Flags: 0 + }; + newObjData['TargetID'] = new UUID(buf, pos); + pos += 16; + newObjData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/GenericMessage.ts b/lib/classes/packets/GenericMessage.ts index dc30f50..709e137 100644 --- a/lib/classes/packets/GenericMessage.ts +++ b/lib/classes/packets/GenericMessage.ts @@ -38,4 +38,74 @@ export class GenericMessagePacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.MethodData['Method'], pos); + pos += this.MethodData['Method'].length; + this.MethodData['Invoice'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ParamList.length; + buf.writeUInt8(this.ParamList.length, pos++); + for (let i = 0; i < count; i++) + { + buf.write(this.ParamList[i]['Parameter'], pos); + pos += this.ParamList[i]['Parameter'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + TransactionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + TransactionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['TransactionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjMethodData: { + Method: string, + Invoice: UUID + } = { + Method: '', + Invoice: UUID.zero() + }; + newObjMethodData['Method'] = buf.toString('utf8', pos, length); + pos += length; + newObjMethodData['Invoice'] = new UUID(buf, pos); + pos += 16; + this.MethodData = newObjMethodData; + const count = buf.readUInt8(pos++); + this.ParamList = []; + for (let i = 0; i < count; i++) + { + const newObjParamList: { + Parameter: string + } = { + Parameter: '' + }; + newObjParamList['Parameter'] = buf.toString('utf8', pos, length); + pos += length; + this.ParamList.push(newObjParamList); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/GetScriptRunning.ts b/lib/classes/packets/GetScriptRunning.ts index 086a9b5..1d17ae4 100644 --- a/lib/classes/packets/GetScriptRunning.ts +++ b/lib/classes/packets/GetScriptRunning.ts @@ -20,4 +20,32 @@ export class GetScriptRunningPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Script['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + this.Script['ItemID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjScript: { + ObjectID: UUID, + ItemID: UUID + } = { + ObjectID: UUID.zero(), + ItemID: UUID.zero() + }; + newObjScript['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjScript['ItemID'] = new UUID(buf, pos); + pos += 16; + this.Script = newObjScript; + return pos - startPos; + } } + diff --git a/lib/classes/packets/GodKickUser.ts b/lib/classes/packets/GodKickUser.ts index c0e899c..84fa919 100644 --- a/lib/classes/packets/GodKickUser.ts +++ b/lib/classes/packets/GodKickUser.ts @@ -23,4 +23,50 @@ export class GodKickUserPacket implements Packet return (this.UserInfo['Reason'].length + 2) + 52; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.UserInfo['GodID'].writeToBuffer(buf, pos); + pos += 16; + this.UserInfo['GodSessionID'].writeToBuffer(buf, pos); + pos += 16; + this.UserInfo['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.UserInfo['KickFlags'], pos); + pos += 4; + buf.write(this.UserInfo['Reason'], pos); + pos += this.UserInfo['Reason'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjUserInfo: { + GodID: UUID, + GodSessionID: UUID, + AgentID: UUID, + KickFlags: number, + Reason: string + } = { + GodID: UUID.zero(), + GodSessionID: UUID.zero(), + AgentID: UUID.zero(), + KickFlags: 0, + Reason: '' + }; + newObjUserInfo['GodID'] = new UUID(buf, pos); + pos += 16; + newObjUserInfo['GodSessionID'] = new UUID(buf, pos); + pos += 16; + newObjUserInfo['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjUserInfo['KickFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjUserInfo['Reason'] = buf.toString('utf8', pos, length); + pos += length; + this.UserInfo = newObjUserInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/GodUpdateRegionInfo.ts b/lib/classes/packets/GodUpdateRegionInfo.ts index 5a09873..b2c6ef0 100644 --- a/lib/classes/packets/GodUpdateRegionInfo.ts +++ b/lib/classes/packets/GodUpdateRegionInfo.ts @@ -34,4 +34,106 @@ export class GodUpdateRegionInfoPacket implements Packet return (this.RegionInfo['SimName'].length + 1) + ((8) * this.RegionInfo2.length) + 61; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.RegionInfo['SimName'], pos); + pos += this.RegionInfo['SimName'].length; + buf.writeUInt32LE(this.RegionInfo['EstateID'], pos); + pos += 4; + buf.writeUInt32LE(this.RegionInfo['ParentEstateID'], pos); + pos += 4; + buf.writeUInt32LE(this.RegionInfo['RegionFlags'], pos); + pos += 4; + buf.writeFloatLE(this.RegionInfo['BillableFactor'], pos); + pos += 4; + buf.writeInt32LE(this.RegionInfo['PricePerMeter'], pos); + pos += 4; + buf.writeInt32LE(this.RegionInfo['RedirectGridX'], pos); + pos += 4; + buf.writeInt32LE(this.RegionInfo['RedirectGridY'], pos); + pos += 4; + const count = this.RegionInfo2.length; + buf.writeUInt8(this.RegionInfo2.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeInt32LE(this.RegionInfo2[i]['RegionFlagsExtended'].low, pos); + pos += 4; + buf.writeInt32LE(this.RegionInfo2[i]['RegionFlagsExtended'].high, pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjRegionInfo: { + SimName: string, + EstateID: number, + ParentEstateID: number, + RegionFlags: number, + BillableFactor: number, + PricePerMeter: number, + RedirectGridX: number, + RedirectGridY: number + } = { + SimName: '', + EstateID: 0, + ParentEstateID: 0, + RegionFlags: 0, + BillableFactor: 0, + PricePerMeter: 0, + RedirectGridX: 0, + RedirectGridY: 0 + }; + newObjRegionInfo['SimName'] = buf.toString('utf8', pos, length); + pos += length; + newObjRegionInfo['EstateID'] = buf.readUInt32LE(pos); + pos += 4; + newObjRegionInfo['ParentEstateID'] = buf.readUInt32LE(pos); + pos += 4; + newObjRegionInfo['RegionFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjRegionInfo['BillableFactor'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo['PricePerMeter'] = buf.readInt32LE(pos); + pos += 4; + newObjRegionInfo['RedirectGridX'] = buf.readInt32LE(pos); + pos += 4; + newObjRegionInfo['RedirectGridY'] = buf.readInt32LE(pos); + pos += 4; + this.RegionInfo = newObjRegionInfo; + const count = buf.readUInt8(pos++); + this.RegionInfo2 = []; + for (let i = 0; i < count; i++) + { + const newObjRegionInfo2: { + RegionFlagsExtended: Long + } = { + RegionFlagsExtended: Long.ZERO + }; + newObjRegionInfo2['RegionFlagsExtended'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + this.RegionInfo2.push(newObjRegionInfo2); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/GodlikeMessage.ts b/lib/classes/packets/GodlikeMessage.ts index 582ecca..d81a244 100644 --- a/lib/classes/packets/GodlikeMessage.ts +++ b/lib/classes/packets/GodlikeMessage.ts @@ -38,4 +38,74 @@ export class GodlikeMessagePacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.MethodData['Method'], pos); + pos += this.MethodData['Method'].length; + this.MethodData['Invoice'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ParamList.length; + buf.writeUInt8(this.ParamList.length, pos++); + for (let i = 0; i < count; i++) + { + buf.write(this.ParamList[i]['Parameter'], pos); + pos += this.ParamList[i]['Parameter'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + TransactionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + TransactionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['TransactionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjMethodData: { + Method: string, + Invoice: UUID + } = { + Method: '', + Invoice: UUID.zero() + }; + newObjMethodData['Method'] = buf.toString('utf8', pos, length); + pos += length; + newObjMethodData['Invoice'] = new UUID(buf, pos); + pos += 16; + this.MethodData = newObjMethodData; + const count = buf.readUInt8(pos++); + this.ParamList = []; + for (let i = 0; i < count; i++) + { + const newObjParamList: { + Parameter: string + } = { + Parameter: '' + }; + newObjParamList['Parameter'] = buf.toString('utf8', pos, length); + pos += length; + this.ParamList.push(newObjParamList); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/GrantGodlikePowers.ts b/lib/classes/packets/GrantGodlikePowers.ts index 80cb675..fdd38fa 100644 --- a/lib/classes/packets/GrantGodlikePowers.ts +++ b/lib/classes/packets/GrantGodlikePowers.ts @@ -24,4 +24,46 @@ export class GrantGodlikePowersPacket implements Packet return 49; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.GrantData['GodLevel'], pos++); + this.GrantData['Token'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjGrantData: { + GodLevel: number, + Token: UUID + } = { + GodLevel: 0, + Token: UUID.zero() + }; + newObjGrantData['GodLevel'] = buf.readUInt8(pos++); + newObjGrantData['Token'] = new UUID(buf, pos); + pos += 16; + this.GrantData = newObjGrantData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/GrantUserRights.ts b/lib/classes/packets/GrantUserRights.ts index e0e1892..4f311cd 100644 --- a/lib/classes/packets/GrantUserRights.ts +++ b/lib/classes/packets/GrantUserRights.ts @@ -24,4 +24,58 @@ export class GrantUserRightsPacket implements Packet return ((20) * this.Rights.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.Rights.length; + buf.writeUInt8(this.Rights.length, pos++); + for (let i = 0; i < count; i++) + { + this.Rights[i]['AgentRelated'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.Rights[i]['RelatedRights'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.Rights = []; + for (let i = 0; i < count; i++) + { + const newObjRights: { + AgentRelated: UUID, + RelatedRights: number + } = { + AgentRelated: UUID.zero(), + RelatedRights: 0 + }; + newObjRights['AgentRelated'] = new UUID(buf, pos); + pos += 16; + newObjRights['RelatedRights'] = buf.readInt32LE(pos); + pos += 4; + this.Rights.push(newObjRights); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupAccountDetailsReply.ts b/lib/classes/packets/GroupAccountDetailsReply.ts index d0fbcf5..aa09f57 100644 --- a/lib/classes/packets/GroupAccountDetailsReply.ts +++ b/lib/classes/packets/GroupAccountDetailsReply.ts @@ -40,4 +40,86 @@ export class GroupAccountDetailsReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.MoneyData['RequestID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.MoneyData['IntervalDays'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['CurrentInterval'], pos); + pos += 4; + buf.write(this.MoneyData['StartDate'], pos); + pos += this.MoneyData['StartDate'].length; + const count = this.HistoryData.length; + buf.writeUInt8(this.HistoryData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.write(this.HistoryData[i]['Description'], pos); + pos += this.HistoryData[i]['Description'].length; + buf.writeInt32LE(this.HistoryData[i]['Amount'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjMoneyData: { + RequestID: UUID, + IntervalDays: number, + CurrentInterval: number, + StartDate: string + } = { + RequestID: UUID.zero(), + IntervalDays: 0, + CurrentInterval: 0, + StartDate: '' + }; + newObjMoneyData['RequestID'] = new UUID(buf, pos); + pos += 16; + newObjMoneyData['IntervalDays'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['CurrentInterval'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['StartDate'] = buf.toString('utf8', pos, length); + pos += length; + this.MoneyData = newObjMoneyData; + const count = buf.readUInt8(pos++); + this.HistoryData = []; + for (let i = 0; i < count; i++) + { + const newObjHistoryData: { + Description: string, + Amount: number + } = { + Description: '', + Amount: 0 + }; + newObjHistoryData['Description'] = buf.toString('utf8', pos, length); + pos += length; + newObjHistoryData['Amount'] = buf.readInt32LE(pos); + pos += 4; + this.HistoryData.push(newObjHistoryData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupAccountDetailsRequest.ts b/lib/classes/packets/GroupAccountDetailsRequest.ts index d38a22b..2afa806 100644 --- a/lib/classes/packets/GroupAccountDetailsRequest.ts +++ b/lib/classes/packets/GroupAccountDetailsRequest.ts @@ -26,4 +26,60 @@ export class GroupAccountDetailsRequestPacket implements Packet return 72; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.MoneyData['RequestID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.MoneyData['IntervalDays'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['CurrentInterval'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjMoneyData: { + RequestID: UUID, + IntervalDays: number, + CurrentInterval: number + } = { + RequestID: UUID.zero(), + IntervalDays: 0, + CurrentInterval: 0 + }; + newObjMoneyData['RequestID'] = new UUID(buf, pos); + pos += 16; + newObjMoneyData['IntervalDays'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['CurrentInterval'] = buf.readInt32LE(pos); + pos += 4; + this.MoneyData = newObjMoneyData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupAccountSummaryReply.ts b/lib/classes/packets/GroupAccountSummaryReply.ts index e8d1427..bdf80ac 100644 --- a/lib/classes/packets/GroupAccountSummaryReply.ts +++ b/lib/classes/packets/GroupAccountSummaryReply.ts @@ -42,4 +42,156 @@ export class GroupAccountSummaryReplyPacket implements Packet return (this.MoneyData['StartDate'].length + 1 + this.MoneyData['LastTaxDate'].length + 1 + this.MoneyData['TaxDate'].length + 1) + 112; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.MoneyData['RequestID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.MoneyData['IntervalDays'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['CurrentInterval'], pos); + pos += 4; + buf.write(this.MoneyData['StartDate'], pos); + pos += this.MoneyData['StartDate'].length; + buf.writeInt32LE(this.MoneyData['Balance'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['TotalCredits'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['TotalDebits'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['ObjectTaxCurrent'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['LightTaxCurrent'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['LandTaxCurrent'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['GroupTaxCurrent'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['ParcelDirFeeCurrent'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['ObjectTaxEstimate'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['LightTaxEstimate'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['LandTaxEstimate'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['GroupTaxEstimate'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['ParcelDirFeeEstimate'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['NonExemptMembers'], pos); + pos += 4; + buf.write(this.MoneyData['LastTaxDate'], pos); + pos += this.MoneyData['LastTaxDate'].length; + buf.write(this.MoneyData['TaxDate'], pos); + pos += this.MoneyData['TaxDate'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjMoneyData: { + RequestID: UUID, + IntervalDays: number, + CurrentInterval: number, + StartDate: string, + Balance: number, + TotalCredits: number, + TotalDebits: number, + ObjectTaxCurrent: number, + LightTaxCurrent: number, + LandTaxCurrent: number, + GroupTaxCurrent: number, + ParcelDirFeeCurrent: number, + ObjectTaxEstimate: number, + LightTaxEstimate: number, + LandTaxEstimate: number, + GroupTaxEstimate: number, + ParcelDirFeeEstimate: number, + NonExemptMembers: number, + LastTaxDate: string, + TaxDate: string + } = { + RequestID: UUID.zero(), + IntervalDays: 0, + CurrentInterval: 0, + StartDate: '', + Balance: 0, + TotalCredits: 0, + TotalDebits: 0, + ObjectTaxCurrent: 0, + LightTaxCurrent: 0, + LandTaxCurrent: 0, + GroupTaxCurrent: 0, + ParcelDirFeeCurrent: 0, + ObjectTaxEstimate: 0, + LightTaxEstimate: 0, + LandTaxEstimate: 0, + GroupTaxEstimate: 0, + ParcelDirFeeEstimate: 0, + NonExemptMembers: 0, + LastTaxDate: '', + TaxDate: '' + }; + newObjMoneyData['RequestID'] = new UUID(buf, pos); + pos += 16; + newObjMoneyData['IntervalDays'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['CurrentInterval'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['StartDate'] = buf.toString('utf8', pos, length); + pos += length; + newObjMoneyData['Balance'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['TotalCredits'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['TotalDebits'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['ObjectTaxCurrent'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['LightTaxCurrent'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['LandTaxCurrent'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['GroupTaxCurrent'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['ParcelDirFeeCurrent'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['ObjectTaxEstimate'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['LightTaxEstimate'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['LandTaxEstimate'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['GroupTaxEstimate'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['ParcelDirFeeEstimate'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['NonExemptMembers'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['LastTaxDate'] = buf.toString('utf8', pos, length); + pos += length; + newObjMoneyData['TaxDate'] = buf.toString('utf8', pos, length); + pos += length; + this.MoneyData = newObjMoneyData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupAccountSummaryRequest.ts b/lib/classes/packets/GroupAccountSummaryRequest.ts index ee170b7..0ad70b5 100644 --- a/lib/classes/packets/GroupAccountSummaryRequest.ts +++ b/lib/classes/packets/GroupAccountSummaryRequest.ts @@ -26,4 +26,60 @@ export class GroupAccountSummaryRequestPacket implements Packet return 72; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.MoneyData['RequestID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.MoneyData['IntervalDays'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['CurrentInterval'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjMoneyData: { + RequestID: UUID, + IntervalDays: number, + CurrentInterval: number + } = { + RequestID: UUID.zero(), + IntervalDays: 0, + CurrentInterval: 0 + }; + newObjMoneyData['RequestID'] = new UUID(buf, pos); + pos += 16; + newObjMoneyData['IntervalDays'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['CurrentInterval'] = buf.readInt32LE(pos); + pos += 4; + this.MoneyData = newObjMoneyData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupAccountTransactionsReply.ts b/lib/classes/packets/GroupAccountTransactionsReply.ts index 045c6b4..aba6c32 100644 --- a/lib/classes/packets/GroupAccountTransactionsReply.ts +++ b/lib/classes/packets/GroupAccountTransactionsReply.ts @@ -43,4 +43,104 @@ export class GroupAccountTransactionsReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.MoneyData['RequestID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.MoneyData['IntervalDays'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['CurrentInterval'], pos); + pos += 4; + buf.write(this.MoneyData['StartDate'], pos); + pos += this.MoneyData['StartDate'].length; + const count = this.HistoryData.length; + buf.writeUInt8(this.HistoryData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.write(this.HistoryData[i]['Time'], pos); + pos += this.HistoryData[i]['Time'].length; + buf.write(this.HistoryData[i]['User'], pos); + pos += this.HistoryData[i]['User'].length; + buf.writeInt32LE(this.HistoryData[i]['Type'], pos); + pos += 4; + buf.write(this.HistoryData[i]['Item'], pos); + pos += this.HistoryData[i]['Item'].length; + buf.writeInt32LE(this.HistoryData[i]['Amount'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjMoneyData: { + RequestID: UUID, + IntervalDays: number, + CurrentInterval: number, + StartDate: string + } = { + RequestID: UUID.zero(), + IntervalDays: 0, + CurrentInterval: 0, + StartDate: '' + }; + newObjMoneyData['RequestID'] = new UUID(buf, pos); + pos += 16; + newObjMoneyData['IntervalDays'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['CurrentInterval'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['StartDate'] = buf.toString('utf8', pos, length); + pos += length; + this.MoneyData = newObjMoneyData; + const count = buf.readUInt8(pos++); + this.HistoryData = []; + for (let i = 0; i < count; i++) + { + const newObjHistoryData: { + Time: string, + User: string, + Type: number, + Item: string, + Amount: number + } = { + Time: '', + User: '', + Type: 0, + Item: '', + Amount: 0 + }; + newObjHistoryData['Time'] = buf.toString('utf8', pos, length); + pos += length; + newObjHistoryData['User'] = buf.toString('utf8', pos, length); + pos += length; + newObjHistoryData['Type'] = buf.readInt32LE(pos); + pos += 4; + newObjHistoryData['Item'] = buf.toString('utf8', pos, length); + pos += length; + newObjHistoryData['Amount'] = buf.readInt32LE(pos); + pos += 4; + this.HistoryData.push(newObjHistoryData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupAccountTransactionsRequest.ts b/lib/classes/packets/GroupAccountTransactionsRequest.ts index 65fb8a2..22399fd 100644 --- a/lib/classes/packets/GroupAccountTransactionsRequest.ts +++ b/lib/classes/packets/GroupAccountTransactionsRequest.ts @@ -26,4 +26,60 @@ export class GroupAccountTransactionsRequestPacket implements Packet return 72; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.MoneyData['RequestID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.MoneyData['IntervalDays'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['CurrentInterval'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjMoneyData: { + RequestID: UUID, + IntervalDays: number, + CurrentInterval: number + } = { + RequestID: UUID.zero(), + IntervalDays: 0, + CurrentInterval: 0 + }; + newObjMoneyData['RequestID'] = new UUID(buf, pos); + pos += 16; + newObjMoneyData['IntervalDays'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['CurrentInterval'] = buf.readInt32LE(pos); + pos += 4; + this.MoneyData = newObjMoneyData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupActiveProposalItemReply.ts b/lib/classes/packets/GroupActiveProposalItemReply.ts index cfe0f9d..1041119 100644 --- a/lib/classes/packets/GroupActiveProposalItemReply.ts +++ b/lib/classes/packets/GroupActiveProposalItemReply.ts @@ -46,4 +46,120 @@ export class GroupActiveProposalItemReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.TransactionData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.TransactionData['TotalNumItems'], pos); + pos += 4; + const count = this.ProposalData.length; + buf.writeUInt8(this.ProposalData.length, pos++); + for (let i = 0; i < count; i++) + { + this.ProposalData[i]['VoteID'].writeToBuffer(buf, pos); + pos += 16; + this.ProposalData[i]['VoteInitiator'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.ProposalData[i]['TerseDateID'], pos); + pos += this.ProposalData[i]['TerseDateID'].length; + buf.write(this.ProposalData[i]['StartDateTime'], pos); + pos += this.ProposalData[i]['StartDateTime'].length; + buf.write(this.ProposalData[i]['EndDateTime'], pos); + pos += this.ProposalData[i]['EndDateTime'].length; + buf.writeUInt8((this.ProposalData[i]['AlreadyVoted']) ? 1 : 0, pos++); + buf.write(this.ProposalData[i]['VoteCast'], pos); + pos += this.ProposalData[i]['VoteCast'].length; + buf.writeFloatLE(this.ProposalData[i]['Majority'], pos); + pos += 4; + buf.writeInt32LE(this.ProposalData[i]['Quorum'], pos); + pos += 4; + buf.write(this.ProposalData[i]['ProposalText'], pos); + pos += this.ProposalData[i]['ProposalText'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjTransactionData: { + TransactionID: UUID, + TotalNumItems: number + } = { + TransactionID: UUID.zero(), + TotalNumItems: 0 + }; + newObjTransactionData['TransactionID'] = new UUID(buf, pos); + pos += 16; + newObjTransactionData['TotalNumItems'] = buf.readUInt32LE(pos); + pos += 4; + this.TransactionData = newObjTransactionData; + const count = buf.readUInt8(pos++); + this.ProposalData = []; + for (let i = 0; i < count; i++) + { + const newObjProposalData: { + VoteID: UUID, + VoteInitiator: UUID, + TerseDateID: string, + StartDateTime: string, + EndDateTime: string, + AlreadyVoted: boolean, + VoteCast: string, + Majority: number, + Quorum: number, + ProposalText: string + } = { + VoteID: UUID.zero(), + VoteInitiator: UUID.zero(), + TerseDateID: '', + StartDateTime: '', + EndDateTime: '', + AlreadyVoted: false, + VoteCast: '', + Majority: 0, + Quorum: 0, + ProposalText: '' + }; + newObjProposalData['VoteID'] = new UUID(buf, pos); + pos += 16; + newObjProposalData['VoteInitiator'] = new UUID(buf, pos); + pos += 16; + newObjProposalData['TerseDateID'] = buf.toString('utf8', pos, length); + pos += length; + newObjProposalData['StartDateTime'] = buf.toString('utf8', pos, length); + pos += length; + newObjProposalData['EndDateTime'] = buf.toString('utf8', pos, length); + pos += length; + newObjProposalData['AlreadyVoted'] = (buf.readUInt8(pos++) === 1); + newObjProposalData['VoteCast'] = buf.toString('utf8', pos, length); + pos += length; + newObjProposalData['Majority'] = buf.readFloatLE(pos); + pos += 4; + newObjProposalData['Quorum'] = buf.readInt32LE(pos); + pos += 4; + newObjProposalData['ProposalText'] = buf.toString('utf8', pos, length); + pos += length; + this.ProposalData.push(newObjProposalData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupActiveProposalsRequest.ts b/lib/classes/packets/GroupActiveProposalsRequest.ts index 8d2e19d..bfddb25 100644 --- a/lib/classes/packets/GroupActiveProposalsRequest.ts +++ b/lib/classes/packets/GroupActiveProposalsRequest.ts @@ -26,4 +26,52 @@ export class GroupActiveProposalsRequestPacket implements Packet return 64; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.TransactionData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjGroupData: { + GroupID: UUID + } = { + GroupID: UUID.zero() + }; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.GroupData = newObjGroupData; + const newObjTransactionData: { + TransactionID: UUID + } = { + TransactionID: UUID.zero() + }; + newObjTransactionData['TransactionID'] = new UUID(buf, pos); + pos += 16; + this.TransactionData = newObjTransactionData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupDataUpdate.ts b/lib/classes/packets/GroupDataUpdate.ts index 83a77af..dbc79e3 100644 --- a/lib/classes/packets/GroupDataUpdate.ts +++ b/lib/classes/packets/GroupDataUpdate.ts @@ -33,4 +33,56 @@ export class GroupDataUpdatePacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.AgentGroupData.length; + buf.writeUInt8(this.AgentGroupData.length, pos++); + for (let i = 0; i < count; i++) + { + this.AgentGroupData[i]['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentGroupData[i]['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.AgentGroupData[i]['AgentPowers'].low, pos); + pos += 4; + buf.writeInt32LE(this.AgentGroupData[i]['AgentPowers'].high, pos); + pos += 4; + buf.write(this.AgentGroupData[i]['GroupTitle'], pos); + pos += this.AgentGroupData[i]['GroupTitle'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.AgentGroupData = []; + for (let i = 0; i < count; i++) + { + const newObjAgentGroupData: { + AgentID: UUID, + GroupID: UUID, + AgentPowers: Long, + GroupTitle: string + } = { + AgentID: UUID.zero(), + GroupID: UUID.zero(), + AgentPowers: Long.ZERO, + GroupTitle: '' + }; + newObjAgentGroupData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjAgentGroupData['AgentPowers'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjAgentGroupData['GroupTitle'] = buf.toString('utf8', pos, length); + pos += length; + this.AgentGroupData.push(newObjAgentGroupData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupMembersReply.ts b/lib/classes/packets/GroupMembersReply.ts index d6eca14..d39ea0a 100644 --- a/lib/classes/packets/GroupMembersReply.ts +++ b/lib/classes/packets/GroupMembersReply.ts @@ -43,4 +43,98 @@ export class GroupMembersReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['RequestID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.GroupData['MemberCount'], pos); + pos += 4; + const count = this.MemberData.length; + buf.writeUInt8(this.MemberData.length, pos++); + for (let i = 0; i < count; i++) + { + this.MemberData[i]['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.MemberData[i]['Contribution'], pos); + pos += 4; + buf.write(this.MemberData[i]['OnlineStatus'], pos); + pos += this.MemberData[i]['OnlineStatus'].length; + buf.writeInt32LE(this.MemberData[i]['AgentPowers'].low, pos); + pos += 4; + buf.writeInt32LE(this.MemberData[i]['AgentPowers'].high, pos); + pos += 4; + buf.write(this.MemberData[i]['Title'], pos); + pos += this.MemberData[i]['Title'].length; + buf.writeUInt8((this.MemberData[i]['IsOwner']) ? 1 : 0, pos++); + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjGroupData: { + GroupID: UUID, + RequestID: UUID, + MemberCount: number + } = { + GroupID: UUID.zero(), + RequestID: UUID.zero(), + MemberCount: 0 + }; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['RequestID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['MemberCount'] = buf.readInt32LE(pos); + pos += 4; + this.GroupData = newObjGroupData; + const count = buf.readUInt8(pos++); + this.MemberData = []; + for (let i = 0; i < count; i++) + { + const newObjMemberData: { + AgentID: UUID, + Contribution: number, + OnlineStatus: string, + AgentPowers: Long, + Title: string, + IsOwner: boolean + } = { + AgentID: UUID.zero(), + Contribution: 0, + OnlineStatus: '', + AgentPowers: Long.ZERO, + Title: '', + IsOwner: false + }; + newObjMemberData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjMemberData['Contribution'] = buf.readInt32LE(pos); + pos += 4; + newObjMemberData['OnlineStatus'] = buf.toString('utf8', pos, length); + pos += length; + newObjMemberData['AgentPowers'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjMemberData['Title'] = buf.toString('utf8', pos, length); + pos += length; + newObjMemberData['IsOwner'] = (buf.readUInt8(pos++) === 1); + this.MemberData.push(newObjMemberData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupMembersRequest.ts b/lib/classes/packets/GroupMembersRequest.ts index b58059c..a2b8bac 100644 --- a/lib/classes/packets/GroupMembersRequest.ts +++ b/lib/classes/packets/GroupMembersRequest.ts @@ -24,4 +24,48 @@ export class GroupMembersRequestPacket implements Packet return 64; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['RequestID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjGroupData: { + GroupID: UUID, + RequestID: UUID + } = { + GroupID: UUID.zero(), + RequestID: UUID.zero() + }; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['RequestID'] = new UUID(buf, pos); + pos += 16; + this.GroupData = newObjGroupData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupNoticeAdd.ts b/lib/classes/packets/GroupNoticeAdd.ts index cf8997a..40b5b87 100644 --- a/lib/classes/packets/GroupNoticeAdd.ts +++ b/lib/classes/packets/GroupNoticeAdd.ts @@ -27,4 +27,64 @@ export class GroupNoticeAddPacket implements Packet return (this.MessageBlock['FromAgentName'].length + 1 + this.MessageBlock['Message'].length + 2 + this.MessageBlock['BinaryBucket'].length + 2) + 49; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.MessageBlock['ToGroupID'].writeToBuffer(buf, pos); + pos += 16; + this.MessageBlock['ID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.MessageBlock['Dialog'], pos++); + buf.write(this.MessageBlock['FromAgentName'], pos); + pos += this.MessageBlock['FromAgentName'].length; + buf.write(this.MessageBlock['Message'], pos); + pos += this.MessageBlock['Message'].length; + buf.write(this.MessageBlock['BinaryBucket'], pos); + pos += this.MessageBlock['BinaryBucket'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjMessageBlock: { + ToGroupID: UUID, + ID: UUID, + Dialog: number, + FromAgentName: string, + Message: string, + BinaryBucket: string + } = { + ToGroupID: UUID.zero(), + ID: UUID.zero(), + Dialog: 0, + FromAgentName: '', + Message: '', + BinaryBucket: '' + }; + newObjMessageBlock['ToGroupID'] = new UUID(buf, pos); + pos += 16; + newObjMessageBlock['ID'] = new UUID(buf, pos); + pos += 16; + newObjMessageBlock['Dialog'] = buf.readUInt8(pos++); + newObjMessageBlock['FromAgentName'] = buf.toString('utf8', pos, length); + pos += length; + newObjMessageBlock['Message'] = buf.toString('utf8', pos, length); + pos += length; + newObjMessageBlock['BinaryBucket'] = buf.toString('utf8', pos, length); + pos += length; + this.MessageBlock = newObjMessageBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupNoticeRequest.ts b/lib/classes/packets/GroupNoticeRequest.ts index 9098dcb..20d0e63 100644 --- a/lib/classes/packets/GroupNoticeRequest.ts +++ b/lib/classes/packets/GroupNoticeRequest.ts @@ -23,4 +23,42 @@ export class GroupNoticeRequestPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['GroupNoticeID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + GroupNoticeID: UUID + } = { + GroupNoticeID: UUID.zero() + }; + newObjData['GroupNoticeID'] = new UUID(buf, pos); + pos += 16; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupNoticesListReply.ts b/lib/classes/packets/GroupNoticesListReply.ts index a90676e..0b9ca56 100644 --- a/lib/classes/packets/GroupNoticesListReply.ts +++ b/lib/classes/packets/GroupNoticesListReply.ts @@ -38,4 +38,78 @@ export class GroupNoticesListReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.Data.length; + buf.writeUInt8(this.Data.length, pos++); + for (let i = 0; i < count; i++) + { + this.Data[i]['NoticeID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.Data[i]['Timestamp'], pos); + pos += 4; + buf.write(this.Data[i]['FromName'], pos); + pos += this.Data[i]['FromName'].length; + buf.write(this.Data[i]['Subject'], pos); + pos += this.Data[i]['Subject'].length; + buf.writeUInt8((this.Data[i]['HasAttachment']) ? 1 : 0, pos++); + buf.writeUInt8(this.Data[i]['AssetType'], pos++); + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.Data = []; + for (let i = 0; i < count; i++) + { + const newObjData: { + NoticeID: UUID, + Timestamp: number, + FromName: string, + Subject: string, + HasAttachment: boolean, + AssetType: number + } = { + NoticeID: UUID.zero(), + Timestamp: 0, + FromName: '', + Subject: '', + HasAttachment: false, + AssetType: 0 + }; + newObjData['NoticeID'] = new UUID(buf, pos); + pos += 16; + newObjData['Timestamp'] = buf.readUInt32LE(pos); + pos += 4; + newObjData['FromName'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['Subject'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['HasAttachment'] = (buf.readUInt8(pos++) === 1); + newObjData['AssetType'] = buf.readUInt8(pos++); + this.Data.push(newObjData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupNoticesListRequest.ts b/lib/classes/packets/GroupNoticesListRequest.ts index 4f41d06..dc4dbf4 100644 --- a/lib/classes/packets/GroupNoticesListRequest.ts +++ b/lib/classes/packets/GroupNoticesListRequest.ts @@ -23,4 +23,42 @@ export class GroupNoticesListRequestPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['GroupID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + GroupID: UUID + } = { + GroupID: UUID.zero() + }; + newObjData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupProfileReply.ts b/lib/classes/packets/GroupProfileReply.ts index 48c581b..9a55bf7 100644 --- a/lib/classes/packets/GroupProfileReply.ts +++ b/lib/classes/packets/GroupProfileReply.ts @@ -38,4 +38,120 @@ export class GroupProfileReplyPacket implements Packet return (this.GroupData['Name'].length + 1 + this.GroupData['Charter'].length + 2 + this.GroupData['MemberTitle'].length + 1) + 108; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.GroupData['Name'], pos); + pos += this.GroupData['Name'].length; + buf.write(this.GroupData['Charter'], pos); + pos += this.GroupData['Charter'].length; + buf.writeUInt8((this.GroupData['ShowInList']) ? 1 : 0, pos++); + buf.write(this.GroupData['MemberTitle'], pos); + pos += this.GroupData['MemberTitle'].length; + buf.writeInt32LE(this.GroupData['PowersMask'].low, pos); + pos += 4; + buf.writeInt32LE(this.GroupData['PowersMask'].high, pos); + pos += 4; + this.GroupData['InsigniaID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['FounderID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.GroupData['MembershipFee'], pos); + pos += 4; + buf.writeUInt8((this.GroupData['OpenEnrollment']) ? 1 : 0, pos++); + buf.writeInt32LE(this.GroupData['Money'], pos); + pos += 4; + buf.writeInt32LE(this.GroupData['GroupMembershipCount'], pos); + pos += 4; + buf.writeInt32LE(this.GroupData['GroupRolesCount'], pos); + pos += 4; + buf.writeUInt8((this.GroupData['AllowPublish']) ? 1 : 0, pos++); + buf.writeUInt8((this.GroupData['MaturePublish']) ? 1 : 0, pos++); + this.GroupData['OwnerRole'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjGroupData: { + GroupID: UUID, + Name: string, + Charter: string, + ShowInList: boolean, + MemberTitle: string, + PowersMask: Long, + InsigniaID: UUID, + FounderID: UUID, + MembershipFee: number, + OpenEnrollment: boolean, + Money: number, + GroupMembershipCount: number, + GroupRolesCount: number, + AllowPublish: boolean, + MaturePublish: boolean, + OwnerRole: UUID + } = { + GroupID: UUID.zero(), + Name: '', + Charter: '', + ShowInList: false, + MemberTitle: '', + PowersMask: Long.ZERO, + InsigniaID: UUID.zero(), + FounderID: UUID.zero(), + MembershipFee: 0, + OpenEnrollment: false, + Money: 0, + GroupMembershipCount: 0, + GroupRolesCount: 0, + AllowPublish: false, + MaturePublish: false, + OwnerRole: UUID.zero() + }; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjGroupData['Charter'] = buf.toString('utf8', pos, length); + pos += length; + newObjGroupData['ShowInList'] = (buf.readUInt8(pos++) === 1); + newObjGroupData['MemberTitle'] = buf.toString('utf8', pos, length); + pos += length; + newObjGroupData['PowersMask'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjGroupData['InsigniaID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['FounderID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['MembershipFee'] = buf.readInt32LE(pos); + pos += 4; + newObjGroupData['OpenEnrollment'] = (buf.readUInt8(pos++) === 1); + newObjGroupData['Money'] = buf.readInt32LE(pos); + pos += 4; + newObjGroupData['GroupMembershipCount'] = buf.readInt32LE(pos); + pos += 4; + newObjGroupData['GroupRolesCount'] = buf.readInt32LE(pos); + pos += 4; + newObjGroupData['AllowPublish'] = (buf.readUInt8(pos++) === 1); + newObjGroupData['MaturePublish'] = (buf.readUInt8(pos++) === 1); + newObjGroupData['OwnerRole'] = new UUID(buf, pos); + pos += 16; + this.GroupData = newObjGroupData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupProfileRequest.ts b/lib/classes/packets/GroupProfileRequest.ts index 7fb21e0..a6e8f18 100644 --- a/lib/classes/packets/GroupProfileRequest.ts +++ b/lib/classes/packets/GroupProfileRequest.ts @@ -23,4 +23,42 @@ export class GroupProfileRequestPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjGroupData: { + GroupID: UUID + } = { + GroupID: UUID.zero() + }; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.GroupData = newObjGroupData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupProposalBallot.ts b/lib/classes/packets/GroupProposalBallot.ts index 13d2fbd..c8d2e38 100644 --- a/lib/classes/packets/GroupProposalBallot.ts +++ b/lib/classes/packets/GroupProposalBallot.ts @@ -25,4 +25,54 @@ export class GroupProposalBallotPacket implements Packet return (this.ProposalData['VoteCast'].length + 1) + 64; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.ProposalData['ProposalID'].writeToBuffer(buf, pos); + pos += 16; + this.ProposalData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.ProposalData['VoteCast'], pos); + pos += this.ProposalData['VoteCast'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjProposalData: { + ProposalID: UUID, + GroupID: UUID, + VoteCast: string + } = { + ProposalID: UUID.zero(), + GroupID: UUID.zero(), + VoteCast: '' + }; + newObjProposalData['ProposalID'] = new UUID(buf, pos); + pos += 16; + newObjProposalData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjProposalData['VoteCast'] = buf.toString('utf8', pos, length); + pos += length; + this.ProposalData = newObjProposalData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupRoleChanges.ts b/lib/classes/packets/GroupRoleChanges.ts index 09e87d8..da29d43 100644 --- a/lib/classes/packets/GroupRoleChanges.ts +++ b/lib/classes/packets/GroupRoleChanges.ts @@ -26,4 +26,70 @@ export class GroupRoleChangesPacket implements Packet return ((36) * this.RoleChange.length) + 49; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.RoleChange.length; + buf.writeUInt8(this.RoleChange.length, pos++); + for (let i = 0; i < count; i++) + { + this.RoleChange[i]['RoleID'].writeToBuffer(buf, pos); + pos += 16; + this.RoleChange[i]['MemberID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.RoleChange[i]['Change'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.RoleChange = []; + for (let i = 0; i < count; i++) + { + const newObjRoleChange: { + RoleID: UUID, + MemberID: UUID, + Change: number + } = { + RoleID: UUID.zero(), + MemberID: UUID.zero(), + Change: 0 + }; + newObjRoleChange['RoleID'] = new UUID(buf, pos); + pos += 16; + newObjRoleChange['MemberID'] = new UUID(buf, pos); + pos += 16; + newObjRoleChange['Change'] = buf.readUInt32LE(pos); + pos += 4; + this.RoleChange.push(newObjRoleChange); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupRoleDataReply.ts b/lib/classes/packets/GroupRoleDataReply.ts index 9f29453..71bf117 100644 --- a/lib/classes/packets/GroupRoleDataReply.ts +++ b/lib/classes/packets/GroupRoleDataReply.ts @@ -43,4 +43,100 @@ export class GroupRoleDataReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['RequestID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.GroupData['RoleCount'], pos); + pos += 4; + const count = this.RoleData.length; + buf.writeUInt8(this.RoleData.length, pos++); + for (let i = 0; i < count; i++) + { + this.RoleData[i]['RoleID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.RoleData[i]['Name'], pos); + pos += this.RoleData[i]['Name'].length; + buf.write(this.RoleData[i]['Title'], pos); + pos += this.RoleData[i]['Title'].length; + buf.write(this.RoleData[i]['Description'], pos); + pos += this.RoleData[i]['Description'].length; + buf.writeInt32LE(this.RoleData[i]['Powers'].low, pos); + pos += 4; + buf.writeInt32LE(this.RoleData[i]['Powers'].high, pos); + pos += 4; + buf.writeUInt32LE(this.RoleData[i]['Members'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjGroupData: { + GroupID: UUID, + RequestID: UUID, + RoleCount: number + } = { + GroupID: UUID.zero(), + RequestID: UUID.zero(), + RoleCount: 0 + }; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['RequestID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['RoleCount'] = buf.readInt32LE(pos); + pos += 4; + this.GroupData = newObjGroupData; + const count = buf.readUInt8(pos++); + this.RoleData = []; + for (let i = 0; i < count; i++) + { + const newObjRoleData: { + RoleID: UUID, + Name: string, + Title: string, + Description: string, + Powers: Long, + Members: number + } = { + RoleID: UUID.zero(), + Name: '', + Title: '', + Description: '', + Powers: Long.ZERO, + Members: 0 + }; + newObjRoleData['RoleID'] = new UUID(buf, pos); + pos += 16; + newObjRoleData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjRoleData['Title'] = buf.toString('utf8', pos, length); + pos += length; + newObjRoleData['Description'] = buf.toString('utf8', pos, length); + pos += length; + newObjRoleData['Powers'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjRoleData['Members'] = buf.readUInt32LE(pos); + pos += 4; + this.RoleData.push(newObjRoleData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupRoleDataRequest.ts b/lib/classes/packets/GroupRoleDataRequest.ts index 639d6c7..3b77284 100644 --- a/lib/classes/packets/GroupRoleDataRequest.ts +++ b/lib/classes/packets/GroupRoleDataRequest.ts @@ -24,4 +24,48 @@ export class GroupRoleDataRequestPacket implements Packet return 64; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['RequestID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjGroupData: { + GroupID: UUID, + RequestID: UUID + } = { + GroupID: UUID.zero(), + RequestID: UUID.zero() + }; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['RequestID'] = new UUID(buf, pos); + pos += 16; + this.GroupData = newObjGroupData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupRoleMembersReply.ts b/lib/classes/packets/GroupRoleMembersReply.ts index a9670e2..edef939 100644 --- a/lib/classes/packets/GroupRoleMembersReply.ts +++ b/lib/classes/packets/GroupRoleMembersReply.ts @@ -26,4 +26,70 @@ export class GroupRoleMembersReplyPacket implements Packet return ((32) * this.MemberData.length) + 53; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['RequestID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AgentData['TotalPairs'], pos); + pos += 4; + const count = this.MemberData.length; + buf.writeUInt8(this.MemberData.length, pos++); + for (let i = 0; i < count; i++) + { + this.MemberData[i]['RoleID'].writeToBuffer(buf, pos); + pos += 16; + this.MemberData[i]['MemberID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + GroupID: UUID, + RequestID: UUID, + TotalPairs: number + } = { + AgentID: UUID.zero(), + GroupID: UUID.zero(), + RequestID: UUID.zero(), + TotalPairs: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['RequestID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['TotalPairs'] = buf.readUInt32LE(pos); + pos += 4; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.MemberData = []; + for (let i = 0; i < count; i++) + { + const newObjMemberData: { + RoleID: UUID, + MemberID: UUID + } = { + RoleID: UUID.zero(), + MemberID: UUID.zero() + }; + newObjMemberData['RoleID'] = new UUID(buf, pos); + pos += 16; + newObjMemberData['MemberID'] = new UUID(buf, pos); + pos += 16; + this.MemberData.push(newObjMemberData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupRoleMembersRequest.ts b/lib/classes/packets/GroupRoleMembersRequest.ts index 8d0e8ce..aa16e6b 100644 --- a/lib/classes/packets/GroupRoleMembersRequest.ts +++ b/lib/classes/packets/GroupRoleMembersRequest.ts @@ -24,4 +24,48 @@ export class GroupRoleMembersRequestPacket implements Packet return 64; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['RequestID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjGroupData: { + GroupID: UUID, + RequestID: UUID + } = { + GroupID: UUID.zero(), + RequestID: UUID.zero() + }; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['RequestID'] = new UUID(buf, pos); + pos += 16; + this.GroupData = newObjGroupData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupRoleUpdate.ts b/lib/classes/packets/GroupRoleUpdate.ts index 9c5e42c..9929fbc 100644 --- a/lib/classes/packets/GroupRoleUpdate.ts +++ b/lib/classes/packets/GroupRoleUpdate.ts @@ -40,4 +40,88 @@ export class GroupRoleUpdatePacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.RoleData.length; + buf.writeUInt8(this.RoleData.length, pos++); + for (let i = 0; i < count; i++) + { + this.RoleData[i]['RoleID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.RoleData[i]['Name'], pos); + pos += this.RoleData[i]['Name'].length; + buf.write(this.RoleData[i]['Description'], pos); + pos += this.RoleData[i]['Description'].length; + buf.write(this.RoleData[i]['Title'], pos); + pos += this.RoleData[i]['Title'].length; + buf.writeInt32LE(this.RoleData[i]['Powers'].low, pos); + pos += 4; + buf.writeInt32LE(this.RoleData[i]['Powers'].high, pos); + pos += 4; + buf.writeUInt8(this.RoleData[i]['UpdateType'], pos++); + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.RoleData = []; + for (let i = 0; i < count; i++) + { + const newObjRoleData: { + RoleID: UUID, + Name: string, + Description: string, + Title: string, + Powers: Long, + UpdateType: number + } = { + RoleID: UUID.zero(), + Name: '', + Description: '', + Title: '', + Powers: Long.ZERO, + UpdateType: 0 + }; + newObjRoleData['RoleID'] = new UUID(buf, pos); + pos += 16; + newObjRoleData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjRoleData['Description'] = buf.toString('utf8', pos, length); + pos += length; + newObjRoleData['Title'] = buf.toString('utf8', pos, length); + pos += length; + newObjRoleData['Powers'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjRoleData['UpdateType'] = buf.readUInt8(pos++); + this.RoleData.push(newObjRoleData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupTitleUpdate.ts b/lib/classes/packets/GroupTitleUpdate.ts index abd7aed..3eb7320 100644 --- a/lib/classes/packets/GroupTitleUpdate.ts +++ b/lib/classes/packets/GroupTitleUpdate.ts @@ -22,4 +22,44 @@ export class GroupTitleUpdatePacket implements Packet return 64; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['TitleRoleID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + GroupID: UUID, + TitleRoleID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + GroupID: UUID.zero(), + TitleRoleID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['TitleRoleID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupTitlesReply.ts b/lib/classes/packets/GroupTitlesReply.ts index 199a93b..d03ce98 100644 --- a/lib/classes/packets/GroupTitlesReply.ts +++ b/lib/classes/packets/GroupTitlesReply.ts @@ -36,4 +36,68 @@ export class GroupTitlesReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['RequestID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.GroupData.length; + buf.writeUInt8(this.GroupData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.write(this.GroupData[i]['Title'], pos); + pos += this.GroupData[i]['Title'].length; + this.GroupData[i]['RoleID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.GroupData[i]['Selected']) ? 1 : 0, pos++); + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + GroupID: UUID, + RequestID: UUID + } = { + AgentID: UUID.zero(), + GroupID: UUID.zero(), + RequestID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['RequestID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.GroupData = []; + for (let i = 0; i < count; i++) + { + const newObjGroupData: { + Title: string, + RoleID: UUID, + Selected: boolean + } = { + Title: '', + RoleID: UUID.zero(), + Selected: false + }; + newObjGroupData['Title'] = buf.toString('utf8', pos, length); + pos += length; + newObjGroupData['RoleID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['Selected'] = (buf.readUInt8(pos++) === 1); + this.GroupData.push(newObjGroupData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupTitlesRequest.ts b/lib/classes/packets/GroupTitlesRequest.ts index 97c8013..cd7e893 100644 --- a/lib/classes/packets/GroupTitlesRequest.ts +++ b/lib/classes/packets/GroupTitlesRequest.ts @@ -22,4 +22,44 @@ export class GroupTitlesRequestPacket implements Packet return 64; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['RequestID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + GroupID: UUID, + RequestID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + GroupID: UUID.zero(), + RequestID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['RequestID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupVoteHistoryItemReply.ts b/lib/classes/packets/GroupVoteHistoryItemReply.ts index 2d2d941..5e60356 100644 --- a/lib/classes/packets/GroupVoteHistoryItemReply.ts +++ b/lib/classes/packets/GroupVoteHistoryItemReply.ts @@ -51,4 +51,144 @@ export class GroupVoteHistoryItemReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.TransactionData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.TransactionData['TotalNumItems'], pos); + pos += 4; + this.HistoryItemData['VoteID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.HistoryItemData['TerseDateID'], pos); + pos += this.HistoryItemData['TerseDateID'].length; + buf.write(this.HistoryItemData['StartDateTime'], pos); + pos += this.HistoryItemData['StartDateTime'].length; + buf.write(this.HistoryItemData['EndDateTime'], pos); + pos += this.HistoryItemData['EndDateTime'].length; + this.HistoryItemData['VoteInitiator'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.HistoryItemData['VoteType'], pos); + pos += this.HistoryItemData['VoteType'].length; + buf.write(this.HistoryItemData['VoteResult'], pos); + pos += this.HistoryItemData['VoteResult'].length; + buf.writeFloatLE(this.HistoryItemData['Majority'], pos); + pos += 4; + buf.writeInt32LE(this.HistoryItemData['Quorum'], pos); + pos += 4; + buf.write(this.HistoryItemData['ProposalText'], pos); + pos += this.HistoryItemData['ProposalText'].length; + const count = this.VoteItem.length; + buf.writeUInt8(this.VoteItem.length, pos++); + for (let i = 0; i < count; i++) + { + this.VoteItem[i]['CandidateID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.VoteItem[i]['VoteCast'], pos); + pos += this.VoteItem[i]['VoteCast'].length; + buf.writeInt32LE(this.VoteItem[i]['NumVotes'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjTransactionData: { + TransactionID: UUID, + TotalNumItems: number + } = { + TransactionID: UUID.zero(), + TotalNumItems: 0 + }; + newObjTransactionData['TransactionID'] = new UUID(buf, pos); + pos += 16; + newObjTransactionData['TotalNumItems'] = buf.readUInt32LE(pos); + pos += 4; + this.TransactionData = newObjTransactionData; + const newObjHistoryItemData: { + VoteID: UUID, + TerseDateID: string, + StartDateTime: string, + EndDateTime: string, + VoteInitiator: UUID, + VoteType: string, + VoteResult: string, + Majority: number, + Quorum: number, + ProposalText: string + } = { + VoteID: UUID.zero(), + TerseDateID: '', + StartDateTime: '', + EndDateTime: '', + VoteInitiator: UUID.zero(), + VoteType: '', + VoteResult: '', + Majority: 0, + Quorum: 0, + ProposalText: '' + }; + newObjHistoryItemData['VoteID'] = new UUID(buf, pos); + pos += 16; + newObjHistoryItemData['TerseDateID'] = buf.toString('utf8', pos, length); + pos += length; + newObjHistoryItemData['StartDateTime'] = buf.toString('utf8', pos, length); + pos += length; + newObjHistoryItemData['EndDateTime'] = buf.toString('utf8', pos, length); + pos += length; + newObjHistoryItemData['VoteInitiator'] = new UUID(buf, pos); + pos += 16; + newObjHistoryItemData['VoteType'] = buf.toString('utf8', pos, length); + pos += length; + newObjHistoryItemData['VoteResult'] = buf.toString('utf8', pos, length); + pos += length; + newObjHistoryItemData['Majority'] = buf.readFloatLE(pos); + pos += 4; + newObjHistoryItemData['Quorum'] = buf.readInt32LE(pos); + pos += 4; + newObjHistoryItemData['ProposalText'] = buf.toString('utf8', pos, length); + pos += length; + this.HistoryItemData = newObjHistoryItemData; + const count = buf.readUInt8(pos++); + this.VoteItem = []; + for (let i = 0; i < count; i++) + { + const newObjVoteItem: { + CandidateID: UUID, + VoteCast: string, + NumVotes: number + } = { + CandidateID: UUID.zero(), + VoteCast: '', + NumVotes: 0 + }; + newObjVoteItem['CandidateID'] = new UUID(buf, pos); + pos += 16; + newObjVoteItem['VoteCast'] = buf.toString('utf8', pos, length); + pos += length; + newObjVoteItem['NumVotes'] = buf.readInt32LE(pos); + pos += 4; + this.VoteItem.push(newObjVoteItem); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/GroupVoteHistoryRequest.ts b/lib/classes/packets/GroupVoteHistoryRequest.ts index 0407ab3..0deeee3 100644 --- a/lib/classes/packets/GroupVoteHistoryRequest.ts +++ b/lib/classes/packets/GroupVoteHistoryRequest.ts @@ -26,4 +26,52 @@ export class GroupVoteHistoryRequestPacket implements Packet return 64; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.TransactionData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjGroupData: { + GroupID: UUID + } = { + GroupID: UUID.zero() + }; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.GroupData = newObjGroupData; + const newObjTransactionData: { + TransactionID: UUID + } = { + TransactionID: UUID.zero() + }; + newObjTransactionData['TransactionID'] = new UUID(buf, pos); + pos += 16; + this.TransactionData = newObjTransactionData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/HealthMessage.ts b/lib/classes/packets/HealthMessage.ts index 8e77f21..ae204ab 100644 --- a/lib/classes/packets/HealthMessage.ts +++ b/lib/classes/packets/HealthMessage.ts @@ -18,4 +18,26 @@ export class HealthMessagePacket implements Packet return 4; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeFloatLE(this.HealthData['Health'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjHealthData: { + Health: number + } = { + Health: 0 + }; + newObjHealthData['Health'] = buf.readFloatLE(pos); + pos += 4; + this.HealthData = newObjHealthData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ImageData.ts b/lib/classes/packets/ImageData.ts index 74fb4e3..543ae95 100644 --- a/lib/classes/packets/ImageData.ts +++ b/lib/classes/packets/ImageData.ts @@ -25,4 +25,52 @@ export class ImageDataPacket implements Packet return (this.ImageData['Data'].length + 2) + 23; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.ImageID['ID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.ImageID['Codec'], pos++); + buf.writeUInt32LE(this.ImageID['Size'], pos); + pos += 4; + buf.writeUInt16LE(this.ImageID['Packets'], pos); + pos += 2; + buf.write(this.ImageData['Data'], pos); + pos += this.ImageData['Data'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjImageID: { + ID: UUID, + Codec: number, + Size: number, + Packets: number + } = { + ID: UUID.zero(), + Codec: 0, + Size: 0, + Packets: 0 + }; + newObjImageID['ID'] = new UUID(buf, pos); + pos += 16; + newObjImageID['Codec'] = buf.readUInt8(pos++); + newObjImageID['Size'] = buf.readUInt32LE(pos); + pos += 4; + newObjImageID['Packets'] = buf.readUInt16LE(pos); + pos += 2; + this.ImageID = newObjImageID; + const newObjImageData: { + Data: string + } = { + Data: '' + }; + newObjImageData['Data'] = buf.toString('utf8', pos, length); + pos += length; + this.ImageData = newObjImageData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ImageNotInDatabase.ts b/lib/classes/packets/ImageNotInDatabase.ts index 7d42ce2..26a4f06 100644 --- a/lib/classes/packets/ImageNotInDatabase.ts +++ b/lib/classes/packets/ImageNotInDatabase.ts @@ -19,4 +19,26 @@ export class ImageNotInDatabasePacket implements Packet return 16; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.ImageID['ID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjImageID: { + ID: UUID + } = { + ID: UUID.zero() + }; + newObjImageID['ID'] = new UUID(buf, pos); + pos += 16; + this.ImageID = newObjImageID; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ImagePacket.ts b/lib/classes/packets/ImagePacket.ts index 596a00d..02bc5bb 100644 --- a/lib/classes/packets/ImagePacket.ts +++ b/lib/classes/packets/ImagePacket.ts @@ -23,4 +23,42 @@ export class ImagePacketPacket implements Packet return (this.ImageData['Data'].length + 2) + 18; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.ImageID['ID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt16LE(this.ImageID['Packet'], pos); + pos += 2; + buf.write(this.ImageData['Data'], pos); + pos += this.ImageData['Data'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjImageID: { + ID: UUID, + Packet: number + } = { + ID: UUID.zero(), + Packet: 0 + }; + newObjImageID['ID'] = new UUID(buf, pos); + pos += 16; + newObjImageID['Packet'] = buf.readUInt16LE(pos); + pos += 2; + this.ImageID = newObjImageID; + const newObjImageData: { + Data: string + } = { + Data: '' + }; + newObjImageData['Data'] = buf.toString('utf8', pos, length); + pos += length; + this.ImageData = newObjImageData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ImprovedInstantMessage.ts b/lib/classes/packets/ImprovedInstantMessage.ts index 0f8131e..ddce0c4 100644 --- a/lib/classes/packets/ImprovedInstantMessage.ts +++ b/lib/classes/packets/ImprovedInstantMessage.ts @@ -38,4 +38,112 @@ export class ImprovedInstantMessagePacket implements Packet return (this.MessageBlock['FromAgentName'].length + 1 + this.MessageBlock['Message'].length + 2 + this.MessageBlock['BinaryBucket'].length + 2) + 107; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.MessageBlock['FromGroup']) ? 1 : 0, pos++); + this.MessageBlock['ToAgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.MessageBlock['ParentEstateID'], pos); + pos += 4; + this.MessageBlock['RegionID'].writeToBuffer(buf, pos); + pos += 16; + this.MessageBlock['Position'].writeToBuffer(buf, pos, false); + pos += 12; + buf.writeUInt8(this.MessageBlock['Offline'], pos++); + buf.writeUInt8(this.MessageBlock['Dialog'], pos++); + this.MessageBlock['ID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.MessageBlock['Timestamp'], pos); + pos += 4; + buf.write(this.MessageBlock['FromAgentName'], pos); + pos += this.MessageBlock['FromAgentName'].length; + buf.write(this.MessageBlock['Message'], pos); + pos += this.MessageBlock['Message'].length; + buf.write(this.MessageBlock['BinaryBucket'], pos); + pos += this.MessageBlock['BinaryBucket'].length; + buf.writeUInt32LE(this.EstateBlock['EstateID'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjMessageBlock: { + FromGroup: boolean, + ToAgentID: UUID, + ParentEstateID: number, + RegionID: UUID, + Position: Vector3, + Offline: number, + Dialog: number, + ID: UUID, + Timestamp: number, + FromAgentName: string, + Message: string, + BinaryBucket: string + } = { + FromGroup: false, + ToAgentID: UUID.zero(), + ParentEstateID: 0, + RegionID: UUID.zero(), + Position: Vector3.getZero(), + Offline: 0, + Dialog: 0, + ID: UUID.zero(), + Timestamp: 0, + FromAgentName: '', + Message: '', + BinaryBucket: '' + }; + newObjMessageBlock['FromGroup'] = (buf.readUInt8(pos++) === 1); + newObjMessageBlock['ToAgentID'] = new UUID(buf, pos); + pos += 16; + newObjMessageBlock['ParentEstateID'] = buf.readUInt32LE(pos); + pos += 4; + newObjMessageBlock['RegionID'] = new UUID(buf, pos); + pos += 16; + newObjMessageBlock['Position'] = new Vector3(buf, pos, false); + pos += 12; + newObjMessageBlock['Offline'] = buf.readUInt8(pos++); + newObjMessageBlock['Dialog'] = buf.readUInt8(pos++); + newObjMessageBlock['ID'] = new UUID(buf, pos); + pos += 16; + newObjMessageBlock['Timestamp'] = buf.readUInt32LE(pos); + pos += 4; + newObjMessageBlock['FromAgentName'] = buf.toString('utf8', pos, length); + pos += length; + newObjMessageBlock['Message'] = buf.toString('utf8', pos, length); + pos += length; + newObjMessageBlock['BinaryBucket'] = buf.toString('utf8', pos, length); + pos += length; + this.MessageBlock = newObjMessageBlock; + const newObjEstateBlock: { + EstateID: number + } = { + EstateID: 0 + }; + newObjEstateBlock['EstateID'] = buf.readUInt32LE(pos); + pos += 4; + this.EstateBlock = newObjEstateBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ImprovedTerseObjectUpdate.ts b/lib/classes/packets/ImprovedTerseObjectUpdate.ts index ada61b0..8cf3ec5 100644 --- a/lib/classes/packets/ImprovedTerseObjectUpdate.ts +++ b/lib/classes/packets/ImprovedTerseObjectUpdate.ts @@ -34,4 +34,60 @@ export class ImprovedTerseObjectUpdatePacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.RegionData['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.RegionData['RegionHandle'].high, pos); + pos += 4; + buf.writeUInt16LE(this.RegionData['TimeDilation'], pos); + pos += 2; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.write(this.ObjectData[i]['Data'], pos); + pos += this.ObjectData[i]['Data'].length; + buf.write(this.ObjectData[i]['TextureEntry'], pos); + pos += this.ObjectData[i]['TextureEntry'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjRegionData: { + RegionHandle: Long, + TimeDilation: number + } = { + RegionHandle: Long.ZERO, + TimeDilation: 0 + }; + newObjRegionData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjRegionData['TimeDilation'] = buf.readUInt16LE(pos); + pos += 2; + this.RegionData = newObjRegionData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + Data: string, + TextureEntry: string + } = { + Data: '', + TextureEntry: '' + }; + newObjObjectData['Data'] = buf.toString('utf8', pos, length); + pos += length; + newObjObjectData['TextureEntry'] = buf.toString('utf8', pos, length); + pos += length; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/InitiateDownload.ts b/lib/classes/packets/InitiateDownload.ts index f2cf454..88a1877 100644 --- a/lib/classes/packets/InitiateDownload.ts +++ b/lib/classes/packets/InitiateDownload.ts @@ -23,4 +23,42 @@ export class InitiateDownloadPacket implements Packet return (this.FileData['SimFilename'].length + 1 + this.FileData['ViewerFilename'].length + 1) + 16; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.FileData['SimFilename'], pos); + pos += this.FileData['SimFilename'].length; + buf.write(this.FileData['ViewerFilename'], pos); + pos += this.FileData['ViewerFilename'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjFileData: { + SimFilename: string, + ViewerFilename: string + } = { + SimFilename: '', + ViewerFilename: '' + }; + newObjFileData['SimFilename'] = buf.toString('utf8', pos, length); + pos += length; + newObjFileData['ViewerFilename'] = buf.toString('utf8', pos, length); + pos += length; + this.FileData = newObjFileData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/InternalScriptMail.ts b/lib/classes/packets/InternalScriptMail.ts index af58407..2d1b1ac 100644 --- a/lib/classes/packets/InternalScriptMail.ts +++ b/lib/classes/packets/InternalScriptMail.ts @@ -22,4 +22,44 @@ export class InternalScriptMailPacket implements Packet return (this.DataBlock['From'].length + 1 + this.DataBlock['Subject'].length + 1 + this.DataBlock['Body'].length + 2) + 16; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.write(this.DataBlock['From'], pos); + pos += this.DataBlock['From'].length; + this.DataBlock['To'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.DataBlock['Subject'], pos); + pos += this.DataBlock['Subject'].length; + buf.write(this.DataBlock['Body'], pos); + pos += this.DataBlock['Body'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjDataBlock: { + From: string, + To: UUID, + Subject: string, + Body: string + } = { + From: '', + To: UUID.zero(), + Subject: '', + Body: '' + }; + newObjDataBlock['From'] = buf.toString('utf8', pos, length); + pos += length; + newObjDataBlock['To'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['Subject'] = buf.toString('utf8', pos, length); + pos += length; + newObjDataBlock['Body'] = buf.toString('utf8', pos, length); + pos += length; + this.DataBlock = newObjDataBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/InventoryAssetResponse.ts b/lib/classes/packets/InventoryAssetResponse.ts index fb5be1c..8110c6a 100644 --- a/lib/classes/packets/InventoryAssetResponse.ts +++ b/lib/classes/packets/InventoryAssetResponse.ts @@ -21,4 +21,36 @@ export class InventoryAssetResponsePacket implements Packet return 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + this.QueryData['AssetID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.QueryData['IsReadable']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjQueryData: { + QueryID: UUID, + AssetID: UUID, + IsReadable: boolean + } = { + QueryID: UUID.zero(), + AssetID: UUID.zero(), + IsReadable: false + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + newObjQueryData['AssetID'] = new UUID(buf, pos); + pos += 16; + newObjQueryData['IsReadable'] = (buf.readUInt8(pos++) === 1); + this.QueryData = newObjQueryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/InventoryDescendents.ts b/lib/classes/packets/InventoryDescendents.ts index 0b0a9e0..3787bdf 100644 --- a/lib/classes/packets/InventoryDescendents.ts +++ b/lib/classes/packets/InventoryDescendents.ts @@ -62,4 +62,218 @@ export class InventoryDescendentsPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['FolderID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.AgentData['Version'], pos); + pos += 4; + buf.writeInt32LE(this.AgentData['Descendents'], pos); + pos += 4; + let count = this.FolderData.length; + buf.writeUInt8(this.FolderData.length, pos++); + for (let i = 0; i < count; i++) + { + this.FolderData[i]['FolderID'].writeToBuffer(buf, pos); + pos += 16; + this.FolderData[i]['ParentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt8(this.FolderData[i]['Type'], pos++); + buf.write(this.FolderData[i]['Name'], pos); + pos += this.FolderData[i]['Name'].length; + } + count = this.ItemData.length; + buf.writeUInt8(this.ItemData.length, pos++); + for (let i = 0; i < count; i++) + { + this.ItemData[i]['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.ItemData[i]['FolderID'].writeToBuffer(buf, pos); + pos += 16; + this.ItemData[i]['CreatorID'].writeToBuffer(buf, pos); + pos += 16; + this.ItemData[i]['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + this.ItemData[i]['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.ItemData[i]['BaseMask'], pos); + pos += 4; + buf.writeUInt32LE(this.ItemData[i]['OwnerMask'], pos); + pos += 4; + buf.writeUInt32LE(this.ItemData[i]['GroupMask'], pos); + pos += 4; + buf.writeUInt32LE(this.ItemData[i]['EveryoneMask'], pos); + pos += 4; + buf.writeUInt32LE(this.ItemData[i]['NextOwnerMask'], pos); + pos += 4; + buf.writeUInt8((this.ItemData[i]['GroupOwned']) ? 1 : 0, pos++); + this.ItemData[i]['AssetID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt8(this.ItemData[i]['Type'], pos++); + buf.writeInt8(this.ItemData[i]['InvType'], pos++); + buf.writeUInt32LE(this.ItemData[i]['Flags'], pos); + pos += 4; + buf.writeUInt8(this.ItemData[i]['SaleType'], pos++); + buf.writeInt32LE(this.ItemData[i]['SalePrice'], pos); + pos += 4; + buf.write(this.ItemData[i]['Name'], pos); + pos += this.ItemData[i]['Name'].length; + buf.write(this.ItemData[i]['Description'], pos); + pos += this.ItemData[i]['Description'].length; + buf.writeInt32LE(this.ItemData[i]['CreationDate'], pos); + pos += 4; + buf.writeUInt32LE(this.ItemData[i]['CRC'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + FolderID: UUID, + OwnerID: UUID, + Version: number, + Descendents: number + } = { + AgentID: UUID.zero(), + FolderID: UUID.zero(), + OwnerID: UUID.zero(), + Version: 0, + Descendents: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['Version'] = buf.readInt32LE(pos); + pos += 4; + newObjAgentData['Descendents'] = buf.readInt32LE(pos); + pos += 4; + this.AgentData = newObjAgentData; + let count = buf.readUInt8(pos++); + this.FolderData = []; + for (let i = 0; i < count; i++) + { + const newObjFolderData: { + FolderID: UUID, + ParentID: UUID, + Type: number, + Name: string + } = { + FolderID: UUID.zero(), + ParentID: UUID.zero(), + Type: 0, + Name: '' + }; + newObjFolderData['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjFolderData['ParentID'] = new UUID(buf, pos); + pos += 16; + newObjFolderData['Type'] = buf.readInt8(pos++); + newObjFolderData['Name'] = buf.toString('utf8', pos, length); + pos += length; + this.FolderData.push(newObjFolderData); + } + count = buf.readUInt8(pos++); + this.ItemData = []; + for (let i = 0; i < count; i++) + { + const newObjItemData: { + ItemID: UUID, + FolderID: UUID, + CreatorID: UUID, + OwnerID: UUID, + GroupID: UUID, + BaseMask: number, + OwnerMask: number, + GroupMask: number, + EveryoneMask: number, + NextOwnerMask: number, + GroupOwned: boolean, + AssetID: UUID, + Type: number, + InvType: number, + Flags: number, + SaleType: number, + SalePrice: number, + Name: string, + Description: string, + CreationDate: number, + CRC: number + } = { + ItemID: UUID.zero(), + FolderID: UUID.zero(), + CreatorID: UUID.zero(), + OwnerID: UUID.zero(), + GroupID: UUID.zero(), + BaseMask: 0, + OwnerMask: 0, + GroupMask: 0, + EveryoneMask: 0, + NextOwnerMask: 0, + GroupOwned: false, + AssetID: UUID.zero(), + Type: 0, + InvType: 0, + Flags: 0, + SaleType: 0, + SalePrice: 0, + Name: '', + Description: '', + CreationDate: 0, + CRC: 0 + }; + newObjItemData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjItemData['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjItemData['CreatorID'] = new UUID(buf, pos); + pos += 16; + newObjItemData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjItemData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjItemData['BaseMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjItemData['OwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjItemData['GroupMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjItemData['EveryoneMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjItemData['NextOwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjItemData['GroupOwned'] = (buf.readUInt8(pos++) === 1); + newObjItemData['AssetID'] = new UUID(buf, pos); + pos += 16; + newObjItemData['Type'] = buf.readInt8(pos++); + newObjItemData['InvType'] = buf.readInt8(pos++); + newObjItemData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + newObjItemData['SaleType'] = buf.readUInt8(pos++); + newObjItemData['SalePrice'] = buf.readInt32LE(pos); + pos += 4; + newObjItemData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjItemData['Description'] = buf.toString('utf8', pos, length); + pos += length; + newObjItemData['CreationDate'] = buf.readInt32LE(pos); + pos += 4; + newObjItemData['CRC'] = buf.readUInt32LE(pos); + pos += 4; + this.ItemData.push(newObjItemData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/InviteGroupRequest.ts b/lib/classes/packets/InviteGroupRequest.ts index 45d3d27..c7707a5 100644 --- a/lib/classes/packets/InviteGroupRequest.ts +++ b/lib/classes/packets/InviteGroupRequest.ts @@ -27,4 +27,68 @@ export class InviteGroupRequestPacket implements Packet return ((32) * this.InviteData.length) + 49; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.InviteData.length; + buf.writeUInt8(this.InviteData.length, pos++); + for (let i = 0; i < count; i++) + { + this.InviteData[i]['InviteeID'].writeToBuffer(buf, pos); + pos += 16; + this.InviteData[i]['RoleID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjGroupData: { + GroupID: UUID + } = { + GroupID: UUID.zero() + }; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.GroupData = newObjGroupData; + const count = buf.readUInt8(pos++); + this.InviteData = []; + for (let i = 0; i < count; i++) + { + const newObjInviteData: { + InviteeID: UUID, + RoleID: UUID + } = { + InviteeID: UUID.zero(), + RoleID: UUID.zero() + }; + newObjInviteData['InviteeID'] = new UUID(buf, pos); + pos += 16; + newObjInviteData['RoleID'] = new UUID(buf, pos); + pos += 16; + this.InviteData.push(newObjInviteData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/InviteGroupResponse.ts b/lib/classes/packets/InviteGroupResponse.ts index 11423c4..387c357 100644 --- a/lib/classes/packets/InviteGroupResponse.ts +++ b/lib/classes/packets/InviteGroupResponse.ts @@ -26,4 +26,60 @@ export class InviteGroupResponsePacket implements Packet return 72; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.InviteData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.InviteData['InviteeID'].writeToBuffer(buf, pos); + pos += 16; + this.InviteData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.InviteData['RoleID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.InviteData['MembershipFee'], pos); + pos += 4; + buf.writeInt32LE(this.GroupData['GroupLimit'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjInviteData: { + AgentID: UUID, + InviteeID: UUID, + GroupID: UUID, + RoleID: UUID, + MembershipFee: number + } = { + AgentID: UUID.zero(), + InviteeID: UUID.zero(), + GroupID: UUID.zero(), + RoleID: UUID.zero(), + MembershipFee: 0 + }; + newObjInviteData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjInviteData['InviteeID'] = new UUID(buf, pos); + pos += 16; + newObjInviteData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjInviteData['RoleID'] = new UUID(buf, pos); + pos += 16; + newObjInviteData['MembershipFee'] = buf.readInt32LE(pos); + pos += 4; + this.InviteData = newObjInviteData; + const newObjGroupData: { + GroupLimit: number + } = { + GroupLimit: 0 + }; + newObjGroupData['GroupLimit'] = buf.readInt32LE(pos); + pos += 4; + this.GroupData = newObjGroupData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/JoinGroupReply.ts b/lib/classes/packets/JoinGroupReply.ts index f7d2043..78a3ae7 100644 --- a/lib/classes/packets/JoinGroupReply.ts +++ b/lib/classes/packets/JoinGroupReply.ts @@ -23,4 +23,40 @@ export class JoinGroupReplyPacket implements Packet return 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.GroupData['Success']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjGroupData: { + GroupID: UUID, + Success: boolean + } = { + GroupID: UUID.zero(), + Success: false + }; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['Success'] = (buf.readUInt8(pos++) === 1); + this.GroupData = newObjGroupData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/JoinGroupRequest.ts b/lib/classes/packets/JoinGroupRequest.ts index 16c0217..c8f2936 100644 --- a/lib/classes/packets/JoinGroupRequest.ts +++ b/lib/classes/packets/JoinGroupRequest.ts @@ -23,4 +23,42 @@ export class JoinGroupRequestPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjGroupData: { + GroupID: UUID + } = { + GroupID: UUID.zero() + }; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.GroupData = newObjGroupData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/JoinGroupRequestExtended.ts b/lib/classes/packets/JoinGroupRequestExtended.ts index 316e890..24445bd 100644 --- a/lib/classes/packets/JoinGroupRequestExtended.ts +++ b/lib/classes/packets/JoinGroupRequestExtended.ts @@ -24,4 +24,48 @@ export class JoinGroupRequestExtendedPacket implements Packet return 52; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.AgentData['GroupLimit'], pos); + pos += 4; + this.GroupData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + GroupLimit: number + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + GroupLimit: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupLimit'] = buf.readInt32LE(pos); + pos += 4; + this.AgentData = newObjAgentData; + const newObjGroupData: { + GroupID: UUID + } = { + GroupID: UUID.zero() + }; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.GroupData = newObjGroupData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/KickUser.ts b/lib/classes/packets/KickUser.ts index 826740e..e31bdf2 100644 --- a/lib/classes/packets/KickUser.ts +++ b/lib/classes/packets/KickUser.ts @@ -26,4 +26,54 @@ export class KickUserPacket implements Packet return (this.UserInfo['Reason'].length + 2) + 38; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.TargetBlock['TargetIP'].writeToBuffer(buf, pos); + pos += 4; + buf.writeUInt16LE(this.TargetBlock['TargetPort'], pos); + pos += 2; + this.UserInfo['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.UserInfo['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.UserInfo['Reason'], pos); + pos += this.UserInfo['Reason'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjTargetBlock: { + TargetIP: IPAddress, + TargetPort: number + } = { + TargetIP: IPAddress.zero(), + TargetPort: 0 + }; + newObjTargetBlock['TargetIP'] = new IPAddress(buf, pos); + pos += 4; + newObjTargetBlock['TargetPort'] = buf.readUInt16LE(pos); + pos += 2; + this.TargetBlock = newObjTargetBlock; + const newObjUserInfo: { + AgentID: UUID, + SessionID: UUID, + Reason: string + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + Reason: '' + }; + newObjUserInfo['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjUserInfo['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjUserInfo['Reason'] = buf.toString('utf8', pos, length); + pos += length; + this.UserInfo = newObjUserInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/KickUserAck.ts b/lib/classes/packets/KickUserAck.ts index 18718b0..c231119 100644 --- a/lib/classes/packets/KickUserAck.ts +++ b/lib/classes/packets/KickUserAck.ts @@ -20,4 +20,32 @@ export class KickUserAckPacket implements Packet return 20; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.UserInfo['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.UserInfo['Flags'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjUserInfo: { + SessionID: UUID, + Flags: number + } = { + SessionID: UUID.zero(), + Flags: 0 + }; + newObjUserInfo['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjUserInfo['Flags'] = buf.readUInt32LE(pos); + pos += 4; + this.UserInfo = newObjUserInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/KillChildAgents.ts b/lib/classes/packets/KillChildAgents.ts index 3a21898..4b58fb6 100644 --- a/lib/classes/packets/KillChildAgents.ts +++ b/lib/classes/packets/KillChildAgents.ts @@ -19,4 +19,26 @@ export class KillChildAgentsPacket implements Packet return 16; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.IDBlock['AgentID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjIDBlock: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjIDBlock['AgentID'] = new UUID(buf, pos); + pos += 16; + this.IDBlock = newObjIDBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/KillObject.ts b/lib/classes/packets/KillObject.ts index 9f42939..ac244a1 100644 --- a/lib/classes/packets/KillObject.ts +++ b/lib/classes/packets/KillObject.ts @@ -18,4 +18,36 @@ export class KillObjectPacket implements Packet return ((4) * this.ObjectData.length) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ID'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ID: number + } = { + ID: 0 + }; + newObjObjectData['ID'] = buf.readUInt32LE(pos); + pos += 4; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/LandStatReply.ts b/lib/classes/packets/LandStatReply.ts index 3e403ee..5fe1496 100644 --- a/lib/classes/packets/LandStatReply.ts +++ b/lib/classes/packets/LandStatReply.ts @@ -41,4 +41,100 @@ export class LandStatReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt32LE(this.RequestData['ReportType'], pos); + pos += 4; + buf.writeUInt32LE(this.RequestData['RequestFlags'], pos); + pos += 4; + buf.writeUInt32LE(this.RequestData['TotalObjectCount'], pos); + pos += 4; + const count = this.ReportData.length; + buf.writeUInt8(this.ReportData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ReportData[i]['TaskLocalID'], pos); + pos += 4; + this.ReportData[i]['TaskID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeFloatLE(this.ReportData[i]['LocationX'], pos); + pos += 4; + buf.writeFloatLE(this.ReportData[i]['LocationY'], pos); + pos += 4; + buf.writeFloatLE(this.ReportData[i]['LocationZ'], pos); + pos += 4; + buf.writeFloatLE(this.ReportData[i]['Score'], pos); + pos += 4; + buf.write(this.ReportData[i]['TaskName'], pos); + pos += this.ReportData[i]['TaskName'].length; + buf.write(this.ReportData[i]['OwnerName'], pos); + pos += this.ReportData[i]['OwnerName'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjRequestData: { + ReportType: number, + RequestFlags: number, + TotalObjectCount: number + } = { + ReportType: 0, + RequestFlags: 0, + TotalObjectCount: 0 + }; + newObjRequestData['ReportType'] = buf.readUInt32LE(pos); + pos += 4; + newObjRequestData['RequestFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjRequestData['TotalObjectCount'] = buf.readUInt32LE(pos); + pos += 4; + this.RequestData = newObjRequestData; + const count = buf.readUInt8(pos++); + this.ReportData = []; + for (let i = 0; i < count; i++) + { + const newObjReportData: { + TaskLocalID: number, + TaskID: UUID, + LocationX: number, + LocationY: number, + LocationZ: number, + Score: number, + TaskName: string, + OwnerName: string + } = { + TaskLocalID: 0, + TaskID: UUID.zero(), + LocationX: 0, + LocationY: 0, + LocationZ: 0, + Score: 0, + TaskName: '', + OwnerName: '' + }; + newObjReportData['TaskLocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjReportData['TaskID'] = new UUID(buf, pos); + pos += 16; + newObjReportData['LocationX'] = buf.readFloatLE(pos); + pos += 4; + newObjReportData['LocationY'] = buf.readFloatLE(pos); + pos += 4; + newObjReportData['LocationZ'] = buf.readFloatLE(pos); + pos += 4; + newObjReportData['Score'] = buf.readFloatLE(pos); + pos += 4; + newObjReportData['TaskName'] = buf.toString('utf8', pos, length); + pos += length; + newObjReportData['OwnerName'] = buf.toString('utf8', pos, length); + pos += length; + this.ReportData.push(newObjReportData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/LandStatRequest.ts b/lib/classes/packets/LandStatRequest.ts index 4750396..5beb50f 100644 --- a/lib/classes/packets/LandStatRequest.ts +++ b/lib/classes/packets/LandStatRequest.ts @@ -26,4 +26,60 @@ export class LandStatRequestPacket implements Packet return (this.RequestData['Filter'].length + 1) + 44; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.RequestData['ReportType'], pos); + pos += 4; + buf.writeUInt32LE(this.RequestData['RequestFlags'], pos); + pos += 4; + buf.write(this.RequestData['Filter'], pos); + pos += this.RequestData['Filter'].length; + buf.writeInt32LE(this.RequestData['ParcelLocalID'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjRequestData: { + ReportType: number, + RequestFlags: number, + Filter: string, + ParcelLocalID: number + } = { + ReportType: 0, + RequestFlags: 0, + Filter: '', + ParcelLocalID: 0 + }; + newObjRequestData['ReportType'] = buf.readUInt32LE(pos); + pos += 4; + newObjRequestData['RequestFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjRequestData['Filter'] = buf.toString('utf8', pos, length); + pos += length; + newObjRequestData['ParcelLocalID'] = buf.readInt32LE(pos); + pos += 4; + this.RequestData = newObjRequestData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/LayerData.ts b/lib/classes/packets/LayerData.ts index 84fdd23..00ff022 100644 --- a/lib/classes/packets/LayerData.ts +++ b/lib/classes/packets/LayerData.ts @@ -21,4 +21,34 @@ export class LayerDataPacket implements Packet return (this.LayerData['Data'].length + 2) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt8(this.LayerID['Type'], pos++); + buf.write(this.LayerData['Data'], pos); + pos += this.LayerData['Data'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjLayerID: { + Type: number + } = { + Type: 0 + }; + newObjLayerID['Type'] = buf.readUInt8(pos++); + this.LayerID = newObjLayerID; + const newObjLayerData: { + Data: string + } = { + Data: '' + }; + newObjLayerData['Data'] = buf.toString('utf8', pos, length); + pos += length; + this.LayerData = newObjLayerData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/LeaveGroupReply.ts b/lib/classes/packets/LeaveGroupReply.ts index e86363e..100f5ef 100644 --- a/lib/classes/packets/LeaveGroupReply.ts +++ b/lib/classes/packets/LeaveGroupReply.ts @@ -23,4 +23,40 @@ export class LeaveGroupReplyPacket implements Packet return 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.GroupData['Success']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjGroupData: { + GroupID: UUID, + Success: boolean + } = { + GroupID: UUID.zero(), + Success: false + }; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['Success'] = (buf.readUInt8(pos++) === 1); + this.GroupData = newObjGroupData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/LeaveGroupRequest.ts b/lib/classes/packets/LeaveGroupRequest.ts index 229933c..d9ca64f 100644 --- a/lib/classes/packets/LeaveGroupRequest.ts +++ b/lib/classes/packets/LeaveGroupRequest.ts @@ -23,4 +23,42 @@ export class LeaveGroupRequestPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjGroupData: { + GroupID: UUID + } = { + GroupID: UUID.zero() + }; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.GroupData = newObjGroupData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/LinkInventoryItem.ts b/lib/classes/packets/LinkInventoryItem.ts index 859b442..841c606 100644 --- a/lib/classes/packets/LinkInventoryItem.ts +++ b/lib/classes/packets/LinkInventoryItem.ts @@ -30,4 +30,80 @@ export class LinkInventoryItemPacket implements Packet return (this.InventoryBlock['Name'].length + 1 + this.InventoryBlock['Description'].length + 1) + 86; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.InventoryBlock['CallbackID'], pos); + pos += 4; + this.InventoryBlock['FolderID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryBlock['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryBlock['OldItemID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt8(this.InventoryBlock['Type'], pos++); + buf.writeInt8(this.InventoryBlock['InvType'], pos++); + buf.write(this.InventoryBlock['Name'], pos); + pos += this.InventoryBlock['Name'].length; + buf.write(this.InventoryBlock['Description'], pos); + pos += this.InventoryBlock['Description'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjInventoryBlock: { + CallbackID: number, + FolderID: UUID, + TransactionID: UUID, + OldItemID: UUID, + Type: number, + InvType: number, + Name: string, + Description: string + } = { + CallbackID: 0, + FolderID: UUID.zero(), + TransactionID: UUID.zero(), + OldItemID: UUID.zero(), + Type: 0, + InvType: 0, + Name: '', + Description: '' + }; + newObjInventoryBlock['CallbackID'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryBlock['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryBlock['TransactionID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryBlock['OldItemID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryBlock['Type'] = buf.readInt8(pos++); + newObjInventoryBlock['InvType'] = buf.readInt8(pos++); + newObjInventoryBlock['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjInventoryBlock['Description'] = buf.toString('utf8', pos, length); + pos += length; + this.InventoryBlock = newObjInventoryBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/LiveHelpGroupReply.ts b/lib/classes/packets/LiveHelpGroupReply.ts index 1a60fd1..c221e26 100644 --- a/lib/classes/packets/LiveHelpGroupReply.ts +++ b/lib/classes/packets/LiveHelpGroupReply.ts @@ -21,4 +21,38 @@ export class LiveHelpGroupReplyPacket implements Packet return (this.ReplyData['Selection'].length + 1) + 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.ReplyData['RequestID'].writeToBuffer(buf, pos); + pos += 16; + this.ReplyData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.ReplyData['Selection'], pos); + pos += this.ReplyData['Selection'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjReplyData: { + RequestID: UUID, + GroupID: UUID, + Selection: string + } = { + RequestID: UUID.zero(), + GroupID: UUID.zero(), + Selection: '' + }; + newObjReplyData['RequestID'] = new UUID(buf, pos); + pos += 16; + newObjReplyData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjReplyData['Selection'] = buf.toString('utf8', pos, length); + pos += length; + this.ReplyData = newObjReplyData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/LiveHelpGroupRequest.ts b/lib/classes/packets/LiveHelpGroupRequest.ts index 5206e8c..5b06d6d 100644 --- a/lib/classes/packets/LiveHelpGroupRequest.ts +++ b/lib/classes/packets/LiveHelpGroupRequest.ts @@ -20,4 +20,32 @@ export class LiveHelpGroupRequestPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.RequestData['RequestID'].writeToBuffer(buf, pos); + pos += 16; + this.RequestData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjRequestData: { + RequestID: UUID, + AgentID: UUID + } = { + RequestID: UUID.zero(), + AgentID: UUID.zero() + }; + newObjRequestData['RequestID'] = new UUID(buf, pos); + pos += 16; + newObjRequestData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.RequestData = newObjRequestData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/LoadURL.ts b/lib/classes/packets/LoadURL.ts index ffd68b7..0d474cc 100644 --- a/lib/classes/packets/LoadURL.ts +++ b/lib/classes/packets/LoadURL.ts @@ -24,4 +24,54 @@ export class LoadURLPacket implements Packet return (this.Data['ObjectName'].length + 1 + this.Data['Message'].length + 1 + this.Data['URL'].length + 1) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.write(this.Data['ObjectName'], pos); + pos += this.Data['ObjectName'].length; + this.Data['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.Data['OwnerIsGroup']) ? 1 : 0, pos++); + buf.write(this.Data['Message'], pos); + pos += this.Data['Message'].length; + buf.write(this.Data['URL'], pos); + pos += this.Data['URL'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjData: { + ObjectName: string, + ObjectID: UUID, + OwnerID: UUID, + OwnerIsGroup: boolean, + Message: string, + URL: string + } = { + ObjectName: '', + ObjectID: UUID.zero(), + OwnerID: UUID.zero(), + OwnerIsGroup: false, + Message: '', + URL: '' + }; + newObjData['ObjectName'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjData['OwnerIsGroup'] = (buf.readUInt8(pos++) === 1); + newObjData['Message'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['URL'] = buf.toString('utf8', pos, length); + pos += length; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/LogDwellTime.ts b/lib/classes/packets/LogDwellTime.ts index 4bd6714..b08eed8 100644 --- a/lib/classes/packets/LogDwellTime.ts +++ b/lib/classes/packets/LogDwellTime.ts @@ -26,4 +26,64 @@ export class LogDwellTimePacket implements Packet return (this.DwellInfo['SimName'].length + 1) + 46; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.DwellInfo['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.DwellInfo['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeFloatLE(this.DwellInfo['Duration'], pos); + pos += 4; + buf.write(this.DwellInfo['SimName'], pos); + pos += this.DwellInfo['SimName'].length; + buf.writeUInt32LE(this.DwellInfo['RegionX'], pos); + pos += 4; + buf.writeUInt32LE(this.DwellInfo['RegionY'], pos); + pos += 4; + buf.writeUInt8(this.DwellInfo['AvgAgentsInView'], pos++); + buf.writeUInt8(this.DwellInfo['AvgViewerFPS'], pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjDwellInfo: { + AgentID: UUID, + SessionID: UUID, + Duration: number, + SimName: string, + RegionX: number, + RegionY: number, + AvgAgentsInView: number, + AvgViewerFPS: number + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + Duration: 0, + SimName: '', + RegionX: 0, + RegionY: 0, + AvgAgentsInView: 0, + AvgViewerFPS: 0 + }; + newObjDwellInfo['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjDwellInfo['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjDwellInfo['Duration'] = buf.readFloatLE(pos); + pos += 4; + newObjDwellInfo['SimName'] = buf.toString('utf8', pos, length); + pos += length; + newObjDwellInfo['RegionX'] = buf.readUInt32LE(pos); + pos += 4; + newObjDwellInfo['RegionY'] = buf.readUInt32LE(pos); + pos += 4; + newObjDwellInfo['AvgAgentsInView'] = buf.readUInt8(pos++); + newObjDwellInfo['AvgViewerFPS'] = buf.readUInt8(pos++); + this.DwellInfo = newObjDwellInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/LogFailedMoneyTransaction.ts b/lib/classes/packets/LogFailedMoneyTransaction.ts index 8122385..623ada2 100644 --- a/lib/classes/packets/LogFailedMoneyTransaction.ts +++ b/lib/classes/packets/LogFailedMoneyTransaction.ts @@ -30,4 +30,82 @@ export class LogFailedMoneyTransactionPacket implements Packet return 74; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.TransactionData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.TransactionData['TransactionTime'], pos); + pos += 4; + buf.writeInt32LE(this.TransactionData['TransactionType'], pos); + pos += 4; + this.TransactionData['SourceID'].writeToBuffer(buf, pos); + pos += 16; + this.TransactionData['DestID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.TransactionData['Flags'], pos++); + buf.writeInt32LE(this.TransactionData['Amount'], pos); + pos += 4; + this.TransactionData['SimulatorIP'].writeToBuffer(buf, pos); + pos += 4; + buf.writeUInt32LE(this.TransactionData['GridX'], pos); + pos += 4; + buf.writeUInt32LE(this.TransactionData['GridY'], pos); + pos += 4; + buf.writeUInt8(this.TransactionData['FailureType'], pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjTransactionData: { + TransactionID: UUID, + TransactionTime: number, + TransactionType: number, + SourceID: UUID, + DestID: UUID, + Flags: number, + Amount: number, + SimulatorIP: IPAddress, + GridX: number, + GridY: number, + FailureType: number + } = { + TransactionID: UUID.zero(), + TransactionTime: 0, + TransactionType: 0, + SourceID: UUID.zero(), + DestID: UUID.zero(), + Flags: 0, + Amount: 0, + SimulatorIP: IPAddress.zero(), + GridX: 0, + GridY: 0, + FailureType: 0 + }; + newObjTransactionData['TransactionID'] = new UUID(buf, pos); + pos += 16; + newObjTransactionData['TransactionTime'] = buf.readUInt32LE(pos); + pos += 4; + newObjTransactionData['TransactionType'] = buf.readInt32LE(pos); + pos += 4; + newObjTransactionData['SourceID'] = new UUID(buf, pos); + pos += 16; + newObjTransactionData['DestID'] = new UUID(buf, pos); + pos += 16; + newObjTransactionData['Flags'] = buf.readUInt8(pos++); + newObjTransactionData['Amount'] = buf.readInt32LE(pos); + pos += 4; + newObjTransactionData['SimulatorIP'] = new IPAddress(buf, pos); + pos += 4; + newObjTransactionData['GridX'] = buf.readUInt32LE(pos); + pos += 4; + newObjTransactionData['GridY'] = buf.readUInt32LE(pos); + pos += 4; + newObjTransactionData['FailureType'] = buf.readUInt8(pos++); + this.TransactionData = newObjTransactionData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/LogParcelChanges.ts b/lib/classes/packets/LogParcelChanges.ts index 13d8f2e..93f014d 100644 --- a/lib/classes/packets/LogParcelChanges.ts +++ b/lib/classes/packets/LogParcelChanges.ts @@ -31,4 +31,84 @@ export class LogParcelChangesPacket implements Packet return ((54) * this.ParcelData.length) + 25; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.RegionData['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.RegionData['RegionHandle'].high, pos); + pos += 4; + const count = this.ParcelData.length; + buf.writeUInt8(this.ParcelData.length, pos++); + for (let i = 0; i < count; i++) + { + this.ParcelData[i]['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + this.ParcelData[i]['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.ParcelData[i]['IsOwnerGroup']) ? 1 : 0, pos++); + buf.writeInt32LE(this.ParcelData[i]['ActualArea'], pos); + pos += 4; + buf.writeInt8(this.ParcelData[i]['Action'], pos++); + this.ParcelData[i]['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjRegionData: { + RegionHandle: Long + } = { + RegionHandle: Long.ZERO + }; + newObjRegionData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + this.RegionData = newObjRegionData; + const count = buf.readUInt8(pos++); + this.ParcelData = []; + for (let i = 0; i < count; i++) + { + const newObjParcelData: { + ParcelID: UUID, + OwnerID: UUID, + IsOwnerGroup: boolean, + ActualArea: number, + Action: number, + TransactionID: UUID + } = { + ParcelID: UUID.zero(), + OwnerID: UUID.zero(), + IsOwnerGroup: false, + ActualArea: 0, + Action: 0, + TransactionID: UUID.zero() + }; + newObjParcelData['ParcelID'] = new UUID(buf, pos); + pos += 16; + newObjParcelData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjParcelData['IsOwnerGroup'] = (buf.readUInt8(pos++) === 1); + newObjParcelData['ActualArea'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['Action'] = buf.readInt8(pos++); + newObjParcelData['TransactionID'] = new UUID(buf, pos); + pos += 16; + this.ParcelData.push(newObjParcelData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/LogTextMessage.ts b/lib/classes/packets/LogTextMessage.ts index de02789..9ba96d5 100644 --- a/lib/classes/packets/LogTextMessage.ts +++ b/lib/classes/packets/LogTextMessage.ts @@ -34,4 +34,66 @@ export class LogTextMessagePacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.DataBlock.length; + buf.writeUInt8(this.DataBlock.length, pos++); + for (let i = 0; i < count; i++) + { + this.DataBlock[i]['FromAgentId'].writeToBuffer(buf, pos); + pos += 16; + this.DataBlock[i]['ToAgentId'].writeToBuffer(buf, pos); + pos += 16; + buf.writeDoubleLE(this.DataBlock[i]['GlobalX'], pos); + pos += 8; + buf.writeDoubleLE(this.DataBlock[i]['GlobalY'], pos); + pos += 8; + buf.writeUInt32LE(this.DataBlock[i]['Time'], pos); + pos += 4; + buf.write(this.DataBlock[i]['Message'], pos); + pos += this.DataBlock[i]['Message'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.DataBlock = []; + for (let i = 0; i < count; i++) + { + const newObjDataBlock: { + FromAgentId: UUID, + ToAgentId: UUID, + GlobalX: number, + GlobalY: number, + Time: number, + Message: string + } = { + FromAgentId: UUID.zero(), + ToAgentId: UUID.zero(), + GlobalX: 0, + GlobalY: 0, + Time: 0, + Message: '' + }; + newObjDataBlock['FromAgentId'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['ToAgentId'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['GlobalX'] = buf.readDoubleLE(pos); + pos += 8; + newObjDataBlock['GlobalY'] = buf.readDoubleLE(pos); + pos += 8; + newObjDataBlock['Time'] = buf.readUInt32LE(pos); + pos += 4; + newObjDataBlock['Message'] = buf.toString('utf8', pos, length); + pos += length; + this.DataBlock.push(newObjDataBlock); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/LogoutReply.ts b/lib/classes/packets/LogoutReply.ts index 263878a..39af827 100644 --- a/lib/classes/packets/LogoutReply.ts +++ b/lib/classes/packets/LogoutReply.ts @@ -23,4 +23,52 @@ export class LogoutReplyPacket implements Packet return ((16) * this.InventoryData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.InventoryData.length; + buf.writeUInt8(this.InventoryData.length, pos++); + for (let i = 0; i < count; i++) + { + this.InventoryData[i]['ItemID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.InventoryData = []; + for (let i = 0; i < count; i++) + { + const newObjInventoryData: { + ItemID: UUID + } = { + ItemID: UUID.zero() + }; + newObjInventoryData['ItemID'] = new UUID(buf, pos); + pos += 16; + this.InventoryData.push(newObjInventoryData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/LogoutRequest.ts b/lib/classes/packets/LogoutRequest.ts index 34d7277..08e8020 100644 --- a/lib/classes/packets/LogoutRequest.ts +++ b/lib/classes/packets/LogoutRequest.ts @@ -20,4 +20,32 @@ export class LogoutRequestPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/MapBlockReply.ts b/lib/classes/packets/MapBlockReply.ts index 8024cf7..87972be 100644 --- a/lib/classes/packets/MapBlockReply.ts +++ b/lib/classes/packets/MapBlockReply.ts @@ -40,4 +40,88 @@ export class MapBlockReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AgentData['Flags'], pos); + pos += 4; + const count = this.Data.length; + buf.writeUInt8(this.Data.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt16LE(this.Data[i]['X'], pos); + pos += 2; + buf.writeUInt16LE(this.Data[i]['Y'], pos); + pos += 2; + buf.write(this.Data[i]['Name'], pos); + pos += this.Data[i]['Name'].length; + buf.writeUInt8(this.Data[i]['Access'], pos++); + buf.writeUInt32LE(this.Data[i]['RegionFlags'], pos); + pos += 4; + buf.writeUInt8(this.Data[i]['WaterHeight'], pos++); + buf.writeUInt8(this.Data[i]['Agents'], pos++); + this.Data[i]['MapImageID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + Flags: number + } = { + AgentID: UUID.zero(), + Flags: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.Data = []; + for (let i = 0; i < count; i++) + { + const newObjData: { + X: number, + Y: number, + Name: string, + Access: number, + RegionFlags: number, + WaterHeight: number, + Agents: number, + MapImageID: UUID + } = { + X: 0, + Y: 0, + Name: '', + Access: 0, + RegionFlags: 0, + WaterHeight: 0, + Agents: 0, + MapImageID: UUID.zero() + }; + newObjData['X'] = buf.readUInt16LE(pos); + pos += 2; + newObjData['Y'] = buf.readUInt16LE(pos); + pos += 2; + newObjData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['Access'] = buf.readUInt8(pos++); + newObjData['RegionFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjData['WaterHeight'] = buf.readUInt8(pos++); + newObjData['Agents'] = buf.readUInt8(pos++); + newObjData['MapImageID'] = new UUID(buf, pos); + pos += 16; + this.Data.push(newObjData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/MapBlockRequest.ts b/lib/classes/packets/MapBlockRequest.ts index 39dd61c..2d01702 100644 --- a/lib/classes/packets/MapBlockRequest.ts +++ b/lib/classes/packets/MapBlockRequest.ts @@ -29,4 +29,76 @@ export class MapBlockRequestPacket implements Packet return 49; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AgentData['Flags'], pos); + pos += 4; + buf.writeUInt32LE(this.AgentData['EstateID'], pos); + pos += 4; + buf.writeUInt8((this.AgentData['Godlike']) ? 1 : 0, pos++); + buf.writeUInt16LE(this.PositionData['MinX'], pos); + pos += 2; + buf.writeUInt16LE(this.PositionData['MaxX'], pos); + pos += 2; + buf.writeUInt16LE(this.PositionData['MinY'], pos); + pos += 2; + buf.writeUInt16LE(this.PositionData['MaxY'], pos); + pos += 2; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + Flags: number, + EstateID: number, + Godlike: boolean + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + Flags: 0, + EstateID: 0, + Godlike: false + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + newObjAgentData['EstateID'] = buf.readUInt32LE(pos); + pos += 4; + newObjAgentData['Godlike'] = (buf.readUInt8(pos++) === 1); + this.AgentData = newObjAgentData; + const newObjPositionData: { + MinX: number, + MaxX: number, + MinY: number, + MaxY: number + } = { + MinX: 0, + MaxX: 0, + MinY: 0, + MaxY: 0 + }; + newObjPositionData['MinX'] = buf.readUInt16LE(pos); + pos += 2; + newObjPositionData['MaxX'] = buf.readUInt16LE(pos); + pos += 2; + newObjPositionData['MinY'] = buf.readUInt16LE(pos); + pos += 2; + newObjPositionData['MaxY'] = buf.readUInt16LE(pos); + pos += 2; + this.PositionData = newObjPositionData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/MapItemReply.ts b/lib/classes/packets/MapItemReply.ts index 49c7a94..cc1d464 100644 --- a/lib/classes/packets/MapItemReply.ts +++ b/lib/classes/packets/MapItemReply.ts @@ -41,4 +41,92 @@ export class MapItemReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AgentData['Flags'], pos); + pos += 4; + buf.writeUInt32LE(this.RequestData['ItemType'], pos); + pos += 4; + const count = this.Data.length; + buf.writeUInt8(this.Data.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.Data[i]['X'], pos); + pos += 4; + buf.writeUInt32LE(this.Data[i]['Y'], pos); + pos += 4; + this.Data[i]['ID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.Data[i]['Extra'], pos); + pos += 4; + buf.writeInt32LE(this.Data[i]['Extra2'], pos); + pos += 4; + buf.write(this.Data[i]['Name'], pos); + pos += this.Data[i]['Name'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + Flags: number + } = { + AgentID: UUID.zero(), + Flags: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + this.AgentData = newObjAgentData; + const newObjRequestData: { + ItemType: number + } = { + ItemType: 0 + }; + newObjRequestData['ItemType'] = buf.readUInt32LE(pos); + pos += 4; + this.RequestData = newObjRequestData; + const count = buf.readUInt8(pos++); + this.Data = []; + for (let i = 0; i < count; i++) + { + const newObjData: { + X: number, + Y: number, + ID: UUID, + Extra: number, + Extra2: number, + Name: string + } = { + X: 0, + Y: 0, + ID: UUID.zero(), + Extra: 0, + Extra2: 0, + Name: '' + }; + newObjData['X'] = buf.readUInt32LE(pos); + pos += 4; + newObjData['Y'] = buf.readUInt32LE(pos); + pos += 4; + newObjData['ID'] = new UUID(buf, pos); + pos += 16; + newObjData['Extra'] = buf.readInt32LE(pos); + pos += 4; + newObjData['Extra2'] = buf.readInt32LE(pos); + pos += 4; + newObjData['Name'] = buf.toString('utf8', pos, length); + pos += length; + this.Data.push(newObjData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/MapItemRequest.ts b/lib/classes/packets/MapItemRequest.ts index bf2f389..3bb8535 100644 --- a/lib/classes/packets/MapItemRequest.ts +++ b/lib/classes/packets/MapItemRequest.ts @@ -28,4 +28,66 @@ export class MapItemRequestPacket implements Packet return 53; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AgentData['Flags'], pos); + pos += 4; + buf.writeUInt32LE(this.AgentData['EstateID'], pos); + pos += 4; + buf.writeUInt8((this.AgentData['Godlike']) ? 1 : 0, pos++); + buf.writeUInt32LE(this.RequestData['ItemType'], pos); + pos += 4; + buf.writeInt32LE(this.RequestData['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.RequestData['RegionHandle'].high, pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + Flags: number, + EstateID: number, + Godlike: boolean + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + Flags: 0, + EstateID: 0, + Godlike: false + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + newObjAgentData['EstateID'] = buf.readUInt32LE(pos); + pos += 4; + newObjAgentData['Godlike'] = (buf.readUInt8(pos++) === 1); + this.AgentData = newObjAgentData; + const newObjRequestData: { + ItemType: number, + RegionHandle: Long + } = { + ItemType: 0, + RegionHandle: Long.ZERO + }; + newObjRequestData['ItemType'] = buf.readUInt32LE(pos); + pos += 4; + newObjRequestData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + this.RequestData = newObjRequestData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/MapLayerReply.ts b/lib/classes/packets/MapLayerReply.ts index c108bd1..fa4c4a8 100644 --- a/lib/classes/packets/MapLayerReply.ts +++ b/lib/classes/packets/MapLayerReply.ts @@ -27,4 +27,76 @@ export class MapLayerReplyPacket implements Packet return ((32) * this.LayerData.length) + 21; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AgentData['Flags'], pos); + pos += 4; + const count = this.LayerData.length; + buf.writeUInt8(this.LayerData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.LayerData[i]['Left'], pos); + pos += 4; + buf.writeUInt32LE(this.LayerData[i]['Right'], pos); + pos += 4; + buf.writeUInt32LE(this.LayerData[i]['Top'], pos); + pos += 4; + buf.writeUInt32LE(this.LayerData[i]['Bottom'], pos); + pos += 4; + this.LayerData[i]['ImageID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + Flags: number + } = { + AgentID: UUID.zero(), + Flags: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.LayerData = []; + for (let i = 0; i < count; i++) + { + const newObjLayerData: { + Left: number, + Right: number, + Top: number, + Bottom: number, + ImageID: UUID + } = { + Left: 0, + Right: 0, + Top: 0, + Bottom: 0, + ImageID: UUID.zero() + }; + newObjLayerData['Left'] = buf.readUInt32LE(pos); + pos += 4; + newObjLayerData['Right'] = buf.readUInt32LE(pos); + pos += 4; + newObjLayerData['Top'] = buf.readUInt32LE(pos); + pos += 4; + newObjLayerData['Bottom'] = buf.readUInt32LE(pos); + pos += 4; + newObjLayerData['ImageID'] = new UUID(buf, pos); + pos += 16; + this.LayerData.push(newObjLayerData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/MapLayerRequest.ts b/lib/classes/packets/MapLayerRequest.ts index 36cb5dd..55c6cc3 100644 --- a/lib/classes/packets/MapLayerRequest.ts +++ b/lib/classes/packets/MapLayerRequest.ts @@ -23,4 +23,48 @@ export class MapLayerRequestPacket implements Packet return 41; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AgentData['Flags'], pos); + pos += 4; + buf.writeUInt32LE(this.AgentData['EstateID'], pos); + pos += 4; + buf.writeUInt8((this.AgentData['Godlike']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + Flags: number, + EstateID: number, + Godlike: boolean + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + Flags: 0, + EstateID: 0, + Godlike: false + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + newObjAgentData['EstateID'] = buf.readUInt32LE(pos); + pos += 4; + newObjAgentData['Godlike'] = (buf.readUInt8(pos++) === 1); + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/MapNameRequest.ts b/lib/classes/packets/MapNameRequest.ts index 643c304..ab03c4e 100644 --- a/lib/classes/packets/MapNameRequest.ts +++ b/lib/classes/packets/MapNameRequest.ts @@ -26,4 +26,58 @@ export class MapNameRequestPacket implements Packet return (this.NameData['Name'].length + 1) + 41; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AgentData['Flags'], pos); + pos += 4; + buf.writeUInt32LE(this.AgentData['EstateID'], pos); + pos += 4; + buf.writeUInt8((this.AgentData['Godlike']) ? 1 : 0, pos++); + buf.write(this.NameData['Name'], pos); + pos += this.NameData['Name'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + Flags: number, + EstateID: number, + Godlike: boolean + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + Flags: 0, + EstateID: 0, + Godlike: false + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + newObjAgentData['EstateID'] = buf.readUInt32LE(pos); + pos += 4; + newObjAgentData['Godlike'] = (buf.readUInt8(pos++) === 1); + this.AgentData = newObjAgentData; + const newObjNameData: { + Name: string + } = { + Name: '' + }; + newObjNameData['Name'] = buf.toString('utf8', pos, length); + pos += length; + this.NameData = newObjNameData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/MeanCollisionAlert.ts b/lib/classes/packets/MeanCollisionAlert.ts index 99ad199..2432d90 100644 --- a/lib/classes/packets/MeanCollisionAlert.ts +++ b/lib/classes/packets/MeanCollisionAlert.ts @@ -23,4 +23,58 @@ export class MeanCollisionAlertPacket implements Packet return ((41) * this.MeanCollision.length) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.MeanCollision.length; + buf.writeUInt8(this.MeanCollision.length, pos++); + for (let i = 0; i < count; i++) + { + this.MeanCollision[i]['Victim'].writeToBuffer(buf, pos); + pos += 16; + this.MeanCollision[i]['Perp'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.MeanCollision[i]['Time'], pos); + pos += 4; + buf.writeFloatLE(this.MeanCollision[i]['Mag'], pos); + pos += 4; + buf.writeUInt8(this.MeanCollision[i]['Type'], pos++); + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.MeanCollision = []; + for (let i = 0; i < count; i++) + { + const newObjMeanCollision: { + Victim: UUID, + Perp: UUID, + Time: number, + Mag: number, + Type: number + } = { + Victim: UUID.zero(), + Perp: UUID.zero(), + Time: 0, + Mag: 0, + Type: 0 + }; + newObjMeanCollision['Victim'] = new UUID(buf, pos); + pos += 16; + newObjMeanCollision['Perp'] = new UUID(buf, pos); + pos += 16; + newObjMeanCollision['Time'] = buf.readUInt32LE(pos); + pos += 4; + newObjMeanCollision['Mag'] = buf.readFloatLE(pos); + pos += 4; + newObjMeanCollision['Type'] = buf.readUInt8(pos++); + this.MeanCollision.push(newObjMeanCollision); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/MergeParcel.ts b/lib/classes/packets/MergeParcel.ts index baf64df..1e525eb 100644 --- a/lib/classes/packets/MergeParcel.ts +++ b/lib/classes/packets/MergeParcel.ts @@ -22,4 +22,46 @@ export class MergeParcelPacket implements Packet return ((16) * this.SlaveParcelData.length) + 17; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.MasterParcelData['MasterID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.SlaveParcelData.length; + buf.writeUInt8(this.SlaveParcelData.length, pos++); + for (let i = 0; i < count; i++) + { + this.SlaveParcelData[i]['SlaveID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjMasterParcelData: { + MasterID: UUID + } = { + MasterID: UUID.zero() + }; + newObjMasterParcelData['MasterID'] = new UUID(buf, pos); + pos += 16; + this.MasterParcelData = newObjMasterParcelData; + const count = buf.readUInt8(pos++); + this.SlaveParcelData = []; + for (let i = 0; i < count; i++) + { + const newObjSlaveParcelData: { + SlaveID: UUID + } = { + SlaveID: UUID.zero() + }; + newObjSlaveParcelData['SlaveID'] = new UUID(buf, pos); + pos += 16; + this.SlaveParcelData.push(newObjSlaveParcelData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ModifyLand.ts b/lib/classes/packets/ModifyLand.ts index 8713ee3..855661e 100644 --- a/lib/classes/packets/ModifyLand.ts +++ b/lib/classes/packets/ModifyLand.ts @@ -36,4 +36,120 @@ export class ModifyLandPacket implements Packet return ((20) * this.ParcelData.length) + ((4) * this.ModifyBlockExtended.length) + 44; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.ModifyBlock['Action'], pos++); + buf.writeUInt8(this.ModifyBlock['BrushSize'], pos++); + buf.writeFloatLE(this.ModifyBlock['Seconds'], pos); + pos += 4; + buf.writeFloatLE(this.ModifyBlock['Height'], pos); + pos += 4; + let count = this.ParcelData.length; + buf.writeUInt8(this.ParcelData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeInt32LE(this.ParcelData[i]['LocalID'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData[i]['West'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData[i]['South'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData[i]['East'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData[i]['North'], pos); + pos += 4; + } + count = this.ModifyBlockExtended.length; + buf.writeUInt8(this.ModifyBlockExtended.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeFloatLE(this.ModifyBlockExtended[i]['BrushSize'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjModifyBlock: { + Action: number, + BrushSize: number, + Seconds: number, + Height: number + } = { + Action: 0, + BrushSize: 0, + Seconds: 0, + Height: 0 + }; + newObjModifyBlock['Action'] = buf.readUInt8(pos++); + newObjModifyBlock['BrushSize'] = buf.readUInt8(pos++); + newObjModifyBlock['Seconds'] = buf.readFloatLE(pos); + pos += 4; + newObjModifyBlock['Height'] = buf.readFloatLE(pos); + pos += 4; + this.ModifyBlock = newObjModifyBlock; + let count = buf.readUInt8(pos++); + this.ParcelData = []; + for (let i = 0; i < count; i++) + { + const newObjParcelData: { + LocalID: number, + West: number, + South: number, + East: number, + North: number + } = { + LocalID: 0, + West: 0, + South: 0, + East: 0, + North: 0 + }; + newObjParcelData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['West'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['South'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['East'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['North'] = buf.readFloatLE(pos); + pos += 4; + this.ParcelData.push(newObjParcelData); + } + count = buf.readUInt8(pos++); + this.ModifyBlockExtended = []; + for (let i = 0; i < count; i++) + { + const newObjModifyBlockExtended: { + BrushSize: number + } = { + BrushSize: 0 + }; + newObjModifyBlockExtended['BrushSize'] = buf.readFloatLE(pos); + pos += 4; + this.ModifyBlockExtended.push(newObjModifyBlockExtended); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/MoneyBalanceReply.ts b/lib/classes/packets/MoneyBalanceReply.ts index 0f1f8f5..e5fb689 100644 --- a/lib/classes/packets/MoneyBalanceReply.ts +++ b/lib/classes/packets/MoneyBalanceReply.ts @@ -34,4 +34,102 @@ export class MoneyBalanceReplyPacket implements Packet return (this.MoneyData['Description'].length + 1) + (this.TransactionInfo['ItemDescription'].length + 1) + 87; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.MoneyData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.MoneyData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.MoneyData['TransactionSuccess']) ? 1 : 0, pos++); + buf.writeInt32LE(this.MoneyData['MoneyBalance'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['SquareMetersCredit'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['SquareMetersCommitted'], pos); + pos += 4; + buf.write(this.MoneyData['Description'], pos); + pos += this.MoneyData['Description'].length; + buf.writeInt32LE(this.TransactionInfo['TransactionType'], pos); + pos += 4; + this.TransactionInfo['SourceID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.TransactionInfo['IsSourceGroup']) ? 1 : 0, pos++); + this.TransactionInfo['DestID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.TransactionInfo['IsDestGroup']) ? 1 : 0, pos++); + buf.writeInt32LE(this.TransactionInfo['Amount'], pos); + pos += 4; + buf.write(this.TransactionInfo['ItemDescription'], pos); + pos += this.TransactionInfo['ItemDescription'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjMoneyData: { + AgentID: UUID, + TransactionID: UUID, + TransactionSuccess: boolean, + MoneyBalance: number, + SquareMetersCredit: number, + SquareMetersCommitted: number, + Description: string + } = { + AgentID: UUID.zero(), + TransactionID: UUID.zero(), + TransactionSuccess: false, + MoneyBalance: 0, + SquareMetersCredit: 0, + SquareMetersCommitted: 0, + Description: '' + }; + newObjMoneyData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjMoneyData['TransactionID'] = new UUID(buf, pos); + pos += 16; + newObjMoneyData['TransactionSuccess'] = (buf.readUInt8(pos++) === 1); + newObjMoneyData['MoneyBalance'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['SquareMetersCredit'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['SquareMetersCommitted'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['Description'] = buf.toString('utf8', pos, length); + pos += length; + this.MoneyData = newObjMoneyData; + const newObjTransactionInfo: { + TransactionType: number, + SourceID: UUID, + IsSourceGroup: boolean, + DestID: UUID, + IsDestGroup: boolean, + Amount: number, + ItemDescription: string + } = { + TransactionType: 0, + SourceID: UUID.zero(), + IsSourceGroup: false, + DestID: UUID.zero(), + IsDestGroup: false, + Amount: 0, + ItemDescription: '' + }; + newObjTransactionInfo['TransactionType'] = buf.readInt32LE(pos); + pos += 4; + newObjTransactionInfo['SourceID'] = new UUID(buf, pos); + pos += 16; + newObjTransactionInfo['IsSourceGroup'] = (buf.readUInt8(pos++) === 1); + newObjTransactionInfo['DestID'] = new UUID(buf, pos); + pos += 16; + newObjTransactionInfo['IsDestGroup'] = (buf.readUInt8(pos++) === 1); + newObjTransactionInfo['Amount'] = buf.readInt32LE(pos); + pos += 4; + newObjTransactionInfo['ItemDescription'] = buf.toString('utf8', pos, length); + pos += length; + this.TransactionInfo = newObjTransactionInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/MoneyBalanceRequest.ts b/lib/classes/packets/MoneyBalanceRequest.ts index 4e1a294..a5e1793 100644 --- a/lib/classes/packets/MoneyBalanceRequest.ts +++ b/lib/classes/packets/MoneyBalanceRequest.ts @@ -23,4 +23,42 @@ export class MoneyBalanceRequestPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.MoneyData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjMoneyData: { + TransactionID: UUID + } = { + TransactionID: UUID.zero() + }; + newObjMoneyData['TransactionID'] = new UUID(buf, pos); + pos += 16; + this.MoneyData = newObjMoneyData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/MoneyTransferBackend.ts b/lib/classes/packets/MoneyTransferBackend.ts index d6978e8..2f20c6e 100644 --- a/lib/classes/packets/MoneyTransferBackend.ts +++ b/lib/classes/packets/MoneyTransferBackend.ts @@ -31,4 +31,92 @@ export class MoneyTransferBackendPacket implements Packet return (this.MoneyData['Description'].length + 1) + 87; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.MoneyData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.MoneyData['TransactionTime'], pos); + pos += 4; + this.MoneyData['SourceID'].writeToBuffer(buf, pos); + pos += 16; + this.MoneyData['DestID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.MoneyData['Flags'], pos++); + buf.writeInt32LE(this.MoneyData['Amount'], pos); + pos += 4; + buf.writeUInt8(this.MoneyData['AggregatePermNextOwner'], pos++); + buf.writeUInt8(this.MoneyData['AggregatePermInventory'], pos++); + buf.writeInt32LE(this.MoneyData['TransactionType'], pos); + pos += 4; + this.MoneyData['RegionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.MoneyData['GridX'], pos); + pos += 4; + buf.writeUInt32LE(this.MoneyData['GridY'], pos); + pos += 4; + buf.write(this.MoneyData['Description'], pos); + pos += this.MoneyData['Description'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjMoneyData: { + TransactionID: UUID, + TransactionTime: number, + SourceID: UUID, + DestID: UUID, + Flags: number, + Amount: number, + AggregatePermNextOwner: number, + AggregatePermInventory: number, + TransactionType: number, + RegionID: UUID, + GridX: number, + GridY: number, + Description: string + } = { + TransactionID: UUID.zero(), + TransactionTime: 0, + SourceID: UUID.zero(), + DestID: UUID.zero(), + Flags: 0, + Amount: 0, + AggregatePermNextOwner: 0, + AggregatePermInventory: 0, + TransactionType: 0, + RegionID: UUID.zero(), + GridX: 0, + GridY: 0, + Description: '' + }; + newObjMoneyData['TransactionID'] = new UUID(buf, pos); + pos += 16; + newObjMoneyData['TransactionTime'] = buf.readUInt32LE(pos); + pos += 4; + newObjMoneyData['SourceID'] = new UUID(buf, pos); + pos += 16; + newObjMoneyData['DestID'] = new UUID(buf, pos); + pos += 16; + newObjMoneyData['Flags'] = buf.readUInt8(pos++); + newObjMoneyData['Amount'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['AggregatePermNextOwner'] = buf.readUInt8(pos++); + newObjMoneyData['AggregatePermInventory'] = buf.readUInt8(pos++); + newObjMoneyData['TransactionType'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['RegionID'] = new UUID(buf, pos); + pos += 16; + newObjMoneyData['GridX'] = buf.readUInt32LE(pos); + pos += 4; + newObjMoneyData['GridY'] = buf.readUInt32LE(pos); + pos += 4; + newObjMoneyData['Description'] = buf.toString('utf8', pos, length); + pos += length; + this.MoneyData = newObjMoneyData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/MoneyTransferRequest.ts b/lib/classes/packets/MoneyTransferRequest.ts index fd094b3..5483a3f 100644 --- a/lib/classes/packets/MoneyTransferRequest.ts +++ b/lib/classes/packets/MoneyTransferRequest.ts @@ -30,4 +30,78 @@ export class MoneyTransferRequestPacket implements Packet return (this.MoneyData['Description'].length + 1) + 75; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.MoneyData['SourceID'].writeToBuffer(buf, pos); + pos += 16; + this.MoneyData['DestID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.MoneyData['Flags'], pos++); + buf.writeInt32LE(this.MoneyData['Amount'], pos); + pos += 4; + buf.writeUInt8(this.MoneyData['AggregatePermNextOwner'], pos++); + buf.writeUInt8(this.MoneyData['AggregatePermInventory'], pos++); + buf.writeInt32LE(this.MoneyData['TransactionType'], pos); + pos += 4; + buf.write(this.MoneyData['Description'], pos); + pos += this.MoneyData['Description'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjMoneyData: { + SourceID: UUID, + DestID: UUID, + Flags: number, + Amount: number, + AggregatePermNextOwner: number, + AggregatePermInventory: number, + TransactionType: number, + Description: string + } = { + SourceID: UUID.zero(), + DestID: UUID.zero(), + Flags: 0, + Amount: 0, + AggregatePermNextOwner: 0, + AggregatePermInventory: 0, + TransactionType: 0, + Description: '' + }; + newObjMoneyData['SourceID'] = new UUID(buf, pos); + pos += 16; + newObjMoneyData['DestID'] = new UUID(buf, pos); + pos += 16; + newObjMoneyData['Flags'] = buf.readUInt8(pos++); + newObjMoneyData['Amount'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['AggregatePermNextOwner'] = buf.readUInt8(pos++); + newObjMoneyData['AggregatePermInventory'] = buf.readUInt8(pos++); + newObjMoneyData['TransactionType'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['Description'] = buf.toString('utf8', pos, length); + pos += length; + this.MoneyData = newObjMoneyData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/MoveInventoryFolder.ts b/lib/classes/packets/MoveInventoryFolder.ts index 3183a77..19bafa2 100644 --- a/lib/classes/packets/MoveInventoryFolder.ts +++ b/lib/classes/packets/MoveInventoryFolder.ts @@ -25,4 +25,62 @@ export class MoveInventoryFolderPacket implements Packet return ((32) * this.InventoryData.length) + 34; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.AgentData['Stamp']) ? 1 : 0, pos++); + const count = this.InventoryData.length; + buf.writeUInt8(this.InventoryData.length, pos++); + for (let i = 0; i < count; i++) + { + this.InventoryData[i]['FolderID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData[i]['ParentID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + Stamp: boolean + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + Stamp: false + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['Stamp'] = (buf.readUInt8(pos++) === 1); + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.InventoryData = []; + for (let i = 0; i < count; i++) + { + const newObjInventoryData: { + FolderID: UUID, + ParentID: UUID + } = { + FolderID: UUID.zero(), + ParentID: UUID.zero() + }; + newObjInventoryData['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['ParentID'] = new UUID(buf, pos); + pos += 16; + this.InventoryData.push(newObjInventoryData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/MoveInventoryItem.ts b/lib/classes/packets/MoveInventoryItem.ts index ce9936f..60968a1 100644 --- a/lib/classes/packets/MoveInventoryItem.ts +++ b/lib/classes/packets/MoveInventoryItem.ts @@ -36,4 +36,68 @@ export class MoveInventoryItemPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.AgentData['Stamp']) ? 1 : 0, pos++); + const count = this.InventoryData.length; + buf.writeUInt8(this.InventoryData.length, pos++); + for (let i = 0; i < count; i++) + { + this.InventoryData[i]['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData[i]['FolderID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.InventoryData[i]['NewName'], pos); + pos += this.InventoryData[i]['NewName'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + Stamp: boolean + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + Stamp: false + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['Stamp'] = (buf.readUInt8(pos++) === 1); + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.InventoryData = []; + for (let i = 0; i < count; i++) + { + const newObjInventoryData: { + ItemID: UUID, + FolderID: UUID, + NewName: string + } = { + ItemID: UUID.zero(), + FolderID: UUID.zero(), + NewName: '' + }; + newObjInventoryData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['NewName'] = buf.toString('utf8', pos, length); + pos += length; + this.InventoryData.push(newObjInventoryData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/MoveTaskInventory.ts b/lib/classes/packets/MoveTaskInventory.ts index d10cb08..9b16493 100644 --- a/lib/classes/packets/MoveTaskInventory.ts +++ b/lib/classes/packets/MoveTaskInventory.ts @@ -25,4 +25,54 @@ export class MoveTaskInventoryPacket implements Packet return 68; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['FolderID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.InventoryData['LocalID'], pos); + pos += 4; + this.InventoryData['ItemID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + FolderID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + FolderID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['FolderID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjInventoryData: { + LocalID: number, + ItemID: UUID + } = { + LocalID: 0, + ItemID: UUID.zero() + }; + newObjInventoryData['LocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['ItemID'] = new UUID(buf, pos); + pos += 16; + this.InventoryData = newObjInventoryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/MultipleObjectUpdate.ts b/lib/classes/packets/MultipleObjectUpdate.ts index 14e1bf0..a37f7dd 100644 --- a/lib/classes/packets/MultipleObjectUpdate.ts +++ b/lib/classes/packets/MultipleObjectUpdate.ts @@ -35,4 +35,62 @@ export class MultipleObjectUpdatePacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + buf.writeUInt8(this.ObjectData[i]['Type'], pos++); + buf.write(this.ObjectData[i]['Data'], pos); + pos += this.ObjectData[i]['Data'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number, + Type: number, + Data: string + } = { + ObjectLocalID: 0, + Type: 0, + Data: '' + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['Type'] = buf.readUInt8(pos++); + newObjObjectData['Data'] = buf.toString('utf8', pos, length); + pos += length; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/MuteListRequest.ts b/lib/classes/packets/MuteListRequest.ts index 7aa2073..a1a06f2 100644 --- a/lib/classes/packets/MuteListRequest.ts +++ b/lib/classes/packets/MuteListRequest.ts @@ -23,4 +23,42 @@ export class MuteListRequestPacket implements Packet return 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.MuteData['MuteCRC'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjMuteData: { + MuteCRC: number + } = { + MuteCRC: 0 + }; + newObjMuteData['MuteCRC'] = buf.readUInt32LE(pos); + pos += 4; + this.MuteData = newObjMuteData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/MuteListUpdate.ts b/lib/classes/packets/MuteListUpdate.ts index 0cb72ed..94cd955 100644 --- a/lib/classes/packets/MuteListUpdate.ts +++ b/lib/classes/packets/MuteListUpdate.ts @@ -20,4 +20,32 @@ export class MuteListUpdatePacket implements Packet return (this.MuteData['Filename'].length + 1) + 16; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.MuteData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.MuteData['Filename'], pos); + pos += this.MuteData['Filename'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjMuteData: { + AgentID: UUID, + Filename: string + } = { + AgentID: UUID.zero(), + Filename: '' + }; + newObjMuteData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjMuteData['Filename'] = buf.toString('utf8', pos, length); + pos += length; + this.MuteData = newObjMuteData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/NameValuePair.ts b/lib/classes/packets/NameValuePair.ts index 722cf1d..8111dbd 100644 --- a/lib/classes/packets/NameValuePair.ts +++ b/lib/classes/packets/NameValuePair.ts @@ -32,4 +32,46 @@ export class NameValuePairPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.TaskData['ID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.NameValueData.length; + buf.writeUInt8(this.NameValueData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.write(this.NameValueData[i]['NVPair'], pos); + pos += this.NameValueData[i]['NVPair'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjTaskData: { + ID: UUID + } = { + ID: UUID.zero() + }; + newObjTaskData['ID'] = new UUID(buf, pos); + pos += 16; + this.TaskData = newObjTaskData; + const count = buf.readUInt8(pos++); + this.NameValueData = []; + for (let i = 0; i < count; i++) + { + const newObjNameValueData: { + NVPair: string + } = { + NVPair: '' + }; + newObjNameValueData['NVPair'] = buf.toString('utf8', pos, length); + pos += length; + this.NameValueData.push(newObjNameValueData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/NearestLandingRegionReply.ts b/lib/classes/packets/NearestLandingRegionReply.ts index 5c0dc05..5ad3353 100644 --- a/lib/classes/packets/NearestLandingRegionReply.ts +++ b/lib/classes/packets/NearestLandingRegionReply.ts @@ -19,4 +19,28 @@ export class NearestLandingRegionReplyPacket implements Packet return 8; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.LandingRegionData['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.LandingRegionData['RegionHandle'].high, pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjLandingRegionData: { + RegionHandle: Long + } = { + RegionHandle: Long.ZERO + }; + newObjLandingRegionData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + this.LandingRegionData = newObjLandingRegionData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/NearestLandingRegionRequest.ts b/lib/classes/packets/NearestLandingRegionRequest.ts index 34aab23..523e049 100644 --- a/lib/classes/packets/NearestLandingRegionRequest.ts +++ b/lib/classes/packets/NearestLandingRegionRequest.ts @@ -19,4 +19,28 @@ export class NearestLandingRegionRequestPacket implements Packet return 8; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.RequestingRegionData['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.RequestingRegionData['RegionHandle'].high, pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjRequestingRegionData: { + RegionHandle: Long + } = { + RegionHandle: Long.ZERO + }; + newObjRequestingRegionData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + this.RequestingRegionData = newObjRequestingRegionData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/NearestLandingRegionUpdated.ts b/lib/classes/packets/NearestLandingRegionUpdated.ts index 76e9211..8018c47 100644 --- a/lib/classes/packets/NearestLandingRegionUpdated.ts +++ b/lib/classes/packets/NearestLandingRegionUpdated.ts @@ -19,4 +19,28 @@ export class NearestLandingRegionUpdatedPacket implements Packet return 8; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.RegionData['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.RegionData['RegionHandle'].high, pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjRegionData: { + RegionHandle: Long + } = { + RegionHandle: Long.ZERO + }; + newObjRegionData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + this.RegionData = newObjRegionData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/NeighborList.ts b/lib/classes/packets/NeighborList.ts index a9e5cd9..fbe2c48 100644 --- a/lib/classes/packets/NeighborList.ts +++ b/lib/classes/packets/NeighborList.ts @@ -36,4 +36,68 @@ export class NeighborListPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = 4; + for (let i = 0; i < count; i++) + { + this.NeighborBlock[i]['IP'].writeToBuffer(buf, pos); + pos += 4; + buf.writeUInt16LE(this.NeighborBlock[i]['Port'], pos); + pos += 2; + this.NeighborBlock[i]['PublicIP'].writeToBuffer(buf, pos); + pos += 4; + buf.writeUInt16LE(this.NeighborBlock[i]['PublicPort'], pos); + pos += 2; + this.NeighborBlock[i]['RegionID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.NeighborBlock[i]['Name'], pos); + pos += this.NeighborBlock[i]['Name'].length; + buf.writeUInt8(this.NeighborBlock[i]['SimAccess'], pos++); + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = 4; + this.NeighborBlock = []; for (let i = 0; i < count; i++) + { + const newObjNeighborBlock: { + IP: IPAddress, + Port: number, + PublicIP: IPAddress, + PublicPort: number, + RegionID: UUID, + Name: string, + SimAccess: number + } = { + IP: IPAddress.zero(), + Port: 0, + PublicIP: IPAddress.zero(), + PublicPort: 0, + RegionID: UUID.zero(), + Name: '', + SimAccess: 0 + }; + newObjNeighborBlock['IP'] = new IPAddress(buf, pos); + pos += 4; + newObjNeighborBlock['Port'] = buf.readUInt16LE(pos); + pos += 2; + newObjNeighborBlock['PublicIP'] = new IPAddress(buf, pos); + pos += 4; + newObjNeighborBlock['PublicPort'] = buf.readUInt16LE(pos); + pos += 2; + newObjNeighborBlock['RegionID'] = new UUID(buf, pos); + pos += 16; + newObjNeighborBlock['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjNeighborBlock['SimAccess'] = buf.readUInt8(pos++); + this.NeighborBlock.push(newObjNeighborBlock); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/NetTest.ts b/lib/classes/packets/NetTest.ts index 06872f5..9b68d53 100644 --- a/lib/classes/packets/NetTest.ts +++ b/lib/classes/packets/NetTest.ts @@ -18,4 +18,26 @@ export class NetTestPacket implements Packet return 2; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt16LE(this.NetBlock['Port'], pos); + pos += 2; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjNetBlock: { + Port: number + } = { + Port: 0 + }; + newObjNetBlock['Port'] = buf.readUInt16LE(pos); + pos += 2; + this.NetBlock = newObjNetBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectAdd.ts b/lib/classes/packets/ObjectAdd.ts index 13de8eb..9a37857 100644 --- a/lib/classes/packets/ObjectAdd.ts +++ b/lib/classes/packets/ObjectAdd.ts @@ -54,4 +54,180 @@ export class ObjectAddPacket implements Packet return 144; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.ObjectData['PCode'], pos++); + buf.writeUInt8(this.ObjectData['Material'], pos++); + buf.writeUInt32LE(this.ObjectData['AddFlags'], pos); + pos += 4; + buf.writeUInt8(this.ObjectData['PathCurve'], pos++); + buf.writeUInt8(this.ObjectData['ProfileCurve'], pos++); + buf.writeUInt16LE(this.ObjectData['PathBegin'], pos); + pos += 2; + buf.writeUInt16LE(this.ObjectData['PathEnd'], pos); + pos += 2; + buf.writeUInt8(this.ObjectData['PathScaleX'], pos++); + buf.writeUInt8(this.ObjectData['PathScaleY'], pos++); + buf.writeUInt8(this.ObjectData['PathShearX'], pos++); + buf.writeUInt8(this.ObjectData['PathShearY'], pos++); + buf.writeInt8(this.ObjectData['PathTwist'], pos++); + buf.writeInt8(this.ObjectData['PathTwistBegin'], pos++); + buf.writeInt8(this.ObjectData['PathRadiusOffset'], pos++); + buf.writeInt8(this.ObjectData['PathTaperX'], pos++); + buf.writeInt8(this.ObjectData['PathTaperY'], pos++); + buf.writeUInt8(this.ObjectData['PathRevolutions'], pos++); + buf.writeInt8(this.ObjectData['PathSkew'], pos++); + buf.writeUInt16LE(this.ObjectData['ProfileBegin'], pos); + pos += 2; + buf.writeUInt16LE(this.ObjectData['ProfileEnd'], pos); + pos += 2; + buf.writeUInt16LE(this.ObjectData['ProfileHollow'], pos); + pos += 2; + buf.writeUInt8(this.ObjectData['BypassRaycast'], pos++); + this.ObjectData['RayStart'].writeToBuffer(buf, pos, false); + pos += 12; + this.ObjectData['RayEnd'].writeToBuffer(buf, pos, false); + pos += 12; + this.ObjectData['RayTargetID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.ObjectData['RayEndIsIntersection'], pos++); + this.ObjectData['Scale'].writeToBuffer(buf, pos, false); + pos += 12; + this.ObjectData['Rotation'].writeToBuffer(buf, pos); + pos += 12; + buf.writeUInt8(this.ObjectData['State'], pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjObjectData: { + PCode: number, + Material: number, + AddFlags: number, + PathCurve: number, + ProfileCurve: number, + PathBegin: number, + PathEnd: number, + PathScaleX: number, + PathScaleY: number, + PathShearX: number, + PathShearY: number, + PathTwist: number, + PathTwistBegin: number, + PathRadiusOffset: number, + PathTaperX: number, + PathTaperY: number, + PathRevolutions: number, + PathSkew: number, + ProfileBegin: number, + ProfileEnd: number, + ProfileHollow: number, + BypassRaycast: number, + RayStart: Vector3, + RayEnd: Vector3, + RayTargetID: UUID, + RayEndIsIntersection: number, + Scale: Vector3, + Rotation: Quaternion, + State: number + } = { + PCode: 0, + Material: 0, + AddFlags: 0, + PathCurve: 0, + ProfileCurve: 0, + PathBegin: 0, + PathEnd: 0, + PathScaleX: 0, + PathScaleY: 0, + PathShearX: 0, + PathShearY: 0, + PathTwist: 0, + PathTwistBegin: 0, + PathRadiusOffset: 0, + PathTaperX: 0, + PathTaperY: 0, + PathRevolutions: 0, + PathSkew: 0, + ProfileBegin: 0, + ProfileEnd: 0, + ProfileHollow: 0, + BypassRaycast: 0, + RayStart: Vector3.getZero(), + RayEnd: Vector3.getZero(), + RayTargetID: UUID.zero(), + RayEndIsIntersection: 0, + Scale: Vector3.getZero(), + Rotation: Quaternion.getIdentity(), + State: 0 + }; + newObjObjectData['PCode'] = buf.readUInt8(pos++); + newObjObjectData['Material'] = buf.readUInt8(pos++); + newObjObjectData['AddFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['PathCurve'] = buf.readUInt8(pos++); + newObjObjectData['ProfileCurve'] = buf.readUInt8(pos++); + newObjObjectData['PathBegin'] = buf.readUInt16LE(pos); + pos += 2; + newObjObjectData['PathEnd'] = buf.readUInt16LE(pos); + pos += 2; + newObjObjectData['PathScaleX'] = buf.readUInt8(pos++); + newObjObjectData['PathScaleY'] = buf.readUInt8(pos++); + newObjObjectData['PathShearX'] = buf.readUInt8(pos++); + newObjObjectData['PathShearY'] = buf.readUInt8(pos++); + newObjObjectData['PathTwist'] = buf.readInt8(pos++); + newObjObjectData['PathTwistBegin'] = buf.readInt8(pos++); + newObjObjectData['PathRadiusOffset'] = buf.readInt8(pos++); + newObjObjectData['PathTaperX'] = buf.readInt8(pos++); + newObjObjectData['PathTaperY'] = buf.readInt8(pos++); + newObjObjectData['PathRevolutions'] = buf.readUInt8(pos++); + newObjObjectData['PathSkew'] = buf.readInt8(pos++); + newObjObjectData['ProfileBegin'] = buf.readUInt16LE(pos); + pos += 2; + newObjObjectData['ProfileEnd'] = buf.readUInt16LE(pos); + pos += 2; + newObjObjectData['ProfileHollow'] = buf.readUInt16LE(pos); + pos += 2; + newObjObjectData['BypassRaycast'] = buf.readUInt8(pos++); + newObjObjectData['RayStart'] = new Vector3(buf, pos, false); + pos += 12; + newObjObjectData['RayEnd'] = new Vector3(buf, pos, false); + pos += 12; + newObjObjectData['RayTargetID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['RayEndIsIntersection'] = buf.readUInt8(pos++); + newObjObjectData['Scale'] = new Vector3(buf, pos, false); + pos += 12; + newObjObjectData['Rotation'] = new Quaternion(buf, pos); + pos += 12; + newObjObjectData['State'] = buf.readUInt8(pos++); + this.ObjectData = newObjObjectData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectAttach.ts b/lib/classes/packets/ObjectAttach.ts index 2c55c28..ec7a3cc 100644 --- a/lib/classes/packets/ObjectAttach.ts +++ b/lib/classes/packets/ObjectAttach.ts @@ -26,4 +26,62 @@ export class ObjectAttachPacket implements Packet return ((16) * this.ObjectData.length) + 34; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.AgentData['AttachmentPoint'], pos++); + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + this.ObjectData[i]['Rotation'].writeToBuffer(buf, pos); + pos += 12; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + AttachmentPoint: number + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + AttachmentPoint: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['AttachmentPoint'] = buf.readUInt8(pos++); + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number, + Rotation: Quaternion + } = { + ObjectLocalID: 0, + Rotation: Quaternion.getIdentity() + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['Rotation'] = new Quaternion(buf, pos); + pos += 12; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectBuy.ts b/lib/classes/packets/ObjectBuy.ts index df45204..8f81fbd 100644 --- a/lib/classes/packets/ObjectBuy.ts +++ b/lib/classes/packets/ObjectBuy.ts @@ -27,4 +27,74 @@ export class ObjectBuyPacket implements Packet return ((9) * this.ObjectData.length) + 65; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['CategoryID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + buf.writeUInt8(this.ObjectData[i]['SaleType'], pos++); + buf.writeInt32LE(this.ObjectData[i]['SalePrice'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + GroupID: UUID, + CategoryID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + GroupID: UUID.zero(), + CategoryID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['CategoryID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number, + SaleType: number, + SalePrice: number + } = { + ObjectLocalID: 0, + SaleType: 0, + SalePrice: 0 + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['SaleType'] = buf.readUInt8(pos++); + newObjObjectData['SalePrice'] = buf.readInt32LE(pos); + pos += 4; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectCategory.ts b/lib/classes/packets/ObjectCategory.ts index 15b41ff..7d1589e 100644 --- a/lib/classes/packets/ObjectCategory.ts +++ b/lib/classes/packets/ObjectCategory.ts @@ -24,4 +24,58 @@ export class ObjectCategoryPacket implements Packet return ((8) * this.ObjectData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['LocalID'], pos); + pos += 4; + buf.writeUInt32LE(this.ObjectData[i]['Category'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + LocalID: number, + Category: number + } = { + LocalID: 0, + Category: 0 + }; + newObjObjectData['LocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['Category'] = buf.readUInt32LE(pos); + pos += 4; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectClickAction.ts b/lib/classes/packets/ObjectClickAction.ts index f2cb0e7..f2aefff 100644 --- a/lib/classes/packets/ObjectClickAction.ts +++ b/lib/classes/packets/ObjectClickAction.ts @@ -24,4 +24,56 @@ export class ObjectClickActionPacket implements Packet return ((5) * this.ObjectData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + buf.writeUInt8(this.ObjectData[i]['ClickAction'], pos++); + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number, + ClickAction: number + } = { + ObjectLocalID: 0, + ClickAction: 0 + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['ClickAction'] = buf.readUInt8(pos++); + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectDeGrab.ts b/lib/classes/packets/ObjectDeGrab.ts index 6467b49..145c15c 100644 --- a/lib/classes/packets/ObjectDeGrab.ts +++ b/lib/classes/packets/ObjectDeGrab.ts @@ -32,4 +32,92 @@ export class ObjectDeGrabPacket implements Packet return ((64) * this.SurfaceInfo.length) + 37; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.ObjectData['LocalID'], pos); + pos += 4; + const count = this.SurfaceInfo.length; + buf.writeUInt8(this.SurfaceInfo.length, pos++); + for (let i = 0; i < count; i++) + { + this.SurfaceInfo[i]['UVCoord'].writeToBuffer(buf, pos, false); + pos += 12; + this.SurfaceInfo[i]['STCoord'].writeToBuffer(buf, pos, false); + pos += 12; + buf.writeInt32LE(this.SurfaceInfo[i]['FaceIndex'], pos); + pos += 4; + this.SurfaceInfo[i]['Position'].writeToBuffer(buf, pos, false); + pos += 12; + this.SurfaceInfo[i]['Normal'].writeToBuffer(buf, pos, false); + pos += 12; + this.SurfaceInfo[i]['Binormal'].writeToBuffer(buf, pos, false); + pos += 12; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjObjectData: { + LocalID: number + } = { + LocalID: 0 + }; + newObjObjectData['LocalID'] = buf.readUInt32LE(pos); + pos += 4; + this.ObjectData = newObjObjectData; + const count = buf.readUInt8(pos++); + this.SurfaceInfo = []; + for (let i = 0; i < count; i++) + { + const newObjSurfaceInfo: { + UVCoord: Vector3, + STCoord: Vector3, + FaceIndex: number, + Position: Vector3, + Normal: Vector3, + Binormal: Vector3 + } = { + UVCoord: Vector3.getZero(), + STCoord: Vector3.getZero(), + FaceIndex: 0, + Position: Vector3.getZero(), + Normal: Vector3.getZero(), + Binormal: Vector3.getZero() + }; + newObjSurfaceInfo['UVCoord'] = new Vector3(buf, pos, false); + pos += 12; + newObjSurfaceInfo['STCoord'] = new Vector3(buf, pos, false); + pos += 12; + newObjSurfaceInfo['FaceIndex'] = buf.readInt32LE(pos); + pos += 4; + newObjSurfaceInfo['Position'] = new Vector3(buf, pos, false); + pos += 12; + newObjSurfaceInfo['Normal'] = new Vector3(buf, pos, false); + pos += 12; + newObjSurfaceInfo['Binormal'] = new Vector3(buf, pos, false); + pos += 12; + this.SurfaceInfo.push(newObjSurfaceInfo); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectDelete.ts b/lib/classes/packets/ObjectDelete.ts index 9efea41..ae8c452 100644 --- a/lib/classes/packets/ObjectDelete.ts +++ b/lib/classes/packets/ObjectDelete.ts @@ -24,4 +24,56 @@ export class ObjectDeletePacket implements Packet return ((4) * this.ObjectData.length) + 34; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.AgentData['Force']) ? 1 : 0, pos++); + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + Force: boolean + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + Force: false + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['Force'] = (buf.readUInt8(pos++) === 1); + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number + } = { + ObjectLocalID: 0 + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectDelink.ts b/lib/classes/packets/ObjectDelink.ts index 087106d..ff7497b 100644 --- a/lib/classes/packets/ObjectDelink.ts +++ b/lib/classes/packets/ObjectDelink.ts @@ -23,4 +23,52 @@ export class ObjectDelinkPacket implements Packet return ((4) * this.ObjectData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number + } = { + ObjectLocalID: 0 + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectDescription.ts b/lib/classes/packets/ObjectDescription.ts index 5c0bf90..37e238f 100644 --- a/lib/classes/packets/ObjectDescription.ts +++ b/lib/classes/packets/ObjectDescription.ts @@ -34,4 +34,58 @@ export class ObjectDescriptionPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['LocalID'], pos); + pos += 4; + buf.write(this.ObjectData[i]['Description'], pos); + pos += this.ObjectData[i]['Description'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + LocalID: number, + Description: string + } = { + LocalID: 0, + Description: '' + }; + newObjObjectData['LocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['Description'] = buf.toString('utf8', pos, length); + pos += length; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectDeselect.ts b/lib/classes/packets/ObjectDeselect.ts index f88dbbc..098127b 100644 --- a/lib/classes/packets/ObjectDeselect.ts +++ b/lib/classes/packets/ObjectDeselect.ts @@ -23,4 +23,52 @@ export class ObjectDeselectPacket implements Packet return ((4) * this.ObjectData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number + } = { + ObjectLocalID: 0 + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectDetach.ts b/lib/classes/packets/ObjectDetach.ts index decaf64..77214e5 100644 --- a/lib/classes/packets/ObjectDetach.ts +++ b/lib/classes/packets/ObjectDetach.ts @@ -23,4 +23,52 @@ export class ObjectDetachPacket implements Packet return ((4) * this.ObjectData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number + } = { + ObjectLocalID: 0 + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectDrop.ts b/lib/classes/packets/ObjectDrop.ts index 33e6be4..58c893b 100644 --- a/lib/classes/packets/ObjectDrop.ts +++ b/lib/classes/packets/ObjectDrop.ts @@ -23,4 +23,52 @@ export class ObjectDropPacket implements Packet return ((4) * this.ObjectData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number + } = { + ObjectLocalID: 0 + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectDuplicate.ts b/lib/classes/packets/ObjectDuplicate.ts index d9471f1..76a844c 100644 --- a/lib/classes/packets/ObjectDuplicate.ts +++ b/lib/classes/packets/ObjectDuplicate.ts @@ -29,4 +29,74 @@ export class ObjectDuplicatePacket implements Packet return ((4) * this.ObjectData.length) + 65; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.SharedData['Offset'].writeToBuffer(buf, pos, false); + pos += 12; + buf.writeUInt32LE(this.SharedData['DuplicateFlags'], pos); + pos += 4; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjSharedData: { + Offset: Vector3, + DuplicateFlags: number + } = { + Offset: Vector3.getZero(), + DuplicateFlags: 0 + }; + newObjSharedData['Offset'] = new Vector3(buf, pos, false); + pos += 12; + newObjSharedData['DuplicateFlags'] = buf.readUInt32LE(pos); + pos += 4; + this.SharedData = newObjSharedData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number + } = { + ObjectLocalID: 0 + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectDuplicateOnRay.ts b/lib/classes/packets/ObjectDuplicateOnRay.ts index 6190906..3e904cb 100644 --- a/lib/classes/packets/ObjectDuplicateOnRay.ts +++ b/lib/classes/packets/ObjectDuplicateOnRay.ts @@ -33,4 +33,98 @@ export class ObjectDuplicateOnRayPacket implements Packet return ((4) * this.ObjectData.length) + 97; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['RayStart'].writeToBuffer(buf, pos, false); + pos += 12; + this.AgentData['RayEnd'].writeToBuffer(buf, pos, false); + pos += 12; + buf.writeUInt8((this.AgentData['BypassRaycast']) ? 1 : 0, pos++); + buf.writeUInt8((this.AgentData['RayEndIsIntersection']) ? 1 : 0, pos++); + buf.writeUInt8((this.AgentData['CopyCenters']) ? 1 : 0, pos++); + buf.writeUInt8((this.AgentData['CopyRotates']) ? 1 : 0, pos++); + this.AgentData['RayTargetID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AgentData['DuplicateFlags'], pos); + pos += 4; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + GroupID: UUID, + RayStart: Vector3, + RayEnd: Vector3, + BypassRaycast: boolean, + RayEndIsIntersection: boolean, + CopyCenters: boolean, + CopyRotates: boolean, + RayTargetID: UUID, + DuplicateFlags: number + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + GroupID: UUID.zero(), + RayStart: Vector3.getZero(), + RayEnd: Vector3.getZero(), + BypassRaycast: false, + RayEndIsIntersection: false, + CopyCenters: false, + CopyRotates: false, + RayTargetID: UUID.zero(), + DuplicateFlags: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['RayStart'] = new Vector3(buf, pos, false); + pos += 12; + newObjAgentData['RayEnd'] = new Vector3(buf, pos, false); + pos += 12; + newObjAgentData['BypassRaycast'] = (buf.readUInt8(pos++) === 1); + newObjAgentData['RayEndIsIntersection'] = (buf.readUInt8(pos++) === 1); + newObjAgentData['CopyCenters'] = (buf.readUInt8(pos++) === 1); + newObjAgentData['CopyRotates'] = (buf.readUInt8(pos++) === 1); + newObjAgentData['RayTargetID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['DuplicateFlags'] = buf.readUInt32LE(pos); + pos += 4; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number + } = { + ObjectLocalID: 0 + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectExportSelected.ts b/lib/classes/packets/ObjectExportSelected.ts index 78d620b..5fbeac2 100644 --- a/lib/classes/packets/ObjectExportSelected.ts +++ b/lib/classes/packets/ObjectExportSelected.ts @@ -24,4 +24,58 @@ export class ObjectExportSelectedPacket implements Packet return ((16) * this.ObjectData.length) + 35; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['RequestID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt16LE(this.AgentData['VolumeDetail'], pos); + pos += 2; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + this.ObjectData[i]['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + RequestID: UUID, + VolumeDetail: number + } = { + AgentID: UUID.zero(), + RequestID: UUID.zero(), + VolumeDetail: 0 + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['RequestID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['VolumeDetail'] = buf.readInt16LE(pos); + pos += 2; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectID: UUID + } = { + ObjectID: UUID.zero() + }; + newObjObjectData['ObjectID'] = new UUID(buf, pos); + pos += 16; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectExtraParams.ts b/lib/classes/packets/ObjectExtraParams.ts index ae025fd..0ae5d21 100644 --- a/lib/classes/packets/ObjectExtraParams.ts +++ b/lib/classes/packets/ObjectExtraParams.ts @@ -37,4 +37,74 @@ export class ObjectExtraParamsPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + buf.writeUInt16LE(this.ObjectData[i]['ParamType'], pos); + pos += 2; + buf.writeUInt8((this.ObjectData[i]['ParamInUse']) ? 1 : 0, pos++); + buf.writeUInt32LE(this.ObjectData[i]['ParamSize'], pos); + pos += 4; + buf.write(this.ObjectData[i]['ParamData'], pos); + pos += this.ObjectData[i]['ParamData'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number, + ParamType: number, + ParamInUse: boolean, + ParamSize: number, + ParamData: string + } = { + ObjectLocalID: 0, + ParamType: 0, + ParamInUse: false, + ParamSize: 0, + ParamData: '' + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['ParamType'] = buf.readUInt16LE(pos); + pos += 2; + newObjObjectData['ParamInUse'] = (buf.readUInt8(pos++) === 1); + newObjObjectData['ParamSize'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['ParamData'] = buf.toString('utf8', pos, length); + pos += length; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectFlagUpdate.ts b/lib/classes/packets/ObjectFlagUpdate.ts index 17d583b..58dbc6f 100644 --- a/lib/classes/packets/ObjectFlagUpdate.ts +++ b/lib/classes/packets/ObjectFlagUpdate.ts @@ -32,4 +32,96 @@ export class ObjectFlagUpdatePacket implements Packet return ((17) * this.ExtraPhysics.length) + 41; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.AgentData['ObjectLocalID'], pos); + pos += 4; + buf.writeUInt8((this.AgentData['UsePhysics']) ? 1 : 0, pos++); + buf.writeUInt8((this.AgentData['IsTemporary']) ? 1 : 0, pos++); + buf.writeUInt8((this.AgentData['IsPhantom']) ? 1 : 0, pos++); + buf.writeUInt8((this.AgentData['CastsShadows']) ? 1 : 0, pos++); + const count = this.ExtraPhysics.length; + buf.writeUInt8(this.ExtraPhysics.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt8(this.ExtraPhysics[i]['PhysicsShapeType'], pos++); + buf.writeFloatLE(this.ExtraPhysics[i]['Density'], pos); + pos += 4; + buf.writeFloatLE(this.ExtraPhysics[i]['Friction'], pos); + pos += 4; + buf.writeFloatLE(this.ExtraPhysics[i]['Restitution'], pos); + pos += 4; + buf.writeFloatLE(this.ExtraPhysics[i]['GravityMultiplier'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + ObjectLocalID: number, + UsePhysics: boolean, + IsTemporary: boolean, + IsPhantom: boolean, + CastsShadows: boolean + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + ObjectLocalID: 0, + UsePhysics: false, + IsTemporary: false, + IsPhantom: false, + CastsShadows: false + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjAgentData['UsePhysics'] = (buf.readUInt8(pos++) === 1); + newObjAgentData['IsTemporary'] = (buf.readUInt8(pos++) === 1); + newObjAgentData['IsPhantom'] = (buf.readUInt8(pos++) === 1); + newObjAgentData['CastsShadows'] = (buf.readUInt8(pos++) === 1); + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ExtraPhysics = []; + for (let i = 0; i < count; i++) + { + const newObjExtraPhysics: { + PhysicsShapeType: number, + Density: number, + Friction: number, + Restitution: number, + GravityMultiplier: number + } = { + PhysicsShapeType: 0, + Density: 0, + Friction: 0, + Restitution: 0, + GravityMultiplier: 0 + }; + newObjExtraPhysics['PhysicsShapeType'] = buf.readUInt8(pos++); + newObjExtraPhysics['Density'] = buf.readFloatLE(pos); + pos += 4; + newObjExtraPhysics['Friction'] = buf.readFloatLE(pos); + pos += 4; + newObjExtraPhysics['Restitution'] = buf.readFloatLE(pos); + pos += 4; + newObjExtraPhysics['GravityMultiplier'] = buf.readFloatLE(pos); + pos += 4; + this.ExtraPhysics.push(newObjExtraPhysics); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectGrab.ts b/lib/classes/packets/ObjectGrab.ts index b89bd8d..111de07 100644 --- a/lib/classes/packets/ObjectGrab.ts +++ b/lib/classes/packets/ObjectGrab.ts @@ -33,4 +33,98 @@ export class ObjectGrabPacket implements Packet return ((64) * this.SurfaceInfo.length) + 49; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.ObjectData['LocalID'], pos); + pos += 4; + this.ObjectData['GrabOffset'].writeToBuffer(buf, pos, false); + pos += 12; + const count = this.SurfaceInfo.length; + buf.writeUInt8(this.SurfaceInfo.length, pos++); + for (let i = 0; i < count; i++) + { + this.SurfaceInfo[i]['UVCoord'].writeToBuffer(buf, pos, false); + pos += 12; + this.SurfaceInfo[i]['STCoord'].writeToBuffer(buf, pos, false); + pos += 12; + buf.writeInt32LE(this.SurfaceInfo[i]['FaceIndex'], pos); + pos += 4; + this.SurfaceInfo[i]['Position'].writeToBuffer(buf, pos, false); + pos += 12; + this.SurfaceInfo[i]['Normal'].writeToBuffer(buf, pos, false); + pos += 12; + this.SurfaceInfo[i]['Binormal'].writeToBuffer(buf, pos, false); + pos += 12; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjObjectData: { + LocalID: number, + GrabOffset: Vector3 + } = { + LocalID: 0, + GrabOffset: Vector3.getZero() + }; + newObjObjectData['LocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['GrabOffset'] = new Vector3(buf, pos, false); + pos += 12; + this.ObjectData = newObjObjectData; + const count = buf.readUInt8(pos++); + this.SurfaceInfo = []; + for (let i = 0; i < count; i++) + { + const newObjSurfaceInfo: { + UVCoord: Vector3, + STCoord: Vector3, + FaceIndex: number, + Position: Vector3, + Normal: Vector3, + Binormal: Vector3 + } = { + UVCoord: Vector3.getZero(), + STCoord: Vector3.getZero(), + FaceIndex: 0, + Position: Vector3.getZero(), + Normal: Vector3.getZero(), + Binormal: Vector3.getZero() + }; + newObjSurfaceInfo['UVCoord'] = new Vector3(buf, pos, false); + pos += 12; + newObjSurfaceInfo['STCoord'] = new Vector3(buf, pos, false); + pos += 12; + newObjSurfaceInfo['FaceIndex'] = buf.readInt32LE(pos); + pos += 4; + newObjSurfaceInfo['Position'] = new Vector3(buf, pos, false); + pos += 12; + newObjSurfaceInfo['Normal'] = new Vector3(buf, pos, false); + pos += 12; + newObjSurfaceInfo['Binormal'] = new Vector3(buf, pos, false); + pos += 12; + this.SurfaceInfo.push(newObjSurfaceInfo); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectGrabUpdate.ts b/lib/classes/packets/ObjectGrabUpdate.ts index 77b390e..c4106ea 100644 --- a/lib/classes/packets/ObjectGrabUpdate.ts +++ b/lib/classes/packets/ObjectGrabUpdate.ts @@ -35,4 +35,110 @@ export class ObjectGrabUpdatePacket implements Packet return ((64) * this.SurfaceInfo.length) + 77; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.ObjectData['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + this.ObjectData['GrabOffsetInitial'].writeToBuffer(buf, pos, false); + pos += 12; + this.ObjectData['GrabPosition'].writeToBuffer(buf, pos, false); + pos += 12; + buf.writeUInt32LE(this.ObjectData['TimeSinceLast'], pos); + pos += 4; + const count = this.SurfaceInfo.length; + buf.writeUInt8(this.SurfaceInfo.length, pos++); + for (let i = 0; i < count; i++) + { + this.SurfaceInfo[i]['UVCoord'].writeToBuffer(buf, pos, false); + pos += 12; + this.SurfaceInfo[i]['STCoord'].writeToBuffer(buf, pos, false); + pos += 12; + buf.writeInt32LE(this.SurfaceInfo[i]['FaceIndex'], pos); + pos += 4; + this.SurfaceInfo[i]['Position'].writeToBuffer(buf, pos, false); + pos += 12; + this.SurfaceInfo[i]['Normal'].writeToBuffer(buf, pos, false); + pos += 12; + this.SurfaceInfo[i]['Binormal'].writeToBuffer(buf, pos, false); + pos += 12; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjObjectData: { + ObjectID: UUID, + GrabOffsetInitial: Vector3, + GrabPosition: Vector3, + TimeSinceLast: number + } = { + ObjectID: UUID.zero(), + GrabOffsetInitial: Vector3.getZero(), + GrabPosition: Vector3.getZero(), + TimeSinceLast: 0 + }; + newObjObjectData['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['GrabOffsetInitial'] = new Vector3(buf, pos, false); + pos += 12; + newObjObjectData['GrabPosition'] = new Vector3(buf, pos, false); + pos += 12; + newObjObjectData['TimeSinceLast'] = buf.readUInt32LE(pos); + pos += 4; + this.ObjectData = newObjObjectData; + const count = buf.readUInt8(pos++); + this.SurfaceInfo = []; + for (let i = 0; i < count; i++) + { + const newObjSurfaceInfo: { + UVCoord: Vector3, + STCoord: Vector3, + FaceIndex: number, + Position: Vector3, + Normal: Vector3, + Binormal: Vector3 + } = { + UVCoord: Vector3.getZero(), + STCoord: Vector3.getZero(), + FaceIndex: 0, + Position: Vector3.getZero(), + Normal: Vector3.getZero(), + Binormal: Vector3.getZero() + }; + newObjSurfaceInfo['UVCoord'] = new Vector3(buf, pos, false); + pos += 12; + newObjSurfaceInfo['STCoord'] = new Vector3(buf, pos, false); + pos += 12; + newObjSurfaceInfo['FaceIndex'] = buf.readInt32LE(pos); + pos += 4; + newObjSurfaceInfo['Position'] = new Vector3(buf, pos, false); + pos += 12; + newObjSurfaceInfo['Normal'] = new Vector3(buf, pos, false); + pos += 12; + newObjSurfaceInfo['Binormal'] = new Vector3(buf, pos, false); + pos += 12; + this.SurfaceInfo.push(newObjSurfaceInfo); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectGroup.ts b/lib/classes/packets/ObjectGroup.ts index cd76309..86ae6a9 100644 --- a/lib/classes/packets/ObjectGroup.ts +++ b/lib/classes/packets/ObjectGroup.ts @@ -24,4 +24,58 @@ export class ObjectGroupPacket implements Packet return ((4) * this.ObjectData.length) + 49; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number + } = { + ObjectLocalID: 0 + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectImage.ts b/lib/classes/packets/ObjectImage.ts index 15c4230..49db6ba 100644 --- a/lib/classes/packets/ObjectImage.ts +++ b/lib/classes/packets/ObjectImage.ts @@ -35,4 +35,64 @@ export class ObjectImagePacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + buf.write(this.ObjectData[i]['MediaURL'], pos); + pos += this.ObjectData[i]['MediaURL'].length; + buf.write(this.ObjectData[i]['TextureEntry'], pos); + pos += this.ObjectData[i]['TextureEntry'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number, + MediaURL: string, + TextureEntry: string + } = { + ObjectLocalID: 0, + MediaURL: '', + TextureEntry: '' + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['MediaURL'] = buf.toString('utf8', pos, length); + pos += length; + newObjObjectData['TextureEntry'] = buf.toString('utf8', pos, length); + pos += length; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectIncludeInSearch.ts b/lib/classes/packets/ObjectIncludeInSearch.ts index 12e9f08..b3dad56 100644 --- a/lib/classes/packets/ObjectIncludeInSearch.ts +++ b/lib/classes/packets/ObjectIncludeInSearch.ts @@ -24,4 +24,56 @@ export class ObjectIncludeInSearchPacket implements Packet return ((5) * this.ObjectData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + buf.writeUInt8((this.ObjectData[i]['IncludeInSearch']) ? 1 : 0, pos++); + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number, + IncludeInSearch: boolean + } = { + ObjectLocalID: 0, + IncludeInSearch: false + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['IncludeInSearch'] = (buf.readUInt8(pos++) === 1); + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectLink.ts b/lib/classes/packets/ObjectLink.ts index 7f8723b..f6ef049 100644 --- a/lib/classes/packets/ObjectLink.ts +++ b/lib/classes/packets/ObjectLink.ts @@ -23,4 +23,52 @@ export class ObjectLinkPacket implements Packet return ((4) * this.ObjectData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number + } = { + ObjectLocalID: 0 + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectMaterial.ts b/lib/classes/packets/ObjectMaterial.ts index f657f55..ec07ee5 100644 --- a/lib/classes/packets/ObjectMaterial.ts +++ b/lib/classes/packets/ObjectMaterial.ts @@ -24,4 +24,56 @@ export class ObjectMaterialPacket implements Packet return ((5) * this.ObjectData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + buf.writeUInt8(this.ObjectData[i]['Material'], pos++); + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number, + Material: number + } = { + ObjectLocalID: 0, + Material: 0 + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['Material'] = buf.readUInt8(pos++); + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectName.ts b/lib/classes/packets/ObjectName.ts index 9eb4d15..1d79cb9 100644 --- a/lib/classes/packets/ObjectName.ts +++ b/lib/classes/packets/ObjectName.ts @@ -34,4 +34,58 @@ export class ObjectNamePacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['LocalID'], pos); + pos += 4; + buf.write(this.ObjectData[i]['Name'], pos); + pos += this.ObjectData[i]['Name'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + LocalID: number, + Name: string + } = { + LocalID: 0, + Name: '' + }; + newObjObjectData['LocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['Name'] = buf.toString('utf8', pos, length); + pos += length; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectOwner.ts b/lib/classes/packets/ObjectOwner.ts index ba9e264..1e28dda 100644 --- a/lib/classes/packets/ObjectOwner.ts +++ b/lib/classes/packets/ObjectOwner.ts @@ -28,4 +28,72 @@ export class ObjectOwnerPacket implements Packet return ((4) * this.ObjectData.length) + 66; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.HeaderData['Override']) ? 1 : 0, pos++); + this.HeaderData['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + this.HeaderData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjHeaderData: { + Override: boolean, + OwnerID: UUID, + GroupID: UUID + } = { + Override: false, + OwnerID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjHeaderData['Override'] = (buf.readUInt8(pos++) === 1); + newObjHeaderData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjHeaderData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.HeaderData = newObjHeaderData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number + } = { + ObjectLocalID: 0 + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectPermissions.ts b/lib/classes/packets/ObjectPermissions.ts index 04f1b1f..419647c 100644 --- a/lib/classes/packets/ObjectPermissions.ts +++ b/lib/classes/packets/ObjectPermissions.ts @@ -29,4 +29,74 @@ export class ObjectPermissionsPacket implements Packet return ((10) * this.ObjectData.length) + 34; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.HeaderData['Override']) ? 1 : 0, pos++); + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + buf.writeUInt8(this.ObjectData[i]['Field'], pos++); + buf.writeUInt8(this.ObjectData[i]['Set'], pos++); + buf.writeUInt32LE(this.ObjectData[i]['Mask'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjHeaderData: { + Override: boolean + } = { + Override: false + }; + newObjHeaderData['Override'] = (buf.readUInt8(pos++) === 1); + this.HeaderData = newObjHeaderData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number, + Field: number, + Set: number, + Mask: number + } = { + ObjectLocalID: 0, + Field: 0, + Set: 0, + Mask: 0 + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['Field'] = buf.readUInt8(pos++); + newObjObjectData['Set'] = buf.readUInt8(pos++); + newObjObjectData['Mask'] = buf.readUInt32LE(pos); + pos += 4; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectPosition.ts b/lib/classes/packets/ObjectPosition.ts index 7211560..7a58a3c 100644 --- a/lib/classes/packets/ObjectPosition.ts +++ b/lib/classes/packets/ObjectPosition.ts @@ -25,4 +25,58 @@ export class ObjectPositionPacket implements Packet return ((16) * this.ObjectData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + this.ObjectData[i]['Position'].writeToBuffer(buf, pos, false); + pos += 12; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number, + Position: Vector3 + } = { + ObjectLocalID: 0, + Position: Vector3.getZero() + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['Position'] = new Vector3(buf, pos, false); + pos += 12; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectProperties.ts b/lib/classes/packets/ObjectProperties.ts index 65704e2..c84969f 100644 --- a/lib/classes/packets/ObjectProperties.ts +++ b/lib/classes/packets/ObjectProperties.ts @@ -56,4 +56,186 @@ export class ObjectPropertiesPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + this.ObjectData[i]['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + this.ObjectData[i]['CreatorID'].writeToBuffer(buf, pos); + pos += 16; + this.ObjectData[i]['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + this.ObjectData[i]['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.ObjectData[i]['CreationDate'].low, pos); + pos += 4; + buf.writeInt32LE(this.ObjectData[i]['CreationDate'].high, pos); + pos += 4; + buf.writeUInt32LE(this.ObjectData[i]['BaseMask'], pos); + pos += 4; + buf.writeUInt32LE(this.ObjectData[i]['OwnerMask'], pos); + pos += 4; + buf.writeUInt32LE(this.ObjectData[i]['GroupMask'], pos); + pos += 4; + buf.writeUInt32LE(this.ObjectData[i]['EveryoneMask'], pos); + pos += 4; + buf.writeUInt32LE(this.ObjectData[i]['NextOwnerMask'], pos); + pos += 4; + buf.writeInt32LE(this.ObjectData[i]['OwnershipCost'], pos); + pos += 4; + buf.writeUInt8(this.ObjectData[i]['SaleType'], pos++); + buf.writeInt32LE(this.ObjectData[i]['SalePrice'], pos); + pos += 4; + buf.writeUInt8(this.ObjectData[i]['AggregatePerms'], pos++); + buf.writeUInt8(this.ObjectData[i]['AggregatePermTextures'], pos++); + buf.writeUInt8(this.ObjectData[i]['AggregatePermTexturesOwner'], pos++); + buf.writeUInt32LE(this.ObjectData[i]['Category'], pos); + pos += 4; + buf.writeInt16LE(this.ObjectData[i]['InventorySerial'], pos); + pos += 2; + this.ObjectData[i]['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.ObjectData[i]['FolderID'].writeToBuffer(buf, pos); + pos += 16; + this.ObjectData[i]['FromTaskID'].writeToBuffer(buf, pos); + pos += 16; + this.ObjectData[i]['LastOwnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.ObjectData[i]['Name'], pos); + pos += this.ObjectData[i]['Name'].length; + buf.write(this.ObjectData[i]['Description'], pos); + pos += this.ObjectData[i]['Description'].length; + buf.write(this.ObjectData[i]['TouchName'], pos); + pos += this.ObjectData[i]['TouchName'].length; + buf.write(this.ObjectData[i]['SitName'], pos); + pos += this.ObjectData[i]['SitName'].length; + buf.write(this.ObjectData[i]['TextureID'], pos); + pos += this.ObjectData[i]['TextureID'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectID: UUID, + CreatorID: UUID, + OwnerID: UUID, + GroupID: UUID, + CreationDate: Long, + BaseMask: number, + OwnerMask: number, + GroupMask: number, + EveryoneMask: number, + NextOwnerMask: number, + OwnershipCost: number, + SaleType: number, + SalePrice: number, + AggregatePerms: number, + AggregatePermTextures: number, + AggregatePermTexturesOwner: number, + Category: number, + InventorySerial: number, + ItemID: UUID, + FolderID: UUID, + FromTaskID: UUID, + LastOwnerID: UUID, + Name: string, + Description: string, + TouchName: string, + SitName: string, + TextureID: string + } = { + ObjectID: UUID.zero(), + CreatorID: UUID.zero(), + OwnerID: UUID.zero(), + GroupID: UUID.zero(), + CreationDate: Long.ZERO, + BaseMask: 0, + OwnerMask: 0, + GroupMask: 0, + EveryoneMask: 0, + NextOwnerMask: 0, + OwnershipCost: 0, + SaleType: 0, + SalePrice: 0, + AggregatePerms: 0, + AggregatePermTextures: 0, + AggregatePermTexturesOwner: 0, + Category: 0, + InventorySerial: 0, + ItemID: UUID.zero(), + FolderID: UUID.zero(), + FromTaskID: UUID.zero(), + LastOwnerID: UUID.zero(), + Name: '', + Description: '', + TouchName: '', + SitName: '', + TextureID: '' + }; + newObjObjectData['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['CreatorID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['CreationDate'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjObjectData['BaseMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['OwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['GroupMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['EveryoneMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['NextOwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['OwnershipCost'] = buf.readInt32LE(pos); + pos += 4; + newObjObjectData['SaleType'] = buf.readUInt8(pos++); + newObjObjectData['SalePrice'] = buf.readInt32LE(pos); + pos += 4; + newObjObjectData['AggregatePerms'] = buf.readUInt8(pos++); + newObjObjectData['AggregatePermTextures'] = buf.readUInt8(pos++); + newObjObjectData['AggregatePermTexturesOwner'] = buf.readUInt8(pos++); + newObjObjectData['Category'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['InventorySerial'] = buf.readInt16LE(pos); + pos += 2; + newObjObjectData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['FromTaskID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['LastOwnerID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjObjectData['Description'] = buf.toString('utf8', pos, length); + pos += length; + newObjObjectData['TouchName'] = buf.toString('utf8', pos, length); + pos += length; + newObjObjectData['SitName'] = buf.toString('utf8', pos, length); + pos += length; + newObjObjectData['TextureID'] = buf.toString('utf8', pos, length); + pos += length; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectPropertiesFamily.ts b/lib/classes/packets/ObjectPropertiesFamily.ts index d45adb8..8a9b805 100644 --- a/lib/classes/packets/ObjectPropertiesFamily.ts +++ b/lib/classes/packets/ObjectPropertiesFamily.ts @@ -34,4 +34,114 @@ export class ObjectPropertiesFamilyPacket implements Packet return (this.ObjectData['Name'].length + 1 + this.ObjectData['Description'].length + 1) + 101; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt32LE(this.ObjectData['RequestFlags'], pos); + pos += 4; + this.ObjectData['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + this.ObjectData['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + this.ObjectData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.ObjectData['BaseMask'], pos); + pos += 4; + buf.writeUInt32LE(this.ObjectData['OwnerMask'], pos); + pos += 4; + buf.writeUInt32LE(this.ObjectData['GroupMask'], pos); + pos += 4; + buf.writeUInt32LE(this.ObjectData['EveryoneMask'], pos); + pos += 4; + buf.writeUInt32LE(this.ObjectData['NextOwnerMask'], pos); + pos += 4; + buf.writeInt32LE(this.ObjectData['OwnershipCost'], pos); + pos += 4; + buf.writeUInt8(this.ObjectData['SaleType'], pos++); + buf.writeInt32LE(this.ObjectData['SalePrice'], pos); + pos += 4; + buf.writeUInt32LE(this.ObjectData['Category'], pos); + pos += 4; + this.ObjectData['LastOwnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.ObjectData['Name'], pos); + pos += this.ObjectData['Name'].length; + buf.write(this.ObjectData['Description'], pos); + pos += this.ObjectData['Description'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjObjectData: { + RequestFlags: number, + ObjectID: UUID, + OwnerID: UUID, + GroupID: UUID, + BaseMask: number, + OwnerMask: number, + GroupMask: number, + EveryoneMask: number, + NextOwnerMask: number, + OwnershipCost: number, + SaleType: number, + SalePrice: number, + Category: number, + LastOwnerID: UUID, + Name: string, + Description: string + } = { + RequestFlags: 0, + ObjectID: UUID.zero(), + OwnerID: UUID.zero(), + GroupID: UUID.zero(), + BaseMask: 0, + OwnerMask: 0, + GroupMask: 0, + EveryoneMask: 0, + NextOwnerMask: 0, + OwnershipCost: 0, + SaleType: 0, + SalePrice: 0, + Category: 0, + LastOwnerID: UUID.zero(), + Name: '', + Description: '' + }; + newObjObjectData['RequestFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['BaseMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['OwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['GroupMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['EveryoneMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['NextOwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['OwnershipCost'] = buf.readInt32LE(pos); + pos += 4; + newObjObjectData['SaleType'] = buf.readUInt8(pos++); + newObjObjectData['SalePrice'] = buf.readInt32LE(pos); + pos += 4; + newObjObjectData['Category'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['LastOwnerID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjObjectData['Description'] = buf.toString('utf8', pos, length); + pos += length; + this.ObjectData = newObjObjectData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectRotation.ts b/lib/classes/packets/ObjectRotation.ts index b8f9aba..c7be3ee 100644 --- a/lib/classes/packets/ObjectRotation.ts +++ b/lib/classes/packets/ObjectRotation.ts @@ -25,4 +25,58 @@ export class ObjectRotationPacket implements Packet return ((16) * this.ObjectData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + this.ObjectData[i]['Rotation'].writeToBuffer(buf, pos); + pos += 12; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number, + Rotation: Quaternion + } = { + ObjectLocalID: 0, + Rotation: Quaternion.getIdentity() + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['Rotation'] = new Quaternion(buf, pos); + pos += 12; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectSaleInfo.ts b/lib/classes/packets/ObjectSaleInfo.ts index 02e1d55..e691dce 100644 --- a/lib/classes/packets/ObjectSaleInfo.ts +++ b/lib/classes/packets/ObjectSaleInfo.ts @@ -25,4 +25,62 @@ export class ObjectSaleInfoPacket implements Packet return ((9) * this.ObjectData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['LocalID'], pos); + pos += 4; + buf.writeUInt8(this.ObjectData[i]['SaleType'], pos++); + buf.writeInt32LE(this.ObjectData[i]['SalePrice'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + LocalID: number, + SaleType: number, + SalePrice: number + } = { + LocalID: 0, + SaleType: 0, + SalePrice: 0 + }; + newObjObjectData['LocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['SaleType'] = buf.readUInt8(pos++); + newObjObjectData['SalePrice'] = buf.readInt32LE(pos); + pos += 4; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectScale.ts b/lib/classes/packets/ObjectScale.ts index 8573261..0b69bfe 100644 --- a/lib/classes/packets/ObjectScale.ts +++ b/lib/classes/packets/ObjectScale.ts @@ -25,4 +25,58 @@ export class ObjectScalePacket implements Packet return ((16) * this.ObjectData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + this.ObjectData[i]['Scale'].writeToBuffer(buf, pos, false); + pos += 12; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number, + Scale: Vector3 + } = { + ObjectLocalID: 0, + Scale: Vector3.getZero() + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['Scale'] = new Vector3(buf, pos, false); + pos += 12; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectSelect.ts b/lib/classes/packets/ObjectSelect.ts index 44636e8..6e5809e 100644 --- a/lib/classes/packets/ObjectSelect.ts +++ b/lib/classes/packets/ObjectSelect.ts @@ -23,4 +23,52 @@ export class ObjectSelectPacket implements Packet return ((4) * this.ObjectData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number + } = { + ObjectLocalID: 0 + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectShape.ts b/lib/classes/packets/ObjectShape.ts index 59d606f..0e726a1 100644 --- a/lib/classes/packets/ObjectShape.ts +++ b/lib/classes/packets/ObjectShape.ts @@ -41,4 +41,134 @@ export class ObjectShapePacket implements Packet return ((27) * this.ObjectData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ObjectLocalID'], pos); + pos += 4; + buf.writeUInt8(this.ObjectData[i]['PathCurve'], pos++); + buf.writeUInt8(this.ObjectData[i]['ProfileCurve'], pos++); + buf.writeUInt16LE(this.ObjectData[i]['PathBegin'], pos); + pos += 2; + buf.writeUInt16LE(this.ObjectData[i]['PathEnd'], pos); + pos += 2; + buf.writeUInt8(this.ObjectData[i]['PathScaleX'], pos++); + buf.writeUInt8(this.ObjectData[i]['PathScaleY'], pos++); + buf.writeUInt8(this.ObjectData[i]['PathShearX'], pos++); + buf.writeUInt8(this.ObjectData[i]['PathShearY'], pos++); + buf.writeInt8(this.ObjectData[i]['PathTwist'], pos++); + buf.writeInt8(this.ObjectData[i]['PathTwistBegin'], pos++); + buf.writeInt8(this.ObjectData[i]['PathRadiusOffset'], pos++); + buf.writeInt8(this.ObjectData[i]['PathTaperX'], pos++); + buf.writeInt8(this.ObjectData[i]['PathTaperY'], pos++); + buf.writeUInt8(this.ObjectData[i]['PathRevolutions'], pos++); + buf.writeInt8(this.ObjectData[i]['PathSkew'], pos++); + buf.writeUInt16LE(this.ObjectData[i]['ProfileBegin'], pos); + pos += 2; + buf.writeUInt16LE(this.ObjectData[i]['ProfileEnd'], pos); + pos += 2; + buf.writeUInt16LE(this.ObjectData[i]['ProfileHollow'], pos); + pos += 2; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectLocalID: number, + PathCurve: number, + ProfileCurve: number, + PathBegin: number, + PathEnd: number, + PathScaleX: number, + PathScaleY: number, + PathShearX: number, + PathShearY: number, + PathTwist: number, + PathTwistBegin: number, + PathRadiusOffset: number, + PathTaperX: number, + PathTaperY: number, + PathRevolutions: number, + PathSkew: number, + ProfileBegin: number, + ProfileEnd: number, + ProfileHollow: number + } = { + ObjectLocalID: 0, + PathCurve: 0, + ProfileCurve: 0, + PathBegin: 0, + PathEnd: 0, + PathScaleX: 0, + PathScaleY: 0, + PathShearX: 0, + PathShearY: 0, + PathTwist: 0, + PathTwistBegin: 0, + PathRadiusOffset: 0, + PathTaperX: 0, + PathTaperY: 0, + PathRevolutions: 0, + PathSkew: 0, + ProfileBegin: 0, + ProfileEnd: 0, + ProfileHollow: 0 + }; + newObjObjectData['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['PathCurve'] = buf.readUInt8(pos++); + newObjObjectData['ProfileCurve'] = buf.readUInt8(pos++); + newObjObjectData['PathBegin'] = buf.readUInt16LE(pos); + pos += 2; + newObjObjectData['PathEnd'] = buf.readUInt16LE(pos); + pos += 2; + newObjObjectData['PathScaleX'] = buf.readUInt8(pos++); + newObjObjectData['PathScaleY'] = buf.readUInt8(pos++); + newObjObjectData['PathShearX'] = buf.readUInt8(pos++); + newObjObjectData['PathShearY'] = buf.readUInt8(pos++); + newObjObjectData['PathTwist'] = buf.readInt8(pos++); + newObjObjectData['PathTwistBegin'] = buf.readInt8(pos++); + newObjObjectData['PathRadiusOffset'] = buf.readInt8(pos++); + newObjObjectData['PathTaperX'] = buf.readInt8(pos++); + newObjObjectData['PathTaperY'] = buf.readInt8(pos++); + newObjObjectData['PathRevolutions'] = buf.readUInt8(pos++); + newObjObjectData['PathSkew'] = buf.readInt8(pos++); + newObjObjectData['ProfileBegin'] = buf.readUInt16LE(pos); + pos += 2; + newObjObjectData['ProfileEnd'] = buf.readUInt16LE(pos); + pos += 2; + newObjObjectData['ProfileHollow'] = buf.readUInt16LE(pos); + pos += 2; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectSpinStart.ts b/lib/classes/packets/ObjectSpinStart.ts index 60a86ed..1d7458e 100644 --- a/lib/classes/packets/ObjectSpinStart.ts +++ b/lib/classes/packets/ObjectSpinStart.ts @@ -23,4 +23,42 @@ export class ObjectSpinStartPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.ObjectData['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjObjectData: { + ObjectID: UUID + } = { + ObjectID: UUID.zero() + }; + newObjObjectData['ObjectID'] = new UUID(buf, pos); + pos += 16; + this.ObjectData = newObjObjectData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectSpinStop.ts b/lib/classes/packets/ObjectSpinStop.ts index 0e043cb..ee7ede6 100644 --- a/lib/classes/packets/ObjectSpinStop.ts +++ b/lib/classes/packets/ObjectSpinStop.ts @@ -23,4 +23,42 @@ export class ObjectSpinStopPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.ObjectData['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjObjectData: { + ObjectID: UUID + } = { + ObjectID: UUID.zero() + }; + newObjObjectData['ObjectID'] = new UUID(buf, pos); + pos += 16; + this.ObjectData = newObjObjectData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectSpinUpdate.ts b/lib/classes/packets/ObjectSpinUpdate.ts index 954e574..a088cb1 100644 --- a/lib/classes/packets/ObjectSpinUpdate.ts +++ b/lib/classes/packets/ObjectSpinUpdate.ts @@ -25,4 +25,48 @@ export class ObjectSpinUpdatePacket implements Packet return 60; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.ObjectData['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + this.ObjectData['Rotation'].writeToBuffer(buf, pos); + pos += 12; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjObjectData: { + ObjectID: UUID, + Rotation: Quaternion + } = { + ObjectID: UUID.zero(), + Rotation: Quaternion.getIdentity() + }; + newObjObjectData['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['Rotation'] = new Quaternion(buf, pos); + pos += 12; + this.ObjectData = newObjObjectData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectUpdate.ts b/lib/classes/packets/ObjectUpdate.ts index 1d0ecd6..99abf2b 100644 --- a/lib/classes/packets/ObjectUpdate.ts +++ b/lib/classes/packets/ObjectUpdate.ts @@ -80,4 +80,286 @@ export class ObjectUpdatePacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.RegionData['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.RegionData['RegionHandle'].high, pos); + pos += 4; + buf.writeUInt16LE(this.RegionData['TimeDilation'], pos); + pos += 2; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ID'], pos); + pos += 4; + buf.writeUInt8(this.ObjectData[i]['State'], pos++); + this.ObjectData[i]['FullID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.ObjectData[i]['CRC'], pos); + pos += 4; + buf.writeUInt8(this.ObjectData[i]['PCode'], pos++); + buf.writeUInt8(this.ObjectData[i]['Material'], pos++); + buf.writeUInt8(this.ObjectData[i]['ClickAction'], pos++); + this.ObjectData[i]['Scale'].writeToBuffer(buf, pos, false); + pos += 12; + buf.write(this.ObjectData[i]['ObjectData'], pos); + pos += this.ObjectData[i]['ObjectData'].length; + buf.writeUInt32LE(this.ObjectData[i]['ParentID'], pos); + pos += 4; + buf.writeUInt32LE(this.ObjectData[i]['UpdateFlags'], pos); + pos += 4; + buf.writeUInt8(this.ObjectData[i]['PathCurve'], pos++); + buf.writeUInt8(this.ObjectData[i]['ProfileCurve'], pos++); + buf.writeUInt16LE(this.ObjectData[i]['PathBegin'], pos); + pos += 2; + buf.writeUInt16LE(this.ObjectData[i]['PathEnd'], pos); + pos += 2; + buf.writeUInt8(this.ObjectData[i]['PathScaleX'], pos++); + buf.writeUInt8(this.ObjectData[i]['PathScaleY'], pos++); + buf.writeUInt8(this.ObjectData[i]['PathShearX'], pos++); + buf.writeUInt8(this.ObjectData[i]['PathShearY'], pos++); + buf.writeInt8(this.ObjectData[i]['PathTwist'], pos++); + buf.writeInt8(this.ObjectData[i]['PathTwistBegin'], pos++); + buf.writeInt8(this.ObjectData[i]['PathRadiusOffset'], pos++); + buf.writeInt8(this.ObjectData[i]['PathTaperX'], pos++); + buf.writeInt8(this.ObjectData[i]['PathTaperY'], pos++); + buf.writeUInt8(this.ObjectData[i]['PathRevolutions'], pos++); + buf.writeInt8(this.ObjectData[i]['PathSkew'], pos++); + buf.writeUInt16LE(this.ObjectData[i]['ProfileBegin'], pos); + pos += 2; + buf.writeUInt16LE(this.ObjectData[i]['ProfileEnd'], pos); + pos += 2; + buf.writeUInt16LE(this.ObjectData[i]['ProfileHollow'], pos); + pos += 2; + buf.write(this.ObjectData[i]['TextureEntry'], pos); + pos += this.ObjectData[i]['TextureEntry'].length; + buf.write(this.ObjectData[i]['TextureAnim'], pos); + pos += this.ObjectData[i]['TextureAnim'].length; + buf.write(this.ObjectData[i]['NameValue'], pos); + pos += this.ObjectData[i]['NameValue'].length; + buf.write(this.ObjectData[i]['Data'], pos); + pos += this.ObjectData[i]['Data'].length; + buf.write(this.ObjectData[i]['Text'], pos); + pos += this.ObjectData[i]['Text'].length; + this.ObjectData[i]['TextColor'].copy(buf, pos); + pos += 4; + buf.write(this.ObjectData[i]['MediaURL'], pos); + pos += this.ObjectData[i]['MediaURL'].length; + buf.write(this.ObjectData[i]['PSBlock'], pos); + pos += this.ObjectData[i]['PSBlock'].length; + buf.write(this.ObjectData[i]['ExtraParams'], pos); + pos += this.ObjectData[i]['ExtraParams'].length; + this.ObjectData[i]['Sound'].writeToBuffer(buf, pos); + pos += 16; + this.ObjectData[i]['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeFloatLE(this.ObjectData[i]['Gain'], pos); + pos += 4; + buf.writeUInt8(this.ObjectData[i]['Flags'], pos++); + buf.writeFloatLE(this.ObjectData[i]['Radius'], pos); + pos += 4; + buf.writeUInt8(this.ObjectData[i]['JointType'], pos++); + this.ObjectData[i]['JointPivot'].writeToBuffer(buf, pos, false); + pos += 12; + this.ObjectData[i]['JointAxisOrAnchor'].writeToBuffer(buf, pos, false); + pos += 12; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjRegionData: { + RegionHandle: Long, + TimeDilation: number + } = { + RegionHandle: Long.ZERO, + TimeDilation: 0 + }; + newObjRegionData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjRegionData['TimeDilation'] = buf.readUInt16LE(pos); + pos += 2; + this.RegionData = newObjRegionData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ID: number, + State: number, + FullID: UUID, + CRC: number, + PCode: number, + Material: number, + ClickAction: number, + Scale: Vector3, + ObjectData: string, + ParentID: number, + UpdateFlags: number, + PathCurve: number, + ProfileCurve: number, + PathBegin: number, + PathEnd: number, + PathScaleX: number, + PathScaleY: number, + PathShearX: number, + PathShearY: number, + PathTwist: number, + PathTwistBegin: number, + PathRadiusOffset: number, + PathTaperX: number, + PathTaperY: number, + PathRevolutions: number, + PathSkew: number, + ProfileBegin: number, + ProfileEnd: number, + ProfileHollow: number, + TextureEntry: string, + TextureAnim: string, + NameValue: string, + Data: string, + Text: string, + TextColor: Buffer, + MediaURL: string, + PSBlock: string, + ExtraParams: string, + Sound: UUID, + OwnerID: UUID, + Gain: number, + Flags: number, + Radius: number, + JointType: number, + JointPivot: Vector3, + JointAxisOrAnchor: Vector3 + } = { + ID: 0, + State: 0, + FullID: UUID.zero(), + CRC: 0, + PCode: 0, + Material: 0, + ClickAction: 0, + Scale: Vector3.getZero(), + ObjectData: '', + ParentID: 0, + UpdateFlags: 0, + PathCurve: 0, + ProfileCurve: 0, + PathBegin: 0, + PathEnd: 0, + PathScaleX: 0, + PathScaleY: 0, + PathShearX: 0, + PathShearY: 0, + PathTwist: 0, + PathTwistBegin: 0, + PathRadiusOffset: 0, + PathTaperX: 0, + PathTaperY: 0, + PathRevolutions: 0, + PathSkew: 0, + ProfileBegin: 0, + ProfileEnd: 0, + ProfileHollow: 0, + TextureEntry: '', + TextureAnim: '', + NameValue: '', + Data: '', + Text: '', + TextColor: Buffer.allocUnsafe(0), + MediaURL: '', + PSBlock: '', + ExtraParams: '', + Sound: UUID.zero(), + OwnerID: UUID.zero(), + Gain: 0, + Flags: 0, + Radius: 0, + JointType: 0, + JointPivot: Vector3.getZero(), + JointAxisOrAnchor: Vector3.getZero() + }; + newObjObjectData['ID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['State'] = buf.readUInt8(pos++); + newObjObjectData['FullID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['CRC'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['PCode'] = buf.readUInt8(pos++); + newObjObjectData['Material'] = buf.readUInt8(pos++); + newObjObjectData['ClickAction'] = buf.readUInt8(pos++); + newObjObjectData['Scale'] = new Vector3(buf, pos, false); + pos += 12; + newObjObjectData['ObjectData'] = buf.toString('utf8', pos, length); + pos += length; + newObjObjectData['ParentID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['UpdateFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['PathCurve'] = buf.readUInt8(pos++); + newObjObjectData['ProfileCurve'] = buf.readUInt8(pos++); + newObjObjectData['PathBegin'] = buf.readUInt16LE(pos); + pos += 2; + newObjObjectData['PathEnd'] = buf.readUInt16LE(pos); + pos += 2; + newObjObjectData['PathScaleX'] = buf.readUInt8(pos++); + newObjObjectData['PathScaleY'] = buf.readUInt8(pos++); + newObjObjectData['PathShearX'] = buf.readUInt8(pos++); + newObjObjectData['PathShearY'] = buf.readUInt8(pos++); + newObjObjectData['PathTwist'] = buf.readInt8(pos++); + newObjObjectData['PathTwistBegin'] = buf.readInt8(pos++); + newObjObjectData['PathRadiusOffset'] = buf.readInt8(pos++); + newObjObjectData['PathTaperX'] = buf.readInt8(pos++); + newObjObjectData['PathTaperY'] = buf.readInt8(pos++); + newObjObjectData['PathRevolutions'] = buf.readUInt8(pos++); + newObjObjectData['PathSkew'] = buf.readInt8(pos++); + newObjObjectData['ProfileBegin'] = buf.readUInt16LE(pos); + pos += 2; + newObjObjectData['ProfileEnd'] = buf.readUInt16LE(pos); + pos += 2; + newObjObjectData['ProfileHollow'] = buf.readUInt16LE(pos); + pos += 2; + newObjObjectData['TextureEntry'] = buf.toString('utf8', pos, length); + pos += length; + newObjObjectData['TextureAnim'] = buf.toString('utf8', pos, length); + pos += length; + newObjObjectData['NameValue'] = buf.toString('utf8', pos, length); + pos += length; + newObjObjectData['Data'] = buf.toString('utf8', pos, length); + pos += length; + newObjObjectData['Text'] = buf.toString('utf8', pos, length); + pos += length; + newObjObjectData['TextColor'] = buf.slice(pos, pos + 4); + pos += 4; + newObjObjectData['MediaURL'] = buf.toString('utf8', pos, length); + pos += length; + newObjObjectData['PSBlock'] = buf.toString('utf8', pos, length); + pos += length; + newObjObjectData['ExtraParams'] = buf.toString('utf8', pos, length); + pos += length; + newObjObjectData['Sound'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['Gain'] = buf.readFloatLE(pos); + pos += 4; + newObjObjectData['Flags'] = buf.readUInt8(pos++); + newObjObjectData['Radius'] = buf.readFloatLE(pos); + pos += 4; + newObjObjectData['JointType'] = buf.readUInt8(pos++); + newObjObjectData['JointPivot'] = new Vector3(buf, pos, false); + pos += 12; + newObjObjectData['JointAxisOrAnchor'] = new Vector3(buf, pos, false); + pos += 12; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectUpdateCached.ts b/lib/classes/packets/ObjectUpdateCached.ts index ed121f8..7a92872 100644 --- a/lib/classes/packets/ObjectUpdateCached.ts +++ b/lib/classes/packets/ObjectUpdateCached.ts @@ -25,4 +25,66 @@ export class ObjectUpdateCachedPacket implements Packet return ((12) * this.ObjectData.length) + 11; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.RegionData['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.RegionData['RegionHandle'].high, pos); + pos += 4; + buf.writeUInt16LE(this.RegionData['TimeDilation'], pos); + pos += 2; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['ID'], pos); + pos += 4; + buf.writeUInt32LE(this.ObjectData[i]['CRC'], pos); + pos += 4; + buf.writeUInt32LE(this.ObjectData[i]['UpdateFlags'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjRegionData: { + RegionHandle: Long, + TimeDilation: number + } = { + RegionHandle: Long.ZERO, + TimeDilation: 0 + }; + newObjRegionData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjRegionData['TimeDilation'] = buf.readUInt16LE(pos); + pos += 2; + this.RegionData = newObjRegionData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ID: number, + CRC: number, + UpdateFlags: number + } = { + ID: 0, + CRC: 0, + UpdateFlags: 0 + }; + newObjObjectData['ID'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['CRC'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['UpdateFlags'] = buf.readUInt32LE(pos); + pos += 4; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ObjectUpdateCompressed.ts b/lib/classes/packets/ObjectUpdateCompressed.ts index f0cbb3e..535d052 100644 --- a/lib/classes/packets/ObjectUpdateCompressed.ts +++ b/lib/classes/packets/ObjectUpdateCompressed.ts @@ -34,4 +34,60 @@ export class ObjectUpdateCompressedPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.RegionData['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.RegionData['RegionHandle'].high, pos); + pos += 4; + buf.writeUInt16LE(this.RegionData['TimeDilation'], pos); + pos += 2; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.ObjectData[i]['UpdateFlags'], pos); + pos += 4; + buf.write(this.ObjectData[i]['Data'], pos); + pos += this.ObjectData[i]['Data'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjRegionData: { + RegionHandle: Long, + TimeDilation: number + } = { + RegionHandle: Long.ZERO, + TimeDilation: 0 + }; + newObjRegionData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjRegionData['TimeDilation'] = buf.readUInt16LE(pos); + pos += 2; + this.RegionData = newObjRegionData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + UpdateFlags: number, + Data: string + } = { + UpdateFlags: 0, + Data: '' + }; + newObjObjectData['UpdateFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['Data'] = buf.toString('utf8', pos, length); + pos += length; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/OfferCallingCard.ts b/lib/classes/packets/OfferCallingCard.ts index 0844359..6fc9c5f 100644 --- a/lib/classes/packets/OfferCallingCard.ts +++ b/lib/classes/packets/OfferCallingCard.ts @@ -24,4 +24,48 @@ export class OfferCallingCardPacket implements Packet return 64; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentBlock['DestID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentBlock['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjAgentBlock: { + DestID: UUID, + TransactionID: UUID + } = { + DestID: UUID.zero(), + TransactionID: UUID.zero() + }; + newObjAgentBlock['DestID'] = new UUID(buf, pos); + pos += 16; + newObjAgentBlock['TransactionID'] = new UUID(buf, pos); + pos += 16; + this.AgentBlock = newObjAgentBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/OfflineNotification.ts b/lib/classes/packets/OfflineNotification.ts index c57375a..2cf07d1 100644 --- a/lib/classes/packets/OfflineNotification.ts +++ b/lib/classes/packets/OfflineNotification.ts @@ -19,4 +19,36 @@ export class OfflineNotificationPacket implements Packet return ((16) * this.AgentBlock.length) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.AgentBlock.length; + buf.writeUInt8(this.AgentBlock.length, pos++); + for (let i = 0; i < count; i++) + { + this.AgentBlock[i]['AgentID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.AgentBlock = []; + for (let i = 0; i < count; i++) + { + const newObjAgentBlock: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentBlock['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentBlock.push(newObjAgentBlock); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/OnlineNotification.ts b/lib/classes/packets/OnlineNotification.ts index 07f6a70..0500726 100644 --- a/lib/classes/packets/OnlineNotification.ts +++ b/lib/classes/packets/OnlineNotification.ts @@ -19,4 +19,36 @@ export class OnlineNotificationPacket implements Packet return ((16) * this.AgentBlock.length) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.AgentBlock.length; + buf.writeUInt8(this.AgentBlock.length, pos++); + for (let i = 0; i < count; i++) + { + this.AgentBlock[i]['AgentID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.AgentBlock = []; + for (let i = 0; i < count; i++) + { + const newObjAgentBlock: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentBlock['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentBlock.push(newObjAgentBlock); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/OpenCircuit.ts b/lib/classes/packets/OpenCircuit.ts index 11696d7..a9bfffe 100644 --- a/lib/classes/packets/OpenCircuit.ts +++ b/lib/classes/packets/OpenCircuit.ts @@ -20,4 +20,32 @@ export class OpenCircuitPacket implements Packet return 6; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.CircuitInfo['IP'].writeToBuffer(buf, pos); + pos += 4; + buf.writeUInt16LE(this.CircuitInfo['Port'], pos); + pos += 2; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjCircuitInfo: { + IP: IPAddress, + Port: number + } = { + IP: IPAddress.zero(), + Port: 0 + }; + newObjCircuitInfo['IP'] = new IPAddress(buf, pos); + pos += 4; + newObjCircuitInfo['Port'] = buf.readUInt16LE(pos); + pos += 2; + this.CircuitInfo = newObjCircuitInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/PacketAck.ts b/lib/classes/packets/PacketAck.ts index e7ef0d9..f454d8e 100644 --- a/lib/classes/packets/PacketAck.ts +++ b/lib/classes/packets/PacketAck.ts @@ -18,4 +18,36 @@ export class PacketAckPacket implements Packet return ((4) * this.Packets.length) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.Packets.length; + buf.writeUInt8(this.Packets.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.Packets[i]['ID'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.Packets = []; + for (let i = 0; i < count; i++) + { + const newObjPackets: { + ID: number + } = { + ID: 0 + }; + newObjPackets['ID'] = buf.readUInt32LE(pos); + pos += 4; + this.Packets.push(newObjPackets); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelAccessListReply.ts b/lib/classes/packets/ParcelAccessListReply.ts index aad5f9e..dea8af2 100644 --- a/lib/classes/packets/ParcelAccessListReply.ts +++ b/lib/classes/packets/ParcelAccessListReply.ts @@ -27,4 +27,76 @@ export class ParcelAccessListReplyPacket implements Packet return ((24) * this.List.length) + 29; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Data['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.Data['SequenceID'], pos); + pos += 4; + buf.writeUInt32LE(this.Data['Flags'], pos); + pos += 4; + buf.writeInt32LE(this.Data['LocalID'], pos); + pos += 4; + const count = this.List.length; + buf.writeUInt8(this.List.length, pos++); + for (let i = 0; i < count; i++) + { + this.List[i]['ID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.List[i]['Time'], pos); + pos += 4; + buf.writeUInt32LE(this.List[i]['Flags'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjData: { + AgentID: UUID, + SequenceID: number, + Flags: number, + LocalID: number + } = { + AgentID: UUID.zero(), + SequenceID: 0, + Flags: 0, + LocalID: 0 + }; + newObjData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjData['SequenceID'] = buf.readInt32LE(pos); + pos += 4; + newObjData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + newObjData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + this.Data = newObjData; + const count = buf.readUInt8(pos++); + this.List = []; + for (let i = 0; i < count; i++) + { + const newObjList: { + ID: UUID, + Time: number, + Flags: number + } = { + ID: UUID.zero(), + Time: 0, + Flags: 0 + }; + newObjList['ID'] = new UUID(buf, pos); + pos += 16; + newObjList['Time'] = buf.readInt32LE(pos); + pos += 4; + newObjList['Flags'] = buf.readUInt32LE(pos); + pos += 4; + this.List.push(newObjList); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelAccessListRequest.ts b/lib/classes/packets/ParcelAccessListRequest.ts index e34e8ab..ac9afa2 100644 --- a/lib/classes/packets/ParcelAccessListRequest.ts +++ b/lib/classes/packets/ParcelAccessListRequest.ts @@ -25,4 +25,54 @@ export class ParcelAccessListRequestPacket implements Packet return 44; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.Data['SequenceID'], pos); + pos += 4; + buf.writeUInt32LE(this.Data['Flags'], pos); + pos += 4; + buf.writeInt32LE(this.Data['LocalID'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + SequenceID: number, + Flags: number, + LocalID: number + } = { + SequenceID: 0, + Flags: 0, + LocalID: 0 + }; + newObjData['SequenceID'] = buf.readInt32LE(pos); + pos += 4; + newObjData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + newObjData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelAccessListUpdate.ts b/lib/classes/packets/ParcelAccessListUpdate.ts index 4cde5c9..02ad5b8 100644 --- a/lib/classes/packets/ParcelAccessListUpdate.ts +++ b/lib/classes/packets/ParcelAccessListUpdate.ts @@ -32,4 +32,98 @@ export class ParcelAccessListUpdatePacket implements Packet return ((24) * this.List.length) + 65; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.Data['Flags'], pos); + pos += 4; + buf.writeInt32LE(this.Data['LocalID'], pos); + pos += 4; + this.Data['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.Data['SequenceID'], pos); + pos += 4; + buf.writeInt32LE(this.Data['Sections'], pos); + pos += 4; + const count = this.List.length; + buf.writeUInt8(this.List.length, pos++); + for (let i = 0; i < count; i++) + { + this.List[i]['ID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.List[i]['Time'], pos); + pos += 4; + buf.writeUInt32LE(this.List[i]['Flags'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + Flags: number, + LocalID: number, + TransactionID: UUID, + SequenceID: number, + Sections: number + } = { + Flags: 0, + LocalID: 0, + TransactionID: UUID.zero(), + SequenceID: 0, + Sections: 0 + }; + newObjData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + newObjData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + newObjData['TransactionID'] = new UUID(buf, pos); + pos += 16; + newObjData['SequenceID'] = buf.readInt32LE(pos); + pos += 4; + newObjData['Sections'] = buf.readInt32LE(pos); + pos += 4; + this.Data = newObjData; + const count = buf.readUInt8(pos++); + this.List = []; + for (let i = 0; i < count; i++) + { + const newObjList: { + ID: UUID, + Time: number, + Flags: number + } = { + ID: UUID.zero(), + Time: 0, + Flags: 0 + }; + newObjList['ID'] = new UUID(buf, pos); + pos += 16; + newObjList['Time'] = buf.readInt32LE(pos); + pos += 4; + newObjList['Flags'] = buf.readUInt32LE(pos); + pos += 4; + this.List.push(newObjList); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelAuctions.ts b/lib/classes/packets/ParcelAuctions.ts index c4035e6..4e900d0 100644 --- a/lib/classes/packets/ParcelAuctions.ts +++ b/lib/classes/packets/ParcelAuctions.ts @@ -20,4 +20,42 @@ export class ParcelAuctionsPacket implements Packet return ((32) * this.ParcelData.length) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.ParcelData.length; + buf.writeUInt8(this.ParcelData.length, pos++); + for (let i = 0; i < count; i++) + { + this.ParcelData[i]['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + this.ParcelData[i]['WinnerID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.ParcelData = []; + for (let i = 0; i < count; i++) + { + const newObjParcelData: { + ParcelID: UUID, + WinnerID: UUID + } = { + ParcelID: UUID.zero(), + WinnerID: UUID.zero() + }; + newObjParcelData['ParcelID'] = new UUID(buf, pos); + pos += 16; + newObjParcelData['WinnerID'] = new UUID(buf, pos); + pos += 16; + this.ParcelData.push(newObjParcelData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelBuy.ts b/lib/classes/packets/ParcelBuy.ts index 0715807..9164985 100644 --- a/lib/classes/packets/ParcelBuy.ts +++ b/lib/classes/packets/ParcelBuy.ts @@ -31,4 +31,76 @@ export class ParcelBuyPacket implements Packet return 63; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.Data['IsGroupOwned']) ? 1 : 0, pos++); + buf.writeUInt8((this.Data['RemoveContribution']) ? 1 : 0, pos++); + buf.writeInt32LE(this.Data['LocalID'], pos); + pos += 4; + buf.writeUInt8((this.Data['Final']) ? 1 : 0, pos++); + buf.writeInt32LE(this.ParcelData['Price'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['Area'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + GroupID: UUID, + IsGroupOwned: boolean, + RemoveContribution: boolean, + LocalID: number, + Final: boolean + } = { + GroupID: UUID.zero(), + IsGroupOwned: false, + RemoveContribution: false, + LocalID: 0, + Final: false + }; + newObjData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjData['IsGroupOwned'] = (buf.readUInt8(pos++) === 1); + newObjData['RemoveContribution'] = (buf.readUInt8(pos++) === 1); + newObjData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + newObjData['Final'] = (buf.readUInt8(pos++) === 1); + this.Data = newObjData; + const newObjParcelData: { + Price: number, + Area: number + } = { + Price: 0, + Area: 0 + }; + newObjParcelData['Price'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['Area'] = buf.readInt32LE(pos); + pos += 4; + this.ParcelData = newObjParcelData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelBuyPass.ts b/lib/classes/packets/ParcelBuyPass.ts index 006c166..e725e8f 100644 --- a/lib/classes/packets/ParcelBuyPass.ts +++ b/lib/classes/packets/ParcelBuyPass.ts @@ -23,4 +23,42 @@ export class ParcelBuyPassPacket implements Packet return 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.ParcelData['LocalID'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjParcelData: { + LocalID: number + } = { + LocalID: 0 + }; + newObjParcelData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + this.ParcelData = newObjParcelData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelClaim.ts b/lib/classes/packets/ParcelClaim.ts index b2be11a..cb889e5 100644 --- a/lib/classes/packets/ParcelClaim.ts +++ b/lib/classes/packets/ParcelClaim.ts @@ -31,4 +31,88 @@ export class ParcelClaimPacket implements Packet return ((16) * this.ParcelData.length) + 51; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.Data['IsGroupOwned']) ? 1 : 0, pos++); + buf.writeUInt8((this.Data['Final']) ? 1 : 0, pos++); + const count = this.ParcelData.length; + buf.writeUInt8(this.ParcelData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeFloatLE(this.ParcelData[i]['West'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData[i]['South'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData[i]['East'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData[i]['North'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + GroupID: UUID, + IsGroupOwned: boolean, + Final: boolean + } = { + GroupID: UUID.zero(), + IsGroupOwned: false, + Final: false + }; + newObjData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjData['IsGroupOwned'] = (buf.readUInt8(pos++) === 1); + newObjData['Final'] = (buf.readUInt8(pos++) === 1); + this.Data = newObjData; + const count = buf.readUInt8(pos++); + this.ParcelData = []; + for (let i = 0; i < count; i++) + { + const newObjParcelData: { + West: number, + South: number, + East: number, + North: number + } = { + West: 0, + South: 0, + East: 0, + North: 0 + }; + newObjParcelData['West'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['South'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['East'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['North'] = buf.readFloatLE(pos); + pos += 4; + this.ParcelData.push(newObjParcelData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelDeedToGroup.ts b/lib/classes/packets/ParcelDeedToGroup.ts index 97c79c9..b16933b 100644 --- a/lib/classes/packets/ParcelDeedToGroup.ts +++ b/lib/classes/packets/ParcelDeedToGroup.ts @@ -24,4 +24,48 @@ export class ParcelDeedToGroupPacket implements Packet return 52; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.Data['LocalID'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + GroupID: UUID, + LocalID: number + } = { + GroupID: UUID.zero(), + LocalID: 0 + }; + newObjData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelDisableObjects.ts b/lib/classes/packets/ParcelDisableObjects.ts index 961b72b..8fc7362 100644 --- a/lib/classes/packets/ParcelDisableObjects.ts +++ b/lib/classes/packets/ParcelDisableObjects.ts @@ -30,4 +30,88 @@ export class ParcelDisableObjectsPacket implements Packet return ((16) * this.TaskIDs.length) + ((16) * this.OwnerIDs.length) + 42; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.ParcelData['LocalID'], pos); + pos += 4; + buf.writeUInt32LE(this.ParcelData['ReturnType'], pos); + pos += 4; + let count = this.TaskIDs.length; + buf.writeUInt8(this.TaskIDs.length, pos++); + for (let i = 0; i < count; i++) + { + this.TaskIDs[i]['TaskID'].writeToBuffer(buf, pos); + pos += 16; + } + count = this.OwnerIDs.length; + buf.writeUInt8(this.OwnerIDs.length, pos++); + for (let i = 0; i < count; i++) + { + this.OwnerIDs[i]['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjParcelData: { + LocalID: number, + ReturnType: number + } = { + LocalID: 0, + ReturnType: 0 + }; + newObjParcelData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['ReturnType'] = buf.readUInt32LE(pos); + pos += 4; + this.ParcelData = newObjParcelData; + let count = buf.readUInt8(pos++); + this.TaskIDs = []; + for (let i = 0; i < count; i++) + { + const newObjTaskIDs: { + TaskID: UUID + } = { + TaskID: UUID.zero() + }; + newObjTaskIDs['TaskID'] = new UUID(buf, pos); + pos += 16; + this.TaskIDs.push(newObjTaskIDs); + } + count = buf.readUInt8(pos++); + this.OwnerIDs = []; + for (let i = 0; i < count; i++) + { + const newObjOwnerIDs: { + OwnerID: UUID + } = { + OwnerID: UUID.zero() + }; + newObjOwnerIDs['OwnerID'] = new UUID(buf, pos); + pos += 16; + this.OwnerIDs.push(newObjOwnerIDs); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelDivide.ts b/lib/classes/packets/ParcelDivide.ts index 160a781..d9bea4f 100644 --- a/lib/classes/packets/ParcelDivide.ts +++ b/lib/classes/packets/ParcelDivide.ts @@ -26,4 +26,60 @@ export class ParcelDividePacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeFloatLE(this.ParcelData['West'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData['South'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData['East'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData['North'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjParcelData: { + West: number, + South: number, + East: number, + North: number + } = { + West: 0, + South: 0, + East: 0, + North: 0 + }; + newObjParcelData['West'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['South'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['East'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['North'] = buf.readFloatLE(pos); + pos += 4; + this.ParcelData = newObjParcelData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelDwellReply.ts b/lib/classes/packets/ParcelDwellReply.ts index 79060f2..f545713 100644 --- a/lib/classes/packets/ParcelDwellReply.ts +++ b/lib/classes/packets/ParcelDwellReply.ts @@ -24,4 +24,48 @@ export class ParcelDwellReplyPacket implements Packet return 40; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.Data['LocalID'], pos); + pos += 4; + this.Data['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeFloatLE(this.Data['Dwell'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + LocalID: number, + ParcelID: UUID, + Dwell: number + } = { + LocalID: 0, + ParcelID: UUID.zero(), + Dwell: 0 + }; + newObjData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + newObjData['ParcelID'] = new UUID(buf, pos); + pos += 16; + newObjData['Dwell'] = buf.readFloatLE(pos); + pos += 4; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelDwellRequest.ts b/lib/classes/packets/ParcelDwellRequest.ts index 8311d44..96a28e5 100644 --- a/lib/classes/packets/ParcelDwellRequest.ts +++ b/lib/classes/packets/ParcelDwellRequest.ts @@ -24,4 +24,48 @@ export class ParcelDwellRequestPacket implements Packet return 52; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.Data['LocalID'], pos); + pos += 4; + this.Data['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + LocalID: number, + ParcelID: UUID + } = { + LocalID: 0, + ParcelID: UUID.zero() + }; + newObjData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + newObjData['ParcelID'] = new UUID(buf, pos); + pos += 16; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelGodForceOwner.ts b/lib/classes/packets/ParcelGodForceOwner.ts index 767480a..9b0b411 100644 --- a/lib/classes/packets/ParcelGodForceOwner.ts +++ b/lib/classes/packets/ParcelGodForceOwner.ts @@ -24,4 +24,48 @@ export class ParcelGodForceOwnerPacket implements Packet return 52; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.Data['LocalID'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + OwnerID: UUID, + LocalID: number + } = { + OwnerID: UUID.zero(), + LocalID: 0 + }; + newObjData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelGodMarkAsContent.ts b/lib/classes/packets/ParcelGodMarkAsContent.ts index 545f851..3a1767e 100644 --- a/lib/classes/packets/ParcelGodMarkAsContent.ts +++ b/lib/classes/packets/ParcelGodMarkAsContent.ts @@ -23,4 +23,42 @@ export class ParcelGodMarkAsContentPacket implements Packet return 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.ParcelData['LocalID'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjParcelData: { + LocalID: number + } = { + LocalID: 0 + }; + newObjParcelData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + this.ParcelData = newObjParcelData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelInfoReply.ts b/lib/classes/packets/ParcelInfoReply.ts index 0e5b409..0ea508f 100644 --- a/lib/classes/packets/ParcelInfoReply.ts +++ b/lib/classes/packets/ParcelInfoReply.ts @@ -36,4 +36,118 @@ export class ParcelInfoReplyPacket implements Packet return (this.Data['Name'].length + 1 + this.Data['Desc'].length + 1 + this.Data['SimName'].length + 1) + 97; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.Data['Name'], pos); + pos += this.Data['Name'].length; + buf.write(this.Data['Desc'], pos); + pos += this.Data['Desc'].length; + buf.writeInt32LE(this.Data['ActualArea'], pos); + pos += 4; + buf.writeInt32LE(this.Data['BillableArea'], pos); + pos += 4; + buf.writeUInt8(this.Data['Flags'], pos++); + buf.writeFloatLE(this.Data['GlobalX'], pos); + pos += 4; + buf.writeFloatLE(this.Data['GlobalY'], pos); + pos += 4; + buf.writeFloatLE(this.Data['GlobalZ'], pos); + pos += 4; + buf.write(this.Data['SimName'], pos); + pos += this.Data['SimName'].length; + this.Data['SnapshotID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeFloatLE(this.Data['Dwell'], pos); + pos += 4; + buf.writeInt32LE(this.Data['SalePrice'], pos); + pos += 4; + buf.writeInt32LE(this.Data['AuctionID'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + ParcelID: UUID, + OwnerID: UUID, + Name: string, + Desc: string, + ActualArea: number, + BillableArea: number, + Flags: number, + GlobalX: number, + GlobalY: number, + GlobalZ: number, + SimName: string, + SnapshotID: UUID, + Dwell: number, + SalePrice: number, + AuctionID: number + } = { + ParcelID: UUID.zero(), + OwnerID: UUID.zero(), + Name: '', + Desc: '', + ActualArea: 0, + BillableArea: 0, + Flags: 0, + GlobalX: 0, + GlobalY: 0, + GlobalZ: 0, + SimName: '', + SnapshotID: UUID.zero(), + Dwell: 0, + SalePrice: 0, + AuctionID: 0 + }; + newObjData['ParcelID'] = new UUID(buf, pos); + pos += 16; + newObjData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['Desc'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['ActualArea'] = buf.readInt32LE(pos); + pos += 4; + newObjData['BillableArea'] = buf.readInt32LE(pos); + pos += 4; + newObjData['Flags'] = buf.readUInt8(pos++); + newObjData['GlobalX'] = buf.readFloatLE(pos); + pos += 4; + newObjData['GlobalY'] = buf.readFloatLE(pos); + pos += 4; + newObjData['GlobalZ'] = buf.readFloatLE(pos); + pos += 4; + newObjData['SimName'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['SnapshotID'] = new UUID(buf, pos); + pos += 16; + newObjData['Dwell'] = buf.readFloatLE(pos); + pos += 4; + newObjData['SalePrice'] = buf.readInt32LE(pos); + pos += 4; + newObjData['AuctionID'] = buf.readInt32LE(pos); + pos += 4; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelInfoRequest.ts b/lib/classes/packets/ParcelInfoRequest.ts index ecde2f9..cad1adb 100644 --- a/lib/classes/packets/ParcelInfoRequest.ts +++ b/lib/classes/packets/ParcelInfoRequest.ts @@ -23,4 +23,42 @@ export class ParcelInfoRequestPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + ParcelID: UUID + } = { + ParcelID: UUID.zero() + }; + newObjData['ParcelID'] = new UUID(buf, pos); + pos += 16; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelJoin.ts b/lib/classes/packets/ParcelJoin.ts index 8d290ce..07e0211 100644 --- a/lib/classes/packets/ParcelJoin.ts +++ b/lib/classes/packets/ParcelJoin.ts @@ -26,4 +26,60 @@ export class ParcelJoinPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeFloatLE(this.ParcelData['West'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData['South'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData['East'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData['North'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjParcelData: { + West: number, + South: number, + East: number, + North: number + } = { + West: 0, + South: 0, + East: 0, + North: 0 + }; + newObjParcelData['West'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['South'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['East'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['North'] = buf.readFloatLE(pos); + pos += 4; + this.ParcelData = newObjParcelData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelMediaCommandMessage.ts b/lib/classes/packets/ParcelMediaCommandMessage.ts index ef6e669..874e9c2 100644 --- a/lib/classes/packets/ParcelMediaCommandMessage.ts +++ b/lib/classes/packets/ParcelMediaCommandMessage.ts @@ -20,4 +20,38 @@ export class ParcelMediaCommandMessagePacket implements Packet return 12; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt32LE(this.CommandBlock['Flags'], pos); + pos += 4; + buf.writeUInt32LE(this.CommandBlock['Command'], pos); + pos += 4; + buf.writeFloatLE(this.CommandBlock['Time'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjCommandBlock: { + Flags: number, + Command: number, + Time: number + } = { + Flags: 0, + Command: 0, + Time: 0 + }; + newObjCommandBlock['Flags'] = buf.readUInt32LE(pos); + pos += 4; + newObjCommandBlock['Command'] = buf.readUInt32LE(pos); + pos += 4; + newObjCommandBlock['Time'] = buf.readFloatLE(pos); + pos += 4; + this.CommandBlock = newObjCommandBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelMediaUpdate.ts b/lib/classes/packets/ParcelMediaUpdate.ts index 59b8e85..ca94d75 100644 --- a/lib/classes/packets/ParcelMediaUpdate.ts +++ b/lib/classes/packets/ParcelMediaUpdate.ts @@ -28,4 +28,68 @@ export class ParcelMediaUpdatePacket implements Packet return (this.DataBlock['MediaURL'].length + 1) + (this.DataBlockExtended['MediaType'].length + 1 + this.DataBlockExtended['MediaDesc'].length + 1) + 26; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.write(this.DataBlock['MediaURL'], pos); + pos += this.DataBlock['MediaURL'].length; + this.DataBlock['MediaID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.DataBlock['MediaAutoScale'], pos++); + buf.write(this.DataBlockExtended['MediaType'], pos); + pos += this.DataBlockExtended['MediaType'].length; + buf.write(this.DataBlockExtended['MediaDesc'], pos); + pos += this.DataBlockExtended['MediaDesc'].length; + buf.writeInt32LE(this.DataBlockExtended['MediaWidth'], pos); + pos += 4; + buf.writeInt32LE(this.DataBlockExtended['MediaHeight'], pos); + pos += 4; + buf.writeUInt8(this.DataBlockExtended['MediaLoop'], pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjDataBlock: { + MediaURL: string, + MediaID: UUID, + MediaAutoScale: number + } = { + MediaURL: '', + MediaID: UUID.zero(), + MediaAutoScale: 0 + }; + newObjDataBlock['MediaURL'] = buf.toString('utf8', pos, length); + pos += length; + newObjDataBlock['MediaID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['MediaAutoScale'] = buf.readUInt8(pos++); + this.DataBlock = newObjDataBlock; + const newObjDataBlockExtended: { + MediaType: string, + MediaDesc: string, + MediaWidth: number, + MediaHeight: number, + MediaLoop: number + } = { + MediaType: '', + MediaDesc: '', + MediaWidth: 0, + MediaHeight: 0, + MediaLoop: 0 + }; + newObjDataBlockExtended['MediaType'] = buf.toString('utf8', pos, length); + pos += length; + newObjDataBlockExtended['MediaDesc'] = buf.toString('utf8', pos, length); + pos += length; + newObjDataBlockExtended['MediaWidth'] = buf.readInt32LE(pos); + pos += 4; + newObjDataBlockExtended['MediaHeight'] = buf.readInt32LE(pos); + pos += 4; + newObjDataBlockExtended['MediaLoop'] = buf.readUInt8(pos++); + this.DataBlockExtended = newObjDataBlockExtended; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelObjectOwnersReply.ts b/lib/classes/packets/ParcelObjectOwnersReply.ts index 9059551..c72b933 100644 --- a/lib/classes/packets/ParcelObjectOwnersReply.ts +++ b/lib/classes/packets/ParcelObjectOwnersReply.ts @@ -22,4 +22,50 @@ export class ParcelObjectOwnersReplyPacket implements Packet return ((22) * this.Data.length) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.Data.length; + buf.writeUInt8(this.Data.length, pos++); + for (let i = 0; i < count; i++) + { + this.Data[i]['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.Data[i]['IsGroupOwned']) ? 1 : 0, pos++); + buf.writeInt32LE(this.Data[i]['Count'], pos); + pos += 4; + buf.writeUInt8((this.Data[i]['OnlineStatus']) ? 1 : 0, pos++); + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.Data = []; + for (let i = 0; i < count; i++) + { + const newObjData: { + OwnerID: UUID, + IsGroupOwned: boolean, + Count: number, + OnlineStatus: boolean + } = { + OwnerID: UUID.zero(), + IsGroupOwned: false, + Count: 0, + OnlineStatus: false + }; + newObjData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjData['IsGroupOwned'] = (buf.readUInt8(pos++) === 1); + newObjData['Count'] = buf.readInt32LE(pos); + pos += 4; + newObjData['OnlineStatus'] = (buf.readUInt8(pos++) === 1); + this.Data.push(newObjData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelObjectOwnersRequest.ts b/lib/classes/packets/ParcelObjectOwnersRequest.ts index 1f56ca2..e580b3a 100644 --- a/lib/classes/packets/ParcelObjectOwnersRequest.ts +++ b/lib/classes/packets/ParcelObjectOwnersRequest.ts @@ -23,4 +23,42 @@ export class ParcelObjectOwnersRequestPacket implements Packet return 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.ParcelData['LocalID'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjParcelData: { + LocalID: number + } = { + LocalID: 0 + }; + newObjParcelData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + this.ParcelData = newObjParcelData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelOverlay.ts b/lib/classes/packets/ParcelOverlay.ts index de3f008..643b916 100644 --- a/lib/classes/packets/ParcelOverlay.ts +++ b/lib/classes/packets/ParcelOverlay.ts @@ -19,4 +19,32 @@ export class ParcelOverlayPacket implements Packet return (this.ParcelData['Data'].length + 2) + 4; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.ParcelData['SequenceID'], pos); + pos += 4; + buf.write(this.ParcelData['Data'], pos); + pos += this.ParcelData['Data'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjParcelData: { + SequenceID: number, + Data: string + } = { + SequenceID: 0, + Data: '' + }; + newObjParcelData['SequenceID'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['Data'] = buf.toString('utf8', pos, length); + pos += length; + this.ParcelData = newObjParcelData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelProperties.ts b/lib/classes/packets/ParcelProperties.ts index 5eda4b0..71e09d4 100644 --- a/lib/classes/packets/ParcelProperties.ts +++ b/lib/classes/packets/ParcelProperties.ts @@ -74,4 +74,310 @@ export class ParcelPropertiesPacket implements Packet return (this.ParcelData['Bitmap'].length + 2 + this.ParcelData['Name'].length + 1 + this.ParcelData['Desc'].length + 1 + this.ParcelData['MusicURL'].length + 1 + this.ParcelData['MediaURL'].length + 1) + 240; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.ParcelData['RequestResult'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['SequenceID'], pos); + pos += 4; + buf.writeUInt8((this.ParcelData['SnapSelection']) ? 1 : 0, pos++); + buf.writeInt32LE(this.ParcelData['SelfCount'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['OtherCount'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['PublicCount'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['LocalID'], pos); + pos += 4; + this.ParcelData['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.ParcelData['IsGroupOwned']) ? 1 : 0, pos++); + buf.writeUInt32LE(this.ParcelData['AuctionID'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['ClaimDate'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['ClaimPrice'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['RentPrice'], pos); + pos += 4; + this.ParcelData['AABBMin'].writeToBuffer(buf, pos, false); + pos += 12; + this.ParcelData['AABBMax'].writeToBuffer(buf, pos, false); + pos += 12; + buf.write(this.ParcelData['Bitmap'], pos); + pos += this.ParcelData['Bitmap'].length; + buf.writeInt32LE(this.ParcelData['Area'], pos); + pos += 4; + buf.writeUInt8(this.ParcelData['Status'], pos++); + buf.writeInt32LE(this.ParcelData['SimWideMaxPrims'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['SimWideTotalPrims'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['MaxPrims'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['TotalPrims'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['OwnerPrims'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['GroupPrims'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['OtherPrims'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['SelectedPrims'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData['ParcelPrimBonus'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['OtherCleanTime'], pos); + pos += 4; + buf.writeUInt32LE(this.ParcelData['ParcelFlags'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['SalePrice'], pos); + pos += 4; + buf.write(this.ParcelData['Name'], pos); + pos += this.ParcelData['Name'].length; + buf.write(this.ParcelData['Desc'], pos); + pos += this.ParcelData['Desc'].length; + buf.write(this.ParcelData['MusicURL'], pos); + pos += this.ParcelData['MusicURL'].length; + buf.write(this.ParcelData['MediaURL'], pos); + pos += this.ParcelData['MediaURL'].length; + this.ParcelData['MediaID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.ParcelData['MediaAutoScale'], pos++); + this.ParcelData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.ParcelData['PassPrice'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData['PassHours'], pos); + pos += 4; + buf.writeUInt8(this.ParcelData['Category'], pos++); + this.ParcelData['AuthBuyerID'].writeToBuffer(buf, pos); + pos += 16; + this.ParcelData['SnapshotID'].writeToBuffer(buf, pos); + pos += 16; + this.ParcelData['UserLocation'].writeToBuffer(buf, pos, false); + pos += 12; + this.ParcelData['UserLookAt'].writeToBuffer(buf, pos, false); + pos += 12; + buf.writeUInt8(this.ParcelData['LandingType'], pos++); + buf.writeUInt8((this.ParcelData['RegionPushOverride']) ? 1 : 0, pos++); + buf.writeUInt8((this.ParcelData['RegionDenyAnonymous']) ? 1 : 0, pos++); + buf.writeUInt8((this.ParcelData['RegionDenyIdentified']) ? 1 : 0, pos++); + buf.writeUInt8((this.ParcelData['RegionDenyTransacted']) ? 1 : 0, pos++); + buf.writeUInt8((this.AgeVerificationBlock['RegionDenyAgeUnverified']) ? 1 : 0, pos++); + buf.writeUInt8((this.RegionAllowAccessBlock['RegionAllowAccessOverride']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjParcelData: { + RequestResult: number, + SequenceID: number, + SnapSelection: boolean, + SelfCount: number, + OtherCount: number, + PublicCount: number, + LocalID: number, + OwnerID: UUID, + IsGroupOwned: boolean, + AuctionID: number, + ClaimDate: number, + ClaimPrice: number, + RentPrice: number, + AABBMin: Vector3, + AABBMax: Vector3, + Bitmap: string, + Area: number, + Status: number, + SimWideMaxPrims: number, + SimWideTotalPrims: number, + MaxPrims: number, + TotalPrims: number, + OwnerPrims: number, + GroupPrims: number, + OtherPrims: number, + SelectedPrims: number, + ParcelPrimBonus: number, + OtherCleanTime: number, + ParcelFlags: number, + SalePrice: number, + Name: string, + Desc: string, + MusicURL: string, + MediaURL: string, + MediaID: UUID, + MediaAutoScale: number, + GroupID: UUID, + PassPrice: number, + PassHours: number, + Category: number, + AuthBuyerID: UUID, + SnapshotID: UUID, + UserLocation: Vector3, + UserLookAt: Vector3, + LandingType: number, + RegionPushOverride: boolean, + RegionDenyAnonymous: boolean, + RegionDenyIdentified: boolean, + RegionDenyTransacted: boolean + } = { + RequestResult: 0, + SequenceID: 0, + SnapSelection: false, + SelfCount: 0, + OtherCount: 0, + PublicCount: 0, + LocalID: 0, + OwnerID: UUID.zero(), + IsGroupOwned: false, + AuctionID: 0, + ClaimDate: 0, + ClaimPrice: 0, + RentPrice: 0, + AABBMin: Vector3.getZero(), + AABBMax: Vector3.getZero(), + Bitmap: '', + Area: 0, + Status: 0, + SimWideMaxPrims: 0, + SimWideTotalPrims: 0, + MaxPrims: 0, + TotalPrims: 0, + OwnerPrims: 0, + GroupPrims: 0, + OtherPrims: 0, + SelectedPrims: 0, + ParcelPrimBonus: 0, + OtherCleanTime: 0, + ParcelFlags: 0, + SalePrice: 0, + Name: '', + Desc: '', + MusicURL: '', + MediaURL: '', + MediaID: UUID.zero(), + MediaAutoScale: 0, + GroupID: UUID.zero(), + PassPrice: 0, + PassHours: 0, + Category: 0, + AuthBuyerID: UUID.zero(), + SnapshotID: UUID.zero(), + UserLocation: Vector3.getZero(), + UserLookAt: Vector3.getZero(), + LandingType: 0, + RegionPushOverride: false, + RegionDenyAnonymous: false, + RegionDenyIdentified: false, + RegionDenyTransacted: false + }; + newObjParcelData['RequestResult'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['SequenceID'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['SnapSelection'] = (buf.readUInt8(pos++) === 1); + newObjParcelData['SelfCount'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['OtherCount'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['PublicCount'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjParcelData['IsGroupOwned'] = (buf.readUInt8(pos++) === 1); + newObjParcelData['AuctionID'] = buf.readUInt32LE(pos); + pos += 4; + newObjParcelData['ClaimDate'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['ClaimPrice'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['RentPrice'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['AABBMin'] = new Vector3(buf, pos, false); + pos += 12; + newObjParcelData['AABBMax'] = new Vector3(buf, pos, false); + pos += 12; + newObjParcelData['Bitmap'] = buf.toString('utf8', pos, length); + pos += length; + newObjParcelData['Area'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['Status'] = buf.readUInt8(pos++); + newObjParcelData['SimWideMaxPrims'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['SimWideTotalPrims'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['MaxPrims'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['TotalPrims'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['OwnerPrims'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['GroupPrims'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['OtherPrims'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['SelectedPrims'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['ParcelPrimBonus'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['OtherCleanTime'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['ParcelFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjParcelData['SalePrice'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjParcelData['Desc'] = buf.toString('utf8', pos, length); + pos += length; + newObjParcelData['MusicURL'] = buf.toString('utf8', pos, length); + pos += length; + newObjParcelData['MediaURL'] = buf.toString('utf8', pos, length); + pos += length; + newObjParcelData['MediaID'] = new UUID(buf, pos); + pos += 16; + newObjParcelData['MediaAutoScale'] = buf.readUInt8(pos++); + newObjParcelData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjParcelData['PassPrice'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['PassHours'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['Category'] = buf.readUInt8(pos++); + newObjParcelData['AuthBuyerID'] = new UUID(buf, pos); + pos += 16; + newObjParcelData['SnapshotID'] = new UUID(buf, pos); + pos += 16; + newObjParcelData['UserLocation'] = new Vector3(buf, pos, false); + pos += 12; + newObjParcelData['UserLookAt'] = new Vector3(buf, pos, false); + pos += 12; + newObjParcelData['LandingType'] = buf.readUInt8(pos++); + newObjParcelData['RegionPushOverride'] = (buf.readUInt8(pos++) === 1); + newObjParcelData['RegionDenyAnonymous'] = (buf.readUInt8(pos++) === 1); + newObjParcelData['RegionDenyIdentified'] = (buf.readUInt8(pos++) === 1); + newObjParcelData['RegionDenyTransacted'] = (buf.readUInt8(pos++) === 1); + this.ParcelData = newObjParcelData; + const newObjAgeVerificationBlock: { + RegionDenyAgeUnverified: boolean + } = { + RegionDenyAgeUnverified: false + }; + newObjAgeVerificationBlock['RegionDenyAgeUnverified'] = (buf.readUInt8(pos++) === 1); + this.AgeVerificationBlock = newObjAgeVerificationBlock; + const newObjRegionAllowAccessBlock: { + RegionAllowAccessOverride: boolean + } = { + RegionAllowAccessOverride: false + }; + newObjRegionAllowAccessBlock['RegionAllowAccessOverride'] = (buf.readUInt8(pos++) === 1); + this.RegionAllowAccessBlock = newObjRegionAllowAccessBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelPropertiesRequest.ts b/lib/classes/packets/ParcelPropertiesRequest.ts index c432277..768bb29 100644 --- a/lib/classes/packets/ParcelPropertiesRequest.ts +++ b/lib/classes/packets/ParcelPropertiesRequest.ts @@ -28,4 +28,70 @@ export class ParcelPropertiesRequestPacket implements Packet return 53; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.ParcelData['SequenceID'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData['West'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData['South'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData['East'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData['North'], pos); + pos += 4; + buf.writeUInt8((this.ParcelData['SnapSelection']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjParcelData: { + SequenceID: number, + West: number, + South: number, + East: number, + North: number, + SnapSelection: boolean + } = { + SequenceID: 0, + West: 0, + South: 0, + East: 0, + North: 0, + SnapSelection: false + }; + newObjParcelData['SequenceID'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['West'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['South'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['East'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['North'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['SnapSelection'] = (buf.readUInt8(pos++) === 1); + this.ParcelData = newObjParcelData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelPropertiesRequestByID.ts b/lib/classes/packets/ParcelPropertiesRequestByID.ts index 3066ea5..4b0aedd 100644 --- a/lib/classes/packets/ParcelPropertiesRequestByID.ts +++ b/lib/classes/packets/ParcelPropertiesRequestByID.ts @@ -24,4 +24,48 @@ export class ParcelPropertiesRequestByIDPacket implements Packet return 40; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.ParcelData['SequenceID'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['LocalID'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjParcelData: { + SequenceID: number, + LocalID: number + } = { + SequenceID: 0, + LocalID: 0 + }; + newObjParcelData['SequenceID'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + this.ParcelData = newObjParcelData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelPropertiesUpdate.ts b/lib/classes/packets/ParcelPropertiesUpdate.ts index 1e91ae3..e754654 100644 --- a/lib/classes/packets/ParcelPropertiesUpdate.ts +++ b/lib/classes/packets/ParcelPropertiesUpdate.ts @@ -42,4 +42,144 @@ export class ParcelPropertiesUpdatePacket implements Packet return (this.ParcelData['Name'].length + 1 + this.ParcelData['Desc'].length + 1 + this.ParcelData['MusicURL'].length + 1 + this.ParcelData['MediaURL'].length + 1) + 147; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.ParcelData['LocalID'], pos); + pos += 4; + buf.writeUInt32LE(this.ParcelData['Flags'], pos); + pos += 4; + buf.writeUInt32LE(this.ParcelData['ParcelFlags'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['SalePrice'], pos); + pos += 4; + buf.write(this.ParcelData['Name'], pos); + pos += this.ParcelData['Name'].length; + buf.write(this.ParcelData['Desc'], pos); + pos += this.ParcelData['Desc'].length; + buf.write(this.ParcelData['MusicURL'], pos); + pos += this.ParcelData['MusicURL'].length; + buf.write(this.ParcelData['MediaURL'], pos); + pos += this.ParcelData['MediaURL'].length; + this.ParcelData['MediaID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.ParcelData['MediaAutoScale'], pos++); + this.ParcelData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.ParcelData['PassPrice'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData['PassHours'], pos); + pos += 4; + buf.writeUInt8(this.ParcelData['Category'], pos++); + this.ParcelData['AuthBuyerID'].writeToBuffer(buf, pos); + pos += 16; + this.ParcelData['SnapshotID'].writeToBuffer(buf, pos); + pos += 16; + this.ParcelData['UserLocation'].writeToBuffer(buf, pos, false); + pos += 12; + this.ParcelData['UserLookAt'].writeToBuffer(buf, pos, false); + pos += 12; + buf.writeUInt8(this.ParcelData['LandingType'], pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjParcelData: { + LocalID: number, + Flags: number, + ParcelFlags: number, + SalePrice: number, + Name: string, + Desc: string, + MusicURL: string, + MediaURL: string, + MediaID: UUID, + MediaAutoScale: number, + GroupID: UUID, + PassPrice: number, + PassHours: number, + Category: number, + AuthBuyerID: UUID, + SnapshotID: UUID, + UserLocation: Vector3, + UserLookAt: Vector3, + LandingType: number + } = { + LocalID: 0, + Flags: 0, + ParcelFlags: 0, + SalePrice: 0, + Name: '', + Desc: '', + MusicURL: '', + MediaURL: '', + MediaID: UUID.zero(), + MediaAutoScale: 0, + GroupID: UUID.zero(), + PassPrice: 0, + PassHours: 0, + Category: 0, + AuthBuyerID: UUID.zero(), + SnapshotID: UUID.zero(), + UserLocation: Vector3.getZero(), + UserLookAt: Vector3.getZero(), + LandingType: 0 + }; + newObjParcelData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + newObjParcelData['ParcelFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjParcelData['SalePrice'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjParcelData['Desc'] = buf.toString('utf8', pos, length); + pos += length; + newObjParcelData['MusicURL'] = buf.toString('utf8', pos, length); + pos += length; + newObjParcelData['MediaURL'] = buf.toString('utf8', pos, length); + pos += length; + newObjParcelData['MediaID'] = new UUID(buf, pos); + pos += 16; + newObjParcelData['MediaAutoScale'] = buf.readUInt8(pos++); + newObjParcelData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjParcelData['PassPrice'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['PassHours'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['Category'] = buf.readUInt8(pos++); + newObjParcelData['AuthBuyerID'] = new UUID(buf, pos); + pos += 16; + newObjParcelData['SnapshotID'] = new UUID(buf, pos); + pos += 16; + newObjParcelData['UserLocation'] = new Vector3(buf, pos, false); + pos += 12; + newObjParcelData['UserLookAt'] = new Vector3(buf, pos, false); + pos += 12; + newObjParcelData['LandingType'] = buf.readUInt8(pos++); + this.ParcelData = newObjParcelData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelReclaim.ts b/lib/classes/packets/ParcelReclaim.ts index 2563032..1496274 100644 --- a/lib/classes/packets/ParcelReclaim.ts +++ b/lib/classes/packets/ParcelReclaim.ts @@ -23,4 +23,42 @@ export class ParcelReclaimPacket implements Packet return 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.Data['LocalID'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + LocalID: number + } = { + LocalID: 0 + }; + newObjData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelRelease.ts b/lib/classes/packets/ParcelRelease.ts index 637d45b..f004c9a 100644 --- a/lib/classes/packets/ParcelRelease.ts +++ b/lib/classes/packets/ParcelRelease.ts @@ -23,4 +23,42 @@ export class ParcelReleasePacket implements Packet return 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.Data['LocalID'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + LocalID: number + } = { + LocalID: 0 + }; + newObjData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelRename.ts b/lib/classes/packets/ParcelRename.ts index 65be41a..b520fb3 100644 --- a/lib/classes/packets/ParcelRename.ts +++ b/lib/classes/packets/ParcelRename.ts @@ -30,4 +30,42 @@ export class ParcelRenamePacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.ParcelData.length; + buf.writeUInt8(this.ParcelData.length, pos++); + for (let i = 0; i < count; i++) + { + this.ParcelData[i]['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.ParcelData[i]['NewName'], pos); + pos += this.ParcelData[i]['NewName'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.ParcelData = []; + for (let i = 0; i < count; i++) + { + const newObjParcelData: { + ParcelID: UUID, + NewName: string + } = { + ParcelID: UUID.zero(), + NewName: '' + }; + newObjParcelData['ParcelID'] = new UUID(buf, pos); + pos += 16; + newObjParcelData['NewName'] = buf.toString('utf8', pos, length); + pos += length; + this.ParcelData.push(newObjParcelData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelReturnObjects.ts b/lib/classes/packets/ParcelReturnObjects.ts index 0b9c057..fb1b639 100644 --- a/lib/classes/packets/ParcelReturnObjects.ts +++ b/lib/classes/packets/ParcelReturnObjects.ts @@ -30,4 +30,88 @@ export class ParcelReturnObjectsPacket implements Packet return ((16) * this.TaskIDs.length) + ((16) * this.OwnerIDs.length) + 42; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.ParcelData['LocalID'], pos); + pos += 4; + buf.writeUInt32LE(this.ParcelData['ReturnType'], pos); + pos += 4; + let count = this.TaskIDs.length; + buf.writeUInt8(this.TaskIDs.length, pos++); + for (let i = 0; i < count; i++) + { + this.TaskIDs[i]['TaskID'].writeToBuffer(buf, pos); + pos += 16; + } + count = this.OwnerIDs.length; + buf.writeUInt8(this.OwnerIDs.length, pos++); + for (let i = 0; i < count; i++) + { + this.OwnerIDs[i]['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjParcelData: { + LocalID: number, + ReturnType: number + } = { + LocalID: 0, + ReturnType: 0 + }; + newObjParcelData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['ReturnType'] = buf.readUInt32LE(pos); + pos += 4; + this.ParcelData = newObjParcelData; + let count = buf.readUInt8(pos++); + this.TaskIDs = []; + for (let i = 0; i < count; i++) + { + const newObjTaskIDs: { + TaskID: UUID + } = { + TaskID: UUID.zero() + }; + newObjTaskIDs['TaskID'] = new UUID(buf, pos); + pos += 16; + this.TaskIDs.push(newObjTaskIDs); + } + count = buf.readUInt8(pos++); + this.OwnerIDs = []; + for (let i = 0; i < count; i++) + { + const newObjOwnerIDs: { + OwnerID: UUID + } = { + OwnerID: UUID.zero() + }; + newObjOwnerIDs['OwnerID'] = new UUID(buf, pos); + pos += 16; + this.OwnerIDs.push(newObjOwnerIDs); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelSales.ts b/lib/classes/packets/ParcelSales.ts index 46bcba4..ce77e14 100644 --- a/lib/classes/packets/ParcelSales.ts +++ b/lib/classes/packets/ParcelSales.ts @@ -20,4 +20,42 @@ export class ParcelSalesPacket implements Packet return ((32) * this.ParcelData.length) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.ParcelData.length; + buf.writeUInt8(this.ParcelData.length, pos++); + for (let i = 0; i < count; i++) + { + this.ParcelData[i]['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + this.ParcelData[i]['BuyerID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.ParcelData = []; + for (let i = 0; i < count; i++) + { + const newObjParcelData: { + ParcelID: UUID, + BuyerID: UUID + } = { + ParcelID: UUID.zero(), + BuyerID: UUID.zero() + }; + newObjParcelData['ParcelID'] = new UUID(buf, pos); + pos += 16; + newObjParcelData['BuyerID'] = new UUID(buf, pos); + pos += 16; + this.ParcelData.push(newObjParcelData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelSelectObjects.ts b/lib/classes/packets/ParcelSelectObjects.ts index 1bda3d5..2cdca0e 100644 --- a/lib/classes/packets/ParcelSelectObjects.ts +++ b/lib/classes/packets/ParcelSelectObjects.ts @@ -27,4 +27,68 @@ export class ParcelSelectObjectsPacket implements Packet return ((16) * this.ReturnIDs.length) + 41; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.ParcelData['LocalID'], pos); + pos += 4; + buf.writeUInt32LE(this.ParcelData['ReturnType'], pos); + pos += 4; + const count = this.ReturnIDs.length; + buf.writeUInt8(this.ReturnIDs.length, pos++); + for (let i = 0; i < count; i++) + { + this.ReturnIDs[i]['ReturnID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjParcelData: { + LocalID: number, + ReturnType: number + } = { + LocalID: 0, + ReturnType: 0 + }; + newObjParcelData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['ReturnType'] = buf.readUInt32LE(pos); + pos += 4; + this.ParcelData = newObjParcelData; + const count = buf.readUInt8(pos++); + this.ReturnIDs = []; + for (let i = 0; i < count; i++) + { + const newObjReturnIDs: { + ReturnID: UUID + } = { + ReturnID: UUID.zero() + }; + newObjReturnIDs['ReturnID'] = new UUID(buf, pos); + pos += 16; + this.ReturnIDs.push(newObjReturnIDs); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ParcelSetOtherCleanTime.ts b/lib/classes/packets/ParcelSetOtherCleanTime.ts index 98125d4..4419459 100644 --- a/lib/classes/packets/ParcelSetOtherCleanTime.ts +++ b/lib/classes/packets/ParcelSetOtherCleanTime.ts @@ -24,4 +24,48 @@ export class ParcelSetOtherCleanTimePacket implements Packet return 40; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.ParcelData['LocalID'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['OtherCleanTime'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjParcelData: { + LocalID: number, + OtherCleanTime: number + } = { + LocalID: 0, + OtherCleanTime: 0 + }; + newObjParcelData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['OtherCleanTime'] = buf.readInt32LE(pos); + pos += 4; + this.ParcelData = newObjParcelData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/PayPriceReply.ts b/lib/classes/packets/PayPriceReply.ts index 035fd79..b309bf1 100644 --- a/lib/classes/packets/PayPriceReply.ts +++ b/lib/classes/packets/PayPriceReply.ts @@ -23,4 +23,52 @@ export class PayPriceReplyPacket implements Packet return ((4) * this.ButtonData.length) + 21; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.ObjectData['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.ObjectData['DefaultPayPrice'], pos); + pos += 4; + const count = this.ButtonData.length; + buf.writeUInt8(this.ButtonData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeInt32LE(this.ButtonData[i]['PayButton'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjObjectData: { + ObjectID: UUID, + DefaultPayPrice: number + } = { + ObjectID: UUID.zero(), + DefaultPayPrice: 0 + }; + newObjObjectData['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['DefaultPayPrice'] = buf.readInt32LE(pos); + pos += 4; + this.ObjectData = newObjObjectData; + const count = buf.readUInt8(pos++); + this.ButtonData = []; + for (let i = 0; i < count; i++) + { + const newObjButtonData: { + PayButton: number + } = { + PayButton: 0 + }; + newObjButtonData['PayButton'] = buf.readInt32LE(pos); + pos += 4; + this.ButtonData.push(newObjButtonData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/PickDelete.ts b/lib/classes/packets/PickDelete.ts index 4870ff7..7fe012c 100644 --- a/lib/classes/packets/PickDelete.ts +++ b/lib/classes/packets/PickDelete.ts @@ -23,4 +23,42 @@ export class PickDeletePacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['PickID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + PickID: UUID + } = { + PickID: UUID.zero() + }; + newObjData['PickID'] = new UUID(buf, pos); + pos += 16; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/PickGodDelete.ts b/lib/classes/packets/PickGodDelete.ts index d27e9a3..96c4068 100644 --- a/lib/classes/packets/PickGodDelete.ts +++ b/lib/classes/packets/PickGodDelete.ts @@ -24,4 +24,48 @@ export class PickGodDeletePacket implements Packet return 64; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['PickID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['QueryID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + PickID: UUID, + QueryID: UUID + } = { + PickID: UUID.zero(), + QueryID: UUID.zero() + }; + newObjData['PickID'] = new UUID(buf, pos); + pos += 16; + newObjData['QueryID'] = new UUID(buf, pos); + pos += 16; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/PickInfoReply.ts b/lib/classes/packets/PickInfoReply.ts index 0fe078b..13b1876 100644 --- a/lib/classes/packets/PickInfoReply.ts +++ b/lib/classes/packets/PickInfoReply.ts @@ -35,4 +35,104 @@ export class PickInfoReplyPacket implements Packet return (this.Data['Name'].length + 1 + this.Data['Desc'].length + 2 + this.Data['User'].length + 1 + this.Data['OriginalName'].length + 1 + this.Data['SimName'].length + 1) + 110; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['PickID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['CreatorID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.Data['TopPick']) ? 1 : 0, pos++); + this.Data['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.Data['Name'], pos); + pos += this.Data['Name'].length; + buf.write(this.Data['Desc'], pos); + pos += this.Data['Desc'].length; + this.Data['SnapshotID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.Data['User'], pos); + pos += this.Data['User'].length; + buf.write(this.Data['OriginalName'], pos); + pos += this.Data['OriginalName'].length; + buf.write(this.Data['SimName'], pos); + pos += this.Data['SimName'].length; + this.Data['PosGlobal'].writeToBuffer(buf, pos, true); + pos += 24; + buf.writeInt32LE(this.Data['SortOrder'], pos); + pos += 4; + buf.writeUInt8((this.Data['Enabled']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + PickID: UUID, + CreatorID: UUID, + TopPick: boolean, + ParcelID: UUID, + Name: string, + Desc: string, + SnapshotID: UUID, + User: string, + OriginalName: string, + SimName: string, + PosGlobal: Vector3, + SortOrder: number, + Enabled: boolean + } = { + PickID: UUID.zero(), + CreatorID: UUID.zero(), + TopPick: false, + ParcelID: UUID.zero(), + Name: '', + Desc: '', + SnapshotID: UUID.zero(), + User: '', + OriginalName: '', + SimName: '', + PosGlobal: Vector3.getZero(), + SortOrder: 0, + Enabled: false + }; + newObjData['PickID'] = new UUID(buf, pos); + pos += 16; + newObjData['CreatorID'] = new UUID(buf, pos); + pos += 16; + newObjData['TopPick'] = (buf.readUInt8(pos++) === 1); + newObjData['ParcelID'] = new UUID(buf, pos); + pos += 16; + newObjData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['Desc'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['SnapshotID'] = new UUID(buf, pos); + pos += 16; + newObjData['User'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['OriginalName'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['SimName'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['PosGlobal'] = new Vector3(buf, pos, true); + pos += 24; + newObjData['SortOrder'] = buf.readInt32LE(pos); + pos += 4; + newObjData['Enabled'] = (buf.readUInt8(pos++) === 1); + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/PickInfoUpdate.ts b/lib/classes/packets/PickInfoUpdate.ts index a517f91..ccc4283 100644 --- a/lib/classes/packets/PickInfoUpdate.ts +++ b/lib/classes/packets/PickInfoUpdate.ts @@ -33,4 +33,92 @@ export class PickInfoUpdatePacket implements Packet return (this.Data['Name'].length + 1 + this.Data['Desc'].length + 2) + 126; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['PickID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['CreatorID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.Data['TopPick']) ? 1 : 0, pos++); + this.Data['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.Data['Name'], pos); + pos += this.Data['Name'].length; + buf.write(this.Data['Desc'], pos); + pos += this.Data['Desc'].length; + this.Data['SnapshotID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['PosGlobal'].writeToBuffer(buf, pos, true); + pos += 24; + buf.writeInt32LE(this.Data['SortOrder'], pos); + pos += 4; + buf.writeUInt8((this.Data['Enabled']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + PickID: UUID, + CreatorID: UUID, + TopPick: boolean, + ParcelID: UUID, + Name: string, + Desc: string, + SnapshotID: UUID, + PosGlobal: Vector3, + SortOrder: number, + Enabled: boolean + } = { + PickID: UUID.zero(), + CreatorID: UUID.zero(), + TopPick: false, + ParcelID: UUID.zero(), + Name: '', + Desc: '', + SnapshotID: UUID.zero(), + PosGlobal: Vector3.getZero(), + SortOrder: 0, + Enabled: false + }; + newObjData['PickID'] = new UUID(buf, pos); + pos += 16; + newObjData['CreatorID'] = new UUID(buf, pos); + pos += 16; + newObjData['TopPick'] = (buf.readUInt8(pos++) === 1); + newObjData['ParcelID'] = new UUID(buf, pos); + pos += 16; + newObjData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['Desc'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['SnapshotID'] = new UUID(buf, pos); + pos += 16; + newObjData['PosGlobal'] = new Vector3(buf, pos, true); + pos += 24; + newObjData['SortOrder'] = buf.readInt32LE(pos); + pos += 4; + newObjData['Enabled'] = (buf.readUInt8(pos++) === 1); + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/PlacesQuery.ts b/lib/classes/packets/PlacesQuery.ts index 1e1d2b2..5b5d6ae 100644 --- a/lib/classes/packets/PlacesQuery.ts +++ b/lib/classes/packets/PlacesQuery.ts @@ -30,4 +30,74 @@ export class PlacesQueryPacket implements Packet return (this.QueryData['QueryText'].length + 1 + this.QueryData['SimName'].length + 1) + 69; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + this.TransactionData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.QueryData['QueryText'], pos); + pos += this.QueryData['QueryText'].length; + buf.writeUInt32LE(this.QueryData['QueryFlags'], pos); + pos += 4; + buf.writeInt8(this.QueryData['Category'], pos++); + buf.write(this.QueryData['SimName'], pos); + pos += this.QueryData['SimName'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + QueryID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + QueryID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['QueryID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjTransactionData: { + TransactionID: UUID + } = { + TransactionID: UUID.zero() + }; + newObjTransactionData['TransactionID'] = new UUID(buf, pos); + pos += 16; + this.TransactionData = newObjTransactionData; + const newObjQueryData: { + QueryText: string, + QueryFlags: number, + Category: number, + SimName: string + } = { + QueryText: '', + QueryFlags: 0, + Category: 0, + SimName: '' + }; + newObjQueryData['QueryText'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryData['QueryFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjQueryData['Category'] = buf.readInt8(pos++); + newObjQueryData['SimName'] = buf.toString('utf8', pos, length); + pos += length; + this.QueryData = newObjQueryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/PlacesReply.ts b/lib/classes/packets/PlacesReply.ts index 5720e33..4f38d48 100644 --- a/lib/classes/packets/PlacesReply.ts +++ b/lib/classes/packets/PlacesReply.ts @@ -48,4 +48,132 @@ export class PlacesReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + this.TransactionData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.QueryData.length; + buf.writeUInt8(this.QueryData.length, pos++); + for (let i = 0; i < count; i++) + { + this.QueryData[i]['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.QueryData[i]['Name'], pos); + pos += this.QueryData[i]['Name'].length; + buf.write(this.QueryData[i]['Desc'], pos); + pos += this.QueryData[i]['Desc'].length; + buf.writeInt32LE(this.QueryData[i]['ActualArea'], pos); + pos += 4; + buf.writeInt32LE(this.QueryData[i]['BillableArea'], pos); + pos += 4; + buf.writeUInt8(this.QueryData[i]['Flags'], pos++); + buf.writeFloatLE(this.QueryData[i]['GlobalX'], pos); + pos += 4; + buf.writeFloatLE(this.QueryData[i]['GlobalY'], pos); + pos += 4; + buf.writeFloatLE(this.QueryData[i]['GlobalZ'], pos); + pos += 4; + buf.write(this.QueryData[i]['SimName'], pos); + pos += this.QueryData[i]['SimName'].length; + this.QueryData[i]['SnapshotID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeFloatLE(this.QueryData[i]['Dwell'], pos); + pos += 4; + buf.writeInt32LE(this.QueryData[i]['Price'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + QueryID: UUID + } = { + AgentID: UUID.zero(), + QueryID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['QueryID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjTransactionData: { + TransactionID: UUID + } = { + TransactionID: UUID.zero() + }; + newObjTransactionData['TransactionID'] = new UUID(buf, pos); + pos += 16; + this.TransactionData = newObjTransactionData; + const count = buf.readUInt8(pos++); + this.QueryData = []; + for (let i = 0; i < count; i++) + { + const newObjQueryData: { + OwnerID: UUID, + Name: string, + Desc: string, + ActualArea: number, + BillableArea: number, + Flags: number, + GlobalX: number, + GlobalY: number, + GlobalZ: number, + SimName: string, + SnapshotID: UUID, + Dwell: number, + Price: number + } = { + OwnerID: UUID.zero(), + Name: '', + Desc: '', + ActualArea: 0, + BillableArea: 0, + Flags: 0, + GlobalX: 0, + GlobalY: 0, + GlobalZ: 0, + SimName: '', + SnapshotID: UUID.zero(), + Dwell: 0, + Price: 0 + }; + newObjQueryData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjQueryData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryData['Desc'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryData['ActualArea'] = buf.readInt32LE(pos); + pos += 4; + newObjQueryData['BillableArea'] = buf.readInt32LE(pos); + pos += 4; + newObjQueryData['Flags'] = buf.readUInt8(pos++); + newObjQueryData['GlobalX'] = buf.readFloatLE(pos); + pos += 4; + newObjQueryData['GlobalY'] = buf.readFloatLE(pos); + pos += 4; + newObjQueryData['GlobalZ'] = buf.readFloatLE(pos); + pos += 4; + newObjQueryData['SimName'] = buf.toString('utf8', pos, length); + pos += length; + newObjQueryData['SnapshotID'] = new UUID(buf, pos); + pos += 16; + newObjQueryData['Dwell'] = buf.readFloatLE(pos); + pos += 4; + newObjQueryData['Price'] = buf.readInt32LE(pos); + pos += 4; + this.QueryData.push(newObjQueryData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/PreloadSound.ts b/lib/classes/packets/PreloadSound.ts index fca6b9c..1b43b70 100644 --- a/lib/classes/packets/PreloadSound.ts +++ b/lib/classes/packets/PreloadSound.ts @@ -21,4 +21,48 @@ export class PreloadSoundPacket implements Packet return ((48) * this.DataBlock.length) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.DataBlock.length; + buf.writeUInt8(this.DataBlock.length, pos++); + for (let i = 0; i < count; i++) + { + this.DataBlock[i]['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + this.DataBlock[i]['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + this.DataBlock[i]['SoundID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.DataBlock = []; + for (let i = 0; i < count; i++) + { + const newObjDataBlock: { + ObjectID: UUID, + OwnerID: UUID, + SoundID: UUID + } = { + ObjectID: UUID.zero(), + OwnerID: UUID.zero(), + SoundID: UUID.zero() + }; + newObjDataBlock['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['SoundID'] = new UUID(buf, pos); + pos += 16; + this.DataBlock.push(newObjDataBlock); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/PurgeInventoryDescendents.ts b/lib/classes/packets/PurgeInventoryDescendents.ts index 36e275c..b6ee12b 100644 --- a/lib/classes/packets/PurgeInventoryDescendents.ts +++ b/lib/classes/packets/PurgeInventoryDescendents.ts @@ -23,4 +23,42 @@ export class PurgeInventoryDescendentsPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['FolderID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjInventoryData: { + FolderID: UUID + } = { + FolderID: UUID.zero() + }; + newObjInventoryData['FolderID'] = new UUID(buf, pos); + pos += 16; + this.InventoryData = newObjInventoryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RebakeAvatarTextures.ts b/lib/classes/packets/RebakeAvatarTextures.ts index 2221804..2f862a7 100644 --- a/lib/classes/packets/RebakeAvatarTextures.ts +++ b/lib/classes/packets/RebakeAvatarTextures.ts @@ -19,4 +19,26 @@ export class RebakeAvatarTexturesPacket implements Packet return 16; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.TextureData['TextureID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjTextureData: { + TextureID: UUID + } = { + TextureID: UUID.zero() + }; + newObjTextureData['TextureID'] = new UUID(buf, pos); + pos += 16; + this.TextureData = newObjTextureData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/Redo.ts b/lib/classes/packets/Redo.ts index 0e12d2d..400fc98 100644 --- a/lib/classes/packets/Redo.ts +++ b/lib/classes/packets/Redo.ts @@ -24,4 +24,58 @@ export class RedoPacket implements Packet return ((16) * this.ObjectData.length) + 49; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + this.ObjectData[i]['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectID: UUID + } = { + ObjectID: UUID.zero() + }; + newObjObjectData['ObjectID'] = new UUID(buf, pos); + pos += 16; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/RegionHandleRequest.ts b/lib/classes/packets/RegionHandleRequest.ts index 68a5199..aa80950 100644 --- a/lib/classes/packets/RegionHandleRequest.ts +++ b/lib/classes/packets/RegionHandleRequest.ts @@ -19,4 +19,26 @@ export class RegionHandleRequestPacket implements Packet return 16; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.RequestBlock['RegionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjRequestBlock: { + RegionID: UUID + } = { + RegionID: UUID.zero() + }; + newObjRequestBlock['RegionID'] = new UUID(buf, pos); + pos += 16; + this.RequestBlock = newObjRequestBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RegionHandshake.ts b/lib/classes/packets/RegionHandshake.ts index acbfee0..73dd6ae 100644 --- a/lib/classes/packets/RegionHandshake.ts +++ b/lib/classes/packets/RegionHandshake.ts @@ -57,4 +57,234 @@ export class RegionHandshakePacket implements Packet return (this.RegionInfo['SimName'].length + 1) + (this.RegionInfo3['ColoName'].length + 1 + this.RegionInfo3['ProductSKU'].length + 1 + this.RegionInfo3['ProductName'].length + 1) + ((16) * this.RegionInfo4.length) + 231; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt32LE(this.RegionInfo['RegionFlags'], pos); + pos += 4; + buf.writeUInt8(this.RegionInfo['SimAccess'], pos++); + buf.write(this.RegionInfo['SimName'], pos); + pos += this.RegionInfo['SimName'].length; + this.RegionInfo['SimOwner'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.RegionInfo['IsEstateManager']) ? 1 : 0, pos++); + buf.writeFloatLE(this.RegionInfo['WaterHeight'], pos); + pos += 4; + buf.writeFloatLE(this.RegionInfo['BillableFactor'], pos); + pos += 4; + this.RegionInfo['CacheID'].writeToBuffer(buf, pos); + pos += 16; + this.RegionInfo['TerrainBase0'].writeToBuffer(buf, pos); + pos += 16; + this.RegionInfo['TerrainBase1'].writeToBuffer(buf, pos); + pos += 16; + this.RegionInfo['TerrainBase2'].writeToBuffer(buf, pos); + pos += 16; + this.RegionInfo['TerrainBase3'].writeToBuffer(buf, pos); + pos += 16; + this.RegionInfo['TerrainDetail0'].writeToBuffer(buf, pos); + pos += 16; + this.RegionInfo['TerrainDetail1'].writeToBuffer(buf, pos); + pos += 16; + this.RegionInfo['TerrainDetail2'].writeToBuffer(buf, pos); + pos += 16; + this.RegionInfo['TerrainDetail3'].writeToBuffer(buf, pos); + pos += 16; + buf.writeFloatLE(this.RegionInfo['TerrainStartHeight00'], pos); + pos += 4; + buf.writeFloatLE(this.RegionInfo['TerrainStartHeight01'], pos); + pos += 4; + buf.writeFloatLE(this.RegionInfo['TerrainStartHeight10'], pos); + pos += 4; + buf.writeFloatLE(this.RegionInfo['TerrainStartHeight11'], pos); + pos += 4; + buf.writeFloatLE(this.RegionInfo['TerrainHeightRange00'], pos); + pos += 4; + buf.writeFloatLE(this.RegionInfo['TerrainHeightRange01'], pos); + pos += 4; + buf.writeFloatLE(this.RegionInfo['TerrainHeightRange10'], pos); + pos += 4; + buf.writeFloatLE(this.RegionInfo['TerrainHeightRange11'], pos); + pos += 4; + this.RegionInfo2['RegionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.RegionInfo3['CPUClassID'], pos); + pos += 4; + buf.writeInt32LE(this.RegionInfo3['CPURatio'], pos); + pos += 4; + buf.write(this.RegionInfo3['ColoName'], pos); + pos += this.RegionInfo3['ColoName'].length; + buf.write(this.RegionInfo3['ProductSKU'], pos); + pos += this.RegionInfo3['ProductSKU'].length; + buf.write(this.RegionInfo3['ProductName'], pos); + pos += this.RegionInfo3['ProductName'].length; + const count = this.RegionInfo4.length; + buf.writeUInt8(this.RegionInfo4.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeInt32LE(this.RegionInfo4[i]['RegionFlagsExtended'].low, pos); + pos += 4; + buf.writeInt32LE(this.RegionInfo4[i]['RegionFlagsExtended'].high, pos); + pos += 4; + buf.writeInt32LE(this.RegionInfo4[i]['RegionProtocols'].low, pos); + pos += 4; + buf.writeInt32LE(this.RegionInfo4[i]['RegionProtocols'].high, pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjRegionInfo: { + RegionFlags: number, + SimAccess: number, + SimName: string, + SimOwner: UUID, + IsEstateManager: boolean, + WaterHeight: number, + BillableFactor: number, + CacheID: UUID, + TerrainBase0: UUID, + TerrainBase1: UUID, + TerrainBase2: UUID, + TerrainBase3: UUID, + TerrainDetail0: UUID, + TerrainDetail1: UUID, + TerrainDetail2: UUID, + TerrainDetail3: UUID, + TerrainStartHeight00: number, + TerrainStartHeight01: number, + TerrainStartHeight10: number, + TerrainStartHeight11: number, + TerrainHeightRange00: number, + TerrainHeightRange01: number, + TerrainHeightRange10: number, + TerrainHeightRange11: number + } = { + RegionFlags: 0, + SimAccess: 0, + SimName: '', + SimOwner: UUID.zero(), + IsEstateManager: false, + WaterHeight: 0, + BillableFactor: 0, + CacheID: UUID.zero(), + TerrainBase0: UUID.zero(), + TerrainBase1: UUID.zero(), + TerrainBase2: UUID.zero(), + TerrainBase3: UUID.zero(), + TerrainDetail0: UUID.zero(), + TerrainDetail1: UUID.zero(), + TerrainDetail2: UUID.zero(), + TerrainDetail3: UUID.zero(), + TerrainStartHeight00: 0, + TerrainStartHeight01: 0, + TerrainStartHeight10: 0, + TerrainStartHeight11: 0, + TerrainHeightRange00: 0, + TerrainHeightRange01: 0, + TerrainHeightRange10: 0, + TerrainHeightRange11: 0 + }; + newObjRegionInfo['RegionFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjRegionInfo['SimAccess'] = buf.readUInt8(pos++); + newObjRegionInfo['SimName'] = buf.toString('utf8', pos, length); + pos += length; + newObjRegionInfo['SimOwner'] = new UUID(buf, pos); + pos += 16; + newObjRegionInfo['IsEstateManager'] = (buf.readUInt8(pos++) === 1); + newObjRegionInfo['WaterHeight'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo['BillableFactor'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo['CacheID'] = new UUID(buf, pos); + pos += 16; + newObjRegionInfo['TerrainBase0'] = new UUID(buf, pos); + pos += 16; + newObjRegionInfo['TerrainBase1'] = new UUID(buf, pos); + pos += 16; + newObjRegionInfo['TerrainBase2'] = new UUID(buf, pos); + pos += 16; + newObjRegionInfo['TerrainBase3'] = new UUID(buf, pos); + pos += 16; + newObjRegionInfo['TerrainDetail0'] = new UUID(buf, pos); + pos += 16; + newObjRegionInfo['TerrainDetail1'] = new UUID(buf, pos); + pos += 16; + newObjRegionInfo['TerrainDetail2'] = new UUID(buf, pos); + pos += 16; + newObjRegionInfo['TerrainDetail3'] = new UUID(buf, pos); + pos += 16; + newObjRegionInfo['TerrainStartHeight00'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo['TerrainStartHeight01'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo['TerrainStartHeight10'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo['TerrainStartHeight11'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo['TerrainHeightRange00'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo['TerrainHeightRange01'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo['TerrainHeightRange10'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo['TerrainHeightRange11'] = buf.readFloatLE(pos); + pos += 4; + this.RegionInfo = newObjRegionInfo; + const newObjRegionInfo2: { + RegionID: UUID + } = { + RegionID: UUID.zero() + }; + newObjRegionInfo2['RegionID'] = new UUID(buf, pos); + pos += 16; + this.RegionInfo2 = newObjRegionInfo2; + const newObjRegionInfo3: { + CPUClassID: number, + CPURatio: number, + ColoName: string, + ProductSKU: string, + ProductName: string + } = { + CPUClassID: 0, + CPURatio: 0, + ColoName: '', + ProductSKU: '', + ProductName: '' + }; + newObjRegionInfo3['CPUClassID'] = buf.readInt32LE(pos); + pos += 4; + newObjRegionInfo3['CPURatio'] = buf.readInt32LE(pos); + pos += 4; + newObjRegionInfo3['ColoName'] = buf.toString('utf8', pos, length); + pos += length; + newObjRegionInfo3['ProductSKU'] = buf.toString('utf8', pos, length); + pos += length; + newObjRegionInfo3['ProductName'] = buf.toString('utf8', pos, length); + pos += length; + this.RegionInfo3 = newObjRegionInfo3; + const count = buf.readUInt8(pos++); + this.RegionInfo4 = []; + for (let i = 0; i < count; i++) + { + const newObjRegionInfo4: { + RegionFlagsExtended: Long, + RegionProtocols: Long + } = { + RegionFlagsExtended: Long.ZERO, + RegionProtocols: Long.ZERO + }; + newObjRegionInfo4['RegionFlagsExtended'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjRegionInfo4['RegionProtocols'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + this.RegionInfo4.push(newObjRegionInfo4); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/RegionHandshakeReply.ts b/lib/classes/packets/RegionHandshakeReply.ts index d37c5c5..6485973 100644 --- a/lib/classes/packets/RegionHandshakeReply.ts +++ b/lib/classes/packets/RegionHandshakeReply.ts @@ -23,4 +23,42 @@ export class RegionHandshakeReplyPacket implements Packet return 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.RegionInfo['Flags'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjRegionInfo: { + Flags: number + } = { + Flags: 0 + }; + newObjRegionInfo['Flags'] = buf.readUInt32LE(pos); + pos += 4; + this.RegionInfo = newObjRegionInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RegionIDAndHandleReply.ts b/lib/classes/packets/RegionIDAndHandleReply.ts index a546c97..c9d143d 100644 --- a/lib/classes/packets/RegionIDAndHandleReply.ts +++ b/lib/classes/packets/RegionIDAndHandleReply.ts @@ -21,4 +21,34 @@ export class RegionIDAndHandleReplyPacket implements Packet return 24; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.ReplyBlock['RegionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.ReplyBlock['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.ReplyBlock['RegionHandle'].high, pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjReplyBlock: { + RegionID: UUID, + RegionHandle: Long + } = { + RegionID: UUID.zero(), + RegionHandle: Long.ZERO + }; + newObjReplyBlock['RegionID'] = new UUID(buf, pos); + pos += 16; + newObjReplyBlock['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + this.ReplyBlock = newObjReplyBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RegionInfo.ts b/lib/classes/packets/RegionInfo.ts index 0e92a5a..eeb9644 100644 --- a/lib/classes/packets/RegionInfo.ts +++ b/lib/classes/packets/RegionInfo.ts @@ -49,4 +49,182 @@ export class RegionInfoPacket implements Packet return (this.RegionInfo['SimName'].length + 1) + (this.RegionInfo2['ProductSKU'].length + 1 + this.RegionInfo2['ProductName'].length + 1) + ((8) * this.RegionInfo3.length) + 96; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.RegionInfo['SimName'], pos); + pos += this.RegionInfo['SimName'].length; + buf.writeUInt32LE(this.RegionInfo['EstateID'], pos); + pos += 4; + buf.writeUInt32LE(this.RegionInfo['ParentEstateID'], pos); + pos += 4; + buf.writeUInt32LE(this.RegionInfo['RegionFlags'], pos); + pos += 4; + buf.writeUInt8(this.RegionInfo['SimAccess'], pos++); + buf.writeUInt8(this.RegionInfo['MaxAgents'], pos++); + buf.writeFloatLE(this.RegionInfo['BillableFactor'], pos); + pos += 4; + buf.writeFloatLE(this.RegionInfo['ObjectBonusFactor'], pos); + pos += 4; + buf.writeFloatLE(this.RegionInfo['WaterHeight'], pos); + pos += 4; + buf.writeFloatLE(this.RegionInfo['TerrainRaiseLimit'], pos); + pos += 4; + buf.writeFloatLE(this.RegionInfo['TerrainLowerLimit'], pos); + pos += 4; + buf.writeInt32LE(this.RegionInfo['PricePerMeter'], pos); + pos += 4; + buf.writeInt32LE(this.RegionInfo['RedirectGridX'], pos); + pos += 4; + buf.writeInt32LE(this.RegionInfo['RedirectGridY'], pos); + pos += 4; + buf.writeUInt8((this.RegionInfo['UseEstateSun']) ? 1 : 0, pos++); + buf.writeFloatLE(this.RegionInfo['SunHour'], pos); + pos += 4; + buf.write(this.RegionInfo2['ProductSKU'], pos); + pos += this.RegionInfo2['ProductSKU'].length; + buf.write(this.RegionInfo2['ProductName'], pos); + pos += this.RegionInfo2['ProductName'].length; + buf.writeUInt32LE(this.RegionInfo2['MaxAgents32'], pos); + pos += 4; + buf.writeUInt32LE(this.RegionInfo2['HardMaxAgents'], pos); + pos += 4; + buf.writeUInt32LE(this.RegionInfo2['HardMaxObjects'], pos); + pos += 4; + const count = this.RegionInfo3.length; + buf.writeUInt8(this.RegionInfo3.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeInt32LE(this.RegionInfo3[i]['RegionFlagsExtended'].low, pos); + pos += 4; + buf.writeInt32LE(this.RegionInfo3[i]['RegionFlagsExtended'].high, pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjRegionInfo: { + SimName: string, + EstateID: number, + ParentEstateID: number, + RegionFlags: number, + SimAccess: number, + MaxAgents: number, + BillableFactor: number, + ObjectBonusFactor: number, + WaterHeight: number, + TerrainRaiseLimit: number, + TerrainLowerLimit: number, + PricePerMeter: number, + RedirectGridX: number, + RedirectGridY: number, + UseEstateSun: boolean, + SunHour: number + } = { + SimName: '', + EstateID: 0, + ParentEstateID: 0, + RegionFlags: 0, + SimAccess: 0, + MaxAgents: 0, + BillableFactor: 0, + ObjectBonusFactor: 0, + WaterHeight: 0, + TerrainRaiseLimit: 0, + TerrainLowerLimit: 0, + PricePerMeter: 0, + RedirectGridX: 0, + RedirectGridY: 0, + UseEstateSun: false, + SunHour: 0 + }; + newObjRegionInfo['SimName'] = buf.toString('utf8', pos, length); + pos += length; + newObjRegionInfo['EstateID'] = buf.readUInt32LE(pos); + pos += 4; + newObjRegionInfo['ParentEstateID'] = buf.readUInt32LE(pos); + pos += 4; + newObjRegionInfo['RegionFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjRegionInfo['SimAccess'] = buf.readUInt8(pos++); + newObjRegionInfo['MaxAgents'] = buf.readUInt8(pos++); + newObjRegionInfo['BillableFactor'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo['ObjectBonusFactor'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo['WaterHeight'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo['TerrainRaiseLimit'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo['TerrainLowerLimit'] = buf.readFloatLE(pos); + pos += 4; + newObjRegionInfo['PricePerMeter'] = buf.readInt32LE(pos); + pos += 4; + newObjRegionInfo['RedirectGridX'] = buf.readInt32LE(pos); + pos += 4; + newObjRegionInfo['RedirectGridY'] = buf.readInt32LE(pos); + pos += 4; + newObjRegionInfo['UseEstateSun'] = (buf.readUInt8(pos++) === 1); + newObjRegionInfo['SunHour'] = buf.readFloatLE(pos); + pos += 4; + this.RegionInfo = newObjRegionInfo; + const newObjRegionInfo2: { + ProductSKU: string, + ProductName: string, + MaxAgents32: number, + HardMaxAgents: number, + HardMaxObjects: number + } = { + ProductSKU: '', + ProductName: '', + MaxAgents32: 0, + HardMaxAgents: 0, + HardMaxObjects: 0 + }; + newObjRegionInfo2['ProductSKU'] = buf.toString('utf8', pos, length); + pos += length; + newObjRegionInfo2['ProductName'] = buf.toString('utf8', pos, length); + pos += length; + newObjRegionInfo2['MaxAgents32'] = buf.readUInt32LE(pos); + pos += 4; + newObjRegionInfo2['HardMaxAgents'] = buf.readUInt32LE(pos); + pos += 4; + newObjRegionInfo2['HardMaxObjects'] = buf.readUInt32LE(pos); + pos += 4; + this.RegionInfo2 = newObjRegionInfo2; + const count = buf.readUInt8(pos++); + this.RegionInfo3 = []; + for (let i = 0; i < count; i++) + { + const newObjRegionInfo3: { + RegionFlagsExtended: Long + } = { + RegionFlagsExtended: Long.ZERO + }; + newObjRegionInfo3['RegionFlagsExtended'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + this.RegionInfo3.push(newObjRegionInfo3); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/RegionPresenceRequestByHandle.ts b/lib/classes/packets/RegionPresenceRequestByHandle.ts index a6cae7d..5b2952c 100644 --- a/lib/classes/packets/RegionPresenceRequestByHandle.ts +++ b/lib/classes/packets/RegionPresenceRequestByHandle.ts @@ -19,4 +19,38 @@ export class RegionPresenceRequestByHandlePacket implements Packet return ((8) * this.RegionData.length) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.RegionData.length; + buf.writeUInt8(this.RegionData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeInt32LE(this.RegionData[i]['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.RegionData[i]['RegionHandle'].high, pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.RegionData = []; + for (let i = 0; i < count; i++) + { + const newObjRegionData: { + RegionHandle: Long + } = { + RegionHandle: Long.ZERO + }; + newObjRegionData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + this.RegionData.push(newObjRegionData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/RegionPresenceRequestByRegionID.ts b/lib/classes/packets/RegionPresenceRequestByRegionID.ts index e998724..bcd4a39 100644 --- a/lib/classes/packets/RegionPresenceRequestByRegionID.ts +++ b/lib/classes/packets/RegionPresenceRequestByRegionID.ts @@ -19,4 +19,36 @@ export class RegionPresenceRequestByRegionIDPacket implements Packet return ((16) * this.RegionData.length) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.RegionData.length; + buf.writeUInt8(this.RegionData.length, pos++); + for (let i = 0; i < count; i++) + { + this.RegionData[i]['RegionID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.RegionData = []; + for (let i = 0; i < count; i++) + { + const newObjRegionData: { + RegionID: UUID + } = { + RegionID: UUID.zero() + }; + newObjRegionData['RegionID'] = new UUID(buf, pos); + pos += 16; + this.RegionData.push(newObjRegionData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/RegionPresenceResponse.ts b/lib/classes/packets/RegionPresenceResponse.ts index 5bd6aa1..6f104c8 100644 --- a/lib/classes/packets/RegionPresenceResponse.ts +++ b/lib/classes/packets/RegionPresenceResponse.ts @@ -37,4 +37,74 @@ export class RegionPresenceResponsePacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.RegionData.length; + buf.writeUInt8(this.RegionData.length, pos++); + for (let i = 0; i < count; i++) + { + this.RegionData[i]['RegionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.RegionData[i]['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.RegionData[i]['RegionHandle'].high, pos); + pos += 4; + this.RegionData[i]['InternalRegionIP'].writeToBuffer(buf, pos); + pos += 4; + this.RegionData[i]['ExternalRegionIP'].writeToBuffer(buf, pos); + pos += 4; + buf.writeUInt16LE(this.RegionData[i]['RegionPort'], pos); + pos += 2; + buf.writeDoubleLE(this.RegionData[i]['ValidUntil'], pos); + pos += 8; + buf.write(this.RegionData[i]['Message'], pos); + pos += this.RegionData[i]['Message'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.RegionData = []; + for (let i = 0; i < count; i++) + { + const newObjRegionData: { + RegionID: UUID, + RegionHandle: Long, + InternalRegionIP: IPAddress, + ExternalRegionIP: IPAddress, + RegionPort: number, + ValidUntil: number, + Message: string + } = { + RegionID: UUID.zero(), + RegionHandle: Long.ZERO, + InternalRegionIP: IPAddress.zero(), + ExternalRegionIP: IPAddress.zero(), + RegionPort: 0, + ValidUntil: 0, + Message: '' + }; + newObjRegionData['RegionID'] = new UUID(buf, pos); + pos += 16; + newObjRegionData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjRegionData['InternalRegionIP'] = new IPAddress(buf, pos); + pos += 4; + newObjRegionData['ExternalRegionIP'] = new IPAddress(buf, pos); + pos += 4; + newObjRegionData['RegionPort'] = buf.readUInt16LE(pos); + pos += 2; + newObjRegionData['ValidUntil'] = buf.readDoubleLE(pos); + pos += 8; + newObjRegionData['Message'] = buf.toString('utf8', pos, length); + pos += length; + this.RegionData.push(newObjRegionData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/RemoveAttachment.ts b/lib/classes/packets/RemoveAttachment.ts index 9e6bab4..03cc2cf 100644 --- a/lib/classes/packets/RemoveAttachment.ts +++ b/lib/classes/packets/RemoveAttachment.ts @@ -24,4 +24,46 @@ export class RemoveAttachmentPacket implements Packet return 49; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.AttachmentBlock['AttachmentPoint'], pos++); + this.AttachmentBlock['ItemID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjAttachmentBlock: { + AttachmentPoint: number, + ItemID: UUID + } = { + AttachmentPoint: 0, + ItemID: UUID.zero() + }; + newObjAttachmentBlock['AttachmentPoint'] = buf.readUInt8(pos++); + newObjAttachmentBlock['ItemID'] = new UUID(buf, pos); + pos += 16; + this.AttachmentBlock = newObjAttachmentBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RemoveInventoryFolder.ts b/lib/classes/packets/RemoveInventoryFolder.ts index fabe0bc..776fef0 100644 --- a/lib/classes/packets/RemoveInventoryFolder.ts +++ b/lib/classes/packets/RemoveInventoryFolder.ts @@ -23,4 +23,52 @@ export class RemoveInventoryFolderPacket implements Packet return ((16) * this.FolderData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.FolderData.length; + buf.writeUInt8(this.FolderData.length, pos++); + for (let i = 0; i < count; i++) + { + this.FolderData[i]['FolderID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.FolderData = []; + for (let i = 0; i < count; i++) + { + const newObjFolderData: { + FolderID: UUID + } = { + FolderID: UUID.zero() + }; + newObjFolderData['FolderID'] = new UUID(buf, pos); + pos += 16; + this.FolderData.push(newObjFolderData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/RemoveInventoryItem.ts b/lib/classes/packets/RemoveInventoryItem.ts index 0e81059..bd52bc2 100644 --- a/lib/classes/packets/RemoveInventoryItem.ts +++ b/lib/classes/packets/RemoveInventoryItem.ts @@ -23,4 +23,52 @@ export class RemoveInventoryItemPacket implements Packet return ((16) * this.InventoryData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.InventoryData.length; + buf.writeUInt8(this.InventoryData.length, pos++); + for (let i = 0; i < count; i++) + { + this.InventoryData[i]['ItemID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.InventoryData = []; + for (let i = 0; i < count; i++) + { + const newObjInventoryData: { + ItemID: UUID + } = { + ItemID: UUID.zero() + }; + newObjInventoryData['ItemID'] = new UUID(buf, pos); + pos += 16; + this.InventoryData.push(newObjInventoryData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/RemoveInventoryObjects.ts b/lib/classes/packets/RemoveInventoryObjects.ts index c4978ad..05dfc93 100644 --- a/lib/classes/packets/RemoveInventoryObjects.ts +++ b/lib/classes/packets/RemoveInventoryObjects.ts @@ -26,4 +26,72 @@ export class RemoveInventoryObjectsPacket implements Packet return ((16) * this.FolderData.length) + ((16) * this.ItemData.length) + 34; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + let count = this.FolderData.length; + buf.writeUInt8(this.FolderData.length, pos++); + for (let i = 0; i < count; i++) + { + this.FolderData[i]['FolderID'].writeToBuffer(buf, pos); + pos += 16; + } + count = this.ItemData.length; + buf.writeUInt8(this.ItemData.length, pos++); + for (let i = 0; i < count; i++) + { + this.ItemData[i]['ItemID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + let count = buf.readUInt8(pos++); + this.FolderData = []; + for (let i = 0; i < count; i++) + { + const newObjFolderData: { + FolderID: UUID + } = { + FolderID: UUID.zero() + }; + newObjFolderData['FolderID'] = new UUID(buf, pos); + pos += 16; + this.FolderData.push(newObjFolderData); + } + count = buf.readUInt8(pos++); + this.ItemData = []; + for (let i = 0; i < count; i++) + { + const newObjItemData: { + ItemID: UUID + } = { + ItemID: UUID.zero() + }; + newObjItemData['ItemID'] = new UUID(buf, pos); + pos += 16; + this.ItemData.push(newObjItemData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/RemoveMuteListEntry.ts b/lib/classes/packets/RemoveMuteListEntry.ts index a756a58..3608a7a 100644 --- a/lib/classes/packets/RemoveMuteListEntry.ts +++ b/lib/classes/packets/RemoveMuteListEntry.ts @@ -24,4 +24,48 @@ export class RemoveMuteListEntryPacket implements Packet return (this.MuteData['MuteName'].length + 1) + 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.MuteData['MuteID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.MuteData['MuteName'], pos); + pos += this.MuteData['MuteName'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjMuteData: { + MuteID: UUID, + MuteName: string + } = { + MuteID: UUID.zero(), + MuteName: '' + }; + newObjMuteData['MuteID'] = new UUID(buf, pos); + pos += 16; + newObjMuteData['MuteName'] = buf.toString('utf8', pos, length); + pos += length; + this.MuteData = newObjMuteData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RemoveNameValuePair.ts b/lib/classes/packets/RemoveNameValuePair.ts index 18e80a6..1d2130c 100644 --- a/lib/classes/packets/RemoveNameValuePair.ts +++ b/lib/classes/packets/RemoveNameValuePair.ts @@ -32,4 +32,46 @@ export class RemoveNameValuePairPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.TaskData['ID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.NameValueData.length; + buf.writeUInt8(this.NameValueData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.write(this.NameValueData[i]['NVPair'], pos); + pos += this.NameValueData[i]['NVPair'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjTaskData: { + ID: UUID + } = { + ID: UUID.zero() + }; + newObjTaskData['ID'] = new UUID(buf, pos); + pos += 16; + this.TaskData = newObjTaskData; + const count = buf.readUInt8(pos++); + this.NameValueData = []; + for (let i = 0; i < count; i++) + { + const newObjNameValueData: { + NVPair: string + } = { + NVPair: '' + }; + newObjNameValueData['NVPair'] = buf.toString('utf8', pos, length); + pos += length; + this.NameValueData.push(newObjNameValueData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/RemoveParcel.ts b/lib/classes/packets/RemoveParcel.ts index 5e32893..5dc427b 100644 --- a/lib/classes/packets/RemoveParcel.ts +++ b/lib/classes/packets/RemoveParcel.ts @@ -19,4 +19,36 @@ export class RemoveParcelPacket implements Packet return ((16) * this.ParcelData.length) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.ParcelData.length; + buf.writeUInt8(this.ParcelData.length, pos++); + for (let i = 0; i < count; i++) + { + this.ParcelData[i]['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.ParcelData = []; + for (let i = 0; i < count; i++) + { + const newObjParcelData: { + ParcelID: UUID + } = { + ParcelID: UUID.zero() + }; + newObjParcelData['ParcelID'] = new UUID(buf, pos); + pos += 16; + this.ParcelData.push(newObjParcelData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/RemoveTaskInventory.ts b/lib/classes/packets/RemoveTaskInventory.ts index 2228258..9d74b6b 100644 --- a/lib/classes/packets/RemoveTaskInventory.ts +++ b/lib/classes/packets/RemoveTaskInventory.ts @@ -24,4 +24,48 @@ export class RemoveTaskInventoryPacket implements Packet return 52; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.InventoryData['LocalID'], pos); + pos += 4; + this.InventoryData['ItemID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjInventoryData: { + LocalID: number, + ItemID: UUID + } = { + LocalID: 0, + ItemID: UUID.zero() + }; + newObjInventoryData['LocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['ItemID'] = new UUID(buf, pos); + pos += 16; + this.InventoryData = newObjInventoryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ReplyTaskInventory.ts b/lib/classes/packets/ReplyTaskInventory.ts index 62b813f..3c7c0d6 100644 --- a/lib/classes/packets/ReplyTaskInventory.ts +++ b/lib/classes/packets/ReplyTaskInventory.ts @@ -21,4 +21,38 @@ export class ReplyTaskInventoryPacket implements Packet return (this.InventoryData['Filename'].length + 1) + 18; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.InventoryData['TaskID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt16LE(this.InventoryData['Serial'], pos); + pos += 2; + buf.write(this.InventoryData['Filename'], pos); + pos += this.InventoryData['Filename'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjInventoryData: { + TaskID: UUID, + Serial: number, + Filename: string + } = { + TaskID: UUID.zero(), + Serial: 0, + Filename: '' + }; + newObjInventoryData['TaskID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['Serial'] = buf.readInt16LE(pos); + pos += 2; + newObjInventoryData['Filename'] = buf.toString('utf8', pos, length); + pos += length; + this.InventoryData = newObjInventoryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ReportAutosaveCrash.ts b/lib/classes/packets/ReportAutosaveCrash.ts index 162b561..3e27c08 100644 --- a/lib/classes/packets/ReportAutosaveCrash.ts +++ b/lib/classes/packets/ReportAutosaveCrash.ts @@ -19,4 +19,32 @@ export class ReportAutosaveCrashPacket implements Packet return 8; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.AutosaveData['PID'], pos); + pos += 4; + buf.writeInt32LE(this.AutosaveData['Status'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAutosaveData: { + PID: number, + Status: number + } = { + PID: 0, + Status: 0 + }; + newObjAutosaveData['PID'] = buf.readInt32LE(pos); + pos += 4; + newObjAutosaveData['Status'] = buf.readInt32LE(pos); + pos += 4; + this.AutosaveData = newObjAutosaveData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RequestGodlikePowers.ts b/lib/classes/packets/RequestGodlikePowers.ts index d887591..fcc7a1e 100644 --- a/lib/classes/packets/RequestGodlikePowers.ts +++ b/lib/classes/packets/RequestGodlikePowers.ts @@ -24,4 +24,46 @@ export class RequestGodlikePowersPacket implements Packet return 49; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.RequestBlock['Godlike']) ? 1 : 0, pos++); + this.RequestBlock['Token'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjRequestBlock: { + Godlike: boolean, + Token: UUID + } = { + Godlike: false, + Token: UUID.zero() + }; + newObjRequestBlock['Godlike'] = (buf.readUInt8(pos++) === 1); + newObjRequestBlock['Token'] = new UUID(buf, pos); + pos += 16; + this.RequestBlock = newObjRequestBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RequestImage.ts b/lib/classes/packets/RequestImage.ts index 29ab8f9..65a279c 100644 --- a/lib/classes/packets/RequestImage.ts +++ b/lib/classes/packets/RequestImage.ts @@ -27,4 +27,72 @@ export class RequestImagePacket implements Packet return ((26) * this.RequestImage.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.RequestImage.length; + buf.writeUInt8(this.RequestImage.length, pos++); + for (let i = 0; i < count; i++) + { + this.RequestImage[i]['Image'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt8(this.RequestImage[i]['DiscardLevel'], pos++); + buf.writeFloatLE(this.RequestImage[i]['DownloadPriority'], pos); + pos += 4; + buf.writeUInt32LE(this.RequestImage[i]['Packet'], pos); + pos += 4; + buf.writeUInt8(this.RequestImage[i]['Type'], pos++); + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.RequestImage = []; + for (let i = 0; i < count; i++) + { + const newObjRequestImage: { + Image: UUID, + DiscardLevel: number, + DownloadPriority: number, + Packet: number, + Type: number + } = { + Image: UUID.zero(), + DiscardLevel: 0, + DownloadPriority: 0, + Packet: 0, + Type: 0 + }; + newObjRequestImage['Image'] = new UUID(buf, pos); + pos += 16; + newObjRequestImage['DiscardLevel'] = buf.readInt8(pos++); + newObjRequestImage['DownloadPriority'] = buf.readFloatLE(pos); + pos += 4; + newObjRequestImage['Packet'] = buf.readUInt32LE(pos); + pos += 4; + newObjRequestImage['Type'] = buf.readUInt8(pos++); + this.RequestImage.push(newObjRequestImage); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/RequestInventoryAsset.ts b/lib/classes/packets/RequestInventoryAsset.ts index 2b759c9..70aeb53 100644 --- a/lib/classes/packets/RequestInventoryAsset.ts +++ b/lib/classes/packets/RequestInventoryAsset.ts @@ -22,4 +22,44 @@ export class RequestInventoryAssetPacket implements Packet return 64; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.QueryData['QueryID'].writeToBuffer(buf, pos); + pos += 16; + this.QueryData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.QueryData['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + this.QueryData['ItemID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjQueryData: { + QueryID: UUID, + AgentID: UUID, + OwnerID: UUID, + ItemID: UUID + } = { + QueryID: UUID.zero(), + AgentID: UUID.zero(), + OwnerID: UUID.zero(), + ItemID: UUID.zero() + }; + newObjQueryData['QueryID'] = new UUID(buf, pos); + pos += 16; + newObjQueryData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjQueryData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjQueryData['ItemID'] = new UUID(buf, pos); + pos += 16; + this.QueryData = newObjQueryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RequestMultipleObjects.ts b/lib/classes/packets/RequestMultipleObjects.ts index fd0e888..365477e 100644 --- a/lib/classes/packets/RequestMultipleObjects.ts +++ b/lib/classes/packets/RequestMultipleObjects.ts @@ -24,4 +24,56 @@ export class RequestMultipleObjectsPacket implements Packet return ((5) * this.ObjectData.length) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt8(this.ObjectData[i]['CacheMissType'], pos++); + buf.writeUInt32LE(this.ObjectData[i]['ID'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + CacheMissType: number, + ID: number + } = { + CacheMissType: 0, + ID: 0 + }; + newObjObjectData['CacheMissType'] = buf.readUInt8(pos++); + newObjObjectData['ID'] = buf.readUInt32LE(pos); + pos += 4; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/RequestObjectPropertiesFamily.ts b/lib/classes/packets/RequestObjectPropertiesFamily.ts index b1015ab..5eec405 100644 --- a/lib/classes/packets/RequestObjectPropertiesFamily.ts +++ b/lib/classes/packets/RequestObjectPropertiesFamily.ts @@ -24,4 +24,48 @@ export class RequestObjectPropertiesFamilyPacket implements Packet return 52; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.ObjectData['RequestFlags'], pos); + pos += 4; + this.ObjectData['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjObjectData: { + RequestFlags: number, + ObjectID: UUID + } = { + RequestFlags: 0, + ObjectID: UUID.zero() + }; + newObjObjectData['RequestFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['ObjectID'] = new UUID(buf, pos); + pos += 16; + this.ObjectData = newObjObjectData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RequestParcelTransfer.ts b/lib/classes/packets/RequestParcelTransfer.ts index 2d85380..1e998f8 100644 --- a/lib/classes/packets/RequestParcelTransfer.ts +++ b/lib/classes/packets/RequestParcelTransfer.ts @@ -34,4 +34,104 @@ export class RequestParcelTransferPacket implements Packet return 110; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Data['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.Data['TransactionTime'], pos); + pos += 4; + this.Data['SourceID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['DestID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.Data['Flags'], pos++); + buf.writeInt32LE(this.Data['TransactionType'], pos); + pos += 4; + buf.writeInt32LE(this.Data['Amount'], pos); + pos += 4; + buf.writeInt32LE(this.Data['BillableArea'], pos); + pos += 4; + buf.writeInt32LE(this.Data['ActualArea'], pos); + pos += 4; + buf.writeUInt8((this.Data['Final']) ? 1 : 0, pos++); + this.RegionData['RegionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.RegionData['GridX'], pos); + pos += 4; + buf.writeUInt32LE(this.RegionData['GridY'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjData: { + TransactionID: UUID, + TransactionTime: number, + SourceID: UUID, + DestID: UUID, + OwnerID: UUID, + Flags: number, + TransactionType: number, + Amount: number, + BillableArea: number, + ActualArea: number, + Final: boolean + } = { + TransactionID: UUID.zero(), + TransactionTime: 0, + SourceID: UUID.zero(), + DestID: UUID.zero(), + OwnerID: UUID.zero(), + Flags: 0, + TransactionType: 0, + Amount: 0, + BillableArea: 0, + ActualArea: 0, + Final: false + }; + newObjData['TransactionID'] = new UUID(buf, pos); + pos += 16; + newObjData['TransactionTime'] = buf.readUInt32LE(pos); + pos += 4; + newObjData['SourceID'] = new UUID(buf, pos); + pos += 16; + newObjData['DestID'] = new UUID(buf, pos); + pos += 16; + newObjData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjData['Flags'] = buf.readUInt8(pos++); + newObjData['TransactionType'] = buf.readInt32LE(pos); + pos += 4; + newObjData['Amount'] = buf.readInt32LE(pos); + pos += 4; + newObjData['BillableArea'] = buf.readInt32LE(pos); + pos += 4; + newObjData['ActualArea'] = buf.readInt32LE(pos); + pos += 4; + newObjData['Final'] = (buf.readUInt8(pos++) === 1); + this.Data = newObjData; + const newObjRegionData: { + RegionID: UUID, + GridX: number, + GridY: number + } = { + RegionID: UUID.zero(), + GridX: 0, + GridY: 0 + }; + newObjRegionData['RegionID'] = new UUID(buf, pos); + pos += 16; + newObjRegionData['GridX'] = buf.readUInt32LE(pos); + pos += 4; + newObjRegionData['GridY'] = buf.readUInt32LE(pos); + pos += 4; + this.RegionData = newObjRegionData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RequestPayPrice.ts b/lib/classes/packets/RequestPayPrice.ts index d8fb19a..ebb64ed 100644 --- a/lib/classes/packets/RequestPayPrice.ts +++ b/lib/classes/packets/RequestPayPrice.ts @@ -19,4 +19,26 @@ export class RequestPayPricePacket implements Packet return 16; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.ObjectData['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjObjectData: { + ObjectID: UUID + } = { + ObjectID: UUID.zero() + }; + newObjObjectData['ObjectID'] = new UUID(buf, pos); + pos += 16; + this.ObjectData = newObjObjectData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RequestRegionInfo.ts b/lib/classes/packets/RequestRegionInfo.ts index 3c1c11b..00ffc8d 100644 --- a/lib/classes/packets/RequestRegionInfo.ts +++ b/lib/classes/packets/RequestRegionInfo.ts @@ -20,4 +20,32 @@ export class RequestRegionInfoPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RequestTaskInventory.ts b/lib/classes/packets/RequestTaskInventory.ts index 2ebdde1..e51f012 100644 --- a/lib/classes/packets/RequestTaskInventory.ts +++ b/lib/classes/packets/RequestTaskInventory.ts @@ -23,4 +23,42 @@ export class RequestTaskInventoryPacket implements Packet return 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.InventoryData['LocalID'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjInventoryData: { + LocalID: number + } = { + LocalID: 0 + }; + newObjInventoryData['LocalID'] = buf.readUInt32LE(pos); + pos += 4; + this.InventoryData = newObjInventoryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RequestTrustedCircuit.ts b/lib/classes/packets/RequestTrustedCircuit.ts index 1b6a5c5..9a5e907 100644 --- a/lib/classes/packets/RequestTrustedCircuit.ts +++ b/lib/classes/packets/RequestTrustedCircuit.ts @@ -15,4 +15,14 @@ export class RequestTrustedCircuitPacket implements Packet return 0; } + writeToBuffer(buf: Buffer, pos: number): number + { + return 0; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + return 0; + } } + diff --git a/lib/classes/packets/RequestXfer.ts b/lib/classes/packets/RequestXfer.ts index 7de2f5b..ec7c191 100644 --- a/lib/classes/packets/RequestXfer.ts +++ b/lib/classes/packets/RequestXfer.ts @@ -26,4 +26,58 @@ export class RequestXferPacket implements Packet return (this.XferID['Filename'].length + 1) + 29; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.XferID['ID'].low, pos); + pos += 4; + buf.writeInt32LE(this.XferID['ID'].high, pos); + pos += 4; + buf.write(this.XferID['Filename'], pos); + pos += this.XferID['Filename'].length; + buf.writeUInt8(this.XferID['FilePath'], pos++); + buf.writeUInt8((this.XferID['DeleteOnCompletion']) ? 1 : 0, pos++); + buf.writeUInt8((this.XferID['UseBigPackets']) ? 1 : 0, pos++); + this.XferID['VFileID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt16LE(this.XferID['VFileType'], pos); + pos += 2; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjXferID: { + ID: Long, + Filename: string, + FilePath: number, + DeleteOnCompletion: boolean, + UseBigPackets: boolean, + VFileID: UUID, + VFileType: number + } = { + ID: Long.ZERO, + Filename: '', + FilePath: 0, + DeleteOnCompletion: false, + UseBigPackets: false, + VFileID: UUID.zero(), + VFileType: 0 + }; + newObjXferID['ID'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjXferID['Filename'] = buf.toString('utf8', pos, length); + pos += length; + newObjXferID['FilePath'] = buf.readUInt8(pos++); + newObjXferID['DeleteOnCompletion'] = (buf.readUInt8(pos++) === 1); + newObjXferID['UseBigPackets'] = (buf.readUInt8(pos++) === 1); + newObjXferID['VFileID'] = new UUID(buf, pos); + pos += 16; + newObjXferID['VFileType'] = buf.readInt16LE(pos); + pos += 2; + this.XferID = newObjXferID; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RetrieveIMsExtended.ts b/lib/classes/packets/RetrieveIMsExtended.ts index c8d79a4..0f8e28d 100644 --- a/lib/classes/packets/RetrieveIMsExtended.ts +++ b/lib/classes/packets/RetrieveIMsExtended.ts @@ -21,4 +21,36 @@ export class RetrieveIMsExtendedPacket implements Packet return 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.AgentData['IsPremium']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + IsPremium: boolean + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + IsPremium: false + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['IsPremium'] = (buf.readUInt8(pos++) === 1); + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RetrieveInstantMessages.ts b/lib/classes/packets/RetrieveInstantMessages.ts index f23b259..359b8df 100644 --- a/lib/classes/packets/RetrieveInstantMessages.ts +++ b/lib/classes/packets/RetrieveInstantMessages.ts @@ -20,4 +20,32 @@ export class RetrieveInstantMessagesPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RevokePermissions.ts b/lib/classes/packets/RevokePermissions.ts index 0d1a183..e27c693 100644 --- a/lib/classes/packets/RevokePermissions.ts +++ b/lib/classes/packets/RevokePermissions.ts @@ -24,4 +24,48 @@ export class RevokePermissionsPacket implements Packet return 52; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.Data['ObjectPermissions'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + ObjectID: UUID, + ObjectPermissions: number + } = { + ObjectID: UUID.zero(), + ObjectPermissions: 0 + }; + newObjData['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjData['ObjectPermissions'] = buf.readUInt32LE(pos); + pos += 4; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RezMultipleAttachmentsFromInv.ts b/lib/classes/packets/RezMultipleAttachmentsFromInv.ts index f1cf8cc..e27ef55 100644 --- a/lib/classes/packets/RezMultipleAttachmentsFromInv.ts +++ b/lib/classes/packets/RezMultipleAttachmentsFromInv.ts @@ -46,4 +46,116 @@ export class RezMultipleAttachmentsFromInvPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.HeaderData['CompoundMsgID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.HeaderData['TotalObjects'], pos++); + buf.writeUInt8((this.HeaderData['FirstDetachAll']) ? 1 : 0, pos++); + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + this.ObjectData[i]['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.ObjectData[i]['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.ObjectData[i]['AttachmentPt'], pos++); + buf.writeUInt32LE(this.ObjectData[i]['ItemFlags'], pos); + pos += 4; + buf.writeUInt32LE(this.ObjectData[i]['GroupMask'], pos); + pos += 4; + buf.writeUInt32LE(this.ObjectData[i]['EveryoneMask'], pos); + pos += 4; + buf.writeUInt32LE(this.ObjectData[i]['NextOwnerMask'], pos); + pos += 4; + buf.write(this.ObjectData[i]['Name'], pos); + pos += this.ObjectData[i]['Name'].length; + buf.write(this.ObjectData[i]['Description'], pos); + pos += this.ObjectData[i]['Description'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjHeaderData: { + CompoundMsgID: UUID, + TotalObjects: number, + FirstDetachAll: boolean + } = { + CompoundMsgID: UUID.zero(), + TotalObjects: 0, + FirstDetachAll: false + }; + newObjHeaderData['CompoundMsgID'] = new UUID(buf, pos); + pos += 16; + newObjHeaderData['TotalObjects'] = buf.readUInt8(pos++); + newObjHeaderData['FirstDetachAll'] = (buf.readUInt8(pos++) === 1); + this.HeaderData = newObjHeaderData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ItemID: UUID, + OwnerID: UUID, + AttachmentPt: number, + ItemFlags: number, + GroupMask: number, + EveryoneMask: number, + NextOwnerMask: number, + Name: string, + Description: string + } = { + ItemID: UUID.zero(), + OwnerID: UUID.zero(), + AttachmentPt: 0, + ItemFlags: 0, + GroupMask: 0, + EveryoneMask: 0, + NextOwnerMask: 0, + Name: '', + Description: '' + }; + newObjObjectData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['AttachmentPt'] = buf.readUInt8(pos++); + newObjObjectData['ItemFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['GroupMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['EveryoneMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['NextOwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjObjectData['Description'] = buf.toString('utf8', pos, length); + pos += length; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/RezObject.ts b/lib/classes/packets/RezObject.ts index 5c5a820..5ba063a 100644 --- a/lib/classes/packets/RezObject.ts +++ b/lib/classes/packets/RezObject.ts @@ -59,4 +59,228 @@ export class RezObjectPacket implements Packet return (this.InventoryData['Name'].length + 1 + this.InventoryData['Description'].length + 1) + 260; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.RezData['FromTaskID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.RezData['BypassRaycast'], pos++); + this.RezData['RayStart'].writeToBuffer(buf, pos, false); + pos += 12; + this.RezData['RayEnd'].writeToBuffer(buf, pos, false); + pos += 12; + this.RezData['RayTargetID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.RezData['RayEndIsIntersection']) ? 1 : 0, pos++); + buf.writeUInt8((this.RezData['RezSelected']) ? 1 : 0, pos++); + buf.writeUInt8((this.RezData['RemoveItem']) ? 1 : 0, pos++); + buf.writeUInt32LE(this.RezData['ItemFlags'], pos); + pos += 4; + buf.writeUInt32LE(this.RezData['GroupMask'], pos); + pos += 4; + buf.writeUInt32LE(this.RezData['EveryoneMask'], pos); + pos += 4; + buf.writeUInt32LE(this.RezData['NextOwnerMask'], pos); + pos += 4; + this.InventoryData['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['FolderID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['CreatorID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.InventoryData['BaseMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData['OwnerMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData['GroupMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData['EveryoneMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData['NextOwnerMask'], pos); + pos += 4; + buf.writeUInt8((this.InventoryData['GroupOwned']) ? 1 : 0, pos++); + this.InventoryData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt8(this.InventoryData['Type'], pos++); + buf.writeInt8(this.InventoryData['InvType'], pos++); + buf.writeUInt32LE(this.InventoryData['Flags'], pos); + pos += 4; + buf.writeUInt8(this.InventoryData['SaleType'], pos++); + buf.writeInt32LE(this.InventoryData['SalePrice'], pos); + pos += 4; + buf.write(this.InventoryData['Name'], pos); + pos += this.InventoryData['Name'].length; + buf.write(this.InventoryData['Description'], pos); + pos += this.InventoryData['Description'].length; + buf.writeInt32LE(this.InventoryData['CreationDate'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData['CRC'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjRezData: { + FromTaskID: UUID, + BypassRaycast: number, + RayStart: Vector3, + RayEnd: Vector3, + RayTargetID: UUID, + RayEndIsIntersection: boolean, + RezSelected: boolean, + RemoveItem: boolean, + ItemFlags: number, + GroupMask: number, + EveryoneMask: number, + NextOwnerMask: number + } = { + FromTaskID: UUID.zero(), + BypassRaycast: 0, + RayStart: Vector3.getZero(), + RayEnd: Vector3.getZero(), + RayTargetID: UUID.zero(), + RayEndIsIntersection: false, + RezSelected: false, + RemoveItem: false, + ItemFlags: 0, + GroupMask: 0, + EveryoneMask: 0, + NextOwnerMask: 0 + }; + newObjRezData['FromTaskID'] = new UUID(buf, pos); + pos += 16; + newObjRezData['BypassRaycast'] = buf.readUInt8(pos++); + newObjRezData['RayStart'] = new Vector3(buf, pos, false); + pos += 12; + newObjRezData['RayEnd'] = new Vector3(buf, pos, false); + pos += 12; + newObjRezData['RayTargetID'] = new UUID(buf, pos); + pos += 16; + newObjRezData['RayEndIsIntersection'] = (buf.readUInt8(pos++) === 1); + newObjRezData['RezSelected'] = (buf.readUInt8(pos++) === 1); + newObjRezData['RemoveItem'] = (buf.readUInt8(pos++) === 1); + newObjRezData['ItemFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjRezData['GroupMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjRezData['EveryoneMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjRezData['NextOwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + this.RezData = newObjRezData; + const newObjInventoryData: { + ItemID: UUID, + FolderID: UUID, + CreatorID: UUID, + OwnerID: UUID, + GroupID: UUID, + BaseMask: number, + OwnerMask: number, + GroupMask: number, + EveryoneMask: number, + NextOwnerMask: number, + GroupOwned: boolean, + TransactionID: UUID, + Type: number, + InvType: number, + Flags: number, + SaleType: number, + SalePrice: number, + Name: string, + Description: string, + CreationDate: number, + CRC: number + } = { + ItemID: UUID.zero(), + FolderID: UUID.zero(), + CreatorID: UUID.zero(), + OwnerID: UUID.zero(), + GroupID: UUID.zero(), + BaseMask: 0, + OwnerMask: 0, + GroupMask: 0, + EveryoneMask: 0, + NextOwnerMask: 0, + GroupOwned: false, + TransactionID: UUID.zero(), + Type: 0, + InvType: 0, + Flags: 0, + SaleType: 0, + SalePrice: 0, + Name: '', + Description: '', + CreationDate: 0, + CRC: 0 + }; + newObjInventoryData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['CreatorID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['BaseMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['OwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['GroupMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['EveryoneMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['NextOwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['GroupOwned'] = (buf.readUInt8(pos++) === 1); + newObjInventoryData['TransactionID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['Type'] = buf.readInt8(pos++); + newObjInventoryData['InvType'] = buf.readInt8(pos++); + newObjInventoryData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['SaleType'] = buf.readUInt8(pos++); + newObjInventoryData['SalePrice'] = buf.readInt32LE(pos); + pos += 4; + newObjInventoryData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjInventoryData['Description'] = buf.toString('utf8', pos, length); + pos += length; + newObjInventoryData['CreationDate'] = buf.readInt32LE(pos); + pos += 4; + newObjInventoryData['CRC'] = buf.readUInt32LE(pos); + pos += 4; + this.InventoryData = newObjInventoryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RezObjectFromNotecard.ts b/lib/classes/packets/RezObjectFromNotecard.ts index 3fa5116..31410e7 100644 --- a/lib/classes/packets/RezObjectFromNotecard.ts +++ b/lib/classes/packets/RezObjectFromNotecard.ts @@ -43,4 +43,142 @@ export class RezObjectFromNotecardPacket implements Packet return ((16) * this.InventoryData.length) + 157; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.RezData['FromTaskID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.RezData['BypassRaycast'], pos++); + this.RezData['RayStart'].writeToBuffer(buf, pos, false); + pos += 12; + this.RezData['RayEnd'].writeToBuffer(buf, pos, false); + pos += 12; + this.RezData['RayTargetID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.RezData['RayEndIsIntersection']) ? 1 : 0, pos++); + buf.writeUInt8((this.RezData['RezSelected']) ? 1 : 0, pos++); + buf.writeUInt8((this.RezData['RemoveItem']) ? 1 : 0, pos++); + buf.writeUInt32LE(this.RezData['ItemFlags'], pos); + pos += 4; + buf.writeUInt32LE(this.RezData['GroupMask'], pos); + pos += 4; + buf.writeUInt32LE(this.RezData['EveryoneMask'], pos); + pos += 4; + buf.writeUInt32LE(this.RezData['NextOwnerMask'], pos); + pos += 4; + this.NotecardData['NotecardItemID'].writeToBuffer(buf, pos); + pos += 16; + this.NotecardData['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.InventoryData.length; + buf.writeUInt8(this.InventoryData.length, pos++); + for (let i = 0; i < count; i++) + { + this.InventoryData[i]['ItemID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjRezData: { + FromTaskID: UUID, + BypassRaycast: number, + RayStart: Vector3, + RayEnd: Vector3, + RayTargetID: UUID, + RayEndIsIntersection: boolean, + RezSelected: boolean, + RemoveItem: boolean, + ItemFlags: number, + GroupMask: number, + EveryoneMask: number, + NextOwnerMask: number + } = { + FromTaskID: UUID.zero(), + BypassRaycast: 0, + RayStart: Vector3.getZero(), + RayEnd: Vector3.getZero(), + RayTargetID: UUID.zero(), + RayEndIsIntersection: false, + RezSelected: false, + RemoveItem: false, + ItemFlags: 0, + GroupMask: 0, + EveryoneMask: 0, + NextOwnerMask: 0 + }; + newObjRezData['FromTaskID'] = new UUID(buf, pos); + pos += 16; + newObjRezData['BypassRaycast'] = buf.readUInt8(pos++); + newObjRezData['RayStart'] = new Vector3(buf, pos, false); + pos += 12; + newObjRezData['RayEnd'] = new Vector3(buf, pos, false); + pos += 12; + newObjRezData['RayTargetID'] = new UUID(buf, pos); + pos += 16; + newObjRezData['RayEndIsIntersection'] = (buf.readUInt8(pos++) === 1); + newObjRezData['RezSelected'] = (buf.readUInt8(pos++) === 1); + newObjRezData['RemoveItem'] = (buf.readUInt8(pos++) === 1); + newObjRezData['ItemFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjRezData['GroupMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjRezData['EveryoneMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjRezData['NextOwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + this.RezData = newObjRezData; + const newObjNotecardData: { + NotecardItemID: UUID, + ObjectID: UUID + } = { + NotecardItemID: UUID.zero(), + ObjectID: UUID.zero() + }; + newObjNotecardData['NotecardItemID'] = new UUID(buf, pos); + pos += 16; + newObjNotecardData['ObjectID'] = new UUID(buf, pos); + pos += 16; + this.NotecardData = newObjNotecardData; + const count = buf.readUInt8(pos++); + this.InventoryData = []; + for (let i = 0; i < count; i++) + { + const newObjInventoryData: { + ItemID: UUID + } = { + ItemID: UUID.zero() + }; + newObjInventoryData['ItemID'] = new UUID(buf, pos); + pos += 16; + this.InventoryData.push(newObjInventoryData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/RezRestoreToWorld.ts b/lib/classes/packets/RezRestoreToWorld.ts index df3ccfd..ab7519d 100644 --- a/lib/classes/packets/RezRestoreToWorld.ts +++ b/lib/classes/packets/RezRestoreToWorld.ts @@ -43,4 +43,154 @@ export class RezRestoreToWorldPacket implements Packet return (this.InventoryData['Name'].length + 1 + this.InventoryData['Description'].length + 1) + 168; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['FolderID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['CreatorID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.InventoryData['BaseMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData['OwnerMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData['GroupMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData['EveryoneMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData['NextOwnerMask'], pos); + pos += 4; + buf.writeUInt8((this.InventoryData['GroupOwned']) ? 1 : 0, pos++); + this.InventoryData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt8(this.InventoryData['Type'], pos++); + buf.writeInt8(this.InventoryData['InvType'], pos++); + buf.writeUInt32LE(this.InventoryData['Flags'], pos); + pos += 4; + buf.writeUInt8(this.InventoryData['SaleType'], pos++); + buf.writeInt32LE(this.InventoryData['SalePrice'], pos); + pos += 4; + buf.write(this.InventoryData['Name'], pos); + pos += this.InventoryData['Name'].length; + buf.write(this.InventoryData['Description'], pos); + pos += this.InventoryData['Description'].length; + buf.writeInt32LE(this.InventoryData['CreationDate'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData['CRC'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjInventoryData: { + ItemID: UUID, + FolderID: UUID, + CreatorID: UUID, + OwnerID: UUID, + GroupID: UUID, + BaseMask: number, + OwnerMask: number, + GroupMask: number, + EveryoneMask: number, + NextOwnerMask: number, + GroupOwned: boolean, + TransactionID: UUID, + Type: number, + InvType: number, + Flags: number, + SaleType: number, + SalePrice: number, + Name: string, + Description: string, + CreationDate: number, + CRC: number + } = { + ItemID: UUID.zero(), + FolderID: UUID.zero(), + CreatorID: UUID.zero(), + OwnerID: UUID.zero(), + GroupID: UUID.zero(), + BaseMask: 0, + OwnerMask: 0, + GroupMask: 0, + EveryoneMask: 0, + NextOwnerMask: 0, + GroupOwned: false, + TransactionID: UUID.zero(), + Type: 0, + InvType: 0, + Flags: 0, + SaleType: 0, + SalePrice: 0, + Name: '', + Description: '', + CreationDate: 0, + CRC: 0 + }; + newObjInventoryData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['CreatorID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['BaseMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['OwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['GroupMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['EveryoneMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['NextOwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['GroupOwned'] = (buf.readUInt8(pos++) === 1); + newObjInventoryData['TransactionID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['Type'] = buf.readInt8(pos++); + newObjInventoryData['InvType'] = buf.readInt8(pos++); + newObjInventoryData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['SaleType'] = buf.readUInt8(pos++); + newObjInventoryData['SalePrice'] = buf.readInt32LE(pos); + pos += 4; + newObjInventoryData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjInventoryData['Description'] = buf.toString('utf8', pos, length); + pos += length; + newObjInventoryData['CreationDate'] = buf.readInt32LE(pos); + pos += 4; + newObjInventoryData['CRC'] = buf.readUInt32LE(pos); + pos += 4; + this.InventoryData = newObjInventoryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RezScript.ts b/lib/classes/packets/RezScript.ts index 3789414..4b90bbf 100644 --- a/lib/classes/packets/RezScript.ts +++ b/lib/classes/packets/RezScript.ts @@ -48,4 +48,174 @@ export class RezScriptPacket implements Packet return (this.InventoryBlock['Name'].length + 1 + this.InventoryBlock['Description'].length + 1) + 189; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.UpdateBlock['ObjectLocalID'], pos); + pos += 4; + buf.writeUInt8((this.UpdateBlock['Enabled']) ? 1 : 0, pos++); + this.InventoryBlock['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryBlock['FolderID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryBlock['CreatorID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryBlock['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryBlock['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.InventoryBlock['BaseMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryBlock['OwnerMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryBlock['GroupMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryBlock['EveryoneMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryBlock['NextOwnerMask'], pos); + pos += 4; + buf.writeUInt8((this.InventoryBlock['GroupOwned']) ? 1 : 0, pos++); + this.InventoryBlock['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt8(this.InventoryBlock['Type'], pos++); + buf.writeInt8(this.InventoryBlock['InvType'], pos++); + buf.writeUInt32LE(this.InventoryBlock['Flags'], pos); + pos += 4; + buf.writeUInt8(this.InventoryBlock['SaleType'], pos++); + buf.writeInt32LE(this.InventoryBlock['SalePrice'], pos); + pos += 4; + buf.write(this.InventoryBlock['Name'], pos); + pos += this.InventoryBlock['Name'].length; + buf.write(this.InventoryBlock['Description'], pos); + pos += this.InventoryBlock['Description'].length; + buf.writeInt32LE(this.InventoryBlock['CreationDate'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryBlock['CRC'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjUpdateBlock: { + ObjectLocalID: number, + Enabled: boolean + } = { + ObjectLocalID: 0, + Enabled: false + }; + newObjUpdateBlock['ObjectLocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjUpdateBlock['Enabled'] = (buf.readUInt8(pos++) === 1); + this.UpdateBlock = newObjUpdateBlock; + const newObjInventoryBlock: { + ItemID: UUID, + FolderID: UUID, + CreatorID: UUID, + OwnerID: UUID, + GroupID: UUID, + BaseMask: number, + OwnerMask: number, + GroupMask: number, + EveryoneMask: number, + NextOwnerMask: number, + GroupOwned: boolean, + TransactionID: UUID, + Type: number, + InvType: number, + Flags: number, + SaleType: number, + SalePrice: number, + Name: string, + Description: string, + CreationDate: number, + CRC: number + } = { + ItemID: UUID.zero(), + FolderID: UUID.zero(), + CreatorID: UUID.zero(), + OwnerID: UUID.zero(), + GroupID: UUID.zero(), + BaseMask: 0, + OwnerMask: 0, + GroupMask: 0, + EveryoneMask: 0, + NextOwnerMask: 0, + GroupOwned: false, + TransactionID: UUID.zero(), + Type: 0, + InvType: 0, + Flags: 0, + SaleType: 0, + SalePrice: 0, + Name: '', + Description: '', + CreationDate: 0, + CRC: 0 + }; + newObjInventoryBlock['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryBlock['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryBlock['CreatorID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryBlock['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryBlock['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryBlock['BaseMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryBlock['OwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryBlock['GroupMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryBlock['EveryoneMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryBlock['NextOwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryBlock['GroupOwned'] = (buf.readUInt8(pos++) === 1); + newObjInventoryBlock['TransactionID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryBlock['Type'] = buf.readInt8(pos++); + newObjInventoryBlock['InvType'] = buf.readInt8(pos++); + newObjInventoryBlock['Flags'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryBlock['SaleType'] = buf.readUInt8(pos++); + newObjInventoryBlock['SalePrice'] = buf.readInt32LE(pos); + pos += 4; + newObjInventoryBlock['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjInventoryBlock['Description'] = buf.toString('utf8', pos, length); + pos += length; + newObjInventoryBlock['CreationDate'] = buf.readInt32LE(pos); + pos += 4; + newObjInventoryBlock['CRC'] = buf.readUInt32LE(pos); + pos += 4; + this.InventoryBlock = newObjInventoryBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RezSingleAttachmentFromInv.ts b/lib/classes/packets/RezSingleAttachmentFromInv.ts index 7d82afb..43c943d 100644 --- a/lib/classes/packets/RezSingleAttachmentFromInv.ts +++ b/lib/classes/packets/RezSingleAttachmentFromInv.ts @@ -31,4 +31,88 @@ export class RezSingleAttachmentFromInvPacket implements Packet return (this.ObjectData['Name'].length + 1 + this.ObjectData['Description'].length + 1) + 81; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.ObjectData['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.ObjectData['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.ObjectData['AttachmentPt'], pos++); + buf.writeUInt32LE(this.ObjectData['ItemFlags'], pos); + pos += 4; + buf.writeUInt32LE(this.ObjectData['GroupMask'], pos); + pos += 4; + buf.writeUInt32LE(this.ObjectData['EveryoneMask'], pos); + pos += 4; + buf.writeUInt32LE(this.ObjectData['NextOwnerMask'], pos); + pos += 4; + buf.write(this.ObjectData['Name'], pos); + pos += this.ObjectData['Name'].length; + buf.write(this.ObjectData['Description'], pos); + pos += this.ObjectData['Description'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjObjectData: { + ItemID: UUID, + OwnerID: UUID, + AttachmentPt: number, + ItemFlags: number, + GroupMask: number, + EveryoneMask: number, + NextOwnerMask: number, + Name: string, + Description: string + } = { + ItemID: UUID.zero(), + OwnerID: UUID.zero(), + AttachmentPt: 0, + ItemFlags: 0, + GroupMask: 0, + EveryoneMask: 0, + NextOwnerMask: 0, + Name: '', + Description: '' + }; + newObjObjectData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjObjectData['AttachmentPt'] = buf.readUInt8(pos++); + newObjObjectData['ItemFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['GroupMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['EveryoneMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['NextOwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjObjectData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjObjectData['Description'] = buf.toString('utf8', pos, length); + pos += length; + this.ObjectData = newObjObjectData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RoutedMoneyBalanceReply.ts b/lib/classes/packets/RoutedMoneyBalanceReply.ts index b2659d3..972361f 100644 --- a/lib/classes/packets/RoutedMoneyBalanceReply.ts +++ b/lib/classes/packets/RoutedMoneyBalanceReply.ts @@ -39,4 +39,118 @@ export class RoutedMoneyBalanceReplyPacket implements Packet return (this.MoneyData['Description'].length + 1) + (this.TransactionInfo['ItemDescription'].length + 1) + 93; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.TargetBlock['TargetIP'].writeToBuffer(buf, pos); + pos += 4; + buf.writeUInt16LE(this.TargetBlock['TargetPort'], pos); + pos += 2; + this.MoneyData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.MoneyData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.MoneyData['TransactionSuccess']) ? 1 : 0, pos++); + buf.writeInt32LE(this.MoneyData['MoneyBalance'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['SquareMetersCredit'], pos); + pos += 4; + buf.writeInt32LE(this.MoneyData['SquareMetersCommitted'], pos); + pos += 4; + buf.write(this.MoneyData['Description'], pos); + pos += this.MoneyData['Description'].length; + buf.writeInt32LE(this.TransactionInfo['TransactionType'], pos); + pos += 4; + this.TransactionInfo['SourceID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.TransactionInfo['IsSourceGroup']) ? 1 : 0, pos++); + this.TransactionInfo['DestID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.TransactionInfo['IsDestGroup']) ? 1 : 0, pos++); + buf.writeInt32LE(this.TransactionInfo['Amount'], pos); + pos += 4; + buf.write(this.TransactionInfo['ItemDescription'], pos); + pos += this.TransactionInfo['ItemDescription'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjTargetBlock: { + TargetIP: IPAddress, + TargetPort: number + } = { + TargetIP: IPAddress.zero(), + TargetPort: 0 + }; + newObjTargetBlock['TargetIP'] = new IPAddress(buf, pos); + pos += 4; + newObjTargetBlock['TargetPort'] = buf.readUInt16LE(pos); + pos += 2; + this.TargetBlock = newObjTargetBlock; + const newObjMoneyData: { + AgentID: UUID, + TransactionID: UUID, + TransactionSuccess: boolean, + MoneyBalance: number, + SquareMetersCredit: number, + SquareMetersCommitted: number, + Description: string + } = { + AgentID: UUID.zero(), + TransactionID: UUID.zero(), + TransactionSuccess: false, + MoneyBalance: 0, + SquareMetersCredit: 0, + SquareMetersCommitted: 0, + Description: '' + }; + newObjMoneyData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjMoneyData['TransactionID'] = new UUID(buf, pos); + pos += 16; + newObjMoneyData['TransactionSuccess'] = (buf.readUInt8(pos++) === 1); + newObjMoneyData['MoneyBalance'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['SquareMetersCredit'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['SquareMetersCommitted'] = buf.readInt32LE(pos); + pos += 4; + newObjMoneyData['Description'] = buf.toString('utf8', pos, length); + pos += length; + this.MoneyData = newObjMoneyData; + const newObjTransactionInfo: { + TransactionType: number, + SourceID: UUID, + IsSourceGroup: boolean, + DestID: UUID, + IsDestGroup: boolean, + Amount: number, + ItemDescription: string + } = { + TransactionType: 0, + SourceID: UUID.zero(), + IsSourceGroup: false, + DestID: UUID.zero(), + IsDestGroup: false, + Amount: 0, + ItemDescription: '' + }; + newObjTransactionInfo['TransactionType'] = buf.readInt32LE(pos); + pos += 4; + newObjTransactionInfo['SourceID'] = new UUID(buf, pos); + pos += 16; + newObjTransactionInfo['IsSourceGroup'] = (buf.readUInt8(pos++) === 1); + newObjTransactionInfo['DestID'] = new UUID(buf, pos); + pos += 16; + newObjTransactionInfo['IsDestGroup'] = (buf.readUInt8(pos++) === 1); + newObjTransactionInfo['Amount'] = buf.readInt32LE(pos); + pos += 4; + newObjTransactionInfo['ItemDescription'] = buf.toString('utf8', pos, length); + pos += length; + this.TransactionInfo = newObjTransactionInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RpcChannelReply.ts b/lib/classes/packets/RpcChannelReply.ts index 6c5fe7b..acb3005 100644 --- a/lib/classes/packets/RpcChannelReply.ts +++ b/lib/classes/packets/RpcChannelReply.ts @@ -21,4 +21,38 @@ export class RpcChannelReplyPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.DataBlock['TaskID'].writeToBuffer(buf, pos); + pos += 16; + this.DataBlock['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.DataBlock['ChannelID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjDataBlock: { + TaskID: UUID, + ItemID: UUID, + ChannelID: UUID + } = { + TaskID: UUID.zero(), + ItemID: UUID.zero(), + ChannelID: UUID.zero() + }; + newObjDataBlock['TaskID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['ChannelID'] = new UUID(buf, pos); + pos += 16; + this.DataBlock = newObjDataBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RpcChannelRequest.ts b/lib/classes/packets/RpcChannelRequest.ts index 9f40962..76de7c6 100644 --- a/lib/classes/packets/RpcChannelRequest.ts +++ b/lib/classes/packets/RpcChannelRequest.ts @@ -22,4 +22,44 @@ export class RpcChannelRequestPacket implements Packet return 40; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt32LE(this.DataBlock['GridX'], pos); + pos += 4; + buf.writeUInt32LE(this.DataBlock['GridY'], pos); + pos += 4; + this.DataBlock['TaskID'].writeToBuffer(buf, pos); + pos += 16; + this.DataBlock['ItemID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjDataBlock: { + GridX: number, + GridY: number, + TaskID: UUID, + ItemID: UUID + } = { + GridX: 0, + GridY: 0, + TaskID: UUID.zero(), + ItemID: UUID.zero() + }; + newObjDataBlock['GridX'] = buf.readUInt32LE(pos); + pos += 4; + newObjDataBlock['GridY'] = buf.readUInt32LE(pos); + pos += 4; + newObjDataBlock['TaskID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['ItemID'] = new UUID(buf, pos); + pos += 16; + this.DataBlock = newObjDataBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RpcScriptReplyInbound.ts b/lib/classes/packets/RpcScriptReplyInbound.ts index 61cf0f6..aff2564 100644 --- a/lib/classes/packets/RpcScriptReplyInbound.ts +++ b/lib/classes/packets/RpcScriptReplyInbound.ts @@ -23,4 +23,50 @@ export class RpcScriptReplyInboundPacket implements Packet return (this.DataBlock['StringValue'].length + 2) + 52; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.DataBlock['TaskID'].writeToBuffer(buf, pos); + pos += 16; + this.DataBlock['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.DataBlock['ChannelID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.DataBlock['IntValue'], pos); + pos += 4; + buf.write(this.DataBlock['StringValue'], pos); + pos += this.DataBlock['StringValue'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjDataBlock: { + TaskID: UUID, + ItemID: UUID, + ChannelID: UUID, + IntValue: number, + StringValue: string + } = { + TaskID: UUID.zero(), + ItemID: UUID.zero(), + ChannelID: UUID.zero(), + IntValue: 0, + StringValue: '' + }; + newObjDataBlock['TaskID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['ChannelID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['IntValue'] = buf.readUInt32LE(pos); + pos += 4; + newObjDataBlock['StringValue'] = buf.toString('utf8', pos, length); + pos += length; + this.DataBlock = newObjDataBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RpcScriptRequestInbound.ts b/lib/classes/packets/RpcScriptRequestInbound.ts index 35e2622..9753f67 100644 --- a/lib/classes/packets/RpcScriptRequestInbound.ts +++ b/lib/classes/packets/RpcScriptRequestInbound.ts @@ -27,4 +27,66 @@ export class RpcScriptRequestInboundPacket implements Packet return (this.DataBlock['StringValue'].length + 2) + 60; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt32LE(this.TargetBlock['GridX'], pos); + pos += 4; + buf.writeUInt32LE(this.TargetBlock['GridY'], pos); + pos += 4; + this.DataBlock['TaskID'].writeToBuffer(buf, pos); + pos += 16; + this.DataBlock['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.DataBlock['ChannelID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.DataBlock['IntValue'], pos); + pos += 4; + buf.write(this.DataBlock['StringValue'], pos); + pos += this.DataBlock['StringValue'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjTargetBlock: { + GridX: number, + GridY: number + } = { + GridX: 0, + GridY: 0 + }; + newObjTargetBlock['GridX'] = buf.readUInt32LE(pos); + pos += 4; + newObjTargetBlock['GridY'] = buf.readUInt32LE(pos); + pos += 4; + this.TargetBlock = newObjTargetBlock; + const newObjDataBlock: { + TaskID: UUID, + ItemID: UUID, + ChannelID: UUID, + IntValue: number, + StringValue: string + } = { + TaskID: UUID.zero(), + ItemID: UUID.zero(), + ChannelID: UUID.zero(), + IntValue: 0, + StringValue: '' + }; + newObjDataBlock['TaskID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['ChannelID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['IntValue'] = buf.readUInt32LE(pos); + pos += 4; + newObjDataBlock['StringValue'] = buf.toString('utf8', pos, length); + pos += length; + this.DataBlock = newObjDataBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/RpcScriptRequestInboundForward.ts b/lib/classes/packets/RpcScriptRequestInboundForward.ts index c0455e1..e69d968 100644 --- a/lib/classes/packets/RpcScriptRequestInboundForward.ts +++ b/lib/classes/packets/RpcScriptRequestInboundForward.ts @@ -26,4 +26,62 @@ export class RpcScriptRequestInboundForwardPacket implements Packet return (this.DataBlock['StringValue'].length + 2) + 58; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.DataBlock['RPCServerIP'].writeToBuffer(buf, pos); + pos += 4; + buf.writeUInt16LE(this.DataBlock['RPCServerPort'], pos); + pos += 2; + this.DataBlock['TaskID'].writeToBuffer(buf, pos); + pos += 16; + this.DataBlock['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.DataBlock['ChannelID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.DataBlock['IntValue'], pos); + pos += 4; + buf.write(this.DataBlock['StringValue'], pos); + pos += this.DataBlock['StringValue'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjDataBlock: { + RPCServerIP: IPAddress, + RPCServerPort: number, + TaskID: UUID, + ItemID: UUID, + ChannelID: UUID, + IntValue: number, + StringValue: string + } = { + RPCServerIP: IPAddress.zero(), + RPCServerPort: 0, + TaskID: UUID.zero(), + ItemID: UUID.zero(), + ChannelID: UUID.zero(), + IntValue: 0, + StringValue: '' + }; + newObjDataBlock['RPCServerIP'] = new IPAddress(buf, pos); + pos += 4; + newObjDataBlock['RPCServerPort'] = buf.readUInt16LE(pos); + pos += 2; + newObjDataBlock['TaskID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['ChannelID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['IntValue'] = buf.readUInt32LE(pos); + pos += 4; + newObjDataBlock['StringValue'] = buf.toString('utf8', pos, length); + pos += length; + this.DataBlock = newObjDataBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/SaveAssetIntoInventory.ts b/lib/classes/packets/SaveAssetIntoInventory.ts index ab9f889..c5e0466 100644 --- a/lib/classes/packets/SaveAssetIntoInventory.ts +++ b/lib/classes/packets/SaveAssetIntoInventory.ts @@ -23,4 +23,42 @@ export class SaveAssetIntoInventoryPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['NewAssetID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjInventoryData: { + ItemID: UUID, + NewAssetID: UUID + } = { + ItemID: UUID.zero(), + NewAssetID: UUID.zero() + }; + newObjInventoryData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['NewAssetID'] = new UUID(buf, pos); + pos += 16; + this.InventoryData = newObjInventoryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ScriptAnswerYes.ts b/lib/classes/packets/ScriptAnswerYes.ts index cbfdfc0..3425e84 100644 --- a/lib/classes/packets/ScriptAnswerYes.ts +++ b/lib/classes/packets/ScriptAnswerYes.ts @@ -25,4 +25,54 @@ export class ScriptAnswerYesPacket implements Packet return 68; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['TaskID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['ItemID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.Data['Questions'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + TaskID: UUID, + ItemID: UUID, + Questions: number + } = { + TaskID: UUID.zero(), + ItemID: UUID.zero(), + Questions: 0 + }; + newObjData['TaskID'] = new UUID(buf, pos); + pos += 16; + newObjData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjData['Questions'] = buf.readInt32LE(pos); + pos += 4; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ScriptControlChange.ts b/lib/classes/packets/ScriptControlChange.ts index d5e6ea4..e560ab7 100644 --- a/lib/classes/packets/ScriptControlChange.ts +++ b/lib/classes/packets/ScriptControlChange.ts @@ -20,4 +20,44 @@ export class ScriptControlChangePacket implements Packet return ((6) * this.Data.length) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.Data.length; + buf.writeUInt8(this.Data.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt8((this.Data[i]['TakeControls']) ? 1 : 0, pos++); + buf.writeUInt32LE(this.Data[i]['Controls'], pos); + pos += 4; + buf.writeUInt8((this.Data[i]['PassToAgent']) ? 1 : 0, pos++); + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.Data = []; + for (let i = 0; i < count; i++) + { + const newObjData: { + TakeControls: boolean, + Controls: number, + PassToAgent: boolean + } = { + TakeControls: false, + Controls: 0, + PassToAgent: false + }; + newObjData['TakeControls'] = (buf.readUInt8(pos++) === 1); + newObjData['Controls'] = buf.readUInt32LE(pos); + pos += 4; + newObjData['PassToAgent'] = (buf.readUInt8(pos++) === 1); + this.Data.push(newObjData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ScriptDataReply.ts b/lib/classes/packets/ScriptDataReply.ts index b43c85f..efafee0 100644 --- a/lib/classes/packets/ScriptDataReply.ts +++ b/lib/classes/packets/ScriptDataReply.ts @@ -30,4 +30,44 @@ export class ScriptDataReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.DataBlock.length; + buf.writeUInt8(this.DataBlock.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeInt32LE(this.DataBlock[i]['Hash'].low, pos); + pos += 4; + buf.writeInt32LE(this.DataBlock[i]['Hash'].high, pos); + pos += 4; + buf.write(this.DataBlock[i]['Reply'], pos); + pos += this.DataBlock[i]['Reply'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.DataBlock = []; + for (let i = 0; i < count; i++) + { + const newObjDataBlock: { + Hash: Long, + Reply: string + } = { + Hash: Long.ZERO, + Reply: '' + }; + newObjDataBlock['Hash'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjDataBlock['Reply'] = buf.toString('utf8', pos, length); + pos += length; + this.DataBlock.push(newObjDataBlock); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ScriptDataRequest.ts b/lib/classes/packets/ScriptDataRequest.ts index ab9eb9f..5a5b40a 100644 --- a/lib/classes/packets/ScriptDataRequest.ts +++ b/lib/classes/packets/ScriptDataRequest.ts @@ -31,4 +31,48 @@ export class ScriptDataRequestPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.DataBlock.length; + buf.writeUInt8(this.DataBlock.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeInt32LE(this.DataBlock[i]['Hash'].low, pos); + pos += 4; + buf.writeInt32LE(this.DataBlock[i]['Hash'].high, pos); + pos += 4; + buf.writeInt8(this.DataBlock[i]['RequestType'], pos++); + buf.write(this.DataBlock[i]['Request'], pos); + pos += this.DataBlock[i]['Request'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.DataBlock = []; + for (let i = 0; i < count; i++) + { + const newObjDataBlock: { + Hash: Long, + RequestType: number, + Request: string + } = { + Hash: Long.ZERO, + RequestType: 0, + Request: '' + }; + newObjDataBlock['Hash'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjDataBlock['RequestType'] = buf.readInt8(pos++); + newObjDataBlock['Request'] = buf.toString('utf8', pos, length); + pos += length; + this.DataBlock.push(newObjDataBlock); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ScriptDialog.ts b/lib/classes/packets/ScriptDialog.ts index 0ff23b1..cd8ab35 100644 --- a/lib/classes/packets/ScriptDialog.ts +++ b/lib/classes/packets/ScriptDialog.ts @@ -41,4 +41,102 @@ export class ScriptDialogPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Data['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.Data['FirstName'], pos); + pos += this.Data['FirstName'].length; + buf.write(this.Data['LastName'], pos); + pos += this.Data['LastName'].length; + buf.write(this.Data['ObjectName'], pos); + pos += this.Data['ObjectName'].length; + buf.write(this.Data['Message'], pos); + pos += this.Data['Message'].length; + buf.writeInt32LE(this.Data['ChatChannel'], pos); + pos += 4; + this.Data['ImageID'].writeToBuffer(buf, pos); + pos += 16; + let count = this.Buttons.length; + buf.writeUInt8(this.Buttons.length, pos++); + for (let i = 0; i < count; i++) + { + buf.write(this.Buttons[i]['ButtonLabel'], pos); + pos += this.Buttons[i]['ButtonLabel'].length; + } + count = this.OwnerData.length; + buf.writeUInt8(this.OwnerData.length, pos++); + for (let i = 0; i < count; i++) + { + this.OwnerData[i]['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjData: { + ObjectID: UUID, + FirstName: string, + LastName: string, + ObjectName: string, + Message: string, + ChatChannel: number, + ImageID: UUID + } = { + ObjectID: UUID.zero(), + FirstName: '', + LastName: '', + ObjectName: '', + Message: '', + ChatChannel: 0, + ImageID: UUID.zero() + }; + newObjData['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjData['FirstName'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['LastName'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['ObjectName'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['Message'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['ChatChannel'] = buf.readInt32LE(pos); + pos += 4; + newObjData['ImageID'] = new UUID(buf, pos); + pos += 16; + this.Data = newObjData; + let count = buf.readUInt8(pos++); + this.Buttons = []; + for (let i = 0; i < count; i++) + { + const newObjButtons: { + ButtonLabel: string + } = { + ButtonLabel: '' + }; + newObjButtons['ButtonLabel'] = buf.toString('utf8', pos, length); + pos += length; + this.Buttons.push(newObjButtons); + } + count = buf.readUInt8(pos++); + this.OwnerData = []; + for (let i = 0; i < count; i++) + { + const newObjOwnerData: { + OwnerID: UUID + } = { + OwnerID: UUID.zero() + }; + newObjOwnerData['OwnerID'] = new UUID(buf, pos); + pos += 16; + this.OwnerData.push(newObjOwnerData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ScriptDialogReply.ts b/lib/classes/packets/ScriptDialogReply.ts index be84fcc..e917b8d 100644 --- a/lib/classes/packets/ScriptDialogReply.ts +++ b/lib/classes/packets/ScriptDialogReply.ts @@ -26,4 +26,60 @@ export class ScriptDialogReplyPacket implements Packet return (this.Data['ButtonLabel'].length + 1) + 56; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.Data['ChatChannel'], pos); + pos += 4; + buf.writeInt32LE(this.Data['ButtonIndex'], pos); + pos += 4; + buf.write(this.Data['ButtonLabel'], pos); + pos += this.Data['ButtonLabel'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + ObjectID: UUID, + ChatChannel: number, + ButtonIndex: number, + ButtonLabel: string + } = { + ObjectID: UUID.zero(), + ChatChannel: 0, + ButtonIndex: 0, + ButtonLabel: '' + }; + newObjData['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjData['ChatChannel'] = buf.readInt32LE(pos); + pos += 4; + newObjData['ButtonIndex'] = buf.readInt32LE(pos); + pos += 4; + newObjData['ButtonLabel'] = buf.toString('utf8', pos, length); + pos += length; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ScriptMailRegistration.ts b/lib/classes/packets/ScriptMailRegistration.ts index a9b90a6..f21a902 100644 --- a/lib/classes/packets/ScriptMailRegistration.ts +++ b/lib/classes/packets/ScriptMailRegistration.ts @@ -22,4 +22,44 @@ export class ScriptMailRegistrationPacket implements Packet return (this.DataBlock['TargetIP'].length + 1) + 22; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.write(this.DataBlock['TargetIP'], pos); + pos += this.DataBlock['TargetIP'].length; + buf.writeUInt16LE(this.DataBlock['TargetPort'], pos); + pos += 2; + this.DataBlock['TaskID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.DataBlock['Flags'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjDataBlock: { + TargetIP: string, + TargetPort: number, + TaskID: UUID, + Flags: number + } = { + TargetIP: '', + TargetPort: 0, + TaskID: UUID.zero(), + Flags: 0 + }; + newObjDataBlock['TargetIP'] = buf.toString('utf8', pos, length); + pos += length; + newObjDataBlock['TargetPort'] = buf.readUInt16LE(pos); + pos += 2; + newObjDataBlock['TaskID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['Flags'] = buf.readUInt32LE(pos); + pos += 4; + this.DataBlock = newObjDataBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ScriptQuestion.ts b/lib/classes/packets/ScriptQuestion.ts index ec9b7bc..493f8e4 100644 --- a/lib/classes/packets/ScriptQuestion.ts +++ b/lib/classes/packets/ScriptQuestion.ts @@ -26,4 +26,60 @@ export class ScriptQuestionPacket implements Packet return (this.Data['ObjectName'].length + 1 + this.Data['ObjectOwner'].length + 1) + 52; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Data['TaskID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['ItemID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.Data['ObjectName'], pos); + pos += this.Data['ObjectName'].length; + buf.write(this.Data['ObjectOwner'], pos); + pos += this.Data['ObjectOwner'].length; + buf.writeInt32LE(this.Data['Questions'], pos); + pos += 4; + this.Experience['ExperienceID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjData: { + TaskID: UUID, + ItemID: UUID, + ObjectName: string, + ObjectOwner: string, + Questions: number + } = { + TaskID: UUID.zero(), + ItemID: UUID.zero(), + ObjectName: '', + ObjectOwner: '', + Questions: 0 + }; + newObjData['TaskID'] = new UUID(buf, pos); + pos += 16; + newObjData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjData['ObjectName'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['ObjectOwner'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['Questions'] = buf.readInt32LE(pos); + pos += 4; + this.Data = newObjData; + const newObjExperience: { + ExperienceID: UUID + } = { + ExperienceID: UUID.zero() + }; + newObjExperience['ExperienceID'] = new UUID(buf, pos); + pos += 16; + this.Experience = newObjExperience; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ScriptReset.ts b/lib/classes/packets/ScriptReset.ts index d64e9a6..d6592ab 100644 --- a/lib/classes/packets/ScriptReset.ts +++ b/lib/classes/packets/ScriptReset.ts @@ -24,4 +24,48 @@ export class ScriptResetPacket implements Packet return 64; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Script['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + this.Script['ItemID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjScript: { + ObjectID: UUID, + ItemID: UUID + } = { + ObjectID: UUID.zero(), + ItemID: UUID.zero() + }; + newObjScript['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjScript['ItemID'] = new UUID(buf, pos); + pos += 16; + this.Script = newObjScript; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ScriptRunningReply.ts b/lib/classes/packets/ScriptRunningReply.ts index 0344083..c590b88 100644 --- a/lib/classes/packets/ScriptRunningReply.ts +++ b/lib/classes/packets/ScriptRunningReply.ts @@ -21,4 +21,36 @@ export class ScriptRunningReplyPacket implements Packet return 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Script['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + this.Script['ItemID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.Script['Running']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjScript: { + ObjectID: UUID, + ItemID: UUID, + Running: boolean + } = { + ObjectID: UUID.zero(), + ItemID: UUID.zero(), + Running: false + }; + newObjScript['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjScript['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjScript['Running'] = (buf.readUInt8(pos++) === 1); + this.Script = newObjScript; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ScriptSensorReply.ts b/lib/classes/packets/ScriptSensorReply.ts index 26c58af..6ba7007 100644 --- a/lib/classes/packets/ScriptSensorReply.ts +++ b/lib/classes/packets/ScriptSensorReply.ts @@ -42,4 +42,94 @@ export class ScriptSensorReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Requester['SourceID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.SensedData.length; + buf.writeUInt8(this.SensedData.length, pos++); + for (let i = 0; i < count; i++) + { + this.SensedData[i]['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + this.SensedData[i]['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + this.SensedData[i]['GroupID'].writeToBuffer(buf, pos); + pos += 16; + this.SensedData[i]['Position'].writeToBuffer(buf, pos, false); + pos += 12; + this.SensedData[i]['Velocity'].writeToBuffer(buf, pos, false); + pos += 12; + this.SensedData[i]['Rotation'].writeToBuffer(buf, pos); + pos += 12; + buf.write(this.SensedData[i]['Name'], pos); + pos += this.SensedData[i]['Name'].length; + buf.writeInt32LE(this.SensedData[i]['Type'], pos); + pos += 4; + buf.writeFloatLE(this.SensedData[i]['Range'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjRequester: { + SourceID: UUID + } = { + SourceID: UUID.zero() + }; + newObjRequester['SourceID'] = new UUID(buf, pos); + pos += 16; + this.Requester = newObjRequester; + const count = buf.readUInt8(pos++); + this.SensedData = []; + for (let i = 0; i < count; i++) + { + const newObjSensedData: { + ObjectID: UUID, + OwnerID: UUID, + GroupID: UUID, + Position: Vector3, + Velocity: Vector3, + Rotation: Quaternion, + Name: string, + Type: number, + Range: number + } = { + ObjectID: UUID.zero(), + OwnerID: UUID.zero(), + GroupID: UUID.zero(), + Position: Vector3.getZero(), + Velocity: Vector3.getZero(), + Rotation: Quaternion.getIdentity(), + Name: '', + Type: 0, + Range: 0 + }; + newObjSensedData['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjSensedData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjSensedData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjSensedData['Position'] = new Vector3(buf, pos, false); + pos += 12; + newObjSensedData['Velocity'] = new Vector3(buf, pos, false); + pos += 12; + newObjSensedData['Rotation'] = new Quaternion(buf, pos); + pos += 12; + newObjSensedData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjSensedData['Type'] = buf.readInt32LE(pos); + pos += 4; + newObjSensedData['Range'] = buf.readFloatLE(pos); + pos += 4; + this.SensedData.push(newObjSensedData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ScriptSensorRequest.ts b/lib/classes/packets/ScriptSensorRequest.ts index 8545c23..c286a91 100644 --- a/lib/classes/packets/ScriptSensorRequest.ts +++ b/lib/classes/packets/ScriptSensorRequest.ts @@ -32,4 +32,86 @@ export class ScriptSensorRequestPacket implements Packet return (this.Requester['SearchName'].length + 1) + 93; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Requester['SourceID'].writeToBuffer(buf, pos); + pos += 16; + this.Requester['RequestID'].writeToBuffer(buf, pos); + pos += 16; + this.Requester['SearchID'].writeToBuffer(buf, pos); + pos += 16; + this.Requester['SearchPos'].writeToBuffer(buf, pos, false); + pos += 12; + this.Requester['SearchDir'].writeToBuffer(buf, pos); + pos += 12; + buf.write(this.Requester['SearchName'], pos); + pos += this.Requester['SearchName'].length; + buf.writeInt32LE(this.Requester['Type'], pos); + pos += 4; + buf.writeFloatLE(this.Requester['Range'], pos); + pos += 4; + buf.writeFloatLE(this.Requester['Arc'], pos); + pos += 4; + buf.writeInt32LE(this.Requester['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.Requester['RegionHandle'].high, pos); + pos += 4; + buf.writeUInt8(this.Requester['SearchRegions'], pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjRequester: { + SourceID: UUID, + RequestID: UUID, + SearchID: UUID, + SearchPos: Vector3, + SearchDir: Quaternion, + SearchName: string, + Type: number, + Range: number, + Arc: number, + RegionHandle: Long, + SearchRegions: number + } = { + SourceID: UUID.zero(), + RequestID: UUID.zero(), + SearchID: UUID.zero(), + SearchPos: Vector3.getZero(), + SearchDir: Quaternion.getIdentity(), + SearchName: '', + Type: 0, + Range: 0, + Arc: 0, + RegionHandle: Long.ZERO, + SearchRegions: 0 + }; + newObjRequester['SourceID'] = new UUID(buf, pos); + pos += 16; + newObjRequester['RequestID'] = new UUID(buf, pos); + pos += 16; + newObjRequester['SearchID'] = new UUID(buf, pos); + pos += 16; + newObjRequester['SearchPos'] = new Vector3(buf, pos, false); + pos += 12; + newObjRequester['SearchDir'] = new Quaternion(buf, pos); + pos += 12; + newObjRequester['SearchName'] = buf.toString('utf8', pos, length); + pos += length; + newObjRequester['Type'] = buf.readInt32LE(pos); + pos += 4; + newObjRequester['Range'] = buf.readFloatLE(pos); + pos += 4; + newObjRequester['Arc'] = buf.readFloatLE(pos); + pos += 4; + newObjRequester['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjRequester['SearchRegions'] = buf.readUInt8(pos++); + this.Requester = newObjRequester; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ScriptTeleportRequest.ts b/lib/classes/packets/ScriptTeleportRequest.ts index 0fe5849..ff105cd 100644 --- a/lib/classes/packets/ScriptTeleportRequest.ts +++ b/lib/classes/packets/ScriptTeleportRequest.ts @@ -22,4 +22,44 @@ export class ScriptTeleportRequestPacket implements Packet return (this.Data['ObjectName'].length + 1 + this.Data['SimName'].length + 1) + 24; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.write(this.Data['ObjectName'], pos); + pos += this.Data['ObjectName'].length; + buf.write(this.Data['SimName'], pos); + pos += this.Data['SimName'].length; + this.Data['SimPosition'].writeToBuffer(buf, pos, false); + pos += 12; + this.Data['LookAt'].writeToBuffer(buf, pos, false); + pos += 12; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjData: { + ObjectName: string, + SimName: string, + SimPosition: Vector3, + LookAt: Vector3 + } = { + ObjectName: '', + SimName: '', + SimPosition: Vector3.getZero(), + LookAt: Vector3.getZero() + }; + newObjData['ObjectName'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['SimName'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['SimPosition'] = new Vector3(buf, pos, false); + pos += 12; + newObjData['LookAt'] = new Vector3(buf, pos, false); + pos += 12; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/SendPostcard.ts b/lib/classes/packets/SendPostcard.ts index d5f0c22..1479e37 100644 --- a/lib/classes/packets/SendPostcard.ts +++ b/lib/classes/packets/SendPostcard.ts @@ -30,4 +30,82 @@ export class SendPostcardPacket implements Packet return (this.AgentData['To'].length + 1 + this.AgentData['From'].length + 1 + this.AgentData['Name'].length + 1 + this.AgentData['Subject'].length + 1 + this.AgentData['Msg'].length + 2) + 74; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['AssetID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['PosGlobal'].writeToBuffer(buf, pos, true); + pos += 24; + buf.write(this.AgentData['To'], pos); + pos += this.AgentData['To'].length; + buf.write(this.AgentData['From'], pos); + pos += this.AgentData['From'].length; + buf.write(this.AgentData['Name'], pos); + pos += this.AgentData['Name'].length; + buf.write(this.AgentData['Subject'], pos); + pos += this.AgentData['Subject'].length; + buf.write(this.AgentData['Msg'], pos); + pos += this.AgentData['Msg'].length; + buf.writeUInt8((this.AgentData['AllowPublish']) ? 1 : 0, pos++); + buf.writeUInt8((this.AgentData['MaturePublish']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + AssetID: UUID, + PosGlobal: Vector3, + To: string, + From: string, + Name: string, + Subject: string, + Msg: string, + AllowPublish: boolean, + MaturePublish: boolean + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + AssetID: UUID.zero(), + PosGlobal: Vector3.getZero(), + To: '', + From: '', + Name: '', + Subject: '', + Msg: '', + AllowPublish: false, + MaturePublish: false + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['AssetID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['PosGlobal'] = new Vector3(buf, pos, true); + pos += 24; + newObjAgentData['To'] = buf.toString('utf8', pos, length); + pos += length; + newObjAgentData['From'] = buf.toString('utf8', pos, length); + pos += length; + newObjAgentData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjAgentData['Subject'] = buf.toString('utf8', pos, length); + pos += length; + newObjAgentData['Msg'] = buf.toString('utf8', pos, length); + pos += length; + newObjAgentData['AllowPublish'] = (buf.readUInt8(pos++) === 1); + newObjAgentData['MaturePublish'] = (buf.readUInt8(pos++) === 1); + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/SendXferPacket.ts b/lib/classes/packets/SendXferPacket.ts index 7e942ec..11ef0fc 100644 --- a/lib/classes/packets/SendXferPacket.ts +++ b/lib/classes/packets/SendXferPacket.ts @@ -23,4 +23,44 @@ export class SendXferPacketPacket implements Packet return (this.DataPacket['Data'].length + 2) + 12; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.XferID['ID'].low, pos); + pos += 4; + buf.writeInt32LE(this.XferID['ID'].high, pos); + pos += 4; + buf.writeUInt32LE(this.XferID['Packet'], pos); + pos += 4; + buf.write(this.DataPacket['Data'], pos); + pos += this.DataPacket['Data'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjXferID: { + ID: Long, + Packet: number + } = { + ID: Long.ZERO, + Packet: 0 + }; + newObjXferID['ID'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjXferID['Packet'] = buf.readUInt32LE(pos); + pos += 4; + this.XferID = newObjXferID; + const newObjDataPacket: { + Data: string + } = { + Data: '' + }; + newObjDataPacket['Data'] = buf.toString('utf8', pos, length); + pos += length; + this.DataPacket = newObjDataPacket; + return pos - startPos; + } } + diff --git a/lib/classes/packets/SetAlwaysRun.ts b/lib/classes/packets/SetAlwaysRun.ts index 9b7a38b..7e1be1e 100644 --- a/lib/classes/packets/SetAlwaysRun.ts +++ b/lib/classes/packets/SetAlwaysRun.ts @@ -21,4 +21,36 @@ export class SetAlwaysRunPacket implements Packet return 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.AgentData['AlwaysRun']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + AlwaysRun: boolean + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + AlwaysRun: false + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['AlwaysRun'] = (buf.readUInt8(pos++) === 1); + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/SetCPURatio.ts b/lib/classes/packets/SetCPURatio.ts index 3cf3bff..e045793 100644 --- a/lib/classes/packets/SetCPURatio.ts +++ b/lib/classes/packets/SetCPURatio.ts @@ -18,4 +18,24 @@ export class SetCPURatioPacket implements Packet return 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt8(this.Data['Ratio'], pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjData: { + Ratio: number + } = { + Ratio: 0 + }; + newObjData['Ratio'] = buf.readUInt8(pos++); + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/SetFollowCamProperties.ts b/lib/classes/packets/SetFollowCamProperties.ts index 1ead938..0c8a155 100644 --- a/lib/classes/packets/SetFollowCamProperties.ts +++ b/lib/classes/packets/SetFollowCamProperties.ts @@ -23,4 +23,52 @@ export class SetFollowCamPropertiesPacket implements Packet return ((8) * this.CameraProperty.length) + 17; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.ObjectData['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.CameraProperty.length; + buf.writeUInt8(this.CameraProperty.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeInt32LE(this.CameraProperty[i]['Type'], pos); + pos += 4; + buf.writeFloatLE(this.CameraProperty[i]['Value'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjObjectData: { + ObjectID: UUID + } = { + ObjectID: UUID.zero() + }; + newObjObjectData['ObjectID'] = new UUID(buf, pos); + pos += 16; + this.ObjectData = newObjObjectData; + const count = buf.readUInt8(pos++); + this.CameraProperty = []; + for (let i = 0; i < count; i++) + { + const newObjCameraProperty: { + Type: number, + Value: number + } = { + Type: 0, + Value: 0 + }; + newObjCameraProperty['Type'] = buf.readInt32LE(pos); + pos += 4; + newObjCameraProperty['Value'] = buf.readFloatLE(pos); + pos += 4; + this.CameraProperty.push(newObjCameraProperty); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/SetGroupAcceptNotices.ts b/lib/classes/packets/SetGroupAcceptNotices.ts index 904f0c1..64d87f6 100644 --- a/lib/classes/packets/SetGroupAcceptNotices.ts +++ b/lib/classes/packets/SetGroupAcceptNotices.ts @@ -27,4 +27,54 @@ export class SetGroupAcceptNoticesPacket implements Packet return 50; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.Data['AcceptNotices']) ? 1 : 0, pos++); + buf.writeUInt8((this.NewData['ListInProfile']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + GroupID: UUID, + AcceptNotices: boolean + } = { + GroupID: UUID.zero(), + AcceptNotices: false + }; + newObjData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjData['AcceptNotices'] = (buf.readUInt8(pos++) === 1); + this.Data = newObjData; + const newObjNewData: { + ListInProfile: boolean + } = { + ListInProfile: false + }; + newObjNewData['ListInProfile'] = (buf.readUInt8(pos++) === 1); + this.NewData = newObjNewData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/SetGroupContribution.ts b/lib/classes/packets/SetGroupContribution.ts index e358465..b74fcf9 100644 --- a/lib/classes/packets/SetGroupContribution.ts +++ b/lib/classes/packets/SetGroupContribution.ts @@ -24,4 +24,48 @@ export class SetGroupContributionPacket implements Packet return 52; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Data['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.Data['Contribution'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjData: { + GroupID: UUID, + Contribution: number + } = { + GroupID: UUID.zero(), + Contribution: 0 + }; + newObjData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjData['Contribution'] = buf.readInt32LE(pos); + pos += 4; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/SetScriptRunning.ts b/lib/classes/packets/SetScriptRunning.ts index 1da5a58..2ca0a98 100644 --- a/lib/classes/packets/SetScriptRunning.ts +++ b/lib/classes/packets/SetScriptRunning.ts @@ -25,4 +25,52 @@ export class SetScriptRunningPacket implements Packet return 65; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Script['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + this.Script['ItemID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.Script['Running']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjScript: { + ObjectID: UUID, + ItemID: UUID, + Running: boolean + } = { + ObjectID: UUID.zero(), + ItemID: UUID.zero(), + Running: false + }; + newObjScript['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjScript['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjScript['Running'] = (buf.readUInt8(pos++) === 1); + this.Script = newObjScript; + return pos - startPos; + } } + diff --git a/lib/classes/packets/SetSimPresenceInDatabase.ts b/lib/classes/packets/SetSimPresenceInDatabase.ts index 01004f9..b8818fd 100644 --- a/lib/classes/packets/SetSimPresenceInDatabase.ts +++ b/lib/classes/packets/SetSimPresenceInDatabase.ts @@ -26,4 +26,68 @@ export class SetSimPresenceInDatabasePacket implements Packet return (this.SimData['HostName'].length + 1 + this.SimData['Status'].length + 1) + 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.SimData['RegionID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.SimData['HostName'], pos); + pos += this.SimData['HostName'].length; + buf.writeUInt32LE(this.SimData['GridX'], pos); + pos += 4; + buf.writeUInt32LE(this.SimData['GridY'], pos); + pos += 4; + buf.writeInt32LE(this.SimData['PID'], pos); + pos += 4; + buf.writeInt32LE(this.SimData['AgentCount'], pos); + pos += 4; + buf.writeInt32LE(this.SimData['TimeToLive'], pos); + pos += 4; + buf.write(this.SimData['Status'], pos); + pos += this.SimData['Status'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjSimData: { + RegionID: UUID, + HostName: string, + GridX: number, + GridY: number, + PID: number, + AgentCount: number, + TimeToLive: number, + Status: string + } = { + RegionID: UUID.zero(), + HostName: '', + GridX: 0, + GridY: 0, + PID: 0, + AgentCount: 0, + TimeToLive: 0, + Status: '' + }; + newObjSimData['RegionID'] = new UUID(buf, pos); + pos += 16; + newObjSimData['HostName'] = buf.toString('utf8', pos, length); + pos += length; + newObjSimData['GridX'] = buf.readUInt32LE(pos); + pos += 4; + newObjSimData['GridY'] = buf.readUInt32LE(pos); + pos += 4; + newObjSimData['PID'] = buf.readInt32LE(pos); + pos += 4; + newObjSimData['AgentCount'] = buf.readInt32LE(pos); + pos += 4; + newObjSimData['TimeToLive'] = buf.readInt32LE(pos); + pos += 4; + newObjSimData['Status'] = buf.toString('utf8', pos, length); + pos += length; + this.SimData = newObjSimData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/SetSimStatusInDatabase.ts b/lib/classes/packets/SetSimStatusInDatabase.ts index 8504bda..32f47f5 100644 --- a/lib/classes/packets/SetSimStatusInDatabase.ts +++ b/lib/classes/packets/SetSimStatusInDatabase.ts @@ -26,4 +26,68 @@ export class SetSimStatusInDatabasePacket implements Packet return (this.Data['HostName'].length + 1 + this.Data['Status'].length + 1) + 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Data['RegionID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.Data['HostName'], pos); + pos += this.Data['HostName'].length; + buf.writeInt32LE(this.Data['X'], pos); + pos += 4; + buf.writeInt32LE(this.Data['Y'], pos); + pos += 4; + buf.writeInt32LE(this.Data['PID'], pos); + pos += 4; + buf.writeInt32LE(this.Data['AgentCount'], pos); + pos += 4; + buf.writeInt32LE(this.Data['TimeToLive'], pos); + pos += 4; + buf.write(this.Data['Status'], pos); + pos += this.Data['Status'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjData: { + RegionID: UUID, + HostName: string, + X: number, + Y: number, + PID: number, + AgentCount: number, + TimeToLive: number, + Status: string + } = { + RegionID: UUID.zero(), + HostName: '', + X: 0, + Y: 0, + PID: 0, + AgentCount: 0, + TimeToLive: 0, + Status: '' + }; + newObjData['RegionID'] = new UUID(buf, pos); + pos += 16; + newObjData['HostName'] = buf.toString('utf8', pos, length); + pos += length; + newObjData['X'] = buf.readInt32LE(pos); + pos += 4; + newObjData['Y'] = buf.readInt32LE(pos); + pos += 4; + newObjData['PID'] = buf.readInt32LE(pos); + pos += 4; + newObjData['AgentCount'] = buf.readInt32LE(pos); + pos += 4; + newObjData['TimeToLive'] = buf.readInt32LE(pos); + pos += 4; + newObjData['Status'] = buf.toString('utf8', pos, length); + pos += length; + this.Data = newObjData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/SetStartLocation.ts b/lib/classes/packets/SetStartLocation.ts index fb0f424..0c71e58 100644 --- a/lib/classes/packets/SetStartLocation.ts +++ b/lib/classes/packets/SetStartLocation.ts @@ -26,4 +26,58 @@ export class SetStartLocationPacket implements Packet return 68; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.StartLocationData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.StartLocationData['RegionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.StartLocationData['LocationID'], pos); + pos += 4; + buf.writeInt32LE(this.StartLocationData['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.StartLocationData['RegionHandle'].high, pos); + pos += 4; + this.StartLocationData['LocationPos'].writeToBuffer(buf, pos, false); + pos += 12; + this.StartLocationData['LocationLookAt'].writeToBuffer(buf, pos, false); + pos += 12; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjStartLocationData: { + AgentID: UUID, + RegionID: UUID, + LocationID: number, + RegionHandle: Long, + LocationPos: Vector3, + LocationLookAt: Vector3 + } = { + AgentID: UUID.zero(), + RegionID: UUID.zero(), + LocationID: 0, + RegionHandle: Long.ZERO, + LocationPos: Vector3.getZero(), + LocationLookAt: Vector3.getZero() + }; + newObjStartLocationData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjStartLocationData['RegionID'] = new UUID(buf, pos); + pos += 16; + newObjStartLocationData['LocationID'] = buf.readUInt32LE(pos); + pos += 4; + newObjStartLocationData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjStartLocationData['LocationPos'] = new Vector3(buf, pos, false); + pos += 12; + newObjStartLocationData['LocationLookAt'] = new Vector3(buf, pos, false); + pos += 12; + this.StartLocationData = newObjStartLocationData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/SetStartLocationRequest.ts b/lib/classes/packets/SetStartLocationRequest.ts index 5b16159..bddb009 100644 --- a/lib/classes/packets/SetStartLocationRequest.ts +++ b/lib/classes/packets/SetStartLocationRequest.ts @@ -27,4 +27,60 @@ export class SetStartLocationRequestPacket implements Packet return (this.StartLocationData['SimName'].length + 1) + 60; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.StartLocationData['SimName'], pos); + pos += this.StartLocationData['SimName'].length; + buf.writeUInt32LE(this.StartLocationData['LocationID'], pos); + pos += 4; + this.StartLocationData['LocationPos'].writeToBuffer(buf, pos, false); + pos += 12; + this.StartLocationData['LocationLookAt'].writeToBuffer(buf, pos, false); + pos += 12; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjStartLocationData: { + SimName: string, + LocationID: number, + LocationPos: Vector3, + LocationLookAt: Vector3 + } = { + SimName: '', + LocationID: 0, + LocationPos: Vector3.getZero(), + LocationLookAt: Vector3.getZero() + }; + newObjStartLocationData['SimName'] = buf.toString('utf8', pos, length); + pos += length; + newObjStartLocationData['LocationID'] = buf.readUInt32LE(pos); + pos += 4; + newObjStartLocationData['LocationPos'] = new Vector3(buf, pos, false); + pos += 12; + newObjStartLocationData['LocationLookAt'] = new Vector3(buf, pos, false); + pos += 12; + this.StartLocationData = newObjStartLocationData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/SimCrashed.ts b/lib/classes/packets/SimCrashed.ts index ded5931..6590f17 100644 --- a/lib/classes/packets/SimCrashed.ts +++ b/lib/classes/packets/SimCrashed.ts @@ -23,4 +23,52 @@ export class SimCrashedPacket implements Packet return ((16) * this.Users.length) + 9; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt32LE(this.Data['RegionX'], pos); + pos += 4; + buf.writeUInt32LE(this.Data['RegionY'], pos); + pos += 4; + const count = this.Users.length; + buf.writeUInt8(this.Users.length, pos++); + for (let i = 0; i < count; i++) + { + this.Users[i]['AgentID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjData: { + RegionX: number, + RegionY: number + } = { + RegionX: 0, + RegionY: 0 + }; + newObjData['RegionX'] = buf.readUInt32LE(pos); + pos += 4; + newObjData['RegionY'] = buf.readUInt32LE(pos); + pos += 4; + this.Data = newObjData; + const count = buf.readUInt8(pos++); + this.Users = []; + for (let i = 0; i < count; i++) + { + const newObjUsers: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjUsers['AgentID'] = new UUID(buf, pos); + pos += 16; + this.Users.push(newObjUsers); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/SimStats.ts b/lib/classes/packets/SimStats.ts index e75ecf9..532da8d 100644 --- a/lib/classes/packets/SimStats.ts +++ b/lib/classes/packets/SimStats.ts @@ -32,4 +32,102 @@ export class SimStatsPacket implements Packet return ((8) * this.Stat.length) + ((8) * this.RegionInfo.length) + 22; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt32LE(this.Region['RegionX'], pos); + pos += 4; + buf.writeUInt32LE(this.Region['RegionY'], pos); + pos += 4; + buf.writeUInt32LE(this.Region['RegionFlags'], pos); + pos += 4; + buf.writeUInt32LE(this.Region['ObjectCapacity'], pos); + pos += 4; + let count = this.Stat.length; + buf.writeUInt8(this.Stat.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.Stat[i]['StatID'], pos); + pos += 4; + buf.writeFloatLE(this.Stat[i]['StatValue'], pos); + pos += 4; + } + buf.writeInt32LE(this.PidStat['PID'], pos); + pos += 4; + count = this.RegionInfo.length; + buf.writeUInt8(this.RegionInfo.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeInt32LE(this.RegionInfo[i]['RegionFlagsExtended'].low, pos); + pos += 4; + buf.writeInt32LE(this.RegionInfo[i]['RegionFlagsExtended'].high, pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjRegion: { + RegionX: number, + RegionY: number, + RegionFlags: number, + ObjectCapacity: number + } = { + RegionX: 0, + RegionY: 0, + RegionFlags: 0, + ObjectCapacity: 0 + }; + newObjRegion['RegionX'] = buf.readUInt32LE(pos); + pos += 4; + newObjRegion['RegionY'] = buf.readUInt32LE(pos); + pos += 4; + newObjRegion['RegionFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjRegion['ObjectCapacity'] = buf.readUInt32LE(pos); + pos += 4; + this.Region = newObjRegion; + let count = buf.readUInt8(pos++); + this.Stat = []; + for (let i = 0; i < count; i++) + { + const newObjStat: { + StatID: number, + StatValue: number + } = { + StatID: 0, + StatValue: 0 + }; + newObjStat['StatID'] = buf.readUInt32LE(pos); + pos += 4; + newObjStat['StatValue'] = buf.readFloatLE(pos); + pos += 4; + this.Stat.push(newObjStat); + } + const newObjPidStat: { + PID: number + } = { + PID: 0 + }; + newObjPidStat['PID'] = buf.readInt32LE(pos); + pos += 4; + this.PidStat = newObjPidStat; + count = buf.readUInt8(pos++); + this.RegionInfo = []; + for (let i = 0; i < count; i++) + { + const newObjRegionInfo: { + RegionFlagsExtended: Long + } = { + RegionFlagsExtended: Long.ZERO + }; + newObjRegionInfo['RegionFlagsExtended'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + this.RegionInfo.push(newObjRegionInfo); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/SimStatus.ts b/lib/classes/packets/SimStatus.ts index 4c13357..f635928 100644 --- a/lib/classes/packets/SimStatus.ts +++ b/lib/classes/packets/SimStatus.ts @@ -23,4 +23,40 @@ export class SimStatusPacket implements Packet return 10; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt8((this.SimStatus['CanAcceptAgents']) ? 1 : 0, pos++); + buf.writeUInt8((this.SimStatus['CanAcceptTasks']) ? 1 : 0, pos++); + buf.writeInt32LE(this.SimFlags['Flags'].low, pos); + pos += 4; + buf.writeInt32LE(this.SimFlags['Flags'].high, pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjSimStatus: { + CanAcceptAgents: boolean, + CanAcceptTasks: boolean + } = { + CanAcceptAgents: false, + CanAcceptTasks: false + }; + newObjSimStatus['CanAcceptAgents'] = (buf.readUInt8(pos++) === 1); + newObjSimStatus['CanAcceptTasks'] = (buf.readUInt8(pos++) === 1); + this.SimStatus = newObjSimStatus; + const newObjSimFlags: { + Flags: Long + } = { + Flags: Long.ZERO + }; + newObjSimFlags['Flags'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + this.SimFlags = newObjSimFlags; + return pos - startPos; + } } + diff --git a/lib/classes/packets/SimWideDeletes.ts b/lib/classes/packets/SimWideDeletes.ts index f2430d0..002b013 100644 --- a/lib/classes/packets/SimWideDeletes.ts +++ b/lib/classes/packets/SimWideDeletes.ts @@ -24,4 +24,48 @@ export class SimWideDeletesPacket implements Packet return 52; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.DataBlock['TargetID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.DataBlock['Flags'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjDataBlock: { + TargetID: UUID, + Flags: number + } = { + TargetID: UUID.zero(), + Flags: 0 + }; + newObjDataBlock['TargetID'] = new UUID(buf, pos); + pos += 16; + newObjDataBlock['Flags'] = buf.readUInt32LE(pos); + pos += 4; + this.DataBlock = newObjDataBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/SimulatorLoad.ts b/lib/classes/packets/SimulatorLoad.ts index 38cb9fe..dcf8017 100644 --- a/lib/classes/packets/SimulatorLoad.ts +++ b/lib/classes/packets/SimulatorLoad.ts @@ -25,4 +25,64 @@ export class SimulatorLoadPacket implements Packet return ((6) * this.AgentList.length) + 10; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeFloatLE(this.SimulatorLoad['TimeDilation'], pos); + pos += 4; + buf.writeInt32LE(this.SimulatorLoad['AgentCount'], pos); + pos += 4; + buf.writeUInt8((this.SimulatorLoad['CanAcceptAgents']) ? 1 : 0, pos++); + const count = this.AgentList.length; + buf.writeUInt8(this.AgentList.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.AgentList[i]['CircuitCode'], pos); + pos += 4; + buf.writeUInt8(this.AgentList[i]['X'], pos++); + buf.writeUInt8(this.AgentList[i]['Y'], pos++); + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjSimulatorLoad: { + TimeDilation: number, + AgentCount: number, + CanAcceptAgents: boolean + } = { + TimeDilation: 0, + AgentCount: 0, + CanAcceptAgents: false + }; + newObjSimulatorLoad['TimeDilation'] = buf.readFloatLE(pos); + pos += 4; + newObjSimulatorLoad['AgentCount'] = buf.readInt32LE(pos); + pos += 4; + newObjSimulatorLoad['CanAcceptAgents'] = (buf.readUInt8(pos++) === 1); + this.SimulatorLoad = newObjSimulatorLoad; + const count = buf.readUInt8(pos++); + this.AgentList = []; + for (let i = 0; i < count; i++) + { + const newObjAgentList: { + CircuitCode: number, + X: number, + Y: number + } = { + CircuitCode: 0, + X: 0, + Y: 0 + }; + newObjAgentList['CircuitCode'] = buf.readUInt32LE(pos); + pos += 4; + newObjAgentList['X'] = buf.readUInt8(pos++); + newObjAgentList['Y'] = buf.readUInt8(pos++); + this.AgentList.push(newObjAgentList); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/SimulatorMapUpdate.ts b/lib/classes/packets/SimulatorMapUpdate.ts index 31b890b..e182b30 100644 --- a/lib/classes/packets/SimulatorMapUpdate.ts +++ b/lib/classes/packets/SimulatorMapUpdate.ts @@ -18,4 +18,26 @@ export class SimulatorMapUpdatePacket implements Packet return 4; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt32LE(this.MapData['Flags'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjMapData: { + Flags: number + } = { + Flags: 0 + }; + newObjMapData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + this.MapData = newObjMapData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/SimulatorPresentAtLocation.ts b/lib/classes/packets/SimulatorPresentAtLocation.ts index c959ffb..cd98743 100644 --- a/lib/classes/packets/SimulatorPresentAtLocation.ts +++ b/lib/classes/packets/SimulatorPresentAtLocation.ts @@ -40,4 +40,130 @@ export class SimulatorPresentAtLocationPacket implements Packet return (this.SimulatorBlock['SimName'].length + 1) + ((13) * this.TelehubBlock.length) + 68; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt16LE(this.SimulatorPublicHostBlock['Port'], pos); + pos += 2; + this.SimulatorPublicHostBlock['SimulatorIP'].writeToBuffer(buf, pos); + pos += 4; + buf.writeUInt32LE(this.SimulatorPublicHostBlock['GridX'], pos); + pos += 4; + buf.writeUInt32LE(this.SimulatorPublicHostBlock['GridY'], pos); + pos += 4; + let count = 4; + for (let i = 0; i < count; i++) + { + this.NeighborBlock[i]['IP'].writeToBuffer(buf, pos); + pos += 4; + buf.writeUInt16LE(this.NeighborBlock[i]['Port'], pos); + pos += 2; + } + buf.write(this.SimulatorBlock['SimName'], pos); + pos += this.SimulatorBlock['SimName'].length; + buf.writeUInt8(this.SimulatorBlock['SimAccess'], pos++); + buf.writeUInt32LE(this.SimulatorBlock['RegionFlags'], pos); + pos += 4; + this.SimulatorBlock['RegionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.SimulatorBlock['EstateID'], pos); + pos += 4; + buf.writeUInt32LE(this.SimulatorBlock['ParentEstateID'], pos); + pos += 4; + count = this.TelehubBlock.length; + buf.writeUInt8(this.TelehubBlock.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt8((this.TelehubBlock[i]['HasTelehub']) ? 1 : 0, pos++); + this.TelehubBlock[i]['TelehubPos'].writeToBuffer(buf, pos, false); + pos += 12; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjSimulatorPublicHostBlock: { + Port: number, + SimulatorIP: IPAddress, + GridX: number, + GridY: number + } = { + Port: 0, + SimulatorIP: IPAddress.zero(), + GridX: 0, + GridY: 0 + }; + newObjSimulatorPublicHostBlock['Port'] = buf.readUInt16LE(pos); + pos += 2; + newObjSimulatorPublicHostBlock['SimulatorIP'] = new IPAddress(buf, pos); + pos += 4; + newObjSimulatorPublicHostBlock['GridX'] = buf.readUInt32LE(pos); + pos += 4; + newObjSimulatorPublicHostBlock['GridY'] = buf.readUInt32LE(pos); + pos += 4; + this.SimulatorPublicHostBlock = newObjSimulatorPublicHostBlock; + let count = 4; + this.NeighborBlock = []; for (let i = 0; i < count; i++) + { + const newObjNeighborBlock: { + IP: IPAddress, + Port: number + } = { + IP: IPAddress.zero(), + Port: 0 + }; + newObjNeighborBlock['IP'] = new IPAddress(buf, pos); + pos += 4; + newObjNeighborBlock['Port'] = buf.readUInt16LE(pos); + pos += 2; + this.NeighborBlock.push(newObjNeighborBlock); + } + const newObjSimulatorBlock: { + SimName: string, + SimAccess: number, + RegionFlags: number, + RegionID: UUID, + EstateID: number, + ParentEstateID: number + } = { + SimName: '', + SimAccess: 0, + RegionFlags: 0, + RegionID: UUID.zero(), + EstateID: 0, + ParentEstateID: 0 + }; + newObjSimulatorBlock['SimName'] = buf.toString('utf8', pos, length); + pos += length; + newObjSimulatorBlock['SimAccess'] = buf.readUInt8(pos++); + newObjSimulatorBlock['RegionFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjSimulatorBlock['RegionID'] = new UUID(buf, pos); + pos += 16; + newObjSimulatorBlock['EstateID'] = buf.readUInt32LE(pos); + pos += 4; + newObjSimulatorBlock['ParentEstateID'] = buf.readUInt32LE(pos); + pos += 4; + this.SimulatorBlock = newObjSimulatorBlock; + count = buf.readUInt8(pos++); + this.TelehubBlock = []; + for (let i = 0; i < count; i++) + { + const newObjTelehubBlock: { + HasTelehub: boolean, + TelehubPos: Vector3 + } = { + HasTelehub: false, + TelehubPos: Vector3.getZero() + }; + newObjTelehubBlock['HasTelehub'] = (buf.readUInt8(pos++) === 1); + newObjTelehubBlock['TelehubPos'] = new Vector3(buf, pos, false); + pos += 12; + this.TelehubBlock.push(newObjTelehubBlock); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/SimulatorReady.ts b/lib/classes/packets/SimulatorReady.ts index 7216b40..75e48f5 100644 --- a/lib/classes/packets/SimulatorReady.ts +++ b/lib/classes/packets/SimulatorReady.ts @@ -29,4 +29,68 @@ export class SimulatorReadyPacket implements Packet return (this.SimulatorBlock['SimName'].length + 1) + 42; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.write(this.SimulatorBlock['SimName'], pos); + pos += this.SimulatorBlock['SimName'].length; + buf.writeUInt8(this.SimulatorBlock['SimAccess'], pos++); + buf.writeUInt32LE(this.SimulatorBlock['RegionFlags'], pos); + pos += 4; + this.SimulatorBlock['RegionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.SimulatorBlock['EstateID'], pos); + pos += 4; + buf.writeUInt32LE(this.SimulatorBlock['ParentEstateID'], pos); + pos += 4; + buf.writeUInt8((this.TelehubBlock['HasTelehub']) ? 1 : 0, pos++); + this.TelehubBlock['TelehubPos'].writeToBuffer(buf, pos, false); + pos += 12; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjSimulatorBlock: { + SimName: string, + SimAccess: number, + RegionFlags: number, + RegionID: UUID, + EstateID: number, + ParentEstateID: number + } = { + SimName: '', + SimAccess: 0, + RegionFlags: 0, + RegionID: UUID.zero(), + EstateID: 0, + ParentEstateID: 0 + }; + newObjSimulatorBlock['SimName'] = buf.toString('utf8', pos, length); + pos += length; + newObjSimulatorBlock['SimAccess'] = buf.readUInt8(pos++); + newObjSimulatorBlock['RegionFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjSimulatorBlock['RegionID'] = new UUID(buf, pos); + pos += 16; + newObjSimulatorBlock['EstateID'] = buf.readUInt32LE(pos); + pos += 4; + newObjSimulatorBlock['ParentEstateID'] = buf.readUInt32LE(pos); + pos += 4; + this.SimulatorBlock = newObjSimulatorBlock; + const newObjTelehubBlock: { + HasTelehub: boolean, + TelehubPos: Vector3 + } = { + HasTelehub: false, + TelehubPos: Vector3.getZero() + }; + newObjTelehubBlock['HasTelehub'] = (buf.readUInt8(pos++) === 1); + newObjTelehubBlock['TelehubPos'] = new Vector3(buf, pos, false); + pos += 12; + this.TelehubBlock = newObjTelehubBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/SimulatorSetMap.ts b/lib/classes/packets/SimulatorSetMap.ts index 82986cc..1435c66 100644 --- a/lib/classes/packets/SimulatorSetMap.ts +++ b/lib/classes/packets/SimulatorSetMap.ts @@ -22,4 +22,40 @@ export class SimulatorSetMapPacket implements Packet return 28; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.MapData['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.MapData['RegionHandle'].high, pos); + pos += 4; + buf.writeInt32LE(this.MapData['Type'], pos); + pos += 4; + this.MapData['MapImage'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjMapData: { + RegionHandle: Long, + Type: number, + MapImage: UUID + } = { + RegionHandle: Long.ZERO, + Type: 0, + MapImage: UUID.zero() + }; + newObjMapData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjMapData['Type'] = buf.readInt32LE(pos); + pos += 4; + newObjMapData['MapImage'] = new UUID(buf, pos); + pos += 16; + this.MapData = newObjMapData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/SimulatorShutdownRequest.ts b/lib/classes/packets/SimulatorShutdownRequest.ts index 6e05658..4c5690c 100644 --- a/lib/classes/packets/SimulatorShutdownRequest.ts +++ b/lib/classes/packets/SimulatorShutdownRequest.ts @@ -15,4 +15,14 @@ export class SimulatorShutdownRequestPacket implements Packet return 0; } + writeToBuffer(buf: Buffer, pos: number): number + { + return 0; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + return 0; + } } + diff --git a/lib/classes/packets/SimulatorViewerTimeMessage.ts b/lib/classes/packets/SimulatorViewerTimeMessage.ts index 2987c51..2bea0dc 100644 --- a/lib/classes/packets/SimulatorViewerTimeMessage.ts +++ b/lib/classes/packets/SimulatorViewerTimeMessage.ts @@ -25,4 +25,58 @@ export class SimulatorViewerTimeMessagePacket implements Packet return 44; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.TimeInfo['UsecSinceStart'].low, pos); + pos += 4; + buf.writeInt32LE(this.TimeInfo['UsecSinceStart'].high, pos); + pos += 4; + buf.writeUInt32LE(this.TimeInfo['SecPerDay'], pos); + pos += 4; + buf.writeUInt32LE(this.TimeInfo['SecPerYear'], pos); + pos += 4; + this.TimeInfo['SunDirection'].writeToBuffer(buf, pos, false); + pos += 12; + buf.writeFloatLE(this.TimeInfo['SunPhase'], pos); + pos += 4; + this.TimeInfo['SunAngVelocity'].writeToBuffer(buf, pos, false); + pos += 12; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjTimeInfo: { + UsecSinceStart: Long, + SecPerDay: number, + SecPerYear: number, + SunDirection: Vector3, + SunPhase: number, + SunAngVelocity: Vector3 + } = { + UsecSinceStart: Long.ZERO, + SecPerDay: 0, + SecPerYear: 0, + SunDirection: Vector3.getZero(), + SunPhase: 0, + SunAngVelocity: Vector3.getZero() + }; + newObjTimeInfo['UsecSinceStart'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjTimeInfo['SecPerDay'] = buf.readUInt32LE(pos); + pos += 4; + newObjTimeInfo['SecPerYear'] = buf.readUInt32LE(pos); + pos += 4; + newObjTimeInfo['SunDirection'] = new Vector3(buf, pos, false); + pos += 12; + newObjTimeInfo['SunPhase'] = buf.readFloatLE(pos); + pos += 4; + newObjTimeInfo['SunAngVelocity'] = new Vector3(buf, pos, false); + pos += 12; + this.TimeInfo = newObjTimeInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/SoundTrigger.ts b/lib/classes/packets/SoundTrigger.ts index 846f68f..3801d01 100644 --- a/lib/classes/packets/SoundTrigger.ts +++ b/lib/classes/packets/SoundTrigger.ts @@ -27,4 +27,64 @@ export class SoundTriggerPacket implements Packet return 88; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.SoundData['SoundID'].writeToBuffer(buf, pos); + pos += 16; + this.SoundData['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + this.SoundData['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + this.SoundData['ParentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.SoundData['Handle'].low, pos); + pos += 4; + buf.writeInt32LE(this.SoundData['Handle'].high, pos); + pos += 4; + this.SoundData['Position'].writeToBuffer(buf, pos, false); + pos += 12; + buf.writeFloatLE(this.SoundData['Gain'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjSoundData: { + SoundID: UUID, + OwnerID: UUID, + ObjectID: UUID, + ParentID: UUID, + Handle: Long, + Position: Vector3, + Gain: number + } = { + SoundID: UUID.zero(), + OwnerID: UUID.zero(), + ObjectID: UUID.zero(), + ParentID: UUID.zero(), + Handle: Long.ZERO, + Position: Vector3.getZero(), + Gain: 0 + }; + newObjSoundData['SoundID'] = new UUID(buf, pos); + pos += 16; + newObjSoundData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjSoundData['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjSoundData['ParentID'] = new UUID(buf, pos); + pos += 16; + newObjSoundData['Handle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjSoundData['Position'] = new Vector3(buf, pos, false); + pos += 12; + newObjSoundData['Gain'] = buf.readFloatLE(pos); + pos += 4; + this.SoundData = newObjSoundData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/StartAuction.ts b/lib/classes/packets/StartAuction.ts index c22dc12..939d73b 100644 --- a/lib/classes/packets/StartAuction.ts +++ b/lib/classes/packets/StartAuction.ts @@ -24,4 +24,48 @@ export class StartAuctionPacket implements Packet return (this.ParcelData['Name'].length + 1) + 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.ParcelData['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + this.ParcelData['SnapshotID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.ParcelData['Name'], pos); + pos += this.ParcelData['Name'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjParcelData: { + ParcelID: UUID, + SnapshotID: UUID, + Name: string + } = { + ParcelID: UUID.zero(), + SnapshotID: UUID.zero(), + Name: '' + }; + newObjParcelData['ParcelID'] = new UUID(buf, pos); + pos += 16; + newObjParcelData['SnapshotID'] = new UUID(buf, pos); + pos += 16; + newObjParcelData['Name'] = buf.toString('utf8', pos, length); + pos += length; + this.ParcelData = newObjParcelData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/StartGroupProposal.ts b/lib/classes/packets/StartGroupProposal.ts index 9d68129..cd4698a 100644 --- a/lib/classes/packets/StartGroupProposal.ts +++ b/lib/classes/packets/StartGroupProposal.ts @@ -27,4 +27,66 @@ export class StartGroupProposalPacket implements Packet return (this.ProposalData['ProposalText'].length + 1) + 60; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.ProposalData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.ProposalData['Quorum'], pos); + pos += 4; + buf.writeFloatLE(this.ProposalData['Majority'], pos); + pos += 4; + buf.writeInt32LE(this.ProposalData['Duration'], pos); + pos += 4; + buf.write(this.ProposalData['ProposalText'], pos); + pos += this.ProposalData['ProposalText'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjProposalData: { + GroupID: UUID, + Quorum: number, + Majority: number, + Duration: number, + ProposalText: string + } = { + GroupID: UUID.zero(), + Quorum: 0, + Majority: 0, + Duration: 0, + ProposalText: '' + }; + newObjProposalData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjProposalData['Quorum'] = buf.readInt32LE(pos); + pos += 4; + newObjProposalData['Majority'] = buf.readFloatLE(pos); + pos += 4; + newObjProposalData['Duration'] = buf.readInt32LE(pos); + pos += 4; + newObjProposalData['ProposalText'] = buf.toString('utf8', pos, length); + pos += length; + this.ProposalData = newObjProposalData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/StartLure.ts b/lib/classes/packets/StartLure.ts index 89a05b0..e441b04 100644 --- a/lib/classes/packets/StartLure.ts +++ b/lib/classes/packets/StartLure.ts @@ -27,4 +27,66 @@ export class StartLurePacket implements Packet return (this.Info['Message'].length + 1) + ((16) * this.TargetData.length) + 34; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.Info['LureType'], pos++); + buf.write(this.Info['Message'], pos); + pos += this.Info['Message'].length; + const count = this.TargetData.length; + buf.writeUInt8(this.TargetData.length, pos++); + for (let i = 0; i < count; i++) + { + this.TargetData[i]['TargetID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjInfo: { + LureType: number, + Message: string + } = { + LureType: 0, + Message: '' + }; + newObjInfo['LureType'] = buf.readUInt8(pos++); + newObjInfo['Message'] = buf.toString('utf8', pos, length); + pos += length; + this.Info = newObjInfo; + const count = buf.readUInt8(pos++); + this.TargetData = []; + for (let i = 0; i < count; i++) + { + const newObjTargetData: { + TargetID: UUID + } = { + TargetID: UUID.zero() + }; + newObjTargetData['TargetID'] = new UUID(buf, pos); + pos += 16; + this.TargetData.push(newObjTargetData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/StartPingCheck.ts b/lib/classes/packets/StartPingCheck.ts index 6ac25f7..4b09aa8 100644 --- a/lib/classes/packets/StartPingCheck.ts +++ b/lib/classes/packets/StartPingCheck.ts @@ -19,4 +19,30 @@ export class StartPingCheckPacket implements Packet return 5; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt8(this.PingID['PingID'], pos++); + buf.writeUInt32LE(this.PingID['OldestUnacked'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjPingID: { + PingID: number, + OldestUnacked: number + } = { + PingID: 0, + OldestUnacked: 0 + }; + newObjPingID['PingID'] = buf.readUInt8(pos++); + newObjPingID['OldestUnacked'] = buf.readUInt32LE(pos); + pos += 4; + this.PingID = newObjPingID; + return pos - startPos; + } } + diff --git a/lib/classes/packets/StateSave.ts b/lib/classes/packets/StateSave.ts index a24aa25..90e6942 100644 --- a/lib/classes/packets/StateSave.ts +++ b/lib/classes/packets/StateSave.ts @@ -23,4 +23,42 @@ export class StateSavePacket implements Packet return (this.DataBlock['Filename'].length + 1) + 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.DataBlock['Filename'], pos); + pos += this.DataBlock['Filename'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjDataBlock: { + Filename: string + } = { + Filename: '' + }; + newObjDataBlock['Filename'] = buf.toString('utf8', pos, length); + pos += length; + this.DataBlock = newObjDataBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/SubscribeLoad.ts b/lib/classes/packets/SubscribeLoad.ts index 1358943..219dd1e 100644 --- a/lib/classes/packets/SubscribeLoad.ts +++ b/lib/classes/packets/SubscribeLoad.ts @@ -15,4 +15,14 @@ export class SubscribeLoadPacket implements Packet return 0; } + writeToBuffer(buf: Buffer, pos: number): number + { + return 0; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + return 0; + } } + diff --git a/lib/classes/packets/SystemKickUser.ts b/lib/classes/packets/SystemKickUser.ts index 9520cd0..f7711a3 100644 --- a/lib/classes/packets/SystemKickUser.ts +++ b/lib/classes/packets/SystemKickUser.ts @@ -19,4 +19,36 @@ export class SystemKickUserPacket implements Packet return ((16) * this.AgentInfo.length) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.AgentInfo.length; + buf.writeUInt8(this.AgentInfo.length, pos++); + for (let i = 0; i < count; i++) + { + this.AgentInfo[i]['AgentID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.AgentInfo = []; + for (let i = 0; i < count; i++) + { + const newObjAgentInfo: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentInfo['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentInfo.push(newObjAgentInfo); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/SystemMessage.ts b/lib/classes/packets/SystemMessage.ts index fafdeb2..485e6bb 100644 --- a/lib/classes/packets/SystemMessage.ts +++ b/lib/classes/packets/SystemMessage.ts @@ -34,4 +34,58 @@ export class SystemMessagePacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.write(this.MethodData['Method'], pos); + pos += this.MethodData['Method'].length; + this.MethodData['Invoice'].writeToBuffer(buf, pos); + pos += 16; + this.MethodData['Digest'].copy(buf, pos); + pos += 32; + const count = this.ParamList.length; + buf.writeUInt8(this.ParamList.length, pos++); + for (let i = 0; i < count; i++) + { + buf.write(this.ParamList[i]['Parameter'], pos); + pos += this.ParamList[i]['Parameter'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjMethodData: { + Method: string, + Invoice: UUID, + Digest: Buffer + } = { + Method: '', + Invoice: UUID.zero(), + Digest: Buffer.allocUnsafe(0) + }; + newObjMethodData['Method'] = buf.toString('utf8', pos, length); + pos += length; + newObjMethodData['Invoice'] = new UUID(buf, pos); + pos += 16; + newObjMethodData['Digest'] = buf.slice(pos, pos + 32); + pos += 32; + this.MethodData = newObjMethodData; + const count = buf.readUInt8(pos++); + this.ParamList = []; + for (let i = 0; i < count; i++) + { + const newObjParamList: { + Parameter: string + } = { + Parameter: '' + }; + newObjParamList['Parameter'] = buf.toString('utf8', pos, length); + pos += length; + this.ParamList.push(newObjParamList); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/TallyVotes.ts b/lib/classes/packets/TallyVotes.ts index 980b7e0..6f423fa 100644 --- a/lib/classes/packets/TallyVotes.ts +++ b/lib/classes/packets/TallyVotes.ts @@ -15,4 +15,14 @@ export class TallyVotesPacket implements Packet return 0; } + writeToBuffer(buf: Buffer, pos: number): number + { + return 0; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + return 0; + } } + diff --git a/lib/classes/packets/TelehubInfo.ts b/lib/classes/packets/TelehubInfo.ts index d6832a9..e37d601 100644 --- a/lib/classes/packets/TelehubInfo.ts +++ b/lib/classes/packets/TelehubInfo.ts @@ -27,4 +27,64 @@ export class TelehubInfoPacket implements Packet return (this.TelehubBlock['ObjectName'].length + 1) + ((12) * this.SpawnPointBlock.length) + 41; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.TelehubBlock['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.TelehubBlock['ObjectName'], pos); + pos += this.TelehubBlock['ObjectName'].length; + this.TelehubBlock['TelehubPos'].writeToBuffer(buf, pos, false); + pos += 12; + this.TelehubBlock['TelehubRot'].writeToBuffer(buf, pos); + pos += 12; + const count = this.SpawnPointBlock.length; + buf.writeUInt8(this.SpawnPointBlock.length, pos++); + for (let i = 0; i < count; i++) + { + this.SpawnPointBlock[i]['SpawnPointPos'].writeToBuffer(buf, pos, false); + pos += 12; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjTelehubBlock: { + ObjectID: UUID, + ObjectName: string, + TelehubPos: Vector3, + TelehubRot: Quaternion + } = { + ObjectID: UUID.zero(), + ObjectName: '', + TelehubPos: Vector3.getZero(), + TelehubRot: Quaternion.getIdentity() + }; + newObjTelehubBlock['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjTelehubBlock['ObjectName'] = buf.toString('utf8', pos, length); + pos += length; + newObjTelehubBlock['TelehubPos'] = new Vector3(buf, pos, false); + pos += 12; + newObjTelehubBlock['TelehubRot'] = new Quaternion(buf, pos); + pos += 12; + this.TelehubBlock = newObjTelehubBlock; + const count = buf.readUInt8(pos++); + this.SpawnPointBlock = []; + for (let i = 0; i < count; i++) + { + const newObjSpawnPointBlock: { + SpawnPointPos: Vector3 + } = { + SpawnPointPos: Vector3.getZero() + }; + newObjSpawnPointBlock['SpawnPointPos'] = new Vector3(buf, pos, false); + pos += 12; + this.SpawnPointBlock.push(newObjSpawnPointBlock); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/TeleportCancel.ts b/lib/classes/packets/TeleportCancel.ts index 44501e5..8880e98 100644 --- a/lib/classes/packets/TeleportCancel.ts +++ b/lib/classes/packets/TeleportCancel.ts @@ -20,4 +20,32 @@ export class TeleportCancelPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Info['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.Info['SessionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjInfo: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjInfo['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjInfo['SessionID'] = new UUID(buf, pos); + pos += 16; + this.Info = newObjInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/TeleportFailed.ts b/lib/classes/packets/TeleportFailed.ts index d355829..ed4e6d2 100644 --- a/lib/classes/packets/TeleportFailed.ts +++ b/lib/classes/packets/TeleportFailed.ts @@ -34,4 +34,58 @@ export class TeleportFailedPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Info['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.Info['Reason'], pos); + pos += this.Info['Reason'].length; + const count = this.AlertInfo.length; + buf.writeUInt8(this.AlertInfo.length, pos++); + for (let i = 0; i < count; i++) + { + buf.write(this.AlertInfo[i]['Message'], pos); + pos += this.AlertInfo[i]['Message'].length; + buf.write(this.AlertInfo[i]['ExtraParams'], pos); + pos += this.AlertInfo[i]['ExtraParams'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjInfo: { + AgentID: UUID, + Reason: string + } = { + AgentID: UUID.zero(), + Reason: '' + }; + newObjInfo['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjInfo['Reason'] = buf.toString('utf8', pos, length); + pos += length; + this.Info = newObjInfo; + const count = buf.readUInt8(pos++); + this.AlertInfo = []; + for (let i = 0; i < count; i++) + { + const newObjAlertInfo: { + Message: string, + ExtraParams: string + } = { + Message: '', + ExtraParams: '' + }; + newObjAlertInfo['Message'] = buf.toString('utf8', pos, length); + pos += length; + newObjAlertInfo['ExtraParams'] = buf.toString('utf8', pos, length); + pos += length; + this.AlertInfo.push(newObjAlertInfo); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/TeleportFinish.ts b/lib/classes/packets/TeleportFinish.ts index 7140e11..cfa47f9 100644 --- a/lib/classes/packets/TeleportFinish.ts +++ b/lib/classes/packets/TeleportFinish.ts @@ -28,4 +28,68 @@ export class TeleportFinishPacket implements Packet return (this.Info['SeedCapability'].length + 2) + 39; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Info['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.Info['LocationID'], pos); + pos += 4; + this.Info['SimIP'].writeToBuffer(buf, pos); + pos += 4; + buf.writeUInt16LE(this.Info['SimPort'], pos); + pos += 2; + buf.writeInt32LE(this.Info['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.Info['RegionHandle'].high, pos); + pos += 4; + buf.write(this.Info['SeedCapability'], pos); + pos += this.Info['SeedCapability'].length; + buf.writeUInt8(this.Info['SimAccess'], pos++); + buf.writeUInt32LE(this.Info['TeleportFlags'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjInfo: { + AgentID: UUID, + LocationID: number, + SimIP: IPAddress, + SimPort: number, + RegionHandle: Long, + SeedCapability: string, + SimAccess: number, + TeleportFlags: number + } = { + AgentID: UUID.zero(), + LocationID: 0, + SimIP: IPAddress.zero(), + SimPort: 0, + RegionHandle: Long.ZERO, + SeedCapability: '', + SimAccess: 0, + TeleportFlags: 0 + }; + newObjInfo['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjInfo['LocationID'] = buf.readUInt32LE(pos); + pos += 4; + newObjInfo['SimIP'] = new IPAddress(buf, pos); + pos += 4; + newObjInfo['SimPort'] = buf.readUInt16LE(pos); + pos += 2; + newObjInfo['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjInfo['SeedCapability'] = buf.toString('utf8', pos, length); + pos += length; + newObjInfo['SimAccess'] = buf.readUInt8(pos++); + newObjInfo['TeleportFlags'] = buf.readUInt32LE(pos); + pos += 4; + this.Info = newObjInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/TeleportLandingStatusChanged.ts b/lib/classes/packets/TeleportLandingStatusChanged.ts index 7d1911e..c3323e7 100644 --- a/lib/classes/packets/TeleportLandingStatusChanged.ts +++ b/lib/classes/packets/TeleportLandingStatusChanged.ts @@ -19,4 +19,28 @@ export class TeleportLandingStatusChangedPacket implements Packet return 8; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeInt32LE(this.RegionData['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.RegionData['RegionHandle'].high, pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjRegionData: { + RegionHandle: Long + } = { + RegionHandle: Long.ZERO + }; + newObjRegionData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + this.RegionData = newObjRegionData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/TeleportLandmarkRequest.ts b/lib/classes/packets/TeleportLandmarkRequest.ts index 825d908..803ff0e 100644 --- a/lib/classes/packets/TeleportLandmarkRequest.ts +++ b/lib/classes/packets/TeleportLandmarkRequest.ts @@ -21,4 +21,38 @@ export class TeleportLandmarkRequestPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Info['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.Info['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Info['LandmarkID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjInfo: { + AgentID: UUID, + SessionID: UUID, + LandmarkID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + LandmarkID: UUID.zero() + }; + newObjInfo['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjInfo['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjInfo['LandmarkID'] = new UUID(buf, pos); + pos += 16; + this.Info = newObjInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/TeleportLocal.ts b/lib/classes/packets/TeleportLocal.ts index 7041da3..2ea7f5d 100644 --- a/lib/classes/packets/TeleportLocal.ts +++ b/lib/classes/packets/TeleportLocal.ts @@ -24,4 +24,50 @@ export class TeleportLocalPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Info['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.Info['LocationID'], pos); + pos += 4; + this.Info['Position'].writeToBuffer(buf, pos, false); + pos += 12; + this.Info['LookAt'].writeToBuffer(buf, pos, false); + pos += 12; + buf.writeUInt32LE(this.Info['TeleportFlags'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjInfo: { + AgentID: UUID, + LocationID: number, + Position: Vector3, + LookAt: Vector3, + TeleportFlags: number + } = { + AgentID: UUID.zero(), + LocationID: 0, + Position: Vector3.getZero(), + LookAt: Vector3.getZero(), + TeleportFlags: 0 + }; + newObjInfo['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjInfo['LocationID'] = buf.readUInt32LE(pos); + pos += 4; + newObjInfo['Position'] = new Vector3(buf, pos, false); + pos += 12; + newObjInfo['LookAt'] = new Vector3(buf, pos, false); + pos += 12; + newObjInfo['TeleportFlags'] = buf.readUInt32LE(pos); + pos += 4; + this.Info = newObjInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/TeleportLocationRequest.ts b/lib/classes/packets/TeleportLocationRequest.ts index ae80054..5fdd066 100644 --- a/lib/classes/packets/TeleportLocationRequest.ts +++ b/lib/classes/packets/TeleportLocationRequest.ts @@ -27,4 +27,56 @@ export class TeleportLocationRequestPacket implements Packet return 64; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.Info['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.Info['RegionHandle'].high, pos); + pos += 4; + this.Info['Position'].writeToBuffer(buf, pos, false); + pos += 12; + this.Info['LookAt'].writeToBuffer(buf, pos, false); + pos += 12; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjInfo: { + RegionHandle: Long, + Position: Vector3, + LookAt: Vector3 + } = { + RegionHandle: Long.ZERO, + Position: Vector3.getZero(), + LookAt: Vector3.getZero() + }; + newObjInfo['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjInfo['Position'] = new Vector3(buf, pos, false); + pos += 12; + newObjInfo['LookAt'] = new Vector3(buf, pos, false); + pos += 12; + this.Info = newObjInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/TeleportLureRequest.ts b/lib/classes/packets/TeleportLureRequest.ts index bf674b1..f5c3ec5 100644 --- a/lib/classes/packets/TeleportLureRequest.ts +++ b/lib/classes/packets/TeleportLureRequest.ts @@ -22,4 +22,44 @@ export class TeleportLureRequestPacket implements Packet return 52; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.Info['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.Info['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Info['LureID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.Info['TeleportFlags'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjInfo: { + AgentID: UUID, + SessionID: UUID, + LureID: UUID, + TeleportFlags: number + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + LureID: UUID.zero(), + TeleportFlags: 0 + }; + newObjInfo['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjInfo['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjInfo['LureID'] = new UUID(buf, pos); + pos += 16; + newObjInfo['TeleportFlags'] = buf.readUInt32LE(pos); + pos += 4; + this.Info = newObjInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/TeleportProgress.ts b/lib/classes/packets/TeleportProgress.ts index 157c3ad..d0ed83d 100644 --- a/lib/classes/packets/TeleportProgress.ts +++ b/lib/classes/packets/TeleportProgress.ts @@ -23,4 +23,42 @@ export class TeleportProgressPacket implements Packet return (this.Info['Message'].length + 1) + 20; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.Info['TeleportFlags'], pos); + pos += 4; + buf.write(this.Info['Message'], pos); + pos += this.Info['Message'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjInfo: { + TeleportFlags: number, + Message: string + } = { + TeleportFlags: 0, + Message: '' + }; + newObjInfo['TeleportFlags'] = buf.readUInt32LE(pos); + pos += 4; + newObjInfo['Message'] = buf.toString('utf8', pos, length); + pos += length; + this.Info = newObjInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/TeleportRequest.ts b/lib/classes/packets/TeleportRequest.ts index c229955..eac009a 100644 --- a/lib/classes/packets/TeleportRequest.ts +++ b/lib/classes/packets/TeleportRequest.ts @@ -26,4 +26,54 @@ export class TeleportRequestPacket implements Packet return 72; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.Info['RegionID'].writeToBuffer(buf, pos); + pos += 16; + this.Info['Position'].writeToBuffer(buf, pos, false); + pos += 12; + this.Info['LookAt'].writeToBuffer(buf, pos, false); + pos += 12; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjInfo: { + RegionID: UUID, + Position: Vector3, + LookAt: Vector3 + } = { + RegionID: UUID.zero(), + Position: Vector3.getZero(), + LookAt: Vector3.getZero() + }; + newObjInfo['RegionID'] = new UUID(buf, pos); + pos += 16; + newObjInfo['Position'] = new Vector3(buf, pos, false); + pos += 12; + newObjInfo['LookAt'] = new Vector3(buf, pos, false); + pos += 12; + this.Info = newObjInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/TeleportStart.ts b/lib/classes/packets/TeleportStart.ts index b7713d5..599c09d 100644 --- a/lib/classes/packets/TeleportStart.ts +++ b/lib/classes/packets/TeleportStart.ts @@ -18,4 +18,26 @@ export class TeleportStartPacket implements Packet return 4; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt32LE(this.Info['TeleportFlags'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjInfo: { + TeleportFlags: number + } = { + TeleportFlags: 0 + }; + newObjInfo['TeleportFlags'] = buf.readUInt32LE(pos); + pos += 4; + this.Info = newObjInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/TerminateFriendship.ts b/lib/classes/packets/TerminateFriendship.ts index 5ed479b..f7c3641 100644 --- a/lib/classes/packets/TerminateFriendship.ts +++ b/lib/classes/packets/TerminateFriendship.ts @@ -23,4 +23,42 @@ export class TerminateFriendshipPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.ExBlock['OtherID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjExBlock: { + OtherID: UUID + } = { + OtherID: UUID.zero() + }; + newObjExBlock['OtherID'] = new UUID(buf, pos); + pos += 16; + this.ExBlock = newObjExBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/TestMessage.ts b/lib/classes/packets/TestMessage.ts index f0cd0f7..bcf71e3 100644 --- a/lib/classes/packets/TestMessage.ts +++ b/lib/classes/packets/TestMessage.ts @@ -23,4 +23,56 @@ export class TestMessagePacket implements Packet return 52; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt32LE(this.TestBlock1['Test1'], pos); + pos += 4; + const count = 4; + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.NeighborBlock[i]['Test0'], pos); + pos += 4; + buf.writeUInt32LE(this.NeighborBlock[i]['Test1'], pos); + pos += 4; + buf.writeUInt32LE(this.NeighborBlock[i]['Test2'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjTestBlock1: { + Test1: number + } = { + Test1: 0 + }; + newObjTestBlock1['Test1'] = buf.readUInt32LE(pos); + pos += 4; + this.TestBlock1 = newObjTestBlock1; + const count = 4; + this.NeighborBlock = []; for (let i = 0; i < count; i++) + { + const newObjNeighborBlock: { + Test0: number, + Test1: number, + Test2: number + } = { + Test0: 0, + Test1: 0, + Test2: 0 + }; + newObjNeighborBlock['Test0'] = buf.readUInt32LE(pos); + pos += 4; + newObjNeighborBlock['Test1'] = buf.readUInt32LE(pos); + pos += 4; + newObjNeighborBlock['Test2'] = buf.readUInt32LE(pos); + pos += 4; + this.NeighborBlock.push(newObjNeighborBlock); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/TrackAgent.ts b/lib/classes/packets/TrackAgent.ts index 4146908..9799182 100644 --- a/lib/classes/packets/TrackAgent.ts +++ b/lib/classes/packets/TrackAgent.ts @@ -23,4 +23,42 @@ export class TrackAgentPacket implements Packet return 48; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.TargetData['PreyID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjTargetData: { + PreyID: UUID + } = { + PreyID: UUID.zero() + }; + newObjTargetData['PreyID'] = new UUID(buf, pos); + pos += 16; + this.TargetData = newObjTargetData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/TransferAbort.ts b/lib/classes/packets/TransferAbort.ts index 38a3ee1..060727a 100644 --- a/lib/classes/packets/TransferAbort.ts +++ b/lib/classes/packets/TransferAbort.ts @@ -20,4 +20,32 @@ export class TransferAbortPacket implements Packet return 20; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.TransferInfo['TransferID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.TransferInfo['ChannelType'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjTransferInfo: { + TransferID: UUID, + ChannelType: number + } = { + TransferID: UUID.zero(), + ChannelType: 0 + }; + newObjTransferInfo['TransferID'] = new UUID(buf, pos); + pos += 16; + newObjTransferInfo['ChannelType'] = buf.readInt32LE(pos); + pos += 4; + this.TransferInfo = newObjTransferInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/TransferInfo.ts b/lib/classes/packets/TransferInfo.ts index bbe7331..90ea09d 100644 --- a/lib/classes/packets/TransferInfo.ts +++ b/lib/classes/packets/TransferInfo.ts @@ -24,4 +24,56 @@ export class TransferInfoPacket implements Packet return (this.TransferInfo['Params'].length + 2) + 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.TransferInfo['TransferID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.TransferInfo['ChannelType'], pos); + pos += 4; + buf.writeInt32LE(this.TransferInfo['TargetType'], pos); + pos += 4; + buf.writeInt32LE(this.TransferInfo['Status'], pos); + pos += 4; + buf.writeInt32LE(this.TransferInfo['Size'], pos); + pos += 4; + buf.write(this.TransferInfo['Params'], pos); + pos += this.TransferInfo['Params'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjTransferInfo: { + TransferID: UUID, + ChannelType: number, + TargetType: number, + Status: number, + Size: number, + Params: string + } = { + TransferID: UUID.zero(), + ChannelType: 0, + TargetType: 0, + Status: 0, + Size: 0, + Params: '' + }; + newObjTransferInfo['TransferID'] = new UUID(buf, pos); + pos += 16; + newObjTransferInfo['ChannelType'] = buf.readInt32LE(pos); + pos += 4; + newObjTransferInfo['TargetType'] = buf.readInt32LE(pos); + pos += 4; + newObjTransferInfo['Status'] = buf.readInt32LE(pos); + pos += 4; + newObjTransferInfo['Size'] = buf.readInt32LE(pos); + pos += 4; + newObjTransferInfo['Params'] = buf.toString('utf8', pos, length); + pos += length; + this.TransferInfo = newObjTransferInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/TransferInventory.ts b/lib/classes/packets/TransferInventory.ts index a303daf..2687774 100644 --- a/lib/classes/packets/TransferInventory.ts +++ b/lib/classes/packets/TransferInventory.ts @@ -29,4 +29,76 @@ export class TransferInventoryPacket implements Packet return ((17) * this.InventoryBlock.length) + 54; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.InfoBlock['SourceID'].writeToBuffer(buf, pos); + pos += 16; + this.InfoBlock['DestID'].writeToBuffer(buf, pos); + pos += 16; + this.InfoBlock['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.InventoryBlock.length; + buf.writeUInt8(this.InventoryBlock.length, pos++); + for (let i = 0; i < count; i++) + { + this.InventoryBlock[i]['InventoryID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt8(this.InventoryBlock[i]['Type'], pos++); + } + buf.writeUInt8((this.ValidationBlock['NeedsValidation']) ? 1 : 0, pos++); + buf.writeUInt32LE(this.ValidationBlock['EstateID'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjInfoBlock: { + SourceID: UUID, + DestID: UUID, + TransactionID: UUID + } = { + SourceID: UUID.zero(), + DestID: UUID.zero(), + TransactionID: UUID.zero() + }; + newObjInfoBlock['SourceID'] = new UUID(buf, pos); + pos += 16; + newObjInfoBlock['DestID'] = new UUID(buf, pos); + pos += 16; + newObjInfoBlock['TransactionID'] = new UUID(buf, pos); + pos += 16; + this.InfoBlock = newObjInfoBlock; + const count = buf.readUInt8(pos++); + this.InventoryBlock = []; + for (let i = 0; i < count; i++) + { + const newObjInventoryBlock: { + InventoryID: UUID, + Type: number + } = { + InventoryID: UUID.zero(), + Type: 0 + }; + newObjInventoryBlock['InventoryID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryBlock['Type'] = buf.readInt8(pos++); + this.InventoryBlock.push(newObjInventoryBlock); + } + const newObjValidationBlock: { + NeedsValidation: boolean, + EstateID: number + } = { + NeedsValidation: false, + EstateID: 0 + }; + newObjValidationBlock['NeedsValidation'] = (buf.readUInt8(pos++) === 1); + newObjValidationBlock['EstateID'] = buf.readUInt32LE(pos); + pos += 4; + this.ValidationBlock = newObjValidationBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/TransferInventoryAck.ts b/lib/classes/packets/TransferInventoryAck.ts index 47ceec0..e3f315c 100644 --- a/lib/classes/packets/TransferInventoryAck.ts +++ b/lib/classes/packets/TransferInventoryAck.ts @@ -20,4 +20,32 @@ export class TransferInventoryAckPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.InfoBlock['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + this.InfoBlock['InventoryID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjInfoBlock: { + TransactionID: UUID, + InventoryID: UUID + } = { + TransactionID: UUID.zero(), + InventoryID: UUID.zero() + }; + newObjInfoBlock['TransactionID'] = new UUID(buf, pos); + pos += 16; + newObjInfoBlock['InventoryID'] = new UUID(buf, pos); + pos += 16; + this.InfoBlock = newObjInfoBlock; + return pos - startPos; + } } + diff --git a/lib/classes/packets/TransferPacket.ts b/lib/classes/packets/TransferPacket.ts index 3ad51bc..e43c993 100644 --- a/lib/classes/packets/TransferPacket.ts +++ b/lib/classes/packets/TransferPacket.ts @@ -23,4 +23,50 @@ export class TransferPacketPacket implements Packet return (this.TransferData['Data'].length + 2) + 28; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.TransferData['TransferID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.TransferData['ChannelType'], pos); + pos += 4; + buf.writeInt32LE(this.TransferData['Packet'], pos); + pos += 4; + buf.writeInt32LE(this.TransferData['Status'], pos); + pos += 4; + buf.write(this.TransferData['Data'], pos); + pos += this.TransferData['Data'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjTransferData: { + TransferID: UUID, + ChannelType: number, + Packet: number, + Status: number, + Data: string + } = { + TransferID: UUID.zero(), + ChannelType: 0, + Packet: 0, + Status: 0, + Data: '' + }; + newObjTransferData['TransferID'] = new UUID(buf, pos); + pos += 16; + newObjTransferData['ChannelType'] = buf.readInt32LE(pos); + pos += 4; + newObjTransferData['Packet'] = buf.readInt32LE(pos); + pos += 4; + newObjTransferData['Status'] = buf.readInt32LE(pos); + pos += 4; + newObjTransferData['Data'] = buf.toString('utf8', pos, length); + pos += length; + this.TransferData = newObjTransferData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/TransferRequest.ts b/lib/classes/packets/TransferRequest.ts index 344cb45..a4ede26 100644 --- a/lib/classes/packets/TransferRequest.ts +++ b/lib/classes/packets/TransferRequest.ts @@ -23,4 +23,50 @@ export class TransferRequestPacket implements Packet return (this.TransferInfo['Params'].length + 2) + 28; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.TransferInfo['TransferID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.TransferInfo['ChannelType'], pos); + pos += 4; + buf.writeInt32LE(this.TransferInfo['SourceType'], pos); + pos += 4; + buf.writeFloatLE(this.TransferInfo['Priority'], pos); + pos += 4; + buf.write(this.TransferInfo['Params'], pos); + pos += this.TransferInfo['Params'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjTransferInfo: { + TransferID: UUID, + ChannelType: number, + SourceType: number, + Priority: number, + Params: string + } = { + TransferID: UUID.zero(), + ChannelType: 0, + SourceType: 0, + Priority: 0, + Params: '' + }; + newObjTransferInfo['TransferID'] = new UUID(buf, pos); + pos += 16; + newObjTransferInfo['ChannelType'] = buf.readInt32LE(pos); + pos += 4; + newObjTransferInfo['SourceType'] = buf.readInt32LE(pos); + pos += 4; + newObjTransferInfo['Priority'] = buf.readFloatLE(pos); + pos += 4; + newObjTransferInfo['Params'] = buf.toString('utf8', pos, length); + pos += length; + this.TransferInfo = newObjTransferInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/UUIDGroupNameReply.ts b/lib/classes/packets/UUIDGroupNameReply.ts index 93115d6..9edafc7 100644 --- a/lib/classes/packets/UUIDGroupNameReply.ts +++ b/lib/classes/packets/UUIDGroupNameReply.ts @@ -30,4 +30,42 @@ export class UUIDGroupNameReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.UUIDNameBlock.length; + buf.writeUInt8(this.UUIDNameBlock.length, pos++); + for (let i = 0; i < count; i++) + { + this.UUIDNameBlock[i]['ID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.UUIDNameBlock[i]['GroupName'], pos); + pos += this.UUIDNameBlock[i]['GroupName'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.UUIDNameBlock = []; + for (let i = 0; i < count; i++) + { + const newObjUUIDNameBlock: { + ID: UUID, + GroupName: string + } = { + ID: UUID.zero(), + GroupName: '' + }; + newObjUUIDNameBlock['ID'] = new UUID(buf, pos); + pos += 16; + newObjUUIDNameBlock['GroupName'] = buf.toString('utf8', pos, length); + pos += length; + this.UUIDNameBlock.push(newObjUUIDNameBlock); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/UUIDGroupNameRequest.ts b/lib/classes/packets/UUIDGroupNameRequest.ts index 48176ea..340b4db 100644 --- a/lib/classes/packets/UUIDGroupNameRequest.ts +++ b/lib/classes/packets/UUIDGroupNameRequest.ts @@ -19,4 +19,36 @@ export class UUIDGroupNameRequestPacket implements Packet return ((16) * this.UUIDNameBlock.length) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.UUIDNameBlock.length; + buf.writeUInt8(this.UUIDNameBlock.length, pos++); + for (let i = 0; i < count; i++) + { + this.UUIDNameBlock[i]['ID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.UUIDNameBlock = []; + for (let i = 0; i < count; i++) + { + const newObjUUIDNameBlock: { + ID: UUID + } = { + ID: UUID.zero() + }; + newObjUUIDNameBlock['ID'] = new UUID(buf, pos); + pos += 16; + this.UUIDNameBlock.push(newObjUUIDNameBlock); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/UUIDNameReply.ts b/lib/classes/packets/UUIDNameReply.ts index 3ce600a..e8b7caa 100644 --- a/lib/classes/packets/UUIDNameReply.ts +++ b/lib/classes/packets/UUIDNameReply.ts @@ -31,4 +31,48 @@ export class UUIDNameReplyPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.UUIDNameBlock.length; + buf.writeUInt8(this.UUIDNameBlock.length, pos++); + for (let i = 0; i < count; i++) + { + this.UUIDNameBlock[i]['ID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.UUIDNameBlock[i]['FirstName'], pos); + pos += this.UUIDNameBlock[i]['FirstName'].length; + buf.write(this.UUIDNameBlock[i]['LastName'], pos); + pos += this.UUIDNameBlock[i]['LastName'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.UUIDNameBlock = []; + for (let i = 0; i < count; i++) + { + const newObjUUIDNameBlock: { + ID: UUID, + FirstName: string, + LastName: string + } = { + ID: UUID.zero(), + FirstName: '', + LastName: '' + }; + newObjUUIDNameBlock['ID'] = new UUID(buf, pos); + pos += 16; + newObjUUIDNameBlock['FirstName'] = buf.toString('utf8', pos, length); + pos += length; + newObjUUIDNameBlock['LastName'] = buf.toString('utf8', pos, length); + pos += length; + this.UUIDNameBlock.push(newObjUUIDNameBlock); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/UUIDNameRequest.ts b/lib/classes/packets/UUIDNameRequest.ts index 3beacfa..166526d 100644 --- a/lib/classes/packets/UUIDNameRequest.ts +++ b/lib/classes/packets/UUIDNameRequest.ts @@ -19,4 +19,36 @@ export class UUIDNameRequestPacket implements Packet return ((16) * this.UUIDNameBlock.length) + 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = this.UUIDNameBlock.length; + buf.writeUInt8(this.UUIDNameBlock.length, pos++); + for (let i = 0; i < count; i++) + { + this.UUIDNameBlock[i]['ID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const count = buf.readUInt8(pos++); + this.UUIDNameBlock = []; + for (let i = 0; i < count; i++) + { + const newObjUUIDNameBlock: { + ID: UUID + } = { + ID: UUID.zero() + }; + newObjUUIDNameBlock['ID'] = new UUID(buf, pos); + pos += 16; + this.UUIDNameBlock.push(newObjUUIDNameBlock); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/Undo.ts b/lib/classes/packets/Undo.ts index 90712ba..7f22045 100644 --- a/lib/classes/packets/Undo.ts +++ b/lib/classes/packets/Undo.ts @@ -24,4 +24,58 @@ export class UndoPacket implements Packet return ((16) * this.ObjectData.length) + 49; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.ObjectData.length; + buf.writeUInt8(this.ObjectData.length, pos++); + for (let i = 0; i < count; i++) + { + this.ObjectData[i]['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + GroupID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + GroupID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['GroupID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.ObjectData = []; + for (let i = 0; i < count; i++) + { + const newObjObjectData: { + ObjectID: UUID + } = { + ObjectID: UUID.zero() + }; + newObjObjectData['ObjectID'] = new UUID(buf, pos); + pos += 16; + this.ObjectData.push(newObjObjectData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/UndoLand.ts b/lib/classes/packets/UndoLand.ts index a777e54..38f1408 100644 --- a/lib/classes/packets/UndoLand.ts +++ b/lib/classes/packets/UndoLand.ts @@ -20,4 +20,32 @@ export class UndoLandPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/UnsubscribeLoad.ts b/lib/classes/packets/UnsubscribeLoad.ts index 7f3a196..dc3c67c 100644 --- a/lib/classes/packets/UnsubscribeLoad.ts +++ b/lib/classes/packets/UnsubscribeLoad.ts @@ -15,4 +15,14 @@ export class UnsubscribeLoadPacket implements Packet return 0; } + writeToBuffer(buf: Buffer, pos: number): number + { + return 0; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + return 0; + } } + diff --git a/lib/classes/packets/UpdateAttachment.ts b/lib/classes/packets/UpdateAttachment.ts index 1b869cd..8080e74 100644 --- a/lib/classes/packets/UpdateAttachment.ts +++ b/lib/classes/packets/UpdateAttachment.ts @@ -50,4 +50,174 @@ export class UpdateAttachmentPacket implements Packet return (this.InventoryData['Name'].length + 1 + this.InventoryData['Description'].length + 1) + 171; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.AttachmentBlock['AttachmentPoint'], pos++); + buf.writeUInt8((this.OperationData['AddItem']) ? 1 : 0, pos++); + buf.writeUInt8((this.OperationData['UseExistingAsset']) ? 1 : 0, pos++); + this.InventoryData['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['FolderID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['CreatorID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.InventoryData['BaseMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData['OwnerMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData['GroupMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData['EveryoneMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData['NextOwnerMask'], pos); + pos += 4; + buf.writeUInt8((this.InventoryData['GroupOwned']) ? 1 : 0, pos++); + this.InventoryData['AssetID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt8(this.InventoryData['Type'], pos++); + buf.writeInt8(this.InventoryData['InvType'], pos++); + buf.writeUInt32LE(this.InventoryData['Flags'], pos); + pos += 4; + buf.writeUInt8(this.InventoryData['SaleType'], pos++); + buf.writeInt32LE(this.InventoryData['SalePrice'], pos); + pos += 4; + buf.write(this.InventoryData['Name'], pos); + pos += this.InventoryData['Name'].length; + buf.write(this.InventoryData['Description'], pos); + pos += this.InventoryData['Description'].length; + buf.writeInt32LE(this.InventoryData['CreationDate'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData['CRC'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjAttachmentBlock: { + AttachmentPoint: number + } = { + AttachmentPoint: 0 + }; + newObjAttachmentBlock['AttachmentPoint'] = buf.readUInt8(pos++); + this.AttachmentBlock = newObjAttachmentBlock; + const newObjOperationData: { + AddItem: boolean, + UseExistingAsset: boolean + } = { + AddItem: false, + UseExistingAsset: false + }; + newObjOperationData['AddItem'] = (buf.readUInt8(pos++) === 1); + newObjOperationData['UseExistingAsset'] = (buf.readUInt8(pos++) === 1); + this.OperationData = newObjOperationData; + const newObjInventoryData: { + ItemID: UUID, + FolderID: UUID, + CreatorID: UUID, + OwnerID: UUID, + GroupID: UUID, + BaseMask: number, + OwnerMask: number, + GroupMask: number, + EveryoneMask: number, + NextOwnerMask: number, + GroupOwned: boolean, + AssetID: UUID, + Type: number, + InvType: number, + Flags: number, + SaleType: number, + SalePrice: number, + Name: string, + Description: string, + CreationDate: number, + CRC: number + } = { + ItemID: UUID.zero(), + FolderID: UUID.zero(), + CreatorID: UUID.zero(), + OwnerID: UUID.zero(), + GroupID: UUID.zero(), + BaseMask: 0, + OwnerMask: 0, + GroupMask: 0, + EveryoneMask: 0, + NextOwnerMask: 0, + GroupOwned: false, + AssetID: UUID.zero(), + Type: 0, + InvType: 0, + Flags: 0, + SaleType: 0, + SalePrice: 0, + Name: '', + Description: '', + CreationDate: 0, + CRC: 0 + }; + newObjInventoryData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['CreatorID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['BaseMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['OwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['GroupMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['EveryoneMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['NextOwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['GroupOwned'] = (buf.readUInt8(pos++) === 1); + newObjInventoryData['AssetID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['Type'] = buf.readInt8(pos++); + newObjInventoryData['InvType'] = buf.readInt8(pos++); + newObjInventoryData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['SaleType'] = buf.readUInt8(pos++); + newObjInventoryData['SalePrice'] = buf.readInt32LE(pos); + pos += 4; + newObjInventoryData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjInventoryData['Description'] = buf.toString('utf8', pos, length); + pos += length; + newObjInventoryData['CreationDate'] = buf.readInt32LE(pos); + pos += 4; + newObjInventoryData['CRC'] = buf.readUInt32LE(pos); + pos += 4; + this.InventoryData = newObjInventoryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/UpdateCreateInventoryItem.ts b/lib/classes/packets/UpdateCreateInventoryItem.ts index db62fc3..64d3657 100644 --- a/lib/classes/packets/UpdateCreateInventoryItem.ts +++ b/lib/classes/packets/UpdateCreateInventoryItem.ts @@ -55,4 +55,174 @@ export class UpdateCreateInventoryItemPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.AgentData['SimApproved']) ? 1 : 0, pos++); + this.AgentData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.InventoryData.length; + buf.writeUInt8(this.InventoryData.length, pos++); + for (let i = 0; i < count; i++) + { + this.InventoryData[i]['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData[i]['FolderID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.InventoryData[i]['CallbackID'], pos); + pos += 4; + this.InventoryData[i]['CreatorID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData[i]['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData[i]['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.InventoryData[i]['BaseMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData[i]['OwnerMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData[i]['GroupMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData[i]['EveryoneMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData[i]['NextOwnerMask'], pos); + pos += 4; + buf.writeUInt8((this.InventoryData[i]['GroupOwned']) ? 1 : 0, pos++); + this.InventoryData[i]['AssetID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt8(this.InventoryData[i]['Type'], pos++); + buf.writeInt8(this.InventoryData[i]['InvType'], pos++); + buf.writeUInt32LE(this.InventoryData[i]['Flags'], pos); + pos += 4; + buf.writeUInt8(this.InventoryData[i]['SaleType'], pos++); + buf.writeInt32LE(this.InventoryData[i]['SalePrice'], pos); + pos += 4; + buf.write(this.InventoryData[i]['Name'], pos); + pos += this.InventoryData[i]['Name'].length; + buf.write(this.InventoryData[i]['Description'], pos); + pos += this.InventoryData[i]['Description'].length; + buf.writeInt32LE(this.InventoryData[i]['CreationDate'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData[i]['CRC'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SimApproved: boolean, + TransactionID: UUID + } = { + AgentID: UUID.zero(), + SimApproved: false, + TransactionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SimApproved'] = (buf.readUInt8(pos++) === 1); + newObjAgentData['TransactionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.InventoryData = []; + for (let i = 0; i < count; i++) + { + const newObjInventoryData: { + ItemID: UUID, + FolderID: UUID, + CallbackID: number, + CreatorID: UUID, + OwnerID: UUID, + GroupID: UUID, + BaseMask: number, + OwnerMask: number, + GroupMask: number, + EveryoneMask: number, + NextOwnerMask: number, + GroupOwned: boolean, + AssetID: UUID, + Type: number, + InvType: number, + Flags: number, + SaleType: number, + SalePrice: number, + Name: string, + Description: string, + CreationDate: number, + CRC: number + } = { + ItemID: UUID.zero(), + FolderID: UUID.zero(), + CallbackID: 0, + CreatorID: UUID.zero(), + OwnerID: UUID.zero(), + GroupID: UUID.zero(), + BaseMask: 0, + OwnerMask: 0, + GroupMask: 0, + EveryoneMask: 0, + NextOwnerMask: 0, + GroupOwned: false, + AssetID: UUID.zero(), + Type: 0, + InvType: 0, + Flags: 0, + SaleType: 0, + SalePrice: 0, + Name: '', + Description: '', + CreationDate: 0, + CRC: 0 + }; + newObjInventoryData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['CallbackID'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['CreatorID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['BaseMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['OwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['GroupMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['EveryoneMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['NextOwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['GroupOwned'] = (buf.readUInt8(pos++) === 1); + newObjInventoryData['AssetID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['Type'] = buf.readInt8(pos++); + newObjInventoryData['InvType'] = buf.readInt8(pos++); + newObjInventoryData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['SaleType'] = buf.readUInt8(pos++); + newObjInventoryData['SalePrice'] = buf.readInt32LE(pos); + pos += 4; + newObjInventoryData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjInventoryData['Description'] = buf.toString('utf8', pos, length); + pos += length; + newObjInventoryData['CreationDate'] = buf.readInt32LE(pos); + pos += 4; + newObjInventoryData['CRC'] = buf.readUInt32LE(pos); + pos += 4; + this.InventoryData.push(newObjInventoryData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/UpdateGroupInfo.ts b/lib/classes/packets/UpdateGroupInfo.ts index e6fe13d..9a75af6 100644 --- a/lib/classes/packets/UpdateGroupInfo.ts +++ b/lib/classes/packets/UpdateGroupInfo.ts @@ -30,4 +30,76 @@ export class UpdateGroupInfoPacket implements Packet return (this.GroupData['Charter'].length + 2) + 72; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.GroupData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.GroupData['Charter'], pos); + pos += this.GroupData['Charter'].length; + buf.writeUInt8((this.GroupData['ShowInList']) ? 1 : 0, pos++); + this.GroupData['InsigniaID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.GroupData['MembershipFee'], pos); + pos += 4; + buf.writeUInt8((this.GroupData['OpenEnrollment']) ? 1 : 0, pos++); + buf.writeUInt8((this.GroupData['AllowPublish']) ? 1 : 0, pos++); + buf.writeUInt8((this.GroupData['MaturePublish']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjGroupData: { + GroupID: UUID, + Charter: string, + ShowInList: boolean, + InsigniaID: UUID, + MembershipFee: number, + OpenEnrollment: boolean, + AllowPublish: boolean, + MaturePublish: boolean + } = { + GroupID: UUID.zero(), + Charter: '', + ShowInList: false, + InsigniaID: UUID.zero(), + MembershipFee: 0, + OpenEnrollment: false, + AllowPublish: false, + MaturePublish: false + }; + newObjGroupData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['Charter'] = buf.toString('utf8', pos, length); + pos += length; + newObjGroupData['ShowInList'] = (buf.readUInt8(pos++) === 1); + newObjGroupData['InsigniaID'] = new UUID(buf, pos); + pos += 16; + newObjGroupData['MembershipFee'] = buf.readInt32LE(pos); + pos += 4; + newObjGroupData['OpenEnrollment'] = (buf.readUInt8(pos++) === 1); + newObjGroupData['AllowPublish'] = (buf.readUInt8(pos++) === 1); + newObjGroupData['MaturePublish'] = (buf.readUInt8(pos++) === 1); + this.GroupData = newObjGroupData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/UpdateInventoryFolder.ts b/lib/classes/packets/UpdateInventoryFolder.ts index 05aae61..0839cb8 100644 --- a/lib/classes/packets/UpdateInventoryFolder.ts +++ b/lib/classes/packets/UpdateInventoryFolder.ts @@ -36,4 +36,68 @@ export class UpdateInventoryFolderPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.FolderData.length; + buf.writeUInt8(this.FolderData.length, pos++); + for (let i = 0; i < count; i++) + { + this.FolderData[i]['FolderID'].writeToBuffer(buf, pos); + pos += 16; + this.FolderData[i]['ParentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt8(this.FolderData[i]['Type'], pos++); + buf.write(this.FolderData[i]['Name'], pos); + pos += this.FolderData[i]['Name'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.FolderData = []; + for (let i = 0; i < count; i++) + { + const newObjFolderData: { + FolderID: UUID, + ParentID: UUID, + Type: number, + Name: string + } = { + FolderID: UUID.zero(), + ParentID: UUID.zero(), + Type: 0, + Name: '' + }; + newObjFolderData['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjFolderData['ParentID'] = new UUID(buf, pos); + pos += 16; + newObjFolderData['Type'] = buf.readInt8(pos++); + newObjFolderData['Name'] = buf.toString('utf8', pos, length); + pos += length; + this.FolderData.push(newObjFolderData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/UpdateInventoryItem.ts b/lib/classes/packets/UpdateInventoryItem.ts index 8c8a62b..d78821a 100644 --- a/lib/classes/packets/UpdateInventoryItem.ts +++ b/lib/classes/packets/UpdateInventoryItem.ts @@ -55,4 +55,176 @@ export class UpdateInventoryItemPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.InventoryData.length; + buf.writeUInt8(this.InventoryData.length, pos++); + for (let i = 0; i < count; i++) + { + this.InventoryData[i]['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData[i]['FolderID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.InventoryData[i]['CallbackID'], pos); + pos += 4; + this.InventoryData[i]['CreatorID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData[i]['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData[i]['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.InventoryData[i]['BaseMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData[i]['OwnerMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData[i]['GroupMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData[i]['EveryoneMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData[i]['NextOwnerMask'], pos); + pos += 4; + buf.writeUInt8((this.InventoryData[i]['GroupOwned']) ? 1 : 0, pos++); + this.InventoryData[i]['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt8(this.InventoryData[i]['Type'], pos++); + buf.writeInt8(this.InventoryData[i]['InvType'], pos++); + buf.writeUInt32LE(this.InventoryData[i]['Flags'], pos); + pos += 4; + buf.writeUInt8(this.InventoryData[i]['SaleType'], pos++); + buf.writeInt32LE(this.InventoryData[i]['SalePrice'], pos); + pos += 4; + buf.write(this.InventoryData[i]['Name'], pos); + pos += this.InventoryData[i]['Name'].length; + buf.write(this.InventoryData[i]['Description'], pos); + pos += this.InventoryData[i]['Description'].length; + buf.writeInt32LE(this.InventoryData[i]['CreationDate'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData[i]['CRC'], pos); + pos += 4; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + TransactionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + TransactionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['TransactionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.InventoryData = []; + for (let i = 0; i < count; i++) + { + const newObjInventoryData: { + ItemID: UUID, + FolderID: UUID, + CallbackID: number, + CreatorID: UUID, + OwnerID: UUID, + GroupID: UUID, + BaseMask: number, + OwnerMask: number, + GroupMask: number, + EveryoneMask: number, + NextOwnerMask: number, + GroupOwned: boolean, + TransactionID: UUID, + Type: number, + InvType: number, + Flags: number, + SaleType: number, + SalePrice: number, + Name: string, + Description: string, + CreationDate: number, + CRC: number + } = { + ItemID: UUID.zero(), + FolderID: UUID.zero(), + CallbackID: 0, + CreatorID: UUID.zero(), + OwnerID: UUID.zero(), + GroupID: UUID.zero(), + BaseMask: 0, + OwnerMask: 0, + GroupMask: 0, + EveryoneMask: 0, + NextOwnerMask: 0, + GroupOwned: false, + TransactionID: UUID.zero(), + Type: 0, + InvType: 0, + Flags: 0, + SaleType: 0, + SalePrice: 0, + Name: '', + Description: '', + CreationDate: 0, + CRC: 0 + }; + newObjInventoryData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['CallbackID'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['CreatorID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['BaseMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['OwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['GroupMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['EveryoneMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['NextOwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['GroupOwned'] = (buf.readUInt8(pos++) === 1); + newObjInventoryData['TransactionID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['Type'] = buf.readInt8(pos++); + newObjInventoryData['InvType'] = buf.readInt8(pos++); + newObjInventoryData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['SaleType'] = buf.readUInt8(pos++); + newObjInventoryData['SalePrice'] = buf.readInt32LE(pos); + pos += 4; + newObjInventoryData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjInventoryData['Description'] = buf.toString('utf8', pos, length); + pos += length; + newObjInventoryData['CreationDate'] = buf.readInt32LE(pos); + pos += 4; + newObjInventoryData['CRC'] = buf.readUInt32LE(pos); + pos += 4; + this.InventoryData.push(newObjInventoryData); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/UpdateMuteListEntry.ts b/lib/classes/packets/UpdateMuteListEntry.ts index ec0fcd5..98b77f8 100644 --- a/lib/classes/packets/UpdateMuteListEntry.ts +++ b/lib/classes/packets/UpdateMuteListEntry.ts @@ -26,4 +26,60 @@ export class UpdateMuteListEntryPacket implements Packet return (this.MuteData['MuteName'].length + 1) + 56; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.MuteData['MuteID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.MuteData['MuteName'], pos); + pos += this.MuteData['MuteName'].length; + buf.writeInt32LE(this.MuteData['MuteType'], pos); + pos += 4; + buf.writeUInt32LE(this.MuteData['MuteFlags'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjMuteData: { + MuteID: UUID, + MuteName: string, + MuteType: number, + MuteFlags: number + } = { + MuteID: UUID.zero(), + MuteName: '', + MuteType: 0, + MuteFlags: 0 + }; + newObjMuteData['MuteID'] = new UUID(buf, pos); + pos += 16; + newObjMuteData['MuteName'] = buf.toString('utf8', pos, length); + pos += length; + newObjMuteData['MuteType'] = buf.readInt32LE(pos); + pos += 4; + newObjMuteData['MuteFlags'] = buf.readUInt32LE(pos); + pos += 4; + this.MuteData = newObjMuteData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/UpdateParcel.ts b/lib/classes/packets/UpdateParcel.ts index c7e638c..28a749e 100644 --- a/lib/classes/packets/UpdateParcel.ts +++ b/lib/classes/packets/UpdateParcel.ts @@ -41,4 +41,134 @@ export class UpdateParcelPacket implements Packet return (this.ParcelData['Name'].length + 1 + this.ParcelData['Description'].length + 1 + this.ParcelData['MusicURL'].length + 1) + 111; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.ParcelData['ParcelID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.ParcelData['RegionHandle'].low, pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['RegionHandle'].high, pos); + pos += 4; + this.ParcelData['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.ParcelData['GroupOwned']) ? 1 : 0, pos++); + buf.writeUInt8(this.ParcelData['Status'], pos++); + buf.write(this.ParcelData['Name'], pos); + pos += this.ParcelData['Name'].length; + buf.write(this.ParcelData['Description'], pos); + pos += this.ParcelData['Description'].length; + buf.write(this.ParcelData['MusicURL'], pos); + pos += this.ParcelData['MusicURL'].length; + buf.writeFloatLE(this.ParcelData['RegionX'], pos); + pos += 4; + buf.writeFloatLE(this.ParcelData['RegionY'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['ActualArea'], pos); + pos += 4; + buf.writeInt32LE(this.ParcelData['BillableArea'], pos); + pos += 4; + buf.writeUInt8((this.ParcelData['ShowDir']) ? 1 : 0, pos++); + buf.writeUInt8((this.ParcelData['IsForSale']) ? 1 : 0, pos++); + buf.writeUInt8(this.ParcelData['Category'], pos++); + this.ParcelData['SnapshotID'].writeToBuffer(buf, pos); + pos += 16; + this.ParcelData['UserLocation'].writeToBuffer(buf, pos, false); + pos += 12; + buf.writeInt32LE(this.ParcelData['SalePrice'], pos); + pos += 4; + this.ParcelData['AuthorizedBuyerID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.ParcelData['AllowPublish']) ? 1 : 0, pos++); + buf.writeUInt8((this.ParcelData['MaturePublish']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjParcelData: { + ParcelID: UUID, + RegionHandle: Long, + OwnerID: UUID, + GroupOwned: boolean, + Status: number, + Name: string, + Description: string, + MusicURL: string, + RegionX: number, + RegionY: number, + ActualArea: number, + BillableArea: number, + ShowDir: boolean, + IsForSale: boolean, + Category: number, + SnapshotID: UUID, + UserLocation: Vector3, + SalePrice: number, + AuthorizedBuyerID: UUID, + AllowPublish: boolean, + MaturePublish: boolean + } = { + ParcelID: UUID.zero(), + RegionHandle: Long.ZERO, + OwnerID: UUID.zero(), + GroupOwned: false, + Status: 0, + Name: '', + Description: '', + MusicURL: '', + RegionX: 0, + RegionY: 0, + ActualArea: 0, + BillableArea: 0, + ShowDir: false, + IsForSale: false, + Category: 0, + SnapshotID: UUID.zero(), + UserLocation: Vector3.getZero(), + SalePrice: 0, + AuthorizedBuyerID: UUID.zero(), + AllowPublish: false, + MaturePublish: false + }; + newObjParcelData['ParcelID'] = new UUID(buf, pos); + pos += 16; + newObjParcelData['RegionHandle'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4)); + pos += 8; + newObjParcelData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjParcelData['GroupOwned'] = (buf.readUInt8(pos++) === 1); + newObjParcelData['Status'] = buf.readUInt8(pos++); + newObjParcelData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjParcelData['Description'] = buf.toString('utf8', pos, length); + pos += length; + newObjParcelData['MusicURL'] = buf.toString('utf8', pos, length); + pos += length; + newObjParcelData['RegionX'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['RegionY'] = buf.readFloatLE(pos); + pos += 4; + newObjParcelData['ActualArea'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['BillableArea'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['ShowDir'] = (buf.readUInt8(pos++) === 1); + newObjParcelData['IsForSale'] = (buf.readUInt8(pos++) === 1); + newObjParcelData['Category'] = buf.readUInt8(pos++); + newObjParcelData['SnapshotID'] = new UUID(buf, pos); + pos += 16; + newObjParcelData['UserLocation'] = new Vector3(buf, pos, false); + pos += 12; + newObjParcelData['SalePrice'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['AuthorizedBuyerID'] = new UUID(buf, pos); + pos += 16; + newObjParcelData['AllowPublish'] = (buf.readUInt8(pos++) === 1); + newObjParcelData['MaturePublish'] = (buf.readUInt8(pos++) === 1); + this.ParcelData = newObjParcelData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/UpdateSimulator.ts b/lib/classes/packets/UpdateSimulator.ts index daaba32..ad698e8 100644 --- a/lib/classes/packets/UpdateSimulator.ts +++ b/lib/classes/packets/UpdateSimulator.ts @@ -22,4 +22,42 @@ export class UpdateSimulatorPacket implements Packet return (this.SimulatorInfo['SimName'].length + 1) + 21; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.SimulatorInfo['RegionID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.SimulatorInfo['SimName'], pos); + pos += this.SimulatorInfo['SimName'].length; + buf.writeUInt32LE(this.SimulatorInfo['EstateID'], pos); + pos += 4; + buf.writeUInt8(this.SimulatorInfo['SimAccess'], pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjSimulatorInfo: { + RegionID: UUID, + SimName: string, + EstateID: number, + SimAccess: number + } = { + RegionID: UUID.zero(), + SimName: '', + EstateID: 0, + SimAccess: 0 + }; + newObjSimulatorInfo['RegionID'] = new UUID(buf, pos); + pos += 16; + newObjSimulatorInfo['SimName'] = buf.toString('utf8', pos, length); + pos += length; + newObjSimulatorInfo['EstateID'] = buf.readUInt32LE(pos); + pos += 4; + newObjSimulatorInfo['SimAccess'] = buf.readUInt8(pos++); + this.SimulatorInfo = newObjSimulatorInfo; + return pos - startPos; + } } + diff --git a/lib/classes/packets/UpdateTaskInventory.ts b/lib/classes/packets/UpdateTaskInventory.ts index f294b44..edf8040 100644 --- a/lib/classes/packets/UpdateTaskInventory.ts +++ b/lib/classes/packets/UpdateTaskInventory.ts @@ -47,4 +47,168 @@ export class UpdateTaskInventoryPacket implements Packet return (this.InventoryData['Name'].length + 1 + this.InventoryData['Description'].length + 1) + 173; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.UpdateData['LocalID'], pos); + pos += 4; + buf.writeUInt8(this.UpdateData['Key'], pos++); + this.InventoryData['ItemID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['FolderID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['CreatorID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + this.InventoryData['GroupID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt32LE(this.InventoryData['BaseMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData['OwnerMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData['GroupMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData['EveryoneMask'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData['NextOwnerMask'], pos); + pos += 4; + buf.writeUInt8((this.InventoryData['GroupOwned']) ? 1 : 0, pos++); + this.InventoryData['TransactionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt8(this.InventoryData['Type'], pos++); + buf.writeInt8(this.InventoryData['InvType'], pos++); + buf.writeUInt32LE(this.InventoryData['Flags'], pos); + pos += 4; + buf.writeUInt8(this.InventoryData['SaleType'], pos++); + buf.writeInt32LE(this.InventoryData['SalePrice'], pos); + pos += 4; + buf.write(this.InventoryData['Name'], pos); + pos += this.InventoryData['Name'].length; + buf.write(this.InventoryData['Description'], pos); + pos += this.InventoryData['Description'].length; + buf.writeInt32LE(this.InventoryData['CreationDate'], pos); + pos += 4; + buf.writeUInt32LE(this.InventoryData['CRC'], pos); + pos += 4; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjUpdateData: { + LocalID: number, + Key: number + } = { + LocalID: 0, + Key: 0 + }; + newObjUpdateData['LocalID'] = buf.readUInt32LE(pos); + pos += 4; + newObjUpdateData['Key'] = buf.readUInt8(pos++); + this.UpdateData = newObjUpdateData; + const newObjInventoryData: { + ItemID: UUID, + FolderID: UUID, + CreatorID: UUID, + OwnerID: UUID, + GroupID: UUID, + BaseMask: number, + OwnerMask: number, + GroupMask: number, + EveryoneMask: number, + NextOwnerMask: number, + GroupOwned: boolean, + TransactionID: UUID, + Type: number, + InvType: number, + Flags: number, + SaleType: number, + SalePrice: number, + Name: string, + Description: string, + CreationDate: number, + CRC: number + } = { + ItemID: UUID.zero(), + FolderID: UUID.zero(), + CreatorID: UUID.zero(), + OwnerID: UUID.zero(), + GroupID: UUID.zero(), + BaseMask: 0, + OwnerMask: 0, + GroupMask: 0, + EveryoneMask: 0, + NextOwnerMask: 0, + GroupOwned: false, + TransactionID: UUID.zero(), + Type: 0, + InvType: 0, + Flags: 0, + SaleType: 0, + SalePrice: 0, + Name: '', + Description: '', + CreationDate: 0, + CRC: 0 + }; + newObjInventoryData['ItemID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['FolderID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['CreatorID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['GroupID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['BaseMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['OwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['GroupMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['EveryoneMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['NextOwnerMask'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['GroupOwned'] = (buf.readUInt8(pos++) === 1); + newObjInventoryData['TransactionID'] = new UUID(buf, pos); + pos += 16; + newObjInventoryData['Type'] = buf.readInt8(pos++); + newObjInventoryData['InvType'] = buf.readInt8(pos++); + newObjInventoryData['Flags'] = buf.readUInt32LE(pos); + pos += 4; + newObjInventoryData['SaleType'] = buf.readUInt8(pos++); + newObjInventoryData['SalePrice'] = buf.readInt32LE(pos); + pos += 4; + newObjInventoryData['Name'] = buf.toString('utf8', pos, length); + pos += length; + newObjInventoryData['Description'] = buf.toString('utf8', pos, length); + pos += length; + newObjInventoryData['CreationDate'] = buf.readInt32LE(pos); + pos += 4; + newObjInventoryData['CRC'] = buf.readUInt32LE(pos); + pos += 4; + this.InventoryData = newObjInventoryData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/UpdateUserInfo.ts b/lib/classes/packets/UpdateUserInfo.ts index 382f7c6..d8431cc 100644 --- a/lib/classes/packets/UpdateUserInfo.ts +++ b/lib/classes/packets/UpdateUserInfo.ts @@ -24,4 +24,46 @@ export class UpdateUserInfoPacket implements Packet return (this.UserData['DirectoryVisibility'].length + 1) + 33; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.UserData['IMViaEMail']) ? 1 : 0, pos++); + buf.write(this.UserData['DirectoryVisibility'], pos); + pos += this.UserData['DirectoryVisibility'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjUserData: { + IMViaEMail: boolean, + DirectoryVisibility: string + } = { + IMViaEMail: false, + DirectoryVisibility: '' + }; + newObjUserData['IMViaEMail'] = (buf.readUInt8(pos++) === 1); + newObjUserData['DirectoryVisibility'] = buf.toString('utf8', pos, length); + pos += length; + this.UserData = newObjUserData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/UseCachedMuteList.ts b/lib/classes/packets/UseCachedMuteList.ts index a895828..ac5c5de 100644 --- a/lib/classes/packets/UseCachedMuteList.ts +++ b/lib/classes/packets/UseCachedMuteList.ts @@ -19,4 +19,26 @@ export class UseCachedMuteListPacket implements Packet return 16; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/UseCircuitCode.ts b/lib/classes/packets/UseCircuitCode.ts index 785da0f..cc45cba 100644 --- a/lib/classes/packets/UseCircuitCode.ts +++ b/lib/classes/packets/UseCircuitCode.ts @@ -21,4 +21,38 @@ export class UseCircuitCodePacket implements Packet return 36; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt32LE(this.CircuitCode['Code'], pos); + pos += 4; + this.CircuitCode['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.CircuitCode['ID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjCircuitCode: { + Code: number, + SessionID: UUID, + ID: UUID + } = { + Code: 0, + SessionID: UUID.zero(), + ID: UUID.zero() + }; + newObjCircuitCode['Code'] = buf.readUInt32LE(pos); + pos += 4; + newObjCircuitCode['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjCircuitCode['ID'] = new UUID(buf, pos); + pos += 16; + this.CircuitCode = newObjCircuitCode; + return pos - startPos; + } } + diff --git a/lib/classes/packets/UserInfoReply.ts b/lib/classes/packets/UserInfoReply.ts index f6032b6..924f63d 100644 --- a/lib/classes/packets/UserInfoReply.ts +++ b/lib/classes/packets/UserInfoReply.ts @@ -24,4 +24,46 @@ export class UserInfoReplyPacket implements Packet return (this.UserData['DirectoryVisibility'].length + 1 + this.UserData['EMail'].length + 2) + 17; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8((this.UserData['IMViaEMail']) ? 1 : 0, pos++); + buf.write(this.UserData['DirectoryVisibility'], pos); + pos += this.UserData['DirectoryVisibility'].length; + buf.write(this.UserData['EMail'], pos); + pos += this.UserData['EMail'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID + } = { + AgentID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjUserData: { + IMViaEMail: boolean, + DirectoryVisibility: string, + EMail: string + } = { + IMViaEMail: false, + DirectoryVisibility: '', + EMail: '' + }; + newObjUserData['IMViaEMail'] = (buf.readUInt8(pos++) === 1); + newObjUserData['DirectoryVisibility'] = buf.toString('utf8', pos, length); + pos += length; + newObjUserData['EMail'] = buf.toString('utf8', pos, length); + pos += length; + this.UserData = newObjUserData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/UserInfoRequest.ts b/lib/classes/packets/UserInfoRequest.ts index dcf1f7c..f8d0b0e 100644 --- a/lib/classes/packets/UserInfoRequest.ts +++ b/lib/classes/packets/UserInfoRequest.ts @@ -20,4 +20,32 @@ export class UserInfoRequestPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/UserReport.ts b/lib/classes/packets/UserReport.ts index 333de39..51c4c75 100644 --- a/lib/classes/packets/UserReport.ts +++ b/lib/classes/packets/UserReport.ts @@ -35,4 +35,102 @@ export class UserReportPacket implements Packet return (this.ReportData['AbuseRegionName'].length + 1 + this.ReportData['Summary'].length + 1 + this.ReportData['Details'].length + 2 + this.ReportData['VersionString'].length + 1) + 111; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.ReportData['ReportType'], pos++); + buf.writeUInt8(this.ReportData['Category'], pos++); + this.ReportData['Position'].writeToBuffer(buf, pos, false); + pos += 12; + buf.writeUInt8(this.ReportData['CheckFlags'], pos++); + this.ReportData['ScreenshotID'].writeToBuffer(buf, pos); + pos += 16; + this.ReportData['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + this.ReportData['AbuserID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.ReportData['AbuseRegionName'], pos); + pos += this.ReportData['AbuseRegionName'].length; + this.ReportData['AbuseRegionID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.ReportData['Summary'], pos); + pos += this.ReportData['Summary'].length; + buf.write(this.ReportData['Details'], pos); + pos += this.ReportData['Details'].length; + buf.write(this.ReportData['VersionString'], pos); + pos += this.ReportData['VersionString'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjReportData: { + ReportType: number, + Category: number, + Position: Vector3, + CheckFlags: number, + ScreenshotID: UUID, + ObjectID: UUID, + AbuserID: UUID, + AbuseRegionName: string, + AbuseRegionID: UUID, + Summary: string, + Details: string, + VersionString: string + } = { + ReportType: 0, + Category: 0, + Position: Vector3.getZero(), + CheckFlags: 0, + ScreenshotID: UUID.zero(), + ObjectID: UUID.zero(), + AbuserID: UUID.zero(), + AbuseRegionName: '', + AbuseRegionID: UUID.zero(), + Summary: '', + Details: '', + VersionString: '' + }; + newObjReportData['ReportType'] = buf.readUInt8(pos++); + newObjReportData['Category'] = buf.readUInt8(pos++); + newObjReportData['Position'] = new Vector3(buf, pos, false); + pos += 12; + newObjReportData['CheckFlags'] = buf.readUInt8(pos++); + newObjReportData['ScreenshotID'] = new UUID(buf, pos); + pos += 16; + newObjReportData['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjReportData['AbuserID'] = new UUID(buf, pos); + pos += 16; + newObjReportData['AbuseRegionName'] = buf.toString('utf8', pos, length); + pos += length; + newObjReportData['AbuseRegionID'] = new UUID(buf, pos); + pos += 16; + newObjReportData['Summary'] = buf.toString('utf8', pos, length); + pos += length; + newObjReportData['Details'] = buf.toString('utf8', pos, length); + pos += length; + newObjReportData['VersionString'] = buf.toString('utf8', pos, length); + pos += length; + this.ReportData = newObjReportData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/UserReportInternal.ts b/lib/classes/packets/UserReportInternal.ts index f2fda49..4444228 100644 --- a/lib/classes/packets/UserReportInternal.ts +++ b/lib/classes/packets/UserReportInternal.ts @@ -36,4 +36,118 @@ export class UserReportInternalPacket implements Packet return (this.ReportData['AbuseRegionName'].length + 1 + this.ReportData['Summary'].length + 1 + this.ReportData['Details'].length + 2 + this.ReportData['VersionString'].length + 1) + 170; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt8(this.ReportData['ReportType'], pos++); + buf.writeUInt8(this.ReportData['Category'], pos++); + this.ReportData['ReporterID'].writeToBuffer(buf, pos); + pos += 16; + this.ReportData['ViewerPosition'].writeToBuffer(buf, pos, false); + pos += 12; + this.ReportData['AgentPosition'].writeToBuffer(buf, pos, false); + pos += 12; + this.ReportData['ScreenshotID'].writeToBuffer(buf, pos); + pos += 16; + this.ReportData['ObjectID'].writeToBuffer(buf, pos); + pos += 16; + this.ReportData['OwnerID'].writeToBuffer(buf, pos); + pos += 16; + this.ReportData['LastOwnerID'].writeToBuffer(buf, pos); + pos += 16; + this.ReportData['CreatorID'].writeToBuffer(buf, pos); + pos += 16; + this.ReportData['RegionID'].writeToBuffer(buf, pos); + pos += 16; + this.ReportData['AbuserID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.ReportData['AbuseRegionName'], pos); + pos += this.ReportData['AbuseRegionName'].length; + this.ReportData['AbuseRegionID'].writeToBuffer(buf, pos); + pos += 16; + buf.write(this.ReportData['Summary'], pos); + pos += this.ReportData['Summary'].length; + buf.write(this.ReportData['Details'], pos); + pos += this.ReportData['Details'].length; + buf.write(this.ReportData['VersionString'], pos); + pos += this.ReportData['VersionString'].length; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjReportData: { + ReportType: number, + Category: number, + ReporterID: UUID, + ViewerPosition: Vector3, + AgentPosition: Vector3, + ScreenshotID: UUID, + ObjectID: UUID, + OwnerID: UUID, + LastOwnerID: UUID, + CreatorID: UUID, + RegionID: UUID, + AbuserID: UUID, + AbuseRegionName: string, + AbuseRegionID: UUID, + Summary: string, + Details: string, + VersionString: string + } = { + ReportType: 0, + Category: 0, + ReporterID: UUID.zero(), + ViewerPosition: Vector3.getZero(), + AgentPosition: Vector3.getZero(), + ScreenshotID: UUID.zero(), + ObjectID: UUID.zero(), + OwnerID: UUID.zero(), + LastOwnerID: UUID.zero(), + CreatorID: UUID.zero(), + RegionID: UUID.zero(), + AbuserID: UUID.zero(), + AbuseRegionName: '', + AbuseRegionID: UUID.zero(), + Summary: '', + Details: '', + VersionString: '' + }; + newObjReportData['ReportType'] = buf.readUInt8(pos++); + newObjReportData['Category'] = buf.readUInt8(pos++); + newObjReportData['ReporterID'] = new UUID(buf, pos); + pos += 16; + newObjReportData['ViewerPosition'] = new Vector3(buf, pos, false); + pos += 12; + newObjReportData['AgentPosition'] = new Vector3(buf, pos, false); + pos += 12; + newObjReportData['ScreenshotID'] = new UUID(buf, pos); + pos += 16; + newObjReportData['ObjectID'] = new UUID(buf, pos); + pos += 16; + newObjReportData['OwnerID'] = new UUID(buf, pos); + pos += 16; + newObjReportData['LastOwnerID'] = new UUID(buf, pos); + pos += 16; + newObjReportData['CreatorID'] = new UUID(buf, pos); + pos += 16; + newObjReportData['RegionID'] = new UUID(buf, pos); + pos += 16; + newObjReportData['AbuserID'] = new UUID(buf, pos); + pos += 16; + newObjReportData['AbuseRegionName'] = buf.toString('utf8', pos, length); + pos += length; + newObjReportData['AbuseRegionID'] = new UUID(buf, pos); + pos += 16; + newObjReportData['Summary'] = buf.toString('utf8', pos, length); + pos += length; + newObjReportData['Details'] = buf.toString('utf8', pos, length); + pos += length; + newObjReportData['VersionString'] = buf.toString('utf8', pos, length); + pos += length; + this.ReportData = newObjReportData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/VelocityInterpolateOff.ts b/lib/classes/packets/VelocityInterpolateOff.ts index 88c446d..0d84899 100644 --- a/lib/classes/packets/VelocityInterpolateOff.ts +++ b/lib/classes/packets/VelocityInterpolateOff.ts @@ -20,4 +20,32 @@ export class VelocityInterpolateOffPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/VelocityInterpolateOn.ts b/lib/classes/packets/VelocityInterpolateOn.ts index 3efa2aa..f0b6378 100644 --- a/lib/classes/packets/VelocityInterpolateOn.ts +++ b/lib/classes/packets/VelocityInterpolateOn.ts @@ -20,4 +20,32 @@ export class VelocityInterpolateOnPacket implements Packet return 32; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ViewerEffect.ts b/lib/classes/packets/ViewerEffect.ts index 827aef6..309c734 100644 --- a/lib/classes/packets/ViewerEffect.ts +++ b/lib/classes/packets/ViewerEffect.ts @@ -38,4 +38,80 @@ export class ViewerEffectPacket implements Packet return size; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + const count = this.Effect.length; + buf.writeUInt8(this.Effect.length, pos++); + for (let i = 0; i < count; i++) + { + this.Effect[i]['ID'].writeToBuffer(buf, pos); + pos += 16; + this.Effect[i]['AgentID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeUInt8(this.Effect[i]['Type'], pos++); + buf.writeFloatLE(this.Effect[i]['Duration'], pos); + pos += 4; + this.Effect[i]['Color'].copy(buf, pos); + pos += 4; + buf.write(this.Effect[i]['TypeData'], pos); + pos += this.Effect[i]['TypeData'].length; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const count = buf.readUInt8(pos++); + this.Effect = []; + for (let i = 0; i < count; i++) + { + const newObjEffect: { + ID: UUID, + AgentID: UUID, + Type: number, + Duration: number, + Color: Buffer, + TypeData: string + } = { + ID: UUID.zero(), + AgentID: UUID.zero(), + Type: 0, + Duration: 0, + Color: Buffer.allocUnsafe(0), + TypeData: '' + }; + newObjEffect['ID'] = new UUID(buf, pos); + pos += 16; + newObjEffect['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjEffect['Type'] = buf.readUInt8(pos++); + newObjEffect['Duration'] = buf.readFloatLE(pos); + pos += 4; + newObjEffect['Color'] = buf.slice(pos, pos + 4); + pos += 4; + newObjEffect['TypeData'] = buf.toString('utf8', pos, length); + pos += length; + this.Effect.push(newObjEffect); + } + return pos - startPos; + } } + diff --git a/lib/classes/packets/ViewerFrozenMessage.ts b/lib/classes/packets/ViewerFrozenMessage.ts index 8dd4b6f..50b9436 100644 --- a/lib/classes/packets/ViewerFrozenMessage.ts +++ b/lib/classes/packets/ViewerFrozenMessage.ts @@ -18,4 +18,24 @@ export class ViewerFrozenMessagePacket implements Packet return 1; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + buf.writeUInt8((this.FrozenData['Data']) ? 1 : 0, pos++); + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjFrozenData: { + Data: boolean + } = { + Data: false + }; + newObjFrozenData['Data'] = (buf.readUInt8(pos++) === 1); + this.FrozenData = newObjFrozenData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ViewerStartAuction.ts b/lib/classes/packets/ViewerStartAuction.ts index b406928..55c6f14 100644 --- a/lib/classes/packets/ViewerStartAuction.ts +++ b/lib/classes/packets/ViewerStartAuction.ts @@ -24,4 +24,48 @@ export class ViewerStartAuctionPacket implements Packet return 52; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + buf.writeInt32LE(this.ParcelData['LocalID'], pos); + pos += 4; + this.ParcelData['SnapshotID'].writeToBuffer(buf, pos); + pos += 16; + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero() + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + this.AgentData = newObjAgentData; + const newObjParcelData: { + LocalID: number, + SnapshotID: UUID + } = { + LocalID: 0, + SnapshotID: UUID.zero() + }; + newObjParcelData['LocalID'] = buf.readInt32LE(pos); + pos += 4; + newObjParcelData['SnapshotID'] = new UUID(buf, pos); + pos += 16; + this.ParcelData = newObjParcelData; + return pos - startPos; + } } + diff --git a/lib/classes/packets/ViewerStats.ts b/lib/classes/packets/ViewerStats.ts index d949aa6..3118dbc 100644 --- a/lib/classes/packets/ViewerStats.ts +++ b/lib/classes/packets/ViewerStats.ts @@ -57,4 +57,232 @@ export class ViewerStatsPacket implements Packet return (this.AgentData['SysOS'].length + 1 + this.AgentData['SysCPU'].length + 1 + this.AgentData['SysGPU'].length + 1) + ((12) * this.MiscStats.length) + 142; } + writeToBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + this.AgentData['AgentID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['SessionID'].writeToBuffer(buf, pos); + pos += 16; + this.AgentData['IP'].writeToBuffer(buf, pos); + pos += 4; + buf.writeUInt32LE(this.AgentData['StartTime'], pos); + pos += 4; + buf.writeFloatLE(this.AgentData['RunTime'], pos); + pos += 4; + buf.writeFloatLE(this.AgentData['SimFPS'], pos); + pos += 4; + buf.writeFloatLE(this.AgentData['FPS'], pos); + pos += 4; + buf.writeUInt8(this.AgentData['AgentsInView'], pos++); + buf.writeFloatLE(this.AgentData['Ping'], pos); + pos += 4; + buf.writeDoubleLE(this.AgentData['MetersTraveled'], pos); + pos += 8; + buf.writeInt32LE(this.AgentData['RegionsVisited'], pos); + pos += 4; + buf.writeUInt32LE(this.AgentData['SysRAM'], pos); + pos += 4; + buf.write(this.AgentData['SysOS'], pos); + pos += this.AgentData['SysOS'].length; + buf.write(this.AgentData['SysCPU'], pos); + pos += this.AgentData['SysCPU'].length; + buf.write(this.AgentData['SysGPU'], pos); + pos += this.AgentData['SysGPU'].length; + buf.writeUInt32LE(this.DownloadTotals['World'], pos); + pos += 4; + buf.writeUInt32LE(this.DownloadTotals['Objects'], pos); + pos += 4; + buf.writeUInt32LE(this.DownloadTotals['Textures'], pos); + pos += 4; + let count = 2; + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.NetStats[i]['Bytes'], pos); + pos += 4; + buf.writeUInt32LE(this.NetStats[i]['Packets'], pos); + pos += 4; + buf.writeUInt32LE(this.NetStats[i]['Compressed'], pos); + pos += 4; + buf.writeUInt32LE(this.NetStats[i]['Savings'], pos); + pos += 4; + } + buf.writeUInt32LE(this.FailStats['SendPacket'], pos); + pos += 4; + buf.writeUInt32LE(this.FailStats['Dropped'], pos); + pos += 4; + buf.writeUInt32LE(this.FailStats['Resent'], pos); + pos += 4; + buf.writeUInt32LE(this.FailStats['FailedResends'], pos); + pos += 4; + buf.writeUInt32LE(this.FailStats['OffCircuit'], pos); + pos += 4; + buf.writeUInt32LE(this.FailStats['Invalid'], pos); + pos += 4; + count = this.MiscStats.length; + buf.writeUInt8(this.MiscStats.length, pos++); + for (let i = 0; i < count; i++) + { + buf.writeUInt32LE(this.MiscStats[i]['Type'], pos); + pos += 4; + buf.writeDoubleLE(this.MiscStats[i]['Value'], pos); + pos += 8; + } + return pos - startPos; + } + + readFromBuffer(buf: Buffer, pos: number): number + { + const startPos = pos; + const newObjAgentData: { + AgentID: UUID, + SessionID: UUID, + IP: IPAddress, + StartTime: number, + RunTime: number, + SimFPS: number, + FPS: number, + AgentsInView: number, + Ping: number, + MetersTraveled: number, + RegionsVisited: number, + SysRAM: number, + SysOS: string, + SysCPU: string, + SysGPU: string + } = { + AgentID: UUID.zero(), + SessionID: UUID.zero(), + IP: IPAddress.zero(), + StartTime: 0, + RunTime: 0, + SimFPS: 0, + FPS: 0, + AgentsInView: 0, + Ping: 0, + MetersTraveled: 0, + RegionsVisited: 0, + SysRAM: 0, + SysOS: '', + SysCPU: '', + SysGPU: '' + }; + newObjAgentData['AgentID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['SessionID'] = new UUID(buf, pos); + pos += 16; + newObjAgentData['IP'] = new IPAddress(buf, pos); + pos += 4; + newObjAgentData['StartTime'] = buf.readUInt32LE(pos); + pos += 4; + newObjAgentData['RunTime'] = buf.readFloatLE(pos); + pos += 4; + newObjAgentData['SimFPS'] = buf.readFloatLE(pos); + pos += 4; + newObjAgentData['FPS'] = buf.readFloatLE(pos); + pos += 4; + newObjAgentData['AgentsInView'] = buf.readUInt8(pos++); + newObjAgentData['Ping'] = buf.readFloatLE(pos); + pos += 4; + newObjAgentData['MetersTraveled'] = buf.readDoubleLE(pos); + pos += 8; + newObjAgentData['RegionsVisited'] = buf.readInt32LE(pos); + pos += 4; + newObjAgentData['SysRAM'] = buf.readUInt32LE(pos); + pos += 4; + newObjAgentData['SysOS'] = buf.toString('utf8', pos, length); + pos += length; + newObjAgentData['SysCPU'] = buf.toString('utf8', pos, length); + pos += length; + newObjAgentData['SysGPU'] = buf.toString('utf8', pos, length); + pos += length; + this.AgentData = newObjAgentData; + const newObjDownloadTotals: { + World: number, + Objects: number, + Textures: number + } = { + World: 0, + Objects: 0, + Textures: 0 + }; + newObjDownloadTotals['World'] = buf.readUInt32LE(pos); + pos += 4; + newObjDownloadTotals['Objects'] = buf.readUInt32LE(pos); + pos += 4; + newObjDownloadTotals['Textures'] = buf.readUInt32LE(pos); + pos += 4; + this.DownloadTotals = newObjDownloadTotals; + let count = 2; + this.NetStats = []; for (let i = 0; i < count; i++) + { + const newObjNetStats: { + Bytes: number, + Packets: number, + Compressed: number, + Savings: number + } = { + Bytes: 0, + Packets: 0, + Compressed: 0, + Savings: 0 + }; + newObjNetStats['Bytes'] = buf.readUInt32LE(pos); + pos += 4; + newObjNetStats['Packets'] = buf.readUInt32LE(pos); + pos += 4; + newObjNetStats['Compressed'] = buf.readUInt32LE(pos); + pos += 4; + newObjNetStats['Savings'] = buf.readUInt32LE(pos); + pos += 4; + this.NetStats.push(newObjNetStats); + } + const newObjFailStats: { + SendPacket: number, + Dropped: number, + Resent: number, + FailedResends: number, + OffCircuit: number, + Invalid: number + } = { + SendPacket: 0, + Dropped: 0, + Resent: 0, + FailedResends: 0, + OffCircuit: 0, + Invalid: 0 + }; + newObjFailStats['SendPacket'] = buf.readUInt32LE(pos); + pos += 4; + newObjFailStats['Dropped'] = buf.readUInt32LE(pos); + pos += 4; + newObjFailStats['Resent'] = buf.readUInt32LE(pos); + pos += 4; + newObjFailStats['FailedResends'] = buf.readUInt32LE(pos); + pos += 4; + newObjFailStats['OffCircuit'] = buf.readUInt32LE(pos); + pos += 4; + newObjFailStats['Invalid'] = buf.readUInt32LE(pos); + pos += 4; + this.FailStats = newObjFailStats; + count = buf.readUInt8(pos++); + this.MiscStats = []; + for (let i = 0; i < count; i++) + { + const newObjMiscStats: { + Type: number, + Value: number + } = { + Type: 0, + Value: 0 + }; + newObjMiscStats['Type'] = buf.readUInt32LE(pos); + pos += 4; + newObjMiscStats['Value'] = buf.readDoubleLE(pos); + pos += 8; + this.MiscStats.push(newObjMiscStats); + } + return pos - startPos; + } } + diff --git a/lib/enums/Message.ts b/lib/enums/Message.ts new file mode 100644 index 0000000..4aa0866 --- /dev/null +++ b/lib/enums/Message.ts @@ -0,0 +1,480 @@ +export enum Message { + TestMessage = 4294901761, + PacketAck = 4294967291, + OpenCircuit = 4294967292, + CloseCircuit = 4294967293, + StartPingCheck = 1, + CompletePingCheck = 2, + AddCircuitCode = 4294901762, + UseCircuitCode = 4294901763, + NeighborList = 3, + AvatarTextureUpdate = 4294901764, + SimulatorMapUpdate = 4294901765, + SimulatorSetMap = 4294901766, + SubscribeLoad = 4294901767, + UnsubscribeLoad = 4294901768, + SimulatorReady = 4294901769, + TelehubInfo = 4294901770, + SimulatorPresentAtLocation = 4294901771, + SimulatorLoad = 4294901772, + SimulatorShutdownRequest = 4294901773, + RegionPresenceRequestByRegionID = 4294901774, + RegionPresenceRequestByHandle = 4294901775, + RegionPresenceResponse = 4294901776, + UpdateSimulator = 4294901777, + LogDwellTime = 4294901778, + FeatureDisabled = 4294901779, + LogFailedMoneyTransaction = 4294901780, + UserReportInternal = 4294901781, + SetSimStatusInDatabase = 4294901782, + SetSimPresenceInDatabase = 4294901783, + EconomyDataRequest = 4294901784, + EconomyData = 4294901785, + AvatarPickerRequest = 4294901786, + AvatarPickerRequestBackend = 4294901787, + AvatarPickerReply = 4294901788, + PlacesQuery = 4294901789, + PlacesReply = 4294901790, + DirFindQuery = 4294901791, + DirFindQueryBackend = 4294901792, + DirPlacesQuery = 4294901793, + DirPlacesQueryBackend = 4294901794, + DirPlacesReply = 4294901795, + DirPeopleReply = 4294901796, + DirEventsReply = 4294901797, + DirGroupsReply = 4294901798, + DirClassifiedQuery = 4294901799, + DirClassifiedQueryBackend = 4294901800, + DirClassifiedReply = 4294901801, + AvatarClassifiedReply = 4294901802, + ClassifiedInfoRequest = 4294901803, + ClassifiedInfoReply = 4294901804, + ClassifiedInfoUpdate = 4294901805, + ClassifiedDelete = 4294901806, + ClassifiedGodDelete = 4294901807, + DirLandQuery = 4294901808, + DirLandQueryBackend = 4294901809, + DirLandReply = 4294901810, + DirPopularQuery = 4294901811, + DirPopularQueryBackend = 4294901812, + DirPopularReply = 4294901813, + ParcelInfoRequest = 4294901814, + ParcelInfoReply = 4294901815, + ParcelObjectOwnersRequest = 4294901816, + ParcelObjectOwnersReply = 4294901817, + GroupNoticesListRequest = 4294901818, + GroupNoticesListReply = 4294901819, + GroupNoticeRequest = 4294901820, + GroupNoticeAdd = 4294901821, + TeleportRequest = 4294901822, + TeleportLocationRequest = 4294901823, + TeleportLocal = 4294901824, + TeleportLandmarkRequest = 4294901825, + TeleportProgress = 4294901826, + DataHomeLocationRequest = 4294901827, + DataHomeLocationReply = 4294901828, + TeleportFinish = 4294901829, + StartLure = 4294901830, + TeleportLureRequest = 4294901831, + TeleportCancel = 4294901832, + TeleportStart = 4294901833, + TeleportFailed = 4294901834, + Undo = 4294901835, + Redo = 4294901836, + UndoLand = 4294901837, + AgentPause = 4294901838, + AgentResume = 4294901839, + AgentUpdate = 4, + ChatFromViewer = 4294901840, + AgentThrottle = 4294901841, + AgentFOV = 4294901842, + AgentHeightWidth = 4294901843, + AgentSetAppearance = 4294901844, + AgentAnimation = 5, + AgentRequestSit = 6, + AgentSit = 7, + AgentQuitCopy = 4294901845, + RequestImage = 8, + ImageNotInDatabase = 4294901846, + RebakeAvatarTextures = 4294901847, + SetAlwaysRun = 4294901848, + ObjectAdd = 65281, + ObjectDelete = 4294901849, + ObjectDuplicate = 4294901850, + ObjectDuplicateOnRay = 4294901851, + MultipleObjectUpdate = 65282, + RequestMultipleObjects = 65283, + ObjectPosition = 65284, + ObjectScale = 4294901852, + ObjectRotation = 4294901853, + ObjectFlagUpdate = 4294901854, + ObjectClickAction = 4294901855, + ObjectImage = 4294901856, + ObjectMaterial = 4294901857, + ObjectShape = 4294901858, + ObjectExtraParams = 4294901859, + ObjectOwner = 4294901860, + ObjectGroup = 4294901861, + ObjectBuy = 4294901862, + BuyObjectInventory = 4294901863, + DerezContainer = 4294901864, + ObjectPermissions = 4294901865, + ObjectSaleInfo = 4294901866, + ObjectName = 4294901867, + ObjectDescription = 4294901868, + ObjectCategory = 4294901869, + ObjectSelect = 4294901870, + ObjectDeselect = 4294901871, + ObjectAttach = 4294901872, + ObjectDetach = 4294901873, + ObjectDrop = 4294901874, + ObjectLink = 4294901875, + ObjectDelink = 4294901876, + ObjectGrab = 4294901877, + ObjectGrabUpdate = 4294901878, + ObjectDeGrab = 4294901879, + ObjectSpinStart = 4294901880, + ObjectSpinUpdate = 4294901881, + ObjectSpinStop = 4294901882, + ObjectExportSelected = 4294901883, + ModifyLand = 4294901884, + VelocityInterpolateOn = 4294901885, + VelocityInterpolateOff = 4294901886, + StateSave = 4294901887, + ReportAutosaveCrash = 4294901888, + SimWideDeletes = 4294901889, + RequestObjectPropertiesFamily = 65285, + TrackAgent = 4294901890, + ViewerStats = 4294901891, + ScriptAnswerYes = 4294901892, + UserReport = 4294901893, + AlertMessage = 4294901894, + AgentAlertMessage = 4294901895, + MeanCollisionAlert = 4294901896, + ViewerFrozenMessage = 4294901897, + HealthMessage = 4294901898, + ChatFromSimulator = 4294901899, + SimStats = 4294901900, + RequestRegionInfo = 4294901901, + RegionInfo = 4294901902, + GodUpdateRegionInfo = 4294901903, + NearestLandingRegionRequest = 4294901904, + NearestLandingRegionReply = 4294901905, + NearestLandingRegionUpdated = 4294901906, + TeleportLandingStatusChanged = 4294901907, + RegionHandshake = 4294901908, + RegionHandshakeReply = 4294901909, + CoarseLocationUpdate = 65286, + ImageData = 9, + ImagePacket = 10, + LayerData = 11, + ObjectUpdate = 12, + ObjectUpdateCompressed = 13, + ObjectUpdateCached = 14, + ImprovedTerseObjectUpdate = 15, + KillObject = 16, + CrossedRegion = 65287, + SimulatorViewerTimeMessage = 4294901910, + EnableSimulator = 4294901911, + DisableSimulator = 4294901912, + ConfirmEnableSimulator = 65288, + TransferRequest = 4294901913, + TransferInfo = 4294901914, + TransferPacket = 17, + TransferAbort = 4294901915, + RequestXfer = 4294901916, + SendXferPacket = 18, + ConfirmXferPacket = 19, + AbortXfer = 4294901917, + AvatarAnimation = 20, + AvatarAppearance = 4294901918, + AvatarSitResponse = 21, + SetFollowCamProperties = 4294901919, + ClearFollowCamProperties = 4294901920, + CameraConstraint = 22, + ObjectProperties = 65289, + ObjectPropertiesFamily = 65290, + RequestPayPrice = 4294901921, + PayPriceReply = 4294901922, + KickUser = 4294901923, + KickUserAck = 4294901924, + GodKickUser = 4294901925, + SystemKickUser = 4294901926, + EjectUser = 4294901927, + FreezeUser = 4294901928, + AvatarPropertiesRequest = 4294901929, + AvatarPropertiesRequestBackend = 4294901930, + AvatarPropertiesReply = 4294901931, + AvatarInterestsReply = 4294901932, + AvatarGroupsReply = 4294901933, + AvatarPropertiesUpdate = 4294901934, + AvatarInterestsUpdate = 4294901935, + AvatarNotesReply = 4294901936, + AvatarNotesUpdate = 4294901937, + AvatarPicksReply = 4294901938, + EventInfoRequest = 4294901939, + EventInfoReply = 4294901940, + EventNotificationAddRequest = 4294901941, + EventNotificationRemoveRequest = 4294901942, + EventGodDelete = 4294901943, + PickInfoReply = 4294901944, + PickInfoUpdate = 4294901945, + PickDelete = 4294901946, + PickGodDelete = 4294901947, + ScriptQuestion = 4294901948, + ScriptControlChange = 4294901949, + ScriptDialog = 4294901950, + ScriptDialogReply = 4294901951, + ForceScriptControlRelease = 4294901952, + RevokePermissions = 4294901953, + LoadURL = 4294901954, + ScriptTeleportRequest = 4294901955, + ParcelOverlay = 4294901956, + ParcelPropertiesRequest = 65291, + ParcelPropertiesRequestByID = 4294901957, + ParcelProperties = 23, + ParcelPropertiesUpdate = 4294901958, + ParcelReturnObjects = 4294901959, + ParcelSetOtherCleanTime = 4294901960, + ParcelDisableObjects = 4294901961, + ParcelSelectObjects = 4294901962, + EstateCovenantRequest = 4294901963, + EstateCovenantReply = 4294901964, + ForceObjectSelect = 4294901965, + ParcelBuyPass = 4294901966, + ParcelDeedToGroup = 4294901967, + ParcelReclaim = 4294901968, + ParcelClaim = 4294901969, + ParcelJoin = 4294901970, + ParcelDivide = 4294901971, + ParcelRelease = 4294901972, + ParcelBuy = 4294901973, + ParcelGodForceOwner = 4294901974, + ParcelAccessListRequest = 4294901975, + ParcelAccessListReply = 4294901976, + ParcelAccessListUpdate = 4294901977, + ParcelDwellRequest = 4294901978, + ParcelDwellReply = 4294901979, + RequestParcelTransfer = 4294901980, + UpdateParcel = 4294901981, + RemoveParcel = 4294901982, + MergeParcel = 4294901983, + LogParcelChanges = 4294901984, + CheckParcelSales = 4294901985, + ParcelSales = 4294901986, + ParcelGodMarkAsContent = 4294901987, + ViewerStartAuction = 4294901988, + StartAuction = 4294901989, + ConfirmAuctionStart = 4294901990, + CompleteAuction = 4294901991, + CancelAuction = 4294901992, + CheckParcelAuctions = 4294901993, + ParcelAuctions = 4294901994, + UUIDNameRequest = 4294901995, + UUIDNameReply = 4294901996, + UUIDGroupNameRequest = 4294901997, + UUIDGroupNameReply = 4294901998, + ChatPass = 4294901999, + EdgeDataPacket = 24, + SimStatus = 65292, + ChildAgentUpdate = 25, + ChildAgentAlive = 26, + ChildAgentPositionUpdate = 27, + ChildAgentDying = 4294902000, + ChildAgentUnknown = 4294902001, + AtomicPassObject = 28, + KillChildAgents = 4294902002, + GetScriptRunning = 4294902003, + ScriptRunningReply = 4294902004, + SetScriptRunning = 4294902005, + ScriptReset = 4294902006, + ScriptSensorRequest = 4294902007, + ScriptSensorReply = 4294902008, + CompleteAgentMovement = 4294902009, + AgentMovementComplete = 4294902010, + DataServerLogout = 4294902011, + LogoutRequest = 4294902012, + LogoutReply = 4294902013, + ImprovedInstantMessage = 4294902014, + RetrieveInstantMessages = 4294902015, + FindAgent = 4294902016, + RequestGodlikePowers = 4294902017, + GrantGodlikePowers = 4294902018, + GodlikeMessage = 4294902019, + EstateOwnerMessage = 4294902020, + GenericMessage = 4294902021, + MuteListRequest = 4294902022, + UpdateMuteListEntry = 4294902023, + RemoveMuteListEntry = 4294902024, + CopyInventoryFromNotecard = 4294902025, + UpdateInventoryItem = 4294902026, + UpdateCreateInventoryItem = 4294902027, + MoveInventoryItem = 4294902028, + CopyInventoryItem = 4294902029, + RemoveInventoryItem = 4294902030, + ChangeInventoryItemFlags = 4294902031, + SaveAssetIntoInventory = 4294902032, + CreateInventoryFolder = 4294902033, + UpdateInventoryFolder = 4294902034, + MoveInventoryFolder = 4294902035, + RemoveInventoryFolder = 4294902036, + FetchInventoryDescendents = 4294902037, + InventoryDescendents = 4294902038, + FetchInventory = 4294902039, + FetchInventoryReply = 4294902040, + BulkUpdateInventory = 4294902041, + RequestInventoryAsset = 4294902042, + InventoryAssetResponse = 4294902043, + RemoveInventoryObjects = 4294902044, + PurgeInventoryDescendents = 4294902045, + UpdateTaskInventory = 4294902046, + RemoveTaskInventory = 4294902047, + MoveTaskInventory = 4294902048, + RequestTaskInventory = 4294902049, + ReplyTaskInventory = 4294902050, + DeRezObject = 4294902051, + DeRezAck = 4294902052, + RezObject = 4294902053, + RezObjectFromNotecard = 4294902054, + TransferInventory = 4294902055, + TransferInventoryAck = 4294902056, + AcceptFriendship = 4294902057, + DeclineFriendship = 4294902058, + FormFriendship = 4294902059, + TerminateFriendship = 4294902060, + OfferCallingCard = 4294902061, + AcceptCallingCard = 4294902062, + DeclineCallingCard = 4294902063, + RezScript = 4294902064, + CreateInventoryItem = 4294902065, + CreateLandmarkForEvent = 4294902066, + EventLocationRequest = 4294902067, + EventLocationReply = 4294902068, + RegionHandleRequest = 4294902069, + RegionIDAndHandleReply = 4294902070, + MoneyTransferRequest = 4294902071, + MoneyTransferBackend = 4294902072, + MoneyBalanceRequest = 4294902073, + MoneyBalanceReply = 4294902074, + RoutedMoneyBalanceReply = 4294902075, + ActivateGestures = 4294902076, + DeactivateGestures = 4294902077, + MuteListUpdate = 4294902078, + UseCachedMuteList = 4294902079, + GrantUserRights = 4294902080, + ChangeUserRights = 4294902081, + OnlineNotification = 4294902082, + OfflineNotification = 4294902083, + SetStartLocationRequest = 4294902084, + SetStartLocation = 4294902085, + NetTest = 4294902086, + SetCPURatio = 4294902087, + SimCrashed = 4294902088, + NameValuePair = 4294902089, + RemoveNameValuePair = 4294902090, + UpdateAttachment = 4294902091, + RemoveAttachment = 4294902092, + SoundTrigger = 29, + AttachedSound = 65293, + AttachedSoundGainChange = 65294, + PreloadSound = 65295, + AssetUploadRequest = 4294902093, + AssetUploadComplete = 4294902094, + EmailMessageRequest = 4294902095, + EmailMessageReply = 4294902096, + InternalScriptMail = 65296, + ScriptDataRequest = 4294902097, + ScriptDataReply = 4294902098, + CreateGroupRequest = 4294902099, + CreateGroupReply = 4294902100, + UpdateGroupInfo = 4294902101, + GroupRoleChanges = 4294902102, + JoinGroupRequest = 4294902103, + JoinGroupReply = 4294902104, + EjectGroupMemberRequest = 4294902105, + EjectGroupMemberReply = 4294902106, + LeaveGroupRequest = 4294902107, + LeaveGroupReply = 4294902108, + InviteGroupRequest = 4294902109, + InviteGroupResponse = 4294902110, + GroupProfileRequest = 4294902111, + GroupProfileReply = 4294902112, + GroupAccountSummaryRequest = 4294902113, + GroupAccountSummaryReply = 4294902114, + GroupAccountDetailsRequest = 4294902115, + GroupAccountDetailsReply = 4294902116, + GroupAccountTransactionsRequest = 4294902117, + GroupAccountTransactionsReply = 4294902118, + GroupActiveProposalsRequest = 4294902119, + GroupActiveProposalItemReply = 4294902120, + GroupVoteHistoryRequest = 4294902121, + GroupVoteHistoryItemReply = 4294902122, + StartGroupProposal = 4294902123, + GroupProposalBallot = 4294902124, + TallyVotes = 4294902125, + GroupMembersRequest = 4294902126, + GroupMembersReply = 4294902127, + ActivateGroup = 4294902128, + SetGroupContribution = 4294902129, + SetGroupAcceptNotices = 4294902130, + GroupRoleDataRequest = 4294902131, + GroupRoleDataReply = 4294902132, + GroupRoleMembersRequest = 4294902133, + GroupRoleMembersReply = 4294902134, + GroupTitlesRequest = 4294902135, + GroupTitlesReply = 4294902136, + GroupTitleUpdate = 4294902137, + GroupRoleUpdate = 4294902138, + LiveHelpGroupRequest = 4294902139, + LiveHelpGroupReply = 4294902140, + AgentWearablesRequest = 4294902141, + AgentWearablesUpdate = 4294902142, + AgentIsNowWearing = 4294902143, + AgentCachedTexture = 4294902144, + AgentCachedTextureResponse = 4294902145, + AgentDataUpdateRequest = 4294902146, + AgentDataUpdate = 4294902147, + GroupDataUpdate = 4294902148, + AgentGroupDataUpdate = 4294902149, + AgentDropGroup = 4294902150, + LogTextMessage = 4294902151, + ViewerEffect = 65297, + CreateTrustedCircuit = 4294902152, + DenyTrustedCircuit = 4294902153, + RequestTrustedCircuit = 4294902154, + RezSingleAttachmentFromInv = 4294902155, + RezMultipleAttachmentsFromInv = 4294902156, + DetachAttachmentIntoInv = 4294902157, + CreateNewOutfitAttachments = 4294902158, + UserInfoRequest = 4294902159, + UserInfoReply = 4294902160, + UpdateUserInfo = 4294902161, + ParcelRename = 4294902162, + InitiateDownload = 4294902163, + SystemMessage = 4294902164, + MapLayerRequest = 4294902165, + MapLayerReply = 4294902166, + MapBlockRequest = 4294902167, + MapNameRequest = 4294902168, + MapBlockReply = 4294902169, + MapItemRequest = 4294902170, + MapItemReply = 4294902171, + SendPostcard = 4294902172, + RpcChannelRequest = 4294902173, + RpcChannelReply = 4294902174, + RpcScriptRequestInbound = 4294902175, + RpcScriptRequestInboundForward = 4294902176, + RpcScriptReplyInbound = 4294902177, + ScriptMailRegistration = 4294902178, + ParcelMediaCommandMessage = 4294902179, + ParcelMediaUpdate = 4294902180, + LandStatRequest = 4294902181, + LandStatReply = 4294902182, + Error = 4294902183, + ObjectIncludeInSearch = 4294902184, + RezRestoreToWorld = 4294902185, + LinkInventoryItem = 4294902186, + RetrieveIMsExtended = 4294902187, + JoinGroupRequestExtended = 4294902188, + CreateGroupRequestExtended = 4294902189 +} diff --git a/package-lock.json b/package-lock.json index f607f4e..a761d7b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,11 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@types/long": { + "version": "3.0.32", + "resolved": "https://registry.npmjs.org/@types/long/-/long-3.0.32.tgz", + "integrity": "sha512-ZXyOOm83p7X8p3s0IYM3VeueNmHpkk/yMlP8CLeOnEcu6hIwPH7YjZBvhQkR0ZFS2DqZAxKtJ/M5fcuv3OU5BA==" + }, "@types/mocha": { "version": "2.2.44", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.44.tgz", @@ -656,6 +661,11 @@ "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", "dev": true }, + "ipaddr.js": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.4.tgz", + "integrity": "sha1-liJj2dJhMpVvxcYwtjijDTzf/BQ=" + }, "is-binary-path": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", @@ -931,6 +941,11 @@ "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", "dev": true }, + "long": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/long/-/long-3.2.0.tgz", + "integrity": "sha1-2CG3E4yhy1gcFymQ7xTbIAtcR0s=" + }, "lowercase-keys": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", @@ -1674,9 +1689,7 @@ "dev": true }, "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + "version": "git+https://github.com/broofa/node-uuid.git#084c3fae3e045aaeffeb64a2127dad7987dbf744" }, "v8flags": { "version": "3.0.1", diff --git a/package.json b/package.json index 8a33c11..085e56f 100644 --- a/package.json +++ b/package.json @@ -26,8 +26,9 @@ "@types/validator": "^6.3.0", "@types/xml": "^1.0.2", "@types/xmlrpc": "^1.3.3", + "ipaddr.js": "^1.5.4", "long": "^3.2.0", - "uuid": "^3.1.0", + "uuid": "git+https://github.com/broofa/node-uuid.git", "validator": "^9.1.1", "xml": "^1.0.1", "xmlrpc": "^1.3.2" diff --git a/tools/writePacketClasses.js b/tools/writePacketClasses.js index fc96d2d..e686094 100644 --- a/tools/writePacketClasses.js +++ b/tools/writePacketClasses.js @@ -318,7 +318,446 @@ messages.forEach((message) => ' }\n\n'; } + classString+=' writeToBuffer(buf: Buffer, pos: number): number\n'; + classString+=' {\n'; + if (message.blocks.length > 0) + { + classString += ' const startPos = pos;\n'; + + let firstCount = true; + + let letConst = 'const'; + let varBlockCount = 0; + message.blocks.forEach((block) => + { + if (block.type === 'Variable' || block.type === 'Multiple') + { + varBlockCount++; + } + }); + if (varBlockCount > 1) + { + letConst = 'let'; + } + + message.blocks.forEach((block) => + { + let single = false; + let blockIndex = ''; + if (block.type === 'Variable') + { + let first = ''; + if (firstCount) + { + firstCount = false; + first = letConst + ' '; + } + blockIndex = ' ' + first + 'count = this.' + block.name + '.length;\n'; + blockIndex += ' buf.writeUInt8(this.' + block.name + '.length, pos++);\n'; + } + else if (block.type === 'Multiple') + { + let first = ''; + if (firstCount) + { + firstCount = false; + first = letConst + ' '; + } + blockIndex = ' ' + first + 'count = ' + block.count + ';\n'; + } + else + { + single = true; + } + let spaces = ''; + if (!single) + { + spaces = ' '; + classString += blockIndex; + classString += ' for (let i = 0; i < count; i++)\n'; + classString += ' {\n'; + } + block.params.forEach((param) => + { + let val = ''; + if (!single) + { + val = 'this.' + block.name + '[i][\'' + param.name + '\']'; + } + else + { + val = 'this.' + block.name + '[\'' + param.name + '\']'; + } + switch (param.type) + { + case 'LLUUID': + classString += spaces + ' ' + val + '.writeToBuffer(buf, pos);\n'; + classString += spaces + ' pos += 16;\n'; + break; + case 'F32': + classString += spaces + ' buf.writeFloatLE(' + val + ', pos);\n'; + classString += spaces + ' pos += 4;\n'; + break; + case 'S32': + classString += spaces + ' buf.writeInt32LE(' + val + ', pos);\n'; + classString += spaces + ' pos += 4;\n'; + break; + case 'U32': + classString += spaces + ' buf.writeUInt32LE(' + val + ', pos);\n'; + classString += spaces + ' pos += 4;\n'; + break; + case 'U16': + case 'IPPORT': + classString += spaces + ' buf.writeUInt16LE(' + val + ', pos);\n'; + classString += spaces + ' pos += 2;\n'; + break; + case 'S16': + classString += spaces + ' buf.writeInt16LE(' + val + ', pos);\n'; + classString += spaces + ' pos += 2;\n'; + break; + case 'U64': + case 'S64': + classString += spaces + ' buf.writeInt32LE(' + val + '.low, pos);\n'; + classString += spaces + ' pos += 4;\n'; + classString += spaces + ' buf.writeInt32LE(' + val + '.high, pos);\n'; + classString += spaces + ' pos += 4;\n'; + break; + case 'F64': + classString += spaces + ' buf.writeDoubleLE(' + val + ', pos);\n'; + classString += spaces + ' pos += 8;\n'; + break; + case 'S8': + classString += spaces + ' buf.writeInt8(' + val + ', pos++);\n'; + break; + case 'U8': + classString += spaces + ' buf.writeUInt8(' + val + ', pos++);\n'; + break; + case 'BOOL': + classString += spaces + ' buf.writeUInt8((' + val + ') ? 1 : 0, pos++);\n'; + break; + case 'Variable': + if (param.size === 1) + { + classString += spaces + ' buf.writeUInt8(' + val + '.length, pos++);\n'; + } + if (param.size === 2) + { + classString += spaces + ' buf.writeUInt16BE(' + val + '.length, pos);\n'; + classString += spaces + ' pos += 2;\n'; + } + classString += spaces + ' buf.write(' + val + ', pos);\n'; + classString += spaces + ' pos += ' + val + '.length;\n'; + break; + case 'LLVector4': + classString += spaces + ' ' + val + '.writeToBuffer(buf, pos);\n'; + classString += spaces + ' pos += 16;\n'; + break; + case 'LLQuaternion': + classString += spaces + ' ' + val + '.writeToBuffer(buf, pos);\n'; + classString += spaces + ' pos += 12;\n'; + break; + case 'LLVector3d': + classString += spaces + ' ' + val + '.writeToBuffer(buf, pos, true);\n'; + classString += spaces + ' pos += 24;\n'; + break; + case 'LLVector3': + classString += spaces + ' ' + val + '.writeToBuffer(buf, pos, false);\n'; + classString += spaces + ' pos += 12;\n'; + break; + case 'IPADDR': + classString += spaces + ' ' + val + '.writeToBuffer(buf, pos);\n'; + classString += spaces + ' pos += 4;\n'; + break; + case 'Fixed': + classString += spaces + ' ' + val + '.copy(buf, pos);\n'; + classString += spaces + ' pos += ' + param.size + ';\n'; + break; + default: + console.log('Unknown type: ' + param.type); + } + }); + if (!single) + { + classString += ' }\n'; + } + + }); + classString += ' return pos - startPos;\n'; + } + else + { + classString += ' return 0;\n'; + } + classString +=' }\n'; + classString +='\n'; + classString+=' readFromBuffer(buf: Buffer, pos: number): number\n'; + classString+=' {\n'; + if (message.blocks.length > 0) + { + classString += ' const startPos = pos;\n'; + + let firstCount = true; + + let letConst = 'const'; + let varBlockCount = 0; + message.blocks.forEach((block) => + { + if (block.type === 'Variable' || block.type === 'Multiple') + { + varBlockCount++; + } + }); + if (varBlockCount > 1) + { + letConst = 'let'; + } + + let varBlockConst = 'const'; + if (message.blocks.count > 1) + { + varBlockConst = 'let'; + } + let firstBlock = true; + + message.blocks.forEach((block) => + { + let single = false; + let blockIndex = ''; + if (block.type === 'Variable') + { + let first = ''; + if (firstCount) + { + firstCount = false; + first = letConst + ' '; + } + blockIndex = ' ' + first + 'count = buf.readUInt8(pos++);\n'; + blockIndex += ' this.' + block.name + ' = [];\n'; + } + else if (block.type === 'Multiple') + { + let first = ''; + if (firstCount) + { + firstCount = false; + first = letConst + ' '; + } + blockIndex = ' ' + first + 'count = ' + block.count + ';\n'; + blockIndex += ' this.' + block.name + ' = [];'; + } + else + { + single = true; + } + let spaces = ''; + let decl = ''; + if (firstBlock) + { + firstBlock = false; + decl = varBlockConst + ' '; + } + if (!single) + { + spaces = ' '; + classString += blockIndex; + classString += ' for (let i = 0; i < count; i++)\n'; + classString += ' {\n'; + classString += ' const newObj' + block.name + ': {\n'; + } + else + { + classString += ' const newObj' + block.name + ': {\n'; + } + const paramTypes = []; + const paramValues = []; + block.params.forEach((param) => + { + let jstype = 'string'; + let jsvalue = '\'\''; + switch(param.type) + { + case 'LLUUID': + jstype = 'UUID'; + jsvalue = 'UUID.zero()'; + break; + case 'F32': + case 'S32': + case 'U32': + jstype = 'number'; + jsvalue = '0'; + break; + case 'IPPORT': + case 'S16': + case 'U16': + jstype = 'number'; + jsvalue = '0'; + break; + case 'U64': + case 'S64': + jstype = 'Long'; + jsvalue = 'Long.ZERO'; + break; + case 'F64': + jstype = 'number'; + jsvalue = '0'; + break; + case 'S8': + case 'U8': + jstype = 'number'; + jsvalue = '0'; + break; + case 'BOOL': + jstype = 'boolean'; + jsvalue = 'false'; + break; + case 'Variable': + jstype = 'string'; + jsvalue = '\'\''; + break; + case 'LLVector4': + jstype = 'Vector4'; + jsvalue = 'Vector4.getZero()'; + break; + case 'LLQuaternion': + jstype = 'Quaternion'; + jsvalue = 'Quaternion.getIdentity()'; + break; + case 'LLVector3d': + jstype = 'Vector3'; + jsvalue = 'Vector3.getZero()'; + break; + case 'LLVector3': + jstype = 'Vector3'; + jsvalue = 'Vector3.getZero()'; + break; + case 'IPADDR': + jstype = 'IPAddress'; + jsvalue = 'IPAddress.zero()'; + break; + case 'Fixed': + jstype = 'Buffer'; + jsvalue = 'Buffer.allocUnsafe(0)'; + break; + default: + console.log('Unknown type: '+param.type); + } + paramTypes.push(spaces + ' ' + param.name + ': '+jstype); + paramValues.push(spaces + ' ' + param.name + ': '+jsvalue); + }); + classString += paramTypes.join(',\n')+'\n'; + classString += spaces + ' } = {\n'; + classString += paramValues.join(',\n')+'\n'; + classString += spaces + ' };\n'; + block.params.forEach((param) => + { + let val = ''; + switch (param.type) + { + case 'LLUUID': + classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new UUID(buf, pos);\n'; + classString += spaces + ' pos += 16;\n'; + break; + case 'F32': + classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readFloatLE(pos);\n'; + classString += spaces + ' pos += 4;\n'; + break; + case 'S32': + classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readInt32LE(pos);\n'; + classString += spaces + ' pos += 4;\n'; + break; + case 'U32': + classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readUInt32LE(pos);\n'; + classString += spaces + ' pos += 4;\n'; + break; + case 'U16': + case 'IPPORT': + classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readUInt16LE(pos);\n'; + classString += spaces + ' pos += 2;\n'; + break; + case 'S16': + classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readInt16LE(pos);\n'; + classString += spaces + ' pos += 2;\n'; + break; + case 'U64': + case 'S64': + classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new Long(buf.readInt32LE(pos), buf.readInt32LE(pos+4));\n'; + classString += spaces + ' pos += 8;\n'; + break; + case 'F64': + classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readDoubleLE(pos);\n'; + classString += spaces + ' pos += 8;\n'; + break; + case 'S8': + classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readInt8(pos++);\n'; + break; + case 'U8': + classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.readUInt8(pos++);\n'; + break; + case 'BOOL': + classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = (buf.readUInt8(pos++) === 1);\n'; + break; + case 'Variable': + if (param.size === 1) + { + classString += spaces + ' let length = buf.readUInt8(pos++);\n'; + } + if (param.size === 2) + { + classString += spaces + ' let length = buf.readUInt16BE(pos);\n'; + classString += spaces + ' pos += 2;\n'; + } + classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.toString(\'utf8\', pos, length);\n'; + classString += spaces + ' pos += length;\n'; + break; + case 'LLVector4': + classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new Vector4(buf, pos);\n'; + classString += spaces + ' pos += 16;\n'; + break; + case 'LLQuaternion': + classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new Quaternion(buf, pos);\n'; + classString += spaces + ' pos += 12;\n'; + break; + case 'LLVector3d': + classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new Vector3(buf, pos, true);\n'; + classString += spaces + ' pos += 24;\n'; + break; + case 'LLVector3': + classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new Vector3(buf, pos, false);\n'; + classString += spaces + ' pos += 12;\n'; + break; + case 'IPADDR': + classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = new IPAddress(buf, pos);\n'; + classString += spaces + ' pos += 4;\n'; + break; + case 'Fixed': + classString += spaces + ' newObj' + block.name + '[\'' + param.name + '\'] = buf.slice(pos, pos + ' + param.size + ');\n'; + classString += spaces + ' pos += ' + param.size + ';\n'; + break; + default: + console.log('Unknown type: ' + param.type); + } + }); + if (!single) + { + classString += ' this.'+block.name+'.push(newObj' + block.name + ');\n'; + classString += ' }\n'; + } + else + { + classString += ' this.'+block.name+' = newObj' + block.name + ';\n'; + } + + + }); + classString += ' return pos - startPos;\n'; + } + else + { + classString += ' return 0;\n'; + } + classString +=' }\n'; classString += '}\n'; + classString +='\n'; const p = path.join(__dirname+'/../lib/classes/packets/'+message.name+'.ts'); fs.writeFile(p, classString, (err) => @@ -327,3 +766,60 @@ messages.forEach((message) => }); }); +//Now write the Messages class +let classString = '// This file has been automatically generated by writePacketClasses.js\n\n'; +messages.forEach((message) => +{ + const name = message.name; + classString += 'export * from \'./packets/'+name+'\';\n'; +}); +classString += 'import {Message} from \'../enums/Message\';\n'; +classString += '\n'; +classString += 'const messages: {[index: number]: string} = {};\n'; +const msgs = []; +messages.forEach((message) => +{ + msgs.push('messages[Message.' + message.name + '] = \'' + message.name + 'Packet\''); +}); +classString += msgs.join(';\n')+';\n'; +classString += '\n'; +classString += 'export function nameFromID(id: Message): string\n'; +classString += '{\n'; +classString += ' return messages[id];\n'; +classString += '}\n'; +const p = path.join(__dirname+'/../lib/classes/MessageClasses.ts'); +fs.writeFile(p, classString, (err) => +{ + +}); + +classString = 'export enum Message {\n'; +const msgArr = []; +messages.forEach((message) => +{ + let id = parseInt(message.id); + switch(message.frequency) + { + case 'Low': + id += 4294901760; + break; + case 'Medium': + id += 65280; + break; + case 'Fixed': + break; + case 'High': + break; + default: + console.log("UNKNOWN FREQUENCY: "+message.frequency); + break; + } + msgArr.push(' '+message.name+' = '+id); +}); +classString += msgArr.join(',\n')+'\n'; +classString += '}\n'; +const e = path.join(__dirname+'/../lib/enums/Message.ts'); +fs.writeFile(e, classString, (err) => +{ + +});