LLClientView.cs 652 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443
  1. /*
  2. * Copyright (c) Contributors, http://opensimulator.org/
  3. * See CONTRIBUTORS.TXT for a full list of copyright holders.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions are met:
  7. * * Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * * Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. * * Neither the name of the OpenSimulator Project nor the
  13. * names of its contributors may be used to endorse or promote products
  14. * derived from this software without specific prior written permission.
  15. *
  16. * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
  17. * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  18. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  19. * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
  20. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  21. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  22. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  23. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  24. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  25. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. */
  27. using System;
  28. using System.Collections.Generic;
  29. using System.Net;
  30. using System.Reflection;
  31. using System.Runtime;
  32. using System.Text;
  33. using System.Threading;
  34. using log4net;
  35. using OpenMetaverse;
  36. using OpenMetaverse.Packets;
  37. using OpenMetaverse.Messages.Linden;
  38. using OpenMetaverse.StructuredData;
  39. using OpenSim.Framework;
  40. using OpenSim.Framework.Client;
  41. using OpenSim.Framework.Monitoring;
  42. using OpenSim.Region.Framework.Interfaces;
  43. using OpenSim.Region.Framework.Scenes;
  44. using OpenSim.Services.Interfaces;
  45. using AssetLandmark = OpenSim.Framework.AssetLandmark;
  46. using Caps = OpenSim.Framework.Capabilities.Caps;
  47. using PermissionMask = OpenSim.Framework.PermissionMask;
  48. using RegionFlags = OpenMetaverse.RegionFlags;
  49. namespace OpenSim.Region.ClientStack.LindenUDP
  50. {
  51. public delegate bool PacketMethod(IClientAPI simClient, Packet packet);
  52. /// <summary>
  53. /// Handles new client connections
  54. /// Constructor takes a single Packet and authenticates everything
  55. /// </summary>
  56. public class LLClientView : IClientAPI, IClientCore, IClientIM, IClientChat, IClientInventory, IStatsCollector, IClientIPEndpoint
  57. {
  58. /// <value>
  59. /// Debug packet level. See OpenSim.RegisterConsoleCommands() for more details.
  60. /// </value>
  61. public int DebugPacketLevel { get; set; }
  62. #region Events
  63. public event BinaryGenericMessage OnBinaryGenericMessage;
  64. public event Action<IClientAPI> OnLogout;
  65. public event ObjectPermissions OnObjectPermissions;
  66. public event Action<IClientAPI> OnConnectionClosed;
  67. public event ViewerEffectEventHandler OnViewerEffect;
  68. public event ImprovedInstantMessage OnInstantMessage;
  69. public event ChatMessage OnChatFromClient;
  70. public event RezObject OnRezObject;
  71. public event DeRezObject OnDeRezObject;
  72. public event RezRestoreToWorld OnRezRestoreToWorld;
  73. public event ModifyTerrain OnModifyTerrain;
  74. public event Action<IClientAPI> OnRegionHandShakeReply;
  75. public event GenericCall1 OnRequestWearables;
  76. public event SetAppearance OnSetAppearance;
  77. public event AvatarNowWearing OnAvatarNowWearing;
  78. public event RezSingleAttachmentFromInv OnRezSingleAttachmentFromInv;
  79. public event RezMultipleAttachmentsFromInv OnRezMultipleAttachmentsFromInv;
  80. public event UUIDNameRequest OnDetachAttachmentIntoInv;
  81. public event ObjectAttach OnObjectAttach;
  82. public event ObjectDeselect OnObjectDetach;
  83. public event ObjectDrop OnObjectDrop;
  84. public event Action<IClientAPI, bool> OnCompleteMovementToRegion;
  85. public event UpdateAgent OnPreAgentUpdate;
  86. public event UpdateAgent OnAgentUpdate;
  87. public event UpdateAgent OnAgentCameraUpdate;
  88. public event AgentRequestSit OnAgentRequestSit;
  89. public event AgentSit OnAgentSit;
  90. public event AvatarPickerRequest OnAvatarPickerRequest;
  91. public event ChangeAnim OnChangeAnim;
  92. public event Action<IClientAPI> OnRequestAvatarsData;
  93. public event LinkObjects OnLinkObjects;
  94. public event DelinkObjects OnDelinkObjects;
  95. public event GrabObject OnGrabObject;
  96. public event DeGrabObject OnDeGrabObject;
  97. public event SpinStart OnSpinStart;
  98. public event SpinStop OnSpinStop;
  99. public event ObjectDuplicate OnObjectDuplicate;
  100. public event ObjectDuplicateOnRay OnObjectDuplicateOnRay;
  101. public event MoveObject OnGrabUpdate;
  102. public event SpinObject OnSpinUpdate;
  103. public event AddNewPrim OnAddPrim;
  104. public event RequestGodlikePowers OnRequestGodlikePowers;
  105. public event GodKickUser OnGodKickUser;
  106. public event ObjectExtraParams OnUpdateExtraParams;
  107. public event UpdateShape OnUpdatePrimShape;
  108. public event ObjectRequest OnObjectRequest;
  109. public event ObjectSelect OnObjectSelect;
  110. public event ObjectDeselect OnObjectDeselect;
  111. public event GenericCall7 OnObjectDescription;
  112. public event GenericCall7 OnObjectName;
  113. public event GenericCall7 OnObjectClickAction;
  114. public event GenericCall7 OnObjectMaterial;
  115. public event ObjectIncludeInSearch OnObjectIncludeInSearch;
  116. public event RequestObjectPropertiesFamily OnRequestObjectPropertiesFamily;
  117. public event UpdatePrimFlags OnUpdatePrimFlags;
  118. public event UpdatePrimTexture OnUpdatePrimTexture;
  119. public event ClientChangeObject onClientChangeObject;
  120. public event UpdateVector OnUpdatePrimGroupPosition;
  121. public event UpdatePrimRotation OnUpdatePrimGroupRotation;
  122. public event UpdateVector OnUpdatePrimGroupScale;
  123. public event RequestMapBlocks OnRequestMapBlocks;
  124. public event RequestMapName OnMapNameRequest;
  125. public event TeleportLocationRequest OnTeleportLocationRequest;
  126. public event TeleportLandmarkRequest OnTeleportLandmarkRequest;
  127. public event TeleportCancel OnTeleportCancel;
  128. public event RequestAvatarProperties OnRequestAvatarProperties;
  129. public event SetAlwaysRun OnSetAlwaysRun;
  130. public event FetchInventory OnAgentDataUpdateRequest;
  131. public event TeleportLocationRequest OnSetStartLocationRequest;
  132. public event UpdateAvatarProperties OnUpdateAvatarProperties;
  133. public event CreateNewInventoryItem OnCreateNewInventoryItem;
  134. public event LinkInventoryItem OnLinkInventoryItem;
  135. public event CreateInventoryFolder OnCreateNewInventoryFolder;
  136. public event UpdateInventoryFolder OnUpdateInventoryFolder;
  137. public event MoveInventoryFolder OnMoveInventoryFolder;
  138. public event FetchInventoryDescendents OnFetchInventoryDescendents;
  139. public event PurgeInventoryDescendents OnPurgeInventoryDescendents;
  140. public event FetchInventory OnFetchInventory;
  141. public event RequestTaskInventory OnRequestTaskInventory;
  142. public event UpdateInventoryItem OnUpdateInventoryItem;
  143. public event CopyInventoryItem OnCopyInventoryItem;
  144. public event MoveItemsAndLeaveCopy OnMoveItemsAndLeaveCopy;
  145. public event MoveInventoryItem OnMoveInventoryItem;
  146. public event RemoveInventoryItem OnRemoveInventoryItem;
  147. public event RemoveInventoryFolder OnRemoveInventoryFolder;
  148. public event UDPAssetUploadRequest OnAssetUploadRequest;
  149. public event XferReceive OnXferReceive;
  150. public event RequestXfer OnRequestXfer;
  151. public event ConfirmXfer OnConfirmXfer;
  152. public event AbortXfer OnAbortXfer;
  153. public event RequestTerrain OnRequestTerrain;
  154. public event RezScript OnRezScript;
  155. public event UpdateTaskInventory OnUpdateTaskInventory;
  156. public event MoveTaskInventory OnMoveTaskItem;
  157. public event RemoveTaskInventory OnRemoveTaskItem;
  158. public event UUIDNameRequest OnNameFromUUIDRequest;
  159. public event ParcelAccessListRequest OnParcelAccessListRequest;
  160. public event ParcelAccessListUpdateRequest OnParcelAccessListUpdateRequest;
  161. public event ParcelPropertiesRequest OnParcelPropertiesRequest;
  162. public event ParcelDivideRequest OnParcelDivideRequest;
  163. public event ParcelJoinRequest OnParcelJoinRequest;
  164. public event ParcelPropertiesUpdateRequest OnParcelPropertiesUpdateRequest;
  165. public event ParcelSelectObjects OnParcelSelectObjects;
  166. public event ParcelObjectOwnerRequest OnParcelObjectOwnerRequest;
  167. public event ParcelAbandonRequest OnParcelAbandonRequest;
  168. public event ParcelGodForceOwner OnParcelGodForceOwner;
  169. public event ParcelReclaim OnParcelReclaim;
  170. public event ParcelReturnObjectsRequest OnParcelReturnObjectsRequest;
  171. public event ParcelDeedToGroup OnParcelDeedToGroup;
  172. public event RegionInfoRequest OnRegionInfoRequest;
  173. public event EstateCovenantRequest OnEstateCovenantRequest;
  174. public event FriendActionDelegate OnApproveFriendRequest;
  175. public event FriendActionDelegate OnDenyFriendRequest;
  176. public event FriendshipTermination OnTerminateFriendship;
  177. public event GrantUserFriendRights OnGrantUserRights;
  178. public event MoneyTransferRequest OnMoneyTransferRequest;
  179. public event EconomyDataRequest OnEconomyDataRequest;
  180. public event MoneyBalanceRequest OnMoneyBalanceRequest;
  181. public event ParcelBuy OnParcelBuy;
  182. public event UUIDNameRequest OnTeleportHomeRequest;
  183. public event UUIDNameRequest OnUUIDGroupNameRequest;
  184. public event ScriptAnswer OnScriptAnswer;
  185. public event RequestPayPrice OnRequestPayPrice;
  186. public event ObjectSaleInfo OnObjectSaleInfo;
  187. public event ObjectBuy OnObjectBuy;
  188. public event AgentSit OnUndo;
  189. public event AgentSit OnRedo;
  190. public event LandUndo OnLandUndo;
  191. public event ForceReleaseControls OnForceReleaseControls;
  192. public event GodLandStatRequest OnLandStatRequest;
  193. public event RequestObjectPropertiesFamily OnObjectGroupRequest;
  194. public event DetailedEstateDataRequest OnDetailedEstateDataRequest;
  195. public event SetEstateFlagsRequest OnSetEstateFlagsRequest;
  196. public event SetEstateTerrainDetailTexture OnSetEstateTerrainDetailTexture;
  197. public event SetEstateTerrainTextureHeights OnSetEstateTerrainTextureHeights;
  198. public event CommitEstateTerrainTextureRequest OnCommitEstateTerrainTextureRequest;
  199. public event SetRegionTerrainSettings OnSetRegionTerrainSettings;
  200. public event BakeTerrain OnBakeTerrain;
  201. public event RequestTerrain OnUploadTerrain;
  202. public event EstateChangeInfo OnEstateChangeInfo;
  203. public event EstateManageTelehub OnEstateManageTelehub;
  204. public event EstateRestartSimRequest OnEstateRestartSimRequest;
  205. public event EstateChangeCovenantRequest OnEstateChangeCovenantRequest;
  206. public event UpdateEstateAccessDeltaRequest OnUpdateEstateAccessDeltaRequest;
  207. public event SimulatorBlueBoxMessageRequest OnSimulatorBlueBoxMessageRequest;
  208. public event EstateBlueBoxMessageRequest OnEstateBlueBoxMessageRequest;
  209. public event EstateDebugRegionRequest OnEstateDebugRegionRequest;
  210. public event EstateTeleportOneUserHomeRequest OnEstateTeleportOneUserHomeRequest;
  211. public event EstateTeleportAllUsersHomeRequest OnEstateTeleportAllUsersHomeRequest;
  212. public event RegionHandleRequest OnRegionHandleRequest;
  213. public event ParcelInfoRequest OnParcelInfoRequest;
  214. public event ScriptReset OnScriptReset;
  215. public event GetScriptRunning OnGetScriptRunning;
  216. public event SetScriptRunning OnSetScriptRunning;
  217. public event Action<Vector3, bool, bool> OnAutoPilotGo;
  218. public event ActivateGesture OnActivateGesture;
  219. public event DeactivateGesture OnDeactivateGesture;
  220. public event ObjectOwner OnObjectOwner;
  221. public event DirPlacesQuery OnDirPlacesQuery;
  222. public event DirFindQuery OnDirFindQuery;
  223. public event DirLandQuery OnDirLandQuery;
  224. public event DirPopularQuery OnDirPopularQuery;
  225. public event DirClassifiedQuery OnDirClassifiedQuery;
  226. public event EventInfoRequest OnEventInfoRequest;
  227. public event ParcelSetOtherCleanTime OnParcelSetOtherCleanTime;
  228. public event MapItemRequest OnMapItemRequest;
  229. public event OfferCallingCard OnOfferCallingCard;
  230. public event AcceptCallingCard OnAcceptCallingCard;
  231. public event DeclineCallingCard OnDeclineCallingCard;
  232. public event SoundTrigger OnSoundTrigger;
  233. public event StartLure OnStartLure;
  234. public event TeleportLureRequest OnTeleportLureRequest;
  235. public event NetworkStats OnNetworkStatsUpdate;
  236. public event ClassifiedInfoRequest OnClassifiedInfoRequest;
  237. public event ClassifiedInfoUpdate OnClassifiedInfoUpdate;
  238. public event ClassifiedDelete OnClassifiedDelete;
  239. public event ClassifiedGodDelete OnClassifiedGodDelete;
  240. public event EventNotificationAddRequest OnEventNotificationAddRequest;
  241. public event EventNotificationRemoveRequest OnEventNotificationRemoveRequest;
  242. public event EventGodDelete OnEventGodDelete;
  243. public event ParcelDwellRequest OnParcelDwellRequest;
  244. public event UserInfoRequest OnUserInfoRequest;
  245. public event UpdateUserInfo OnUpdateUserInfo;
  246. public event RetrieveInstantMessages OnRetrieveInstantMessages;
  247. public event PickDelete OnPickDelete;
  248. public event PickGodDelete OnPickGodDelete;
  249. public event PickInfoUpdate OnPickInfoUpdate;
  250. public event AvatarNotesUpdate OnAvatarNotesUpdate;
  251. public event MuteListRequest OnMuteListRequest;
  252. public event AvatarInterestUpdate OnAvatarInterestUpdate;
  253. public event PlacesQuery OnPlacesQuery;
  254. public event AgentFOV OnAgentFOV;
  255. public event FindAgentUpdate OnFindAgent;
  256. public event TrackAgentUpdate OnTrackAgent;
  257. public event NewUserReport OnUserReport;
  258. public event SaveStateHandler OnSaveState;
  259. public event GroupAccountSummaryRequest OnGroupAccountSummaryRequest;
  260. public event GroupAccountDetailsRequest OnGroupAccountDetailsRequest;
  261. public event GroupAccountTransactionsRequest OnGroupAccountTransactionsRequest;
  262. public event FreezeUserUpdate OnParcelFreezeUser;
  263. public event EjectUserUpdate OnParcelEjectUser;
  264. public event ParcelBuyPass OnParcelBuyPass;
  265. public event ParcelGodMark OnParcelGodMark;
  266. public event GroupActiveProposalsRequest OnGroupActiveProposalsRequest;
  267. public event GroupVoteHistoryRequest OnGroupVoteHistoryRequest;
  268. public event SimWideDeletesDelegate OnSimWideDeletes;
  269. public event SendPostcard OnSendPostcard;
  270. public event ChangeInventoryItemFlags OnChangeInventoryItemFlags;
  271. public event MuteListEntryUpdate OnUpdateMuteListEntry;
  272. public event MuteListEntryRemove OnRemoveMuteListEntry;
  273. public event GodlikeMessage onGodlikeMessage;
  274. public event GodUpdateRegionInfoUpdate OnGodUpdateRegionInfoUpdate;
  275. public event GenericCall2 OnUpdateThrottles;
  276. #pragma warning disable 0067
  277. // still unused
  278. public event GenericMessage OnGenericMessage;
  279. public event TextureRequest OnRequestTexture;
  280. public event StatusChange OnChildAgentStatus;
  281. public event GenericCall2 OnStopMovement;
  282. public event Action<UUID> OnRemoveAvatar;
  283. public event DisconnectUser OnDisconnectUser;
  284. public event RequestAsset OnRequestAsset;
  285. public event BuyObjectInventory OnBuyObjectInventory;
  286. public event SetEstateTerrainBaseTexture OnSetEstateTerrainBaseTexture;
  287. public event TerrainUnacked OnUnackedTerrain;
  288. public event CachedTextureRequest OnCachedTextureRequest;
  289. public event UpdateVector OnUpdatePrimSinglePosition;
  290. public event StartAnim OnStartAnim;
  291. public event StopAnim OnStopAnim;
  292. public event UpdatePrimSingleRotation OnUpdatePrimSingleRotation;
  293. public event UpdatePrimSingleRotationPosition OnUpdatePrimSingleRotationPosition;
  294. public event UpdatePrimGroupRotation OnUpdatePrimGroupMouseRotation;
  295. public event UpdateVector OnUpdatePrimScale;
  296. #pragma warning restore 0067
  297. #endregion Events
  298. #region Class Members
  299. // LLClientView Only
  300. public delegate void BinaryGenericMessage(Object sender, string method, byte[][] args);
  301. /// <summary>Used to adjust Sun Orbit values so Linden based viewers properly position sun</summary>
  302. private const float m_sunPainDaHalfOrbitalCutoff = 4.712388980384689858f;
  303. private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
  304. private static string LogHeader = "[LLCLIENTVIEW]";
  305. /// <summary>
  306. /// Handles UDP texture download.
  307. /// </summary>
  308. public LLImageManager ImageManager { get; private set; }
  309. public JobEngine m_asyncPacketProcess;
  310. private readonly LLUDPServer m_udpServer;
  311. private readonly LLUDPClient m_udpClient;
  312. private readonly UUID m_sessionId;
  313. private readonly UUID m_secureSessionId;
  314. protected readonly UUID m_agentId;
  315. protected readonly UUID m_scopeId;
  316. private readonly uint m_circuitCode;
  317. private readonly byte[] m_regionChannelVersion = Utils.EmptyBytes;
  318. private readonly IGroupsModule m_GroupsModule;
  319. // private int m_cachedTextureSerial;
  320. private PriorityQueue m_entityUpdates;
  321. private PriorityQueue m_entityProps;
  322. private Prioritizer m_prioritizer;
  323. private bool m_disableFacelights;
  324. // needs optimization
  325. private HashSet<SceneObjectGroup> GroupsInView = new HashSet<SceneObjectGroup>();
  326. #pragma warning disable 0414
  327. private bool m_VelocityInterpolate;
  328. #pragma warning restore 0414
  329. private const uint MaxTransferBytesPerPacket = 600;
  330. private bool m_SupportObjectAnimations;
  331. /// <value>
  332. /// Maintain a record of all the objects killed. This allows us to stop an update being sent from the
  333. /// thread servicing the m_primFullUpdates queue after a kill. If this happens the object persists as an
  334. /// ownerless phantom.
  335. ///
  336. /// All manipulation of this set has to occur under an m_entityUpdates.SyncRoot lock
  337. ///
  338. /// </value>
  339. protected List<uint> m_killRecord;
  340. // protected HashSet<uint> m_attachmentsSent;
  341. private bool m_deliverPackets = true;
  342. private bool m_SendLogoutPacketWhenClosing = true;
  343. /// <summary>
  344. /// We retain a single AgentUpdateArgs so that we can constantly reuse it rather than construct a new one for
  345. /// every single incoming AgentUpdate. Every client sends 10 AgentUpdate UDP messages per second, even if it
  346. /// is doing absolutely nothing.
  347. /// </summary>
  348. /// <remarks>
  349. /// This does mean that agent updates must be processed synchronously, at least for each client, and called methods
  350. /// cannot retain a reference to it outside of that method.
  351. /// </remarks>
  352. private AgentUpdateArgs m_thisAgentUpdateArgs = new AgentUpdateArgs();
  353. protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>();
  354. protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers
  355. protected Scene m_scene;
  356. protected string m_firstName;
  357. protected string m_lastName;
  358. protected Vector3 m_startpos;
  359. protected UUID m_activeGroupID;
  360. protected string m_activeGroupName = String.Empty;
  361. protected ulong m_activeGroupPowers;
  362. protected Dictionary<UUID, ulong> m_groupPowers = new Dictionary<UUID, ulong>();
  363. protected int m_terrainCheckerCount;
  364. protected uint m_agentFOVCounter;
  365. protected IAssetService m_assetService;
  366. protected bool m_supportViewerCache = false;
  367. #endregion Class Members
  368. #region Properties
  369. public LLUDPClient UDPClient { get { return m_udpClient; } }
  370. public LLUDPServer UDPServer { get { return m_udpServer; } }
  371. public IPEndPoint RemoteEndPoint { get { return m_udpClient.RemoteEndPoint; } }
  372. public UUID SecureSessionId { get { return m_secureSessionId; } }
  373. public IScene Scene { get { return m_scene; } }
  374. public UUID SessionId { get { return m_sessionId; } }
  375. public Vector3 StartPos
  376. {
  377. get { return m_startpos; }
  378. set { m_startpos = value; }
  379. }
  380. public float StartFar { get; set; }
  381. public bool DeliverPackets
  382. {
  383. get { return m_deliverPackets; }
  384. set {
  385. m_deliverPackets = value;
  386. m_udpClient.m_deliverPackets = value;
  387. }
  388. }
  389. public UUID AgentId { get { return m_agentId; } }
  390. public UUID ScopeId { get { return m_scopeId; } }
  391. public ISceneAgent SceneAgent { get; set; }
  392. public UUID ActiveGroupId { get { return m_activeGroupID; } set { m_activeGroupID = value; } }
  393. public string ActiveGroupName { get { return m_activeGroupName; } set { m_activeGroupName = value; } }
  394. public ulong ActiveGroupPowers { get { return m_activeGroupPowers; } set { m_activeGroupPowers = value; } }
  395. public bool IsGroupMember(UUID groupID) { return m_groupPowers.ContainsKey(groupID); }
  396. public int PingTimeMS
  397. {
  398. get
  399. {
  400. if (UDPClient != null)
  401. return UDPClient.PingTimeMS;
  402. return 0;
  403. }
  404. }
  405. /// <summary>
  406. /// Entity update queues
  407. /// </summary>
  408. public PriorityQueue EntityUpdateQueue { get { return m_entityUpdates; } }
  409. /// <summary>
  410. /// First name of the agent/avatar represented by the client
  411. /// </summary>
  412. public string FirstName { get { return m_firstName; } }
  413. /// <summary>
  414. /// Last name of the agent/avatar represented by the client
  415. /// </summary>
  416. public string LastName { get { return m_lastName; } }
  417. /// <summary>
  418. /// Full name of the client (first name and last name)
  419. /// </summary>
  420. public string Name { get { return FirstName + " " + LastName; } }
  421. public uint CircuitCode { get { return m_circuitCode; } }
  422. protected int m_animationSequenceNumber = (int)(Util.GetTimeStampTicks() & 0x5fffafL);
  423. public int NextAnimationSequenceNumber
  424. {
  425. get
  426. {
  427. int ret = Interlocked.Increment(ref m_animationSequenceNumber);
  428. if (ret <= 0)
  429. {
  430. m_animationSequenceNumber = (int)(Util.GetTimeStampTicks() & 0xafff5fL);
  431. ret = Interlocked.Increment(ref m_animationSequenceNumber);
  432. }
  433. return ret;
  434. }
  435. set
  436. {
  437. m_animationSequenceNumber = value;
  438. }
  439. }
  440. /// <summary>
  441. /// As well as it's function in IClientAPI, in LLClientView we are locking on this property in order to
  442. /// prevent race conditions by different threads calling Close().
  443. /// </summary>
  444. public bool IsActive { get; set; }
  445. /// <summary>
  446. /// Used to synchronise threads when client is being closed.
  447. /// </summary>
  448. public Object CloseSyncLock { get; private set; }
  449. public bool IsLoggingOut { get; set; }
  450. public bool DisableFacelights
  451. {
  452. get { return m_disableFacelights; }
  453. set { m_disableFacelights = value; }
  454. }
  455. public List<uint> SelectedObjects {get; private set;}
  456. public bool SendLogoutPacketWhenClosing { set { m_SendLogoutPacketWhenClosing = value; } }
  457. #endregion Properties
  458. // ~LLClientView()
  459. // {
  460. // m_log.DebugFormat("{0} Destructor called for {1}, circuit code {2}", LogHeader, Name, CircuitCode);
  461. // }
  462. /// <summary>
  463. /// Constructor
  464. /// </summary>
  465. public LLClientView(Scene scene, LLUDPServer udpServer, LLUDPClient udpClient, AuthenticateResponse sessionInfo,
  466. UUID agentId, UUID sessionId, uint circuitCode)
  467. {
  468. // DebugPacketLevel = 1;
  469. CloseSyncLock = new Object();
  470. SelectedObjects = new List<uint>();
  471. RegisterInterface<IClientIM>(this);
  472. RegisterInterface<IClientInventory>(this);
  473. RegisterInterface<IClientChat>(this);
  474. m_scene = scene;
  475. int pcap = 512;
  476. if(pcap > m_scene.Entities.Count)
  477. pcap = m_scene.Entities.Count;
  478. m_entityUpdates = new PriorityQueue(pcap);
  479. m_entityProps = new PriorityQueue(pcap);
  480. m_killRecord = new List<uint>();
  481. // m_attachmentsSent = new HashSet<uint>();
  482. m_assetService = m_scene.RequestModuleInterface<IAssetService>();
  483. m_GroupsModule = scene.RequestModuleInterface<IGroupsModule>();
  484. ImageManager = new LLImageManager(this, m_assetService, Scene.RequestModuleInterface<IJ2KDecoder>());
  485. m_regionChannelVersion = Util.StringToBytes1024(scene.GetSimulatorVersion());
  486. m_agentId = agentId;
  487. m_sessionId = sessionId;
  488. m_secureSessionId = sessionInfo.LoginInfo.SecureSession;
  489. m_circuitCode = circuitCode;
  490. m_firstName = sessionInfo.LoginInfo.First;
  491. m_lastName = sessionInfo.LoginInfo.Last;
  492. m_startpos = sessionInfo.LoginInfo.StartPos;
  493. StartFar = sessionInfo.LoginInfo.StartFar;
  494. m_udpServer = udpServer;
  495. m_udpClient = udpClient;
  496. m_udpClient.OnQueueEmpty += HandleQueueEmpty;
  497. m_udpClient.HasUpdates += HandleHasUpdates;
  498. m_udpClient.OnPacketStats += PopulateStats;
  499. m_prioritizer = new Prioritizer(m_scene);
  500. // Pick up agent scope which, for gods, can be different from the region scope
  501. IUserAccountService userAccountService = m_scene.RequestModuleInterface<IUserAccountService>();
  502. var myself = userAccountService.GetUserAccount(m_scene.RegionInfo.ScopeID, m_agentId);
  503. RegisterLocalPacketHandlers();
  504. string name = string.Format("AsyncInUDP-{0}",m_agentId.ToString());
  505. m_asyncPacketProcess = new JobEngine(name, name, 10000);
  506. IsActive = true;
  507. m_supportViewerCache = m_udpServer.SupportViewerObjectsCache;
  508. }
  509. #region Client Methods
  510. /// <summary>
  511. /// Close down the client view
  512. /// </summary>
  513. public void Close()
  514. {
  515. Close(true, false);
  516. }
  517. public void Close(bool sendStop, bool force)
  518. {
  519. // We lock here to prevent race conditions between two threads calling close simultaneously (e.g.
  520. // a simultaneous relog just as a client is being closed out due to no packet ack from the old connection.
  521. lock (CloseSyncLock)
  522. {
  523. // We still perform a force close inside the sync lock since this is intended to attempt close where
  524. // there is some unidentified connection problem, not where we have issues due to deadlock
  525. if (!IsActive && !force)
  526. {
  527. m_log.DebugFormat( "{0} Not attempting to close inactive client {1} in {2} since force flag is not set",
  528. LogHeader, Name, m_scene.Name);
  529. return;
  530. }
  531. IsActive = false;
  532. CloseWithoutChecks(sendStop);
  533. }
  534. }
  535. /// <summary>
  536. /// Closes down the client view without first checking whether it is active.
  537. /// </summary>
  538. /// <remarks>
  539. /// This exists because LLUDPServer has to set IsActive = false in earlier synchronous code before calling
  540. /// CloseWithoutIsActiveCheck asynchronously.
  541. ///
  542. /// Callers must lock ClosingSyncLock before calling.
  543. /// </remarks>
  544. public void CloseWithoutChecks(bool sendStop)
  545. {
  546. m_log.DebugFormat(
  547. "[CLIENT]: Close has been called for {0} attached to scene {1}",
  548. Name, m_scene.RegionInfo.RegionName);
  549. if (sendStop)
  550. {
  551. // Send the STOP packet
  552. DisableSimulatorPacket disable = (DisableSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.DisableSimulator);
  553. OutPacket(disable, ThrottleOutPacketType.Unknown);
  554. }
  555. // Fire the callback for this connection closing
  556. if (OnConnectionClosed != null)
  557. OnConnectionClosed(this);
  558. m_asyncPacketProcess.Stop();
  559. // Flush all of the packets out of the UDP server for this client
  560. if (m_udpServer != null)
  561. m_udpServer.Flush(m_udpClient);
  562. // Remove ourselves from the scene
  563. m_scene.RemoveClient(AgentId, true);
  564. SceneAgent = null;
  565. // We can't reach into other scenes and close the connection
  566. // We need to do this over grid communications
  567. //m_scene.CloseAllAgents(CircuitCode);
  568. // Disable UDP handling for this client
  569. m_udpClient.OnQueueEmpty -= HandleQueueEmpty;
  570. m_udpClient.HasUpdates -= HandleHasUpdates;
  571. m_udpClient.OnPacketStats -= PopulateStats;
  572. m_udpClient.Shutdown();
  573. // Shutdown the image manager
  574. ImageManager.Close();
  575. ImageManager = null;
  576. m_entityUpdates.Close();
  577. m_entityProps.Close();
  578. m_killRecord.Clear();
  579. GroupsInView.Clear();
  580. if(m_scene.GetNumberOfClients() == 0)
  581. {
  582. GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.CompactOnce;
  583. GC.Collect();
  584. GC.WaitForPendingFinalizers();
  585. GC.Collect();
  586. GCSettings.LargeObjectHeapCompactionMode = GCLargeObjectHeapCompactionMode.Default;
  587. }
  588. }
  589. public void Kick(string message)
  590. {
  591. if (!SceneAgent.IsChildAgent)
  592. {
  593. KickUserPacket kupack = (KickUserPacket)PacketPool.Instance.GetPacket(PacketType.KickUser);
  594. kupack.UserInfo.AgentID = AgentId;
  595. kupack.UserInfo.SessionID = SessionId;
  596. kupack.TargetBlock.TargetIP = 0;
  597. kupack.TargetBlock.TargetPort = 0;
  598. kupack.UserInfo.Reason = Util.StringToBytes256(message);
  599. OutPacket(kupack, ThrottleOutPacketType.Task);
  600. // You must sleep here or users get no message!
  601. Thread.Sleep(500);
  602. }
  603. }
  604. public void Stop()
  605. {
  606. }
  607. #endregion Client Methods
  608. #region Packet Handling
  609. public void PopulateStats(int inPackets, int outPackets, int unAckedBytes)
  610. {
  611. NetworkStats handlerNetworkStatsUpdate = OnNetworkStatsUpdate;
  612. if (handlerNetworkStatsUpdate != null)
  613. {
  614. handlerNetworkStatsUpdate(inPackets, outPackets, unAckedBytes);
  615. }
  616. }
  617. /// <summary>
  618. /// Add a handler for the given packet type.
  619. /// </summary>
  620. /// <remarks>
  621. /// The packet is handled on its own thread. If packets must be handled in the order in which they
  622. /// are received then please use the synchronous version of this method.
  623. /// </remarks>
  624. /// <param name="packetType"></param>
  625. /// <param name="handler"></param>
  626. /// <returns>true if the handler was added. This is currently always the case.</returns>
  627. public bool AddLocalPacketHandler(PacketType packetType, PacketMethod handler)
  628. {
  629. return AddLocalPacketHandler(packetType, handler, true);
  630. }
  631. /// <summary>
  632. /// Add a handler for the given packet type.
  633. /// </summary>
  634. /// <param name="packetType"></param>
  635. /// <param name="handler"></param>
  636. /// <param name="doAsync">
  637. /// If true, when the packet is received it is handled on its own thread rather than on the main inward bound
  638. /// packet handler thread. This vastly increases respnosiveness but some packets need to be handled
  639. /// synchronously.
  640. /// </param>
  641. /// <returns>true if the handler was added. This is currently always the case.</returns>
  642. public bool AddLocalPacketHandler(PacketType packetType, PacketMethod handler, bool doAsync)
  643. {
  644. bool result = false;
  645. lock (m_packetHandlers)
  646. {
  647. if (!m_packetHandlers.ContainsKey(packetType))
  648. {
  649. m_packetHandlers.Add(
  650. packetType, new PacketProcessor() { method = handler, Async = doAsync});
  651. result = true;
  652. }
  653. }
  654. return result;
  655. }
  656. public bool AddGenericPacketHandler(string MethodName, GenericMessage handler)
  657. {
  658. MethodName = MethodName.ToLower().Trim();
  659. bool result = false;
  660. lock (m_genericPacketHandlers)
  661. {
  662. if (!m_genericPacketHandlers.ContainsKey(MethodName))
  663. {
  664. m_genericPacketHandlers.Add(MethodName, handler);
  665. result = true;
  666. }
  667. }
  668. return result;
  669. }
  670. /// <summary>
  671. /// Try to process a packet using registered packet handlers
  672. /// </summary>
  673. /// <param name="packet"></param>
  674. /// <returns>True if a handler was found which successfully processed the packet.</returns>
  675. protected bool ProcessPacketMethod(Packet packet)
  676. {
  677. bool result = false;
  678. PacketProcessor pprocessor;
  679. if (m_packetHandlers.TryGetValue(packet.Type, out pprocessor))
  680. {
  681. //there is a local handler for this packet type
  682. if (pprocessor.Async)
  683. {
  684. object obj = new AsyncPacketProcess(this, pprocessor.method, packet);
  685. m_asyncPacketProcess.QueueJob(packet.Type.ToString(), () => ProcessSpecificPacketAsync(obj));
  686. result = true;
  687. }
  688. else
  689. {
  690. result = pprocessor.method(this, packet);
  691. }
  692. }
  693. return result;
  694. }
  695. public void ProcessSpecificPacketAsync(object state)
  696. {
  697. AsyncPacketProcess packetObject = (AsyncPacketProcess)state;
  698. try
  699. {
  700. packetObject.result = packetObject.Method(packetObject.ClientView, packetObject.Pack);
  701. }
  702. catch (Exception e)
  703. {
  704. // Make sure that we see any exception caused by the asynchronous operation.
  705. m_log.Error(
  706. string.Format(
  707. "[LLCLIENTVIEW]: Caught exception while processing {0} for {1} ", packetObject.Pack, Name),
  708. e);
  709. }
  710. }
  711. #endregion Packet Handling
  712. # region Setup
  713. public virtual void Start()
  714. {
  715. m_asyncPacketProcess.Start();
  716. m_scene.AddNewAgent(this, PresenceType.User);
  717. // RefreshGroupMembership();
  718. }
  719. # endregion
  720. public void ActivateGesture(UUID assetId, UUID gestureId)
  721. {
  722. }
  723. public void DeactivateGesture(UUID assetId, UUID gestureId)
  724. {
  725. }
  726. // Sound
  727. public void SoundTrigger(UUID soundId, UUID owerid, UUID Objectid, UUID ParentId, float Gain, Vector3 Position, UInt64 Handle)
  728. {
  729. }
  730. #region Scene/Avatar to Client
  731. // temporary here ( from estatemanagermodule)
  732. private uint GetRegionFlags()
  733. {
  734. RegionFlags flags = RegionFlags.None;
  735. if (Scene.RegionInfo.RegionSettings.AllowDamage)
  736. flags |= RegionFlags.AllowDamage;
  737. if (Scene.RegionInfo.EstateSettings.AllowLandmark)
  738. flags |= RegionFlags.AllowLandmark;
  739. if (Scene.RegionInfo.EstateSettings.AllowSetHome)
  740. flags |= RegionFlags.AllowSetHome;
  741. if (Scene.RegionInfo.EstateSettings.ResetHomeOnTeleport)
  742. flags |= RegionFlags.ResetHomeOnTeleport;
  743. if (Scene.RegionInfo.RegionSettings.FixedSun)
  744. flags |= RegionFlags.SunFixed;
  745. // allow access override (was taxfree)
  746. if (Scene.RegionInfo.RegionSettings.BlockTerraform)
  747. flags |= RegionFlags.BlockTerraform;
  748. if (!Scene.RegionInfo.RegionSettings.AllowLandResell)
  749. flags |= RegionFlags.BlockLandResell;
  750. if (Scene.RegionInfo.RegionSettings.Sandbox)
  751. flags |= RegionFlags.Sandbox;
  752. // nulllayer not used
  753. if (Scene.RegionInfo.RegionSettings.Casino)
  754. flags |= RegionFlags.SkipAgentAction; // redefined
  755. if (Scene.RegionInfo.RegionSettings.GodBlockSearch)
  756. flags |= RegionFlags.SkipUpdateInterestList; // redefined
  757. if (Scene.RegionInfo.RegionSettings.DisableCollisions)
  758. flags |= RegionFlags.SkipCollisions;
  759. if (Scene.RegionInfo.RegionSettings.DisableScripts)
  760. flags |= RegionFlags.SkipScripts;
  761. if (Scene.RegionInfo.RegionSettings.DisablePhysics)
  762. flags |= RegionFlags.SkipPhysics;
  763. if (Scene.RegionInfo.EstateSettings.PublicAccess)
  764. flags |= RegionFlags.ExternallyVisible; // ???? need revision
  765. //MainlandVisible -> allow return enc object
  766. //PublicAllowed -> allow return enc estate object
  767. if (Scene.RegionInfo.EstateSettings.BlockDwell)
  768. flags |= RegionFlags.BlockDwell;
  769. if (Scene.RegionInfo.RegionSettings.BlockFly)
  770. flags |= RegionFlags.NoFly;
  771. if (Scene.RegionInfo.EstateSettings.AllowDirectTeleport)
  772. flags |= RegionFlags.AllowDirectTeleport;
  773. if (Scene.RegionInfo.EstateSettings.EstateSkipScripts)
  774. flags |= RegionFlags.EstateSkipScripts;
  775. if (Scene.RegionInfo.RegionSettings.RestrictPushing)
  776. flags |= RegionFlags.RestrictPushObject;
  777. if (Scene.RegionInfo.EstateSettings.DenyAnonymous)
  778. flags |= RegionFlags.DenyAnonymous;
  779. //DenyIdentified unused
  780. //DenyTransacted unused
  781. if (Scene.RegionInfo.RegionSettings.AllowLandJoinDivide)
  782. flags |= RegionFlags.AllowParcelChanges;
  783. //AbuseEmailToEstateOwner -> block flyover
  784. if (Scene.RegionInfo.EstateSettings.AllowVoice)
  785. flags |= RegionFlags.AllowVoice;
  786. if (Scene.RegionInfo.RegionSettings.BlockShowInSearch)
  787. flags |= RegionFlags.BlockParcelSearch;
  788. if (Scene.RegionInfo.EstateSettings.DenyMinors)
  789. flags |= RegionFlags.DenyAgeUnverified;
  790. return (uint)flags;
  791. }
  792. // Region handshake may need a more detailed look
  793. static private readonly byte[] RegionHandshakeHeader = new byte[] {
  794. Helpers.MSG_RELIABLE | Helpers.MSG_ZEROCODED,
  795. 0, 0, 0, 0, // sequence number
  796. 0, // extra
  797. //0xff, 0xff, 0, 148 // ID 148 (low frequency bigendian)
  798. 0xff, 0xff, 0, 1, 148 // ID 148 (low frequency bigendian) zero encoded
  799. };
  800. public void SendRegionHandshake()
  801. {
  802. RegionInfo regionInfo = m_scene.RegionInfo;
  803. RegionSettings regionSettings = regionInfo.RegionSettings;
  804. EstateSettings es = regionInfo.EstateSettings;
  805. bool isEstateManager = m_scene.Permissions.IsEstateManager(AgentId); // go by oficial path
  806. uint regionFlags = GetRegionFlags();
  807. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  808. Buffer.BlockCopy(RegionHandshakeHeader, 0, buf.Data, 0, 11);
  809. // inline zeroencode
  810. LLUDPZeroEncoder zc = new LLUDPZeroEncoder(buf.Data);
  811. zc.Position = 11;
  812. //RegionInfo Block
  813. //RegionFlags U32
  814. zc.AddUInt(regionFlags);
  815. //SimAccess U8
  816. zc.AddByte(regionInfo.AccessLevel);
  817. //SimName
  818. zc.AddShortString(regionInfo.RegionName, 255);
  819. //SimOwner
  820. zc.AddUUID(es.EstateOwner);
  821. //IsEstateManager
  822. zc.AddByte((byte)(isEstateManager ? 1 : 0));
  823. //WaterHeight
  824. zc.AddFloat((float)regionSettings.WaterHeight); // why is this a double ??
  825. //BillableFactor
  826. zc.AddFloat(es.BillableFactor);
  827. //CacheID
  828. zc.AddUUID(regionInfo.CacheID);
  829. //TerrainBase0
  830. //TerrainBase1
  831. //TerrainBase2
  832. //TerrainBase3
  833. // this seem not obsolete, sending zero uuids
  834. // we should send the basic low resolution default ?
  835. zc.AddZeros(16 * 4);
  836. //TerrainDetail0
  837. zc.AddUUID(regionSettings.TerrainTexture1);
  838. //TerrainDetail1
  839. zc.AddUUID(regionSettings.TerrainTexture2);
  840. //TerrainDetail2
  841. zc.AddUUID(regionSettings.TerrainTexture3);
  842. //TerrainDetail3
  843. zc.AddUUID(regionSettings.TerrainTexture4);
  844. //TerrainStartHeight00
  845. zc.AddFloat((float)regionSettings.Elevation1SW);
  846. //TerrainStartHeight01
  847. zc.AddFloat((float)regionSettings.Elevation1NW);
  848. //TerrainStartHeight10
  849. zc.AddFloat((float)regionSettings.Elevation1SE);
  850. //TerrainStartHeight11
  851. zc.AddFloat((float)regionSettings.Elevation1NE);
  852. //TerrainHeightRange00
  853. zc.AddFloat((float)regionSettings.Elevation2SW);
  854. //TerrainHeightRange01
  855. zc.AddFloat((float)regionSettings.Elevation2NW);
  856. //TerrainHeightRange10
  857. zc.AddFloat((float)regionSettings.Elevation2SE);
  858. //TerrainHeightRange11
  859. zc.AddFloat((float)regionSettings.Elevation2NE);
  860. //RegionInfo2 block
  861. //region ID
  862. zc.AddUUID(regionInfo.RegionID);
  863. //RegionInfo3 block
  864. //CPUClassID
  865. zc.AddInt(9);
  866. //CPURatio
  867. zc.AddInt(1);
  868. // ColoName (string)
  869. // ProductSKU (string)
  870. // both empty strings
  871. zc.AddZeros(2);
  872. //ProductName
  873. zc.AddShortString(regionInfo.RegionType, 255);
  874. //RegionInfo4 block
  875. //RegionFlagsExtended
  876. //zc.AddZeros(1); // if we dont have this else
  877. zc.AddByte(1);
  878. zc.AddUInt64(regionFlags); // we have nothing other base flags
  879. //RegionProtocols
  880. // bit 0 signals server side texture baking
  881. // bit 63 signals more than 6 baked textures support"
  882. zc.AddUInt64(1UL << 63);
  883. buf.DataLength = zc.Finish();
  884. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Unknown);
  885. }
  886. static private readonly byte[] AgentMovementCompleteHeader = new byte[] {
  887. Helpers.MSG_RELIABLE,
  888. 0, 0, 0, 0, // sequence number
  889. 0, // extra
  890. 0xff, 0xff, 0, 250 // ID 250 (low frequency bigendian)
  891. };
  892. public void MoveAgentIntoRegion(RegionInfo regInfo, Vector3 pos, Vector3 look)
  893. {
  894. // reset agent update args
  895. m_thisAgentUpdateArgs.CameraAtAxis.X = float.MinValue;
  896. m_thisAgentUpdateArgs.lastUpdateTS = 0;
  897. m_thisAgentUpdateArgs.ControlFlags = 0;
  898. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  899. byte[] data = buf.Data;
  900. //setup header
  901. Buffer.BlockCopy(AgentMovementCompleteHeader, 0, data, 0, 10);
  902. //AgentData block
  903. AgentId.ToBytes(data, 10); // 26
  904. SessionId.ToBytes(data, 26); // 42
  905. //Data block
  906. if ((pos.X == 0) && (pos.Y == 0) && (pos.Z == 0))
  907. m_startpos.ToBytes(data, 42); //54
  908. else
  909. pos.ToBytes(data, 42); //54
  910. look.ToBytes(data, 54); // 66
  911. Utils.UInt64ToBytesSafepos(regInfo.RegionHandle, data, 66); // 74
  912. Utils.UIntToBytesSafepos((uint)Util.UnixTimeSinceEpoch(), data, 74); //78
  913. //SimData
  914. int len = m_regionChannelVersion.Length;
  915. if(len == 0)
  916. {
  917. data[78] = 0;
  918. data[79] = 0;
  919. }
  920. else
  921. {
  922. data[78] = (byte)len;
  923. data[79] = (byte)(len >> 8);
  924. Buffer.BlockCopy(m_regionChannelVersion, 0, data, 80, len);
  925. }
  926. buf.DataLength = 80 + len;
  927. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Unknown);
  928. }
  929. static private readonly byte[] ChatFromSimulatorHeader = new byte[] {
  930. Helpers.MSG_RELIABLE,
  931. 0, 0, 0, 0, // sequence number
  932. 0, // extra
  933. 0xff, 0xff, 0, 139 // ID 139 (low frequency bigendian)
  934. };
  935. public void SendChatMessage(string message, byte chattype, Vector3 fromPos, string fromName,
  936. UUID sourceID, UUID ownerID, byte sourcetype, byte audible)
  937. {
  938. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  939. byte[] data = buf.Data;
  940. //setup header
  941. Buffer.BlockCopy(ChatFromSimulatorHeader, 0, data, 0, 10);
  942. byte[] fname = Util.StringToBytes256(fromName);
  943. int len = fname.Length;
  944. int pos = 11;
  945. if (len == 0)
  946. data[10] = 0;
  947. else
  948. {
  949. data[10] = (byte)len;
  950. Buffer.BlockCopy(fname, 0, data, 11, len);
  951. pos += len;
  952. }
  953. sourceID.ToBytes(data, pos); pos += 16;
  954. ownerID.ToBytes(data, pos); pos += 16;
  955. data[pos++] = sourcetype;
  956. data[pos++] = chattype;
  957. data[pos++] = audible;
  958. fromPos.ToBytes(data, pos); pos += 12;
  959. byte[] msg = Util.StringToBytes1024(message);
  960. len = msg.Length;
  961. if (len == 0)
  962. {
  963. data[pos++] = 0;
  964. data[pos++] = 0;
  965. }
  966. else
  967. {
  968. data[pos++] = (byte)len;
  969. data[pos++] = (byte)(len >> 8);
  970. Buffer.BlockCopy(msg, 0, data, pos, len); pos += len;
  971. }
  972. buf.DataLength = pos;
  973. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Unknown);
  974. }
  975. /// <summary>
  976. /// Send an instant message to this client
  977. /// </summary>
  978. //
  979. static private readonly byte[] ImprovedInstantMessageHeader = new byte[] {
  980. Helpers.MSG_RELIABLE, //| Helpers.MSG_ZEROCODED, not doing spec zeroencode on this
  981. 0, 0, 0, 0, // sequence number
  982. 0, // extra
  983. 0xff, 0xff, 0, 254 // ID 139 (low frequency bigendian)
  984. };
  985. public void SendInstantMessage(GridInstantMessage im)
  986. {
  987. UUID fromAgentID = new UUID(im.fromAgentID);
  988. UUID toAgentID = new UUID(im.toAgentID);
  989. if (!m_scene.Permissions.CanInstantMessage(fromAgentID, toAgentID))
  990. return;
  991. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  992. byte[] data = buf.Data;
  993. //setup header
  994. Buffer.BlockCopy(ImprovedInstantMessageHeader, 0, data, 0, 10);
  995. //agentdata block
  996. fromAgentID.ToBytes(data, 10); // 26
  997. UUID.Zero.ToBytes(data, 26); // 42 sessionID zero?? TO check
  998. int pos = 42;
  999. //MessageBlock
  1000. data[pos++] = (byte)((im.fromGroup) ? 1 : 0);
  1001. toAgentID.ToBytes(data, pos); pos += 16;
  1002. Utils.UIntToBytesSafepos(im.ParentEstateID, data, pos); pos += 4;
  1003. (new UUID(im.RegionID)).ToBytes(data, pos); pos += 16;
  1004. (im.Position).ToBytes(data, pos); pos += 12;
  1005. data[pos++] = im.offline;
  1006. data[pos++] = im.dialog;
  1007. // this is odd
  1008. if (im.imSessionID == UUID.Zero.Guid)
  1009. (fromAgentID ^ toAgentID).ToBytes(data, pos);
  1010. else
  1011. (new UUID(im.imSessionID)).ToBytes(data, pos);
  1012. pos += 16;
  1013. Utils.UIntToBytesSafepos(im.timestamp, data, pos); pos += 4;
  1014. byte[] tmp = Util.StringToBytes256(im.fromAgentName);
  1015. int len = tmp.Length;
  1016. data[pos++] = (byte)len;
  1017. if(len > 0)
  1018. Buffer.BlockCopy(tmp, 0, data, pos, len); pos += len;
  1019. tmp = Util.StringToBytes1024(im.message);
  1020. len = tmp.Length;
  1021. if (len == 0)
  1022. {
  1023. data[pos++] = 0;
  1024. data[pos++] = 0;
  1025. }
  1026. else
  1027. {
  1028. data[pos++] = (byte)len;
  1029. data[pos++] = (byte)(len >> 8);
  1030. Buffer.BlockCopy(tmp, 0, data, pos, len); pos += len;
  1031. }
  1032. tmp = im.binaryBucket;
  1033. if(tmp == null)
  1034. {
  1035. data[pos++] = 0;
  1036. data[pos++] = 0;
  1037. }
  1038. else
  1039. {
  1040. len = tmp.Length;
  1041. if (len == 0)
  1042. {
  1043. data[pos++] = 0;
  1044. data[pos++] = 0;
  1045. }
  1046. else
  1047. {
  1048. data[pos++] = (byte)len;
  1049. data[pos++] = (byte)(len >> 8);
  1050. Buffer.BlockCopy(tmp, 0, data, pos, len); pos += len;
  1051. }
  1052. }
  1053. //EstateBlock does not seem in use TODO
  1054. //Utils.UIntToBytesSafepos(m_scene.RegionInfo.EstateSettings.EstateID, data, pos); pos += 4;
  1055. data[pos++] = 0;
  1056. data[pos++] = 0;
  1057. data[pos++] = 0;
  1058. data[pos++] = 0;
  1059. buf.DataLength = pos;
  1060. //m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Unknown, null, false, true);
  1061. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Unknown);
  1062. }
  1063. static private readonly byte[] GenericMessageHeader = new byte[] {
  1064. Helpers.MSG_RELIABLE, //| Helpers.MSG_ZEROCODED, not doing spec zeroencode on this
  1065. 0, 0, 0, 0, // sequence number
  1066. 0, // extra
  1067. 0xff, 0xff, 1, 5 // ID 261 (low frequency bigendian)
  1068. };
  1069. public void SendGenericMessage(string method, UUID invoice, List<string> message)
  1070. {
  1071. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  1072. byte[] data = buf.Data;
  1073. //setup header
  1074. Buffer.BlockCopy(GenericMessageHeader, 0, data, 0, 10);
  1075. //agentdata block
  1076. m_agentId.ToBytes(data, 10); // 26
  1077. m_sessionId.ToBytes(data, 26); // 42 sessionID zero?? TO check
  1078. UUID.Zero.ToBytes(data, 42); // 58
  1079. int pos = 58;
  1080. //method block
  1081. byte[] tmp = Util.StringToBytes256(method);
  1082. int len = tmp.Length;
  1083. data[pos++] = (byte)len;
  1084. if (len > 0)
  1085. Buffer.BlockCopy(tmp, 0, data, pos, len); pos += len;
  1086. invoice.ToBytes(data, pos); pos += 16;
  1087. //ParamList block
  1088. if (message.Count == 0)
  1089. {
  1090. data[pos++] = 0;
  1091. buf.DataLength = pos;
  1092. //m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task, null, false, true);
  1093. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task);
  1094. return;
  1095. }
  1096. int countpos = pos;
  1097. ++pos;
  1098. int count = 0;
  1099. for(int indx = 0; indx < message.Count; ++indx)
  1100. {
  1101. tmp = Util.StringToBytes256(message[indx]);
  1102. len = tmp.Length;
  1103. if (pos + len >= LLUDPServer.MAXPAYLOAD)
  1104. {
  1105. data[countpos] = (byte)count;
  1106. buf.DataLength = pos;
  1107. //m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task, null, false, true);
  1108. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task);
  1109. UDPPacketBuffer newbuf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  1110. Buffer.BlockCopy(data, 0, newbuf.Data, 0, countpos);
  1111. buf = newbuf;
  1112. data = buf.Data;
  1113. pos = countpos + 1;
  1114. count = 1;
  1115. }
  1116. else
  1117. ++count;
  1118. data[pos++] = (byte)len;
  1119. if (len > 0)
  1120. Buffer.BlockCopy(tmp, 0, data, pos, len); pos += len;
  1121. }
  1122. if (count > 0)
  1123. {
  1124. data[countpos] = (byte)count;
  1125. buf.DataLength = pos;
  1126. //m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task, null, false, true);
  1127. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task);
  1128. }
  1129. }
  1130. public void SendGenericMessage(string method, UUID invoice, List<byte[]> message)
  1131. {
  1132. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  1133. byte[] data = buf.Data;
  1134. //setup header
  1135. Buffer.BlockCopy(GenericMessageHeader, 0, data, 0, 10);
  1136. //agentdata block
  1137. m_agentId.ToBytes(data, 10); // 26
  1138. m_sessionId.ToBytes(data, 26); // 42 sessionID zero?? TO check
  1139. UUID.Zero.ToBytes(data, 42); // 58
  1140. int pos = 58;
  1141. //method block
  1142. byte[] tmp = Util.StringToBytes256(method);
  1143. int len = tmp.Length;
  1144. data[pos++] = (byte)len;
  1145. if (len > 0)
  1146. Buffer.BlockCopy(tmp, 0, data, pos, len); pos += len;
  1147. invoice.ToBytes(data, pos); pos += 16;
  1148. //ParamList block
  1149. if (message.Count == 0)
  1150. {
  1151. data[pos++] = 0;
  1152. buf.DataLength = pos;
  1153. //m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task, null, false, true);
  1154. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task);
  1155. return;
  1156. }
  1157. int countpos = pos;
  1158. ++pos;
  1159. byte[] val;
  1160. int count = 0;
  1161. for (int indx = 0; indx < message.Count; ++indx)
  1162. {
  1163. val = message[indx];
  1164. len = val.Length;
  1165. if(len > 255)
  1166. len = 255;
  1167. if (pos + len >= LLUDPServer.MAXPAYLOAD)
  1168. {
  1169. data[countpos] = (byte)count;
  1170. buf.DataLength = pos;
  1171. //m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task, null, false, true);
  1172. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task);
  1173. UDPPacketBuffer newbuf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  1174. Buffer.BlockCopy(data, 0, newbuf.Data, 0, countpos);
  1175. buf = newbuf;
  1176. data = buf.Data;
  1177. pos = countpos + 1;
  1178. count = 1;
  1179. }
  1180. else
  1181. ++count;
  1182. data[pos++] = (byte)len;
  1183. if (len > 0)
  1184. Buffer.BlockCopy(val, 0, data, pos, len); pos += len;
  1185. }
  1186. if (count > 0)
  1187. {
  1188. data[countpos] = (byte)count;
  1189. buf.DataLength = pos;
  1190. //m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task, null, false, true);
  1191. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task);
  1192. }
  1193. }
  1194. public void SendGroupActiveProposals(UUID groupID, UUID transactionID, GroupActiveProposals[] Proposals)
  1195. {
  1196. int i = 0;
  1197. foreach (GroupActiveProposals Proposal in Proposals)
  1198. {
  1199. GroupActiveProposalItemReplyPacket GAPIRP = new GroupActiveProposalItemReplyPacket();
  1200. GAPIRP.AgentData.AgentID = AgentId;
  1201. GAPIRP.AgentData.GroupID = groupID;
  1202. GAPIRP.TransactionData.TransactionID = transactionID;
  1203. GAPIRP.TransactionData.TotalNumItems = ((uint)i+1);
  1204. GroupActiveProposalItemReplyPacket.ProposalDataBlock ProposalData = new GroupActiveProposalItemReplyPacket.ProposalDataBlock();
  1205. GAPIRP.ProposalData = new GroupActiveProposalItemReplyPacket.ProposalDataBlock[1];
  1206. ProposalData.VoteCast = Utils.StringToBytes("false");
  1207. ProposalData.VoteID = new UUID(Proposal.VoteID);
  1208. ProposalData.VoteInitiator = new UUID(Proposal.VoteInitiator);
  1209. ProposalData.Majority = (float)Convert.ToInt32(Proposal.Majority);
  1210. ProposalData.Quorum = Convert.ToInt32(Proposal.Quorum);
  1211. ProposalData.TerseDateID = Utils.StringToBytes(Proposal.TerseDateID);
  1212. ProposalData.StartDateTime = Utils.StringToBytes(Proposal.StartDateTime);
  1213. ProposalData.EndDateTime = Utils.StringToBytes(Proposal.EndDateTime);
  1214. ProposalData.ProposalText = Utils.StringToBytes(Proposal.ProposalText);
  1215. ProposalData.AlreadyVoted = false;
  1216. GAPIRP.ProposalData[i] = ProposalData;
  1217. OutPacket(GAPIRP, ThrottleOutPacketType.Task);
  1218. i++;
  1219. }
  1220. if (Proposals.Length == 0)
  1221. {
  1222. GroupActiveProposalItemReplyPacket GAPIRP = new GroupActiveProposalItemReplyPacket();
  1223. GAPIRP.AgentData.AgentID = AgentId;
  1224. GAPIRP.AgentData.GroupID = groupID;
  1225. GAPIRP.TransactionData.TransactionID = transactionID;
  1226. GAPIRP.TransactionData.TotalNumItems = 1;
  1227. GroupActiveProposalItemReplyPacket.ProposalDataBlock ProposalData = new GroupActiveProposalItemReplyPacket.ProposalDataBlock();
  1228. GAPIRP.ProposalData = new GroupActiveProposalItemReplyPacket.ProposalDataBlock[1];
  1229. ProposalData.VoteCast = Utils.StringToBytes("false");
  1230. ProposalData.VoteID = UUID.Zero;
  1231. ProposalData.VoteInitiator = UUID.Zero;
  1232. ProposalData.Majority = 0;
  1233. ProposalData.Quorum = 0;
  1234. ProposalData.TerseDateID = Utils.StringToBytes("");
  1235. ProposalData.StartDateTime = Utils.StringToBytes("");
  1236. ProposalData.EndDateTime = Utils.StringToBytes("");
  1237. ProposalData.ProposalText = Utils.StringToBytes("");
  1238. ProposalData.AlreadyVoted = false;
  1239. GAPIRP.ProposalData[0] = ProposalData;
  1240. OutPacket(GAPIRP, ThrottleOutPacketType.Task);
  1241. }
  1242. }
  1243. public void SendGroupVoteHistory(UUID groupID, UUID transactionID, GroupVoteHistory[] Votes)
  1244. {
  1245. int i = 0;
  1246. foreach (GroupVoteHistory Vote in Votes)
  1247. {
  1248. GroupVoteHistoryItemReplyPacket GVHIRP = new GroupVoteHistoryItemReplyPacket();
  1249. GVHIRP.AgentData.AgentID = AgentId;
  1250. GVHIRP.AgentData.GroupID = groupID;
  1251. GVHIRP.TransactionData.TransactionID = transactionID;
  1252. GVHIRP.TransactionData.TotalNumItems = ((uint)i+1);
  1253. GVHIRP.HistoryItemData.VoteID = new UUID(Vote.VoteID);
  1254. GVHIRP.HistoryItemData.VoteInitiator = new UUID(Vote.VoteInitiator);
  1255. GVHIRP.HistoryItemData.Majority = (float)Convert.ToInt32(Vote.Majority);
  1256. GVHIRP.HistoryItemData.Quorum = Convert.ToInt32(Vote.Quorum);
  1257. GVHIRP.HistoryItemData.TerseDateID = Utils.StringToBytes(Vote.TerseDateID);
  1258. GVHIRP.HistoryItemData.StartDateTime = Utils.StringToBytes(Vote.StartDateTime);
  1259. GVHIRP.HistoryItemData.EndDateTime = Utils.StringToBytes(Vote.EndDateTime);
  1260. GVHIRP.HistoryItemData.VoteType = Utils.StringToBytes(Vote.VoteType);
  1261. GVHIRP.HistoryItemData.VoteResult = Utils.StringToBytes(Vote.VoteResult);
  1262. GVHIRP.HistoryItemData.ProposalText = Utils.StringToBytes(Vote.ProposalText);
  1263. GroupVoteHistoryItemReplyPacket.VoteItemBlock VoteItem = new GroupVoteHistoryItemReplyPacket.VoteItemBlock();
  1264. GVHIRP.VoteItem = new GroupVoteHistoryItemReplyPacket.VoteItemBlock[1];
  1265. VoteItem.CandidateID = UUID.Zero;
  1266. VoteItem.NumVotes = 0; //TODO: FIX THIS!!!
  1267. VoteItem.VoteCast = Utils.StringToBytes("Yes");
  1268. GVHIRP.VoteItem[i] = VoteItem;
  1269. OutPacket(GVHIRP, ThrottleOutPacketType.Task);
  1270. i++;
  1271. }
  1272. if (Votes.Length == 0)
  1273. {
  1274. GroupVoteHistoryItemReplyPacket GVHIRP = new GroupVoteHistoryItemReplyPacket();
  1275. GVHIRP.AgentData.AgentID = AgentId;
  1276. GVHIRP.AgentData.GroupID = groupID;
  1277. GVHIRP.TransactionData.TransactionID = transactionID;
  1278. GVHIRP.TransactionData.TotalNumItems = 0;
  1279. GVHIRP.HistoryItemData.VoteID = UUID.Zero;
  1280. GVHIRP.HistoryItemData.VoteInitiator = UUID.Zero;
  1281. GVHIRP.HistoryItemData.Majority = 0;
  1282. GVHIRP.HistoryItemData.Quorum = 0;
  1283. GVHIRP.HistoryItemData.TerseDateID = Utils.StringToBytes("");
  1284. GVHIRP.HistoryItemData.StartDateTime = Utils.StringToBytes("");
  1285. GVHIRP.HistoryItemData.EndDateTime = Utils.StringToBytes("");
  1286. GVHIRP.HistoryItemData.VoteType = Utils.StringToBytes("");
  1287. GVHIRP.HistoryItemData.VoteResult = Utils.StringToBytes("");
  1288. GVHIRP.HistoryItemData.ProposalText = Utils.StringToBytes("");
  1289. GroupVoteHistoryItemReplyPacket.VoteItemBlock VoteItem = new GroupVoteHistoryItemReplyPacket.VoteItemBlock();
  1290. GVHIRP.VoteItem = new GroupVoteHistoryItemReplyPacket.VoteItemBlock[1];
  1291. VoteItem.CandidateID = UUID.Zero;
  1292. VoteItem.NumVotes = 0; //TODO: FIX THIS!!!
  1293. VoteItem.VoteCast = Utils.StringToBytes("No");
  1294. GVHIRP.VoteItem[0] = VoteItem;
  1295. OutPacket(GVHIRP, ThrottleOutPacketType.Task);
  1296. }
  1297. }
  1298. public void SendGroupAccountingDetails(IClientAPI sender,UUID groupID, UUID transactionID, UUID sessionID, int amt)
  1299. {
  1300. GroupAccountDetailsReplyPacket GADRP = new GroupAccountDetailsReplyPacket();
  1301. GADRP.AgentData = new GroupAccountDetailsReplyPacket.AgentDataBlock();
  1302. GADRP.AgentData.AgentID = sender.AgentId;
  1303. GADRP.AgentData.GroupID = groupID;
  1304. GADRP.HistoryData = new GroupAccountDetailsReplyPacket.HistoryDataBlock[1];
  1305. GroupAccountDetailsReplyPacket.HistoryDataBlock History = new GroupAccountDetailsReplyPacket.HistoryDataBlock();
  1306. GADRP.MoneyData = new GroupAccountDetailsReplyPacket.MoneyDataBlock();
  1307. GADRP.MoneyData.CurrentInterval = 0;
  1308. GADRP.MoneyData.IntervalDays = 7;
  1309. GADRP.MoneyData.RequestID = transactionID;
  1310. GADRP.MoneyData.StartDate = Utils.StringToBytes(DateTime.Today.ToString());
  1311. History.Amount = amt;
  1312. History.Description = Utils.StringToBytes("");
  1313. GADRP.HistoryData[0] = History;
  1314. OutPacket(GADRP, ThrottleOutPacketType.Task);
  1315. }
  1316. public void SendGroupAccountingSummary(IClientAPI sender,UUID groupID, uint moneyAmt, int totalTier, int usedTier)
  1317. {
  1318. GroupAccountSummaryReplyPacket GASRP =
  1319. (GroupAccountSummaryReplyPacket)PacketPool.Instance.GetPacket(
  1320. PacketType.GroupAccountSummaryReply);
  1321. GASRP.AgentData = new GroupAccountSummaryReplyPacket.AgentDataBlock();
  1322. GASRP.AgentData.AgentID = sender.AgentId;
  1323. GASRP.AgentData.GroupID = groupID;
  1324. GASRP.MoneyData = new GroupAccountSummaryReplyPacket.MoneyDataBlock();
  1325. GASRP.MoneyData.Balance = (int)moneyAmt;
  1326. GASRP.MoneyData.TotalCredits = totalTier;
  1327. GASRP.MoneyData.TotalDebits = usedTier;
  1328. GASRP.MoneyData.StartDate = new byte[1];
  1329. GASRP.MoneyData.CurrentInterval = 1;
  1330. GASRP.MoneyData.GroupTaxCurrent = 0;
  1331. GASRP.MoneyData.GroupTaxEstimate = 0;
  1332. GASRP.MoneyData.IntervalDays = 0;
  1333. GASRP.MoneyData.LandTaxCurrent = 0;
  1334. GASRP.MoneyData.LandTaxEstimate = 0;
  1335. GASRP.MoneyData.LastTaxDate = new byte[1];
  1336. GASRP.MoneyData.LightTaxCurrent = 0;
  1337. GASRP.MoneyData.TaxDate = new byte[1];
  1338. GASRP.MoneyData.RequestID = sender.AgentId;
  1339. GASRP.MoneyData.ParcelDirFeeEstimate = 0;
  1340. GASRP.MoneyData.ParcelDirFeeCurrent = 0;
  1341. GASRP.MoneyData.ObjectTaxEstimate = 0;
  1342. GASRP.MoneyData.NonExemptMembers = 0;
  1343. GASRP.MoneyData.ObjectTaxCurrent = 0;
  1344. GASRP.MoneyData.LightTaxEstimate = 0;
  1345. OutPacket(GASRP, ThrottleOutPacketType.Task);
  1346. }
  1347. public void SendGroupTransactionsSummaryDetails(IClientAPI sender,UUID groupID, UUID transactionID, UUID sessionID, int amt)
  1348. {
  1349. GroupAccountTransactionsReplyPacket GATRP =
  1350. (GroupAccountTransactionsReplyPacket)PacketPool.Instance.GetPacket(
  1351. PacketType.GroupAccountTransactionsReply);
  1352. GATRP.AgentData = new GroupAccountTransactionsReplyPacket.AgentDataBlock();
  1353. GATRP.AgentData.AgentID = sender.AgentId;
  1354. GATRP.AgentData.GroupID = groupID;
  1355. GATRP.MoneyData = new GroupAccountTransactionsReplyPacket.MoneyDataBlock();
  1356. GATRP.MoneyData.CurrentInterval = 0;
  1357. GATRP.MoneyData.IntervalDays = 7;
  1358. GATRP.MoneyData.RequestID = transactionID;
  1359. GATRP.MoneyData.StartDate = Utils.StringToBytes(DateTime.Today.ToString());
  1360. GATRP.HistoryData = new GroupAccountTransactionsReplyPacket.HistoryDataBlock[1];
  1361. GroupAccountTransactionsReplyPacket.HistoryDataBlock History = new GroupAccountTransactionsReplyPacket.HistoryDataBlock();
  1362. History.Amount = 0;
  1363. History.Item = Utils.StringToBytes("");
  1364. History.Time = Utils.StringToBytes("");
  1365. History.Type = 0;
  1366. History.User = Utils.StringToBytes("");
  1367. GATRP.HistoryData[0] = History;
  1368. OutPacket(GATRP, ThrottleOutPacketType.Task);
  1369. }
  1370. public virtual bool CanSendLayerData()
  1371. {
  1372. int n = m_udpClient.GetPacketsQueuedCount(ThrottleOutPacketType.Land);
  1373. if ( n > 128)
  1374. return false;
  1375. return true;
  1376. }
  1377. /// <summary>
  1378. /// Send the region heightmap to the client
  1379. /// This method is only called when not doing intellegent terrain patch sending and
  1380. /// is only called when the scene presence is initially created and sends all of the
  1381. /// region's patches to the client.
  1382. /// </summary>
  1383. /// <param name="map">heightmap</param>
  1384. public virtual void SendLayerData()
  1385. {
  1386. Util.FireAndForget(DoSendLayerData, null, "LLClientView.DoSendLayerData");
  1387. }
  1388. /// <summary>
  1389. /// Send terrain layer information to the client.
  1390. /// </summary>
  1391. /// <param name="o"></param>
  1392. private void DoSendLayerData(object o)
  1393. {
  1394. TerrainData map = m_scene.Heightmap.GetTerrainData();
  1395. try
  1396. {
  1397. // Send LayerData in a spiral pattern. Fun!
  1398. SendLayerTopRight(0, 0, map.SizeX / Constants.TerrainPatchSize - 1, map.SizeY / Constants.TerrainPatchSize - 1);
  1399. }
  1400. catch (Exception e)
  1401. {
  1402. m_log.Error("[CLIENT]: SendLayerData() Failed with exception: " + e.Message, e);
  1403. }
  1404. }
  1405. private void SendLayerTopRight(int x1, int y1, int x2, int y2)
  1406. {
  1407. int[] p = new int[2];
  1408. // Row
  1409. p[1] = y1;
  1410. for (int i = x1; i <= x2; ++i)
  1411. {
  1412. p[0] = i;
  1413. SendLayerData(p);
  1414. }
  1415. // Column
  1416. p[0] = x2;
  1417. for (int j = y1 + 1; j <= y2; ++j)
  1418. {
  1419. p[1] = j;
  1420. SendLayerData(p);
  1421. }
  1422. if (x2 - x1 > 0 && y2 - y1 > 0)
  1423. SendLayerBottomLeft(x1, y1 + 1, x2 - 1, y2);
  1424. }
  1425. void SendLayerBottomLeft(int x1, int y1, int x2, int y2)
  1426. {
  1427. int[] p = new int[2];
  1428. // Row in reverse
  1429. p[1] = y2;
  1430. for (int i = x2; i >= x1; --i)
  1431. {
  1432. p[0] = i;
  1433. SendLayerData(p);
  1434. }
  1435. // Column in reverse
  1436. p[0] = x1;
  1437. for (int j = y2 - 1; j >= y1; --j)
  1438. {
  1439. p[1] = j;
  1440. SendLayerData(p);
  1441. }
  1442. if (x2 - x1 > 0 && y2 - y1 > 0)
  1443. SendLayerTopRight(x1 + 1, y1, x2, y2 - 1);
  1444. }
  1445. static private readonly byte[] TerrainPacketHeader = new byte[] {
  1446. Helpers.MSG_RELIABLE, // zero code is not as spec
  1447. 0, 0, 0, 0, // sequence number
  1448. 0, // extra
  1449. 11, // ID (high frequency)
  1450. };
  1451. private const int END_OF_PATCHES = 97;
  1452. private const int STRIDE = 264;
  1453. public void SendLayerData(int[] map)
  1454. {
  1455. if(map == null)
  1456. return;
  1457. try
  1458. {
  1459. TerrainData terrData = m_scene.Heightmap.GetTerrainData();
  1460. byte landPacketType = (terrData.SizeX > Constants.RegionSize || terrData.SizeY > Constants.RegionSize) ?
  1461. (byte)TerrainPatch.LayerType.LandExtended : (byte)TerrainPatch.LayerType.Land;
  1462. int numberPatchs = map.Length / 2;
  1463. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  1464. byte[] data = buf.Data;
  1465. Buffer.BlockCopy(TerrainPacketHeader, 0, data, 0, 7);
  1466. data[7] = landPacketType;
  1467. //data[8] and data[9] == datablock size to fill later
  1468. data[10] = 0; // BitPack needs this on reused packets
  1469. // start data
  1470. BitPack bitpack = new BitPack(data, 10);
  1471. bitpack.PackBits(STRIDE, 16);
  1472. bitpack.PackBitsFromByte(16);
  1473. bitpack.PackBitsFromByte(landPacketType);
  1474. int s;
  1475. int datasize = 0;
  1476. for (int i = 0; i < numberPatchs; i++)
  1477. {
  1478. s = 2 * i;
  1479. OpenSimTerrainCompressor.CreatePatchFromTerrainData(bitpack, terrData, map[s], map[s + 1]);
  1480. if (bitpack.BytePos > 900 && i != numberPatchs - 1)
  1481. {
  1482. //finish this packet
  1483. bitpack.PackBitsFromByte(END_OF_PATCHES);
  1484. // fix the datablock lenght
  1485. datasize = bitpack.BytePos - 9;
  1486. data[8] = (byte)datasize;
  1487. data[9] = (byte)(datasize >> 8);
  1488. buf.DataLength = bitpack.BytePos + 1;
  1489. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Land);
  1490. // start another
  1491. buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  1492. data = buf.Data;
  1493. Buffer.BlockCopy(TerrainPacketHeader, 0, data, 0, 7);
  1494. data[7] = landPacketType;
  1495. //data[8] and data[9] == datablock size to fill later
  1496. data[10] = 0; // BitPack needs this
  1497. // start data
  1498. bitpack = new BitPack(data, 10);
  1499. bitpack.PackBits(STRIDE, 16);
  1500. bitpack.PackBitsFromByte(16);
  1501. bitpack.PackBitsFromByte(landPacketType);
  1502. }
  1503. }
  1504. bitpack.PackBitsFromByte(END_OF_PATCHES);
  1505. datasize = bitpack.BytePos - 9;
  1506. data[8] = (byte)datasize;
  1507. data[9] = (byte)(datasize >> 8);
  1508. buf.DataLength = bitpack.BytePos + 1;
  1509. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Land);
  1510. }
  1511. catch (Exception e)
  1512. {
  1513. m_log.Error("[CLIENT]: SendLayerData() Failed with exception: " + e.Message, e);
  1514. }
  1515. }
  1516. private void DebugSendingPatches(string pWho, int[] pX, int[] pY)
  1517. {
  1518. if (m_log.IsDebugEnabled)
  1519. {
  1520. int numPatches = pX.Length;
  1521. string Xs = "";
  1522. string Ys = "";
  1523. for (int pp = 0; pp < numPatches; pp++)
  1524. {
  1525. Xs += String.Format("{0}", (int)pX[pp]) + ",";
  1526. Ys += String.Format("{0}", (int)pY[pp]) + ",";
  1527. }
  1528. m_log.DebugFormat("{0} {1}: numPatches={2}, X={3}, Y={4}", LogHeader, pWho, numPatches, Xs, Ys);
  1529. }
  1530. }
  1531. // wind caching
  1532. private static Dictionary<ulong,int> lastWindVersion = new Dictionary<ulong,int>();
  1533. private static Dictionary<ulong,List<LayerDataPacket>> lastWindPackets =
  1534. new Dictionary<ulong,List<LayerDataPacket>>();
  1535. /// <summary>
  1536. /// Send the wind matrix to the client
  1537. /// </summary>
  1538. /// <param name="windSpeeds">16x16 array of wind speeds</param>
  1539. public virtual void SendWindData(int version, Vector2[] windSpeeds)
  1540. {
  1541. // Vector2[] windSpeeds = (Vector2[])o;
  1542. ulong handle = this.Scene.RegionInfo.RegionHandle;
  1543. bool isNewData;
  1544. lock(lastWindPackets)
  1545. {
  1546. if(!lastWindVersion.ContainsKey(handle) ||
  1547. !lastWindPackets.ContainsKey(handle))
  1548. {
  1549. lastWindVersion[handle] = 0;
  1550. lastWindPackets[handle] = new List<LayerDataPacket>();
  1551. isNewData = true;
  1552. }
  1553. else
  1554. isNewData = lastWindVersion[handle] != version;
  1555. }
  1556. if(isNewData)
  1557. {
  1558. TerrainPatch[] patches = new TerrainPatch[2];
  1559. patches[0] = new TerrainPatch { Data = new float[16 * 16] };
  1560. patches[1] = new TerrainPatch { Data = new float[16 * 16] };
  1561. for (int x = 0; x < 16 * 16; x++)
  1562. {
  1563. patches[0].Data[x] = windSpeeds[x].X;
  1564. patches[1].Data[x] = windSpeeds[x].Y;
  1565. }
  1566. // neither we or viewers have extended wind
  1567. byte layerType = (byte)TerrainPatch.LayerType.Wind;
  1568. LayerDataPacket layerpack =
  1569. OpenSimTerrainCompressor.CreateLayerDataPacketStandardSize(
  1570. patches, layerType);
  1571. layerpack.Header.Zerocoded = true;
  1572. lock(lastWindPackets)
  1573. {
  1574. lastWindPackets[handle].Clear();
  1575. lastWindPackets[handle].Add(layerpack);
  1576. lastWindVersion[handle] = version;
  1577. }
  1578. }
  1579. lock(lastWindPackets)
  1580. foreach(LayerDataPacket pkt in lastWindPackets[handle])
  1581. OutPacket(pkt, ThrottleOutPacketType.Wind);
  1582. }
  1583. // cloud caching
  1584. private static Dictionary<ulong,int> lastCloudVersion = new Dictionary<ulong,int>();
  1585. private static Dictionary<ulong,List<LayerDataPacket>> lastCloudPackets =
  1586. new Dictionary<ulong,List<LayerDataPacket>>();
  1587. /// <summary>
  1588. /// Send the cloud matrix to the client
  1589. /// </summary>
  1590. /// <param name="windSpeeds">16x16 array of cloud densities</param>
  1591. public virtual void SendCloudData(int version, float[] cloudDensity)
  1592. {
  1593. ulong handle = this.Scene.RegionInfo.RegionHandle;
  1594. bool isNewData;
  1595. lock(lastWindPackets)
  1596. {
  1597. if(!lastCloudVersion.ContainsKey(handle) ||
  1598. !lastCloudPackets.ContainsKey(handle))
  1599. {
  1600. lastCloudVersion[handle] = 0;
  1601. lastCloudPackets[handle] = new List<LayerDataPacket>();
  1602. isNewData = true;
  1603. }
  1604. else
  1605. isNewData = lastCloudVersion[handle] != version;
  1606. }
  1607. if(isNewData)
  1608. {
  1609. TerrainPatch[] patches = new TerrainPatch[1];
  1610. patches[0] = new TerrainPatch();
  1611. patches[0].Data = new float[16 * 16];
  1612. for (int y = 0; y < 16; y++)
  1613. {
  1614. for (int x = 0; x < 16; x++)
  1615. {
  1616. patches[0].Data[y * 16 + x] = cloudDensity[y * 16 + x];
  1617. }
  1618. }
  1619. // neither we or viewers have extended clouds
  1620. byte layerType = (byte)TerrainPatch.LayerType.Cloud;
  1621. LayerDataPacket layerpack =
  1622. OpenSimTerrainCompressor.CreateLayerDataPacketStandardSize(
  1623. patches, layerType);
  1624. layerpack.Header.Zerocoded = true;
  1625. lock(lastCloudPackets)
  1626. {
  1627. lastCloudPackets[handle].Clear();
  1628. lastCloudPackets[handle].Add(layerpack);
  1629. lastCloudVersion[handle] = version;
  1630. }
  1631. }
  1632. lock(lastCloudPackets)
  1633. foreach(LayerDataPacket pkt in lastCloudPackets[handle])
  1634. OutPacket(pkt, ThrottleOutPacketType.Cloud);
  1635. }
  1636. /// <summary>
  1637. /// Tell the client that the given neighbour region is ready to receive a child agent.
  1638. /// </summary>
  1639. public virtual void InformClientOfNeighbour(ulong neighbourHandle, IPEndPoint neighbourEndPoint)
  1640. {
  1641. IPAddress neighbourIP = neighbourEndPoint.Address;
  1642. ushort neighbourPort = (ushort)neighbourEndPoint.Port;
  1643. EnableSimulatorPacket enablesimpacket = (EnableSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.EnableSimulator);
  1644. // TODO: don't create new blocks if recycling an old packet
  1645. enablesimpacket.SimulatorInfo = new EnableSimulatorPacket.SimulatorInfoBlock();
  1646. enablesimpacket.SimulatorInfo.Handle = neighbourHandle;
  1647. byte[] byteIP = neighbourIP.GetAddressBytes();
  1648. enablesimpacket.SimulatorInfo.IP = (uint)byteIP[3] << 24;
  1649. enablesimpacket.SimulatorInfo.IP += (uint)byteIP[2] << 16;
  1650. enablesimpacket.SimulatorInfo.IP += (uint)byteIP[1] << 8;
  1651. enablesimpacket.SimulatorInfo.IP += (uint)byteIP[0];
  1652. enablesimpacket.SimulatorInfo.Port = neighbourPort;
  1653. enablesimpacket.Header.Reliable = true; // ESP's should be reliable.
  1654. OutPacket(enablesimpacket, ThrottleOutPacketType.Task);
  1655. }
  1656. public AgentCircuitData RequestClientInfo()
  1657. {
  1658. AgentCircuitData agentData = new AgentCircuitData();
  1659. agentData.AgentID = AgentId;
  1660. agentData.SessionID = m_sessionId;
  1661. agentData.SecureSessionID = SecureSessionId;
  1662. agentData.circuitcode = m_circuitCode;
  1663. agentData.child = false;
  1664. agentData.firstname = m_firstName;
  1665. agentData.lastname = m_lastName;
  1666. ICapabilitiesModule capsModule = m_scene.RequestModuleInterface<ICapabilitiesModule>();
  1667. if (capsModule == null) // can happen when shutting down.
  1668. return agentData;
  1669. agentData.CapsPath = capsModule.GetCapsPath(m_agentId);
  1670. agentData.ChildrenCapSeeds = new Dictionary<ulong, string>(capsModule.GetChildrenSeeds(m_agentId));
  1671. return agentData;
  1672. }
  1673. public virtual void CrossRegion(ulong newRegionHandle, Vector3 pos, Vector3 lookAt, IPEndPoint externalIPEndPoint,
  1674. string capsURL)
  1675. {
  1676. Vector3 look = new Vector3(lookAt.X * 10, lookAt.Y * 10, lookAt.Z * 10);
  1677. //CrossedRegionPacket newSimPack = (CrossedRegionPacket)PacketPool.Instance.GetPacket(PacketType.CrossedRegion);
  1678. CrossedRegionPacket newSimPack = new CrossedRegionPacket();
  1679. // TODO: don't create new blocks if recycling an old packet
  1680. newSimPack.AgentData = new CrossedRegionPacket.AgentDataBlock();
  1681. newSimPack.AgentData.AgentID = AgentId;
  1682. newSimPack.AgentData.SessionID = m_sessionId;
  1683. newSimPack.Info = new CrossedRegionPacket.InfoBlock();
  1684. newSimPack.Info.Position = pos;
  1685. newSimPack.Info.LookAt = look;
  1686. newSimPack.RegionData = new CrossedRegionPacket.RegionDataBlock();
  1687. newSimPack.RegionData.RegionHandle = newRegionHandle;
  1688. byte[] byteIP = externalIPEndPoint.Address.GetAddressBytes();
  1689. newSimPack.RegionData.SimIP = (uint)byteIP[3] << 24;
  1690. newSimPack.RegionData.SimIP += (uint)byteIP[2] << 16;
  1691. newSimPack.RegionData.SimIP += (uint)byteIP[1] << 8;
  1692. newSimPack.RegionData.SimIP += (uint)byteIP[0];
  1693. newSimPack.RegionData.SimPort = (ushort)externalIPEndPoint.Port;
  1694. newSimPack.RegionData.SeedCapability = Util.StringToBytes256(capsURL);
  1695. // Hack to get this out immediately and skip throttles
  1696. OutPacket(newSimPack, ThrottleOutPacketType.Unknown);
  1697. }
  1698. static private readonly byte[] MapBlockItemHeader = new byte[] {
  1699. Helpers.MSG_RELIABLE,
  1700. 0, 0, 0, 0, // sequence number
  1701. 0, // extra
  1702. 0xff, 0xff, 1, 155 // ID 411 (low frequency bigendian)
  1703. };
  1704. public void SendMapItemReply(mapItemReply[] replies, uint mapitemtype, uint flags)
  1705. {
  1706. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  1707. byte[] data = buf.Data;
  1708. //setup header and agentinfo block
  1709. Buffer.BlockCopy(MapBlockItemHeader, 0, data, 0, 10);
  1710. AgentId.ToBytes(data, 10); // 26
  1711. Utils.UIntToBytesSafepos(flags, data, 26); // 30
  1712. //RequestData block
  1713. Utils.UIntToBytesSafepos(mapitemtype, data, 30); // 34
  1714. int countpos = 34;
  1715. int pos = 35;
  1716. int lastpos = 0;
  1717. int capacity = LLUDPServer.MAXPAYLOAD - pos;
  1718. int count = 0;
  1719. mapItemReply mr;
  1720. for (int k = 0; k < replies.Length; ++k)
  1721. {
  1722. lastpos = pos;
  1723. mr = replies[k];
  1724. Utils.UIntToBytesSafepos(mr.x, data, pos); pos += 4;
  1725. Utils.UIntToBytesSafepos(mr.y, data, pos); pos += 4;
  1726. mr.id.ToBytes(data, pos); pos += 16;
  1727. Utils.IntToBytesSafepos(mr.Extra, data, pos); pos += 4;
  1728. Utils.IntToBytesSafepos(mr.Extra2, data, pos); pos += 4;
  1729. byte[] itemName = Util.StringToBytes256(mr.name);
  1730. data[pos++] = (byte)itemName.Length;
  1731. if (itemName.Length > 0)
  1732. Buffer.BlockCopy(itemName, 0, data, pos, itemName.Length); pos += itemName.Length;
  1733. if (pos < capacity)
  1734. ++count;
  1735. else
  1736. {
  1737. // prepare next packet
  1738. UDPPacketBuffer newbuf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  1739. Buffer.BlockCopy(data, 0, newbuf.Data, 0, 34);
  1740. // copy the block we already did
  1741. int alreadyDone = pos - lastpos;
  1742. Buffer.BlockCopy(data, lastpos, newbuf.Data, 35, alreadyDone); // 34 is datablock size
  1743. // finish current
  1744. data[countpos] = (byte)count;
  1745. buf.DataLength = lastpos;
  1746. // send it
  1747. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Land);
  1748. buf = newbuf;
  1749. data = buf.Data;
  1750. pos = alreadyDone + 35;
  1751. capacity = LLUDPServer.MAXPAYLOAD - pos;
  1752. count = 1;
  1753. }
  1754. }
  1755. if (count > 0)
  1756. {
  1757. data[countpos] = (byte)count;
  1758. buf.DataLength = pos;
  1759. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Land);
  1760. }
  1761. }
  1762. static private readonly byte[] MapBlockReplyHeader = new byte[] {
  1763. Helpers.MSG_RELIABLE,
  1764. 0, 0, 0, 0, // sequence number
  1765. 0, // extra
  1766. 0xff, 0xff, 1, 153 // ID 409 (low frequency bigendian)
  1767. };
  1768. public void SendMapBlock(List<MapBlockData> mapBlocks, uint flags)
  1769. {
  1770. ushort[] sizes = new ushort[2 * mapBlocks.Count];
  1771. bool needSizes = false;
  1772. int sizesptr = 0;
  1773. // check if we will need sizes block and get them aside
  1774. int count = 0;
  1775. ushort ut;
  1776. MapBlockData md;
  1777. for (int indx = 0; indx < mapBlocks.Count; ++indx)
  1778. {
  1779. md = mapBlocks[indx];
  1780. ut = md.SizeX;
  1781. sizes[count++] = ut;
  1782. if (ut > 256)
  1783. needSizes = true;
  1784. ut = md.SizeY;
  1785. sizes[count++] = ut;
  1786. if (ut > 256)
  1787. needSizes = true;
  1788. }
  1789. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  1790. byte[] data = buf.Data;
  1791. //setup header and agentinfo block
  1792. Buffer.BlockCopy(MapBlockReplyHeader, 0, data, 0, 10);
  1793. AgentId.ToBytes(data, 10); // 26
  1794. Utils.UIntToBytesSafepos(flags, data, 26); // 30
  1795. int countpos = 30;
  1796. int pos = 31;
  1797. int lastpos = 0;
  1798. int capacity = LLUDPServer.MAXPAYLOAD - pos;
  1799. count = 0;
  1800. for (int indx = 0; indx < mapBlocks.Count; ++indx)
  1801. {
  1802. md = mapBlocks[indx];
  1803. lastpos = pos;
  1804. Utils.UInt16ToBytes(md.X, data, pos); pos += 2;
  1805. Utils.UInt16ToBytes(md.Y, data, pos); pos += 2;
  1806. byte[] regionName = Util.StringToBytes256(md.Name);
  1807. data[pos++] = (byte)regionName.Length;
  1808. if(regionName.Length > 0)
  1809. Buffer.BlockCopy(regionName, 0, data, pos, regionName.Length); pos += regionName.Length;
  1810. data[pos++] = md.Access;
  1811. Utils.UIntToBytesSafepos(md.RegionFlags, data, pos); pos += 4;
  1812. data[pos++] = md.WaterHeight;
  1813. data[pos++] = md.Agents;
  1814. md.MapImageId.ToBytes(data, pos); pos += 16;
  1815. if(needSizes)
  1816. capacity -= 4; // 2 shorts per entry
  1817. if(pos < capacity)
  1818. ++count;
  1819. else
  1820. {
  1821. // prepare next packet
  1822. UDPPacketBuffer newbuf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  1823. Buffer.BlockCopy(data, 0, newbuf.Data, 0, 30);
  1824. // copy the block we already did
  1825. int alreadyDone = pos - lastpos;
  1826. Buffer.BlockCopy(data, lastpos, newbuf.Data, 31, alreadyDone); // 30 is datablock size
  1827. // finish current
  1828. data[countpos] = (byte)count;
  1829. if (needSizes)
  1830. {
  1831. data[lastpos++] = (byte)count;
  1832. while (--count >= 0)
  1833. {
  1834. Utils.UInt16ToBytes(sizes[sizesptr++], data, lastpos); lastpos += 2;
  1835. Utils.UInt16ToBytes(sizes[sizesptr++], data, lastpos); lastpos += 2;
  1836. }
  1837. }
  1838. else
  1839. data[lastpos++] = 0;
  1840. buf.DataLength = lastpos;
  1841. // send it
  1842. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Land);
  1843. buf = newbuf;
  1844. data = buf.Data;
  1845. pos = alreadyDone + 31;
  1846. capacity = LLUDPServer.MAXPAYLOAD - pos;
  1847. if (needSizes)
  1848. capacity -= 4; // 2 shorts per entry
  1849. count = 1;
  1850. }
  1851. }
  1852. if (count > 0)
  1853. {
  1854. data[countpos] = (byte)count;
  1855. if (needSizes)
  1856. {
  1857. data[pos++] = (byte)count;
  1858. while (--count >= 0)
  1859. {
  1860. Utils.UInt16ToBytes(sizes[sizesptr++], data, pos); pos += 2;
  1861. Utils.UInt16ToBytes(sizes[sizesptr++], data, pos); pos += 2;
  1862. }
  1863. }
  1864. else
  1865. data[pos++] = 0;
  1866. buf.DataLength = pos;
  1867. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Land);
  1868. }
  1869. }
  1870. public void SendLocalTeleport(Vector3 position, Vector3 lookAt, uint flags)
  1871. {
  1872. TeleportLocalPacket tpLocal = (TeleportLocalPacket)PacketPool.Instance.GetPacket(PacketType.TeleportLocal);
  1873. tpLocal.Info.AgentID = AgentId;
  1874. tpLocal.Info.TeleportFlags = flags;
  1875. tpLocal.Info.LocationID = 2;
  1876. tpLocal.Info.LookAt = lookAt;
  1877. tpLocal.Info.Position = position;
  1878. // Hack to get this out immediately and skip throttles
  1879. OutPacket(tpLocal, ThrottleOutPacketType.Unknown);
  1880. }
  1881. public virtual void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint newRegionEndPoint, uint locationID,
  1882. uint flags, string capsURL)
  1883. {
  1884. //TeleportFinishPacket teleport = (TeleportFinishPacket)PacketPool.Instance.GetPacket(PacketType.TeleportFinish);
  1885. TeleportFinishPacket teleport = new TeleportFinishPacket();
  1886. teleport.Info.AgentID = AgentId;
  1887. teleport.Info.RegionHandle = regionHandle;
  1888. teleport.Info.SimAccess = simAccess;
  1889. teleport.Info.SeedCapability = Util.StringToBytes256(capsURL);
  1890. IPAddress oIP = newRegionEndPoint.Address;
  1891. byte[] byteIP = oIP.GetAddressBytes();
  1892. uint ip = (uint)byteIP[3] << 24;
  1893. ip += (uint)byteIP[2] << 16;
  1894. ip += (uint)byteIP[1] << 8;
  1895. ip += (uint)byteIP[0];
  1896. teleport.Info.SimIP = ip;
  1897. teleport.Info.SimPort = (ushort)newRegionEndPoint.Port;
  1898. teleport.Info.LocationID = 4;
  1899. teleport.Info.TeleportFlags = 1 << 4;
  1900. // Hack to get this out immediately and skip throttles.
  1901. OutPacket(teleport, ThrottleOutPacketType.Unknown);
  1902. }
  1903. /// <summary>
  1904. /// Inform the client that a teleport attempt has failed
  1905. /// </summary>
  1906. public void SendTeleportFailed(string reason)
  1907. {
  1908. TeleportFailedPacket tpFailed = (TeleportFailedPacket)PacketPool.Instance.GetPacket(PacketType.TeleportFailed);
  1909. tpFailed.Info.AgentID = AgentId;
  1910. tpFailed.Info.Reason = Util.StringToBytes256(reason);
  1911. tpFailed.AlertInfo = new TeleportFailedPacket.AlertInfoBlock[0];
  1912. // Hack to get this out immediately and skip throttles
  1913. OutPacket(tpFailed, ThrottleOutPacketType.Unknown);
  1914. }
  1915. /// <summary>
  1916. ///
  1917. /// </summary>
  1918. public void SendTeleportStart(uint flags)
  1919. {
  1920. TeleportStartPacket tpStart = (TeleportStartPacket)PacketPool.Instance.GetPacket(PacketType.TeleportStart);
  1921. //TeleportStartPacket tpStart = new TeleportStartPacket();
  1922. tpStart.Info.TeleportFlags = flags; //16; // Teleport via location
  1923. // Hack to get this out immediately and skip throttles
  1924. OutPacket(tpStart, ThrottleOutPacketType.Unknown);
  1925. }
  1926. public void SendTeleportProgress(uint flags, string message)
  1927. {
  1928. TeleportProgressPacket tpProgress = (TeleportProgressPacket)PacketPool.Instance.GetPacket(PacketType.TeleportProgress);
  1929. tpProgress.AgentData.AgentID = this.AgentId;
  1930. tpProgress.Info.TeleportFlags = flags;
  1931. tpProgress.Info.Message = Util.StringToBytes256(message);
  1932. // Hack to get this out immediately and skip throttles
  1933. OutPacket(tpProgress, ThrottleOutPacketType.Unknown);
  1934. }
  1935. public void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance, int transactionType, UUID sourceID, bool sourceIsGroup, UUID destID, bool destIsGroup, int amount, string item)
  1936. {
  1937. MoneyBalanceReplyPacket money = (MoneyBalanceReplyPacket)PacketPool.Instance.GetPacket(PacketType.MoneyBalanceReply);
  1938. money.MoneyData.AgentID = AgentId;
  1939. money.MoneyData.TransactionID = transaction;
  1940. money.MoneyData.TransactionSuccess = success;
  1941. money.MoneyData.Description = description;
  1942. money.MoneyData.MoneyBalance = balance;
  1943. money.TransactionInfo.TransactionType = transactionType;
  1944. money.TransactionInfo.SourceID = sourceID;
  1945. money.TransactionInfo.IsSourceGroup = sourceIsGroup;
  1946. money.TransactionInfo.DestID = destID;
  1947. money.TransactionInfo.IsDestGroup = destIsGroup;
  1948. money.TransactionInfo.Amount = amount;
  1949. money.TransactionInfo.ItemDescription = Util.StringToBytes256(item);
  1950. OutPacket(money, ThrottleOutPacketType.Task);
  1951. }
  1952. public void SendPayPrice(UUID objectID, int[] payPrice)
  1953. {
  1954. if (payPrice[0] == 0 &&
  1955. payPrice[1] == 0 &&
  1956. payPrice[2] == 0 &&
  1957. payPrice[3] == 0 &&
  1958. payPrice[4] == 0)
  1959. return;
  1960. PayPriceReplyPacket payPriceReply = (PayPriceReplyPacket)PacketPool.Instance.GetPacket(PacketType.PayPriceReply);
  1961. payPriceReply.ObjectData.ObjectID = objectID;
  1962. payPriceReply.ObjectData.DefaultPayPrice = payPrice[0];
  1963. payPriceReply.ButtonData = new PayPriceReplyPacket.ButtonDataBlock[4];
  1964. payPriceReply.ButtonData[0] = new PayPriceReplyPacket.ButtonDataBlock();
  1965. payPriceReply.ButtonData[0].PayButton = payPrice[1];
  1966. payPriceReply.ButtonData[1] = new PayPriceReplyPacket.ButtonDataBlock();
  1967. payPriceReply.ButtonData[1].PayButton = payPrice[2];
  1968. payPriceReply.ButtonData[2] = new PayPriceReplyPacket.ButtonDataBlock();
  1969. payPriceReply.ButtonData[2].PayButton = payPrice[3];
  1970. payPriceReply.ButtonData[3] = new PayPriceReplyPacket.ButtonDataBlock();
  1971. payPriceReply.ButtonData[3].PayButton = payPrice[4];
  1972. OutPacket(payPriceReply, ThrottleOutPacketType.Task);
  1973. }
  1974. public void SendKillObject(List<uint> localIDs)
  1975. {
  1976. // foreach (uint id in localIDs)
  1977. // m_log.DebugFormat("[CLIENT]: Sending KillObjectPacket to {0} for {1} in {2}", Name, id, regionHandle);
  1978. // remove pending entities to reduce looping chances.
  1979. lock (m_entityProps.SyncRoot)
  1980. m_entityProps.Remove(localIDs);
  1981. lock (m_entityUpdates.SyncRoot)
  1982. m_entityUpdates.Remove(localIDs);
  1983. KillObjectPacket kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject);
  1984. int perpacket = localIDs.Count;
  1985. if(perpacket > 200)
  1986. perpacket = 200;
  1987. int nsent = 0;
  1988. kill.ObjectData = new KillObjectPacket.ObjectDataBlock[perpacket];
  1989. for (int i = 0 ; i < localIDs.Count ; i++ )
  1990. {
  1991. kill.ObjectData[nsent] = new KillObjectPacket.ObjectDataBlock();
  1992. kill.ObjectData[nsent].ID = localIDs[i];
  1993. if(++nsent >= 200)
  1994. {
  1995. OutPacket(kill, ThrottleOutPacketType.Task);
  1996. perpacket = localIDs.Count - i - 1;
  1997. if(perpacket == 0)
  1998. break;
  1999. if(perpacket > 200)
  2000. perpacket = 200;
  2001. kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject);
  2002. kill.ObjectData = new KillObjectPacket.ObjectDataBlock[perpacket];
  2003. nsent = 0;
  2004. }
  2005. }
  2006. if(nsent != 0)
  2007. {
  2008. OutPacket(kill, ThrottleOutPacketType.Task);
  2009. }
  2010. }
  2011. /// <summary>
  2012. /// Send information about the items contained in a folder to the client.
  2013. /// </summary>
  2014. /// <remarks>
  2015. /// XXX This method needs some refactoring loving
  2016. /// </remarks>
  2017. /// <param name="ownerID">The owner of the folder</param>
  2018. /// <param name="folderID">The id of the folder</param>
  2019. /// <param name="items">The items contained in the folder identified by folderID</param>
  2020. /// <param name="folders"></param>
  2021. /// <param name="fetchFolders">Do we need to send folder information?</param>
  2022. /// <param name="fetchItems">Do we need to send item information?</param>
  2023. public void SendInventoryFolderDetails(UUID ownerID, UUID folderID, List<InventoryItemBase> items,
  2024. List<InventoryFolderBase> folders, int version,
  2025. bool fetchFolders, bool fetchItems)
  2026. {
  2027. // An inventory descendents packet consists of a single agent section and an inventory details
  2028. // section for each inventory item. The size of each inventory item is approximately 550 bytes.
  2029. // limit to what may fit on MTU
  2030. int MAX_ITEMS_PER_PACKET = 5;
  2031. int MAX_FOLDERS_PER_PACKET = 6;
  2032. int totalItems = fetchItems ? items.Count : 0;
  2033. int totalFolders = fetchFolders ? folders.Count : 0;
  2034. int itemsSent = 0;
  2035. int foldersSent = 0;
  2036. int foldersToSend = 0;
  2037. int itemsToSend = 0;
  2038. InventoryDescendentsPacket currentPacket = null;
  2039. // Handle empty folders
  2040. //
  2041. if (totalItems == 0 && totalFolders == 0)
  2042. currentPacket = CreateInventoryDescendentsPacket(ownerID, folderID, version, items.Count + folders.Count, 0, 0);
  2043. // To preserve SL compatibility, we will NOT combine folders and items in one packet
  2044. //
  2045. while (itemsSent < totalItems || foldersSent < totalFolders)
  2046. {
  2047. if (currentPacket == null) // Start a new packet
  2048. {
  2049. foldersToSend = totalFolders - foldersSent;
  2050. if (foldersToSend > MAX_FOLDERS_PER_PACKET)
  2051. foldersToSend = MAX_FOLDERS_PER_PACKET;
  2052. if (foldersToSend == 0)
  2053. {
  2054. itemsToSend = totalItems - itemsSent;
  2055. if (itemsToSend > MAX_ITEMS_PER_PACKET)
  2056. itemsToSend = MAX_ITEMS_PER_PACKET;
  2057. }
  2058. currentPacket = CreateInventoryDescendentsPacket(ownerID, folderID, version, items.Count + folders.Count, foldersToSend, itemsToSend);
  2059. }
  2060. if (foldersToSend-- > 0)
  2061. currentPacket.FolderData[foldersSent % MAX_FOLDERS_PER_PACKET] = CreateFolderDataBlock(folders[foldersSent++]);
  2062. else if (itemsToSend-- > 0)
  2063. currentPacket.ItemData[itemsSent % MAX_ITEMS_PER_PACKET] = CreateItemDataBlock(items[itemsSent++]);
  2064. else
  2065. {
  2066. // m_log.DebugFormat(
  2067. // "[LLCLIENTVIEW]: Sending inventory folder details packet to {0} for folder {1}", Name, folderID);
  2068. OutPacket(currentPacket, ThrottleOutPacketType.Asset, false);
  2069. currentPacket = null;
  2070. }
  2071. }
  2072. if (currentPacket != null)
  2073. {
  2074. // m_log.DebugFormat(
  2075. // "[LLCLIENTVIEW]: Sending inventory folder details packet to {0} for folder {1}", Name, folderID);
  2076. OutPacket(currentPacket, ThrottleOutPacketType.Asset, false);
  2077. }
  2078. }
  2079. private InventoryDescendentsPacket.FolderDataBlock CreateFolderDataBlock(InventoryFolderBase folder)
  2080. {
  2081. InventoryDescendentsPacket.FolderDataBlock newBlock = new InventoryDescendentsPacket.FolderDataBlock();
  2082. newBlock.FolderID = folder.ID;
  2083. newBlock.Name = Util.StringToBytes256(folder.Name);
  2084. newBlock.ParentID = folder.ParentID;
  2085. newBlock.Type = (sbyte)folder.Type;
  2086. //if (newBlock.Type == InventoryItemBase.SUITCASE_FOLDER_TYPE)
  2087. // newBlock.Type = InventoryItemBase.SUITCASE_FOLDER_FAKE_TYPE;
  2088. return newBlock;
  2089. }
  2090. private InventoryDescendentsPacket.ItemDataBlock CreateItemDataBlock(InventoryItemBase item)
  2091. {
  2092. InventoryDescendentsPacket.ItemDataBlock newBlock = new InventoryDescendentsPacket.ItemDataBlock();
  2093. newBlock.ItemID = item.ID;
  2094. newBlock.AssetID = item.AssetID;
  2095. newBlock.CreatorID = item.CreatorIdAsUuid;
  2096. newBlock.BaseMask = item.BasePermissions;
  2097. newBlock.Description = Util.StringToBytes256(item.Description);
  2098. newBlock.EveryoneMask = item.EveryOnePermissions;
  2099. newBlock.OwnerMask = item.CurrentPermissions;
  2100. newBlock.FolderID = item.Folder;
  2101. newBlock.InvType = (sbyte)item.InvType;
  2102. newBlock.Name = Util.StringToBytes256(item.Name);
  2103. newBlock.NextOwnerMask = item.NextPermissions;
  2104. newBlock.OwnerID = item.Owner;
  2105. newBlock.Type = (sbyte)item.AssetType;
  2106. newBlock.GroupID = item.GroupID;
  2107. newBlock.GroupOwned = item.GroupOwned;
  2108. newBlock.GroupMask = item.GroupPermissions;
  2109. newBlock.CreationDate = item.CreationDate;
  2110. newBlock.SalePrice = item.SalePrice;
  2111. newBlock.SaleType = item.SaleType;
  2112. newBlock.Flags = item.Flags & 0x2000ff;
  2113. newBlock.CRC =
  2114. Helpers.InventoryCRC(newBlock.CreationDate, newBlock.SaleType,
  2115. newBlock.InvType, newBlock.Type,
  2116. newBlock.AssetID, newBlock.GroupID,
  2117. newBlock.SalePrice,
  2118. newBlock.OwnerID, newBlock.CreatorID,
  2119. newBlock.ItemID, newBlock.FolderID,
  2120. newBlock.EveryoneMask,
  2121. newBlock.Flags, newBlock.OwnerMask,
  2122. newBlock.GroupMask, newBlock.NextOwnerMask);
  2123. return newBlock;
  2124. }
  2125. private void AddNullFolderBlockToDecendentsPacket(ref InventoryDescendentsPacket packet)
  2126. {
  2127. packet.FolderData = new InventoryDescendentsPacket.FolderDataBlock[1];
  2128. packet.FolderData[0] = new InventoryDescendentsPacket.FolderDataBlock();
  2129. packet.FolderData[0].FolderID = UUID.Zero;
  2130. packet.FolderData[0].ParentID = UUID.Zero;
  2131. packet.FolderData[0].Type = -1;
  2132. packet.FolderData[0].Name = new byte[0];
  2133. }
  2134. private void AddNullItemBlockToDescendentsPacket(ref InventoryDescendentsPacket packet)
  2135. {
  2136. packet.ItemData = new InventoryDescendentsPacket.ItemDataBlock[1];
  2137. packet.ItemData[0] = new InventoryDescendentsPacket.ItemDataBlock();
  2138. packet.ItemData[0].ItemID = UUID.Zero;
  2139. packet.ItemData[0].AssetID = UUID.Zero;
  2140. packet.ItemData[0].CreatorID = UUID.Zero;
  2141. packet.ItemData[0].BaseMask = 0;
  2142. packet.ItemData[0].Description = new byte[0];
  2143. packet.ItemData[0].EveryoneMask = 0;
  2144. packet.ItemData[0].OwnerMask = 0;
  2145. packet.ItemData[0].FolderID = UUID.Zero;
  2146. packet.ItemData[0].InvType = (sbyte)0;
  2147. packet.ItemData[0].Name = new byte[0];
  2148. packet.ItemData[0].NextOwnerMask = 0;
  2149. packet.ItemData[0].OwnerID = UUID.Zero;
  2150. packet.ItemData[0].Type = -1;
  2151. packet.ItemData[0].GroupID = UUID.Zero;
  2152. packet.ItemData[0].GroupOwned = false;
  2153. packet.ItemData[0].GroupMask = 0;
  2154. packet.ItemData[0].CreationDate = 0;
  2155. packet.ItemData[0].SalePrice = 0;
  2156. packet.ItemData[0].SaleType = 0;
  2157. packet.ItemData[0].Flags = 0;
  2158. // No need to add CRC
  2159. }
  2160. private InventoryDescendentsPacket CreateInventoryDescendentsPacket(UUID ownerID, UUID folderID, int version, int descendents, int folders, int items)
  2161. {
  2162. InventoryDescendentsPacket descend = (InventoryDescendentsPacket)PacketPool.Instance.GetPacket(PacketType.InventoryDescendents);
  2163. descend.Header.Zerocoded = true;
  2164. descend.AgentData.AgentID = AgentId;
  2165. descend.AgentData.OwnerID = ownerID;
  2166. descend.AgentData.FolderID = folderID;
  2167. descend.AgentData.Version = version;
  2168. descend.AgentData.Descendents = descendents;
  2169. if (folders > 0)
  2170. descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[folders];
  2171. else
  2172. AddNullFolderBlockToDecendentsPacket(ref descend);
  2173. if (items > 0)
  2174. descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[items];
  2175. else
  2176. AddNullItemBlockToDescendentsPacket(ref descend);
  2177. return descend;
  2178. }
  2179. public void SendInventoryItemDetails(UUID ownerID, InventoryItemBase item)
  2180. {
  2181. // Fudge this value. It's only needed to make the CRC anyway
  2182. const uint FULL_MASK_PERMISSIONS = (uint)0x7fffffff;
  2183. FetchInventoryReplyPacket inventoryReply = (FetchInventoryReplyPacket)PacketPool.Instance.GetPacket(PacketType.FetchInventoryReply);
  2184. // TODO: don't create new blocks if recycling an old packet
  2185. inventoryReply.AgentData.AgentID = AgentId;
  2186. inventoryReply.InventoryData = new FetchInventoryReplyPacket.InventoryDataBlock[1];
  2187. inventoryReply.InventoryData[0] = new FetchInventoryReplyPacket.InventoryDataBlock();
  2188. inventoryReply.InventoryData[0].ItemID = item.ID;
  2189. inventoryReply.InventoryData[0].AssetID = item.AssetID;
  2190. inventoryReply.InventoryData[0].CreatorID = item.CreatorIdAsUuid;
  2191. inventoryReply.InventoryData[0].BaseMask = item.BasePermissions;
  2192. inventoryReply.InventoryData[0].CreationDate = item.CreationDate;
  2193. inventoryReply.InventoryData[0].Description = Util.StringToBytes256(item.Description);
  2194. inventoryReply.InventoryData[0].EveryoneMask = item.EveryOnePermissions;
  2195. inventoryReply.InventoryData[0].FolderID = item.Folder;
  2196. inventoryReply.InventoryData[0].InvType = (sbyte)item.InvType;
  2197. inventoryReply.InventoryData[0].Name = Util.StringToBytes256(item.Name);
  2198. inventoryReply.InventoryData[0].NextOwnerMask = item.NextPermissions;
  2199. inventoryReply.InventoryData[0].OwnerID = item.Owner;
  2200. inventoryReply.InventoryData[0].OwnerMask = item.CurrentPermissions;
  2201. inventoryReply.InventoryData[0].Type = (sbyte)item.AssetType;
  2202. inventoryReply.InventoryData[0].GroupID = item.GroupID;
  2203. inventoryReply.InventoryData[0].GroupOwned = item.GroupOwned;
  2204. inventoryReply.InventoryData[0].GroupMask = item.GroupPermissions;
  2205. inventoryReply.InventoryData[0].Flags = item.Flags;
  2206. inventoryReply.InventoryData[0].SalePrice = item.SalePrice;
  2207. inventoryReply.InventoryData[0].SaleType = item.SaleType;
  2208. inventoryReply.InventoryData[0].CRC =
  2209. Helpers.InventoryCRC(
  2210. 1000, 0, inventoryReply.InventoryData[0].InvType,
  2211. inventoryReply.InventoryData[0].Type, inventoryReply.InventoryData[0].AssetID,
  2212. inventoryReply.InventoryData[0].GroupID, 100,
  2213. inventoryReply.InventoryData[0].OwnerID, inventoryReply.InventoryData[0].CreatorID,
  2214. inventoryReply.InventoryData[0].ItemID, inventoryReply.InventoryData[0].FolderID,
  2215. FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS,
  2216. FULL_MASK_PERMISSIONS);
  2217. inventoryReply.Header.Zerocoded = true;
  2218. OutPacket(inventoryReply, ThrottleOutPacketType.Asset);
  2219. }
  2220. protected void SendBulkUpdateInventoryFolder(InventoryFolderBase folderBase)
  2221. {
  2222. // We will use the same transaction id for all the separate packets to be sent out in this update.
  2223. UUID transactionId = UUID.Random();
  2224. List<BulkUpdateInventoryPacket.FolderDataBlock> folderDataBlocks
  2225. = new List<BulkUpdateInventoryPacket.FolderDataBlock>();
  2226. SendBulkUpdateInventoryFolderRecursive(folderBase, ref folderDataBlocks, transactionId);
  2227. if (folderDataBlocks.Count > 0)
  2228. {
  2229. // We'll end up with some unsent folder blocks if there were some empty folders at the end of the list
  2230. // Send these now
  2231. BulkUpdateInventoryPacket bulkUpdate
  2232. = (BulkUpdateInventoryPacket)PacketPool.Instance.GetPacket(PacketType.BulkUpdateInventory);
  2233. bulkUpdate.Header.Zerocoded = true;
  2234. bulkUpdate.AgentData.AgentID = AgentId;
  2235. bulkUpdate.AgentData.TransactionID = transactionId;
  2236. bulkUpdate.FolderData = folderDataBlocks.ToArray();
  2237. List<BulkUpdateInventoryPacket.ItemDataBlock> foo = new List<BulkUpdateInventoryPacket.ItemDataBlock>();
  2238. bulkUpdate.ItemData = foo.ToArray();
  2239. //m_log.Debug("SendBulkUpdateInventory :" + bulkUpdate);
  2240. OutPacket(bulkUpdate, ThrottleOutPacketType.Asset);
  2241. }
  2242. }
  2243. /// <summary>
  2244. /// Recursively construct bulk update packets to send folders and items
  2245. /// </summary>
  2246. /// <param name="folder"></param>
  2247. /// <param name="folderDataBlocks"></param>
  2248. /// <param name="transactionId"></param>
  2249. private void SendBulkUpdateInventoryFolderRecursive(
  2250. InventoryFolderBase folder, ref List<BulkUpdateInventoryPacket.FolderDataBlock> folderDataBlocks,
  2251. UUID transactionId)
  2252. {
  2253. folderDataBlocks.Add(GenerateBulkUpdateFolderDataBlock(folder));
  2254. const int MAX_ITEMS_PER_PACKET = 5;
  2255. IInventoryService invService = m_scene.RequestModuleInterface<IInventoryService>();
  2256. // If there are any items then we have to start sending them off in this packet - the next folder will have
  2257. // to be in its own bulk update packet. Also, we can only fit 5 items in a packet (at least this was the limit
  2258. // being used on the Linden grid at 20081203).
  2259. InventoryCollection contents = invService.GetFolderContent(AgentId, folder.ID); // folder.RequestListOfItems();
  2260. List<InventoryItemBase> items = contents.Items;
  2261. while (items.Count > 0)
  2262. {
  2263. BulkUpdateInventoryPacket bulkUpdate
  2264. = (BulkUpdateInventoryPacket)PacketPool.Instance.GetPacket(PacketType.BulkUpdateInventory);
  2265. bulkUpdate.Header.Zerocoded = true;
  2266. bulkUpdate.AgentData.AgentID = AgentId;
  2267. bulkUpdate.AgentData.TransactionID = transactionId;
  2268. bulkUpdate.FolderData = folderDataBlocks.ToArray();
  2269. int itemsToSend = (items.Count > MAX_ITEMS_PER_PACKET ? MAX_ITEMS_PER_PACKET : items.Count);
  2270. bulkUpdate.ItemData = new BulkUpdateInventoryPacket.ItemDataBlock[itemsToSend];
  2271. for (int i = 0; i < itemsToSend; i++)
  2272. {
  2273. // Remove from the end of the list so that we don't incur a performance penalty
  2274. bulkUpdate.ItemData[i] = GenerateBulkUpdateItemDataBlock(items[items.Count - 1]);
  2275. items.RemoveAt(items.Count - 1);
  2276. }
  2277. //m_log.Debug("SendBulkUpdateInventoryRecursive :" + bulkUpdate);
  2278. OutPacket(bulkUpdate, ThrottleOutPacketType.Asset);
  2279. folderDataBlocks = new List<BulkUpdateInventoryPacket.FolderDataBlock>();
  2280. // If we're going to be sending another items packet then it needs to contain just the folder to which those
  2281. // items belong.
  2282. if (items.Count > 0)
  2283. folderDataBlocks.Add(GenerateBulkUpdateFolderDataBlock(folder));
  2284. }
  2285. List<InventoryFolderBase> subFolders = contents.Folders;
  2286. for (int indx = 0; indx < subFolders.Count; ++indx)
  2287. {
  2288. SendBulkUpdateInventoryFolderRecursive(subFolders[indx], ref folderDataBlocks, transactionId);
  2289. }
  2290. }
  2291. /// <summary>
  2292. /// Generate a bulk update inventory data block for the given folder
  2293. /// </summary>
  2294. /// <param name="folder"></param>
  2295. /// <returns></returns>
  2296. private BulkUpdateInventoryPacket.FolderDataBlock GenerateBulkUpdateFolderDataBlock(InventoryFolderBase folder)
  2297. {
  2298. BulkUpdateInventoryPacket.FolderDataBlock folderBlock = new BulkUpdateInventoryPacket.FolderDataBlock();
  2299. folderBlock.FolderID = folder.ID;
  2300. folderBlock.ParentID = folder.ParentID;
  2301. folderBlock.Type = (sbyte)folder.Type;
  2302. // Leaving this here for now, just in case we need to do this for a while
  2303. //if (folderBlock.Type == InventoryItemBase.SUITCASE_FOLDER_TYPE)
  2304. // folderBlock.Type = InventoryItemBase.SUITCASE_FOLDER_FAKE_TYPE;
  2305. folderBlock.Name = Util.StringToBytes256(folder.Name);
  2306. return folderBlock;
  2307. }
  2308. /// <summary>
  2309. /// Generate a bulk update inventory data block for the given item
  2310. /// </summary>
  2311. /// <param name="item"></param>
  2312. /// <returns></returns>
  2313. private BulkUpdateInventoryPacket.ItemDataBlock GenerateBulkUpdateItemDataBlock(InventoryItemBase item)
  2314. {
  2315. BulkUpdateInventoryPacket.ItemDataBlock itemBlock = new BulkUpdateInventoryPacket.ItemDataBlock();
  2316. itemBlock.ItemID = item.ID;
  2317. itemBlock.AssetID = item.AssetID;
  2318. itemBlock.CreatorID = item.CreatorIdAsUuid;
  2319. itemBlock.BaseMask = item.BasePermissions;
  2320. itemBlock.Description = Util.StringToBytes256(item.Description);
  2321. itemBlock.EveryoneMask = item.EveryOnePermissions;
  2322. itemBlock.FolderID = item.Folder;
  2323. itemBlock.InvType = (sbyte)item.InvType;
  2324. itemBlock.Name = Util.StringToBytes256(item.Name);
  2325. itemBlock.NextOwnerMask = item.NextPermissions;
  2326. itemBlock.OwnerID = item.Owner;
  2327. itemBlock.OwnerMask = item.CurrentPermissions;
  2328. itemBlock.Type = (sbyte)item.AssetType;
  2329. itemBlock.GroupID = item.GroupID;
  2330. itemBlock.GroupOwned = item.GroupOwned;
  2331. itemBlock.GroupMask = item.GroupPermissions;
  2332. itemBlock.Flags = item.Flags & 0x2000ff;
  2333. itemBlock.SalePrice = item.SalePrice;
  2334. itemBlock.SaleType = item.SaleType;
  2335. itemBlock.CreationDate = item.CreationDate;
  2336. itemBlock.CRC =
  2337. Helpers.InventoryCRC(
  2338. 1000, 0, itemBlock.InvType,
  2339. itemBlock.Type, itemBlock.AssetID,
  2340. itemBlock.GroupID, 100,
  2341. itemBlock.OwnerID, itemBlock.CreatorID,
  2342. itemBlock.ItemID, itemBlock.FolderID,
  2343. (uint)PermissionMask.All, 1, (uint)PermissionMask.All, (uint)PermissionMask.All,
  2344. (uint)PermissionMask.All);
  2345. return itemBlock;
  2346. }
  2347. public void SendBulkUpdateInventory(InventoryNodeBase node)
  2348. {
  2349. if (node is InventoryItemBase)
  2350. SendBulkUpdateInventoryItem((InventoryItemBase)node);
  2351. else if (node is InventoryFolderBase)
  2352. SendBulkUpdateInventoryFolder((InventoryFolderBase)node);
  2353. else if (node != null)
  2354. m_log.ErrorFormat("[CLIENT]: {0} sent unknown inventory node named {1}", Name, node.Name);
  2355. else
  2356. m_log.ErrorFormat("[CLIENT]: {0} sent null inventory node", Name);
  2357. }
  2358. protected void SendBulkUpdateInventoryItem(InventoryItemBase item)
  2359. {
  2360. const uint FULL_MASK_PERMISSIONS = (uint)0x7ffffff;
  2361. BulkUpdateInventoryPacket bulkUpdate
  2362. = (BulkUpdateInventoryPacket)PacketPool.Instance.GetPacket(PacketType.BulkUpdateInventory);
  2363. bulkUpdate.AgentData.AgentID = AgentId;
  2364. bulkUpdate.AgentData.TransactionID = UUID.Random();
  2365. bulkUpdate.FolderData = new BulkUpdateInventoryPacket.FolderDataBlock[1];
  2366. bulkUpdate.FolderData[0] = new BulkUpdateInventoryPacket.FolderDataBlock();
  2367. bulkUpdate.FolderData[0].FolderID = UUID.Zero;
  2368. bulkUpdate.FolderData[0].ParentID = UUID.Zero;
  2369. bulkUpdate.FolderData[0].Type = -1;
  2370. bulkUpdate.FolderData[0].Name = new byte[0];
  2371. bulkUpdate.ItemData = new BulkUpdateInventoryPacket.ItemDataBlock[1];
  2372. bulkUpdate.ItemData[0] = new BulkUpdateInventoryPacket.ItemDataBlock();
  2373. bulkUpdate.ItemData[0].ItemID = item.ID;
  2374. bulkUpdate.ItemData[0].AssetID = item.AssetID;
  2375. bulkUpdate.ItemData[0].CreatorID = item.CreatorIdAsUuid;
  2376. bulkUpdate.ItemData[0].BaseMask = item.BasePermissions;
  2377. bulkUpdate.ItemData[0].CreationDate = item.CreationDate;
  2378. bulkUpdate.ItemData[0].Description = Util.StringToBytes256(item.Description);
  2379. bulkUpdate.ItemData[0].EveryoneMask = item.EveryOnePermissions;
  2380. bulkUpdate.ItemData[0].FolderID = item.Folder;
  2381. bulkUpdate.ItemData[0].InvType = (sbyte)item.InvType;
  2382. bulkUpdate.ItemData[0].Name = Util.StringToBytes256(item.Name);
  2383. bulkUpdate.ItemData[0].NextOwnerMask = item.NextPermissions;
  2384. bulkUpdate.ItemData[0].OwnerID = item.Owner;
  2385. bulkUpdate.ItemData[0].OwnerMask = item.CurrentPermissions;
  2386. bulkUpdate.ItemData[0].Type = (sbyte)item.AssetType;
  2387. bulkUpdate.ItemData[0].GroupID = item.GroupID;
  2388. bulkUpdate.ItemData[0].GroupOwned = item.GroupOwned;
  2389. bulkUpdate.ItemData[0].GroupMask = item.GroupPermissions;
  2390. bulkUpdate.ItemData[0].Flags = item.Flags & 0x2000ff;
  2391. bulkUpdate.ItemData[0].SalePrice = item.SalePrice;
  2392. bulkUpdate.ItemData[0].SaleType = item.SaleType;
  2393. bulkUpdate.ItemData[0].CRC =
  2394. Helpers.InventoryCRC(1000, 0, bulkUpdate.ItemData[0].InvType,
  2395. bulkUpdate.ItemData[0].Type, bulkUpdate.ItemData[0].AssetID,
  2396. bulkUpdate.ItemData[0].GroupID, 100,
  2397. bulkUpdate.ItemData[0].OwnerID, bulkUpdate.ItemData[0].CreatorID,
  2398. bulkUpdate.ItemData[0].ItemID, bulkUpdate.ItemData[0].FolderID,
  2399. FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS,
  2400. FULL_MASK_PERMISSIONS);
  2401. bulkUpdate.Header.Zerocoded = true;
  2402. OutPacket(bulkUpdate, ThrottleOutPacketType.Asset);
  2403. }
  2404. public void SendInventoryItemCreateUpdate(InventoryItemBase Item, uint callbackId)
  2405. {
  2406. SendInventoryItemCreateUpdate(Item, UUID.Zero, callbackId);
  2407. }
  2408. /// <see>IClientAPI.SendInventoryItemCreateUpdate(InventoryItemBase)</see>
  2409. public void SendInventoryItemCreateUpdate(InventoryItemBase Item, UUID transactionID, uint callbackId)
  2410. {
  2411. const uint FULL_MASK_PERMISSIONS = (uint)0x7fffffff;
  2412. UpdateCreateInventoryItemPacket InventoryReply
  2413. = (UpdateCreateInventoryItemPacket)PacketPool.Instance.GetPacket(
  2414. PacketType.UpdateCreateInventoryItem);
  2415. // TODO: don't create new blocks if recycling an old packet
  2416. InventoryReply.AgentData.AgentID = AgentId;
  2417. InventoryReply.AgentData.SimApproved = true;
  2418. InventoryReply.AgentData.TransactionID = transactionID;
  2419. InventoryReply.InventoryData = new UpdateCreateInventoryItemPacket.InventoryDataBlock[1];
  2420. InventoryReply.InventoryData[0] = new UpdateCreateInventoryItemPacket.InventoryDataBlock();
  2421. InventoryReply.InventoryData[0].ItemID = Item.ID;
  2422. InventoryReply.InventoryData[0].AssetID = Item.AssetID;
  2423. InventoryReply.InventoryData[0].CreatorID = Item.CreatorIdAsUuid;
  2424. InventoryReply.InventoryData[0].BaseMask = Item.BasePermissions;
  2425. InventoryReply.InventoryData[0].Description = Util.StringToBytes256(Item.Description);
  2426. InventoryReply.InventoryData[0].EveryoneMask = Item.EveryOnePermissions;
  2427. InventoryReply.InventoryData[0].FolderID = Item.Folder;
  2428. InventoryReply.InventoryData[0].InvType = (sbyte)Item.InvType;
  2429. InventoryReply.InventoryData[0].Name = Util.StringToBytes256(Item.Name);
  2430. InventoryReply.InventoryData[0].NextOwnerMask = Item.NextPermissions;
  2431. InventoryReply.InventoryData[0].OwnerID = Item.Owner;
  2432. InventoryReply.InventoryData[0].OwnerMask = Item.CurrentPermissions;
  2433. InventoryReply.InventoryData[0].Type = (sbyte)Item.AssetType;
  2434. InventoryReply.InventoryData[0].CallbackID = callbackId;
  2435. InventoryReply.InventoryData[0].GroupID = Item.GroupID;
  2436. InventoryReply.InventoryData[0].GroupOwned = Item.GroupOwned;
  2437. InventoryReply.InventoryData[0].GroupMask = Item.GroupPermissions;
  2438. InventoryReply.InventoryData[0].Flags = Item.Flags & 0x2000ff;
  2439. InventoryReply.InventoryData[0].SalePrice = Item.SalePrice;
  2440. InventoryReply.InventoryData[0].SaleType = Item.SaleType;
  2441. InventoryReply.InventoryData[0].CreationDate = Item.CreationDate;
  2442. InventoryReply.InventoryData[0].CRC =
  2443. Helpers.InventoryCRC(1000, 0, InventoryReply.InventoryData[0].InvType,
  2444. InventoryReply.InventoryData[0].Type, InventoryReply.InventoryData[0].AssetID,
  2445. InventoryReply.InventoryData[0].GroupID, 100,
  2446. InventoryReply.InventoryData[0].OwnerID, InventoryReply.InventoryData[0].CreatorID,
  2447. InventoryReply.InventoryData[0].ItemID, InventoryReply.InventoryData[0].FolderID,
  2448. FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS,
  2449. FULL_MASK_PERMISSIONS);
  2450. InventoryReply.Header.Zerocoded = true;
  2451. OutPacket(InventoryReply, ThrottleOutPacketType.Asset);
  2452. }
  2453. public void SendRemoveInventoryItem(UUID itemID)
  2454. {
  2455. RemoveInventoryItemPacket remove = (RemoveInventoryItemPacket)PacketPool.Instance.GetPacket(PacketType.RemoveInventoryItem);
  2456. // TODO: don't create new blocks if recycling an old packet
  2457. remove.AgentData.AgentID = AgentId;
  2458. remove.AgentData.SessionID = m_sessionId;
  2459. remove.InventoryData = new RemoveInventoryItemPacket.InventoryDataBlock[1];
  2460. remove.InventoryData[0] = new RemoveInventoryItemPacket.InventoryDataBlock();
  2461. remove.InventoryData[0].ItemID = itemID;
  2462. remove.Header.Zerocoded = true;
  2463. OutPacket(remove, ThrottleOutPacketType.Asset);
  2464. }
  2465. /*
  2466. private uint adjustControls(int input)
  2467. {
  2468. uint ret = (uint)input;
  2469. uint masked = ret & 0x0f;
  2470. masked <<= 19;
  2471. ret |= masked;
  2472. return ret;
  2473. }
  2474. */
  2475. public void SendTakeControls(int controls, bool passToAgent, bool TakeControls)
  2476. {
  2477. ScriptControlChangePacket scriptcontrol = (ScriptControlChangePacket)PacketPool.Instance.GetPacket(PacketType.ScriptControlChange);
  2478. ScriptControlChangePacket.DataBlock[] data = new ScriptControlChangePacket.DataBlock[1];
  2479. ScriptControlChangePacket.DataBlock ddata = new ScriptControlChangePacket.DataBlock();
  2480. // ddata.Controls = adjustControls(controls);
  2481. ddata.Controls = (uint)controls;
  2482. ddata.PassToAgent = passToAgent;
  2483. ddata.TakeControls = TakeControls;
  2484. data[0] = ddata;
  2485. scriptcontrol.Data = data;
  2486. OutPacket(scriptcontrol, ThrottleOutPacketType.Task);
  2487. }
  2488. static private readonly byte[] ReplyTaskInventoryHeader = new byte[] {
  2489. Helpers.MSG_RELIABLE, //| Helpers.MSG_ZEROCODED, not doing spec zeroencode on this
  2490. 0, 0, 0, 0, // sequence number
  2491. 0, // extra
  2492. 0xff, 0xff, 1, 34 // ID 90 (low frequency bigendian)
  2493. };
  2494. public void SendTaskInventory(UUID taskID, short serial, byte[] fileName)
  2495. {
  2496. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  2497. byte[] data = buf.Data;
  2498. //setup header
  2499. Buffer.BlockCopy(ReplyTaskInventoryHeader, 0, data, 0, 10);
  2500. taskID.ToBytes(data, 10); // 26
  2501. Utils.Int16ToBytes(serial, data, 26); // 28
  2502. data[28] = (byte)fileName.Length;
  2503. if(data[28] > 0)
  2504. Buffer.BlockCopy(fileName, 0, data, 29, data[28]);
  2505. buf.DataLength = 29 + data[28];
  2506. //m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task, null, false, true);
  2507. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task);
  2508. }
  2509. static private readonly byte[] SendXferPacketHeader = new byte[] {
  2510. 0, //Helpers.MSG_RELIABLE, Xfer control must provide reliabialty
  2511. 0, 0, 0, 0, // sequence number
  2512. 0, // extra
  2513. 18 // ID (high frequency bigendian)
  2514. };
  2515. public void SendXferPacket(ulong xferID, uint packet,
  2516. byte[] XferData, int XferDataOffset, int XferDatapktLen, bool isTaskInventory)
  2517. {
  2518. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  2519. byte[] data = buf.Data;
  2520. //setup header
  2521. Buffer.BlockCopy(SendXferPacketHeader, 0, data, 0, 7);
  2522. Utils.UInt64ToBytesSafepos(xferID, data, 7); // 15
  2523. Utils.UIntToBytesSafepos(packet, data, 15); // 19
  2524. int len = XferDatapktLen;
  2525. if (XferDataOffset == 0) // first packet needs to send the total xfer data len
  2526. len += 4;
  2527. if (len > LLUDPServer.MAXPAYLOAD) // should never happen
  2528. len = LLUDPServer.MAXPAYLOAD;
  2529. if (len == 0)
  2530. {
  2531. data[19] = 0;
  2532. data[20] = 0;
  2533. }
  2534. else
  2535. {
  2536. data[19] = (byte)len;
  2537. data[20] = (byte)(len >> 8);
  2538. if(XferDataOffset == 0)
  2539. {
  2540. // need to send total xfer data len
  2541. Utils.IntToBytesSafepos(XferData.Length, data, 21);
  2542. if (XferDatapktLen > 0)
  2543. Buffer.BlockCopy(XferData, XferDataOffset, data, 25, XferDatapktLen);
  2544. }
  2545. else
  2546. Buffer.BlockCopy(XferData, XferDataOffset, data, 21, XferDatapktLen);
  2547. }
  2548. buf.DataLength = 21 + len;
  2549. m_udpServer.SendUDPPacket(m_udpClient, buf, isTaskInventory ? ThrottleOutPacketType.Task : ThrottleOutPacketType.Asset);
  2550. }
  2551. static private readonly byte[] AbortXferHeader = new byte[] {
  2552. Helpers.MSG_RELIABLE,
  2553. 0, 0, 0, 0, // sequence number
  2554. 0, // extra
  2555. 0xff, 0xff, 0, 157 // ID 157 (low frequency bigendian)
  2556. };
  2557. public void SendAbortXferPacket(ulong xferID)
  2558. {
  2559. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  2560. byte[] data = buf.Data;
  2561. //setup header
  2562. Buffer.BlockCopy(AbortXferHeader, 0, data, 0, 10);
  2563. Utils.UInt64ToBytesSafepos(xferID, data, 10); // 18
  2564. Utils.IntToBytesSafepos(0, data, 18); // 22 reason TODO
  2565. buf.DataLength = 22;
  2566. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Asset);
  2567. }
  2568. public void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit,
  2569. int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor,
  2570. int PriceParcelClaim, float PriceParcelClaimFactor, int PriceParcelRent, int PricePublicObjectDecay,
  2571. int PricePublicObjectDelete, int PriceRentLight, int PriceUpload, int TeleportMinPrice, float TeleportPriceExponent)
  2572. {
  2573. EconomyDataPacket economyData = (EconomyDataPacket)PacketPool.Instance.GetPacket(PacketType.EconomyData);
  2574. economyData.Info.EnergyEfficiency = EnergyEfficiency;
  2575. economyData.Info.ObjectCapacity = ObjectCapacity;
  2576. economyData.Info.ObjectCount = ObjectCount;
  2577. economyData.Info.PriceEnergyUnit = PriceEnergyUnit;
  2578. economyData.Info.PriceGroupCreate = PriceGroupCreate;
  2579. economyData.Info.PriceObjectClaim = PriceObjectClaim;
  2580. economyData.Info.PriceObjectRent = PriceObjectRent;
  2581. economyData.Info.PriceObjectScaleFactor = PriceObjectScaleFactor;
  2582. economyData.Info.PriceParcelClaim = PriceParcelClaim;
  2583. economyData.Info.PriceParcelClaimFactor = PriceParcelClaimFactor;
  2584. economyData.Info.PriceParcelRent = PriceParcelRent;
  2585. economyData.Info.PricePublicObjectDecay = PricePublicObjectDecay;
  2586. economyData.Info.PricePublicObjectDelete = PricePublicObjectDelete;
  2587. economyData.Info.PriceRentLight = PriceRentLight;
  2588. economyData.Info.PriceUpload = PriceUpload;
  2589. economyData.Info.TeleportMinPrice = TeleportMinPrice;
  2590. economyData.Info.TeleportPriceExponent = TeleportPriceExponent;
  2591. economyData.Header.Reliable = true;
  2592. OutPacket(economyData, ThrottleOutPacketType.Task);
  2593. }
  2594. public void SendAvatarPickerReply(AvatarPickerReplyAgentDataArgs AgentData, List<AvatarPickerReplyDataArgs> Data)
  2595. {
  2596. //construct the AvatarPickerReply packet.
  2597. AvatarPickerReplyPacket replyPacket = new AvatarPickerReplyPacket();
  2598. replyPacket.AgentData.AgentID = AgentData.AgentID;
  2599. replyPacket.AgentData.QueryID = AgentData.QueryID;
  2600. //int i = 0;
  2601. List<AvatarPickerReplyPacket.DataBlock> data_block = new List<AvatarPickerReplyPacket.DataBlock>();
  2602. foreach (AvatarPickerReplyDataArgs arg in Data)
  2603. {
  2604. AvatarPickerReplyPacket.DataBlock db = new AvatarPickerReplyPacket.DataBlock();
  2605. db.AvatarID = arg.AvatarID;
  2606. db.FirstName = arg.FirstName;
  2607. db.LastName = arg.LastName;
  2608. data_block.Add(db);
  2609. }
  2610. replyPacket.Data = data_block.ToArray();
  2611. OutPacket(replyPacket, ThrottleOutPacketType.Task);
  2612. }
  2613. public void SendAgentDataUpdate(UUID agentid, UUID activegroupid, string firstname, string lastname, ulong grouppowers, string groupname, string grouptitle)
  2614. {
  2615. if (agentid == AgentId)
  2616. {
  2617. ActiveGroupId = activegroupid;
  2618. ActiveGroupName = groupname;
  2619. ActiveGroupPowers = grouppowers;
  2620. }
  2621. AgentDataUpdatePacket sendAgentDataUpdate = (AgentDataUpdatePacket)PacketPool.Instance.GetPacket(PacketType.AgentDataUpdate);
  2622. sendAgentDataUpdate.AgentData.ActiveGroupID = activegroupid;
  2623. sendAgentDataUpdate.AgentData.AgentID = agentid;
  2624. sendAgentDataUpdate.AgentData.FirstName = Util.StringToBytes256(firstname);
  2625. sendAgentDataUpdate.AgentData.GroupName = Util.StringToBytes256(groupname);
  2626. sendAgentDataUpdate.AgentData.GroupPowers = grouppowers;
  2627. sendAgentDataUpdate.AgentData.GroupTitle = Util.StringToBytes256(grouptitle);
  2628. sendAgentDataUpdate.AgentData.LastName = Util.StringToBytes256(lastname);
  2629. OutPacket(sendAgentDataUpdate, ThrottleOutPacketType.Task);
  2630. }
  2631. /// <summary>
  2632. /// Send an alert message to the client. This pops up a brief duration information box at a corner
  2633. /// </summary>
  2634. /// <param name="message"></param>
  2635. public void SendAlertMessage(string message)
  2636. {
  2637. AlertMessagePacket alertPack = (AlertMessagePacket)PacketPool.Instance.GetPacket(PacketType.AlertMessage);
  2638. alertPack.AgentInfo = new AlertMessagePacket.AgentInfoBlock[1];
  2639. alertPack.AgentInfo[0] = new AlertMessagePacket.AgentInfoBlock();
  2640. alertPack.AgentInfo[0].AgentID = AgentId;
  2641. alertPack.AlertData = new AlertMessagePacket.AlertDataBlock();
  2642. alertPack.AlertData.Message = Util.StringToBytes256(message);
  2643. alertPack.AlertInfo = new AlertMessagePacket.AlertInfoBlock[0];
  2644. OutPacket(alertPack, ThrottleOutPacketType.Task);
  2645. }
  2646. public void SendAlertMessage(string message, string info)
  2647. {
  2648. AlertMessagePacket alertPack = (AlertMessagePacket)PacketPool.Instance.GetPacket(PacketType.AlertMessage);
  2649. alertPack.AgentInfo = new AlertMessagePacket.AgentInfoBlock[1];
  2650. alertPack.AgentInfo[0] = new AlertMessagePacket.AgentInfoBlock();
  2651. alertPack.AgentInfo[0].AgentID = AgentId;
  2652. alertPack.AlertData = new AlertMessagePacket.AlertDataBlock();
  2653. alertPack.AlertData.Message = Util.StringToBytes256(message);
  2654. alertPack.AlertInfo = new AlertMessagePacket.AlertInfoBlock[1];
  2655. alertPack.AlertInfo[0] = new AlertMessagePacket.AlertInfoBlock();
  2656. alertPack.AlertInfo[0].Message = Util.StringToBytes256(info);
  2657. alertPack.AlertInfo[0].ExtraParams = new Byte[0];
  2658. OutPacket(alertPack, ThrottleOutPacketType.Task);
  2659. }
  2660. /// <summary>
  2661. /// Send an agent alert message to the client.
  2662. /// </summary>
  2663. /// <param name="message"></param>
  2664. /// <param name="modal">On the linden client, if this true then it displays a one button text box placed in the
  2665. /// middle of the window. If false, the message is displayed in a brief duration blue information box (as for
  2666. /// the AlertMessage packet).</param>
  2667. public void SendAgentAlertMessage(string message, bool modal)
  2668. {
  2669. // Prepend a slash to make the message come up in the top right
  2670. // again.
  2671. // Allow special formats to be sent from aware modules.
  2672. if (!modal && !message.StartsWith("ALERT: ") && !message.StartsWith("NOTIFY: ") && message != "Home position set." && message != "You died and have been teleported to your home location")
  2673. message = "/" + message;
  2674. AgentAlertMessagePacket alertPack = (AgentAlertMessagePacket)PacketPool.Instance.GetPacket(PacketType.AgentAlertMessage);
  2675. alertPack.AgentData.AgentID = AgentId;
  2676. alertPack.AlertData.Message = Util.StringToBytes256(message);
  2677. alertPack.AlertData.Modal = modal;
  2678. OutPacket(alertPack, ThrottleOutPacketType.Task);
  2679. }
  2680. public void SendLoadURL(string objectname, UUID objectID, UUID ownerID, bool groupOwned, string message,
  2681. string url)
  2682. {
  2683. LoadURLPacket loadURL = (LoadURLPacket)PacketPool.Instance.GetPacket(PacketType.LoadURL);
  2684. loadURL.Data.ObjectName = Util.StringToBytes256(objectname);
  2685. loadURL.Data.ObjectID = objectID;
  2686. loadURL.Data.OwnerID = ownerID;
  2687. loadURL.Data.OwnerIsGroup = groupOwned;
  2688. loadURL.Data.Message = Util.StringToBytes256(message);
  2689. loadURL.Data.URL = Util.StringToBytes256(url);
  2690. OutPacket(loadURL, ThrottleOutPacketType.Task);
  2691. }
  2692. public void SendDialog(
  2693. string objectname, UUID objectID, UUID ownerID, string ownerFirstName, string ownerLastName, string msg,
  2694. UUID textureID, int ch, string[] buttonlabels)
  2695. {
  2696. ScriptDialogPacket dialog = (ScriptDialogPacket)PacketPool.Instance.GetPacket(PacketType.ScriptDialog);
  2697. dialog.Data.ObjectID = objectID;
  2698. dialog.Data.ObjectName = Util.StringToBytes256(objectname);
  2699. // this is the username of the *owner*
  2700. dialog.Data.FirstName = Util.StringToBytes256(ownerFirstName);
  2701. dialog.Data.LastName = Util.StringToBytes256(ownerLastName);
  2702. dialog.Data.Message = Util.StringToBytes(msg,512);
  2703. dialog.Data.ImageID = textureID;
  2704. dialog.Data.ChatChannel = ch;
  2705. ScriptDialogPacket.ButtonsBlock[] buttons = new ScriptDialogPacket.ButtonsBlock[buttonlabels.Length];
  2706. for (int i = 0; i < buttonlabels.Length; i++)
  2707. {
  2708. buttons[i] = new ScriptDialogPacket.ButtonsBlock();
  2709. buttons[i].ButtonLabel = Util.StringToBytes(buttonlabels[i],24);
  2710. }
  2711. dialog.Buttons = buttons;
  2712. dialog.OwnerData = new ScriptDialogPacket.OwnerDataBlock[1];
  2713. dialog.OwnerData[0] = new ScriptDialogPacket.OwnerDataBlock();
  2714. dialog.OwnerData[0].OwnerID = ownerID;
  2715. OutPacket(dialog, ThrottleOutPacketType.Task);
  2716. }
  2717. public void SendPreLoadSound(UUID objectID, UUID ownerID, UUID soundID)
  2718. {
  2719. PreloadSoundPacket preSound = (PreloadSoundPacket)PacketPool.Instance.GetPacket(PacketType.PreloadSound);
  2720. // TODO: don't create new blocks if recycling an old packet
  2721. preSound.DataBlock = new PreloadSoundPacket.DataBlockBlock[1];
  2722. preSound.DataBlock[0] = new PreloadSoundPacket.DataBlockBlock();
  2723. preSound.DataBlock[0].ObjectID = objectID;
  2724. preSound.DataBlock[0].OwnerID = ownerID;
  2725. preSound.DataBlock[0].SoundID = soundID;
  2726. preSound.Header.Zerocoded = true;
  2727. OutPacket(preSound, ThrottleOutPacketType.Task);
  2728. }
  2729. public void SendPlayAttachedSound(UUID soundID, UUID objectID, UUID ownerID, float gain, byte flags)
  2730. {
  2731. AttachedSoundPacket sound = (AttachedSoundPacket)PacketPool.Instance.GetPacket(PacketType.AttachedSound);
  2732. sound.DataBlock.SoundID = soundID;
  2733. sound.DataBlock.ObjectID = objectID;
  2734. sound.DataBlock.OwnerID = ownerID;
  2735. sound.DataBlock.Gain = gain;
  2736. sound.DataBlock.Flags = flags;
  2737. OutPacket(sound, ThrottleOutPacketType.Task);
  2738. }
  2739. public void SendTransferAbort(TransferRequestPacket transferRequest)
  2740. {
  2741. TransferAbortPacket abort = (TransferAbortPacket)PacketPool.Instance.GetPacket(PacketType.TransferAbort);
  2742. abort.TransferInfo.TransferID = transferRequest.TransferInfo.TransferID;
  2743. abort.TransferInfo.ChannelType = transferRequest.TransferInfo.ChannelType;
  2744. m_log.Debug("[Assets] Aborting transfer; asset request failed");
  2745. OutPacket(abort, ThrottleOutPacketType.Task);
  2746. }
  2747. public void SendTriggeredSound(UUID soundID, UUID ownerID, UUID objectID, UUID parentID, ulong handle, Vector3 position, float gain)
  2748. {
  2749. SoundTriggerPacket sound = (SoundTriggerPacket)PacketPool.Instance.GetPacket(PacketType.SoundTrigger);
  2750. sound.SoundData.SoundID = soundID;
  2751. sound.SoundData.OwnerID = ownerID;
  2752. sound.SoundData.ObjectID = objectID;
  2753. sound.SoundData.ParentID = parentID;
  2754. sound.SoundData.Handle = handle;
  2755. sound.SoundData.Position = position;
  2756. sound.SoundData.Gain = gain;
  2757. OutPacket(sound, ThrottleOutPacketType.Task);
  2758. }
  2759. public void SendAttachedSoundGainChange(UUID objectID, float gain)
  2760. {
  2761. AttachedSoundGainChangePacket sound = (AttachedSoundGainChangePacket)PacketPool.Instance.GetPacket(PacketType.AttachedSoundGainChange);
  2762. sound.DataBlock.ObjectID = objectID;
  2763. sound.DataBlock.Gain = gain;
  2764. OutPacket(sound, ThrottleOutPacketType.Task);
  2765. }
  2766. public void SendSunPos(Vector3 Position, Vector3 Velocity, ulong CurrentTime, uint SecondsPerSunCycle, uint SecondsPerYear, float OrbitalPosition)
  2767. {
  2768. // Viewers based on the Linden viwer code, do wacky things for oribital positions from Midnight to Sunrise
  2769. // So adjust for that
  2770. // Contributed by: Godfrey
  2771. if (OrbitalPosition > m_sunPainDaHalfOrbitalCutoff) // things get weird from midnight to sunrise
  2772. {
  2773. OrbitalPosition = (OrbitalPosition - m_sunPainDaHalfOrbitalCutoff) * 0.6666666667f + m_sunPainDaHalfOrbitalCutoff;
  2774. }
  2775. SimulatorViewerTimeMessagePacket viewertime = (SimulatorViewerTimeMessagePacket)PacketPool.Instance.GetPacket(PacketType.SimulatorViewerTimeMessage);
  2776. viewertime.TimeInfo.SunDirection = Position;
  2777. viewertime.TimeInfo.SunAngVelocity = Velocity;
  2778. // Sun module used to add 6 hours to adjust for linden sun hour, adding here
  2779. // to prevent existing code from breaking if it assumed that 6 hours were included.
  2780. // 21600 == 6 hours * 60 minutes * 60 Seconds
  2781. viewertime.TimeInfo.UsecSinceStart = CurrentTime + 21600;
  2782. viewertime.TimeInfo.SecPerDay = SecondsPerSunCycle;
  2783. viewertime.TimeInfo.SecPerYear = SecondsPerYear;
  2784. viewertime.TimeInfo.SunPhase = OrbitalPosition;
  2785. viewertime.Header.Reliable = false;
  2786. viewertime.Header.Zerocoded = true;
  2787. OutPacket(viewertime, ThrottleOutPacketType.Task);
  2788. }
  2789. // Currently Deprecated
  2790. public void SendViewerTime(int phase)
  2791. {
  2792. /*
  2793. Console.WriteLine("SunPhase: {0}", phase);
  2794. SimulatorViewerTimeMessagePacket viewertime = (SimulatorViewerTimeMessagePacket)PacketPool.Instance.GetPacket(PacketType.SimulatorViewerTimeMessage);
  2795. //viewertime.TimeInfo.SecPerDay = 86400;
  2796. //viewertime.TimeInfo.SecPerYear = 31536000;
  2797. viewertime.TimeInfo.SecPerDay = 1000;
  2798. viewertime.TimeInfo.SecPerYear = 365000;
  2799. viewertime.TimeInfo.SunPhase = 1;
  2800. int sunPhase = (phase + 2) / 2;
  2801. if ((sunPhase < 6) || (sunPhase > 36))
  2802. {
  2803. viewertime.TimeInfo.SunDirection = new Vector3(0f, 0.8f, -0.8f);
  2804. Console.WriteLine("sending night");
  2805. }
  2806. else
  2807. {
  2808. if (sunPhase < 12)
  2809. {
  2810. sunPhase = 12;
  2811. }
  2812. sunPhase = sunPhase - 12;
  2813. float yValue = 0.1f * (sunPhase);
  2814. Console.WriteLine("Computed SunPhase: {0}, yValue: {1}", sunPhase, yValue);
  2815. if (yValue > 1.2f)
  2816. {
  2817. yValue = yValue - 1.2f;
  2818. }
  2819. yValue = Util.Clip(yValue, 0, 1);
  2820. if (sunPhase < 14)
  2821. {
  2822. yValue = 1 - yValue;
  2823. }
  2824. if (sunPhase < 12)
  2825. {
  2826. yValue *= -1;
  2827. }
  2828. viewertime.TimeInfo.SunDirection = new Vector3(0f, yValue, 0.3f);
  2829. Console.WriteLine("sending sun update " + yValue);
  2830. }
  2831. viewertime.TimeInfo.SunAngVelocity = new Vector3(0, 0.0f, 10.0f);
  2832. viewertime.TimeInfo.UsecSinceStart = (ulong)Util.UnixTimeSinceEpoch();
  2833. viewertime.Header.Reliable = false;
  2834. OutPacket(viewertime, ThrottleOutPacketType.Task);
  2835. */
  2836. }
  2837. public void SendViewerEffect(ViewerEffectPacket.EffectBlock[] effectBlocks)
  2838. {
  2839. ViewerEffectPacket packet = (ViewerEffectPacket)PacketPool.Instance.GetPacket(PacketType.ViewerEffect);
  2840. // packet.AgentData.AgentID = AgentId;
  2841. // packet.AgentData.SessionID = SessionId;
  2842. packet.Effect = effectBlocks;
  2843. // OutPacket(packet, ThrottleOutPacketType.State);
  2844. OutPacket(packet, ThrottleOutPacketType.Task);
  2845. }
  2846. public void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, Byte[] membershipType,
  2847. string flAbout, uint flags, UUID flImageID, UUID imageID, string profileURL,
  2848. UUID partnerID)
  2849. {
  2850. AvatarPropertiesReplyPacket avatarReply = (AvatarPropertiesReplyPacket)PacketPool.Instance.GetPacket(PacketType.AvatarPropertiesReply);
  2851. avatarReply.AgentData.AgentID = AgentId;
  2852. avatarReply.AgentData.AvatarID = avatarID;
  2853. if (aboutText != null)
  2854. avatarReply.PropertiesData.AboutText = Util.StringToBytes1024(aboutText);
  2855. else
  2856. avatarReply.PropertiesData.AboutText = Utils.EmptyBytes;
  2857. avatarReply.PropertiesData.BornOn = Util.StringToBytes256(bornOn);
  2858. avatarReply.PropertiesData.CharterMember = membershipType;
  2859. if (flAbout != null)
  2860. avatarReply.PropertiesData.FLAboutText = Util.StringToBytes256(flAbout);
  2861. else
  2862. avatarReply.PropertiesData.FLAboutText = Utils.EmptyBytes;
  2863. avatarReply.PropertiesData.Flags = flags;
  2864. avatarReply.PropertiesData.FLImageID = flImageID;
  2865. avatarReply.PropertiesData.ImageID = imageID;
  2866. avatarReply.PropertiesData.ProfileURL = Util.StringToBytes256(profileURL);
  2867. avatarReply.PropertiesData.PartnerID = partnerID;
  2868. OutPacket(avatarReply, ThrottleOutPacketType.Task);
  2869. }
  2870. /// <summary>
  2871. /// Send the client an Estate message blue box pop-down with a single OK button
  2872. /// </summary>
  2873. /// <param name="FromAvatarID"></param>
  2874. /// <param name="fromSessionID"></param>
  2875. /// <param name="FromAvatarName"></param>
  2876. /// <param name="Message"></param>
  2877. public void SendBlueBoxMessage(UUID FromAvatarID, String FromAvatarName, String Message)
  2878. {
  2879. if (!SceneAgent.IsChildAgent)
  2880. SendInstantMessage(new GridInstantMessage(null, FromAvatarID, FromAvatarName, AgentId, 1, Message, false, new Vector3()));
  2881. //SendInstantMessage(FromAvatarID, fromSessionID, Message, AgentId, SessionId, FromAvatarName, (byte)21,(uint) Util.UnixTimeSinceEpoch());
  2882. }
  2883. public void SendLogoutPacket()
  2884. {
  2885. // I know this is a bit of a hack, however there are times when you don't
  2886. // want to send this, but still need to do the rest of the shutdown process
  2887. // this method gets called from the packet server.. which makes it practically
  2888. // impossible to do any other way.
  2889. if (m_SendLogoutPacketWhenClosing)
  2890. {
  2891. LogoutReplyPacket logReply = (LogoutReplyPacket)PacketPool.Instance.GetPacket(PacketType.LogoutReply);
  2892. // TODO: don't create new blocks if recycling an old packet
  2893. logReply.AgentData.AgentID = AgentId;
  2894. logReply.AgentData.SessionID = SessionId;
  2895. logReply.InventoryData = new LogoutReplyPacket.InventoryDataBlock[1];
  2896. logReply.InventoryData[0] = new LogoutReplyPacket.InventoryDataBlock();
  2897. logReply.InventoryData[0].ItemID = UUID.Zero;
  2898. OutPacket(logReply, ThrottleOutPacketType.Task);
  2899. }
  2900. }
  2901. public void SendHealth(float health)
  2902. {
  2903. HealthMessagePacket healthpacket = (HealthMessagePacket)PacketPool.Instance.GetPacket(PacketType.HealthMessage);
  2904. healthpacket.HealthData.Health = health;
  2905. OutPacket(healthpacket, ThrottleOutPacketType.Task);
  2906. }
  2907. public void SendAgentOnline(UUID[] agentIDs)
  2908. {
  2909. OnlineNotificationPacket onp = new OnlineNotificationPacket();
  2910. OnlineNotificationPacket.AgentBlockBlock[] onpb = new OnlineNotificationPacket.AgentBlockBlock[agentIDs.Length];
  2911. for (int i = 0; i < agentIDs.Length; i++)
  2912. {
  2913. OnlineNotificationPacket.AgentBlockBlock onpbl = new OnlineNotificationPacket.AgentBlockBlock();
  2914. onpbl.AgentID = agentIDs[i];
  2915. onpb[i] = onpbl;
  2916. }
  2917. onp.AgentBlock = onpb;
  2918. onp.Header.Reliable = true;
  2919. OutPacket(onp, ThrottleOutPacketType.Task);
  2920. }
  2921. public void SendAgentOffline(UUID[] agentIDs)
  2922. {
  2923. OfflineNotificationPacket offp = new OfflineNotificationPacket();
  2924. OfflineNotificationPacket.AgentBlockBlock[] offpb = new OfflineNotificationPacket.AgentBlockBlock[agentIDs.Length];
  2925. for (int i = 0; i < agentIDs.Length; i++)
  2926. {
  2927. OfflineNotificationPacket.AgentBlockBlock onpbl = new OfflineNotificationPacket.AgentBlockBlock();
  2928. onpbl.AgentID = agentIDs[i];
  2929. offpb[i] = onpbl;
  2930. }
  2931. offp.AgentBlock = offpb;
  2932. offp.Header.Reliable = true;
  2933. OutPacket(offp, ThrottleOutPacketType.Task);
  2934. }
  2935. public void SendFindAgent(UUID HunterID, UUID PreyID, double GlobalX, double GlobalY)
  2936. {
  2937. FindAgentPacket fap = new FindAgentPacket();
  2938. fap.AgentBlock.Hunter = HunterID;
  2939. fap.AgentBlock.Prey = PreyID;
  2940. fap.AgentBlock.SpaceIP = 0;
  2941. fap.LocationBlock = new FindAgentPacket.LocationBlockBlock[1];
  2942. fap.LocationBlock[0] = new FindAgentPacket.LocationBlockBlock();
  2943. fap.LocationBlock[0].GlobalX = GlobalX;
  2944. fap.LocationBlock[0].GlobalY = GlobalY;
  2945. OutPacket(fap, ThrottleOutPacketType.Task);
  2946. }
  2947. public void SendSitResponse(UUID TargetID, Vector3 OffsetPos,
  2948. Quaternion SitOrientation, bool autopilot,
  2949. Vector3 CameraAtOffset, Vector3 CameraEyeOffset, bool ForceMouseLook)
  2950. {
  2951. AvatarSitResponsePacket avatarSitResponse = new AvatarSitResponsePacket();
  2952. avatarSitResponse.SitObject.ID = TargetID;
  2953. avatarSitResponse.SitTransform.CameraAtOffset = CameraAtOffset;
  2954. avatarSitResponse.SitTransform.CameraEyeOffset = CameraEyeOffset;
  2955. avatarSitResponse.SitTransform.ForceMouselook = ForceMouseLook;
  2956. avatarSitResponse.SitTransform.AutoPilot = autopilot;
  2957. avatarSitResponse.SitTransform.SitPosition = OffsetPos;
  2958. avatarSitResponse.SitTransform.SitRotation = SitOrientation;
  2959. OutPacket(avatarSitResponse, ThrottleOutPacketType.Task);
  2960. }
  2961. public void SendAdminResponse(UUID Token, uint AdminLevel)
  2962. {
  2963. GrantGodlikePowersPacket respondPacket = new GrantGodlikePowersPacket();
  2964. GrantGodlikePowersPacket.GrantDataBlock gdb = new GrantGodlikePowersPacket.GrantDataBlock();
  2965. GrantGodlikePowersPacket.AgentDataBlock adb = new GrantGodlikePowersPacket.AgentDataBlock();
  2966. adb.AgentID = AgentId;
  2967. adb.SessionID = SessionId; // More security
  2968. gdb.GodLevel = (byte)AdminLevel;
  2969. gdb.Token = Token;
  2970. //respondPacket.AgentData = (GrantGodlikePowersPacket.AgentDataBlock)ablock;
  2971. respondPacket.GrantData = gdb;
  2972. respondPacket.AgentData = adb;
  2973. OutPacket(respondPacket, ThrottleOutPacketType.Task);
  2974. }
  2975. public void SendGroupMembership(GroupMembershipData[] GroupMembership)
  2976. {
  2977. UpdateGroupMembership(GroupMembership);
  2978. SendAgentGroupDataUpdate(AgentId,GroupMembership);
  2979. }
  2980. public void SendSelectedPartsProprieties(List<ISceneEntity> parts)
  2981. {
  2982. /* not in use
  2983. // udp part
  2984. ObjectPropertiesPacket packet =
  2985. (ObjectPropertiesPacket)PacketPool.Instance.GetPacket(PacketType.ObjectProperties);
  2986. ObjectPropertiesPacket.ObjectDataBlock[] ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[parts.Count];
  2987. int i = 0;
  2988. foreach(SceneObjectPart sop in parts)
  2989. ObjectData[i++] = CreateObjectPropertiesBlock(sop);
  2990. packet.ObjectData = ObjectData;
  2991. packet.Header.Zerocoded = true;
  2992. // udp send splits this mega packets correctly
  2993. // mb later will avoid that to reduce gc stress
  2994. OutPacket(packet, ThrottleOutPacketType.Task, true);
  2995. // caps physics part
  2996. IEventQueue eq = Scene.RequestModuleInterface<IEventQueue>();
  2997. if(eq == null)
  2998. return;
  2999. OSDArray array = new OSDArray();
  3000. foreach(SceneObjectPart sop in parts)
  3001. {
  3002. OSDMap physinfo = new OSDMap(6);
  3003. physinfo["LocalID"] = sop.LocalId;
  3004. physinfo["Density"] = sop.Density;
  3005. physinfo["Friction"] = sop.Friction;
  3006. physinfo["GravityMultiplier"] = sop.GravityModifier;
  3007. physinfo["Restitution"] = sop.Restitution;
  3008. physinfo["PhysicsShapeType"] = (int)sop.PhysicsShapeType;
  3009. array.Add(physinfo);
  3010. }
  3011. OSDMap llsdBody = new OSDMap(1);
  3012. llsdBody.Add("ObjectData", array);
  3013. eq.Enqueue(BuildEvent("ObjectPhysicsProperties", llsdBody),AgentId);
  3014. */
  3015. }
  3016. public void SendPartPhysicsProprieties(ISceneEntity entity)
  3017. {
  3018. IEventQueue eq = Scene.RequestModuleInterface<IEventQueue>();
  3019. if (eq == null)
  3020. return;
  3021. SceneObjectPart part = (SceneObjectPart)entity;
  3022. if (part == null)
  3023. return;
  3024. uint localid = part.LocalId;
  3025. byte physshapetype = part.PhysicsShapeType;
  3026. float density = part.Density;
  3027. float friction = part.Friction;
  3028. float bounce = part.Restitution;
  3029. float gravmod = part.GravityModifier;
  3030. eq.partPhysicsProperties(localid, physshapetype, density, friction, bounce, gravmod,AgentId);
  3031. }
  3032. public void SendGroupNameReply(UUID groupLLUID, string GroupName)
  3033. {
  3034. UUIDGroupNameReplyPacket pack = new UUIDGroupNameReplyPacket();
  3035. UUIDGroupNameReplyPacket.UUIDNameBlockBlock[] uidnameblock = new UUIDGroupNameReplyPacket.UUIDNameBlockBlock[1];
  3036. UUIDGroupNameReplyPacket.UUIDNameBlockBlock uidnamebloc = new UUIDGroupNameReplyPacket.UUIDNameBlockBlock();
  3037. uidnamebloc.ID = groupLLUID;
  3038. uidnamebloc.GroupName = Util.StringToBytes256(GroupName);
  3039. uidnameblock[0] = uidnamebloc;
  3040. pack.UUIDNameBlock = uidnameblock;
  3041. OutPacket(pack, ThrottleOutPacketType.Task);
  3042. }
  3043. public void SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia)
  3044. {
  3045. LandStatReplyPacket lsrp = new LandStatReplyPacket();
  3046. // LandStatReplyPacket.RequestDataBlock lsreqdpb = new LandStatReplyPacket.RequestDataBlock();
  3047. LandStatReplyPacket.ReportDataBlock[] lsrepdba = new LandStatReplyPacket.ReportDataBlock[lsrpia.Length];
  3048. //LandStatReplyPacket.ReportDataBlock lsrepdb = new LandStatReplyPacket.ReportDataBlock();
  3049. // lsrepdb.
  3050. lsrp.RequestData.ReportType = reportType;
  3051. lsrp.RequestData.RequestFlags = requestFlags;
  3052. lsrp.RequestData.TotalObjectCount = resultCount;
  3053. for (int i = 0; i < lsrpia.Length; i++)
  3054. {
  3055. LandStatReplyPacket.ReportDataBlock lsrepdb = new LandStatReplyPacket.ReportDataBlock();
  3056. lsrepdb.LocationX = lsrpia[i].LocationX;
  3057. lsrepdb.LocationY = lsrpia[i].LocationY;
  3058. lsrepdb.LocationZ = lsrpia[i].LocationZ;
  3059. lsrepdb.Score = lsrpia[i].Score;
  3060. lsrepdb.TaskID = lsrpia[i].TaskID;
  3061. lsrepdb.TaskLocalID = lsrpia[i].TaskLocalID;
  3062. lsrepdb.TaskName = Util.StringToBytes256(lsrpia[i].TaskName);
  3063. lsrepdb.OwnerName = Util.StringToBytes256(lsrpia[i].OwnerName);
  3064. lsrepdba[i] = lsrepdb;
  3065. }
  3066. lsrp.ReportData = lsrepdba;
  3067. OutPacket(lsrp, ThrottleOutPacketType.Task);
  3068. }
  3069. public void SendScriptRunningReply(UUID objectID, UUID itemID, bool running)
  3070. {
  3071. ScriptRunningReplyPacket scriptRunningReply = new ScriptRunningReplyPacket();
  3072. scriptRunningReply.Script.ObjectID = objectID;
  3073. scriptRunningReply.Script.ItemID = itemID;
  3074. scriptRunningReply.Script.Running = running;
  3075. OutPacket(scriptRunningReply, ThrottleOutPacketType.Task);
  3076. }
  3077. public void SendAsset(AssetRequestToClient req)
  3078. {
  3079. if (req.AssetInf == null)
  3080. {
  3081. m_log.ErrorFormat("{0} Cannot send asset {1} ({2}), asset is null",
  3082. LogHeader);
  3083. return;
  3084. }
  3085. if (req.AssetInf.Data == null)
  3086. {
  3087. m_log.ErrorFormat("{0} Cannot send asset {1} ({2}), asset data is null",
  3088. LogHeader, req.AssetInf.ID, req.AssetInf.Metadata.ContentType);
  3089. return;
  3090. }
  3091. bool isWearable = false;
  3092. isWearable = ((AssetType) req.AssetInf.Type ==
  3093. AssetType.Bodypart || (AssetType) req.AssetInf.Type == AssetType.Clothing);
  3094. //m_log.Debug("sending asset " + req.RequestAssetID + ", iswearable: " + isWearable);
  3095. //if (isWearable)
  3096. // m_log.Debug((AssetType)req.AssetInf.Type);
  3097. TransferInfoPacket Transfer = new TransferInfoPacket();
  3098. Transfer.TransferInfo.ChannelType = 2;
  3099. Transfer.TransferInfo.Status = 0;
  3100. Transfer.TransferInfo.TargetType = 0;
  3101. if (req.AssetRequestSource == 2)
  3102. {
  3103. Transfer.TransferInfo.Params = new byte[20];
  3104. Array.Copy(req.RequestAssetID.GetBytes(), 0, Transfer.TransferInfo.Params, 0, 16);
  3105. int assType = req.AssetInf.Type;
  3106. Array.Copy(Utils.IntToBytes(assType), 0, Transfer.TransferInfo.Params, 16, 4);
  3107. }
  3108. else if (req.AssetRequestSource == 3)
  3109. {
  3110. Transfer.TransferInfo.Params = req.Params;
  3111. // Transfer.TransferInfo.Params = new byte[100];
  3112. //Array.Copy(req.RequestUser.AgentId.GetBytes(), 0, Transfer.TransferInfo.Params, 0, 16);
  3113. //Array.Copy(req.RequestUser.SessionId.GetBytes(), 0, Transfer.TransferInfo.Params, 16, 16);
  3114. }
  3115. Transfer.TransferInfo.Size = req.AssetInf.Data.Length;
  3116. Transfer.TransferInfo.TransferID = req.TransferRequestID;
  3117. Transfer.Header.Zerocoded = true;
  3118. OutPacket(Transfer, isWearable ? ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority : ThrottleOutPacketType.Asset);
  3119. if (req.NumPackets == 1)
  3120. {
  3121. TransferPacketPacket TransferPacket = new TransferPacketPacket();
  3122. TransferPacket.TransferData.Packet = 0;
  3123. TransferPacket.TransferData.ChannelType = 2;
  3124. TransferPacket.TransferData.TransferID = req.TransferRequestID;
  3125. TransferPacket.TransferData.Data = req.AssetInf.Data;
  3126. TransferPacket.TransferData.Status = 1;
  3127. TransferPacket.Header.Zerocoded = true;
  3128. OutPacket(TransferPacket, isWearable ? ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority : ThrottleOutPacketType.Asset);
  3129. }
  3130. else
  3131. {
  3132. int processedLength = 0;
  3133. // int maxChunkSize = Settings.MAX_PACKET_SIZE - 100;
  3134. int maxChunkSize = (int) MaxTransferBytesPerPacket;
  3135. int packetNumber = 0;
  3136. while (processedLength < req.AssetInf.Data.Length)
  3137. {
  3138. TransferPacketPacket TransferPacket = new TransferPacketPacket();
  3139. TransferPacket.TransferData.Packet = packetNumber;
  3140. TransferPacket.TransferData.ChannelType = 2;
  3141. TransferPacket.TransferData.TransferID = req.TransferRequestID;
  3142. int chunkSize = Math.Min(req.AssetInf.Data.Length - processedLength, maxChunkSize);
  3143. byte[] chunk = new byte[chunkSize];
  3144. Array.Copy(req.AssetInf.Data, processedLength, chunk, 0, chunk.Length);
  3145. TransferPacket.TransferData.Data = chunk;
  3146. // 0 indicates more packets to come, 1 indicates last packet
  3147. if (req.AssetInf.Data.Length - processedLength > maxChunkSize)
  3148. {
  3149. TransferPacket.TransferData.Status = 0;
  3150. }
  3151. else
  3152. {
  3153. TransferPacket.TransferData.Status = 1;
  3154. }
  3155. TransferPacket.Header.Zerocoded = true;
  3156. OutPacket(TransferPacket, isWearable ? ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority : ThrottleOutPacketType.Asset);
  3157. processedLength += chunkSize;
  3158. packetNumber++;
  3159. }
  3160. }
  3161. }
  3162. public void SendAssetNotFound(AssetRequestToClient req)
  3163. {
  3164. TransferInfoPacket Transfer = new TransferInfoPacket();
  3165. Transfer.TransferInfo.ChannelType = 2;
  3166. Transfer.TransferInfo.Status = -2;
  3167. Transfer.TransferInfo.TargetType = 0;
  3168. Transfer.TransferInfo.Params = req.Params;
  3169. Transfer.TransferInfo.Size = 0;
  3170. Transfer.TransferInfo.TransferID = req.TransferRequestID;
  3171. Transfer.Header.Zerocoded = true;
  3172. OutPacket(Transfer, ThrottleOutPacketType.Asset);
  3173. }
  3174. public void SendTexture(AssetBase TextureAsset)
  3175. {
  3176. }
  3177. public void SendRegionHandle(UUID regionID, ulong handle)
  3178. {
  3179. RegionIDAndHandleReplyPacket reply = (RegionIDAndHandleReplyPacket)PacketPool.Instance.GetPacket(PacketType.RegionIDAndHandleReply);
  3180. reply.ReplyBlock.RegionID = regionID;
  3181. reply.ReplyBlock.RegionHandle = handle;
  3182. OutPacket(reply, ThrottleOutPacketType.Land);
  3183. }
  3184. public void SendParcelInfo(RegionInfo info, LandData land, UUID parcelID, uint x, uint y)
  3185. {
  3186. ParcelInfoReplyPacket reply = (ParcelInfoReplyPacket)PacketPool.Instance.GetPacket(PacketType.ParcelInfoReply);
  3187. reply.AgentData.AgentID = m_agentId;
  3188. reply.Data.ParcelID = parcelID;
  3189. reply.Data.OwnerID = land.OwnerID;
  3190. reply.Data.Name = Utils.StringToBytes(land.Name);
  3191. if (land.Description != null && land.Description != String.Empty)
  3192. reply.Data.Desc = Utils.StringToBytes(land.Description.Substring(0, land.Description.Length > 254 ? 254: land.Description.Length));
  3193. else
  3194. reply.Data.Desc = new Byte[0];
  3195. reply.Data.ActualArea = land.Area;
  3196. reply.Data.BillableArea = land.Area; // TODO: what is this?
  3197. reply.Data.Flags = (byte)Util.ConvertAccessLevelToMaturity((byte)info.AccessLevel);
  3198. if((land.Flags & (uint)ParcelFlags.ForSale) != 0)
  3199. reply.Data.Flags |= (byte)((1 << 7));
  3200. Vector3 pos = land.UserLocation;
  3201. if (pos.Equals(Vector3.Zero))
  3202. {
  3203. pos = (land.AABBMax + land.AABBMin) * 0.5f;
  3204. }
  3205. reply.Data.GlobalX = info.RegionLocX + x;
  3206. reply.Data.GlobalY = info.RegionLocY + y;
  3207. reply.Data.GlobalZ = pos.Z;
  3208. reply.Data.SimName = Utils.StringToBytes(info.RegionName);
  3209. reply.Data.SnapshotID = land.SnapshotID;
  3210. reply.Data.Dwell = land.Dwell;
  3211. reply.Data.SalePrice = land.SalePrice;
  3212. reply.Data.AuctionID = (int)land.AuctionID;
  3213. OutPacket(reply, ThrottleOutPacketType.Land);
  3214. }
  3215. public void SendScriptTeleportRequest(string objName, string simName, Vector3 pos, Vector3 lookAt)
  3216. {
  3217. ScriptTeleportRequestPacket packet = (ScriptTeleportRequestPacket)PacketPool.Instance.GetPacket(PacketType.ScriptTeleportRequest);
  3218. packet.Data.ObjectName = Utils.StringToBytes(objName);
  3219. packet.Data.SimName = Utils.StringToBytes(simName);
  3220. packet.Data.SimPosition = pos;
  3221. packet.Data.LookAt = lookAt;
  3222. OutPacket(packet, ThrottleOutPacketType.Task);
  3223. }
  3224. public void SendDirPlacesReply(UUID queryID, DirPlacesReplyData[] data)
  3225. {
  3226. DirPlacesReplyPacket packet = (DirPlacesReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirPlacesReply);
  3227. packet.AgentData = new DirPlacesReplyPacket.AgentDataBlock();
  3228. packet.QueryData = new DirPlacesReplyPacket.QueryDataBlock[1];
  3229. packet.QueryData[0] = new DirPlacesReplyPacket.QueryDataBlock();
  3230. packet.AgentData.AgentID = AgentId;
  3231. packet.QueryData[0].QueryID = queryID;
  3232. DirPlacesReplyPacket.QueryRepliesBlock[] replies =
  3233. new DirPlacesReplyPacket.QueryRepliesBlock[0];
  3234. DirPlacesReplyPacket.StatusDataBlock[] status =
  3235. new DirPlacesReplyPacket.StatusDataBlock[0];
  3236. packet.QueryReplies = replies;
  3237. packet.StatusData = status;
  3238. foreach (DirPlacesReplyData d in data)
  3239. {
  3240. int idx = replies.Length;
  3241. Array.Resize(ref replies, idx + 1);
  3242. Array.Resize(ref status, idx + 1);
  3243. replies[idx] = new DirPlacesReplyPacket.QueryRepliesBlock();
  3244. status[idx] = new DirPlacesReplyPacket.StatusDataBlock();
  3245. replies[idx].ParcelID = d.parcelID;
  3246. replies[idx].Name = Utils.StringToBytes(d.name);
  3247. replies[idx].ForSale = d.forSale;
  3248. replies[idx].Auction = d.auction;
  3249. replies[idx].Dwell = d.dwell;
  3250. status[idx].Status = d.Status;
  3251. packet.QueryReplies = replies;
  3252. packet.StatusData = status;
  3253. if (packet.Length >= 1000)
  3254. {
  3255. OutPacket(packet, ThrottleOutPacketType.Task);
  3256. packet = (DirPlacesReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirPlacesReply);
  3257. packet.AgentData = new DirPlacesReplyPacket.AgentDataBlock();
  3258. packet.QueryData = new DirPlacesReplyPacket.QueryDataBlock[1];
  3259. packet.QueryData[0] = new DirPlacesReplyPacket.QueryDataBlock();
  3260. packet.AgentData.AgentID = AgentId;
  3261. packet.QueryData[0].QueryID = queryID;
  3262. replies = new DirPlacesReplyPacket.QueryRepliesBlock[0];
  3263. status = new DirPlacesReplyPacket.StatusDataBlock[0];
  3264. }
  3265. }
  3266. if (replies.Length > 0 || data.Length == 0)
  3267. OutPacket(packet, ThrottleOutPacketType.Task);
  3268. }
  3269. public void SendDirPeopleReply(UUID queryID, DirPeopleReplyData[] data)
  3270. {
  3271. DirPeopleReplyPacket packet = (DirPeopleReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirPeopleReply);
  3272. packet.AgentData = new DirPeopleReplyPacket.AgentDataBlock();
  3273. packet.AgentData.AgentID = AgentId;
  3274. packet.QueryData = new DirPeopleReplyPacket.QueryDataBlock();
  3275. packet.QueryData.QueryID = queryID;
  3276. packet.QueryReplies = new DirPeopleReplyPacket.QueryRepliesBlock[
  3277. data.Length];
  3278. int i = 0;
  3279. foreach (DirPeopleReplyData d in data)
  3280. {
  3281. packet.QueryReplies[i] = new DirPeopleReplyPacket.QueryRepliesBlock();
  3282. packet.QueryReplies[i].AgentID = d.agentID;
  3283. packet.QueryReplies[i].FirstName =
  3284. Utils.StringToBytes(d.firstName);
  3285. packet.QueryReplies[i].LastName =
  3286. Utils.StringToBytes(d.lastName);
  3287. packet.QueryReplies[i].Group =
  3288. Utils.StringToBytes(d.group);
  3289. packet.QueryReplies[i].Online = d.online;
  3290. packet.QueryReplies[i].Reputation = d.reputation;
  3291. i++;
  3292. }
  3293. OutPacket(packet, ThrottleOutPacketType.Task);
  3294. }
  3295. public void SendDirEventsReply(UUID queryID, DirEventsReplyData[] data)
  3296. {
  3297. DirEventsReplyPacket packet = (DirEventsReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirEventsReply);
  3298. packet.AgentData = new DirEventsReplyPacket.AgentDataBlock();
  3299. packet.AgentData.AgentID = AgentId;
  3300. packet.QueryData = new DirEventsReplyPacket.QueryDataBlock();
  3301. packet.QueryData.QueryID = queryID;
  3302. packet.QueryReplies = new DirEventsReplyPacket.QueryRepliesBlock[
  3303. data.Length];
  3304. packet.StatusData = new DirEventsReplyPacket.StatusDataBlock[
  3305. data.Length];
  3306. int i = 0;
  3307. foreach (DirEventsReplyData d in data)
  3308. {
  3309. packet.QueryReplies[i] = new DirEventsReplyPacket.QueryRepliesBlock();
  3310. packet.StatusData[i] = new DirEventsReplyPacket.StatusDataBlock();
  3311. packet.QueryReplies[i].OwnerID = d.ownerID;
  3312. packet.QueryReplies[i].Name =
  3313. Utils.StringToBytes(d.name);
  3314. packet.QueryReplies[i].EventID = d.eventID;
  3315. packet.QueryReplies[i].Date =
  3316. Utils.StringToBytes(d.date);
  3317. packet.QueryReplies[i].UnixTime = d.unixTime;
  3318. packet.QueryReplies[i].EventFlags = d.eventFlags;
  3319. packet.StatusData[i].Status = d.Status;
  3320. i++;
  3321. }
  3322. OutPacket(packet, ThrottleOutPacketType.Task);
  3323. }
  3324. public void SendDirGroupsReply(UUID queryID, DirGroupsReplyData[] data)
  3325. {
  3326. DirGroupsReplyPacket packet = (DirGroupsReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirGroupsReply);
  3327. packet.AgentData = new DirGroupsReplyPacket.AgentDataBlock();
  3328. packet.AgentData.AgentID = AgentId;
  3329. packet.QueryData = new DirGroupsReplyPacket.QueryDataBlock();
  3330. packet.QueryData.QueryID = queryID;
  3331. packet.QueryReplies = new DirGroupsReplyPacket.QueryRepliesBlock[data.Length];
  3332. int i = 0;
  3333. foreach (DirGroupsReplyData d in data)
  3334. {
  3335. packet.QueryReplies[i] = new DirGroupsReplyPacket.QueryRepliesBlock();
  3336. packet.QueryReplies[i].GroupID = d.groupID;
  3337. packet.QueryReplies[i].GroupName = Util.StringToBytes(d.groupName, 35);
  3338. packet.QueryReplies[i].Members = d.members;
  3339. packet.QueryReplies[i].SearchOrder = d.searchOrder;
  3340. ++i;
  3341. }
  3342. OutPacket(packet, ThrottleOutPacketType.Task);
  3343. }
  3344. public void SendDirClassifiedReply(UUID queryID, DirClassifiedReplyData[] data)
  3345. {
  3346. DirClassifiedReplyPacket packet = (DirClassifiedReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirClassifiedReply);
  3347. packet.AgentData = new DirClassifiedReplyPacket.AgentDataBlock();
  3348. packet.AgentData.AgentID = AgentId;
  3349. packet.QueryData = new DirClassifiedReplyPacket.QueryDataBlock();
  3350. packet.QueryData.QueryID = queryID;
  3351. packet.QueryReplies = new DirClassifiedReplyPacket.QueryRepliesBlock[
  3352. data.Length];
  3353. packet.StatusData = new DirClassifiedReplyPacket.StatusDataBlock[
  3354. data.Length];
  3355. int i = 0;
  3356. foreach (DirClassifiedReplyData d in data)
  3357. {
  3358. packet.QueryReplies[i] = new DirClassifiedReplyPacket.QueryRepliesBlock();
  3359. packet.StatusData[i] = new DirClassifiedReplyPacket.StatusDataBlock();
  3360. packet.QueryReplies[i].ClassifiedID = d.classifiedID;
  3361. packet.QueryReplies[i].Name =
  3362. Utils.StringToBytes(d.name);
  3363. packet.QueryReplies[i].ClassifiedFlags = d.classifiedFlags;
  3364. packet.QueryReplies[i].CreationDate = d.creationDate;
  3365. packet.QueryReplies[i].ExpirationDate = d.expirationDate;
  3366. packet.QueryReplies[i].PriceForListing = d.price;
  3367. packet.StatusData[i].Status = d.Status;
  3368. i++;
  3369. }
  3370. OutPacket(packet, ThrottleOutPacketType.Task);
  3371. }
  3372. public void SendDirLandReply(UUID queryID, DirLandReplyData[] data)
  3373. {
  3374. DirLandReplyPacket packet = (DirLandReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirLandReply);
  3375. packet.AgentData = new DirLandReplyPacket.AgentDataBlock();
  3376. packet.AgentData.AgentID = AgentId;
  3377. packet.QueryData = new DirLandReplyPacket.QueryDataBlock();
  3378. packet.QueryData.QueryID = queryID;
  3379. packet.QueryReplies = new DirLandReplyPacket.QueryRepliesBlock[
  3380. data.Length];
  3381. int i = 0;
  3382. foreach (DirLandReplyData d in data)
  3383. {
  3384. packet.QueryReplies[i] = new DirLandReplyPacket.QueryRepliesBlock();
  3385. packet.QueryReplies[i].ParcelID = d.parcelID;
  3386. packet.QueryReplies[i].Name =
  3387. Utils.StringToBytes(d.name);
  3388. packet.QueryReplies[i].Auction = d.auction;
  3389. packet.QueryReplies[i].ForSale = d.forSale;
  3390. packet.QueryReplies[i].SalePrice = d.salePrice;
  3391. packet.QueryReplies[i].ActualArea = d.actualArea;
  3392. i++;
  3393. }
  3394. OutPacket(packet, ThrottleOutPacketType.Task);
  3395. }
  3396. public void SendDirPopularReply(UUID queryID, DirPopularReplyData[] data)
  3397. {
  3398. DirPopularReplyPacket packet = (DirPopularReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirPopularReply);
  3399. packet.AgentData = new DirPopularReplyPacket.AgentDataBlock();
  3400. packet.AgentData.AgentID = AgentId;
  3401. packet.QueryData = new DirPopularReplyPacket.QueryDataBlock();
  3402. packet.QueryData.QueryID = queryID;
  3403. packet.QueryReplies = new DirPopularReplyPacket.QueryRepliesBlock[
  3404. data.Length];
  3405. int i = 0;
  3406. foreach (DirPopularReplyData d in data)
  3407. {
  3408. packet.QueryReplies[i] = new DirPopularReplyPacket.QueryRepliesBlock();
  3409. packet.QueryReplies[i].ParcelID = d.parcelID;
  3410. packet.QueryReplies[i].Name =
  3411. Utils.StringToBytes(d.name);
  3412. packet.QueryReplies[i].Dwell = d.dwell;
  3413. i++;
  3414. }
  3415. OutPacket(packet, ThrottleOutPacketType.Task);
  3416. }
  3417. public void SendEventInfoReply(EventData data)
  3418. {
  3419. EventInfoReplyPacket packet = (EventInfoReplyPacket)PacketPool.Instance.GetPacket(PacketType.EventInfoReply);
  3420. packet.AgentData = new EventInfoReplyPacket.AgentDataBlock();
  3421. packet.AgentData.AgentID = AgentId;
  3422. packet.EventData = new EventInfoReplyPacket.EventDataBlock();
  3423. packet.EventData.EventID = data.eventID;
  3424. packet.EventData.Creator = Utils.StringToBytes(data.creator);
  3425. packet.EventData.Name = Utils.StringToBytes(data.name);
  3426. packet.EventData.Category = Utils.StringToBytes(data.category);
  3427. packet.EventData.Desc = Utils.StringToBytes(data.description);
  3428. packet.EventData.Date = Utils.StringToBytes(data.date);
  3429. packet.EventData.DateUTC = data.dateUTC;
  3430. packet.EventData.Duration = data.duration;
  3431. packet.EventData.Cover = data.cover;
  3432. packet.EventData.Amount = data.amount;
  3433. packet.EventData.SimName = Utils.StringToBytes(data.simName);
  3434. packet.EventData.GlobalPos = new Vector3d(data.globalPos);
  3435. packet.EventData.EventFlags = data.eventFlags;
  3436. OutPacket(packet, ThrottleOutPacketType.Task);
  3437. }
  3438. public void SendOfferCallingCard(UUID srcID, UUID transactionID)
  3439. {
  3440. // a bit special, as this uses AgentID to store the source instead
  3441. // of the destination. The destination (the receiver) goes into destID
  3442. OfferCallingCardPacket p = (OfferCallingCardPacket)PacketPool.Instance.GetPacket(PacketType.OfferCallingCard);
  3443. p.AgentData.AgentID = srcID;
  3444. p.AgentData.SessionID = UUID.Zero;
  3445. p.AgentBlock.DestID = AgentId;
  3446. p.AgentBlock.TransactionID = transactionID;
  3447. OutPacket(p, ThrottleOutPacketType.Task);
  3448. }
  3449. public void SendAcceptCallingCard(UUID transactionID)
  3450. {
  3451. AcceptCallingCardPacket p = (AcceptCallingCardPacket)PacketPool.Instance.GetPacket(PacketType.AcceptCallingCard);
  3452. p.AgentData.AgentID = AgentId;
  3453. p.AgentData.SessionID = UUID.Zero;
  3454. p.FolderData = new AcceptCallingCardPacket.FolderDataBlock[1];
  3455. p.FolderData[0] = new AcceptCallingCardPacket.FolderDataBlock();
  3456. p.FolderData[0].FolderID = UUID.Zero;
  3457. OutPacket(p, ThrottleOutPacketType.Task);
  3458. }
  3459. public void SendDeclineCallingCard(UUID transactionID)
  3460. {
  3461. DeclineCallingCardPacket p = (DeclineCallingCardPacket)PacketPool.Instance.GetPacket(PacketType.DeclineCallingCard);
  3462. p.AgentData.AgentID = AgentId;
  3463. p.AgentData.SessionID = UUID.Zero;
  3464. p.TransactionBlock.TransactionID = transactionID;
  3465. OutPacket(p, ThrottleOutPacketType.Task);
  3466. }
  3467. public void SendTerminateFriend(UUID exFriendID)
  3468. {
  3469. TerminateFriendshipPacket p = (TerminateFriendshipPacket)PacketPool.Instance.GetPacket(PacketType.TerminateFriendship);
  3470. p.AgentData.AgentID = AgentId;
  3471. p.AgentData.SessionID = SessionId;
  3472. p.ExBlock.OtherID = exFriendID;
  3473. OutPacket(p, ThrottleOutPacketType.Task);
  3474. }
  3475. public void SendAvatarGroupsReply(UUID avatarID, GroupMembershipData[] data)
  3476. {
  3477. IEventQueue eq = Scene.RequestModuleInterface<IEventQueue>();
  3478. if (eq == null)
  3479. return;
  3480. // message template has a GroupData field AcceptNotices ignored by viewers
  3481. // and a array NewGroupData also ignored
  3482. StringBuilder sb = eq.StartEvent("AvatarGroupsReply");
  3483. LLSDxmlEncode.AddArrayAndMap("AgentData", sb);
  3484. LLSDxmlEncode.AddElem("AgentID", AgentId, sb);
  3485. LLSDxmlEncode.AddElem("AvatarID", avatarID, sb);
  3486. LLSDxmlEncode.AddEndMapAndArray(sb);
  3487. if(data.Length == 0)
  3488. LLSDxmlEncode.AddEmptyArray("GroupData", sb);
  3489. else
  3490. {
  3491. LLSDxmlEncode.AddArray("GroupData", sb);
  3492. GroupMembershipData m;
  3493. for (int indx = 0; indx < data.Length; ++indx)
  3494. {
  3495. m = data[indx];
  3496. LLSDxmlEncode.AddMap(sb);
  3497. LLSDxmlEncode.AddElem("GroupPowers", m.GroupPowers, sb);
  3498. LLSDxmlEncode.AddElem("GroupTitle", m.GroupTitle, sb);
  3499. LLSDxmlEncode.AddElem("GroupID",m.GroupID, sb);
  3500. LLSDxmlEncode.AddElem("GroupName", m.GroupName, sb);
  3501. LLSDxmlEncode.AddElem("GroupInsigniaID", m.GroupPicture, sb);
  3502. LLSDxmlEncode.AddEndMap(sb);
  3503. }
  3504. LLSDxmlEncode.AddEndArray(sb);
  3505. }
  3506. OSD ev = new OSDllsdxml(eq.EndEvent(sb));
  3507. eq.Enqueue(ev, AgentId);
  3508. }
  3509. public void SendAgentGroupDataUpdate(UUID avatarID, GroupMembershipData[] data)
  3510. {
  3511. if(avatarID != AgentId)
  3512. m_log.Debug("[CLIENT]: SendAgentGroupDataUpdate avatarID != AgentId");
  3513. IEventQueue eq = this.Scene.RequestModuleInterface<IEventQueue>();
  3514. if(eq != null)
  3515. {
  3516. eq.GroupMembershipData(avatarID,data);
  3517. }
  3518. else
  3519. {
  3520. // use UDP if no caps
  3521. AgentGroupDataUpdatePacket Groupupdate = new AgentGroupDataUpdatePacket();
  3522. AgentGroupDataUpdatePacket.GroupDataBlock[] Groups = new AgentGroupDataUpdatePacket.GroupDataBlock[data.Length];
  3523. for (int i = 0; i < data.Length; ++i)
  3524. {
  3525. AgentGroupDataUpdatePacket.GroupDataBlock Group = new AgentGroupDataUpdatePacket.GroupDataBlock();
  3526. Group.AcceptNotices = data[i].AcceptNotices;
  3527. Group.Contribution = data[i].Contribution;
  3528. Group.GroupID = data[i].GroupID;
  3529. Group.GroupInsigniaID = data[i].GroupPicture;
  3530. Group.GroupName = Util.StringToBytes256(data[i].GroupName);
  3531. Group.GroupPowers = data[i].GroupPowers;
  3532. Groups[i] = Group;
  3533. }
  3534. Groupupdate.GroupData = Groups;
  3535. Groupupdate.AgentData = new AgentGroupDataUpdatePacket.AgentDataBlock();
  3536. Groupupdate.AgentData.AgentID = avatarID;
  3537. OutPacket(Groupupdate, ThrottleOutPacketType.Task);
  3538. }
  3539. }
  3540. public void SendJoinGroupReply(UUID groupID, bool success)
  3541. {
  3542. JoinGroupReplyPacket p = (JoinGroupReplyPacket)PacketPool.Instance.GetPacket(PacketType.JoinGroupReply);
  3543. p.AgentData = new JoinGroupReplyPacket.AgentDataBlock();
  3544. p.AgentData.AgentID = AgentId;
  3545. p.GroupData = new JoinGroupReplyPacket.GroupDataBlock();
  3546. p.GroupData.GroupID = groupID;
  3547. p.GroupData.Success = success;
  3548. OutPacket(p, ThrottleOutPacketType.Task);
  3549. }
  3550. public void SendEjectGroupMemberReply(UUID agentID, UUID groupID, bool success)
  3551. {
  3552. EjectGroupMemberReplyPacket p = (EjectGroupMemberReplyPacket)PacketPool.Instance.GetPacket(PacketType.EjectGroupMemberReply);
  3553. p.AgentData = new EjectGroupMemberReplyPacket.AgentDataBlock();
  3554. p.AgentData.AgentID = agentID;
  3555. p.GroupData = new EjectGroupMemberReplyPacket.GroupDataBlock();
  3556. p.GroupData.GroupID = groupID;
  3557. p.EjectData = new EjectGroupMemberReplyPacket.EjectDataBlock();
  3558. p.EjectData.Success = success;
  3559. OutPacket(p, ThrottleOutPacketType.Task);
  3560. }
  3561. public void SendLeaveGroupReply(UUID groupID, bool success)
  3562. {
  3563. LeaveGroupReplyPacket p = (LeaveGroupReplyPacket)PacketPool.Instance.GetPacket(PacketType.LeaveGroupReply);
  3564. p.AgentData = new LeaveGroupReplyPacket.AgentDataBlock();
  3565. p.AgentData.AgentID = AgentId;
  3566. p.GroupData = new LeaveGroupReplyPacket.GroupDataBlock();
  3567. p.GroupData.GroupID = groupID;
  3568. p.GroupData.Success = success;
  3569. OutPacket(p, ThrottleOutPacketType.Task);
  3570. }
  3571. public void SendAvatarClassifiedReply(UUID targetID, UUID[] classifiedID, string[] name)
  3572. {
  3573. if (classifiedID.Length != name.Length)
  3574. return;
  3575. AvatarClassifiedReplyPacket ac =
  3576. (AvatarClassifiedReplyPacket)PacketPool.Instance.GetPacket(
  3577. PacketType.AvatarClassifiedReply);
  3578. ac.AgentData = new AvatarClassifiedReplyPacket.AgentDataBlock();
  3579. ac.AgentData.AgentID = AgentId;
  3580. ac.AgentData.TargetID = targetID;
  3581. ac.Data = new AvatarClassifiedReplyPacket.DataBlock[classifiedID.Length];
  3582. int i;
  3583. for (i = 0; i < classifiedID.Length; i++)
  3584. {
  3585. ac.Data[i].ClassifiedID = classifiedID[i];
  3586. ac.Data[i].Name = Utils.StringToBytes(name[i]);
  3587. }
  3588. OutPacket(ac, ThrottleOutPacketType.Task);
  3589. }
  3590. public void SendClassifiedInfoReply(UUID classifiedID, UUID creatorID, uint creationDate, uint expirationDate, uint category, string name, string description, UUID parcelID, uint parentEstate, UUID snapshotID, string simName, Vector3 globalPos, string parcelName, byte classifiedFlags, int price)
  3591. {
  3592. ClassifiedInfoReplyPacket cr =
  3593. (ClassifiedInfoReplyPacket)PacketPool.Instance.GetPacket(
  3594. PacketType.ClassifiedInfoReply);
  3595. cr.AgentData = new ClassifiedInfoReplyPacket.AgentDataBlock();
  3596. cr.AgentData.AgentID = AgentId;
  3597. cr.Data = new ClassifiedInfoReplyPacket.DataBlock();
  3598. cr.Data.ClassifiedID = classifiedID;
  3599. cr.Data.CreatorID = creatorID;
  3600. cr.Data.CreationDate = creationDate;
  3601. cr.Data.ExpirationDate = expirationDate;
  3602. cr.Data.Category = category;
  3603. cr.Data.Name = Utils.StringToBytes(name);
  3604. cr.Data.Desc = Utils.StringToBytes(description);
  3605. cr.Data.ParcelID = parcelID;
  3606. cr.Data.ParentEstate = parentEstate;
  3607. cr.Data.SnapshotID = snapshotID;
  3608. cr.Data.SimName = Utils.StringToBytes(simName);
  3609. cr.Data.PosGlobal = new Vector3d(globalPos);
  3610. cr.Data.ParcelName = Utils.StringToBytes(parcelName);
  3611. cr.Data.ClassifiedFlags = classifiedFlags;
  3612. cr.Data.PriceForListing = price;
  3613. OutPacket(cr, ThrottleOutPacketType.Task);
  3614. }
  3615. public void SendAgentDropGroup(UUID groupID)
  3616. {
  3617. AgentDropGroupPacket dg =
  3618. (AgentDropGroupPacket)PacketPool.Instance.GetPacket(
  3619. PacketType.AgentDropGroup);
  3620. dg.AgentData = new AgentDropGroupPacket.AgentDataBlock();
  3621. dg.AgentData.AgentID = AgentId;
  3622. dg.AgentData.GroupID = groupID;
  3623. OutPacket(dg, ThrottleOutPacketType.Task);
  3624. }
  3625. public void SendAvatarNotesReply(UUID targetID, string text)
  3626. {
  3627. AvatarNotesReplyPacket an =
  3628. (AvatarNotesReplyPacket)PacketPool.Instance.GetPacket(
  3629. PacketType.AvatarNotesReply);
  3630. an.AgentData = new AvatarNotesReplyPacket.AgentDataBlock();
  3631. an.AgentData.AgentID = AgentId;
  3632. an.Data = new AvatarNotesReplyPacket.DataBlock();
  3633. an.Data.TargetID = targetID;
  3634. an.Data.Notes = Utils.StringToBytes(text);
  3635. OutPacket(an, ThrottleOutPacketType.Task);
  3636. }
  3637. public void SendAvatarPicksReply(UUID targetID, Dictionary<UUID, string> picks)
  3638. {
  3639. AvatarPicksReplyPacket ap =
  3640. (AvatarPicksReplyPacket)PacketPool.Instance.GetPacket(
  3641. PacketType.AvatarPicksReply);
  3642. ap.AgentData = new AvatarPicksReplyPacket.AgentDataBlock();
  3643. ap.AgentData.AgentID = AgentId;
  3644. ap.AgentData.TargetID = targetID;
  3645. ap.Data = new AvatarPicksReplyPacket.DataBlock[picks.Count];
  3646. int i = 0;
  3647. foreach (KeyValuePair<UUID, string> pick in picks)
  3648. {
  3649. ap.Data[i] = new AvatarPicksReplyPacket.DataBlock();
  3650. ap.Data[i].PickID = pick.Key;
  3651. ap.Data[i].PickName = Utils.StringToBytes(pick.Value);
  3652. i++;
  3653. }
  3654. OutPacket(ap, ThrottleOutPacketType.Task);
  3655. }
  3656. public void SendAvatarClassifiedReply(UUID targetID, Dictionary<UUID, string> classifieds)
  3657. {
  3658. AvatarClassifiedReplyPacket ac =
  3659. (AvatarClassifiedReplyPacket)PacketPool.Instance.GetPacket(
  3660. PacketType.AvatarClassifiedReply);
  3661. ac.AgentData = new AvatarClassifiedReplyPacket.AgentDataBlock();
  3662. ac.AgentData.AgentID = AgentId;
  3663. ac.AgentData.TargetID = targetID;
  3664. ac.Data = new AvatarClassifiedReplyPacket.DataBlock[classifieds.Count];
  3665. int i = 0;
  3666. foreach (KeyValuePair<UUID, string> classified in classifieds)
  3667. {
  3668. ac.Data[i] = new AvatarClassifiedReplyPacket.DataBlock();
  3669. ac.Data[i].ClassifiedID = classified.Key;
  3670. ac.Data[i].Name = Utils.StringToBytes(classified.Value);
  3671. i++;
  3672. }
  3673. OutPacket(ac, ThrottleOutPacketType.Task);
  3674. }
  3675. public void SendParcelDwellReply(int localID, UUID parcelID, float dwell)
  3676. {
  3677. ParcelDwellReplyPacket pd =
  3678. (ParcelDwellReplyPacket)PacketPool.Instance.GetPacket(
  3679. PacketType.ParcelDwellReply);
  3680. pd.AgentData = new ParcelDwellReplyPacket.AgentDataBlock();
  3681. pd.AgentData.AgentID = AgentId;
  3682. pd.Data = new ParcelDwellReplyPacket.DataBlock();
  3683. pd.Data.LocalID = localID;
  3684. pd.Data.ParcelID = parcelID;
  3685. pd.Data.Dwell = dwell;
  3686. OutPacket(pd, ThrottleOutPacketType.Land);
  3687. }
  3688. public void SendUserInfoReply(bool imViaEmail, bool visible, string email)
  3689. {
  3690. UserInfoReplyPacket ur =
  3691. (UserInfoReplyPacket)PacketPool.Instance.GetPacket(
  3692. PacketType.UserInfoReply);
  3693. string Visible = "hidden";
  3694. if (visible)
  3695. Visible = "default";
  3696. ur.AgentData = new UserInfoReplyPacket.AgentDataBlock();
  3697. ur.AgentData.AgentID = AgentId;
  3698. ur.UserData = new UserInfoReplyPacket.UserDataBlock();
  3699. ur.UserData.IMViaEMail = imViaEmail;
  3700. ur.UserData.DirectoryVisibility = Utils.StringToBytes(Visible);
  3701. ur.UserData.EMail = Utils.StringToBytes(email);
  3702. OutPacket(ur, ThrottleOutPacketType.Task);
  3703. }
  3704. public void SendCreateGroupReply(UUID groupID, bool success, string message)
  3705. {
  3706. CreateGroupReplyPacket createGroupReply = (CreateGroupReplyPacket)PacketPool.Instance.GetPacket(PacketType.CreateGroupReply);
  3707. createGroupReply.AgentData =
  3708. new CreateGroupReplyPacket.AgentDataBlock();
  3709. createGroupReply.ReplyData =
  3710. new CreateGroupReplyPacket.ReplyDataBlock();
  3711. createGroupReply.AgentData.AgentID = AgentId;
  3712. createGroupReply.ReplyData.GroupID = groupID;
  3713. createGroupReply.ReplyData.Success = success;
  3714. createGroupReply.ReplyData.Message = Utils.StringToBytes(message);
  3715. OutPacket(createGroupReply, ThrottleOutPacketType.Task);
  3716. }
  3717. public void SendUseCachedMuteList()
  3718. {
  3719. UseCachedMuteListPacket useCachedMuteList = (UseCachedMuteListPacket)PacketPool.Instance.GetPacket(PacketType.UseCachedMuteList);
  3720. useCachedMuteList.AgentData = new UseCachedMuteListPacket.AgentDataBlock();
  3721. useCachedMuteList.AgentData.AgentID = AgentId;
  3722. OutPacket(useCachedMuteList, ThrottleOutPacketType.Task);
  3723. }
  3724. public void SendEmpytMuteList()
  3725. {
  3726. GenericMessagePacket gmp = new GenericMessagePacket();
  3727. gmp.AgentData.AgentID = AgentId;
  3728. gmp.AgentData.SessionID = m_sessionId;
  3729. gmp.AgentData.TransactionID = UUID.Zero;
  3730. gmp.MethodData.Method = Util.StringToBytes256("emptymutelist");
  3731. gmp.ParamList = new GenericMessagePacket.ParamListBlock[1];
  3732. gmp.ParamList[0] = new GenericMessagePacket.ParamListBlock();
  3733. gmp.ParamList[0].Parameter = new byte[0];
  3734. OutPacket(gmp, ThrottleOutPacketType.Task);
  3735. }
  3736. public void SendMuteListUpdate(string filename)
  3737. {
  3738. MuteListUpdatePacket muteListUpdate = (MuteListUpdatePacket)PacketPool.Instance.GetPacket(PacketType.MuteListUpdate);
  3739. muteListUpdate.MuteData = new MuteListUpdatePacket.MuteDataBlock();
  3740. muteListUpdate.MuteData.AgentID = AgentId;
  3741. muteListUpdate.MuteData.Filename = Utils.StringToBytes(filename);
  3742. OutPacket(muteListUpdate, ThrottleOutPacketType.Task);
  3743. }
  3744. public void SendPickInfoReply(UUID pickID, UUID creatorID, bool topPick, UUID parcelID, string name, string desc, UUID snapshotID, string user, string originalName, string simName, Vector3 posGlobal, int sortOrder, bool enabled)
  3745. {
  3746. PickInfoReplyPacket pickInfoReply = (PickInfoReplyPacket)PacketPool.Instance.GetPacket(PacketType.PickInfoReply);
  3747. pickInfoReply.AgentData = new PickInfoReplyPacket.AgentDataBlock();
  3748. pickInfoReply.AgentData.AgentID = AgentId;
  3749. pickInfoReply.Data = new PickInfoReplyPacket.DataBlock();
  3750. pickInfoReply.Data.PickID = pickID;
  3751. pickInfoReply.Data.CreatorID = creatorID;
  3752. pickInfoReply.Data.TopPick = topPick;
  3753. pickInfoReply.Data.ParcelID = parcelID;
  3754. pickInfoReply.Data.Name = Utils.StringToBytes(name);
  3755. pickInfoReply.Data.Desc = Utils.StringToBytes(desc);
  3756. pickInfoReply.Data.SnapshotID = snapshotID;
  3757. pickInfoReply.Data.User = Utils.StringToBytes(user);
  3758. pickInfoReply.Data.OriginalName = Utils.StringToBytes(originalName);
  3759. pickInfoReply.Data.SimName = Utils.StringToBytes(simName);
  3760. pickInfoReply.Data.PosGlobal = new Vector3d(posGlobal);
  3761. pickInfoReply.Data.SortOrder = sortOrder;
  3762. pickInfoReply.Data.Enabled = enabled;
  3763. OutPacket(pickInfoReply, ThrottleOutPacketType.Task);
  3764. }
  3765. #endregion Scene/Avatar to Client
  3766. // Gesture
  3767. #region Appearance/ Wearables Methods
  3768. public void SendWearables(AvatarWearable[] wearables, int serial)
  3769. {
  3770. AgentWearablesUpdatePacket aw = (AgentWearablesUpdatePacket)PacketPool.Instance.GetPacket(PacketType.AgentWearablesUpdate);
  3771. aw.AgentData.AgentID = AgentId;
  3772. aw.AgentData.SerialNum = (uint)serial;
  3773. aw.AgentData.SessionID = m_sessionId;
  3774. int count = 0;
  3775. for (int i = 0; i < wearables.Length; i++)
  3776. count += wearables[i].Count;
  3777. // TODO: don't create new blocks if recycling an old packet
  3778. aw.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[count];
  3779. AgentWearablesUpdatePacket.WearableDataBlock awb;
  3780. int idx = 0;
  3781. for (int i = 0; i < wearables.Length; i++)
  3782. {
  3783. for (int j = 0; j < wearables[i].Count; j++)
  3784. {
  3785. awb = new AgentWearablesUpdatePacket.WearableDataBlock();
  3786. awb.WearableType = (byte) i;
  3787. awb.AssetID = wearables[i][j].AssetID;
  3788. awb.ItemID = wearables[i][j].ItemID;
  3789. aw.WearableData[idx] = awb;
  3790. idx++;
  3791. // m_log.DebugFormat(
  3792. // "[APPEARANCE]: Sending wearable item/asset {0} {1} (index {2}) for {3}",
  3793. // awb.ItemID, awb.AssetID, i, Name);
  3794. }
  3795. }
  3796. OutPacket(aw, ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority);
  3797. }
  3798. static private readonly byte[] AvatarAppearanceHeader = new byte[] {
  3799. Helpers.MSG_RELIABLE | Helpers.MSG_ZEROCODED,
  3800. 0, 0, 0, 0, // sequence number
  3801. 0, // extra
  3802. 0xff, 0xff, 0, 158 // ID 158 (low frequency bigendian) not zeroencoded
  3803. //0xff, 0xff, 0, 1, 158 // ID 158 (low frequency bigendian) zeroencoded
  3804. };
  3805. public void SendAppearance(UUID targetID, byte[] visualParams, byte[] textureEntry, float hover)
  3806. {
  3807. // doing post zero encode, because odds of beeing bad are not that low
  3808. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  3809. Buffer.BlockCopy(AvatarAppearanceHeader, 0, buf.Data, 0, 10);
  3810. byte[] data = buf.Data;
  3811. int pos = 10;
  3812. //sender block
  3813. targetID.ToBytes(data, pos); pos += 16;
  3814. data[pos++] = 0;// is trial = false
  3815. // objectdata block ie texture
  3816. int len = textureEntry.Length;
  3817. if (len == 0)
  3818. {
  3819. data[pos++] = 0;
  3820. data[pos++] = 0;
  3821. }
  3822. else
  3823. {
  3824. data[pos++] = (byte)len;
  3825. data[pos++] = (byte)(len >> 8);
  3826. Buffer.BlockCopy(textureEntry, 0, data, pos, len); pos += len;
  3827. }
  3828. // visual parameters
  3829. len = visualParams.Length;
  3830. data[pos++] = (byte)len;
  3831. if(len > 0)
  3832. Buffer.BlockCopy(visualParams, 0, data, pos, len); pos += len;
  3833. // no AppearanceData
  3834. data[pos++] = 0;
  3835. // no AppearanceHover
  3836. data[pos++] = 1;
  3837. Utils.FloatToBytesSafepos(0, data, pos); pos += 4;
  3838. Utils.FloatToBytesSafepos(0, data, pos); pos += 4;
  3839. Utils.FloatToBytesSafepos(hover, data, pos); pos += 4;
  3840. buf.DataLength = pos;
  3841. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority, null, false, true);
  3842. }
  3843. static private readonly byte[] AvatarAnimationHeader = new byte[] {
  3844. Helpers.MSG_RELIABLE,
  3845. 0, 0, 0, 0, // sequence number
  3846. 0, // extra
  3847. 20 // ID (high frequency)
  3848. };
  3849. public void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId, UUID[] objectIDs)
  3850. {
  3851. // m_log.DebugFormat("[LLCLIENTVIEW]: Sending animations for {0} to {1}", sourceAgentId, Name);
  3852. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  3853. byte[] data = buf.Data;
  3854. //setup header
  3855. Buffer.BlockCopy(AvatarAnimationHeader, 0, data, 0, 7);
  3856. //agent block
  3857. sourceAgentId.ToBytes(data, 7);
  3858. // animations count
  3859. data[23] = (byte)animations.Length;
  3860. int pos = 24;
  3861. //self animations
  3862. if (sourceAgentId == AgentId)
  3863. {
  3864. List<int> withobjects = new List<int>(animations.Length);
  3865. List<int> noobjects = new List<int>(animations.Length);
  3866. for (int indx = 0; indx < animations.Length; ++indx)
  3867. {
  3868. if (objectIDs[indx] == sourceAgentId || objectIDs[indx] == UUID.Zero)
  3869. noobjects.Add(indx);
  3870. else
  3871. withobjects.Add(indx);
  3872. }
  3873. int i;
  3874. // first the ones with corresponding objects
  3875. for (int indx = 0; indx < withobjects.Count; ++indx)
  3876. {
  3877. i = withobjects[indx];
  3878. animations[i].ToBytes(data, pos); pos += 16;
  3879. Utils.IntToBytesSafepos(seqs[i], data, pos); pos += 4;
  3880. }
  3881. // then the rest
  3882. for (int indx = 0; indx < noobjects.Count; ++indx)
  3883. {
  3884. i = noobjects[indx];
  3885. animations[i].ToBytes(data, pos); pos += 16;
  3886. Utils.IntToBytesSafepos(seqs[i], data, pos); pos += 4;
  3887. }
  3888. // object ids block
  3889. data[pos++] = (byte)withobjects.Count;
  3890. for (int indx = 0; indx < withobjects.Count; ++indx)
  3891. {
  3892. i = withobjects[indx];
  3893. objectIDs[i].ToBytes(data, pos); pos += 16;
  3894. }
  3895. }
  3896. else
  3897. {
  3898. for(int i = 0; i < animations.Length; ++i)
  3899. {
  3900. animations[i].ToBytes(data, pos); pos += 16;
  3901. Utils.IntToBytesSafepos(seqs[i], data, pos); pos += 4;
  3902. }
  3903. data[pos++] = 0; // no object ids
  3904. }
  3905. data[pos++] = 0; // no physical avatar events
  3906. buf.DataLength = pos;
  3907. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task | ThrottleOutPacketType.HighPriority);
  3908. }
  3909. public void SendObjectAnimations(UUID[] animations, int[] seqs, UUID senderId)
  3910. {
  3911. // m_log.DebugFormat("[LLCLIENTVIEW]: Sending Object animations for {0} to {1}", sourceAgentId, Name);
  3912. if(!m_SupportObjectAnimations)
  3913. return;
  3914. ObjectAnimationPacket ani = (ObjectAnimationPacket)PacketPool.Instance.GetPacket(PacketType.ObjectAnimation);
  3915. // TODO: don't create new blocks if recycling an old packet
  3916. ani.Sender = new ObjectAnimationPacket.SenderBlock();
  3917. ani.Sender.ID = senderId;
  3918. ani.AnimationList = new ObjectAnimationPacket.AnimationListBlock[animations.Length];
  3919. for (int i = 0; i < animations.Length; ++i)
  3920. {
  3921. ani.AnimationList[i] = new ObjectAnimationPacket.AnimationListBlock();
  3922. ani.AnimationList[i].AnimID = animations[i];
  3923. ani.AnimationList[i].AnimSequenceID = seqs[i];
  3924. }
  3925. OutPacket(ani, ThrottleOutPacketType.Task);
  3926. }
  3927. #endregion
  3928. #region Avatar Packet/Data Sending Methods
  3929. /// <summary>
  3930. /// Send an ObjectUpdate packet with information about an avatar
  3931. /// </summary>
  3932. public void SendEntityFullUpdateImmediate(ISceneEntity ent)
  3933. {
  3934. if (ent == null || (!(ent is ScenePresence) && !(ent is SceneObjectPart)))
  3935. return;
  3936. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  3937. Buffer.BlockCopy(objectUpdateHeader, 0, buf.Data, 0, 7);
  3938. LLUDPZeroEncoder zc = new LLUDPZeroEncoder(buf.Data);
  3939. zc.Position = 7;
  3940. zc.AddUInt64(m_scene.RegionInfo.RegionHandle);
  3941. zc.AddUInt16(Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f));
  3942. zc.AddByte(1); // block count
  3943. ThrottleOutPacketType ptype = ThrottleOutPacketType.Task;
  3944. if (ent is ScenePresence)
  3945. {
  3946. CreateAvatarUpdateBlock(ent as ScenePresence, zc);
  3947. ptype |= ThrottleOutPacketType.HighPriority;
  3948. }
  3949. else
  3950. CreatePrimUpdateBlock(ent as SceneObjectPart, (ScenePresence)SceneAgent, zc);
  3951. buf.DataLength = zc.Finish();
  3952. m_udpServer.SendUDPPacket(m_udpClient, buf, ptype);
  3953. }
  3954. public void SendEntityTerseUpdateImmediate(ISceneEntity ent)
  3955. {
  3956. if (ent == null)
  3957. return;
  3958. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  3959. //setup header and regioninfo block
  3960. Buffer.BlockCopy(terseUpdateHeader, 0, buf.Data, 0, 7);
  3961. if (ent is ScenePresence)
  3962. Utils.UInt64ToBytesSafepos(((ScenePresence)ent).RegionHandle, buf.Data, 7);
  3963. else
  3964. Utils.UInt64ToBytesSafepos(m_scene.RegionInfo.RegionHandle, buf.Data, 7);
  3965. Utils.UInt16ToBytes(Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f), buf.Data, 15);
  3966. buf.Data[17] = 1;
  3967. int pos = 18;
  3968. CreateImprovedTerseBlock(ent, buf.Data, ref pos, false);
  3969. buf.DataLength = pos;
  3970. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task, null, false, true);
  3971. }
  3972. //UUID m_courseLocationPrey = UUID.Zero;
  3973. bool m_couseLocationLastEmpty = false;
  3974. static private readonly byte[] CoarseLocationUpdateHeader = new byte[] {
  3975. 0, // no acks plz
  3976. 0, 0, 0, 0, // sequence number
  3977. 0, // extra
  3978. 0xff, 6 // ID 6 (medium frequency)
  3979. };
  3980. public void SendCoarseLocationUpdate(List<UUID> users, List<Vector3> CoarseLocations)
  3981. {
  3982. // We don't need to update inactive clients.
  3983. if (!IsActive)
  3984. return;
  3985. int totalLocations = Math.Min(CoarseLocations.Count, 60);
  3986. if(totalLocations == 0)
  3987. {
  3988. if(m_couseLocationLastEmpty)
  3989. return;
  3990. m_couseLocationLastEmpty = true;
  3991. }
  3992. else
  3993. m_couseLocationLastEmpty = false;
  3994. int totalAgents = Math.Min(users.Count, 60);
  3995. if(totalAgents > totalLocations)
  3996. totalAgents = totalLocations;
  3997. int selfindex = -1;
  3998. int preyindex = -1;
  3999. //bool doprey = m_courseLocationPrey != UUID.Zero;
  4000. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  4001. Buffer.BlockCopy(CoarseLocationUpdateHeader, 0, buf.Data, 0, 8);
  4002. byte[] data = buf.Data;
  4003. data[8] = (byte)totalLocations;
  4004. int pos = 9;
  4005. for (int i = 0; i < totalLocations; ++i)
  4006. {
  4007. data[pos++] = (byte)CoarseLocations[i].X;
  4008. data[pos++] = (byte)CoarseLocations[i].Y;
  4009. data[pos++] = CoarseLocations[i].Z > 1024 ? (byte)0 : (byte)(CoarseLocations[i].Z * 0.25f);
  4010. if (i < totalAgents)
  4011. {
  4012. if (users[i] == AgentId)
  4013. selfindex = i;
  4014. //if (doprey && users[i] == m_courseLocationPrey)
  4015. // preyindex = i;
  4016. }
  4017. }
  4018. Utils.Int16ToBytes((short)selfindex, data, pos); pos += 2;
  4019. Utils.Int16ToBytes((short)preyindex, data, pos); pos += 2;
  4020. data[pos++] = (byte)totalAgents;
  4021. for (int i = 0; i < totalAgents; ++i)
  4022. {
  4023. users[i].ToBytes(data, pos);
  4024. pos += 16;
  4025. }
  4026. buf.DataLength = pos;
  4027. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task);
  4028. }
  4029. #endregion Avatar Packet/Data Sending Methods
  4030. #region Primitive Packet/Data Sending Methods
  4031. /// <summary>
  4032. /// Generate one of the object update packets based on PrimUpdateFlags
  4033. /// and broadcast the packet to clients
  4034. /// </summary>
  4035. public void SendEntityUpdate(ISceneEntity entity, PrimUpdateFlags updateFlags)
  4036. {
  4037. if (entity is SceneObjectPart)
  4038. {
  4039. SceneObjectPart p = (SceneObjectPart)entity;
  4040. SceneObjectGroup g = p.ParentGroup;
  4041. if (g.HasPrivateAttachmentPoint && g.OwnerID != AgentId)
  4042. return; // Don't send updates for other people's HUDs
  4043. if((updateFlags ^ PrimUpdateFlags.SendInTransit) == 0)
  4044. {
  4045. List<uint> partIDs = (new List<uint> {p.LocalId});
  4046. lock (m_entityProps.SyncRoot)
  4047. m_entityProps.Remove(partIDs);
  4048. lock (m_entityUpdates.SyncRoot)
  4049. m_entityUpdates.Remove(partIDs);
  4050. return;
  4051. }
  4052. }
  4053. uint priority = m_prioritizer.GetUpdatePriority(this, entity);
  4054. lock (m_entityUpdates.SyncRoot)
  4055. m_entityUpdates.Enqueue(priority, new EntityUpdate(entity, updateFlags));
  4056. }
  4057. /// <summary>
  4058. /// Requeue an EntityUpdate when it was not acknowledged by the client.
  4059. /// We will update the priority and put it in the correct queue, merging update flags
  4060. /// with any other updates that may be queued for the same entity.
  4061. /// The original update time is used for the merged update.
  4062. /// </summary>
  4063. private void ResendPrimUpdate(EntityUpdate update)
  4064. {
  4065. // If the update exists in priority queue, it will be updated.
  4066. // If it does not exist then it will be added with the current (rather than its original) priority
  4067. uint priority = m_prioritizer.GetUpdatePriority(this, update.Entity);
  4068. lock (m_entityUpdates.SyncRoot)
  4069. m_entityUpdates.Enqueue(priority, update);
  4070. }
  4071. /// <summary>
  4072. /// Requeue a list of EntityUpdates when they were not acknowledged by the client.
  4073. /// We will update the priority and put it in the correct queue, merging update flags
  4074. /// with any other updates that may be queued for the same entity.
  4075. /// The original update time is used for the merged update.
  4076. /// </summary>
  4077. private void ResendPrimUpdates(List<EntityUpdate> updates, OutgoingPacket oPacket)
  4078. {
  4079. // m_log.WarnFormat("[CLIENT] resending prim updates {0}, packet sequence number {1}", updates[0].UpdateTime, oPacket.SequenceNumber);
  4080. // Remove the update packet from the list of packets waiting for acknowledgement
  4081. // because we are requeuing the list of updates. They will be resent in new packets
  4082. // with the most recent state and priority.
  4083. m_udpClient.NeedAcks.Remove(oPacket.SequenceNumber);
  4084. // Count this as a resent packet since we are going to requeue all of the updates contained in it
  4085. Interlocked.Increment(ref m_udpClient.PacketsResent);
  4086. // We're not going to worry about interlock yet since its not currently critical that this total count
  4087. // is 100% correct
  4088. m_udpServer.PacketsResentCount++;
  4089. foreach (EntityUpdate update in updates)
  4090. ResendPrimUpdate(update);
  4091. }
  4092. static private readonly byte[] objectUpdateHeader = new byte[] {
  4093. Helpers.MSG_RELIABLE | Helpers.MSG_ZEROCODED,
  4094. 0, 0, 0, 0, // sequence number
  4095. 0, // extra
  4096. 12 // ID (high frequency)
  4097. };
  4098. static private readonly byte[] terseUpdateHeader = new byte[] {
  4099. Helpers.MSG_RELIABLE | Helpers.MSG_ZEROCODED, // zero code is not as spec
  4100. 0, 0, 0, 0, // sequence number
  4101. 0, // extra
  4102. 15 // ID (high frequency)
  4103. };
  4104. static private readonly byte[] ObjectAnimationHeader = new byte[] {
  4105. Helpers.MSG_RELIABLE,
  4106. 0, 0, 0, 0, // sequence number
  4107. 0, // extra
  4108. 30 // ID (high frequency)
  4109. };
  4110. static private readonly byte[] CompressedObjectHeader = new byte[] {
  4111. Helpers.MSG_RELIABLE,
  4112. 0, 0, 0, 0, // sequence number
  4113. 0, // extra
  4114. 13 // ID (high frequency)
  4115. };
  4116. static private readonly byte[] ObjectUpdateCachedHeader = new byte[] {
  4117. Helpers.MSG_RELIABLE,
  4118. 0, 0, 0, 0, // sequence number
  4119. 0, // extra
  4120. 14 // ID (high frequency)
  4121. };
  4122. private void ProcessEntityUpdates(int maxUpdatesBytes)
  4123. {
  4124. if (!IsActive)
  4125. return;
  4126. ScenePresence mysp = (ScenePresence)SceneAgent;
  4127. if (mysp == null)
  4128. return;
  4129. List<EntityUpdate> objectUpdates = null;
  4130. List<EntityUpdate> objectUpdateProbes = null;
  4131. List<EntityUpdate> compressedUpdates = null;
  4132. List<EntityUpdate> terseUpdates = null;
  4133. List<SceneObjectPart> ObjectAnimationUpdates = null;
  4134. // Check to see if this is a flush
  4135. if (maxUpdatesBytes <= 0)
  4136. {
  4137. maxUpdatesBytes = Int32.MaxValue;
  4138. }
  4139. EntityUpdate update;
  4140. bool viewerCache = m_supportViewerCache;// && mysp.IsChildAgent; // only on child agents
  4141. bool doCulling = m_scene.ObjectsCullingByDistance;
  4142. float cullingrange = 64.0f;
  4143. Vector3 mypos = Vector3.Zero;
  4144. //bool orderedDequeue = m_scene.UpdatePrioritizationScheme == UpdatePrioritizationSchemes.SimpleAngularDistance;
  4145. bool orderedDequeue = false; // temporary off
  4146. HashSet<SceneObjectGroup> GroupsNeedFullUpdate = new HashSet<SceneObjectGroup>();
  4147. bool useCompressUpdate = false;
  4148. if (doCulling)
  4149. {
  4150. cullingrange = mysp.DrawDistance + m_scene.ReprioritizationDistance + 16f;
  4151. mypos = mysp.AbsolutePosition;
  4152. }
  4153. while (maxUpdatesBytes > 0)
  4154. {
  4155. if (!IsActive)
  4156. return;
  4157. lock (m_entityUpdates.SyncRoot)
  4158. {
  4159. if(orderedDequeue)
  4160. {
  4161. if (!m_entityUpdates.TryOrderedDequeue(out update))
  4162. break;
  4163. }
  4164. else
  4165. {
  4166. if (!m_entityUpdates.TryDequeue(out update))
  4167. break;
  4168. }
  4169. }
  4170. PrimUpdateFlags updateFlags = update.Flags;
  4171. if (updateFlags.HasFlag(PrimUpdateFlags.Kill))
  4172. {
  4173. m_killRecord.Add(update.Entity.LocalId);
  4174. maxUpdatesBytes -= 30;
  4175. continue;
  4176. }
  4177. useCompressUpdate = false;
  4178. bool istree = false;
  4179. if (update.Entity is SceneObjectPart)
  4180. {
  4181. SceneObjectPart part = (SceneObjectPart)update.Entity;
  4182. SceneObjectGroup grp = part.ParentGroup;
  4183. if (grp.inTransit && !update.Flags.HasFlag(PrimUpdateFlags.SendInTransit))
  4184. continue;
  4185. if (grp.IsDeleted)
  4186. {
  4187. // Don't send updates for objects that have been marked deleted.
  4188. // Instead send another kill object, because the first one may have gotten
  4189. // into a race condition
  4190. if (part == grp.RootPart && !m_killRecord.Contains(grp.LocalId))
  4191. {
  4192. m_killRecord.Add(grp.LocalId);
  4193. maxUpdatesBytes -= 30;
  4194. }
  4195. continue;
  4196. }
  4197. if (grp.IsAttachment)
  4198. {
  4199. // animated attachments are nasty if not supported by viewer
  4200. if(!m_SupportObjectAnimations && grp.RootPart.Shape.MeshFlagEntry)
  4201. continue;
  4202. // Someone else's HUD, why are we getting these?
  4203. if (grp.OwnerID != AgentId && grp.HasPrivateAttachmentPoint)
  4204. continue;
  4205. // if owner gone don't update it to anyone
  4206. ScenePresence sp;
  4207. if (!m_scene.TryGetScenePresence(part.OwnerID, out sp))
  4208. continue;
  4209. // On vehicle crossing, the attachments are received
  4210. // while the avatar is still a child. Don't send
  4211. // updates here because the LocalId has not yet
  4212. // been updated and the viewer will derender the
  4213. // attachments until the avatar becomes root.
  4214. if (sp.IsChildAgent)
  4215. continue;
  4216. // It's an attachment of a valid avatar, but
  4217. // doesn't seem to be attached, skip
  4218. List<SceneObjectGroup> atts = sp.GetAttachments();
  4219. bool found = false;
  4220. for (int indx = 0; indx < atts.Count; ++indx)
  4221. {
  4222. if (atts[indx] == grp)
  4223. {
  4224. found = true;
  4225. break;
  4226. }
  4227. }
  4228. if (!found)
  4229. continue;
  4230. if (m_disableFacelights)
  4231. {
  4232. if (grp.RootPart.Shape.State != (byte)AttachmentPoint.LeftHand &&
  4233. grp.RootPart.Shape.State != (byte)AttachmentPoint.RightHand)
  4234. {
  4235. part.Shape.LightEntry = false;
  4236. }
  4237. }
  4238. }
  4239. else if (doCulling)
  4240. {
  4241. if(GroupsNeedFullUpdate.Contains(grp))
  4242. continue;
  4243. bool inViewGroups = false;
  4244. lock(GroupsInView)
  4245. inViewGroups = GroupsInView.Contains(grp);
  4246. if(!inViewGroups)
  4247. {
  4248. Vector3 partpos = grp.getCenterOffset();
  4249. float dpos = (partpos - mypos).LengthSquared();
  4250. float maxview = grp.GetBoundsRadius() + cullingrange;
  4251. if (dpos > maxview * maxview)
  4252. continue;
  4253. if (!viewerCache || !updateFlags.HasFlag(PrimUpdateFlags.UpdateProbe))
  4254. {
  4255. GroupsNeedFullUpdate.Add(grp);
  4256. continue;
  4257. }
  4258. }
  4259. }
  4260. if (updateFlags.HasFlag(PrimUpdateFlags.UpdateProbe))
  4261. {
  4262. if (objectUpdateProbes == null)
  4263. {
  4264. objectUpdateProbes = new List<EntityUpdate>();
  4265. maxUpdatesBytes -= 18;
  4266. }
  4267. objectUpdateProbes.Add(update);
  4268. maxUpdatesBytes -= 12;
  4269. continue;
  4270. }
  4271. if (updateFlags == PrimUpdateFlags.Animations)
  4272. {
  4273. if (m_SupportObjectAnimations && part.Animations != null)
  4274. {
  4275. if (ObjectAnimationUpdates == null)
  4276. ObjectAnimationUpdates = new List<SceneObjectPart>();
  4277. ObjectAnimationUpdates.Add(part);
  4278. maxUpdatesBytes -= 20 * part.Animations.Count + 24;
  4279. }
  4280. continue;
  4281. }
  4282. if(viewerCache)
  4283. useCompressUpdate = grp.IsViewerCachable;
  4284. istree = (part.Shape.PCode == (byte)PCode.Grass || part.Shape.PCode == (byte)PCode.NewTree || part.Shape.PCode == (byte)PCode.Tree);
  4285. }
  4286. else if (update.Entity is ScenePresence)
  4287. {
  4288. ScenePresence presence = (ScenePresence)update.Entity;
  4289. if (presence.IsDeleted)
  4290. continue;
  4291. // If ParentUUID is not UUID.Zero and ParentID is 0, this
  4292. // avatar is in the process of crossing regions while
  4293. // sat on an object. In this state, we don't want any
  4294. // updates because they will visually orbit the avatar.
  4295. // Update will be forced once crossing is completed anyway.
  4296. if (presence.ParentUUID != UUID.Zero && presence.ParentID == 0)
  4297. continue;
  4298. }
  4299. else // what is this update ?
  4300. continue;
  4301. #region UpdateFlags to packet type conversion
  4302. updateFlags &= PrimUpdateFlags.FullUpdate; // clear other control bits already handled
  4303. if(updateFlags == PrimUpdateFlags.None)
  4304. continue;
  4305. const PrimUpdateFlags canNotUseImprovedMask = ~(
  4306. PrimUpdateFlags.AttachmentPoint |
  4307. PrimUpdateFlags.Position |
  4308. PrimUpdateFlags.Rotation |
  4309. PrimUpdateFlags.Velocity |
  4310. PrimUpdateFlags.Acceleration |
  4311. PrimUpdateFlags.AngularVelocity |
  4312. PrimUpdateFlags.CollisionPlane |
  4313. PrimUpdateFlags.Textures
  4314. );
  4315. #endregion UpdateFlags to packet type conversion
  4316. #region Block Construction
  4317. if ((updateFlags & canNotUseImprovedMask) == 0)
  4318. {
  4319. if (terseUpdates == null)
  4320. {
  4321. terseUpdates = new List<EntityUpdate>();
  4322. maxUpdatesBytes -= 18;
  4323. }
  4324. terseUpdates.Add(update);
  4325. if (update.Entity is ScenePresence)
  4326. maxUpdatesBytes -= 63; // no texture entry
  4327. else
  4328. {
  4329. if ((updateFlags & PrimUpdateFlags.Textures) == 0)
  4330. maxUpdatesBytes -= 47;
  4331. else
  4332. maxUpdatesBytes -= 150; // aprox
  4333. }
  4334. }
  4335. else
  4336. {
  4337. if (update.Entity is ScenePresence)
  4338. {
  4339. maxUpdatesBytes -= 150; // crude estimation
  4340. if (objectUpdates == null)
  4341. {
  4342. objectUpdates = new List<EntityUpdate>();
  4343. maxUpdatesBytes -= 18;
  4344. }
  4345. objectUpdates.Add(update);
  4346. }
  4347. else
  4348. {
  4349. if (useCompressUpdate)
  4350. {
  4351. if (istree)
  4352. maxUpdatesBytes -= 64;
  4353. else
  4354. maxUpdatesBytes -= 120; // crude estimation
  4355. if (compressedUpdates == null)
  4356. {
  4357. compressedUpdates = new List<EntityUpdate>();
  4358. maxUpdatesBytes -= 18;
  4359. }
  4360. compressedUpdates.Add(update);
  4361. }
  4362. else
  4363. {
  4364. if (istree)
  4365. maxUpdatesBytes -= 70;
  4366. else
  4367. maxUpdatesBytes -= 150; // crude estimation
  4368. if (objectUpdates == null)
  4369. {
  4370. objectUpdates = new List<EntityUpdate>();
  4371. maxUpdatesBytes -= 18;
  4372. }
  4373. objectUpdates.Add(update);
  4374. }
  4375. }
  4376. }
  4377. #endregion Block Construction
  4378. }
  4379. #region Packet Sending
  4380. ushort timeDilation;
  4381. if (!IsActive)
  4382. return;
  4383. timeDilation = Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f);
  4384. if(objectUpdates != null)
  4385. {
  4386. List<EntityUpdate> tau = new List<EntityUpdate>(30);
  4387. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  4388. Buffer.BlockCopy(objectUpdateHeader, 0, buf.Data, 0, 7);
  4389. LLUDPZeroEncoder zc = new LLUDPZeroEncoder(buf.Data);
  4390. zc.Position = 7;
  4391. zc.AddUInt64(m_scene.RegionInfo.RegionHandle);
  4392. zc.AddUInt16(timeDilation);
  4393. zc.AddByte(1); // tmp block count
  4394. int countposition = zc.Position - 1;
  4395. int lastpos = 0;
  4396. int lastzc = 0;
  4397. int count = 0;
  4398. EntityUpdate eu;
  4399. for(int indx = 0; indx < objectUpdates.Count; ++indx)
  4400. {
  4401. eu = objectUpdates[indx];
  4402. lastpos = zc.Position;
  4403. lastzc = zc.ZeroCount;
  4404. if (eu.Entity is ScenePresence)
  4405. CreateAvatarUpdateBlock((ScenePresence)eu.Entity, zc);
  4406. else
  4407. {
  4408. SceneObjectPart part = (SceneObjectPart)eu.Entity;
  4409. if (eu.Flags.HasFlag(PrimUpdateFlags.Animations))
  4410. {
  4411. if (m_SupportObjectAnimations && part.Animations != null)
  4412. {
  4413. if (ObjectAnimationUpdates == null)
  4414. ObjectAnimationUpdates = new List<SceneObjectPart>();
  4415. ObjectAnimationUpdates.Add(part);
  4416. }
  4417. eu.Flags &= ~PrimUpdateFlags.Animations;
  4418. }
  4419. CreatePrimUpdateBlock(part, mysp, zc);
  4420. }
  4421. if (zc.Position < LLUDPServer.MAXPAYLOAD - 300)
  4422. {
  4423. tau.Add(eu);
  4424. ++count;
  4425. }
  4426. else
  4427. {
  4428. // we need more packets
  4429. UDPPacketBuffer newbuf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  4430. Buffer.BlockCopy(buf.Data, 0, newbuf.Data, 0, countposition); // start is the same
  4431. buf.Data[countposition] = (byte)count;
  4432. // get pending zeros at cut point
  4433. if(lastzc > 0)
  4434. {
  4435. buf.Data[lastpos++] = 0;
  4436. buf.Data[lastpos++] = (byte)lastzc;
  4437. }
  4438. buf.DataLength = lastpos;
  4439. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task,
  4440. //delegate (OutgoingPacket oPacket) { ResendPrimUpdates(tau, oPacket); }, false, false);
  4441. null, false, false);
  4442. buf = newbuf;
  4443. zc.Data = buf.Data;
  4444. zc.ZeroCount = 0;
  4445. zc.Position = countposition + 1;
  4446. // im lazy now, just do last again
  4447. if (eu.Entity is ScenePresence)
  4448. CreateAvatarUpdateBlock((ScenePresence)eu.Entity, zc);
  4449. else
  4450. CreatePrimUpdateBlock((SceneObjectPart)eu.Entity, mysp, zc);
  4451. tau = new List<EntityUpdate>(30);
  4452. tau.Add(eu);
  4453. count = 1;
  4454. }
  4455. }
  4456. if (count > 0)
  4457. {
  4458. buf.Data[countposition] = (byte)count;
  4459. buf.DataLength = zc.Finish();
  4460. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task,
  4461. //delegate (OutgoingPacket oPacket) { ResendPrimUpdates(tau, oPacket); }, false, false);
  4462. null, false, false);
  4463. }
  4464. }
  4465. /* no zero encode compressed updates
  4466. if(compressedUpdates != null)
  4467. {
  4468. List<EntityUpdate> tau = new List<EntityUpdate>(30);
  4469. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  4470. byte[] data = buf.Data;
  4471. Buffer.BlockCopy(CompressedObjectHeader, 0, data , 0, 7);
  4472. Utils.UInt64ToBytesSafepos(m_scene.RegionInfo.RegionHandle, data, 7); // 15
  4473. Utils.UInt16ToBytes(timeDilation, data, 15); // 17
  4474. int countposition = 17; // blocks count position
  4475. int pos = 18;
  4476. int lastpos = 0;
  4477. int count = 0;
  4478. foreach (EntityUpdate eu in compressedUpdates)
  4479. {
  4480. SceneObjectPart sop = (SceneObjectPart)eu.Entity;
  4481. if (sop.ParentGroup == null || sop.ParentGroup.IsDeleted)
  4482. continue;
  4483. lastpos = pos;
  4484. CreateCompressedUpdateBlock(sop, mysp, data, ref pos);
  4485. if (pos < LLUDPServer.MAXPAYLOAD)
  4486. {
  4487. tau.Add(eu);
  4488. ++count;
  4489. }
  4490. else
  4491. {
  4492. // we need more packets
  4493. UDPPacketBuffer newbuf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  4494. Buffer.BlockCopy(buf.Data, 0, newbuf.Data, 0, countposition); // start is the same
  4495. buf.Data[countposition] = (byte)count;
  4496. buf.DataLength = lastpos;
  4497. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task,
  4498. delegate (OutgoingPacket oPacket) { ResendPrimUpdates(tau, oPacket); }, false, false);
  4499. buf = newbuf;
  4500. data = buf.Data;
  4501. pos = 18;
  4502. // im lazy now, just do last again
  4503. CreateCompressedUpdateBlock(sop, mysp, data, ref pos);
  4504. tau = new List<EntityUpdate>(30);
  4505. tau.Add(eu);
  4506. count = 1;
  4507. }
  4508. }
  4509. if (count > 0)
  4510. {
  4511. buf.Data[countposition] = (byte)count;
  4512. buf.DataLength = pos;
  4513. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task,
  4514. delegate (OutgoingPacket oPacket) { ResendPrimUpdates(tau, oPacket); }, false, false);
  4515. }
  4516. }
  4517. */
  4518. if (compressedUpdates != null)
  4519. {
  4520. List<EntityUpdate> tau = new List<EntityUpdate>(30);
  4521. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  4522. byte[] data = buf.Data;
  4523. Buffer.BlockCopy(CompressedObjectHeader, 0, data, 0, 7);
  4524. data[0] |= Helpers.MSG_ZEROCODED;
  4525. LLUDPZeroEncoder zc = new LLUDPZeroEncoder(buf.Data);
  4526. zc.Position = 7;
  4527. zc.AddUInt64(m_scene.RegionInfo.RegionHandle);
  4528. zc.AddUInt16(timeDilation);
  4529. zc.AddByte(1); // tmp block count
  4530. int countposition = zc.Position - 1;
  4531. int lastpos = 0;
  4532. int lastzc = 0;
  4533. int count = 0;
  4534. EntityUpdate eu;
  4535. for (int indx = 0; indx < compressedUpdates.Count; ++indx)
  4536. {
  4537. eu = compressedUpdates[indx];
  4538. SceneObjectPart sop = (SceneObjectPart)eu.Entity;
  4539. if (sop.ParentGroup == null || sop.ParentGroup.IsDeleted)
  4540. continue;
  4541. if (eu.Flags.HasFlag(PrimUpdateFlags.Animations))
  4542. {
  4543. if (m_SupportObjectAnimations && sop.Animations != null)
  4544. {
  4545. if (ObjectAnimationUpdates == null)
  4546. ObjectAnimationUpdates = new List<SceneObjectPart>();
  4547. ObjectAnimationUpdates.Add(sop);
  4548. }
  4549. eu.Flags &= ~PrimUpdateFlags.Animations;
  4550. }
  4551. lastpos = zc.Position;
  4552. lastzc = zc.ZeroCount;
  4553. CreateCompressedUpdateBlockZC(sop, mysp, zc);
  4554. if (zc.Position < LLUDPServer.MAXPAYLOAD - 200)
  4555. {
  4556. //tau.Add(eu);
  4557. ++count;
  4558. }
  4559. else
  4560. {
  4561. // we need more packets
  4562. UDPPacketBuffer newbuf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  4563. Buffer.BlockCopy(buf.Data, 0, newbuf.Data, 0, countposition); // start is the same
  4564. buf.Data[countposition] = (byte)count;
  4565. // get pending zeros at cut point
  4566. if (lastzc > 0)
  4567. {
  4568. buf.Data[lastpos++] = 0;
  4569. buf.Data[lastpos++] = (byte)lastzc;
  4570. }
  4571. buf.DataLength = lastpos;
  4572. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task,
  4573. //delegate (OutgoingPacket oPacket) { ResendPrimUpdates(tau, oPacket); }, false, false);
  4574. null, false, false);
  4575. buf = newbuf;
  4576. zc.Data = buf.Data;
  4577. data[0] |= Helpers.MSG_ZEROCODED;
  4578. zc.ZeroCount = 0;
  4579. zc.Position = countposition + 1;
  4580. // im lazy now, just do last again
  4581. CreateCompressedUpdateBlockZC(sop, mysp, zc);
  4582. tau = new List<EntityUpdate>(30);
  4583. //tau.Add(eu);
  4584. count = 1;
  4585. }
  4586. }
  4587. if (count > 0)
  4588. {
  4589. buf.Data[countposition] = (byte)count;
  4590. buf.DataLength = zc.Finish();
  4591. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task,
  4592. //delegate (OutgoingPacket oPacket) { ResendPrimUpdates(tau, oPacket); }, false, false);
  4593. null, false, false);
  4594. }
  4595. }
  4596. if (objectUpdateProbes != null)
  4597. {
  4598. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  4599. byte[] data = buf.Data;
  4600. Buffer.BlockCopy(ObjectUpdateCachedHeader, 0, data, 0, 7);
  4601. Utils.UInt64ToBytesSafepos(m_scene.RegionInfo.RegionHandle, data, 7); // 15
  4602. Utils.UInt16ToBytes(timeDilation, data, 15); // 17
  4603. int countposition = 17; // blocks count position
  4604. int pos = 18;
  4605. int count = 0;
  4606. EntityUpdate eu;
  4607. for (int indx = 0; indx < objectUpdateProbes.Count; ++indx)
  4608. {
  4609. eu = objectUpdateProbes[indx];
  4610. SceneObjectPart sop = (SceneObjectPart)eu.Entity;
  4611. if (sop.ParentGroup == null || sop.ParentGroup.IsDeleted)
  4612. continue;
  4613. uint primflags = m_scene.Permissions.GenerateClientFlags(sop, mysp);
  4614. if (mysp.UUID != sop.OwnerID)
  4615. primflags &= ~(uint)PrimFlags.CreateSelected;
  4616. else
  4617. {
  4618. if (sop.CreateSelected)
  4619. primflags |= (uint)PrimFlags.CreateSelected;
  4620. else
  4621. primflags &= ~(uint)PrimFlags.CreateSelected;
  4622. }
  4623. Utils.UIntToBytes(sop.LocalId, data, pos); pos += 4;
  4624. Utils.UIntToBytes((uint)sop.ParentGroup.PseudoCRC, data, pos); pos += 4; //WRONG
  4625. Utils.UIntToBytes(primflags, data, pos); pos += 4;
  4626. ++count;
  4627. if (pos > (LLUDPServer.MAXPAYLOAD - 13))
  4628. {
  4629. // we need more packets
  4630. UDPPacketBuffer newbuf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  4631. Buffer.BlockCopy(buf.Data, 0, newbuf.Data, 0, countposition); // start is the same
  4632. buf.Data[countposition] = (byte)count;
  4633. buf.DataLength = pos;
  4634. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task, null, false, false);
  4635. buf = newbuf;
  4636. data = buf.Data;
  4637. pos = 18;
  4638. count = 0;
  4639. }
  4640. }
  4641. if (count > 0)
  4642. {
  4643. buf.Data[countposition] = (byte)count;
  4644. buf.DataLength = pos;
  4645. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task, null, false, false);
  4646. }
  4647. }
  4648. if (terseUpdates != null)
  4649. {
  4650. int blocks = terseUpdates.Count;
  4651. List<EntityUpdate> tau = new List<EntityUpdate>(30);
  4652. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  4653. //setup header and regioninfo block
  4654. Buffer.BlockCopy(terseUpdateHeader, 0, buf.Data, 0, 7);
  4655. Utils.UInt64ToBytesSafepos(m_scene.RegionInfo.RegionHandle, buf.Data, 7);
  4656. Utils.UInt16ToBytes(timeDilation, buf.Data, 15);
  4657. int pos = 18;
  4658. int lastpos = 0;
  4659. int count = 0;
  4660. EntityUpdate eu;
  4661. for (int indx = 0; indx < terseUpdates.Count; ++indx)
  4662. {
  4663. eu = terseUpdates[indx];
  4664. lastpos = pos;
  4665. CreateImprovedTerseBlock(eu.Entity, buf.Data, ref pos, (eu.Flags & PrimUpdateFlags.Textures) != 0);
  4666. if (pos < LLUDPServer.MAXPAYLOAD)
  4667. {
  4668. tau.Add(eu);
  4669. ++count;
  4670. --blocks;
  4671. }
  4672. else if (blocks > 0)
  4673. {
  4674. // we need more packets
  4675. UDPPacketBuffer newbuf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  4676. Buffer.BlockCopy(buf.Data, 0, newbuf.Data, 0, 17); // start is the same
  4677. // copy what we done in excess
  4678. int extralen = pos - lastpos;
  4679. if(extralen > 0)
  4680. Buffer.BlockCopy(buf.Data, lastpos, newbuf.Data, 18, extralen);
  4681. pos = 18 + extralen;
  4682. buf.Data[17] = (byte)count;
  4683. buf.DataLength = lastpos;
  4684. // zero encode is not as spec
  4685. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task,
  4686. //delegate (OutgoingPacket oPacket) { ResendPrimUpdates(tau, oPacket); }, false, true);
  4687. null, false, true);
  4688. tau = new List<EntityUpdate>(30);
  4689. tau.Add(eu);
  4690. count = 1;
  4691. --blocks;
  4692. buf = newbuf;
  4693. }
  4694. }
  4695. if (count > 0)
  4696. {
  4697. buf.Data[17] = (byte)count;
  4698. buf.DataLength = pos;
  4699. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task,
  4700. //delegate (OutgoingPacket oPacket) { ResendPrimUpdates(tau, oPacket); }, false, true);
  4701. null, false, true);
  4702. }
  4703. }
  4704. if (ObjectAnimationUpdates != null)
  4705. {
  4706. SceneObjectPart sop;
  4707. for (int indx = 0; indx < ObjectAnimationUpdates.Count; ++indx)
  4708. {
  4709. sop = ObjectAnimationUpdates[indx];
  4710. if (sop.Animations == null)
  4711. continue;
  4712. SceneObjectGroup sog = sop.ParentGroup;
  4713. if (sog == null || sog.IsDeleted)
  4714. continue;
  4715. SceneObjectPart root = sog.RootPart;
  4716. if (root == null || root.Shape == null || !root.Shape.MeshFlagEntry)
  4717. continue;
  4718. UUID[] ids = null;
  4719. int[] seqs = null;
  4720. int count = sop.GetAnimations(out ids, out seqs);
  4721. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  4722. byte[] data = buf.Data;
  4723. //setup header
  4724. Buffer.BlockCopy(ObjectAnimationHeader, 0, data , 0, 7);
  4725. // sender block
  4726. sop.UUID.ToBytes(data, 7); // 23
  4727. //animations block
  4728. if (count > 255)
  4729. count = 255;
  4730. data[23] = (byte)count;
  4731. int pos = 24;
  4732. for(int i = 0; i < count; i++)
  4733. {
  4734. ids[i].ToBytes(data, pos); pos += 16;
  4735. Utils.IntToBytesSafepos(seqs[i], data, pos); pos += 4;
  4736. }
  4737. buf.DataLength = pos;
  4738. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task);
  4739. }
  4740. }
  4741. #endregion Packet Sending
  4742. #region Handle deleted objects
  4743. if (m_killRecord.Count > 0)
  4744. {
  4745. SendKillObject(m_killRecord);
  4746. m_killRecord.Clear();
  4747. }
  4748. if(GroupsNeedFullUpdate.Count > 0)
  4749. {
  4750. foreach(SceneObjectGroup grp in GroupsNeedFullUpdate)
  4751. {
  4752. lock (GroupsInView)
  4753. GroupsInView.Add(grp);
  4754. PrimUpdateFlags flags = PrimUpdateFlags.CancelKill;
  4755. if(viewerCache && grp.IsViewerCachable)
  4756. flags |= PrimUpdateFlags.UpdateProbe;
  4757. foreach (SceneObjectPart p in grp.Parts)
  4758. SendEntityUpdate(p, flags);
  4759. }
  4760. }
  4761. #endregion
  4762. }
  4763. // hack.. dont use
  4764. /*
  4765. public void SendPartFullUpdate(ISceneEntity ent, uint? parentID)
  4766. {
  4767. if (ent is SceneObjectPart)
  4768. {
  4769. SceneObjectPart part = (SceneObjectPart)ent;
  4770. ObjectUpdatePacket packet = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
  4771. packet.RegionData.RegionHandle = m_scene.RegionInfo.RegionHandle;
  4772. packet.RegionData.TimeDilation = Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f);
  4773. packet.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
  4774. ObjectUpdatePacket.ObjectDataBlock blk = CreatePrimUpdateBlock(part, mysp);
  4775. if (parentID.HasValue)
  4776. {
  4777. blk.ParentID = parentID.Value;
  4778. }
  4779. packet.ObjectData[0] = blk;
  4780. OutPacket(packet, ThrottleOutPacketType.Task, true);
  4781. }
  4782. // m_log.DebugFormat(
  4783. // "[LLCLIENTVIEW]: Sent {0} updates in ProcessEntityUpdates() for {1} {2} in {3}",
  4784. // updatesThisCall, Name, SceneAgent.IsChildAgent ? "child" : "root", Scene.Name);
  4785. //
  4786. }
  4787. */
  4788. public void ReprioritizeUpdates()
  4789. {
  4790. lock (m_entityUpdates.SyncRoot)
  4791. m_entityUpdates.Reprioritize(UpdatePriorityHandler);
  4792. CheckGroupsInView();
  4793. }
  4794. private bool CheckGroupsInViewBusy = false;
  4795. public void CheckGroupsInView()
  4796. {
  4797. bool doCulling = m_scene.ObjectsCullingByDistance;
  4798. if(!doCulling)
  4799. return;
  4800. if (!IsActive)
  4801. return;
  4802. if (CheckGroupsInViewBusy)
  4803. return;
  4804. ScenePresence mysp = (ScenePresence)SceneAgent;
  4805. if (mysp == null || mysp.IsDeleted)
  4806. return;
  4807. CheckGroupsInViewBusy = true;
  4808. float cullingrange = mysp.DrawDistance + m_scene.ReprioritizationDistance + 16f;
  4809. Vector3 mypos = mysp.AbsolutePosition;
  4810. HashSet<SceneObjectGroup> NewGroupsInView = new HashSet<SceneObjectGroup>();
  4811. HashSet<SceneObjectGroup> GroupsNeedFullUpdate = new HashSet<SceneObjectGroup>();
  4812. List<SceneObjectGroup> kills = new List<SceneObjectGroup>();
  4813. EntityBase[] entities = m_scene.Entities.GetEntities();
  4814. foreach (EntityBase e in entities)
  4815. {
  4816. if (!IsActive)
  4817. return;
  4818. if (e != null && e is SceneObjectGroup)
  4819. {
  4820. SceneObjectGroup grp = (SceneObjectGroup)e;
  4821. if(grp.IsDeleted || grp.IsAttachment )
  4822. continue;
  4823. bool inviewgroups;
  4824. lock (GroupsInView)
  4825. inviewgroups = GroupsInView.Contains(grp);
  4826. //temp handling of sits
  4827. if(grp.GetSittingAvatarsCount() > 0)
  4828. {
  4829. if (!inviewgroups)
  4830. GroupsNeedFullUpdate.Add(grp);
  4831. NewGroupsInView.Add(grp);
  4832. }
  4833. else
  4834. {
  4835. Vector3 grppos = grp.getCenterOffset();
  4836. float dpos = (grppos - mypos).LengthSquared();
  4837. float maxview = grp.GetBoundsRadius() + cullingrange;
  4838. if (dpos > maxview * maxview)
  4839. {
  4840. if(inviewgroups)
  4841. kills.Add(grp);
  4842. }
  4843. else
  4844. {
  4845. if (!inviewgroups)
  4846. GroupsNeedFullUpdate.Add(grp);
  4847. NewGroupsInView.Add(grp);
  4848. }
  4849. }
  4850. }
  4851. }
  4852. lock(GroupsInView)
  4853. GroupsInView = NewGroupsInView;
  4854. if (kills.Count > 0)
  4855. {
  4856. List<uint> partIDs = new List<uint>();
  4857. foreach(SceneObjectGroup grp in kills)
  4858. {
  4859. SendEntityUpdate(grp.RootPart, PrimUpdateFlags.Kill);
  4860. foreach(SceneObjectPart p in grp.Parts)
  4861. {
  4862. if(p != grp.RootPart)
  4863. partIDs.Add(p.LocalId);
  4864. }
  4865. }
  4866. kills.Clear();
  4867. if(partIDs.Count > 0)
  4868. {
  4869. lock (m_entityProps.SyncRoot)
  4870. m_entityProps.Remove(partIDs);
  4871. lock (m_entityUpdates.SyncRoot)
  4872. m_entityUpdates.Remove(partIDs);
  4873. }
  4874. }
  4875. if(GroupsNeedFullUpdate.Count > 0)
  4876. {
  4877. bool sendProbes = m_supportViewerCache && (m_viewerHandShakeFlags & 2) == 0;
  4878. if(sendProbes)
  4879. {
  4880. foreach (SceneObjectGroup grp in GroupsNeedFullUpdate)
  4881. {
  4882. PrimUpdateFlags flags = PrimUpdateFlags.CancelKill;
  4883. if (grp.IsViewerCachable)
  4884. flags |= PrimUpdateFlags.UpdateProbe;
  4885. foreach (SceneObjectPart p in grp.Parts)
  4886. SendEntityUpdate(p, flags);
  4887. }
  4888. }
  4889. else
  4890. {
  4891. m_viewerHandShakeFlags &= ~2U; // nexttime send probes
  4892. PrimUpdateFlags flags = PrimUpdateFlags.CancelKill;
  4893. foreach (SceneObjectGroup grp in GroupsNeedFullUpdate)
  4894. {
  4895. foreach (SceneObjectPart p in grp.Parts)
  4896. SendEntityUpdate(p, flags);
  4897. }
  4898. }
  4899. }
  4900. CheckGroupsInViewBusy = false;
  4901. }
  4902. private bool UpdatePriorityHandler(ref uint priority, ISceneEntity entity)
  4903. {
  4904. if (entity == null)
  4905. return false;
  4906. priority = m_prioritizer.GetUpdatePriority(this, entity);
  4907. return true;
  4908. }
  4909. public void FlushPrimUpdates()
  4910. {
  4911. m_log.WarnFormat("[CLIENT]: Flushing prim updates to " + m_firstName + " " + m_lastName);
  4912. while (m_entityUpdates.Count > 0)
  4913. ProcessEntityUpdates(-1);
  4914. }
  4915. #endregion Primitive Packet/Data Sending Methods
  4916. // These are used to implement an adaptive backoff in the number
  4917. // of updates converted to packets. Since we don't want packets
  4918. // to sit in the queue with old data, only convert enough updates
  4919. // to packets that can be sent in 30ms.
  4920. void HandleQueueEmpty(ThrottleOutPacketTypeFlags categories)
  4921. {
  4922. if(m_scene == null)
  4923. return;
  4924. if ((categories & ThrottleOutPacketTypeFlags.Task) != 0)
  4925. {
  4926. int maxUpdateBytes = m_udpClient.GetCatBytesCanSend(ThrottleOutPacketType.Task, 30);
  4927. if (m_entityUpdates.Count > 0)
  4928. ProcessEntityUpdates(maxUpdateBytes);
  4929. if (m_entityProps.Count > 0)
  4930. ProcessEntityPropertyRequests(maxUpdateBytes);
  4931. }
  4932. if ((categories & ThrottleOutPacketTypeFlags.Texture) != 0)
  4933. ImageManager.ProcessImageQueue(m_udpServer.TextureSendLimit);
  4934. }
  4935. internal bool HandleHasUpdates(ThrottleOutPacketTypeFlags categories)
  4936. {
  4937. if ((categories & ThrottleOutPacketTypeFlags.Task) != 0)
  4938. {
  4939. if (m_entityUpdates.Count > 0)
  4940. return true;
  4941. if (m_entityProps.Count > 0)
  4942. return true;
  4943. }
  4944. if ((categories & ThrottleOutPacketTypeFlags.Texture) != 0)
  4945. {
  4946. if (ImageManager.HasUpdates())
  4947. return true;
  4948. }
  4949. return false;
  4950. }
  4951. public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID)
  4952. {
  4953. AssetUploadCompletePacket newPack = new AssetUploadCompletePacket();
  4954. newPack.AssetBlock.Type = AssetType;
  4955. newPack.AssetBlock.Success = Success;
  4956. newPack.AssetBlock.UUID = AssetFullID;
  4957. newPack.Header.Zerocoded = true;
  4958. OutPacket(newPack, ThrottleOutPacketType.Asset);
  4959. }
  4960. public void SendXferRequest(ulong XferID, short AssetType, UUID vFileID, byte FilePath, byte[] FileName)
  4961. {
  4962. RequestXferPacket newPack = new RequestXferPacket();
  4963. newPack.XferID.ID = XferID;
  4964. newPack.XferID.VFileType = AssetType;
  4965. newPack.XferID.VFileID = vFileID;
  4966. newPack.XferID.FilePath = FilePath;
  4967. newPack.XferID.Filename = FileName;
  4968. newPack.Header.Zerocoded = true;
  4969. OutPacket(newPack, ThrottleOutPacketType.Asset);
  4970. }
  4971. public void SendConfirmXfer(ulong xferID, uint PacketID)
  4972. {
  4973. ConfirmXferPacketPacket newPack = new ConfirmXferPacketPacket();
  4974. newPack.XferID.ID = xferID;
  4975. newPack.XferID.Packet = PacketID;
  4976. newPack.Header.Zerocoded = true;
  4977. OutPacket(newPack, ThrottleOutPacketType.Asset);
  4978. }
  4979. public void SendInitiateDownload(string simFileName, string clientFileName)
  4980. {
  4981. InitiateDownloadPacket newPack = new InitiateDownloadPacket();
  4982. newPack.AgentData.AgentID = AgentId;
  4983. newPack.FileData.SimFilename = Utils.StringToBytes(simFileName);
  4984. newPack.FileData.ViewerFilename = Utils.StringToBytes(clientFileName);
  4985. OutPacket(newPack, ThrottleOutPacketType.Asset);
  4986. }
  4987. public void SendImageFirstPart(
  4988. ushort numParts, UUID ImageUUID, uint ImageSize, byte[] ImageData, byte imageCodec)
  4989. {
  4990. ImageDataPacket im = new ImageDataPacket();
  4991. im.ImageID.Packets = numParts;
  4992. im.ImageID.ID = ImageUUID;
  4993. if (ImageSize > 0)
  4994. im.ImageID.Size = ImageSize;
  4995. im.ImageData.Data = ImageData;
  4996. im.ImageID.Codec = imageCodec;
  4997. im.Header.Zerocoded = true;
  4998. OutPacket(im, ThrottleOutPacketType.Texture);
  4999. }
  5000. public void SendImageNextPart(ushort partNumber, UUID imageUuid, byte[] imageData)
  5001. {
  5002. ImagePacketPacket im = new ImagePacketPacket();
  5003. im.ImageID.Packet = partNumber;
  5004. im.ImageID.ID = imageUuid;
  5005. im.ImageData.Data = imageData;
  5006. OutPacket(im, ThrottleOutPacketType.Texture);
  5007. }
  5008. public void SendImageNotFound(UUID imageid)
  5009. {
  5010. ImageNotInDatabasePacket notFoundPacket
  5011. = (ImageNotInDatabasePacket)PacketPool.Instance.GetPacket(PacketType.ImageNotInDatabase);
  5012. notFoundPacket.ImageID.ID = imageid;
  5013. OutPacket(notFoundPacket, ThrottleOutPacketType.Texture);
  5014. }
  5015. public void SendShutdownConnectionNotice()
  5016. {
  5017. OutPacket(PacketPool.Instance.GetPacket(PacketType.DisableSimulator), ThrottleOutPacketType.Unknown);
  5018. }
  5019. static private readonly byte[] SimStatsHeader = new byte[] {
  5020. 0,
  5021. 0, 0, 0, 0, // sequence number
  5022. 0, // extra
  5023. 0xff, 0xff, 0, 140 // ID 140 (low frequency bigendian)
  5024. };
  5025. public void SendSimStats(SimStats stats)
  5026. {
  5027. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  5028. byte[] data = buf.Data;
  5029. //setup header
  5030. Buffer.BlockCopy(SimStatsHeader, 0, data, 0, 10);
  5031. // Region Block
  5032. Utils.UIntToBytesSafepos(stats.RegionX, data, 10);
  5033. Utils.UIntToBytesSafepos(stats.RegionY, data, 14);
  5034. Utils.UIntToBytesSafepos(stats.RegionFlags, data, 18);
  5035. Utils.UIntToBytesSafepos(stats.ObjectCapacity, data, 22); // 26
  5036. // stats
  5037. data[26] = (byte)stats.StatsBlock.Length;
  5038. int pos = 27;
  5039. stats.StatsBlock[15].StatValue /= 1024; // unack is in KB
  5040. for (int i = 0; i< stats.StatsBlock.Length; ++i)
  5041. {
  5042. Utils.UIntToBytesSafepos(stats.StatsBlock[i].StatID, data, pos); pos += 4;
  5043. Utils.FloatToBytesSafepos(stats.StatsBlock[i].StatValue, data, pos); pos += 4;
  5044. }
  5045. //no PID
  5046. Utils.IntToBytesSafepos(0, data, pos); pos += 4;
  5047. // no regioninfo (extended flags)
  5048. data[pos++] = 0; // = 1;
  5049. //Utils.UInt64ToBytesSafepos(RegionFlagsExtended, data, pos); pos += 8;
  5050. buf.DataLength = pos;
  5051. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task);
  5052. }
  5053. private class ObjectPropertyUpdate : EntityUpdate
  5054. {
  5055. internal bool SendFamilyProps;
  5056. internal bool SendObjectProps;
  5057. public ObjectPropertyUpdate(ISceneEntity entity, uint flags, bool sendfam, bool sendobj)
  5058. : base(entity,(PrimUpdateFlags)flags)
  5059. {
  5060. SendFamilyProps = sendfam;
  5061. SendObjectProps = sendobj;
  5062. }
  5063. public void Update(ObjectPropertyUpdate update)
  5064. {
  5065. SendFamilyProps = SendFamilyProps || update.SendFamilyProps;
  5066. SendObjectProps = SendObjectProps || update.SendObjectProps;
  5067. // other properties may need to be updated by base class
  5068. base.Update(update);
  5069. }
  5070. }
  5071. public void SendObjectPropertiesFamilyData(ISceneEntity entity, uint requestFlags)
  5072. {
  5073. uint priority = 0; // time based ordering only
  5074. lock (m_entityProps.SyncRoot)
  5075. m_entityProps.Enqueue(priority, new ObjectPropertyUpdate(entity, requestFlags, true, false));
  5076. }
  5077. private void ResendPropertyUpdate(ObjectPropertyUpdate update)
  5078. {
  5079. uint priority = 0;
  5080. lock (m_entityProps.SyncRoot)
  5081. m_entityProps.Enqueue(priority, update);
  5082. }
  5083. private void ResendPropertyUpdates(List<ObjectPropertyUpdate> updates, OutgoingPacket oPacket)
  5084. {
  5085. // m_log.WarnFormat("[CLIENT] resending object property {0}",updates[0].UpdateTime);
  5086. // Remove the update packet from the list of packets waiting for acknowledgement
  5087. // because we are requeuing the list of updates. They will be resent in new packets
  5088. // with the most recent state.
  5089. m_udpClient.NeedAcks.Remove(oPacket.SequenceNumber);
  5090. // Count this as a resent packet since we are going to requeue all of the updates contained in it
  5091. Interlocked.Increment(ref m_udpClient.PacketsResent);
  5092. // We're not going to worry about interlock yet since its not currently critical that this total count
  5093. // is 100% correct
  5094. m_udpServer.PacketsResentCount++;
  5095. foreach (ObjectPropertyUpdate update in updates)
  5096. ResendPropertyUpdate(update);
  5097. }
  5098. public void SendObjectPropertiesReply(ISceneEntity entity)
  5099. {
  5100. uint priority = 0; // time based ordering only
  5101. lock (m_entityProps.SyncRoot)
  5102. m_entityProps.Enqueue(priority, new ObjectPropertyUpdate(entity,0,false,true));
  5103. }
  5104. static private readonly byte[] ObjectPropertyUpdateHeader = new byte[] {
  5105. Helpers.MSG_RELIABLE | Helpers.MSG_ZEROCODED,
  5106. 0, 0, 0, 0, // sequence number
  5107. 0, // extra
  5108. 0xff, 9 // ID (medium frequency)
  5109. };
  5110. static private readonly byte[] ObjectFamilyUpdateHeader = new byte[] {
  5111. Helpers.MSG_RELIABLE | Helpers.MSG_ZEROCODED,
  5112. 0, 0, 0, 0, // sequence number
  5113. 0, // extra
  5114. 0xff, 10 // ID (medium frequency)
  5115. };
  5116. private void ProcessEntityPropertyRequests(int maxUpdateBytes)
  5117. {
  5118. List<ObjectPropertyUpdate> objectPropertiesUpdates = null;
  5119. List<ObjectPropertyUpdate> objectPropertiesFamilyUpdates = null;
  5120. List<SceneObjectPart> needPhysics = null;
  5121. // bool orderedDequeue = m_scene.UpdatePrioritizationScheme == UpdatePrioritizationSchemes.SimpleAngularDistance;
  5122. bool orderedDequeue = false; // for now
  5123. EntityUpdate iupdate;
  5124. while (maxUpdateBytes > 0)
  5125. {
  5126. lock (m_entityProps.SyncRoot)
  5127. {
  5128. if(orderedDequeue)
  5129. {
  5130. if (!m_entityProps.TryOrderedDequeue(out iupdate))
  5131. break;
  5132. }
  5133. else
  5134. {
  5135. if (!m_entityProps.TryDequeue(out iupdate))
  5136. break;
  5137. }
  5138. }
  5139. ObjectPropertyUpdate update = (ObjectPropertyUpdate)iupdate;
  5140. if (update.SendFamilyProps)
  5141. {
  5142. if (update.Entity is SceneObjectPart)
  5143. {
  5144. SceneObjectPart sop = (SceneObjectPart)update.Entity;
  5145. if(objectPropertiesFamilyUpdates == null)
  5146. objectPropertiesFamilyUpdates = new List<ObjectPropertyUpdate>();
  5147. objectPropertiesFamilyUpdates.Add(update);
  5148. maxUpdateBytes -= 100;
  5149. }
  5150. }
  5151. if (update.SendObjectProps)
  5152. {
  5153. if (update.Entity is SceneObjectPart)
  5154. {
  5155. SceneObjectPart sop = (SceneObjectPart)update.Entity;
  5156. if(needPhysics == null)
  5157. needPhysics = new List<SceneObjectPart>();
  5158. needPhysics.Add(sop);
  5159. if(objectPropertiesUpdates == null)
  5160. objectPropertiesUpdates = new List<ObjectPropertyUpdate>();
  5161. objectPropertiesUpdates.Add(update);
  5162. maxUpdateBytes -= 200; // aprox
  5163. }
  5164. }
  5165. }
  5166. if (objectPropertiesUpdates != null)
  5167. {
  5168. int blocks = objectPropertiesUpdates.Count;
  5169. //List<EntityUpdate> tau = new List<EntityUpdate>(30);
  5170. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  5171. Buffer.BlockCopy(ObjectPropertyUpdateHeader, 0, buf.Data, 0, 8);
  5172. LLUDPZeroEncoder zc = new LLUDPZeroEncoder(buf.Data);
  5173. zc.Position = 8;
  5174. zc.AddByte(1); // tmp block count
  5175. int countposition = zc.Position - 1;
  5176. int lastpos = 0;
  5177. int lastzc = 0;
  5178. int count = 0;
  5179. foreach (EntityUpdate eu in objectPropertiesUpdates)
  5180. {
  5181. lastpos = zc.Position;
  5182. lastzc = zc.ZeroCount;
  5183. CreateObjectPropertiesBlock((SceneObjectPart)eu.Entity, zc);
  5184. if (zc.Position < LLUDPServer.MAXPAYLOAD)
  5185. {
  5186. //tau.Add(eu);
  5187. ++count;
  5188. --blocks;
  5189. }
  5190. else if (blocks > 0)
  5191. {
  5192. // we need more packets
  5193. UDPPacketBuffer newbuf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  5194. Buffer.BlockCopy(buf.Data, 0, newbuf.Data, 0, countposition); // start is the same
  5195. buf.Data[countposition] = (byte)count;
  5196. // get pending zeros at cut point
  5197. if (lastzc > 0)
  5198. {
  5199. buf.Data[lastpos++] = 0;
  5200. buf.Data[lastpos++] = (byte)lastzc;
  5201. }
  5202. buf.DataLength = lastpos;
  5203. //m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task,
  5204. // delegate (OutgoingPacket oPacket) { ResendPrimUpdates(tau, oPacket); }, false, false);
  5205. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task);
  5206. buf = newbuf;
  5207. zc.Data = buf.Data;
  5208. zc.ZeroCount = 0;
  5209. zc.Position = countposition + 1;
  5210. // im lazy now, just do last again
  5211. CreateObjectPropertiesBlock((SceneObjectPart)eu.Entity, zc);
  5212. //tau = new List<EntityUpdate>(30);
  5213. //tau.Add(eu);
  5214. count = 1;
  5215. --blocks;
  5216. }
  5217. }
  5218. if (count > 0)
  5219. {
  5220. buf.Data[countposition] = (byte)count;
  5221. buf.DataLength = zc.Finish();
  5222. //m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task,
  5223. // delegate (OutgoingPacket oPacket) { ResendPrimUpdates(tau, oPacket); }, false, false);
  5224. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task);
  5225. }
  5226. }
  5227. if (objectPropertiesFamilyUpdates != null)
  5228. {
  5229. foreach (EntityUpdate eu in objectPropertiesFamilyUpdates)
  5230. {
  5231. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  5232. Buffer.BlockCopy(ObjectFamilyUpdateHeader, 0, buf.Data, 0, 8);
  5233. LLUDPZeroEncoder zc = new LLUDPZeroEncoder(buf.Data);
  5234. zc.Position = 8;
  5235. CreateObjectPropertiesFamilyBlock((SceneObjectPart)eu.Entity, eu.Flags, zc);
  5236. buf.DataLength = zc.Finish();
  5237. //List<EntityUpdate> tau = new List<EntityUpdate>(1);
  5238. //tau.Add(new ObjectPropertyUpdate((ISceneEntity) eu, (uint)eu.Flags, true, false));
  5239. //m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task,
  5240. // delegate (OutgoingPacket oPacket) { ResendPrimUpdates(tau, oPacket); }, false, false);
  5241. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task);
  5242. }
  5243. }
  5244. if (needPhysics != null)
  5245. {
  5246. IEventQueue eq = Scene.RequestModuleInterface<IEventQueue>();
  5247. if(eq != null)
  5248. {
  5249. StringBuilder sb = eq.StartEvent("ObjectPhysicsProperties");
  5250. LLSDxmlEncode.AddArray("ObjectData", sb);
  5251. foreach (SceneObjectPart sop in needPhysics)
  5252. {
  5253. LLSDxmlEncode.AddMap(sb);
  5254. LLSDxmlEncode.AddElem("LocalID",(int)sop.LocalId, sb);
  5255. LLSDxmlEncode.AddElem("Density", sop.Density, sb);
  5256. LLSDxmlEncode.AddElem("Friction", sop.Friction, sb);
  5257. LLSDxmlEncode.AddElem("GravityMultiplier", sop.GravityModifier, sb);
  5258. LLSDxmlEncode.AddElem("Restitution", sop.Restitution, sb);
  5259. LLSDxmlEncode.AddElem("PhysicsShapeType", (int)sop.PhysicsShapeType, sb);
  5260. LLSDxmlEncode.AddEndMap(sb);
  5261. }
  5262. LLSDxmlEncode.AddEndArray(sb);
  5263. OSDllsdxml ev = new OSDllsdxml(eq.EndEvent(sb));
  5264. eq.Enqueue(ev, AgentId);
  5265. }
  5266. }
  5267. }
  5268. private void CreateObjectPropertiesFamilyBlock(SceneObjectPart sop, PrimUpdateFlags requestFlags, LLUDPZeroEncoder zc)
  5269. {
  5270. SceneObjectPart root = sop.ParentGroup.RootPart;
  5271. zc.AddUInt((uint)requestFlags);
  5272. zc.AddUUID(sop.UUID);
  5273. if (sop.OwnerID == sop.GroupID)
  5274. zc.AddZeros(16);
  5275. else
  5276. zc.AddUUID(sop.OwnerID);
  5277. zc.AddUUID(sop.GroupID);
  5278. zc.AddUInt(root.BaseMask);
  5279. zc.AddUInt(root.OwnerMask);
  5280. zc.AddUInt(root.GroupMask);
  5281. zc.AddUInt(root.EveryoneMask);
  5282. zc.AddUInt(root.NextOwnerMask);
  5283. zc.AddZeros(4); // int ownership cost
  5284. //sale info block
  5285. zc.AddByte(root.ObjectSaleType);
  5286. zc.AddInt(root.SalePrice);
  5287. zc.AddUInt(sop.Category); //Category
  5288. zc.AddUUID(sop.LastOwnerID);
  5289. //name
  5290. zc.AddShortString(sop.Name, 64);
  5291. //Description
  5292. zc.AddShortString(sop.Description, 128);
  5293. }
  5294. private void CreateObjectPropertiesBlock(SceneObjectPart sop, LLUDPZeroEncoder zc)
  5295. {
  5296. SceneObjectPart root = sop.ParentGroup.RootPart;
  5297. zc.AddUUID(sop.UUID);
  5298. zc.AddUUID(sop.CreatorID);
  5299. if (sop.OwnerID == sop.GroupID)
  5300. zc.AddZeros(16);
  5301. else
  5302. zc.AddUUID(sop.OwnerID);
  5303. zc.AddUUID(sop.GroupID);
  5304. zc.AddUInt64((ulong)sop.CreationDate * 1000000UL);
  5305. zc.AddUInt(root.BaseMask);
  5306. zc.AddUInt(root.OwnerMask);
  5307. zc.AddUInt(root.GroupMask);
  5308. zc.AddUInt(root.EveryoneMask);
  5309. zc.AddUInt(root.NextOwnerMask);
  5310. zc.AddZeros(4); // int ownership cost
  5311. //sale info block
  5312. zc.AddByte(root.ObjectSaleType);
  5313. zc.AddInt(root.SalePrice);
  5314. //aggregated perms we may will need to fix this
  5315. zc.AddByte(0); //AggregatePerms
  5316. zc.AddByte(0); //AggregatePermTextures;
  5317. zc.AddByte(0); //AggregatePermTexturesOwner
  5318. //inventory info
  5319. zc.AddUInt(sop.Category); //Category
  5320. zc.AddInt16((short)sop.InventorySerial);
  5321. zc.AddUUID(sop.FromUserInventoryItemID);
  5322. zc.AddUUID(UUID.Zero); //FolderID
  5323. zc.AddUUID(UUID.Zero); //FromTaskID
  5324. zc.AddUUID(sop.LastOwnerID);
  5325. //name
  5326. zc.AddShortString(sop.Name, 64);
  5327. //Description
  5328. zc.AddShortString(sop.Description, 128);
  5329. // touch name
  5330. zc.AddShortString(root.TouchName, 9, 37);
  5331. // sit name
  5332. zc.AddShortString(root.SitName, 9, 37);
  5333. //texture ids block
  5334. // still not sending, not clear the impact on viewers, if any.
  5335. // does seem redundant
  5336. // to send we will need proper list of face texture ids without having to unpack texture entry all the time
  5337. zc.AddZeros(1);
  5338. }
  5339. #region Estate Data Sending Methods
  5340. private static bool convertParamStringToBool(byte[] field)
  5341. {
  5342. string s = Utils.BytesToString(field);
  5343. if (s == "1" || s.ToLower() == "y" || s.ToLower() == "yes" || s.ToLower() == "t" || s.ToLower() == "true")
  5344. {
  5345. return true;
  5346. }
  5347. return false;
  5348. }
  5349. public void SendEstateList(UUID invoice, int code, UUID[] Data, uint estateID)
  5350. {
  5351. int TotalnumberIDs = Data.Length;
  5352. int numberIDs;
  5353. int IDIndex = 0;
  5354. do
  5355. {
  5356. if(TotalnumberIDs > 63)
  5357. numberIDs = 63;
  5358. else
  5359. numberIDs = TotalnumberIDs;
  5360. TotalnumberIDs -= numberIDs;
  5361. EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket();
  5362. packet.AgentData.TransactionID = UUID.Random();
  5363. packet.AgentData.AgentID = AgentId;
  5364. packet.AgentData.SessionID = SessionId;
  5365. packet.MethodData.Invoice = invoice;
  5366. packet.MethodData.Method = Utils.StringToBytes("setaccess");
  5367. EstateOwnerMessagePacket.ParamListBlock[] returnblock = new EstateOwnerMessagePacket.ParamListBlock[6 + numberIDs];
  5368. for (int i = 0; i < (6 + numberIDs); i++)
  5369. {
  5370. returnblock[i] = new EstateOwnerMessagePacket.ParamListBlock();
  5371. }
  5372. returnblock[0].Parameter = Utils.StringToBytes(estateID.ToString());
  5373. returnblock[1].Parameter = Utils.StringToBytes(code.ToString());
  5374. if((code & 1) != 0) // allowagents
  5375. returnblock[2].Parameter = Utils.StringToBytes(numberIDs.ToString());
  5376. else
  5377. returnblock[2].Parameter = Utils.StringToBytes("0");
  5378. if((code & 2) != 0) // groups
  5379. returnblock[3].Parameter = Utils.StringToBytes(numberIDs.ToString());
  5380. else
  5381. returnblock[3].Parameter = Utils.StringToBytes("0");
  5382. if((code & 4) != 0) // bans
  5383. returnblock[4].Parameter = Utils.StringToBytes(numberIDs.ToString());
  5384. else
  5385. returnblock[4].Parameter = Utils.StringToBytes("0");
  5386. if((code & 8) != 0) // managers
  5387. returnblock[5].Parameter = Utils.StringToBytes(numberIDs.ToString());
  5388. else
  5389. returnblock[5].Parameter = Utils.StringToBytes("0");
  5390. int j = 6;
  5391. for (int i = 0; i < numberIDs; i++)
  5392. {
  5393. returnblock[j].Parameter = Data[IDIndex].GetBytes();
  5394. j++;
  5395. IDIndex++;
  5396. }
  5397. packet.ParamList = returnblock;
  5398. packet.Header.Reliable = true;
  5399. OutPacket(packet, ThrottleOutPacketType.Task);
  5400. } while (TotalnumberIDs > 0);
  5401. }
  5402. public void SendBannedUserList(UUID invoice, EstateBan[] bl, uint estateID)
  5403. {
  5404. List<UUID> BannedUsers = new List<UUID>();
  5405. for (int i = 0; i < bl.Length; i++)
  5406. {
  5407. if (bl[i] == null)
  5408. continue;
  5409. if (bl[i].BannedUserID == UUID.Zero)
  5410. continue;
  5411. BannedUsers.Add(bl[i].BannedUserID);
  5412. }
  5413. SendEstateList(invoice, 4, BannedUsers.ToArray(), estateID);
  5414. }
  5415. public void SendRegionInfoToEstateMenu(RegionInfoForEstateMenuArgs args)
  5416. {
  5417. RegionInfoPacket rinfopack = new RegionInfoPacket();
  5418. RegionInfoPacket.RegionInfoBlock rinfoblk = new RegionInfoPacket.RegionInfoBlock();
  5419. rinfopack.AgentData.AgentID = AgentId;
  5420. rinfopack.AgentData.SessionID = SessionId;
  5421. rinfoblk.BillableFactor = args.billableFactor;
  5422. rinfoblk.EstateID = args.estateID;
  5423. rinfoblk.MaxAgents = (byte)args.maxAgents;
  5424. rinfoblk.ObjectBonusFactor = args.objectBonusFactor;
  5425. rinfoblk.ParentEstateID = args.parentEstateID;
  5426. rinfoblk.PricePerMeter = args.pricePerMeter;
  5427. rinfoblk.RedirectGridX = args.redirectGridX;
  5428. rinfoblk.RedirectGridY = args.redirectGridY;
  5429. rinfoblk.RegionFlags = args.regionFlags;
  5430. rinfoblk.SimAccess = args.simAccess;
  5431. rinfoblk.SunHour = args.sunHour;
  5432. rinfoblk.TerrainLowerLimit = args.terrainLowerLimit;
  5433. rinfoblk.TerrainRaiseLimit = args.terrainRaiseLimit;
  5434. rinfoblk.UseEstateSun = args.useEstateSun;
  5435. rinfoblk.WaterHeight = args.waterHeight;
  5436. rinfoblk.SimName = Utils.StringToBytes(args.simName);
  5437. rinfopack.RegionInfo2 = new RegionInfoPacket.RegionInfo2Block();
  5438. rinfopack.RegionInfo2.HardMaxAgents = (uint)args.AgentCapacity;
  5439. rinfopack.RegionInfo2.HardMaxObjects = (uint)args.ObjectsCapacity;
  5440. rinfopack.RegionInfo2.MaxAgents32 = (uint)args.maxAgents;
  5441. rinfopack.RegionInfo2.ProductName = Util.StringToBytes256(args.regionType);
  5442. rinfopack.RegionInfo2.ProductSKU = Utils.EmptyBytes;
  5443. rinfopack.HasVariableBlocks = true;
  5444. rinfopack.RegionInfo = rinfoblk;
  5445. rinfopack.AgentData = new RegionInfoPacket.AgentDataBlock();
  5446. rinfopack.AgentData.AgentID = AgentId;
  5447. rinfopack.AgentData.SessionID = SessionId;
  5448. rinfopack.RegionInfo3 = new RegionInfoPacket.RegionInfo3Block[0];
  5449. OutPacket(rinfopack, ThrottleOutPacketType.Task);
  5450. }
  5451. public void SendEstateCovenantInformation(UUID covenant)
  5452. {
  5453. // m_log.DebugFormat("[LLCLIENTVIEW]: Sending estate covenant asset id of {0} to {1}", covenant, Name);
  5454. EstateCovenantReplyPacket einfopack = new EstateCovenantReplyPacket();
  5455. EstateCovenantReplyPacket.DataBlock edata = new EstateCovenantReplyPacket.DataBlock();
  5456. edata.CovenantID = covenant;
  5457. edata.CovenantTimestamp = (uint) m_scene.RegionInfo.RegionSettings.CovenantChangedDateTime;
  5458. edata.EstateOwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
  5459. edata.EstateName = Utils.StringToBytes(m_scene.RegionInfo.EstateSettings.EstateName);
  5460. einfopack.Data = edata;
  5461. OutPacket(einfopack, ThrottleOutPacketType.Task);
  5462. }
  5463. public void SendDetailedEstateData(
  5464. UUID invoice, string estateName, uint estateID, uint parentEstate, uint estateFlags, uint sunPosition,
  5465. UUID covenant, uint covenantChanged, string abuseEmail, UUID estateOwner)
  5466. {
  5467. // m_log.DebugFormat(
  5468. // "[LLCLIENTVIEW]: Sending detailed estate data to {0} with covenant asset id {1}", Name, covenant);
  5469. EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket();
  5470. packet.MethodData.Invoice = invoice;
  5471. packet.AgentData.TransactionID = UUID.Random();
  5472. packet.MethodData.Method = Utils.StringToBytes("estateupdateinfo");
  5473. EstateOwnerMessagePacket.ParamListBlock[] returnblock = new EstateOwnerMessagePacket.ParamListBlock[10];
  5474. for (int i = 0; i < 10; i++)
  5475. {
  5476. returnblock[i] = new EstateOwnerMessagePacket.ParamListBlock();
  5477. }
  5478. //Sending Estate Settings
  5479. returnblock[0].Parameter = Utils.StringToBytes(estateName);
  5480. returnblock[1].Parameter = Utils.StringToBytes(estateOwner.ToString());
  5481. returnblock[2].Parameter = Utils.StringToBytes(estateID.ToString());
  5482. returnblock[3].Parameter = Utils.StringToBytes(estateFlags.ToString());
  5483. returnblock[4].Parameter = Utils.StringToBytes(sunPosition.ToString());
  5484. returnblock[5].Parameter = Utils.StringToBytes(parentEstate.ToString());
  5485. returnblock[6].Parameter = Utils.StringToBytes(covenant.ToString());
  5486. returnblock[7].Parameter = Utils.StringToBytes(covenantChanged.ToString());
  5487. returnblock[8].Parameter = Utils.StringToBytes("1"); // what is this?
  5488. returnblock[9].Parameter = Utils.StringToBytes(abuseEmail);
  5489. packet.ParamList = returnblock;
  5490. //m_log.Debug("[ESTATE]: SIM--->" + packet.ToString());
  5491. OutPacket(packet, ThrottleOutPacketType.Task);
  5492. }
  5493. public void SendTelehubInfo(UUID ObjectID, string ObjectName, Vector3 ObjectPos, Quaternion ObjectRot, List<Vector3> SpawnPoint)
  5494. {
  5495. TelehubInfoPacket packet = (TelehubInfoPacket)PacketPool.Instance.GetPacket(PacketType.TelehubInfo);
  5496. packet.TelehubBlock.ObjectID = ObjectID;
  5497. packet.TelehubBlock.ObjectName = Utils.StringToBytes(ObjectName);
  5498. packet.TelehubBlock.TelehubPos = ObjectPos;
  5499. packet.TelehubBlock.TelehubRot = ObjectRot;
  5500. packet.SpawnPointBlock = new TelehubInfoPacket.SpawnPointBlockBlock[SpawnPoint.Count];
  5501. for (int n = 0; n < SpawnPoint.Count; n++)
  5502. {
  5503. packet.SpawnPointBlock[n] = new TelehubInfoPacket.SpawnPointBlockBlock{SpawnPointPos = SpawnPoint[n]};
  5504. }
  5505. OutPacket(packet, ThrottleOutPacketType.Task);
  5506. }
  5507. #endregion
  5508. #region Land Data Sending Methods
  5509. public void SendLandParcelOverlay(byte[] data, int sequence_id)
  5510. {
  5511. ParcelOverlayPacket packet = (ParcelOverlayPacket)PacketPool.Instance.GetPacket(PacketType.ParcelOverlay);
  5512. packet.ParcelData.Data = data;
  5513. packet.ParcelData.SequenceID = sequence_id;
  5514. // OutPacket(packet, ThrottleOutPacketType.Task);
  5515. OutPacket(packet, ThrottleOutPacketType.Land);
  5516. }
  5517. public void SendLandProperties(
  5518. int sequence_id, bool snap_selection, int request_result, ILandObject lo,
  5519. float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity, uint regionFlags)
  5520. {
  5521. // m_log.DebugFormat("[LLCLIENTVIEW]: Sending land properties for {0} to {1}", lo.LandData.GlobalID, Name);
  5522. IEventQueue eq = Scene.RequestModuleInterface<IEventQueue>();
  5523. if (eq == null)
  5524. {
  5525. m_log.Warn("[LLCLIENTVIEW]: No EQ Interface when sending parcel data.");
  5526. return;
  5527. }
  5528. LandData landData = lo.LandData;
  5529. IPrimCounts pc = lo.PrimCounts;
  5530. StringBuilder sb = eq.StartEvent("ParcelProperties");
  5531. LLSDxmlEncode.AddArrayAndMap("ParcelData", sb);
  5532. LLSDxmlEncode.AddElem("LocalID", landData.LocalID, sb);
  5533. LLSDxmlEncode.AddElem("AABBMax", landData.AABBMax, sb);
  5534. LLSDxmlEncode.AddElem("AABBMin", landData.AABBMin, sb);
  5535. LLSDxmlEncode.AddElem("Area", landData.Area, sb);
  5536. LLSDxmlEncode.AddElem("AuctionID", (int)landData.AuctionID, sb);
  5537. LLSDxmlEncode.AddElem("AuthBuyerID", landData.AuthBuyerID, sb);
  5538. LLSDxmlEncode.AddElem("Bitmap", landData.Bitmap, sb);
  5539. LLSDxmlEncode.AddElem("Category", (int)landData.Category, sb);
  5540. LLSDxmlEncode.AddElem("ClaimDate", Util.ToDateTime(landData.ClaimDate), sb);
  5541. LLSDxmlEncode.AddElem("ClaimPrice", landData.ClaimPrice, sb);
  5542. LLSDxmlEncode.AddElem("Desc", landData.Description, sb);
  5543. LLSDxmlEncode.AddElem("ParcelFlags", landData.Flags, sb);
  5544. LLSDxmlEncode.AddElem("GroupID", landData.GroupID, sb);
  5545. LLSDxmlEncode.AddElem("GroupPrims", pc.Group, sb);
  5546. LLSDxmlEncode.AddElem("IsGroupOwned", landData.IsGroupOwned, sb);
  5547. LLSDxmlEncode.AddElem("LandingType", (int)landData.LandingType, sb);
  5548. if (landData.Area > 0)
  5549. LLSDxmlEncode.AddElem("MaxPrims", parcelObjectCapacity, sb);
  5550. else
  5551. LLSDxmlEncode.AddElem("MaxPrims", (int)0, sb);
  5552. LLSDxmlEncode.AddElem("MediaID", landData.MediaID, sb);
  5553. LLSDxmlEncode.AddElem("MediaURL", landData.MediaURL, sb);
  5554. LLSDxmlEncode.AddElem("MediaAutoScale", landData.MediaAutoScale != 0, sb);
  5555. LLSDxmlEncode.AddElem("MusicURL", landData.MusicURL, sb);
  5556. LLSDxmlEncode.AddElem("Name", landData.Name, sb);
  5557. LLSDxmlEncode.AddElem("OtherCleanTime", landData.OtherCleanTime, sb);
  5558. LLSDxmlEncode.AddElem("OtherCount", (int)0 , sb); //TODO
  5559. LLSDxmlEncode.AddElem("OtherPrims", pc.Others, sb);
  5560. LLSDxmlEncode.AddElem("OwnerID", landData.OwnerID, sb);
  5561. LLSDxmlEncode.AddElem("OwnerPrims", pc.Owner, sb);
  5562. LLSDxmlEncode.AddElem("ParcelPrimBonus", simObjectBonusFactor, sb);
  5563. LLSDxmlEncode.AddElem("PassHours", landData.PassHours, sb);
  5564. LLSDxmlEncode.AddElem("PassPrice", landData.PassPrice, sb);
  5565. LLSDxmlEncode.AddElem("PublicCount", (int)0, sb); //TODO
  5566. LLSDxmlEncode.AddElem("RegionDenyAnonymous", (regionFlags & (uint)RegionFlags.DenyAnonymous) != 0, sb);
  5567. //LLSDxmlEncode.AddElem("RegionDenyIdentified", (regionFlags & (uint)RegionFlags.DenyIdentified) != 0, sb);
  5568. LLSDxmlEncode.AddElem("RegionDenyIdentified", false, sb);
  5569. //LLSDxmlEncode.AddElem("RegionDenyTransacted", (regionFlags & (uint)RegionFlags.DenyTransacted) != 0, sb);
  5570. LLSDxmlEncode.AddElem("RegionDenyTransacted", false, sb);
  5571. LLSDxmlEncode.AddElem("RegionPushOverride", (regionFlags & (uint)RegionFlags.RestrictPushObject) != 0, sb);
  5572. LLSDxmlEncode.AddElem("RentPrice", (int) 0, sb);;
  5573. LLSDxmlEncode.AddElem("RequestResult", request_result, sb);
  5574. LLSDxmlEncode.AddElem("SalePrice", landData.SalePrice, sb);
  5575. LLSDxmlEncode.AddElem("SelectedPrims", pc.Selected, sb);
  5576. LLSDxmlEncode.AddElem("SelfCount", (int)0, sb); //TODO
  5577. LLSDxmlEncode.AddElem("SequenceID", sequence_id, sb);
  5578. if (landData.SimwideArea > 0)
  5579. LLSDxmlEncode.AddElem("SimWideMaxPrims", lo.GetSimulatorMaxPrimCount(), sb);
  5580. else
  5581. LLSDxmlEncode.AddElem("SimWideMaxPrims", (int)0, sb);
  5582. LLSDxmlEncode.AddElem("SimWideTotalPrims", pc.Simulator, sb);
  5583. LLSDxmlEncode.AddElem("SnapSelection", snap_selection, sb);
  5584. LLSDxmlEncode.AddElem("SnapshotID", landData.SnapshotID, sb);
  5585. LLSDxmlEncode.AddElem("Status", (int)landData.Status, sb);
  5586. LLSDxmlEncode.AddElem("TotalPrims", pc.Total, sb);
  5587. LLSDxmlEncode.AddElem("UserLocation", landData.UserLocation, sb);
  5588. LLSDxmlEncode.AddElem("UserLookAt", landData.UserLookAt, sb);
  5589. LLSDxmlEncode.AddElem("SeeAVs", landData.SeeAVs, sb);
  5590. LLSDxmlEncode.AddElem("AnyAVSounds", landData.AnyAVSounds, sb);
  5591. LLSDxmlEncode.AddElem("GroupAVSounds", landData.GroupAVSounds, sb);
  5592. LLSDxmlEncode.AddEndMapAndArray(sb);
  5593. LLSDxmlEncode.AddArrayAndMap("MediaData", sb);
  5594. LLSDxmlEncode.AddElem("MediaDesc", landData.MediaDescription, sb);
  5595. LLSDxmlEncode.AddElem("MediaHeight", landData.MediaHeight, sb);
  5596. LLSDxmlEncode.AddElem("MediaWidth", landData.MediaWidth, sb);
  5597. LLSDxmlEncode.AddElem("MediaLoop", landData.MediaLoop, sb);
  5598. LLSDxmlEncode.AddElem("MediaType", landData.MediaType, sb);
  5599. LLSDxmlEncode.AddElem("ObscureMedia", landData.ObscureMedia, sb);
  5600. LLSDxmlEncode.AddElem("ObscureMusic", landData.ObscureMusic, sb);
  5601. LLSDxmlEncode.AddEndMapAndArray(sb);
  5602. LLSDxmlEncode.AddArrayAndMap("AgeVerificationBlock", sb);
  5603. //LLSDxmlEncode.AddElem("RegionDenyAgeUnverified", (regionFlags & (uint)RegionFlags.DenyAgeUnverified) != 0, sb);
  5604. LLSDxmlEncode.AddElem("RegionDenyAgeUnverified", false, sb);
  5605. LLSDxmlEncode.AddEndMapAndArray(sb);
  5606. OSDllsdxml ev = new OSDllsdxml(eq.EndEvent(sb));
  5607. eq.Enqueue(ev, AgentId);
  5608. }
  5609. public void SendLandAccessListData(List<LandAccessEntry> accessList, uint accessFlag, int localLandID)
  5610. {
  5611. ParcelAccessListReplyPacket replyPacket = (ParcelAccessListReplyPacket)PacketPool.Instance.GetPacket(PacketType.ParcelAccessListReply);
  5612. replyPacket.Data.AgentID = AgentId;
  5613. replyPacket.Data.Flags = accessFlag;
  5614. replyPacket.Data.LocalID = localLandID;
  5615. replyPacket.Data.SequenceID = 0;
  5616. List<ParcelAccessListReplyPacket.ListBlock> list = new List<ParcelAccessListReplyPacket.ListBlock>();
  5617. foreach (LandAccessEntry entry in accessList)
  5618. {
  5619. ParcelAccessListReplyPacket.ListBlock block = new ParcelAccessListReplyPacket.ListBlock();
  5620. block.Flags = accessFlag;
  5621. block.ID = entry.AgentID;
  5622. block.Time = entry.Expires;
  5623. list.Add(block);
  5624. }
  5625. replyPacket.List = list.ToArray();
  5626. replyPacket.Header.Zerocoded = true;
  5627. OutPacket(replyPacket, ThrottleOutPacketType.Task);
  5628. }
  5629. public void SendForceClientSelectObjects(List<uint> ObjectIDs)
  5630. {
  5631. // m_log.DebugFormat("[LLCLIENTVIEW] sending select with {0} objects", ObjectIDs.Count);
  5632. bool firstCall = true;
  5633. const int MAX_OBJECTS_PER_PACKET = 251;
  5634. ForceObjectSelectPacket pack = (ForceObjectSelectPacket)PacketPool.Instance.GetPacket(PacketType.ForceObjectSelect);
  5635. ForceObjectSelectPacket.DataBlock[] data;
  5636. while (ObjectIDs.Count > 0)
  5637. {
  5638. if (firstCall)
  5639. {
  5640. pack._Header.ResetList = true;
  5641. firstCall = false;
  5642. }
  5643. else
  5644. {
  5645. pack._Header.ResetList = false;
  5646. }
  5647. if (ObjectIDs.Count > MAX_OBJECTS_PER_PACKET)
  5648. {
  5649. data = new ForceObjectSelectPacket.DataBlock[MAX_OBJECTS_PER_PACKET];
  5650. }
  5651. else
  5652. {
  5653. data = new ForceObjectSelectPacket.DataBlock[ObjectIDs.Count];
  5654. }
  5655. int i;
  5656. for (i = 0; i < MAX_OBJECTS_PER_PACKET && ObjectIDs.Count > 0; i++)
  5657. {
  5658. data[i] = new ForceObjectSelectPacket.DataBlock();
  5659. data[i].LocalID = Convert.ToUInt32(ObjectIDs[0]);
  5660. ObjectIDs.RemoveAt(0);
  5661. }
  5662. pack.Data = data;
  5663. pack.Header.Zerocoded = true;
  5664. OutPacket(pack, ThrottleOutPacketType.Task);
  5665. }
  5666. }
  5667. public void SendCameraConstraint(Vector4 ConstraintPlane)
  5668. {
  5669. CameraConstraintPacket cpack = (CameraConstraintPacket)PacketPool.Instance.GetPacket(PacketType.CameraConstraint);
  5670. cpack.CameraCollidePlane = new CameraConstraintPacket.CameraCollidePlaneBlock();
  5671. cpack.CameraCollidePlane.Plane = ConstraintPlane;
  5672. //m_log.DebugFormat("[CLIENTVIEW]: Constraint {0}", ConstraintPlane);
  5673. OutPacket(cpack, ThrottleOutPacketType.Task);
  5674. }
  5675. public void SendLandObjectOwners(LandData land, List<UUID> groups, Dictionary<UUID, int> ownersAndCount)
  5676. {
  5677. int notifyCount = ownersAndCount.Count;
  5678. ParcelObjectOwnersReplyPacket pack = (ParcelObjectOwnersReplyPacket)PacketPool.Instance.GetPacket(PacketType.ParcelObjectOwnersReply);
  5679. if (notifyCount > 0)
  5680. {
  5681. // if (notifyCount > 32)
  5682. // {
  5683. // m_log.InfoFormat(
  5684. // "[LAND]: More than {0} avatars own prims on this parcel. Only sending back details of first {0}"
  5685. // + " - a developer might want to investigate whether this is a hard limit", 32);
  5686. //
  5687. // notifyCount = 32;
  5688. // }
  5689. ParcelObjectOwnersReplyPacket.DataBlock[] dataBlock
  5690. = new ParcelObjectOwnersReplyPacket.DataBlock[notifyCount];
  5691. int num = 0;
  5692. foreach (UUID owner in ownersAndCount.Keys)
  5693. {
  5694. dataBlock[num] = new ParcelObjectOwnersReplyPacket.DataBlock();
  5695. dataBlock[num].Count = ownersAndCount[owner];
  5696. if (land.GroupID == owner || groups.Contains(owner))
  5697. dataBlock[num].IsGroupOwned = true;
  5698. dataBlock[num].OnlineStatus = true; //TODO: fix me later
  5699. dataBlock[num].OwnerID = owner;
  5700. num++;
  5701. if (num >= notifyCount)
  5702. {
  5703. break;
  5704. }
  5705. }
  5706. pack.Data = dataBlock;
  5707. }
  5708. else
  5709. {
  5710. pack.Data = new ParcelObjectOwnersReplyPacket.DataBlock[0];
  5711. }
  5712. pack.Header.Zerocoded = true;
  5713. this.OutPacket(pack, ThrottleOutPacketType.Task);
  5714. }
  5715. #endregion
  5716. #region Helper Methods
  5717. private void ClampVectorForUint(ref Vector3 v, float max)
  5718. {
  5719. float a,b;
  5720. a = Math.Abs(v.X);
  5721. b = Math.Abs(v.Y);
  5722. if(b > a)
  5723. a = b;
  5724. b= Math.Abs(v.Z);
  5725. if(b > a)
  5726. a = b;
  5727. if (a > max)
  5728. {
  5729. a = max / a;
  5730. v.X *= a;
  5731. v.Y *= a;
  5732. v.Z *= a;
  5733. }
  5734. }
  5735. protected void CreateImprovedTerseBlock(ISceneEntity entity, byte[] data, ref int pos, bool includeTexture)
  5736. {
  5737. #region ScenePresence/SOP Handling
  5738. bool avatar = (entity is ScenePresence);
  5739. uint localID = entity.LocalId;
  5740. uint attachPoint;
  5741. Vector4 collisionPlane;
  5742. Vector3 position, velocity, acceleration, angularVelocity;
  5743. Quaternion rotation;
  5744. byte datasize;
  5745. byte[] te = null;
  5746. if (avatar)
  5747. {
  5748. ScenePresence presence = (ScenePresence)entity;
  5749. position = presence.OffsetPosition;
  5750. velocity = presence.Velocity;
  5751. acceleration = Vector3.Zero;
  5752. rotation = presence.Rotation;
  5753. // tpvs can only see rotations around Z in some cases
  5754. if (!presence.Flying && !presence.IsSatOnObject)
  5755. {
  5756. rotation.X = 0f;
  5757. rotation.Y = 0f;
  5758. }
  5759. rotation.Normalize();
  5760. angularVelocity = presence.AngularVelocity;
  5761. // m_log.DebugFormat(
  5762. // "[LLCLIENTVIEW]: Sending terse update to {0} with position {1} in {2}", Name, presence.OffsetPosition, m_scene.Name);
  5763. attachPoint = presence.State;
  5764. collisionPlane = presence.CollisionPlane;
  5765. datasize = 60;
  5766. }
  5767. else
  5768. {
  5769. SceneObjectPart part = (SceneObjectPart)entity;
  5770. attachPoint = part.ParentGroup.AttachmentPoint;
  5771. attachPoint = ((attachPoint % 16) * 16 + (attachPoint / 16));
  5772. // m_log.DebugFormat(
  5773. // "[LLCLIENTVIEW]: Sending attachPoint {0} for {1} {2} to {3}",
  5774. // attachPoint, part.Name, part.LocalId, Name);
  5775. collisionPlane = Vector4.Zero;
  5776. position = part.RelativePosition;
  5777. velocity = part.Velocity;
  5778. acceleration = part.Acceleration;
  5779. angularVelocity = part.AngularVelocity;
  5780. rotation = part.RotationOffset;
  5781. datasize = 44;
  5782. if(includeTexture)
  5783. te = part.Shape.TextureEntry;
  5784. }
  5785. #endregion ScenePresence/SOP Handling
  5786. //object block size
  5787. data[pos++] = datasize;
  5788. // LocalID
  5789. Utils.UIntToBytes(localID, data, pos);
  5790. pos += 4;
  5791. data[pos++] = (byte)attachPoint;
  5792. // Avatar/CollisionPlane
  5793. if (avatar)
  5794. {
  5795. data[pos++] = 1;
  5796. if (collisionPlane == Vector4.Zero)
  5797. collisionPlane = Vector4.UnitW;
  5798. //m_log.DebugFormat("CollisionPlane: {0}",collisionPlane);
  5799. collisionPlane.ToBytes(data, pos);
  5800. pos += 16;
  5801. }
  5802. else
  5803. {
  5804. data[pos++] = 0;
  5805. }
  5806. // Position
  5807. position.ToBytes(data, pos);
  5808. pos += 12;
  5809. // Velocity
  5810. ClampVectorForUint(ref velocity, 128f);
  5811. Utils.FloatToUInt16Bytes(velocity.X, 128.0f, data, pos); pos += 2;
  5812. Utils.FloatToUInt16Bytes(velocity.Y, 128.0f, data, pos); pos += 2;
  5813. Utils.FloatToUInt16Bytes(velocity.Z, 128.0f, data, pos); pos += 2;
  5814. // Acceleration
  5815. ClampVectorForUint(ref acceleration, 64f);
  5816. Utils.FloatToUInt16Bytes(acceleration.X, 64.0f, data, pos); pos += 2;
  5817. Utils.FloatToUInt16Bytes(acceleration.Y, 64.0f, data, pos); pos += 2;
  5818. Utils.FloatToUInt16Bytes(acceleration.Z, 64.0f, data, pos); pos += 2;
  5819. // Rotation
  5820. Utils.FloatToUInt16Bytes(rotation.X, 1.0f, data, pos); pos += 2;
  5821. Utils.FloatToUInt16Bytes(rotation.Y, 1.0f, data, pos); pos += 2;
  5822. Utils.FloatToUInt16Bytes(rotation.Z, 1.0f, data, pos); pos += 2;
  5823. Utils.FloatToUInt16Bytes(rotation.W, 1.0f, data, pos); pos += 2;
  5824. // Angular Velocity
  5825. ClampVectorForUint(ref angularVelocity, 64f);
  5826. Utils.FloatToUInt16Bytes(angularVelocity.X, 64.0f, data, pos); pos += 2;
  5827. Utils.FloatToUInt16Bytes(angularVelocity.Y, 64.0f, data, pos); pos += 2;
  5828. Utils.FloatToUInt16Bytes(angularVelocity.Z, 64.0f, data, pos); pos += 2;
  5829. // texture entry block size
  5830. if(te == null)
  5831. {
  5832. data[pos++] = 0;
  5833. data[pos++] = 0;
  5834. }
  5835. else
  5836. {
  5837. int len = te.Length & 0x7fff;
  5838. int totlen = len + 4;
  5839. data[pos++] = (byte)totlen;
  5840. data[pos++] = (byte)(totlen >> 8);
  5841. data[pos++] = (byte)len; // wtf ???
  5842. data[pos++] = (byte)(len >> 8);
  5843. data[pos++] = 0;
  5844. data[pos++] = 0;
  5845. Buffer.BlockCopy(te, 0, data, pos, len);
  5846. pos += len;
  5847. }
  5848. // total size 63 or 47 + (texture size + 4)
  5849. }
  5850. protected void CreateAvatarUpdateBlock(ScenePresence data, byte[] dest, ref int pos)
  5851. {
  5852. Quaternion rotation = data.Rotation;
  5853. // tpvs can only see rotations around Z in some cases
  5854. if (!data.Flying && !data.IsSatOnObject)
  5855. {
  5856. rotation.X = 0f;
  5857. rotation.Y = 0f;
  5858. }
  5859. rotation.Normalize();
  5860. //Vector3 velocity = Vector3.Zero;
  5861. //Vector3 acceleration = Vector3.Zero;
  5862. //Vector3 angularvelocity = Vector3.Zero;
  5863. Utils.UIntToBytesSafepos(data.LocalId, dest, pos); pos += 4;
  5864. dest[pos++] = 0; // state
  5865. data.UUID.ToBytes(dest, pos); pos += 16;
  5866. Utils.UIntToBytesSafepos(0 , dest, pos); pos += 4; // crc
  5867. dest[pos++] = (byte)PCode.Avatar;
  5868. dest[pos++] = (byte)Material.Flesh;
  5869. dest[pos++] = 0; // clickaction
  5870. data.Appearance.AvatarSize.ToBytes(dest, pos); pos += 12;
  5871. // objectdata block
  5872. dest[pos++] = 76;
  5873. data.CollisionPlane.ToBytes(dest, pos); pos += 16;
  5874. data.OffsetPosition.ToBytes(dest, pos); pos += 12;
  5875. data.Velocity.ToBytes(dest, pos); pos += 12;
  5876. //acceleration.ToBytes(dest, pos); pos += 12;
  5877. Array.Clear(dest, pos, 12); pos += 12;
  5878. rotation.ToBytes(dest, pos); pos += 12;
  5879. //angularvelocity.ToBytes(dest, pos); pos += 12;
  5880. Array.Clear(dest, pos, 12); pos += 12;
  5881. SceneObjectPart parentPart = data.ParentPart;
  5882. if (parentPart != null)
  5883. {
  5884. Utils.UIntToBytesSafepos(parentPart.ParentGroup.LocalId, dest, pos);
  5885. pos += 4;
  5886. }
  5887. else
  5888. {
  5889. // Utils.UIntToBytesSafepos(0, dest, pos);
  5890. // pos += 4;
  5891. dest[pos++] = 0;
  5892. dest[pos++] = 0;
  5893. dest[pos++] = 0;
  5894. dest[pos++] = 0;
  5895. }
  5896. //Utils.UIntToBytesSafepos(0, dest, pos); pos += 4; //update flags
  5897. dest[pos++] = 0;
  5898. dest[pos++] = 0;
  5899. dest[pos++] = 0;
  5900. dest[pos++] = 0;
  5901. //pbs
  5902. dest[pos++] = 16;
  5903. dest[pos++] = 1;
  5904. //Utils.UInt16ToBytes(0, dest, pos); pos += 2;
  5905. //Utils.UInt16ToBytes(0, dest, pos); pos += 2;
  5906. dest[pos++] = 0;
  5907. dest[pos++] = 0;
  5908. dest[pos++] = 0;
  5909. dest[pos++] = 0;
  5910. dest[pos++] = 100;
  5911. dest[pos++] = 100;
  5912. // rest of pbs is 0 (15), texture entry (2) and texture anim (1)
  5913. const int pbszeros = 15 + 2 + 1;
  5914. Array.Clear(dest, pos, pbszeros); pos += pbszeros;
  5915. //NameValue
  5916. byte[] nv = Utils.StringToBytes("FirstName STRING RW SV " + data.Firstname + "\nLastName STRING RW SV " +
  5917. data.Lastname + "\nTitle STRING RW SV " + data.Grouptitle);
  5918. int len = nv.Length;
  5919. dest[pos++] = (byte)len;
  5920. dest[pos++] = (byte)(len >> 8);
  5921. Buffer.BlockCopy(nv, 0, dest, pos, len); pos += len;
  5922. // data(2), text(1), text color(4), media url(1), PBblock(1), ExtramParams(1),
  5923. // sound id(16), sound owner(16) gain (4), flags (1), radius (4)
  5924. // jointtype(1) joint pivot(12) joint offset(12)
  5925. const int lastzeros = 2 + 1 + 4 + 1 + 1 + 1 + 16 + 16 + 4 + 1 + 4 + 1 + 12 + 12;
  5926. Array.Clear(dest, pos, lastzeros); pos += lastzeros;
  5927. }
  5928. protected void CreateAvatarUpdateBlock(ScenePresence data, LLUDPZeroEncoder zc)
  5929. {
  5930. Quaternion rotation = data.Rotation;
  5931. // tpvs can only see rotations around Z in some cases
  5932. if (!data.Flying && !data.IsSatOnObject)
  5933. {
  5934. rotation.X = 0f;
  5935. rotation.Y = 0f;
  5936. }
  5937. rotation.Normalize();
  5938. zc.AddUInt(data.LocalId);
  5939. zc.AddByte(0);
  5940. zc.AddUUID(data.UUID);
  5941. zc.AddZeros(4); // crc unused
  5942. zc.AddByte((byte)PCode.Avatar);
  5943. zc.AddByte((byte)Material.Flesh);
  5944. zc.AddByte(0); // clickaction
  5945. zc.AddVector3(data.Appearance.AvatarSize);
  5946. // objectdata block
  5947. zc.AddByte(76); // fixed avatar block size
  5948. zc.AddVector4(data.CollisionPlane);
  5949. zc.AddVector3(data.OffsetPosition);
  5950. zc.AddVector3(data.Velocity);
  5951. //zc.AddVector3(acceleration);
  5952. zc.AddZeros(12);
  5953. zc.AddNormQuat(rotation);
  5954. //zc.AddVector3(angularvelocity);
  5955. zc.AddZeros(12);
  5956. SceneObjectPart parentPart = data.ParentPart;
  5957. if (parentPart != null)
  5958. zc.AddUInt(parentPart.ParentGroup.LocalId);
  5959. else
  5960. zc.AddZeros(4);
  5961. zc.AddZeros(4); //update flags
  5962. //pbs volume data 23
  5963. //texture entry 2
  5964. //texture anim (1)
  5965. const int pbszeros = 23 + 2 + 1;
  5966. zc.AddZeros(pbszeros);
  5967. //NameValue
  5968. byte[] nv = Utils.StringToBytes("FirstName STRING RW SV " + data.Firstname + "\nLastName STRING RW SV " +
  5969. data.Lastname + "\nTitle STRING RW SV " + data.Grouptitle);
  5970. int len = nv.Length;
  5971. zc.AddByte((byte)len);
  5972. zc.AddByte((byte)(len >> 8));
  5973. zc.AddBytes(nv, len);
  5974. // data(2), text(1), text color(4), media url(1), PBblock(1), ExtramParams(1),
  5975. // sound id(16), sound owner(16) gain (4), flags (1), radius (4)
  5976. // jointtype(1) joint pivot(12) joint offset(12)
  5977. const int lastzeros = 2 + 1 + 4 + 1 + 1 + 1 + 16 + 16 + 4 + 1 + 4 + 1 + 12 + 12;
  5978. zc.AddZeros(lastzeros);
  5979. }
  5980. protected void CreatePrimUpdateBlock(SceneObjectPart part, ScenePresence sp, LLUDPZeroEncoder zc)
  5981. {
  5982. // prepare data
  5983. #region PrimFlags
  5984. // prim/update flags
  5985. PrimFlags primflags = (PrimFlags)m_scene.Permissions.GenerateClientFlags(part, sp);
  5986. // Don't send the CreateSelected flag to everyone
  5987. primflags &= ~PrimFlags.CreateSelected;
  5988. if (sp.UUID == part.OwnerID)
  5989. {
  5990. if (part.CreateSelected)
  5991. {
  5992. // Only send this flag once, then unset it
  5993. primflags |= PrimFlags.CreateSelected;
  5994. part.CreateSelected = false;
  5995. }
  5996. }
  5997. #endregion PrimFlags
  5998. // data block
  5999. byte[] data = null;
  6000. byte state = part.Shape.State;
  6001. PCode pcode = (PCode)part.Shape.PCode;
  6002. //vegetation is special so just do it inline
  6003. if(pcode == PCode.Grass || pcode == PCode.Tree || pcode == PCode.NewTree)
  6004. {
  6005. zc.AddUInt(part.LocalId);
  6006. zc.AddByte(state); // state
  6007. zc.AddUUID(part.UUID);
  6008. zc.AddUInt((uint)part.ParentGroup.PseudoCRC);
  6009. zc.AddByte((byte)pcode);
  6010. // material 1
  6011. // clickaction 1
  6012. zc.AddZeros(2);
  6013. zc.AddVector3(part.Shape.Scale);
  6014. // objectdata block
  6015. zc.AddByte(60); // fixed object block size
  6016. zc.AddVector3(part.RelativePosition);
  6017. if (pcode == PCode.Grass)
  6018. zc.AddZeros(48);
  6019. else
  6020. {
  6021. zc.AddZeros(24);
  6022. Quaternion rot = part.RotationOffset;
  6023. rot.Normalize();
  6024. zc.AddNormQuat(rot);
  6025. zc.AddZeros(12);
  6026. }
  6027. zc.AddUInt(part.ParentID);
  6028. zc.AddUInt((uint)primflags); //update flags
  6029. /*
  6030. if (pcode == PCode.Grass)
  6031. {
  6032. //pbs volume data 23
  6033. //texture entry 2
  6034. //texture anim 1
  6035. //name value 2
  6036. // data 1
  6037. // text 5
  6038. // media url 1
  6039. // particle system 1
  6040. // Extraparams 1
  6041. // sound id 16
  6042. // ownwer 16
  6043. // sound gain 4
  6044. // sound flags 1
  6045. // sound radius 4
  6046. // jointtype 1
  6047. // joint pivot 12
  6048. // joint offset 12
  6049. zc.AddZeros(23 + 2 + 1 + 2 + 1 + 5 + 1 + 1 + 1 + 16 + 16 + 4 + 1 + 4 + 1 + 12 + 12);
  6050. return;
  6051. }
  6052. */
  6053. //pbs volume data 23
  6054. //texture entry 2
  6055. //texture anim 1
  6056. //name value 2
  6057. zc.AddZeros(23 + 2 + 1 + 2);
  6058. //data: the tree type
  6059. zc.AddByte(1);
  6060. zc.AddZeros(1);
  6061. zc.AddByte(state);
  6062. // text 5
  6063. // media url 1
  6064. // particle system 1
  6065. // Extraparams 1
  6066. // sound id 16
  6067. // ownwer 16
  6068. // sound gain 4
  6069. // sound flags 1
  6070. // sound radius 4
  6071. // jointtype 1
  6072. // joint pivot 12
  6073. // joint offset 12
  6074. zc.AddZeros(5 + 1 + 1 + 1 + 16 + 16 + 4 + 1 + 4 + 1 + 12 + 12);
  6075. return;
  6076. }
  6077. //NameValue and state
  6078. byte[] nv = null;
  6079. if (part.ParentGroup.IsAttachment)
  6080. {
  6081. if (part.IsRoot)
  6082. nv = Util.StringToBytes256("AttachItemID STRING RW SV " + part.ParentGroup.FromItemID);
  6083. int st = (int)part.ParentGroup.AttachmentPoint;
  6084. state = (byte)(((st & 0xf0) >> 4) + ((st & 0x0f) << 4)); ;
  6085. }
  6086. // filter out mesh faces hack
  6087. ushort profileBegin = part.Shape.ProfileBegin;
  6088. ushort profileHollow = part.Shape.ProfileHollow;
  6089. byte profileCurve = part.Shape.ProfileCurve;
  6090. byte pathScaleY = part.Shape.PathScaleY;
  6091. if (part.Shape.SculptType == (byte)SculptType.Mesh) // filter out hack
  6092. {
  6093. profileCurve = (byte)(part.Shape.ProfileCurve & 0x0f);
  6094. // fix old values that confused viewers
  6095. if (profileBegin == 1)
  6096. profileBegin = 9375;
  6097. if (profileHollow == 1)
  6098. profileHollow = 27500;
  6099. // fix torus hole size Y that also confuse some viewers
  6100. if (profileCurve == (byte)ProfileShape.Circle && pathScaleY < 150)
  6101. pathScaleY = 150;
  6102. }
  6103. // do encode the things
  6104. zc.AddUInt(part.LocalId);
  6105. zc.AddByte(state); // state
  6106. zc.AddUUID(part.UUID);
  6107. zc.AddUInt((uint)part.ParentGroup.PseudoCRC);
  6108. zc.AddByte((byte)pcode);
  6109. zc.AddByte(part.Material);
  6110. zc.AddByte(part.ClickAction); // clickaction
  6111. zc.AddVector3(part.Shape.Scale);
  6112. // objectdata block
  6113. zc.AddByte(60); // fixed object block size
  6114. zc.AddVector3(part.RelativePosition);
  6115. zc.AddVector3(part.Velocity);
  6116. zc.AddVector3(part.Acceleration);
  6117. Quaternion rotation = part.RotationOffset;
  6118. rotation.Normalize();
  6119. zc.AddNormQuat(rotation);
  6120. zc.AddVector3(part.AngularVelocity);
  6121. zc.AddUInt(part.ParentID);
  6122. zc.AddUInt((uint)primflags); //update flags
  6123. //pbs
  6124. zc.AddByte(part.Shape.PathCurve);
  6125. zc.AddByte(profileCurve);
  6126. zc.AddUInt16(part.Shape.PathBegin);
  6127. zc.AddUInt16(part.Shape.PathEnd);
  6128. zc.AddByte(part.Shape.PathScaleX);
  6129. zc.AddByte(pathScaleY);
  6130. zc.AddByte(part.Shape.PathShearX);
  6131. zc.AddByte(part.Shape.PathShearY);
  6132. zc.AddByte((byte)part.Shape.PathTwist);
  6133. zc.AddByte((byte)part.Shape.PathTwistBegin);
  6134. zc.AddByte((byte)part.Shape.PathRadiusOffset);
  6135. zc.AddByte((byte)part.Shape.PathTaperX);
  6136. zc.AddByte((byte)part.Shape.PathTaperY);
  6137. zc.AddByte(part.Shape.PathRevolutions);
  6138. zc.AddByte((byte)part.Shape.PathSkew);
  6139. zc.AddUInt16(profileBegin);
  6140. zc.AddUInt16(part.Shape.ProfileEnd);
  6141. zc.AddUInt16(profileHollow);
  6142. // texture
  6143. byte[] tentry = part.Shape.TextureEntry;
  6144. if (tentry == null)
  6145. zc.AddZeros(2);
  6146. else
  6147. {
  6148. int len = tentry.Length;
  6149. zc.AddByte((byte)len);
  6150. zc.AddByte((byte)(len >> 8));
  6151. zc.AddBytes(tentry, len);
  6152. }
  6153. // texture animation
  6154. byte[] tanim = part.TextureAnimation;
  6155. if (tanim == null)
  6156. zc.AddZeros(1);
  6157. else
  6158. {
  6159. int len = tanim.Length;
  6160. zc.AddByte((byte)len);
  6161. zc.AddBytes(tanim, len);
  6162. }
  6163. //NameValue
  6164. if(nv == null)
  6165. zc.AddZeros(2);
  6166. else
  6167. {
  6168. int len = nv.Length;
  6169. zc.AddByte((byte)len);
  6170. zc.AddByte((byte)(len >> 8));
  6171. zc.AddBytes(nv, len);
  6172. }
  6173. // data
  6174. if (data == null)
  6175. zc.AddZeros(2);
  6176. else
  6177. {
  6178. int len = data.Length;
  6179. zc.AddByte((byte)len);
  6180. zc.AddByte((byte)(len >> 8));
  6181. zc.AddBytes(data, len);
  6182. }
  6183. //text
  6184. if (part.Text == null || part.Text.Length == 0)
  6185. zc.AddZeros(5);
  6186. else
  6187. {
  6188. zc.AddShortString(part.Text, 255);
  6189. //textcolor
  6190. byte[] tc = part.GetTextColor().GetBytes(false);
  6191. zc.AddBytes(tc, 4);
  6192. }
  6193. //media url
  6194. if (part.MediaUrl == null || part.MediaUrl.Length == 0)
  6195. zc.AddZeros(1);
  6196. else
  6197. zc.AddShortString(part.MediaUrl, 255);
  6198. bool hasps = false;
  6199. //particle system
  6200. byte[] ps = part.ParticleSystem;
  6201. if (ps == null || ps.Length < 1)
  6202. zc.AddZeros(1);
  6203. else
  6204. {
  6205. int len = ps.Length;
  6206. zc.AddByte((byte)len);
  6207. zc.AddBytes(ps, len);
  6208. hasps = true;
  6209. }
  6210. //Extraparams
  6211. byte[] ep = part.Shape.ExtraParams;
  6212. if (ep == null || ep.Length < 2)
  6213. zc.AddZeros(1);
  6214. else
  6215. {
  6216. int len = ep.Length;
  6217. zc.AddByte((byte)len);
  6218. zc.AddBytes(ep, len);
  6219. }
  6220. bool hassound = part.Sound != UUID.Zero || part.SoundFlags != 0;
  6221. if (hassound)
  6222. zc.AddUUID(part.Sound);
  6223. else
  6224. zc.AddZeros(16);
  6225. if (hassound || hasps)
  6226. zc.AddUUID(part.OwnerID);
  6227. else
  6228. zc.AddZeros(16);
  6229. if (hassound)
  6230. {
  6231. zc.AddFloat((float)part.SoundGain);
  6232. zc.AddByte(part.SoundFlags);
  6233. zc.AddFloat((float)part.SoundRadius);
  6234. }
  6235. else
  6236. zc.AddZeros(9);
  6237. // jointtype(1) joint pivot(12) joint offset(12)
  6238. const int lastzeros = 1 + 12 + 12;
  6239. zc.AddZeros(lastzeros);
  6240. }
  6241. [Flags]
  6242. private enum CompressedFlags : uint
  6243. {
  6244. None = 0x00,
  6245. /// <summary>Unknown</summary>
  6246. ScratchPad = 0x01,
  6247. /// <summary>Whether the object has a TreeSpecies</summary>
  6248. Tree = 0x02,
  6249. /// <summary>Whether the object has floating text ala llSetText</summary>
  6250. HasText = 0x04,
  6251. /// <summary>Whether the object has an active particle system</summary>
  6252. HasParticlesLegacy = 0x08,
  6253. /// <summary>Whether the object has sound attached to it</summary>
  6254. HasSound = 0x10,
  6255. /// <summary>Whether the object is attached to a root object or not</summary>
  6256. HasParent = 0x20,
  6257. /// <summary>Whether the object has texture animation settings</summary>
  6258. TextureAnimation = 0x40,
  6259. /// <summary>Whether the object has an angular velocity</summary>
  6260. HasAngularVelocity = 0x80,
  6261. /// <summary>Whether the object has a name value pairs string</summary>
  6262. HasNameValues = 0x100,
  6263. /// <summary>Whether the object has a Media URL set</summary>
  6264. MediaURL = 0x200,
  6265. HasParticlesNew = 0x400
  6266. }
  6267. /*
  6268. protected void CreateCompressedUpdateBlock(SceneObjectPart part, ScenePresence sp, byte[] dest, ref int pos)
  6269. {
  6270. // prepare data
  6271. CompressedFlags cflags = CompressedFlags.None;
  6272. // prim/update flags
  6273. PrimFlags primflags = (PrimFlags)m_scene.Permissions.GenerateClientFlags(part, sp);
  6274. // Don't send the CreateSelected flag to everyone
  6275. primflags &= ~PrimFlags.CreateSelected;
  6276. if (sp.UUID == part.OwnerID)
  6277. {
  6278. if (part.CreateSelected)
  6279. {
  6280. // Only send this flag once, then unset it
  6281. primflags |= PrimFlags.CreateSelected;
  6282. part.CreateSelected = false;
  6283. }
  6284. }
  6285. byte state = part.Shape.State;
  6286. PCode pcode = (PCode)part.Shape.PCode;
  6287. bool hastree = false;
  6288. if (pcode == PCode.Grass || pcode == PCode.Tree || pcode == PCode.NewTree)
  6289. {
  6290. cflags |= CompressedFlags.Tree;
  6291. hastree = true;
  6292. }
  6293. //NameValue and state
  6294. byte[] nv = null;
  6295. if (part.ParentGroup.IsAttachment)
  6296. {
  6297. if (part.IsRoot)
  6298. nv = Util.StringToBytes256("AttachItemID STRING RW SV " + part.ParentGroup.FromItemID);
  6299. int st = (int)part.ParentGroup.AttachmentPoint;
  6300. state = (byte)(((st & 0xf0) >> 4) + ((st & 0x0f) << 4)); ;
  6301. }
  6302. bool hastext = part.Text != null && part.Text.Length > 0;
  6303. bool hassound = part.Sound != UUID.Zero || part.SoundFlags != 0;
  6304. bool hasps = part.ParticleSystem != null && part.ParticleSystem.Length > 1;
  6305. bool hastexanim = part.TextureAnimation != null && part.TextureAnimation.Length > 0;
  6306. bool hasangvel = part.AngularVelocity.LengthSquared() > 1e-8f;
  6307. bool hasmediaurl = part.MediaUrl != null && part.MediaUrl.Length > 1;
  6308. bool haspsnew = false;
  6309. if (hastext)
  6310. cflags |= CompressedFlags.HasText;
  6311. if (hasps)
  6312. {
  6313. if(part.ParticleSystem.Length > 86)
  6314. {
  6315. hasps= false;
  6316. cflags |= CompressedFlags.HasParticlesNew;
  6317. haspsnew = true;
  6318. }
  6319. else
  6320. cflags |= CompressedFlags.HasParticlesLegacy;
  6321. }
  6322. if (hassound)
  6323. cflags |= CompressedFlags.HasSound;
  6324. if (part.ParentID != 0)
  6325. cflags |= CompressedFlags.HasParent;
  6326. if (hastexanim)
  6327. cflags |= CompressedFlags.TextureAnimation;
  6328. if (hasangvel)
  6329. cflags |= CompressedFlags.HasAngularVelocity;
  6330. if (hasmediaurl)
  6331. cflags |= CompressedFlags.MediaURL;
  6332. if (nv != null)
  6333. cflags |= CompressedFlags.HasNameValues;
  6334. // filter out mesh faces hack
  6335. ushort profileBegin = part.Shape.ProfileBegin;
  6336. ushort profileHollow = part.Shape.ProfileHollow;
  6337. byte profileCurve = part.Shape.ProfileCurve;
  6338. byte pathScaleY = part.Shape.PathScaleY;
  6339. if (part.Shape.SculptType == (byte)SculptType.Mesh) // filter out hack
  6340. {
  6341. profileCurve = (byte)(part.Shape.ProfileCurve & 0x0f);
  6342. // fix old values that confused viewers
  6343. if (profileBegin == 1)
  6344. profileBegin = 9375;
  6345. if (profileHollow == 1)
  6346. profileHollow = 27500;
  6347. // fix torus hole size Y that also confuse some viewers
  6348. if (profileCurve == (byte)ProfileShape.Circle && pathScaleY < 150)
  6349. pathScaleY = 150;
  6350. }
  6351. // first is primFlags
  6352. Utils.UIntToBytesSafepos((uint)primflags, dest, pos); pos += 4;
  6353. // datablock len to fill later
  6354. int lenpos = pos;
  6355. pos += 2;
  6356. // data block
  6357. part.UUID.ToBytes(dest, pos); pos += 16;
  6358. Utils.UIntToBytesSafepos(part.LocalId, dest, pos); pos += 4;
  6359. dest[pos++] = (byte)pcode;
  6360. dest[pos++] = state;
  6361. Utils.UIntToBytesSafepos((uint)part.ParentGroup.PseudoCRC, dest, pos); pos += 4;
  6362. dest[pos++] = part.Material;
  6363. dest[pos++] = part.ClickAction;
  6364. part.Shape.Scale.ToBytes(dest, pos); pos += 12;
  6365. part.RelativePosition.ToBytes(dest, pos); pos += 12;
  6366. if(pcode == PCode.Grass)
  6367. Vector3.Zero.ToBytes(dest, pos);
  6368. else
  6369. {
  6370. Quaternion rotation = part.RotationOffset;
  6371. rotation.Normalize();
  6372. rotation.ToBytes(dest, pos);
  6373. }
  6374. pos += 12;
  6375. Utils.UIntToBytesSafepos((uint)cflags, dest, pos); pos += 4;
  6376. if (hasps || haspsnew || hassound)
  6377. part.OwnerID.ToBytes(dest, pos);
  6378. else
  6379. UUID.Zero.ToBytes(dest, pos);
  6380. pos += 16;
  6381. if (hasangvel)
  6382. {
  6383. part.AngularVelocity.ToBytes(dest, pos); pos += 12;
  6384. }
  6385. if (part.ParentID != 0)
  6386. {
  6387. Utils.UIntToBytesSafepos(part.ParentID, dest, pos); pos += 4;
  6388. }
  6389. if (hastree)
  6390. dest[pos++] = state;
  6391. if (hastext)
  6392. {
  6393. byte[] text = Util.StringToBytes256(part.Text); // must be null term
  6394. Buffer.BlockCopy(text, 0, dest, pos, text.Length); pos += text.Length;
  6395. byte[] tc = part.GetTextColor().GetBytes(false);
  6396. Buffer.BlockCopy(tc, 0, dest, pos, tc.Length); pos += tc.Length;
  6397. }
  6398. if (hasmediaurl)
  6399. {
  6400. byte[] mu = Util.StringToBytes256(part.MediaUrl); // must be null term
  6401. Buffer.BlockCopy(mu, 0, dest, pos, mu.Length); pos += mu.Length;
  6402. }
  6403. if (hasps)
  6404. {
  6405. byte[] ps = part.ParticleSystem;
  6406. Buffer.BlockCopy(ps, 0, dest, pos, ps.Length); pos += ps.Length;
  6407. }
  6408. byte[] ex = part.Shape.ExtraParams;
  6409. if (ex == null || ex.Length < 2)
  6410. dest[pos++] = 0;
  6411. else
  6412. {
  6413. Buffer.BlockCopy(ex, 0, dest, pos, ex.Length); pos += ex.Length;
  6414. }
  6415. if (hassound)
  6416. {
  6417. part.Sound.ToBytes(dest, pos); pos += 16;
  6418. Utils.FloatToBytesSafepos((float)part.SoundGain, dest, pos); pos += 4;
  6419. dest[pos++] = part.SoundFlags;
  6420. Utils.FloatToBytesSafepos((float)part.SoundRadius, dest, pos); pos += 4;
  6421. }
  6422. if (nv != null)
  6423. {
  6424. Buffer.BlockCopy(nv, 0, dest, pos, nv.Length); pos += nv.Length;
  6425. }
  6426. dest[pos++] = part.Shape.PathCurve;
  6427. Utils.UInt16ToBytes(part.Shape.PathBegin, dest, pos); pos += 2;
  6428. Utils.UInt16ToBytes(part.Shape.PathEnd, dest, pos); pos += 2;
  6429. dest[pos++] = part.Shape.PathScaleX;
  6430. dest[pos++] = pathScaleY;
  6431. dest[pos++] = part.Shape.PathShearX;
  6432. dest[pos++] = part.Shape.PathShearY;
  6433. dest[pos++] = (byte)part.Shape.PathTwist;
  6434. dest[pos++] = (byte)part.Shape.PathTwistBegin;
  6435. dest[pos++] = (byte)part.Shape.PathRadiusOffset;
  6436. dest[pos++] = (byte)part.Shape.PathTaperX;
  6437. dest[pos++] = (byte)part.Shape.PathTaperY;
  6438. dest[pos++] = part.Shape.PathRevolutions;
  6439. dest[pos++] = (byte)part.Shape.PathSkew;
  6440. dest[pos++] = profileCurve;
  6441. Utils.UInt16ToBytes(profileBegin, dest, pos); pos += 2;
  6442. Utils.UInt16ToBytes(part.Shape.ProfileEnd, dest, pos); pos += 2;
  6443. Utils.UInt16ToBytes(profileHollow, dest, pos); pos += 2;
  6444. byte[] te = part.Shape.TextureEntry;
  6445. if (te == null)
  6446. {
  6447. dest[pos++] = 0;
  6448. dest[pos++] = 0;
  6449. dest[pos++] = 0;
  6450. dest[pos++] = 0;
  6451. }
  6452. else
  6453. {
  6454. int len = te.Length & 0x7fff;
  6455. dest[pos++] = (byte)len;
  6456. dest[pos++] = (byte)(len >> 8);
  6457. dest[pos++] = 0;
  6458. dest[pos++] = 0;
  6459. Buffer.BlockCopy(te, 0, dest, pos, len);
  6460. pos += len;
  6461. }
  6462. if (hastexanim)
  6463. {
  6464. byte[] ta = part.TextureAnimation;
  6465. int len = ta.Length & 0x7fff;
  6466. dest[pos++] = (byte)len;
  6467. dest[pos++] = (byte)(len >> 8);
  6468. dest[pos++] = 0;
  6469. dest[pos++] = 0;
  6470. Buffer.BlockCopy(ta, 0, dest, pos, len);
  6471. pos += len;
  6472. }
  6473. if (haspsnew)
  6474. {
  6475. byte[] ps = part.ParticleSystem;
  6476. Buffer.BlockCopy(ps, 0, dest, pos, ps.Length); pos += ps.Length;
  6477. }
  6478. int totlen = pos - lenpos - 2;
  6479. dest[lenpos++] = (byte)totlen;
  6480. dest[lenpos++] = (byte)(totlen >> 8);
  6481. }
  6482. */
  6483. protected void CreateCompressedUpdateBlockZC(SceneObjectPart part, ScenePresence sp, LLUDPZeroEncoder zc)
  6484. {
  6485. // prepare data
  6486. CompressedFlags cflags = CompressedFlags.None;
  6487. // prim/update flags
  6488. PrimFlags primflags = (PrimFlags)m_scene.Permissions.GenerateClientFlags(part, sp);
  6489. // Don't send the CreateSelected flag to everyone
  6490. primflags &= ~PrimFlags.CreateSelected;
  6491. if (sp.UUID == part.OwnerID)
  6492. {
  6493. if (part.CreateSelected)
  6494. {
  6495. // Only send this flag once, then unset it
  6496. primflags |= PrimFlags.CreateSelected;
  6497. part.CreateSelected = false;
  6498. }
  6499. }
  6500. byte state = part.Shape.State;
  6501. PCode pcode = (PCode)part.Shape.PCode;
  6502. // trees and grass are a lot more compact
  6503. if (pcode == PCode.Grass || pcode == PCode.Tree || pcode == PCode.NewTree)
  6504. {
  6505. // first is primFlags
  6506. zc.AddUInt((uint)primflags);
  6507. // datablock len
  6508. zc.AddByte(113);
  6509. zc.AddZeros(1);
  6510. // data block
  6511. zc.AddUUID(part.UUID);
  6512. zc.AddUInt(part.LocalId);
  6513. zc.AddByte((byte)pcode);
  6514. zc.AddByte(state);
  6515. zc.AddUInt((uint)part.ParentGroup.PseudoCRC);
  6516. zc.AddZeros(2); // material and click action
  6517. zc.AddVector3(part.Shape.Scale);
  6518. zc.AddVector3(part.RelativePosition);
  6519. if (pcode == PCode.Grass)
  6520. zc.AddZeros(12);
  6521. else
  6522. {
  6523. Quaternion rotation = part.RotationOffset;
  6524. rotation.Normalize();
  6525. zc.AddNormQuat(rotation);
  6526. }
  6527. zc.AddUInt((uint)CompressedFlags.Tree); // cflags
  6528. zc.AddZeros(16); // owner id
  6529. zc.AddByte(state); // tree parameter
  6530. zc.AddZeros(28); //extraparameters 1, pbs 23, texture 4
  6531. return;
  6532. }
  6533. //NameValue and state
  6534. byte[] nv = null;
  6535. if (part.ParentGroup.IsAttachment)
  6536. {
  6537. if (part.IsRoot)
  6538. nv = Util.StringToBytes256("AttachItemID STRING RW SV " + part.ParentGroup.FromItemID);
  6539. int st = (int)part.ParentGroup.AttachmentPoint;
  6540. state = (byte)(((st & 0xf0) >> 4) + ((st & 0x0f) << 4)); ;
  6541. }
  6542. bool hastext = false;
  6543. bool hassound = false;
  6544. bool hasps = false;
  6545. bool hastexanim = false;
  6546. bool hasangvel = false;
  6547. bool hasmediaurl = false;
  6548. bool haspsnew = false;
  6549. int BlockLengh = 111;
  6550. byte[] extraParamBytes = part.Shape.ExtraParams;
  6551. if (extraParamBytes == null || extraParamBytes.Length < 2)
  6552. {
  6553. ++BlockLengh;
  6554. extraParamBytes = null;
  6555. }
  6556. else
  6557. BlockLengh += extraParamBytes.Length;
  6558. byte[] hoverText = null;
  6559. byte[] hoverTextColor = null;
  6560. if (part.Text != null && part.Text.Length > 0)
  6561. {
  6562. cflags |= CompressedFlags.HasText;
  6563. hoverText = Util.StringToBytes256(part.Text);
  6564. BlockLengh += hoverText.Length;
  6565. hoverTextColor = part.GetTextColor().GetBytes(false);
  6566. BlockLengh += hoverTextColor.Length;
  6567. hastext = true;
  6568. }
  6569. if (part.ParticleSystem != null && part.ParticleSystem.Length > 1)
  6570. {
  6571. BlockLengh += part.ParticleSystem.Length;
  6572. if (part.ParticleSystem.Length > 86)
  6573. {
  6574. hasps = false;
  6575. cflags |= CompressedFlags.HasParticlesNew;
  6576. haspsnew = true;
  6577. }
  6578. else
  6579. {
  6580. cflags |= CompressedFlags.HasParticlesLegacy;
  6581. hasps = true;
  6582. }
  6583. }
  6584. if (part.Sound != UUID.Zero || part.SoundFlags != 0)
  6585. {
  6586. BlockLengh += 25;
  6587. cflags |= CompressedFlags.HasSound;
  6588. hassound = true;
  6589. }
  6590. if (part.ParentID != 0)
  6591. {
  6592. BlockLengh += 4;
  6593. cflags |= CompressedFlags.HasParent;
  6594. }
  6595. if (part.TextureAnimation != null && part.TextureAnimation.Length > 0)
  6596. {
  6597. BlockLengh += part.TextureAnimation.Length + 4;
  6598. cflags |= CompressedFlags.TextureAnimation;
  6599. hastexanim = true;
  6600. }
  6601. if (part.AngularVelocity.LengthSquared() > 1e-8f)
  6602. {
  6603. BlockLengh += 12;
  6604. cflags |= CompressedFlags.HasAngularVelocity;
  6605. hasangvel = true;
  6606. }
  6607. byte[] mediaURLBytes = null;
  6608. if (part.MediaUrl != null && part.MediaUrl.Length > 1)
  6609. {
  6610. mediaURLBytes = Util.StringToBytes256(part.MediaUrl); // must be null term
  6611. BlockLengh += mediaURLBytes.Length;
  6612. cflags |= CompressedFlags.MediaURL;
  6613. hasmediaurl = true;
  6614. }
  6615. if (nv != null)
  6616. {
  6617. BlockLengh += nv.Length;
  6618. cflags |= CompressedFlags.HasNameValues;
  6619. }
  6620. byte[] textureEntry = part.Shape.TextureEntry;
  6621. if(textureEntry != null)
  6622. BlockLengh += textureEntry.Length;
  6623. // filter out mesh faces hack
  6624. ushort profileBegin = part.Shape.ProfileBegin;
  6625. ushort profileHollow = part.Shape.ProfileHollow;
  6626. byte profileCurve = part.Shape.ProfileCurve;
  6627. byte pathScaleY = part.Shape.PathScaleY;
  6628. if (part.Shape.SculptType == (byte)SculptType.Mesh) // filter out hack
  6629. {
  6630. profileCurve = (byte)(part.Shape.ProfileCurve & 0x0f);
  6631. // fix old values that confused viewers
  6632. if (profileBegin == 1)
  6633. profileBegin = 9375;
  6634. if (profileHollow == 1)
  6635. profileHollow = 27500;
  6636. // fix torus hole size Y that also confuse some viewers
  6637. if (profileCurve == (byte)ProfileShape.Circle && pathScaleY < 150)
  6638. pathScaleY = 150;
  6639. }
  6640. // first is primFlags
  6641. zc.AddUInt((uint)primflags);
  6642. // datablock len
  6643. zc.AddByte((byte)BlockLengh);
  6644. zc.AddByte((byte)(BlockLengh >> 8));
  6645. // data block
  6646. zc.AddUUID(part.UUID);
  6647. zc.AddUInt(part.LocalId);
  6648. zc.AddByte((byte)pcode);
  6649. zc.AddByte(state);
  6650. zc.AddUInt((uint)part.ParentGroup.PseudoCRC);
  6651. zc.AddByte(part.Material);
  6652. zc.AddByte(part.ClickAction);
  6653. zc.AddVector3(part.Shape.Scale);
  6654. zc.AddVector3(part.RelativePosition);
  6655. if (pcode == PCode.Grass)
  6656. zc.AddZeros(12);
  6657. else
  6658. {
  6659. Quaternion rotation = part.RotationOffset;
  6660. rotation.Normalize();
  6661. zc.AddNormQuat(rotation);
  6662. }
  6663. zc.AddUInt((uint)cflags);
  6664. if (hasps || haspsnew || hassound)
  6665. zc.AddUUID(part.OwnerID);
  6666. else
  6667. zc.AddZeros(16);
  6668. if (hasangvel)
  6669. {
  6670. zc.AddVector3(part.AngularVelocity);
  6671. }
  6672. if (part.ParentID != 0)
  6673. {
  6674. zc.AddUInt(part.ParentID);
  6675. }
  6676. if (hastext)
  6677. {
  6678. zc.AddBytes(hoverText, hoverText.Length);
  6679. zc.AddBytes(hoverTextColor, hoverTextColor.Length);
  6680. }
  6681. if (hasmediaurl)
  6682. {
  6683. zc.AddBytes(mediaURLBytes, mediaURLBytes.Length);
  6684. }
  6685. if (hasps)
  6686. {
  6687. byte[] ps = part.ParticleSystem;
  6688. zc.AddBytes(ps, ps.Length);
  6689. }
  6690. if (extraParamBytes == null)
  6691. zc.AddZeros(1);
  6692. else
  6693. {
  6694. zc.AddBytes(extraParamBytes, extraParamBytes.Length);
  6695. }
  6696. if (hassound)
  6697. {
  6698. zc.AddUUID(part.Sound);
  6699. zc.AddFloat((float)part.SoundGain);
  6700. zc.AddByte(part.SoundFlags);
  6701. zc.AddFloat((float)part.SoundRadius);
  6702. }
  6703. if (nv != null)
  6704. {
  6705. zc.AddBytes(nv, nv.Length);
  6706. }
  6707. zc.AddByte(part.Shape.PathCurve);
  6708. zc.AddUInt16(part.Shape.PathBegin);
  6709. zc.AddUInt16(part.Shape.PathEnd);
  6710. zc.AddByte(part.Shape.PathScaleX);
  6711. zc.AddByte(pathScaleY);
  6712. zc.AddByte(part.Shape.PathShearX);
  6713. zc.AddByte(part.Shape.PathShearY);
  6714. zc.AddByte((byte)part.Shape.PathTwist);
  6715. zc.AddByte((byte)part.Shape.PathTwistBegin);
  6716. zc.AddByte((byte)part.Shape.PathRadiusOffset);
  6717. zc.AddByte((byte)part.Shape.PathTaperX);
  6718. zc.AddByte((byte)part.Shape.PathTaperY);
  6719. zc.AddByte(part.Shape.PathRevolutions);
  6720. zc.AddByte((byte)part.Shape.PathSkew);
  6721. zc.AddByte(profileCurve);
  6722. zc.AddUInt16(profileBegin);
  6723. zc.AddUInt16(part.Shape.ProfileEnd);
  6724. zc.AddUInt16(profileHollow);
  6725. if (textureEntry == null)
  6726. {
  6727. zc.AddZeros(4);
  6728. }
  6729. else
  6730. {
  6731. int len = textureEntry.Length;
  6732. zc.AddByte((byte)len);
  6733. zc.AddByte((byte)(len >> 8));
  6734. zc.AddZeros(2);
  6735. zc.AddBytes(textureEntry, len);
  6736. }
  6737. if (hastexanim)
  6738. {
  6739. byte[] ta = part.TextureAnimation;
  6740. int len = ta.Length;
  6741. zc.AddByte((byte)len);
  6742. zc.AddByte((byte)(len >> 8));
  6743. zc.AddZeros(2);
  6744. zc.AddBytes(ta, len);
  6745. }
  6746. if (haspsnew)
  6747. {
  6748. byte[] ps = part.ParticleSystem;
  6749. zc.AddBytes(ps, ps.Length);
  6750. }
  6751. }
  6752. public void SendNameReply(UUID profileId, string firstname, string lastname)
  6753. {
  6754. UUIDNameReplyPacket packet = (UUIDNameReplyPacket)PacketPool.Instance.GetPacket(PacketType.UUIDNameReply);
  6755. // TODO: don't create new blocks if recycling an old packet
  6756. packet.UUIDNameBlock = new UUIDNameReplyPacket.UUIDNameBlockBlock[1];
  6757. packet.UUIDNameBlock[0] = new UUIDNameReplyPacket.UUIDNameBlockBlock();
  6758. packet.UUIDNameBlock[0].ID = profileId;
  6759. packet.UUIDNameBlock[0].FirstName = Util.StringToBytes256(firstname);
  6760. packet.UUIDNameBlock[0].LastName = Util.StringToBytes256(lastname);
  6761. OutPacket(packet, ThrottleOutPacketType.Task);
  6762. }
  6763. public Dictionary<UUID, ulong> GetGroupPowers()
  6764. {
  6765. lock(m_groupPowers)
  6766. {
  6767. return new Dictionary<UUID, ulong>(m_groupPowers);
  6768. }
  6769. }
  6770. public void SetGroupPowers(Dictionary<UUID, ulong> powers)
  6771. {
  6772. lock(m_groupPowers)
  6773. {
  6774. m_groupPowers.Clear();
  6775. m_groupPowers = powers;
  6776. }
  6777. }
  6778. public ulong GetGroupPowers(UUID groupID)
  6779. {
  6780. lock(m_groupPowers)
  6781. {
  6782. if (m_groupPowers.ContainsKey(groupID))
  6783. return m_groupPowers[groupID];
  6784. }
  6785. return 0;
  6786. }
  6787. #endregion
  6788. /// <summary>
  6789. /// This is a different way of processing packets then ProcessInPacket
  6790. /// </summary>
  6791. protected virtual void RegisterLocalPacketHandlers()
  6792. {
  6793. AddLocalPacketHandler(PacketType.LogoutRequest, HandleLogout);
  6794. // If AgentUpdate is ever handled asynchronously, then we will also need to construct a new AgentUpdateArgs
  6795. // for each AgentUpdate packet.
  6796. AddLocalPacketHandler(PacketType.AgentUpdate, HandleAgentUpdate, false);
  6797. AddLocalPacketHandler(PacketType.ViewerEffect, HandleViewerEffect, false);
  6798. AddLocalPacketHandler(PacketType.VelocityInterpolateOff, HandleVelocityInterpolateOff, false);
  6799. AddLocalPacketHandler(PacketType.VelocityInterpolateOn, HandleVelocityInterpolateOn, false);
  6800. AddLocalPacketHandler(PacketType.AgentCachedTexture, HandleAgentTextureCached, false);
  6801. AddLocalPacketHandler(PacketType.MultipleObjectUpdate, HandleMultipleObjUpdate, false);
  6802. AddLocalPacketHandler(PacketType.MoneyTransferRequest, HandleMoneyTransferRequest, false);
  6803. AddLocalPacketHandler(PacketType.ParcelBuy, HandleParcelBuyRequest, false);
  6804. AddLocalPacketHandler(PacketType.UUIDGroupNameRequest, HandleUUIDGroupNameRequest);
  6805. AddLocalPacketHandler(PacketType.ObjectGroup, HandleObjectGroupRequest);
  6806. AddLocalPacketHandler(PacketType.GenericMessage, HandleGenericMessage);
  6807. AddLocalPacketHandler(PacketType.AvatarPropertiesRequest, HandleAvatarPropertiesRequest);
  6808. AddLocalPacketHandler(PacketType.ChatFromViewer, HandleChatFromViewer);
  6809. AddLocalPacketHandler(PacketType.AvatarPropertiesUpdate, HandlerAvatarPropertiesUpdate);
  6810. AddLocalPacketHandler(PacketType.ScriptDialogReply, HandlerScriptDialogReply);
  6811. AddLocalPacketHandler(PacketType.ImprovedInstantMessage, HandlerImprovedInstantMessage);
  6812. AddLocalPacketHandler(PacketType.AcceptFriendship, HandlerAcceptFriendship);
  6813. AddLocalPacketHandler(PacketType.DeclineFriendship, HandlerDeclineFriendship);
  6814. AddLocalPacketHandler(PacketType.TerminateFriendship, HandlerTerminateFriendship);
  6815. AddLocalPacketHandler(PacketType.RezObject, HandlerRezObject);
  6816. AddLocalPacketHandler(PacketType.DeRezObject, HandlerDeRezObject);
  6817. AddLocalPacketHandler(PacketType.RezRestoreToWorld, HandlerRezRestoreToWorld);
  6818. AddLocalPacketHandler(PacketType.ModifyLand, HandlerModifyLand);
  6819. AddLocalPacketHandler(PacketType.RegionHandshakeReply, HandlerRegionHandshakeReply, false);
  6820. AddLocalPacketHandler(PacketType.AgentWearablesRequest, HandlerAgentWearablesRequest);
  6821. AddLocalPacketHandler(PacketType.AgentSetAppearance, HandlerAgentSetAppearance);
  6822. AddLocalPacketHandler(PacketType.AgentIsNowWearing, HandlerAgentIsNowWearing);
  6823. AddLocalPacketHandler(PacketType.RezSingleAttachmentFromInv, HandlerRezSingleAttachmentFromInv);
  6824. AddLocalPacketHandler(PacketType.RezMultipleAttachmentsFromInv, HandleRezMultipleAttachmentsFromInv);
  6825. AddLocalPacketHandler(PacketType.DetachAttachmentIntoInv, HandleDetachAttachmentIntoInv);
  6826. AddLocalPacketHandler(PacketType.ObjectAttach, HandleObjectAttach);
  6827. AddLocalPacketHandler(PacketType.ObjectDetach, HandleObjectDetach);
  6828. AddLocalPacketHandler(PacketType.ObjectDrop, HandleObjectDrop);
  6829. AddLocalPacketHandler(PacketType.SetAlwaysRun, HandleSetAlwaysRun, false);
  6830. AddLocalPacketHandler(PacketType.CompleteAgentMovement, HandleCompleteAgentMovement);
  6831. AddLocalPacketHandler(PacketType.AgentAnimation, HandleAgentAnimation, false);
  6832. AddLocalPacketHandler(PacketType.AgentRequestSit, HandleAgentRequestSit);
  6833. AddLocalPacketHandler(PacketType.AgentSit, HandleAgentSit);
  6834. AddLocalPacketHandler(PacketType.SoundTrigger, HandleSoundTrigger);
  6835. AddLocalPacketHandler(PacketType.AvatarPickerRequest, HandleAvatarPickerRequest);
  6836. AddLocalPacketHandler(PacketType.AgentDataUpdateRequest, HandleAgentDataUpdateRequest);
  6837. AddLocalPacketHandler(PacketType.UserInfoRequest, HandleUserInfoRequest);
  6838. AddLocalPacketHandler(PacketType.UpdateUserInfo, HandleUpdateUserInfo);
  6839. AddLocalPacketHandler(PacketType.SetStartLocationRequest, HandleSetStartLocationRequest);
  6840. AddLocalPacketHandler(PacketType.AgentThrottle, HandleAgentThrottle, false);
  6841. AddLocalPacketHandler(PacketType.AgentPause, HandleAgentPause, false);
  6842. AddLocalPacketHandler(PacketType.AgentResume, HandleAgentResume, false);
  6843. AddLocalPacketHandler(PacketType.ForceScriptControlRelease, HandleForceScriptControlRelease);
  6844. AddLocalPacketHandler(PacketType.ObjectLink, HandleObjectLink);
  6845. AddLocalPacketHandler(PacketType.ObjectDelink, HandleObjectDelink);
  6846. AddLocalPacketHandler(PacketType.ObjectAdd, HandleObjectAdd);
  6847. AddLocalPacketHandler(PacketType.ObjectShape, HandleObjectShape);
  6848. AddLocalPacketHandler(PacketType.ObjectExtraParams, HandleObjectExtraParams);
  6849. AddLocalPacketHandler(PacketType.ObjectDuplicate, HandleObjectDuplicate);
  6850. AddLocalPacketHandler(PacketType.RequestMultipleObjects, HandleRequestMultipleObjects);
  6851. AddLocalPacketHandler(PacketType.ObjectSelect, HandleObjectSelect);
  6852. AddLocalPacketHandler(PacketType.ObjectDeselect, HandleObjectDeselect);
  6853. AddLocalPacketHandler(PacketType.ObjectPosition, HandleObjectPosition);
  6854. AddLocalPacketHandler(PacketType.ObjectScale, HandleObjectScale);
  6855. AddLocalPacketHandler(PacketType.ObjectRotation, HandleObjectRotation);
  6856. AddLocalPacketHandler(PacketType.ObjectFlagUpdate, HandleObjectFlagUpdate);
  6857. // Handle ObjectImage (TextureEntry) updates synchronously, since when updating multiple prim faces at once,
  6858. // some clients will send out a separate ObjectImage packet for each face
  6859. AddLocalPacketHandler(PacketType.ObjectImage, HandleObjectImage, false);
  6860. AddLocalPacketHandler(PacketType.ObjectGrab, HandleObjectGrab, false);
  6861. AddLocalPacketHandler(PacketType.ObjectGrabUpdate, HandleObjectGrabUpdate, false);
  6862. AddLocalPacketHandler(PacketType.ObjectDeGrab, HandleObjectDeGrab);
  6863. AddLocalPacketHandler(PacketType.ObjectSpinStart, HandleObjectSpinStart, false);
  6864. AddLocalPacketHandler(PacketType.ObjectSpinUpdate, HandleObjectSpinUpdate, false);
  6865. AddLocalPacketHandler(PacketType.ObjectSpinStop, HandleObjectSpinStop, false);
  6866. AddLocalPacketHandler(PacketType.ObjectDescription, HandleObjectDescription, false);
  6867. AddLocalPacketHandler(PacketType.ObjectName, HandleObjectName, false);
  6868. AddLocalPacketHandler(PacketType.ObjectPermissions, HandleObjectPermissions, false);
  6869. AddLocalPacketHandler(PacketType.Undo, HandleUndo, false);
  6870. AddLocalPacketHandler(PacketType.UndoLand, HandleLandUndo, false);
  6871. AddLocalPacketHandler(PacketType.Redo, HandleRedo, false);
  6872. AddLocalPacketHandler(PacketType.ObjectDuplicateOnRay, HandleObjectDuplicateOnRay);
  6873. AddLocalPacketHandler(PacketType.RequestObjectPropertiesFamily, HandleRequestObjectPropertiesFamily, false);
  6874. AddLocalPacketHandler(PacketType.ObjectIncludeInSearch, HandleObjectIncludeInSearch);
  6875. AddLocalPacketHandler(PacketType.ScriptAnswerYes, HandleScriptAnswerYes, false);
  6876. AddLocalPacketHandler(PacketType.ObjectClickAction, HandleObjectClickAction, false);
  6877. AddLocalPacketHandler(PacketType.ObjectMaterial, HandleObjectMaterial, false);
  6878. AddLocalPacketHandler(PacketType.RequestImage, HandleRequestImage, false);
  6879. AddLocalPacketHandler(PacketType.TransferRequest, HandleTransferRequest, false);
  6880. AddLocalPacketHandler(PacketType.AssetUploadRequest, HandleAssetUploadRequest);
  6881. AddLocalPacketHandler(PacketType.RequestXfer, HandleRequestXfer);
  6882. AddLocalPacketHandler(PacketType.SendXferPacket, HandleSendXferPacket);
  6883. AddLocalPacketHandler(PacketType.ConfirmXferPacket, HandleConfirmXferPacket, false);
  6884. AddLocalPacketHandler(PacketType.AbortXfer, HandleAbortXfer);
  6885. AddLocalPacketHandler(PacketType.CreateInventoryFolder, HandleCreateInventoryFolder);
  6886. AddLocalPacketHandler(PacketType.UpdateInventoryFolder, HandleUpdateInventoryFolder);
  6887. AddLocalPacketHandler(PacketType.MoveInventoryFolder, HandleMoveInventoryFolder);
  6888. AddLocalPacketHandler(PacketType.CreateInventoryItem, HandleCreateInventoryItem);
  6889. AddLocalPacketHandler(PacketType.LinkInventoryItem, HandleLinkInventoryItem);
  6890. AddLocalPacketHandler(PacketType.FetchInventory, HandleFetchInventory);
  6891. AddLocalPacketHandler(PacketType.FetchInventoryDescendents, HandleFetchInventoryDescendents);
  6892. AddLocalPacketHandler(PacketType.PurgeInventoryDescendents, HandlePurgeInventoryDescendents);
  6893. AddLocalPacketHandler(PacketType.UpdateInventoryItem, HandleUpdateInventoryItem);
  6894. AddLocalPacketHandler(PacketType.CopyInventoryItem, HandleCopyInventoryItem);
  6895. AddLocalPacketHandler(PacketType.MoveInventoryItem, HandleMoveInventoryItem);
  6896. AddLocalPacketHandler(PacketType.RemoveInventoryItem, HandleRemoveInventoryItem);
  6897. AddLocalPacketHandler(PacketType.RemoveInventoryFolder, HandleRemoveInventoryFolder);
  6898. AddLocalPacketHandler(PacketType.RemoveInventoryObjects, HandleRemoveInventoryObjects);
  6899. AddLocalPacketHandler(PacketType.RequestTaskInventory, HandleRequestTaskInventory);
  6900. AddLocalPacketHandler(PacketType.UpdateTaskInventory, HandleUpdateTaskInventory);
  6901. AddLocalPacketHandler(PacketType.RemoveTaskInventory, HandleRemoveTaskInventory);
  6902. AddLocalPacketHandler(PacketType.MoveTaskInventory, HandleMoveTaskInventory);
  6903. AddLocalPacketHandler(PacketType.RezScript, HandleRezScript);
  6904. AddLocalPacketHandler(PacketType.MapLayerRequest, HandleMapLayerRequest);
  6905. AddLocalPacketHandler(PacketType.MapBlockRequest, HandleMapBlockRequest);
  6906. AddLocalPacketHandler(PacketType.MapNameRequest, HandleMapNameRequest);
  6907. AddLocalPacketHandler(PacketType.TeleportLandmarkRequest, HandleTeleportLandmarkRequest);
  6908. AddLocalPacketHandler(PacketType.TeleportCancel, HandleTeleportCancel);
  6909. AddLocalPacketHandler(PacketType.TeleportLocationRequest, HandleTeleportLocationRequest);
  6910. AddLocalPacketHandler(PacketType.UUIDNameRequest, HandleUUIDNameRequest, false);
  6911. AddLocalPacketHandler(PacketType.RegionHandleRequest, HandleRegionHandleRequest, false);
  6912. AddLocalPacketHandler(PacketType.ParcelInfoRequest, HandleParcelInfoRequest);
  6913. AddLocalPacketHandler(PacketType.ParcelAccessListRequest, HandleParcelAccessListRequest, false);
  6914. AddLocalPacketHandler(PacketType.ParcelAccessListUpdate, HandleParcelAccessListUpdate, false);
  6915. AddLocalPacketHandler(PacketType.ParcelPropertiesRequest, HandleParcelPropertiesRequest, false);
  6916. AddLocalPacketHandler(PacketType.ParcelDivide, HandleParcelDivide);
  6917. AddLocalPacketHandler(PacketType.ParcelJoin, HandleParcelJoin);
  6918. AddLocalPacketHandler(PacketType.ParcelPropertiesUpdate, HandleParcelPropertiesUpdate);
  6919. AddLocalPacketHandler(PacketType.ParcelSelectObjects, HandleParcelSelectObjects);
  6920. AddLocalPacketHandler(PacketType.ParcelObjectOwnersRequest, HandleParcelObjectOwnersRequest);
  6921. AddLocalPacketHandler(PacketType.ParcelGodForceOwner, HandleParcelGodForceOwner);
  6922. AddLocalPacketHandler(PacketType.ParcelRelease, HandleParcelRelease);
  6923. AddLocalPacketHandler(PacketType.ParcelReclaim, HandleParcelReclaim);
  6924. AddLocalPacketHandler(PacketType.ParcelReturnObjects, HandleParcelReturnObjects);
  6925. AddLocalPacketHandler(PacketType.ParcelSetOtherCleanTime, HandleParcelSetOtherCleanTime);
  6926. AddLocalPacketHandler(PacketType.LandStatRequest, HandleLandStatRequest);
  6927. AddLocalPacketHandler(PacketType.ParcelDwellRequest, HandleParcelDwellRequest);
  6928. AddLocalPacketHandler(PacketType.EstateOwnerMessage, HandleEstateOwnerMessage);
  6929. AddLocalPacketHandler(PacketType.RequestRegionInfo, HandleRequestRegionInfo, false);
  6930. AddLocalPacketHandler(PacketType.EstateCovenantRequest, HandleEstateCovenantRequest);
  6931. AddLocalPacketHandler(PacketType.RequestGodlikePowers, HandleRequestGodlikePowers);
  6932. AddLocalPacketHandler(PacketType.GodKickUser, HandleGodKickUser);
  6933. AddLocalPacketHandler(PacketType.MoneyBalanceRequest, HandleMoneyBalanceRequest);
  6934. AddLocalPacketHandler(PacketType.EconomyDataRequest, HandleEconomyDataRequest);
  6935. AddLocalPacketHandler(PacketType.RequestPayPrice, HandleRequestPayPrice);
  6936. AddLocalPacketHandler(PacketType.ObjectSaleInfo, HandleObjectSaleInfo);
  6937. AddLocalPacketHandler(PacketType.ObjectBuy, HandleObjectBuy);
  6938. AddLocalPacketHandler(PacketType.GetScriptRunning, HandleGetScriptRunning);
  6939. AddLocalPacketHandler(PacketType.SetScriptRunning, HandleSetScriptRunning);
  6940. AddLocalPacketHandler(PacketType.ScriptReset, HandleScriptReset);
  6941. AddLocalPacketHandler(PacketType.ActivateGestures, HandleActivateGestures);
  6942. AddLocalPacketHandler(PacketType.DeactivateGestures, HandleDeactivateGestures);
  6943. AddLocalPacketHandler(PacketType.ObjectOwner, HandleObjectOwner);
  6944. AddLocalPacketHandler(PacketType.AgentFOV, HandleAgentFOV, false);
  6945. AddLocalPacketHandler(PacketType.ViewerStats, HandleViewerStats);
  6946. AddLocalPacketHandler(PacketType.MapItemRequest, HandleMapItemRequest, false);
  6947. AddLocalPacketHandler(PacketType.TransferAbort, HandleTransferAbort, false);
  6948. AddLocalPacketHandler(PacketType.MuteListRequest, HandleMuteListRequest, false);
  6949. AddLocalPacketHandler(PacketType.UseCircuitCode, HandleUseCircuitCode);
  6950. AddLocalPacketHandler(PacketType.CreateNewOutfitAttachments, HandleCreateNewOutfitAttachments);
  6951. AddLocalPacketHandler(PacketType.AgentHeightWidth, HandleAgentHeightWidth, false);
  6952. AddLocalPacketHandler(PacketType.InventoryDescendents, HandleInventoryDescendents);
  6953. AddLocalPacketHandler(PacketType.DirPlacesQuery, HandleDirPlacesQuery);
  6954. AddLocalPacketHandler(PacketType.DirFindQuery, HandleDirFindQuery);
  6955. AddLocalPacketHandler(PacketType.DirLandQuery, HandleDirLandQuery);
  6956. AddLocalPacketHandler(PacketType.DirPopularQuery, HandleDirPopularQuery);
  6957. AddLocalPacketHandler(PacketType.DirClassifiedQuery, HandleDirClassifiedQuery);
  6958. AddLocalPacketHandler(PacketType.EventInfoRequest, HandleEventInfoRequest);
  6959. AddLocalPacketHandler(PacketType.OfferCallingCard, HandleOfferCallingCard);
  6960. AddLocalPacketHandler(PacketType.AcceptCallingCard, HandleAcceptCallingCard);
  6961. AddLocalPacketHandler(PacketType.DeclineCallingCard, HandleDeclineCallingCard);
  6962. AddLocalPacketHandler(PacketType.ActivateGroup, HandleActivateGroup);
  6963. AddLocalPacketHandler(PacketType.GroupTitlesRequest, HandleGroupTitlesRequest);
  6964. AddLocalPacketHandler(PacketType.GroupProfileRequest, HandleGroupProfileRequest);
  6965. AddLocalPacketHandler(PacketType.GroupMembersRequest, HandleGroupMembersRequest);
  6966. AddLocalPacketHandler(PacketType.GroupRoleDataRequest, HandleGroupRoleDataRequest);
  6967. AddLocalPacketHandler(PacketType.GroupRoleMembersRequest, HandleGroupRoleMembersRequest);
  6968. AddLocalPacketHandler(PacketType.CreateGroupRequest, HandleCreateGroupRequest);
  6969. AddLocalPacketHandler(PacketType.UpdateGroupInfo, HandleUpdateGroupInfo);
  6970. AddLocalPacketHandler(PacketType.SetGroupAcceptNotices, HandleSetGroupAcceptNotices);
  6971. AddLocalPacketHandler(PacketType.GroupTitleUpdate, HandleGroupTitleUpdate);
  6972. AddLocalPacketHandler(PacketType.ParcelDeedToGroup, HandleParcelDeedToGroup);
  6973. AddLocalPacketHandler(PacketType.GroupNoticesListRequest, HandleGroupNoticesListRequest);
  6974. AddLocalPacketHandler(PacketType.GroupNoticeRequest, HandleGroupNoticeRequest);
  6975. AddLocalPacketHandler(PacketType.GroupRoleUpdate, HandleGroupRoleUpdate);
  6976. AddLocalPacketHandler(PacketType.GroupRoleChanges, HandleGroupRoleChanges);
  6977. AddLocalPacketHandler(PacketType.JoinGroupRequest, HandleJoinGroupRequest);
  6978. AddLocalPacketHandler(PacketType.LeaveGroupRequest, HandleLeaveGroupRequest);
  6979. AddLocalPacketHandler(PacketType.EjectGroupMemberRequest, HandleEjectGroupMemberRequest);
  6980. AddLocalPacketHandler(PacketType.InviteGroupRequest, HandleInviteGroupRequest);
  6981. AddLocalPacketHandler(PacketType.StartLure, HandleStartLure);
  6982. AddLocalPacketHandler(PacketType.TeleportLureRequest, HandleTeleportLureRequest);
  6983. AddLocalPacketHandler(PacketType.ClassifiedInfoRequest, HandleClassifiedInfoRequest);
  6984. AddLocalPacketHandler(PacketType.ClassifiedInfoUpdate, HandleClassifiedInfoUpdate);
  6985. AddLocalPacketHandler(PacketType.ClassifiedDelete, HandleClassifiedDelete);
  6986. AddLocalPacketHandler(PacketType.ClassifiedGodDelete, HandleClassifiedGodDelete);
  6987. AddLocalPacketHandler(PacketType.EventGodDelete, HandleEventGodDelete);
  6988. AddLocalPacketHandler(PacketType.EventNotificationAddRequest, HandleEventNotificationAddRequest);
  6989. AddLocalPacketHandler(PacketType.EventNotificationRemoveRequest, HandleEventNotificationRemoveRequest);
  6990. AddLocalPacketHandler(PacketType.RetrieveInstantMessages, HandleRetrieveInstantMessages);
  6991. AddLocalPacketHandler(PacketType.PickDelete, HandlePickDelete);
  6992. AddLocalPacketHandler(PacketType.PickGodDelete, HandlePickGodDelete);
  6993. AddLocalPacketHandler(PacketType.PickInfoUpdate, HandlePickInfoUpdate);
  6994. AddLocalPacketHandler(PacketType.AvatarNotesUpdate, HandleAvatarNotesUpdate);
  6995. AddLocalPacketHandler(PacketType.AvatarInterestsUpdate, HandleAvatarInterestsUpdate);
  6996. AddLocalPacketHandler(PacketType.GrantUserRights, HandleGrantUserRights);
  6997. AddLocalPacketHandler(PacketType.PlacesQuery, HandlePlacesQuery);
  6998. AddLocalPacketHandler(PacketType.UpdateMuteListEntry, HandleUpdateMuteListEntry);
  6999. AddLocalPacketHandler(PacketType.RemoveMuteListEntry, HandleRemoveMuteListEntry);
  7000. AddLocalPacketHandler(PacketType.UserReport, HandleUserReport);
  7001. AddLocalPacketHandler(PacketType.FindAgent, HandleFindAgent);
  7002. AddLocalPacketHandler(PacketType.TrackAgent, HandleTrackAgent);
  7003. AddLocalPacketHandler(PacketType.GodUpdateRegionInfo, HandleGodUpdateRegionInfoUpdate);
  7004. AddLocalPacketHandler(PacketType.GodlikeMessage, HandleGodlikeMessage);
  7005. AddLocalPacketHandler(PacketType.StateSave, HandleSaveStatePacket);
  7006. AddLocalPacketHandler(PacketType.GroupAccountDetailsRequest, HandleGroupAccountDetailsRequest);
  7007. AddLocalPacketHandler(PacketType.GroupAccountSummaryRequest, HandleGroupAccountSummaryRequest);
  7008. AddLocalPacketHandler(PacketType.GroupAccountTransactionsRequest, HandleGroupTransactionsDetailsRequest);
  7009. AddLocalPacketHandler(PacketType.FreezeUser, HandleFreezeUser);
  7010. AddLocalPacketHandler(PacketType.EjectUser, HandleEjectUser);
  7011. AddLocalPacketHandler(PacketType.ParcelBuyPass, HandleParcelBuyPass);
  7012. AddLocalPacketHandler(PacketType.ParcelGodMarkAsContent, HandleParcelGodMarkAsContent);
  7013. AddLocalPacketHandler(PacketType.GroupActiveProposalsRequest, HandleGroupActiveProposalsRequest);
  7014. AddLocalPacketHandler(PacketType.GroupVoteHistoryRequest, HandleGroupVoteHistoryRequest);
  7015. AddLocalPacketHandler(PacketType.SimWideDeletes, HandleSimWideDeletes);
  7016. AddLocalPacketHandler(PacketType.SendPostcard, HandleSendPostcard);
  7017. AddLocalPacketHandler(PacketType.ChangeInventoryItemFlags, HandleChangeInventoryItemFlags);
  7018. AddLocalPacketHandler(PacketType.RevokePermissions, HandleRevokePermissions);
  7019. AddGenericPacketHandler("autopilot", HandleAutopilot);
  7020. }
  7021. #region Packet Handlers
  7022. public int TotalAgentUpdates { get; set; }
  7023. #region Scene/Avatar
  7024. // Threshold for body rotation to be a significant agent update
  7025. // use the abs of cos
  7026. private const float QDELTABody = 1.0f - 0.00001f;
  7027. private const float QDELTAHead = 1.0f - 0.00001f;
  7028. // Threshold for camera rotation to be a significant agent update
  7029. private const float VDELTA = 0.01f;
  7030. /// <summary>
  7031. /// This checks the update significance against the last update made.
  7032. /// </summary>
  7033. /// <remarks>Can only be called by one thread at a time</remarks>
  7034. /// <returns></returns>
  7035. /// <param name='x'></param>
  7036. public bool CheckAgentUpdateSignificance(AgentUpdatePacket.AgentDataBlock x)
  7037. {
  7038. return CheckAgentMovementUpdateSignificance(x) || CheckAgentCameraUpdateSignificance(x);
  7039. }
  7040. /// <summary>
  7041. /// This checks the movement/state update significance against the last update made.
  7042. /// </summary>
  7043. /// <remarks>Can only be called by one thread at a time</remarks>
  7044. /// <returns></returns>
  7045. /// <param name='x'></param>
  7046. private bool CheckAgentMovementUpdateSignificance(AgentUpdatePacket.AgentDataBlock x)
  7047. {
  7048. if(
  7049. (x.ControlFlags != m_thisAgentUpdateArgs.ControlFlags) // significant if control flags changed
  7050. // || ((x.ControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) != 0 &&
  7051. // (x.ControlFlags & 0x3f8dfff) != 0) // we need to rotate the av on fly
  7052. || x.ControlFlags != (byte)AgentManager.ControlFlags.NONE// actually all movement controls need to pass
  7053. || (x.Flags != m_thisAgentUpdateArgs.Flags) // significant if Flags changed
  7054. || (x.State != m_thisAgentUpdateArgs.State) // significant if Stats changed
  7055. || (Math.Abs(x.Far - m_thisAgentUpdateArgs.Far) >= 32) // significant if far distance changed
  7056. )
  7057. return true;
  7058. float qdelta = Math.Abs(Quaternion.Dot(x.BodyRotation, m_thisAgentUpdateArgs.BodyRotation));
  7059. if(qdelta < QDELTABody) // significant if body rotation above(below cos) threshold
  7060. return true;
  7061. return false;
  7062. }
  7063. /// <summary>
  7064. /// This checks the camera update significance against the last update made.
  7065. /// </summary>
  7066. /// <remarks>Can only be called by one thread at a time</remarks>
  7067. /// <returns></returns>
  7068. /// <param name='x'></param>
  7069. private bool CheckAgentCameraUpdateSignificance(AgentUpdatePacket.AgentDataBlock x)
  7070. {
  7071. if(Math.Abs(x.CameraCenter.X - m_thisAgentUpdateArgs.CameraCenter.X) > VDELTA ||
  7072. Math.Abs(x.CameraCenter.Y - m_thisAgentUpdateArgs.CameraCenter.Y) > VDELTA ||
  7073. Math.Abs(x.CameraCenter.Z - m_thisAgentUpdateArgs.CameraCenter.Z) > VDELTA ||
  7074. Math.Abs(x.CameraAtAxis.X - m_thisAgentUpdateArgs.CameraAtAxis.X) > VDELTA ||
  7075. Math.Abs(x.CameraAtAxis.Y - m_thisAgentUpdateArgs.CameraAtAxis.Y) > VDELTA ||
  7076. // Math.Abs(x.CameraAtAxis.Z - m_thisAgentUpdateArgs.CameraAtAxis.Z) > VDELTA ||
  7077. Math.Abs(x.CameraLeftAxis.X - m_thisAgentUpdateArgs.CameraLeftAxis.X) > VDELTA ||
  7078. Math.Abs(x.CameraLeftAxis.Y - m_thisAgentUpdateArgs.CameraLeftAxis.Y) > VDELTA ||
  7079. // Math.Abs(x.CameraLeftAxis.Z - m_thisAgentUpdateArgs.CameraLeftAxis.Z) > VDELTA ||
  7080. Math.Abs(x.CameraUpAxis.X - m_thisAgentUpdateArgs.CameraUpAxis.X) > VDELTA ||
  7081. Math.Abs(x.CameraUpAxis.Y - m_thisAgentUpdateArgs.CameraUpAxis.Y) > VDELTA
  7082. // Math.Abs(x.CameraLeftAxis.Z - m_thisAgentUpdateArgs.CameraLeftAxis.Z) > VDELTA ||
  7083. )
  7084. return true;
  7085. return false;
  7086. }
  7087. private bool HandleAgentUpdate(IClientAPI sender, Packet packet)
  7088. {
  7089. if(OnAgentUpdate == null)
  7090. {
  7091. PacketPool.Instance.ReturnPacket(packet);
  7092. return false;
  7093. }
  7094. AgentUpdatePacket agentUpdate = (AgentUpdatePacket)packet;
  7095. AgentUpdatePacket.AgentDataBlock x = agentUpdate.AgentData;
  7096. if (x.AgentID != AgentId || x.SessionID != SessionId)
  7097. {
  7098. PacketPool.Instance.ReturnPacket(packet);
  7099. return false;
  7100. }
  7101. uint seq = packet.Header.Sequence;
  7102. TotalAgentUpdates++;
  7103. // dont let ignored updates pollute this throttles
  7104. if(SceneAgent == null || SceneAgent.IsChildAgent ||
  7105. SceneAgent.IsInTransit || seq <= m_thisAgentUpdateArgs.lastpacketSequence )
  7106. {
  7107. // throttle reset is done at MoveAgentIntoRegion()
  7108. // called by scenepresence on completemovement
  7109. PacketPool.Instance.ReturnPacket(packet);
  7110. return true;
  7111. }
  7112. m_thisAgentUpdateArgs.lastpacketSequence = seq;
  7113. if (OnPreAgentUpdate != null)
  7114. OnPreAgentUpdate(this, m_thisAgentUpdateArgs);
  7115. bool movement;
  7116. bool camera;
  7117. double now = Util.GetTimeStampMS();
  7118. if(now - m_thisAgentUpdateArgs.lastUpdateTS > 500.0) // at least 2 per sec
  7119. {
  7120. movement = true;
  7121. camera = true;
  7122. }
  7123. else
  7124. {
  7125. movement = CheckAgentMovementUpdateSignificance(x);
  7126. camera = CheckAgentCameraUpdateSignificance(x);
  7127. }
  7128. // Was there a significant movement/state change?
  7129. if (movement)
  7130. {
  7131. m_thisAgentUpdateArgs.BodyRotation = x.BodyRotation;
  7132. m_thisAgentUpdateArgs.ControlFlags = x.ControlFlags;
  7133. m_thisAgentUpdateArgs.Far = x.Far;
  7134. m_thisAgentUpdateArgs.Flags = x.Flags;
  7135. m_thisAgentUpdateArgs.HeadRotation = x.HeadRotation;
  7136. m_thisAgentUpdateArgs.State = x.State;
  7137. m_thisAgentUpdateArgs.NeedsCameraCollision = !camera;
  7138. if (OnAgentUpdate != null)
  7139. OnAgentUpdate(this, m_thisAgentUpdateArgs);
  7140. }
  7141. // Was there a significant camera(s) change?
  7142. if (camera)
  7143. {
  7144. m_thisAgentUpdateArgs.CameraAtAxis = x.CameraAtAxis;
  7145. m_thisAgentUpdateArgs.CameraCenter = x.CameraCenter;
  7146. m_thisAgentUpdateArgs.CameraLeftAxis = x.CameraLeftAxis;
  7147. m_thisAgentUpdateArgs.CameraUpAxis = x.CameraUpAxis;
  7148. m_thisAgentUpdateArgs.NeedsCameraCollision = true;
  7149. if (OnAgentCameraUpdate != null)
  7150. OnAgentCameraUpdate(this, m_thisAgentUpdateArgs);
  7151. }
  7152. if(movement && camera)
  7153. m_thisAgentUpdateArgs.lastUpdateTS = now;
  7154. PacketPool.Instance.ReturnPacket(packet);
  7155. return true;
  7156. }
  7157. private bool HandleMoneyTransferRequest(IClientAPI sender, Packet Pack)
  7158. {
  7159. MoneyTransferRequestPacket money = (MoneyTransferRequestPacket)Pack;
  7160. // validate the agent owns the agentID and sessionID
  7161. if (money.MoneyData.SourceID == sender.AgentId && money.AgentData.AgentID == sender.AgentId &&
  7162. money.AgentData.SessionID == sender.SessionId)
  7163. {
  7164. MoneyTransferRequest handlerMoneyTransferRequest = OnMoneyTransferRequest;
  7165. if (handlerMoneyTransferRequest != null)
  7166. {
  7167. handlerMoneyTransferRequest(money.MoneyData.SourceID, money.MoneyData.DestID,
  7168. money.MoneyData.Amount, money.MoneyData.TransactionType,
  7169. Util.FieldToString(money.MoneyData.Description));
  7170. }
  7171. return true;
  7172. }
  7173. return false;
  7174. }
  7175. private bool HandleParcelGodMarkAsContent(IClientAPI client, Packet Packet)
  7176. {
  7177. ParcelGodMarkAsContentPacket ParcelGodMarkAsContent =
  7178. (ParcelGodMarkAsContentPacket)Packet;
  7179. if(SessionId != ParcelGodMarkAsContent.AgentData.SessionID || AgentId != ParcelGodMarkAsContent.AgentData.AgentID)
  7180. return false;
  7181. ParcelGodMark ParcelGodMarkAsContentHandler = OnParcelGodMark;
  7182. if (ParcelGodMarkAsContentHandler != null)
  7183. {
  7184. ParcelGodMarkAsContentHandler(this,
  7185. ParcelGodMarkAsContent.AgentData.AgentID,
  7186. ParcelGodMarkAsContent.ParcelData.LocalID);
  7187. return true;
  7188. }
  7189. return false;
  7190. }
  7191. private bool HandleFreezeUser(IClientAPI client, Packet Packet)
  7192. {
  7193. FreezeUserPacket FreezeUser = (FreezeUserPacket)Packet;
  7194. if(SessionId != FreezeUser.AgentData.SessionID || AgentId != FreezeUser.AgentData.AgentID)
  7195. return false;
  7196. FreezeUserUpdate FreezeUserHandler = OnParcelFreezeUser;
  7197. if (FreezeUserHandler != null)
  7198. {
  7199. FreezeUserHandler(this,
  7200. FreezeUser.AgentData.AgentID,
  7201. FreezeUser.Data.Flags,
  7202. FreezeUser.Data.TargetID);
  7203. return true;
  7204. }
  7205. return false;
  7206. }
  7207. private bool HandleEjectUser(IClientAPI client, Packet Packet)
  7208. {
  7209. EjectUserPacket EjectUser =
  7210. (EjectUserPacket)Packet;
  7211. if(SessionId != EjectUser.AgentData.SessionID || AgentId != EjectUser.AgentData.AgentID)
  7212. return false;
  7213. EjectUserUpdate EjectUserHandler = OnParcelEjectUser;
  7214. if (EjectUserHandler != null)
  7215. {
  7216. EjectUserHandler(this,
  7217. EjectUser.AgentData.AgentID,
  7218. EjectUser.Data.Flags,
  7219. EjectUser.Data.TargetID);
  7220. return true;
  7221. }
  7222. return false;
  7223. }
  7224. private bool HandleParcelBuyPass(IClientAPI client, Packet Packet)
  7225. {
  7226. ParcelBuyPassPacket ParcelBuyPass =
  7227. (ParcelBuyPassPacket)Packet;
  7228. if(SessionId != ParcelBuyPass.AgentData.SessionID || AgentId != ParcelBuyPass.AgentData.AgentID)
  7229. return false;
  7230. ParcelBuyPass ParcelBuyPassHandler = OnParcelBuyPass;
  7231. if (ParcelBuyPassHandler != null)
  7232. {
  7233. ParcelBuyPassHandler(this,
  7234. ParcelBuyPass.AgentData.AgentID,
  7235. ParcelBuyPass.ParcelData.LocalID);
  7236. return true;
  7237. }
  7238. return false;
  7239. }
  7240. private bool HandleParcelBuyRequest(IClientAPI sender, Packet Pack)
  7241. {
  7242. ParcelBuyPacket parcel = (ParcelBuyPacket)Pack;
  7243. if (parcel.AgentData.AgentID == AgentId && parcel.AgentData.SessionID == SessionId)
  7244. {
  7245. ParcelBuy handlerParcelBuy = OnParcelBuy;
  7246. if (handlerParcelBuy != null)
  7247. {
  7248. handlerParcelBuy(parcel.AgentData.AgentID, parcel.Data.GroupID, parcel.Data.Final,
  7249. parcel.Data.IsGroupOwned,
  7250. parcel.Data.RemoveContribution, parcel.Data.LocalID, parcel.ParcelData.Area,
  7251. parcel.ParcelData.Price,
  7252. false);
  7253. }
  7254. return true;
  7255. }
  7256. return false;
  7257. }
  7258. private bool HandleUUIDGroupNameRequest(IClientAPI sender, Packet Pack)
  7259. {
  7260. ScenePresence sp = (ScenePresence)SceneAgent;
  7261. if(sp == null || sp.IsDeleted || (sp.IsInTransit && !sp.IsInLocalTransit))
  7262. return true;
  7263. UUIDGroupNameRequestPacket upack = (UUIDGroupNameRequestPacket)Pack;
  7264. for (int i = 0; i < upack.UUIDNameBlock.Length; i++)
  7265. {
  7266. UUIDNameRequest handlerUUIDGroupNameRequest = OnUUIDGroupNameRequest;
  7267. if (handlerUUIDGroupNameRequest != null)
  7268. {
  7269. handlerUUIDGroupNameRequest(upack.UUIDNameBlock[i].ID, this);
  7270. }
  7271. }
  7272. return true;
  7273. }
  7274. public bool HandleGenericMessage(IClientAPI sender, Packet pack)
  7275. {
  7276. GenericMessagePacket gmpack = (GenericMessagePacket)pack;
  7277. if (m_genericPacketHandlers.Count == 0) return false;
  7278. if (gmpack.AgentData.SessionID != SessionId) return false;
  7279. GenericMessage handlerGenericMessage = null;
  7280. string method = Util.FieldToString(gmpack.MethodData.Method).ToLower().Trim();
  7281. if (m_genericPacketHandlers.TryGetValue(method, out handlerGenericMessage))
  7282. {
  7283. List<string> msg = new List<string>();
  7284. List<byte[]> msgBytes = new List<byte[]>();
  7285. if (handlerGenericMessage != null)
  7286. {
  7287. foreach (GenericMessagePacket.ParamListBlock block in gmpack.ParamList)
  7288. {
  7289. msg.Add(Util.FieldToString(block.Parameter));
  7290. msgBytes.Add(block.Parameter);
  7291. }
  7292. try
  7293. {
  7294. if (OnBinaryGenericMessage != null)
  7295. {
  7296. OnBinaryGenericMessage(this, method, msgBytes.ToArray());
  7297. }
  7298. handlerGenericMessage(sender, method, msg);
  7299. return true;
  7300. }
  7301. catch (Exception e)
  7302. {
  7303. m_log.ErrorFormat(
  7304. "[LLCLIENTVIEW]: Exeception when handling generic message {0}{1}", e.Message, e.StackTrace);
  7305. }
  7306. }
  7307. }
  7308. //m_log.Debug("[LLCLIENTVIEW]: Not handling GenericMessage with method-type of: " + method);
  7309. return false;
  7310. }
  7311. public bool HandleObjectGroupRequest(IClientAPI sender, Packet Pack)
  7312. {
  7313. ObjectGroupPacket ogpack = (ObjectGroupPacket)Pack;
  7314. if (ogpack.AgentData.SessionID != SessionId) return false;
  7315. RequestObjectPropertiesFamily handlerObjectGroupRequest = OnObjectGroupRequest;
  7316. if (handlerObjectGroupRequest != null)
  7317. {
  7318. for (int i = 0; i < ogpack.ObjectData.Length; i++)
  7319. {
  7320. handlerObjectGroupRequest(this, ogpack.AgentData.GroupID, ogpack.ObjectData[i].ObjectLocalID, UUID.Zero);
  7321. }
  7322. }
  7323. return true;
  7324. }
  7325. private bool HandleViewerEffect(IClientAPI sender, Packet Pack)
  7326. {
  7327. ViewerEffectPacket viewer = (ViewerEffectPacket)Pack;
  7328. if (viewer.AgentData.SessionID != SessionId) return false;
  7329. ViewerEffectEventHandler handlerViewerEffect = OnViewerEffect;
  7330. if (handlerViewerEffect != null)
  7331. {
  7332. int length = viewer.Effect.Length;
  7333. List<ViewerEffectEventHandlerArg> args = new List<ViewerEffectEventHandlerArg>(length);
  7334. for (int i = 0; i < length; i++)
  7335. {
  7336. //copy the effects block arguments into the event handler arg.
  7337. ViewerEffectEventHandlerArg argument = new ViewerEffectEventHandlerArg();
  7338. argument.AgentID = viewer.Effect[i].AgentID;
  7339. argument.Color = viewer.Effect[i].Color;
  7340. argument.Duration = viewer.Effect[i].Duration;
  7341. argument.ID = viewer.Effect[i].ID;
  7342. argument.Type = viewer.Effect[i].Type;
  7343. argument.TypeData = viewer.Effect[i].TypeData;
  7344. args.Add(argument);
  7345. }
  7346. handlerViewerEffect(sender, args);
  7347. }
  7348. return true;
  7349. }
  7350. private bool HandleVelocityInterpolateOff(IClientAPI sender, Packet Pack)
  7351. {
  7352. VelocityInterpolateOffPacket p = (VelocityInterpolateOffPacket)Pack;
  7353. if (p.AgentData.SessionID != SessionId ||
  7354. p.AgentData.AgentID != AgentId)
  7355. return true;
  7356. m_VelocityInterpolate = false;
  7357. return true;
  7358. }
  7359. private bool HandleVelocityInterpolateOn(IClientAPI sender, Packet Pack)
  7360. {
  7361. VelocityInterpolateOnPacket p = (VelocityInterpolateOnPacket)Pack;
  7362. if (p.AgentData.SessionID != SessionId ||
  7363. p.AgentData.AgentID != AgentId)
  7364. return true;
  7365. m_VelocityInterpolate = true;
  7366. return true;
  7367. }
  7368. private bool HandleAvatarPropertiesRequest(IClientAPI sender, Packet Pack)
  7369. {
  7370. AvatarPropertiesRequestPacket avatarProperties = (AvatarPropertiesRequestPacket)Pack;
  7371. #region Packet Session and User Check
  7372. if (avatarProperties.AgentData.SessionID != SessionId ||
  7373. avatarProperties.AgentData.AgentID != AgentId)
  7374. return true;
  7375. #endregion
  7376. RequestAvatarProperties handlerRequestAvatarProperties = OnRequestAvatarProperties;
  7377. if (handlerRequestAvatarProperties != null)
  7378. {
  7379. handlerRequestAvatarProperties(this, avatarProperties.AgentData.AvatarID);
  7380. }
  7381. return true;
  7382. }
  7383. private bool HandleChatFromViewer(IClientAPI sender, Packet Pack)
  7384. {
  7385. ChatFromViewerPacket inchatpack = (ChatFromViewerPacket)Pack;
  7386. #region Packet Session and User Check
  7387. if (inchatpack.AgentData.SessionID != SessionId ||
  7388. inchatpack.AgentData.AgentID != AgentId)
  7389. return true;
  7390. #endregion
  7391. string fromName = String.Empty; //ClientAvatar.firstname + " " + ClientAvatar.lastname;
  7392. byte[] message = inchatpack.ChatData.Message;
  7393. byte type = inchatpack.ChatData.Type;
  7394. Vector3 fromPos = new Vector3(); // ClientAvatar.Pos;
  7395. // UUID fromAgentID = AgentId;
  7396. int channel = inchatpack.ChatData.Channel;
  7397. if (OnChatFromClient != null)
  7398. {
  7399. OSChatMessage args = new OSChatMessage();
  7400. args.Channel = channel;
  7401. args.From = fromName;
  7402. args.Message = Utils.BytesToString(message);
  7403. args.Type = (ChatTypeEnum)type;
  7404. args.Position = fromPos;
  7405. args.Scene = Scene;
  7406. args.Sender = this;
  7407. args.SenderUUID = this.AgentId;
  7408. ChatMessage handlerChatFromClient = OnChatFromClient;
  7409. if (handlerChatFromClient != null)
  7410. handlerChatFromClient(this, args);
  7411. }
  7412. return true;
  7413. }
  7414. private bool HandlerAvatarPropertiesUpdate(IClientAPI sender, Packet Pack)
  7415. {
  7416. AvatarPropertiesUpdatePacket avatarProps = (AvatarPropertiesUpdatePacket)Pack;
  7417. #region Packet Session and User Check
  7418. if (avatarProps.AgentData.SessionID != SessionId ||
  7419. avatarProps.AgentData.AgentID != AgentId)
  7420. return true;
  7421. #endregion
  7422. UpdateAvatarProperties handlerUpdateAvatarProperties = OnUpdateAvatarProperties;
  7423. if (handlerUpdateAvatarProperties != null)
  7424. {
  7425. AvatarPropertiesUpdatePacket.PropertiesDataBlock Properties = avatarProps.PropertiesData;
  7426. UserProfileData UserProfile = new UserProfileData();
  7427. UserProfile.ID = AgentId;
  7428. UserProfile.AboutText = Utils.BytesToString(Properties.AboutText);
  7429. UserProfile.FirstLifeAboutText = Utils.BytesToString(Properties.FLAboutText);
  7430. UserProfile.FirstLifeImage = Properties.FLImageID;
  7431. UserProfile.Image = Properties.ImageID;
  7432. UserProfile.ProfileUrl = Utils.BytesToString(Properties.ProfileURL);
  7433. UserProfile.UserFlags &= ~3;
  7434. UserProfile.UserFlags |= Properties.AllowPublish ? 1 : 0;
  7435. UserProfile.UserFlags |= Properties.MaturePublish ? 2 : 0;
  7436. handlerUpdateAvatarProperties(this, UserProfile);
  7437. }
  7438. return true;
  7439. }
  7440. private bool HandlerScriptDialogReply(IClientAPI sender, Packet Pack)
  7441. {
  7442. ScriptDialogReplyPacket rdialog = (ScriptDialogReplyPacket)Pack;
  7443. //m_log.DebugFormat("[CLIENT]: Received ScriptDialogReply from {0}", rdialog.Data.ObjectID);
  7444. #region Packet Session and User Check
  7445. if (rdialog.AgentData.SessionID != SessionId ||
  7446. rdialog.AgentData.AgentID != AgentId)
  7447. return true;
  7448. #endregion
  7449. int ch = rdialog.Data.ChatChannel;
  7450. byte[] msg = rdialog.Data.ButtonLabel;
  7451. if (OnChatFromClient != null)
  7452. {
  7453. OSChatMessage args = new OSChatMessage();
  7454. args.Channel = ch;
  7455. args.From = String.Empty;
  7456. args.Message = Utils.BytesToString(msg);
  7457. args.Type = ChatTypeEnum.Region; //Behaviour in SL is that the response can be heard from any distance
  7458. args.Position = new Vector3();
  7459. args.Scene = Scene;
  7460. args.Sender = this;
  7461. ChatMessage handlerChatFromClient2 = OnChatFromClient;
  7462. if (handlerChatFromClient2 != null)
  7463. handlerChatFromClient2(this, args);
  7464. }
  7465. return true;
  7466. }
  7467. private bool HandlerImprovedInstantMessage(IClientAPI sender, Packet Pack)
  7468. {
  7469. ImprovedInstantMessagePacket msgpack = (ImprovedInstantMessagePacket)Pack;
  7470. #region Packet Session and User Check
  7471. if (msgpack.AgentData.SessionID != SessionId ||
  7472. msgpack.AgentData.AgentID != AgentId)
  7473. return true;
  7474. #endregion
  7475. string IMfromName = Util.FieldToString(msgpack.MessageBlock.FromAgentName);
  7476. string IMmessage = Utils.BytesToString(msgpack.MessageBlock.Message);
  7477. ImprovedInstantMessage handlerInstantMessage = OnInstantMessage;
  7478. if (handlerInstantMessage != null)
  7479. {
  7480. GridInstantMessage im = new GridInstantMessage(Scene,
  7481. msgpack.AgentData.AgentID,
  7482. IMfromName,
  7483. msgpack.MessageBlock.ToAgentID,
  7484. msgpack.MessageBlock.Dialog,
  7485. msgpack.MessageBlock.FromGroup,
  7486. IMmessage,
  7487. msgpack.MessageBlock.ID,
  7488. msgpack.MessageBlock.Offline != 0 ? true : false,
  7489. msgpack.MessageBlock.Position,
  7490. msgpack.MessageBlock.BinaryBucket,
  7491. true);
  7492. handlerInstantMessage(this, im);
  7493. }
  7494. return true;
  7495. }
  7496. private bool HandlerAcceptFriendship(IClientAPI sender, Packet Pack)
  7497. {
  7498. AcceptFriendshipPacket afriendpack = (AcceptFriendshipPacket)Pack;
  7499. #region Packet Session and User Check
  7500. if (afriendpack.AgentData.SessionID != SessionId ||
  7501. afriendpack.AgentData.AgentID != AgentId)
  7502. return true;
  7503. #endregion
  7504. // My guess is this is the folder to stick the calling card into
  7505. List<UUID> callingCardFolders = new List<UUID>();
  7506. UUID transactionID = afriendpack.TransactionBlock.TransactionID;
  7507. for (int fi = 0; fi < afriendpack.FolderData.Length; fi++)
  7508. {
  7509. callingCardFolders.Add(afriendpack.FolderData[fi].FolderID);
  7510. }
  7511. FriendActionDelegate handlerApproveFriendRequest = OnApproveFriendRequest;
  7512. if (handlerApproveFriendRequest != null)
  7513. {
  7514. handlerApproveFriendRequest(this, transactionID, callingCardFolders);
  7515. }
  7516. return true;
  7517. }
  7518. private bool HandlerDeclineFriendship(IClientAPI sender, Packet Pack)
  7519. {
  7520. DeclineFriendshipPacket dfriendpack = (DeclineFriendshipPacket)Pack;
  7521. #region Packet Session and User Check
  7522. if (dfriendpack.AgentData.SessionID != SessionId ||
  7523. dfriendpack.AgentData.AgentID != AgentId)
  7524. return true;
  7525. #endregion
  7526. if (OnDenyFriendRequest != null)
  7527. {
  7528. OnDenyFriendRequest(this,
  7529. dfriendpack.TransactionBlock.TransactionID,
  7530. null);
  7531. }
  7532. return true;
  7533. }
  7534. private bool HandlerTerminateFriendship(IClientAPI sender, Packet Pack)
  7535. {
  7536. TerminateFriendshipPacket tfriendpack = (TerminateFriendshipPacket)Pack;
  7537. #region Packet Session and User Check
  7538. if (tfriendpack.AgentData.SessionID != SessionId ||
  7539. tfriendpack.AgentData.AgentID != AgentId)
  7540. return true;
  7541. #endregion
  7542. UUID exFriendID = tfriendpack.ExBlock.OtherID;
  7543. FriendshipTermination TerminateFriendshipHandler = OnTerminateFriendship;
  7544. if (TerminateFriendshipHandler != null)
  7545. {
  7546. TerminateFriendshipHandler(this, exFriendID);
  7547. return true;
  7548. }
  7549. return false;
  7550. }
  7551. private bool HandleFindAgent(IClientAPI client, Packet Packet)
  7552. {
  7553. FindAgentPacket FindAgent =
  7554. (FindAgentPacket)Packet;
  7555. FindAgentUpdate FindAgentHandler = OnFindAgent;
  7556. if (FindAgentHandler != null)
  7557. {
  7558. FindAgentHandler(this,FindAgent.AgentBlock.Hunter,FindAgent.AgentBlock.Prey);
  7559. return true;
  7560. }
  7561. return false;
  7562. }
  7563. private bool HandleTrackAgent(IClientAPI client, Packet Packet)
  7564. {
  7565. TrackAgentPacket TrackAgent =
  7566. (TrackAgentPacket)Packet;
  7567. if(TrackAgent.AgentData.AgentID != AgentId || TrackAgent.AgentData.SessionID != SessionId)
  7568. return false;
  7569. TrackAgentUpdate TrackAgentHandler = OnTrackAgent;
  7570. if (TrackAgentHandler != null)
  7571. {
  7572. TrackAgentHandler(this,
  7573. TrackAgent.AgentData.AgentID,
  7574. TrackAgent.TargetData.PreyID);
  7575. }
  7576. // else
  7577. // m_courseLocationPrey = TrackAgent.TargetData.PreyID;
  7578. return true;
  7579. }
  7580. private bool HandlerRezObject(IClientAPI sender, Packet Pack)
  7581. {
  7582. RezObjectPacket rezPacket = (RezObjectPacket)Pack;
  7583. #region Packet Session and User Check
  7584. if (rezPacket.AgentData.SessionID != SessionId ||
  7585. rezPacket.AgentData.AgentID != AgentId)
  7586. return true;
  7587. #endregion
  7588. RezObject handlerRezObject = OnRezObject;
  7589. if (handlerRezObject != null)
  7590. {
  7591. UUID rezGroupID = rezPacket.AgentData.GroupID;
  7592. if(!IsGroupMember(rezGroupID))
  7593. rezGroupID = UUID.Zero;
  7594. handlerRezObject(this, rezPacket.InventoryData.ItemID, rezGroupID, rezPacket.RezData.RayEnd,
  7595. rezPacket.RezData.RayStart, rezPacket.RezData.RayTargetID,
  7596. rezPacket.RezData.BypassRaycast, rezPacket.RezData.RayEndIsIntersection,
  7597. rezPacket.RezData.RezSelected, rezPacket.RezData.RemoveItem,
  7598. rezPacket.RezData.FromTaskID);
  7599. }
  7600. return true;
  7601. }
  7602. private class DeRezObjectInfo
  7603. {
  7604. public int count;
  7605. public List<uint> objectids;
  7606. }
  7607. private Dictionary<UUID, DeRezObjectInfo> m_DeRezObjectDelayed = new Dictionary<UUID, DeRezObjectInfo>();
  7608. private bool HandlerDeRezObject(IClientAPI sender, Packet Pack)
  7609. {
  7610. DeRezObject handlerDeRezObject = OnDeRezObject;
  7611. if (handlerDeRezObject == null)
  7612. return true;
  7613. DeRezObjectPacket DeRezPacket = (DeRezObjectPacket)Pack;
  7614. #region Packet Session and User Check
  7615. if (DeRezPacket.AgentData.SessionID != SessionId ||
  7616. DeRezPacket.AgentData.AgentID != AgentId)
  7617. return true;
  7618. #endregion
  7619. List<uint> deRezIDs;
  7620. DeRezAction action = (DeRezAction)DeRezPacket.AgentBlock.Destination;
  7621. int numberPackets = DeRezPacket.AgentBlock.PacketCount;
  7622. int curPacket = DeRezPacket.AgentBlock.PacketNumber;
  7623. UUID id = DeRezPacket.AgentBlock.TransactionID;
  7624. if (numberPackets > 1)
  7625. {
  7626. DeRezObjectInfo info;
  7627. if (!m_DeRezObjectDelayed.TryGetValue(id, out info))
  7628. {
  7629. deRezIDs = new List<uint>();
  7630. info = new DeRezObjectInfo();
  7631. info.count = 0;
  7632. info.objectids = deRezIDs;
  7633. m_DeRezObjectDelayed[id] = info;
  7634. }
  7635. else
  7636. {
  7637. deRezIDs = info.objectids;
  7638. }
  7639. foreach (DeRezObjectPacket.ObjectDataBlock data in DeRezPacket.ObjectData)
  7640. {
  7641. deRezIDs.Add(data.ObjectLocalID);
  7642. }
  7643. info.count++;
  7644. if (info.count < numberPackets)
  7645. return true;
  7646. m_DeRezObjectDelayed.Remove(id);
  7647. info.objectids = null;
  7648. }
  7649. else
  7650. {
  7651. deRezIDs = new List<uint>();
  7652. foreach (DeRezObjectPacket.ObjectDataBlock data in DeRezPacket.ObjectData)
  7653. {
  7654. deRezIDs.Add(data.ObjectLocalID);
  7655. }
  7656. }
  7657. if (handlerDeRezObject != null)
  7658. handlerDeRezObject(this, deRezIDs, DeRezPacket.AgentBlock.GroupID,
  7659. action, DeRezPacket.AgentBlock.DestinationID);
  7660. return true;
  7661. }
  7662. private bool HandlerRezRestoreToWorld(IClientAPI sender, Packet Pack)
  7663. {
  7664. RezRestoreToWorldPacket restore = (RezRestoreToWorldPacket)Pack;
  7665. #region Packet Session and User Check
  7666. if (restore.AgentData.SessionID != SessionId ||
  7667. restore.AgentData.AgentID != AgentId)
  7668. return true;
  7669. #endregion
  7670. RezRestoreToWorld handlerRezRestoreToWorld = OnRezRestoreToWorld;
  7671. if (handlerRezRestoreToWorld != null)
  7672. handlerRezRestoreToWorld(this, restore.InventoryData.ItemID);
  7673. return true;
  7674. }
  7675. private bool HandlerModifyLand(IClientAPI sender, Packet Pack)
  7676. {
  7677. if (OnModifyTerrain == null)
  7678. return true;
  7679. ModifyLandPacket modify = (ModifyLandPacket)Pack;
  7680. if (modify.ParcelData.Length == 0)
  7681. return true;
  7682. #region Packet Session and User Check
  7683. if (modify.AgentData.SessionID != SessionId || modify.AgentData.AgentID != AgentId)
  7684. return true;
  7685. #endregion
  7686. //m_log.Info("[LAND]: LAND:" + modify.ToString());
  7687. for (int i = 0; i < modify.ParcelData.Length; i++)
  7688. {
  7689. OnModifyTerrain?.Invoke(AgentId, modify.ModifyBlock.Height, modify.ModifyBlock.Seconds,
  7690. modify.ModifyBlockExtended[i].BrushSize, modify.ModifyBlock.Action,
  7691. modify.ParcelData[i].North, modify.ParcelData[i].West,
  7692. modify.ParcelData[i].South, modify.ParcelData[i].East,
  7693. modify.ParcelData[i].LocalID);
  7694. }
  7695. return true;
  7696. }
  7697. public uint m_viewerHandShakeFlags = 0;
  7698. private bool HandlerRegionHandshakeReply(IClientAPI sender, Packet Pack)
  7699. {
  7700. Action<IClientAPI> handlerRegionHandShakeReply = OnRegionHandShakeReply;
  7701. if (handlerRegionHandShakeReply == null)
  7702. return true; // silence the warning
  7703. RegionHandshakeReplyPacket rsrpkt = (RegionHandshakeReplyPacket)Pack;
  7704. if(rsrpkt.AgentData.AgentID != m_agentId || rsrpkt.AgentData.SessionID != m_sessionId)
  7705. return false;
  7706. if(m_supportViewerCache)
  7707. m_viewerHandShakeFlags = rsrpkt.RegionInfo.Flags;
  7708. else
  7709. m_viewerHandShakeFlags = 0;
  7710. handlerRegionHandShakeReply(this);
  7711. return true;
  7712. }
  7713. private bool HandlerAgentWearablesRequest(IClientAPI sender, Packet Pack)
  7714. {
  7715. GenericCall1 handlerRequestWearables = OnRequestWearables;
  7716. if (handlerRequestWearables != null)
  7717. {
  7718. handlerRequestWearables(sender);
  7719. }
  7720. Action<IClientAPI> handlerRequestAvatarsData = OnRequestAvatarsData;
  7721. if (handlerRequestAvatarsData != null)
  7722. {
  7723. handlerRequestAvatarsData(this);
  7724. }
  7725. return true;
  7726. }
  7727. private bool HandlerAgentSetAppearance(IClientAPI sender, Packet Pack)
  7728. {
  7729. AgentSetAppearancePacket appear = (AgentSetAppearancePacket)Pack;
  7730. #region Packet Session and User Check
  7731. if (appear.AgentData.SessionID != SessionId ||
  7732. appear.AgentData.AgentID != AgentId)
  7733. return true;
  7734. #endregion
  7735. SetAppearance handlerSetAppearance = OnSetAppearance;
  7736. if (handlerSetAppearance != null)
  7737. {
  7738. // Temporarily protect ourselves from the mantis #951 failure.
  7739. // However, we could do this for several other handlers where a failure isn't terminal
  7740. // for the client session anyway, in order to protect ourselves against bad code in plugins
  7741. Vector3 avSize = appear.AgentData.Size;
  7742. try
  7743. {
  7744. byte[] visualparams = new byte[appear.VisualParam.Length];
  7745. for (int i = 0; i < appear.VisualParam.Length; i++)
  7746. visualparams[i] = appear.VisualParam[i].ParamValue;
  7747. //var b = appear.WearableData[0];
  7748. Primitive.TextureEntry te = null;
  7749. if (appear.ObjectData.TextureEntry.Length > 1)
  7750. te = new Primitive.TextureEntry(appear.ObjectData.TextureEntry, 0, appear.ObjectData.TextureEntry.Length);
  7751. WearableCacheItem[] cacheitems = new WearableCacheItem[appear.WearableData.Length];
  7752. for (int i=0; i<appear.WearableData.Length;i++)
  7753. cacheitems[i] = new WearableCacheItem(){
  7754. CacheId = appear.WearableData[i].CacheID,
  7755. TextureIndex=Convert.ToUInt32(appear.WearableData[i].TextureIndex)
  7756. };
  7757. handlerSetAppearance(sender, te, visualparams,avSize, cacheitems);
  7758. }
  7759. catch (Exception e)
  7760. {
  7761. m_log.ErrorFormat(
  7762. "[CLIENT VIEW]: AgentSetApperance packet handler threw an exception, {0}",
  7763. e);
  7764. }
  7765. }
  7766. return true;
  7767. }
  7768. private bool HandlerAgentIsNowWearing(IClientAPI sender, Packet Pack)
  7769. {
  7770. if (OnAvatarNowWearing != null)
  7771. {
  7772. AgentIsNowWearingPacket nowWearing = (AgentIsNowWearingPacket)Pack;
  7773. #region Packet Session and User Check
  7774. if (nowWearing.AgentData.SessionID != SessionId ||
  7775. nowWearing.AgentData.AgentID != AgentId)
  7776. return true;
  7777. #endregion
  7778. AvatarWearingArgs wearingArgs = new AvatarWearingArgs();
  7779. for (int i = 0; i < nowWearing.WearableData.Length; i++)
  7780. {
  7781. //m_log.DebugFormat("[XXX]: Wearable type {0} item {1}", nowWearing.WearableData[i].WearableType, nowWearing.WearableData[i].ItemID);
  7782. AvatarWearingArgs.Wearable wearable =
  7783. new AvatarWearingArgs.Wearable(nowWearing.WearableData[i].ItemID,
  7784. nowWearing.WearableData[i].WearableType);
  7785. wearingArgs.NowWearing.Add(wearable);
  7786. }
  7787. AvatarNowWearing handlerAvatarNowWearing = OnAvatarNowWearing;
  7788. if (handlerAvatarNowWearing != null)
  7789. {
  7790. handlerAvatarNowWearing(this, wearingArgs);
  7791. }
  7792. }
  7793. return true;
  7794. }
  7795. private bool HandlerRezSingleAttachmentFromInv(IClientAPI sender, Packet Pack)
  7796. {
  7797. RezSingleAttachmentFromInv handlerRezSingleAttachment = OnRezSingleAttachmentFromInv;
  7798. if (handlerRezSingleAttachment != null)
  7799. {
  7800. RezSingleAttachmentFromInvPacket rez = (RezSingleAttachmentFromInvPacket)Pack;
  7801. #region Packet Session and User Check
  7802. if (rez.AgentData.SessionID != SessionId ||
  7803. rez.AgentData.AgentID != AgentId)
  7804. return true;
  7805. #endregion
  7806. handlerRezSingleAttachment(this, rez.ObjectData.ItemID,
  7807. rez.ObjectData.AttachmentPt);
  7808. }
  7809. return true;
  7810. }
  7811. private bool HandleRezMultipleAttachmentsFromInv(IClientAPI sender, Packet Pack)
  7812. {
  7813. RezMultipleAttachmentsFromInv handlerRezMultipleAttachments = OnRezMultipleAttachmentsFromInv;
  7814. if (handlerRezMultipleAttachments != null)
  7815. {
  7816. List<KeyValuePair<UUID, uint>> rezlist = new List<KeyValuePair<UUID, uint>>();
  7817. foreach (RezMultipleAttachmentsFromInvPacket.ObjectDataBlock obj in ((RezMultipleAttachmentsFromInvPacket)Pack).ObjectData)
  7818. rezlist.Add(new KeyValuePair<UUID, uint>(obj.ItemID, obj.AttachmentPt));
  7819. handlerRezMultipleAttachments(this, rezlist);
  7820. }
  7821. return true;
  7822. }
  7823. private bool HandleDetachAttachmentIntoInv(IClientAPI sender, Packet Pack)
  7824. {
  7825. UUIDNameRequest handlerDetachAttachmentIntoInv = OnDetachAttachmentIntoInv;
  7826. if (handlerDetachAttachmentIntoInv != null)
  7827. {
  7828. DetachAttachmentIntoInvPacket detachtoInv = (DetachAttachmentIntoInvPacket)Pack;
  7829. #region Packet Session and User Check
  7830. // UNSUPPORTED ON THIS PACKET
  7831. #endregion
  7832. UUID itemID = detachtoInv.ObjectData.ItemID;
  7833. // UUID ATTACH_agentID = detachtoInv.ObjectData.AgentID;
  7834. handlerDetachAttachmentIntoInv(itemID, this);
  7835. }
  7836. return true;
  7837. }
  7838. private bool HandleObjectAttach(IClientAPI sender, Packet Pack)
  7839. {
  7840. if (OnObjectAttach != null)
  7841. {
  7842. ObjectAttachPacket att = (ObjectAttachPacket)Pack;
  7843. #region Packet Session and User Check
  7844. if (att.AgentData.SessionID != SessionId ||
  7845. att.AgentData.AgentID != AgentId)
  7846. return true;
  7847. #endregion
  7848. ObjectAttach handlerObjectAttach = OnObjectAttach;
  7849. if (handlerObjectAttach != null)
  7850. {
  7851. if (att.ObjectData.Length > 0)
  7852. {
  7853. handlerObjectAttach(this, att.ObjectData[0].ObjectLocalID, att.AgentData.AttachmentPoint, false);
  7854. }
  7855. }
  7856. }
  7857. return true;
  7858. }
  7859. private bool HandleObjectDetach(IClientAPI sender, Packet Pack)
  7860. {
  7861. ObjectDetachPacket dett = (ObjectDetachPacket)Pack;
  7862. #region Packet Session and User Check
  7863. if (dett.AgentData.SessionID != SessionId ||
  7864. dett.AgentData.AgentID != AgentId)
  7865. return true;
  7866. #endregion
  7867. for (int j = 0; j < dett.ObjectData.Length; j++)
  7868. {
  7869. uint obj = dett.ObjectData[j].ObjectLocalID;
  7870. ObjectDeselect handlerObjectDetach = OnObjectDetach;
  7871. if (handlerObjectDetach != null)
  7872. {
  7873. handlerObjectDetach(obj, this);
  7874. }
  7875. }
  7876. return true;
  7877. }
  7878. private bool HandleObjectDrop(IClientAPI sender, Packet Pack)
  7879. {
  7880. ObjectDropPacket dropp = (ObjectDropPacket)Pack;
  7881. #region Packet Session and User Check
  7882. if (dropp.AgentData.SessionID != SessionId ||
  7883. dropp.AgentData.AgentID != AgentId)
  7884. return true;
  7885. #endregion
  7886. for (int j = 0; j < dropp.ObjectData.Length; j++)
  7887. {
  7888. uint obj = dropp.ObjectData[j].ObjectLocalID;
  7889. ObjectDrop handlerObjectDrop = OnObjectDrop;
  7890. if (handlerObjectDrop != null)
  7891. {
  7892. handlerObjectDrop(obj, this);
  7893. }
  7894. }
  7895. return true;
  7896. }
  7897. private bool HandleSetAlwaysRun(IClientAPI sender, Packet Pack)
  7898. {
  7899. SetAlwaysRunPacket run = (SetAlwaysRunPacket)Pack;
  7900. #region Packet Session and User Check
  7901. if (run.AgentData.SessionID != SessionId ||
  7902. run.AgentData.AgentID != AgentId)
  7903. return true;
  7904. #endregion
  7905. SetAlwaysRun handlerSetAlwaysRun = OnSetAlwaysRun;
  7906. if (handlerSetAlwaysRun != null)
  7907. handlerSetAlwaysRun(this, run.AgentData.AlwaysRun);
  7908. return true;
  7909. }
  7910. private bool HandleCompleteAgentMovement(IClientAPI sender, Packet Pack)
  7911. {
  7912. //m_log.DebugFormat("[LLClientView] HandleCompleteAgentMovement");
  7913. Action<IClientAPI, bool> handlerCompleteMovementToRegion = OnCompleteMovementToRegion;
  7914. if (handlerCompleteMovementToRegion == null)
  7915. return false;
  7916. CompleteAgentMovementPacket cmp = (CompleteAgentMovementPacket)Pack;
  7917. if(cmp.AgentData.AgentID != m_agentId || cmp.AgentData.SessionID != m_sessionId || cmp.AgentData.CircuitCode != m_circuitCode)
  7918. return false;
  7919. handlerCompleteMovementToRegion(sender, true);
  7920. return true;
  7921. }
  7922. private bool HandleAgentAnimation(IClientAPI sender, Packet Pack)
  7923. {
  7924. AgentAnimationPacket AgentAni = (AgentAnimationPacket)Pack;
  7925. #region Packet Session and User Check
  7926. if (AgentAni.AgentData.SessionID != SessionId ||
  7927. AgentAni.AgentData.AgentID != AgentId)
  7928. return true;
  7929. #endregion
  7930. ChangeAnim handlerChangeAnim = null;
  7931. for (int i = 0; i < AgentAni.AnimationList.Length; i++)
  7932. {
  7933. handlerChangeAnim = OnChangeAnim;
  7934. if (handlerChangeAnim != null)
  7935. {
  7936. handlerChangeAnim(AgentAni.AnimationList[i].AnimID, AgentAni.AnimationList[i].StartAnim, false);
  7937. }
  7938. }
  7939. handlerChangeAnim = OnChangeAnim;
  7940. if (handlerChangeAnim != null)
  7941. {
  7942. handlerChangeAnim(UUID.Zero, false, true);
  7943. }
  7944. return true;
  7945. }
  7946. private bool HandleAgentRequestSit(IClientAPI sender, Packet Pack)
  7947. {
  7948. if (OnAgentRequestSit != null)
  7949. {
  7950. AgentRequestSitPacket agentRequestSit = (AgentRequestSitPacket)Pack;
  7951. #region Packet Session and User Check
  7952. if (agentRequestSit.AgentData.SessionID != SessionId ||
  7953. agentRequestSit.AgentData.AgentID != AgentId)
  7954. return true;
  7955. #endregion
  7956. if (SceneAgent.IsChildAgent)
  7957. {
  7958. SendCantSitBecauseChildAgentResponse();
  7959. return true;
  7960. }
  7961. AgentRequestSit handlerAgentRequestSit = OnAgentRequestSit;
  7962. if (handlerAgentRequestSit != null)
  7963. handlerAgentRequestSit(this, agentRequestSit.AgentData.AgentID,
  7964. agentRequestSit.TargetObject.TargetID, agentRequestSit.TargetObject.Offset);
  7965. }
  7966. return true;
  7967. }
  7968. private bool HandleAgentSit(IClientAPI sender, Packet Pack)
  7969. {
  7970. if (OnAgentSit != null)
  7971. {
  7972. AgentSitPacket agentSit = (AgentSitPacket)Pack;
  7973. #region Packet Session and User Check
  7974. if (agentSit.AgentData.SessionID != SessionId ||
  7975. agentSit.AgentData.AgentID != AgentId)
  7976. return true;
  7977. #endregion
  7978. if (SceneAgent.IsChildAgent)
  7979. {
  7980. SendCantSitBecauseChildAgentResponse();
  7981. return true;
  7982. }
  7983. AgentSit handlerAgentSit = OnAgentSit;
  7984. if (handlerAgentSit != null)
  7985. {
  7986. OnAgentSit(this, agentSit.AgentData.AgentID);
  7987. }
  7988. }
  7989. return true;
  7990. }
  7991. /// <summary>
  7992. /// Used when a child agent gets a sit response which should not be fulfilled.
  7993. /// </summary>
  7994. private void SendCantSitBecauseChildAgentResponse()
  7995. {
  7996. SendAlertMessage("Try moving closer. Can't sit on object because it is not in the same region as you.");
  7997. }
  7998. private bool HandleSoundTrigger(IClientAPI sender, Packet Pack)
  7999. {
  8000. SoundTriggerPacket soundTriggerPacket = (SoundTriggerPacket)Pack;
  8001. #region Packet Session and User Check
  8002. #endregion
  8003. SoundTrigger handlerSoundTrigger = OnSoundTrigger;
  8004. if (handlerSoundTrigger != null)
  8005. {
  8006. // UUIDS are sent as zeroes by the client, substitute agent's id
  8007. handlerSoundTrigger(soundTriggerPacket.SoundData.SoundID, AgentId,
  8008. AgentId, AgentId,
  8009. soundTriggerPacket.SoundData.Gain, soundTriggerPacket.SoundData.Position,
  8010. soundTriggerPacket.SoundData.Handle);
  8011. }
  8012. return true;
  8013. }
  8014. private bool HandleAvatarPickerRequest(IClientAPI sender, Packet Pack)
  8015. {
  8016. AvatarPickerRequestPacket avRequestQuery = (AvatarPickerRequestPacket)Pack;
  8017. #region Packet Session and User Check
  8018. if (avRequestQuery.AgentData.SessionID != SessionId ||
  8019. avRequestQuery.AgentData.AgentID != AgentId)
  8020. return true;
  8021. #endregion
  8022. AvatarPickerRequestPacket.AgentDataBlock Requestdata = avRequestQuery.AgentData;
  8023. AvatarPickerRequestPacket.DataBlock querydata = avRequestQuery.Data;
  8024. //m_log.Debug("Agent Sends:" + Utils.BytesToString(querydata.Name));
  8025. AvatarPickerRequest handlerAvatarPickerRequest = OnAvatarPickerRequest;
  8026. if (handlerAvatarPickerRequest != null)
  8027. {
  8028. handlerAvatarPickerRequest(this, Requestdata.AgentID, Requestdata.QueryID,
  8029. Utils.BytesToString(querydata.Name));
  8030. }
  8031. return true;
  8032. }
  8033. private bool HandleAgentDataUpdateRequest(IClientAPI sender, Packet Pack)
  8034. {
  8035. AgentDataUpdateRequestPacket avRequestDataUpdatePacket = (AgentDataUpdateRequestPacket)Pack;
  8036. #region Packet Session and User Check
  8037. if (avRequestDataUpdatePacket.AgentData.SessionID != SessionId ||
  8038. avRequestDataUpdatePacket.AgentData.AgentID != AgentId)
  8039. return true;
  8040. #endregion
  8041. FetchInventory handlerAgentDataUpdateRequest = OnAgentDataUpdateRequest;
  8042. if (handlerAgentDataUpdateRequest != null)
  8043. {
  8044. handlerAgentDataUpdateRequest(this, avRequestDataUpdatePacket.AgentData.AgentID, avRequestDataUpdatePacket.AgentData.SessionID);
  8045. }
  8046. return true;
  8047. }
  8048. private bool HandleUserInfoRequest(IClientAPI sender, Packet Pack)
  8049. {
  8050. UserInfoRequest handlerUserInfoRequest = OnUserInfoRequest;
  8051. if (handlerUserInfoRequest != null)
  8052. {
  8053. handlerUserInfoRequest(this);
  8054. }
  8055. else
  8056. {
  8057. SendUserInfoReply(false, true, "");
  8058. }
  8059. return true;
  8060. }
  8061. private bool HandleUpdateUserInfo(IClientAPI sender, Packet Pack)
  8062. {
  8063. UpdateUserInfoPacket updateUserInfo = (UpdateUserInfoPacket)Pack;
  8064. #region Packet Session and User Check
  8065. if (updateUserInfo.AgentData.SessionID != SessionId ||
  8066. updateUserInfo.AgentData.AgentID != AgentId)
  8067. return true;
  8068. #endregion
  8069. UpdateUserInfo handlerUpdateUserInfo = OnUpdateUserInfo;
  8070. if (handlerUpdateUserInfo != null)
  8071. {
  8072. bool visible = true;
  8073. string DirectoryVisibility =
  8074. Utils.BytesToString(updateUserInfo.UserData.DirectoryVisibility);
  8075. if (DirectoryVisibility == "hidden")
  8076. visible = false;
  8077. handlerUpdateUserInfo(
  8078. updateUserInfo.UserData.IMViaEMail,
  8079. visible, this);
  8080. }
  8081. return true;
  8082. }
  8083. private bool HandleSetStartLocationRequest(IClientAPI sender, Packet Pack)
  8084. {
  8085. SetStartLocationRequestPacket avSetStartLocationRequestPacket = (SetStartLocationRequestPacket)Pack;
  8086. #region Packet Session and User Check
  8087. if (avSetStartLocationRequestPacket.AgentData.SessionID != SessionId ||
  8088. avSetStartLocationRequestPacket.AgentData.AgentID != AgentId)
  8089. return true;
  8090. #endregion
  8091. if (avSetStartLocationRequestPacket.AgentData.AgentID == AgentId && avSetStartLocationRequestPacket.AgentData.SessionID == SessionId)
  8092. {
  8093. // Linden Client limitation..
  8094. if (avSetStartLocationRequestPacket.StartLocationData.LocationPos.X == 255.5f
  8095. || avSetStartLocationRequestPacket.StartLocationData.LocationPos.Y == 255.5f)
  8096. {
  8097. ScenePresence avatar = null;
  8098. if (((Scene)m_scene).TryGetScenePresence(AgentId, out avatar))
  8099. {
  8100. if (avSetStartLocationRequestPacket.StartLocationData.LocationPos.X == 255.5f)
  8101. {
  8102. avSetStartLocationRequestPacket.StartLocationData.LocationPos.X = avatar.AbsolutePosition.X;
  8103. }
  8104. if (avSetStartLocationRequestPacket.StartLocationData.LocationPos.Y == 255.5f)
  8105. {
  8106. avSetStartLocationRequestPacket.StartLocationData.LocationPos.Y = avatar.AbsolutePosition.Y;
  8107. }
  8108. }
  8109. }
  8110. TeleportLocationRequest handlerSetStartLocationRequest = OnSetStartLocationRequest;
  8111. if (handlerSetStartLocationRequest != null)
  8112. {
  8113. handlerSetStartLocationRequest(this, 0, avSetStartLocationRequestPacket.StartLocationData.LocationPos,
  8114. avSetStartLocationRequestPacket.StartLocationData.LocationLookAt,
  8115. avSetStartLocationRequestPacket.StartLocationData.LocationID);
  8116. }
  8117. }
  8118. return true;
  8119. }
  8120. private bool HandleAgentThrottle(IClientAPI sender, Packet Pack)
  8121. {
  8122. AgentThrottlePacket atpack = (AgentThrottlePacket)Pack;
  8123. #region Packet Session and User Check
  8124. if (atpack.AgentData.SessionID != SessionId ||
  8125. atpack.AgentData.AgentID != AgentId)
  8126. return true;
  8127. #endregion
  8128. m_udpClient.SetThrottles(atpack.Throttle.Throttles);
  8129. GenericCall2 handler = OnUpdateThrottles;
  8130. if (handler != null)
  8131. {
  8132. handler();
  8133. }
  8134. return true;
  8135. }
  8136. private bool HandleAgentPause(IClientAPI sender, Packet Pack)
  8137. {
  8138. m_udpClient.IsPaused = true;
  8139. return true;
  8140. }
  8141. private bool HandleAgentResume(IClientAPI sender, Packet Pack)
  8142. {
  8143. m_udpClient.IsPaused = false;
  8144. m_udpServer.SendPing(m_udpClient);
  8145. return true;
  8146. }
  8147. private bool HandleForceScriptControlRelease(IClientAPI sender, Packet Pack)
  8148. {
  8149. ForceReleaseControls handlerForceReleaseControls = OnForceReleaseControls;
  8150. if (handlerForceReleaseControls != null)
  8151. {
  8152. handlerForceReleaseControls(this, AgentId);
  8153. }
  8154. return true;
  8155. }
  8156. #endregion Scene/Avatar
  8157. #region Objects/m_sceneObjects
  8158. private bool HandleObjectLink(IClientAPI sender, Packet Pack)
  8159. {
  8160. ObjectLinkPacket link = (ObjectLinkPacket)Pack;
  8161. #region Packet Session and User Check
  8162. if (link.AgentData.SessionID != SessionId ||
  8163. link.AgentData.AgentID != AgentId)
  8164. return true;
  8165. #endregion
  8166. uint parentprimid = 0;
  8167. List<uint> childrenprims = new List<uint>();
  8168. if (link.ObjectData.Length > 1)
  8169. {
  8170. parentprimid = link.ObjectData[0].ObjectLocalID;
  8171. for (int i = 1; i < link.ObjectData.Length; i++)
  8172. {
  8173. childrenprims.Add(link.ObjectData[i].ObjectLocalID);
  8174. }
  8175. }
  8176. LinkObjects handlerLinkObjects = OnLinkObjects;
  8177. if (handlerLinkObjects != null)
  8178. {
  8179. handlerLinkObjects(this, parentprimid, childrenprims);
  8180. }
  8181. return true;
  8182. }
  8183. private bool HandleObjectDelink(IClientAPI sender, Packet Pack)
  8184. {
  8185. ObjectDelinkPacket delink = (ObjectDelinkPacket)Pack;
  8186. #region Packet Session and User Check
  8187. if (delink.AgentData.SessionID != SessionId ||
  8188. delink.AgentData.AgentID != AgentId)
  8189. return true;
  8190. #endregion
  8191. // It appears the prim at index 0 is not always the root prim (for
  8192. // instance, when one prim of a link set has been edited independently
  8193. // of the others). Therefore, we'll pass all the ids onto the delink
  8194. // method for it to decide which is the root.
  8195. List<uint> prims = new List<uint>();
  8196. for (int i = 0; i < delink.ObjectData.Length; i++)
  8197. {
  8198. prims.Add(delink.ObjectData[i].ObjectLocalID);
  8199. }
  8200. DelinkObjects handlerDelinkObjects = OnDelinkObjects;
  8201. if (handlerDelinkObjects != null)
  8202. {
  8203. handlerDelinkObjects(prims, this);
  8204. }
  8205. return true;
  8206. }
  8207. private bool HandleObjectAdd(IClientAPI sender, Packet Pack)
  8208. {
  8209. if (OnAddPrim != null)
  8210. {
  8211. ObjectAddPacket addPacket = (ObjectAddPacket)Pack;
  8212. #region Packet Session and User Check
  8213. if (addPacket.AgentData.SessionID != SessionId ||
  8214. addPacket.AgentData.AgentID != AgentId)
  8215. return true;
  8216. #endregion
  8217. PrimitiveBaseShape shape = GetShapeFromAddPacket(addPacket);
  8218. // m_log.Info("[REZData]: " + addPacket.ToString());
  8219. //BypassRaycast: 1
  8220. //RayStart: <69.79469, 158.2652, 98.40343>
  8221. //RayEnd: <61.97724, 141.995, 92.58341>
  8222. //RayTargetID: 00000000-0000-0000-0000-000000000000
  8223. //Check to see if adding the prim is allowed; useful for any module wanting to restrict the
  8224. //object from rezing initially
  8225. AddNewPrim handlerAddPrim = OnAddPrim;
  8226. if (handlerAddPrim != null)
  8227. handlerAddPrim(AgentId, addPacket.AgentData.GroupID, addPacket.ObjectData.RayEnd, addPacket.ObjectData.Rotation, shape, addPacket.ObjectData.BypassRaycast, addPacket.ObjectData.RayStart, addPacket.ObjectData.RayTargetID, addPacket.ObjectData.RayEndIsIntersection);
  8228. }
  8229. return true;
  8230. }
  8231. private bool HandleObjectShape(IClientAPI sender, Packet Pack)
  8232. {
  8233. ObjectShapePacket shapePacket = (ObjectShapePacket)Pack;
  8234. #region Packet Session and User Check
  8235. if (shapePacket.AgentData.SessionID != SessionId ||
  8236. shapePacket.AgentData.AgentID != AgentId)
  8237. return true;
  8238. #endregion
  8239. UpdateShape handlerUpdatePrimShape = null;
  8240. for (int i = 0; i < shapePacket.ObjectData.Length; i++)
  8241. {
  8242. handlerUpdatePrimShape = OnUpdatePrimShape;
  8243. if (handlerUpdatePrimShape != null)
  8244. {
  8245. UpdateShapeArgs shapeData = new UpdateShapeArgs();
  8246. shapeData.ObjectLocalID = shapePacket.ObjectData[i].ObjectLocalID;
  8247. shapeData.PathBegin = shapePacket.ObjectData[i].PathBegin;
  8248. shapeData.PathCurve = shapePacket.ObjectData[i].PathCurve;
  8249. shapeData.PathEnd = shapePacket.ObjectData[i].PathEnd;
  8250. shapeData.PathRadiusOffset = shapePacket.ObjectData[i].PathRadiusOffset;
  8251. shapeData.PathRevolutions = shapePacket.ObjectData[i].PathRevolutions;
  8252. shapeData.PathScaleX = shapePacket.ObjectData[i].PathScaleX;
  8253. shapeData.PathScaleY = shapePacket.ObjectData[i].PathScaleY;
  8254. shapeData.PathShearX = shapePacket.ObjectData[i].PathShearX;
  8255. shapeData.PathShearY = shapePacket.ObjectData[i].PathShearY;
  8256. shapeData.PathSkew = shapePacket.ObjectData[i].PathSkew;
  8257. shapeData.PathTaperX = shapePacket.ObjectData[i].PathTaperX;
  8258. shapeData.PathTaperY = shapePacket.ObjectData[i].PathTaperY;
  8259. shapeData.PathTwist = shapePacket.ObjectData[i].PathTwist;
  8260. shapeData.PathTwistBegin = shapePacket.ObjectData[i].PathTwistBegin;
  8261. shapeData.ProfileBegin = shapePacket.ObjectData[i].ProfileBegin;
  8262. shapeData.ProfileCurve = shapePacket.ObjectData[i].ProfileCurve;
  8263. shapeData.ProfileEnd = shapePacket.ObjectData[i].ProfileEnd;
  8264. shapeData.ProfileHollow = shapePacket.ObjectData[i].ProfileHollow;
  8265. handlerUpdatePrimShape(m_agentId, shapePacket.ObjectData[i].ObjectLocalID,
  8266. shapeData);
  8267. }
  8268. }
  8269. return true;
  8270. }
  8271. private bool HandleObjectExtraParams(IClientAPI sender, Packet Pack)
  8272. {
  8273. ObjectExtraParamsPacket extraPar = (ObjectExtraParamsPacket)Pack;
  8274. #region Packet Session and User Check
  8275. if (extraPar.AgentData.SessionID != SessionId ||
  8276. extraPar.AgentData.AgentID != AgentId)
  8277. return true;
  8278. #endregion
  8279. ObjectExtraParams handlerUpdateExtraParams = OnUpdateExtraParams;
  8280. if (handlerUpdateExtraParams != null)
  8281. {
  8282. for (int i = 0; i < extraPar.ObjectData.Length; i++)
  8283. {
  8284. handlerUpdateExtraParams(m_agentId, extraPar.ObjectData[i].ObjectLocalID,
  8285. extraPar.ObjectData[i].ParamType,
  8286. extraPar.ObjectData[i].ParamInUse, extraPar.ObjectData[i].ParamData);
  8287. }
  8288. }
  8289. return true;
  8290. }
  8291. private bool HandleObjectDuplicate(IClientAPI sender, Packet Pack)
  8292. {
  8293. ObjectDuplicatePacket dupe = (ObjectDuplicatePacket)Pack;
  8294. #region Packet Session and User Check
  8295. if (dupe.AgentData.SessionID != SessionId ||
  8296. dupe.AgentData.AgentID != AgentId)
  8297. return true;
  8298. #endregion
  8299. // ObjectDuplicatePacket.AgentDataBlock AgentandGroupData = dupe.AgentData;
  8300. ObjectDuplicate handlerObjectDuplicate = null;
  8301. handlerObjectDuplicate = OnObjectDuplicate;
  8302. if (handlerObjectDuplicate != null)
  8303. {
  8304. for (int i = 0; i < dupe.ObjectData.Length; i++)
  8305. {
  8306. UUID rezGroupID = dupe.AgentData.GroupID;
  8307. if(!IsGroupMember(rezGroupID))
  8308. rezGroupID = UUID.Zero;
  8309. handlerObjectDuplicate(dupe.ObjectData[i].ObjectLocalID, dupe.SharedData.Offset,
  8310. dupe.SharedData.DuplicateFlags, AgentId,
  8311. rezGroupID);
  8312. }
  8313. }
  8314. return true;
  8315. }
  8316. private bool HandleRequestMultipleObjects(IClientAPI sender, Packet Pack)
  8317. {
  8318. ObjectRequest handlerObjectRequest = OnObjectRequest;
  8319. if (handlerObjectRequest == null)
  8320. return false;
  8321. RequestMultipleObjectsPacket incomingRequest = (RequestMultipleObjectsPacket)Pack;
  8322. #region Packet Session and User Check
  8323. if (incomingRequest.AgentData.SessionID != SessionId ||
  8324. incomingRequest.AgentData.AgentID != AgentId)
  8325. return true;
  8326. #endregion
  8327. for (int i = 0; i < incomingRequest.ObjectData.Length; i++)
  8328. handlerObjectRequest(incomingRequest.ObjectData[i].ID, this);
  8329. return true;
  8330. }
  8331. private bool HandleObjectSelect(IClientAPI sender, Packet Pack)
  8332. {
  8333. ObjectSelectPacket incomingselect = (ObjectSelectPacket)Pack;
  8334. #region Packet Session and User Check
  8335. if (incomingselect.AgentData.SessionID != SessionId ||
  8336. incomingselect.AgentData.AgentID != AgentId)
  8337. return true;
  8338. #endregion
  8339. List<uint> thisSelection = new List<uint>();
  8340. ObjectSelect handlerObjectSelect = null;
  8341. uint objID;
  8342. handlerObjectSelect = OnObjectSelect;
  8343. if (handlerObjectSelect != null)
  8344. {
  8345. for (int i = 0; i < incomingselect.ObjectData.Length; i++)
  8346. {
  8347. objID = incomingselect.ObjectData[i].ObjectLocalID;
  8348. thisSelection.Add(objID);
  8349. }
  8350. handlerObjectSelect(thisSelection, this);
  8351. }
  8352. return true;
  8353. }
  8354. private bool HandleObjectDeselect(IClientAPI sender, Packet Pack)
  8355. {
  8356. ObjectDeselectPacket incomingdeselect = (ObjectDeselectPacket)Pack;
  8357. #region Packet Session and User Check
  8358. if (incomingdeselect.AgentData.SessionID != SessionId ||
  8359. incomingdeselect.AgentData.AgentID != AgentId)
  8360. return true;
  8361. #endregion
  8362. ObjectDeselect handlerObjectDeselect = null;
  8363. uint objID;
  8364. for (int i = 0; i < incomingdeselect.ObjectData.Length; i++)
  8365. {
  8366. objID = incomingdeselect.ObjectData[i].ObjectLocalID;
  8367. handlerObjectDeselect = OnObjectDeselect;
  8368. if (handlerObjectDeselect != null)
  8369. {
  8370. OnObjectDeselect(objID, this);
  8371. }
  8372. }
  8373. return true;
  8374. }
  8375. private bool HandleObjectPosition(IClientAPI sender, Packet Pack)
  8376. {
  8377. // DEPRECATED: but till libsecondlife removes it, people will use it
  8378. ObjectPositionPacket position = (ObjectPositionPacket)Pack;
  8379. #region Packet Session and User Check
  8380. if (position.AgentData.SessionID != SessionId ||
  8381. position.AgentData.AgentID != AgentId)
  8382. return true;
  8383. #endregion
  8384. for (int i = 0; i < position.ObjectData.Length; i++)
  8385. {
  8386. UpdateVector handlerUpdateVector = OnUpdatePrimGroupPosition;
  8387. if (handlerUpdateVector != null)
  8388. handlerUpdateVector(position.ObjectData[i].ObjectLocalID, position.ObjectData[i].Position, this);
  8389. }
  8390. return true;
  8391. }
  8392. private bool HandleObjectScale(IClientAPI sender, Packet Pack)
  8393. {
  8394. // DEPRECATED: but till libsecondlife removes it, people will use it
  8395. ObjectScalePacket scale = (ObjectScalePacket)Pack;
  8396. #region Packet Session and User Check
  8397. if (scale.AgentData.SessionID != SessionId ||
  8398. scale.AgentData.AgentID != AgentId)
  8399. return true;
  8400. #endregion
  8401. for (int i = 0; i < scale.ObjectData.Length; i++)
  8402. {
  8403. UpdateVector handlerUpdatePrimGroupScale = OnUpdatePrimGroupScale;
  8404. if (handlerUpdatePrimGroupScale != null)
  8405. handlerUpdatePrimGroupScale(scale.ObjectData[i].ObjectLocalID, scale.ObjectData[i].Scale, this);
  8406. }
  8407. return true;
  8408. }
  8409. private bool HandleObjectRotation(IClientAPI sender, Packet Pack)
  8410. {
  8411. // DEPRECATED: but till libsecondlife removes it, people will use it
  8412. ObjectRotationPacket rotation = (ObjectRotationPacket)Pack;
  8413. #region Packet Session and User Check
  8414. if (rotation.AgentData.SessionID != SessionId ||
  8415. rotation.AgentData.AgentID != AgentId)
  8416. return true;
  8417. #endregion
  8418. for (int i = 0; i < rotation.ObjectData.Length; i++)
  8419. {
  8420. UpdatePrimRotation handlerUpdatePrimRotation = OnUpdatePrimGroupRotation;
  8421. if (handlerUpdatePrimRotation != null)
  8422. handlerUpdatePrimRotation(rotation.ObjectData[i].ObjectLocalID, rotation.ObjectData[i].Rotation, this);
  8423. }
  8424. return true;
  8425. }
  8426. private bool HandleObjectFlagUpdate(IClientAPI sender, Packet Pack)
  8427. {
  8428. ObjectFlagUpdatePacket flags = (ObjectFlagUpdatePacket)Pack;
  8429. #region Packet Session and User Check
  8430. if (flags.AgentData.SessionID != SessionId ||
  8431. flags.AgentData.AgentID != AgentId)
  8432. return true;
  8433. #endregion
  8434. UpdatePrimFlags handlerUpdatePrimFlags = OnUpdatePrimFlags;
  8435. if (handlerUpdatePrimFlags != null)
  8436. {
  8437. // byte[] data = Pack.ToBytes();
  8438. // 46,47,48 are special positions within the packet
  8439. // This may change so perhaps we need a better way
  8440. // of storing this (OMV.FlagUpdatePacket.UsePhysics,etc?)
  8441. /*
  8442. bool UsePhysics = (data[46] != 0) ? true : false;
  8443. bool IsTemporary = (data[47] != 0) ? true : false;
  8444. bool IsPhantom = (data[48] != 0) ? true : false;
  8445. handlerUpdatePrimFlags(flags.AgentData.ObjectLocalID, UsePhysics, IsTemporary, IsPhantom, this);
  8446. */
  8447. bool UsePhysics = flags.AgentData.UsePhysics;
  8448. bool IsPhantom = flags.AgentData.IsPhantom;
  8449. bool IsTemporary = flags.AgentData.IsTemporary;
  8450. ObjectFlagUpdatePacket.ExtraPhysicsBlock[] blocks = flags.ExtraPhysics;
  8451. ExtraPhysicsData physdata = new ExtraPhysicsData();
  8452. if (blocks == null || blocks.Length == 0)
  8453. {
  8454. physdata.PhysShapeType = PhysShapeType.invalid;
  8455. }
  8456. else
  8457. {
  8458. ObjectFlagUpdatePacket.ExtraPhysicsBlock phsblock = blocks[0];
  8459. physdata.PhysShapeType = (PhysShapeType)phsblock.PhysicsShapeType;
  8460. physdata.Bounce = phsblock.Restitution;
  8461. physdata.Density = phsblock.Density;
  8462. physdata.Friction = phsblock.Friction;
  8463. physdata.GravitationModifier = phsblock.GravityMultiplier;
  8464. }
  8465. handlerUpdatePrimFlags(flags.AgentData.ObjectLocalID, UsePhysics, IsTemporary, IsPhantom, physdata, this);
  8466. }
  8467. return true;
  8468. }
  8469. Dictionary<uint, uint> objImageSeqs = null;
  8470. double lastobjImageSeqsMS = 0.0;
  8471. private bool HandleObjectImage(IClientAPI sender, Packet Pack)
  8472. {
  8473. ObjectImagePacket imagePack = (ObjectImagePacket)Pack;
  8474. UpdatePrimTexture handlerUpdatePrimTexture = OnUpdatePrimTexture;
  8475. if (handlerUpdatePrimTexture == null)
  8476. return true;
  8477. double now = Util.GetTimeStampMS();
  8478. if(objImageSeqs == null || ( now - lastobjImageSeqsMS > 30000.0))
  8479. {
  8480. objImageSeqs = null; // yeah i know superstition...
  8481. objImageSeqs = new Dictionary<uint, uint>(16);
  8482. }
  8483. lastobjImageSeqsMS = now;
  8484. uint seq = Pack.Header.Sequence;
  8485. uint id;
  8486. uint lastseq;
  8487. ObjectImagePacket.ObjectDataBlock o;
  8488. for (int i = 0; i < imagePack.ObjectData.Length; i++)
  8489. {
  8490. o = imagePack.ObjectData[i];
  8491. id = o.ObjectLocalID;
  8492. if(objImageSeqs.TryGetValue(id, out lastseq))
  8493. {
  8494. if(seq <= lastseq)
  8495. continue;
  8496. }
  8497. objImageSeqs[id] = seq;
  8498. handlerUpdatePrimTexture(id, o.TextureEntry, this);
  8499. }
  8500. return true;
  8501. }
  8502. private bool HandleObjectGrab(IClientAPI sender, Packet Pack)
  8503. {
  8504. ObjectGrabPacket grab = (ObjectGrabPacket)Pack;
  8505. #region Packet Session and User Check
  8506. if (grab.AgentData.SessionID != SessionId ||
  8507. grab.AgentData.AgentID != AgentId)
  8508. return true;
  8509. #endregion
  8510. GrabObject handlerGrabObject = OnGrabObject;
  8511. if (handlerGrabObject != null)
  8512. {
  8513. List<SurfaceTouchEventArgs> touchArgs = new List<SurfaceTouchEventArgs>();
  8514. if ((grab.SurfaceInfo != null) && (grab.SurfaceInfo.Length > 0))
  8515. {
  8516. foreach (ObjectGrabPacket.SurfaceInfoBlock surfaceInfo in grab.SurfaceInfo)
  8517. {
  8518. SurfaceTouchEventArgs arg = new SurfaceTouchEventArgs();
  8519. arg.Binormal = surfaceInfo.Binormal;
  8520. arg.FaceIndex = surfaceInfo.FaceIndex;
  8521. arg.Normal = surfaceInfo.Normal;
  8522. arg.Position = surfaceInfo.Position;
  8523. arg.STCoord = surfaceInfo.STCoord;
  8524. arg.UVCoord = surfaceInfo.UVCoord;
  8525. touchArgs.Add(arg);
  8526. }
  8527. }
  8528. handlerGrabObject(grab.ObjectData.LocalID, grab.ObjectData.GrabOffset, this, touchArgs);
  8529. }
  8530. return true;
  8531. }
  8532. private bool HandleObjectGrabUpdate(IClientAPI sender, Packet Pack)
  8533. {
  8534. ObjectGrabUpdatePacket grabUpdate = (ObjectGrabUpdatePacket)Pack;
  8535. #region Packet Session and User Check
  8536. if (grabUpdate.AgentData.SessionID != SessionId ||
  8537. grabUpdate.AgentData.AgentID != AgentId)
  8538. return true;
  8539. #endregion
  8540. MoveObject handlerGrabUpdate = OnGrabUpdate;
  8541. if (handlerGrabUpdate != null)
  8542. {
  8543. List<SurfaceTouchEventArgs> touchArgs = new List<SurfaceTouchEventArgs>();
  8544. if ((grabUpdate.SurfaceInfo != null) && (grabUpdate.SurfaceInfo.Length > 0))
  8545. {
  8546. foreach (ObjectGrabUpdatePacket.SurfaceInfoBlock surfaceInfo in grabUpdate.SurfaceInfo)
  8547. {
  8548. SurfaceTouchEventArgs arg = new SurfaceTouchEventArgs();
  8549. arg.Binormal = surfaceInfo.Binormal;
  8550. arg.FaceIndex = surfaceInfo.FaceIndex;
  8551. arg.Normal = surfaceInfo.Normal;
  8552. arg.Position = surfaceInfo.Position;
  8553. arg.STCoord = surfaceInfo.STCoord;
  8554. arg.UVCoord = surfaceInfo.UVCoord;
  8555. touchArgs.Add(arg);
  8556. }
  8557. }
  8558. handlerGrabUpdate(grabUpdate.ObjectData.ObjectID, grabUpdate.ObjectData.GrabOffsetInitial,
  8559. grabUpdate.ObjectData.GrabPosition, this, touchArgs);
  8560. }
  8561. return true;
  8562. }
  8563. private bool HandleObjectDeGrab(IClientAPI sender, Packet Pack)
  8564. {
  8565. ObjectDeGrabPacket deGrab = (ObjectDeGrabPacket)Pack;
  8566. #region Packet Session and User Check
  8567. if (deGrab.AgentData.SessionID != SessionId ||
  8568. deGrab.AgentData.AgentID != AgentId)
  8569. return true;
  8570. #endregion
  8571. DeGrabObject handlerDeGrabObject = OnDeGrabObject;
  8572. if (handlerDeGrabObject != null)
  8573. {
  8574. List<SurfaceTouchEventArgs> touchArgs = new List<SurfaceTouchEventArgs>();
  8575. if ((deGrab.SurfaceInfo != null) && (deGrab.SurfaceInfo.Length > 0))
  8576. {
  8577. foreach (ObjectDeGrabPacket.SurfaceInfoBlock surfaceInfo in deGrab.SurfaceInfo)
  8578. {
  8579. SurfaceTouchEventArgs arg = new SurfaceTouchEventArgs();
  8580. arg.Binormal = surfaceInfo.Binormal;
  8581. arg.FaceIndex = surfaceInfo.FaceIndex;
  8582. arg.Normal = surfaceInfo.Normal;
  8583. arg.Position = surfaceInfo.Position;
  8584. arg.STCoord = surfaceInfo.STCoord;
  8585. arg.UVCoord = surfaceInfo.UVCoord;
  8586. touchArgs.Add(arg);
  8587. }
  8588. }
  8589. handlerDeGrabObject(deGrab.ObjectData.LocalID, this, touchArgs);
  8590. }
  8591. return true;
  8592. }
  8593. private bool HandleObjectSpinStart(IClientAPI sender, Packet Pack)
  8594. {
  8595. //m_log.Warn("[CLIENT]: unhandled ObjectSpinStart packet");
  8596. ObjectSpinStartPacket spinStart = (ObjectSpinStartPacket)Pack;
  8597. #region Packet Session and User Check
  8598. if (spinStart.AgentData.SessionID != SessionId ||
  8599. spinStart.AgentData.AgentID != AgentId)
  8600. return true;
  8601. #endregion
  8602. SpinStart handlerSpinStart = OnSpinStart;
  8603. if (handlerSpinStart != null)
  8604. {
  8605. handlerSpinStart(spinStart.ObjectData.ObjectID, this);
  8606. }
  8607. return true;
  8608. }
  8609. private bool HandleObjectSpinUpdate(IClientAPI sender, Packet Pack)
  8610. {
  8611. //m_log.Warn("[CLIENT]: unhandled ObjectSpinUpdate packet");
  8612. ObjectSpinUpdatePacket spinUpdate = (ObjectSpinUpdatePacket)Pack;
  8613. #region Packet Session and User Check
  8614. if (spinUpdate.AgentData.SessionID != SessionId ||
  8615. spinUpdate.AgentData.AgentID != AgentId)
  8616. return true;
  8617. #endregion
  8618. Vector3 axis;
  8619. float angle;
  8620. spinUpdate.ObjectData.Rotation.GetAxisAngle(out axis, out angle);
  8621. //m_log.Warn("[CLIENT]: ObjectSpinUpdate packet rot axis:" + axis + " angle:" + angle);
  8622. SpinObject handlerSpinUpdate = OnSpinUpdate;
  8623. if (handlerSpinUpdate != null)
  8624. {
  8625. handlerSpinUpdate(spinUpdate.ObjectData.ObjectID, spinUpdate.ObjectData.Rotation, this);
  8626. }
  8627. return true;
  8628. }
  8629. private bool HandleObjectSpinStop(IClientAPI sender, Packet Pack)
  8630. {
  8631. //m_log.Warn("[CLIENT]: unhandled ObjectSpinStop packet");
  8632. ObjectSpinStopPacket spinStop = (ObjectSpinStopPacket)Pack;
  8633. #region Packet Session and User Check
  8634. if (spinStop.AgentData.SessionID != SessionId ||
  8635. spinStop.AgentData.AgentID != AgentId)
  8636. return true;
  8637. #endregion
  8638. SpinStop handlerSpinStop = OnSpinStop;
  8639. if (handlerSpinStop != null)
  8640. {
  8641. handlerSpinStop(spinStop.ObjectData.ObjectID, this);
  8642. }
  8643. return true;
  8644. }
  8645. private bool HandleObjectDescription(IClientAPI sender, Packet Pack)
  8646. {
  8647. ObjectDescriptionPacket objDes = (ObjectDescriptionPacket)Pack;
  8648. #region Packet Session and User Check
  8649. if (objDes.AgentData.SessionID != SessionId ||
  8650. objDes.AgentData.AgentID != AgentId)
  8651. return true;
  8652. #endregion
  8653. GenericCall7 handlerObjectDescription = null;
  8654. for (int i = 0; i < objDes.ObjectData.Length; i++)
  8655. {
  8656. handlerObjectDescription = OnObjectDescription;
  8657. if (handlerObjectDescription != null)
  8658. {
  8659. handlerObjectDescription(this, objDes.ObjectData[i].LocalID,
  8660. Util.FieldToString(objDes.ObjectData[i].Description));
  8661. }
  8662. }
  8663. return true;
  8664. }
  8665. private bool HandleObjectName(IClientAPI sender, Packet Pack)
  8666. {
  8667. ObjectNamePacket objName = (ObjectNamePacket)Pack;
  8668. #region Packet Session and User Check
  8669. if (objName.AgentData.SessionID != SessionId ||
  8670. objName.AgentData.AgentID != AgentId)
  8671. return true;
  8672. #endregion
  8673. GenericCall7 handlerObjectName = null;
  8674. for (int i = 0; i < objName.ObjectData.Length; i++)
  8675. {
  8676. handlerObjectName = OnObjectName;
  8677. if (handlerObjectName != null)
  8678. {
  8679. handlerObjectName(this, objName.ObjectData[i].LocalID,
  8680. Util.FieldToString(objName.ObjectData[i].Name));
  8681. }
  8682. }
  8683. return true;
  8684. }
  8685. private bool HandleObjectPermissions(IClientAPI sender, Packet Pack)
  8686. {
  8687. if (OnObjectPermissions != null)
  8688. {
  8689. ObjectPermissionsPacket newobjPerms = (ObjectPermissionsPacket)Pack;
  8690. #region Packet Session and User Check
  8691. if (newobjPerms.AgentData.SessionID != SessionId ||
  8692. newobjPerms.AgentData.AgentID != AgentId)
  8693. return true;
  8694. #endregion
  8695. UUID AgentID = newobjPerms.AgentData.AgentID;
  8696. UUID SessionID = newobjPerms.AgentData.SessionID;
  8697. ObjectPermissions handlerObjectPermissions = null;
  8698. for (int i = 0; i < newobjPerms.ObjectData.Length; i++)
  8699. {
  8700. ObjectPermissionsPacket.ObjectDataBlock permChanges = newobjPerms.ObjectData[i];
  8701. byte field = permChanges.Field;
  8702. uint localID = permChanges.ObjectLocalID;
  8703. uint mask = permChanges.Mask;
  8704. byte set = permChanges.Set;
  8705. handlerObjectPermissions = OnObjectPermissions;
  8706. if (handlerObjectPermissions != null)
  8707. handlerObjectPermissions(this, AgentID, SessionID, field, localID, mask, set);
  8708. }
  8709. }
  8710. // Here's our data,
  8711. // PermField contains the field the info goes into
  8712. // PermField determines which mask we're changing
  8713. //
  8714. // chmask is the mask of the change
  8715. // setTF is whether we're adding it or taking it away
  8716. //
  8717. // objLocalID is the localID of the object.
  8718. // Unfortunately, we have to pass the event the packet because objData is an array
  8719. // That means multiple object perms may be updated in a single packet.
  8720. return true;
  8721. }
  8722. private bool HandleUndo(IClientAPI sender, Packet Pack)
  8723. {
  8724. UndoPacket undoitem = (UndoPacket)Pack;
  8725. #region Packet Session and User Check
  8726. if (undoitem.AgentData.SessionID != SessionId ||
  8727. undoitem.AgentData.AgentID != AgentId)
  8728. return true;
  8729. #endregion
  8730. if (undoitem.ObjectData.Length > 0)
  8731. {
  8732. for (int i = 0; i < undoitem.ObjectData.Length; i++)
  8733. {
  8734. UUID objiD = undoitem.ObjectData[i].ObjectID;
  8735. AgentSit handlerOnUndo = OnUndo;
  8736. if (handlerOnUndo != null)
  8737. {
  8738. handlerOnUndo(this, objiD);
  8739. }
  8740. }
  8741. }
  8742. return true;
  8743. }
  8744. private bool HandleLandUndo(IClientAPI sender, Packet Pack)
  8745. {
  8746. UndoLandPacket undolanditem = (UndoLandPacket)Pack;
  8747. #region Packet Session and User Check
  8748. if (undolanditem.AgentData.SessionID != SessionId ||
  8749. undolanditem.AgentData.AgentID != AgentId)
  8750. return true;
  8751. #endregion
  8752. LandUndo handlerOnUndo = OnLandUndo;
  8753. if (handlerOnUndo != null)
  8754. {
  8755. handlerOnUndo(this);
  8756. }
  8757. return true;
  8758. }
  8759. private bool HandleRedo(IClientAPI sender, Packet Pack)
  8760. {
  8761. RedoPacket redoitem = (RedoPacket)Pack;
  8762. #region Packet Session and User Check
  8763. if (redoitem.AgentData.SessionID != SessionId ||
  8764. redoitem.AgentData.AgentID != AgentId)
  8765. return true;
  8766. #endregion
  8767. if (redoitem.ObjectData.Length > 0)
  8768. {
  8769. for (int i = 0; i < redoitem.ObjectData.Length; i++)
  8770. {
  8771. UUID objiD = redoitem.ObjectData[i].ObjectID;
  8772. AgentSit handlerOnRedo = OnRedo;
  8773. if (handlerOnRedo != null)
  8774. {
  8775. handlerOnRedo(this, objiD);
  8776. }
  8777. }
  8778. }
  8779. return true;
  8780. }
  8781. private bool HandleObjectDuplicateOnRay(IClientAPI sender, Packet Pack)
  8782. {
  8783. ObjectDuplicateOnRayPacket dupeOnRay = (ObjectDuplicateOnRayPacket)Pack;
  8784. #region Packet Session and User Check
  8785. if (dupeOnRay.AgentData.SessionID != SessionId ||
  8786. dupeOnRay.AgentData.AgentID != AgentId)
  8787. return true;
  8788. #endregion
  8789. ObjectDuplicateOnRay handlerObjectDuplicateOnRay = null;
  8790. for (int i = 0; i < dupeOnRay.ObjectData.Length; i++)
  8791. {
  8792. handlerObjectDuplicateOnRay = OnObjectDuplicateOnRay;
  8793. if (handlerObjectDuplicateOnRay != null)
  8794. {
  8795. UUID rezGroupID = dupeOnRay.AgentData.GroupID;
  8796. if(!IsGroupMember(rezGroupID))
  8797. rezGroupID = UUID.Zero;
  8798. handlerObjectDuplicateOnRay(dupeOnRay.ObjectData[i].ObjectLocalID,
  8799. dupeOnRay.AgentData.DuplicateFlags, AgentId, rezGroupID,
  8800. dupeOnRay.AgentData.RayTargetID, dupeOnRay.AgentData.RayEnd,
  8801. dupeOnRay.AgentData.RayStart, dupeOnRay.AgentData.BypassRaycast,
  8802. dupeOnRay.AgentData.RayEndIsIntersection,
  8803. dupeOnRay.AgentData.CopyCenters, dupeOnRay.AgentData.CopyRotates);
  8804. }
  8805. }
  8806. return true;
  8807. }
  8808. private bool HandleRequestObjectPropertiesFamily(IClientAPI sender, Packet Pack)
  8809. {
  8810. //This powers the little tooltip that appears when you move your mouse over an object
  8811. RequestObjectPropertiesFamilyPacket packToolTip = (RequestObjectPropertiesFamilyPacket)Pack;
  8812. #region Packet Session and User Check
  8813. if (packToolTip.AgentData.SessionID != SessionId ||
  8814. packToolTip.AgentData.AgentID != AgentId)
  8815. return true;
  8816. #endregion
  8817. RequestObjectPropertiesFamilyPacket.ObjectDataBlock packObjBlock = packToolTip.ObjectData;
  8818. RequestObjectPropertiesFamily handlerRequestObjectPropertiesFamily = OnRequestObjectPropertiesFamily;
  8819. if (handlerRequestObjectPropertiesFamily != null)
  8820. {
  8821. handlerRequestObjectPropertiesFamily(this, m_agentId, packObjBlock.RequestFlags,
  8822. packObjBlock.ObjectID);
  8823. }
  8824. return true;
  8825. }
  8826. private bool HandleObjectIncludeInSearch(IClientAPI sender, Packet Pack)
  8827. {
  8828. //This lets us set objects to appear in search (stuff like DataSnapshot, etc)
  8829. ObjectIncludeInSearchPacket packInSearch = (ObjectIncludeInSearchPacket)Pack;
  8830. ObjectIncludeInSearch handlerObjectIncludeInSearch = null;
  8831. #region Packet Session and User Check
  8832. if (packInSearch.AgentData.SessionID != SessionId ||
  8833. packInSearch.AgentData.AgentID != AgentId)
  8834. return true;
  8835. #endregion
  8836. foreach (ObjectIncludeInSearchPacket.ObjectDataBlock objData in packInSearch.ObjectData)
  8837. {
  8838. bool inSearch = objData.IncludeInSearch;
  8839. uint localID = objData.ObjectLocalID;
  8840. handlerObjectIncludeInSearch = OnObjectIncludeInSearch;
  8841. if (handlerObjectIncludeInSearch != null)
  8842. {
  8843. handlerObjectIncludeInSearch(this, inSearch, localID);
  8844. }
  8845. }
  8846. return true;
  8847. }
  8848. private bool HandleScriptAnswerYes(IClientAPI sender, Packet Pack)
  8849. {
  8850. ScriptAnswerYesPacket scriptAnswer = (ScriptAnswerYesPacket)Pack;
  8851. #region Packet Session and User Check
  8852. if (scriptAnswer.AgentData.SessionID != SessionId ||
  8853. scriptAnswer.AgentData.AgentID != AgentId)
  8854. return true;
  8855. #endregion
  8856. ScriptAnswer handlerScriptAnswer = OnScriptAnswer;
  8857. if (handlerScriptAnswer != null)
  8858. {
  8859. handlerScriptAnswer(this, scriptAnswer.Data.TaskID, scriptAnswer.Data.ItemID, scriptAnswer.Data.Questions);
  8860. }
  8861. return true;
  8862. }
  8863. private bool HandleObjectClickAction(IClientAPI sender, Packet Pack)
  8864. {
  8865. ObjectClickActionPacket ocpacket = (ObjectClickActionPacket)Pack;
  8866. #region Packet Session and User Check
  8867. if (ocpacket.AgentData.SessionID != SessionId ||
  8868. ocpacket.AgentData.AgentID != AgentId)
  8869. return true;
  8870. #endregion
  8871. GenericCall7 handlerObjectClickAction = OnObjectClickAction;
  8872. if (handlerObjectClickAction != null)
  8873. {
  8874. foreach (ObjectClickActionPacket.ObjectDataBlock odata in ocpacket.ObjectData)
  8875. {
  8876. byte action = odata.ClickAction;
  8877. uint localID = odata.ObjectLocalID;
  8878. handlerObjectClickAction(this, localID, action.ToString());
  8879. }
  8880. }
  8881. return true;
  8882. }
  8883. private bool HandleObjectMaterial(IClientAPI sender, Packet Pack)
  8884. {
  8885. ObjectMaterialPacket ompacket = (ObjectMaterialPacket)Pack;
  8886. #region Packet Session and User Check
  8887. if (ompacket.AgentData.SessionID != SessionId ||
  8888. ompacket.AgentData.AgentID != AgentId)
  8889. return true;
  8890. #endregion
  8891. GenericCall7 handlerObjectMaterial = OnObjectMaterial;
  8892. if (handlerObjectMaterial != null)
  8893. {
  8894. foreach (ObjectMaterialPacket.ObjectDataBlock odata in ompacket.ObjectData)
  8895. {
  8896. byte material = odata.Material;
  8897. uint localID = odata.ObjectLocalID;
  8898. handlerObjectMaterial(this, localID, material.ToString());
  8899. }
  8900. }
  8901. return true;
  8902. }
  8903. #endregion Objects/m_sceneObjects
  8904. #region Inventory/Asset/Other related packets
  8905. private bool HandleRequestImage(IClientAPI sender, Packet Pack)
  8906. {
  8907. RequestImagePacket imageRequest = (RequestImagePacket)Pack;
  8908. //m_log.Debug("image request: " + Pack.ToString());
  8909. #region Packet Session and User Check
  8910. if (imageRequest.AgentData.SessionID != SessionId ||
  8911. imageRequest.AgentData.AgentID != AgentId)
  8912. return true;
  8913. #endregion
  8914. //handlerTextureRequest = null;
  8915. for (int i = 0; i < imageRequest.RequestImage.Length; i++)
  8916. {
  8917. TextureRequestArgs args = new TextureRequestArgs();
  8918. RequestImagePacket.RequestImageBlock block = imageRequest.RequestImage[i];
  8919. args.RequestedAssetID = block.Image;
  8920. args.DiscardLevel = block.DiscardLevel;
  8921. args.PacketNumber = block.Packet;
  8922. args.Priority = block.DownloadPriority;
  8923. args.requestSequence = imageRequest.Header.Sequence;
  8924. // NOTE: This is not a built in part of the LLUDP protocol, but we double the
  8925. // priority of avatar textures to get avatars rezzing in faster than the
  8926. // surrounding scene
  8927. if ((ImageType)block.Type == ImageType.Baked)
  8928. args.Priority *= 2.0f;
  8929. ImageManager.EnqueueReq(args);
  8930. }
  8931. return true;
  8932. }
  8933. /// <summary>
  8934. /// This is the entry point for the UDP route by which the client can retrieve asset data. If the request
  8935. /// is successful then a TransferInfo packet will be sent back, followed by one or more TransferPackets
  8936. /// </summary>
  8937. /// <param name="sender"></param>
  8938. /// <param name="Pack"></param>
  8939. /// <returns>This parameter may be ignored since we appear to return true whatever happens</returns>
  8940. private bool HandleTransferRequest(IClientAPI sender, Packet Pack)
  8941. {
  8942. //m_log.Debug("ClientView.ProcessPackets.cs:ProcessInPacket() - Got transfer request");
  8943. TransferRequestPacket transfer = (TransferRequestPacket)Pack;
  8944. UUID taskID = UUID.Zero;
  8945. if (transfer.TransferInfo.SourceType == (int)SourceType.SimInventoryItem)
  8946. {
  8947. if (!(((Scene)m_scene).Permissions.BypassPermissions()))
  8948. {
  8949. // We're spawning a thread because the permissions check can block this thread
  8950. Util.FireAndForget(delegate
  8951. {
  8952. // This requests the asset if needed
  8953. HandleSimInventoryTransferRequestWithPermsCheck(sender, transfer);
  8954. }, null, "LLClientView.HandleTransferRequest");
  8955. return true;
  8956. }
  8957. }
  8958. else if (transfer.TransferInfo.SourceType == (int)SourceType.SimEstate)
  8959. {
  8960. //TransferRequestPacket does not include covenant uuid?
  8961. //get scene covenant uuid
  8962. taskID = m_scene.RegionInfo.RegionSettings.Covenant;
  8963. }
  8964. // This is non-blocking
  8965. MakeAssetRequest(transfer, taskID);
  8966. return true;
  8967. }
  8968. private void HandleSimInventoryTransferRequestWithPermsCheck(IClientAPI sender, TransferRequestPacket transfer)
  8969. {
  8970. UUID taskID = new UUID(transfer.TransferInfo.Params, 48);
  8971. UUID itemID = new UUID(transfer.TransferInfo.Params, 64);
  8972. UUID requestID = new UUID(transfer.TransferInfo.Params, 80);
  8973. //m_log.DebugFormat(
  8974. // "[CLIENT]: Got request for asset {0} from item {1} in prim {2} by {3}",
  8975. // requestID, itemID, taskID, Name);
  8976. //m_log.Debug("Transfer Request: " + transfer.ToString());
  8977. // Validate inventory transfers
  8978. // Has to be done here, because AssetCache can't do it
  8979. //
  8980. if (taskID != UUID.Zero) // Prim
  8981. {
  8982. SceneObjectPart part = ((Scene)m_scene).GetSceneObjectPart(taskID);
  8983. if (part == null)
  8984. {
  8985. m_log.WarnFormat(
  8986. "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but prim does not exist",
  8987. Name, requestID, itemID, taskID);
  8988. return;
  8989. }
  8990. TaskInventoryItem tii = part.Inventory.GetInventoryItem(itemID);
  8991. if (tii == null)
  8992. {
  8993. m_log.WarnFormat(
  8994. "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item does not exist",
  8995. Name, requestID, itemID, taskID);
  8996. return;
  8997. }
  8998. if (tii.Type == (int)AssetType.LSLText)
  8999. {
  9000. if (!((Scene)m_scene).Permissions.CanEditScript(itemID, taskID, AgentId))
  9001. return;
  9002. }
  9003. else if (tii.Type == (int)AssetType.Notecard)
  9004. {
  9005. if (!((Scene)m_scene).Permissions.CanEditNotecard(itemID, taskID, AgentId))
  9006. return;
  9007. }
  9008. else
  9009. {
  9010. // TODO: Change this code to allow items other than notecards and scripts to be successfully
  9011. // shared with group. In fact, this whole block of permissions checking should move to an IPermissionsModule
  9012. if (part.OwnerID != AgentId)
  9013. {
  9014. m_log.WarnFormat(
  9015. "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the prim is owned by {4}",
  9016. Name, requestID, itemID, taskID, part.OwnerID);
  9017. return;
  9018. }
  9019. if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0)
  9020. {
  9021. m_log.WarnFormat(
  9022. "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but modify permissions are not set",
  9023. Name, requestID, itemID, taskID);
  9024. return;
  9025. }
  9026. if (tii.OwnerID != AgentId)
  9027. {
  9028. m_log.WarnFormat(
  9029. "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but the item is owned by {4}",
  9030. Name, requestID, itemID, taskID, tii.OwnerID);
  9031. return;
  9032. }
  9033. if ((
  9034. tii.CurrentPermissions & ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer))
  9035. != ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer))
  9036. {
  9037. m_log.WarnFormat(
  9038. "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but item permissions are not modify/copy/transfer",
  9039. Name, requestID, itemID, taskID);
  9040. return;
  9041. }
  9042. if (tii.AssetID != requestID)
  9043. {
  9044. m_log.WarnFormat(
  9045. "[CLIENT]: {0} requested asset {1} from item {2} in prim {3} but this does not match item's asset {4}",
  9046. Name, requestID, itemID, taskID, tii.AssetID);
  9047. return;
  9048. }
  9049. }
  9050. }
  9051. else // Agent
  9052. {
  9053. IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>();
  9054. if (invAccess != null)
  9055. {
  9056. if (!invAccess.CanGetAgentInventoryItem(this, itemID, requestID))
  9057. return;
  9058. }
  9059. else
  9060. {
  9061. return;
  9062. }
  9063. }
  9064. // Permissions out of the way, let's request the asset
  9065. MakeAssetRequest(transfer, taskID);
  9066. }
  9067. private bool HandleAssetUploadRequest(IClientAPI sender, Packet Pack)
  9068. {
  9069. AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack;
  9070. // m_log.Debug("upload request " + request.ToString());
  9071. // m_log.Debug("upload request was for assetid: " + request.AssetBlock.TransactionID.Combine(this.SecureSessionId).ToString());
  9072. UUID temp = UUID.Combine(request.AssetBlock.TransactionID, SecureSessionId);
  9073. UDPAssetUploadRequest handlerAssetUploadRequest = OnAssetUploadRequest;
  9074. if (handlerAssetUploadRequest != null)
  9075. {
  9076. handlerAssetUploadRequest(this, temp,
  9077. request.AssetBlock.TransactionID, request.AssetBlock.Type,
  9078. request.AssetBlock.AssetData, request.AssetBlock.StoreLocal,
  9079. request.AssetBlock.Tempfile);
  9080. }
  9081. return true;
  9082. }
  9083. private bool HandleRequestXfer(IClientAPI sender, Packet Pack)
  9084. {
  9085. RequestXferPacket xferReq = (RequestXferPacket)Pack;
  9086. OnRequestXfer?.Invoke(this, xferReq.XferID.ID, Util.FieldToString(xferReq.XferID.Filename));
  9087. return true;
  9088. }
  9089. private bool HandleSendXferPacket(IClientAPI sender, Packet Pack)
  9090. {
  9091. SendXferPacketPacket xferRec = (SendXferPacketPacket)Pack;
  9092. OnXferReceive?.Invoke(this, xferRec.XferID.ID, xferRec.XferID.Packet, xferRec.DataPacket.Data);
  9093. return true;
  9094. }
  9095. private bool HandleConfirmXferPacket(IClientAPI sender, Packet Pack)
  9096. {
  9097. ConfirmXferPacketPacket confirmXfer = (ConfirmXferPacketPacket)Pack;
  9098. OnConfirmXfer?.Invoke(this, confirmXfer.XferID.ID, confirmXfer.XferID.Packet);
  9099. return true;
  9100. }
  9101. private bool HandleAbortXfer(IClientAPI sender, Packet Pack)
  9102. {
  9103. AbortXferPacket abortXfer = (AbortXferPacket)Pack;
  9104. OnAbortXfer?.Invoke(this, abortXfer.XferID.ID);
  9105. return true;
  9106. }
  9107. private bool HandleCreateInventoryFolder(IClientAPI sender, Packet Pack)
  9108. {
  9109. CreateInventoryFolderPacket invFolder = (CreateInventoryFolderPacket)Pack;
  9110. #region Packet Session and User Check
  9111. if (invFolder.AgentData.SessionID != SessionId ||
  9112. invFolder.AgentData.AgentID != AgentId)
  9113. return true;
  9114. #endregion
  9115. CreateInventoryFolder handlerCreateInventoryFolder = OnCreateNewInventoryFolder;
  9116. if (handlerCreateInventoryFolder != null)
  9117. {
  9118. handlerCreateInventoryFolder(this, invFolder.FolderData.FolderID,
  9119. (ushort)invFolder.FolderData.Type,
  9120. Util.FieldToString(invFolder.FolderData.Name),
  9121. invFolder.FolderData.ParentID);
  9122. }
  9123. return true;
  9124. }
  9125. private bool HandleUpdateInventoryFolder(IClientAPI sender, Packet Pack)
  9126. {
  9127. if (OnUpdateInventoryFolder != null)
  9128. {
  9129. UpdateInventoryFolderPacket invFolderx = (UpdateInventoryFolderPacket)Pack;
  9130. #region Packet Session and User Check
  9131. if (invFolderx.AgentData.SessionID != SessionId ||
  9132. invFolderx.AgentData.AgentID != AgentId)
  9133. return true;
  9134. #endregion
  9135. UpdateInventoryFolder handlerUpdateInventoryFolder = null;
  9136. for (int i = 0; i < invFolderx.FolderData.Length; i++)
  9137. {
  9138. handlerUpdateInventoryFolder = OnUpdateInventoryFolder;
  9139. if (handlerUpdateInventoryFolder != null)
  9140. {
  9141. OnUpdateInventoryFolder(this, invFolderx.FolderData[i].FolderID,
  9142. (ushort)invFolderx.FolderData[i].Type,
  9143. Util.FieldToString(invFolderx.FolderData[i].Name),
  9144. invFolderx.FolderData[i].ParentID);
  9145. }
  9146. }
  9147. }
  9148. return true;
  9149. }
  9150. private bool HandleMoveInventoryFolder(IClientAPI sender, Packet Pack)
  9151. {
  9152. if (OnMoveInventoryFolder != null)
  9153. {
  9154. MoveInventoryFolderPacket invFoldery = (MoveInventoryFolderPacket)Pack;
  9155. #region Packet Session and User Check
  9156. if (invFoldery.AgentData.SessionID != SessionId ||
  9157. invFoldery.AgentData.AgentID != AgentId)
  9158. return true;
  9159. #endregion
  9160. MoveInventoryFolder handlerMoveInventoryFolder = null;
  9161. for (int i = 0; i < invFoldery.InventoryData.Length; i++)
  9162. {
  9163. handlerMoveInventoryFolder = OnMoveInventoryFolder;
  9164. if (handlerMoveInventoryFolder != null)
  9165. {
  9166. OnMoveInventoryFolder(this, invFoldery.InventoryData[i].FolderID,
  9167. invFoldery.InventoryData[i].ParentID);
  9168. }
  9169. }
  9170. }
  9171. return true;
  9172. }
  9173. private bool HandleCreateInventoryItem(IClientAPI sender, Packet Pack)
  9174. {
  9175. CreateInventoryItemPacket createItem = (CreateInventoryItemPacket)Pack;
  9176. #region Packet Session and User Check
  9177. if (createItem.AgentData.SessionID != SessionId ||
  9178. createItem.AgentData.AgentID != AgentId)
  9179. return true;
  9180. #endregion
  9181. CreateNewInventoryItem handlerCreateNewInventoryItem = OnCreateNewInventoryItem;
  9182. if (handlerCreateNewInventoryItem != null)
  9183. {
  9184. handlerCreateNewInventoryItem(this, createItem.InventoryBlock.TransactionID,
  9185. createItem.InventoryBlock.FolderID,
  9186. createItem.InventoryBlock.CallbackID,
  9187. Util.FieldToString(createItem.InventoryBlock.Description),
  9188. Util.FieldToString(createItem.InventoryBlock.Name),
  9189. createItem.InventoryBlock.InvType,
  9190. createItem.InventoryBlock.Type,
  9191. createItem.InventoryBlock.WearableType,
  9192. createItem.InventoryBlock.NextOwnerMask,
  9193. Util.UnixTimeSinceEpoch());
  9194. }
  9195. return true;
  9196. }
  9197. private bool HandleLinkInventoryItem(IClientAPI sender, Packet Pack)
  9198. {
  9199. LinkInventoryItemPacket createLink = (LinkInventoryItemPacket)Pack;
  9200. #region Packet Session and User Check
  9201. if (createLink.AgentData.SessionID != SessionId ||
  9202. createLink.AgentData.AgentID != AgentId)
  9203. return true;
  9204. #endregion
  9205. LinkInventoryItem linkInventoryItem = OnLinkInventoryItem;
  9206. if (linkInventoryItem != null)
  9207. {
  9208. linkInventoryItem(
  9209. this,
  9210. createLink.InventoryBlock.TransactionID,
  9211. createLink.InventoryBlock.FolderID,
  9212. createLink.InventoryBlock.CallbackID,
  9213. Util.FieldToString(createLink.InventoryBlock.Description),
  9214. Util.FieldToString(createLink.InventoryBlock.Name),
  9215. createLink.InventoryBlock.InvType,
  9216. createLink.InventoryBlock.Type,
  9217. createLink.InventoryBlock.OldItemID);
  9218. }
  9219. return true;
  9220. }
  9221. private bool HandleFetchInventory(IClientAPI sender, Packet Pack)
  9222. {
  9223. if (OnFetchInventory != null)
  9224. {
  9225. FetchInventoryPacket FetchInventoryx = (FetchInventoryPacket)Pack;
  9226. #region Packet Session and User Check
  9227. if (FetchInventoryx.AgentData.SessionID != SessionId ||
  9228. FetchInventoryx.AgentData.AgentID != AgentId)
  9229. return true;
  9230. #endregion
  9231. FetchInventory handlerFetchInventory = null;
  9232. for (int i = 0; i < FetchInventoryx.InventoryData.Length; i++)
  9233. {
  9234. handlerFetchInventory = OnFetchInventory;
  9235. if (handlerFetchInventory != null)
  9236. {
  9237. OnFetchInventory(this, FetchInventoryx.InventoryData[i].ItemID,
  9238. FetchInventoryx.InventoryData[i].OwnerID);
  9239. }
  9240. }
  9241. }
  9242. return true;
  9243. }
  9244. private bool HandleFetchInventoryDescendents(IClientAPI sender, Packet Pack)
  9245. {
  9246. FetchInventoryDescendentsPacket Fetch = (FetchInventoryDescendentsPacket)Pack;
  9247. #region Packet Session and User Check
  9248. if (Fetch.AgentData.SessionID != SessionId ||
  9249. Fetch.AgentData.AgentID != AgentId)
  9250. return true;
  9251. #endregion
  9252. FetchInventoryDescendents handlerFetchInventoryDescendents = OnFetchInventoryDescendents;
  9253. if (handlerFetchInventoryDescendents != null)
  9254. {
  9255. handlerFetchInventoryDescendents(this, Fetch.InventoryData.FolderID, Fetch.InventoryData.OwnerID,
  9256. Fetch.InventoryData.FetchFolders, Fetch.InventoryData.FetchItems,
  9257. Fetch.InventoryData.SortOrder);
  9258. }
  9259. return true;
  9260. }
  9261. private bool HandlePurgeInventoryDescendents(IClientAPI sender, Packet Pack)
  9262. {
  9263. PurgeInventoryDescendentsPacket Purge = (PurgeInventoryDescendentsPacket)Pack;
  9264. #region Packet Session and User Check
  9265. if (Purge.AgentData.SessionID != SessionId ||
  9266. Purge.AgentData.AgentID != AgentId)
  9267. return true;
  9268. #endregion
  9269. PurgeInventoryDescendents handlerPurgeInventoryDescendents = OnPurgeInventoryDescendents;
  9270. if (handlerPurgeInventoryDescendents != null)
  9271. {
  9272. handlerPurgeInventoryDescendents(this, Purge.InventoryData.FolderID);
  9273. }
  9274. return true;
  9275. }
  9276. private bool HandleUpdateInventoryItem(IClientAPI sender, Packet Pack)
  9277. {
  9278. UpdateInventoryItemPacket inventoryItemUpdate = (UpdateInventoryItemPacket)Pack;
  9279. #region Packet Session and User Check
  9280. if (inventoryItemUpdate.AgentData.SessionID != SessionId ||
  9281. inventoryItemUpdate.AgentData.AgentID != AgentId)
  9282. return true;
  9283. #endregion
  9284. if (OnUpdateInventoryItem != null)
  9285. {
  9286. UpdateInventoryItem handlerUpdateInventoryItem = null;
  9287. for (int i = 0; i < inventoryItemUpdate.InventoryData.Length; i++)
  9288. {
  9289. handlerUpdateInventoryItem = OnUpdateInventoryItem;
  9290. if (handlerUpdateInventoryItem != null)
  9291. {
  9292. InventoryItemBase itemUpd = new InventoryItemBase();
  9293. itemUpd.ID = inventoryItemUpdate.InventoryData[i].ItemID;
  9294. itemUpd.Name = Util.FieldToString(inventoryItemUpdate.InventoryData[i].Name);
  9295. itemUpd.Description = Util.FieldToString(inventoryItemUpdate.InventoryData[i].Description);
  9296. itemUpd.GroupID = inventoryItemUpdate.InventoryData[i].GroupID;
  9297. itemUpd.GroupOwned = inventoryItemUpdate.InventoryData[i].GroupOwned;
  9298. itemUpd.GroupPermissions = inventoryItemUpdate.InventoryData[i].GroupMask;
  9299. itemUpd.NextPermissions = inventoryItemUpdate.InventoryData[i].NextOwnerMask;
  9300. itemUpd.EveryOnePermissions = inventoryItemUpdate.InventoryData[i].EveryoneMask;
  9301. itemUpd.CreationDate = inventoryItemUpdate.InventoryData[i].CreationDate;
  9302. itemUpd.Folder = inventoryItemUpdate.InventoryData[i].FolderID;
  9303. itemUpd.InvType = inventoryItemUpdate.InventoryData[i].InvType;
  9304. itemUpd.SalePrice = inventoryItemUpdate.InventoryData[i].SalePrice;
  9305. itemUpd.SaleType = inventoryItemUpdate.InventoryData[i].SaleType;
  9306. itemUpd.Flags = inventoryItemUpdate.InventoryData[i].Flags;
  9307. OnUpdateInventoryItem(this, inventoryItemUpdate.InventoryData[i].TransactionID,
  9308. inventoryItemUpdate.InventoryData[i].ItemID,
  9309. itemUpd);
  9310. }
  9311. }
  9312. }
  9313. return true;
  9314. }
  9315. private bool HandleCopyInventoryItem(IClientAPI sender, Packet Pack)
  9316. {
  9317. CopyInventoryItemPacket copyitem = (CopyInventoryItemPacket)Pack;
  9318. #region Packet Session and User Check
  9319. if (copyitem.AgentData.SessionID != SessionId ||
  9320. copyitem.AgentData.AgentID != AgentId)
  9321. return true;
  9322. #endregion
  9323. CopyInventoryItem handlerCopyInventoryItem = null;
  9324. if (OnCopyInventoryItem != null)
  9325. {
  9326. foreach (CopyInventoryItemPacket.InventoryDataBlock datablock in copyitem.InventoryData)
  9327. {
  9328. handlerCopyInventoryItem = OnCopyInventoryItem;
  9329. if (handlerCopyInventoryItem != null)
  9330. {
  9331. handlerCopyInventoryItem(this, datablock.CallbackID, datablock.OldAgentID,
  9332. datablock.OldItemID, datablock.NewFolderID,
  9333. Util.FieldToString(datablock.NewName));
  9334. }
  9335. }
  9336. }
  9337. return true;
  9338. }
  9339. private bool HandleMoveInventoryItem(IClientAPI sender, Packet Pack)
  9340. {
  9341. MoveInventoryItemPacket moveitem = (MoveInventoryItemPacket)Pack;
  9342. #region Packet Session and User Check
  9343. if (moveitem.AgentData.SessionID != SessionId ||
  9344. moveitem.AgentData.AgentID != AgentId)
  9345. return true;
  9346. #endregion
  9347. if (OnMoveInventoryItem != null)
  9348. {
  9349. MoveInventoryItem handlerMoveInventoryItem = null;
  9350. InventoryItemBase itm = null;
  9351. List<InventoryItemBase> items = new List<InventoryItemBase>();
  9352. foreach (MoveInventoryItemPacket.InventoryDataBlock datablock in moveitem.InventoryData)
  9353. {
  9354. itm = new InventoryItemBase(datablock.ItemID, AgentId);
  9355. itm.Folder = datablock.FolderID;
  9356. itm.Name = Util.FieldToString(datablock.NewName);
  9357. // weird, comes out as empty string
  9358. //m_log.DebugFormat("[XXX] new name: {0}", itm.Name);
  9359. items.Add(itm);
  9360. }
  9361. handlerMoveInventoryItem = OnMoveInventoryItem;
  9362. if (handlerMoveInventoryItem != null)
  9363. {
  9364. handlerMoveInventoryItem(this, items);
  9365. }
  9366. }
  9367. return true;
  9368. }
  9369. private bool HandleRemoveInventoryItem(IClientAPI sender, Packet Pack)
  9370. {
  9371. RemoveInventoryItemPacket removeItem = (RemoveInventoryItemPacket)Pack;
  9372. #region Packet Session and User Check
  9373. if (removeItem.AgentData.SessionID != SessionId ||
  9374. removeItem.AgentData.AgentID != AgentId)
  9375. return true;
  9376. #endregion
  9377. if (OnRemoveInventoryItem != null)
  9378. {
  9379. RemoveInventoryItem handlerRemoveInventoryItem = null;
  9380. List<UUID> uuids = new List<UUID>();
  9381. foreach (RemoveInventoryItemPacket.InventoryDataBlock datablock in removeItem.InventoryData)
  9382. {
  9383. uuids.Add(datablock.ItemID);
  9384. }
  9385. handlerRemoveInventoryItem = OnRemoveInventoryItem;
  9386. if (handlerRemoveInventoryItem != null)
  9387. {
  9388. handlerRemoveInventoryItem(this, uuids);
  9389. }
  9390. }
  9391. return true;
  9392. }
  9393. private bool HandleRemoveInventoryFolder(IClientAPI sender, Packet Pack)
  9394. {
  9395. RemoveInventoryFolderPacket removeFolder = (RemoveInventoryFolderPacket)Pack;
  9396. #region Packet Session and User Check
  9397. if (removeFolder.AgentData.SessionID != SessionId ||
  9398. removeFolder.AgentData.AgentID != AgentId)
  9399. return true;
  9400. #endregion
  9401. if (OnRemoveInventoryFolder != null)
  9402. {
  9403. RemoveInventoryFolder handlerRemoveInventoryFolder = null;
  9404. List<UUID> uuids = new List<UUID>();
  9405. foreach (RemoveInventoryFolderPacket.FolderDataBlock datablock in removeFolder.FolderData)
  9406. {
  9407. uuids.Add(datablock.FolderID);
  9408. }
  9409. handlerRemoveInventoryFolder = OnRemoveInventoryFolder;
  9410. if (handlerRemoveInventoryFolder != null)
  9411. {
  9412. handlerRemoveInventoryFolder(this, uuids);
  9413. }
  9414. }
  9415. return true;
  9416. }
  9417. private bool HandleRemoveInventoryObjects(IClientAPI sender, Packet Pack)
  9418. {
  9419. RemoveInventoryObjectsPacket removeObject = (RemoveInventoryObjectsPacket)Pack;
  9420. #region Packet Session and User Check
  9421. if (removeObject.AgentData.SessionID != SessionId ||
  9422. removeObject.AgentData.AgentID != AgentId)
  9423. return true;
  9424. #endregion
  9425. if (OnRemoveInventoryFolder != null)
  9426. {
  9427. RemoveInventoryFolder handlerRemoveInventoryFolder = null;
  9428. List<UUID> uuids = new List<UUID>();
  9429. foreach (RemoveInventoryObjectsPacket.FolderDataBlock datablock in removeObject.FolderData)
  9430. {
  9431. uuids.Add(datablock.FolderID);
  9432. }
  9433. handlerRemoveInventoryFolder = OnRemoveInventoryFolder;
  9434. if (handlerRemoveInventoryFolder != null)
  9435. {
  9436. handlerRemoveInventoryFolder(this, uuids);
  9437. }
  9438. }
  9439. if (OnRemoveInventoryItem != null)
  9440. {
  9441. RemoveInventoryItem handlerRemoveInventoryItem = null;
  9442. List<UUID> uuids = new List<UUID>();
  9443. foreach (RemoveInventoryObjectsPacket.ItemDataBlock datablock in removeObject.ItemData)
  9444. {
  9445. uuids.Add(datablock.ItemID);
  9446. }
  9447. handlerRemoveInventoryItem = OnRemoveInventoryItem;
  9448. if (handlerRemoveInventoryItem != null)
  9449. {
  9450. handlerRemoveInventoryItem(this, uuids);
  9451. }
  9452. }
  9453. return true;
  9454. }
  9455. private bool HandleRequestTaskInventory(IClientAPI sender, Packet Pack)
  9456. {
  9457. RequestTaskInventoryPacket requesttask = (RequestTaskInventoryPacket)Pack;
  9458. #region Packet Session and User Check
  9459. if (requesttask.AgentData.SessionID != SessionId ||
  9460. requesttask.AgentData.AgentID != AgentId)
  9461. return true;
  9462. #endregion
  9463. RequestTaskInventory handlerRequestTaskInventory = OnRequestTaskInventory;
  9464. if (handlerRequestTaskInventory != null)
  9465. {
  9466. handlerRequestTaskInventory(this, requesttask.InventoryData.LocalID);
  9467. }
  9468. return true;
  9469. }
  9470. private bool HandleUpdateTaskInventory(IClientAPI sender, Packet Pack)
  9471. {
  9472. UpdateTaskInventoryPacket updatetask = (UpdateTaskInventoryPacket)Pack;
  9473. #region Packet Session and User Check
  9474. if (updatetask.AgentData.SessionID != SessionId ||
  9475. updatetask.AgentData.AgentID != AgentId)
  9476. return true;
  9477. #endregion
  9478. if (OnUpdateTaskInventory != null)
  9479. {
  9480. if (updatetask.UpdateData.Key == 0)
  9481. {
  9482. UpdateTaskInventory handlerUpdateTaskInventory = OnUpdateTaskInventory;
  9483. if (handlerUpdateTaskInventory != null)
  9484. {
  9485. TaskInventoryItem newTaskItem = new TaskInventoryItem();
  9486. newTaskItem.ItemID = updatetask.InventoryData.ItemID;
  9487. newTaskItem.ParentID = updatetask.InventoryData.FolderID;
  9488. newTaskItem.CreatorID = updatetask.InventoryData.CreatorID;
  9489. newTaskItem.OwnerID = updatetask.InventoryData.OwnerID;
  9490. newTaskItem.GroupID = updatetask.InventoryData.GroupID;
  9491. newTaskItem.BasePermissions = updatetask.InventoryData.BaseMask;
  9492. newTaskItem.CurrentPermissions = updatetask.InventoryData.OwnerMask;
  9493. newTaskItem.GroupPermissions = updatetask.InventoryData.GroupMask;
  9494. newTaskItem.EveryonePermissions = updatetask.InventoryData.EveryoneMask;
  9495. newTaskItem.NextPermissions = updatetask.InventoryData.NextOwnerMask;
  9496. // Unused? Clicking share with group sets GroupPermissions instead, so perhaps this is something
  9497. // different
  9498. //newTaskItem.GroupOwned=updatetask.InventoryData.GroupOwned;
  9499. newTaskItem.Type = updatetask.InventoryData.Type;
  9500. newTaskItem.InvType = updatetask.InventoryData.InvType;
  9501. newTaskItem.Flags = updatetask.InventoryData.Flags;
  9502. //newTaskItem.SaleType=updatetask.InventoryData.SaleType;
  9503. //newTaskItem.SalePrice=updatetask.InventoryData.SalePrice;
  9504. newTaskItem.Name = Util.FieldToString(updatetask.InventoryData.Name);
  9505. newTaskItem.Description = Util.FieldToString(updatetask.InventoryData.Description);
  9506. newTaskItem.CreationDate = (uint)updatetask.InventoryData.CreationDate;
  9507. handlerUpdateTaskInventory(this, updatetask.InventoryData.TransactionID,
  9508. newTaskItem, updatetask.UpdateData.LocalID);
  9509. }
  9510. }
  9511. }
  9512. return true;
  9513. }
  9514. private bool HandleRemoveTaskInventory(IClientAPI sender, Packet Pack)
  9515. {
  9516. RemoveTaskInventoryPacket removeTask = (RemoveTaskInventoryPacket)Pack;
  9517. #region Packet Session and User Check
  9518. if (removeTask.AgentData.SessionID != SessionId ||
  9519. removeTask.AgentData.AgentID != AgentId)
  9520. return true;
  9521. #endregion
  9522. RemoveTaskInventory handlerRemoveTaskItem = OnRemoveTaskItem;
  9523. if (handlerRemoveTaskItem != null)
  9524. {
  9525. handlerRemoveTaskItem(this, removeTask.InventoryData.ItemID, removeTask.InventoryData.LocalID);
  9526. }
  9527. return true;
  9528. }
  9529. private bool HandleMoveTaskInventory(IClientAPI sender, Packet Pack)
  9530. {
  9531. MoveTaskInventoryPacket moveTaskInventoryPacket = (MoveTaskInventoryPacket)Pack;
  9532. #region Packet Session and User Check
  9533. if (moveTaskInventoryPacket.AgentData.SessionID != SessionId ||
  9534. moveTaskInventoryPacket.AgentData.AgentID != AgentId)
  9535. return true;
  9536. #endregion
  9537. MoveTaskInventory handlerMoveTaskItem = OnMoveTaskItem;
  9538. if (handlerMoveTaskItem != null)
  9539. {
  9540. handlerMoveTaskItem(
  9541. this, moveTaskInventoryPacket.AgentData.FolderID,
  9542. moveTaskInventoryPacket.InventoryData.LocalID,
  9543. moveTaskInventoryPacket.InventoryData.ItemID);
  9544. }
  9545. return true;
  9546. }
  9547. private bool HandleRezScript(IClientAPI sender, Packet Pack)
  9548. {
  9549. //m_log.Debug(Pack.ToString());
  9550. RezScriptPacket rezScriptx = (RezScriptPacket)Pack;
  9551. #region Packet Session and User Check
  9552. if (rezScriptx.AgentData.SessionID != SessionId ||
  9553. rezScriptx.AgentData.AgentID != AgentId)
  9554. return true;
  9555. #endregion
  9556. RezScript handlerRezScript = OnRezScript;
  9557. InventoryItemBase item = new InventoryItemBase();
  9558. item.ID = rezScriptx.InventoryBlock.ItemID;
  9559. item.Folder = rezScriptx.InventoryBlock.FolderID;
  9560. item.CreatorId = rezScriptx.InventoryBlock.CreatorID.ToString();
  9561. item.Owner = rezScriptx.InventoryBlock.OwnerID;
  9562. item.BasePermissions = rezScriptx.InventoryBlock.BaseMask;
  9563. item.CurrentPermissions = rezScriptx.InventoryBlock.OwnerMask;
  9564. item.EveryOnePermissions = rezScriptx.InventoryBlock.EveryoneMask;
  9565. item.NextPermissions = rezScriptx.InventoryBlock.NextOwnerMask;
  9566. item.GroupPermissions = rezScriptx.InventoryBlock.GroupMask;
  9567. item.GroupOwned = rezScriptx.InventoryBlock.GroupOwned;
  9568. item.GroupID = rezScriptx.InventoryBlock.GroupID;
  9569. item.AssetType = rezScriptx.InventoryBlock.Type;
  9570. item.InvType = rezScriptx.InventoryBlock.InvType;
  9571. item.Flags = rezScriptx.InventoryBlock.Flags;
  9572. item.SaleType = rezScriptx.InventoryBlock.SaleType;
  9573. item.SalePrice = rezScriptx.InventoryBlock.SalePrice;
  9574. item.Name = Util.FieldToString(rezScriptx.InventoryBlock.Name);
  9575. item.Description = Util.FieldToString(rezScriptx.InventoryBlock.Description);
  9576. item.CreationDate = rezScriptx.InventoryBlock.CreationDate;
  9577. if (handlerRezScript != null)
  9578. {
  9579. handlerRezScript(this, item, rezScriptx.InventoryBlock.TransactionID, rezScriptx.UpdateBlock.ObjectLocalID);
  9580. }
  9581. return true;
  9582. }
  9583. private bool HandleMapLayerRequest(IClientAPI sender, Packet Pack)
  9584. {
  9585. RequestMapLayer();
  9586. return true;
  9587. }
  9588. private bool HandleMapBlockRequest(IClientAPI sender, Packet Pack)
  9589. {
  9590. MapBlockRequestPacket MapRequest = (MapBlockRequestPacket)Pack;
  9591. #region Packet Session and User Check
  9592. if (MapRequest.AgentData.SessionID != SessionId ||
  9593. MapRequest.AgentData.AgentID != AgentId)
  9594. return true;
  9595. #endregion
  9596. RequestMapBlocks handlerRequestMapBlocks = OnRequestMapBlocks;
  9597. if (handlerRequestMapBlocks != null)
  9598. {
  9599. handlerRequestMapBlocks(this, MapRequest.PositionData.MinX, MapRequest.PositionData.MinY,
  9600. MapRequest.PositionData.MaxX, MapRequest.PositionData.MaxY, MapRequest.AgentData.Flags);
  9601. }
  9602. return true;
  9603. }
  9604. private bool HandleMapNameRequest(IClientAPI sender, Packet Pack)
  9605. {
  9606. MapNameRequestPacket map = (MapNameRequestPacket)Pack;
  9607. #region Packet Session and User Check
  9608. if (map.AgentData.SessionID != SessionId ||
  9609. map.AgentData.AgentID != AgentId)
  9610. return true;
  9611. #endregion
  9612. string mapName = (map.NameData.Name.Length == 0) ? m_scene.RegionInfo.RegionName :
  9613. Util.UTF8.GetString(map.NameData.Name, 0, map.NameData.Name.Length - 1);
  9614. RequestMapName handlerMapNameRequest = OnMapNameRequest;
  9615. if (handlerMapNameRequest != null)
  9616. {
  9617. handlerMapNameRequest(this, mapName, map.AgentData.Flags);
  9618. }
  9619. return true;
  9620. }
  9621. private bool HandleTeleportLandmarkRequest(IClientAPI sender, Packet Pack)
  9622. {
  9623. TeleportLandmarkRequestPacket tpReq = (TeleportLandmarkRequestPacket)Pack;
  9624. #region Packet Session and User Check
  9625. if (tpReq.Info.SessionID != SessionId ||
  9626. tpReq.Info.AgentID != AgentId)
  9627. return true;
  9628. #endregion
  9629. UUID lmid = tpReq.Info.LandmarkID;
  9630. AssetLandmark lm;
  9631. if (lmid != UUID.Zero)
  9632. {
  9633. //AssetBase lma = m_assetCache.GetAsset(lmid, false);
  9634. AssetBase lma = m_assetService.Get(lmid.ToString());
  9635. if (lma == null)
  9636. {
  9637. // Failed to find landmark
  9638. // Let's try to search in the user's home asset server
  9639. lma = FindAssetInUserAssetServer(lmid.ToString());
  9640. if (lma == null)
  9641. {
  9642. // Really doesn't exist
  9643. m_log.WarnFormat("[llClient]: landmark asset {0} not found",lmid.ToString());
  9644. SendTeleportFailed("Could not find the landmark asset data");
  9645. return true;
  9646. }
  9647. }
  9648. try
  9649. {
  9650. lm = new AssetLandmark(lma);
  9651. }
  9652. catch (NullReferenceException)
  9653. {
  9654. // asset not found generates null ref inside the assetlandmark constructor.
  9655. SendTeleportFailed("Could not find the landmark asset data");
  9656. return true;
  9657. }
  9658. }
  9659. else
  9660. {
  9661. // Teleport home request
  9662. UUIDNameRequest handlerTeleportHomeRequest = OnTeleportHomeRequest;
  9663. if (handlerTeleportHomeRequest != null)
  9664. {
  9665. handlerTeleportHomeRequest(AgentId, this);
  9666. }
  9667. return true;
  9668. }
  9669. TeleportLandmarkRequest handlerTeleportLandmarkRequest = OnTeleportLandmarkRequest;
  9670. if (handlerTeleportLandmarkRequest != null)
  9671. {
  9672. handlerTeleportLandmarkRequest(this, lm);
  9673. }
  9674. else
  9675. {
  9676. //no event handler so cancel request
  9677. SendTeleportFailed("Could not find the landmark asset data");
  9678. }
  9679. return true;
  9680. }
  9681. private bool HandleTeleportCancel(IClientAPI sender, Packet Pack)
  9682. {
  9683. TeleportCancel handlerTeleportCancel = OnTeleportCancel;
  9684. if (handlerTeleportCancel != null)
  9685. {
  9686. handlerTeleportCancel(this);
  9687. }
  9688. return true;
  9689. }
  9690. private AssetBase FindAssetInUserAssetServer(string id)
  9691. {
  9692. AgentCircuitData aCircuit = ((Scene)Scene).AuthenticateHandler.GetAgentCircuitData(CircuitCode);
  9693. if (aCircuit != null && aCircuit.ServiceURLs != null && aCircuit.ServiceURLs.ContainsKey("AssetServerURI"))
  9694. {
  9695. string assetServer = aCircuit.ServiceURLs["AssetServerURI"].ToString();
  9696. if (!string.IsNullOrEmpty(assetServer))
  9697. return ((Scene)Scene).AssetService.Get(assetServer + "/" + id);
  9698. }
  9699. return null;
  9700. }
  9701. private bool HandleTeleportLocationRequest(IClientAPI sender, Packet Pack)
  9702. {
  9703. TeleportLocationRequestPacket tpLocReq = (TeleportLocationRequestPacket)Pack;
  9704. // m_log.Debug(tpLocReq.ToString());
  9705. #region Packet Session and User Check
  9706. if (tpLocReq.AgentData.SessionID != SessionId ||
  9707. tpLocReq.AgentData.AgentID != AgentId)
  9708. return true;
  9709. #endregion
  9710. TeleportLocationRequest handlerTeleportLocationRequest = OnTeleportLocationRequest;
  9711. if (handlerTeleportLocationRequest != null)
  9712. {
  9713. // Adjust teleport location to base of a larger region if requested to teleport to a sub-region
  9714. uint locX, locY;
  9715. Util.RegionHandleToWorldLoc(tpLocReq.Info.RegionHandle, out locX, out locY);
  9716. if ((locX >= m_scene.RegionInfo.WorldLocX)
  9717. && (locX < (m_scene.RegionInfo.WorldLocX + m_scene.RegionInfo.RegionSizeX))
  9718. && (locY >= m_scene.RegionInfo.WorldLocY)
  9719. && (locY < (m_scene.RegionInfo.WorldLocY + m_scene.RegionInfo.RegionSizeY)))
  9720. {
  9721. tpLocReq.Info.RegionHandle = m_scene.RegionInfo.RegionHandle;
  9722. tpLocReq.Info.Position.X += locX - m_scene.RegionInfo.WorldLocX;
  9723. tpLocReq.Info.Position.Y += locY - m_scene.RegionInfo.WorldLocY;
  9724. }
  9725. handlerTeleportLocationRequest(this, tpLocReq.Info.RegionHandle, tpLocReq.Info.Position,
  9726. tpLocReq.Info.LookAt, 16);
  9727. }
  9728. else
  9729. {
  9730. //no event handler so cancel request
  9731. SendTeleportFailed("Could not process the teleport");
  9732. }
  9733. return true;
  9734. }
  9735. #endregion Inventory/Asset/Other related packets
  9736. private bool HandleUUIDNameRequest(IClientAPI sender, Packet Pack)
  9737. {
  9738. ScenePresence sp = (ScenePresence)SceneAgent;
  9739. if(sp == null || sp.IsDeleted || (sp.IsInTransit && !sp.IsInLocalTransit))
  9740. return true;
  9741. UUIDNameRequestPacket incoming = (UUIDNameRequestPacket)Pack;
  9742. foreach (UUIDNameRequestPacket.UUIDNameBlockBlock UUIDBlock in incoming.UUIDNameBlock)
  9743. {
  9744. UUIDNameRequest handlerNameRequest = OnNameFromUUIDRequest;
  9745. if (handlerNameRequest != null)
  9746. {
  9747. handlerNameRequest(UUIDBlock.ID, this);
  9748. }
  9749. }
  9750. return true;
  9751. }
  9752. #region Parcel related packets
  9753. private bool HandleRegionHandleRequest(IClientAPI sender, Packet Pack)
  9754. {
  9755. RegionHandleRequest handlerRegionHandleRequest = OnRegionHandleRequest;
  9756. if (handlerRegionHandleRequest != null)
  9757. {
  9758. RegionHandleRequestPacket rhrPack = (RegionHandleRequestPacket)Pack;
  9759. handlerRegionHandleRequest(this, rhrPack.RequestBlock.RegionID);
  9760. }
  9761. return true;
  9762. }
  9763. private bool HandleParcelInfoRequest(IClientAPI sender, Packet Pack)
  9764. {
  9765. ParcelInfoRequestPacket pirPack = (ParcelInfoRequestPacket)Pack;
  9766. #region Packet Session and User Check
  9767. if (pirPack.AgentData.SessionID != SessionId ||
  9768. pirPack.AgentData.AgentID != AgentId)
  9769. return true;
  9770. #endregion
  9771. ParcelInfoRequest handlerParcelInfoRequest = OnParcelInfoRequest;
  9772. if (handlerParcelInfoRequest != null)
  9773. {
  9774. handlerParcelInfoRequest(this, pirPack.Data.ParcelID);
  9775. }
  9776. return true;
  9777. }
  9778. private bool HandleParcelAccessListRequest(IClientAPI sender, Packet Pack)
  9779. {
  9780. ParcelAccessListRequestPacket requestPacket = (ParcelAccessListRequestPacket)Pack;
  9781. #region Packet Session and User Check
  9782. if (requestPacket.AgentData.SessionID != SessionId ||
  9783. requestPacket.AgentData.AgentID != AgentId)
  9784. return true;
  9785. #endregion
  9786. ParcelAccessListRequest handlerParcelAccessListRequest = OnParcelAccessListRequest;
  9787. if (handlerParcelAccessListRequest != null)
  9788. {
  9789. handlerParcelAccessListRequest(requestPacket.AgentData.AgentID, requestPacket.AgentData.SessionID,
  9790. requestPacket.Data.Flags, requestPacket.Data.SequenceID,
  9791. requestPacket.Data.LocalID, this);
  9792. }
  9793. return true;
  9794. }
  9795. private bool HandleParcelAccessListUpdate(IClientAPI sender, Packet Pack)
  9796. {
  9797. if(OnParcelAccessListUpdateRequest == null)
  9798. return true;
  9799. ParcelAccessListUpdatePacket updatePacket = (ParcelAccessListUpdatePacket)Pack;
  9800. #region Packet Session and User Check
  9801. if (updatePacket.AgentData.SessionID != SessionId ||
  9802. updatePacket.AgentData.AgentID != AgentId)
  9803. return true;
  9804. #endregion
  9805. // viewers do send estimated number of packets and sequenceID, but don't seem reliable.
  9806. List<LandAccessEntry> entries = new List<LandAccessEntry>();
  9807. foreach (ParcelAccessListUpdatePacket.ListBlock block in updatePacket.List)
  9808. {
  9809. LandAccessEntry entry = new LandAccessEntry();
  9810. entry.AgentID = block.ID;
  9811. entry.Flags = (AccessList)block.Flags;
  9812. entry.Expires = block.Time;
  9813. entries.Add(entry);
  9814. }
  9815. ParcelAccessListUpdateRequest handlerParcelAccessListUpdateRequest = OnParcelAccessListUpdateRequest;
  9816. if (handlerParcelAccessListUpdateRequest != null)
  9817. {
  9818. handlerParcelAccessListUpdateRequest(updatePacket.AgentData.AgentID,
  9819. updatePacket.Data.Flags,
  9820. updatePacket.Data.TransactionID,
  9821. updatePacket.Data.LocalID,
  9822. entries, this);
  9823. }
  9824. return true;
  9825. }
  9826. private bool HandleParcelPropertiesRequest(IClientAPI sender, Packet Pack)
  9827. {
  9828. ParcelPropertiesRequestPacket propertiesRequest = (ParcelPropertiesRequestPacket)Pack;
  9829. #region Packet Session and User Check
  9830. if (propertiesRequest.AgentData.SessionID != SessionId ||
  9831. propertiesRequest.AgentData.AgentID != AgentId)
  9832. return true;
  9833. #endregion
  9834. ParcelPropertiesRequest handlerParcelPropertiesRequest = OnParcelPropertiesRequest;
  9835. if (handlerParcelPropertiesRequest != null)
  9836. {
  9837. handlerParcelPropertiesRequest((int)Math.Round(propertiesRequest.ParcelData.West),
  9838. (int)Math.Round(propertiesRequest.ParcelData.South),
  9839. (int)Math.Round(propertiesRequest.ParcelData.East),
  9840. (int)Math.Round(propertiesRequest.ParcelData.North),
  9841. propertiesRequest.ParcelData.SequenceID,
  9842. propertiesRequest.ParcelData.SnapSelection, this);
  9843. }
  9844. return true;
  9845. }
  9846. private bool HandleParcelDivide(IClientAPI sender, Packet Pack)
  9847. {
  9848. ParcelDividePacket landDivide = (ParcelDividePacket)Pack;
  9849. #region Packet Session and User Check
  9850. if (landDivide.AgentData.SessionID != SessionId ||
  9851. landDivide.AgentData.AgentID != AgentId)
  9852. return true;
  9853. #endregion
  9854. ParcelDivideRequest handlerParcelDivideRequest = OnParcelDivideRequest;
  9855. if (handlerParcelDivideRequest != null)
  9856. {
  9857. handlerParcelDivideRequest((int)Math.Round(landDivide.ParcelData.West),
  9858. (int)Math.Round(landDivide.ParcelData.South),
  9859. (int)Math.Round(landDivide.ParcelData.East),
  9860. (int)Math.Round(landDivide.ParcelData.North), this);
  9861. }
  9862. return true;
  9863. }
  9864. private bool HandleParcelJoin(IClientAPI sender, Packet Pack)
  9865. {
  9866. ParcelJoinPacket landJoin = (ParcelJoinPacket)Pack;
  9867. #region Packet Session and User Check
  9868. if (landJoin.AgentData.SessionID != SessionId ||
  9869. landJoin.AgentData.AgentID != AgentId)
  9870. return true;
  9871. #endregion
  9872. ParcelJoinRequest handlerParcelJoinRequest = OnParcelJoinRequest;
  9873. if (handlerParcelJoinRequest != null)
  9874. {
  9875. handlerParcelJoinRequest((int)Math.Round(landJoin.ParcelData.West),
  9876. (int)Math.Round(landJoin.ParcelData.South),
  9877. (int)Math.Round(landJoin.ParcelData.East),
  9878. (int)Math.Round(landJoin.ParcelData.North), this);
  9879. }
  9880. return true;
  9881. }
  9882. private bool HandleParcelPropertiesUpdate(IClientAPI sender, Packet Pack)
  9883. {
  9884. ParcelPropertiesUpdatePacket parcelPropertiesPacket = (ParcelPropertiesUpdatePacket)Pack;
  9885. #region Packet Session and User Check
  9886. if (parcelPropertiesPacket.AgentData.SessionID != SessionId ||
  9887. parcelPropertiesPacket.AgentData.AgentID != AgentId)
  9888. return true;
  9889. #endregion
  9890. ParcelPropertiesUpdateRequest handlerParcelPropertiesUpdateRequest = OnParcelPropertiesUpdateRequest;
  9891. if (handlerParcelPropertiesUpdateRequest != null)
  9892. {
  9893. LandUpdateArgs args = new LandUpdateArgs();
  9894. args.AuthBuyerID = parcelPropertiesPacket.ParcelData.AuthBuyerID;
  9895. args.Category = (ParcelCategory)parcelPropertiesPacket.ParcelData.Category;
  9896. args.Desc = Utils.BytesToString(parcelPropertiesPacket.ParcelData.Desc);
  9897. args.GroupID = parcelPropertiesPacket.ParcelData.GroupID;
  9898. args.LandingType = parcelPropertiesPacket.ParcelData.LandingType;
  9899. args.MediaAutoScale = parcelPropertiesPacket.ParcelData.MediaAutoScale;
  9900. args.MediaID = parcelPropertiesPacket.ParcelData.MediaID;
  9901. args.MediaURL = Utils.BytesToString(parcelPropertiesPacket.ParcelData.MediaURL);
  9902. args.MusicURL = Utils.BytesToString(parcelPropertiesPacket.ParcelData.MusicURL);
  9903. args.Name = Utils.BytesToString(parcelPropertiesPacket.ParcelData.Name);
  9904. args.ParcelFlags = parcelPropertiesPacket.ParcelData.ParcelFlags;
  9905. args.PassHours = parcelPropertiesPacket.ParcelData.PassHours;
  9906. args.PassPrice = parcelPropertiesPacket.ParcelData.PassPrice;
  9907. args.SalePrice = parcelPropertiesPacket.ParcelData.SalePrice;
  9908. args.SnapshotID = parcelPropertiesPacket.ParcelData.SnapshotID;
  9909. args.UserLocation = parcelPropertiesPacket.ParcelData.UserLocation;
  9910. args.UserLookAt = parcelPropertiesPacket.ParcelData.UserLookAt;
  9911. handlerParcelPropertiesUpdateRequest(args, parcelPropertiesPacket.ParcelData.LocalID, this);
  9912. }
  9913. return true;
  9914. }
  9915. private bool HandleParcelSelectObjects(IClientAPI sender, Packet Pack)
  9916. {
  9917. ParcelSelectObjectsPacket selectPacket = (ParcelSelectObjectsPacket)Pack;
  9918. #region Packet Session and User Check
  9919. if (selectPacket.AgentData.SessionID != SessionId ||
  9920. selectPacket.AgentData.AgentID != AgentId)
  9921. return true;
  9922. #endregion
  9923. List<UUID> returnIDs = new List<UUID>();
  9924. foreach (ParcelSelectObjectsPacket.ReturnIDsBlock rb in
  9925. selectPacket.ReturnIDs)
  9926. {
  9927. returnIDs.Add(rb.ReturnID);
  9928. }
  9929. ParcelSelectObjects handlerParcelSelectObjects = OnParcelSelectObjects;
  9930. if (handlerParcelSelectObjects != null)
  9931. {
  9932. handlerParcelSelectObjects(selectPacket.ParcelData.LocalID,
  9933. Convert.ToInt32(selectPacket.ParcelData.ReturnType), returnIDs, this);
  9934. }
  9935. return true;
  9936. }
  9937. private bool HandleParcelObjectOwnersRequest(IClientAPI sender, Packet Pack)
  9938. {
  9939. ParcelObjectOwnersRequestPacket reqPacket = (ParcelObjectOwnersRequestPacket)Pack;
  9940. #region Packet Session and User Check
  9941. if (reqPacket.AgentData.SessionID != SessionId ||
  9942. reqPacket.AgentData.AgentID != AgentId)
  9943. return true;
  9944. #endregion
  9945. ParcelObjectOwnerRequest handlerParcelObjectOwnerRequest = OnParcelObjectOwnerRequest;
  9946. if (handlerParcelObjectOwnerRequest != null)
  9947. {
  9948. handlerParcelObjectOwnerRequest(reqPacket.ParcelData.LocalID, this);
  9949. }
  9950. return true;
  9951. }
  9952. private bool HandleParcelGodForceOwner(IClientAPI sender, Packet Pack)
  9953. {
  9954. ParcelGodForceOwnerPacket godForceOwnerPacket = (ParcelGodForceOwnerPacket)Pack;
  9955. #region Packet Session and User Check
  9956. if (godForceOwnerPacket.AgentData.SessionID != SessionId ||
  9957. godForceOwnerPacket.AgentData.AgentID != AgentId)
  9958. return true;
  9959. #endregion
  9960. ParcelGodForceOwner handlerParcelGodForceOwner = OnParcelGodForceOwner;
  9961. if (handlerParcelGodForceOwner != null)
  9962. {
  9963. handlerParcelGodForceOwner(godForceOwnerPacket.Data.LocalID, godForceOwnerPacket.Data.OwnerID, this);
  9964. }
  9965. return true;
  9966. }
  9967. private bool HandleParcelRelease(IClientAPI sender, Packet Pack)
  9968. {
  9969. ParcelReleasePacket releasePacket = (ParcelReleasePacket)Pack;
  9970. #region Packet Session and User Check
  9971. if (releasePacket.AgentData.SessionID != SessionId ||
  9972. releasePacket.AgentData.AgentID != AgentId)
  9973. return true;
  9974. #endregion
  9975. ParcelAbandonRequest handlerParcelAbandonRequest = OnParcelAbandonRequest;
  9976. if (handlerParcelAbandonRequest != null)
  9977. {
  9978. handlerParcelAbandonRequest(releasePacket.Data.LocalID, this);
  9979. }
  9980. return true;
  9981. }
  9982. private bool HandleParcelReclaim(IClientAPI sender, Packet Pack)
  9983. {
  9984. ParcelReclaimPacket reclaimPacket = (ParcelReclaimPacket)Pack;
  9985. #region Packet Session and User Check
  9986. if (reclaimPacket.AgentData.SessionID != SessionId ||
  9987. reclaimPacket.AgentData.AgentID != AgentId)
  9988. return true;
  9989. #endregion
  9990. ParcelReclaim handlerParcelReclaim = OnParcelReclaim;
  9991. if (handlerParcelReclaim != null)
  9992. {
  9993. handlerParcelReclaim(reclaimPacket.Data.LocalID, this);
  9994. }
  9995. return true;
  9996. }
  9997. private bool HandleParcelReturnObjects(IClientAPI sender, Packet Pack)
  9998. {
  9999. ParcelReturnObjectsPacket parcelReturnObjects = (ParcelReturnObjectsPacket)Pack;
  10000. #region Packet Session and User Check
  10001. if (parcelReturnObjects.AgentData.SessionID != SessionId ||
  10002. parcelReturnObjects.AgentData.AgentID != AgentId)
  10003. return true;
  10004. #endregion
  10005. UUID[] puserselectedOwnerIDs = new UUID[parcelReturnObjects.OwnerIDs.Length];
  10006. for (int parceliterator = 0; parceliterator < parcelReturnObjects.OwnerIDs.Length; parceliterator++)
  10007. puserselectedOwnerIDs[parceliterator] = parcelReturnObjects.OwnerIDs[parceliterator].OwnerID;
  10008. UUID[] puserselectedTaskIDs = new UUID[parcelReturnObjects.TaskIDs.Length];
  10009. for (int parceliterator = 0; parceliterator < parcelReturnObjects.TaskIDs.Length; parceliterator++)
  10010. puserselectedTaskIDs[parceliterator] = parcelReturnObjects.TaskIDs[parceliterator].TaskID;
  10011. ParcelReturnObjectsRequest handlerParcelReturnObjectsRequest = OnParcelReturnObjectsRequest;
  10012. if (handlerParcelReturnObjectsRequest != null)
  10013. {
  10014. handlerParcelReturnObjectsRequest(parcelReturnObjects.ParcelData.LocalID, parcelReturnObjects.ParcelData.ReturnType, puserselectedOwnerIDs, puserselectedTaskIDs, this);
  10015. }
  10016. return true;
  10017. }
  10018. private bool HandleParcelSetOtherCleanTime(IClientAPI sender, Packet Pack)
  10019. {
  10020. ParcelSetOtherCleanTimePacket parcelSetOtherCleanTimePacket = (ParcelSetOtherCleanTimePacket)Pack;
  10021. #region Packet Session and User Check
  10022. if (parcelSetOtherCleanTimePacket.AgentData.SessionID != SessionId ||
  10023. parcelSetOtherCleanTimePacket.AgentData.AgentID != AgentId)
  10024. return true;
  10025. #endregion
  10026. ParcelSetOtherCleanTime handlerParcelSetOtherCleanTime = OnParcelSetOtherCleanTime;
  10027. if (handlerParcelSetOtherCleanTime != null)
  10028. {
  10029. handlerParcelSetOtherCleanTime(this,
  10030. parcelSetOtherCleanTimePacket.ParcelData.LocalID,
  10031. parcelSetOtherCleanTimePacket.ParcelData.OtherCleanTime);
  10032. }
  10033. return true;
  10034. }
  10035. private bool HandleLandStatRequest(IClientAPI sender, Packet Pack)
  10036. {
  10037. LandStatRequestPacket lsrp = (LandStatRequestPacket)Pack;
  10038. #region Packet Session and User Check
  10039. if (lsrp.AgentData.SessionID != SessionId ||
  10040. lsrp.AgentData.AgentID != AgentId)
  10041. return true;
  10042. #endregion
  10043. GodLandStatRequest handlerLandStatRequest = OnLandStatRequest;
  10044. if (handlerLandStatRequest != null)
  10045. {
  10046. handlerLandStatRequest(lsrp.RequestData.ParcelLocalID, lsrp.RequestData.ReportType, lsrp.RequestData.RequestFlags, Utils.BytesToString(lsrp.RequestData.Filter), this);
  10047. }
  10048. return true;
  10049. }
  10050. private bool HandleParcelDwellRequest(IClientAPI sender, Packet Pack)
  10051. {
  10052. ParcelDwellRequestPacket dwellrq =
  10053. (ParcelDwellRequestPacket)Pack;
  10054. #region Packet Session and User Check
  10055. if (dwellrq.AgentData.SessionID != SessionId ||
  10056. dwellrq.AgentData.AgentID != AgentId)
  10057. return true;
  10058. #endregion
  10059. ParcelDwellRequest handlerParcelDwellRequest = OnParcelDwellRequest;
  10060. if (handlerParcelDwellRequest != null)
  10061. {
  10062. handlerParcelDwellRequest(dwellrq.Data.LocalID, this);
  10063. }
  10064. return true;
  10065. }
  10066. #endregion Parcel related packets
  10067. #region Estate Packets
  10068. private static double m_lastMapRegenTime = Double.MinValue;
  10069. private bool HandleEstateOwnerMessage(IClientAPI sender, Packet Pack)
  10070. {
  10071. EstateOwnerMessagePacket messagePacket = (EstateOwnerMessagePacket)Pack;
  10072. // m_log.InfoFormat("[LLCLIENTVIEW]: Packet: {0}", Utils.BytesToString(messagePacket.MethodData.Method));
  10073. GodLandStatRequest handlerLandStatRequest;
  10074. #region Packet Session and User Check
  10075. if (messagePacket.AgentData.SessionID != SessionId ||
  10076. messagePacket.AgentData.AgentID != AgentId)
  10077. return true;
  10078. #endregion
  10079. string method = Utils.BytesToString(messagePacket.MethodData.Method);
  10080. switch (method)
  10081. {
  10082. case "getinfo":
  10083. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  10084. {
  10085. OnDetailedEstateDataRequest(this, messagePacket.MethodData.Invoice);
  10086. }
  10087. return true;
  10088. case "setregioninfo":
  10089. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  10090. {
  10091. OnSetEstateFlagsRequest(convertParamStringToBool(messagePacket.ParamList[0].Parameter), convertParamStringToBool(messagePacket.ParamList[1].Parameter),
  10092. convertParamStringToBool(messagePacket.ParamList[2].Parameter), !convertParamStringToBool(messagePacket.ParamList[3].Parameter),
  10093. Convert.ToInt16(Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[4].Parameter), Culture.NumberFormatInfo)),
  10094. (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[5].Parameter), Culture.NumberFormatInfo),
  10095. Convert.ToInt16(Utils.BytesToString(messagePacket.ParamList[6].Parameter)),
  10096. convertParamStringToBool(messagePacket.ParamList[7].Parameter), convertParamStringToBool(messagePacket.ParamList[8].Parameter));
  10097. }
  10098. return true;
  10099. // case "texturebase":
  10100. // if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  10101. // {
  10102. // foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  10103. // {
  10104. // string s = Utils.BytesToString(block.Parameter);
  10105. // string[] splitField = s.Split(' ');
  10106. // if (splitField.Length == 2)
  10107. // {
  10108. // UUID tempUUID = new UUID(splitField[1]);
  10109. // OnSetEstateTerrainBaseTexture(this, Convert.ToInt16(splitField[0]), tempUUID);
  10110. // }
  10111. // }
  10112. // }
  10113. // break;
  10114. case "texturedetail":
  10115. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  10116. {
  10117. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  10118. {
  10119. string s = Utils.BytesToString(block.Parameter);
  10120. string[] splitField = s.Split(' ');
  10121. if (splitField.Length == 2)
  10122. {
  10123. Int16 corner = Convert.ToInt16(splitField[0]);
  10124. UUID textureUUID = new UUID(splitField[1]);
  10125. OnSetEstateTerrainDetailTexture(this, corner, textureUUID);
  10126. }
  10127. }
  10128. }
  10129. return true;
  10130. case "textureheights":
  10131. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  10132. {
  10133. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  10134. {
  10135. string s = Utils.BytesToString(block.Parameter);
  10136. string[] splitField = s.Split(' ');
  10137. if (splitField.Length == 3)
  10138. {
  10139. Int16 corner = Convert.ToInt16(splitField[0]);
  10140. float lowValue = (float)Convert.ToDecimal(splitField[1], Culture.NumberFormatInfo);
  10141. float highValue = (float)Convert.ToDecimal(splitField[2], Culture.NumberFormatInfo);
  10142. OnSetEstateTerrainTextureHeights(this, corner, lowValue, highValue);
  10143. }
  10144. }
  10145. }
  10146. return true;
  10147. case "texturecommit":
  10148. OnCommitEstateTerrainTextureRequest(this);
  10149. return true;
  10150. case "setregionterrain":
  10151. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  10152. {
  10153. if (messagePacket.ParamList.Length != 9)
  10154. {
  10155. m_log.Error("EstateOwnerMessage: SetRegionTerrain method has a ParamList of invalid length");
  10156. }
  10157. else
  10158. {
  10159. try
  10160. {
  10161. string tmp = Utils.BytesToString(messagePacket.ParamList[0].Parameter);
  10162. if (!tmp.Contains(".")) tmp += ".00";
  10163. float WaterHeight = (float)Convert.ToDecimal(tmp, Culture.NumberFormatInfo);
  10164. tmp = Utils.BytesToString(messagePacket.ParamList[1].Parameter);
  10165. if (!tmp.Contains(".")) tmp += ".00";
  10166. float TerrainRaiseLimit = (float)Convert.ToDecimal(tmp, Culture.NumberFormatInfo);
  10167. tmp = Utils.BytesToString(messagePacket.ParamList[2].Parameter);
  10168. if (!tmp.Contains(".")) tmp += ".00";
  10169. float TerrainLowerLimit = (float)Convert.ToDecimal(tmp, Culture.NumberFormatInfo);
  10170. bool UseEstateSun = convertParamStringToBool(messagePacket.ParamList[3].Parameter);
  10171. bool UseFixedSun = convertParamStringToBool(messagePacket.ParamList[4].Parameter);
  10172. float SunHour = (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[5].Parameter), Culture.NumberFormatInfo);
  10173. bool UseGlobal = convertParamStringToBool(messagePacket.ParamList[6].Parameter);
  10174. bool EstateFixedSun = convertParamStringToBool(messagePacket.ParamList[7].Parameter);
  10175. float EstateSunHour = (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[8].Parameter), Culture.NumberFormatInfo);
  10176. OnSetRegionTerrainSettings(WaterHeight, TerrainRaiseLimit, TerrainLowerLimit, UseEstateSun, UseFixedSun, SunHour, UseGlobal, EstateFixedSun, EstateSunHour);
  10177. }
  10178. catch (Exception ex)
  10179. {
  10180. m_log.Error("EstateOwnerMessage: Exception while setting terrain settings: \n" + messagePacket + "\n" + ex);
  10181. }
  10182. }
  10183. }
  10184. return true;
  10185. case "restart":
  10186. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  10187. {
  10188. // There's only 1 block in the estateResetSim.. and that's the number of seconds till restart.
  10189. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  10190. {
  10191. float timeSeconds;
  10192. Utils.TryParseSingle(Utils.BytesToString(block.Parameter), out timeSeconds);
  10193. timeSeconds = (int)timeSeconds;
  10194. OnEstateRestartSimRequest(this, (int)timeSeconds);
  10195. }
  10196. }
  10197. return true;
  10198. case "estatechangecovenantid":
  10199. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  10200. {
  10201. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  10202. {
  10203. UUID newCovenantID = new UUID(Utils.BytesToString(block.Parameter));
  10204. OnEstateChangeCovenantRequest(this, newCovenantID);
  10205. }
  10206. }
  10207. return true;
  10208. case "estateaccessdelta": // Estate access delta manages the banlist and allow list too.
  10209. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  10210. {
  10211. int estateAccessType = Convert.ToInt16(Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  10212. OnUpdateEstateAccessDeltaRequest(this, messagePacket.MethodData.Invoice, estateAccessType, new UUID(Utils.BytesToString(messagePacket.ParamList[2].Parameter)));
  10213. }
  10214. return true;
  10215. case "simulatormessage":
  10216. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  10217. {
  10218. UUID invoice = messagePacket.MethodData.Invoice;
  10219. UUID SenderID = new UUID(Utils.BytesToString(messagePacket.ParamList[2].Parameter));
  10220. string SenderName = Utils.BytesToString(messagePacket.ParamList[3].Parameter);
  10221. string Message = Utils.BytesToString(messagePacket.ParamList[4].Parameter);
  10222. UUID sessionID = messagePacket.AgentData.SessionID;
  10223. OnSimulatorBlueBoxMessageRequest(this, invoice, SenderID, sessionID, SenderName, Message);
  10224. }
  10225. return true;
  10226. case "instantmessage":
  10227. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  10228. {
  10229. if (messagePacket.ParamList.Length < 2)
  10230. return true;
  10231. UUID invoice = messagePacket.MethodData.Invoice;
  10232. UUID sessionID = messagePacket.AgentData.SessionID;
  10233. UUID SenderID;
  10234. string SenderName;
  10235. string Message;
  10236. if (messagePacket.ParamList.Length < 5)
  10237. {
  10238. SenderID = AgentId;
  10239. SenderName = Utils.BytesToString(messagePacket.ParamList[0].Parameter);
  10240. Message = Utils.BytesToString(messagePacket.ParamList[1].Parameter);
  10241. }
  10242. else
  10243. {
  10244. SenderID = new UUID(Utils.BytesToString(messagePacket.ParamList[2].Parameter));
  10245. SenderName = Utils.BytesToString(messagePacket.ParamList[3].Parameter);
  10246. Message = Utils.BytesToString(messagePacket.ParamList[4].Parameter);
  10247. }
  10248. OnEstateBlueBoxMessageRequest(this, invoice, SenderID, sessionID, SenderName, Message);
  10249. }
  10250. return true;
  10251. case "setregiondebug":
  10252. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  10253. {
  10254. UUID invoice = messagePacket.MethodData.Invoice;
  10255. UUID SenderID = messagePacket.AgentData.AgentID;
  10256. bool scripted = convertParamStringToBool(messagePacket.ParamList[0].Parameter);
  10257. bool collisionEvents = convertParamStringToBool(messagePacket.ParamList[1].Parameter);
  10258. bool physics = convertParamStringToBool(messagePacket.ParamList[2].Parameter);
  10259. OnEstateDebugRegionRequest(this, invoice, SenderID, scripted, collisionEvents, physics);
  10260. }
  10261. return true;
  10262. case "teleporthomeuser":
  10263. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  10264. {
  10265. UUID invoice = messagePacket.MethodData.Invoice;
  10266. UUID SenderID = messagePacket.AgentData.AgentID;
  10267. UUID Prey;
  10268. UUID.TryParse(Utils.BytesToString(messagePacket.ParamList[1].Parameter), out Prey);
  10269. OnEstateTeleportOneUserHomeRequest(this, invoice, SenderID, Prey, false);
  10270. }
  10271. return true;
  10272. case "teleporthomeallusers":
  10273. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  10274. {
  10275. UUID invoice = messagePacket.MethodData.Invoice;
  10276. UUID SenderID = messagePacket.AgentData.AgentID;
  10277. OnEstateTeleportAllUsersHomeRequest(this, invoice, SenderID);
  10278. }
  10279. return true;
  10280. case "colliders":
  10281. handlerLandStatRequest = OnLandStatRequest;
  10282. if (handlerLandStatRequest != null)
  10283. {
  10284. handlerLandStatRequest(0, 1, 0, "", this);
  10285. }
  10286. return true;
  10287. case "scripts":
  10288. handlerLandStatRequest = OnLandStatRequest;
  10289. if (handlerLandStatRequest != null)
  10290. {
  10291. handlerLandStatRequest(0, 0, 0, "", this);
  10292. }
  10293. return true;
  10294. case "terrain":
  10295. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  10296. {
  10297. if (messagePacket.ParamList.Length > 0)
  10298. {
  10299. if (Utils.BytesToString(messagePacket.ParamList[0].Parameter) == "bake")
  10300. {
  10301. BakeTerrain handlerBakeTerrain = OnBakeTerrain;
  10302. if (handlerBakeTerrain != null)
  10303. {
  10304. handlerBakeTerrain(this);
  10305. }
  10306. }
  10307. if (Utils.BytesToString(messagePacket.ParamList[0].Parameter) == "download filename")
  10308. {
  10309. if (messagePacket.ParamList.Length > 1)
  10310. {
  10311. RequestTerrain handlerRequestTerrain = OnRequestTerrain;
  10312. if (handlerRequestTerrain != null)
  10313. {
  10314. handlerRequestTerrain(this, Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  10315. }
  10316. }
  10317. }
  10318. if (Utils.BytesToString(messagePacket.ParamList[0].Parameter) == "upload filename")
  10319. {
  10320. if (messagePacket.ParamList.Length > 1)
  10321. {
  10322. RequestTerrain handlerUploadTerrain = OnUploadTerrain;
  10323. if (handlerUploadTerrain != null)
  10324. {
  10325. handlerUploadTerrain(this, Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  10326. }
  10327. }
  10328. }
  10329. }
  10330. }
  10331. return true;
  10332. case "estatechangeinfo":
  10333. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  10334. {
  10335. UUID invoice = messagePacket.MethodData.Invoice;
  10336. UUID SenderID = messagePacket.AgentData.AgentID;
  10337. UInt32 param1 = Convert.ToUInt32(Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  10338. UInt32 param2 = Convert.ToUInt32(Utils.BytesToString(messagePacket.ParamList[2].Parameter));
  10339. EstateChangeInfo handlerEstateChangeInfo = OnEstateChangeInfo;
  10340. if (handlerEstateChangeInfo != null)
  10341. {
  10342. handlerEstateChangeInfo(this, invoice, SenderID, param1, param2);
  10343. }
  10344. }
  10345. return true;
  10346. case "telehub":
  10347. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  10348. {
  10349. UUID invoice = messagePacket.MethodData.Invoice;
  10350. UUID SenderID = messagePacket.AgentData.AgentID;
  10351. UInt32 param1 = 0u;
  10352. string command = (string)Utils.BytesToString(messagePacket.ParamList[0].Parameter);
  10353. if (command != "info ui")
  10354. {
  10355. try
  10356. {
  10357. param1 = Convert.ToUInt32(Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  10358. }
  10359. catch
  10360. {
  10361. }
  10362. }
  10363. EstateManageTelehub handlerEstateManageTelehub = OnEstateManageTelehub;
  10364. if (handlerEstateManageTelehub != null)
  10365. {
  10366. handlerEstateManageTelehub(this, invoice, SenderID, command, param1);
  10367. }
  10368. }
  10369. return true;
  10370. case "refreshmapvisibility":
  10371. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  10372. {
  10373. IWorldMapModule mapModule = Scene.RequestModuleInterface<IWorldMapModule>();
  10374. if (mapModule == null)
  10375. {
  10376. SendAlertMessage("Terrain map generator not avaiable");
  10377. return true;
  10378. }
  10379. if (m_lastMapRegenTime == Double.MaxValue)
  10380. {
  10381. SendAlertMessage("Terrain map generation still in progress");
  10382. return true;
  10383. }
  10384. double now = Util.GetTimeStamp();
  10385. if (now - m_lastMapRegenTime < 120) // 2 minutes global cool down
  10386. {
  10387. SendAlertMessage("Please wait at least 2 minutes between map generation commands");
  10388. return true;
  10389. }
  10390. m_lastMapRegenTime = Double.MaxValue;
  10391. ((Scene)Scene).RegenerateMaptileAndReregister(this, null);
  10392. SendAlertMessage("Terrain map generated");
  10393. m_lastMapRegenTime = now;
  10394. }
  10395. return true;
  10396. case "kickestate":
  10397. if(((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  10398. {
  10399. UUID invoice = messagePacket.MethodData.Invoice;
  10400. UUID SenderID = messagePacket.AgentData.AgentID;
  10401. UUID Prey;
  10402. UUID.TryParse(Utils.BytesToString(messagePacket.ParamList[0].Parameter), out Prey);
  10403. OnEstateTeleportOneUserHomeRequest(this, invoice, SenderID, Prey, true);
  10404. }
  10405. return true;
  10406. default:
  10407. m_log.WarnFormat(
  10408. "[LLCLIENTVIEW]: EstateOwnerMessage: Unknown method {0} requested for {1} in {2}",
  10409. method, Name, Scene.Name);
  10410. for (int i = 0; i < messagePacket.ParamList.Length; i++)
  10411. {
  10412. EstateOwnerMessagePacket.ParamListBlock block = messagePacket.ParamList[i];
  10413. string data = (string)Utils.BytesToString(block.Parameter);
  10414. m_log.DebugFormat("[LLCLIENTVIEW]: Param {0}={1}", i, data);
  10415. }
  10416. return true;
  10417. }
  10418. //int parcelID, uint reportType, uint requestflags, string filter
  10419. //lsrp.RequestData.ParcelLocalID;
  10420. //lsrp.RequestData.ReportType; // 1 = colliders, 0 = scripts
  10421. //lsrp.RequestData.RequestFlags;
  10422. //lsrp.RequestData.Filter;
  10423. }
  10424. private bool HandleRequestRegionInfo(IClientAPI sender, Packet Pack)
  10425. {
  10426. RequestRegionInfoPacket.AgentDataBlock mPacket = ((RequestRegionInfoPacket)Pack).AgentData;
  10427. #region Packet Session and User Check
  10428. if (mPacket.SessionID != SessionId ||
  10429. mPacket.AgentID != AgentId)
  10430. return true;
  10431. #endregion
  10432. RegionInfoRequest handlerRegionInfoRequest = OnRegionInfoRequest;
  10433. if (handlerRegionInfoRequest != null)
  10434. {
  10435. handlerRegionInfoRequest(this);
  10436. }
  10437. return true;
  10438. }
  10439. private bool HandleEstateCovenantRequest(IClientAPI sender, Packet Pack)
  10440. {
  10441. //EstateCovenantRequestPacket.AgentDataBlock epack =
  10442. // ((EstateCovenantRequestPacket)Pack).AgentData;
  10443. EstateCovenantRequest handlerEstateCovenantRequest = OnEstateCovenantRequest;
  10444. if (handlerEstateCovenantRequest != null)
  10445. {
  10446. handlerEstateCovenantRequest(this);
  10447. }
  10448. return true;
  10449. }
  10450. #endregion Estate Packets
  10451. #region GodPackets
  10452. private bool HandleRequestGodlikePowers(IClientAPI sender, Packet Pack)
  10453. {
  10454. RequestGodlikePowersPacket rglpPack = (RequestGodlikePowersPacket)Pack;
  10455. if (rglpPack.AgentData.SessionID != SessionId ||
  10456. rglpPack.AgentData.AgentID != AgentId)
  10457. return true;
  10458. RequestGodlikePowersPacket.RequestBlockBlock rblock = rglpPack.RequestBlock;
  10459. UUID token = rblock.Token;
  10460. RequestGodlikePowersPacket.AgentDataBlock ablock = rglpPack.AgentData;
  10461. RequestGodlikePowers handlerReqGodlikePowers = OnRequestGodlikePowers;
  10462. if (handlerReqGodlikePowers != null)
  10463. {
  10464. handlerReqGodlikePowers(ablock.AgentID, ablock.SessionID, token, rblock.Godlike);
  10465. }
  10466. return true;
  10467. }
  10468. private bool HandleGodUpdateRegionInfoUpdate(IClientAPI client, Packet Packet)
  10469. {
  10470. GodUpdateRegionInfoPacket GodUpdateRegionInfo =
  10471. (GodUpdateRegionInfoPacket)Packet;
  10472. if (GodUpdateRegionInfo.AgentData.SessionID != SessionId ||
  10473. GodUpdateRegionInfo.AgentData.AgentID != AgentId)
  10474. return true;
  10475. GodUpdateRegionInfoUpdate handlerGodUpdateRegionInfo = OnGodUpdateRegionInfoUpdate;
  10476. if (handlerGodUpdateRegionInfo != null)
  10477. {
  10478. handlerGodUpdateRegionInfo(this,
  10479. GodUpdateRegionInfo.RegionInfo.BillableFactor,
  10480. GodUpdateRegionInfo.RegionInfo.EstateID,
  10481. GodUpdateRegionInfo.RegionInfo.RegionFlags,
  10482. GodUpdateRegionInfo.RegionInfo.SimName,
  10483. GodUpdateRegionInfo.RegionInfo.RedirectGridX,
  10484. GodUpdateRegionInfo.RegionInfo.RedirectGridY);
  10485. return true;
  10486. }
  10487. return false;
  10488. }
  10489. private bool HandleSimWideDeletes(IClientAPI client, Packet Packet)
  10490. {
  10491. SimWideDeletesPacket SimWideDeletesRequest =
  10492. (SimWideDeletesPacket)Packet;
  10493. SimWideDeletesDelegate handlerSimWideDeletesRequest = OnSimWideDeletes;
  10494. if (handlerSimWideDeletesRequest != null)
  10495. {
  10496. handlerSimWideDeletesRequest(this, SimWideDeletesRequest.AgentData.AgentID,(int)SimWideDeletesRequest.DataBlock.Flags,SimWideDeletesRequest.DataBlock.TargetID);
  10497. return true;
  10498. }
  10499. return false;
  10500. }
  10501. private bool HandleGodlikeMessage(IClientAPI client, Packet Packet)
  10502. {
  10503. GodlikeMessagePacket GodlikeMessage =
  10504. (GodlikeMessagePacket)Packet;
  10505. if (GodlikeMessage.AgentData.SessionID != SessionId ||
  10506. GodlikeMessage.AgentData.AgentID != AgentId)
  10507. return true;
  10508. GodlikeMessage handlerGodlikeMessage = onGodlikeMessage;
  10509. if (handlerGodlikeMessage != null)
  10510. {
  10511. handlerGodlikeMessage(this,
  10512. GodlikeMessage.MethodData.Invoice,
  10513. GodlikeMessage.MethodData.Method,
  10514. GodlikeMessage.ParamList[0].Parameter);
  10515. return true;
  10516. }
  10517. return false;
  10518. }
  10519. private bool HandleSaveStatePacket(IClientAPI client, Packet Packet)
  10520. {
  10521. StateSavePacket SaveStateMessage =
  10522. (StateSavePacket)Packet;
  10523. if (SaveStateMessage.AgentData.SessionID != SessionId ||
  10524. SaveStateMessage.AgentData.AgentID != AgentId)
  10525. return true;
  10526. SaveStateHandler handlerSaveStatePacket = OnSaveState;
  10527. if (handlerSaveStatePacket != null)
  10528. {
  10529. handlerSaveStatePacket(this,SaveStateMessage.AgentData.AgentID);
  10530. return true;
  10531. }
  10532. return false;
  10533. }
  10534. private bool HandleGodKickUser(IClientAPI sender, Packet Pack)
  10535. {
  10536. GodKickUserPacket gkupack = (GodKickUserPacket)Pack;
  10537. if (gkupack.UserInfo.GodSessionID != SessionId ||
  10538. gkupack.UserInfo.GodID != AgentId)
  10539. return true;
  10540. GodKickUser handlerGodKickUser = OnGodKickUser;
  10541. if (handlerGodKickUser != null)
  10542. {
  10543. handlerGodKickUser(gkupack.UserInfo.GodID, gkupack.UserInfo.AgentID, gkupack.UserInfo.KickFlags, gkupack.UserInfo.Reason);
  10544. }
  10545. return true;
  10546. }
  10547. #endregion GodPackets
  10548. #region Economy/Transaction Packets
  10549. private bool HandleMoneyBalanceRequest(IClientAPI sender, Packet Pack)
  10550. {
  10551. MoneyBalanceRequestPacket moneybalancerequestpacket = (MoneyBalanceRequestPacket)Pack;
  10552. #region Packet Session and User Check
  10553. if (moneybalancerequestpacket.AgentData.SessionID != SessionId ||
  10554. moneybalancerequestpacket.AgentData.AgentID != AgentId)
  10555. return true;
  10556. #endregion
  10557. MoneyBalanceRequest handlerMoneyBalanceRequest = OnMoneyBalanceRequest;
  10558. if (handlerMoneyBalanceRequest != null)
  10559. {
  10560. handlerMoneyBalanceRequest(this, moneybalancerequestpacket.AgentData.AgentID, moneybalancerequestpacket.AgentData.SessionID, moneybalancerequestpacket.MoneyData.TransactionID);
  10561. }
  10562. return true;
  10563. }
  10564. private bool HandleEconomyDataRequest(IClientAPI sender, Packet Pack)
  10565. {
  10566. EconomyDataRequest handlerEconomoyDataRequest = OnEconomyDataRequest;
  10567. if (handlerEconomoyDataRequest != null)
  10568. {
  10569. handlerEconomoyDataRequest(this);
  10570. }
  10571. return true;
  10572. }
  10573. private bool HandleRequestPayPrice(IClientAPI sender, Packet Pack)
  10574. {
  10575. RequestPayPricePacket requestPayPricePacket = (RequestPayPricePacket)Pack;
  10576. RequestPayPrice handlerRequestPayPrice = OnRequestPayPrice;
  10577. if (handlerRequestPayPrice != null)
  10578. {
  10579. handlerRequestPayPrice(this, requestPayPricePacket.ObjectData.ObjectID);
  10580. }
  10581. return true;
  10582. }
  10583. private bool HandleObjectSaleInfo(IClientAPI sender, Packet Pack)
  10584. {
  10585. ObjectSaleInfoPacket objectSaleInfoPacket = (ObjectSaleInfoPacket)Pack;
  10586. #region Packet Session and User Check
  10587. if (objectSaleInfoPacket.AgentData.SessionID != SessionId ||
  10588. objectSaleInfoPacket.AgentData.AgentID != AgentId)
  10589. return true;
  10590. #endregion
  10591. ObjectSaleInfo handlerObjectSaleInfo = OnObjectSaleInfo;
  10592. if (handlerObjectSaleInfo != null)
  10593. {
  10594. foreach (ObjectSaleInfoPacket.ObjectDataBlock d
  10595. in objectSaleInfoPacket.ObjectData)
  10596. {
  10597. handlerObjectSaleInfo(this,
  10598. objectSaleInfoPacket.AgentData.AgentID,
  10599. objectSaleInfoPacket.AgentData.SessionID,
  10600. d.LocalID,
  10601. d.SaleType,
  10602. d.SalePrice);
  10603. }
  10604. }
  10605. return true;
  10606. }
  10607. private bool HandleObjectBuy(IClientAPI sender, Packet Pack)
  10608. {
  10609. ObjectBuyPacket objectBuyPacket = (ObjectBuyPacket)Pack;
  10610. #region Packet Session and User Check
  10611. if (objectBuyPacket.AgentData.SessionID != SessionId ||
  10612. objectBuyPacket.AgentData.AgentID != AgentId)
  10613. return true;
  10614. #endregion
  10615. ObjectBuy handlerObjectBuy = OnObjectBuy;
  10616. if (handlerObjectBuy != null)
  10617. {
  10618. foreach (ObjectBuyPacket.ObjectDataBlock d
  10619. in objectBuyPacket.ObjectData)
  10620. {
  10621. handlerObjectBuy(this,
  10622. objectBuyPacket.AgentData.AgentID,
  10623. objectBuyPacket.AgentData.SessionID,
  10624. objectBuyPacket.AgentData.GroupID,
  10625. objectBuyPacket.AgentData.CategoryID,
  10626. d.ObjectLocalID,
  10627. d.SaleType,
  10628. d.SalePrice);
  10629. }
  10630. }
  10631. return true;
  10632. }
  10633. #endregion Economy/Transaction Packets
  10634. #region Script Packets
  10635. private bool HandleGetScriptRunning(IClientAPI sender, Packet Pack)
  10636. {
  10637. GetScriptRunningPacket scriptRunning = (GetScriptRunningPacket)Pack;
  10638. GetScriptRunning handlerGetScriptRunning = OnGetScriptRunning;
  10639. if (handlerGetScriptRunning != null)
  10640. {
  10641. handlerGetScriptRunning(this, scriptRunning.Script.ObjectID, scriptRunning.Script.ItemID);
  10642. }
  10643. return true;
  10644. }
  10645. private bool HandleSetScriptRunning(IClientAPI sender, Packet Pack)
  10646. {
  10647. SetScriptRunningPacket setScriptRunning = (SetScriptRunningPacket)Pack;
  10648. #region Packet Session and User Check
  10649. if (setScriptRunning.AgentData.SessionID != SessionId ||
  10650. setScriptRunning.AgentData.AgentID != AgentId)
  10651. return true;
  10652. #endregion
  10653. SetScriptRunning handlerSetScriptRunning = OnSetScriptRunning;
  10654. if (handlerSetScriptRunning != null)
  10655. {
  10656. handlerSetScriptRunning(this, setScriptRunning.Script.ObjectID, setScriptRunning.Script.ItemID, setScriptRunning.Script.Running);
  10657. }
  10658. return true;
  10659. }
  10660. private bool HandleScriptReset(IClientAPI sender, Packet Pack)
  10661. {
  10662. ScriptResetPacket scriptResetPacket = (ScriptResetPacket)Pack;
  10663. #region Packet Session and User Check
  10664. if (scriptResetPacket.AgentData.SessionID != SessionId ||
  10665. scriptResetPacket.AgentData.AgentID != AgentId)
  10666. return true;
  10667. #endregion
  10668. ScriptReset handlerScriptReset = OnScriptReset;
  10669. if (handlerScriptReset != null)
  10670. {
  10671. handlerScriptReset(this, scriptResetPacket.Script.ObjectID, scriptResetPacket.Script.ItemID);
  10672. }
  10673. return true;
  10674. }
  10675. #endregion Script Packets
  10676. #region Gesture Managment
  10677. private bool HandleActivateGestures(IClientAPI sender, Packet Pack)
  10678. {
  10679. ActivateGesturesPacket activateGesturePacket = (ActivateGesturesPacket)Pack;
  10680. #region Packet Session and User Check
  10681. if (activateGesturePacket.AgentData.SessionID != SessionId ||
  10682. activateGesturePacket.AgentData.AgentID != AgentId)
  10683. return true;
  10684. #endregion
  10685. ActivateGesture handlerActivateGesture = OnActivateGesture;
  10686. if (handlerActivateGesture != null)
  10687. {
  10688. handlerActivateGesture(this,
  10689. activateGesturePacket.Data[0].AssetID,
  10690. activateGesturePacket.Data[0].ItemID);
  10691. }
  10692. else m_log.Error("Null pointer for activateGesture");
  10693. return true;
  10694. }
  10695. private bool HandleDeactivateGestures(IClientAPI sender, Packet Pack)
  10696. {
  10697. DeactivateGesturesPacket deactivateGesturePacket = (DeactivateGesturesPacket)Pack;
  10698. #region Packet Session and User Check
  10699. if (deactivateGesturePacket.AgentData.SessionID != SessionId ||
  10700. deactivateGesturePacket.AgentData.AgentID != AgentId)
  10701. return true;
  10702. #endregion
  10703. DeactivateGesture handlerDeactivateGesture = OnDeactivateGesture;
  10704. if (handlerDeactivateGesture != null)
  10705. {
  10706. handlerDeactivateGesture(this, deactivateGesturePacket.Data[0].ItemID);
  10707. }
  10708. return true;
  10709. }
  10710. private bool HandleObjectOwner(IClientAPI sender, Packet Pack)
  10711. {
  10712. ObjectOwnerPacket objectOwnerPacket = (ObjectOwnerPacket)Pack;
  10713. #region Packet Session and User Check
  10714. if (objectOwnerPacket.AgentData.SessionID != SessionId ||
  10715. objectOwnerPacket.AgentData.AgentID != AgentId)
  10716. return true;
  10717. #endregion
  10718. List<uint> localIDs = new List<uint>();
  10719. foreach (ObjectOwnerPacket.ObjectDataBlock d in objectOwnerPacket.ObjectData)
  10720. localIDs.Add(d.ObjectLocalID);
  10721. ObjectOwner handlerObjectOwner = OnObjectOwner;
  10722. if (handlerObjectOwner != null)
  10723. {
  10724. handlerObjectOwner(this, objectOwnerPacket.HeaderData.OwnerID, objectOwnerPacket.HeaderData.GroupID, localIDs);
  10725. }
  10726. return true;
  10727. }
  10728. #endregion Gesture Managment
  10729. private bool HandleAgentFOV(IClientAPI sender, Packet Pack)
  10730. {
  10731. AgentFOVPacket fovPacket = (AgentFOVPacket)Pack;
  10732. if (fovPacket.FOVBlock.GenCounter > m_agentFOVCounter)
  10733. {
  10734. m_agentFOVCounter = fovPacket.FOVBlock.GenCounter;
  10735. AgentFOV handlerAgentFOV = OnAgentFOV;
  10736. if (handlerAgentFOV != null)
  10737. {
  10738. handlerAgentFOV(this, fovPacket.FOVBlock.VerticalAngle);
  10739. }
  10740. }
  10741. return true;
  10742. }
  10743. #region unimplemented handlers
  10744. private bool HandleViewerStats(IClientAPI sender, Packet Pack)
  10745. {
  10746. // TODO: handle this packet
  10747. //m_log.Warn("[CLIENT]: unhandled ViewerStats packet");
  10748. return true;
  10749. }
  10750. private bool HandleMapItemRequest(IClientAPI sender, Packet Pack)
  10751. {
  10752. MapItemRequestPacket mirpk = (MapItemRequestPacket)Pack;
  10753. #region Packet Session and User Check
  10754. if (mirpk.AgentData.SessionID != SessionId ||
  10755. mirpk.AgentData.AgentID != AgentId)
  10756. return true;
  10757. #endregion
  10758. //m_log.Debug(mirpk.ToString());
  10759. MapItemRequest handlerMapItemRequest = OnMapItemRequest;
  10760. if (handlerMapItemRequest != null)
  10761. {
  10762. try
  10763. {
  10764. handlerMapItemRequest(this, mirpk.AgentData.Flags, mirpk.AgentData.EstateID,
  10765. mirpk.AgentData.Godlike, mirpk.RequestData.ItemType,
  10766. mirpk.RequestData.RegionHandle);
  10767. }
  10768. catch( Exception e)
  10769. {
  10770. m_log.ErrorFormat("{0} HandleMapItemRequest exception: {1}", LogHeader, e.Message);
  10771. }
  10772. }
  10773. return true;
  10774. }
  10775. private bool HandleTransferAbort(IClientAPI sender, Packet Pack)
  10776. {
  10777. return true;
  10778. }
  10779. private bool HandleMuteListRequest(IClientAPI sender, Packet Pack)
  10780. {
  10781. MuteListRequestPacket muteListRequest =
  10782. (MuteListRequestPacket)Pack;
  10783. #region Packet Session and User Check
  10784. if (muteListRequest.AgentData.SessionID != SessionId ||
  10785. muteListRequest.AgentData.AgentID != AgentId)
  10786. return true;
  10787. #endregion
  10788. MuteListRequest handlerMuteListRequest = OnMuteListRequest;
  10789. if (handlerMuteListRequest != null)
  10790. {
  10791. handlerMuteListRequest(this, muteListRequest.MuteData.MuteCRC);
  10792. }
  10793. else
  10794. {
  10795. if(muteListRequest.MuteData.MuteCRC == 0)
  10796. SendEmpytMuteList();
  10797. else
  10798. SendUseCachedMuteList();
  10799. }
  10800. return true;
  10801. }
  10802. private bool HandleUpdateMuteListEntry(IClientAPI client, Packet Packet)
  10803. {
  10804. UpdateMuteListEntryPacket UpdateMuteListEntry =
  10805. (UpdateMuteListEntryPacket)Packet;
  10806. MuteListEntryUpdate handlerUpdateMuteListEntry = OnUpdateMuteListEntry;
  10807. if (handlerUpdateMuteListEntry != null)
  10808. {
  10809. handlerUpdateMuteListEntry(this, UpdateMuteListEntry.MuteData.MuteID,
  10810. Utils.BytesToString(UpdateMuteListEntry.MuteData.MuteName),
  10811. UpdateMuteListEntry.MuteData.MuteType,
  10812. UpdateMuteListEntry.MuteData.MuteFlags);
  10813. return true;
  10814. }
  10815. return false;
  10816. }
  10817. private bool HandleRemoveMuteListEntry(IClientAPI client, Packet Packet)
  10818. {
  10819. RemoveMuteListEntryPacket RemoveMuteListEntry =
  10820. (RemoveMuteListEntryPacket)Packet;
  10821. MuteListEntryRemove handlerRemoveMuteListEntry = OnRemoveMuteListEntry;
  10822. if (handlerRemoveMuteListEntry != null)
  10823. {
  10824. handlerRemoveMuteListEntry(this,
  10825. RemoveMuteListEntry.MuteData.MuteID,
  10826. Utils.BytesToString(RemoveMuteListEntry.MuteData.MuteName));
  10827. return true;
  10828. }
  10829. return false;
  10830. }
  10831. private bool HandleUserReport(IClientAPI client, Packet Packet)
  10832. {
  10833. UserReportPacket UserReport =
  10834. (UserReportPacket)Packet;
  10835. NewUserReport handlerUserReport = OnUserReport;
  10836. if (handlerUserReport != null)
  10837. {
  10838. handlerUserReport(this,
  10839. Utils.BytesToString(UserReport.ReportData.AbuseRegionName),
  10840. UserReport.ReportData.AbuserID,
  10841. UserReport.ReportData.Category,
  10842. UserReport.ReportData.CheckFlags,
  10843. Utils.BytesToString(UserReport.ReportData.Details),
  10844. UserReport.ReportData.ObjectID,
  10845. UserReport.ReportData.Position,
  10846. UserReport.ReportData.ReportType,
  10847. UserReport.ReportData.ScreenshotID,
  10848. Utils.BytesToString(UserReport.ReportData.Summary),
  10849. UserReport.AgentData.AgentID);
  10850. return true;
  10851. }
  10852. return false;
  10853. }
  10854. private bool HandleSendPostcard(IClientAPI client, Packet packet)
  10855. {
  10856. // SendPostcardPacket SendPostcard =
  10857. // (SendPostcardPacket)packet;
  10858. SendPostcard handlerSendPostcard = OnSendPostcard;
  10859. if (handlerSendPostcard != null)
  10860. {
  10861. handlerSendPostcard(this);
  10862. return true;
  10863. }
  10864. return false;
  10865. }
  10866. private bool HandleChangeInventoryItemFlags(IClientAPI client, Packet packet)
  10867. {
  10868. ChangeInventoryItemFlagsPacket ChangeInventoryItemFlags =
  10869. (ChangeInventoryItemFlagsPacket)packet;
  10870. ChangeInventoryItemFlags handlerChangeInventoryItemFlags = OnChangeInventoryItemFlags;
  10871. if (handlerChangeInventoryItemFlags != null)
  10872. {
  10873. foreach(ChangeInventoryItemFlagsPacket.InventoryDataBlock b in ChangeInventoryItemFlags.InventoryData)
  10874. handlerChangeInventoryItemFlags(this, b.ItemID, b.Flags);
  10875. return true;
  10876. }
  10877. return false;
  10878. }
  10879. private bool HandleUseCircuitCode(IClientAPI sender, Packet Pack)
  10880. {
  10881. /*
  10882. UseCircuitCodePacket uccp = (UseCircuitCodePacket)Pack;
  10883. if(uccp.CircuitCode.ID == m_agentId &&
  10884. uccp.CircuitCode.SessionID == m_sessionId &&
  10885. uccp.CircuitCode.Code == m_circuitCode &&
  10886. SceneAgent != null &&
  10887. !((ScenePresence)SceneAgent).IsDeleted
  10888. )
  10889. SendRegionHandshake(); // possible someone returning
  10890. */
  10891. return true;
  10892. }
  10893. private bool HandleCreateNewOutfitAttachments(IClientAPI sender, Packet Pack)
  10894. {
  10895. CreateNewOutfitAttachmentsPacket packet = (CreateNewOutfitAttachmentsPacket)Pack;
  10896. #region Packet Session and User Check
  10897. if (packet.AgentData.SessionID != SessionId ||
  10898. packet.AgentData.AgentID != AgentId)
  10899. return true;
  10900. #endregion
  10901. MoveItemsAndLeaveCopy handlerMoveItemsAndLeaveCopy = null;
  10902. List<InventoryItemBase> items = new List<InventoryItemBase>();
  10903. foreach (CreateNewOutfitAttachmentsPacket.ObjectDataBlock n in packet.ObjectData)
  10904. {
  10905. InventoryItemBase b = new InventoryItemBase();
  10906. b.ID = n.OldItemID;
  10907. b.Folder = n.OldFolderID;
  10908. items.Add(b);
  10909. }
  10910. handlerMoveItemsAndLeaveCopy = OnMoveItemsAndLeaveCopy;
  10911. if (handlerMoveItemsAndLeaveCopy != null)
  10912. {
  10913. handlerMoveItemsAndLeaveCopy(this, items, packet.HeaderData.NewFolderID);
  10914. }
  10915. return true;
  10916. }
  10917. private bool HandleAgentHeightWidth(IClientAPI sender, Packet Pack)
  10918. {
  10919. return true;
  10920. }
  10921. private bool HandleInventoryDescendents(IClientAPI sender, Packet Pack)
  10922. {
  10923. return true;
  10924. }
  10925. #endregion unimplemented handlers
  10926. #region Dir handlers
  10927. private bool HandleDirPlacesQuery(IClientAPI sender, Packet Pack)
  10928. {
  10929. DirPlacesQueryPacket dirPlacesQueryPacket = (DirPlacesQueryPacket)Pack;
  10930. //m_log.Debug(dirPlacesQueryPacket.ToString());
  10931. #region Packet Session and User Check
  10932. if (dirPlacesQueryPacket.AgentData.SessionID != SessionId ||
  10933. dirPlacesQueryPacket.AgentData.AgentID != AgentId)
  10934. return true;
  10935. #endregion
  10936. DirPlacesQuery handlerDirPlacesQuery = OnDirPlacesQuery;
  10937. if (handlerDirPlacesQuery != null)
  10938. {
  10939. handlerDirPlacesQuery(this,
  10940. dirPlacesQueryPacket.QueryData.QueryID,
  10941. Utils.BytesToString(
  10942. dirPlacesQueryPacket.QueryData.QueryText),
  10943. (int)dirPlacesQueryPacket.QueryData.QueryFlags,
  10944. (int)dirPlacesQueryPacket.QueryData.Category,
  10945. Utils.BytesToString(
  10946. dirPlacesQueryPacket.QueryData.SimName),
  10947. dirPlacesQueryPacket.QueryData.QueryStart);
  10948. }
  10949. return true;
  10950. }
  10951. private bool HandleDirFindQuery(IClientAPI sender, Packet Pack)
  10952. {
  10953. DirFindQueryPacket dirFindQueryPacket = (DirFindQueryPacket)Pack;
  10954. #region Packet Session and User Check
  10955. if (dirFindQueryPacket.AgentData.SessionID != SessionId ||
  10956. dirFindQueryPacket.AgentData.AgentID != AgentId)
  10957. return true;
  10958. #endregion
  10959. DirFindQuery handlerDirFindQuery = OnDirFindQuery;
  10960. if (handlerDirFindQuery != null)
  10961. {
  10962. handlerDirFindQuery(this,
  10963. dirFindQueryPacket.QueryData.QueryID,
  10964. Utils.BytesToString(
  10965. dirFindQueryPacket.QueryData.QueryText).Trim(),
  10966. dirFindQueryPacket.QueryData.QueryFlags,
  10967. dirFindQueryPacket.QueryData.QueryStart);
  10968. }
  10969. return true;
  10970. }
  10971. private bool HandleDirLandQuery(IClientAPI sender, Packet Pack)
  10972. {
  10973. DirLandQueryPacket dirLandQueryPacket = (DirLandQueryPacket)Pack;
  10974. #region Packet Session and User Check
  10975. if (dirLandQueryPacket.AgentData.SessionID != SessionId ||
  10976. dirLandQueryPacket.AgentData.AgentID != AgentId)
  10977. return true;
  10978. #endregion
  10979. DirLandQuery handlerDirLandQuery = OnDirLandQuery;
  10980. if (handlerDirLandQuery != null)
  10981. {
  10982. handlerDirLandQuery(this,
  10983. dirLandQueryPacket.QueryData.QueryID,
  10984. dirLandQueryPacket.QueryData.QueryFlags,
  10985. dirLandQueryPacket.QueryData.SearchType,
  10986. dirLandQueryPacket.QueryData.Price,
  10987. dirLandQueryPacket.QueryData.Area,
  10988. dirLandQueryPacket.QueryData.QueryStart);
  10989. }
  10990. return true;
  10991. }
  10992. private bool HandleDirPopularQuery(IClientAPI sender, Packet Pack)
  10993. {
  10994. DirPopularQueryPacket dirPopularQueryPacket = (DirPopularQueryPacket)Pack;
  10995. #region Packet Session and User Check
  10996. if (dirPopularQueryPacket.AgentData.SessionID != SessionId ||
  10997. dirPopularQueryPacket.AgentData.AgentID != AgentId)
  10998. return true;
  10999. #endregion
  11000. DirPopularQuery handlerDirPopularQuery = OnDirPopularQuery;
  11001. if (handlerDirPopularQuery != null)
  11002. {
  11003. handlerDirPopularQuery(this,
  11004. dirPopularQueryPacket.QueryData.QueryID,
  11005. dirPopularQueryPacket.QueryData.QueryFlags);
  11006. }
  11007. return true;
  11008. }
  11009. private bool HandleDirClassifiedQuery(IClientAPI sender, Packet Pack)
  11010. {
  11011. DirClassifiedQueryPacket dirClassifiedQueryPacket = (DirClassifiedQueryPacket)Pack;
  11012. #region Packet Session and User Check
  11013. if (dirClassifiedQueryPacket.AgentData.SessionID != SessionId ||
  11014. dirClassifiedQueryPacket.AgentData.AgentID != AgentId)
  11015. return true;
  11016. #endregion
  11017. DirClassifiedQuery handlerDirClassifiedQuery = OnDirClassifiedQuery;
  11018. if (handlerDirClassifiedQuery != null)
  11019. {
  11020. handlerDirClassifiedQuery(this,
  11021. dirClassifiedQueryPacket.QueryData.QueryID,
  11022. Utils.BytesToString(
  11023. dirClassifiedQueryPacket.QueryData.QueryText),
  11024. dirClassifiedQueryPacket.QueryData.QueryFlags,
  11025. dirClassifiedQueryPacket.QueryData.Category,
  11026. dirClassifiedQueryPacket.QueryData.QueryStart);
  11027. }
  11028. return true;
  11029. }
  11030. private bool HandleEventInfoRequest(IClientAPI sender, Packet Pack)
  11031. {
  11032. EventInfoRequestPacket eventInfoRequestPacket = (EventInfoRequestPacket)Pack;
  11033. #region Packet Session and User Check
  11034. if (eventInfoRequestPacket.AgentData.SessionID != SessionId ||
  11035. eventInfoRequestPacket.AgentData.AgentID != AgentId)
  11036. return true;
  11037. #endregion
  11038. if (OnEventInfoRequest != null)
  11039. {
  11040. OnEventInfoRequest(this, eventInfoRequestPacket.EventData.EventID);
  11041. }
  11042. return true;
  11043. }
  11044. #endregion
  11045. #region Calling Card
  11046. private bool HandleOfferCallingCard(IClientAPI sender, Packet Pack)
  11047. {
  11048. OfferCallingCardPacket offerCallingCardPacket = (OfferCallingCardPacket)Pack;
  11049. #region Packet Session and User Check
  11050. if (offerCallingCardPacket.AgentData.SessionID != SessionId ||
  11051. offerCallingCardPacket.AgentData.AgentID != AgentId)
  11052. return true;
  11053. #endregion
  11054. if (OnOfferCallingCard != null)
  11055. {
  11056. OnOfferCallingCard(this,
  11057. offerCallingCardPacket.AgentBlock.DestID,
  11058. offerCallingCardPacket.AgentBlock.TransactionID);
  11059. }
  11060. return true;
  11061. }
  11062. private bool HandleAcceptCallingCard(IClientAPI sender, Packet Pack)
  11063. {
  11064. AcceptCallingCardPacket acceptCallingCardPacket = (AcceptCallingCardPacket)Pack;
  11065. #region Packet Session and User Check
  11066. if (acceptCallingCardPacket.AgentData.SessionID != SessionId ||
  11067. acceptCallingCardPacket.AgentData.AgentID != AgentId)
  11068. return true;
  11069. #endregion
  11070. // according to http://wiki.secondlife.com/wiki/AcceptCallingCard FolderData should
  11071. // contain exactly one entry
  11072. if (OnAcceptCallingCard != null && acceptCallingCardPacket.FolderData.Length > 0)
  11073. {
  11074. OnAcceptCallingCard(this,
  11075. acceptCallingCardPacket.TransactionBlock.TransactionID,
  11076. acceptCallingCardPacket.FolderData[0].FolderID);
  11077. }
  11078. return true;
  11079. }
  11080. private bool HandleDeclineCallingCard(IClientAPI sender, Packet Pack)
  11081. {
  11082. DeclineCallingCardPacket declineCallingCardPacket = (DeclineCallingCardPacket)Pack;
  11083. #region Packet Session and User Check
  11084. if (declineCallingCardPacket.AgentData.SessionID != SessionId ||
  11085. declineCallingCardPacket.AgentData.AgentID != AgentId)
  11086. return true;
  11087. #endregion
  11088. if (OnDeclineCallingCard != null)
  11089. {
  11090. OnDeclineCallingCard(this,
  11091. declineCallingCardPacket.TransactionBlock.TransactionID);
  11092. }
  11093. return true;
  11094. }
  11095. #endregion Calling Card
  11096. #region Groups
  11097. private bool HandleActivateGroup(IClientAPI sender, Packet Pack)
  11098. {
  11099. ActivateGroupPacket activateGroupPacket = (ActivateGroupPacket)Pack;
  11100. #region Packet Session and User Check
  11101. if (activateGroupPacket.AgentData.SessionID != SessionId ||
  11102. activateGroupPacket.AgentData.AgentID != AgentId)
  11103. return true;
  11104. #endregion
  11105. if (m_GroupsModule != null)
  11106. {
  11107. m_GroupsModule.ActivateGroup(this, activateGroupPacket.AgentData.GroupID);
  11108. }
  11109. return true;
  11110. }
  11111. private bool HandleGroupVoteHistoryRequest(IClientAPI client, Packet Packet)
  11112. {
  11113. GroupVoteHistoryRequestPacket GroupVoteHistoryRequest =
  11114. (GroupVoteHistoryRequestPacket)Packet;
  11115. GroupVoteHistoryRequest handlerGroupVoteHistoryRequest = OnGroupVoteHistoryRequest;
  11116. if (handlerGroupVoteHistoryRequest != null)
  11117. {
  11118. handlerGroupVoteHistoryRequest(this, GroupVoteHistoryRequest.AgentData.AgentID,GroupVoteHistoryRequest.AgentData.SessionID,GroupVoteHistoryRequest.GroupData.GroupID,GroupVoteHistoryRequest.TransactionData.TransactionID);
  11119. return true;
  11120. }
  11121. return false;
  11122. }
  11123. private bool HandleGroupActiveProposalsRequest(IClientAPI client, Packet Packet)
  11124. {
  11125. GroupActiveProposalsRequestPacket GroupActiveProposalsRequest =
  11126. (GroupActiveProposalsRequestPacket)Packet;
  11127. GroupActiveProposalsRequest handlerGroupActiveProposalsRequest = OnGroupActiveProposalsRequest;
  11128. if (handlerGroupActiveProposalsRequest != null)
  11129. {
  11130. handlerGroupActiveProposalsRequest(this, GroupActiveProposalsRequest.AgentData.AgentID,GroupActiveProposalsRequest.AgentData.SessionID,GroupActiveProposalsRequest.GroupData.GroupID,GroupActiveProposalsRequest.TransactionData.TransactionID);
  11131. return true;
  11132. }
  11133. return false;
  11134. }
  11135. private bool HandleGroupAccountDetailsRequest(IClientAPI client, Packet Packet)
  11136. {
  11137. GroupAccountDetailsRequestPacket GroupAccountDetailsRequest =
  11138. (GroupAccountDetailsRequestPacket)Packet;
  11139. GroupAccountDetailsRequest handlerGroupAccountDetailsRequest = OnGroupAccountDetailsRequest;
  11140. if (handlerGroupAccountDetailsRequest != null)
  11141. {
  11142. handlerGroupAccountDetailsRequest(this, GroupAccountDetailsRequest.AgentData.AgentID,GroupAccountDetailsRequest.AgentData.GroupID,GroupAccountDetailsRequest.MoneyData.RequestID,GroupAccountDetailsRequest.AgentData.SessionID);
  11143. return true;
  11144. }
  11145. return false;
  11146. }
  11147. private bool HandleGroupAccountSummaryRequest(IClientAPI client, Packet Packet)
  11148. {
  11149. GroupAccountSummaryRequestPacket GroupAccountSummaryRequest =
  11150. (GroupAccountSummaryRequestPacket)Packet;
  11151. GroupAccountSummaryRequest handlerGroupAccountSummaryRequest = OnGroupAccountSummaryRequest;
  11152. if (handlerGroupAccountSummaryRequest != null)
  11153. {
  11154. handlerGroupAccountSummaryRequest(this, GroupAccountSummaryRequest.AgentData.AgentID,GroupAccountSummaryRequest.AgentData.GroupID);
  11155. return true;
  11156. }
  11157. return false;
  11158. }
  11159. private bool HandleGroupTransactionsDetailsRequest(IClientAPI client, Packet Packet)
  11160. {
  11161. GroupAccountTransactionsRequestPacket GroupAccountTransactionsRequest =
  11162. (GroupAccountTransactionsRequestPacket)Packet;
  11163. GroupAccountTransactionsRequest handlerGroupAccountTransactionsRequest = OnGroupAccountTransactionsRequest;
  11164. if (handlerGroupAccountTransactionsRequest != null)
  11165. {
  11166. handlerGroupAccountTransactionsRequest(this, GroupAccountTransactionsRequest.AgentData.AgentID,GroupAccountTransactionsRequest.AgentData.GroupID,GroupAccountTransactionsRequest.MoneyData.RequestID,GroupAccountTransactionsRequest.AgentData.SessionID);
  11167. return true;
  11168. }
  11169. return false;
  11170. }
  11171. private bool HandleGroupTitlesRequest(IClientAPI sender, Packet Pack)
  11172. {
  11173. GroupTitlesRequestPacket groupTitlesRequest =
  11174. (GroupTitlesRequestPacket)Pack;
  11175. #region Packet Session and User Check
  11176. if (groupTitlesRequest.AgentData.SessionID != SessionId ||
  11177. groupTitlesRequest.AgentData.AgentID != AgentId)
  11178. return true;
  11179. #endregion
  11180. if (m_GroupsModule != null)
  11181. {
  11182. GroupTitlesReplyPacket groupTitlesReply = (GroupTitlesReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupTitlesReply);
  11183. groupTitlesReply.AgentData =
  11184. new GroupTitlesReplyPacket.AgentDataBlock();
  11185. groupTitlesReply.AgentData.AgentID = AgentId;
  11186. groupTitlesReply.AgentData.GroupID =
  11187. groupTitlesRequest.AgentData.GroupID;
  11188. groupTitlesReply.AgentData.RequestID =
  11189. groupTitlesRequest.AgentData.RequestID;
  11190. List<GroupTitlesData> titles =
  11191. m_GroupsModule.GroupTitlesRequest(this,
  11192. groupTitlesRequest.AgentData.GroupID);
  11193. groupTitlesReply.GroupData =
  11194. new GroupTitlesReplyPacket.GroupDataBlock[titles.Count];
  11195. int i = 0;
  11196. foreach (GroupTitlesData d in titles)
  11197. {
  11198. groupTitlesReply.GroupData[i] =
  11199. new GroupTitlesReplyPacket.GroupDataBlock();
  11200. groupTitlesReply.GroupData[i].Title =
  11201. Util.StringToBytes256(d.Name);
  11202. groupTitlesReply.GroupData[i].RoleID =
  11203. d.UUID;
  11204. groupTitlesReply.GroupData[i].Selected =
  11205. d.Selected;
  11206. i++;
  11207. }
  11208. OutPacket(groupTitlesReply, ThrottleOutPacketType.Task);
  11209. }
  11210. return true;
  11211. }
  11212. UUID lastGroupProfileRequestID = UUID.Zero;
  11213. double lastGroupProfileRequestTS = Util.GetTimeStampMS();
  11214. private bool HandleGroupProfileRequest(IClientAPI sender, Packet Pack)
  11215. {
  11216. if(m_GroupsModule == null)
  11217. return true;
  11218. GroupProfileRequestPacket groupProfileRequest =
  11219. (GroupProfileRequestPacket)Pack;
  11220. #region Packet Session and User Check
  11221. if (groupProfileRequest.AgentData.SessionID != SessionId ||
  11222. groupProfileRequest.AgentData.AgentID != AgentId)
  11223. return true;
  11224. #endregion
  11225. UUID grpID = groupProfileRequest.GroupData.GroupID;
  11226. double ts = Util.GetTimeStampMS();
  11227. if(grpID == lastGroupProfileRequestID && ts - lastGroupProfileRequestTS < 10000)
  11228. return true;
  11229. lastGroupProfileRequestID = grpID;
  11230. lastGroupProfileRequestTS = ts;
  11231. GroupProfileReplyPacket groupProfileReply = (GroupProfileReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupProfileReply);
  11232. groupProfileReply.AgentData = new GroupProfileReplyPacket.AgentDataBlock();
  11233. groupProfileReply.GroupData = new GroupProfileReplyPacket.GroupDataBlock();
  11234. groupProfileReply.AgentData.AgentID = AgentId;
  11235. GroupProfileData d = m_GroupsModule.GroupProfileRequest(this,
  11236. groupProfileRequest.GroupData.GroupID);
  11237. if(d.GroupID == UUID.Zero) // don't send broken data
  11238. return true;
  11239. groupProfileReply.GroupData.GroupID = d.GroupID;
  11240. groupProfileReply.GroupData.Name = Util.StringToBytes256(d.Name);
  11241. groupProfileReply.GroupData.Charter = Util.StringToBytes1024(d.Charter);
  11242. groupProfileReply.GroupData.ShowInList = d.ShowInList;
  11243. groupProfileReply.GroupData.MemberTitle = Util.StringToBytes256(d.MemberTitle);
  11244. groupProfileReply.GroupData.PowersMask = d.PowersMask;
  11245. groupProfileReply.GroupData.InsigniaID = d.InsigniaID;
  11246. groupProfileReply.GroupData.FounderID = d.FounderID;
  11247. groupProfileReply.GroupData.MembershipFee = d.MembershipFee;
  11248. groupProfileReply.GroupData.OpenEnrollment = d.OpenEnrollment;
  11249. groupProfileReply.GroupData.Money = d.Money;
  11250. groupProfileReply.GroupData.GroupMembershipCount = d.GroupMembershipCount;
  11251. groupProfileReply.GroupData.GroupRolesCount = d.GroupRolesCount;
  11252. groupProfileReply.GroupData.AllowPublish = d.AllowPublish;
  11253. groupProfileReply.GroupData.MaturePublish = d.MaturePublish;
  11254. groupProfileReply.GroupData.OwnerRole = d.OwnerRole;
  11255. Scene scene = (Scene)m_scene;
  11256. if (scene.Permissions.IsGod(sender.AgentId) && (!sender.IsGroupMember(groupProfileRequest.GroupData.GroupID)))
  11257. {
  11258. ScenePresence p;
  11259. if (scene.TryGetScenePresence(sender.AgentId, out p))
  11260. {
  11261. if (p.IsViewerUIGod)
  11262. {
  11263. groupProfileReply.GroupData.OpenEnrollment = true;
  11264. groupProfileReply.GroupData.MembershipFee = 0;
  11265. }
  11266. }
  11267. }
  11268. OutPacket(groupProfileReply, ThrottleOutPacketType.Task);
  11269. if(grpID == lastGroupProfileRequestID)
  11270. lastGroupProfileRequestTS = Util.GetTimeStampMS() - 7000;
  11271. return true;
  11272. }
  11273. private bool HandleGroupMembersRequest(IClientAPI sender, Packet Pack)
  11274. {
  11275. GroupMembersRequestPacket groupMembersRequestPacket =
  11276. (GroupMembersRequestPacket)Pack;
  11277. #region Packet Session and User Check
  11278. if (groupMembersRequestPacket.AgentData.SessionID != SessionId ||
  11279. groupMembersRequestPacket.AgentData.AgentID != AgentId)
  11280. return true;
  11281. #endregion
  11282. if (m_GroupsModule != null)
  11283. {
  11284. List<GroupMembersData> members =
  11285. m_GroupsModule.GroupMembersRequest(this, groupMembersRequestPacket.GroupData.GroupID);
  11286. int memberCount = members.Count;
  11287. int indx = 0;
  11288. while (indx < memberCount)
  11289. {
  11290. int blockCount = memberCount - indx;
  11291. if (blockCount > 25)
  11292. blockCount = 25;
  11293. GroupMembersReplyPacket groupMembersReply = (GroupMembersReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupMembersReply);
  11294. groupMembersReply.AgentData =
  11295. new GroupMembersReplyPacket.AgentDataBlock();
  11296. groupMembersReply.GroupData =
  11297. new GroupMembersReplyPacket.GroupDataBlock();
  11298. groupMembersReply.MemberData =
  11299. new GroupMembersReplyPacket.MemberDataBlock[
  11300. blockCount];
  11301. groupMembersReply.AgentData.AgentID = AgentId;
  11302. groupMembersReply.GroupData.GroupID =
  11303. groupMembersRequestPacket.GroupData.GroupID;
  11304. groupMembersReply.GroupData.RequestID =
  11305. groupMembersRequestPacket.GroupData.RequestID;
  11306. groupMembersReply.GroupData.MemberCount = memberCount;
  11307. for (int i = 0; i < blockCount; i++)
  11308. {
  11309. GroupMembersData m = members[indx++];
  11310. groupMembersReply.MemberData[i] =
  11311. new GroupMembersReplyPacket.MemberDataBlock();
  11312. groupMembersReply.MemberData[i].AgentID =
  11313. m.AgentID;
  11314. groupMembersReply.MemberData[i].Contribution =
  11315. m.Contribution;
  11316. groupMembersReply.MemberData[i].OnlineStatus =
  11317. Util.StringToBytes256(m.OnlineStatus);
  11318. groupMembersReply.MemberData[i].AgentPowers =
  11319. m.AgentPowers;
  11320. groupMembersReply.MemberData[i].Title =
  11321. Util.StringToBytes256(m.Title);
  11322. groupMembersReply.MemberData[i].IsOwner =
  11323. m.IsOwner;
  11324. }
  11325. OutPacket(groupMembersReply, ThrottleOutPacketType.Task);
  11326. }
  11327. }
  11328. return true;
  11329. }
  11330. private bool HandleGroupRoleDataRequest(IClientAPI sender, Packet Pack)
  11331. {
  11332. GroupRoleDataRequestPacket groupRolesRequest =
  11333. (GroupRoleDataRequestPacket)Pack;
  11334. #region Packet Session and User Check
  11335. if (groupRolesRequest.AgentData.SessionID != SessionId ||
  11336. groupRolesRequest.AgentData.AgentID != AgentId)
  11337. return true;
  11338. #endregion
  11339. if (m_GroupsModule != null)
  11340. {
  11341. GroupRoleDataReplyPacket groupRolesReply = (GroupRoleDataReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupRoleDataReply);
  11342. groupRolesReply.AgentData =
  11343. new GroupRoleDataReplyPacket.AgentDataBlock();
  11344. groupRolesReply.AgentData.AgentID = AgentId;
  11345. groupRolesReply.GroupData =
  11346. new GroupRoleDataReplyPacket.GroupDataBlock();
  11347. groupRolesReply.GroupData.GroupID =
  11348. groupRolesRequest.GroupData.GroupID;
  11349. groupRolesReply.GroupData.RequestID =
  11350. groupRolesRequest.GroupData.RequestID;
  11351. List<GroupRolesData> titles =
  11352. m_GroupsModule.GroupRoleDataRequest(this,
  11353. groupRolesRequest.GroupData.GroupID);
  11354. groupRolesReply.GroupData.RoleCount =
  11355. titles.Count;
  11356. groupRolesReply.RoleData =
  11357. new GroupRoleDataReplyPacket.RoleDataBlock[titles.Count];
  11358. int i = 0;
  11359. foreach (GroupRolesData d in titles)
  11360. {
  11361. groupRolesReply.RoleData[i] =
  11362. new GroupRoleDataReplyPacket.RoleDataBlock();
  11363. groupRolesReply.RoleData[i].RoleID =
  11364. d.RoleID;
  11365. groupRolesReply.RoleData[i].Name =
  11366. Util.StringToBytes256(d.Name);
  11367. groupRolesReply.RoleData[i].Title =
  11368. Util.StringToBytes256(d.Title);
  11369. groupRolesReply.RoleData[i].Description =
  11370. Util.StringToBytes1024(d.Description);
  11371. groupRolesReply.RoleData[i].Powers =
  11372. d.Powers;
  11373. groupRolesReply.RoleData[i].Members =
  11374. (uint)d.Members;
  11375. i++;
  11376. }
  11377. OutPacket(groupRolesReply, ThrottleOutPacketType.Task);
  11378. }
  11379. return true;
  11380. }
  11381. private bool HandleGroupRoleMembersRequest(IClientAPI sender, Packet Pack)
  11382. {
  11383. GroupRoleMembersRequestPacket groupRoleMembersRequest =
  11384. (GroupRoleMembersRequestPacket)Pack;
  11385. #region Packet Session and User Check
  11386. if (groupRoleMembersRequest.AgentData.SessionID != SessionId ||
  11387. groupRoleMembersRequest.AgentData.AgentID != AgentId)
  11388. return true;
  11389. #endregion
  11390. if (m_GroupsModule != null)
  11391. {
  11392. List<GroupRoleMembersData> mappings =
  11393. m_GroupsModule.GroupRoleMembersRequest(this,
  11394. groupRoleMembersRequest.GroupData.GroupID);
  11395. int mappingsCount = mappings.Count;
  11396. while (mappings.Count > 0)
  11397. {
  11398. int pairs = mappings.Count;
  11399. if (pairs > 32)
  11400. pairs = 32;
  11401. GroupRoleMembersReplyPacket groupRoleMembersReply = (GroupRoleMembersReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupRoleMembersReply);
  11402. groupRoleMembersReply.AgentData =
  11403. new GroupRoleMembersReplyPacket.AgentDataBlock();
  11404. groupRoleMembersReply.AgentData.AgentID =
  11405. AgentId;
  11406. groupRoleMembersReply.AgentData.GroupID =
  11407. groupRoleMembersRequest.GroupData.GroupID;
  11408. groupRoleMembersReply.AgentData.RequestID =
  11409. groupRoleMembersRequest.GroupData.RequestID;
  11410. groupRoleMembersReply.AgentData.TotalPairs =
  11411. (uint)mappingsCount;
  11412. groupRoleMembersReply.MemberData =
  11413. new GroupRoleMembersReplyPacket.MemberDataBlock[pairs];
  11414. for (int i = 0; i < pairs; i++)
  11415. {
  11416. GroupRoleMembersData d = mappings[0];
  11417. mappings.RemoveAt(0);
  11418. groupRoleMembersReply.MemberData[i] =
  11419. new GroupRoleMembersReplyPacket.MemberDataBlock();
  11420. groupRoleMembersReply.MemberData[i].RoleID =
  11421. d.RoleID;
  11422. groupRoleMembersReply.MemberData[i].MemberID =
  11423. d.MemberID;
  11424. }
  11425. OutPacket(groupRoleMembersReply, ThrottleOutPacketType.Task);
  11426. }
  11427. }
  11428. return true;
  11429. }
  11430. private bool HandleCreateGroupRequest(IClientAPI sender, Packet Pack)
  11431. {
  11432. CreateGroupRequestPacket createGroupRequest =
  11433. (CreateGroupRequestPacket)Pack;
  11434. #region Packet Session and User Check
  11435. if (createGroupRequest.AgentData.SessionID != SessionId ||
  11436. createGroupRequest.AgentData.AgentID != AgentId)
  11437. return true;
  11438. #endregion
  11439. if (m_GroupsModule != null)
  11440. {
  11441. m_GroupsModule.CreateGroup(this,
  11442. Utils.BytesToString(createGroupRequest.GroupData.Name),
  11443. Utils.BytesToString(createGroupRequest.GroupData.Charter),
  11444. createGroupRequest.GroupData.ShowInList,
  11445. createGroupRequest.GroupData.InsigniaID,
  11446. createGroupRequest.GroupData.MembershipFee,
  11447. createGroupRequest.GroupData.OpenEnrollment,
  11448. createGroupRequest.GroupData.AllowPublish,
  11449. createGroupRequest.GroupData.MaturePublish);
  11450. }
  11451. return true;
  11452. }
  11453. private bool HandleUpdateGroupInfo(IClientAPI sender, Packet Pack)
  11454. {
  11455. UpdateGroupInfoPacket updateGroupInfo =
  11456. (UpdateGroupInfoPacket)Pack;
  11457. #region Packet Session and User Check
  11458. if (updateGroupInfo.AgentData.SessionID != SessionId ||
  11459. updateGroupInfo.AgentData.AgentID != AgentId)
  11460. return true;
  11461. #endregion
  11462. if (m_GroupsModule != null)
  11463. {
  11464. m_GroupsModule.UpdateGroupInfo(this,
  11465. updateGroupInfo.GroupData.GroupID,
  11466. Utils.BytesToString(updateGroupInfo.GroupData.Charter),
  11467. updateGroupInfo.GroupData.ShowInList,
  11468. updateGroupInfo.GroupData.InsigniaID,
  11469. updateGroupInfo.GroupData.MembershipFee,
  11470. updateGroupInfo.GroupData.OpenEnrollment,
  11471. updateGroupInfo.GroupData.AllowPublish,
  11472. updateGroupInfo.GroupData.MaturePublish);
  11473. }
  11474. return true;
  11475. }
  11476. private bool HandleSetGroupAcceptNotices(IClientAPI sender, Packet Pack)
  11477. {
  11478. SetGroupAcceptNoticesPacket setGroupAcceptNotices =
  11479. (SetGroupAcceptNoticesPacket)Pack;
  11480. #region Packet Session and User Check
  11481. if (setGroupAcceptNotices.AgentData.SessionID != SessionId ||
  11482. setGroupAcceptNotices.AgentData.AgentID != AgentId)
  11483. return true;
  11484. #endregion
  11485. if (m_GroupsModule != null)
  11486. {
  11487. m_GroupsModule.SetGroupAcceptNotices(this,
  11488. setGroupAcceptNotices.Data.GroupID,
  11489. setGroupAcceptNotices.Data.AcceptNotices,
  11490. setGroupAcceptNotices.NewData.ListInProfile);
  11491. }
  11492. return true;
  11493. }
  11494. private bool HandleGroupTitleUpdate(IClientAPI sender, Packet Pack)
  11495. {
  11496. GroupTitleUpdatePacket groupTitleUpdate =
  11497. (GroupTitleUpdatePacket)Pack;
  11498. #region Packet Session and User Check
  11499. if (groupTitleUpdate.AgentData.SessionID != SessionId ||
  11500. groupTitleUpdate.AgentData.AgentID != AgentId)
  11501. return true;
  11502. #endregion
  11503. if (m_GroupsModule != null)
  11504. {
  11505. m_GroupsModule.GroupTitleUpdate(this,
  11506. groupTitleUpdate.AgentData.GroupID,
  11507. groupTitleUpdate.AgentData.TitleRoleID);
  11508. }
  11509. return true;
  11510. }
  11511. private bool HandleParcelDeedToGroup(IClientAPI sender, Packet Pack)
  11512. {
  11513. ParcelDeedToGroupPacket parcelDeedToGroup = (ParcelDeedToGroupPacket)Pack;
  11514. if (m_GroupsModule != null)
  11515. {
  11516. ParcelDeedToGroup handlerParcelDeedToGroup = OnParcelDeedToGroup;
  11517. if (handlerParcelDeedToGroup != null)
  11518. {
  11519. handlerParcelDeedToGroup(parcelDeedToGroup.Data.LocalID, parcelDeedToGroup.Data.GroupID, this);
  11520. }
  11521. }
  11522. return true;
  11523. }
  11524. private bool HandleGroupNoticesListRequest(IClientAPI sender, Packet Pack)
  11525. {
  11526. GroupNoticesListRequestPacket groupNoticesListRequest =
  11527. (GroupNoticesListRequestPacket)Pack;
  11528. #region Packet Session and User Check
  11529. if (groupNoticesListRequest.AgentData.SessionID != SessionId ||
  11530. groupNoticesListRequest.AgentData.AgentID != AgentId)
  11531. return true;
  11532. #endregion
  11533. if (m_GroupsModule != null)
  11534. {
  11535. GroupNoticeData[] gn =
  11536. m_GroupsModule.GroupNoticesListRequest(this,
  11537. groupNoticesListRequest.Data.GroupID);
  11538. GroupNoticesListReplyPacket groupNoticesListReply = (GroupNoticesListReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupNoticesListReply);
  11539. groupNoticesListReply.AgentData =
  11540. new GroupNoticesListReplyPacket.AgentDataBlock();
  11541. groupNoticesListReply.AgentData.AgentID = AgentId;
  11542. groupNoticesListReply.AgentData.GroupID = groupNoticesListRequest.Data.GroupID;
  11543. groupNoticesListReply.Data = new GroupNoticesListReplyPacket.DataBlock[gn.Length];
  11544. int i = 0;
  11545. foreach (GroupNoticeData g in gn)
  11546. {
  11547. groupNoticesListReply.Data[i] = new GroupNoticesListReplyPacket.DataBlock();
  11548. groupNoticesListReply.Data[i].NoticeID =
  11549. g.NoticeID;
  11550. groupNoticesListReply.Data[i].Timestamp =
  11551. g.Timestamp;
  11552. groupNoticesListReply.Data[i].FromName =
  11553. Util.StringToBytes256(g.FromName);
  11554. groupNoticesListReply.Data[i].Subject =
  11555. Util.StringToBytes256(g.Subject);
  11556. groupNoticesListReply.Data[i].HasAttachment =
  11557. g.HasAttachment;
  11558. groupNoticesListReply.Data[i].AssetType =
  11559. g.AssetType;
  11560. i++;
  11561. }
  11562. OutPacket(groupNoticesListReply, ThrottleOutPacketType.Task);
  11563. }
  11564. return true;
  11565. }
  11566. private bool HandleGroupNoticeRequest(IClientAPI sender, Packet Pack)
  11567. {
  11568. GroupNoticeRequestPacket groupNoticeRequest =
  11569. (GroupNoticeRequestPacket)Pack;
  11570. #region Packet Session and User Check
  11571. if (groupNoticeRequest.AgentData.SessionID != SessionId ||
  11572. groupNoticeRequest.AgentData.AgentID != AgentId)
  11573. return true;
  11574. #endregion
  11575. if (m_GroupsModule != null)
  11576. {
  11577. m_GroupsModule.GroupNoticeRequest(this,
  11578. groupNoticeRequest.Data.GroupNoticeID);
  11579. }
  11580. return true;
  11581. }
  11582. private bool HandleGroupRoleUpdate(IClientAPI sender, Packet Pack)
  11583. {
  11584. GroupRoleUpdatePacket groupRoleUpdate =
  11585. (GroupRoleUpdatePacket)Pack;
  11586. #region Packet Session and User Check
  11587. if (groupRoleUpdate.AgentData.SessionID != SessionId ||
  11588. groupRoleUpdate.AgentData.AgentID != AgentId)
  11589. return true;
  11590. #endregion
  11591. if (m_GroupsModule != null)
  11592. {
  11593. foreach (GroupRoleUpdatePacket.RoleDataBlock d in
  11594. groupRoleUpdate.RoleData)
  11595. {
  11596. m_GroupsModule.GroupRoleUpdate(this,
  11597. groupRoleUpdate.AgentData.GroupID,
  11598. d.RoleID,
  11599. Utils.BytesToString(d.Name),
  11600. Utils.BytesToString(d.Description),
  11601. Utils.BytesToString(d.Title),
  11602. d.Powers,
  11603. d.UpdateType);
  11604. }
  11605. m_GroupsModule.NotifyChange(groupRoleUpdate.AgentData.GroupID);
  11606. }
  11607. return true;
  11608. }
  11609. private bool HandleGroupRoleChanges(IClientAPI sender, Packet Pack)
  11610. {
  11611. GroupRoleChangesPacket groupRoleChanges =
  11612. (GroupRoleChangesPacket)Pack;
  11613. #region Packet Session and User Check
  11614. if (groupRoleChanges.AgentData.SessionID != SessionId ||
  11615. groupRoleChanges.AgentData.AgentID != AgentId)
  11616. return true;
  11617. #endregion
  11618. if (m_GroupsModule != null)
  11619. {
  11620. foreach (GroupRoleChangesPacket.RoleChangeBlock d in
  11621. groupRoleChanges.RoleChange)
  11622. {
  11623. m_GroupsModule.GroupRoleChanges(this,
  11624. groupRoleChanges.AgentData.GroupID,
  11625. d.RoleID,
  11626. d.MemberID,
  11627. d.Change);
  11628. }
  11629. m_GroupsModule.NotifyChange(groupRoleChanges.AgentData.GroupID);
  11630. }
  11631. return true;
  11632. }
  11633. private bool HandleJoinGroupRequest(IClientAPI sender, Packet Pack)
  11634. {
  11635. JoinGroupRequestPacket joinGroupRequest =
  11636. (JoinGroupRequestPacket)Pack;
  11637. #region Packet Session and User Check
  11638. if (joinGroupRequest.AgentData.SessionID != SessionId ||
  11639. joinGroupRequest.AgentData.AgentID != AgentId)
  11640. return true;
  11641. #endregion
  11642. if (m_GroupsModule != null)
  11643. {
  11644. m_GroupsModule.JoinGroupRequest(this,
  11645. joinGroupRequest.GroupData.GroupID);
  11646. }
  11647. return true;
  11648. }
  11649. private bool HandleLeaveGroupRequest(IClientAPI sender, Packet Pack)
  11650. {
  11651. LeaveGroupRequestPacket leaveGroupRequest =
  11652. (LeaveGroupRequestPacket)Pack;
  11653. #region Packet Session and User Check
  11654. if (leaveGroupRequest.AgentData.SessionID != SessionId ||
  11655. leaveGroupRequest.AgentData.AgentID != AgentId)
  11656. return true;
  11657. #endregion
  11658. if (m_GroupsModule != null)
  11659. {
  11660. m_GroupsModule.LeaveGroupRequest(this,
  11661. leaveGroupRequest.GroupData.GroupID);
  11662. }
  11663. return true;
  11664. }
  11665. private bool HandleEjectGroupMemberRequest(IClientAPI sender, Packet Pack)
  11666. {
  11667. EjectGroupMemberRequestPacket ejectGroupMemberRequest =
  11668. (EjectGroupMemberRequestPacket)Pack;
  11669. #region Packet Session and User Check
  11670. if (ejectGroupMemberRequest.AgentData.SessionID != SessionId ||
  11671. ejectGroupMemberRequest.AgentData.AgentID != AgentId)
  11672. return true;
  11673. #endregion
  11674. if (m_GroupsModule != null)
  11675. {
  11676. foreach (EjectGroupMemberRequestPacket.EjectDataBlock e
  11677. in ejectGroupMemberRequest.EjectData)
  11678. {
  11679. m_GroupsModule.EjectGroupMemberRequest(this,
  11680. ejectGroupMemberRequest.GroupData.GroupID,
  11681. e.EjecteeID);
  11682. }
  11683. }
  11684. return true;
  11685. }
  11686. private bool HandleInviteGroupRequest(IClientAPI sender, Packet Pack)
  11687. {
  11688. InviteGroupRequestPacket inviteGroupRequest =
  11689. (InviteGroupRequestPacket)Pack;
  11690. #region Packet Session and User Check
  11691. if (inviteGroupRequest.AgentData.SessionID != SessionId ||
  11692. inviteGroupRequest.AgentData.AgentID != AgentId)
  11693. return true;
  11694. #endregion
  11695. if (m_GroupsModule != null)
  11696. {
  11697. foreach (InviteGroupRequestPacket.InviteDataBlock b in
  11698. inviteGroupRequest.InviteData)
  11699. {
  11700. m_GroupsModule.InviteGroupRequest(this,
  11701. inviteGroupRequest.GroupData.GroupID,
  11702. b.InviteeID,
  11703. b.RoleID);
  11704. }
  11705. }
  11706. return true;
  11707. }
  11708. #endregion Groups
  11709. private bool HandleStartLure(IClientAPI sender, Packet Pack)
  11710. {
  11711. StartLurePacket startLureRequest = (StartLurePacket)Pack;
  11712. #region Packet Session and User Check
  11713. if (startLureRequest.AgentData.SessionID != SessionId ||
  11714. startLureRequest.AgentData.AgentID != AgentId)
  11715. return true;
  11716. #endregion
  11717. StartLure handlerStartLure = OnStartLure;
  11718. if (handlerStartLure != null)
  11719. {
  11720. for (int i = 0 ; i < startLureRequest.TargetData.Length ; i++)
  11721. {
  11722. handlerStartLure(startLureRequest.Info.LureType,
  11723. Utils.BytesToString(
  11724. startLureRequest.Info.Message),
  11725. startLureRequest.TargetData[i].TargetID,
  11726. this);
  11727. }
  11728. }
  11729. return true;
  11730. }
  11731. private bool HandleTeleportLureRequest(IClientAPI sender, Packet Pack)
  11732. {
  11733. TeleportLureRequestPacket teleportLureRequest =
  11734. (TeleportLureRequestPacket)Pack;
  11735. #region Packet Session and User Check
  11736. if (teleportLureRequest.Info.SessionID != SessionId ||
  11737. teleportLureRequest.Info.AgentID != AgentId)
  11738. return true;
  11739. #endregion
  11740. TeleportLureRequest handlerTeleportLureRequest = OnTeleportLureRequest;
  11741. if (handlerTeleportLureRequest != null)
  11742. handlerTeleportLureRequest(
  11743. teleportLureRequest.Info.LureID,
  11744. teleportLureRequest.Info.TeleportFlags,
  11745. this);
  11746. return true;
  11747. }
  11748. private bool HandleClassifiedInfoRequest(IClientAPI sender, Packet Pack)
  11749. {
  11750. ClassifiedInfoRequestPacket classifiedInfoRequest =
  11751. (ClassifiedInfoRequestPacket)Pack;
  11752. #region Packet Session and User Check
  11753. if (classifiedInfoRequest.AgentData.SessionID != SessionId ||
  11754. classifiedInfoRequest.AgentData.AgentID != AgentId)
  11755. return true;
  11756. #endregion
  11757. ClassifiedInfoRequest handlerClassifiedInfoRequest = OnClassifiedInfoRequest;
  11758. if (handlerClassifiedInfoRequest != null)
  11759. handlerClassifiedInfoRequest(
  11760. classifiedInfoRequest.Data.ClassifiedID,
  11761. this);
  11762. return true;
  11763. }
  11764. private bool HandleClassifiedInfoUpdate(IClientAPI sender, Packet Pack)
  11765. {
  11766. ClassifiedInfoUpdatePacket classifiedInfoUpdate =
  11767. (ClassifiedInfoUpdatePacket)Pack;
  11768. #region Packet Session and User Check
  11769. if (classifiedInfoUpdate.AgentData.SessionID != SessionId ||
  11770. classifiedInfoUpdate.AgentData.AgentID != AgentId)
  11771. return true;
  11772. #endregion
  11773. ClassifiedInfoUpdate handlerClassifiedInfoUpdate = OnClassifiedInfoUpdate;
  11774. if (handlerClassifiedInfoUpdate != null)
  11775. handlerClassifiedInfoUpdate(
  11776. classifiedInfoUpdate.Data.ClassifiedID,
  11777. classifiedInfoUpdate.Data.Category,
  11778. Utils.BytesToString(
  11779. classifiedInfoUpdate.Data.Name),
  11780. Utils.BytesToString(
  11781. classifiedInfoUpdate.Data.Desc),
  11782. classifiedInfoUpdate.Data.ParcelID,
  11783. classifiedInfoUpdate.Data.ParentEstate,
  11784. classifiedInfoUpdate.Data.SnapshotID,
  11785. new Vector3(
  11786. classifiedInfoUpdate.Data.PosGlobal),
  11787. classifiedInfoUpdate.Data.ClassifiedFlags,
  11788. classifiedInfoUpdate.Data.PriceForListing,
  11789. this);
  11790. return true;
  11791. }
  11792. private bool HandleClassifiedDelete(IClientAPI sender, Packet Pack)
  11793. {
  11794. ClassifiedDeletePacket classifiedDelete =
  11795. (ClassifiedDeletePacket)Pack;
  11796. #region Packet Session and User Check
  11797. if (classifiedDelete.AgentData.SessionID != SessionId ||
  11798. classifiedDelete.AgentData.AgentID != AgentId)
  11799. return true;
  11800. #endregion
  11801. ClassifiedDelete handlerClassifiedDelete = OnClassifiedDelete;
  11802. if (handlerClassifiedDelete != null)
  11803. handlerClassifiedDelete(
  11804. classifiedDelete.Data.ClassifiedID,
  11805. this);
  11806. return true;
  11807. }
  11808. private bool HandleClassifiedGodDelete(IClientAPI sender, Packet Pack)
  11809. {
  11810. ClassifiedGodDeletePacket classifiedGodDelete =
  11811. (ClassifiedGodDeletePacket)Pack;
  11812. #region Packet Session and User Check
  11813. if (classifiedGodDelete.AgentData.SessionID != SessionId ||
  11814. classifiedGodDelete.AgentData.AgentID != AgentId)
  11815. return true;
  11816. #endregion
  11817. ClassifiedGodDelete handlerClassifiedGodDelete = OnClassifiedGodDelete;
  11818. if (handlerClassifiedGodDelete != null)
  11819. handlerClassifiedGodDelete(
  11820. classifiedGodDelete.Data.ClassifiedID,
  11821. classifiedGodDelete.Data.QueryID,
  11822. this);
  11823. return true;
  11824. }
  11825. private bool HandleEventGodDelete(IClientAPI sender, Packet Pack)
  11826. {
  11827. EventGodDeletePacket eventGodDelete =
  11828. (EventGodDeletePacket)Pack;
  11829. #region Packet Session and User Check
  11830. if (eventGodDelete.AgentData.SessionID != SessionId ||
  11831. eventGodDelete.AgentData.AgentID != AgentId)
  11832. return true;
  11833. #endregion
  11834. EventGodDelete handlerEventGodDelete = OnEventGodDelete;
  11835. if (handlerEventGodDelete != null)
  11836. handlerEventGodDelete(
  11837. eventGodDelete.EventData.EventID,
  11838. eventGodDelete.QueryData.QueryID,
  11839. Utils.BytesToString(
  11840. eventGodDelete.QueryData.QueryText),
  11841. eventGodDelete.QueryData.QueryFlags,
  11842. eventGodDelete.QueryData.QueryStart,
  11843. this);
  11844. return true;
  11845. }
  11846. private bool HandleEventNotificationAddRequest(IClientAPI sender, Packet Pack)
  11847. {
  11848. EventNotificationAddRequestPacket eventNotificationAdd =
  11849. (EventNotificationAddRequestPacket)Pack;
  11850. #region Packet Session and User Check
  11851. if (eventNotificationAdd.AgentData.SessionID != SessionId ||
  11852. eventNotificationAdd.AgentData.AgentID != AgentId)
  11853. return true;
  11854. #endregion
  11855. EventNotificationAddRequest handlerEventNotificationAddRequest = OnEventNotificationAddRequest;
  11856. if (handlerEventNotificationAddRequest != null)
  11857. handlerEventNotificationAddRequest(
  11858. eventNotificationAdd.EventData.EventID, this);
  11859. return true;
  11860. }
  11861. private bool HandleEventNotificationRemoveRequest(IClientAPI sender, Packet Pack)
  11862. {
  11863. EventNotificationRemoveRequestPacket eventNotificationRemove =
  11864. (EventNotificationRemoveRequestPacket)Pack;
  11865. #region Packet Session and User Check
  11866. if (eventNotificationRemove.AgentData.SessionID != SessionId ||
  11867. eventNotificationRemove.AgentData.AgentID != AgentId)
  11868. return true;
  11869. #endregion
  11870. EventNotificationRemoveRequest handlerEventNotificationRemoveRequest = OnEventNotificationRemoveRequest;
  11871. if (handlerEventNotificationRemoveRequest != null)
  11872. handlerEventNotificationRemoveRequest(
  11873. eventNotificationRemove.EventData.EventID, this);
  11874. return true;
  11875. }
  11876. private bool HandleRetrieveInstantMessages(IClientAPI sender, Packet Pack)
  11877. {
  11878. RetrieveInstantMessagesPacket rimpInstantMessagePack = (RetrieveInstantMessagesPacket)Pack;
  11879. #region Packet Session and User Check
  11880. if (rimpInstantMessagePack.AgentData.SessionID != SessionId ||
  11881. rimpInstantMessagePack.AgentData.AgentID != AgentId)
  11882. return true;
  11883. #endregion
  11884. RetrieveInstantMessages handlerRetrieveInstantMessages = OnRetrieveInstantMessages;
  11885. if (handlerRetrieveInstantMessages != null)
  11886. handlerRetrieveInstantMessages(this);
  11887. return true;
  11888. }
  11889. private bool HandlePickDelete(IClientAPI sender, Packet Pack)
  11890. {
  11891. PickDeletePacket pickDelete =
  11892. (PickDeletePacket)Pack;
  11893. #region Packet Session and User Check
  11894. if (pickDelete.AgentData.SessionID != SessionId ||
  11895. pickDelete.AgentData.AgentID != AgentId)
  11896. return true;
  11897. #endregion
  11898. PickDelete handlerPickDelete = OnPickDelete;
  11899. if (handlerPickDelete != null)
  11900. handlerPickDelete(this, pickDelete.Data.PickID);
  11901. return true;
  11902. }
  11903. private bool HandlePickGodDelete(IClientAPI sender, Packet Pack)
  11904. {
  11905. PickGodDeletePacket pickGodDelete =
  11906. (PickGodDeletePacket)Pack;
  11907. #region Packet Session and User Check
  11908. if (pickGodDelete.AgentData.SessionID != SessionId ||
  11909. pickGodDelete.AgentData.AgentID != AgentId)
  11910. return true;
  11911. #endregion
  11912. PickGodDelete handlerPickGodDelete = OnPickGodDelete;
  11913. if (handlerPickGodDelete != null)
  11914. handlerPickGodDelete(this,
  11915. pickGodDelete.AgentData.AgentID,
  11916. pickGodDelete.Data.PickID,
  11917. pickGodDelete.Data.QueryID);
  11918. return true;
  11919. }
  11920. private bool HandlePickInfoUpdate(IClientAPI sender, Packet Pack)
  11921. {
  11922. PickInfoUpdatePacket pickInfoUpdate =
  11923. (PickInfoUpdatePacket)Pack;
  11924. #region Packet Session and User Check
  11925. if (pickInfoUpdate.AgentData.SessionID != SessionId ||
  11926. pickInfoUpdate.AgentData.AgentID != AgentId)
  11927. return true;
  11928. #endregion
  11929. PickInfoUpdate handlerPickInfoUpdate = OnPickInfoUpdate;
  11930. if (handlerPickInfoUpdate != null)
  11931. handlerPickInfoUpdate(this,
  11932. pickInfoUpdate.Data.PickID,
  11933. pickInfoUpdate.Data.CreatorID,
  11934. pickInfoUpdate.Data.TopPick,
  11935. Utils.BytesToString(pickInfoUpdate.Data.Name),
  11936. Utils.BytesToString(pickInfoUpdate.Data.Desc),
  11937. pickInfoUpdate.Data.SnapshotID,
  11938. pickInfoUpdate.Data.SortOrder,
  11939. pickInfoUpdate.Data.Enabled);
  11940. return true;
  11941. }
  11942. private bool HandleAvatarNotesUpdate(IClientAPI sender, Packet Pack)
  11943. {
  11944. AvatarNotesUpdatePacket avatarNotesUpdate =
  11945. (AvatarNotesUpdatePacket)Pack;
  11946. #region Packet Session and User Check
  11947. if (avatarNotesUpdate.AgentData.SessionID != SessionId ||
  11948. avatarNotesUpdate.AgentData.AgentID != AgentId)
  11949. return true;
  11950. #endregion
  11951. AvatarNotesUpdate handlerAvatarNotesUpdate = OnAvatarNotesUpdate;
  11952. if (handlerAvatarNotesUpdate != null)
  11953. handlerAvatarNotesUpdate(this,
  11954. avatarNotesUpdate.Data.TargetID,
  11955. Utils.BytesToString(avatarNotesUpdate.Data.Notes));
  11956. return true;
  11957. }
  11958. private bool HandleAvatarInterestsUpdate(IClientAPI sender, Packet Pack)
  11959. {
  11960. AvatarInterestsUpdatePacket avatarInterestUpdate =
  11961. (AvatarInterestsUpdatePacket)Pack;
  11962. #region Packet Session and User Check
  11963. if (avatarInterestUpdate.AgentData.SessionID != SessionId ||
  11964. avatarInterestUpdate.AgentData.AgentID != AgentId)
  11965. return true;
  11966. #endregion
  11967. AvatarInterestUpdate handlerAvatarInterestUpdate = OnAvatarInterestUpdate;
  11968. if (handlerAvatarInterestUpdate != null)
  11969. handlerAvatarInterestUpdate(this,
  11970. avatarInterestUpdate.PropertiesData.WantToMask,
  11971. Utils.BytesToString(avatarInterestUpdate.PropertiesData.WantToText),
  11972. avatarInterestUpdate.PropertiesData.SkillsMask,
  11973. Utils.BytesToString(avatarInterestUpdate.PropertiesData.SkillsText),
  11974. Utils.BytesToString(avatarInterestUpdate.PropertiesData.LanguagesText));
  11975. return true;
  11976. }
  11977. private bool HandleGrantUserRights(IClientAPI sender, Packet Pack)
  11978. {
  11979. GrantUserRightsPacket GrantUserRights =
  11980. (GrantUserRightsPacket)Pack;
  11981. #region Packet Session and User Check
  11982. if (GrantUserRights.AgentData.SessionID != SessionId ||
  11983. GrantUserRights.AgentData.AgentID != AgentId)
  11984. return true;
  11985. #endregion
  11986. GrantUserFriendRights GrantUserRightsHandler = OnGrantUserRights;
  11987. if (GrantUserRightsHandler != null)
  11988. GrantUserRightsHandler(this,
  11989. GrantUserRights.Rights[0].AgentRelated,
  11990. GrantUserRights.Rights[0].RelatedRights);
  11991. return true;
  11992. }
  11993. private bool HandleRevokePermissions(IClientAPI sender, Packet Pack)
  11994. {
  11995. RevokePermissionsPacket pkt = (RevokePermissionsPacket)Pack;
  11996. if (pkt.AgentData.SessionID != SessionId ||
  11997. pkt .AgentData.AgentID != AgentId)
  11998. return true;
  11999. // don't use multidelegate "event"
  12000. ScenePresence sp = (ScenePresence)SceneAgent;
  12001. if(sp != null && !sp.IsDeleted && !sp.IsInTransit)
  12002. {
  12003. UUID objectID = pkt.Data.ObjectID;
  12004. uint permissions = pkt.Data.ObjectPermissions;
  12005. sp.HandleRevokePermissions(objectID , permissions);
  12006. }
  12007. return true;
  12008. }
  12009. private bool HandlePlacesQuery(IClientAPI sender, Packet Pack)
  12010. {
  12011. PlacesQueryPacket placesQueryPacket =
  12012. (PlacesQueryPacket)Pack;
  12013. PlacesQuery handlerPlacesQuery = OnPlacesQuery;
  12014. if (handlerPlacesQuery != null)
  12015. handlerPlacesQuery(placesQueryPacket.AgentData.QueryID,
  12016. placesQueryPacket.TransactionData.TransactionID,
  12017. Utils.BytesToString(
  12018. placesQueryPacket.QueryData.QueryText),
  12019. placesQueryPacket.QueryData.QueryFlags,
  12020. (byte)placesQueryPacket.QueryData.Category,
  12021. Utils.BytesToString(
  12022. placesQueryPacket.QueryData.SimName),
  12023. this);
  12024. return true;
  12025. }
  12026. #endregion Packet Handlers
  12027. public void SendScriptQuestion(UUID taskID, string taskName, string ownerName, UUID itemID, int question)
  12028. {
  12029. ScriptQuestionPacket scriptQuestion = (ScriptQuestionPacket)PacketPool.Instance.GetPacket(PacketType.ScriptQuestion);
  12030. scriptQuestion.Data = new ScriptQuestionPacket.DataBlock();
  12031. // TODO: don't create new blocks if recycling an old packet
  12032. scriptQuestion.Data.TaskID = taskID;
  12033. scriptQuestion.Data.ItemID = itemID;
  12034. scriptQuestion.Data.Questions = question;
  12035. scriptQuestion.Data.ObjectName = Util.StringToBytes256(taskName);
  12036. scriptQuestion.Data.ObjectOwner = Util.StringToBytes256(ownerName);
  12037. OutPacket(scriptQuestion, ThrottleOutPacketType.Task);
  12038. }
  12039. /// <summary>
  12040. /// Handler called when we receive a logout packet.
  12041. /// </summary>
  12042. /// <param name="client"></param>
  12043. /// <param name="packet"></param>
  12044. /// <returns></returns>
  12045. protected virtual bool HandleLogout(IClientAPI client, Packet packet)
  12046. {
  12047. if (packet.Type == PacketType.LogoutRequest)
  12048. {
  12049. if (((LogoutRequestPacket)packet).AgentData.SessionID != SessionId) return false;
  12050. }
  12051. return Logout(client);
  12052. }
  12053. /// <summary>
  12054. ///
  12055. /// </summary>
  12056. /// <param name="client"></param>
  12057. /// <returns></returns>
  12058. protected virtual bool Logout(IClientAPI client)
  12059. {
  12060. m_log.InfoFormat("[CLIENT]: Got a logout request for {0} in {1}", Name, Scene.RegionInfo.RegionName);
  12061. Action<IClientAPI> handlerLogout = OnLogout;
  12062. if (handlerLogout != null)
  12063. {
  12064. handlerLogout(client);
  12065. }
  12066. return true;
  12067. }
  12068. /// <summary>
  12069. /// </summary>
  12070. /// <remarks>
  12071. /// At the moment, we always reply that there is no cached texture.
  12072. /// </remarks>
  12073. /// <param name="simclient"></param>
  12074. /// <param name="packet"></param>
  12075. /// <returns></returns>
  12076. protected bool HandleAgentTextureCached(IClientAPI simclient, Packet packet)
  12077. {
  12078. //m_log.Debug("texture cached: " + packet.ToString());
  12079. AgentCachedTexturePacket cachedtex = (AgentCachedTexturePacket)packet;
  12080. AgentCachedTextureResponsePacket cachedresp = (AgentCachedTextureResponsePacket)PacketPool.Instance.GetPacket(PacketType.AgentCachedTextureResponse);
  12081. if (cachedtex.AgentData.SessionID != SessionId)
  12082. return false;
  12083. // TODO: don't create new blocks if recycling an old packet
  12084. cachedresp.AgentData.AgentID = AgentId;
  12085. cachedresp.AgentData.SessionID = m_sessionId;
  12086. cachedresp.AgentData.SerialNum = cachedtex.AgentData.SerialNum;
  12087. cachedresp.WearableData =
  12088. new AgentCachedTextureResponsePacket.WearableDataBlock[cachedtex.WearableData.Length];
  12089. int cacheHits = 0;
  12090. // We need to make sure the asset stored in the bake is available on this server also by it's assetid before we map it to a Cacheid
  12091. WearableCacheItem[] cacheItems = null;
  12092. ScenePresence p = m_scene.GetScenePresence(AgentId);
  12093. if (p != null && p.Appearance != null)
  12094. {
  12095. cacheItems = p.Appearance.WearableCacheItems;
  12096. }
  12097. int maxWearablesLoop = cachedtex.WearableData.Length;
  12098. if (cacheItems != null)
  12099. {
  12100. if (maxWearablesLoop > cacheItems.Length)
  12101. maxWearablesLoop = cacheItems.Length;
  12102. for (int i = 0; i < maxWearablesLoop; i++)
  12103. {
  12104. int idx = cachedtex.WearableData[i].TextureIndex;
  12105. cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
  12106. cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex;
  12107. cachedresp.WearableData[i].HostName = new byte[0];
  12108. if (cachedtex.WearableData[i].ID == cacheItems[idx].CacheId)
  12109. {
  12110. cachedresp.WearableData[i].TextureID = cacheItems[idx].TextureID;
  12111. cacheHits++;
  12112. }
  12113. else
  12114. {
  12115. cachedresp.WearableData[i].TextureID = UUID.Zero;
  12116. }
  12117. }
  12118. }
  12119. else
  12120. {
  12121. for (int i = 0; i < maxWearablesLoop; i++)
  12122. {
  12123. cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
  12124. cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex;
  12125. cachedresp.WearableData[i].TextureID = UUID.Zero;
  12126. cachedresp.WearableData[i].HostName = new byte[0];
  12127. }
  12128. }
  12129. //m_log.DebugFormat("texture cached: hits {0}", cacheHits);
  12130. cachedresp.Header.Zerocoded = true;
  12131. OutPacket(cachedresp, ThrottleOutPacketType.Task);
  12132. return true;
  12133. }
  12134. /// <summary>
  12135. /// Send a response back to a client when it asks the asset server (via the region server) if it has
  12136. /// its appearance texture cached.
  12137. /// </summary>
  12138. /// <param name="avatar"></param>
  12139. /// <param name="serial"></param>
  12140. /// <param name="cachedTextures"></param>
  12141. /// <returns></returns>
  12142. public void SendCachedTextureResponse(ISceneEntity avatar, int serial, List<CachedTextureResponseArg> cachedTextures)
  12143. {
  12144. ScenePresence presence = avatar as ScenePresence;
  12145. if (presence == null)
  12146. return;
  12147. AgentCachedTextureResponsePacket cachedresp = (AgentCachedTextureResponsePacket)PacketPool.Instance.GetPacket(PacketType.AgentCachedTextureResponse);
  12148. // TODO: don't create new blocks if recycling an old packet
  12149. cachedresp.AgentData.AgentID = m_agentId;
  12150. cachedresp.AgentData.SessionID = m_sessionId;
  12151. cachedresp.AgentData.SerialNum = serial;
  12152. cachedresp.WearableData = new AgentCachedTextureResponsePacket.WearableDataBlock[cachedTextures.Count];
  12153. for (int i = 0; i < cachedTextures.Count; i++)
  12154. {
  12155. cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
  12156. cachedresp.WearableData[i].TextureIndex = (byte)cachedTextures[i].BakedTextureIndex;
  12157. cachedresp.WearableData[i].TextureID = cachedTextures[i].BakedTextureID;
  12158. cachedresp.WearableData[i].HostName = new byte[0];
  12159. }
  12160. cachedresp.Header.Zerocoded = true;
  12161. OutPacket(cachedresp, ThrottleOutPacketType.Task);
  12162. }
  12163. protected bool HandleMultipleObjUpdate(IClientAPI simClient, Packet packet)
  12164. {
  12165. MultipleObjectUpdatePacket multipleupdate = (MultipleObjectUpdatePacket)packet;
  12166. if (multipleupdate.AgentData.SessionID != SessionId)
  12167. return false;
  12168. // m_log.DebugFormat(
  12169. // "[CLIENT]: Incoming MultipleObjectUpdatePacket contained {0} blocks", multipleupdate.ObjectData.Length);
  12170. Scene tScene = (Scene)m_scene;
  12171. for (int i = 0; i < multipleupdate.ObjectData.Length; i++)
  12172. {
  12173. MultipleObjectUpdatePacket.ObjectDataBlock block = multipleupdate.ObjectData[i];
  12174. // Can't act on Null Data
  12175. if (block.Data != null)
  12176. {
  12177. uint localId = block.ObjectLocalID;
  12178. SceneObjectPart part = tScene.GetSceneObjectPart(localId);
  12179. if (part == null)
  12180. {
  12181. // It's a ghost! tell the client to delete it from view.
  12182. simClient.SendKillObject(new List<uint> { localId });
  12183. }
  12184. else
  12185. {
  12186. ClientChangeObject updatehandler = onClientChangeObject;
  12187. if (updatehandler != null)
  12188. {
  12189. ObjectChangeData udata = new ObjectChangeData();
  12190. /*ubit from ll JIRA:
  12191. * 0x01 position
  12192. * 0x02 rotation
  12193. * 0x04 scale
  12194. * 0x08 LINK_SET
  12195. * 0x10 UNIFORM for scale
  12196. */
  12197. // translate to internal changes
  12198. // not all cases .. just the ones older code did
  12199. switch (block.Type)
  12200. {
  12201. case 1: //change position sp
  12202. udata.position = new Vector3(block.Data, 0);
  12203. udata.change = ObjectChangeType.primP;
  12204. updatehandler(localId, udata, this);
  12205. break;
  12206. case 2: // rotation sp
  12207. udata.rotation = new Quaternion(block.Data, 0, true);
  12208. udata.change = ObjectChangeType.primR;
  12209. updatehandler(localId, udata, this);
  12210. break;
  12211. case 3: // position plus rotation
  12212. udata.position = new Vector3(block.Data, 0);
  12213. udata.rotation = new Quaternion(block.Data, 12, true);
  12214. udata.change = ObjectChangeType.primPR;
  12215. updatehandler(localId, udata, this);
  12216. break;
  12217. case 4: // scale sp
  12218. udata.scale = new Vector3(block.Data, 0);
  12219. udata.change = ObjectChangeType.primS;
  12220. updatehandler(localId, udata, this);
  12221. break;
  12222. case 0x14: // uniform scale sp
  12223. udata.scale = new Vector3(block.Data, 0);
  12224. udata.change = ObjectChangeType.primUS;
  12225. updatehandler(localId, udata, this);
  12226. break;
  12227. case 5: // scale and position sp
  12228. udata.position = new Vector3(block.Data, 0);
  12229. udata.scale = new Vector3(block.Data, 12);
  12230. udata.change = ObjectChangeType.primPS;
  12231. updatehandler(localId, udata, this);
  12232. break;
  12233. case 0x15: //uniform scale and position
  12234. udata.position = new Vector3(block.Data, 0);
  12235. udata.scale = new Vector3(block.Data, 12);
  12236. udata.change = ObjectChangeType.primPUS;
  12237. updatehandler(localId, udata, this);
  12238. break;
  12239. // now group related (bit 4)
  12240. case 9: //( 8 + 1 )group position
  12241. udata.position = new Vector3(block.Data, 0);
  12242. udata.change = ObjectChangeType.groupP;
  12243. updatehandler(localId, udata, this);
  12244. break;
  12245. case 0x0A: // (8 + 2) group rotation
  12246. udata.rotation = new Quaternion(block.Data, 0, true);
  12247. udata.change = ObjectChangeType.groupR;
  12248. updatehandler(localId, udata, this);
  12249. break;
  12250. case 0x0B: //( 8 + 2 + 1) group rotation and position
  12251. udata.position = new Vector3(block.Data, 0);
  12252. udata.rotation = new Quaternion(block.Data, 12, true);
  12253. udata.change = ObjectChangeType.groupPR;
  12254. updatehandler(localId, udata, this);
  12255. break;
  12256. case 0x0C: // (8 + 4) group scale
  12257. // only afects root prim and only sent by viewer editor object tab scaling
  12258. // mouse edition only allows uniform scaling
  12259. // SL MAY CHANGE THIS in viewers
  12260. udata.scale = new Vector3(block.Data, 0);
  12261. udata.change = ObjectChangeType.groupS;
  12262. updatehandler(localId, udata, this);
  12263. break;
  12264. case 0x0D: //(8 + 4 + 1) group scale and position
  12265. // exception as above
  12266. udata.position = new Vector3(block.Data, 0);
  12267. udata.scale = new Vector3(block.Data, 12);
  12268. udata.change = ObjectChangeType.groupPS;
  12269. updatehandler(localId, udata, this);
  12270. break;
  12271. case 0x1C: // (0x10 + 8 + 4 ) group scale UNIFORM
  12272. udata.scale = new Vector3(block.Data, 0);
  12273. udata.change = ObjectChangeType.groupUS;
  12274. updatehandler(localId, udata, this);
  12275. break;
  12276. case 0x1D: // (UNIFORM + GROUP + SCALE + POS)
  12277. udata.position = new Vector3(block.Data, 0);
  12278. udata.scale = new Vector3(block.Data, 12);
  12279. udata.change = ObjectChangeType.groupPUS;
  12280. updatehandler(localId, udata, this);
  12281. break;
  12282. default:
  12283. m_log.Debug("[CLIENT]: MultipleObjUpdate recieved an unknown packet type: " + (block.Type));
  12284. break;
  12285. }
  12286. }
  12287. }
  12288. }
  12289. }
  12290. return true;
  12291. }
  12292. public void RequestMapLayer()
  12293. {
  12294. //should be getting the map layer from the grid server
  12295. //send a layer covering the 800,800 - 1200,1200 area (should be covering the requested area)
  12296. MapLayerReplyPacket mapReply = (MapLayerReplyPacket)PacketPool.Instance.GetPacket(PacketType.MapLayerReply);
  12297. // TODO: don't create new blocks if recycling an old packet
  12298. mapReply.AgentData.AgentID = AgentId;
  12299. mapReply.AgentData.Flags = 0;
  12300. mapReply.LayerData = new MapLayerReplyPacket.LayerDataBlock[1];
  12301. mapReply.LayerData[0] = new MapLayerReplyPacket.LayerDataBlock();
  12302. mapReply.LayerData[0].Bottom = 0;
  12303. mapReply.LayerData[0].Left = 0;
  12304. mapReply.LayerData[0].Top = 30000;
  12305. mapReply.LayerData[0].Right = 30000;
  12306. mapReply.LayerData[0].ImageID = new UUID("00000000-0000-1111-9999-000000000006");
  12307. mapReply.Header.Zerocoded = true;
  12308. OutPacket(mapReply, ThrottleOutPacketType.Land);
  12309. }
  12310. public void RequestMapBlocksX(int minX, int minY, int maxX, int maxY)
  12311. {
  12312. /*
  12313. IList simMapProfiles = m_gridServer.RequestMapBlocks(minX, minY, maxX, maxY);
  12314. MapBlockReplyPacket mbReply = new MapBlockReplyPacket();
  12315. mbReply.AgentData.AgentId = AgentId;
  12316. int len;
  12317. if (simMapProfiles == null)
  12318. len = 0;
  12319. else
  12320. len = simMapProfiles.Count;
  12321. mbReply.Data = new MapBlockReplyPacket.DataBlock[len];
  12322. int iii;
  12323. for (iii = 0; iii < len; iii++)
  12324. {
  12325. Hashtable mp = (Hashtable)simMapProfiles[iii];
  12326. mbReply.Data[iii] = new MapBlockReplyPacket.DataBlock();
  12327. mbReply.Data[iii].Name = Util.UTF8.GetBytes((string)mp["name"]);
  12328. mbReply.Data[iii].Access = System.Convert.ToByte(mp["access"]);
  12329. mbReply.Data[iii].Agents = System.Convert.ToByte(mp["agents"]);
  12330. mbReply.Data[iii].MapImageID = new UUID((string)mp["map-image-id"]);
  12331. mbReply.Data[iii].RegionFlags = System.Convert.ToUInt32(mp["region-flags"]);
  12332. mbReply.Data[iii].WaterHeight = System.Convert.ToByte(mp["water-height"]);
  12333. mbReply.Data[iii].X = System.Convert.ToUInt16(mp["x"]);
  12334. mbReply.Data[iii].Y = System.Convert.ToUInt16(mp["y"]);
  12335. }
  12336. this.OutPacket(mbReply, ThrottleOutPacketType.Land);
  12337. */
  12338. }
  12339. /// <summary>
  12340. /// Sets the throttles from values supplied by the client
  12341. /// </summary>
  12342. /// <param name="throttles"></param>
  12343. public void SetChildAgentThrottle(byte[] throttles)
  12344. {
  12345. SetChildAgentThrottle(throttles, 1.0f);
  12346. }
  12347. public void SetChildAgentThrottle(byte[] throttles,float factor)
  12348. {
  12349. m_udpClient.SetThrottles(throttles, factor);
  12350. GenericCall2 handler = OnUpdateThrottles;
  12351. if (handler != null)
  12352. {
  12353. handler();
  12354. }
  12355. }
  12356. /// <summary>
  12357. /// Sets the throttles from values supplied caller
  12358. /// </summary>
  12359. /// <param name="throttles"></param>
  12360. public void SetAgentThrottleSilent(int throttle, int setting)
  12361. {
  12362. m_udpClient.ForceThrottleSetting(throttle,setting);
  12363. }
  12364. public int GetAgentThrottleSilent(int throttle)
  12365. {
  12366. return m_udpClient.GetThrottleSetting(throttle);
  12367. }
  12368. /// <summary>
  12369. /// Get the current throttles for this client as a packed byte array
  12370. /// </summary>
  12371. /// <param name="multiplier">Unused</param>
  12372. /// <returns></returns>
  12373. public byte[] GetThrottlesPacked(float multiplier)
  12374. {
  12375. return m_udpClient.GetThrottlesPacked(multiplier);
  12376. }
  12377. /// <summary>
  12378. /// Cruft?
  12379. /// </summary>
  12380. public virtual void InPacket(object NewPack)
  12381. {
  12382. throw new NotImplementedException();
  12383. }
  12384. /// <summary>
  12385. /// This is the starting point for sending a simulator packet out to the client
  12386. /// </summary>
  12387. /// <param name="packet">Packet to send</param>
  12388. /// <param name="throttlePacketType">Throttling category for the packet</param>
  12389. protected void OutPacket(Packet packet, ThrottleOutPacketType throttlePacketType)
  12390. {
  12391. #region BinaryStats
  12392. LLUDPServer.LogPacketHeader(false, m_circuitCode, 0, packet.Type, (ushort)packet.Length);
  12393. #endregion BinaryStats
  12394. OutPacket(packet, throttlePacketType, true);
  12395. }
  12396. /// <summary>
  12397. /// This is the starting point for sending a simulator packet out to the client
  12398. /// </summary>
  12399. /// <param name="packet">Packet to send</param>
  12400. /// <param name="throttlePacketType">Throttling category for the packet</param>
  12401. /// <param name="doAutomaticSplitting">True to automatically split oversized
  12402. /// packets (the default), or false to disable splitting if the calling code
  12403. /// handles splitting manually</param>
  12404. protected void OutPacket(Packet packet, ThrottleOutPacketType throttlePacketType, bool doAutomaticSplitting)
  12405. {
  12406. OutPacket(packet, throttlePacketType, doAutomaticSplitting, null);
  12407. }
  12408. /// <summary>
  12409. /// This is the starting point for sending a simulator packet out to the client
  12410. /// </summary>
  12411. /// <param name="packet">Packet to send</param>
  12412. /// <param name="throttlePacketType">Throttling category for the packet</param>
  12413. /// <param name="doAutomaticSplitting">True to automatically split oversized
  12414. /// packets (the default), or false to disable splitting if the calling code
  12415. /// handles splitting manually</param>
  12416. /// <param name="method">The method to be called in the event this packet is reliable
  12417. /// and unacknowledged. The server will provide normal resend capability if you do not
  12418. /// provide your own method.</param>
  12419. protected void OutPacket(Packet packet, ThrottleOutPacketType throttlePacketType, bool doAutomaticSplitting, UnackedPacketMethod method)
  12420. {
  12421. if (m_outPacketsToDrop != null)
  12422. {
  12423. if (m_outPacketsToDrop.Contains(packet.Type.ToString()))
  12424. {
  12425. PacketPool.Instance.ReturnPacket(packet);
  12426. return;
  12427. }
  12428. }
  12429. if (DebugPacketLevel > 0)
  12430. {
  12431. bool logPacket = true;
  12432. if (DebugPacketLevel <= 255
  12433. && (packet.Type == PacketType.SimStats || packet.Type == PacketType.SimulatorViewerTimeMessage))
  12434. logPacket = false;
  12435. if (DebugPacketLevel <= 200
  12436. && (packet.Type == PacketType.ImagePacket
  12437. || packet.Type == PacketType.ImageData
  12438. || packet.Type == PacketType.LayerData
  12439. || packet.Type == PacketType.CoarseLocationUpdate))
  12440. logPacket = false;
  12441. if (DebugPacketLevel <= 100 && (packet.Type == PacketType.AvatarAnimation || packet.Type == PacketType.ViewerEffect))
  12442. logPacket = false;
  12443. if (DebugPacketLevel <= 50
  12444. && (packet.Type == PacketType.ImprovedTerseObjectUpdate || packet.Type == PacketType.ObjectUpdate))
  12445. logPacket = false;
  12446. if (DebugPacketLevel <= 25 && packet.Type == PacketType.ObjectPropertiesFamily)
  12447. logPacket = false;
  12448. if (logPacket)
  12449. m_log.DebugFormat(
  12450. "[CLIENT]: PACKET OUT to {0} ({1}) in {2} - {3}",
  12451. Name, SceneAgent.IsChildAgent ? "child" : "root ", m_scene.RegionInfo.RegionName, packet.Type);
  12452. }
  12453. m_udpServer.SendPacket(m_udpClient, packet, throttlePacketType, doAutomaticSplitting, method);
  12454. }
  12455. protected void HandleAutopilot(Object sender, string method, List<String> args)
  12456. {
  12457. float locx = 0;
  12458. float locy = 0;
  12459. float locz = 0;
  12460. uint regionX = 0;
  12461. uint regionY = 0;
  12462. Utils.LongToUInts(m_scene.RegionInfo.RegionHandle, out regionX, out regionY);
  12463. locx = (float)(Convert.ToDouble(args[0]) - (double)regionX);
  12464. locy = (float)(Convert.ToDouble(args[1]) - (double)regionY);
  12465. locz = Convert.ToSingle(args[2]);
  12466. Action<Vector3, bool, bool> handlerAutoPilotGo = OnAutoPilotGo;
  12467. if (handlerAutoPilotGo != null)
  12468. handlerAutoPilotGo(new Vector3(locx, locy, locz), false, false);
  12469. }
  12470. /// <summary>
  12471. /// Entryway from the client to the simulator. All UDP packets from the client will end up here
  12472. /// </summary>
  12473. /// <param name="Pack">OpenMetaverse.packet</param>
  12474. public void ProcessInPacket(Packet packet)
  12475. {
  12476. if (m_inPacketsToDrop != null)
  12477. if (m_inPacketsToDrop.Contains(packet.Type.ToString()))
  12478. return;
  12479. if (DebugPacketLevel > 0)
  12480. {
  12481. bool logPacket = true;
  12482. if (DebugPacketLevel <= 255 && packet.Type == PacketType.AgentUpdate)
  12483. logPacket = false;
  12484. if (DebugPacketLevel <= 200 && packet.Type == PacketType.RequestImage)
  12485. logPacket = false;
  12486. if (DebugPacketLevel <= 100 && (packet.Type == PacketType.ViewerEffect || packet.Type == PacketType.AgentAnimation))
  12487. logPacket = false;
  12488. if (DebugPacketLevel <= 25 && packet.Type == PacketType.RequestObjectPropertiesFamily)
  12489. logPacket = false;
  12490. if (logPacket)
  12491. m_log.DebugFormat(
  12492. "[CLIENT]: PACKET IN from {0} ({1}) in {2} - {3}",
  12493. Name, SceneAgent.IsChildAgent ? "child" : "root ", Scene.Name, packet.Type);
  12494. }
  12495. if (!ProcessPacketMethod(packet))
  12496. m_log.WarnFormat(
  12497. "[CLIENT]: Unhandled packet {0} from {1} ({2}) in {3}. Ignoring.",
  12498. packet.Type, Name, SceneAgent.IsChildAgent ? "child" : "root ", Scene.Name);
  12499. }
  12500. private static PrimitiveBaseShape GetShapeFromAddPacket(ObjectAddPacket addPacket)
  12501. {
  12502. PrimitiveBaseShape shape = new PrimitiveBaseShape();
  12503. shape.PCode = addPacket.ObjectData.PCode;
  12504. shape.State = addPacket.ObjectData.State;
  12505. shape.LastAttachPoint = addPacket.ObjectData.State;
  12506. shape.PathBegin = addPacket.ObjectData.PathBegin;
  12507. shape.PathEnd = addPacket.ObjectData.PathEnd;
  12508. shape.PathScaleX = addPacket.ObjectData.PathScaleX;
  12509. shape.PathScaleY = addPacket.ObjectData.PathScaleY;
  12510. shape.PathShearX = addPacket.ObjectData.PathShearX;
  12511. shape.PathShearY = addPacket.ObjectData.PathShearY;
  12512. shape.PathSkew = addPacket.ObjectData.PathSkew;
  12513. shape.ProfileBegin = addPacket.ObjectData.ProfileBegin;
  12514. shape.ProfileEnd = addPacket.ObjectData.ProfileEnd;
  12515. shape.Scale = addPacket.ObjectData.Scale;
  12516. shape.PathCurve = addPacket.ObjectData.PathCurve;
  12517. shape.ProfileCurve = addPacket.ObjectData.ProfileCurve;
  12518. shape.ProfileHollow = addPacket.ObjectData.ProfileHollow;
  12519. shape.PathRadiusOffset = addPacket.ObjectData.PathRadiusOffset;
  12520. shape.PathRevolutions = addPacket.ObjectData.PathRevolutions;
  12521. shape.PathTaperX = addPacket.ObjectData.PathTaperX;
  12522. shape.PathTaperY = addPacket.ObjectData.PathTaperY;
  12523. shape.PathTwist = addPacket.ObjectData.PathTwist;
  12524. shape.PathTwistBegin = addPacket.ObjectData.PathTwistBegin;
  12525. Primitive.TextureEntry ntex = new Primitive.TextureEntry(new UUID("89556747-24cb-43ed-920b-47caed15465f"));
  12526. shape.TextureEntry = ntex.GetBytes();
  12527. //shape.Textures = ntex;
  12528. return shape;
  12529. }
  12530. public ClientInfo GetClientInfo()
  12531. {
  12532. ClientInfo info = m_udpClient.GetClientInfo();
  12533. info.proxyEP = null;
  12534. if (info.agentcircuit == null)
  12535. info.agentcircuit = RequestClientInfo();
  12536. return info;
  12537. }
  12538. public void SetClientInfo(ClientInfo info)
  12539. {
  12540. m_udpClient.SetClientInfo(info);
  12541. }
  12542. #region Media Parcel Members
  12543. public void SendParcelMediaCommand(uint flags, ParcelMediaCommandEnum command, float time)
  12544. {
  12545. ParcelMediaCommandMessagePacket commandMessagePacket = new ParcelMediaCommandMessagePacket();
  12546. commandMessagePacket.CommandBlock.Flags = flags;
  12547. commandMessagePacket.CommandBlock.Command = (uint)command;
  12548. commandMessagePacket.CommandBlock.Time = time;
  12549. OutPacket(commandMessagePacket, ThrottleOutPacketType.Task);
  12550. }
  12551. public void SendParcelMediaUpdate(string mediaUrl, UUID mediaTextureID,
  12552. byte autoScale, string mediaType, string mediaDesc, int mediaWidth, int mediaHeight,
  12553. byte mediaLoop)
  12554. {
  12555. ParcelMediaUpdatePacket updatePacket = new ParcelMediaUpdatePacket();
  12556. updatePacket.DataBlock.MediaURL = Util.StringToBytes256(mediaUrl);
  12557. updatePacket.DataBlock.MediaID = mediaTextureID;
  12558. updatePacket.DataBlock.MediaAutoScale = autoScale;
  12559. updatePacket.DataBlockExtended.MediaType = Util.StringToBytes256(mediaType);
  12560. updatePacket.DataBlockExtended.MediaDesc = Util.StringToBytes256(mediaDesc);
  12561. updatePacket.DataBlockExtended.MediaWidth = mediaWidth;
  12562. updatePacket.DataBlockExtended.MediaHeight = mediaHeight;
  12563. updatePacket.DataBlockExtended.MediaLoop = mediaLoop;
  12564. OutPacket(updatePacket, ThrottleOutPacketType.Task);
  12565. }
  12566. #endregion
  12567. #region Camera
  12568. public void SendSetFollowCamProperties(UUID objectID, SortedDictionary<int, float> parameters)
  12569. {
  12570. SetFollowCamPropertiesPacket packet = (SetFollowCamPropertiesPacket)PacketPool.Instance.GetPacket(PacketType.SetFollowCamProperties);
  12571. packet.ObjectData.ObjectID = objectID;
  12572. SetFollowCamPropertiesPacket.CameraPropertyBlock[] camPropBlock = new SetFollowCamPropertiesPacket.CameraPropertyBlock[parameters.Count];
  12573. uint idx = 0;
  12574. foreach (KeyValuePair<int, float> pair in parameters)
  12575. {
  12576. SetFollowCamPropertiesPacket.CameraPropertyBlock block = new SetFollowCamPropertiesPacket.CameraPropertyBlock();
  12577. block.Type = pair.Key;
  12578. block.Value = pair.Value;
  12579. camPropBlock[idx++] = block;
  12580. }
  12581. packet.CameraProperty = camPropBlock;
  12582. OutPacket(packet, ThrottleOutPacketType.Task);
  12583. }
  12584. public void SendClearFollowCamProperties(UUID objectID)
  12585. {
  12586. ClearFollowCamPropertiesPacket packet = (ClearFollowCamPropertiesPacket)PacketPool.Instance.GetPacket(PacketType.ClearFollowCamProperties);
  12587. packet.ObjectData.ObjectID = objectID;
  12588. OutPacket(packet, ThrottleOutPacketType.Task);
  12589. }
  12590. #endregion
  12591. public void SetClientOption(string option, string value)
  12592. {
  12593. switch (option)
  12594. {
  12595. default:
  12596. break;
  12597. }
  12598. }
  12599. public string GetClientOption(string option)
  12600. {
  12601. switch (option)
  12602. {
  12603. default:
  12604. break;
  12605. }
  12606. return string.Empty;
  12607. }
  12608. #region IClientCore
  12609. private readonly Dictionary<Type, object> m_clientInterfaces = new Dictionary<Type, object>();
  12610. /// <summary>
  12611. /// Register an interface on this client, should only be called in the constructor.
  12612. /// </summary>
  12613. /// <typeparam name="T"></typeparam>
  12614. /// <param name="iface"></param>
  12615. protected void RegisterInterface<T>(T iface)
  12616. {
  12617. lock (m_clientInterfaces)
  12618. {
  12619. if (!m_clientInterfaces.ContainsKey(typeof(T)))
  12620. {
  12621. m_clientInterfaces.Add(typeof(T), iface);
  12622. }
  12623. }
  12624. }
  12625. public bool TryGet<T>(out T iface)
  12626. {
  12627. if (m_clientInterfaces.ContainsKey(typeof(T)))
  12628. {
  12629. iface = (T)m_clientInterfaces[typeof(T)];
  12630. return true;
  12631. }
  12632. iface = default(T);
  12633. return false;
  12634. }
  12635. public T Get<T>()
  12636. {
  12637. return (T)m_clientInterfaces[typeof(T)];
  12638. }
  12639. public void Disconnect(string reason)
  12640. {
  12641. Kick(reason);
  12642. Thread.Sleep(1000);
  12643. Disconnect();
  12644. }
  12645. public void Disconnect()
  12646. {
  12647. Close();
  12648. }
  12649. #endregion
  12650. public void RefreshGroupMembership()
  12651. {
  12652. lock(m_groupPowers)
  12653. {
  12654. GroupMembershipData activeMembership = null;
  12655. if (m_GroupsModule != null)
  12656. {
  12657. GroupMembershipData[] GroupMembership =
  12658. m_GroupsModule.GetMembershipData(AgentId);
  12659. m_groupPowers.Clear();
  12660. if (GroupMembership != null)
  12661. {
  12662. for (int i = 0; i < GroupMembership.Length; i++)
  12663. {
  12664. m_groupPowers[GroupMembership[i].GroupID] = GroupMembership[i].GroupPowers;
  12665. }
  12666. }
  12667. activeMembership = m_GroupsModule.GetActiveMembershipData(AgentId);
  12668. if(activeMembership != null)
  12669. {
  12670. if(!m_groupPowers.ContainsKey(activeMembership.GroupID))
  12671. activeMembership = null;
  12672. else
  12673. {
  12674. m_activeGroupID = activeMembership.GroupID;
  12675. m_activeGroupName = activeMembership.GroupName;
  12676. m_activeGroupPowers = ActiveGroupPowers;
  12677. }
  12678. }
  12679. }
  12680. if(activeMembership == null)
  12681. {
  12682. m_activeGroupID = UUID.Zero;
  12683. m_activeGroupName = "";
  12684. m_activeGroupPowers = 0;
  12685. }
  12686. }
  12687. }
  12688. public void UpdateGroupMembership(GroupMembershipData[] data)
  12689. {
  12690. lock(m_groupPowers)
  12691. {
  12692. m_groupPowers.Clear();
  12693. if (data != null)
  12694. {
  12695. for (int i = 0; i < data.Length; i++)
  12696. m_groupPowers[data[i].GroupID] = data[i].GroupPowers;
  12697. }
  12698. }
  12699. }
  12700. public void GroupMembershipRemove(UUID GroupID)
  12701. {
  12702. lock(m_groupPowers)
  12703. {
  12704. if(m_groupPowers.ContainsKey(GroupID))
  12705. m_groupPowers.Remove(GroupID);
  12706. }
  12707. }
  12708. public void GroupMembershipAddReplace(UUID GroupID,ulong GroupPowers)
  12709. {
  12710. lock(m_groupPowers)
  12711. {
  12712. m_groupPowers[GroupID] = GroupPowers;
  12713. }
  12714. }
  12715. public string Report()
  12716. {
  12717. return m_udpClient.GetStats();
  12718. }
  12719. public string XReport(string uptime, string version)
  12720. {
  12721. return String.Empty;
  12722. }
  12723. public OSDMap OReport(string uptime, string version)
  12724. {
  12725. return new OSDMap();
  12726. }
  12727. /// <summary>
  12728. /// Make an asset request to the asset service in response to a client request.
  12729. /// </summary>
  12730. /// <param name="transferRequest"></param>
  12731. /// <param name="taskID"></param>
  12732. protected void MakeAssetRequest(TransferRequestPacket transferRequest, UUID taskID)
  12733. {
  12734. UUID requestID = UUID.Zero;
  12735. int sourceType = transferRequest.TransferInfo.SourceType;
  12736. if (sourceType == (int)SourceType.Asset)
  12737. {
  12738. requestID = new UUID(transferRequest.TransferInfo.Params, 0);
  12739. }
  12740. else if (sourceType == (int)SourceType.SimInventoryItem)
  12741. {
  12742. requestID = new UUID(transferRequest.TransferInfo.Params, 80);
  12743. }
  12744. else if (sourceType == (int)SourceType.SimEstate)
  12745. {
  12746. requestID = taskID;
  12747. }
  12748. // m_log.DebugFormat(
  12749. // "[LLCLIENTVIEW]: Received transfer request for {0} in {1} type {2} by {3}",
  12750. // requestID, taskID, (SourceType)sourceType, Name);
  12751. //Note, the bool returned from the below function is useless since it is always false.
  12752. m_assetService.Get(requestID.ToString(), transferRequest, AssetReceived);
  12753. }
  12754. /// <summary>
  12755. /// When we get a reply back from the asset service in response to a client request, send back the data.
  12756. /// </summary>
  12757. /// <param name="id"></param>
  12758. /// <param name="sender"></param>
  12759. /// <param name="asset"></param>
  12760. protected void AssetReceived(string id, Object sender, AssetBase asset)
  12761. {
  12762. TransferRequestPacket transferRequest = (TransferRequestPacket)sender;
  12763. UUID requestID = UUID.Zero;
  12764. byte source = (byte)SourceType.Asset;
  12765. AssetRequestToClient req = new AssetRequestToClient();
  12766. if (asset == null)
  12767. {
  12768. // Try the user's asset server
  12769. IInventoryAccessModule inventoryAccessModule = Scene.RequestModuleInterface<IInventoryAccessModule>();
  12770. string assetServerURL = string.Empty;
  12771. if (inventoryAccessModule.IsForeignUser(AgentId, out assetServerURL) && !string.IsNullOrEmpty(assetServerURL))
  12772. {
  12773. if (!assetServerURL.EndsWith("/") && !assetServerURL.EndsWith("="))
  12774. assetServerURL = assetServerURL + "/";
  12775. //m_log.DebugFormat("[LLCLIENTVIEW]: asset {0} not found in local storage. Trying user's storage.", assetServerURL + id);
  12776. asset = m_scene.AssetService.Get(assetServerURL + id);
  12777. }
  12778. if (asset == null)
  12779. {
  12780. req.AssetInf = null;
  12781. req.AssetRequestSource = source;
  12782. req.IsTextureRequest = false;
  12783. req.NumPackets = 0;
  12784. req.Params = transferRequest.TransferInfo.Params;
  12785. req.RequestAssetID = requestID;
  12786. req.TransferRequestID = transferRequest.TransferInfo.TransferID;
  12787. SendAssetNotFound(req);
  12788. return;
  12789. }
  12790. }
  12791. if (transferRequest.TransferInfo.SourceType == (int)SourceType.Asset)
  12792. {
  12793. requestID = new UUID(transferRequest.TransferInfo.Params, 0);
  12794. }
  12795. else if (transferRequest.TransferInfo.SourceType == (int)SourceType.SimInventoryItem)
  12796. {
  12797. requestID = new UUID(transferRequest.TransferInfo.Params, 80);
  12798. source = (byte)SourceType.SimInventoryItem;
  12799. //m_log.Debug("asset request " + requestID);
  12800. }
  12801. // Scripts cannot be retrieved by direct request
  12802. if (transferRequest.TransferInfo.SourceType == (int)SourceType.Asset && asset.Type == 10)
  12803. return;
  12804. // The asset is known to exist and is in our cache, so add it to the AssetRequests list
  12805. req.AssetInf = asset;
  12806. req.AssetRequestSource = source;
  12807. req.IsTextureRequest = false;
  12808. req.NumPackets = CalculateNumPackets(asset.Data);
  12809. req.Params = transferRequest.TransferInfo.Params;
  12810. req.RequestAssetID = requestID;
  12811. req.TransferRequestID = transferRequest.TransferInfo.TransferID;
  12812. SendAsset(req);
  12813. }
  12814. /// <summary>
  12815. /// Calculate the number of packets required to send the asset to the client.
  12816. /// </summary>
  12817. /// <param name="data"></param>
  12818. /// <returns></returns>
  12819. private static int CalculateNumPackets(byte[] data)
  12820. {
  12821. // const uint m_maxPacketSize = 600;
  12822. uint m_maxPacketSize = MaxTransferBytesPerPacket;
  12823. int numPackets = 1;
  12824. if (data == null)
  12825. return 0;
  12826. if (data.LongLength > m_maxPacketSize)
  12827. {
  12828. // over max number of bytes so split up file
  12829. long restData = data.LongLength - m_maxPacketSize;
  12830. int restPackets = (int)((restData + m_maxPacketSize - 1) / m_maxPacketSize);
  12831. numPackets += restPackets;
  12832. }
  12833. return numPackets;
  12834. }
  12835. public void SendRebakeAvatarTextures(UUID textureID)
  12836. {
  12837. RebakeAvatarTexturesPacket pack =
  12838. (RebakeAvatarTexturesPacket)PacketPool.Instance.GetPacket(PacketType.RebakeAvatarTextures);
  12839. pack.TextureData = new RebakeAvatarTexturesPacket.TextureDataBlock();
  12840. pack.TextureData.TextureID = textureID;
  12841. OutPacket(pack, ThrottleOutPacketType.Task);
  12842. }
  12843. public struct PacketProcessor
  12844. {
  12845. /// <summary>
  12846. /// Packet handling method.
  12847. /// </summary>
  12848. public PacketMethod method { get; set; }
  12849. /// <summary>
  12850. /// Should this packet be handled asynchronously?
  12851. /// </summary>
  12852. public bool Async { get; set; }
  12853. }
  12854. public class AsyncPacketProcess
  12855. {
  12856. public bool result = false;
  12857. public readonly LLClientView ClientView = null;
  12858. public readonly Packet Pack = null;
  12859. public readonly PacketMethod Method = null;
  12860. public AsyncPacketProcess(LLClientView pClientview, PacketMethod pMethod, Packet pPack)
  12861. {
  12862. ClientView = pClientview;
  12863. Method = pMethod;
  12864. Pack = pPack;
  12865. }
  12866. }
  12867. public void SendAvatarInterestsReply(UUID avatarID, uint wantMask, string wantText, uint skillsMask, string skillsText, string languages)
  12868. {
  12869. AvatarInterestsReplyPacket packet = (AvatarInterestsReplyPacket)PacketPool.Instance.GetPacket(PacketType.AvatarInterestsReply);
  12870. packet.AgentData = new AvatarInterestsReplyPacket.AgentDataBlock();
  12871. packet.AgentData.AgentID = AgentId;
  12872. packet.AgentData.AvatarID = avatarID;
  12873. packet.PropertiesData = new AvatarInterestsReplyPacket.PropertiesDataBlock();
  12874. packet.PropertiesData.WantToMask = wantMask;
  12875. packet.PropertiesData.WantToText = Utils.StringToBytes(wantText);
  12876. packet.PropertiesData.SkillsMask = skillsMask;
  12877. packet.PropertiesData.SkillsText = Utils.StringToBytes(skillsText);
  12878. packet.PropertiesData.LanguagesText = Utils.StringToBytes(languages);
  12879. OutPacket(packet, ThrottleOutPacketType.Task);
  12880. }
  12881. public void SendChangeUserRights(UUID agentID, UUID friendID, int rights)
  12882. {
  12883. ChangeUserRightsPacket packet = (ChangeUserRightsPacket)PacketPool.Instance.GetPacket(PacketType.ChangeUserRights);
  12884. packet.AgentData = new ChangeUserRightsPacket.AgentDataBlock();
  12885. packet.AgentData.AgentID = agentID;
  12886. packet.Rights = new ChangeUserRightsPacket.RightsBlock[1];
  12887. packet.Rights[0] = new ChangeUserRightsPacket.RightsBlock();
  12888. packet.Rights[0].AgentRelated = friendID;
  12889. packet.Rights[0].RelatedRights = rights;
  12890. OutPacket(packet, ThrottleOutPacketType.Task);
  12891. }
  12892. public void SendTextBoxRequest(string message, int chatChannel, string objectname, UUID ownerID, string ownerFirstName, string ownerLastName, UUID objectId)
  12893. {
  12894. ScriptDialogPacket dialog = (ScriptDialogPacket)PacketPool.Instance.GetPacket(PacketType.ScriptDialog);
  12895. dialog.Data.ObjectID = objectId;
  12896. dialog.Data.ChatChannel = chatChannel;
  12897. dialog.Data.ImageID = UUID.Zero;
  12898. dialog.Data.ObjectName = Util.StringToBytes256(objectname);
  12899. // this is the username of the *owner*
  12900. dialog.Data.FirstName = Util.StringToBytes256(ownerFirstName);
  12901. dialog.Data.LastName = Util.StringToBytes256(ownerLastName);
  12902. dialog.Data.Message = Util.StringToBytes(message,512);
  12903. ScriptDialogPacket.ButtonsBlock[] buttons = new ScriptDialogPacket.ButtonsBlock[1];
  12904. buttons[0] = new ScriptDialogPacket.ButtonsBlock();
  12905. buttons[0].ButtonLabel = Util.StringToBytes256("!!llTextBox!!");
  12906. dialog.Buttons = buttons;
  12907. dialog.OwnerData = new ScriptDialogPacket.OwnerDataBlock[1];
  12908. dialog.OwnerData[0] = new ScriptDialogPacket.OwnerDataBlock();
  12909. dialog.OwnerData[0].OwnerID = ownerID;
  12910. OutPacket(dialog, ThrottleOutPacketType.Task);
  12911. }
  12912. public void SendAgentTerseUpdate(ISceneEntity p)
  12913. {
  12914. if (p is ScenePresence)
  12915. {
  12916. UDPPacketBuffer buf = m_udpServer.GetNewUDPBuffer(m_udpClient.RemoteEndPoint);
  12917. //setup header and regioninfo block
  12918. Buffer.BlockCopy(terseUpdateHeader, 0, buf.Data, 0, 7);
  12919. Utils.UInt64ToBytesSafepos(m_scene.RegionInfo.RegionHandle, buf.Data, 7);
  12920. Utils.UInt16ToBytes(Utils.FloatToUInt16(m_scene.TimeDilation, 0.0f, 1.0f), buf.Data, 15);
  12921. buf.Data[17] = 1;
  12922. int pos = 18;
  12923. CreateImprovedTerseBlock(p, buf.Data, ref pos, false);
  12924. buf.DataLength = pos;
  12925. m_udpServer.SendUDPPacket(m_udpClient, buf, ThrottleOutPacketType.Task, null, false, true);
  12926. }
  12927. }
  12928. public void SendPlacesReply(UUID queryID, UUID transactionID,
  12929. PlacesReplyData[] data)
  12930. {
  12931. PlacesReplyPacket reply = null;
  12932. PlacesReplyPacket.QueryDataBlock[] dataBlocks =
  12933. new PlacesReplyPacket.QueryDataBlock[0];
  12934. for (int i = 0 ; i < data.Length ; i++)
  12935. {
  12936. PlacesReplyPacket.QueryDataBlock block =
  12937. new PlacesReplyPacket.QueryDataBlock();
  12938. block.OwnerID = data[i].OwnerID;
  12939. block.Name = Util.StringToBytes256(data[i].Name);
  12940. block.Desc = Util.StringToBytes1024(data[i].Desc);
  12941. block.ActualArea = data[i].ActualArea;
  12942. block.BillableArea = data[i].BillableArea;
  12943. block.Flags = data[i].Flags;
  12944. block.GlobalX = data[i].GlobalX;
  12945. block.GlobalY = data[i].GlobalY;
  12946. block.GlobalZ = data[i].GlobalZ;
  12947. block.SimName = Util.StringToBytes256(data[i].SimName);
  12948. block.SnapshotID = data[i].SnapshotID;
  12949. block.Dwell = data[i].Dwell;
  12950. block.Price = data[i].Price;
  12951. if (reply != null && reply.Length + block.Length > 1400)
  12952. {
  12953. OutPacket(reply, ThrottleOutPacketType.Task);
  12954. reply = null;
  12955. dataBlocks = new PlacesReplyPacket.QueryDataBlock[0];
  12956. }
  12957. if (reply == null)
  12958. {
  12959. reply = (PlacesReplyPacket)PacketPool.Instance.GetPacket(PacketType.PlacesReply);
  12960. reply.AgentData = new PlacesReplyPacket.AgentDataBlock();
  12961. reply.AgentData.AgentID = AgentId;
  12962. reply.AgentData.QueryID = queryID;
  12963. reply.TransactionData = new PlacesReplyPacket.TransactionDataBlock();
  12964. reply.TransactionData.TransactionID = transactionID;
  12965. reply.QueryData = dataBlocks;
  12966. }
  12967. Array.Resize(ref dataBlocks, dataBlocks.Length + 1);
  12968. dataBlocks[dataBlocks.Length - 1] = block;
  12969. reply.QueryData = dataBlocks;
  12970. }
  12971. if (reply != null)
  12972. OutPacket(reply, ThrottleOutPacketType.Task);
  12973. }
  12974. public void SendRemoveInventoryItems(UUID[] items)
  12975. {
  12976. IEventQueue eq = Scene.RequestModuleInterface<IEventQueue>();
  12977. if (eq == null)
  12978. {
  12979. m_log.DebugFormat("[LLCLIENT]: Null event queue");
  12980. return;
  12981. }
  12982. StringBuilder sb = eq.StartEvent("RemoveInventoryItem");
  12983. LLSDxmlEncode.AddArrayAndMap("AgentData", sb);
  12984. LLSDxmlEncode.AddElem("AgentID", AgentId, sb);
  12985. LLSDxmlEncode.AddElem("SessionID", SessionId, sb);
  12986. LLSDxmlEncode.AddEndMapAndArray(sb);
  12987. LLSDxmlEncode.AddArray("InventoryData", sb);
  12988. foreach (UUID item in items)
  12989. {
  12990. LLSDxmlEncode.AddMap(sb);
  12991. LLSDxmlEncode.AddElem("ItemID",item, sb);
  12992. LLSDxmlEncode.AddEndMap(sb);
  12993. }
  12994. LLSDxmlEncode.AddEndArray(sb);
  12995. OSD ev = new OSDllsdxml(eq.EndEvent(sb));
  12996. eq.Enqueue(ev, AgentId);
  12997. }
  12998. public void SendRemoveInventoryFolders(UUID[] folders)
  12999. {
  13000. IEventQueue eq = Scene.RequestModuleInterface<IEventQueue>();
  13001. if (eq == null)
  13002. {
  13003. m_log.DebugFormat("[LLCLIENT]: Null event queue");
  13004. return;
  13005. }
  13006. StringBuilder sb = eq.StartEvent("RemoveInventoryFolder");
  13007. LLSDxmlEncode.AddArrayAndMap("AgentData", sb);
  13008. LLSDxmlEncode.AddElem("AgentID", AgentId, sb);
  13009. LLSDxmlEncode.AddElem("SessionID", SessionId, sb);
  13010. LLSDxmlEncode.AddEndMapAndArray(sb);
  13011. LLSDxmlEncode.AddArray("FolderData", sb);
  13012. foreach (UUID folder in folders)
  13013. {
  13014. LLSDxmlEncode.AddMap(sb);
  13015. LLSDxmlEncode.AddElem("FolderID", folder, sb);
  13016. LLSDxmlEncode.AddEndMap(sb);
  13017. }
  13018. LLSDxmlEncode.AddEndArray(sb);
  13019. OSD ev = new OSDllsdxml(eq.EndEvent(sb));
  13020. eq.Enqueue(ev, AgentId);
  13021. }
  13022. public void SendBulkUpdateInventory(InventoryFolderBase[] folders, InventoryItemBase[] items)
  13023. {
  13024. IEventQueue eq = Scene.RequestModuleInterface<IEventQueue>();
  13025. if (eq == null)
  13026. {
  13027. m_log.DebugFormat("[LLCLIENT]: Null event queue");
  13028. return;
  13029. }
  13030. StringBuilder sb = eq.StartEvent("BulkUpdateInventory");
  13031. LLSDxmlEncode.AddArrayAndMap("AgentData", sb);
  13032. LLSDxmlEncode.AddElem("AgentID", AgentId, sb);
  13033. LLSDxmlEncode.AddElem("TransactionID", UUID.Random(), sb);
  13034. LLSDxmlEncode.AddEndMapAndArray(sb);
  13035. if(folders.Length == 0)
  13036. {
  13037. LLSDxmlEncode.AddEmptyArray("FolderData", sb);
  13038. }
  13039. else
  13040. {
  13041. LLSDxmlEncode.AddArray("FolderData", sb);
  13042. foreach (InventoryFolderBase folder in folders)
  13043. {
  13044. LLSDxmlEncode.AddMap(sb);
  13045. LLSDxmlEncode.AddElem("FolderID", folder.ID, sb);
  13046. LLSDxmlEncode.AddElem("ParentID", folder.ParentID, sb);
  13047. LLSDxmlEncode.AddElem("Type", (int)folder.Type, sb);
  13048. LLSDxmlEncode.AddElem("Name", folder.Name, sb);
  13049. LLSDxmlEncode.AddEndMap(sb);
  13050. }
  13051. LLSDxmlEncode.AddEndArray(sb);
  13052. }
  13053. if(items.Length == 0)
  13054. {
  13055. LLSDxmlEncode.AddEmptyArray("ItemData", sb);
  13056. }
  13057. else
  13058. {
  13059. LLSDxmlEncode.AddArray("ItemData", sb);
  13060. foreach (InventoryItemBase item in items)
  13061. {
  13062. LLSDxmlEncode.AddMap(sb);
  13063. LLSDxmlEncode.AddElem("ItemID", item.ID, sb);
  13064. LLSDxmlEncode.AddElem("CallbackID", (uint)0, sb);
  13065. LLSDxmlEncode.AddElem("FolderID", item.Folder, sb);
  13066. LLSDxmlEncode.AddElem("CreatorID", item.CreatorIdAsUuid, sb);
  13067. LLSDxmlEncode.AddElem("OwnerID", item.Owner, sb);
  13068. LLSDxmlEncode.AddElem("GroupID", item.GroupID, sb);
  13069. LLSDxmlEncode.AddElem("BaseMask", item.BasePermissions, sb);
  13070. LLSDxmlEncode.AddElem("OwnerMask", item.CurrentPermissions, sb);
  13071. LLSDxmlEncode.AddElem("GroupMask", item.GroupPermissions, sb);
  13072. LLSDxmlEncode.AddElem("EveryoneMask", item.EveryOnePermissions, sb);
  13073. LLSDxmlEncode.AddElem("NextOwnerMask", item.NextPermissions, sb);
  13074. LLSDxmlEncode.AddElem("GroupOwned", item.GroupOwned, sb);
  13075. LLSDxmlEncode.AddElem("AssetID", item.AssetID, sb);
  13076. LLSDxmlEncode.AddElem("Type", item.AssetType, sb);
  13077. LLSDxmlEncode.AddElem("InvType", item.InvType, sb);
  13078. LLSDxmlEncode.AddElem("Flags", item.Flags, sb);
  13079. LLSDxmlEncode.AddElem("SaleType", item.SaleType, sb);
  13080. LLSDxmlEncode.AddElem("SalePrice", item.SalePrice, sb);
  13081. LLSDxmlEncode.AddElem("Name", item.Name, sb);
  13082. LLSDxmlEncode.AddElem("Description", item.Description, sb);
  13083. LLSDxmlEncode.AddElem("CreationDate", item.CreationDate, sb);
  13084. LLSDxmlEncode.AddElem("CRC",
  13085. Helpers.InventoryCRC(1000, 0, (sbyte)item.InvType,
  13086. (sbyte)item.AssetType, item.AssetID,
  13087. item.GroupID, 100,
  13088. item.Owner, item.CreatorIdAsUuid,
  13089. item.ID, item.Folder,
  13090. (uint)PermissionMask.All, 1, (uint)PermissionMask.All, (uint)PermissionMask.All,
  13091. (uint)PermissionMask.All),
  13092. sb);
  13093. LLSDxmlEncode.AddEndMap(sb);
  13094. }
  13095. LLSDxmlEncode.AddEndArray(sb);
  13096. }
  13097. OSD ev = new OSDllsdxml(eq.EndEvent(sb));
  13098. eq.Enqueue(ev, AgentId);
  13099. }
  13100. private HashSet<string> m_outPacketsToDrop;
  13101. public bool AddOutPacketToDropSet(string packetName)
  13102. {
  13103. if (m_outPacketsToDrop == null)
  13104. m_outPacketsToDrop = new HashSet<string>();
  13105. return m_outPacketsToDrop.Add(packetName);
  13106. }
  13107. public bool RemoveOutPacketFromDropSet(string packetName)
  13108. {
  13109. if (m_outPacketsToDrop == null)
  13110. return false;
  13111. return m_outPacketsToDrop.Remove(packetName);
  13112. }
  13113. public HashSet<string> GetOutPacketDropSet()
  13114. {
  13115. return new HashSet<string>(m_outPacketsToDrop);
  13116. }
  13117. private HashSet<string> m_inPacketsToDrop;
  13118. public bool AddInPacketToDropSet(string packetName)
  13119. {
  13120. if (m_inPacketsToDrop == null)
  13121. m_inPacketsToDrop = new HashSet<string>();
  13122. return m_inPacketsToDrop.Add(packetName);
  13123. }
  13124. public bool RemoveInPacketFromDropSet(string packetName)
  13125. {
  13126. if (m_inPacketsToDrop == null)
  13127. return false;
  13128. return m_inPacketsToDrop.Remove(packetName);
  13129. }
  13130. public HashSet<string> GetInPacketDropSet()
  13131. {
  13132. return new HashSet<string>(m_inPacketsToDrop);
  13133. }
  13134. public uint GetViewerCaps()
  13135. {
  13136. m_SupportObjectAnimations = false;
  13137. uint ret;
  13138. if(m_supportViewerCache)
  13139. ret = m_viewerHandShakeFlags;
  13140. else
  13141. ret = (m_viewerHandShakeFlags & 4) | 2; // disable probes
  13142. if (m_scene.CapsModule != null)
  13143. {
  13144. Caps cap = m_scene.CapsModule.GetCapsForUser(CircuitCode);
  13145. if(cap != null)
  13146. {
  13147. if((cap.Flags & Caps.CapsFlags.SentSeeds) != 0)
  13148. ret |= 0x1000;
  13149. if ((cap.Flags & Caps.CapsFlags.ObjectAnim) != 0)
  13150. {
  13151. m_SupportObjectAnimations = true;
  13152. ret |= 0x2000;
  13153. }
  13154. }
  13155. }
  13156. return ret; // ???
  13157. }
  13158. }
  13159. }