LLClientView.cs 370 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687
  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 OpenSim 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.Text;
  32. using System.Threading;
  33. using System.Timers;
  34. using System.Xml;
  35. using OpenMetaverse;
  36. using OpenMetaverse.Packets;
  37. using log4net;
  38. using OpenSim.Framework;
  39. using OpenSim.Framework.Communications.Cache;
  40. using OpenSim.Framework.Statistics;
  41. using OpenSim.Region.Interfaces;
  42. using OpenSim.Region.Environment.Scenes;
  43. using Timer = System.Timers.Timer;
  44. namespace OpenSim.Region.ClientStack.LindenUDP
  45. {
  46. public delegate bool PacketMethod(IClientAPI simClient, Packet packet);
  47. /// <summary>
  48. /// Handles new client connections
  49. /// Constructor takes a single Packet and authenticates everything
  50. /// </summary>
  51. public class LLClientView : IClientAPI, IStatsCollector
  52. {
  53. private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
  54. // ~ClientView()
  55. // {
  56. // m_log.Info("[CLIENT]: LLClientView destructor called");
  57. // }
  58. /* static variables */
  59. public static SynchronizeClientHandler SynchronizeClient;
  60. /* private variables */
  61. private readonly UUID m_sessionId;
  62. private readonly UUID m_secureSessionId = UUID.Zero;
  63. //private AgentAssetUpload UploadAssets;
  64. private int m_debugPacketLevel;
  65. private readonly AssetCache m_assetCache;
  66. // private InventoryCache m_inventoryCache;
  67. private int m_cachedTextureSerial;
  68. private Timer m_clientPingTimer;
  69. private bool m_clientBlocked;
  70. private int m_probesWithNoIngressPackets;
  71. //private int m_lastPacketsReceived = 0;
  72. //private byte[] ZeroOutBuffer = new byte[4096];
  73. private readonly UUID m_agentId;
  74. private readonly uint m_circuitCode;
  75. private int m_moneyBalance;
  76. private readonly IPacketHandler m_PacketHandler;
  77. private int m_animationSequenceNumber = 1;
  78. private readonly byte[] m_channelVersion = Utils.StringToBytes("OpenSimulator Server"); // Dummy value needed by libSL
  79. private readonly Dictionary<string, UUID> m_defaultAnimations = new Dictionary<string, UUID>();
  80. private bool m_SendLogoutPacketWhenClosing = true;
  81. private int m_inPacketsChecked;
  82. /* protected variables */
  83. protected static Dictionary<PacketType, PacketMethod> PacketHandlers =
  84. new Dictionary<PacketType, PacketMethod>(); //Global/static handlers for all clients
  85. protected Dictionary<PacketType, PacketMethod> m_packetHandlers = new Dictionary<PacketType, PacketMethod>();
  86. protected IScene m_scene;
  87. protected LLPacketServer m_networkServer;
  88. /* public variables */
  89. protected string m_firstName;
  90. protected string m_lastName;
  91. protected Thread m_clientThread;
  92. protected Vector3 m_startpos;
  93. protected EndPoint m_userEndPoint;
  94. protected EndPoint m_proxyEndPoint;
  95. protected UUID m_activeGroupID = UUID.Zero;
  96. protected string m_activeGroupName = String.Empty;
  97. protected ulong m_activeGroupPowers;
  98. protected Dictionary<UUID, ulong> m_groupPowers = new Dictionary<UUID, ulong>();
  99. /* Instantiated Designated Event Delegates */
  100. //- used so we don't create new objects for each incoming packet and then toss it out later */
  101. private GenericMessage handlerGenericMessage;
  102. private RequestAvatarProperties handlerRequestAvatarProperties; //OnRequestAvatarProperties;
  103. private UpdateAvatarProperties handlerUpdateAvatarProperties; // OnUpdateAvatarProperties;
  104. private ChatMessage handlerChatFromClient; //OnChatFromClient;
  105. private ChatMessage handlerChatFromClient2; //OnChatFromClient;
  106. private ImprovedInstantMessage handlerInstantMessage; //OnInstantMessage;
  107. private FriendActionDelegate handlerApproveFriendRequest; //OnApproveFriendRequest;
  108. private FriendshipTermination handlerTerminateFriendship; //OnTerminateFriendship;
  109. private RezObject handlerRezObject; //OnRezObject;
  110. private DeRezObject handlerDeRezObject; //OnDeRezObject;
  111. private ModifyTerrain handlerModifyTerrain;
  112. private BakeTerrain handlerBakeTerrain;
  113. private EstateChangeInfo handlerEstateChangeInfo;
  114. private Action<IClientAPI> handlerRegionHandShakeReply; //OnRegionHandShakeReply;
  115. private GenericCall2 handlerRequestWearables; //OnRequestWearables;
  116. private Action<IClientAPI> handlerRequestAvatarsData; //OnRequestAvatarsData;
  117. private SetAppearance handlerSetAppearance; //OnSetAppearance;
  118. private AvatarNowWearing handlerAvatarNowWearing; //OnAvatarNowWearing;
  119. private RezSingleAttachmentFromInv handlerRezSingleAttachment; //OnRezSingleAttachmentFromInv;
  120. private UUIDNameRequest handlerDetachAttachmentIntoInv; // Detach attachment!
  121. private ObjectAttach handlerObjectAttach; //OnObjectAttach;
  122. private SetAlwaysRun handlerSetAlwaysRun; //OnSetAlwaysRun;
  123. private GenericCall2 handlerCompleteMovementToRegion; //OnCompleteMovementToRegion;
  124. private UpdateAgent handlerAgentUpdate; //OnAgentUpdate;
  125. private StartAnim handlerStartAnim;
  126. private StopAnim handlerStopAnim;
  127. private AgentRequestSit handlerAgentRequestSit; //OnAgentRequestSit;
  128. private AgentSit handlerAgentSit; //OnAgentSit;
  129. private AvatarPickerRequest handlerAvatarPickerRequest; //OnAvatarPickerRequest;
  130. private FetchInventory handlerAgentDataUpdateRequest; //OnAgentDataUpdateRequest;
  131. private FetchInventory handlerUserInfoRequest; //OnUserInfoRequest;
  132. private TeleportLocationRequest handlerSetStartLocationRequest; //OnSetStartLocationRequest;
  133. private TeleportLandmarkRequest handlerTeleportLandmarkRequest; //OnTeleportLandmarkRequest;
  134. private LinkObjects handlerLinkObjects; //OnLinkObjects;
  135. private DelinkObjects handlerDelinkObjects; //OnDelinkObjects;
  136. private AddNewPrim handlerAddPrim; //OnAddPrim;
  137. private UpdateShape handlerUpdatePrimShape; //null;
  138. private ObjectExtraParams handlerUpdateExtraParams; //OnUpdateExtraParams;
  139. private ObjectDuplicate handlerObjectDuplicate;
  140. private ObjectDuplicateOnRay handlerObjectDuplicateOnRay;
  141. private ObjectSelect handlerObjectSelect;
  142. private ObjectDeselect handlerObjectDeselect;
  143. private ObjectIncludeInSearch handlerObjectIncludeInSearch;
  144. private UpdatePrimFlags handlerUpdatePrimFlags; //OnUpdatePrimFlags;
  145. private UpdatePrimTexture handlerUpdatePrimTexture;
  146. private GrabObject handlerGrabObject; //OnGrabObject;
  147. private MoveObject handlerGrabUpdate; //OnGrabUpdate;
  148. private ObjectSelect handlerDeGrabObject; //OnDeGrabObject;
  149. private GenericCall7 handlerObjectDescription;
  150. private GenericCall7 handlerObjectName;
  151. private GenericCall7 handlerObjectClickAction;
  152. private GenericCall7 handlerObjectMaterial;
  153. private ObjectPermissions handlerObjectPermissions;
  154. private RequestObjectPropertiesFamily handlerRequestObjectPropertiesFamily; //OnRequestObjectPropertiesFamily;
  155. private TextureRequest handlerTextureRequest;
  156. private UDPAssetUploadRequest handlerAssetUploadRequest; //OnAssetUploadRequest;
  157. private RequestXfer handlerRequestXfer; //OnRequestXfer;
  158. private XferReceive handlerXferReceive; //OnXferReceive;
  159. private ConfirmXfer handlerConfirmXfer; //OnConfirmXfer;
  160. private CreateInventoryFolder handlerCreateInventoryFolder; //OnCreateNewInventoryFolder;
  161. private UpdateInventoryFolder handlerUpdateInventoryFolder;
  162. private MoveInventoryFolder handlerMoveInventoryFolder;
  163. private CreateNewInventoryItem handlerCreateNewInventoryItem; //OnCreateNewInventoryItem;
  164. private FetchInventory handlerFetchInventory;
  165. private FetchInventoryDescendents handlerFetchInventoryDescendents; //OnFetchInventoryDescendents;
  166. private PurgeInventoryDescendents handlerPurgeInventoryDescendents; //OnPurgeInventoryDescendents;
  167. private UpdateInventoryItem handlerUpdateInventoryItem;
  168. private CopyInventoryItem handlerCopyInventoryItem;
  169. private MoveInventoryItem handlerMoveInventoryItem;
  170. private RemoveInventoryItem handlerRemoveInventoryItem;
  171. private RemoveInventoryFolder handlerRemoveInventoryFolder;
  172. private RequestTaskInventory handlerRequestTaskInventory; //OnRequestTaskInventory;
  173. private UpdateTaskInventory handlerUpdateTaskInventory; //OnUpdateTaskInventory;
  174. private MoveTaskInventory handlerMoveTaskItem;
  175. private RemoveTaskInventory handlerRemoveTaskItem; //OnRemoveTaskItem;
  176. private RezScript handlerRezScript; //OnRezScript;
  177. private RequestMapBlocks handlerRequestMapBlocks; //OnRequestMapBlocks;
  178. private RequestMapName handlerMapNameRequest; //OnMapNameRequest;
  179. private TeleportLocationRequest handlerTeleportLocationRequest; //OnTeleportLocationRequest;
  180. private MoneyBalanceRequest handlerMoneyBalanceRequest; //OnMoneyBalanceRequest;
  181. private UUIDNameRequest handlerNameRequest;
  182. private ParcelAccessListRequest handlerParcelAccessListRequest; //OnParcelAccessListRequest;
  183. private ParcelAccessListUpdateRequest handlerParcelAccessListUpdateRequest; //OnParcelAccessListUpdateRequest;
  184. private ParcelPropertiesRequest handlerParcelPropertiesRequest; //OnParcelPropertiesRequest;
  185. private ParcelDivideRequest handlerParcelDivideRequest; //OnParcelDivideRequest;
  186. private ParcelJoinRequest handlerParcelJoinRequest; //OnParcelJoinRequest;
  187. private ParcelPropertiesUpdateRequest handlerParcelPropertiesUpdateRequest; //OnParcelPropertiesUpdateRequest;
  188. private ParcelSelectObjects handlerParcelSelectObjects; //OnParcelSelectObjects;
  189. private ParcelObjectOwnerRequest handlerParcelObjectOwnerRequest; //OnParcelObjectOwnerRequest;
  190. private ParcelAbandonRequest handlerParcelAbandonRequest;
  191. private ParcelGodForceOwner handlerParcelGodForceOwner;
  192. private ParcelReclaim handlerParcelReclaim;
  193. private ParcelReturnObjectsRequest handlerParcelReturnObjectsRequest;
  194. private RegionInfoRequest handlerRegionInfoRequest; //OnRegionInfoRequest;
  195. private EstateCovenantRequest handlerEstateCovenantRequest; //OnEstateCovenantRequest;
  196. private RequestGodlikePowers handlerReqGodlikePowers; //OnRequestGodlikePowers;
  197. private GodKickUser handlerGodKickUser; //OnGodKickUser;
  198. private ViewerEffectEventHandler handlerViewerEffect; //OnViewerEffect;
  199. private Action<IClientAPI> handlerLogout; //OnLogout;
  200. private MoneyTransferRequest handlerMoneyTransferRequest; //OnMoneyTransferRequest;
  201. private ParcelBuy handlerParcelBuy;
  202. private EconomyDataRequest handlerEconomoyDataRequest;
  203. private UpdateVector handlerUpdatePrimSinglePosition; //OnUpdatePrimSinglePosition;
  204. private UpdatePrimSingleRotation handlerUpdatePrimSingleRotation; //OnUpdatePrimSingleRotation;
  205. private UpdateVector handlerUpdatePrimScale; //OnUpdatePrimScale;
  206. private UpdateVector handlerUpdatePrimGroupScale; //OnUpdateGroupScale;
  207. private UpdateVector handlerUpdateVector; //OnUpdatePrimGroupPosition;
  208. private UpdatePrimRotation handlerUpdatePrimRotation; //OnUpdatePrimGroupRotation;
  209. // private UpdatePrimGroupRotation handlerUpdatePrimGroupRotation; //OnUpdatePrimGroupMouseRotation;
  210. // private RequestAsset handlerRequestAsset; // OnRequestAsset;
  211. private UUIDNameRequest handlerTeleportHomeRequest;
  212. private RegionHandleRequest handlerRegionHandleRequest; // OnRegionHandleRequest
  213. private ParcelInfoRequest handlerParcelInfoRequest; // OnParcelInfoRequest
  214. private ScriptAnswer handlerScriptAnswer;
  215. private RequestPayPrice handlerRequestPayPrice;
  216. private ObjectSaleInfo handlerObjectSaleInfo;
  217. private ObjectBuy handlerObjectBuy;
  218. //private BuyObjectInventory handlerBuyObjectInventory;
  219. private ObjectDeselect handlerObjectDetach;
  220. private ObjectDrop handlerObjectDrop;
  221. private AgentSit handlerOnUndo;
  222. private ForceReleaseControls handlerForceReleaseControls;
  223. private GodLandStatRequest handlerLandStatRequest;
  224. private UUIDNameRequest handlerUUIDGroupNameRequest;
  225. private RequestObjectPropertiesFamily handlerObjectGroupRequest;
  226. private ScriptReset handlerScriptReset;
  227. private GetScriptRunning handlerGetScriptRunning;
  228. private SetScriptRunning handlerSetScriptRunning;
  229. private UpdateVector handlerAutoPilotGo;
  230. //Gesture
  231. private ActivateGesture handlerActivateGesture;
  232. private DeactivateGesture handlerDeactivateGesture;
  233. private ObjectOwner handlerObjectOwner;
  234. private DirPlacesQuery handlerDirPlacesQuery;
  235. private DirFindQuery handlerDirFindQuery;
  236. private DirLandQuery handlerDirLandQuery;
  237. private DirPopularQuery handlerDirPopularQuery;
  238. private DirClassifiedQuery handlerDirClassifiedQuery;
  239. private ParcelSetOtherCleanTime handlerParcelSetOtherCleanTime;
  240. private MapItemRequest handlerMapItemRequest;
  241. private IGroupsModule m_GroupsModule;
  242. //private TerrainUnacked handlerUnackedTerrain = null;
  243. //**
  244. /* Properties */
  245. public UUID SecureSessionId
  246. {
  247. get { return m_secureSessionId; }
  248. }
  249. public IScene Scene
  250. {
  251. get { return m_scene; }
  252. }
  253. public UUID SessionId
  254. {
  255. get { return m_sessionId; }
  256. }
  257. public Vector3 StartPos
  258. {
  259. get { return m_startpos; }
  260. set { m_startpos = value; }
  261. }
  262. public UUID AgentId
  263. {
  264. get { return m_agentId; }
  265. }
  266. public UUID ActiveGroupId
  267. {
  268. get { return m_activeGroupID; }
  269. }
  270. public string ActiveGroupName
  271. {
  272. get { return m_activeGroupName; }
  273. }
  274. public ulong ActiveGroupPowers
  275. {
  276. get { return m_activeGroupPowers; }
  277. }
  278. public ulong GetGroupPowers(UUID groupID)
  279. {
  280. if (m_groupPowers.ContainsKey(groupID))
  281. return m_groupPowers[groupID];
  282. return 0;
  283. }
  284. /// <summary>
  285. /// This is a utility method used by single states to not duplicate kicks and blue card of death messages.
  286. /// </summary>
  287. public bool ChildAgentStatus()
  288. {
  289. return m_scene.PresenceChildStatus(AgentId);
  290. }
  291. /// <summary>
  292. /// First name of the agent/avatar represented by the client
  293. /// </summary>
  294. public string FirstName
  295. {
  296. get { return m_firstName; }
  297. }
  298. /// <summary>
  299. /// Last name of the agent/avatar represented by the client
  300. /// </summary>
  301. public string LastName
  302. {
  303. get { return m_lastName; }
  304. }
  305. /// <summary>
  306. /// Full name of the client (first name and last name)
  307. /// </summary>
  308. public string Name
  309. {
  310. get { return FirstName + " " + LastName; }
  311. }
  312. public uint CircuitCode
  313. {
  314. get { return m_circuitCode; }
  315. }
  316. public int MoneyBalance
  317. {
  318. get { return m_moneyBalance; }
  319. }
  320. public int NextAnimationSequenceNumber
  321. {
  322. get { return m_animationSequenceNumber++; }
  323. }
  324. public IPacketHandler PacketHandler
  325. {
  326. get { return m_PacketHandler; }
  327. }
  328. bool m_IsActive = true;
  329. public bool IsActive
  330. {
  331. get { return m_IsActive; }
  332. set { m_IsActive = value; }
  333. }
  334. public bool SendLogoutPacketWhenClosing
  335. {
  336. set { m_SendLogoutPacketWhenClosing = value; }
  337. }
  338. /* METHODS */
  339. /// <summary>
  340. /// Constructor
  341. /// </summary>
  342. public LLClientView(
  343. EndPoint remoteEP, IScene scene, AssetCache assetCache, LLPacketServer packServer,
  344. AuthenticateResponse sessionInfo, UUID agentId, UUID sessionId, uint circuitCode, EndPoint proxyEP,
  345. ClientStackUserSettings userSettings)
  346. {
  347. m_GroupsModule = scene.RequestModuleInterface<IGroupsModule>();
  348. m_moneyBalance = 1000;
  349. m_channelVersion = Utils.StringToBytes(scene.GetSimulatorVersion());
  350. InitDefaultAnimations();
  351. m_scene = scene;
  352. m_assetCache = assetCache;
  353. m_networkServer = packServer;
  354. m_agentId = agentId;
  355. m_sessionId = sessionId;
  356. m_circuitCode = circuitCode;
  357. m_userEndPoint = remoteEP;
  358. m_proxyEndPoint = proxyEP;
  359. m_firstName = sessionInfo.LoginInfo.First;
  360. m_lastName = sessionInfo.LoginInfo.Last;
  361. m_startpos = sessionInfo.LoginInfo.StartPos;
  362. if (sessionInfo.LoginInfo.SecureSession != UUID.Zero)
  363. {
  364. m_secureSessionId = sessionInfo.LoginInfo.SecureSession;
  365. }
  366. // While working on this, the BlockingQueue had me fooled for a bit.
  367. // The Blocking queue causes the thread to stop until there's something
  368. // in it to process. It's an on-purpose threadlock though because
  369. // without it, the clientloop will suck up all sim resources.
  370. m_PacketHandler = new LLPacketHandler(this, m_networkServer, userSettings);
  371. m_PacketHandler.SynchronizeClient = SynchronizeClient;
  372. RegisterLocalPacketHandlers();
  373. m_clientThread = new Thread(Start);
  374. m_clientThread.Name = "ClientThread";
  375. m_clientThread.IsBackground = true;
  376. m_clientThread.Start();
  377. ThreadTracker.Add(m_clientThread);
  378. }
  379. public void SetDebugPacketLevel(int newDebugPacketLevel)
  380. {
  381. m_debugPacketLevel = newDebugPacketLevel;
  382. }
  383. # region Client Methods
  384. private void CloseCleanup(bool shutdownCircuit)
  385. {
  386. m_scene.RemoveClient(AgentId);
  387. //m_log.InfoFormat("[CLIENTVIEW] Memory pre GC {0}", System.GC.GetTotalMemory(false));
  388. //m_log.InfoFormat("[CLIENTVIEW] Memory post GC {0}", System.GC.GetTotalMemory(true));
  389. // Send the STOP packet
  390. DisableSimulatorPacket disable = (DisableSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.DisableSimulator);
  391. OutPacket(disable, ThrottleOutPacketType.Unknown);
  392. Thread.Sleep(2000);
  393. // Shut down timers
  394. m_clientPingTimer.Stop();
  395. // This is just to give the client a reasonable chance of
  396. // flushing out all it's packets. There should probably
  397. // be a better mechanism here
  398. // We can't reach into other scenes and close the connection
  399. // We need to do this over grid communications
  400. //m_scene.CloseAllAgents(CircuitCode);
  401. // If we're not shutting down the circuit, then this is the last time we'll go here.
  402. // If we are shutting down the circuit, the UDP Server will come back here with
  403. // ShutDownCircuit = false
  404. if (!(shutdownCircuit))
  405. {
  406. GC.Collect();
  407. // Sends a KillPacket object, with which, the
  408. // blockingqueue dequeues and sees it's a killpacket
  409. // and terminates within the context of the client thread.
  410. // This ensures that it's done from within the context
  411. // of the client thread regardless of where Close() is called.
  412. KillEndDone();
  413. }
  414. }
  415. /// <summary>
  416. /// Close down the client view. This *must* be the last method called, since the last #
  417. /// statement of CloseCleanup() aborts the thread.
  418. /// </summary>
  419. /// <param name="shutdownCircuit"></param>
  420. public void Close(bool shutdownCircuit)
  421. {
  422. m_clientPingTimer.Enabled = false;
  423. m_log.DebugFormat(
  424. "[CLIENT]: Close has been called with shutdownCircuit = {0} on scene {1}",
  425. shutdownCircuit, m_scene.RegionInfo.RegionName);
  426. m_PacketHandler.Flush();
  427. // raise an event on the packet server to Shutdown the circuit
  428. // Now, if we raise the event then the packet server will call this method itself, so don't try cleanup
  429. // here otherwise we'll end up calling it twice.
  430. // FIXME: In truth, I might be wrong but this whole business of calling this method twice (with different args) looks
  431. // horribly tangly. Hopefully it should be possible to greatly simplify it.
  432. if (shutdownCircuit)
  433. {
  434. if (OnConnectionClosed != null)
  435. OnConnectionClosed(this);
  436. }
  437. else
  438. {
  439. CloseCleanup(shutdownCircuit);
  440. }
  441. }
  442. public void Kick(string message)
  443. {
  444. if (!ChildAgentStatus())
  445. {
  446. KickUserPacket kupack = (KickUserPacket)PacketPool.Instance.GetPacket(PacketType.KickUser);
  447. kupack.UserInfo.AgentID = AgentId;
  448. kupack.UserInfo.SessionID = SessionId;
  449. kupack.TargetBlock.TargetIP = (uint)0;
  450. kupack.TargetBlock.TargetPort = (ushort)0;
  451. kupack.UserInfo.Reason = Utils.StringToBytes(message);
  452. OutPacket(kupack, ThrottleOutPacketType.Task);
  453. // You must sleep here or users get no message!
  454. Thread.Sleep(500);
  455. }
  456. }
  457. public void Stop()
  458. {
  459. // Shut down timers
  460. m_clientPingTimer.Stop();
  461. }
  462. public void Restart()
  463. {
  464. // re-construct
  465. m_PacketHandler.Clear();
  466. m_clientPingTimer = new Timer(5000);
  467. m_clientPingTimer.Elapsed += new ElapsedEventHandler(CheckClientConnectivity);
  468. m_clientPingTimer.Enabled = true;
  469. }
  470. public void Terminate()
  471. {
  472. m_PacketHandler.Stop();
  473. // wait for thread stoped
  474. m_clientThread.Join();
  475. // delete circuit code
  476. m_networkServer.CloseClient(this);
  477. }
  478. #endregion
  479. # region Packet Handling
  480. public static bool AddPacketHandler(PacketType packetType, PacketMethod handler)
  481. {
  482. bool result = false;
  483. lock (PacketHandlers)
  484. {
  485. if (!PacketHandlers.ContainsKey(packetType))
  486. {
  487. PacketHandlers.Add(packetType, handler);
  488. result = true;
  489. }
  490. }
  491. return result;
  492. }
  493. public bool AddLocalPacketHandler(PacketType packetType, PacketMethod handler)
  494. {
  495. bool result = false;
  496. lock (m_packetHandlers)
  497. {
  498. if (!m_packetHandlers.ContainsKey(packetType))
  499. {
  500. m_packetHandlers.Add(packetType, handler);
  501. result = true;
  502. }
  503. }
  504. return result;
  505. }
  506. /// <summary>
  507. /// Try to process a packet using registered packet handlers
  508. /// </summary>
  509. /// <param name="packet"></param>
  510. /// <returns>True if a handler was found which successfully processed the packet.</returns>
  511. protected virtual bool ProcessPacketMethod(Packet packet)
  512. {
  513. bool result = false;
  514. bool found = false;
  515. PacketMethod method;
  516. if (m_packetHandlers.TryGetValue(packet.Type, out method))
  517. {
  518. //there is a local handler for this packet type
  519. result = method(this, packet);
  520. }
  521. else
  522. {
  523. //there is not a local handler so see if there is a Global handler
  524. lock (PacketHandlers)
  525. {
  526. found = PacketHandlers.TryGetValue(packet.Type, out method);
  527. }
  528. if (found)
  529. {
  530. result = method(this, packet);
  531. }
  532. }
  533. return result;
  534. }
  535. protected void DebugPacket(string direction, Packet packet)
  536. {
  537. if (m_debugPacketLevel > 0)
  538. {
  539. string info;
  540. if (m_debugPacketLevel < 255 && packet.Type == PacketType.AgentUpdate)
  541. return;
  542. if (m_debugPacketLevel < 254 && packet.Type == PacketType.ViewerEffect)
  543. return;
  544. if (m_debugPacketLevel < 253 && (
  545. packet.Type == PacketType.CompletePingCheck ||
  546. packet.Type == PacketType.StartPingCheck
  547. ))
  548. return;
  549. if (m_debugPacketLevel < 252 && packet.Type == PacketType.PacketAck)
  550. return;
  551. if (m_debugPacketLevel > 1)
  552. {
  553. info = packet.ToString();
  554. }
  555. else
  556. {
  557. info = packet.Type.ToString();
  558. }
  559. Console.WriteLine(m_circuitCode + ":" + direction + ": " + info);
  560. }
  561. }
  562. /// <summary>
  563. /// Main packet processing loop for the UDP component of the client session. Both incoming and outgoing
  564. /// packets are processed here.
  565. /// </summary>
  566. protected virtual void ClientLoop()
  567. {
  568. m_log.DebugFormat(
  569. "[CLIENT]: Entered main packet processing loop for {0} {1}", FirstName, LastName);
  570. while (true)
  571. {
  572. LLQueItem nextPacket = m_PacketHandler.PacketQueue.Dequeue();
  573. if (nextPacket.Incoming)
  574. {
  575. DebugPacket("IN", nextPacket.Packet);
  576. m_PacketHandler.ProcessInPacket(nextPacket);
  577. }
  578. else
  579. {
  580. DebugPacket("OUT", nextPacket.Packet);
  581. m_PacketHandler.ProcessOutPacket(nextPacket);
  582. }
  583. }
  584. }
  585. # endregion
  586. protected int m_terrainCheckerCount;
  587. /// <summary>
  588. /// Event handler for check client timer
  589. /// Checks to ensure that the client is still connected. If the client has failed to respond to many pings
  590. /// in succession then close down the connection.
  591. /// </summary>
  592. /// <param name="sender"></param>
  593. /// <param name="e"></param>
  594. protected void CheckClientConnectivity(object sender, ElapsedEventArgs e)
  595. {
  596. if (m_PacketHandler.PacketsReceived == m_inPacketsChecked)
  597. {
  598. // no packet came in since the last time we checked...
  599. m_probesWithNoIngressPackets++;
  600. if ((m_probesWithNoIngressPackets > 30 && !m_clientBlocked) // agent active
  601. || (m_probesWithNoIngressPackets > 90 && m_clientBlocked)) // agent paused
  602. {
  603. m_clientPingTimer.Enabled = false;
  604. m_log.WarnFormat(
  605. "[CLIENT]: Client for agent {0} {1} has stopped responding to pings. Closing connection",
  606. Name, AgentId);
  607. if (OnConnectionClosed != null)
  608. {
  609. OnConnectionClosed(this);
  610. }
  611. }
  612. else
  613. {
  614. // this will normally trigger at least one packet (ping response)
  615. SendStartPingCheck(0);
  616. }
  617. }
  618. else
  619. {
  620. // Something received in the meantime - we can reset the counters
  621. m_probesWithNoIngressPackets = 0;
  622. // ... and store the current number of packets received to find out if another one got in on the next cycle
  623. m_inPacketsChecked = m_PacketHandler.PacketsReceived;
  624. }
  625. }
  626. # region Setup
  627. /// <summary>
  628. /// Starts up the timers to check the client and resend unacked packets
  629. /// Adds the client to the OpenSim.Region.Environment.Scenes.Scene
  630. /// </summary>
  631. protected virtual void InitNewClient()
  632. {
  633. //this.UploadAssets = new AgentAssetUpload(this, m_assetCache, m_inventoryCache);
  634. // Establish our two timers. We could probably get this down to one
  635. // Ping the client regularly to check that it's still there
  636. m_clientPingTimer = new Timer(5000);
  637. m_clientPingTimer.Elapsed += new ElapsedEventHandler(CheckClientConnectivity);
  638. m_clientPingTimer.Enabled = true;
  639. m_scene.AddNewClient(this, true);
  640. }
  641. /// <summary>
  642. /// Start a user session. This method lies at the base of the entire client thread.
  643. /// </summary>
  644. protected virtual void Start()
  645. {
  646. //tell this thread we are using the culture set up for the sim (currently hardcoded to en_US)
  647. //otherwise it will override this and use the system default
  648. Culture.SetCurrentCulture();
  649. try
  650. {
  651. // This sets up all the timers
  652. InitNewClient();
  653. ClientLoop();
  654. }
  655. catch (System.Exception e)
  656. {
  657. if (e is ThreadAbortException)
  658. throw e;
  659. if (StatsManager.SimExtraStats != null)
  660. StatsManager.SimExtraStats.AddAbnormalClientThreadTermination();
  661. // Don't let a failure in an individual client thread crash the whole sim.
  662. m_log.ErrorFormat(
  663. "[CLIENT]: Client thread for {0} {1} crashed. Logging them out. Exception {2}", Name, AgentId, e);
  664. try
  665. {
  666. // Make an attempt to alert the user that their session has crashed
  667. AgentAlertMessagePacket packet
  668. = BuildAgentAlertPacket(
  669. "Unfortunately the session for this client on the server has crashed.\n"
  670. + "Any further actions taken will not be processed.\n"
  671. + "Please relog", true);
  672. LLQueItem item = new LLQueItem();
  673. item.Packet = packet;
  674. m_PacketHandler.ProcessOutPacket(item);
  675. // There may be a better way to do this. Perhaps kick? Not sure this propogates notifications to
  676. // listeners yet, though.
  677. Logout(this);
  678. }
  679. catch (Exception e2)
  680. {
  681. if (e2 is ThreadAbortException)
  682. throw e2;
  683. m_log.ErrorFormat("[CLIENT]: Further exception thrown on forced session logout. {0}", e2);
  684. }
  685. }
  686. }
  687. # endregion
  688. // Previously ClientView.API partial class
  689. public event GenericMessage OnGenericMessage;
  690. public event Action<IClientAPI> OnLogout;
  691. public event ObjectPermissions OnObjectPermissions;
  692. public event Action<IClientAPI> OnConnectionClosed;
  693. public event ViewerEffectEventHandler OnViewerEffect;
  694. public event ImprovedInstantMessage OnInstantMessage;
  695. public event ChatMessage OnChatFromClient;
  696. public event TextureRequest OnRequestTexture;
  697. public event RezObject OnRezObject;
  698. public event DeRezObject OnDeRezObject;
  699. public event ModifyTerrain OnModifyTerrain;
  700. public event Action<IClientAPI> OnRegionHandShakeReply;
  701. public event GenericCall2 OnRequestWearables;
  702. public event SetAppearance OnSetAppearance;
  703. public event AvatarNowWearing OnAvatarNowWearing;
  704. public event RezSingleAttachmentFromInv OnRezSingleAttachmentFromInv;
  705. public event UUIDNameRequest OnDetachAttachmentIntoInv;
  706. public event ObjectAttach OnObjectAttach;
  707. public event ObjectDeselect OnObjectDetach;
  708. public event ObjectDrop OnObjectDrop;
  709. public event GenericCall2 OnCompleteMovementToRegion;
  710. public event UpdateAgent OnAgentUpdate;
  711. public event AgentRequestSit OnAgentRequestSit;
  712. public event AgentSit OnAgentSit;
  713. public event AvatarPickerRequest OnAvatarPickerRequest;
  714. public event StartAnim OnStartAnim;
  715. public event StopAnim OnStopAnim;
  716. public event Action<IClientAPI> OnRequestAvatarsData;
  717. public event LinkObjects OnLinkObjects;
  718. public event DelinkObjects OnDelinkObjects;
  719. public event GrabObject OnGrabObject;
  720. public event ObjectSelect OnDeGrabObject;
  721. public event ObjectDuplicate OnObjectDuplicate;
  722. public event ObjectDuplicateOnRay OnObjectDuplicateOnRay;
  723. public event MoveObject OnGrabUpdate;
  724. public event AddNewPrim OnAddPrim;
  725. public event RequestGodlikePowers OnRequestGodlikePowers;
  726. public event GodKickUser OnGodKickUser;
  727. public event ObjectExtraParams OnUpdateExtraParams;
  728. public event UpdateShape OnUpdatePrimShape;
  729. public event ObjectSelect OnObjectSelect;
  730. public event ObjectDeselect OnObjectDeselect;
  731. public event GenericCall7 OnObjectDescription;
  732. public event GenericCall7 OnObjectName;
  733. public event GenericCall7 OnObjectClickAction;
  734. public event GenericCall7 OnObjectMaterial;
  735. public event ObjectIncludeInSearch OnObjectIncludeInSearch;
  736. public event RequestObjectPropertiesFamily OnRequestObjectPropertiesFamily;
  737. public event UpdatePrimFlags OnUpdatePrimFlags;
  738. public event UpdatePrimTexture OnUpdatePrimTexture;
  739. public event UpdateVector OnUpdatePrimGroupPosition;
  740. public event UpdateVector OnUpdatePrimSinglePosition;
  741. public event UpdatePrimRotation OnUpdatePrimGroupRotation;
  742. public event UpdatePrimSingleRotation OnUpdatePrimSingleRotation;
  743. public event UpdatePrimGroupRotation OnUpdatePrimGroupMouseRotation;
  744. public event UpdateVector OnUpdatePrimScale;
  745. public event UpdateVector OnUpdatePrimGroupScale;
  746. public event StatusChange OnChildAgentStatus;
  747. public event GenericCall2 OnStopMovement;
  748. public event Action<UUID> OnRemoveAvatar;
  749. public event RequestMapBlocks OnRequestMapBlocks;
  750. public event RequestMapName OnMapNameRequest;
  751. public event TeleportLocationRequest OnTeleportLocationRequest;
  752. public event TeleportLandmarkRequest OnTeleportLandmarkRequest;
  753. public event DisconnectUser OnDisconnectUser;
  754. public event RequestAvatarProperties OnRequestAvatarProperties;
  755. public event SetAlwaysRun OnSetAlwaysRun;
  756. public event FetchInventory OnAgentDataUpdateRequest;
  757. public event FetchInventory OnUserInfoRequest;
  758. public event TeleportLocationRequest OnSetStartLocationRequest;
  759. public event UpdateAvatarProperties OnUpdateAvatarProperties;
  760. public event CreateNewInventoryItem OnCreateNewInventoryItem;
  761. public event CreateInventoryFolder OnCreateNewInventoryFolder;
  762. public event UpdateInventoryFolder OnUpdateInventoryFolder;
  763. public event MoveInventoryFolder OnMoveInventoryFolder;
  764. public event FetchInventoryDescendents OnFetchInventoryDescendents;
  765. public event PurgeInventoryDescendents OnPurgeInventoryDescendents;
  766. public event FetchInventory OnFetchInventory;
  767. public event RequestTaskInventory OnRequestTaskInventory;
  768. public event UpdateInventoryItem OnUpdateInventoryItem;
  769. public event CopyInventoryItem OnCopyInventoryItem;
  770. public event MoveInventoryItem OnMoveInventoryItem;
  771. public event RemoveInventoryItem OnRemoveInventoryItem;
  772. public event RemoveInventoryFolder OnRemoveInventoryFolder;
  773. public event UDPAssetUploadRequest OnAssetUploadRequest;
  774. public event XferReceive OnXferReceive;
  775. public event RequestXfer OnRequestXfer;
  776. public event ConfirmXfer OnConfirmXfer;
  777. public event RezScript OnRezScript;
  778. public event UpdateTaskInventory OnUpdateTaskInventory;
  779. public event MoveTaskInventory OnMoveTaskItem;
  780. public event RemoveTaskInventory OnRemoveTaskItem;
  781. public event RequestAsset OnRequestAsset;
  782. public event UUIDNameRequest OnNameFromUUIDRequest;
  783. public event ParcelAccessListRequest OnParcelAccessListRequest;
  784. public event ParcelAccessListUpdateRequest OnParcelAccessListUpdateRequest;
  785. public event ParcelPropertiesRequest OnParcelPropertiesRequest;
  786. public event ParcelDivideRequest OnParcelDivideRequest;
  787. public event ParcelJoinRequest OnParcelJoinRequest;
  788. public event ParcelPropertiesUpdateRequest OnParcelPropertiesUpdateRequest;
  789. public event ParcelSelectObjects OnParcelSelectObjects;
  790. public event ParcelObjectOwnerRequest OnParcelObjectOwnerRequest;
  791. public event ParcelAbandonRequest OnParcelAbandonRequest;
  792. public event ParcelGodForceOwner OnParcelGodForceOwner;
  793. public event ParcelReclaim OnParcelReclaim;
  794. public event ParcelReturnObjectsRequest OnParcelReturnObjectsRequest;
  795. public event RegionInfoRequest OnRegionInfoRequest;
  796. public event EstateCovenantRequest OnEstateCovenantRequest;
  797. public event FriendActionDelegate OnApproveFriendRequest;
  798. public event FriendActionDelegate OnDenyFriendRequest;
  799. public event FriendshipTermination OnTerminateFriendship;
  800. public event MoneyTransferRequest OnMoneyTransferRequest;
  801. public event EconomyDataRequest OnEconomyDataRequest;
  802. public event MoneyBalanceRequest OnMoneyBalanceRequest;
  803. public event ParcelBuy OnParcelBuy;
  804. public event UUIDNameRequest OnTeleportHomeRequest;
  805. public event UUIDNameRequest OnUUIDGroupNameRequest;
  806. public event ScriptAnswer OnScriptAnswer;
  807. public event RequestPayPrice OnRequestPayPrice;
  808. public event ObjectSaleInfo OnObjectSaleInfo;
  809. public event ObjectBuy OnObjectBuy;
  810. public event BuyObjectInventory OnBuyObjectInventory;
  811. public event AgentSit OnUndo;
  812. public event ForceReleaseControls OnForceReleaseControls;
  813. public event GodLandStatRequest OnLandStatRequest;
  814. public event RequestObjectPropertiesFamily OnObjectGroupRequest;
  815. public event DetailedEstateDataRequest OnDetailedEstateDataRequest;
  816. public event SetEstateFlagsRequest OnSetEstateFlagsRequest;
  817. public event SetEstateTerrainBaseTexture OnSetEstateTerrainBaseTexture;
  818. public event SetEstateTerrainDetailTexture OnSetEstateTerrainDetailTexture;
  819. public event SetEstateTerrainTextureHeights OnSetEstateTerrainTextureHeights;
  820. public event CommitEstateTerrainTextureRequest OnCommitEstateTerrainTextureRequest;
  821. public event SetRegionTerrainSettings OnSetRegionTerrainSettings;
  822. public event BakeTerrain OnBakeTerrain;
  823. public event EstateChangeInfo OnEstateChangeInfo;
  824. public event EstateRestartSimRequest OnEstateRestartSimRequest;
  825. public event EstateChangeCovenantRequest OnEstateChangeCovenantRequest;
  826. public event UpdateEstateAccessDeltaRequest OnUpdateEstateAccessDeltaRequest;
  827. public event SimulatorBlueBoxMessageRequest OnSimulatorBlueBoxMessageRequest;
  828. public event EstateBlueBoxMessageRequest OnEstateBlueBoxMessageRequest;
  829. public event EstateDebugRegionRequest OnEstateDebugRegionRequest;
  830. public event EstateTeleportOneUserHomeRequest OnEstateTeleportOneUserHomeRequest;
  831. public event EstateTeleportAllUsersHomeRequest OnEstateTeleportAllUsersHomeRequest;
  832. public event RegionHandleRequest OnRegionHandleRequest;
  833. public event ParcelInfoRequest OnParcelInfoRequest;
  834. public event ScriptReset OnScriptReset;
  835. public event GetScriptRunning OnGetScriptRunning;
  836. public event SetScriptRunning OnSetScriptRunning;
  837. public event UpdateVector OnAutoPilotGo;
  838. public event TerrainUnacked OnUnackedTerrain;
  839. public event ActivateGesture OnActivateGesture;
  840. public event DeactivateGesture OnDeactivateGesture;
  841. public event ObjectOwner OnObjectOwner;
  842. public event DirPlacesQuery OnDirPlacesQuery;
  843. public event DirFindQuery OnDirFindQuery;
  844. public event DirLandQuery OnDirLandQuery;
  845. public event DirPopularQuery OnDirPopularQuery;
  846. public event DirClassifiedQuery OnDirClassifiedQuery;
  847. public event EventInfoRequest OnEventInfoRequest;
  848. public event ParcelSetOtherCleanTime OnParcelSetOtherCleanTime;
  849. public event MapItemRequest OnMapItemRequest;
  850. public event OfferCallingCard OnOfferCallingCard;
  851. public event AcceptCallingCard OnAcceptCallingCard;
  852. public event DeclineCallingCard OnDeclineCallingCard;
  853. // voire si c'est necessaire
  854. public void ActivateGesture(UUID assetId, UUID gestureId)
  855. {
  856. }
  857. public void DeactivateGesture(UUID assetId, UUID gestureId)
  858. {
  859. }
  860. #region Scene/Avatar to Client
  861. public void SendRegionHandshake(RegionInfo regionInfo, RegionHandshakeArgs args)
  862. {
  863. RegionHandshakePacket handshake = (RegionHandshakePacket)PacketPool.Instance.GetPacket(PacketType.RegionHandshake);
  864. handshake.RegionInfo.BillableFactor = args.billableFactor;
  865. handshake.RegionInfo.IsEstateManager = args.isEstateManager;
  866. handshake.RegionInfo.TerrainHeightRange00 = args.terrainHeightRange0;
  867. handshake.RegionInfo.TerrainHeightRange01 = args.terrainHeightRange1;
  868. handshake.RegionInfo.TerrainHeightRange10 = args.terrainHeightRange2;
  869. handshake.RegionInfo.TerrainHeightRange11 = args.terrainHeightRange3;
  870. handshake.RegionInfo.TerrainStartHeight00 = args.terrainStartHeight0;
  871. handshake.RegionInfo.TerrainStartHeight01 = args.terrainStartHeight1;
  872. handshake.RegionInfo.TerrainStartHeight10 = args.terrainStartHeight2;
  873. handshake.RegionInfo.TerrainStartHeight11 = args.terrainStartHeight3;
  874. handshake.RegionInfo.SimAccess = args.simAccess;
  875. handshake.RegionInfo.WaterHeight = args.waterHeight;
  876. handshake.RegionInfo.RegionFlags = args.regionFlags;
  877. handshake.RegionInfo.SimName = Utils.StringToBytes(args.regionName);
  878. handshake.RegionInfo.SimOwner = args.SimOwner;
  879. handshake.RegionInfo.TerrainBase0 = args.terrainBase0;
  880. handshake.RegionInfo.TerrainBase1 = args.terrainBase1;
  881. handshake.RegionInfo.TerrainBase2 = args.terrainBase2;
  882. handshake.RegionInfo.TerrainBase3 = args.terrainBase3;
  883. handshake.RegionInfo.TerrainDetail0 = args.terrainDetail0;
  884. handshake.RegionInfo.TerrainDetail1 = args.terrainDetail1;
  885. handshake.RegionInfo.TerrainDetail2 = args.terrainDetail2;
  886. handshake.RegionInfo.TerrainDetail3 = args.terrainDetail3;
  887. handshake.RegionInfo.CacheID = UUID.Random(); //I guess this is for the client to remember an old setting?
  888. OutPacket(handshake, ThrottleOutPacketType.Task);
  889. }
  890. /// <summary>
  891. ///
  892. /// </summary>
  893. /// <param name="regInfo"></param>
  894. public void MoveAgentIntoRegion(RegionInfo regInfo, Vector3 pos, Vector3 look)
  895. {
  896. AgentMovementCompletePacket mov = (AgentMovementCompletePacket)PacketPool.Instance.GetPacket(PacketType.AgentMovementComplete);
  897. mov.SimData.ChannelVersion = m_channelVersion;
  898. mov.AgentData.SessionID = m_sessionId;
  899. mov.AgentData.AgentID = AgentId;
  900. mov.Data.RegionHandle = regInfo.RegionHandle;
  901. mov.Data.Timestamp = (uint)Util.UnixTimeSinceEpoch();
  902. if ((pos.X == 0) && (pos.Y == 0) && (pos.Z == 0))
  903. {
  904. mov.Data.Position = m_startpos;
  905. }
  906. else
  907. {
  908. mov.Data.Position = pos;
  909. }
  910. mov.Data.LookAt = look;
  911. // Hack to get this out immediately and skip the throttles
  912. OutPacket(mov, ThrottleOutPacketType.Unknown);
  913. }
  914. /// <summary>
  915. ///
  916. /// </summary>
  917. /// <param name="message"></param>
  918. /// <param name="type"></param>
  919. /// <param name="fromPos"></param>
  920. /// <param name="fromName"></param>
  921. /// <param name="fromAgentID"></param>
  922. public void SendChatMessage(string message, byte type, Vector3 fromPos, string fromName,
  923. UUID fromAgentID, byte source, byte audible)
  924. {
  925. SendChatMessage(Utils.StringToBytes(message), type, fromPos, fromName, fromAgentID, source, audible);
  926. }
  927. public void SendChatMessage(byte[] message, byte type, Vector3 fromPos, string fromName,
  928. UUID fromAgentID, byte source, byte audible)
  929. {
  930. ChatFromSimulatorPacket reply = (ChatFromSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.ChatFromSimulator);
  931. reply.ChatData.Audible = audible;
  932. reply.ChatData.Message = message;
  933. reply.ChatData.ChatType = type;
  934. reply.ChatData.SourceType = source;
  935. reply.ChatData.Position = fromPos;
  936. reply.ChatData.FromName = Utils.StringToBytes(fromName);
  937. reply.ChatData.OwnerID = fromAgentID;
  938. reply.ChatData.SourceID = fromAgentID;
  939. OutPacket(reply, ThrottleOutPacketType.Task);
  940. }
  941. /// <summary>
  942. /// Send an instant message to this client
  943. /// </summary>
  944. /// <param name="message"></param>
  945. /// <param name="target"></param>
  946. public void SendInstantMessage(UUID fromAgent, UUID fromAgentSession, string message, UUID toAgent,
  947. UUID imSessionID, string fromName, byte dialog, uint timeStamp)
  948. {
  949. SendInstantMessage(
  950. fromAgent, fromAgentSession, message, toAgent,
  951. imSessionID, fromName, dialog, timeStamp, false, new byte[0]);
  952. }
  953. /// <summary>
  954. /// Send an instant message to this client
  955. /// </summary>
  956. /// <param name="message"></param>
  957. /// <param name="target"></param>
  958. public void SendInstantMessage(UUID fromAgent, UUID fromAgentSession, string message, UUID toAgent,
  959. UUID imSessionID, string fromName, byte dialog, uint timeStamp,
  960. bool fromGroup, byte[] binaryBucket)
  961. {
  962. if (((Scene)(this.m_scene)).ExternalChecks.ExternalChecksCanInstantMessage(fromAgent, toAgent))
  963. {
  964. ImprovedInstantMessagePacket msg
  965. = (ImprovedInstantMessagePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedInstantMessage);
  966. msg.AgentData.AgentID = fromAgent;
  967. msg.AgentData.SessionID = fromAgentSession;
  968. msg.MessageBlock.FromAgentName = Utils.StringToBytes(fromName);
  969. msg.MessageBlock.Dialog = dialog;
  970. msg.MessageBlock.FromGroup = fromGroup;
  971. msg.MessageBlock.ID = imSessionID;
  972. msg.MessageBlock.Offline = 0;
  973. msg.MessageBlock.ParentEstateID = 0;
  974. msg.MessageBlock.Position = new Vector3();
  975. msg.MessageBlock.RegionID = UUID.Random();
  976. msg.MessageBlock.Timestamp = timeStamp;
  977. msg.MessageBlock.ToAgentID = toAgent;
  978. msg.MessageBlock.Message = Utils.StringToBytes(message);
  979. msg.MessageBlock.BinaryBucket = binaryBucket;
  980. OutPacket(msg, ThrottleOutPacketType.Task);
  981. }
  982. }
  983. public void SendGenericMessage(string method, List<string> message)
  984. {
  985. GenericMessagePacket gmp = new GenericMessagePacket();
  986. gmp.MethodData.Method = Utils.StringToBytes(method);
  987. gmp.ParamList = new GenericMessagePacket.ParamListBlock[message.Count];
  988. int i = 0;
  989. foreach (string val in message)
  990. {
  991. gmp.ParamList[i] = new GenericMessagePacket.ParamListBlock();
  992. gmp.ParamList[i++].Parameter = Utils.StringToBytes(val);
  993. }
  994. OutPacket(gmp, ThrottleOutPacketType.Task);
  995. }
  996. /// <summary>
  997. /// Send the region heightmap to the client
  998. /// </summary>
  999. /// <param name="map">heightmap</param>
  1000. public virtual void SendLayerData(float[] map)
  1001. {
  1002. ThreadPool.QueueUserWorkItem(new WaitCallback(DoSendLayerData), (object)map);
  1003. }
  1004. /// <summary>
  1005. /// Send terrain layer information to the client.
  1006. /// </summary>
  1007. /// <param name="o"></param>
  1008. private void DoSendLayerData(object o)
  1009. {
  1010. float[] map = (float[])o;
  1011. try
  1012. {
  1013. for (int y = 0; y < 16; y++)
  1014. {
  1015. // For some terrains, sending more than one terrain patch at once results in a libsecondlife exception
  1016. // see http://opensimulator.org/mantis/view.php?id=1662
  1017. //for (int x = 0; x < 16; x += 4)
  1018. //{
  1019. // SendLayerPacket(map, y, x);
  1020. // Thread.Sleep(150);
  1021. //}
  1022. for (int x = 0; x < 16; x++)
  1023. {
  1024. SendLayerData(x, y, map);
  1025. Thread.Sleep(35);
  1026. }
  1027. }
  1028. }
  1029. catch (Exception e)
  1030. {
  1031. m_log.Warn("[CLIENT]: ClientView.API.cs: SendLayerData() - Failed with exception " + e.ToString());
  1032. }
  1033. }
  1034. /// <summary>
  1035. /// Sends a set of four patches (x, x+1, ..., x+3) to the client
  1036. /// </summary>
  1037. /// <param name="map">heightmap</param>
  1038. /// <param name="px">X coordinate for patches 0..12</param>
  1039. /// <param name="py">Y coordinate for patches 0..15</param>
  1040. // private void SendLayerPacket(float[] map, int y, int x)
  1041. // {
  1042. // int[] patches = new int[4];
  1043. // patches[0] = x + 0 + y * 16;
  1044. // patches[1] = x + 1 + y * 16;
  1045. // patches[2] = x + 2 + y * 16;
  1046. // patches[3] = x + 3 + y * 16;
  1047. // Packet layerpack = LLClientView.TerrainManager.CreateLandPacket(map, patches);
  1048. // OutPacket(layerpack, ThrottleOutPacketType.Land);
  1049. // }
  1050. /// <summary>
  1051. /// Sends a specified patch to a client
  1052. /// </summary>
  1053. /// <param name="px">Patch coordinate (x) 0..15</param>
  1054. /// <param name="py">Patch coordinate (y) 0..15</param>
  1055. /// <param name="map">heightmap</param>
  1056. public void SendLayerData(int px, int py, float[] map)
  1057. {
  1058. try
  1059. {
  1060. int[] patches = new int[1];
  1061. int patchx, patchy;
  1062. patchx = px;
  1063. patchy = py;
  1064. patches[0] = patchx + 0 + patchy * 16;
  1065. LayerDataPacket layerpack = TerrainCompressor.CreateLandPacket(map, patches);
  1066. layerpack.Header.Zerocoded = true;
  1067. OutPacket(layerpack, ThrottleOutPacketType.Land);
  1068. }
  1069. catch (Exception e)
  1070. {
  1071. m_log.Warn("[client]: ClientView.API.cs: SendLayerData() - Failed with exception " + e.ToString());
  1072. }
  1073. }
  1074. /// <summary>
  1075. /// Send the region heightmap to the client
  1076. /// </summary>
  1077. /// <param name="windSpeeds">16x16 array of wind speeds</param>
  1078. public virtual void SendWindData(Vector2[] windSpeeds)
  1079. {
  1080. ThreadPool.QueueUserWorkItem(new WaitCallback(DoSendWindData), (object)windSpeeds);
  1081. }
  1082. /// <summary>
  1083. /// Send terrain layer information to the client.
  1084. /// </summary>
  1085. /// <param name="o"></param>
  1086. private void DoSendWindData(object o)
  1087. {
  1088. Vector2[] windSpeeds = (Vector2[])o;
  1089. TerrainPatch[] patches = new TerrainPatch[2];
  1090. patches[0] = new TerrainPatch();
  1091. patches[0].Data = new float[16 * 16];
  1092. patches[1] = new TerrainPatch();
  1093. patches[1].Data = new float[16 * 16];
  1094. for (int y = 0; y < 16; y++)
  1095. {
  1096. for (int x = 0; x < 16; x++)
  1097. {
  1098. patches[0].Data[y * 16 + x] = windSpeeds[y * 16 + x].X;
  1099. patches[1].Data[y * 16 + x] = windSpeeds[y * 16 + x].Y;
  1100. }
  1101. }
  1102. LayerDataPacket layerpack = TerrainCompressor.CreateLayerDataPacket(patches, TerrainPatch.LayerType.Wind);
  1103. layerpack.Header.Zerocoded = true;
  1104. OutPacket(layerpack, ThrottleOutPacketType.Wind);
  1105. }
  1106. /// <summary>
  1107. /// Sends a set of four patches (x, x+1, ..., x+3) to the client
  1108. /// </summary>
  1109. /// <param name="map">heightmap</param>
  1110. /// <param name="px">X coordinate for patches 0..12</param>
  1111. /// <param name="py">Y coordinate for patches 0..15</param>
  1112. // private void SendLayerPacket(float[] map, int y, int x)
  1113. // {
  1114. // int[] patches = new int[4];
  1115. // patches[0] = x + 0 + y * 16;
  1116. // patches[1] = x + 1 + y * 16;
  1117. // patches[2] = x + 2 + y * 16;
  1118. // patches[3] = x + 3 + y * 16;
  1119. // Packet layerpack = LLClientView.TerrainManager.CreateLandPacket(map, patches);
  1120. // OutPacket(layerpack, ThrottleOutPacketType.Land);
  1121. // }
  1122. /// <summary>
  1123. /// Tell the client that the given neighbour region is ready to receive a child agent.
  1124. /// </summary>
  1125. /// <param name="neighbourHandle"></param>
  1126. /// <param name="neighbourIP"></param>
  1127. /// <param name="neighbourPort"></param>
  1128. public void InformClientOfNeighbour(ulong neighbourHandle, IPEndPoint neighbourEndPoint)
  1129. {
  1130. IPAddress neighbourIP = neighbourEndPoint.Address;
  1131. ushort neighbourPort = (ushort)neighbourEndPoint.Port;
  1132. EnableSimulatorPacket enablesimpacket = (EnableSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.EnableSimulator);
  1133. // TODO: don't create new blocks if recycling an old packet
  1134. enablesimpacket.SimulatorInfo = new EnableSimulatorPacket.SimulatorInfoBlock();
  1135. enablesimpacket.SimulatorInfo.Handle = neighbourHandle;
  1136. byte[] byteIP = neighbourIP.GetAddressBytes();
  1137. enablesimpacket.SimulatorInfo.IP = (uint)byteIP[3] << 24;
  1138. enablesimpacket.SimulatorInfo.IP += (uint)byteIP[2] << 16;
  1139. enablesimpacket.SimulatorInfo.IP += (uint)byteIP[1] << 8;
  1140. enablesimpacket.SimulatorInfo.IP += (uint)byteIP[0];
  1141. enablesimpacket.SimulatorInfo.Port = neighbourPort;
  1142. OutPacket(enablesimpacket, ThrottleOutPacketType.Task);
  1143. }
  1144. /// <summary>
  1145. ///
  1146. /// </summary>
  1147. /// <returns></returns>
  1148. public AgentCircuitData RequestClientInfo()
  1149. {
  1150. AgentCircuitData agentData = new AgentCircuitData();
  1151. agentData.AgentID = AgentId;
  1152. agentData.SessionID = m_sessionId;
  1153. agentData.SecureSessionID = SecureSessionId;
  1154. agentData.circuitcode = m_circuitCode;
  1155. agentData.child = false;
  1156. agentData.firstname = m_firstName;
  1157. agentData.lastname = m_lastName;
  1158. agentData.CapsPath = m_scene.GetCapsPath(m_agentId);
  1159. return agentData;
  1160. }
  1161. public void CrossRegion(ulong newRegionHandle, Vector3 pos, Vector3 lookAt, IPEndPoint externalIPEndPoint,
  1162. string capsURL)
  1163. {
  1164. Vector3 look = new Vector3(lookAt.X * 10, lookAt.Y * 10, lookAt.Z * 10);
  1165. //CrossedRegionPacket newSimPack = (CrossedRegionPacket)PacketPool.Instance.GetPacket(PacketType.CrossedRegion);
  1166. CrossedRegionPacket newSimPack = new CrossedRegionPacket();
  1167. // TODO: don't create new blocks if recycling an old packet
  1168. newSimPack.AgentData = new CrossedRegionPacket.AgentDataBlock();
  1169. newSimPack.AgentData.AgentID = AgentId;
  1170. newSimPack.AgentData.SessionID = m_sessionId;
  1171. newSimPack.Info = new CrossedRegionPacket.InfoBlock();
  1172. newSimPack.Info.Position = pos;
  1173. newSimPack.Info.LookAt = look;
  1174. newSimPack.RegionData = new CrossedRegionPacket.RegionDataBlock();
  1175. newSimPack.RegionData.RegionHandle = newRegionHandle;
  1176. byte[] byteIP = externalIPEndPoint.Address.GetAddressBytes();
  1177. newSimPack.RegionData.SimIP = (uint)byteIP[3] << 24;
  1178. newSimPack.RegionData.SimIP += (uint)byteIP[2] << 16;
  1179. newSimPack.RegionData.SimIP += (uint)byteIP[1] << 8;
  1180. newSimPack.RegionData.SimIP += (uint)byteIP[0];
  1181. newSimPack.RegionData.SimPort = (ushort)externalIPEndPoint.Port;
  1182. newSimPack.RegionData.SeedCapability = Utils.StringToBytes(capsURL);
  1183. // Hack to get this out immediately and skip throttles
  1184. OutPacket(newSimPack, ThrottleOutPacketType.Unknown);
  1185. }
  1186. internal void SendMapBlockSplit(List<MapBlockData> mapBlocks, uint flag)
  1187. {
  1188. MapBlockReplyPacket mapReply = (MapBlockReplyPacket)PacketPool.Instance.GetPacket(PacketType.MapBlockReply);
  1189. // TODO: don't create new blocks if recycling an old packet
  1190. MapBlockData[] mapBlocks2 = mapBlocks.ToArray();
  1191. mapReply.AgentData.AgentID = AgentId;
  1192. mapReply.Data = new MapBlockReplyPacket.DataBlock[mapBlocks2.Length];
  1193. mapReply.AgentData.Flags = flag;
  1194. for (int i = 0; i < mapBlocks2.Length; i++)
  1195. {
  1196. mapReply.Data[i] = new MapBlockReplyPacket.DataBlock();
  1197. mapReply.Data[i].MapImageID = mapBlocks2[i].MapImageId;
  1198. //m_log.Warn(mapBlocks2[i].MapImageId.ToString());
  1199. mapReply.Data[i].X = mapBlocks2[i].X;
  1200. mapReply.Data[i].Y = mapBlocks2[i].Y;
  1201. mapReply.Data[i].WaterHeight = mapBlocks2[i].WaterHeight;
  1202. mapReply.Data[i].Name = Utils.StringToBytes(mapBlocks2[i].Name);
  1203. mapReply.Data[i].RegionFlags = mapBlocks2[i].RegionFlags;
  1204. mapReply.Data[i].Access = mapBlocks2[i].Access;
  1205. mapReply.Data[i].Agents = mapBlocks2[i].Agents;
  1206. }
  1207. OutPacket(mapReply, ThrottleOutPacketType.Land);
  1208. }
  1209. public void SendMapBlock(List<MapBlockData> mapBlocks, uint flag)
  1210. {
  1211. MapBlockData[] mapBlocks2 = mapBlocks.ToArray();
  1212. int maxsend = 10;
  1213. //int packets = Math.Ceiling(mapBlocks2.Length / maxsend);
  1214. List<MapBlockData> sendingBlocks = new List<MapBlockData>();
  1215. for (int i = 0; i < mapBlocks2.Length; i++)
  1216. {
  1217. sendingBlocks.Add(mapBlocks2[i]);
  1218. if (((i + 1) == mapBlocks2.Length) || (((i + 1) % maxsend) == 0))
  1219. {
  1220. SendMapBlockSplit(sendingBlocks, flag);
  1221. sendingBlocks = new List<MapBlockData>();
  1222. }
  1223. }
  1224. }
  1225. public void SendLocalTeleport(Vector3 position, Vector3 lookAt, uint flags)
  1226. {
  1227. TeleportLocalPacket tpLocal = (TeleportLocalPacket)PacketPool.Instance.GetPacket(PacketType.TeleportLocal);
  1228. tpLocal.Info.AgentID = AgentId;
  1229. tpLocal.Info.TeleportFlags = flags;
  1230. tpLocal.Info.LocationID = 2;
  1231. tpLocal.Info.LookAt = lookAt;
  1232. tpLocal.Info.Position = position;
  1233. // Hack to get this out immediately and skip throttles
  1234. OutPacket(tpLocal, ThrottleOutPacketType.Unknown);
  1235. }
  1236. public void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint newRegionEndPoint, uint locationID,
  1237. uint flags, string capsURL)
  1238. {
  1239. //TeleportFinishPacket teleport = (TeleportFinishPacket)PacketPool.Instance.GetPacket(PacketType.TeleportFinish);
  1240. TeleportFinishPacket teleport = new TeleportFinishPacket();
  1241. teleport.Info.AgentID = AgentId;
  1242. teleport.Info.RegionHandle = regionHandle;
  1243. teleport.Info.SimAccess = simAccess;
  1244. teleport.Info.SeedCapability = Utils.StringToBytes(capsURL);
  1245. IPAddress oIP = newRegionEndPoint.Address;
  1246. byte[] byteIP = oIP.GetAddressBytes();
  1247. uint ip = (uint)byteIP[3] << 24;
  1248. ip += (uint)byteIP[2] << 16;
  1249. ip += (uint)byteIP[1] << 8;
  1250. ip += (uint)byteIP[0];
  1251. teleport.Info.SimIP = ip;
  1252. teleport.Info.SimPort = (ushort)newRegionEndPoint.Port;
  1253. teleport.Info.LocationID = 4;
  1254. teleport.Info.TeleportFlags = 1 << 4;
  1255. // Hack to get this out immediately and skip throttles.
  1256. OutPacket(teleport, ThrottleOutPacketType.Unknown);
  1257. }
  1258. /// <summary>
  1259. /// Inform the client that a teleport attempt has failed
  1260. /// </summary>
  1261. public void SendTeleportFailed(string reason)
  1262. {
  1263. TeleportFailedPacket tpFailed = (TeleportFailedPacket)PacketPool.Instance.GetPacket(PacketType.TeleportFailed);
  1264. tpFailed.Info.AgentID = AgentId;
  1265. tpFailed.Info.Reason = Utils.StringToBytes(reason);
  1266. // Hack to get this out immediately and skip throttles
  1267. OutPacket(tpFailed, ThrottleOutPacketType.Unknown);
  1268. }
  1269. /// <summary>
  1270. ///
  1271. /// </summary>
  1272. public void SendTeleportLocationStart()
  1273. {
  1274. //TeleportStartPacket tpStart = (TeleportStartPacket)PacketPool.Instance.GetPacket(PacketType.TeleportStart);
  1275. TeleportStartPacket tpStart = new TeleportStartPacket();
  1276. tpStart.Info.TeleportFlags = 16; // Teleport via location
  1277. // Hack to get this out immediately and skip throttles
  1278. OutPacket(tpStart, ThrottleOutPacketType.Unknown);
  1279. }
  1280. public void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance)
  1281. {
  1282. MoneyBalanceReplyPacket money = (MoneyBalanceReplyPacket)PacketPool.Instance.GetPacket(PacketType.MoneyBalanceReply);
  1283. money.MoneyData.AgentID = AgentId;
  1284. money.MoneyData.TransactionID = transaction;
  1285. money.MoneyData.TransactionSuccess = success;
  1286. money.MoneyData.Description = description;
  1287. money.MoneyData.MoneyBalance = balance;
  1288. OutPacket(money, ThrottleOutPacketType.Task);
  1289. }
  1290. public void SendPayPrice(UUID objectID, int[] payPrice)
  1291. {
  1292. if (payPrice[0] == 0 &&
  1293. payPrice[1] == 0 &&
  1294. payPrice[2] == 0 &&
  1295. payPrice[3] == 0 &&
  1296. payPrice[4] == 0)
  1297. return;
  1298. PayPriceReplyPacket payPriceReply = (PayPriceReplyPacket)PacketPool.Instance.GetPacket(PacketType.PayPriceReply);
  1299. payPriceReply.ObjectData.ObjectID = objectID;
  1300. payPriceReply.ObjectData.DefaultPayPrice = payPrice[0];
  1301. payPriceReply.ButtonData = new PayPriceReplyPacket.ButtonDataBlock[4];
  1302. payPriceReply.ButtonData[0] = new PayPriceReplyPacket.ButtonDataBlock();
  1303. payPriceReply.ButtonData[0].PayButton = payPrice[1];
  1304. payPriceReply.ButtonData[1] = new PayPriceReplyPacket.ButtonDataBlock();
  1305. payPriceReply.ButtonData[1].PayButton = payPrice[2];
  1306. payPriceReply.ButtonData[2] = new PayPriceReplyPacket.ButtonDataBlock();
  1307. payPriceReply.ButtonData[2].PayButton = payPrice[3];
  1308. payPriceReply.ButtonData[3] = new PayPriceReplyPacket.ButtonDataBlock();
  1309. payPriceReply.ButtonData[3].PayButton = payPrice[4];
  1310. OutPacket(payPriceReply, ThrottleOutPacketType.Task);
  1311. }
  1312. public void SendStartPingCheck(byte seq)
  1313. {
  1314. StartPingCheckPacket pc = (StartPingCheckPacket)PacketPool.Instance.GetPacket(PacketType.StartPingCheck);
  1315. pc.PingID.PingID = seq;
  1316. pc.Header.Reliable = false;
  1317. OutPacket(pc, ThrottleOutPacketType.Unknown);
  1318. }
  1319. public void SendKillObject(ulong regionHandle, uint localID)
  1320. {
  1321. KillObjectPacket kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject);
  1322. // TODO: don't create new blocks if recycling an old packet
  1323. kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
  1324. kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
  1325. kill.ObjectData[0].ID = localID;
  1326. kill.Header.Reliable = true;
  1327. kill.Header.Zerocoded = true;
  1328. OutPacket(kill, ThrottleOutPacketType.Task);
  1329. }
  1330. /// <summary>
  1331. /// Send information about the items contained in a folder to the client.
  1332. ///
  1333. /// XXX This method needs some refactoring loving
  1334. /// </summary>
  1335. /// <param name="ownerID">The owner of the folder</param>
  1336. /// <param name="folderID">The id of the folder</param>
  1337. /// <param name="items">The items contained in the folder identified by folderID</param>
  1338. /// <param name="fetchFolders">Do we need to send folder information?</param>
  1339. /// <param name="fetchItems">Do we need to send item information?</param>
  1340. public void SendInventoryFolderDetails(UUID ownerID, UUID folderID, List<InventoryItemBase> items,
  1341. List<InventoryFolderBase> folders,
  1342. bool fetchFolders, bool fetchItems)
  1343. {
  1344. // An inventory descendents packet consists of a single agent section and an inventory details
  1345. // section for each inventory item. The size of each inventory item is approximately 550 bytes.
  1346. // In theory, UDP has a maximum packet size of 64k, so it should be possible to send descendent
  1347. // packets containing metadata for in excess of 100 items. But in practice, there may be other
  1348. // factors (e.g. firewalls) restraining the maximum UDP packet size. See,
  1349. //
  1350. // http://opensimulator.org/mantis/view.php?id=226
  1351. //
  1352. // for one example of this kind of thing. In fact, the Linden servers appear to only send about
  1353. // 6 to 7 items at a time, so let's stick with 6
  1354. int MAX_ITEMS_PER_PACKET = 6;
  1355. //Ckrinke This variable is not used, so comment out to remove the warning from the compiler (3-21-08)
  1356. //Ckrinke uint FULL_MASK_PERMISSIONS = 2147483647;
  1357. if (fetchItems)
  1358. {
  1359. InventoryDescendentsPacket descend = CreateInventoryDescendentsPacket(ownerID, folderID);
  1360. if (items.Count < MAX_ITEMS_PER_PACKET)
  1361. {
  1362. descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[items.Count];
  1363. }
  1364. else
  1365. {
  1366. descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[MAX_ITEMS_PER_PACKET];
  1367. }
  1368. // Descendents must contain the *total* number of descendents (plus folders, whether we
  1369. // fetch them or not), not the number of entries we send in this packet. For consistency,
  1370. // I'll use it for folder-requests, too, although I wasn't able to get one with
  1371. // FetchFolders = true.
  1372. // TODO this should be checked with FetchFolders = true
  1373. descend.AgentData.Descendents = items.Count + folders.Count;
  1374. int count = 0;
  1375. int i = 0;
  1376. foreach (InventoryItemBase item in items)
  1377. {
  1378. descend.ItemData[i] = new InventoryDescendentsPacket.ItemDataBlock();
  1379. descend.ItemData[i].ItemID = item.ID;
  1380. descend.ItemData[i].AssetID = item.AssetID;
  1381. descend.ItemData[i].CreatorID = item.Creator;
  1382. descend.ItemData[i].BaseMask = item.BasePermissions;
  1383. descend.ItemData[i].Description = Utils.StringToBytes(item.Description);
  1384. descend.ItemData[i].EveryoneMask = item.EveryOnePermissions;
  1385. descend.ItemData[i].OwnerMask = item.CurrentPermissions;
  1386. descend.ItemData[i].FolderID = item.Folder;
  1387. descend.ItemData[i].InvType = (sbyte)item.InvType;
  1388. descend.ItemData[i].Name = Utils.StringToBytes(item.Name);
  1389. descend.ItemData[i].NextOwnerMask = item.NextPermissions;
  1390. descend.ItemData[i].OwnerID = item.Owner;
  1391. descend.ItemData[i].Type = (sbyte)item.AssetType;
  1392. //descend.ItemData[i].GroupID = new UUID("00000000-0000-0000-0000-000000000000");
  1393. descend.ItemData[i].GroupID = item.GroupID;
  1394. descend.ItemData[i].GroupOwned = item.GroupOwned;
  1395. descend.ItemData[i].GroupMask = 0;
  1396. descend.ItemData[i].CreationDate = item.CreationDate;
  1397. descend.ItemData[i].SalePrice = item.SalePrice;
  1398. descend.ItemData[i].SaleType = item.SaleType;
  1399. descend.ItemData[i].Flags = item.Flags;
  1400. descend.ItemData[i].CRC =
  1401. Helpers.InventoryCRC(descend.ItemData[i].CreationDate, descend.ItemData[i].SaleType,
  1402. descend.ItemData[i].InvType, descend.ItemData[i].Type,
  1403. descend.ItemData[i].AssetID, descend.ItemData[i].GroupID,
  1404. descend.ItemData[i].SalePrice,
  1405. descend.ItemData[i].OwnerID, descend.ItemData[i].CreatorID,
  1406. descend.ItemData[i].ItemID, descend.ItemData[i].FolderID,
  1407. descend.ItemData[i].EveryoneMask,
  1408. descend.ItemData[i].Flags, descend.ItemData[i].OwnerMask,
  1409. descend.ItemData[i].GroupMask, item.CurrentPermissions);
  1410. i++;
  1411. count++;
  1412. if (i == MAX_ITEMS_PER_PACKET)
  1413. {
  1414. descend.Header.Zerocoded = true;
  1415. OutPacket(descend, ThrottleOutPacketType.Asset);
  1416. if ((items.Count - count) > 0)
  1417. {
  1418. descend = CreateInventoryDescendentsPacket(ownerID, folderID);
  1419. if ((items.Count - count) < MAX_ITEMS_PER_PACKET)
  1420. {
  1421. descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[items.Count - count];
  1422. }
  1423. else
  1424. {
  1425. descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[MAX_ITEMS_PER_PACKET];
  1426. }
  1427. descend.AgentData.Descendents = items.Count + folders.Count;
  1428. i = 0;
  1429. }
  1430. }
  1431. }
  1432. if (i < MAX_ITEMS_PER_PACKET)
  1433. {
  1434. OutPacket(descend, ThrottleOutPacketType.Asset);
  1435. }
  1436. }
  1437. //send subfolders
  1438. if (fetchFolders)
  1439. {
  1440. InventoryDescendentsPacket descend = CreateInventoryDescendentsPacket(ownerID, folderID);
  1441. if (folders.Count < MAX_ITEMS_PER_PACKET)
  1442. {
  1443. descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[folders.Count];
  1444. }
  1445. else
  1446. {
  1447. descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[MAX_ITEMS_PER_PACKET];
  1448. }
  1449. // Not sure if this scenario ever actually occurs, but nonetheless we include the items
  1450. // count even if we're not sending item data for the same reasons as above.
  1451. descend.AgentData.Descendents = items.Count + folders.Count;
  1452. int i = 0;
  1453. int count = 0;
  1454. foreach (InventoryFolderBase folder in folders)
  1455. {
  1456. descend.FolderData[i] = new InventoryDescendentsPacket.FolderDataBlock();
  1457. descend.FolderData[i].FolderID = folder.ID;
  1458. descend.FolderData[i].Name = Utils.StringToBytes(folder.Name);
  1459. descend.FolderData[i].ParentID = folder.ParentID;
  1460. descend.FolderData[i].Type = (sbyte)folder.Type;
  1461. i++;
  1462. count++;
  1463. if (i == MAX_ITEMS_PER_PACKET)
  1464. {
  1465. OutPacket(descend, ThrottleOutPacketType.Asset);
  1466. if ((folders.Count - count) > 0)
  1467. {
  1468. descend = CreateInventoryDescendentsPacket(ownerID, folderID);
  1469. if ((folders.Count - count) < MAX_ITEMS_PER_PACKET)
  1470. {
  1471. descend.FolderData =
  1472. new InventoryDescendentsPacket.FolderDataBlock[folders.Count - count];
  1473. }
  1474. else
  1475. {
  1476. descend.FolderData =
  1477. new InventoryDescendentsPacket.FolderDataBlock[MAX_ITEMS_PER_PACKET];
  1478. }
  1479. descend.AgentData.Descendents = items.Count + folders.Count;
  1480. i = 0;
  1481. }
  1482. }
  1483. }
  1484. if (i < MAX_ITEMS_PER_PACKET)
  1485. {
  1486. OutPacket(descend, ThrottleOutPacketType.Asset);
  1487. }
  1488. }
  1489. }
  1490. private InventoryDescendentsPacket CreateInventoryDescendentsPacket(UUID ownerID, UUID folderID)
  1491. {
  1492. InventoryDescendentsPacket descend = (InventoryDescendentsPacket)PacketPool.Instance.GetPacket(PacketType.InventoryDescendents);
  1493. descend.Header.Zerocoded = true;
  1494. descend.AgentData.AgentID = AgentId;
  1495. descend.AgentData.OwnerID = ownerID;
  1496. descend.AgentData.FolderID = folderID;
  1497. descend.AgentData.Version = 1;
  1498. return descend;
  1499. }
  1500. public void SendInventoryItemDetails(UUID ownerID, InventoryItemBase item)
  1501. {
  1502. uint FULL_MASK_PERMISSIONS = (uint)PermissionMask.All;
  1503. FetchInventoryReplyPacket inventoryReply = (FetchInventoryReplyPacket)PacketPool.Instance.GetPacket(PacketType.FetchInventoryReply);
  1504. // TODO: don't create new blocks if recycling an old packet
  1505. inventoryReply.AgentData.AgentID = AgentId;
  1506. inventoryReply.InventoryData = new FetchInventoryReplyPacket.InventoryDataBlock[1];
  1507. inventoryReply.InventoryData[0] = new FetchInventoryReplyPacket.InventoryDataBlock();
  1508. inventoryReply.InventoryData[0].ItemID = item.ID;
  1509. inventoryReply.InventoryData[0].AssetID = item.AssetID;
  1510. inventoryReply.InventoryData[0].CreatorID = item.Creator;
  1511. inventoryReply.InventoryData[0].BaseMask = item.BasePermissions;
  1512. inventoryReply.InventoryData[0].CreationDate =
  1513. (int)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
  1514. inventoryReply.InventoryData[0].Description = Utils.StringToBytes(item.Description);
  1515. inventoryReply.InventoryData[0].EveryoneMask = item.EveryOnePermissions;
  1516. inventoryReply.InventoryData[0].FolderID = item.Folder;
  1517. inventoryReply.InventoryData[0].InvType = (sbyte)item.InvType;
  1518. inventoryReply.InventoryData[0].Name = Utils.StringToBytes(item.Name);
  1519. inventoryReply.InventoryData[0].NextOwnerMask = item.NextPermissions;
  1520. inventoryReply.InventoryData[0].OwnerID = item.Owner;
  1521. inventoryReply.InventoryData[0].OwnerMask = item.CurrentPermissions;
  1522. inventoryReply.InventoryData[0].Type = (sbyte)item.AssetType;
  1523. //inventoryReply.InventoryData[0].GroupID = new UUID("00000000-0000-0000-0000-000000000000");
  1524. inventoryReply.InventoryData[0].GroupID = item.GroupID;
  1525. inventoryReply.InventoryData[0].GroupOwned = item.GroupOwned;
  1526. inventoryReply.InventoryData[0].GroupMask = 0;
  1527. inventoryReply.InventoryData[0].Flags = item.Flags;
  1528. inventoryReply.InventoryData[0].SalePrice = item.SalePrice;
  1529. inventoryReply.InventoryData[0].SaleType = item.SaleType;
  1530. inventoryReply.InventoryData[0].CRC =
  1531. Helpers.InventoryCRC(1000, 0, inventoryReply.InventoryData[0].InvType,
  1532. inventoryReply.InventoryData[0].Type, inventoryReply.InventoryData[0].AssetID,
  1533. inventoryReply.InventoryData[0].GroupID, 100,
  1534. inventoryReply.InventoryData[0].OwnerID, inventoryReply.InventoryData[0].CreatorID,
  1535. inventoryReply.InventoryData[0].ItemID, inventoryReply.InventoryData[0].FolderID,
  1536. FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS,
  1537. FULL_MASK_PERMISSIONS);
  1538. inventoryReply.Header.Zerocoded = true;
  1539. OutPacket(inventoryReply, ThrottleOutPacketType.Asset);
  1540. }
  1541. /// <see>IClientAPI.SendBulkUpdateInventory(InventoryItemBase)</see>
  1542. public void SendBulkUpdateInventory(InventoryItemBase item)
  1543. {
  1544. uint FULL_MASK_PERMISSIONS = (uint)PermissionMask.All;
  1545. BulkUpdateInventoryPacket bulkUpdate
  1546. = (BulkUpdateInventoryPacket)PacketPool.Instance.GetPacket(PacketType.BulkUpdateInventory);
  1547. bulkUpdate.AgentData.AgentID = AgentId;
  1548. bulkUpdate.AgentData.TransactionID = UUID.Random();
  1549. bulkUpdate.FolderData = new BulkUpdateInventoryPacket.FolderDataBlock[1];
  1550. bulkUpdate.FolderData[0] = new BulkUpdateInventoryPacket.FolderDataBlock();
  1551. bulkUpdate.FolderData[0].FolderID = UUID.Zero;
  1552. bulkUpdate.FolderData[0].ParentID = UUID.Zero;
  1553. bulkUpdate.FolderData[0].Type = -1;
  1554. bulkUpdate.FolderData[0].Name = new byte[0];
  1555. bulkUpdate.ItemData = new BulkUpdateInventoryPacket.ItemDataBlock[1];
  1556. bulkUpdate.ItemData[0] = new BulkUpdateInventoryPacket.ItemDataBlock();
  1557. bulkUpdate.ItemData[0].ItemID = item.ID;
  1558. bulkUpdate.ItemData[0].AssetID = item.AssetID;
  1559. bulkUpdate.ItemData[0].CreatorID = item.Creator;
  1560. bulkUpdate.ItemData[0].BaseMask = item.BasePermissions;
  1561. bulkUpdate.ItemData[0].CreationDate = 1000;
  1562. bulkUpdate.ItemData[0].Description = Utils.StringToBytes(item.Description);
  1563. bulkUpdate.ItemData[0].EveryoneMask = item.EveryOnePermissions;
  1564. bulkUpdate.ItemData[0].FolderID = item.Folder;
  1565. bulkUpdate.ItemData[0].InvType = (sbyte)item.InvType;
  1566. bulkUpdate.ItemData[0].Name = Utils.StringToBytes(item.Name);
  1567. bulkUpdate.ItemData[0].NextOwnerMask = item.NextPermissions;
  1568. bulkUpdate.ItemData[0].OwnerID = item.Owner;
  1569. bulkUpdate.ItemData[0].OwnerMask = item.CurrentPermissions;
  1570. bulkUpdate.ItemData[0].Type = (sbyte)item.AssetType;
  1571. //bulkUpdate.ItemData[0].GroupID = new UUID("00000000-0000-0000-0000-000000000000");
  1572. bulkUpdate.ItemData[0].GroupID = item.GroupID;
  1573. bulkUpdate.ItemData[0].GroupOwned = item.GroupOwned;
  1574. bulkUpdate.ItemData[0].GroupMask = 0;
  1575. bulkUpdate.ItemData[0].Flags = item.Flags;
  1576. bulkUpdate.ItemData[0].SalePrice = item.SalePrice;
  1577. bulkUpdate.ItemData[0].SaleType = item.SaleType;
  1578. bulkUpdate.ItemData[0].CRC =
  1579. Helpers.InventoryCRC(1000, 0, bulkUpdate.ItemData[0].InvType,
  1580. bulkUpdate.ItemData[0].Type, bulkUpdate.ItemData[0].AssetID,
  1581. bulkUpdate.ItemData[0].GroupID, 100,
  1582. bulkUpdate.ItemData[0].OwnerID, bulkUpdate.ItemData[0].CreatorID,
  1583. bulkUpdate.ItemData[0].ItemID, bulkUpdate.ItemData[0].FolderID,
  1584. FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS,
  1585. FULL_MASK_PERMISSIONS);
  1586. bulkUpdate.Header.Zerocoded = true;
  1587. OutPacket(bulkUpdate, ThrottleOutPacketType.Asset);
  1588. }
  1589. /// <see>IClientAPI.SendInventoryItemCreateUpdate(InventoryItemBase)</see>
  1590. public void SendInventoryItemCreateUpdate(InventoryItemBase Item)
  1591. {
  1592. uint FULL_MASK_PERMISSIONS = (uint)PermissionMask.All;
  1593. UpdateCreateInventoryItemPacket InventoryReply
  1594. = (UpdateCreateInventoryItemPacket)PacketPool.Instance.GetPacket(
  1595. PacketType.UpdateCreateInventoryItem);
  1596. // TODO: don't create new blocks if recycling an old packet
  1597. InventoryReply.AgentData.AgentID = AgentId;
  1598. InventoryReply.AgentData.SimApproved = true;
  1599. InventoryReply.InventoryData = new UpdateCreateInventoryItemPacket.InventoryDataBlock[1];
  1600. InventoryReply.InventoryData[0] = new UpdateCreateInventoryItemPacket.InventoryDataBlock();
  1601. InventoryReply.InventoryData[0].ItemID = Item.ID;
  1602. InventoryReply.InventoryData[0].AssetID = Item.AssetID;
  1603. InventoryReply.InventoryData[0].CreatorID = Item.Creator;
  1604. InventoryReply.InventoryData[0].BaseMask = Item.BasePermissions;
  1605. InventoryReply.InventoryData[0].Description = Utils.StringToBytes(Item.Description);
  1606. InventoryReply.InventoryData[0].EveryoneMask = Item.EveryOnePermissions;
  1607. InventoryReply.InventoryData[0].FolderID = Item.Folder;
  1608. InventoryReply.InventoryData[0].InvType = (sbyte)Item.InvType;
  1609. InventoryReply.InventoryData[0].Name = Utils.StringToBytes(Item.Name);
  1610. InventoryReply.InventoryData[0].NextOwnerMask = Item.NextPermissions;
  1611. InventoryReply.InventoryData[0].OwnerID = Item.Owner;
  1612. InventoryReply.InventoryData[0].OwnerMask = Item.CurrentPermissions;
  1613. InventoryReply.InventoryData[0].Type = (sbyte)Item.AssetType;
  1614. //InventoryReply.InventoryData[0].GroupID = new UUID("00000000-0000-0000-0000-000000000000");
  1615. InventoryReply.InventoryData[0].GroupID = Item.GroupID;
  1616. InventoryReply.InventoryData[0].GroupOwned = Item.GroupOwned;
  1617. InventoryReply.InventoryData[0].GroupMask = 0;
  1618. InventoryReply.InventoryData[0].Flags = Item.Flags;
  1619. InventoryReply.InventoryData[0].SalePrice = Item.SalePrice;
  1620. InventoryReply.InventoryData[0].SaleType = Item.SaleType;
  1621. InventoryReply.InventoryData[0].CreationDate = Item.CreationDate;
  1622. InventoryReply.InventoryData[0].CRC =
  1623. Helpers.InventoryCRC(1000, 0, InventoryReply.InventoryData[0].InvType,
  1624. InventoryReply.InventoryData[0].Type, InventoryReply.InventoryData[0].AssetID,
  1625. InventoryReply.InventoryData[0].GroupID, 100,
  1626. InventoryReply.InventoryData[0].OwnerID, InventoryReply.InventoryData[0].CreatorID,
  1627. InventoryReply.InventoryData[0].ItemID, InventoryReply.InventoryData[0].FolderID,
  1628. FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS,
  1629. FULL_MASK_PERMISSIONS);
  1630. InventoryReply.Header.Zerocoded = true;
  1631. OutPacket(InventoryReply, ThrottleOutPacketType.Asset);
  1632. }
  1633. public void SendRemoveInventoryItem(UUID itemID)
  1634. {
  1635. RemoveInventoryItemPacket remove = (RemoveInventoryItemPacket)PacketPool.Instance.GetPacket(PacketType.RemoveInventoryItem);
  1636. // TODO: don't create new blocks if recycling an old packet
  1637. remove.AgentData.AgentID = AgentId;
  1638. remove.AgentData.SessionID = m_sessionId;
  1639. remove.InventoryData = new RemoveInventoryItemPacket.InventoryDataBlock[1];
  1640. remove.InventoryData[0] = new RemoveInventoryItemPacket.InventoryDataBlock();
  1641. remove.InventoryData[0].ItemID = itemID;
  1642. remove.Header.Zerocoded = true;
  1643. OutPacket(remove, ThrottleOutPacketType.Asset);
  1644. }
  1645. public void SendTakeControls(int controls, bool passToAgent, bool TakeControls)
  1646. {
  1647. ScriptControlChangePacket scriptcontrol = (ScriptControlChangePacket)PacketPool.Instance.GetPacket(PacketType.ScriptControlChange);
  1648. ScriptControlChangePacket.DataBlock[] data = new ScriptControlChangePacket.DataBlock[1];
  1649. ScriptControlChangePacket.DataBlock ddata = new ScriptControlChangePacket.DataBlock();
  1650. ddata.Controls = (uint)controls;
  1651. ddata.PassToAgent = passToAgent;
  1652. ddata.TakeControls = TakeControls;
  1653. data[0] = ddata;
  1654. scriptcontrol.Data = data;
  1655. OutPacket(scriptcontrol, ThrottleOutPacketType.Task);
  1656. }
  1657. public void SendTaskInventory(UUID taskID, short serial, byte[] fileName)
  1658. {
  1659. ReplyTaskInventoryPacket replytask = (ReplyTaskInventoryPacket)PacketPool.Instance.GetPacket(PacketType.ReplyTaskInventory);
  1660. replytask.InventoryData.TaskID = taskID;
  1661. replytask.InventoryData.Serial = serial;
  1662. replytask.InventoryData.Filename = fileName;
  1663. OutPacket(replytask, ThrottleOutPacketType.Asset);
  1664. }
  1665. public void SendXferPacket(ulong xferID, uint packet, byte[] data)
  1666. {
  1667. SendXferPacketPacket sendXfer = (SendXferPacketPacket)PacketPool.Instance.GetPacket(PacketType.SendXferPacket);
  1668. sendXfer.XferID.ID = xferID;
  1669. sendXfer.XferID.Packet = packet;
  1670. sendXfer.DataPacket.Data = data;
  1671. OutPacket(sendXfer, ThrottleOutPacketType.Task);
  1672. }
  1673. public void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit,
  1674. int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor,
  1675. int PriceParcelClaim, float PriceParcelClaimFactor, int PriceParcelRent, int PricePublicObjectDecay,
  1676. int PricePublicObjectDelete, int PriceRentLight, int PriceUpload, int TeleportMinPrice, float TeleportPriceExponent)
  1677. {
  1678. EconomyDataPacket economyData = (EconomyDataPacket)PacketPool.Instance.GetPacket(PacketType.EconomyData);
  1679. economyData.Info.EnergyEfficiency = EnergyEfficiency;
  1680. economyData.Info.ObjectCapacity = ObjectCapacity;
  1681. economyData.Info.ObjectCount = ObjectCount;
  1682. economyData.Info.PriceEnergyUnit = PriceEnergyUnit;
  1683. economyData.Info.PriceGroupCreate = PriceGroupCreate;
  1684. economyData.Info.PriceObjectClaim = PriceObjectClaim;
  1685. economyData.Info.PriceObjectRent = PriceObjectRent;
  1686. economyData.Info.PriceObjectScaleFactor = PriceObjectScaleFactor;
  1687. economyData.Info.PriceParcelClaim = PriceParcelClaim;
  1688. economyData.Info.PriceParcelClaimFactor = PriceParcelClaimFactor;
  1689. economyData.Info.PriceParcelRent = PriceParcelRent;
  1690. economyData.Info.PricePublicObjectDecay = PricePublicObjectDecay;
  1691. economyData.Info.PricePublicObjectDelete = PricePublicObjectDelete;
  1692. economyData.Info.PriceRentLight = PriceRentLight;
  1693. economyData.Info.PriceUpload = PriceUpload;
  1694. economyData.Info.TeleportMinPrice = TeleportMinPrice;
  1695. economyData.Info.TeleportPriceExponent = TeleportPriceExponent;
  1696. economyData.Header.Reliable = true;
  1697. OutPacket(economyData, ThrottleOutPacketType.Unknown);
  1698. }
  1699. public void SendAvatarPickerReply(AvatarPickerReplyAgentDataArgs AgentData, List<AvatarPickerReplyDataArgs> Data)
  1700. {
  1701. //construct the AvatarPickerReply packet.
  1702. AvatarPickerReplyPacket replyPacket = new AvatarPickerReplyPacket();
  1703. replyPacket.AgentData.AgentID = AgentData.AgentID;
  1704. replyPacket.AgentData.QueryID = AgentData.QueryID;
  1705. //int i = 0;
  1706. List<AvatarPickerReplyPacket.DataBlock> data_block = new List<AvatarPickerReplyPacket.DataBlock>();
  1707. foreach (AvatarPickerReplyDataArgs arg in Data)
  1708. {
  1709. AvatarPickerReplyPacket.DataBlock db = new AvatarPickerReplyPacket.DataBlock();
  1710. db.AvatarID = arg.AvatarID;
  1711. db.FirstName = arg.FirstName;
  1712. db.LastName = arg.LastName;
  1713. data_block.Add(db);
  1714. }
  1715. replyPacket.Data = data_block.ToArray();
  1716. OutPacket(replyPacket, ThrottleOutPacketType.Task);
  1717. }
  1718. public void SendAgentDataUpdate(UUID agentid, UUID activegroupid, string firstname, string lastname, ulong grouppowers, string groupname, string grouptitle)
  1719. {
  1720. m_activeGroupID = activegroupid;
  1721. m_activeGroupName = groupname;
  1722. m_activeGroupPowers = grouppowers;
  1723. AgentDataUpdatePacket sendAgentDataUpdate = (AgentDataUpdatePacket)PacketPool.Instance.GetPacket(PacketType.AgentDataUpdate);
  1724. sendAgentDataUpdate.AgentData.ActiveGroupID = activegroupid;
  1725. sendAgentDataUpdate.AgentData.AgentID = agentid;
  1726. sendAgentDataUpdate.AgentData.FirstName = Utils.StringToBytes(firstname);
  1727. sendAgentDataUpdate.AgentData.GroupName = Utils.StringToBytes(groupname);
  1728. sendAgentDataUpdate.AgentData.GroupPowers = grouppowers;
  1729. sendAgentDataUpdate.AgentData.GroupTitle = Utils.StringToBytes(grouptitle);
  1730. sendAgentDataUpdate.AgentData.LastName = Utils.StringToBytes(lastname);
  1731. OutPacket(sendAgentDataUpdate, ThrottleOutPacketType.Task);
  1732. }
  1733. /// <summary>
  1734. /// Send an alert message to the client. On the Linden client (tested 1.19.1.4), this pops up a brief duration
  1735. /// blue information box in the bottom right hand corner.
  1736. /// </summary>
  1737. /// <param name="message"></param>
  1738. public void SendAlertMessage(string message)
  1739. {
  1740. AlertMessagePacket alertPack = (AlertMessagePacket)PacketPool.Instance.GetPacket(PacketType.AlertMessage);
  1741. alertPack.AlertData.Message = Utils.StringToBytes(message);
  1742. OutPacket(alertPack, ThrottleOutPacketType.Task);
  1743. }
  1744. /// <summary>
  1745. /// Send an agent alert message to the client.
  1746. /// </summary>
  1747. /// <param name="message"></param>
  1748. /// <param name="modal">On the linden client, if this true then it displays a one button text box placed in the
  1749. /// middle of the window. If false, the message is displayed in a brief duration blue information box (as for
  1750. /// the AlertMessage packet).</param>
  1751. public void SendAgentAlertMessage(string message, bool modal)
  1752. {
  1753. OutPacket(BuildAgentAlertPacket(message, modal), ThrottleOutPacketType.Task);
  1754. }
  1755. /// <summary>
  1756. /// Construct an agent alert packet
  1757. /// </summary>
  1758. /// <param name="message"></param>
  1759. /// <param name="modal"></param>
  1760. /// <returns></returns>
  1761. protected AgentAlertMessagePacket BuildAgentAlertPacket(string message, bool modal)
  1762. {
  1763. AgentAlertMessagePacket alertPack = (AgentAlertMessagePacket)PacketPool.Instance.GetPacket(PacketType.AgentAlertMessage);
  1764. alertPack.AgentData.AgentID = AgentId;
  1765. alertPack.AlertData.Message = Utils.StringToBytes(message);
  1766. alertPack.AlertData.Modal = modal;
  1767. return alertPack;
  1768. }
  1769. public void SendLoadURL(string objectname, UUID objectID, UUID ownerID, bool groupOwned, string message,
  1770. string url)
  1771. {
  1772. LoadURLPacket loadURL = (LoadURLPacket)PacketPool.Instance.GetPacket(PacketType.LoadURL);
  1773. loadURL.Data.ObjectName = Utils.StringToBytes(objectname);
  1774. loadURL.Data.ObjectID = objectID;
  1775. loadURL.Data.OwnerID = ownerID;
  1776. loadURL.Data.OwnerIsGroup = groupOwned;
  1777. loadURL.Data.Message = Utils.StringToBytes(message);
  1778. loadURL.Data.URL = Utils.StringToBytes(url);
  1779. OutPacket(loadURL, ThrottleOutPacketType.Task);
  1780. }
  1781. public void SendDialog(string objectname, UUID objectID, UUID ownerID, string msg, UUID textureID, int ch, string[] buttonlabels)
  1782. {
  1783. ScriptDialogPacket dialog = (ScriptDialogPacket)PacketPool.Instance.GetPacket(PacketType.ScriptDialog);
  1784. dialog.Data.ObjectID = objectID;
  1785. dialog.Data.ObjectName = Utils.StringToBytes(objectname);
  1786. dialog.Data.FirstName = Utils.StringToBytes(FirstName);
  1787. dialog.Data.LastName = Utils.StringToBytes(LastName);
  1788. dialog.Data.Message = Utils.StringToBytes(msg);
  1789. dialog.Data.ImageID = textureID;
  1790. dialog.Data.ChatChannel = ch;
  1791. ScriptDialogPacket.ButtonsBlock[] buttons = new ScriptDialogPacket.ButtonsBlock[buttonlabels.Length];
  1792. for (int i = 0; i < buttonlabels.Length; i++)
  1793. {
  1794. buttons[i] = new ScriptDialogPacket.ButtonsBlock();
  1795. buttons[i].ButtonLabel = Utils.StringToBytes(buttonlabels[i]);
  1796. }
  1797. dialog.Buttons = buttons;
  1798. OutPacket(dialog, ThrottleOutPacketType.Task);
  1799. }
  1800. public void SendPreLoadSound(UUID objectID, UUID ownerID, UUID soundID)
  1801. {
  1802. PreloadSoundPacket preSound = (PreloadSoundPacket)PacketPool.Instance.GetPacket(PacketType.PreloadSound);
  1803. // TODO: don't create new blocks if recycling an old packet
  1804. preSound.DataBlock = new PreloadSoundPacket.DataBlockBlock[1];
  1805. preSound.DataBlock[0] = new PreloadSoundPacket.DataBlockBlock();
  1806. preSound.DataBlock[0].ObjectID = objectID;
  1807. preSound.DataBlock[0].OwnerID = ownerID;
  1808. preSound.DataBlock[0].SoundID = soundID;
  1809. preSound.Header.Zerocoded = true;
  1810. OutPacket(preSound, ThrottleOutPacketType.Task);
  1811. }
  1812. public void SendPlayAttachedSound(UUID soundID, UUID objectID, UUID ownerID, float gain, byte flags)
  1813. {
  1814. AttachedSoundPacket sound = (AttachedSoundPacket)PacketPool.Instance.GetPacket(PacketType.AttachedSound);
  1815. sound.DataBlock.SoundID = soundID;
  1816. sound.DataBlock.ObjectID = objectID;
  1817. sound.DataBlock.OwnerID = ownerID;
  1818. sound.DataBlock.Gain = gain;
  1819. sound.DataBlock.Flags = flags;
  1820. OutPacket(sound, ThrottleOutPacketType.Task);
  1821. }
  1822. public void SendTriggeredSound(UUID soundID, UUID ownerID, UUID objectID, UUID parentID, ulong handle, Vector3 position, float gain)
  1823. {
  1824. SoundTriggerPacket sound = (SoundTriggerPacket)PacketPool.Instance.GetPacket(PacketType.SoundTrigger);
  1825. sound.SoundData.SoundID = soundID;
  1826. sound.SoundData.OwnerID = ownerID;
  1827. sound.SoundData.ObjectID = objectID;
  1828. sound.SoundData.ParentID = parentID;
  1829. sound.SoundData.Handle = handle;
  1830. sound.SoundData.Position = position;
  1831. sound.SoundData.Gain = gain;
  1832. OutPacket(sound, ThrottleOutPacketType.Task);
  1833. }
  1834. public void SendAttachedSoundGainChange(UUID objectID, float gain)
  1835. {
  1836. AttachedSoundGainChangePacket sound = (AttachedSoundGainChangePacket)PacketPool.Instance.GetPacket(PacketType.AttachedSoundGainChange);
  1837. sound.DataBlock.ObjectID = objectID;
  1838. sound.DataBlock.Gain = gain;
  1839. OutPacket(sound, ThrottleOutPacketType.Task);
  1840. }
  1841. public void SendSunPos(Vector3 Position, Vector3 Velocity, ulong CurrentTime, uint SecondsPerSunCycle, uint SecondsPerYear, float OrbitalPosition)
  1842. {
  1843. SimulatorViewerTimeMessagePacket viewertime = (SimulatorViewerTimeMessagePacket)PacketPool.Instance.GetPacket(PacketType.SimulatorViewerTimeMessage);
  1844. viewertime.TimeInfo.SunDirection = Position;
  1845. viewertime.TimeInfo.SunAngVelocity = Velocity;
  1846. viewertime.TimeInfo.UsecSinceStart = CurrentTime;
  1847. viewertime.TimeInfo.SecPerDay = SecondsPerSunCycle;
  1848. viewertime.TimeInfo.SecPerYear = SecondsPerYear;
  1849. viewertime.TimeInfo.SunPhase = OrbitalPosition;
  1850. viewertime.Header.Reliable = false;
  1851. viewertime.Header.Zerocoded = true;
  1852. OutPacket(viewertime, ThrottleOutPacketType.Task);
  1853. }
  1854. // Currently Deprecated
  1855. public void SendViewerTime(int phase)
  1856. {
  1857. /*
  1858. Console.WriteLine("SunPhase: {0}", phase);
  1859. SimulatorViewerTimeMessagePacket viewertime = (SimulatorViewerTimeMessagePacket)PacketPool.Instance.GetPacket(PacketType.SimulatorViewerTimeMessage);
  1860. //viewertime.TimeInfo.SecPerDay = 86400;
  1861. //viewertime.TimeInfo.SecPerYear = 31536000;
  1862. viewertime.TimeInfo.SecPerDay = 1000;
  1863. viewertime.TimeInfo.SecPerYear = 365000;
  1864. viewertime.TimeInfo.SunPhase = 1;
  1865. int sunPhase = (phase + 2) / 2;
  1866. if ((sunPhase < 6) || (sunPhase > 36))
  1867. {
  1868. viewertime.TimeInfo.SunDirection = new Vector3(0f, 0.8f, -0.8f);
  1869. Console.WriteLine("sending night");
  1870. }
  1871. else
  1872. {
  1873. if (sunPhase < 12)
  1874. {
  1875. sunPhase = 12;
  1876. }
  1877. sunPhase = sunPhase - 12;
  1878. float yValue = 0.1f * (sunPhase);
  1879. Console.WriteLine("Computed SunPhase: {0}, yValue: {1}", sunPhase, yValue);
  1880. if (yValue > 1.2f)
  1881. {
  1882. yValue = yValue - 1.2f;
  1883. }
  1884. yValue = Util.Clip(yValue, 0, 1);
  1885. if (sunPhase < 14)
  1886. {
  1887. yValue = 1 - yValue;
  1888. }
  1889. if (sunPhase < 12)
  1890. {
  1891. yValue *= -1;
  1892. }
  1893. viewertime.TimeInfo.SunDirection = new Vector3(0f, yValue, 0.3f);
  1894. Console.WriteLine("sending sun update " + yValue);
  1895. }
  1896. viewertime.TimeInfo.SunAngVelocity = new Vector3(0, 0.0f, 10.0f);
  1897. viewertime.TimeInfo.UsecSinceStart = (ulong)Util.UnixTimeSinceEpoch();
  1898. viewertime.Header.Reliable = false;
  1899. OutPacket(viewertime, ThrottleOutPacketType.Task);
  1900. */
  1901. }
  1902. public void SendViewerEffect(ViewerEffectPacket.EffectBlock[] effectBlocks)
  1903. {
  1904. ViewerEffectPacket packet = (ViewerEffectPacket)PacketPool.Instance.GetPacket(PacketType.ViewerEffect);
  1905. packet.Effect = effectBlocks;
  1906. packet.AgentData.AgentID = AgentId;
  1907. packet.AgentData.SessionID = SessionId;
  1908. packet.Header.Reliable = false;
  1909. packet.Header.Zerocoded = true;
  1910. OutPacket(packet, ThrottleOutPacketType.Task);
  1911. }
  1912. public void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, Byte[] charterMember,
  1913. string flAbout, uint flags, UUID flImageID, UUID imageID, string profileURL,
  1914. UUID partnerID)
  1915. {
  1916. AvatarPropertiesReplyPacket avatarReply = (AvatarPropertiesReplyPacket)PacketPool.Instance.GetPacket(PacketType.AvatarPropertiesReply);
  1917. avatarReply.AgentData.AgentID = AgentId;
  1918. avatarReply.AgentData.AvatarID = avatarID;
  1919. if (aboutText != null)
  1920. avatarReply.PropertiesData.AboutText = Utils.StringToBytes(aboutText);
  1921. else
  1922. avatarReply.PropertiesData.AboutText = Utils.StringToBytes("");
  1923. avatarReply.PropertiesData.BornOn = Utils.StringToBytes(bornOn);
  1924. avatarReply.PropertiesData.CharterMember = charterMember;
  1925. if (flAbout != null)
  1926. avatarReply.PropertiesData.FLAboutText = Utils.StringToBytes(flAbout);
  1927. else
  1928. avatarReply.PropertiesData.FLAboutText = Utils.StringToBytes("");
  1929. avatarReply.PropertiesData.Flags = flags;
  1930. avatarReply.PropertiesData.FLImageID = flImageID;
  1931. avatarReply.PropertiesData.ImageID = imageID;
  1932. avatarReply.PropertiesData.ProfileURL = Utils.StringToBytes(profileURL);
  1933. avatarReply.PropertiesData.PartnerID = partnerID;
  1934. OutPacket(avatarReply, ThrottleOutPacketType.Task);
  1935. }
  1936. #endregion
  1937. // Gesture
  1938. #region Appearance/ Wearables Methods
  1939. public void SendWearables(AvatarWearable[] wearables, int serial)
  1940. {
  1941. AgentWearablesUpdatePacket aw = (AgentWearablesUpdatePacket)PacketPool.Instance.GetPacket(PacketType.AgentWearablesUpdate);
  1942. aw.AgentData.AgentID = AgentId;
  1943. aw.AgentData.SerialNum = (uint)serial;
  1944. aw.AgentData.SessionID = m_sessionId;
  1945. // TODO: don't create new blocks if recycling an old packet
  1946. aw.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[13];
  1947. AgentWearablesUpdatePacket.WearableDataBlock awb;
  1948. for (int i = 0; i < wearables.Length; i++)
  1949. {
  1950. awb = new AgentWearablesUpdatePacket.WearableDataBlock();
  1951. awb.WearableType = (byte)i;
  1952. awb.AssetID = wearables[i].AssetID;
  1953. awb.ItemID = wearables[i].ItemID;
  1954. aw.WearableData[i] = awb;
  1955. // m_log.DebugFormat(
  1956. // "[APPEARANCE]: Sending wearable item/asset {0} {1} (index {2}) for {3}",
  1957. // awb.ItemID, awb.AssetID, i, Name);
  1958. }
  1959. OutPacket(aw, ThrottleOutPacketType.Task);
  1960. }
  1961. public void SendAppearance(UUID agentID, byte[] visualParams, byte[] textureEntry)
  1962. {
  1963. AvatarAppearancePacket avp = (AvatarAppearancePacket)PacketPool.Instance.GetPacket(PacketType.AvatarAppearance);
  1964. // TODO: don't create new blocks if recycling an old packet
  1965. avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218];
  1966. avp.ObjectData.TextureEntry = textureEntry;
  1967. AvatarAppearancePacket.VisualParamBlock avblock = null;
  1968. for (int i = 0; i < visualParams.Length; i++)
  1969. {
  1970. avblock = new AvatarAppearancePacket.VisualParamBlock();
  1971. avblock.ParamValue = visualParams[i];
  1972. avp.VisualParam[i] = avblock;
  1973. }
  1974. avp.Sender.IsTrial = false;
  1975. avp.Sender.ID = agentID;
  1976. OutPacket(avp, ThrottleOutPacketType.Task);
  1977. }
  1978. public void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId)
  1979. {
  1980. AvatarAnimationPacket ani = (AvatarAnimationPacket)PacketPool.Instance.GetPacket(PacketType.AvatarAnimation);
  1981. // TODO: don't create new blocks if recycling an old packet
  1982. ani.AnimationSourceList = new AvatarAnimationPacket.AnimationSourceListBlock[1];
  1983. ani.AnimationSourceList[0] = new AvatarAnimationPacket.AnimationSourceListBlock();
  1984. ani.AnimationSourceList[0].ObjectID = sourceAgentId;
  1985. ani.Sender = new AvatarAnimationPacket.SenderBlock();
  1986. ani.Sender.ID = sourceAgentId;
  1987. ani.AnimationList = new AvatarAnimationPacket.AnimationListBlock[animations.Length];
  1988. for (int i = 0; i < animations.Length; ++i)
  1989. {
  1990. ani.AnimationList[i] = new AvatarAnimationPacket.AnimationListBlock();
  1991. ani.AnimationList[i].AnimID = animations[i];
  1992. ani.AnimationList[i].AnimSequenceID = seqs[i];
  1993. }
  1994. ani.Header.Reliable = false;
  1995. OutPacket(ani, ThrottleOutPacketType.Task);
  1996. }
  1997. #endregion
  1998. #region Avatar Packet/data sending Methods
  1999. /// <summary>
  2000. /// send a objectupdate packet with information about the clients avatar
  2001. /// </summary>
  2002. /// <param name="regionInfo"></param>
  2003. /// <param name="firstName"></param>
  2004. /// <param name="lastName"></param>
  2005. /// <param name="avatarID"></param>
  2006. /// <param name="avatarLocalID"></param>
  2007. /// <param name="Pos"></param>
  2008. public void SendAvatarData(ulong regionHandle, string firstName, string lastName, string grouptitle, UUID avatarID,
  2009. uint avatarLocalID, Vector3 Pos, byte[] textureEntry, uint parentID, Quaternion rotation)
  2010. {
  2011. ObjectUpdatePacket objupdate = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
  2012. // TODO: don't create new blocks if recycling an old packet
  2013. objupdate.RegionData.RegionHandle = regionHandle;
  2014. objupdate.RegionData.TimeDilation = ushort.MaxValue;
  2015. objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
  2016. objupdate.ObjectData[0] = CreateDefaultAvatarPacket(textureEntry);
  2017. //give this avatar object a local id and assign the user a name
  2018. objupdate.ObjectData[0].ID = avatarLocalID;
  2019. objupdate.ObjectData[0].FullID = avatarID;
  2020. objupdate.ObjectData[0].ParentID = parentID;
  2021. objupdate.ObjectData[0].NameValue =
  2022. Utils.StringToBytes("FirstName STRING RW SV " + firstName + "\nLastName STRING RW SV " + lastName + "\nTitle STRING RW SV " + grouptitle);
  2023. Vector3 pos2 = new Vector3((float)Pos.X, (float)Pos.Y, (float)Pos.Z);
  2024. byte[] pb = pos2.GetBytes();
  2025. Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length);
  2026. byte[] rot = rotation.GetBytes();
  2027. Array.Copy(rot, 0, objupdate.ObjectData[0].ObjectData, 52, rot.Length);
  2028. objupdate.Header.Zerocoded = true;
  2029. OutPacket(objupdate, ThrottleOutPacketType.Task);
  2030. }
  2031. /// <summary>
  2032. /// Send a terse positional/rotation/velocity update about an avatar to the client. This avatar can be that of
  2033. /// the client itself.
  2034. /// </summary>
  2035. /// <param name="regionHandle"></param>
  2036. /// <param name="timeDilation"></param>
  2037. /// <param name="localID"></param>
  2038. /// <param name="position"></param>
  2039. /// <param name="velocity"></param>
  2040. public void SendAvatarTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position,
  2041. Vector3 velocity, Quaternion rotation)
  2042. {
  2043. if (rotation.X == rotation.Y && rotation.Y == rotation.Z && rotation.Z == rotation.W && rotation.W == 0)
  2044. rotation = Quaternion.Identity;
  2045. //m_log.DebugFormat("[CLIENT]: Sending rotation {0} for {1} to {2}", rotation, localID, Name);
  2046. ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock =
  2047. CreateAvatarImprovedBlock(localID, position, velocity, rotation);
  2048. ImprovedTerseObjectUpdatePacket terse = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate);
  2049. // TODO: don't create new blocks if recycling an old packet
  2050. terse.RegionData.RegionHandle = regionHandle;
  2051. terse.RegionData.TimeDilation = timeDilation;
  2052. terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
  2053. terse.ObjectData[0] = terseBlock;
  2054. terse.Header.Reliable = false;
  2055. terse.Header.Zerocoded = true;
  2056. OutPacket(terse, ThrottleOutPacketType.Task);
  2057. }
  2058. public void SendCoarseLocationUpdate(List<Vector3> CoarseLocations)
  2059. {
  2060. CoarseLocationUpdatePacket loc = (CoarseLocationUpdatePacket)PacketPool.Instance.GetPacket(PacketType.CoarseLocationUpdate);
  2061. // TODO: don't create new blocks if recycling an old packet
  2062. int total = CoarseLocations.Count;
  2063. CoarseLocationUpdatePacket.IndexBlock ib =
  2064. new CoarseLocationUpdatePacket.IndexBlock();
  2065. loc.Location = new CoarseLocationUpdatePacket.LocationBlock[total];
  2066. for (int i = 0; i < total; i++)
  2067. {
  2068. CoarseLocationUpdatePacket.LocationBlock lb =
  2069. new CoarseLocationUpdatePacket.LocationBlock();
  2070. lb.X = (byte)CoarseLocations[i].X;
  2071. lb.Y = (byte)CoarseLocations[i].Y;
  2072. lb.Z = (byte)(CoarseLocations[i].Z / 4);
  2073. loc.Location[i] = lb;
  2074. }
  2075. ib.You = -1;
  2076. ib.Prey = -1;
  2077. loc.Index = ib;
  2078. loc.Header.Reliable = false;
  2079. loc.Header.Zerocoded = true;
  2080. OutPacket(loc, ThrottleOutPacketType.Task);
  2081. }
  2082. #endregion
  2083. #region Primitive Packet/data Sending Methods
  2084. /// <summary>
  2085. ///
  2086. /// </summary>
  2087. /// <param name="localID"></param>
  2088. /// <param name="rotation"></param>
  2089. /// <param name="attachPoint"></param>
  2090. public void AttachObject(uint localID, Quaternion rotation, byte attachPoint)
  2091. {
  2092. ObjectAttachPacket attach = (ObjectAttachPacket)PacketPool.Instance.GetPacket(PacketType.ObjectAttach);
  2093. Console.WriteLine("Attach object!");
  2094. // TODO: don't create new blocks if recycling an old packet
  2095. attach.AgentData.AgentID = AgentId;
  2096. attach.AgentData.SessionID = m_sessionId;
  2097. attach.AgentData.AttachmentPoint = attachPoint;
  2098. attach.ObjectData = new ObjectAttachPacket.ObjectDataBlock[1];
  2099. attach.ObjectData[0] = new ObjectAttachPacket.ObjectDataBlock();
  2100. attach.ObjectData[0].ObjectLocalID = localID;
  2101. attach.ObjectData[0].Rotation = rotation;
  2102. attach.Header.Zerocoded = true;
  2103. OutPacket(attach, ThrottleOutPacketType.Task);
  2104. }
  2105. public void SendPrimitiveToClient(
  2106. ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape,
  2107. Vector3 pos, Vector3 vel, Vector3 acc, Quaternion rotation, Vector3 rvel,
  2108. uint flags, UUID objectID, UUID ownerID, string text, byte[] color,
  2109. uint parentID, byte[] particleSystem, byte clickAction, byte material)
  2110. {
  2111. byte[] textureanim = new byte[0];
  2112. SendPrimitiveToClient(regionHandle, timeDilation, localID, primShape, pos, vel,
  2113. acc, rotation, rvel, flags,
  2114. objectID, ownerID, text, color, parentID, particleSystem,
  2115. clickAction, material, textureanim, false, (uint)0, UUID.Zero, UUID.Zero, 0, 0, 0);
  2116. }
  2117. public void SendPrimitiveToClient(
  2118. ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape,
  2119. Vector3 pos, Vector3 velocity, Vector3 acceleration, Quaternion rotation, Vector3 rotational_velocity,
  2120. uint flags,
  2121. UUID objectID, UUID ownerID, string text, byte[] color, uint parentID, byte[] particleSystem,
  2122. byte clickAction, byte material, byte[] textureanim, bool attachment, uint AttachPoint, UUID AssetId, UUID SoundId, double SoundGain, byte SoundFlags, double SoundRadius)
  2123. {
  2124. if (rotation.X == rotation.Y && rotation.Y == rotation.Z && rotation.Z == rotation.W && rotation.W == 0)
  2125. rotation = Quaternion.Identity;
  2126. ObjectUpdatePacket outPacket = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
  2127. // TODO: don't create new blocks if recycling an old packet
  2128. outPacket.RegionData.RegionHandle = regionHandle;
  2129. outPacket.RegionData.TimeDilation = timeDilation;
  2130. outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
  2131. outPacket.ObjectData[0] = CreatePrimUpdateBlock(primShape, flags);
  2132. outPacket.ObjectData[0].ID = localID;
  2133. outPacket.ObjectData[0].FullID = objectID;
  2134. outPacket.ObjectData[0].OwnerID = ownerID;
  2135. outPacket.ObjectData[0].Text = LLUtil.StringToPacketBytes(text);
  2136. outPacket.ObjectData[0].TextColor[0] = color[0];
  2137. outPacket.ObjectData[0].TextColor[1] = color[1];
  2138. outPacket.ObjectData[0].TextColor[2] = color[2];
  2139. outPacket.ObjectData[0].TextColor[3] = color[3];
  2140. outPacket.ObjectData[0].ParentID = parentID;
  2141. outPacket.ObjectData[0].PSBlock = particleSystem;
  2142. outPacket.ObjectData[0].ClickAction = clickAction;
  2143. outPacket.ObjectData[0].Material = material;
  2144. outPacket.ObjectData[0].Flags = 0;
  2145. if (attachment)
  2146. {
  2147. // Necessary???
  2148. outPacket.ObjectData[0].JointAxisOrAnchor = new Vector3(0, 0, 2);
  2149. outPacket.ObjectData[0].JointPivot = new Vector3(0, 0, 0);
  2150. // Item from inventory???
  2151. outPacket.ObjectData[0].NameValue =
  2152. Utils.StringToBytes("AttachItemID STRING RW SV " + AssetId.Guid);
  2153. outPacket.ObjectData[0].State = (byte)((AttachPoint % 16) * 16 + (AttachPoint / 16));
  2154. }
  2155. // Xantor 20080528: Send sound info as well
  2156. // Xantor 20080530: Zero out everything if there's no SoundId, so zerocompression will work again
  2157. outPacket.ObjectData[0].Sound = SoundId;
  2158. if (SoundId == UUID.Zero)
  2159. {
  2160. outPacket.ObjectData[0].OwnerID = UUID.Zero;
  2161. outPacket.ObjectData[0].Gain = 0.0f;
  2162. outPacket.ObjectData[0].Radius = 0.0f;
  2163. outPacket.ObjectData[0].Flags = 0;
  2164. }
  2165. else
  2166. {
  2167. outPacket.ObjectData[0].OwnerID = ownerID;
  2168. outPacket.ObjectData[0].Gain = (float)SoundGain;
  2169. outPacket.ObjectData[0].Radius = (float)SoundRadius;
  2170. outPacket.ObjectData[0].Flags = SoundFlags;
  2171. }
  2172. byte[] pb = pos.GetBytes();
  2173. Array.Copy(pb, 0, outPacket.ObjectData[0].ObjectData, 0, pb.Length);
  2174. byte[] vel = velocity.GetBytes();
  2175. Array.Copy(vel, 0, outPacket.ObjectData[0].ObjectData, pb.Length, vel.Length);
  2176. byte[] rot = rotation.GetBytes();
  2177. Array.Copy(rot, 0, outPacket.ObjectData[0].ObjectData, 36, rot.Length);
  2178. byte[] rvel = rotational_velocity.GetBytes();
  2179. Array.Copy(rvel, 0, outPacket.ObjectData[0].ObjectData, 36 + rot.Length, rvel.Length);
  2180. if (textureanim.Length > 0)
  2181. {
  2182. outPacket.ObjectData[0].TextureAnim = textureanim;
  2183. }
  2184. outPacket.Header.Zerocoded = true;
  2185. OutPacket(outPacket, ThrottleOutPacketType.Task | ThrottleOutPacketType.LowPriority);
  2186. }
  2187. /// <summary>
  2188. ///
  2189. /// </summary>
  2190. public void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position,
  2191. Quaternion rotation, Vector3 velocity, Vector3 rotationalvelocity, byte state, UUID AssetId)
  2192. {
  2193. if (rotation.X == rotation.Y && rotation.Y == rotation.Z && rotation.Z == rotation.W && rotation.W == 0)
  2194. rotation = Quaternion.Identity;
  2195. ImprovedTerseObjectUpdatePacket terse = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate);
  2196. // TODO: don't create new blocks if recycling an old packet
  2197. terse.RegionData.RegionHandle = regionHandle;
  2198. terse.RegionData.TimeDilation = timeDilation;
  2199. terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
  2200. terse.ObjectData[0] = CreatePrimImprovedBlock(localID, position, rotation, velocity, rotationalvelocity, state); // AssetID should fall into here probably somehow...
  2201. terse.Header.Reliable = false;
  2202. terse.Header.Zerocoded = true;
  2203. OutPacket(terse, ThrottleOutPacketType.Task | ThrottleOutPacketType.LowPriority);
  2204. }
  2205. public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID)
  2206. {
  2207. AssetUploadCompletePacket newPack = new AssetUploadCompletePacket();
  2208. newPack.AssetBlock.Type = AssetType;
  2209. newPack.AssetBlock.Success = Success;
  2210. newPack.AssetBlock.UUID = AssetFullID;
  2211. newPack.Header.Zerocoded = true;
  2212. OutPacket(newPack, ThrottleOutPacketType.Asset);
  2213. }
  2214. public void SendXferRequest(ulong XferID, short AssetType, UUID vFileID, byte FilePath, byte[] FileName)
  2215. {
  2216. RequestXferPacket newPack = new RequestXferPacket();
  2217. newPack.XferID.ID = XferID;
  2218. newPack.XferID.VFileType = AssetType;
  2219. newPack.XferID.VFileID = vFileID;
  2220. newPack.XferID.FilePath = FilePath;
  2221. newPack.XferID.Filename = FileName;
  2222. newPack.Header.Zerocoded = true;
  2223. OutPacket(newPack, ThrottleOutPacketType.Asset);
  2224. }
  2225. public void SendConfirmXfer(ulong xferID, uint PacketID)
  2226. {
  2227. ConfirmXferPacketPacket newPack = new ConfirmXferPacketPacket();
  2228. newPack.XferID.ID = xferID;
  2229. newPack.XferID.Packet = PacketID;
  2230. newPack.Header.Zerocoded = true;
  2231. OutPacket(newPack, ThrottleOutPacketType.Asset);
  2232. }
  2233. public void SendImageFirstPart(
  2234. ushort numParts, UUID ImageUUID, uint ImageSize, byte[] ImageData, byte imageCodec)
  2235. {
  2236. ImageDataPacket im = new ImageDataPacket();
  2237. im.Header.Reliable = false;
  2238. im.ImageID.Packets = numParts;
  2239. im.ImageID.ID = ImageUUID;
  2240. if (ImageSize > 0)
  2241. im.ImageID.Size = ImageSize;
  2242. im.ImageData.Data = ImageData;
  2243. im.ImageID.Codec = imageCodec;
  2244. im.Header.Zerocoded = true;
  2245. OutPacket(im, ThrottleOutPacketType.Texture);
  2246. }
  2247. public void SendImageNextPart(ushort partNumber, UUID imageUuid, byte[] imageData)
  2248. {
  2249. ImagePacketPacket im = new ImagePacketPacket();
  2250. im.Header.Reliable = false;
  2251. im.ImageID.Packet = partNumber;
  2252. im.ImageID.ID = imageUuid;
  2253. im.ImageData.Data = imageData;
  2254. OutPacket(im, ThrottleOutPacketType.Texture);
  2255. }
  2256. public void SendImageNotFound(UUID imageid)
  2257. {
  2258. ImageNotInDatabasePacket notFoundPacket
  2259. = (ImageNotInDatabasePacket)PacketPool.Instance.GetPacket(PacketType.ImageNotInDatabase);
  2260. notFoundPacket.ImageID.ID = imageid;
  2261. OutPacket(notFoundPacket, ThrottleOutPacketType.Texture);
  2262. }
  2263. public void SendShutdownConnectionNotice()
  2264. {
  2265. OutPacket(PacketPool.Instance.GetPacket(PacketType.DisableSimulator), ThrottleOutPacketType.Unknown);
  2266. }
  2267. public void SendSimStats(SimStats stats)
  2268. {
  2269. SimStatsPacket pack = new SimStatsPacket();
  2270. pack.Region = new SimStatsPacket.RegionBlock();
  2271. pack.Region.RegionX = stats.RegionX;
  2272. pack.Region.RegionY = stats.RegionY;
  2273. pack.Region.RegionFlags = stats.RegionFlags;
  2274. pack.Region.ObjectCapacity = stats.ObjectCapacity;
  2275. //pack.Region = //stats.RegionBlock;
  2276. pack.Stat = stats.StatsBlock;
  2277. pack.Header.Reliable = false;
  2278. OutPacket(pack, ThrottleOutPacketType.Task);
  2279. }
  2280. public void SendObjectPropertiesFamilyData(uint RequestFlags, UUID ObjectUUID, UUID OwnerID, UUID GroupID,
  2281. uint BaseMask, uint OwnerMask, uint GroupMask, uint EveryoneMask,
  2282. uint NextOwnerMask, int OwnershipCost, byte SaleType, int SalePrice, uint Category,
  2283. UUID LastOwnerID, string ObjectName, string Description)
  2284. {
  2285. ObjectPropertiesFamilyPacket objPropFamilyPack = (ObjectPropertiesFamilyPacket)PacketPool.Instance.GetPacket(PacketType.ObjectPropertiesFamily);
  2286. // TODO: don't create new blocks if recycling an old packet
  2287. ObjectPropertiesFamilyPacket.ObjectDataBlock objPropDB = new ObjectPropertiesFamilyPacket.ObjectDataBlock();
  2288. objPropDB.RequestFlags = RequestFlags;
  2289. objPropDB.ObjectID = ObjectUUID;
  2290. objPropDB.OwnerID = OwnerID;
  2291. objPropDB.GroupID = GroupID;
  2292. objPropDB.BaseMask = BaseMask;
  2293. objPropDB.OwnerMask = OwnerMask;
  2294. objPropDB.GroupMask = GroupMask;
  2295. objPropDB.EveryoneMask = EveryoneMask;
  2296. objPropDB.NextOwnerMask = NextOwnerMask;
  2297. // TODO: More properties are needed in SceneObjectPart!
  2298. objPropDB.OwnershipCost = OwnershipCost;
  2299. objPropDB.SaleType = SaleType;
  2300. objPropDB.SalePrice = SalePrice;
  2301. objPropDB.Category = Category;
  2302. objPropDB.LastOwnerID = LastOwnerID;
  2303. objPropDB.Name = Utils.StringToBytes(ObjectName);
  2304. objPropDB.Description = Utils.StringToBytes(Description);
  2305. objPropFamilyPack.ObjectData = objPropDB;
  2306. objPropFamilyPack.Header.Zerocoded = true;
  2307. OutPacket(objPropFamilyPack, ThrottleOutPacketType.Task);
  2308. }
  2309. public void SendObjectPropertiesReply(UUID ItemID, ulong CreationDate, UUID CreatorUUID, UUID FolderUUID, UUID FromTaskUUID,
  2310. UUID GroupUUID, short InventorySerial, UUID LastOwnerUUID, UUID ObjectUUID,
  2311. UUID OwnerUUID, string TouchTitle, byte[] TextureID, string SitTitle, string ItemName,
  2312. string ItemDescription, uint OwnerMask, uint NextOwnerMask, uint GroupMask, uint EveryoneMask,
  2313. uint BaseMask, byte saleType, int salePrice)
  2314. {
  2315. ObjectPropertiesPacket proper = (ObjectPropertiesPacket)PacketPool.Instance.GetPacket(PacketType.ObjectProperties);
  2316. // TODO: don't create new blocks if recycling an old packet
  2317. proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1];
  2318. proper.ObjectData[0] = new ObjectPropertiesPacket.ObjectDataBlock();
  2319. proper.ObjectData[0].ItemID = ItemID;
  2320. proper.ObjectData[0].CreationDate = CreationDate;
  2321. proper.ObjectData[0].CreatorID = CreatorUUID;
  2322. proper.ObjectData[0].FolderID = FolderUUID;
  2323. proper.ObjectData[0].FromTaskID = FromTaskUUID;
  2324. proper.ObjectData[0].GroupID = GroupUUID;
  2325. proper.ObjectData[0].InventorySerial = InventorySerial;
  2326. proper.ObjectData[0].LastOwnerID = LastOwnerUUID;
  2327. // proper.ObjectData[0].LastOwnerID = UUID.Zero;
  2328. proper.ObjectData[0].ObjectID = ObjectUUID;
  2329. proper.ObjectData[0].OwnerID = OwnerUUID;
  2330. proper.ObjectData[0].TouchName = Utils.StringToBytes(TouchTitle);
  2331. proper.ObjectData[0].TextureID = TextureID;
  2332. proper.ObjectData[0].SitName = Utils.StringToBytes(SitTitle);
  2333. proper.ObjectData[0].Name = Utils.StringToBytes(ItemName);
  2334. proper.ObjectData[0].Description = Utils.StringToBytes(ItemDescription);
  2335. proper.ObjectData[0].OwnerMask = OwnerMask;
  2336. proper.ObjectData[0].NextOwnerMask = NextOwnerMask;
  2337. proper.ObjectData[0].GroupMask = GroupMask;
  2338. proper.ObjectData[0].EveryoneMask = EveryoneMask;
  2339. proper.ObjectData[0].BaseMask = BaseMask;
  2340. // proper.ObjectData[0].AggregatePerms = 53;
  2341. // proper.ObjectData[0].AggregatePermTextures = 0;
  2342. // proper.ObjectData[0].AggregatePermTexturesOwner = 0;
  2343. proper.ObjectData[0].SaleType = saleType;
  2344. proper.ObjectData[0].SalePrice = salePrice;
  2345. proper.Header.Zerocoded = true;
  2346. OutPacket(proper, ThrottleOutPacketType.Task);
  2347. }
  2348. #endregion
  2349. #region Estate Data Sending Methods
  2350. private static bool convertParamStringToBool(byte[] field)
  2351. {
  2352. string s = Utils.BytesToString(field);
  2353. if (s == "1" || s.ToLower() == "y" || s.ToLower() == "yes" || s.ToLower() == "t" || s.ToLower() == "true")
  2354. {
  2355. return true;
  2356. }
  2357. return false;
  2358. }
  2359. public void SendEstateManagersList(UUID invoice, UUID[] EstateManagers, uint estateID)
  2360. {
  2361. EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket();
  2362. packet.AgentData.TransactionID = UUID.Random();
  2363. packet.AgentData.AgentID = AgentId;
  2364. packet.AgentData.SessionID = this.SessionId;
  2365. packet.MethodData.Invoice = invoice;
  2366. packet.MethodData.Method = Utils.StringToBytes("setaccess");
  2367. EstateOwnerMessagePacket.ParamListBlock[] returnblock = new EstateOwnerMessagePacket.ParamListBlock[6 + EstateManagers.Length];
  2368. for (int i = 0; i < (6 + EstateManagers.Length); i++)
  2369. {
  2370. returnblock[i] = new EstateOwnerMessagePacket.ParamListBlock();
  2371. }
  2372. int j = 0;
  2373. returnblock[j].Parameter = Utils.StringToBytes(estateID.ToString()); j++;
  2374. returnblock[j].Parameter = Utils.StringToBytes(((int)Constants.EstateAccessCodex.EstateManagers).ToString()); j++;
  2375. returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
  2376. returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
  2377. returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
  2378. returnblock[j].Parameter = Utils.StringToBytes(EstateManagers.Length.ToString()); j++;
  2379. for (int i = 0; i < EstateManagers.Length; i++)
  2380. {
  2381. returnblock[j].Parameter = EstateManagers[i].GetBytes(); j++;
  2382. }
  2383. packet.ParamList = returnblock;
  2384. packet.Header.Reliable = false;
  2385. this.OutPacket(packet, ThrottleOutPacketType.Task);
  2386. }
  2387. public void SendBannedUserList(UUID invoice, EstateBan[] bl, uint estateID)
  2388. {
  2389. List<UUID> BannedUsers = new List<UUID>();
  2390. for (int i = 0; i < bl.Length; i++)
  2391. {
  2392. if (bl[i] == null)
  2393. continue;
  2394. if (bl[i].bannedUUID == UUID.Zero)
  2395. continue;
  2396. BannedUsers.Add(bl[i].bannedUUID);
  2397. }
  2398. EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket();
  2399. packet.AgentData.TransactionID = UUID.Random();
  2400. packet.AgentData.AgentID = AgentId;
  2401. packet.AgentData.SessionID = this.SessionId;
  2402. packet.MethodData.Invoice = invoice;
  2403. packet.MethodData.Method = Utils.StringToBytes("setaccess");
  2404. EstateOwnerMessagePacket.ParamListBlock[] returnblock = new EstateOwnerMessagePacket.ParamListBlock[6 + BannedUsers.Count];
  2405. for (int i = 0; i < (6 + BannedUsers.Count); i++)
  2406. {
  2407. returnblock[i] = new EstateOwnerMessagePacket.ParamListBlock();
  2408. }
  2409. int j = 0;
  2410. returnblock[j].Parameter = Utils.StringToBytes(estateID.ToString()); j++;
  2411. returnblock[j].Parameter = Utils.StringToBytes(((int)Constants.EstateAccessCodex.EstateBans).ToString()); j++;
  2412. returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
  2413. returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
  2414. returnblock[j].Parameter = Utils.StringToBytes(BannedUsers.Count.ToString()); j++;
  2415. returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
  2416. foreach (UUID banned in BannedUsers)
  2417. {
  2418. returnblock[j].Parameter = banned.GetBytes(); j++;
  2419. }
  2420. packet.ParamList = returnblock;
  2421. packet.Header.Reliable = false;
  2422. this.OutPacket(packet, ThrottleOutPacketType.Task);
  2423. }
  2424. public void SendRegionInfoToEstateMenu(RegionInfoForEstateMenuArgs args)
  2425. {
  2426. RegionInfoPacket rinfopack = new RegionInfoPacket();
  2427. RegionInfoPacket.RegionInfoBlock rinfoblk = new RegionInfoPacket.RegionInfoBlock();
  2428. rinfopack.AgentData.AgentID = AgentId;
  2429. rinfopack.AgentData.SessionID = this.SessionId;
  2430. rinfoblk.BillableFactor = args.billableFactor;
  2431. rinfoblk.EstateID = args.estateID;
  2432. rinfoblk.MaxAgents = args.maxAgents;
  2433. rinfoblk.ObjectBonusFactor = args.objectBonusFactor;
  2434. rinfoblk.ParentEstateID = args.parentEstateID;
  2435. rinfoblk.PricePerMeter = args.pricePerMeter;
  2436. rinfoblk.RedirectGridX = args.redirectGridX;
  2437. rinfoblk.RedirectGridY = args.redirectGridY;
  2438. rinfoblk.RegionFlags = args.regionFlags;
  2439. rinfoblk.SimAccess = args.simAccess;
  2440. rinfoblk.SunHour = args.sunHour;
  2441. rinfoblk.TerrainLowerLimit = args.terrainLowerLimit;
  2442. rinfoblk.TerrainRaiseLimit = args.terrainRaiseLimit;
  2443. rinfoblk.UseEstateSun = args.useEstateSun;
  2444. rinfoblk.WaterHeight = args.waterHeight;
  2445. rinfoblk.SimName = Utils.StringToBytes(args.simName);
  2446. rinfopack.RegionInfo = rinfoblk;
  2447. this.OutPacket(rinfopack, ThrottleOutPacketType.Task);
  2448. }
  2449. public void SendEstateCovenantInformation(UUID covenant)
  2450. {
  2451. EstateCovenantReplyPacket einfopack = new EstateCovenantReplyPacket();
  2452. EstateCovenantReplyPacket.DataBlock edata = new EstateCovenantReplyPacket.DataBlock();
  2453. edata.CovenantID = covenant;
  2454. edata.CovenantTimestamp = 0;
  2455. if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero)
  2456. edata.EstateOwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
  2457. else
  2458. edata.EstateOwnerID = m_scene.RegionInfo.MasterAvatarAssignedUUID;
  2459. edata.EstateName = Utils.StringToBytes(m_scene.RegionInfo.EstateSettings.EstateName);
  2460. einfopack.Data = edata;
  2461. this.OutPacket(einfopack, ThrottleOutPacketType.Task);
  2462. }
  2463. public void SendDetailedEstateData(UUID invoice, string estateName, uint estateID, uint parentEstate, uint estateFlags, uint sunPosition, UUID covenant, string abuseEmail, UUID estateOwner)
  2464. {
  2465. EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket();
  2466. packet.MethodData.Invoice = invoice;
  2467. packet.AgentData.TransactionID = UUID.Random();
  2468. packet.MethodData.Method = Utils.StringToBytes("estateupdateinfo");
  2469. EstateOwnerMessagePacket.ParamListBlock[] returnblock = new EstateOwnerMessagePacket.ParamListBlock[10];
  2470. for (int i = 0; i < 10; i++)
  2471. {
  2472. returnblock[i] = new EstateOwnerMessagePacket.ParamListBlock();
  2473. }
  2474. //Sending Estate Settings
  2475. returnblock[0].Parameter = Utils.StringToBytes(estateName);
  2476. // TODO: remove this cruft once MasterAvatar is fully deprecated
  2477. //
  2478. returnblock[1].Parameter = Utils.StringToBytes(estateOwner.ToString());
  2479. returnblock[2].Parameter = Utils.StringToBytes(estateID.ToString());
  2480. returnblock[3].Parameter = Utils.StringToBytes(estateFlags.ToString());
  2481. returnblock[4].Parameter = Utils.StringToBytes(sunPosition.ToString());
  2482. returnblock[5].Parameter = Utils.StringToBytes(parentEstate.ToString());
  2483. returnblock[6].Parameter = Utils.StringToBytes(covenant.ToString());
  2484. returnblock[7].Parameter = Utils.StringToBytes("1160895077"); // what is this?
  2485. returnblock[8].Parameter = Utils.StringToBytes("1"); // what is this?
  2486. returnblock[9].Parameter = Utils.StringToBytes(abuseEmail);
  2487. packet.ParamList = returnblock;
  2488. packet.Header.Reliable = false;
  2489. //System.Console.WriteLine("[ESTATE]: SIM--->" + packet.ToString());
  2490. this.OutPacket(packet, ThrottleOutPacketType.Task);
  2491. }
  2492. #endregion
  2493. #region Land Data Sending Methods
  2494. public void SendLandParcelOverlay(byte[] data, int sequence_id)
  2495. {
  2496. ParcelOverlayPacket packet;
  2497. packet = (ParcelOverlayPacket)PacketPool.Instance.GetPacket(PacketType.ParcelOverlay);
  2498. packet.ParcelData.Data = data;
  2499. packet.ParcelData.SequenceID = sequence_id;
  2500. packet.Header.Zerocoded = true;
  2501. this.OutPacket(packet, ThrottleOutPacketType.Task);
  2502. }
  2503. public void SendLandProperties(int sequence_id, bool snap_selection, int request_result, LandData landData, float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity, uint regionFlags)
  2504. {
  2505. ParcelPropertiesPacket updatePacket = (ParcelPropertiesPacket)PacketPool.Instance.GetPacket(PacketType.ParcelProperties);
  2506. // TODO: don't create new blocks if recycling an old packet
  2507. updatePacket.ParcelData.AABBMax = landData.AABBMax;
  2508. updatePacket.ParcelData.AABBMin = landData.AABBMin;
  2509. updatePacket.ParcelData.Area = landData.Area;
  2510. updatePacket.ParcelData.AuctionID = landData.AuctionID;
  2511. updatePacket.ParcelData.AuthBuyerID = landData.AuthBuyerID;
  2512. updatePacket.ParcelData.Bitmap = landData.Bitmap;
  2513. updatePacket.ParcelData.Desc = Utils.StringToBytes(landData.Description);
  2514. updatePacket.ParcelData.Category = (byte)landData.Category;
  2515. updatePacket.ParcelData.ClaimDate = landData.ClaimDate;
  2516. updatePacket.ParcelData.ClaimPrice = landData.ClaimPrice;
  2517. updatePacket.ParcelData.GroupID = landData.GroupID;
  2518. updatePacket.ParcelData.GroupPrims = landData.GroupPrims;
  2519. updatePacket.ParcelData.IsGroupOwned = landData.IsGroupOwned;
  2520. updatePacket.ParcelData.LandingType = (byte)landData.LandingType;
  2521. updatePacket.ParcelData.LocalID = landData.LocalID;
  2522. if (landData.Area > 0)
  2523. {
  2524. updatePacket.ParcelData.MaxPrims = parcelObjectCapacity;
  2525. }
  2526. else
  2527. {
  2528. updatePacket.ParcelData.MaxPrims = 0;
  2529. }
  2530. updatePacket.ParcelData.MediaAutoScale = landData.MediaAutoScale;
  2531. updatePacket.ParcelData.MediaID = landData.MediaID;
  2532. updatePacket.ParcelData.MediaURL = LLUtil.StringToPacketBytes(landData.MediaURL);
  2533. updatePacket.ParcelData.MusicURL = LLUtil.StringToPacketBytes(landData.MusicURL);
  2534. updatePacket.ParcelData.Name = Utils.StringToBytes(landData.Name);
  2535. updatePacket.ParcelData.OtherCleanTime = landData.OtherCleanTime;
  2536. updatePacket.ParcelData.OtherCount = 0; //unemplemented
  2537. updatePacket.ParcelData.OtherPrims = landData.OtherPrims;
  2538. updatePacket.ParcelData.OwnerID = landData.OwnerID;
  2539. updatePacket.ParcelData.OwnerPrims = landData.OwnerPrims;
  2540. updatePacket.ParcelData.ParcelFlags = landData.Flags;
  2541. updatePacket.ParcelData.ParcelPrimBonus = simObjectBonusFactor;
  2542. updatePacket.ParcelData.PassHours = landData.PassHours;
  2543. updatePacket.ParcelData.PassPrice = landData.PassPrice;
  2544. updatePacket.ParcelData.PublicCount = 0; //unemplemented
  2545. updatePacket.ParcelData.RegionDenyAnonymous = ((regionFlags & (uint)RegionFlags.DenyAnonymous) >
  2546. 0);
  2547. updatePacket.ParcelData.RegionDenyIdentified = ((regionFlags & (uint)RegionFlags.DenyIdentified) >
  2548. 0);
  2549. updatePacket.ParcelData.RegionDenyTransacted = ((regionFlags & (uint)RegionFlags.DenyTransacted) >
  2550. 0);
  2551. updatePacket.ParcelData.RegionPushOverride = ((regionFlags & (uint)RegionFlags.RestrictPushObject) >
  2552. 0);
  2553. updatePacket.ParcelData.RentPrice = 0;
  2554. updatePacket.ParcelData.RequestResult = request_result;
  2555. updatePacket.ParcelData.SalePrice = landData.SalePrice;
  2556. updatePacket.ParcelData.SelectedPrims = landData.SelectedPrims;
  2557. updatePacket.ParcelData.SelfCount = 0; //unemplemented
  2558. updatePacket.ParcelData.SequenceID = sequence_id;
  2559. if (landData.SimwideArea > 0)
  2560. {
  2561. updatePacket.ParcelData.SimWideMaxPrims = parcelObjectCapacity;
  2562. }
  2563. else
  2564. {
  2565. updatePacket.ParcelData.SimWideMaxPrims = 0;
  2566. }
  2567. updatePacket.ParcelData.SimWideTotalPrims = landData.SimwidePrims;
  2568. updatePacket.ParcelData.SnapSelection = snap_selection;
  2569. updatePacket.ParcelData.SnapshotID = landData.SnapshotID;
  2570. updatePacket.ParcelData.Status = (byte)landData.Status;
  2571. updatePacket.ParcelData.TotalPrims = landData.OwnerPrims + landData.GroupPrims + landData.OtherPrims +
  2572. landData.SelectedPrims;
  2573. updatePacket.ParcelData.UserLocation = landData.UserLocation;
  2574. updatePacket.ParcelData.UserLookAt = landData.UserLookAt;
  2575. updatePacket.Header.Zerocoded = true;
  2576. OutPacket((Packet)updatePacket, ThrottleOutPacketType.Task);
  2577. }
  2578. public void SendLandAccessListData(List<UUID> avatars, uint accessFlag, int localLandID)
  2579. {
  2580. ParcelAccessListReplyPacket replyPacket = (ParcelAccessListReplyPacket)PacketPool.Instance.GetPacket(PacketType.ParcelAccessListReply);
  2581. replyPacket.Data.AgentID = AgentId;
  2582. replyPacket.Data.Flags = accessFlag;
  2583. replyPacket.Data.LocalID = localLandID;
  2584. replyPacket.Data.SequenceID = 0;
  2585. List<ParcelAccessListReplyPacket.ListBlock> list = new List<ParcelAccessListReplyPacket.ListBlock>();
  2586. foreach (UUID avatar in avatars)
  2587. {
  2588. ParcelAccessListReplyPacket.ListBlock block = new ParcelAccessListReplyPacket.ListBlock();
  2589. block.Flags = accessFlag;
  2590. block.ID = avatar;
  2591. block.Time = 0;
  2592. }
  2593. replyPacket.List = list.ToArray();
  2594. replyPacket.Header.Zerocoded = true;
  2595. this.OutPacket((Packet)replyPacket, ThrottleOutPacketType.Task);
  2596. }
  2597. public void SendForceClientSelectObjects(List<uint> ObjectIDs)
  2598. {
  2599. bool firstCall = true;
  2600. int MAX_OBJECTS_PER_PACKET = 251;
  2601. ForceObjectSelectPacket pack = (ForceObjectSelectPacket)PacketPool.Instance.GetPacket(PacketType.ForceObjectSelect);
  2602. ForceObjectSelectPacket.DataBlock[] data;
  2603. while (ObjectIDs.Count > 0)
  2604. {
  2605. if (firstCall)
  2606. {
  2607. pack._Header.ResetList = true;
  2608. firstCall = false;
  2609. }
  2610. else
  2611. {
  2612. pack._Header.ResetList = false;
  2613. }
  2614. if (ObjectIDs.Count > MAX_OBJECTS_PER_PACKET)
  2615. {
  2616. data = new ForceObjectSelectPacket.DataBlock[MAX_OBJECTS_PER_PACKET];
  2617. }
  2618. else
  2619. {
  2620. data = new ForceObjectSelectPacket.DataBlock[ObjectIDs.Count];
  2621. }
  2622. int i;
  2623. for (i = 0; i < MAX_OBJECTS_PER_PACKET && ObjectIDs.Count > 0; i++)
  2624. {
  2625. data[i] = new ForceObjectSelectPacket.DataBlock();
  2626. data[i].LocalID = Convert.ToUInt32(ObjectIDs[0]);
  2627. ObjectIDs.RemoveAt(0);
  2628. }
  2629. pack.Data = data;
  2630. pack.Header.Zerocoded = true;
  2631. this.OutPacket((Packet)pack, ThrottleOutPacketType.Task);
  2632. }
  2633. }
  2634. public void SendLandObjectOwners(Dictionary<UUID, int> ownersAndCount)
  2635. {
  2636. int notifyCount = ownersAndCount.Count;
  2637. ParcelObjectOwnersReplyPacket pack = (ParcelObjectOwnersReplyPacket)PacketPool.Instance.GetPacket(PacketType.ParcelObjectOwnersReply);
  2638. if (notifyCount > 0)
  2639. {
  2640. if (notifyCount > 32)
  2641. {
  2642. m_log.InfoFormat(
  2643. "[LAND]: More than {0} avatars own prims on this parcel. Only sending back details of first {0}"
  2644. + " - a developer might want to investigate whether this is a hard limit", 32);
  2645. notifyCount = 32;
  2646. }
  2647. ParcelObjectOwnersReplyPacket.DataBlock[] dataBlock
  2648. = new ParcelObjectOwnersReplyPacket.DataBlock[notifyCount];
  2649. int num = 0;
  2650. foreach (UUID owner in ownersAndCount.Keys)
  2651. {
  2652. dataBlock[num] = new ParcelObjectOwnersReplyPacket.DataBlock();
  2653. dataBlock[num].Count = ownersAndCount[owner];
  2654. dataBlock[num].IsGroupOwned = false; //TODO: fix me when group support is added
  2655. dataBlock[num].OnlineStatus = true; //TODO: fix me later
  2656. dataBlock[num].OwnerID = owner;
  2657. num++;
  2658. if (num >= notifyCount)
  2659. {
  2660. break;
  2661. }
  2662. }
  2663. pack.Data = dataBlock;
  2664. }
  2665. pack.Header.Zerocoded = true;
  2666. this.OutPacket(pack, ThrottleOutPacketType.Task);
  2667. }
  2668. #endregion
  2669. #region Helper Methods
  2670. protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateAvatarImprovedBlock(uint localID, Vector3 pos,
  2671. Vector3 velocity,
  2672. Quaternion rotation)
  2673. {
  2674. byte[] bytes = new byte[60];
  2675. int i = 0;
  2676. ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock();
  2677. dat.TextureEntry = new byte[0]; // AvatarTemplate.TextureEntry;
  2678. uint ID = localID;
  2679. bytes[i++] = (byte)(ID % 256);
  2680. bytes[i++] = (byte)((ID >> 8) % 256);
  2681. bytes[i++] = (byte)((ID >> 16) % 256);
  2682. bytes[i++] = (byte)((ID >> 24) % 256);
  2683. bytes[i++] = 0;
  2684. bytes[i++] = 1;
  2685. i += 14;
  2686. bytes[i++] = 128;
  2687. bytes[i++] = 63;
  2688. byte[] pb = pos.GetBytes();
  2689. Array.Copy(pb, 0, bytes, i, pb.Length);
  2690. i += 12;
  2691. ushort InternVelocityX;
  2692. ushort InternVelocityY;
  2693. ushort InternVelocityZ;
  2694. Vector3 internDirec = new Vector3(0, 0, 0);
  2695. internDirec = new Vector3(velocity.X, velocity.Y, velocity.Z);
  2696. internDirec = internDirec / 128.0f;
  2697. internDirec.X += 1;
  2698. internDirec.Y += 1;
  2699. internDirec.Z += 1;
  2700. InternVelocityX = (ushort)(32768 * internDirec.X);
  2701. InternVelocityY = (ushort)(32768 * internDirec.Y);
  2702. InternVelocityZ = (ushort)(32768 * internDirec.Z);
  2703. ushort ac = 32767;
  2704. bytes[i++] = (byte)(InternVelocityX % 256);
  2705. bytes[i++] = (byte)((InternVelocityX >> 8) % 256);
  2706. bytes[i++] = (byte)(InternVelocityY % 256);
  2707. bytes[i++] = (byte)((InternVelocityY >> 8) % 256);
  2708. bytes[i++] = (byte)(InternVelocityZ % 256);
  2709. bytes[i++] = (byte)((InternVelocityZ >> 8) % 256);
  2710. //accel
  2711. bytes[i++] = (byte)(ac % 256);
  2712. bytes[i++] = (byte)((ac >> 8) % 256);
  2713. bytes[i++] = (byte)(ac % 256);
  2714. bytes[i++] = (byte)((ac >> 8) % 256);
  2715. bytes[i++] = (byte)(ac % 256);
  2716. bytes[i++] = (byte)((ac >> 8) % 256);
  2717. //rotation
  2718. ushort rw, rx, ry, rz;
  2719. rw = (ushort)(32768 * (rotation.W + 1));
  2720. rx = (ushort)(32768 * (rotation.X + 1));
  2721. ry = (ushort)(32768 * (rotation.Y + 1));
  2722. rz = (ushort)(32768 * (rotation.Z + 1));
  2723. //rot
  2724. bytes[i++] = (byte)(rx % 256);
  2725. bytes[i++] = (byte)((rx >> 8) % 256);
  2726. bytes[i++] = (byte)(ry % 256);
  2727. bytes[i++] = (byte)((ry >> 8) % 256);
  2728. bytes[i++] = (byte)(rz % 256);
  2729. bytes[i++] = (byte)((rz >> 8) % 256);
  2730. bytes[i++] = (byte)(rw % 256);
  2731. bytes[i++] = (byte)((rw >> 8) % 256);
  2732. //rotation vel
  2733. bytes[i++] = (byte)(ac % 256);
  2734. bytes[i++] = (byte)((ac >> 8) % 256);
  2735. bytes[i++] = (byte)(ac % 256);
  2736. bytes[i++] = (byte)((ac >> 8) % 256);
  2737. bytes[i++] = (byte)(ac % 256);
  2738. bytes[i++] = (byte)((ac >> 8) % 256);
  2739. dat.Data = bytes;
  2740. return (dat);
  2741. }
  2742. /// <summary>
  2743. ///
  2744. /// </summary>
  2745. /// <param name="localID"></param>
  2746. /// <param name="position"></param>
  2747. /// <param name="rotation"></param>
  2748. /// <returns></returns>
  2749. protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreatePrimImprovedBlock(uint localID,
  2750. Vector3 position,
  2751. Quaternion rotation,
  2752. Vector3 velocity,
  2753. Vector3 rotationalvelocity,
  2754. byte state)
  2755. {
  2756. uint ID = localID;
  2757. byte[] bytes = new byte[60];
  2758. int i = 0;
  2759. ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock();
  2760. dat.TextureEntry = new byte[0];
  2761. bytes[i++] = (byte)(ID % 256);
  2762. bytes[i++] = (byte)((ID >> 8) % 256);
  2763. bytes[i++] = (byte)((ID >> 16) % 256);
  2764. bytes[i++] = (byte)((ID >> 24) % 256);
  2765. bytes[i++] = state;
  2766. bytes[i++] = 0;
  2767. byte[] pb = position.GetBytes();
  2768. Array.Copy(pb, 0, bytes, i, pb.Length);
  2769. i += 12;
  2770. ushort ac = 32767;
  2771. ushort velx, vely, velz;
  2772. Vector3 vel = new Vector3(velocity.X, velocity.Y, velocity.Z);
  2773. vel = vel / 128.0f;
  2774. vel.X += 1;
  2775. vel.Y += 1;
  2776. vel.Z += 1;
  2777. //vel
  2778. velx = (ushort)(32768 * (vel.X));
  2779. vely = (ushort)(32768 * (vel.Y));
  2780. velz = (ushort)(32768 * (vel.Z));
  2781. bytes[i++] = (byte)(velx % 256);
  2782. bytes[i++] = (byte)((velx >> 8) % 256);
  2783. bytes[i++] = (byte)(vely % 256);
  2784. bytes[i++] = (byte)((vely >> 8) % 256);
  2785. bytes[i++] = (byte)(velz % 256);
  2786. bytes[i++] = (byte)((velz >> 8) % 256);
  2787. //accel
  2788. bytes[i++] = (byte)(ac % 256);
  2789. bytes[i++] = (byte)((ac >> 8) % 256);
  2790. bytes[i++] = (byte)(ac % 256);
  2791. bytes[i++] = (byte)((ac >> 8) % 256);
  2792. bytes[i++] = (byte)(ac % 256);
  2793. bytes[i++] = (byte)((ac >> 8) % 256);
  2794. ushort rw, rx, ry, rz;
  2795. rw = (ushort)(32768 * (rotation.W + 1));
  2796. rx = (ushort)(32768 * (rotation.X + 1));
  2797. ry = (ushort)(32768 * (rotation.Y + 1));
  2798. rz = (ushort)(32768 * (rotation.Z + 1));
  2799. //rot
  2800. bytes[i++] = (byte)(rx % 256);
  2801. bytes[i++] = (byte)((rx >> 8) % 256);
  2802. bytes[i++] = (byte)(ry % 256);
  2803. bytes[i++] = (byte)((ry >> 8) % 256);
  2804. bytes[i++] = (byte)(rz % 256);
  2805. bytes[i++] = (byte)((rz >> 8) % 256);
  2806. bytes[i++] = (byte)(rw % 256);
  2807. bytes[i++] = (byte)((rw >> 8) % 256);
  2808. //rotation vel
  2809. ushort rvelx, rvely, rvelz;
  2810. Vector3 rvel = new Vector3(rotationalvelocity.X, rotationalvelocity.Y, rotationalvelocity.Z);
  2811. rvel = rvel / 128.0f;
  2812. rvel.X += 1;
  2813. rvel.Y += 1;
  2814. rvel.Z += 1;
  2815. //vel
  2816. rvelx = (ushort)(32768 * (rvel.X));
  2817. rvely = (ushort)(32768 * (rvel.Y));
  2818. rvelz = (ushort)(32768 * (rvel.Z));
  2819. bytes[i++] = (byte)(rvelx % 256);
  2820. bytes[i++] = (byte)((rvelx >> 8) % 256);
  2821. bytes[i++] = (byte)(rvely % 256);
  2822. bytes[i++] = (byte)((rvely >> 8) % 256);
  2823. bytes[i++] = (byte)(rvelz % 256);
  2824. bytes[i++] = (byte)((rvelz >> 8) % 256);
  2825. dat.Data = bytes;
  2826. return dat;
  2827. }
  2828. /// <summary>
  2829. /// Create the ObjectDataBlock for a ObjectUpdatePacket (for a Primitive)
  2830. /// </summary>
  2831. /// <param name="primData"></param>
  2832. /// <returns></returns>
  2833. protected ObjectUpdatePacket.ObjectDataBlock CreatePrimUpdateBlock(PrimitiveBaseShape primShape, uint flags)
  2834. {
  2835. ObjectUpdatePacket.ObjectDataBlock objupdate = new ObjectUpdatePacket.ObjectDataBlock();
  2836. SetDefaultPrimPacketValues(objupdate);
  2837. objupdate.UpdateFlags = flags;
  2838. SetPrimPacketShapeData(objupdate, primShape);
  2839. if ((primShape.PCode == (byte)PCode.NewTree) || (primShape.PCode == (byte)PCode.Tree) || (primShape.PCode == (byte)PCode.Grass))
  2840. {
  2841. objupdate.Data = new byte[1];
  2842. objupdate.Data[0] = primShape.State;
  2843. }
  2844. return objupdate;
  2845. }
  2846. protected void SetPrimPacketShapeData(ObjectUpdatePacket.ObjectDataBlock objectData, PrimitiveBaseShape primData)
  2847. {
  2848. objectData.TextureEntry = primData.TextureEntry;
  2849. objectData.PCode = primData.PCode;
  2850. objectData.State = primData.State;
  2851. objectData.PathBegin = primData.PathBegin;
  2852. objectData.PathEnd = primData.PathEnd;
  2853. objectData.PathScaleX = primData.PathScaleX;
  2854. objectData.PathScaleY = primData.PathScaleY;
  2855. objectData.PathShearX = primData.PathShearX;
  2856. objectData.PathShearY = primData.PathShearY;
  2857. objectData.PathSkew = primData.PathSkew;
  2858. objectData.ProfileBegin = primData.ProfileBegin;
  2859. objectData.ProfileEnd = primData.ProfileEnd;
  2860. objectData.Scale = primData.Scale;
  2861. objectData.PathCurve = primData.PathCurve;
  2862. objectData.ProfileCurve = primData.ProfileCurve;
  2863. objectData.ProfileHollow = primData.ProfileHollow;
  2864. objectData.PathRadiusOffset = primData.PathRadiusOffset;
  2865. objectData.PathRevolutions = primData.PathRevolutions;
  2866. objectData.PathTaperX = primData.PathTaperX;
  2867. objectData.PathTaperY = primData.PathTaperY;
  2868. objectData.PathTwist = primData.PathTwist;
  2869. objectData.PathTwistBegin = primData.PathTwistBegin;
  2870. objectData.ExtraParams = primData.ExtraParams;
  2871. }
  2872. /// <summary>
  2873. /// Set some default values in a ObjectUpdatePacket
  2874. /// </summary>
  2875. /// <param name="objdata"></param>
  2876. protected void SetDefaultPrimPacketValues(ObjectUpdatePacket.ObjectDataBlock objdata)
  2877. {
  2878. objdata.PSBlock = new byte[0];
  2879. objdata.ExtraParams = new byte[1];
  2880. objdata.MediaURL = new byte[0];
  2881. objdata.NameValue = new byte[0];
  2882. objdata.Text = new byte[0];
  2883. objdata.TextColor = new byte[4];
  2884. objdata.JointAxisOrAnchor = new Vector3(0, 0, 0);
  2885. objdata.JointPivot = new Vector3(0, 0, 0);
  2886. objdata.Material = 3;
  2887. objdata.TextureAnim = new byte[0];
  2888. objdata.Sound = UUID.Zero;
  2889. objdata.State = 0;
  2890. objdata.Data = new byte[0];
  2891. objdata.ObjectData = new byte[60];
  2892. objdata.ObjectData[46] = 128;
  2893. objdata.ObjectData[47] = 63;
  2894. }
  2895. /// <summary>
  2896. ///
  2897. /// </summary>
  2898. /// <returns></returns>
  2899. public ObjectUpdatePacket.ObjectDataBlock CreateDefaultAvatarPacket(byte[] textureEntry)
  2900. {
  2901. ObjectUpdatePacket.ObjectDataBlock objdata = new ObjectUpdatePacket.ObjectDataBlock();
  2902. // new OpenMetaverse.Packets.ObjectUpdatePacket.ObjectDataBlock(data1, ref i);
  2903. SetDefaultAvatarPacketValues(ref objdata);
  2904. objdata.UpdateFlags = 61 + (9 << 8) + (130 << 16) + (16 << 24);
  2905. objdata.PathCurve = 16;
  2906. objdata.ProfileCurve = 1;
  2907. objdata.PathScaleX = 100;
  2908. objdata.PathScaleY = 100;
  2909. objdata.ParentID = 0;
  2910. objdata.OwnerID = UUID.Zero;
  2911. objdata.Scale = new Vector3(1, 1, 1);
  2912. objdata.PCode = (byte)PCode.Avatar;
  2913. if (textureEntry != null)
  2914. {
  2915. objdata.TextureEntry = textureEntry;
  2916. }
  2917. Vector3 pos = new Vector3(objdata.ObjectData, 16);
  2918. pos.X = 100f;
  2919. objdata.ID = 8880000;
  2920. objdata.NameValue = Utils.StringToBytes("FirstName STRING RW SV Test \nLastName STRING RW SV User ");
  2921. //Vector3 pos2 = new Vector3(100f, 100f, 23f);
  2922. //objdata.FullID=user.AgentId;
  2923. byte[] pb = pos.GetBytes();
  2924. Array.Copy(pb, 0, objdata.ObjectData, 16, pb.Length);
  2925. return objdata;
  2926. }
  2927. /// <summary>
  2928. ///
  2929. /// </summary>
  2930. /// <param name="objdata"></param>
  2931. protected void SetDefaultAvatarPacketValues(ref ObjectUpdatePacket.ObjectDataBlock objdata)
  2932. {
  2933. objdata.PSBlock = new byte[0];
  2934. objdata.ExtraParams = new byte[1];
  2935. objdata.MediaURL = new byte[0];
  2936. objdata.NameValue = new byte[0];
  2937. objdata.Text = new byte[0];
  2938. objdata.TextColor = new byte[4];
  2939. objdata.JointAxisOrAnchor = new Vector3(0, 0, 0);
  2940. objdata.JointPivot = new Vector3(0, 0, 0);
  2941. objdata.Material = 4;
  2942. objdata.TextureAnim = new byte[0];
  2943. objdata.Sound = UUID.Zero;
  2944. Primitive.TextureEntry ntex = new Primitive.TextureEntry(new UUID("00000000-0000-0000-5005-000000000005"));
  2945. objdata.TextureEntry = ntex.ToBytes();
  2946. objdata.State = 0;
  2947. objdata.Data = new byte[0];
  2948. objdata.ObjectData = new byte[76];
  2949. objdata.ObjectData[15] = 128;
  2950. objdata.ObjectData[16] = 63;
  2951. objdata.ObjectData[56] = 128;
  2952. objdata.ObjectData[61] = 102;
  2953. objdata.ObjectData[62] = 40;
  2954. objdata.ObjectData[63] = 61;
  2955. objdata.ObjectData[64] = 189;
  2956. }
  2957. public void SendNameReply(UUID profileId, string firstname, string lastname)
  2958. {
  2959. UUIDNameReplyPacket packet = (UUIDNameReplyPacket)PacketPool.Instance.GetPacket(PacketType.UUIDNameReply);
  2960. // TODO: don't create new blocks if recycling an old packet
  2961. packet.UUIDNameBlock = new UUIDNameReplyPacket.UUIDNameBlockBlock[1];
  2962. packet.UUIDNameBlock[0] = new UUIDNameReplyPacket.UUIDNameBlockBlock();
  2963. packet.UUIDNameBlock[0].ID = profileId;
  2964. packet.UUIDNameBlock[0].FirstName = Utils.StringToBytes(firstname);
  2965. packet.UUIDNameBlock[0].LastName = Utils.StringToBytes(lastname);
  2966. OutPacket(packet, ThrottleOutPacketType.Task);
  2967. }
  2968. #endregion
  2969. /// <summary>
  2970. /// This is a different way of processing packets then ProcessInPacket
  2971. /// </summary>
  2972. protected virtual void RegisterLocalPacketHandlers()
  2973. {
  2974. AddLocalPacketHandler(PacketType.LogoutRequest, Logout);
  2975. AddLocalPacketHandler(PacketType.ViewerEffect, HandleViewerEffect);
  2976. AddLocalPacketHandler(PacketType.AgentCachedTexture, AgentTextureCached);
  2977. AddLocalPacketHandler(PacketType.MultipleObjectUpdate, MultipleObjUpdate);
  2978. AddLocalPacketHandler(PacketType.MoneyTransferRequest, HandleMoneyTransferRequest);
  2979. AddLocalPacketHandler(PacketType.ParcelBuy, HandleParcelBuyRequest);
  2980. AddLocalPacketHandler(PacketType.UUIDGroupNameRequest, HandleUUIDGroupNameRequest);
  2981. AddLocalPacketHandler(PacketType.ObjectGroup, HandleObjectGroupRequest);
  2982. AddLocalPacketHandler(PacketType.GenericMessage, HandleGenericMessage);
  2983. }
  2984. private bool HandleMoneyTransferRequest(IClientAPI sender, Packet Pack)
  2985. {
  2986. MoneyTransferRequestPacket money = (MoneyTransferRequestPacket)Pack;
  2987. // validate the agent owns the agentID and sessionID
  2988. if (money.MoneyData.SourceID == sender.AgentId && money.AgentData.AgentID == sender.AgentId && money.AgentData.SessionID == sender.SessionId)
  2989. {
  2990. handlerMoneyTransferRequest = OnMoneyTransferRequest;
  2991. if (handlerMoneyTransferRequest != null)
  2992. {
  2993. handlerMoneyTransferRequest(money.MoneyData.SourceID, money.MoneyData.DestID,
  2994. money.MoneyData.Amount, money.MoneyData.TransactionType,
  2995. Util.FieldToString(money.MoneyData.Description));
  2996. }
  2997. return true;
  2998. }
  2999. else
  3000. {
  3001. return false;
  3002. }
  3003. }
  3004. private bool HandleParcelBuyRequest(IClientAPI sender, Packet Pack)
  3005. {
  3006. ParcelBuyPacket parcel = (ParcelBuyPacket)Pack;
  3007. if (parcel.AgentData.AgentID == AgentId && parcel.AgentData.SessionID == this.SessionId)
  3008. {
  3009. handlerParcelBuy = OnParcelBuy;
  3010. if (handlerParcelBuy != null)
  3011. {
  3012. handlerParcelBuy(parcel.AgentData.AgentID, parcel.Data.GroupID, parcel.Data.Final, parcel.Data.IsGroupOwned,
  3013. parcel.Data.RemoveContribution, parcel.Data.LocalID, parcel.ParcelData.Area, parcel.ParcelData.Price,
  3014. false);
  3015. }
  3016. return true;
  3017. }
  3018. else
  3019. {
  3020. return false;
  3021. }
  3022. }
  3023. private bool HandleUUIDGroupNameRequest(IClientAPI sender, Packet Pack)
  3024. {
  3025. UUIDGroupNameRequestPacket upack = (UUIDGroupNameRequestPacket)Pack;
  3026. for (int i = 0; i < upack.UUIDNameBlock.Length; i++)
  3027. {
  3028. handlerUUIDGroupNameRequest = OnUUIDGroupNameRequest;
  3029. if (handlerUUIDGroupNameRequest != null)
  3030. {
  3031. handlerUUIDGroupNameRequest(upack.UUIDNameBlock[i].ID, this);
  3032. }
  3033. }
  3034. return true;
  3035. }
  3036. public bool HandleGenericMessage(IClientAPI sender, Packet pack)
  3037. {
  3038. GenericMessagePacket gmpack = (GenericMessagePacket)pack;
  3039. handlerGenericMessage = OnGenericMessage;
  3040. List<string> msg = new List<string>();
  3041. if (handlerGenericMessage != null)
  3042. {
  3043. string method = Util.FieldToString(gmpack.MethodData.Method);
  3044. foreach (GenericMessagePacket.ParamListBlock block in gmpack.ParamList)
  3045. {
  3046. msg.Add(Util.FieldToString(block.Parameter));
  3047. }
  3048. handlerGenericMessage(this, method, msg);
  3049. }
  3050. return true;
  3051. }
  3052. public bool HandleObjectGroupRequest(IClientAPI sender, Packet Pack)
  3053. {
  3054. ObjectGroupPacket ogpack = (ObjectGroupPacket)Pack;
  3055. handlerObjectGroupRequest = OnObjectGroupRequest;
  3056. if (handlerObjectGroupRequest != null)
  3057. {
  3058. for (int i = 0; i < ogpack.ObjectData.Length; i++)
  3059. {
  3060. handlerObjectGroupRequest(this, ogpack.AgentData.GroupID, ogpack.ObjectData[i].ObjectLocalID, UUID.Zero);
  3061. }
  3062. }
  3063. return true;
  3064. }
  3065. private bool HandleViewerEffect(IClientAPI sender, Packet Pack)
  3066. {
  3067. ViewerEffectPacket viewer = (ViewerEffectPacket)Pack;
  3068. handlerViewerEffect = OnViewerEffect;
  3069. if (handlerViewerEffect != null)
  3070. {
  3071. int length = viewer.Effect.Length;
  3072. List<ViewerEffectEventHandlerArg> args = new List<ViewerEffectEventHandlerArg>(length);
  3073. for (int i = 0; i < length; i++)
  3074. {
  3075. //copy the effects block arguments into the event handler arg.
  3076. ViewerEffectEventHandlerArg argument = new ViewerEffectEventHandlerArg();
  3077. argument.AgentID = viewer.Effect[i].AgentID;
  3078. argument.Color = viewer.Effect[i].Color;
  3079. argument.Duration = viewer.Effect[i].Duration;
  3080. argument.ID = viewer.Effect[i].ID;
  3081. argument.Type = viewer.Effect[i].Type;
  3082. argument.TypeData = viewer.Effect[i].TypeData;
  3083. args.Add(argument);
  3084. }
  3085. handlerViewerEffect(sender, args);
  3086. }
  3087. return true;
  3088. }
  3089. public void SendScriptQuestion(UUID taskID, string taskName, string ownerName, UUID itemID, int question)
  3090. {
  3091. ScriptQuestionPacket scriptQuestion = (ScriptQuestionPacket)PacketPool.Instance.GetPacket(PacketType.ScriptQuestion);
  3092. scriptQuestion.Data = new ScriptQuestionPacket.DataBlock();
  3093. // TODO: don't create new blocks if recycling an old packet
  3094. scriptQuestion.Data.TaskID = taskID;
  3095. scriptQuestion.Data.ItemID = itemID;
  3096. scriptQuestion.Data.Questions = question;
  3097. scriptQuestion.Data.ObjectName = Utils.StringToBytes(taskName);
  3098. scriptQuestion.Data.ObjectOwner = Utils.StringToBytes(ownerName);
  3099. OutPacket(scriptQuestion, ThrottleOutPacketType.Task);
  3100. }
  3101. private void InitDefaultAnimations()
  3102. {
  3103. using (XmlTextReader reader = new XmlTextReader("data/avataranimations.xml"))
  3104. {
  3105. XmlDocument doc = new XmlDocument();
  3106. doc.Load(reader);
  3107. foreach (XmlNode nod in doc.DocumentElement.ChildNodes)
  3108. {
  3109. if (nod.Attributes["name"] != null)
  3110. {
  3111. string name = nod.Attributes["name"].Value.ToLower();
  3112. string id = nod.InnerText;
  3113. m_defaultAnimations.Add(name, (UUID)id);
  3114. }
  3115. }
  3116. }
  3117. }
  3118. public UUID GetDefaultAnimation(string name)
  3119. {
  3120. if (m_defaultAnimations.ContainsKey(name))
  3121. return m_defaultAnimations[name];
  3122. return UUID.Zero;
  3123. }
  3124. /// <summary>
  3125. /// Handler called when we receive a logout packet.
  3126. /// </summary>
  3127. /// <param name="client"></param>
  3128. /// <param name="packet"></param>
  3129. /// <returns></returns>
  3130. protected virtual bool Logout(IClientAPI client, Packet packet)
  3131. {
  3132. return Logout(client);
  3133. }
  3134. /// <summary>
  3135. ///
  3136. /// </summary>
  3137. /// <param name="client"></param>
  3138. /// <returns></returns>
  3139. protected virtual bool Logout(IClientAPI client)
  3140. {
  3141. m_log.Info("[CLIENT]: Got a logout request");
  3142. handlerLogout = OnLogout;
  3143. if (handlerLogout != null)
  3144. {
  3145. handlerLogout(client);
  3146. }
  3147. return true;
  3148. }
  3149. /// <summary>
  3150. /// Send a response back to a client when it asks the asset server (via the region server) if it has
  3151. /// its appearance texture cached.
  3152. ///
  3153. /// At the moment, we always reply that there is no cached texture.
  3154. /// </summary>
  3155. /// <param name="simclient"></param>
  3156. /// <param name="packet"></param>
  3157. /// <returns></returns>
  3158. protected bool AgentTextureCached(IClientAPI simclient, Packet packet)
  3159. {
  3160. //Console.WriteLine("texture cached: " + packet.ToString());
  3161. AgentCachedTexturePacket cachedtex = (AgentCachedTexturePacket)packet;
  3162. AgentCachedTextureResponsePacket cachedresp = (AgentCachedTextureResponsePacket)PacketPool.Instance.GetPacket(PacketType.AgentCachedTextureResponse);
  3163. // TODO: don't create new blocks if recycling an old packet
  3164. cachedresp.AgentData.AgentID = AgentId;
  3165. cachedresp.AgentData.SessionID = m_sessionId;
  3166. cachedresp.AgentData.SerialNum = m_cachedTextureSerial;
  3167. m_cachedTextureSerial++;
  3168. cachedresp.WearableData =
  3169. new AgentCachedTextureResponsePacket.WearableDataBlock[cachedtex.WearableData.Length];
  3170. for (int i = 0; i < cachedtex.WearableData.Length; i++)
  3171. {
  3172. cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
  3173. cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex;
  3174. cachedresp.WearableData[i].TextureID = UUID.Zero;
  3175. cachedresp.WearableData[i].HostName = new byte[0];
  3176. }
  3177. // Temporarily throw these packets on to the wind queue, so we can identify whether these
  3178. // are somehow the source of the packet bloat.
  3179. cachedresp.Header.Zerocoded = true;
  3180. OutPacket(cachedresp, ThrottleOutPacketType.Wind);
  3181. return true;
  3182. }
  3183. protected bool MultipleObjUpdate(IClientAPI simClient, Packet packet)
  3184. {
  3185. MultipleObjectUpdatePacket multipleupdate = (MultipleObjectUpdatePacket)packet;
  3186. // Console.WriteLine("new multi update packet " + multipleupdate.ToString());
  3187. Scene tScene = (Scene)m_scene;
  3188. for (int i = 0; i < multipleupdate.ObjectData.Length; i++)
  3189. {
  3190. MultipleObjectUpdatePacket.ObjectDataBlock block = multipleupdate.ObjectData[i];
  3191. // Can't act on Null Data
  3192. if (block.Data != null)
  3193. {
  3194. uint localId = block.ObjectLocalID;
  3195. SceneObjectPart part = tScene.GetSceneObjectPart(localId);
  3196. if (part == null)
  3197. {
  3198. // It's a ghost! tell the client to delete it from view.
  3199. simClient.SendKillObject(Scene.RegionInfo.RegionHandle,
  3200. localId);
  3201. }
  3202. else
  3203. {
  3204. // UUID partId = part.UUID;
  3205. UpdatePrimRotation handlerUpdatePrimRotation;
  3206. UpdatePrimGroupRotation handlerUpdatePrimGroupRotation;
  3207. switch (block.Type)
  3208. {
  3209. case 1:
  3210. Vector3 pos1 = new Vector3(block.Data, 0);
  3211. handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition;
  3212. if (handlerUpdatePrimSinglePosition != null)
  3213. {
  3214. // Console.WriteLine("new movement position is " + pos.X + " , " + pos.Y + " , " + pos.Z);
  3215. handlerUpdatePrimSinglePosition(localId, pos1, this);
  3216. }
  3217. break;
  3218. case 2:
  3219. Quaternion rot1 = new Quaternion(block.Data, 0, true);
  3220. handlerUpdatePrimSingleRotation = OnUpdatePrimSingleRotation;
  3221. if (handlerUpdatePrimSingleRotation != null)
  3222. {
  3223. //Console.WriteLine("new tab rotation is " + rot.X + " , " + rot.Y + " , " + rot.Z + " , " + rot.W);
  3224. handlerUpdatePrimSingleRotation(localId, rot1, this);
  3225. }
  3226. break;
  3227. case 3:
  3228. Quaternion rot2 = new Quaternion(block.Data, 12, true);
  3229. handlerUpdatePrimSingleRotation = OnUpdatePrimSingleRotation;
  3230. if (handlerUpdatePrimSingleRotation != null)
  3231. {
  3232. //Console.WriteLine("new mouse rotation is " + rot.X + " , " + rot.Y + " , " + rot.Z + " , " + rot.W);
  3233. handlerUpdatePrimSingleRotation(localId, rot2, this);
  3234. }
  3235. break;
  3236. case 5:
  3237. Vector3 scale1 = new Vector3(block.Data, 12);
  3238. Vector3 pos11 = new Vector3(block.Data, 0);
  3239. handlerUpdatePrimScale = OnUpdatePrimScale;
  3240. if (handlerUpdatePrimScale != null)
  3241. {
  3242. // Console.WriteLine("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
  3243. handlerUpdatePrimScale(localId, scale1, this);
  3244. handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition;
  3245. if (handlerUpdatePrimSinglePosition != null)
  3246. {
  3247. handlerUpdatePrimSinglePosition(localId, pos11, this);
  3248. }
  3249. }
  3250. break;
  3251. case 9:
  3252. Vector3 pos2 = new Vector3(block.Data, 0);
  3253. handlerUpdateVector = OnUpdatePrimGroupPosition;
  3254. if (handlerUpdateVector != null)
  3255. {
  3256. handlerUpdateVector(localId, pos2, this);
  3257. }
  3258. break;
  3259. case 10:
  3260. Quaternion rot3 = new Quaternion(block.Data, 0, true);
  3261. handlerUpdatePrimRotation = OnUpdatePrimGroupRotation;
  3262. if (handlerUpdatePrimRotation != null)
  3263. {
  3264. // Console.WriteLine("new rotation is " + rot.X + " , " + rot.Y + " , " + rot.Z + " , " + rot.W);
  3265. handlerUpdatePrimRotation(localId, rot3, this);
  3266. }
  3267. break;
  3268. case 11:
  3269. Vector3 pos3 = new Vector3(block.Data, 0);
  3270. Quaternion rot4 = new Quaternion(block.Data, 12, true);
  3271. handlerUpdatePrimGroupRotation = OnUpdatePrimGroupMouseRotation;
  3272. if (handlerUpdatePrimGroupRotation != null)
  3273. {
  3274. //Console.WriteLine("new rotation position is " + pos.X + " , " + pos.Y + " , " + pos.Z);
  3275. // Console.WriteLine("new rotation is " + rot.X + " , " + rot.Y + " , " + rot.Z + " , " + rot.W);
  3276. handlerUpdatePrimGroupRotation(localId, pos3, rot4, this);
  3277. }
  3278. break;
  3279. case 13:
  3280. Vector3 scale2 = new Vector3(block.Data, 12);
  3281. Vector3 pos4 = new Vector3(block.Data, 0);
  3282. handlerUpdatePrimScale = OnUpdatePrimScale;
  3283. if (handlerUpdatePrimScale != null)
  3284. {
  3285. //Console.WriteLine("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
  3286. handlerUpdatePrimScale(localId, scale2, this);
  3287. // Change the position based on scale (for bug number 246)
  3288. handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition;
  3289. // Console.WriteLine("new movement position is " + pos.X + " , " + pos.Y + " , " + pos.Z);
  3290. if (handlerUpdatePrimSinglePosition != null)
  3291. {
  3292. handlerUpdatePrimSinglePosition(localId, pos4, this);
  3293. }
  3294. }
  3295. break;
  3296. case 29:
  3297. Vector3 scale5 = new Vector3(block.Data, 12);
  3298. Vector3 pos5 = new Vector3(block.Data, 0);
  3299. handlerUpdatePrimGroupScale = OnUpdatePrimGroupScale;
  3300. if (handlerUpdatePrimGroupScale != null)
  3301. {
  3302. // Console.WriteLine("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
  3303. handlerUpdatePrimGroupScale(localId, scale5, this);
  3304. handlerUpdateVector = OnUpdatePrimGroupPosition;
  3305. if (handlerUpdateVector != null)
  3306. {
  3307. handlerUpdateVector(localId, pos5, this);
  3308. }
  3309. }
  3310. break;
  3311. case 21:
  3312. Vector3 scale6 = new Vector3(block.Data, 12);
  3313. Vector3 pos6 = new Vector3(block.Data, 0);
  3314. handlerUpdatePrimScale = OnUpdatePrimScale;
  3315. if (handlerUpdatePrimScale != null)
  3316. {
  3317. // Console.WriteLine("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
  3318. handlerUpdatePrimScale(localId, scale6, this);
  3319. handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition;
  3320. if (handlerUpdatePrimSinglePosition != null)
  3321. {
  3322. handlerUpdatePrimSinglePosition(localId, pos6, this);
  3323. }
  3324. }
  3325. break;
  3326. }
  3327. }
  3328. }
  3329. }
  3330. return true;
  3331. }
  3332. public void RequestMapLayer()
  3333. {
  3334. //should be getting the map layer from the grid server
  3335. //send a layer covering the 800,800 - 1200,1200 area (should be covering the requested area)
  3336. MapLayerReplyPacket mapReply = (MapLayerReplyPacket)PacketPool.Instance.GetPacket(PacketType.MapLayerReply);
  3337. // TODO: don't create new blocks if recycling an old packet
  3338. mapReply.AgentData.AgentID = AgentId;
  3339. mapReply.AgentData.Flags = 0;
  3340. mapReply.LayerData = new MapLayerReplyPacket.LayerDataBlock[1];
  3341. mapReply.LayerData[0] = new MapLayerReplyPacket.LayerDataBlock();
  3342. mapReply.LayerData[0].Bottom = 0;
  3343. mapReply.LayerData[0].Left = 0;
  3344. mapReply.LayerData[0].Top = 30000;
  3345. mapReply.LayerData[0].Right = 30000;
  3346. mapReply.LayerData[0].ImageID = new UUID("00000000-0000-1111-9999-000000000006");
  3347. mapReply.Header.Zerocoded = true;
  3348. OutPacket(mapReply, ThrottleOutPacketType.Land);
  3349. }
  3350. public void RequestMapBlocksX(int minX, int minY, int maxX, int maxY)
  3351. {
  3352. /*
  3353. IList simMapProfiles = m_gridServer.RequestMapBlocks(minX, minY, maxX, maxY);
  3354. MapBlockReplyPacket mbReply = new MapBlockReplyPacket();
  3355. mbReply.AgentData.AgentId = AgentId;
  3356. int len;
  3357. if (simMapProfiles == null)
  3358. len = 0;
  3359. else
  3360. len = simMapProfiles.Count;
  3361. mbReply.Data = new MapBlockReplyPacket.DataBlock[len];
  3362. int iii;
  3363. for (iii = 0; iii < len; iii++)
  3364. {
  3365. Hashtable mp = (Hashtable)simMapProfiles[iii];
  3366. mbReply.Data[iii] = new MapBlockReplyPacket.DataBlock();
  3367. mbReply.Data[iii].Name = System.Text.Encoding.UTF8.GetBytes((string)mp["name"]);
  3368. mbReply.Data[iii].Access = System.Convert.ToByte(mp["access"]);
  3369. mbReply.Data[iii].Agents = System.Convert.ToByte(mp["agents"]);
  3370. mbReply.Data[iii].MapImageID = new UUID((string)mp["map-image-id"]);
  3371. mbReply.Data[iii].RegionFlags = System.Convert.ToUInt32(mp["region-flags"]);
  3372. mbReply.Data[iii].WaterHeight = System.Convert.ToByte(mp["water-height"]);
  3373. mbReply.Data[iii].X = System.Convert.ToUInt16(mp["x"]);
  3374. mbReply.Data[iii].Y = System.Convert.ToUInt16(mp["y"]);
  3375. }
  3376. this.OutPacket(mbReply, ThrottleOutPacketType.Land);
  3377. */
  3378. }
  3379. /// <summary>
  3380. /// returns a byte array of the client set throttles Gets multiplied by the multiplier
  3381. ///
  3382. /// </summary>
  3383. /// <param name="multiplier">non 1 multiplier for subdividing the throttles between individual regions</param>
  3384. /// <returns></returns>
  3385. public byte[] GetThrottlesPacked(float multiplier)
  3386. {
  3387. return m_PacketHandler.PacketQueue.GetThrottlesPacked(multiplier);
  3388. }
  3389. /// <summary>
  3390. /// sets the throttles from values supplied by the client
  3391. /// </summary>
  3392. /// <param name="throttles"></param>
  3393. public void SetChildAgentThrottle(byte[] throttles)
  3394. {
  3395. m_PacketHandler.PacketQueue.SetThrottleFromClient(throttles);
  3396. }
  3397. /// <summary>
  3398. /// Method gets called when a new packet has arrived from the UDP
  3399. /// server. This happens after it's been decoded into a libsl object.
  3400. /// </summary>
  3401. /// <param name="NewPack">object containing the packet.</param>
  3402. public virtual void InPacket(object NewPack)
  3403. {
  3404. // Cast NewPack to Packet.
  3405. m_PacketHandler.InPacket((Packet)NewPack);
  3406. }
  3407. /// <summary>
  3408. /// This is the starting point for sending a simulator packet out to the client.
  3409. ///
  3410. /// Please do not call this from outside the LindenUDP client stack.
  3411. /// </summary>
  3412. /// <param name="NewPack"></param>
  3413. /// <param name="throttlePacketType">Corresponds to the type of data that is going out. Enum</param>
  3414. public void OutPacket(Packet NewPack, ThrottleOutPacketType throttlePacketType)
  3415. {
  3416. m_PacketHandler.OutPacket(NewPack, throttlePacketType);
  3417. }
  3418. public bool AddMoney(int debit)
  3419. {
  3420. if (m_moneyBalance + debit >= 0)
  3421. {
  3422. m_moneyBalance += debit;
  3423. SendMoneyBalance(UUID.Zero, true, Utils.StringToBytes("Poof Poof!"), m_moneyBalance);
  3424. return true;
  3425. }
  3426. return false;
  3427. }
  3428. /// <summary>
  3429. /// Breaks down the genericMessagePacket into specific events
  3430. /// </summary>
  3431. /// <param name="gmMethod"></param>
  3432. /// <param name="gmInvoice"></param>
  3433. /// <param name="gmParams"></param>
  3434. public void DecipherGenericMessage(string gmMethod, UUID gmInvoice, GenericMessagePacket.ParamListBlock[] gmParams)
  3435. {
  3436. switch (gmMethod)
  3437. {
  3438. case "autopilot":
  3439. float locx;
  3440. float locy;
  3441. float locz;
  3442. uint regionX;
  3443. uint regionY;
  3444. try
  3445. {
  3446. Helpers.LongToUInts(Scene.RegionInfo.RegionHandle, out regionX, out regionY);
  3447. locx = Convert.ToSingle(Utils.BytesToString(gmParams[0].Parameter)) - regionX;
  3448. locy = Convert.ToSingle(Utils.BytesToString(gmParams[1].Parameter)) - regionY;
  3449. locz = Convert.ToSingle(Utils.BytesToString(gmParams[2].Parameter));
  3450. }
  3451. catch (InvalidCastException)
  3452. {
  3453. m_log.Error("[CLIENT]: Invalid autopilot request");
  3454. return;
  3455. }
  3456. handlerAutoPilotGo = OnAutoPilotGo;
  3457. if (handlerAutoPilotGo != null)
  3458. {
  3459. handlerAutoPilotGo(0, new Vector3(locx, locy, locz), this);
  3460. }
  3461. m_log.InfoFormat("[CLIENT]: Client Requests autopilot to position <{0},{1},{2}>", locx, locy, locz);
  3462. break;
  3463. default:
  3464. m_log.Debug("[CLIENT]: Unknown Generic Message, Method: " + gmMethod + ". Invoice: " + gmInvoice + ". Dumping Params:");
  3465. for (int hi = 0; hi < gmParams.Length; hi++)
  3466. {
  3467. Console.WriteLine(gmParams[hi].ToString());
  3468. }
  3469. //gmpack.MethodData.
  3470. break;
  3471. }
  3472. }
  3473. /// <summary>
  3474. /// Entryway from the client to the simulator
  3475. /// all UDP packets from the client will end up here
  3476. /// </summary>
  3477. /// <param name="Pack">OpenMetaverse.packet</param>
  3478. public void ProcessInPacket(Packet Pack)
  3479. {
  3480. // check if we've got a local packet handler for this packet.type. See RegisterLocalPacketHandlers()
  3481. if (ProcessPacketMethod(Pack))
  3482. {
  3483. //there is a handler registered that handled this packet type
  3484. return;
  3485. }
  3486. // Main packet processing conditional
  3487. switch (Pack.Type)
  3488. {
  3489. #region Scene/Avatar
  3490. case PacketType.GenericMessage:
  3491. GenericMessagePacket gmpack = (GenericMessagePacket)Pack;
  3492. DecipherGenericMessage(Utils.BytesToString(gmpack.MethodData.Method), gmpack.MethodData.Invoice, gmpack.ParamList);
  3493. break;
  3494. case PacketType.AvatarPropertiesRequest:
  3495. AvatarPropertiesRequestPacket avatarProperties = (AvatarPropertiesRequestPacket)Pack;
  3496. handlerRequestAvatarProperties = OnRequestAvatarProperties;
  3497. if (handlerRequestAvatarProperties != null)
  3498. {
  3499. handlerRequestAvatarProperties(this, avatarProperties.AgentData.AvatarID);
  3500. }
  3501. break;
  3502. case PacketType.ChatFromViewer:
  3503. ChatFromViewerPacket inchatpack = (ChatFromViewerPacket)Pack;
  3504. string fromName = String.Empty; //ClientAvatar.firstname + " " + ClientAvatar.lastname;
  3505. byte[] message = inchatpack.ChatData.Message;
  3506. byte type = inchatpack.ChatData.Type;
  3507. Vector3 fromPos = new Vector3(); // ClientAvatar.Pos;
  3508. // UUID fromAgentID = AgentId;
  3509. int channel = inchatpack.ChatData.Channel;
  3510. if (OnChatFromClient != null)
  3511. {
  3512. OSChatMessage args = new OSChatMessage();
  3513. args.Channel = channel;
  3514. args.From = fromName;
  3515. args.Message = Utils.BytesToString(message);
  3516. args.Type = (ChatTypeEnum)type;
  3517. args.Position = fromPos;
  3518. args.Scene = Scene;
  3519. args.Sender = this;
  3520. handlerChatFromClient = OnChatFromClient;
  3521. if (handlerChatFromClient != null)
  3522. handlerChatFromClient(this, args);
  3523. }
  3524. break;
  3525. case PacketType.AvatarPropertiesUpdate:
  3526. AvatarPropertiesUpdatePacket Packet = (AvatarPropertiesUpdatePacket)Pack;
  3527. handlerUpdateAvatarProperties = OnUpdateAvatarProperties;
  3528. if (handlerUpdateAvatarProperties != null)
  3529. {
  3530. AvatarPropertiesUpdatePacket.PropertiesDataBlock Properties = Packet.PropertiesData;
  3531. UserProfileData UserProfile = new UserProfileData();
  3532. UserProfile.ID = AgentId;
  3533. UserProfile.AboutText = Utils.BytesToString(Properties.AboutText);
  3534. UserProfile.FirstLifeAboutText = Utils.BytesToString(Properties.FLAboutText);
  3535. UserProfile.FirstLifeImage = Properties.FLImageID;
  3536. UserProfile.Image = Properties.ImageID;
  3537. handlerUpdateAvatarProperties(this, UserProfile);
  3538. }
  3539. break;
  3540. case PacketType.ScriptDialogReply:
  3541. ScriptDialogReplyPacket rdialog = (ScriptDialogReplyPacket)Pack;
  3542. int ch = rdialog.Data.ChatChannel;
  3543. byte[] msg = rdialog.Data.ButtonLabel;
  3544. if (OnChatFromClient != null)
  3545. {
  3546. OSChatMessage args = new OSChatMessage();
  3547. args.Channel = ch;
  3548. args.From = String.Empty;
  3549. args.Message = Utils.BytesToString(msg);
  3550. args.Type = ChatTypeEnum.Shout;
  3551. args.Position = new Vector3();
  3552. args.Scene = Scene;
  3553. args.Sender = this;
  3554. handlerChatFromClient2 = OnChatFromClient;
  3555. if (handlerChatFromClient2 != null)
  3556. handlerChatFromClient2(this, args);
  3557. }
  3558. break;
  3559. case PacketType.ImprovedInstantMessage:
  3560. ImprovedInstantMessagePacket msgpack = (ImprovedInstantMessagePacket)Pack;
  3561. string IMfromName = Util.FieldToString(msgpack.MessageBlock.FromAgentName);
  3562. string IMmessage = Utils.BytesToString(msgpack.MessageBlock.Message);
  3563. handlerInstantMessage = OnInstantMessage;
  3564. if (handlerInstantMessage != null)
  3565. {
  3566. handlerInstantMessage(this, msgpack.AgentData.AgentID, msgpack.AgentData.SessionID,
  3567. msgpack.MessageBlock.ToAgentID, msgpack.MessageBlock.ID,
  3568. msgpack.MessageBlock.Timestamp, IMfromName, IMmessage,
  3569. msgpack.MessageBlock.Dialog, msgpack.MessageBlock.FromGroup,
  3570. msgpack.MessageBlock.Offline, msgpack.MessageBlock.ParentEstateID,
  3571. msgpack.MessageBlock.Position, msgpack.MessageBlock.RegionID,
  3572. msgpack.MessageBlock.BinaryBucket);
  3573. }
  3574. break;
  3575. case PacketType.AcceptFriendship:
  3576. AcceptFriendshipPacket afriendpack = (AcceptFriendshipPacket)Pack;
  3577. // My guess is this is the folder to stick the calling card into
  3578. List<UUID> callingCardFolders = new List<UUID>();
  3579. UUID agentID = afriendpack.AgentData.AgentID;
  3580. UUID transactionID = afriendpack.TransactionBlock.TransactionID;
  3581. for (int fi = 0; fi < afriendpack.FolderData.Length; fi++)
  3582. {
  3583. callingCardFolders.Add(afriendpack.FolderData[fi].FolderID);
  3584. }
  3585. handlerApproveFriendRequest = OnApproveFriendRequest;
  3586. if (handlerApproveFriendRequest != null)
  3587. {
  3588. handlerApproveFriendRequest(this, agentID, transactionID, callingCardFolders);
  3589. }
  3590. break;
  3591. case PacketType.DeclineFriendship:
  3592. DeclineFriendshipPacket dfriendpack = (DeclineFriendshipPacket)Pack;
  3593. if (OnDenyFriendRequest != null)
  3594. {
  3595. OnDenyFriendRequest(this,
  3596. dfriendpack.AgentData.AgentID,
  3597. dfriendpack.TransactionBlock.TransactionID,
  3598. null);
  3599. }
  3600. break;
  3601. case PacketType.TerminateFriendship:
  3602. TerminateFriendshipPacket tfriendpack = (TerminateFriendshipPacket)Pack;
  3603. UUID listOwnerAgentID = tfriendpack.AgentData.AgentID;
  3604. UUID exFriendID = tfriendpack.ExBlock.OtherID;
  3605. handlerTerminateFriendship = OnTerminateFriendship;
  3606. if (handlerTerminateFriendship != null)
  3607. {
  3608. handlerTerminateFriendship(this, listOwnerAgentID, exFriendID);
  3609. }
  3610. break;
  3611. case PacketType.RezObject:
  3612. RezObjectPacket rezPacket = (RezObjectPacket)Pack;
  3613. handlerRezObject = OnRezObject;
  3614. if (handlerRezObject != null)
  3615. {
  3616. handlerRezObject(this, rezPacket.InventoryData.ItemID, rezPacket.RezData.RayEnd,
  3617. rezPacket.RezData.RayStart, rezPacket.RezData.RayTargetID,
  3618. rezPacket.RezData.BypassRaycast, rezPacket.RezData.RayEndIsIntersection,
  3619. rezPacket.RezData.RezSelected, rezPacket.RezData.RemoveItem,
  3620. rezPacket.RezData.FromTaskID);
  3621. }
  3622. break;
  3623. case PacketType.DeRezObject:
  3624. DeRezObjectPacket DeRezPacket = (DeRezObjectPacket)Pack;
  3625. handlerDeRezObject = OnDeRezObject;
  3626. if (handlerDeRezObject != null)
  3627. {
  3628. foreach (DeRezObjectPacket.ObjectDataBlock data in
  3629. DeRezPacket.ObjectData)
  3630. {
  3631. handlerDeRezObject(this, data.ObjectLocalID,
  3632. DeRezPacket.AgentBlock.GroupID,
  3633. DeRezPacket.AgentBlock.Destination,
  3634. DeRezPacket.AgentBlock.DestinationID);
  3635. }
  3636. }
  3637. break;
  3638. case PacketType.ModifyLand:
  3639. ModifyLandPacket modify = (ModifyLandPacket)Pack;
  3640. //m_log.Info("[LAND]: LAND:" + modify.ToString());
  3641. if (modify.ParcelData.Length > 0)
  3642. {
  3643. if (OnModifyTerrain != null)
  3644. {
  3645. for (int i = 0; i < modify.ParcelData.Length; i++)
  3646. {
  3647. handlerModifyTerrain = OnModifyTerrain;
  3648. if (handlerModifyTerrain != null)
  3649. {
  3650. modify.ModifyBlock.Height = -1; // Hack, i don't know why the value is wrong
  3651. handlerModifyTerrain(modify.ModifyBlock.Height, modify.ModifyBlock.Seconds,
  3652. modify.ModifyBlock.BrushSize,
  3653. modify.ModifyBlock.Action, modify.ParcelData[i].North,
  3654. modify.ParcelData[i].West, modify.ParcelData[i].South,
  3655. modify.ParcelData[i].East, AgentId);
  3656. }
  3657. }
  3658. }
  3659. }
  3660. break;
  3661. case PacketType.RegionHandshakeReply:
  3662. handlerRegionHandShakeReply = OnRegionHandShakeReply;
  3663. if (handlerRegionHandShakeReply != null)
  3664. {
  3665. handlerRegionHandShakeReply(this);
  3666. }
  3667. break;
  3668. case PacketType.AgentWearablesRequest:
  3669. handlerRequestWearables = OnRequestWearables;
  3670. if (handlerRequestWearables != null)
  3671. {
  3672. m_log.DebugFormat("[APPEARANCE]: Wearables requested by {0}", Name);
  3673. handlerRequestWearables();
  3674. }
  3675. handlerRequestAvatarsData = OnRequestAvatarsData;
  3676. if (handlerRequestAvatarsData != null)
  3677. {
  3678. handlerRequestAvatarsData(this);
  3679. }
  3680. break;
  3681. case PacketType.AgentSetAppearance:
  3682. AgentSetAppearancePacket appear = (AgentSetAppearancePacket)Pack;
  3683. handlerSetAppearance = OnSetAppearance;
  3684. if (handlerSetAppearance != null)
  3685. {
  3686. // Temporarily protect ourselves from the mantis #951 failure.
  3687. // However, we could do this for several other handlers where a failure isn't terminal
  3688. // for the client session anyway, in order to protect ourselves against bad code in plugins
  3689. try
  3690. {
  3691. List<byte> visualparams = new List<byte>();
  3692. foreach (AgentSetAppearancePacket.VisualParamBlock x in appear.VisualParam)
  3693. {
  3694. visualparams.Add(x.ParamValue);
  3695. }
  3696. handlerSetAppearance(appear.ObjectData.TextureEntry, visualparams);
  3697. }
  3698. catch (Exception e)
  3699. {
  3700. m_log.ErrorFormat(
  3701. "[CLIENT VIEW]: AgentSetApperance packet handler threw an exception, {0}",
  3702. e);
  3703. }
  3704. }
  3705. break;
  3706. case PacketType.AgentIsNowWearing:
  3707. if (OnAvatarNowWearing != null)
  3708. {
  3709. AgentIsNowWearingPacket nowWearing = (AgentIsNowWearingPacket)Pack;
  3710. AvatarWearingArgs wearingArgs = new AvatarWearingArgs();
  3711. for (int i = 0; i < nowWearing.WearableData.Length; i++)
  3712. {
  3713. AvatarWearingArgs.Wearable wearable =
  3714. new AvatarWearingArgs.Wearable(nowWearing.WearableData[i].ItemID,
  3715. nowWearing.WearableData[i].WearableType);
  3716. wearingArgs.NowWearing.Add(wearable);
  3717. }
  3718. handlerAvatarNowWearing = OnAvatarNowWearing;
  3719. if (handlerAvatarNowWearing != null)
  3720. {
  3721. handlerAvatarNowWearing(this, wearingArgs);
  3722. }
  3723. }
  3724. break;
  3725. case PacketType.RezSingleAttachmentFromInv:
  3726. handlerRezSingleAttachment = OnRezSingleAttachmentFromInv;
  3727. if (handlerRezSingleAttachment != null)
  3728. {
  3729. RezSingleAttachmentFromInvPacket rez = (RezSingleAttachmentFromInvPacket)Pack;
  3730. handlerRezSingleAttachment(this, rez.ObjectData.ItemID,
  3731. rez.ObjectData.AttachmentPt);
  3732. }
  3733. break;
  3734. case PacketType.DetachAttachmentIntoInv:
  3735. handlerDetachAttachmentIntoInv = OnDetachAttachmentIntoInv;
  3736. if (handlerDetachAttachmentIntoInv != null)
  3737. {
  3738. DetachAttachmentIntoInvPacket detachtoInv = (DetachAttachmentIntoInvPacket)Pack;
  3739. UUID itemID = detachtoInv.ObjectData.ItemID;
  3740. // UUID ATTACH_agentID = detachtoInv.ObjectData.AgentID;
  3741. handlerDetachAttachmentIntoInv(itemID, this);
  3742. }
  3743. break;
  3744. case PacketType.ObjectAttach:
  3745. if (OnObjectAttach != null)
  3746. {
  3747. ObjectAttachPacket att = (ObjectAttachPacket)Pack;
  3748. handlerObjectAttach = OnObjectAttach;
  3749. if (handlerObjectAttach != null)
  3750. {
  3751. if (att.ObjectData.Length > 0)
  3752. {
  3753. handlerObjectAttach(this, att.ObjectData[0].ObjectLocalID, att.AgentData.AttachmentPoint, att.ObjectData[0].Rotation, false);
  3754. }
  3755. }
  3756. }
  3757. break;
  3758. case PacketType.ObjectDetach:
  3759. ObjectDetachPacket dett = (ObjectDetachPacket)Pack;
  3760. for (int j = 0; j < dett.ObjectData.Length; j++)
  3761. {
  3762. uint obj = dett.ObjectData[j].ObjectLocalID;
  3763. handlerObjectDetach = OnObjectDetach;
  3764. if (handlerObjectDetach != null)
  3765. {
  3766. handlerObjectDetach(obj, this);
  3767. }
  3768. }
  3769. break;
  3770. case PacketType.ObjectDrop:
  3771. ObjectDropPacket dropp = (ObjectDropPacket)Pack;
  3772. for (int j = 0; j < dropp.ObjectData.Length; j++)
  3773. {
  3774. uint obj = dropp.ObjectData[j].ObjectLocalID;
  3775. handlerObjectDrop = OnObjectDrop;
  3776. if (handlerObjectDrop != null)
  3777. {
  3778. handlerObjectDrop(obj, this);
  3779. }
  3780. }
  3781. break;
  3782. case PacketType.SetAlwaysRun:
  3783. SetAlwaysRunPacket run = (SetAlwaysRunPacket)Pack;
  3784. handlerSetAlwaysRun = OnSetAlwaysRun;
  3785. if (handlerSetAlwaysRun != null)
  3786. handlerSetAlwaysRun(this, run.AgentData.AlwaysRun);
  3787. break;
  3788. case PacketType.CompleteAgentMovement:
  3789. handlerCompleteMovementToRegion = OnCompleteMovementToRegion;
  3790. if (handlerCompleteMovementToRegion != null)
  3791. {
  3792. handlerCompleteMovementToRegion();
  3793. }
  3794. handlerCompleteMovementToRegion = null;
  3795. break;
  3796. case PacketType.AgentUpdate:
  3797. if (OnAgentUpdate != null)
  3798. {
  3799. AgentUpdatePacket agenUpdate = (AgentUpdatePacket)Pack;
  3800. AgentUpdatePacket.AgentDataBlock x = agenUpdate.AgentData;
  3801. AgentUpdateArgs arg = new AgentUpdateArgs();
  3802. arg.AgentID = x.AgentID;
  3803. arg.BodyRotation = x.BodyRotation;
  3804. arg.CameraAtAxis = x.CameraAtAxis;
  3805. arg.CameraCenter = x.CameraCenter;
  3806. arg.CameraLeftAxis = x.CameraLeftAxis;
  3807. arg.CameraUpAxis = x.CameraUpAxis;
  3808. arg.ControlFlags = x.ControlFlags;
  3809. arg.Far = x.Far;
  3810. arg.Flags = x.Flags;
  3811. arg.HeadRotation = x.HeadRotation;
  3812. arg.SessionID = x.SessionID;
  3813. arg.State = x.State;
  3814. handlerAgentUpdate = OnAgentUpdate;
  3815. if (handlerAgentUpdate != null)
  3816. OnAgentUpdate(this, arg);
  3817. handlerAgentUpdate = null;
  3818. //agenUpdate.AgentData.ControlFlags, agenUpdate.AgentData.BodyRotationa);
  3819. }
  3820. break;
  3821. case PacketType.AgentAnimation:
  3822. AgentAnimationPacket AgentAni = (AgentAnimationPacket)Pack;
  3823. handlerStartAnim = null;
  3824. handlerStopAnim = null;
  3825. for (int i = 0; i < AgentAni.AnimationList.Length; i++)
  3826. {
  3827. if (AgentAni.AnimationList[i].StartAnim)
  3828. {
  3829. handlerStartAnim = OnStartAnim;
  3830. if (handlerStartAnim != null)
  3831. {
  3832. handlerStartAnim(this, AgentAni.AnimationList[i].AnimID);
  3833. }
  3834. }
  3835. else
  3836. {
  3837. handlerStopAnim = OnStopAnim;
  3838. if (handlerStopAnim != null)
  3839. {
  3840. handlerStopAnim(this, AgentAni.AnimationList[i].AnimID);
  3841. }
  3842. }
  3843. }
  3844. break;
  3845. case PacketType.AgentRequestSit:
  3846. if (OnAgentRequestSit != null)
  3847. {
  3848. AgentRequestSitPacket agentRequestSit = (AgentRequestSitPacket)Pack;
  3849. handlerAgentRequestSit = OnAgentRequestSit;
  3850. if (handlerAgentRequestSit != null)
  3851. handlerAgentRequestSit(this, agentRequestSit.AgentData.AgentID,
  3852. agentRequestSit.TargetObject.TargetID, agentRequestSit.TargetObject.Offset);
  3853. }
  3854. break;
  3855. case PacketType.AgentSit:
  3856. if (OnAgentSit != null)
  3857. {
  3858. AgentSitPacket agentSit = (AgentSitPacket)Pack;
  3859. handlerAgentSit = OnAgentSit;
  3860. if (handlerAgentSit != null)
  3861. {
  3862. OnAgentSit(this, agentSit.AgentData.AgentID);
  3863. }
  3864. }
  3865. break;
  3866. case PacketType.AvatarPickerRequest:
  3867. AvatarPickerRequestPacket avRequestQuery = (AvatarPickerRequestPacket)Pack;
  3868. AvatarPickerRequestPacket.AgentDataBlock Requestdata = avRequestQuery.AgentData;
  3869. AvatarPickerRequestPacket.DataBlock querydata = avRequestQuery.Data;
  3870. //Console.WriteLine("Agent Sends:" + Utils.BytesToString(querydata.Name));
  3871. handlerAvatarPickerRequest = OnAvatarPickerRequest;
  3872. if (handlerAvatarPickerRequest != null)
  3873. {
  3874. handlerAvatarPickerRequest(this, Requestdata.AgentID, Requestdata.QueryID,
  3875. Utils.BytesToString(querydata.Name));
  3876. }
  3877. break;
  3878. case PacketType.AgentDataUpdateRequest:
  3879. AgentDataUpdateRequestPacket avRequestDataUpdatePacket = (AgentDataUpdateRequestPacket)Pack;
  3880. handlerAgentDataUpdateRequest = OnAgentDataUpdateRequest;
  3881. if (handlerAgentDataUpdateRequest != null)
  3882. {
  3883. handlerAgentDataUpdateRequest(this, avRequestDataUpdatePacket.AgentData.AgentID, avRequestDataUpdatePacket.AgentData.SessionID);
  3884. }
  3885. break;
  3886. case PacketType.UserInfoRequest:
  3887. UserInfoRequestPacket avUserInfoRequestPacket = (UserInfoRequestPacket)Pack;
  3888. handlerUserInfoRequest = OnUserInfoRequest;
  3889. if (handlerUserInfoRequest != null)
  3890. {
  3891. handlerUserInfoRequest(this, avUserInfoRequestPacket.AgentData.AgentID, avUserInfoRequestPacket.AgentData.SessionID);
  3892. }
  3893. break;
  3894. case PacketType.SetStartLocationRequest:
  3895. SetStartLocationRequestPacket avSetStartLocationRequestPacket = (SetStartLocationRequestPacket)Pack;
  3896. if (avSetStartLocationRequestPacket.AgentData.AgentID == AgentId && avSetStartLocationRequestPacket.AgentData.SessionID == SessionId)
  3897. {
  3898. handlerSetStartLocationRequest = OnSetStartLocationRequest;
  3899. if (handlerSetStartLocationRequest != null)
  3900. {
  3901. handlerSetStartLocationRequest(this, 0, avSetStartLocationRequestPacket.StartLocationData.LocationPos,
  3902. avSetStartLocationRequestPacket.StartLocationData.LocationLookAt,
  3903. avSetStartLocationRequestPacket.StartLocationData.LocationID);
  3904. }
  3905. }
  3906. break;
  3907. case PacketType.AgentThrottle:
  3908. AgentThrottlePacket atpack = (AgentThrottlePacket)Pack;
  3909. m_PacketHandler.PacketQueue.SetThrottleFromClient(atpack.Throttle.Throttles);
  3910. break;
  3911. case PacketType.AgentPause:
  3912. m_probesWithNoIngressPackets = 0;
  3913. m_clientBlocked = true;
  3914. break;
  3915. case PacketType.AgentResume:
  3916. m_probesWithNoIngressPackets = 0;
  3917. m_clientBlocked = false;
  3918. SendStartPingCheck(0);
  3919. break;
  3920. case PacketType.ForceScriptControlRelease:
  3921. handlerForceReleaseControls = OnForceReleaseControls;
  3922. if (handlerForceReleaseControls != null)
  3923. {
  3924. handlerForceReleaseControls(this, AgentId);
  3925. }
  3926. break;
  3927. #endregion
  3928. #region Objects/m_sceneObjects
  3929. case PacketType.ObjectLink:
  3930. ObjectLinkPacket link = (ObjectLinkPacket)Pack;
  3931. uint parentprimid = 0;
  3932. List<uint> childrenprims = new List<uint>();
  3933. if (link.ObjectData.Length > 1)
  3934. {
  3935. parentprimid = link.ObjectData[0].ObjectLocalID;
  3936. for (int i = 1; i < link.ObjectData.Length; i++)
  3937. {
  3938. childrenprims.Add(link.ObjectData[i].ObjectLocalID);
  3939. }
  3940. }
  3941. handlerLinkObjects = OnLinkObjects;
  3942. if (handlerLinkObjects != null)
  3943. {
  3944. handlerLinkObjects(this, parentprimid, childrenprims);
  3945. }
  3946. break;
  3947. case PacketType.ObjectDelink:
  3948. ObjectDelinkPacket delink = (ObjectDelinkPacket)Pack;
  3949. // It appears the prim at index 0 is not always the root prim (for
  3950. // instance, when one prim of a link set has been edited independently
  3951. // of the others). Therefore, we'll pass all the ids onto the delink
  3952. // method for it to decide which is the root.
  3953. List<uint> prims = new List<uint>();
  3954. for (int i = 0; i < delink.ObjectData.Length; i++)
  3955. {
  3956. prims.Add(delink.ObjectData[i].ObjectLocalID);
  3957. }
  3958. handlerDelinkObjects = OnDelinkObjects;
  3959. if (handlerDelinkObjects != null)
  3960. {
  3961. handlerDelinkObjects(prims);
  3962. }
  3963. break;
  3964. case PacketType.ObjectAdd:
  3965. if (OnAddPrim != null)
  3966. {
  3967. ObjectAddPacket addPacket = (ObjectAddPacket)Pack;
  3968. PrimitiveBaseShape shape = GetShapeFromAddPacket(addPacket);
  3969. // m_log.Info("[REZData]: " + addPacket.ToString());
  3970. //BypassRaycast: 1
  3971. //RayStart: <69.79469, 158.2652, 98.40343>
  3972. //RayEnd: <61.97724, 141.995, 92.58341>
  3973. //RayTargetID: 00000000-0000-0000-0000-000000000000
  3974. //Check to see if adding the prim is allowed; useful for any module wanting to restrict the
  3975. //object from rezing initially
  3976. handlerAddPrim = OnAddPrim;
  3977. if (handlerAddPrim != null)
  3978. handlerAddPrim(AgentId, addPacket.ObjectData.RayEnd, addPacket.ObjectData.Rotation, shape, addPacket.ObjectData.BypassRaycast, addPacket.ObjectData.RayStart, addPacket.ObjectData.RayTargetID, addPacket.ObjectData.RayEndIsIntersection);
  3979. }
  3980. break;
  3981. case PacketType.ObjectShape:
  3982. ObjectShapePacket shapePacket = (ObjectShapePacket)Pack;
  3983. handlerUpdatePrimShape = null;
  3984. for (int i = 0; i < shapePacket.ObjectData.Length; i++)
  3985. {
  3986. handlerUpdatePrimShape = OnUpdatePrimShape;
  3987. if (handlerUpdatePrimShape != null)
  3988. {
  3989. UpdateShapeArgs shapeData = new UpdateShapeArgs();
  3990. shapeData.ObjectLocalID = shapePacket.ObjectData[i].ObjectLocalID;
  3991. shapeData.PathBegin = shapePacket.ObjectData[i].PathBegin;
  3992. shapeData.PathCurve = shapePacket.ObjectData[i].PathCurve;
  3993. shapeData.PathEnd = shapePacket.ObjectData[i].PathEnd;
  3994. shapeData.PathRadiusOffset = shapePacket.ObjectData[i].PathRadiusOffset;
  3995. shapeData.PathRevolutions = shapePacket.ObjectData[i].PathRevolutions;
  3996. shapeData.PathScaleX = shapePacket.ObjectData[i].PathScaleX;
  3997. shapeData.PathScaleY = shapePacket.ObjectData[i].PathScaleY;
  3998. shapeData.PathShearX = shapePacket.ObjectData[i].PathShearX;
  3999. shapeData.PathShearY = shapePacket.ObjectData[i].PathShearY;
  4000. shapeData.PathSkew = shapePacket.ObjectData[i].PathSkew;
  4001. shapeData.PathTaperX = shapePacket.ObjectData[i].PathTaperX;
  4002. shapeData.PathTaperY = shapePacket.ObjectData[i].PathTaperY;
  4003. shapeData.PathTwist = shapePacket.ObjectData[i].PathTwist;
  4004. shapeData.PathTwistBegin = shapePacket.ObjectData[i].PathTwistBegin;
  4005. shapeData.ProfileBegin = shapePacket.ObjectData[i].ProfileBegin;
  4006. shapeData.ProfileCurve = shapePacket.ObjectData[i].ProfileCurve;
  4007. shapeData.ProfileEnd = shapePacket.ObjectData[i].ProfileEnd;
  4008. shapeData.ProfileHollow = shapePacket.ObjectData[i].ProfileHollow;
  4009. handlerUpdatePrimShape(m_agentId, shapePacket.ObjectData[i].ObjectLocalID,
  4010. shapeData);
  4011. }
  4012. }
  4013. break;
  4014. case PacketType.ObjectExtraParams:
  4015. ObjectExtraParamsPacket extraPar = (ObjectExtraParamsPacket)Pack;
  4016. handlerUpdateExtraParams = OnUpdateExtraParams;
  4017. if (handlerUpdateExtraParams != null)
  4018. {
  4019. handlerUpdateExtraParams(m_agentId, extraPar.ObjectData[0].ObjectLocalID,
  4020. extraPar.ObjectData[0].ParamType,
  4021. extraPar.ObjectData[0].ParamInUse, extraPar.ObjectData[0].ParamData);
  4022. }
  4023. break;
  4024. case PacketType.ObjectDuplicate:
  4025. ObjectDuplicatePacket dupe = (ObjectDuplicatePacket)Pack;
  4026. ObjectDuplicatePacket.AgentDataBlock AgentandGroupData = dupe.AgentData;
  4027. handlerObjectDuplicate = null;
  4028. for (int i = 0; i < dupe.ObjectData.Length; i++)
  4029. {
  4030. handlerObjectDuplicate = OnObjectDuplicate;
  4031. if (handlerObjectDuplicate != null)
  4032. {
  4033. handlerObjectDuplicate(dupe.ObjectData[i].ObjectLocalID, dupe.SharedData.Offset,
  4034. dupe.SharedData.DuplicateFlags, AgentandGroupData.AgentID,
  4035. AgentandGroupData.GroupID);
  4036. }
  4037. }
  4038. break;
  4039. case PacketType.ObjectSelect:
  4040. ObjectSelectPacket incomingselect = (ObjectSelectPacket)Pack;
  4041. handlerObjectSelect = null;
  4042. for (int i = 0; i < incomingselect.ObjectData.Length; i++)
  4043. {
  4044. handlerObjectSelect = OnObjectSelect;
  4045. if (handlerObjectSelect != null)
  4046. {
  4047. handlerObjectSelect(incomingselect.ObjectData[i].ObjectLocalID, this);
  4048. }
  4049. }
  4050. break;
  4051. case PacketType.ObjectDeselect:
  4052. ObjectDeselectPacket incomingdeselect = (ObjectDeselectPacket)Pack;
  4053. handlerObjectDeselect = null;
  4054. for (int i = 0; i < incomingdeselect.ObjectData.Length; i++)
  4055. {
  4056. handlerObjectDeselect = OnObjectDeselect;
  4057. if (handlerObjectDeselect != null)
  4058. {
  4059. OnObjectDeselect(incomingdeselect.ObjectData[i].ObjectLocalID, this);
  4060. }
  4061. }
  4062. break;
  4063. case PacketType.ObjectPosition:
  4064. // DEPRECATED: but till libsecondlife removes it, people will use it
  4065. ObjectPositionPacket position = (ObjectPositionPacket)Pack;
  4066. for (int i = 0; i < position.ObjectData.Length; i++)
  4067. {
  4068. handlerUpdateVector = OnUpdatePrimGroupPosition;
  4069. if (handlerUpdateVector != null)
  4070. handlerUpdateVector(position.ObjectData[i].ObjectLocalID, position.ObjectData[i].Position, this);
  4071. }
  4072. break;
  4073. case PacketType.ObjectScale:
  4074. // DEPRECATED: but till libsecondlife removes it, people will use it
  4075. ObjectScalePacket scale = (ObjectScalePacket)Pack;
  4076. for (int i = 0; i < scale.ObjectData.Length; i++)
  4077. {
  4078. handlerUpdatePrimGroupScale = OnUpdatePrimGroupScale;
  4079. if (handlerUpdatePrimGroupScale != null)
  4080. handlerUpdatePrimGroupScale(scale.ObjectData[i].ObjectLocalID, scale.ObjectData[i].Scale, this);
  4081. }
  4082. break;
  4083. case PacketType.ObjectRotation:
  4084. // DEPRECATED: but till libsecondlife removes it, people will use it
  4085. ObjectRotationPacket rotation = (ObjectRotationPacket)Pack;
  4086. for (int i = 0; i < rotation.ObjectData.Length; i++)
  4087. {
  4088. handlerUpdatePrimRotation = OnUpdatePrimGroupRotation;
  4089. if (handlerUpdatePrimRotation != null)
  4090. handlerUpdatePrimRotation(rotation.ObjectData[i].ObjectLocalID, rotation.ObjectData[i].Rotation, this);
  4091. }
  4092. break;
  4093. case PacketType.ObjectFlagUpdate:
  4094. ObjectFlagUpdatePacket flags = (ObjectFlagUpdatePacket)Pack;
  4095. handlerUpdatePrimFlags = OnUpdatePrimFlags;
  4096. if (handlerUpdatePrimFlags != null)
  4097. {
  4098. byte[] data = Pack.ToBytes();
  4099. int i = 46;
  4100. bool UsePhysics = (data[i++] != 0) ? true : false;
  4101. bool IsTemporary = (data[i++] != 0) ? true : false;
  4102. bool IsPhantom = (data[i++] != 0) ? true : false;
  4103. handlerUpdatePrimFlags(flags.AgentData.ObjectLocalID, UsePhysics, IsTemporary, IsPhantom, this);
  4104. }
  4105. break;
  4106. case PacketType.ObjectImage:
  4107. ObjectImagePacket imagePack = (ObjectImagePacket)Pack;
  4108. handlerUpdatePrimTexture = null;
  4109. for (int i = 0; i < imagePack.ObjectData.Length; i++)
  4110. {
  4111. handlerUpdatePrimTexture = OnUpdatePrimTexture;
  4112. if (handlerUpdatePrimTexture != null)
  4113. {
  4114. handlerUpdatePrimTexture(imagePack.ObjectData[i].ObjectLocalID,
  4115. imagePack.ObjectData[i].TextureEntry, this);
  4116. }
  4117. }
  4118. break;
  4119. case PacketType.ObjectGrab:
  4120. ObjectGrabPacket grab = (ObjectGrabPacket)Pack;
  4121. handlerGrabObject = OnGrabObject;
  4122. if (handlerGrabObject != null)
  4123. {
  4124. List<SurfaceTouchEventArgs> touchArgs = new List<SurfaceTouchEventArgs>();
  4125. if ((grab.SurfaceInfo != null) && (grab.SurfaceInfo.Length > 0))
  4126. {
  4127. foreach (ObjectGrabPacket.SurfaceInfoBlock surfaceInfo in grab.SurfaceInfo)
  4128. {
  4129. SurfaceTouchEventArgs arg = new SurfaceTouchEventArgs();
  4130. arg.Binormal = surfaceInfo.Binormal;
  4131. arg.FaceIndex = surfaceInfo.FaceIndex;
  4132. arg.Normal = surfaceInfo.Normal;
  4133. arg.Position = surfaceInfo.Position;
  4134. arg.STCoord = surfaceInfo.STCoord;
  4135. arg.UVCoord = surfaceInfo.UVCoord;
  4136. touchArgs.Add(arg);
  4137. }
  4138. }
  4139. handlerGrabObject(grab.ObjectData.LocalID, grab.ObjectData.GrabOffset, this, touchArgs);
  4140. }
  4141. break;
  4142. case PacketType.ObjectGrabUpdate:
  4143. ObjectGrabUpdatePacket grabUpdate = (ObjectGrabUpdatePacket)Pack;
  4144. handlerGrabUpdate = OnGrabUpdate;
  4145. if (handlerGrabUpdate != null)
  4146. {
  4147. List<SurfaceTouchEventArgs> touchArgs = new List<SurfaceTouchEventArgs>();
  4148. if ((grabUpdate.SurfaceInfo != null) && (grabUpdate.SurfaceInfo.Length > 0))
  4149. {
  4150. foreach (ObjectGrabUpdatePacket.SurfaceInfoBlock surfaceInfo in grabUpdate.SurfaceInfo)
  4151. {
  4152. SurfaceTouchEventArgs arg = new SurfaceTouchEventArgs();
  4153. arg.Binormal = surfaceInfo.Binormal;
  4154. arg.FaceIndex = surfaceInfo.FaceIndex;
  4155. arg.Normal = surfaceInfo.Normal;
  4156. arg.Position = surfaceInfo.Position;
  4157. arg.STCoord = surfaceInfo.STCoord;
  4158. arg.UVCoord = surfaceInfo.UVCoord;
  4159. touchArgs.Add(arg);
  4160. }
  4161. }
  4162. handlerGrabUpdate(grabUpdate.ObjectData.ObjectID, grabUpdate.ObjectData.GrabOffsetInitial,
  4163. grabUpdate.ObjectData.GrabPosition, this, touchArgs);
  4164. }
  4165. break;
  4166. case PacketType.ObjectDeGrab:
  4167. ObjectDeGrabPacket deGrab = (ObjectDeGrabPacket)Pack;
  4168. handlerDeGrabObject = OnDeGrabObject;
  4169. if (handlerDeGrabObject != null)
  4170. {
  4171. handlerDeGrabObject(deGrab.ObjectData.LocalID, this);
  4172. }
  4173. break;
  4174. case PacketType.ObjectDescription:
  4175. ObjectDescriptionPacket objDes = (ObjectDescriptionPacket)Pack;
  4176. handlerObjectDescription = null;
  4177. for (int i = 0; i < objDes.ObjectData.Length; i++)
  4178. {
  4179. handlerObjectDescription = OnObjectDescription;
  4180. if (handlerObjectDescription != null)
  4181. {
  4182. handlerObjectDescription(this, objDes.ObjectData[i].LocalID,
  4183. Util.FieldToString(objDes.ObjectData[i].Description));
  4184. }
  4185. }
  4186. break;
  4187. case PacketType.ObjectName:
  4188. ObjectNamePacket objName = (ObjectNamePacket)Pack;
  4189. handlerObjectName = null;
  4190. for (int i = 0; i < objName.ObjectData.Length; i++)
  4191. {
  4192. handlerObjectName = OnObjectName;
  4193. if (handlerObjectName != null)
  4194. {
  4195. handlerObjectName(this, objName.ObjectData[i].LocalID,
  4196. Util.FieldToString(objName.ObjectData[i].Name));
  4197. }
  4198. }
  4199. break;
  4200. case PacketType.ObjectPermissions:
  4201. if (OnObjectPermissions != null)
  4202. {
  4203. ObjectPermissionsPacket newobjPerms = (ObjectPermissionsPacket)Pack;
  4204. UUID AgentID = newobjPerms.AgentData.AgentID;
  4205. UUID SessionID = newobjPerms.AgentData.SessionID;
  4206. handlerObjectPermissions = null;
  4207. for (int i = 0; i < newobjPerms.ObjectData.Length; i++)
  4208. {
  4209. ObjectPermissionsPacket.ObjectDataBlock permChanges = newobjPerms.ObjectData[i];
  4210. byte field = permChanges.Field;
  4211. uint localID = permChanges.ObjectLocalID;
  4212. uint mask = permChanges.Mask;
  4213. byte set = permChanges.Set;
  4214. handlerObjectPermissions = OnObjectPermissions;
  4215. if (handlerObjectPermissions != null)
  4216. handlerObjectPermissions(this, AgentID, SessionID, field, localID, mask, set);
  4217. }
  4218. }
  4219. // Here's our data,
  4220. // PermField contains the field the info goes into
  4221. // PermField determines which mask we're changing
  4222. //
  4223. // chmask is the mask of the change
  4224. // setTF is whether we're adding it or taking it away
  4225. //
  4226. // objLocalID is the localID of the object.
  4227. // Unfortunately, we have to pass the event the packet because objData is an array
  4228. // That means multiple object perms may be updated in a single packet.
  4229. break;
  4230. case PacketType.Undo:
  4231. UndoPacket undoitem = (UndoPacket)Pack;
  4232. if (undoitem.ObjectData.Length > 0)
  4233. {
  4234. for (int i = 0; i < undoitem.ObjectData.Length; i++)
  4235. {
  4236. UUID objiD = undoitem.ObjectData[i].ObjectID;
  4237. handlerOnUndo = OnUndo;
  4238. if (handlerOnUndo != null)
  4239. {
  4240. handlerOnUndo(this, objiD);
  4241. }
  4242. }
  4243. }
  4244. break;
  4245. case PacketType.ObjectDuplicateOnRay:
  4246. ObjectDuplicateOnRayPacket dupeOnRay = (ObjectDuplicateOnRayPacket)Pack;
  4247. handlerObjectDuplicateOnRay = null;
  4248. for (int i = 0; i < dupeOnRay.ObjectData.Length; i++)
  4249. {
  4250. handlerObjectDuplicateOnRay = OnObjectDuplicateOnRay;
  4251. if (handlerObjectDuplicateOnRay != null)
  4252. {
  4253. handlerObjectDuplicateOnRay(dupeOnRay.ObjectData[i].ObjectLocalID, dupeOnRay.AgentData.DuplicateFlags,
  4254. dupeOnRay.AgentData.AgentID, dupeOnRay.AgentData.GroupID, dupeOnRay.AgentData.RayTargetID, dupeOnRay.AgentData.RayEnd,
  4255. dupeOnRay.AgentData.RayStart, dupeOnRay.AgentData.BypassRaycast, dupeOnRay.AgentData.RayEndIsIntersection,
  4256. dupeOnRay.AgentData.CopyCenters, dupeOnRay.AgentData.CopyRotates);
  4257. }
  4258. }
  4259. break;
  4260. case PacketType.RequestObjectPropertiesFamily:
  4261. //This powers the little tooltip that appears when you move your mouse over an object
  4262. RequestObjectPropertiesFamilyPacket packToolTip = (RequestObjectPropertiesFamilyPacket)Pack;
  4263. RequestObjectPropertiesFamilyPacket.ObjectDataBlock packObjBlock = packToolTip.ObjectData;
  4264. handlerRequestObjectPropertiesFamily = OnRequestObjectPropertiesFamily;
  4265. if (handlerRequestObjectPropertiesFamily != null)
  4266. {
  4267. handlerRequestObjectPropertiesFamily(this, m_agentId, packObjBlock.RequestFlags,
  4268. packObjBlock.ObjectID);
  4269. }
  4270. break;
  4271. case PacketType.ObjectIncludeInSearch:
  4272. //This lets us set objects to appear in search (stuff like DataSnapshot, etc)
  4273. ObjectIncludeInSearchPacket packInSearch = (ObjectIncludeInSearchPacket)Pack;
  4274. handlerObjectIncludeInSearch = null;
  4275. foreach (ObjectIncludeInSearchPacket.ObjectDataBlock objData in packInSearch.ObjectData)
  4276. {
  4277. bool inSearch = objData.IncludeInSearch;
  4278. uint localID = objData.ObjectLocalID;
  4279. handlerObjectIncludeInSearch = OnObjectIncludeInSearch;
  4280. if (handlerObjectIncludeInSearch != null)
  4281. {
  4282. handlerObjectIncludeInSearch(this, inSearch, localID);
  4283. }
  4284. }
  4285. break;
  4286. case PacketType.ScriptAnswerYes:
  4287. ScriptAnswerYesPacket scriptAnswer = (ScriptAnswerYesPacket)Pack;
  4288. handlerScriptAnswer = OnScriptAnswer;
  4289. if (handlerScriptAnswer != null)
  4290. {
  4291. handlerScriptAnswer(this, scriptAnswer.Data.TaskID, scriptAnswer.Data.ItemID, scriptAnswer.Data.Questions);
  4292. }
  4293. break;
  4294. case PacketType.ObjectClickAction:
  4295. ObjectClickActionPacket ocpacket = (ObjectClickActionPacket)Pack;
  4296. handlerObjectClickAction = OnObjectClickAction;
  4297. if (handlerObjectClickAction != null)
  4298. {
  4299. foreach (ObjectClickActionPacket.ObjectDataBlock odata in ocpacket.ObjectData)
  4300. {
  4301. byte action = odata.ClickAction;
  4302. uint localID = odata.ObjectLocalID;
  4303. handlerObjectClickAction(this, localID, action.ToString());
  4304. }
  4305. }
  4306. break;
  4307. case PacketType.ObjectMaterial:
  4308. ObjectMaterialPacket ompacket = (ObjectMaterialPacket)Pack;
  4309. handlerObjectMaterial = OnObjectMaterial;
  4310. if (handlerObjectMaterial != null)
  4311. {
  4312. foreach (ObjectMaterialPacket.ObjectDataBlock odata in ompacket.ObjectData)
  4313. {
  4314. byte material = odata.Material;
  4315. uint localID = odata.ObjectLocalID;
  4316. handlerObjectMaterial(this, localID, material.ToString());
  4317. }
  4318. }
  4319. break;
  4320. #endregion
  4321. #region Inventory/Asset/Other related packets
  4322. case PacketType.RequestImage:
  4323. RequestImagePacket imageRequest = (RequestImagePacket)Pack;
  4324. //Console.WriteLine("image request: " + Pack.ToString());
  4325. handlerTextureRequest = null;
  4326. for (int i = 0; i < imageRequest.RequestImage.Length; i++)
  4327. {
  4328. if (OnRequestTexture != null)
  4329. {
  4330. TextureRequestArgs args = new TextureRequestArgs();
  4331. args.RequestedAssetID = imageRequest.RequestImage[i].Image;
  4332. args.DiscardLevel = imageRequest.RequestImage[i].DiscardLevel;
  4333. args.PacketNumber = imageRequest.RequestImage[i].Packet;
  4334. args.Priority = imageRequest.RequestImage[i].DownloadPriority;
  4335. handlerTextureRequest = OnRequestTexture;
  4336. if (handlerTextureRequest != null)
  4337. OnRequestTexture(this, args);
  4338. }
  4339. }
  4340. break;
  4341. case PacketType.TransferRequest:
  4342. //Console.WriteLine("ClientView.ProcessPackets.cs:ProcessInPacket() - Got transfer request");
  4343. TransferRequestPacket transfer = (TransferRequestPacket)Pack;
  4344. // Validate inventory transfers
  4345. // Has to be done here, because AssetCache can't do it
  4346. //
  4347. if (transfer.TransferInfo.SourceType == 3)
  4348. {
  4349. UUID taskID = new UUID(transfer.TransferInfo.Params, 48);
  4350. UUID itemID = new UUID(transfer.TransferInfo.Params, 64);
  4351. UUID requestID = new UUID(transfer.TransferInfo.Params, 80);
  4352. if (!(((Scene)m_scene).ExternalChecks.ExternalChecksBypassPermissions()))
  4353. {
  4354. if (taskID != UUID.Zero) // Prim
  4355. {
  4356. SceneObjectPart part = ((Scene)m_scene).GetSceneObjectPart(taskID);
  4357. if (part == null)
  4358. break;
  4359. if (part.OwnerID != AgentId)
  4360. break;
  4361. if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0)
  4362. break;
  4363. TaskInventoryItem ti = part.GetInventoryItem(itemID);
  4364. if (ti == null)
  4365. break;
  4366. if (ti.OwnerID != AgentId)
  4367. break;
  4368. if ((ti.CurrentPermissions & ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer)) != ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer))
  4369. break;
  4370. if (ti.AssetID != requestID)
  4371. break;
  4372. }
  4373. else // Agent
  4374. {
  4375. CachedUserInfo userInfo = ((Scene)m_scene).CommsManager.UserProfileCacheService.GetUserDetails(AgentId);
  4376. if (userInfo == null)
  4377. {
  4378. m_log.ErrorFormat(
  4379. "[CLIENT]: Could not resolve user {0} for caps inventory update",
  4380. AgentId);
  4381. break;
  4382. }
  4383. if (userInfo.RootFolder == null)
  4384. break;
  4385. InventoryItemBase assetRequestItem = userInfo.RootFolder.FindItem(itemID);
  4386. if (assetRequestItem == null)
  4387. {
  4388. assetRequestItem = ((Scene)m_scene).CommsManager.UserProfileCacheService.LibraryRoot.FindItem(itemID);
  4389. if (assetRequestItem == null)
  4390. return;
  4391. }
  4392. // At this point, we need to apply perms
  4393. // only to notecards and scripts. All
  4394. // other asset types are always available
  4395. //
  4396. if (assetRequestItem.AssetType == 10)
  4397. {
  4398. if (!((Scene)m_scene).ExternalChecks.ExternalChecksCanViewScript(itemID, UUID.Zero, AgentId))
  4399. {
  4400. SendAgentAlertMessage("Insufficient permissions to view script", false);
  4401. break;
  4402. }
  4403. }
  4404. else if (assetRequestItem.AssetType == 7)
  4405. {
  4406. if (!((Scene)m_scene).ExternalChecks.ExternalChecksCanViewNotecard(itemID, UUID.Zero, AgentId))
  4407. {
  4408. SendAgentAlertMessage("Insufficient permissions to view notecard", false);
  4409. break;
  4410. }
  4411. }
  4412. if (assetRequestItem.AssetID != requestID)
  4413. break;
  4414. }
  4415. }
  4416. }
  4417. m_assetCache.AddAssetRequest(this, transfer);
  4418. /* RequestAsset = OnRequestAsset;
  4419. if (RequestAsset != null)
  4420. {
  4421. RequestAsset(this, transfer);
  4422. }*/
  4423. break;
  4424. case PacketType.AssetUploadRequest:
  4425. AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack;
  4426. // Console.WriteLine("upload request " + Pack.ToString());
  4427. // Console.WriteLine("upload request was for assetid: " + request.AssetBlock.TransactionID.Combine(this.SecureSessionId).ToString());
  4428. UUID temp = UUID.Combine(request.AssetBlock.TransactionID, SecureSessionId);
  4429. handlerAssetUploadRequest = OnAssetUploadRequest;
  4430. if (handlerAssetUploadRequest != null)
  4431. {
  4432. handlerAssetUploadRequest(this, temp,
  4433. request.AssetBlock.TransactionID, request.AssetBlock.Type,
  4434. request.AssetBlock.AssetData, request.AssetBlock.StoreLocal,
  4435. request.AssetBlock.Tempfile);
  4436. }
  4437. break;
  4438. case PacketType.RequestXfer:
  4439. RequestXferPacket xferReq = (RequestXferPacket)Pack;
  4440. handlerRequestXfer = OnRequestXfer;
  4441. if (handlerRequestXfer != null)
  4442. {
  4443. handlerRequestXfer(this, xferReq.XferID.ID, Util.FieldToString(xferReq.XferID.Filename));
  4444. }
  4445. break;
  4446. case PacketType.SendXferPacket:
  4447. SendXferPacketPacket xferRec = (SendXferPacketPacket)Pack;
  4448. handlerXferReceive = OnXferReceive;
  4449. if (handlerXferReceive != null)
  4450. {
  4451. handlerXferReceive(this, xferRec.XferID.ID, xferRec.XferID.Packet, xferRec.DataPacket.Data);
  4452. }
  4453. break;
  4454. case PacketType.ConfirmXferPacket:
  4455. ConfirmXferPacketPacket confirmXfer = (ConfirmXferPacketPacket)Pack;
  4456. handlerConfirmXfer = OnConfirmXfer;
  4457. if (handlerConfirmXfer != null)
  4458. {
  4459. handlerConfirmXfer(this, confirmXfer.XferID.ID, confirmXfer.XferID.Packet);
  4460. }
  4461. break;
  4462. case PacketType.CreateInventoryFolder:
  4463. CreateInventoryFolderPacket invFolder = (CreateInventoryFolderPacket)Pack;
  4464. handlerCreateInventoryFolder = OnCreateNewInventoryFolder;
  4465. if (handlerCreateInventoryFolder != null)
  4466. {
  4467. handlerCreateInventoryFolder(this, invFolder.FolderData.FolderID,
  4468. (ushort)invFolder.FolderData.Type,
  4469. Util.FieldToString(invFolder.FolderData.Name),
  4470. invFolder.FolderData.ParentID);
  4471. }
  4472. break;
  4473. case PacketType.UpdateInventoryFolder:
  4474. if (OnUpdateInventoryFolder != null)
  4475. {
  4476. UpdateInventoryFolderPacket invFolderx = (UpdateInventoryFolderPacket)Pack;
  4477. handlerUpdateInventoryFolder = null;
  4478. for (int i = 0; i < invFolderx.FolderData.Length; i++)
  4479. {
  4480. handlerUpdateInventoryFolder = OnUpdateInventoryFolder;
  4481. if (handlerUpdateInventoryFolder != null)
  4482. {
  4483. OnUpdateInventoryFolder(this, invFolderx.FolderData[i].FolderID,
  4484. (ushort)invFolderx.FolderData[i].Type,
  4485. Util.FieldToString(invFolderx.FolderData[i].Name),
  4486. invFolderx.FolderData[i].ParentID);
  4487. }
  4488. }
  4489. }
  4490. break;
  4491. case PacketType.MoveInventoryFolder:
  4492. if (OnMoveInventoryFolder != null)
  4493. {
  4494. MoveInventoryFolderPacket invFoldery = (MoveInventoryFolderPacket)Pack;
  4495. handlerMoveInventoryFolder = null;
  4496. for (int i = 0; i < invFoldery.InventoryData.Length; i++)
  4497. {
  4498. handlerMoveInventoryFolder = OnMoveInventoryFolder;
  4499. if (handlerMoveInventoryFolder != null)
  4500. {
  4501. OnMoveInventoryFolder(this, invFoldery.InventoryData[i].FolderID,
  4502. invFoldery.InventoryData[i].ParentID);
  4503. }
  4504. }
  4505. }
  4506. break;
  4507. case PacketType.CreateInventoryItem:
  4508. CreateInventoryItemPacket createItem = (CreateInventoryItemPacket)Pack;
  4509. handlerCreateNewInventoryItem = OnCreateNewInventoryItem;
  4510. if (handlerCreateNewInventoryItem != null)
  4511. {
  4512. handlerCreateNewInventoryItem(this, createItem.InventoryBlock.TransactionID,
  4513. createItem.InventoryBlock.FolderID,
  4514. createItem.InventoryBlock.CallbackID,
  4515. Util.FieldToString(createItem.InventoryBlock.Description),
  4516. Util.FieldToString(createItem.InventoryBlock.Name),
  4517. createItem.InventoryBlock.InvType,
  4518. createItem.InventoryBlock.Type,
  4519. createItem.InventoryBlock.WearableType,
  4520. createItem.InventoryBlock.NextOwnerMask,
  4521. Util.UnixTimeSinceEpoch());
  4522. }
  4523. break;
  4524. case PacketType.FetchInventory:
  4525. if (OnFetchInventory != null)
  4526. {
  4527. FetchInventoryPacket FetchInventoryx = (FetchInventoryPacket)Pack;
  4528. handlerFetchInventory = null;
  4529. for (int i = 0; i < FetchInventoryx.InventoryData.Length; i++)
  4530. {
  4531. handlerFetchInventory = OnFetchInventory;
  4532. if (handlerFetchInventory != null)
  4533. {
  4534. OnFetchInventory(this, FetchInventoryx.InventoryData[i].ItemID,
  4535. FetchInventoryx.InventoryData[i].OwnerID);
  4536. }
  4537. }
  4538. }
  4539. break;
  4540. case PacketType.FetchInventoryDescendents:
  4541. FetchInventoryDescendentsPacket Fetch = (FetchInventoryDescendentsPacket)Pack;
  4542. handlerFetchInventoryDescendents = OnFetchInventoryDescendents;
  4543. if (handlerFetchInventoryDescendents != null)
  4544. {
  4545. handlerFetchInventoryDescendents(this, Fetch.InventoryData.FolderID, Fetch.InventoryData.OwnerID,
  4546. Fetch.InventoryData.FetchFolders, Fetch.InventoryData.FetchItems,
  4547. Fetch.InventoryData.SortOrder);
  4548. }
  4549. break;
  4550. case PacketType.PurgeInventoryDescendents:
  4551. PurgeInventoryDescendentsPacket Purge = (PurgeInventoryDescendentsPacket)Pack;
  4552. handlerPurgeInventoryDescendents = OnPurgeInventoryDescendents;
  4553. if (handlerPurgeInventoryDescendents != null)
  4554. {
  4555. handlerPurgeInventoryDescendents(this, Purge.InventoryData.FolderID);
  4556. }
  4557. break;
  4558. case PacketType.UpdateInventoryItem:
  4559. UpdateInventoryItemPacket update = (UpdateInventoryItemPacket)Pack;
  4560. if (OnUpdateInventoryItem != null)
  4561. {
  4562. handlerUpdateInventoryItem = null;
  4563. for (int i = 0; i < update.InventoryData.Length; i++)
  4564. {
  4565. handlerUpdateInventoryItem = OnUpdateInventoryItem;
  4566. if (handlerUpdateInventoryItem != null)
  4567. {
  4568. InventoryItemBase itemUpd = new InventoryItemBase();
  4569. itemUpd.ID = update.InventoryData[i].ItemID;
  4570. itemUpd.Name = Util.FieldToString(update.InventoryData[i].Name);
  4571. itemUpd.Description = Util.FieldToString(update.InventoryData[i].Description);
  4572. itemUpd.GroupID = update.InventoryData[i].GroupID;
  4573. itemUpd.GroupOwned = update.InventoryData[i].GroupOwned;
  4574. itemUpd.NextPermissions = update.InventoryData[i].NextOwnerMask;
  4575. itemUpd.EveryOnePermissions = update.InventoryData[i].EveryoneMask;
  4576. itemUpd.CreationDate = update.InventoryData[i].CreationDate;
  4577. itemUpd.Folder = update.InventoryData[i].FolderID;
  4578. itemUpd.InvType = update.InventoryData[i].InvType;
  4579. itemUpd.SalePrice = update.InventoryData[i].SalePrice;
  4580. itemUpd.SaleType = update.InventoryData[i].SaleType;
  4581. itemUpd.Flags = update.InventoryData[i].Flags;
  4582. /*
  4583. OnUpdateInventoryItem(this, update.InventoryData[i].TransactionID,
  4584. update.InventoryData[i].ItemID,
  4585. Util.FieldToString(update.InventoryData[i].Name),
  4586. Util.FieldToString(update.InventoryData[i].Description),
  4587. update.InventoryData[i].NextOwnerMask);
  4588. */
  4589. OnUpdateInventoryItem(this, update.InventoryData[i].TransactionID,
  4590. update.InventoryData[i].ItemID,
  4591. itemUpd);
  4592. }
  4593. }
  4594. }
  4595. //Console.WriteLine(Pack.ToString());
  4596. /*for (int i = 0; i < update.InventoryData.Length; i++)
  4597. {
  4598. if (update.InventoryData[i].TransactionID != UUID.Zero)
  4599. {
  4600. AssetBase asset = m_assetCache.GetAsset(update.InventoryData[i].TransactionID.Combine(this.SecureSessionId));
  4601. if (asset != null)
  4602. {
  4603. // Console.WriteLine("updating inventory item, found asset" + asset.FullID.ToString() + " already in cache");
  4604. m_inventoryCache.UpdateInventoryItemAsset(this, update.InventoryData[i].ItemID, asset);
  4605. }
  4606. else
  4607. {
  4608. asset = this.UploadAssets.AddUploadToAssetCache(update.InventoryData[i].TransactionID);
  4609. if (asset != null)
  4610. {
  4611. //Console.WriteLine("updating inventory item, adding asset" + asset.FullID.ToString() + " to cache");
  4612. m_inventoryCache.UpdateInventoryItemAsset(this, update.InventoryData[i].ItemID, asset);
  4613. }
  4614. else
  4615. {
  4616. //Console.WriteLine("trying to update inventory item, but asset is null");
  4617. }
  4618. }
  4619. }
  4620. else
  4621. {
  4622. m_inventoryCache.UpdateInventoryItemDetails(this, update.InventoryData[i].ItemID, update.InventoryData[i]); ;
  4623. }
  4624. }*/
  4625. break;
  4626. case PacketType.CopyInventoryItem:
  4627. CopyInventoryItemPacket copyitem = (CopyInventoryItemPacket)Pack;
  4628. handlerCopyInventoryItem = null;
  4629. if (OnCopyInventoryItem != null)
  4630. {
  4631. foreach (CopyInventoryItemPacket.InventoryDataBlock datablock in copyitem.InventoryData)
  4632. {
  4633. handlerCopyInventoryItem = OnCopyInventoryItem;
  4634. if (handlerCopyInventoryItem != null)
  4635. {
  4636. handlerCopyInventoryItem(this, datablock.CallbackID, datablock.OldAgentID,
  4637. datablock.OldItemID, datablock.NewFolderID,
  4638. Util.FieldToString(datablock.NewName));
  4639. }
  4640. }
  4641. }
  4642. break;
  4643. case PacketType.MoveInventoryItem:
  4644. MoveInventoryItemPacket moveitem = (MoveInventoryItemPacket)Pack;
  4645. if (OnMoveInventoryItem != null)
  4646. {
  4647. handlerMoveInventoryItem = null;
  4648. foreach (MoveInventoryItemPacket.InventoryDataBlock datablock in moveitem.InventoryData)
  4649. {
  4650. handlerMoveInventoryItem = OnMoveInventoryItem;
  4651. if (handlerMoveInventoryItem != null)
  4652. {
  4653. handlerMoveInventoryItem(this, datablock.FolderID, datablock.ItemID, datablock.Length,
  4654. Util.FieldToString(datablock.NewName));
  4655. }
  4656. }
  4657. }
  4658. break;
  4659. case PacketType.RemoveInventoryItem:
  4660. RemoveInventoryItemPacket removeItem = (RemoveInventoryItemPacket)Pack;
  4661. if (OnRemoveInventoryItem != null)
  4662. {
  4663. handlerRemoveInventoryItem = null;
  4664. foreach (RemoveInventoryItemPacket.InventoryDataBlock datablock in removeItem.InventoryData)
  4665. {
  4666. handlerRemoveInventoryItem = OnRemoveInventoryItem;
  4667. if (handlerRemoveInventoryItem != null)
  4668. {
  4669. handlerRemoveInventoryItem(this, datablock.ItemID);
  4670. }
  4671. }
  4672. }
  4673. break;
  4674. case PacketType.RemoveInventoryFolder:
  4675. RemoveInventoryFolderPacket removeFolder = (RemoveInventoryFolderPacket)Pack;
  4676. if (OnRemoveInventoryFolder != null)
  4677. {
  4678. handlerRemoveInventoryFolder = null;
  4679. foreach (RemoveInventoryFolderPacket.FolderDataBlock datablock in removeFolder.FolderData)
  4680. {
  4681. handlerRemoveInventoryFolder = OnRemoveInventoryFolder;
  4682. if (handlerRemoveInventoryFolder != null)
  4683. {
  4684. handlerRemoveInventoryFolder(this, datablock.FolderID);
  4685. }
  4686. }
  4687. }
  4688. break;
  4689. case PacketType.RequestTaskInventory:
  4690. RequestTaskInventoryPacket requesttask = (RequestTaskInventoryPacket)Pack;
  4691. handlerRequestTaskInventory = OnRequestTaskInventory;
  4692. if (handlerRequestTaskInventory != null)
  4693. {
  4694. handlerRequestTaskInventory(this, requesttask.InventoryData.LocalID);
  4695. }
  4696. break;
  4697. case PacketType.UpdateTaskInventory:
  4698. UpdateTaskInventoryPacket updatetask = (UpdateTaskInventoryPacket)Pack;
  4699. if (OnUpdateTaskInventory != null)
  4700. {
  4701. if (updatetask.UpdateData.Key == 0)
  4702. {
  4703. handlerUpdateTaskInventory = OnUpdateTaskInventory;
  4704. if (handlerUpdateTaskInventory != null)
  4705. {
  4706. TaskInventoryItem newTaskItem = new TaskInventoryItem();
  4707. newTaskItem.ItemID = updatetask.InventoryData.ItemID;
  4708. newTaskItem.ParentID = updatetask.InventoryData.FolderID;
  4709. newTaskItem.CreatorID = updatetask.InventoryData.CreatorID;
  4710. newTaskItem.OwnerID = updatetask.InventoryData.OwnerID;
  4711. newTaskItem.GroupID = updatetask.InventoryData.GroupID;
  4712. newTaskItem.BasePermissions = updatetask.InventoryData.BaseMask;
  4713. newTaskItem.CurrentPermissions = updatetask.InventoryData.OwnerMask;
  4714. newTaskItem.GroupPermissions = updatetask.InventoryData.GroupMask;
  4715. newTaskItem.EveryonePermissions = updatetask.InventoryData.EveryoneMask;
  4716. newTaskItem.NextPermissions = updatetask.InventoryData.NextOwnerMask;
  4717. //newTaskItem.GroupOwned=updatetask.InventoryData.GroupOwned;
  4718. newTaskItem.Type = updatetask.InventoryData.Type;
  4719. newTaskItem.InvType = updatetask.InventoryData.InvType;
  4720. newTaskItem.Flags = updatetask.InventoryData.Flags;
  4721. //newTaskItem.SaleType=updatetask.InventoryData.SaleType;
  4722. //newTaskItem.SalePrice=updatetask.InventoryData.SalePrice;;
  4723. newTaskItem.Name = Util.FieldToString(updatetask.InventoryData.Name);
  4724. newTaskItem.Description = Util.FieldToString(updatetask.InventoryData.Description);
  4725. newTaskItem.CreationDate = (uint)updatetask.InventoryData.CreationDate;
  4726. handlerUpdateTaskInventory(this, updatetask.InventoryData.TransactionID,
  4727. newTaskItem, updatetask.UpdateData.LocalID);
  4728. }
  4729. }
  4730. }
  4731. break;
  4732. case PacketType.RemoveTaskInventory:
  4733. RemoveTaskInventoryPacket removeTask = (RemoveTaskInventoryPacket)Pack;
  4734. handlerRemoveTaskItem = OnRemoveTaskItem;
  4735. if (handlerRemoveTaskItem != null)
  4736. {
  4737. handlerRemoveTaskItem(this, removeTask.InventoryData.ItemID, removeTask.InventoryData.LocalID);
  4738. }
  4739. break;
  4740. case PacketType.MoveTaskInventory:
  4741. MoveTaskInventoryPacket moveTaskInventoryPacket = (MoveTaskInventoryPacket)Pack;
  4742. handlerMoveTaskItem = OnMoveTaskItem;
  4743. if (handlerMoveTaskItem != null)
  4744. {
  4745. handlerMoveTaskItem(
  4746. this, moveTaskInventoryPacket.AgentData.FolderID,
  4747. moveTaskInventoryPacket.InventoryData.LocalID,
  4748. moveTaskInventoryPacket.InventoryData.ItemID);
  4749. }
  4750. break;
  4751. case PacketType.RezScript:
  4752. //Console.WriteLine(Pack.ToString());
  4753. RezScriptPacket rezScriptx = (RezScriptPacket)Pack;
  4754. handlerRezScript = OnRezScript;
  4755. InventoryItemBase item = new InventoryItemBase();
  4756. item.ID = rezScriptx.InventoryBlock.ItemID;
  4757. item.Folder = rezScriptx.InventoryBlock.FolderID;
  4758. item.Creator = rezScriptx.InventoryBlock.CreatorID;
  4759. item.Owner = rezScriptx.InventoryBlock.OwnerID;
  4760. item.BasePermissions = rezScriptx.InventoryBlock.BaseMask;
  4761. item.CurrentPermissions = rezScriptx.InventoryBlock.OwnerMask;
  4762. item.EveryOnePermissions = rezScriptx.InventoryBlock.EveryoneMask;
  4763. item.NextPermissions = rezScriptx.InventoryBlock.NextOwnerMask;
  4764. item.GroupOwned = rezScriptx.InventoryBlock.GroupOwned;
  4765. item.GroupID = rezScriptx.InventoryBlock.GroupID;
  4766. item.AssetType = rezScriptx.InventoryBlock.Type;
  4767. item.InvType = rezScriptx.InventoryBlock.InvType;
  4768. item.Flags = rezScriptx.InventoryBlock.Flags;
  4769. item.SaleType = rezScriptx.InventoryBlock.SaleType;
  4770. item.SalePrice = rezScriptx.InventoryBlock.SalePrice;
  4771. item.Name = Util.FieldToString(rezScriptx.InventoryBlock.Name);
  4772. item.Description = Util.FieldToString(rezScriptx.InventoryBlock.Description);
  4773. item.CreationDate = rezScriptx.InventoryBlock.CreationDate;
  4774. if (handlerRezScript != null)
  4775. {
  4776. handlerRezScript(this, item, rezScriptx.InventoryBlock.TransactionID, rezScriptx.UpdateBlock.ObjectLocalID);
  4777. }
  4778. break;
  4779. case PacketType.MapLayerRequest:
  4780. RequestMapLayer();
  4781. break;
  4782. case PacketType.MapBlockRequest:
  4783. MapBlockRequestPacket MapRequest = (MapBlockRequestPacket)Pack;
  4784. handlerRequestMapBlocks = OnRequestMapBlocks;
  4785. if (handlerRequestMapBlocks != null)
  4786. {
  4787. handlerRequestMapBlocks(this, MapRequest.PositionData.MinX, MapRequest.PositionData.MinY,
  4788. MapRequest.PositionData.MaxX, MapRequest.PositionData.MaxY, MapRequest.AgentData.Flags);
  4789. }
  4790. break;
  4791. case PacketType.MapNameRequest:
  4792. MapNameRequestPacket map = (MapNameRequestPacket)Pack;
  4793. string mapName = Encoding.UTF8.GetString(map.NameData.Name, 0,
  4794. map.NameData.Name.Length - 1);
  4795. handlerMapNameRequest = OnMapNameRequest;
  4796. if (handlerMapNameRequest != null)
  4797. {
  4798. handlerMapNameRequest(this, mapName);
  4799. }
  4800. break;
  4801. case PacketType.TeleportLandmarkRequest:
  4802. TeleportLandmarkRequestPacket tpReq = (TeleportLandmarkRequestPacket)Pack;
  4803. UUID lmid = tpReq.Info.LandmarkID;
  4804. AssetLandmark lm;
  4805. if (lmid != UUID.Zero)
  4806. {
  4807. AssetBase lma = m_assetCache.GetAsset(lmid, false);
  4808. if (lma == null)
  4809. {
  4810. // Failed to find landmark
  4811. TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
  4812. tpCancel.Info.SessionID = tpReq.Info.SessionID;
  4813. tpCancel.Info.AgentID = tpReq.Info.AgentID;
  4814. OutPacket(tpCancel, ThrottleOutPacketType.Task);
  4815. }
  4816. try
  4817. {
  4818. lm = new AssetLandmark(lma);
  4819. }
  4820. catch (NullReferenceException)
  4821. {
  4822. // asset not found generates null ref inside the assetlandmark constructor.
  4823. TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
  4824. tpCancel.Info.SessionID = tpReq.Info.SessionID;
  4825. tpCancel.Info.AgentID = tpReq.Info.AgentID;
  4826. OutPacket(tpCancel, ThrottleOutPacketType.Task);
  4827. break;
  4828. }
  4829. }
  4830. else
  4831. {
  4832. // Teleport home request
  4833. handlerTeleportHomeRequest = OnTeleportHomeRequest;
  4834. if (handlerTeleportHomeRequest != null)
  4835. {
  4836. handlerTeleportHomeRequest(AgentId, this);
  4837. }
  4838. break;
  4839. }
  4840. handlerTeleportLandmarkRequest = OnTeleportLandmarkRequest;
  4841. if (handlerTeleportLandmarkRequest != null)
  4842. {
  4843. handlerTeleportLandmarkRequest(this, lm.RegionID, lm.Position);
  4844. }
  4845. else
  4846. {
  4847. //no event handler so cancel request
  4848. TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
  4849. tpCancel.Info.AgentID = tpReq.Info.AgentID;
  4850. tpCancel.Info.SessionID = tpReq.Info.SessionID;
  4851. OutPacket(tpCancel, ThrottleOutPacketType.Task);
  4852. }
  4853. break;
  4854. case PacketType.TeleportLocationRequest:
  4855. TeleportLocationRequestPacket tpLocReq = (TeleportLocationRequestPacket)Pack;
  4856. // Console.WriteLine(tpLocReq.ToString());
  4857. handlerTeleportLocationRequest = OnTeleportLocationRequest;
  4858. if (handlerTeleportLocationRequest != null)
  4859. {
  4860. handlerTeleportLocationRequest(this, tpLocReq.Info.RegionHandle, tpLocReq.Info.Position,
  4861. tpLocReq.Info.LookAt, 16);
  4862. }
  4863. else
  4864. {
  4865. //no event handler so cancel request
  4866. TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
  4867. tpCancel.Info.SessionID = tpLocReq.AgentData.SessionID;
  4868. tpCancel.Info.AgentID = tpLocReq.AgentData.AgentID;
  4869. OutPacket(tpCancel, ThrottleOutPacketType.Task);
  4870. }
  4871. break;
  4872. #endregion
  4873. case PacketType.UUIDNameRequest:
  4874. UUIDNameRequestPacket incoming = (UUIDNameRequestPacket)Pack;
  4875. foreach (UUIDNameRequestPacket.UUIDNameBlockBlock UUIDBlock in incoming.UUIDNameBlock)
  4876. {
  4877. handlerNameRequest = OnNameFromUUIDRequest;
  4878. if (handlerNameRequest != null)
  4879. {
  4880. handlerNameRequest(UUIDBlock.ID, this);
  4881. }
  4882. }
  4883. break;
  4884. #region Parcel related packets
  4885. case PacketType.RegionHandleRequest:
  4886. RegionHandleRequestPacket rhrPack = (RegionHandleRequestPacket)Pack;
  4887. handlerRegionHandleRequest = OnRegionHandleRequest;
  4888. if (handlerRegionHandleRequest != null)
  4889. {
  4890. handlerRegionHandleRequest(this, rhrPack.RequestBlock.RegionID);
  4891. }
  4892. break;
  4893. case PacketType.ParcelInfoRequest:
  4894. ParcelInfoRequestPacket pirPack = (ParcelInfoRequestPacket)Pack;
  4895. handlerParcelInfoRequest = OnParcelInfoRequest;
  4896. if (handlerParcelInfoRequest != null)
  4897. {
  4898. handlerParcelInfoRequest(this, pirPack.Data.ParcelID);
  4899. }
  4900. break;
  4901. case PacketType.ParcelAccessListRequest:
  4902. ParcelAccessListRequestPacket requestPacket = (ParcelAccessListRequestPacket)Pack;
  4903. handlerParcelAccessListRequest = OnParcelAccessListRequest;
  4904. if (handlerParcelAccessListRequest != null)
  4905. {
  4906. handlerParcelAccessListRequest(requestPacket.AgentData.AgentID, requestPacket.AgentData.SessionID,
  4907. requestPacket.Data.Flags, requestPacket.Data.SequenceID,
  4908. requestPacket.Data.LocalID, this);
  4909. }
  4910. break;
  4911. case PacketType.ParcelAccessListUpdate:
  4912. ParcelAccessListUpdatePacket updatePacket = (ParcelAccessListUpdatePacket)Pack;
  4913. List<ParcelManager.ParcelAccessEntry> entries = new List<ParcelManager.ParcelAccessEntry>();
  4914. foreach (ParcelAccessListUpdatePacket.ListBlock block in updatePacket.List)
  4915. {
  4916. ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
  4917. entry.AgentID = block.ID;
  4918. entry.Flags = (AccessList)block.Flags;
  4919. entry.Time = new DateTime();
  4920. entries.Add(entry);
  4921. }
  4922. handlerParcelAccessListUpdateRequest = OnParcelAccessListUpdateRequest;
  4923. if (handlerParcelAccessListUpdateRequest != null)
  4924. {
  4925. handlerParcelAccessListUpdateRequest(updatePacket.AgentData.AgentID,
  4926. updatePacket.AgentData.SessionID, updatePacket.Data.Flags,
  4927. updatePacket.Data.LocalID, entries, this);
  4928. }
  4929. break;
  4930. case PacketType.ParcelPropertiesRequest:
  4931. ParcelPropertiesRequestPacket propertiesRequest = (ParcelPropertiesRequestPacket)Pack;
  4932. handlerParcelPropertiesRequest = OnParcelPropertiesRequest;
  4933. if (handlerParcelPropertiesRequest != null)
  4934. {
  4935. handlerParcelPropertiesRequest((int)Math.Round(propertiesRequest.ParcelData.West),
  4936. (int)Math.Round(propertiesRequest.ParcelData.South),
  4937. (int)Math.Round(propertiesRequest.ParcelData.East),
  4938. (int)Math.Round(propertiesRequest.ParcelData.North),
  4939. propertiesRequest.ParcelData.SequenceID,
  4940. propertiesRequest.ParcelData.SnapSelection, this);
  4941. }
  4942. break;
  4943. case PacketType.ParcelDivide:
  4944. ParcelDividePacket landDivide = (ParcelDividePacket)Pack;
  4945. handlerParcelDivideRequest = OnParcelDivideRequest;
  4946. if (handlerParcelDivideRequest != null)
  4947. {
  4948. handlerParcelDivideRequest((int)Math.Round(landDivide.ParcelData.West),
  4949. (int)Math.Round(landDivide.ParcelData.South),
  4950. (int)Math.Round(landDivide.ParcelData.East),
  4951. (int)Math.Round(landDivide.ParcelData.North), this);
  4952. }
  4953. break;
  4954. case PacketType.ParcelJoin:
  4955. ParcelJoinPacket landJoin = (ParcelJoinPacket)Pack;
  4956. handlerParcelJoinRequest = OnParcelJoinRequest;
  4957. if (handlerParcelJoinRequest != null)
  4958. {
  4959. handlerParcelJoinRequest((int)Math.Round(landJoin.ParcelData.West),
  4960. (int)Math.Round(landJoin.ParcelData.South),
  4961. (int)Math.Round(landJoin.ParcelData.East),
  4962. (int)Math.Round(landJoin.ParcelData.North), this);
  4963. }
  4964. break;
  4965. case PacketType.ParcelPropertiesUpdate:
  4966. ParcelPropertiesUpdatePacket parcelPropertiesPacket = (ParcelPropertiesUpdatePacket)Pack;
  4967. handlerParcelPropertiesUpdateRequest = OnParcelPropertiesUpdateRequest;
  4968. if (handlerParcelPropertiesUpdateRequest != null)
  4969. {
  4970. LandUpdateArgs args = new LandUpdateArgs();
  4971. args.AuthBuyerID = parcelPropertiesPacket.ParcelData.AuthBuyerID;
  4972. args.Category = (Parcel.ParcelCategory)parcelPropertiesPacket.ParcelData.Category;
  4973. args.Desc = Utils.BytesToString(parcelPropertiesPacket.ParcelData.Desc);
  4974. args.GroupID = parcelPropertiesPacket.ParcelData.GroupID;
  4975. args.LandingType = parcelPropertiesPacket.ParcelData.LandingType;
  4976. args.MediaAutoScale = parcelPropertiesPacket.ParcelData.MediaAutoScale;
  4977. args.MediaID = parcelPropertiesPacket.ParcelData.MediaID;
  4978. args.MediaURL = Utils.BytesToString(parcelPropertiesPacket.ParcelData.MediaURL);
  4979. args.MusicURL = Utils.BytesToString(parcelPropertiesPacket.ParcelData.MusicURL);
  4980. args.Name = Utils.BytesToString(parcelPropertiesPacket.ParcelData.Name);
  4981. args.ParcelFlags = parcelPropertiesPacket.ParcelData.ParcelFlags;
  4982. args.PassHours = parcelPropertiesPacket.ParcelData.PassHours;
  4983. args.PassPrice = parcelPropertiesPacket.ParcelData.PassPrice;
  4984. args.SalePrice = parcelPropertiesPacket.ParcelData.SalePrice;
  4985. args.SnapshotID = parcelPropertiesPacket.ParcelData.SnapshotID;
  4986. args.UserLocation = parcelPropertiesPacket.ParcelData.UserLocation;
  4987. args.UserLookAt = parcelPropertiesPacket.ParcelData.UserLookAt;
  4988. handlerParcelPropertiesUpdateRequest(args, parcelPropertiesPacket.ParcelData.LocalID, this);
  4989. }
  4990. break;
  4991. case PacketType.ParcelSelectObjects:
  4992. ParcelSelectObjectsPacket selectPacket = (ParcelSelectObjectsPacket)Pack;
  4993. handlerParcelSelectObjects = OnParcelSelectObjects;
  4994. if (handlerParcelSelectObjects != null)
  4995. {
  4996. handlerParcelSelectObjects(selectPacket.ParcelData.LocalID,
  4997. Convert.ToInt32(selectPacket.ParcelData.ReturnType), this);
  4998. }
  4999. break;
  5000. case PacketType.ParcelObjectOwnersRequest:
  5001. //Console.WriteLine(Pack.ToString());
  5002. ParcelObjectOwnersRequestPacket reqPacket = (ParcelObjectOwnersRequestPacket)Pack;
  5003. handlerParcelObjectOwnerRequest = OnParcelObjectOwnerRequest;
  5004. if (handlerParcelObjectOwnerRequest != null)
  5005. {
  5006. handlerParcelObjectOwnerRequest(reqPacket.ParcelData.LocalID, this);
  5007. }
  5008. break;
  5009. case PacketType.ParcelGodForceOwner:
  5010. ParcelGodForceOwnerPacket godForceOwnerPacket = (ParcelGodForceOwnerPacket)Pack;
  5011. handlerParcelGodForceOwner = OnParcelGodForceOwner;
  5012. if (handlerParcelGodForceOwner != null)
  5013. {
  5014. handlerParcelGodForceOwner(godForceOwnerPacket.Data.LocalID, godForceOwnerPacket.Data.OwnerID, this);
  5015. }
  5016. break;
  5017. case PacketType.ParcelRelease:
  5018. ParcelReleasePacket releasePacket = (ParcelReleasePacket)Pack;
  5019. handlerParcelAbandonRequest = OnParcelAbandonRequest;
  5020. if (handlerParcelAbandonRequest != null)
  5021. {
  5022. handlerParcelAbandonRequest(releasePacket.Data.LocalID, this);
  5023. }
  5024. break;
  5025. case PacketType.ParcelReclaim:
  5026. ParcelReclaimPacket reclaimPacket = (ParcelReclaimPacket)Pack;
  5027. handlerParcelReclaim = OnParcelReclaim;
  5028. if (handlerParcelReclaim != null)
  5029. {
  5030. handlerParcelReclaim(reclaimPacket.Data.LocalID, this);
  5031. }
  5032. break;
  5033. case PacketType.ParcelReturnObjects:
  5034. ParcelReturnObjectsPacket parcelReturnObjects = (ParcelReturnObjectsPacket)Pack;
  5035. UUID[] puserselectedOwnerIDs = new UUID[parcelReturnObjects.OwnerIDs.Length];
  5036. for (int parceliterator = 0; parceliterator < parcelReturnObjects.OwnerIDs.Length; parceliterator++)
  5037. puserselectedOwnerIDs[parceliterator] = parcelReturnObjects.OwnerIDs[parceliterator].OwnerID;
  5038. UUID[] puserselectedTaskIDs = new UUID[parcelReturnObjects.TaskIDs.Length];
  5039. for (int parceliterator = 0; parceliterator < parcelReturnObjects.TaskIDs.Length; parceliterator++)
  5040. puserselectedTaskIDs[parceliterator] = parcelReturnObjects.TaskIDs[parceliterator].TaskID;
  5041. handlerParcelReturnObjectsRequest = OnParcelReturnObjectsRequest;
  5042. if (handlerParcelReturnObjectsRequest != null)
  5043. {
  5044. handlerParcelReturnObjectsRequest(parcelReturnObjects.ParcelData.LocalID, parcelReturnObjects.ParcelData.ReturnType, puserselectedOwnerIDs, puserselectedTaskIDs, this);
  5045. }
  5046. break;
  5047. #endregion
  5048. #region Estate Packets
  5049. case PacketType.EstateOwnerMessage:
  5050. EstateOwnerMessagePacket messagePacket = (EstateOwnerMessagePacket)Pack;
  5051. switch (Utils.BytesToString(messagePacket.MethodData.Method))
  5052. {
  5053. case "getinfo":
  5054. if (((Scene)m_scene).ExternalChecks.ExternalChecksCanIssueEstateCommand(AgentId, false))
  5055. {
  5056. OnDetailedEstateDataRequest(this, messagePacket.MethodData.Invoice);
  5057. }
  5058. break;
  5059. case "setregioninfo":
  5060. if (((Scene)m_scene).ExternalChecks.ExternalChecksCanIssueEstateCommand(AgentId, false))
  5061. {
  5062. OnSetEstateFlagsRequest(convertParamStringToBool(messagePacket.ParamList[0].Parameter), convertParamStringToBool(messagePacket.ParamList[1].Parameter),
  5063. convertParamStringToBool(messagePacket.ParamList[2].Parameter), !convertParamStringToBool(messagePacket.ParamList[3].Parameter),
  5064. Convert.ToInt16(Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[4].Parameter))),
  5065. (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[5].Parameter)),
  5066. Convert.ToInt16(Utils.BytesToString(messagePacket.ParamList[6].Parameter)),
  5067. convertParamStringToBool(messagePacket.ParamList[7].Parameter), convertParamStringToBool(messagePacket.ParamList[8].Parameter));
  5068. }
  5069. break;
  5070. // case "texturebase":
  5071. // if (((Scene)m_scene).ExternalChecks.ExternalChecksCanIssueEstateCommand(AgentId, false))
  5072. // {
  5073. // foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  5074. // {
  5075. // string s = Utils.BytesToString(block.Parameter);
  5076. // string[] splitField = s.Split(' ');
  5077. // if (splitField.Length == 2)
  5078. // {
  5079. // UUID tempUUID = new UUID(splitField[1]);
  5080. // OnSetEstateTerrainBaseTexture(this, Convert.ToInt16(splitField[0]), tempUUID);
  5081. // }
  5082. // }
  5083. // }
  5084. // break;
  5085. case "texturedetail":
  5086. if (((Scene)m_scene).ExternalChecks.ExternalChecksCanIssueEstateCommand(AgentId, false))
  5087. {
  5088. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  5089. {
  5090. string s = Utils.BytesToString(block.Parameter);
  5091. string[] splitField = s.Split(' ');
  5092. if (splitField.Length == 2)
  5093. {
  5094. Int16 corner = Convert.ToInt16(splitField[0]);
  5095. UUID textureUUID = new UUID(splitField[1]);
  5096. OnSetEstateTerrainDetailTexture(this, corner, textureUUID);
  5097. }
  5098. }
  5099. }
  5100. break;
  5101. case "textureheights":
  5102. if (((Scene)m_scene).ExternalChecks.ExternalChecksCanIssueEstateCommand(AgentId, false))
  5103. {
  5104. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  5105. {
  5106. string s = Utils.BytesToString(block.Parameter);
  5107. string[] splitField = s.Split(' ');
  5108. if (splitField.Length == 3)
  5109. {
  5110. Int16 corner = Convert.ToInt16(splitField[0]);
  5111. float lowValue = (float)Convert.ToDecimal(splitField[1]);
  5112. float highValue = (float)Convert.ToDecimal(splitField[2]);
  5113. OnSetEstateTerrainTextureHeights(this, corner, lowValue, highValue);
  5114. }
  5115. }
  5116. }
  5117. break;
  5118. case "texturecommit":
  5119. OnCommitEstateTerrainTextureRequest(this);
  5120. break;
  5121. case "setregionterrain":
  5122. if (((Scene)m_scene).ExternalChecks.ExternalChecksCanIssueEstateCommand(AgentId, false))
  5123. {
  5124. if (messagePacket.ParamList.Length != 9)
  5125. {
  5126. m_log.Error("EstateOwnerMessage: SetRegionTerrain method has a ParamList of invalid length");
  5127. }
  5128. else
  5129. {
  5130. try
  5131. {
  5132. string tmp = Utils.BytesToString(messagePacket.ParamList[0].Parameter);
  5133. if (!tmp.Contains(".")) tmp += ".00";
  5134. float WaterHeight = (float)Convert.ToDecimal(tmp);
  5135. tmp = Utils.BytesToString(messagePacket.ParamList[1].Parameter);
  5136. if (!tmp.Contains(".")) tmp += ".00";
  5137. float TerrainRaiseLimit = (float)Convert.ToDecimal(tmp);
  5138. tmp = Utils.BytesToString(messagePacket.ParamList[2].Parameter);
  5139. if (!tmp.Contains(".")) tmp += ".00";
  5140. float TerrainLowerLimit = (float)Convert.ToDecimal(tmp);
  5141. bool UseEstateSun = convertParamStringToBool(messagePacket.ParamList[3].Parameter);
  5142. bool UseFixedSun = convertParamStringToBool(messagePacket.ParamList[4].Parameter);
  5143. float SunHour = (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[5].Parameter));
  5144. bool UseGlobal = convertParamStringToBool(messagePacket.ParamList[6].Parameter);
  5145. bool EstateFixedSun = convertParamStringToBool(messagePacket.ParamList[7].Parameter);
  5146. float EstateSunHour = (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[8].Parameter));
  5147. OnSetRegionTerrainSettings(WaterHeight, TerrainRaiseLimit, TerrainLowerLimit, UseEstateSun, UseFixedSun, SunHour, UseGlobal, EstateFixedSun, EstateSunHour);
  5148. }
  5149. catch (Exception ex)
  5150. {
  5151. m_log.Error("EstateOwnerMessage: Exception while setting terrain settings: \n" + messagePacket + "\n" + ex);
  5152. }
  5153. }
  5154. }
  5155. break;
  5156. case "restart":
  5157. if (((Scene)m_scene).ExternalChecks.ExternalChecksCanIssueEstateCommand(AgentId, false))
  5158. {
  5159. // There's only 1 block in the estateResetSim.. and that's the number of seconds till restart.
  5160. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  5161. {
  5162. float timeSeconds;
  5163. Utils.TryParseSingle(Utils.BytesToString(block.Parameter), out timeSeconds);
  5164. timeSeconds = (int)timeSeconds;
  5165. OnEstateRestartSimRequest(this, (int)timeSeconds);
  5166. }
  5167. }
  5168. break;
  5169. case "estatechangecovenantid":
  5170. if (((Scene)m_scene).ExternalChecks.ExternalChecksCanIssueEstateCommand(AgentId, false))
  5171. {
  5172. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  5173. {
  5174. UUID newCovenantID = new UUID(Utils.BytesToString(block.Parameter));
  5175. OnEstateChangeCovenantRequest(this, newCovenantID);
  5176. }
  5177. }
  5178. break;
  5179. case "estateaccessdelta": // Estate access delta manages the banlist and allow list too.
  5180. if (((Scene)m_scene).ExternalChecks.ExternalChecksCanIssueEstateCommand(AgentId, false))
  5181. {
  5182. int estateAccessType = Convert.ToInt16(Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  5183. OnUpdateEstateAccessDeltaRequest(this, messagePacket.MethodData.Invoice, estateAccessType, new UUID(Utils.BytesToString(messagePacket.ParamList[2].Parameter)));
  5184. }
  5185. break;
  5186. case "simulatormessage":
  5187. if (((Scene)m_scene).ExternalChecks.ExternalChecksCanIssueEstateCommand(AgentId, false))
  5188. {
  5189. UUID invoice = messagePacket.MethodData.Invoice;
  5190. UUID SenderID = new UUID(Utils.BytesToString(messagePacket.ParamList[2].Parameter));
  5191. string SenderName = Utils.BytesToString(messagePacket.ParamList[3].Parameter);
  5192. string Message = Utils.BytesToString(messagePacket.ParamList[4].Parameter);
  5193. UUID sessionID = messagePacket.AgentData.SessionID;
  5194. OnSimulatorBlueBoxMessageRequest(this, invoice, SenderID, sessionID, SenderName, Message);
  5195. }
  5196. break;
  5197. case "instantmessage":
  5198. if (((Scene)m_scene).ExternalChecks.ExternalChecksCanIssueEstateCommand(AgentId, false))
  5199. {
  5200. if (messagePacket.ParamList.Length < 5)
  5201. break;
  5202. UUID invoice = messagePacket.MethodData.Invoice;
  5203. UUID SenderID = new UUID(Utils.BytesToString(messagePacket.ParamList[2].Parameter));
  5204. string SenderName = Utils.BytesToString(messagePacket.ParamList[3].Parameter);
  5205. string Message = Utils.BytesToString(messagePacket.ParamList[4].Parameter);
  5206. UUID sessionID = messagePacket.AgentData.SessionID;
  5207. OnEstateBlueBoxMessageRequest(this, invoice, SenderID, sessionID, SenderName, Message);
  5208. }
  5209. break;
  5210. case "setregiondebug":
  5211. if (((Scene)m_scene).ExternalChecks.ExternalChecksCanIssueEstateCommand(AgentId, false))
  5212. {
  5213. UUID invoice = messagePacket.MethodData.Invoice;
  5214. UUID SenderID = messagePacket.AgentData.AgentID;
  5215. bool scripted = convertParamStringToBool(messagePacket.ParamList[0].Parameter);
  5216. bool collisionEvents = convertParamStringToBool(messagePacket.ParamList[1].Parameter);
  5217. bool physics = convertParamStringToBool(messagePacket.ParamList[2].Parameter);
  5218. OnEstateDebugRegionRequest(this, invoice, SenderID, scripted, collisionEvents, physics);
  5219. }
  5220. break;
  5221. case "teleporthomeuser":
  5222. if (((Scene)m_scene).ExternalChecks.ExternalChecksCanIssueEstateCommand(AgentId, false))
  5223. {
  5224. UUID invoice = messagePacket.MethodData.Invoice;
  5225. UUID SenderID = messagePacket.AgentData.AgentID;
  5226. UUID Prey;
  5227. UUID.TryParse(Utils.BytesToString(messagePacket.ParamList[1].Parameter), out Prey);
  5228. OnEstateTeleportOneUserHomeRequest(this, invoice, SenderID, Prey);
  5229. }
  5230. break;
  5231. case "teleporthomeallusers":
  5232. if (((Scene)m_scene).ExternalChecks.ExternalChecksCanIssueEstateCommand(AgentId, false))
  5233. {
  5234. UUID invoice = messagePacket.MethodData.Invoice;
  5235. UUID SenderID = messagePacket.AgentData.AgentID;
  5236. OnEstateTeleportAllUsersHomeRequest(this, invoice, SenderID);
  5237. }
  5238. break;
  5239. case "colliders":
  5240. handlerLandStatRequest = OnLandStatRequest;
  5241. if (handlerLandStatRequest != null)
  5242. {
  5243. handlerLandStatRequest(0, 1, 0, "", this);
  5244. }
  5245. break;
  5246. case "scripts":
  5247. handlerLandStatRequest = OnLandStatRequest;
  5248. if (handlerLandStatRequest != null)
  5249. {
  5250. handlerLandStatRequest(0, 0, 0, "", this);
  5251. }
  5252. break;
  5253. case "terrain":
  5254. if (((Scene)m_scene).ExternalChecks.ExternalChecksCanIssueEstateCommand(AgentId, false))
  5255. {
  5256. handlerBakeTerrain = OnBakeTerrain;
  5257. if (handlerBakeTerrain != null)
  5258. {
  5259. handlerBakeTerrain(this);
  5260. }
  5261. }
  5262. break;
  5263. case "estatechangeinfo":
  5264. if (((Scene)m_scene).ExternalChecks.ExternalChecksCanIssueEstateCommand(AgentId, false))
  5265. {
  5266. UUID invoice = messagePacket.MethodData.Invoice;
  5267. UUID SenderID = messagePacket.AgentData.AgentID;
  5268. UInt32 param1 = Convert.ToUInt32(Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  5269. UInt32 param2 = Convert.ToUInt32(Utils.BytesToString(messagePacket.ParamList[2].Parameter));
  5270. handlerEstateChangeInfo = OnEstateChangeInfo;
  5271. if (handlerEstateChangeInfo != null)
  5272. {
  5273. handlerEstateChangeInfo(this, invoice, SenderID, param1, param2);
  5274. }
  5275. }
  5276. break;
  5277. default:
  5278. m_log.Error("EstateOwnerMessage: Unknown method requested\n" + messagePacket);
  5279. break;
  5280. }
  5281. break;
  5282. case PacketType.LandStatRequest:
  5283. LandStatRequestPacket lsrp = (LandStatRequestPacket)Pack;
  5284. handlerLandStatRequest = OnLandStatRequest;
  5285. if (handlerLandStatRequest != null)
  5286. {
  5287. handlerLandStatRequest(lsrp.RequestData.ParcelLocalID, lsrp.RequestData.ReportType, lsrp.RequestData.RequestFlags, Utils.BytesToString(lsrp.RequestData.Filter), this);
  5288. }
  5289. //int parcelID, uint reportType, uint requestflags, string filter
  5290. //lsrp.RequestData.ParcelLocalID;
  5291. //lsrp.RequestData.ReportType; // 1 = colliders, 0 = scripts
  5292. //lsrp.RequestData.RequestFlags;
  5293. //lsrp.RequestData.Filter;
  5294. break;
  5295. case PacketType.RequestRegionInfo:
  5296. // RequestRegionInfoPacket.AgentDataBlock mPacket = ((RequestRegionInfoPacket)Pack).AgentData;
  5297. handlerRegionInfoRequest = OnRegionInfoRequest;
  5298. if (handlerRegionInfoRequest != null)
  5299. {
  5300. handlerRegionInfoRequest(this);
  5301. }
  5302. break;
  5303. case PacketType.EstateCovenantRequest:
  5304. // EstateCovenantRequestPacket.AgentDataBlock epack =
  5305. // ((EstateCovenantRequestPacket)Pack).AgentData;
  5306. handlerEstateCovenantRequest = OnEstateCovenantRequest;
  5307. if (handlerEstateCovenantRequest != null)
  5308. {
  5309. handlerEstateCovenantRequest(this);
  5310. }
  5311. break;
  5312. #endregion
  5313. #region GodPackets
  5314. case PacketType.RequestGodlikePowers:
  5315. RequestGodlikePowersPacket rglpPack = (RequestGodlikePowersPacket)Pack;
  5316. RequestGodlikePowersPacket.RequestBlockBlock rblock = rglpPack.RequestBlock;
  5317. UUID token = rblock.Token;
  5318. RequestGodlikePowersPacket.AgentDataBlock ablock = rglpPack.AgentData;
  5319. handlerReqGodlikePowers = OnRequestGodlikePowers;
  5320. if (handlerReqGodlikePowers != null)
  5321. {
  5322. handlerReqGodlikePowers(ablock.AgentID, ablock.SessionID, token, rblock.Godlike, this);
  5323. }
  5324. break;
  5325. case PacketType.GodKickUser:
  5326. GodKickUserPacket gkupack = (GodKickUserPacket)Pack;
  5327. if (gkupack.UserInfo.GodSessionID == SessionId && AgentId == gkupack.UserInfo.GodID)
  5328. {
  5329. handlerGodKickUser = OnGodKickUser;
  5330. if (handlerGodKickUser != null)
  5331. {
  5332. handlerGodKickUser(gkupack.UserInfo.GodID, gkupack.UserInfo.GodSessionID,
  5333. gkupack.UserInfo.AgentID, (uint)0, gkupack.UserInfo.Reason);
  5334. }
  5335. }
  5336. else
  5337. {
  5338. SendAgentAlertMessage("Kick request denied", false);
  5339. }
  5340. //KickUserPacket kupack = new KickUserPacket();
  5341. //KickUserPacket.UserInfoBlock kupackib = kupack.UserInfo;
  5342. //kupack.UserInfo.AgentID = gkupack.UserInfo.AgentID;
  5343. //kupack.UserInfo.SessionID = gkupack.UserInfo.GodSessionID;
  5344. //kupack.TargetBlock.TargetIP = (uint)0;
  5345. //kupack.TargetBlock.TargetPort = (ushort)0;
  5346. //kupack.UserInfo.Reason = gkupack.UserInfo.Reason;
  5347. //OutPacket(kupack, ThrottleOutPacketType.Task);
  5348. break;
  5349. #endregion
  5350. #region Economy/Transaction Packets
  5351. case PacketType.MoneyBalanceRequest:
  5352. MoneyBalanceRequestPacket moneybalancerequestpacket = (MoneyBalanceRequestPacket)Pack;
  5353. handlerMoneyBalanceRequest = OnMoneyBalanceRequest;
  5354. if (handlerMoneyBalanceRequest != null)
  5355. {
  5356. handlerMoneyBalanceRequest(this, moneybalancerequestpacket.AgentData.AgentID, moneybalancerequestpacket.AgentData.SessionID, moneybalancerequestpacket.MoneyData.TransactionID);
  5357. }
  5358. break;
  5359. case PacketType.EconomyDataRequest:
  5360. handlerEconomoyDataRequest = OnEconomyDataRequest;
  5361. if (handlerEconomoyDataRequest != null)
  5362. {
  5363. handlerEconomoyDataRequest(AgentId);
  5364. }
  5365. // TODO: handle this packet
  5366. //m_log.Warn("[CLIENT]: unhandled EconomyDataRequest packet");
  5367. break;
  5368. case PacketType.RequestPayPrice:
  5369. RequestPayPricePacket requestPayPricePacket = (RequestPayPricePacket)Pack;
  5370. handlerRequestPayPrice = OnRequestPayPrice;
  5371. if (handlerRequestPayPrice != null)
  5372. {
  5373. handlerRequestPayPrice(this, requestPayPricePacket.ObjectData.ObjectID);
  5374. }
  5375. break;
  5376. case PacketType.ObjectSaleInfo:
  5377. ObjectSaleInfoPacket objectSaleInfoPacket = (ObjectSaleInfoPacket)Pack;
  5378. handlerObjectSaleInfo = OnObjectSaleInfo;
  5379. if (handlerObjectSaleInfo != null)
  5380. {
  5381. foreach (ObjectSaleInfoPacket.ObjectDataBlock d
  5382. in objectSaleInfoPacket.ObjectData)
  5383. {
  5384. handlerObjectSaleInfo(this,
  5385. objectSaleInfoPacket.AgentData.AgentID,
  5386. objectSaleInfoPacket.AgentData.SessionID,
  5387. d.LocalID,
  5388. d.SaleType,
  5389. d.SalePrice);
  5390. }
  5391. }
  5392. break;
  5393. case PacketType.ObjectBuy:
  5394. ObjectBuyPacket objectBuyPacket = (ObjectBuyPacket)Pack;
  5395. handlerObjectBuy = OnObjectBuy;
  5396. Console.WriteLine(objectBuyPacket.ToString());
  5397. if (handlerObjectBuy != null)
  5398. {
  5399. foreach (ObjectBuyPacket.ObjectDataBlock d
  5400. in objectBuyPacket.ObjectData)
  5401. {
  5402. handlerObjectBuy(this,
  5403. objectBuyPacket.AgentData.AgentID,
  5404. objectBuyPacket.AgentData.SessionID,
  5405. objectBuyPacket.AgentData.GroupID,
  5406. objectBuyPacket.AgentData.CategoryID,
  5407. d.ObjectLocalID,
  5408. d.SaleType,
  5409. d.SalePrice);
  5410. }
  5411. }
  5412. break;
  5413. #endregion
  5414. #region Script Packets
  5415. case PacketType.GetScriptRunning:
  5416. GetScriptRunningPacket scriptRunning = (GetScriptRunningPacket)Pack;
  5417. handlerGetScriptRunning = OnGetScriptRunning;
  5418. if (handlerGetScriptRunning != null)
  5419. {
  5420. handlerGetScriptRunning(this, scriptRunning.Script.ObjectID, scriptRunning.Script.ItemID);
  5421. }
  5422. break;
  5423. case PacketType.SetScriptRunning:
  5424. SetScriptRunningPacket setScriptRunning = (SetScriptRunningPacket)Pack;
  5425. handlerSetScriptRunning = OnSetScriptRunning;
  5426. if (handlerSetScriptRunning != null)
  5427. {
  5428. handlerSetScriptRunning(this, setScriptRunning.Script.ObjectID, setScriptRunning.Script.ItemID, setScriptRunning.Script.Running);
  5429. }
  5430. break;
  5431. case PacketType.ScriptReset:
  5432. ScriptResetPacket scriptResetPacket = (ScriptResetPacket)Pack;
  5433. handlerScriptReset = OnScriptReset;
  5434. if (handlerScriptReset != null)
  5435. {
  5436. handlerScriptReset(this, scriptResetPacket.Script.ObjectID, scriptResetPacket.Script.ItemID);
  5437. }
  5438. break;
  5439. #endregion
  5440. #region Gesture Managment
  5441. case PacketType.ActivateGestures:
  5442. ActivateGesturesPacket activateGesturePacket = (ActivateGesturesPacket)Pack;
  5443. handlerActivateGesture = OnActivateGesture;
  5444. if (handlerActivateGesture != null)
  5445. {
  5446. handlerActivateGesture(this,
  5447. activateGesturePacket.Data[0].AssetID,
  5448. activateGesturePacket.Data[0].ItemID);
  5449. }
  5450. else m_log.Error("Null pointer for activateGesture");
  5451. break;
  5452. case PacketType.DeactivateGestures:
  5453. DeactivateGesturesPacket deactivateGesturePacket = (DeactivateGesturesPacket)Pack;
  5454. handlerDeactivateGesture = OnDeactivateGesture;
  5455. if (handlerDeactivateGesture != null)
  5456. {
  5457. handlerDeactivateGesture(this, deactivateGesturePacket.Data[0].ItemID);
  5458. }
  5459. break;
  5460. case PacketType.ObjectOwner:
  5461. ObjectOwnerPacket objectOwnerPacket = (ObjectOwnerPacket)Pack;
  5462. List<uint> localIDs = new List<uint>();
  5463. foreach (ObjectOwnerPacket.ObjectDataBlock d in objectOwnerPacket.ObjectData)
  5464. localIDs.Add(d.ObjectLocalID);
  5465. handlerObjectOwner = OnObjectOwner;
  5466. if (handlerObjectOwner != null)
  5467. {
  5468. handlerObjectOwner(this, objectOwnerPacket.HeaderData.OwnerID, objectOwnerPacket.HeaderData.GroupID, localIDs);
  5469. }
  5470. break;
  5471. #endregion
  5472. #region unimplemented handlers
  5473. case PacketType.StartPingCheck:
  5474. // Send the client the ping response back
  5475. // Pass the same PingID in the matching packet
  5476. // Handled In the packet processing
  5477. //m_log.Debug("[CLIENT]: possibly unhandled StartPingCheck packet");
  5478. break;
  5479. case PacketType.CompletePingCheck:
  5480. // TODO: Perhaps this should be processed on the Sim to determine whether or not to drop a dead client
  5481. //m_log.Warn("[CLIENT]: unhandled CompletePingCheck packet");
  5482. break;
  5483. case PacketType.ViewerStats:
  5484. // TODO: handle this packet
  5485. //m_log.Warn("[CLIENT]: unhandled ViewerStats packet");
  5486. break;
  5487. //case PacketType.GenericMessage:
  5488. // TODO: handle this packet
  5489. //m_log.Warn("[CLIENT]: unhandled GenericMessage packet");
  5490. //break;
  5491. case PacketType.MapItemRequest:
  5492. // TODO: handle this packet
  5493. MapItemRequestPacket mirpk = (MapItemRequestPacket)Pack;
  5494. //System.Console.WriteLine(mirpk.ToString());
  5495. handlerMapItemRequest = OnMapItemRequest;
  5496. if (handlerMapItemRequest != null)
  5497. {
  5498. handlerMapItemRequest(this, mirpk.AgentData.Flags, mirpk.AgentData.EstateID,
  5499. mirpk.AgentData.Godlike, mirpk.RequestData.ItemType,
  5500. mirpk.RequestData.RegionHandle);
  5501. }
  5502. //m_log.Warn("[CLIENT]: unhandled MapItemRequest packet");
  5503. break;
  5504. case PacketType.TransferAbort:
  5505. // TODO: handle this packet
  5506. //m_log.Warn("[CLIENT]: unhandled TransferAbort packet");
  5507. break;
  5508. case PacketType.MuteListRequest:
  5509. // TODO: handle this packet
  5510. //m_log.Warn("[CLIENT]: unhandled MuteListRequest packet");
  5511. break;
  5512. case PacketType.ParcelDwellRequest:
  5513. // TODO: handle this packet
  5514. //m_log.Warn("[CLIENT]: unhandled ParcelDwellRequest packet");
  5515. break;
  5516. case PacketType.UseCircuitCode:
  5517. // TODO: Don't display this one, we handle it at a lower level
  5518. //m_log.Warn("[CLIENT]: unhandled UseCircuitCode packet");
  5519. break;
  5520. case PacketType.AgentHeightWidth:
  5521. // TODO: handle this packet
  5522. //m_log.Warn("[CLIENT]: unhandled AgentHeightWidth packet");
  5523. break;
  5524. case PacketType.ObjectSpinStop:
  5525. // TODO: handle this packet
  5526. //m_log.Warn("[CLIENT]: unhandled ObjectSpinStop packet");
  5527. break;
  5528. case PacketType.SoundTrigger:
  5529. // TODO: handle this packet
  5530. //m_log.Warn("[CLIENT]: unhandled SoundTrigger packet");
  5531. break;
  5532. case PacketType.InventoryDescendents:
  5533. // TODO: handle this packet
  5534. //m_log.Warn("[CLIENT]: unhandled InventoryDescent packet");
  5535. break;
  5536. case PacketType.DirPlacesQuery:
  5537. DirPlacesQueryPacket dirPlacesQueryPacket = (DirPlacesQueryPacket)Pack;
  5538. //Console.WriteLine(dirPlacesQueryPacket.ToString());
  5539. handlerDirPlacesQuery = OnDirPlacesQuery;
  5540. if (handlerDirPlacesQuery != null)
  5541. {
  5542. handlerDirPlacesQuery(this,
  5543. dirPlacesQueryPacket.QueryData.QueryID,
  5544. Utils.BytesToString(
  5545. dirPlacesQueryPacket.QueryData.QueryText),
  5546. (int)dirPlacesQueryPacket.QueryData.QueryFlags,
  5547. (int)dirPlacesQueryPacket.QueryData.Category,
  5548. Utils.BytesToString(
  5549. dirPlacesQueryPacket.QueryData.SimName),
  5550. dirPlacesQueryPacket.QueryData.QueryStart);
  5551. }
  5552. break;
  5553. case PacketType.DirFindQuery:
  5554. DirFindQueryPacket dirFindQueryPacket = (DirFindQueryPacket)Pack;
  5555. handlerDirFindQuery = OnDirFindQuery;
  5556. if (handlerDirFindQuery != null)
  5557. {
  5558. handlerDirFindQuery(this,
  5559. dirFindQueryPacket.QueryData.QueryID,
  5560. Utils.BytesToString(
  5561. dirFindQueryPacket.QueryData.QueryText),
  5562. dirFindQueryPacket.QueryData.QueryFlags,
  5563. dirFindQueryPacket.QueryData.QueryStart);
  5564. }
  5565. break;
  5566. case PacketType.DirLandQuery:
  5567. DirLandQueryPacket dirLandQueryPacket = (DirLandQueryPacket)Pack;
  5568. handlerDirLandQuery = OnDirLandQuery;
  5569. if (handlerDirLandQuery != null)
  5570. {
  5571. handlerDirLandQuery(this,
  5572. dirLandQueryPacket.QueryData.QueryID,
  5573. dirLandQueryPacket.QueryData.QueryFlags,
  5574. dirLandQueryPacket.QueryData.SearchType,
  5575. dirLandQueryPacket.QueryData.Price,
  5576. dirLandQueryPacket.QueryData.Area,
  5577. dirLandQueryPacket.QueryData.QueryStart);
  5578. }
  5579. break;
  5580. case PacketType.DirPopularQuery:
  5581. DirPopularQueryPacket dirPopularQueryPacket = (DirPopularQueryPacket)Pack;
  5582. handlerDirPopularQuery = OnDirPopularQuery;
  5583. if (handlerDirPopularQuery != null)
  5584. {
  5585. handlerDirPopularQuery(this,
  5586. dirPopularQueryPacket.QueryData.QueryID,
  5587. dirPopularQueryPacket.QueryData.QueryFlags);
  5588. }
  5589. break;
  5590. case PacketType.DirClassifiedQuery:
  5591. DirClassifiedQueryPacket dirClassifiedQueryPacket = (DirClassifiedQueryPacket)Pack;
  5592. handlerDirClassifiedQuery = OnDirClassifiedQuery;
  5593. if (handlerDirClassifiedQuery != null)
  5594. {
  5595. handlerDirClassifiedQuery(this,
  5596. dirClassifiedQueryPacket.QueryData.QueryID,
  5597. Utils.BytesToString(
  5598. dirClassifiedQueryPacket.QueryData.QueryText),
  5599. dirClassifiedQueryPacket.QueryData.QueryFlags,
  5600. dirClassifiedQueryPacket.QueryData.Category,
  5601. dirClassifiedQueryPacket.QueryData.QueryStart);
  5602. }
  5603. break;
  5604. case PacketType.EventInfoRequest:
  5605. EventInfoRequestPacket eventInfoRequestPacket = (EventInfoRequestPacket)Pack;
  5606. if (OnEventInfoRequest != null)
  5607. {
  5608. OnEventInfoRequest(this, eventInfoRequestPacket.EventData.EventID);
  5609. }
  5610. break;
  5611. case PacketType.ParcelSetOtherCleanTime:
  5612. ParcelSetOtherCleanTimePacket parcelSetOtherCleanTimePacket = (ParcelSetOtherCleanTimePacket)Pack;
  5613. handlerParcelSetOtherCleanTime = OnParcelSetOtherCleanTime;
  5614. if (handlerParcelSetOtherCleanTime != null)
  5615. {
  5616. handlerParcelSetOtherCleanTime(this,
  5617. parcelSetOtherCleanTimePacket.ParcelData.LocalID,
  5618. parcelSetOtherCleanTimePacket.ParcelData.OtherCleanTime);
  5619. }
  5620. break;
  5621. case PacketType.OfferCallingCard:
  5622. OfferCallingCardPacket offerCallingCardPacket = (OfferCallingCardPacket)Pack;
  5623. if (OnOfferCallingCard != null)
  5624. {
  5625. OnOfferCallingCard(this,
  5626. offerCallingCardPacket.AgentBlock.DestID,
  5627. offerCallingCardPacket.AgentBlock.TransactionID);
  5628. }
  5629. break;
  5630. case PacketType.AcceptCallingCard:
  5631. AcceptCallingCardPacket acceptCallingCardPacket = (AcceptCallingCardPacket)Pack;
  5632. // according to http://wiki.secondlife.com/wiki/AcceptCallingCard FolderData should
  5633. // contain exactly one entry
  5634. if (OnAcceptCallingCard != null && acceptCallingCardPacket.FolderData.Length > 0)
  5635. {
  5636. OnAcceptCallingCard(this,
  5637. acceptCallingCardPacket.TransactionBlock.TransactionID,
  5638. acceptCallingCardPacket.FolderData[0].FolderID);
  5639. }
  5640. break;
  5641. case PacketType.DeclineCallingCard:
  5642. DeclineCallingCardPacket declineCallingCardPacket = (DeclineCallingCardPacket)Pack;
  5643. if (OnDeclineCallingCard != null)
  5644. {
  5645. OnDeclineCallingCard(this,
  5646. declineCallingCardPacket.TransactionBlock.TransactionID);
  5647. }
  5648. break;
  5649. case PacketType.ActivateGroup:
  5650. ActivateGroupPacket activateGroupPacket = (ActivateGroupPacket)Pack;
  5651. if (m_GroupsModule != null)
  5652. {
  5653. m_GroupsModule.ActivateGroup(this, activateGroupPacket.AgentData.GroupID);
  5654. m_GroupsModule.SendAgentGroupDataUpdate(this);
  5655. }
  5656. break;
  5657. case PacketType.GroupTitlesRequest:
  5658. GroupTitlesRequestPacket groupTitlesRequest =
  5659. (GroupTitlesRequestPacket)Pack;
  5660. if (m_GroupsModule != null)
  5661. {
  5662. GroupTitlesReplyPacket groupTitlesReply = (GroupTitlesReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupTitlesReply);
  5663. groupTitlesReply.AgentData =
  5664. new GroupTitlesReplyPacket.AgentDataBlock();
  5665. groupTitlesReply.AgentData.AgentID = AgentId;
  5666. groupTitlesReply.AgentData.GroupID =
  5667. groupTitlesRequest.AgentData.GroupID;
  5668. groupTitlesReply.AgentData.RequestID =
  5669. groupTitlesRequest.AgentData.RequestID;
  5670. List<GroupTitlesData> titles =
  5671. m_GroupsModule.GroupTitlesRequest(this,
  5672. groupTitlesRequest.AgentData.GroupID);
  5673. groupTitlesReply.GroupData =
  5674. new GroupTitlesReplyPacket.
  5675. GroupDataBlock[titles.Count];
  5676. int i = 0;
  5677. foreach (GroupTitlesData d in titles)
  5678. {
  5679. groupTitlesReply.GroupData[i] =
  5680. new GroupTitlesReplyPacket.
  5681. GroupDataBlock();
  5682. groupTitlesReply.GroupData[i].Title =
  5683. Utils.StringToBytes(d.Name);
  5684. groupTitlesReply.GroupData[i].RoleID =
  5685. d.UUID;
  5686. groupTitlesReply.GroupData[i].Selected =
  5687. d.Selected;
  5688. i++;
  5689. }
  5690. OutPacket(groupTitlesReply, ThrottleOutPacketType.Task);
  5691. }
  5692. break;
  5693. case PacketType.GroupProfileRequest:
  5694. GroupProfileRequestPacket groupProfileRequest =
  5695. (GroupProfileRequestPacket)Pack;
  5696. if (m_GroupsModule != null)
  5697. {
  5698. GroupProfileReplyPacket groupProfileReply = (GroupProfileReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupProfileReply);
  5699. groupProfileReply.AgentData = new GroupProfileReplyPacket.AgentDataBlock();
  5700. groupProfileReply.GroupData = new GroupProfileReplyPacket.GroupDataBlock();
  5701. groupProfileReply.AgentData.AgentID = AgentId;
  5702. GroupProfileData d = m_GroupsModule.GroupProfileRequest(this,
  5703. groupProfileRequest.GroupData.GroupID);
  5704. groupProfileReply.GroupData.GroupID = d.GroupID;
  5705. groupProfileReply.GroupData.Name = Utils.StringToBytes(d.Name);
  5706. groupProfileReply.GroupData.Charter = Utils.StringToBytes(d.Charter);
  5707. groupProfileReply.GroupData.ShowInList = d.ShowInList;
  5708. groupProfileReply.GroupData.MemberTitle = Utils.StringToBytes(d.MemberTitle);
  5709. groupProfileReply.GroupData.PowersMask = d.PowersMask;
  5710. groupProfileReply.GroupData.InsigniaID = d.InsigniaID;
  5711. groupProfileReply.GroupData.FounderID = d.FounderID;
  5712. groupProfileReply.GroupData.MembershipFee = d.MembershipFee;
  5713. groupProfileReply.GroupData.OpenEnrollment = d.OpenEnrollment;
  5714. groupProfileReply.GroupData.Money = d.Money;
  5715. groupProfileReply.GroupData.GroupMembershipCount = d.GroupMembershipCount;
  5716. groupProfileReply.GroupData.GroupRolesCount = d.GroupRolesCount;
  5717. groupProfileReply.GroupData.AllowPublish = d.AllowPublish;
  5718. groupProfileReply.GroupData.MaturePublish = d.MaturePublish;
  5719. groupProfileReply.GroupData.OwnerRole = d.OwnerRole;
  5720. OutPacket(groupProfileReply, ThrottleOutPacketType.Task);
  5721. }
  5722. break;
  5723. case PacketType.GroupMembersRequest:
  5724. GroupMembersRequestPacket groupMembersRequestPacket =
  5725. (GroupMembersRequestPacket)Pack;
  5726. if (m_GroupsModule != null)
  5727. {
  5728. List<GroupMembersData> members =
  5729. m_GroupsModule.GroupMembersRequest(this, groupMembersRequestPacket.GroupData.GroupID);
  5730. GroupMembersReplyPacket groupMembersReply = (GroupMembersReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupMembersReply);
  5731. groupMembersReply.AgentData =
  5732. new GroupMembersReplyPacket.AgentDataBlock();
  5733. groupMembersReply.GroupData =
  5734. new GroupMembersReplyPacket.GroupDataBlock();
  5735. groupMembersReply.MemberData =
  5736. new GroupMembersReplyPacket.MemberDataBlock[
  5737. members.Count];
  5738. groupMembersReply.AgentData.AgentID = AgentId;
  5739. groupMembersReply.GroupData.GroupID =
  5740. groupMembersRequestPacket.GroupData.GroupID;
  5741. groupMembersReply.GroupData.RequestID =
  5742. groupMembersRequestPacket.GroupData.RequestID;
  5743. groupMembersReply.GroupData.MemberCount = members.Count;
  5744. int i = 0;
  5745. foreach (GroupMembersData m in members)
  5746. {
  5747. groupMembersReply.MemberData[i] =
  5748. new GroupMembersReplyPacket.MemberDataBlock();
  5749. groupMembersReply.MemberData[i].AgentID =
  5750. m.AgentID;
  5751. groupMembersReply.MemberData[i].Contribution =
  5752. m.Contribution;
  5753. groupMembersReply.MemberData[i].OnlineStatus =
  5754. Utils.StringToBytes(m.OnlineStatus);
  5755. groupMembersReply.MemberData[i].AgentPowers =
  5756. m.AgentPowers;
  5757. groupMembersReply.MemberData[i].Title =
  5758. Utils.StringToBytes(m.Title);
  5759. groupMembersReply.MemberData[i].IsOwner =
  5760. m.IsOwner;
  5761. i++;
  5762. }
  5763. OutPacket(groupMembersReply, ThrottleOutPacketType.Task);
  5764. }
  5765. break;
  5766. case PacketType.GroupRoleDataRequest:
  5767. GroupRoleDataRequestPacket groupRolesRequest =
  5768. (GroupRoleDataRequestPacket)Pack;
  5769. if (m_GroupsModule != null)
  5770. {
  5771. GroupRoleDataReplyPacket groupRolesReply = (GroupRoleDataReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupRoleDataReply);
  5772. groupRolesReply.AgentData =
  5773. new GroupRoleDataReplyPacket.AgentDataBlock();
  5774. groupRolesReply.AgentData.AgentID = AgentId;
  5775. groupRolesReply.GroupData =
  5776. new GroupRoleDataReplyPacket.
  5777. GroupDataBlock();
  5778. groupRolesReply.GroupData.GroupID =
  5779. groupRolesRequest.GroupData.GroupID;
  5780. groupRolesReply.GroupData.RequestID =
  5781. groupRolesRequest.GroupData.RequestID;
  5782. List<GroupRolesData> titles =
  5783. m_GroupsModule.GroupRoleDataRequest(this,
  5784. groupRolesRequest.GroupData.GroupID);
  5785. groupRolesReply.GroupData.RoleCount =
  5786. titles.Count;
  5787. groupRolesReply.RoleData =
  5788. new GroupRoleDataReplyPacket.
  5789. RoleDataBlock[titles.Count];
  5790. int i = 0;
  5791. foreach (GroupRolesData d in titles)
  5792. {
  5793. groupRolesReply.RoleData[i] =
  5794. new GroupRoleDataReplyPacket.
  5795. RoleDataBlock();
  5796. groupRolesReply.RoleData[i].RoleID =
  5797. d.RoleID;
  5798. groupRolesReply.RoleData[i].Name =
  5799. Utils.StringToBytes(d.Name);
  5800. groupRolesReply.RoleData[i].Title =
  5801. Utils.StringToBytes(d.Title);
  5802. groupRolesReply.RoleData[i].Description =
  5803. Utils.StringToBytes(d.Description);
  5804. groupRolesReply.RoleData[i].Powers =
  5805. d.Powers;
  5806. groupRolesReply.RoleData[i].Members =
  5807. (uint)d.Members;
  5808. i++;
  5809. }
  5810. OutPacket(groupRolesReply, ThrottleOutPacketType.Task);
  5811. }
  5812. break;
  5813. case PacketType.GroupRoleMembersRequest:
  5814. GroupRoleMembersRequestPacket groupRoleMembersRequest =
  5815. (GroupRoleMembersRequestPacket)Pack;
  5816. if (m_GroupsModule != null)
  5817. {
  5818. GroupRoleMembersReplyPacket groupRoleMembersReply = (GroupRoleMembersReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupRoleMembersReply);
  5819. groupRoleMembersReply.AgentData =
  5820. new GroupRoleMembersReplyPacket.AgentDataBlock();
  5821. groupRoleMembersReply.AgentData.AgentID =
  5822. AgentId;
  5823. groupRoleMembersReply.AgentData.GroupID =
  5824. groupRoleMembersRequest.GroupData.GroupID;
  5825. groupRoleMembersReply.AgentData.RequestID =
  5826. groupRoleMembersRequest.GroupData.RequestID;
  5827. List<GroupRoleMembersData> mappings =
  5828. m_GroupsModule.GroupRoleMembersRequest(this,
  5829. groupRoleMembersRequest.GroupData.GroupID);
  5830. groupRoleMembersReply.AgentData.TotalPairs =
  5831. (uint)mappings.Count;
  5832. groupRoleMembersReply.MemberData =
  5833. new GroupRoleMembersReplyPacket.
  5834. MemberDataBlock[mappings.Count];
  5835. int i = 0;
  5836. foreach (GroupRoleMembersData d in mappings)
  5837. {
  5838. groupRoleMembersReply.MemberData[i] =
  5839. new GroupRoleMembersReplyPacket.
  5840. MemberDataBlock();
  5841. groupRoleMembersReply.MemberData[i].RoleID =
  5842. d.RoleID;
  5843. groupRoleMembersReply.MemberData[i].MemberID =
  5844. d.MemberID;
  5845. i++;
  5846. }
  5847. OutPacket(groupRoleMembersReply, ThrottleOutPacketType.Task);
  5848. }
  5849. break;
  5850. case PacketType.CreateGroupRequest:
  5851. CreateGroupRequestPacket createGroupRequest =
  5852. (CreateGroupRequestPacket)Pack;
  5853. if (m_GroupsModule != null)
  5854. {
  5855. CreateGroupReplyPacket createGroupReply = (CreateGroupReplyPacket)PacketPool.Instance.GetPacket(PacketType.CreateGroupReply);
  5856. createGroupReply.AgentData =
  5857. new CreateGroupReplyPacket.AgentDataBlock();
  5858. createGroupReply.ReplyData =
  5859. new CreateGroupReplyPacket.ReplyDataBlock();
  5860. createGroupReply.AgentData.AgentID = AgentId;
  5861. createGroupReply.ReplyData.GroupID = UUID.Zero;
  5862. IMoneyModule money = m_scene.RequestModuleInterface<IMoneyModule>();
  5863. if (money != null && !money.GroupCreationCovered(this))
  5864. {
  5865. createGroupReply.ReplyData.Success = false;
  5866. createGroupReply.ReplyData.Message = Utils.StringToBytes("You do not have sufficient funds to create a group");
  5867. OutPacket(createGroupReply, ThrottleOutPacketType.Task);
  5868. break;
  5869. }
  5870. UUID groupID = m_GroupsModule.CreateGroup(this,
  5871. Utils.BytesToString(createGroupRequest.GroupData.Name),
  5872. Utils.BytesToString(createGroupRequest.GroupData.Charter),
  5873. createGroupRequest.GroupData.ShowInList,
  5874. createGroupRequest.GroupData.InsigniaID,
  5875. createGroupRequest.GroupData.MembershipFee,
  5876. createGroupRequest.GroupData.OpenEnrollment,
  5877. createGroupRequest.GroupData.AllowPublish,
  5878. createGroupRequest.GroupData.MaturePublish);
  5879. if (groupID == UUID.Zero)
  5880. {
  5881. createGroupReply.ReplyData.Success = false;
  5882. createGroupReply.ReplyData.Message = Utils.StringToBytes("We're sorry, but we could not create the requested group. Please try another name");
  5883. OutPacket(createGroupReply, ThrottleOutPacketType.Task);
  5884. break;
  5885. }
  5886. if (money != null)
  5887. money.ApplyGroupCreationCharge(AgentId);
  5888. createGroupReply.ReplyData.Success = true;
  5889. createGroupReply.ReplyData.GroupID = groupID;
  5890. createGroupReply.ReplyData.Message = Utils.StringToBytes("Group created");
  5891. OutPacket(createGroupReply, ThrottleOutPacketType.Task);
  5892. // Sync with event queue
  5893. Thread.Sleep(1000);
  5894. m_GroupsModule.SendAgentGroupDataUpdate(this);
  5895. }
  5896. break;
  5897. case PacketType.UpdateGroupInfo:
  5898. UpdateGroupInfoPacket updateGroupInfo =
  5899. (UpdateGroupInfoPacket)Pack;
  5900. if (m_GroupsModule != null)
  5901. {
  5902. m_GroupsModule.UpdateGroupInfo(this,
  5903. updateGroupInfo.GroupData.GroupID,
  5904. Utils.BytesToString(updateGroupInfo.GroupData.Charter),
  5905. updateGroupInfo.GroupData.ShowInList,
  5906. updateGroupInfo.GroupData.InsigniaID,
  5907. updateGroupInfo.GroupData.MembershipFee,
  5908. updateGroupInfo.GroupData.OpenEnrollment,
  5909. updateGroupInfo.GroupData.AllowPublish,
  5910. updateGroupInfo.GroupData.MaturePublish);
  5911. }
  5912. break;
  5913. case PacketType.SetGroupAcceptNotices:
  5914. SetGroupAcceptNoticesPacket setGroupAcceptNotices =
  5915. (SetGroupAcceptNoticesPacket)Pack;
  5916. if (m_GroupsModule != null)
  5917. {
  5918. m_GroupsModule.SetGroupAcceptNotices(this,
  5919. setGroupAcceptNotices.Data.GroupID,
  5920. setGroupAcceptNotices.Data.AcceptNotices,
  5921. setGroupAcceptNotices.NewData.ListInProfile);
  5922. }
  5923. break;
  5924. case PacketType.GroupTitleUpdate:
  5925. GroupTitleUpdatePacket groupTitleUpdate =
  5926. (GroupTitleUpdatePacket)Pack;
  5927. if (m_GroupsModule != null)
  5928. {
  5929. m_GroupsModule.GroupTitleUpdate(this,
  5930. groupTitleUpdate.AgentData.GroupID,
  5931. groupTitleUpdate.AgentData.TitleRoleID);
  5932. }
  5933. break;
  5934. case PacketType.GroupNoticesListRequest:
  5935. GroupNoticesListRequestPacket groupNoticesListRequest =
  5936. (GroupNoticesListRequestPacket)Pack;
  5937. if (m_GroupsModule != null)
  5938. {
  5939. GroupNoticeData[] gn =
  5940. m_GroupsModule.GroupNoticesListRequest(this,
  5941. groupNoticesListRequest.Data.GroupID);
  5942. GroupNoticesListReplyPacket groupNoticesListReply = (GroupNoticesListReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupNoticesListReply);
  5943. groupNoticesListReply.AgentData =
  5944. new GroupNoticesListReplyPacket.AgentDataBlock();
  5945. groupNoticesListReply.AgentData.AgentID = AgentId;
  5946. groupNoticesListReply.AgentData.GroupID = groupNoticesListRequest.Data.GroupID;
  5947. groupNoticesListReply.Data = new GroupNoticesListReplyPacket.DataBlock[gn.Length];
  5948. int i = 0;
  5949. foreach (GroupNoticeData g in gn)
  5950. {
  5951. groupNoticesListReply.Data[i] = new GroupNoticesListReplyPacket.DataBlock();
  5952. groupNoticesListReply.Data[i].NoticeID =
  5953. g.NoticeID;
  5954. groupNoticesListReply.Data[i].Timestamp =
  5955. g.Timestamp;
  5956. groupNoticesListReply.Data[i].FromName =
  5957. Utils.StringToBytes(g.FromName);
  5958. groupNoticesListReply.Data[i].Subject =
  5959. Utils.StringToBytes(g.Subject);
  5960. groupNoticesListReply.Data[i].HasAttachment =
  5961. g.HasAttachment;
  5962. groupNoticesListReply.Data[i].AssetType =
  5963. g.AssetType;
  5964. i++;
  5965. }
  5966. OutPacket(groupNoticesListReply, ThrottleOutPacketType.Task);
  5967. }
  5968. break;
  5969. case PacketType.GroupNoticeRequest:
  5970. GroupNoticeRequestPacket groupNoticeRequest =
  5971. (GroupNoticeRequestPacket)Pack;
  5972. if (m_GroupsModule != null)
  5973. {
  5974. m_GroupsModule.GroupNoticeRequest(this,
  5975. groupNoticeRequest.Data.GroupNoticeID);
  5976. }
  5977. break;
  5978. case PacketType.GroupRoleUpdate:
  5979. GroupRoleUpdatePacket groupRoleUpdate =
  5980. (GroupRoleUpdatePacket)Pack;
  5981. if (m_GroupsModule != null)
  5982. {
  5983. foreach (GroupRoleUpdatePacket.RoleDataBlock d in
  5984. groupRoleUpdate.RoleData)
  5985. {
  5986. m_GroupsModule.GroupRoleUpdate(this,
  5987. groupRoleUpdate.AgentData.GroupID,
  5988. d.RoleID,
  5989. Utils.BytesToString(d.Name),
  5990. Utils.BytesToString(d.Description),
  5991. Utils.BytesToString(d.Title),
  5992. d.Powers,
  5993. d.UpdateType);
  5994. }
  5995. }
  5996. break;
  5997. case PacketType.GroupRoleChanges:
  5998. GroupRoleChangesPacket groupRoleChanges =
  5999. (GroupRoleChangesPacket)Pack;
  6000. if (m_GroupsModule != null)
  6001. {
  6002. foreach (GroupRoleChangesPacket.RoleChangeBlock d in
  6003. groupRoleChanges.RoleChange)
  6004. {
  6005. m_GroupsModule.GroupRoleChanges(this,
  6006. groupRoleChanges.AgentData.GroupID,
  6007. d.RoleID,
  6008. d.MemberID,
  6009. d.Change);
  6010. }
  6011. }
  6012. break;
  6013. default:
  6014. m_log.Warn("[CLIENT]: unhandled packet " + Pack);
  6015. break;
  6016. #endregion
  6017. }
  6018. PacketPool.Instance.ReturnPacket(Pack);
  6019. }
  6020. private static PrimitiveBaseShape GetShapeFromAddPacket(ObjectAddPacket addPacket)
  6021. {
  6022. PrimitiveBaseShape shape = new PrimitiveBaseShape();
  6023. shape.PCode = addPacket.ObjectData.PCode;
  6024. shape.State = addPacket.ObjectData.State;
  6025. shape.PathBegin = addPacket.ObjectData.PathBegin;
  6026. shape.PathEnd = addPacket.ObjectData.PathEnd;
  6027. shape.PathScaleX = addPacket.ObjectData.PathScaleX;
  6028. shape.PathScaleY = addPacket.ObjectData.PathScaleY;
  6029. shape.PathShearX = addPacket.ObjectData.PathShearX;
  6030. shape.PathShearY = addPacket.ObjectData.PathShearY;
  6031. shape.PathSkew = addPacket.ObjectData.PathSkew;
  6032. shape.ProfileBegin = addPacket.ObjectData.ProfileBegin;
  6033. shape.ProfileEnd = addPacket.ObjectData.ProfileEnd;
  6034. shape.Scale = addPacket.ObjectData.Scale;
  6035. shape.PathCurve = addPacket.ObjectData.PathCurve;
  6036. shape.ProfileCurve = addPacket.ObjectData.ProfileCurve;
  6037. shape.ProfileHollow = addPacket.ObjectData.ProfileHollow;
  6038. shape.PathRadiusOffset = addPacket.ObjectData.PathRadiusOffset;
  6039. shape.PathRevolutions = addPacket.ObjectData.PathRevolutions;
  6040. shape.PathTaperX = addPacket.ObjectData.PathTaperX;
  6041. shape.PathTaperY = addPacket.ObjectData.PathTaperY;
  6042. shape.PathTwist = addPacket.ObjectData.PathTwist;
  6043. shape.PathTwistBegin = addPacket.ObjectData.PathTwistBegin;
  6044. Primitive.TextureEntry ntex = new Primitive.TextureEntry(new UUID("89556747-24cb-43ed-920b-47caed15465f"));
  6045. shape.TextureEntry = ntex.ToBytes();
  6046. //shape.Textures = ntex;
  6047. return shape;
  6048. }
  6049. /// <summary>
  6050. /// Send the client an Estate message blue box pop-down with a single OK button
  6051. /// </summary>
  6052. /// <param name="FromAvatarID"></param>
  6053. /// <param name="fromSessionID"></param>
  6054. /// <param name="FromAvatarName"></param>
  6055. /// <param name="Message"></param>
  6056. public void SendBlueBoxMessage(UUID FromAvatarID, UUID fromSessionID, String FromAvatarName, String Message)
  6057. {
  6058. if (!ChildAgentStatus())
  6059. SendInstantMessage(FromAvatarID, fromSessionID, Message, AgentId, SessionId, FromAvatarName, 1, (uint)Util.UnixTimeSinceEpoch());
  6060. //SendInstantMessage(FromAvatarID, fromSessionID, Message, AgentId, SessionId, FromAvatarName, (byte)21,(uint) Util.UnixTimeSinceEpoch());
  6061. }
  6062. public void SendLogoutPacket()
  6063. {
  6064. // I know this is a bit of a hack, however there are times when you don't
  6065. // want to send this, but still need to do the rest of the shutdown process
  6066. // this method gets called from the packet server.. which makes it practically
  6067. // impossible to do any other way.
  6068. if (m_SendLogoutPacketWhenClosing)
  6069. {
  6070. LogoutReplyPacket logReply = (LogoutReplyPacket)PacketPool.Instance.GetPacket(PacketType.LogoutReply);
  6071. // TODO: don't create new blocks if recycling an old packet
  6072. logReply.AgentData.AgentID = AgentId;
  6073. logReply.AgentData.SessionID = SessionId;
  6074. logReply.InventoryData = new LogoutReplyPacket.InventoryDataBlock[1];
  6075. logReply.InventoryData[0] = new LogoutReplyPacket.InventoryDataBlock();
  6076. logReply.InventoryData[0].ItemID = UUID.Zero;
  6077. OutPacket(logReply, ThrottleOutPacketType.Task);
  6078. }
  6079. }
  6080. public void SendHealth(float health)
  6081. {
  6082. HealthMessagePacket healthpacket = (HealthMessagePacket)PacketPool.Instance.GetPacket(PacketType.HealthMessage);
  6083. healthpacket.HealthData.Health = health;
  6084. OutPacket(healthpacket, ThrottleOutPacketType.Task);
  6085. }
  6086. public void SendAgentOnline(UUID[] agentIDs)
  6087. {
  6088. OnlineNotificationPacket onp = new OnlineNotificationPacket();
  6089. OnlineNotificationPacket.AgentBlockBlock[] onpb = new OnlineNotificationPacket.AgentBlockBlock[agentIDs.Length];
  6090. for (int i = 0; i < agentIDs.Length; i++)
  6091. {
  6092. OnlineNotificationPacket.AgentBlockBlock onpbl = new OnlineNotificationPacket.AgentBlockBlock();
  6093. onpbl.AgentID = agentIDs[i];
  6094. onpb[i] = onpbl;
  6095. }
  6096. onp.AgentBlock = onpb;
  6097. onp.Header.Reliable = true;
  6098. OutPacket(onp, ThrottleOutPacketType.Task);
  6099. }
  6100. public void SendAgentOffline(UUID[] agentIDs)
  6101. {
  6102. OfflineNotificationPacket offp = new OfflineNotificationPacket();
  6103. OfflineNotificationPacket.AgentBlockBlock[] offpb = new OfflineNotificationPacket.AgentBlockBlock[agentIDs.Length];
  6104. for (int i = 0; i < agentIDs.Length; i++)
  6105. {
  6106. OfflineNotificationPacket.AgentBlockBlock onpbl = new OfflineNotificationPacket.AgentBlockBlock();
  6107. onpbl.AgentID = agentIDs[i];
  6108. offpb[i] = onpbl;
  6109. }
  6110. offp.AgentBlock = offpb;
  6111. offp.Header.Reliable = true;
  6112. OutPacket(offp, ThrottleOutPacketType.Task);
  6113. }
  6114. public void SendSitResponse(UUID TargetID, Vector3 OffsetPos, Quaternion SitOrientation, bool autopilot,
  6115. Vector3 CameraAtOffset, Vector3 CameraEyeOffset, bool ForceMouseLook)
  6116. {
  6117. AvatarSitResponsePacket avatarSitResponse = new AvatarSitResponsePacket();
  6118. avatarSitResponse.SitObject.ID = TargetID;
  6119. if (CameraAtOffset != Vector3.Zero)
  6120. {
  6121. avatarSitResponse.SitTransform.CameraAtOffset = CameraAtOffset;
  6122. avatarSitResponse.SitTransform.CameraEyeOffset = CameraEyeOffset;
  6123. }
  6124. avatarSitResponse.SitTransform.ForceMouselook = ForceMouseLook;
  6125. avatarSitResponse.SitTransform.AutoPilot = autopilot;
  6126. avatarSitResponse.SitTransform.SitPosition = OffsetPos;
  6127. avatarSitResponse.SitTransform.SitRotation = SitOrientation;
  6128. OutPacket(avatarSitResponse, ThrottleOutPacketType.Task);
  6129. }
  6130. public void SendAdminResponse(UUID Token, uint AdminLevel)
  6131. {
  6132. GrantGodlikePowersPacket respondPacket = new GrantGodlikePowersPacket();
  6133. GrantGodlikePowersPacket.GrantDataBlock gdb = new GrantGodlikePowersPacket.GrantDataBlock();
  6134. GrantGodlikePowersPacket.AgentDataBlock adb = new GrantGodlikePowersPacket.AgentDataBlock();
  6135. adb.AgentID = AgentId;
  6136. adb.SessionID = SessionId; // More security
  6137. gdb.GodLevel = (byte)AdminLevel;
  6138. gdb.Token = Token;
  6139. //respondPacket.AgentData = (GrantGodlikePowersPacket.AgentDataBlock)ablock;
  6140. respondPacket.GrantData = gdb;
  6141. respondPacket.AgentData = adb;
  6142. OutPacket(respondPacket, ThrottleOutPacketType.Task);
  6143. }
  6144. public void SendGroupMembership(GroupMembershipData[] GroupMembership)
  6145. {
  6146. AgentGroupDataUpdatePacket Groupupdate = new AgentGroupDataUpdatePacket();
  6147. AgentGroupDataUpdatePacket.GroupDataBlock[] Groups = new AgentGroupDataUpdatePacket.GroupDataBlock[GroupMembership.Length];
  6148. for (int i = 0; i < GroupMembership.Length; i++)
  6149. {
  6150. AgentGroupDataUpdatePacket.GroupDataBlock Group = new AgentGroupDataUpdatePacket.GroupDataBlock();
  6151. Group.AcceptNotices = GroupMembership[i].AcceptNotices;
  6152. Group.Contribution = GroupMembership[i].Contribution;
  6153. Group.GroupID = GroupMembership[i].GroupID;
  6154. Group.GroupInsigniaID = GroupMembership[i].GroupPicture;
  6155. Group.GroupName = Utils.StringToBytes(GroupMembership[i].GroupName);
  6156. Group.GroupPowers = GroupMembership[i].GroupPowers;
  6157. Groups[i] = Group;
  6158. Groupupdate.GroupData = Groups;
  6159. }
  6160. Groupupdate.AgentData.AgentID = AgentId;
  6161. OutPacket(Groupupdate, ThrottleOutPacketType.Task);
  6162. }
  6163. public void SendGroupNameReply(UUID groupLLUID, string GroupName)
  6164. {
  6165. UUIDGroupNameReplyPacket pack = new UUIDGroupNameReplyPacket();
  6166. UUIDGroupNameReplyPacket.UUIDNameBlockBlock[] uidnameblock = new UUIDGroupNameReplyPacket.UUIDNameBlockBlock[1];
  6167. UUIDGroupNameReplyPacket.UUIDNameBlockBlock uidnamebloc = new UUIDGroupNameReplyPacket.UUIDNameBlockBlock();
  6168. uidnamebloc.ID = groupLLUID;
  6169. uidnamebloc.GroupName = Utils.StringToBytes(GroupName);
  6170. uidnameblock[0] = uidnamebloc;
  6171. pack.UUIDNameBlock = uidnameblock;
  6172. OutPacket(pack, ThrottleOutPacketType.Task);
  6173. }
  6174. public void SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia)
  6175. {
  6176. LandStatReplyPacket lsrp = new LandStatReplyPacket();
  6177. // LandStatReplyPacket.RequestDataBlock lsreqdpb = new LandStatReplyPacket.RequestDataBlock();
  6178. LandStatReplyPacket.ReportDataBlock[] lsrepdba = new LandStatReplyPacket.ReportDataBlock[lsrpia.Length];
  6179. //LandStatReplyPacket.ReportDataBlock lsrepdb = new LandStatReplyPacket.ReportDataBlock();
  6180. // lsrepdb.
  6181. lsrp.RequestData.ReportType = reportType;
  6182. lsrp.RequestData.RequestFlags = requestFlags;
  6183. lsrp.RequestData.TotalObjectCount = resultCount;
  6184. for (int i = 0; i < lsrpia.Length; i++)
  6185. {
  6186. LandStatReplyPacket.ReportDataBlock lsrepdb = new LandStatReplyPacket.ReportDataBlock();
  6187. lsrepdb.LocationX = lsrpia[i].LocationX;
  6188. lsrepdb.LocationY = lsrpia[i].LocationY;
  6189. lsrepdb.LocationZ = lsrpia[i].LocationZ;
  6190. lsrepdb.Score = lsrpia[i].Score;
  6191. lsrepdb.TaskID = lsrpia[i].TaskID;
  6192. lsrepdb.TaskLocalID = lsrpia[i].TaskLocalID;
  6193. lsrepdb.TaskName = Utils.StringToBytes(lsrpia[i].TaskName);
  6194. lsrepdb.OwnerName = Utils.StringToBytes(lsrpia[i].OwnerName);
  6195. lsrepdba[i] = lsrepdb;
  6196. }
  6197. lsrp.ReportData = lsrepdba;
  6198. OutPacket(lsrp, ThrottleOutPacketType.Task);
  6199. }
  6200. public void SendScriptRunningReply(UUID objectID, UUID itemID, bool running)
  6201. {
  6202. ScriptRunningReplyPacket scriptRunningReply = new ScriptRunningReplyPacket();
  6203. scriptRunningReply.Script.ObjectID = objectID;
  6204. scriptRunningReply.Script.ItemID = itemID;
  6205. scriptRunningReply.Script.Running = running;
  6206. OutPacket(scriptRunningReply, ThrottleOutPacketType.Task);
  6207. }
  6208. public void SendAsset(AssetRequestToClient req)
  6209. {
  6210. //Console.WriteLine("sending asset " + req.RequestAssetID);
  6211. TransferInfoPacket Transfer = new TransferInfoPacket();
  6212. Transfer.TransferInfo.ChannelType = 2;
  6213. Transfer.TransferInfo.Status = 0;
  6214. Transfer.TransferInfo.TargetType = 0;
  6215. if (req.AssetRequestSource == 2)
  6216. {
  6217. Transfer.TransferInfo.Params = new byte[20];
  6218. Array.Copy(req.RequestAssetID.GetBytes(), 0, Transfer.TransferInfo.Params, 0, 16);
  6219. int assType = req.AssetInf.Type;
  6220. Array.Copy(Helpers.IntToBytes(assType), 0, Transfer.TransferInfo.Params, 16, 4);
  6221. }
  6222. else if (req.AssetRequestSource == 3)
  6223. {
  6224. Transfer.TransferInfo.Params = req.Params;
  6225. // Transfer.TransferInfo.Params = new byte[100];
  6226. //Array.Copy(req.RequestUser.AgentId.GetBytes(), 0, Transfer.TransferInfo.Params, 0, 16);
  6227. //Array.Copy(req.RequestUser.SessionId.GetBytes(), 0, Transfer.TransferInfo.Params, 16, 16);
  6228. }
  6229. Transfer.TransferInfo.Size = req.AssetInf.Data.Length;
  6230. Transfer.TransferInfo.TransferID = req.TransferRequestID;
  6231. Transfer.Header.Zerocoded = true;
  6232. OutPacket(Transfer, ThrottleOutPacketType.Asset);
  6233. if (req.NumPackets == 1)
  6234. {
  6235. TransferPacketPacket TransferPacket = new TransferPacketPacket();
  6236. TransferPacket.TransferData.Packet = 0;
  6237. TransferPacket.TransferData.ChannelType = 2;
  6238. TransferPacket.TransferData.TransferID = req.TransferRequestID;
  6239. TransferPacket.TransferData.Data = req.AssetInf.Data;
  6240. TransferPacket.TransferData.Status = 1;
  6241. TransferPacket.Header.Zerocoded = true;
  6242. OutPacket(TransferPacket, ThrottleOutPacketType.Asset);
  6243. }
  6244. else
  6245. {
  6246. int processedLength = 0;
  6247. int maxChunkSize = Settings.MAX_PACKET_SIZE - 100;
  6248. int packetNumber = 0;
  6249. while (processedLength < req.AssetInf.Data.Length)
  6250. {
  6251. TransferPacketPacket TransferPacket = new TransferPacketPacket();
  6252. TransferPacket.TransferData.Packet = packetNumber;
  6253. TransferPacket.TransferData.ChannelType = 2;
  6254. TransferPacket.TransferData.TransferID = req.TransferRequestID;
  6255. int chunkSize = Math.Min(req.AssetInf.Data.Length - processedLength, maxChunkSize);
  6256. byte[] chunk = new byte[chunkSize];
  6257. Array.Copy(req.AssetInf.Data, processedLength, chunk, 0, chunk.Length);
  6258. TransferPacket.TransferData.Data = chunk;
  6259. // 0 indicates more packets to come, 1 indicates last packet
  6260. if (req.AssetInf.Data.Length - processedLength > maxChunkSize)
  6261. {
  6262. TransferPacket.TransferData.Status = 0;
  6263. }
  6264. else
  6265. {
  6266. TransferPacket.TransferData.Status = 1;
  6267. }
  6268. TransferPacket.Header.Zerocoded = true;
  6269. OutPacket(TransferPacket, ThrottleOutPacketType.Asset);
  6270. processedLength += chunkSize;
  6271. packetNumber++;
  6272. }
  6273. }
  6274. }
  6275. public void SendTexture(AssetBase TextureAsset)
  6276. {
  6277. }
  6278. public ClientInfo GetClientInfo()
  6279. {
  6280. ClientInfo info = m_PacketHandler.GetClientInfo();
  6281. info.userEP = m_userEndPoint;
  6282. info.proxyEP = m_proxyEndPoint;
  6283. info.agentcircuit = new sAgentCircuitData(RequestClientInfo());
  6284. return info;
  6285. }
  6286. public void SetClientInfo(ClientInfo info)
  6287. {
  6288. m_PacketHandler.SetClientInfo(info);
  6289. }
  6290. #region Media Parcel Members
  6291. public void SendParcelMediaCommand(uint flags, ParcelMediaCommandEnum command, float time)
  6292. {
  6293. ParcelMediaCommandMessagePacket commandMessagePacket = new ParcelMediaCommandMessagePacket();
  6294. commandMessagePacket.CommandBlock.Flags = flags;
  6295. commandMessagePacket.CommandBlock.Command = (uint)command;
  6296. commandMessagePacket.CommandBlock.Time = time;
  6297. OutPacket(commandMessagePacket, ThrottleOutPacketType.Unknown);
  6298. }
  6299. public void SendParcelMediaUpdate(string mediaUrl, UUID mediaTextureID,
  6300. byte autoScale, string mediaType, string mediaDesc, int mediaWidth, int mediaHeight,
  6301. byte mediaLoop)
  6302. {
  6303. ParcelMediaUpdatePacket updatePacket = new ParcelMediaUpdatePacket();
  6304. updatePacket.DataBlock.MediaURL = Utils.StringToBytes(mediaUrl);
  6305. updatePacket.DataBlock.MediaID = mediaTextureID;
  6306. updatePacket.DataBlock.MediaAutoScale = autoScale;
  6307. updatePacket.DataBlockExtended.MediaType = Utils.StringToBytes(mediaType);
  6308. updatePacket.DataBlockExtended.MediaDesc = Utils.StringToBytes(mediaDesc);
  6309. updatePacket.DataBlockExtended.MediaWidth = mediaWidth;
  6310. updatePacket.DataBlockExtended.MediaHeight = mediaHeight;
  6311. updatePacket.DataBlockExtended.MediaLoop = mediaLoop;
  6312. OutPacket(updatePacket, ThrottleOutPacketType.Unknown);
  6313. }
  6314. #endregion
  6315. #region Camera
  6316. public void SendSetFollowCamProperties(UUID objectID, SortedDictionary<int, float> parameters)
  6317. {
  6318. SetFollowCamPropertiesPacket packet = (SetFollowCamPropertiesPacket)PacketPool.Instance.GetPacket(PacketType.SetFollowCamProperties);
  6319. packet.ObjectData.ObjectID = objectID;
  6320. SetFollowCamPropertiesPacket.CameraPropertyBlock[] camPropBlock = new SetFollowCamPropertiesPacket.CameraPropertyBlock[parameters.Count];
  6321. uint idx = 0;
  6322. foreach (KeyValuePair<int, float> pair in parameters)
  6323. {
  6324. SetFollowCamPropertiesPacket.CameraPropertyBlock block = new SetFollowCamPropertiesPacket.CameraPropertyBlock();
  6325. block.Type = pair.Key;
  6326. block.Value = pair.Value;
  6327. camPropBlock[idx++] = block;
  6328. }
  6329. packet.CameraProperty = camPropBlock;
  6330. OutPacket(packet, ThrottleOutPacketType.Task);
  6331. }
  6332. public void SendClearFollowCamProperties(UUID objectID)
  6333. {
  6334. ClearFollowCamPropertiesPacket packet = (ClearFollowCamPropertiesPacket)PacketPool.Instance.GetPacket(PacketType.ClearFollowCamProperties);
  6335. packet.ObjectData.ObjectID = objectID;
  6336. OutPacket(packet, ThrottleOutPacketType.Task);
  6337. }
  6338. #endregion
  6339. public void SendRegionHandle(UUID regionID, ulong handle)
  6340. {
  6341. RegionIDAndHandleReplyPacket reply = (RegionIDAndHandleReplyPacket)PacketPool.Instance.GetPacket(PacketType.RegionIDAndHandleReply);
  6342. reply.ReplyBlock.RegionID = regionID;
  6343. reply.ReplyBlock.RegionHandle = handle;
  6344. OutPacket(reply, ThrottleOutPacketType.Land);
  6345. }
  6346. public void SendParcelInfo(RegionInfo info, LandData land, UUID parcelID, uint x, uint y)
  6347. {
  6348. ParcelInfoReplyPacket reply = (ParcelInfoReplyPacket)PacketPool.Instance.GetPacket(PacketType.ParcelInfoReply);
  6349. reply.AgentData.AgentID = m_agentId;
  6350. reply.Data.ParcelID = parcelID;
  6351. reply.Data.OwnerID = land.OwnerID;
  6352. reply.Data.Name = Utils.StringToBytes(land.Name);
  6353. reply.Data.Desc = Utils.StringToBytes(land.Description);
  6354. reply.Data.ActualArea = land.Area;
  6355. reply.Data.BillableArea = land.Area; // TODO: what is this?
  6356. // Bit 0: Mature, bit 7: on sale, other bits: no idea
  6357. reply.Data.Flags = (byte)(
  6358. ((land.Flags & (uint)Parcel.ParcelFlags.MaturePublish) != 0 ? (1 << 0) : 0) +
  6359. ((land.Flags & (uint)Parcel.ParcelFlags.ForSale) != 0 ? (1 << 7) : 0));
  6360. Vector3 pos = land.UserLocation;
  6361. if (pos.Equals(Vector3.Zero))
  6362. {
  6363. pos = (land.AABBMax + land.AABBMin) * 0.5f;
  6364. }
  6365. reply.Data.GlobalX = info.RegionLocX * Constants.RegionSize + x;
  6366. reply.Data.GlobalY = info.RegionLocY * Constants.RegionSize + y;
  6367. reply.Data.GlobalZ = pos.Z;
  6368. reply.Data.SimName = Utils.StringToBytes(info.RegionName);
  6369. reply.Data.SnapshotID = land.SnapshotID;
  6370. reply.Data.Dwell = 0; // TODO: not implemented yet
  6371. reply.Data.SalePrice = land.SalePrice;
  6372. reply.Data.AuctionID = (int)land.AuctionID;
  6373. OutPacket(reply, ThrottleOutPacketType.Land);
  6374. }
  6375. public void SendScriptTeleportRequest(string objName, string simName, Vector3 pos, Vector3 lookAt)
  6376. {
  6377. ScriptTeleportRequestPacket packet = (ScriptTeleportRequestPacket)PacketPool.Instance.GetPacket(PacketType.ScriptTeleportRequest);
  6378. packet.Data.ObjectName = Utils.StringToBytes(objName);
  6379. packet.Data.SimName = Utils.StringToBytes(simName);
  6380. packet.Data.SimPosition = pos;
  6381. packet.Data.LookAt = lookAt;
  6382. OutPacket(packet, ThrottleOutPacketType.Task);
  6383. }
  6384. public void SetClientOption(string option, string value)
  6385. {
  6386. switch (option)
  6387. {
  6388. case "ReliableIsImportant":
  6389. bool val;
  6390. if (bool.TryParse(value, out val))
  6391. m_PacketHandler.ReliableIsImportant = val;
  6392. break;
  6393. default:
  6394. break;
  6395. }
  6396. }
  6397. public string GetClientOption(string option)
  6398. {
  6399. switch (option)
  6400. {
  6401. case "ReliableIsImportant":
  6402. return m_PacketHandler.ReliableIsImportant.ToString();
  6403. default:
  6404. break;
  6405. }
  6406. return string.Empty;
  6407. }
  6408. public void SendDirPlacesReply(UUID queryID, DirPlacesReplyData[] data)
  6409. {
  6410. DirPlacesReplyPacket packet = (DirPlacesReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirPlacesReply);
  6411. packet.AgentData = new DirPlacesReplyPacket.AgentDataBlock();
  6412. packet.QueryData = new DirPlacesReplyPacket.QueryDataBlock[1];
  6413. packet.QueryData[0] = new DirPlacesReplyPacket.QueryDataBlock();
  6414. packet.QueryReplies =
  6415. new DirPlacesReplyPacket.QueryRepliesBlock[data.Length];
  6416. packet.AgentData.AgentID = AgentId;
  6417. packet.QueryData[0].QueryID = queryID;
  6418. int i = 0;
  6419. foreach (DirPlacesReplyData d in data)
  6420. {
  6421. packet.QueryReplies[i] =
  6422. new DirPlacesReplyPacket.QueryRepliesBlock();
  6423. packet.QueryReplies[i].ParcelID = d.parcelID;
  6424. packet.QueryReplies[i].Name = Utils.StringToBytes(d.name);
  6425. packet.QueryReplies[i].ForSale = d.forSale;
  6426. packet.QueryReplies[i].Auction = d.auction;
  6427. packet.QueryReplies[i].Dwell = d.dwell;
  6428. i++;
  6429. }
  6430. OutPacket(packet, ThrottleOutPacketType.Task);
  6431. }
  6432. public void SendDirPeopleReply(UUID queryID, DirPeopleReplyData[] data)
  6433. {
  6434. DirPeopleReplyPacket packet = (DirPeopleReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirPeopleReply);
  6435. packet.AgentData = new DirPeopleReplyPacket.AgentDataBlock();
  6436. packet.AgentData.AgentID = AgentId;
  6437. packet.QueryData = new DirPeopleReplyPacket.QueryDataBlock();
  6438. packet.QueryData.QueryID = queryID;
  6439. packet.QueryReplies = new DirPeopleReplyPacket.QueryRepliesBlock[
  6440. data.Length];
  6441. int i = 0;
  6442. foreach (DirPeopleReplyData d in data)
  6443. {
  6444. packet.QueryReplies[i] = new DirPeopleReplyPacket.QueryRepliesBlock();
  6445. packet.QueryReplies[i].AgentID = d.agentID;
  6446. packet.QueryReplies[i].FirstName =
  6447. Utils.StringToBytes(d.firstName);
  6448. packet.QueryReplies[i].LastName =
  6449. Utils.StringToBytes(d.lastName);
  6450. packet.QueryReplies[i].Group =
  6451. Utils.StringToBytes(d.group);
  6452. packet.QueryReplies[i].Online = d.online;
  6453. packet.QueryReplies[i].Reputation = d.reputation;
  6454. i++;
  6455. }
  6456. OutPacket(packet, ThrottleOutPacketType.Task);
  6457. }
  6458. public void SendDirEventsReply(UUID queryID, DirEventsReplyData[] data)
  6459. {
  6460. DirEventsReplyPacket packet = (DirEventsReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirEventsReply);
  6461. packet.AgentData = new DirEventsReplyPacket.AgentDataBlock();
  6462. packet.AgentData.AgentID = AgentId;
  6463. packet.QueryData = new DirEventsReplyPacket.QueryDataBlock();
  6464. packet.QueryData.QueryID = queryID;
  6465. packet.QueryReplies = new DirEventsReplyPacket.QueryRepliesBlock[
  6466. data.Length];
  6467. int i = 0;
  6468. foreach (DirEventsReplyData d in data)
  6469. {
  6470. packet.QueryReplies[i] = new DirEventsReplyPacket.QueryRepliesBlock();
  6471. packet.QueryReplies[i].OwnerID = d.ownerID;
  6472. packet.QueryReplies[i].Name =
  6473. Utils.StringToBytes(d.name);
  6474. packet.QueryReplies[i].EventID = d.eventID;
  6475. packet.QueryReplies[i].Date =
  6476. Utils.StringToBytes(d.date);
  6477. packet.QueryReplies[i].UnixTime = d.unixTime;
  6478. packet.QueryReplies[i].EventFlags = d.eventFlags;
  6479. i++;
  6480. }
  6481. OutPacket(packet, ThrottleOutPacketType.Task);
  6482. }
  6483. public void SendDirGroupsReply(UUID queryID, DirGroupsReplyData[] data)
  6484. {
  6485. DirGroupsReplyPacket packet = (DirGroupsReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirGroupsReply);
  6486. packet.AgentData = new DirGroupsReplyPacket.AgentDataBlock();
  6487. packet.AgentData.AgentID = AgentId;
  6488. packet.QueryData = new DirGroupsReplyPacket.QueryDataBlock();
  6489. packet.QueryData.QueryID = queryID;
  6490. packet.QueryReplies = new DirGroupsReplyPacket.QueryRepliesBlock[
  6491. data.Length];
  6492. int i = 0;
  6493. foreach (DirGroupsReplyData d in data)
  6494. {
  6495. packet.QueryReplies[i] = new DirGroupsReplyPacket.QueryRepliesBlock();
  6496. packet.QueryReplies[i].GroupID = d.groupID;
  6497. packet.QueryReplies[i].GroupName =
  6498. Utils.StringToBytes(d.groupName);
  6499. packet.QueryReplies[i].Members = d.members;
  6500. packet.QueryReplies[i].SearchOrder = d.searchOrder;
  6501. i++;
  6502. }
  6503. OutPacket(packet, ThrottleOutPacketType.Task);
  6504. }
  6505. public void SendDirClassifiedReply(UUID queryID, DirClassifiedReplyData[] data)
  6506. {
  6507. DirClassifiedReplyPacket packet = (DirClassifiedReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirClassifiedReply);
  6508. packet.AgentData = new DirClassifiedReplyPacket.AgentDataBlock();
  6509. packet.AgentData.AgentID = AgentId;
  6510. packet.QueryData = new DirClassifiedReplyPacket.QueryDataBlock();
  6511. packet.QueryData.QueryID = queryID;
  6512. packet.QueryReplies = new DirClassifiedReplyPacket.QueryRepliesBlock[
  6513. data.Length];
  6514. int i = 0;
  6515. foreach (DirClassifiedReplyData d in data)
  6516. {
  6517. packet.QueryReplies[i] = new DirClassifiedReplyPacket.QueryRepliesBlock();
  6518. packet.QueryReplies[i].ClassifiedID = d.classifiedID;
  6519. packet.QueryReplies[i].Name =
  6520. Utils.StringToBytes(d.name);
  6521. packet.QueryReplies[i].ClassifiedFlags = d.classifiedFlags;
  6522. packet.QueryReplies[i].CreationDate = d.creationDate;
  6523. packet.QueryReplies[i].ExpirationDate = d.expirationDate;
  6524. packet.QueryReplies[i].PriceForListing = d.price;
  6525. i++;
  6526. }
  6527. OutPacket(packet, ThrottleOutPacketType.Task);
  6528. }
  6529. public void SendDirLandReply(UUID queryID, DirLandReplyData[] data)
  6530. {
  6531. DirLandReplyPacket packet = (DirLandReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirLandReply);
  6532. packet.AgentData = new DirLandReplyPacket.AgentDataBlock();
  6533. packet.AgentData.AgentID = AgentId;
  6534. packet.QueryData = new DirLandReplyPacket.QueryDataBlock();
  6535. packet.QueryData.QueryID = queryID;
  6536. packet.QueryReplies = new DirLandReplyPacket.QueryRepliesBlock[
  6537. data.Length];
  6538. int i = 0;
  6539. foreach (DirLandReplyData d in data)
  6540. {
  6541. packet.QueryReplies[i] = new DirLandReplyPacket.QueryRepliesBlock();
  6542. packet.QueryReplies[i].ParcelID = d.parcelID;
  6543. packet.QueryReplies[i].Name =
  6544. Utils.StringToBytes(d.name);
  6545. packet.QueryReplies[i].Auction = d.auction;
  6546. packet.QueryReplies[i].ForSale = d.forSale;
  6547. packet.QueryReplies[i].SalePrice = d.salePrice;
  6548. packet.QueryReplies[i].ActualArea = d.actualArea;
  6549. i++;
  6550. }
  6551. OutPacket(packet, ThrottleOutPacketType.Task);
  6552. }
  6553. public void SendDirPopularReply(UUID queryID, DirPopularReplyData[] data)
  6554. {
  6555. DirPopularReplyPacket packet = (DirPopularReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirPopularReply);
  6556. packet.AgentData = new DirPopularReplyPacket.AgentDataBlock();
  6557. packet.AgentData.AgentID = AgentId;
  6558. packet.QueryData = new DirPopularReplyPacket.QueryDataBlock();
  6559. packet.QueryData.QueryID = queryID;
  6560. packet.QueryReplies = new DirPopularReplyPacket.QueryRepliesBlock[
  6561. data.Length];
  6562. int i = 0;
  6563. foreach (DirPopularReplyData d in data)
  6564. {
  6565. packet.QueryReplies[i] = new DirPopularReplyPacket.QueryRepliesBlock();
  6566. packet.QueryReplies[i].ParcelID = d.parcelID;
  6567. packet.QueryReplies[i].Name =
  6568. Utils.StringToBytes(d.name);
  6569. packet.QueryReplies[i].Dwell = d.dwell;
  6570. i++;
  6571. }
  6572. OutPacket(packet, ThrottleOutPacketType.Task);
  6573. }
  6574. public void SendEventInfoReply(EventData data)
  6575. {
  6576. EventInfoReplyPacket packet = (EventInfoReplyPacket)PacketPool.Instance.GetPacket(PacketType.EventInfoReply);
  6577. packet.AgentData = new EventInfoReplyPacket.AgentDataBlock();
  6578. packet.AgentData.AgentID = AgentId;
  6579. packet.EventData = new EventInfoReplyPacket.EventDataBlock();
  6580. packet.EventData.EventID = data.eventID;
  6581. packet.EventData.Creator = Utils.StringToBytes(data.creator);
  6582. packet.EventData.Name = Utils.StringToBytes(data.name);
  6583. packet.EventData.Category = Utils.StringToBytes(data.category);
  6584. packet.EventData.Desc = Utils.StringToBytes(data.description);
  6585. packet.EventData.Date = Utils.StringToBytes(data.date);
  6586. packet.EventData.DateUTC = data.dateUTC;
  6587. packet.EventData.Duration = data.duration;
  6588. packet.EventData.Cover = data.cover;
  6589. packet.EventData.Amount = data.amount;
  6590. packet.EventData.SimName = Utils.StringToBytes(data.simName);
  6591. packet.EventData.GlobalPos = new Vector3d(data.globalPos);
  6592. packet.EventData.EventFlags = data.eventFlags;
  6593. OutPacket(packet, ThrottleOutPacketType.Task);
  6594. }
  6595. public void SendMapItemReply(mapItemReply[] replies, uint mapitemtype, uint flags)
  6596. {
  6597. MapItemReplyPacket mirplk = new MapItemReplyPacket();
  6598. mirplk.AgentData.AgentID = AgentId;
  6599. mirplk.RequestData.ItemType = mapitemtype;
  6600. mirplk.Data = new MapItemReplyPacket.DataBlock[replies.Length];
  6601. for (int i = 0; i < replies.Length; i++)
  6602. {
  6603. MapItemReplyPacket.DataBlock mrdata = new MapItemReplyPacket.DataBlock();
  6604. mrdata.X = replies[i].x;
  6605. mrdata.Y = replies[i].y;
  6606. mrdata.ID = replies[i].id;
  6607. mrdata.Extra = replies[i].Extra;
  6608. mrdata.Extra2 = replies[i].Extra2;
  6609. mrdata.Name = Utils.StringToBytes(replies[i].name);
  6610. mirplk.Data[i] = mrdata;
  6611. }
  6612. //System.Console.WriteLine(mirplk.ToString());
  6613. OutPacket(mirplk, ThrottleOutPacketType.Task);
  6614. }
  6615. public void SendOfferCallingCard(UUID srcID, UUID transactionID)
  6616. {
  6617. // a bit special, as this uses AgentID to store the source instead
  6618. // of the destination. The destination (the receiver) goes into destID
  6619. OfferCallingCardPacket p = (OfferCallingCardPacket)PacketPool.Instance.GetPacket(PacketType.OfferCallingCard);
  6620. p.AgentData.AgentID = srcID;
  6621. p.AgentData.SessionID = UUID.Zero;
  6622. p.AgentBlock.DestID = AgentId;
  6623. p.AgentBlock.TransactionID = transactionID;
  6624. OutPacket(p, ThrottleOutPacketType.Task);
  6625. }
  6626. public void SendAcceptCallingCard(UUID transactionID)
  6627. {
  6628. AcceptCallingCardPacket p = (AcceptCallingCardPacket)PacketPool.Instance.GetPacket(PacketType.AcceptCallingCard);
  6629. p.AgentData.AgentID = AgentId;
  6630. p.AgentData.SessionID = UUID.Zero;
  6631. p.FolderData = new AcceptCallingCardPacket.FolderDataBlock[1];
  6632. p.FolderData[0] = new AcceptCallingCardPacket.FolderDataBlock();
  6633. p.FolderData[0].FolderID = UUID.Zero;
  6634. OutPacket(p, ThrottleOutPacketType.Task);
  6635. }
  6636. public void SendDeclineCallingCard(UUID transactionID)
  6637. {
  6638. DeclineCallingCardPacket p = (DeclineCallingCardPacket)PacketPool.Instance.GetPacket(PacketType.DeclineCallingCard);
  6639. p.AgentData.AgentID = AgentId;
  6640. p.AgentData.SessionID = UUID.Zero;
  6641. p.TransactionBlock.TransactionID = transactionID;
  6642. OutPacket(p, ThrottleOutPacketType.Task);
  6643. }
  6644. public void SendTerminateFriend(UUID exFriendID)
  6645. {
  6646. TerminateFriendshipPacket p = (TerminateFriendshipPacket)PacketPool.Instance.GetPacket(PacketType.TerminateFriendship);
  6647. p.AgentData.AgentID = AgentId;
  6648. p.AgentData.SessionID = SessionId;
  6649. p.ExBlock.OtherID = exFriendID;
  6650. OutPacket(p, ThrottleOutPacketType.Task);
  6651. }
  6652. public void SendAvatarGroupsReply(UUID avatarID, GroupMembershipData[] data)
  6653. {
  6654. AvatarGroupsReplyPacket p = (AvatarGroupsReplyPacket)PacketPool.Instance.GetPacket(PacketType.AvatarGroupsReply);
  6655. p.AgentData = new AvatarGroupsReplyPacket.AgentDataBlock();
  6656. p.AgentData.AgentID = AgentId;
  6657. p.AgentData.AvatarID = avatarID;
  6658. p.GroupData = new AvatarGroupsReplyPacket.GroupDataBlock[data.Length];
  6659. int i = 0;
  6660. foreach (GroupMembershipData m in data)
  6661. {
  6662. p.GroupData[i] = new AvatarGroupsReplyPacket.GroupDataBlock();
  6663. p.GroupData[i].GroupPowers = m.GroupPowers;
  6664. p.GroupData[i].AcceptNotices = m.AcceptNotices;
  6665. p.GroupData[i].GroupTitle = Utils.StringToBytes(m.GroupTitle);
  6666. p.GroupData[i].GroupID = m.GroupID;
  6667. p.GroupData[i].GroupName = Utils.StringToBytes(m.GroupName);
  6668. p.GroupData[i].GroupInsigniaID = m.GroupPicture;
  6669. i++;
  6670. }
  6671. p.NewGroupData = new AvatarGroupsReplyPacket.NewGroupDataBlock();
  6672. p.NewGroupData.ListInProfile = true;
  6673. OutPacket(p, ThrottleOutPacketType.Task);
  6674. }
  6675. public void KillEndDone()
  6676. {
  6677. KillPacket kp = new KillPacket();
  6678. OutPacket(kp, ThrottleOutPacketType.Task | ThrottleOutPacketType.LowPriority);
  6679. }
  6680. public string Report()
  6681. {
  6682. LLPacketHandler handler = (LLPacketHandler)m_PacketHandler;
  6683. return handler.PacketQueue.GetStats();
  6684. }
  6685. }
  6686. }