LLClientView.cs 503 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030
  1. /*
  2. * Copyright (c) Contributors, http://opensimulator.org/
  3. * See CONTRIBUTORS.TXT for a full list of copyright holders.
  4. *
  5. * Redistribution and use in source and binary forms, with or without
  6. * modification, are permitted provided that the following conditions are met:
  7. * * Redistributions of source code must retain the above copyright
  8. * notice, this list of conditions and the following disclaimer.
  9. * * Redistributions in binary form must reproduce the above copyright
  10. * notice, this list of conditions and the following disclaimer in the
  11. * documentation and/or other materials provided with the distribution.
  12. * * Neither the name of the OpenSimulator Project nor the
  13. * names of its contributors may be used to endorse or promote products
  14. * derived from this software without specific prior written permission.
  15. *
  16. * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
  17. * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  18. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  19. * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
  20. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  21. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  22. * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  23. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  24. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  25. * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  26. */
  27. using System;
  28. using System.Collections;
  29. using System.Collections.Generic;
  30. using System.Net;
  31. using System.Reflection;
  32. using System.Text;
  33. using System.Threading;
  34. using System.Timers;
  35. using System.Xml;
  36. using log4net;
  37. using OpenMetaverse;
  38. using OpenMetaverse.Packets;
  39. using OpenSim.Framework;
  40. using OpenSim.Framework.Client;
  41. using OpenSim.Framework.Communications.Cache;
  42. using OpenSim.Framework.Statistics;
  43. using OpenSim.Region.Framework.Interfaces;
  44. using OpenSim.Region.Framework.Scenes;
  45. using OpenSim.Services.Interfaces;
  46. using Timer=System.Timers.Timer;
  47. using AssetLandmark = OpenSim.Framework.AssetLandmark;
  48. using Nini.Config;
  49. namespace OpenSim.Region.ClientStack.LindenUDP
  50. {
  51. public delegate bool PacketMethod(IClientAPI simClient, Packet packet);
  52. /// <summary>
  53. /// Handles new client connections
  54. /// Constructor takes a single Packet and authenticates everything
  55. /// </summary>
  56. public class LLClientView : IClientAPI, IClientCore, IClientIM, IClientChat, IClientIPEndpoint, IStatsCollector
  57. {
  58. private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
  59. /* static variables */
  60. public static SynchronizeClientHandler SynchronizeClient;
  61. /* private variables */
  62. private readonly UUID m_sessionId;
  63. private readonly UUID m_secureSessionId = UUID.Zero;
  64. private int m_debugPacketLevel;
  65. //private readonly IAssetCache m_assetCache;
  66. private int m_cachedTextureSerial;
  67. private Timer m_clientPingTimer;
  68. private Timer m_avatarTerseUpdateTimer;
  69. private List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_avatarTerseUpdates = new List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>();
  70. private Timer m_primTerseUpdateTimer;
  71. private List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_primTerseUpdates = new List<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>();
  72. private Timer m_primFullUpdateTimer;
  73. private List<ObjectUpdatePacket.ObjectDataBlock> m_primFullUpdates =
  74. new List<ObjectUpdatePacket.ObjectDataBlock>();
  75. private Timer m_textureRequestTimer;
  76. private bool m_clientBlocked;
  77. private int m_probesWithNoIngressPackets;
  78. private readonly UUID m_agentId;
  79. private readonly uint m_circuitCode;
  80. private int m_moneyBalance;
  81. private readonly ILLPacketHandler m_PacketHandler;
  82. private int m_animationSequenceNumber = 1;
  83. private readonly byte[] m_channelVersion = Utils.StringToBytes("OpenSimulator Server"); // Dummy value needed by libSL
  84. private readonly Dictionary<string, UUID> m_defaultAnimations = new Dictionary<string, UUID>();
  85. private bool m_SendLogoutPacketWhenClosing = true;
  86. private int m_inPacketsChecked;
  87. // Used to adjust Sun Orbit values so Linden based viewers properly position sun
  88. private const float m_sunPainDaHalfOrbitalCutoff = 4.712388980384689858f;
  89. /* protected variables */
  90. protected static Dictionary<PacketType, PacketMethod> PacketHandlers =
  91. new Dictionary<PacketType, PacketMethod>(); //Global/static handlers for all clients
  92. protected Dictionary<PacketType, PacketMethod> m_packetHandlers = new Dictionary<PacketType, PacketMethod>();
  93. protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers
  94. protected IScene m_scene;
  95. protected LLPacketServer m_networkServer;
  96. protected LLImageManager m_imageManager;
  97. /* public variables */
  98. protected string m_firstName;
  99. protected string m_lastName;
  100. protected Thread m_clientThread;
  101. protected Vector3 m_startpos;
  102. protected EndPoint m_userEndPoint;
  103. protected EndPoint m_proxyEndPoint;
  104. protected UUID m_activeGroupID = UUID.Zero;
  105. protected string m_activeGroupName = String.Empty;
  106. protected ulong m_activeGroupPowers;
  107. protected Dictionary<UUID,ulong> m_groupPowers = new Dictionary<UUID, ulong>();
  108. protected int m_avatarTerseUpdateRate = 50;
  109. protected int m_avatarTerseUpdatesPerPacket = 5;
  110. // LL uses these limits, apparently. Compressed terse would be
  111. // 23, but we don't have that yet
  112. //
  113. protected int m_primTerseUpdatesPerPacket = 10;
  114. protected int m_primFullUpdatesPerPacket = 14;
  115. protected int m_primTerseUpdateRate = 10;
  116. protected int m_primFullUpdateRate = 14;
  117. protected int m_textureRequestRate = 100;
  118. protected int m_textureSendLimit = 10;
  119. protected int m_textureDataLimit = 5;
  120. protected int m_packetMTU = 1400;
  121. protected IAssetService m_assetService;
  122. // LLClientView Only
  123. public delegate void BinaryGenericMessage(Object sender, string method, byte[][] args);
  124. /* Instantiated Designated Event Delegates */
  125. //- used so we don't create new objects for each incoming packet and then toss it out later */
  126. private GenericMessage handlerGenericMessage;
  127. private RequestAvatarProperties handlerRequestAvatarProperties; //OnRequestAvatarProperties;
  128. private UpdateAvatarProperties handlerUpdateAvatarProperties; // OnUpdateAvatarProperties;
  129. private ChatMessage handlerChatFromClient; //OnChatFromClient;
  130. private ChatMessage handlerChatFromClient2; //OnChatFromClient;
  131. private ImprovedInstantMessage handlerInstantMessage; //OnInstantMessage;
  132. private FriendActionDelegate handlerApproveFriendRequest; //OnApproveFriendRequest;
  133. private FriendshipTermination handlerTerminateFriendship; //OnTerminateFriendship;
  134. private RezObject handlerRezObject; //OnRezObject;
  135. private DeRezObject handlerDeRezObject; //OnDeRezObject;
  136. private ModifyTerrain handlerModifyTerrain;
  137. private BakeTerrain handlerBakeTerrain;
  138. private EstateChangeInfo handlerEstateChangeInfo;
  139. private Action<IClientAPI> handlerRegionHandShakeReply; //OnRegionHandShakeReply;
  140. private GenericCall2 handlerRequestWearables; //OnRequestWearables;
  141. private Action<IClientAPI> handlerRequestAvatarsData; //OnRequestAvatarsData;
  142. private SetAppearance handlerSetAppearance; //OnSetAppearance;
  143. private AvatarNowWearing handlerAvatarNowWearing; //OnAvatarNowWearing;
  144. private RezSingleAttachmentFromInv handlerRezSingleAttachment; //OnRezSingleAttachmentFromInv;
  145. private RezMultipleAttachmentsFromInv handlerRezMultipleAttachments; //OnRezMultipleAttachmentsFromInv;
  146. private UUIDNameRequest handlerDetachAttachmentIntoInv; // Detach attachment!
  147. private ObjectAttach handlerObjectAttach; //OnObjectAttach;
  148. private SetAlwaysRun handlerSetAlwaysRun; //OnSetAlwaysRun;
  149. private GenericCall2 handlerCompleteMovementToRegion; //OnCompleteMovementToRegion;
  150. private UpdateAgent handlerAgentUpdate; //OnAgentUpdate;
  151. private StartAnim handlerStartAnim;
  152. private StopAnim handlerStopAnim;
  153. private AgentRequestSit handlerAgentRequestSit; //OnAgentRequestSit;
  154. private AgentSit handlerAgentSit; //OnAgentSit;
  155. private AvatarPickerRequest handlerAvatarPickerRequest; //OnAvatarPickerRequest;
  156. private FetchInventory handlerAgentDataUpdateRequest; //OnAgentDataUpdateRequest;
  157. private TeleportLocationRequest handlerSetStartLocationRequest; //OnSetStartLocationRequest;
  158. private TeleportLandmarkRequest handlerTeleportLandmarkRequest; //OnTeleportLandmarkRequest;
  159. private LinkObjects handlerLinkObjects; //OnLinkObjects;
  160. private DelinkObjects handlerDelinkObjects; //OnDelinkObjects;
  161. private AddNewPrim handlerAddPrim; //OnAddPrim;
  162. private UpdateShape handlerUpdatePrimShape; //null;
  163. private ObjectExtraParams handlerUpdateExtraParams; //OnUpdateExtraParams;
  164. private ObjectDuplicate handlerObjectDuplicate;
  165. private ObjectDuplicateOnRay handlerObjectDuplicateOnRay;
  166. private ObjectRequest handlerObjectRequest;
  167. private ObjectSelect handlerObjectSelect;
  168. private ObjectDeselect handlerObjectDeselect;
  169. private ObjectIncludeInSearch handlerObjectIncludeInSearch;
  170. private UpdatePrimFlags handlerUpdatePrimFlags; //OnUpdatePrimFlags;
  171. private UpdatePrimTexture handlerUpdatePrimTexture;
  172. private GrabObject handlerGrabObject; //OnGrabObject;
  173. private MoveObject handlerGrabUpdate; //OnGrabUpdate;
  174. private DeGrabObject handlerDeGrabObject; //OnDeGrabObject;
  175. private SpinStart handlerSpinStart; //OnSpinStart;
  176. private SpinObject handlerSpinUpdate; //OnSpinUpdate;
  177. private SpinStop handlerSpinStop; //OnSpinStop;
  178. private GenericCall7 handlerObjectDescription;
  179. private GenericCall7 handlerObjectName;
  180. private GenericCall7 handlerObjectClickAction;
  181. private GenericCall7 handlerObjectMaterial;
  182. private ObjectPermissions handlerObjectPermissions;
  183. private RequestObjectPropertiesFamily handlerRequestObjectPropertiesFamily; //OnRequestObjectPropertiesFamily;
  184. //private TextureRequest handlerTextureRequest;
  185. private UDPAssetUploadRequest handlerAssetUploadRequest; //OnAssetUploadRequest;
  186. private RequestXfer handlerRequestXfer; //OnRequestXfer;
  187. private XferReceive handlerXferReceive; //OnXferReceive;
  188. private ConfirmXfer handlerConfirmXfer; //OnConfirmXfer;
  189. private AbortXfer handlerAbortXfer;
  190. private CreateInventoryFolder handlerCreateInventoryFolder; //OnCreateNewInventoryFolder;
  191. private UpdateInventoryFolder handlerUpdateInventoryFolder;
  192. private MoveInventoryFolder handlerMoveInventoryFolder;
  193. private CreateNewInventoryItem handlerCreateNewInventoryItem; //OnCreateNewInventoryItem;
  194. private FetchInventory handlerFetchInventory;
  195. private FetchInventoryDescendents handlerFetchInventoryDescendents; //OnFetchInventoryDescendents;
  196. private PurgeInventoryDescendents handlerPurgeInventoryDescendents; //OnPurgeInventoryDescendents;
  197. private UpdateInventoryItem handlerUpdateInventoryItem;
  198. private CopyInventoryItem handlerCopyInventoryItem;
  199. private MoveInventoryItem handlerMoveInventoryItem;
  200. private RemoveInventoryItem handlerRemoveInventoryItem;
  201. private RemoveInventoryFolder handlerRemoveInventoryFolder;
  202. private RequestTaskInventory handlerRequestTaskInventory; //OnRequestTaskInventory;
  203. private UpdateTaskInventory handlerUpdateTaskInventory; //OnUpdateTaskInventory;
  204. private MoveTaskInventory handlerMoveTaskItem;
  205. private RemoveTaskInventory handlerRemoveTaskItem; //OnRemoveTaskItem;
  206. private RezScript handlerRezScript; //OnRezScript;
  207. private RequestMapBlocks handlerRequestMapBlocks; //OnRequestMapBlocks;
  208. private RequestMapName handlerMapNameRequest; //OnMapNameRequest;
  209. private TeleportLocationRequest handlerTeleportLocationRequest; //OnTeleportLocationRequest;
  210. private MoneyBalanceRequest handlerMoneyBalanceRequest; //OnMoneyBalanceRequest;
  211. private UUIDNameRequest handlerNameRequest;
  212. private ParcelAccessListRequest handlerParcelAccessListRequest; //OnParcelAccessListRequest;
  213. private ParcelAccessListUpdateRequest handlerParcelAccessListUpdateRequest; //OnParcelAccessListUpdateRequest;
  214. private ParcelPropertiesRequest handlerParcelPropertiesRequest; //OnParcelPropertiesRequest;
  215. private ParcelDivideRequest handlerParcelDivideRequest; //OnParcelDivideRequest;
  216. private ParcelJoinRequest handlerParcelJoinRequest; //OnParcelJoinRequest;
  217. private ParcelPropertiesUpdateRequest handlerParcelPropertiesUpdateRequest; //OnParcelPropertiesUpdateRequest;
  218. private ParcelSelectObjects handlerParcelSelectObjects; //OnParcelSelectObjects;
  219. private ParcelObjectOwnerRequest handlerParcelObjectOwnerRequest; //OnParcelObjectOwnerRequest;
  220. private ParcelAbandonRequest handlerParcelAbandonRequest;
  221. private ParcelGodForceOwner handlerParcelGodForceOwner;
  222. private ParcelReclaim handlerParcelReclaim;
  223. private RequestTerrain handlerRequestTerrain;
  224. private RequestTerrain handlerUploadTerrain;
  225. private ParcelReturnObjectsRequest handlerParcelReturnObjectsRequest;
  226. private RegionInfoRequest handlerRegionInfoRequest; //OnRegionInfoRequest;
  227. private EstateCovenantRequest handlerEstateCovenantRequest; //OnEstateCovenantRequest;
  228. private RequestGodlikePowers handlerReqGodlikePowers; //OnRequestGodlikePowers;
  229. private GodKickUser handlerGodKickUser; //OnGodKickUser;
  230. private ViewerEffectEventHandler handlerViewerEffect; //OnViewerEffect;
  231. private Action<IClientAPI> handlerLogout; //OnLogout;
  232. private MoneyTransferRequest handlerMoneyTransferRequest; //OnMoneyTransferRequest;
  233. private ParcelBuy handlerParcelBuy;
  234. private EconomyDataRequest handlerEconomoyDataRequest;
  235. private UpdateVector handlerUpdatePrimSinglePosition; //OnUpdatePrimSinglePosition;
  236. private UpdatePrimSingleRotation handlerUpdatePrimSingleRotation; //OnUpdatePrimSingleRotation;
  237. private UpdatePrimSingleRotationPosition handlerUpdatePrimSingleRotationPosition; //OnUpdatePrimSingleRotation;
  238. private UpdateVector handlerUpdatePrimScale; //OnUpdatePrimScale;
  239. private UpdateVector handlerUpdatePrimGroupScale; //OnUpdateGroupScale;
  240. private UpdateVector handlerUpdateVector; //OnUpdatePrimGroupPosition;
  241. private UpdatePrimRotation handlerUpdatePrimRotation; //OnUpdatePrimGroupRotation;
  242. // private UpdatePrimGroupRotation handlerUpdatePrimGroupRotation; //OnUpdatePrimGroupMouseRotation;
  243. // private RequestAsset handlerRequestAsset; // OnRequestAsset;
  244. private UUIDNameRequest handlerTeleportHomeRequest;
  245. private RegionHandleRequest handlerRegionHandleRequest; // OnRegionHandleRequest
  246. private ParcelInfoRequest handlerParcelInfoRequest; // OnParcelInfoRequest
  247. private ScriptAnswer handlerScriptAnswer;
  248. private RequestPayPrice handlerRequestPayPrice;
  249. private ObjectSaleInfo handlerObjectSaleInfo;
  250. private ObjectBuy handlerObjectBuy;
  251. //private BuyObjectInventory handlerBuyObjectInventory;
  252. private ObjectDeselect handlerObjectDetach;
  253. private ObjectDrop handlerObjectDrop;
  254. private AgentSit handlerOnUndo;
  255. private ForceReleaseControls handlerForceReleaseControls;
  256. private GodLandStatRequest handlerLandStatRequest;
  257. private UUIDNameRequest handlerUUIDGroupNameRequest;
  258. private ParcelDeedToGroup handlerParcelDeedToGroup;
  259. private RequestObjectPropertiesFamily handlerObjectGroupRequest;
  260. private ScriptReset handlerScriptReset;
  261. private GetScriptRunning handlerGetScriptRunning;
  262. private SetScriptRunning handlerSetScriptRunning;
  263. private UpdateVector handlerAutoPilotGo;
  264. //Gesture
  265. private ActivateGesture handlerActivateGesture;
  266. private DeactivateGesture handlerDeactivateGesture;
  267. //Sound
  268. private SoundTrigger handlerSoundTrigger;
  269. private ObjectOwner handlerObjectOwner;
  270. private DirPlacesQuery handlerDirPlacesQuery;
  271. private DirFindQuery handlerDirFindQuery;
  272. private DirLandQuery handlerDirLandQuery;
  273. private DirPopularQuery handlerDirPopularQuery;
  274. private DirClassifiedQuery handlerDirClassifiedQuery;
  275. private ParcelSetOtherCleanTime handlerParcelSetOtherCleanTime;
  276. private MapItemRequest handlerMapItemRequest;
  277. private StartLure handlerStartLure;
  278. private TeleportLureRequest handlerTeleportLureRequest;
  279. private NetworkStats handlerNetworkStatsUpdate;
  280. private ClassifiedInfoRequest handlerClassifiedInfoRequest;
  281. private ClassifiedInfoUpdate handlerClassifiedInfoUpdate;
  282. private ClassifiedDelete handlerClassifiedDelete;
  283. private ClassifiedDelete handlerClassifiedGodDelete;
  284. private EventNotificationAddRequest handlerEventNotificationAddRequest;
  285. private EventNotificationRemoveRequest handlerEventNotificationRemoveRequest;
  286. private EventGodDelete handlerEventGodDelete;
  287. private ParcelDwellRequest handlerParcelDwellRequest;
  288. private UserInfoRequest handlerUserInfoRequest;
  289. private UpdateUserInfo handlerUpdateUserInfo;
  290. private RetrieveInstantMessages handlerRetrieveInstantMessages;
  291. private PickDelete handlerPickDelete;
  292. private PickGodDelete handlerPickGodDelete;
  293. private PickInfoUpdate handlerPickInfoUpdate;
  294. private AvatarNotesUpdate handlerAvatarNotesUpdate;
  295. private MuteListRequest handlerMuteListRequest;
  296. //private AvatarInterestUpdate handlerAvatarInterestUpdate;
  297. private PlacesQuery handlerPlacesQuery;
  298. private readonly IGroupsModule m_GroupsModule;
  299. private AgentUpdateArgs lastarg = null;
  300. //private TerrainUnacked handlerUnackedTerrain = null;
  301. //**
  302. /* Properties */
  303. public UUID SecureSessionId
  304. {
  305. get { return m_secureSessionId; }
  306. }
  307. public IScene Scene
  308. {
  309. get { return m_scene; }
  310. }
  311. public UUID SessionId
  312. {
  313. get { return m_sessionId; }
  314. }
  315. public Vector3 StartPos
  316. {
  317. get { return m_startpos; }
  318. set { m_startpos = value; }
  319. }
  320. public UUID AgentId
  321. {
  322. get { return m_agentId; }
  323. }
  324. public UUID ActiveGroupId
  325. {
  326. get { return m_activeGroupID; }
  327. }
  328. public string ActiveGroupName
  329. {
  330. get { return m_activeGroupName; }
  331. }
  332. public ulong ActiveGroupPowers
  333. {
  334. get { return m_activeGroupPowers; }
  335. }
  336. public bool IsGroupMember(UUID groupID)
  337. {
  338. return m_groupPowers.ContainsKey(groupID);
  339. }
  340. public ulong GetGroupPowers(UUID groupID)
  341. {
  342. if (groupID == m_activeGroupID)
  343. return m_activeGroupPowers;
  344. if (m_groupPowers.ContainsKey(groupID))
  345. return m_groupPowers[groupID];
  346. return 0;
  347. }
  348. /// <summary>
  349. /// This is a utility method used by single states to not duplicate kicks and blue card of death messages.
  350. /// </summary>
  351. public bool ChildAgentStatus()
  352. {
  353. return m_scene.PresenceChildStatus(AgentId);
  354. }
  355. /// <summary>
  356. /// First name of the agent/avatar represented by the client
  357. /// </summary>
  358. public string FirstName
  359. {
  360. get { return m_firstName; }
  361. }
  362. /// <summary>
  363. /// Last name of the agent/avatar represented by the client
  364. /// </summary>
  365. public string LastName
  366. {
  367. get { return m_lastName; }
  368. }
  369. /// <summary>
  370. /// Full name of the client (first name and last name)
  371. /// </summary>
  372. public string Name
  373. {
  374. get { return FirstName + " " + LastName; }
  375. }
  376. public uint CircuitCode
  377. {
  378. get { return m_circuitCode; }
  379. }
  380. public int MoneyBalance
  381. {
  382. get { return m_moneyBalance; }
  383. }
  384. public int NextAnimationSequenceNumber
  385. {
  386. get { return m_animationSequenceNumber++; }
  387. }
  388. public ILLPacketHandler PacketHandler
  389. {
  390. get { return m_PacketHandler; }
  391. }
  392. bool m_IsActive = true;
  393. public bool IsActive
  394. {
  395. get { return m_IsActive; }
  396. set { m_IsActive = value; }
  397. }
  398. public bool SendLogoutPacketWhenClosing
  399. {
  400. set { m_SendLogoutPacketWhenClosing = value; }
  401. }
  402. /* METHODS */
  403. /// <summary>
  404. /// Constructor
  405. /// </summary>
  406. public LLClientView(
  407. EndPoint remoteEP, IScene scene, LLPacketServer packServer,
  408. AuthenticateResponse sessionInfo, UUID agentId, UUID sessionId, uint circuitCode, EndPoint proxyEP,
  409. ClientStackUserSettings userSettings)
  410. {
  411. // Should be called first?
  412. RegisterInterfaces();
  413. m_GroupsModule = scene.RequestModuleInterface<IGroupsModule>();
  414. m_moneyBalance = 1000;
  415. m_channelVersion = Utils.StringToBytes(scene.GetSimulatorVersion());
  416. InitDefaultAnimations();
  417. m_scene = scene;
  418. //m_assetCache = assetCache;
  419. m_assetService = m_scene.RequestModuleInterface<IAssetService>();
  420. m_networkServer = packServer;
  421. m_agentId = agentId;
  422. m_sessionId = sessionId;
  423. m_circuitCode = circuitCode;
  424. m_userEndPoint = remoteEP;
  425. m_proxyEndPoint = proxyEP;
  426. m_firstName = sessionInfo.LoginInfo.First;
  427. m_lastName = sessionInfo.LoginInfo.Last;
  428. m_startpos = sessionInfo.LoginInfo.StartPos;
  429. if (sessionInfo.LoginInfo.SecureSession != UUID.Zero)
  430. {
  431. m_secureSessionId = sessionInfo.LoginInfo.SecureSession;
  432. }
  433. // While working on this, the BlockingQueue had me fooled for a bit.
  434. // The Blocking queue causes the thread to stop until there's something
  435. // in it to process. It's an on-purpose threadlock though because
  436. // without it, the clientloop will suck up all sim resources.
  437. m_PacketHandler = new LLPacketHandler(this, m_networkServer, userSettings);
  438. m_PacketHandler.SynchronizeClient = SynchronizeClient;
  439. m_PacketHandler.OnPacketStats += PopulateStats;
  440. if (scene.Config != null)
  441. {
  442. IConfig clientConfig = scene.Config.Configs["LLClient"];
  443. if (clientConfig != null)
  444. {
  445. m_PacketHandler.ReliableIsImportant =
  446. clientConfig.GetBoolean("ReliableIsImportant",
  447. false);
  448. m_PacketHandler.MaxReliableResends = clientConfig.GetInt("MaxReliableResends",
  449. m_PacketHandler.MaxReliableResends);
  450. m_primTerseUpdatesPerPacket = clientConfig.GetInt("TerseUpdatesPerPacket",
  451. m_primTerseUpdatesPerPacket);
  452. m_primFullUpdatesPerPacket = clientConfig.GetInt("FullUpdatesPerPacket",
  453. m_primFullUpdatesPerPacket);
  454. m_primTerseUpdateRate = clientConfig.GetInt("TerseUpdateRate",
  455. m_primTerseUpdateRate);
  456. m_primFullUpdateRate = clientConfig.GetInt("FullUpdateRate",
  457. m_primFullUpdateRate);
  458. m_textureRequestRate = clientConfig.GetInt("TextureRequestRate",
  459. m_textureRequestRate);
  460. m_textureSendLimit = clientConfig.GetInt("TextureSendLimit",
  461. m_textureSendLimit);
  462. m_textureDataLimit = clientConfig.GetInt("TextureDataLimit",
  463. m_textureDataLimit);
  464. m_packetMTU = clientConfig.GetInt("PacketMTU", 1400);
  465. }
  466. }
  467. RegisterLocalPacketHandlers();
  468. m_imageManager = new LLImageManager(this, m_assetService, Scene.RequestModuleInterface<IJ2KDecoder>());
  469. }
  470. public void SetDebugPacketLevel(int newDebugPacketLevel)
  471. {
  472. m_debugPacketLevel = newDebugPacketLevel;
  473. }
  474. # region Client Methods
  475. private void CloseCleanup(bool shutdownCircuit)
  476. {
  477. m_scene.RemoveClient(AgentId);
  478. //m_log.InfoFormat("[CLIENTVIEW] Memory pre GC {0}", System.GC.GetTotalMemory(false));
  479. //m_log.InfoFormat("[CLIENTVIEW] Memory post GC {0}", System.GC.GetTotalMemory(true));
  480. // Send the STOP packet
  481. DisableSimulatorPacket disable = (DisableSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.DisableSimulator);
  482. OutPacket(disable, ThrottleOutPacketType.Unknown);
  483. Thread.Sleep(2000);
  484. // Shut down timers. Thread Context of this method is murky. Lock all timers
  485. if (m_clientPingTimer.Enabled)
  486. lock (m_clientPingTimer)
  487. m_clientPingTimer.Stop();
  488. if (m_avatarTerseUpdateTimer.Enabled)
  489. lock (m_avatarTerseUpdateTimer)
  490. m_avatarTerseUpdateTimer.Stop();
  491. if (m_primTerseUpdateTimer.Enabled)
  492. lock (m_primTerseUpdateTimer)
  493. m_primTerseUpdateTimer.Stop();
  494. if (m_primFullUpdateTimer.Enabled)
  495. lock (m_primFullUpdateTimer)
  496. m_primFullUpdateTimer.Stop();
  497. if (m_textureRequestTimer.Enabled)
  498. lock (m_textureRequestTimer)
  499. m_textureRequestTimer.Stop();
  500. // This is just to give the client a reasonable chance of
  501. // flushing out all it's packets. There should probably
  502. // be a better mechanism here
  503. // We can't reach into other scenes and close the connection
  504. // We need to do this over grid communications
  505. //m_scene.CloseAllAgents(CircuitCode);
  506. // If we're not shutting down the circuit, then this is the last time we'll go here.
  507. // If we are shutting down the circuit, the UDP Server will come back here with
  508. // ShutDownCircuit = false
  509. if (!(shutdownCircuit))
  510. {
  511. GC.Collect();
  512. m_imageManager = null;
  513. // Sends a KillPacket object, with which, the
  514. // blockingqueue dequeues and sees it's a killpacket
  515. // and terminates within the context of the client thread.
  516. // This ensures that it's done from within the context
  517. // of the client thread regardless of where Close() is called.
  518. KillEndDone();
  519. }
  520. }
  521. /// <summary>
  522. /// Close down the client view. This *must* be the last method called, since the last #
  523. /// statement of CloseCleanup() aborts the thread.
  524. /// </summary>
  525. /// <param name="shutdownCircuit"></param>
  526. public void Close(bool shutdownCircuit)
  527. {
  528. m_clientPingTimer.Enabled = false;
  529. m_log.DebugFormat(
  530. "[CLIENT]: Close has been called with shutdownCircuit = {0} for {1} attached to scene {2}",
  531. shutdownCircuit, Name, m_scene.RegionInfo.RegionName);
  532. if (m_imageManager != null)
  533. m_imageManager.Close();
  534. if (m_PacketHandler != null)
  535. m_PacketHandler.Flush();
  536. // raise an event on the packet server to Shutdown the circuit
  537. // Now, if we raise the event then the packet server will call this method itself, so don't try cleanup
  538. // here otherwise we'll end up calling it twice.
  539. // FIXME: In truth, I might be wrong but this whole business of calling this method twice (with different args) looks
  540. // horribly tangly. Hopefully it should be possible to greatly simplify it.
  541. if (shutdownCircuit)
  542. {
  543. if (OnConnectionClosed != null)
  544. OnConnectionClosed(this);
  545. }
  546. else
  547. {
  548. CloseCleanup(shutdownCircuit);
  549. }
  550. }
  551. public void Kick(string message)
  552. {
  553. if (!ChildAgentStatus())
  554. {
  555. KickUserPacket kupack = (KickUserPacket)PacketPool.Instance.GetPacket(PacketType.KickUser);
  556. kupack.UserInfo.AgentID = AgentId;
  557. kupack.UserInfo.SessionID = SessionId;
  558. kupack.TargetBlock.TargetIP = 0;
  559. kupack.TargetBlock.TargetPort = 0;
  560. kupack.UserInfo.Reason = Utils.StringToBytes(message);
  561. OutPacket(kupack, ThrottleOutPacketType.Task);
  562. // You must sleep here or users get no message!
  563. Thread.Sleep(500);
  564. }
  565. }
  566. public void Stop()
  567. {
  568. // Shut down timers. Thread Context is Murky, lock all timers!
  569. if (m_clientPingTimer.Enabled)
  570. lock (m_clientPingTimer)
  571. m_clientPingTimer.Stop();
  572. if (m_avatarTerseUpdateTimer.Enabled)
  573. lock (m_avatarTerseUpdateTimer)
  574. m_avatarTerseUpdateTimer.Stop();
  575. if (m_primTerseUpdateTimer.Enabled)
  576. lock (m_primTerseUpdateTimer)
  577. m_primTerseUpdateTimer.Stop();
  578. if (m_primFullUpdateTimer.Enabled)
  579. lock (m_primFullUpdateTimer)
  580. m_primFullUpdateTimer.Stop();
  581. if (m_textureRequestTimer.Enabled)
  582. lock (m_textureRequestTimer)
  583. m_textureRequestTimer.Stop();
  584. }
  585. public void Restart()
  586. {
  587. // re-construct
  588. m_PacketHandler.Clear();
  589. m_clientPingTimer = new Timer(5000);
  590. m_clientPingTimer.Elapsed += CheckClientConnectivity;
  591. m_clientPingTimer.Enabled = true;
  592. m_avatarTerseUpdateTimer = new Timer(m_avatarTerseUpdateRate);
  593. m_avatarTerseUpdateTimer.Elapsed += new ElapsedEventHandler(ProcessAvatarTerseUpdates);
  594. m_avatarTerseUpdateTimer.AutoReset = false;
  595. m_primTerseUpdateTimer = new Timer(m_primTerseUpdateRate);
  596. m_primTerseUpdateTimer.Elapsed += new ElapsedEventHandler(ProcessPrimTerseUpdates);
  597. m_primTerseUpdateTimer.AutoReset = false;
  598. m_primFullUpdateTimer = new Timer(m_primFullUpdateRate);
  599. m_primFullUpdateTimer.Elapsed += new ElapsedEventHandler(ProcessPrimFullUpdates);
  600. m_primFullUpdateTimer.AutoReset = false;
  601. m_textureRequestTimer = new Timer(m_textureRequestRate);
  602. m_textureRequestTimer.Elapsed += new ElapsedEventHandler(ProcessTextureRequests);
  603. m_textureRequestTimer.AutoReset = false;
  604. }
  605. public void Terminate()
  606. {
  607. m_PacketHandler.OnPacketStats -= PopulateStats;
  608. m_PacketHandler.Stop();
  609. // wait for thread stoped
  610. m_clientThread.Join();
  611. // delete circuit code
  612. m_networkServer.CloseClient(this);
  613. }
  614. #endregion
  615. # region Packet Handling
  616. public void PopulateStats(int inPackets, int outPackets, int unAckedBytes)
  617. {
  618. handlerNetworkStatsUpdate = OnNetworkStatsUpdate;
  619. if (handlerNetworkStatsUpdate != null)
  620. {
  621. handlerNetworkStatsUpdate(inPackets, outPackets, unAckedBytes);
  622. }
  623. }
  624. public static bool AddPacketHandler(PacketType packetType, PacketMethod handler)
  625. {
  626. bool result = false;
  627. lock (PacketHandlers)
  628. {
  629. if (!PacketHandlers.ContainsKey(packetType))
  630. {
  631. PacketHandlers.Add(packetType, handler);
  632. result = true;
  633. }
  634. }
  635. return result;
  636. }
  637. public bool AddLocalPacketHandler(PacketType packetType, PacketMethod handler)
  638. {
  639. bool result = false;
  640. lock (m_packetHandlers)
  641. {
  642. if (!m_packetHandlers.ContainsKey(packetType))
  643. {
  644. m_packetHandlers.Add(packetType, handler);
  645. result = true;
  646. }
  647. }
  648. return result;
  649. }
  650. public bool AddGenericPacketHandler(string MethodName, GenericMessage handler)
  651. {
  652. MethodName = MethodName.ToLower().Trim();
  653. bool result = false;
  654. lock (m_genericPacketHandlers)
  655. {
  656. if (!m_genericPacketHandlers.ContainsKey(MethodName))
  657. {
  658. m_genericPacketHandlers.Add(MethodName, handler);
  659. result = true;
  660. }
  661. }
  662. return result;
  663. }
  664. /// <summary>
  665. /// Try to process a packet using registered packet handlers
  666. /// </summary>
  667. /// <param name="packet"></param>
  668. /// <returns>True if a handler was found which successfully processed the packet.</returns>
  669. protected virtual bool ProcessPacketMethod(Packet packet)
  670. {
  671. bool result = false;
  672. PacketMethod method;
  673. if (m_packetHandlers.TryGetValue(packet.Type, out method))
  674. {
  675. //there is a local handler for this packet type
  676. result = method(this, packet);
  677. }
  678. else
  679. {
  680. //there is not a local handler so see if there is a Global handler
  681. bool found;
  682. lock (PacketHandlers)
  683. {
  684. found = PacketHandlers.TryGetValue(packet.Type, out method);
  685. }
  686. if (found)
  687. {
  688. result = method(this, packet);
  689. }
  690. }
  691. return result;
  692. }
  693. protected void DebugPacket(string direction, Packet packet)
  694. {
  695. string info;
  696. if (m_debugPacketLevel < 255 && packet.Type == PacketType.AgentUpdate)
  697. return;
  698. if (m_debugPacketLevel < 254 && packet.Type == PacketType.ViewerEffect)
  699. return;
  700. if (m_debugPacketLevel < 253 && (
  701. packet.Type == PacketType.CompletePingCheck ||
  702. packet.Type == PacketType.StartPingCheck
  703. ))
  704. return;
  705. if (m_debugPacketLevel < 252 && packet.Type == PacketType.PacketAck)
  706. return;
  707. if (m_debugPacketLevel > 1)
  708. {
  709. info = packet.ToString();
  710. }
  711. else
  712. {
  713. info = packet.Type.ToString();
  714. }
  715. Console.WriteLine(m_circuitCode + ":" + direction + ": " + info);
  716. }
  717. /// <summary>
  718. /// Main packet processing loop for the UDP component of the client session. Both incoming and outgoing
  719. /// packets are processed here.
  720. /// </summary>
  721. protected virtual void ClientLoop()
  722. {
  723. m_log.DebugFormat(
  724. "[CLIENT]: Entered main packet processing loop for {0} in {1}", Name, Scene.RegionInfo.RegionName);
  725. while (IsActive)
  726. {
  727. LLQueItem nextPacket = m_PacketHandler.PacketQueue.Dequeue();
  728. if (nextPacket.Incoming)
  729. {
  730. if (m_debugPacketLevel > 0)
  731. DebugPacket("IN", nextPacket.Packet);
  732. m_PacketHandler.ProcessInPacket(nextPacket);
  733. }
  734. else
  735. {
  736. if (m_debugPacketLevel > 0)
  737. DebugPacket("OUT", nextPacket.Packet);
  738. m_PacketHandler.ProcessOutPacket(nextPacket);
  739. }
  740. }
  741. }
  742. # endregion
  743. protected int m_terrainCheckerCount;
  744. /// <summary>
  745. /// Event handler for check client timer
  746. /// Checks to ensure that the client is still connected. If the client has failed to respond to many pings
  747. /// in succession then close down the connection.
  748. /// </summary>
  749. /// <param name="sender"></param>
  750. /// <param name="e"></param>
  751. protected void CheckClientConnectivity(object sender, ElapsedEventArgs e)
  752. {
  753. if (m_PacketHandler.PacketsReceived == m_inPacketsChecked)
  754. {
  755. // no packet came in since the last time we checked...
  756. m_probesWithNoIngressPackets++;
  757. if ((m_probesWithNoIngressPackets > 30 && !m_clientBlocked) // agent active
  758. || (m_probesWithNoIngressPackets > 90 && m_clientBlocked)) // agent paused
  759. {
  760. m_clientPingTimer.Enabled = false;
  761. m_log.WarnFormat(
  762. "[CLIENT]: Client for agent {0} {1} has stopped responding to pings. Closing connection",
  763. Name, AgentId);
  764. if (OnConnectionClosed != null)
  765. {
  766. OnConnectionClosed(this);
  767. }
  768. }
  769. else
  770. {
  771. // this will normally trigger at least one packet (ping response)
  772. SendStartPingCheck(0);
  773. }
  774. }
  775. else
  776. {
  777. // Something received in the meantime - we can reset the counters
  778. m_probesWithNoIngressPackets = 0;
  779. // ... and store the current number of packets received to find out if another one got in on the next cycle
  780. m_inPacketsChecked = m_PacketHandler.PacketsReceived;
  781. }
  782. }
  783. # region Setup
  784. /// <summary>
  785. /// Starts up the timers to check the client and resend unacked packets
  786. /// Adds the client to the OpenSim.Region.Framework.Scenes.Scene
  787. /// </summary>
  788. protected virtual void InitNewClient()
  789. {
  790. //this.UploadAssets = new AgentAssetUpload(this, m_assetCache, m_inventoryCache);
  791. // Ping the client regularly to check that it's still there
  792. m_clientPingTimer = new Timer(5000);
  793. m_clientPingTimer.Elapsed += CheckClientConnectivity;
  794. m_clientPingTimer.Enabled = true;
  795. m_avatarTerseUpdateTimer = new Timer(m_avatarTerseUpdateRate);
  796. m_avatarTerseUpdateTimer.Elapsed += new ElapsedEventHandler(ProcessAvatarTerseUpdates);
  797. m_avatarTerseUpdateTimer.AutoReset = false;
  798. m_primTerseUpdateTimer = new Timer(m_primTerseUpdateRate);
  799. m_primTerseUpdateTimer.Elapsed += new ElapsedEventHandler(ProcessPrimTerseUpdates);
  800. m_primTerseUpdateTimer.AutoReset = false;
  801. m_primFullUpdateTimer = new Timer(m_primFullUpdateRate);
  802. m_primFullUpdateTimer.Elapsed += new ElapsedEventHandler(ProcessPrimFullUpdates);
  803. m_primFullUpdateTimer.AutoReset = false;
  804. m_textureRequestTimer = new Timer(m_textureRequestRate);
  805. m_textureRequestTimer.Elapsed += new ElapsedEventHandler(ProcessTextureRequests);
  806. m_textureRequestTimer.AutoReset = false;
  807. m_scene.AddNewClient(this);
  808. RefreshGroupMembership();
  809. }
  810. public virtual void Start()
  811. {
  812. m_clientThread = new Thread(RunUserSession);
  813. m_clientThread.Name = "ClientThread";
  814. m_clientThread.IsBackground = true;
  815. m_clientThread.Start();
  816. ThreadTracker.Add(m_clientThread);
  817. }
  818. /// <summary>
  819. /// Run a user session. This method lies at the base of the entire client thread.
  820. /// </summary>
  821. protected virtual void RunUserSession()
  822. {
  823. //tell this thread we are using the culture set up for the sim (currently hardcoded to en_US)
  824. //otherwise it will override this and use the system default
  825. Culture.SetCurrentCulture();
  826. try
  827. {
  828. // This sets up all the timers
  829. InitNewClient();
  830. ClientLoop();
  831. }
  832. catch (Exception e)
  833. {
  834. if (e is ThreadAbortException)
  835. throw;
  836. if (StatsManager.SimExtraStats != null)
  837. StatsManager.SimExtraStats.AddAbnormalClientThreadTermination();
  838. // Don't let a failure in an individual client thread crash the whole sim.
  839. m_log.ErrorFormat(
  840. "[CLIENT]: Client thread for {0} {1} crashed. Logging them out.", Name, AgentId);
  841. m_log.Error(e.ToString());
  842. try
  843. {
  844. // Make an attempt to alert the user that their session has crashed
  845. AgentAlertMessagePacket packet
  846. = BuildAgentAlertPacket(
  847. "Unfortunately the session for this client on the server has crashed.\n"
  848. + "Any further actions taken will not be processed.\n"
  849. + "Please relog", true);
  850. LLQueItem item = new LLQueItem();
  851. item.Packet = packet;
  852. item.Sequence = packet.Header.Sequence;
  853. m_PacketHandler.ProcessOutPacket(item);
  854. // There may be a better way to do this. Perhaps kick? Not sure this propogates notifications to
  855. // listeners yet, though.
  856. Logout(this);
  857. }
  858. catch (Exception e2)
  859. {
  860. if (e2 is ThreadAbortException)
  861. throw;
  862. m_log.ErrorFormat("[CLIENT]: Further exception thrown on forced session logout. {0}", e2);
  863. }
  864. }
  865. }
  866. protected virtual void TextureRequestHandler()
  867. {
  868. m_log.DebugFormat("[TRH] Thread started");
  869. while (m_imageManager != null)
  870. {
  871. try
  872. {
  873. while (m_imageManager != null)
  874. {
  875. }
  876. }
  877. catch (Exception e)
  878. {
  879. m_log.WarnFormat("[TRH] Exception in handler loop: {0}", e.Message);
  880. m_log.Debug(e);
  881. }
  882. }
  883. m_log.DebugFormat("[TRH] Thread terminated");
  884. }
  885. # endregion
  886. // Previously ClientView.API partial class
  887. public event GenericMessage OnGenericMessage;
  888. public event BinaryGenericMessage OnBinaryGenericMessage;
  889. public event Action<IClientAPI> OnLogout;
  890. public event ObjectPermissions OnObjectPermissions;
  891. public event Action<IClientAPI> OnConnectionClosed;
  892. public event ViewerEffectEventHandler OnViewerEffect;
  893. public event ImprovedInstantMessage OnInstantMessage;
  894. public event ChatMessage OnChatFromClient;
  895. public event TextureRequest OnRequestTexture;
  896. public event RezObject OnRezObject;
  897. public event DeRezObject OnDeRezObject;
  898. public event ModifyTerrain OnModifyTerrain;
  899. public event Action<IClientAPI> OnRegionHandShakeReply;
  900. public event GenericCall2 OnRequestWearables;
  901. public event SetAppearance OnSetAppearance;
  902. public event AvatarNowWearing OnAvatarNowWearing;
  903. public event RezSingleAttachmentFromInv OnRezSingleAttachmentFromInv;
  904. public event RezMultipleAttachmentsFromInv OnRezMultipleAttachmentsFromInv;
  905. public event UUIDNameRequest OnDetachAttachmentIntoInv;
  906. public event ObjectAttach OnObjectAttach;
  907. public event ObjectDeselect OnObjectDetach;
  908. public event ObjectDrop OnObjectDrop;
  909. public event GenericCall2 OnCompleteMovementToRegion;
  910. public event UpdateAgent OnAgentUpdate;
  911. public event AgentRequestSit OnAgentRequestSit;
  912. public event AgentSit OnAgentSit;
  913. public event AvatarPickerRequest OnAvatarPickerRequest;
  914. public event StartAnim OnStartAnim;
  915. public event StopAnim OnStopAnim;
  916. public event Action<IClientAPI> OnRequestAvatarsData;
  917. public event LinkObjects OnLinkObjects;
  918. public event DelinkObjects OnDelinkObjects;
  919. public event GrabObject OnGrabObject;
  920. public event DeGrabObject OnDeGrabObject;
  921. public event SpinStart OnSpinStart;
  922. public event SpinStop OnSpinStop;
  923. public event ObjectDuplicate OnObjectDuplicate;
  924. public event ObjectDuplicateOnRay OnObjectDuplicateOnRay;
  925. public event MoveObject OnGrabUpdate;
  926. public event SpinObject OnSpinUpdate;
  927. public event AddNewPrim OnAddPrim;
  928. public event RequestGodlikePowers OnRequestGodlikePowers;
  929. public event GodKickUser OnGodKickUser;
  930. public event ObjectExtraParams OnUpdateExtraParams;
  931. public event UpdateShape OnUpdatePrimShape;
  932. public event ObjectRequest OnObjectRequest;
  933. public event ObjectSelect OnObjectSelect;
  934. public event ObjectDeselect OnObjectDeselect;
  935. public event GenericCall7 OnObjectDescription;
  936. public event GenericCall7 OnObjectName;
  937. public event GenericCall7 OnObjectClickAction;
  938. public event GenericCall7 OnObjectMaterial;
  939. public event ObjectIncludeInSearch OnObjectIncludeInSearch;
  940. public event RequestObjectPropertiesFamily OnRequestObjectPropertiesFamily;
  941. public event UpdatePrimFlags OnUpdatePrimFlags;
  942. public event UpdatePrimTexture OnUpdatePrimTexture;
  943. public event UpdateVector OnUpdatePrimGroupPosition;
  944. public event UpdateVector OnUpdatePrimSinglePosition;
  945. public event UpdatePrimRotation OnUpdatePrimGroupRotation;
  946. public event UpdatePrimSingleRotation OnUpdatePrimSingleRotation;
  947. public event UpdatePrimSingleRotationPosition OnUpdatePrimSingleRotationPosition;
  948. public event UpdatePrimGroupRotation OnUpdatePrimGroupMouseRotation;
  949. public event UpdateVector OnUpdatePrimScale;
  950. public event UpdateVector OnUpdatePrimGroupScale;
  951. public event StatusChange OnChildAgentStatus;
  952. public event GenericCall2 OnStopMovement;
  953. public event Action<UUID> OnRemoveAvatar;
  954. public event RequestMapBlocks OnRequestMapBlocks;
  955. public event RequestMapName OnMapNameRequest;
  956. public event TeleportLocationRequest OnTeleportLocationRequest;
  957. public event TeleportLandmarkRequest OnTeleportLandmarkRequest;
  958. public event DisconnectUser OnDisconnectUser;
  959. public event RequestAvatarProperties OnRequestAvatarProperties;
  960. public event SetAlwaysRun OnSetAlwaysRun;
  961. public event FetchInventory OnAgentDataUpdateRequest;
  962. public event TeleportLocationRequest OnSetStartLocationRequest;
  963. public event UpdateAvatarProperties OnUpdateAvatarProperties;
  964. public event CreateNewInventoryItem OnCreateNewInventoryItem;
  965. public event CreateInventoryFolder OnCreateNewInventoryFolder;
  966. public event UpdateInventoryFolder OnUpdateInventoryFolder;
  967. public event MoveInventoryFolder OnMoveInventoryFolder;
  968. public event FetchInventoryDescendents OnFetchInventoryDescendents;
  969. public event PurgeInventoryDescendents OnPurgeInventoryDescendents;
  970. public event FetchInventory OnFetchInventory;
  971. public event RequestTaskInventory OnRequestTaskInventory;
  972. public event UpdateInventoryItem OnUpdateInventoryItem;
  973. public event CopyInventoryItem OnCopyInventoryItem;
  974. public event MoveInventoryItem OnMoveInventoryItem;
  975. public event RemoveInventoryItem OnRemoveInventoryItem;
  976. public event RemoveInventoryFolder OnRemoveInventoryFolder;
  977. public event UDPAssetUploadRequest OnAssetUploadRequest;
  978. public event XferReceive OnXferReceive;
  979. public event RequestXfer OnRequestXfer;
  980. public event ConfirmXfer OnConfirmXfer;
  981. public event AbortXfer OnAbortXfer;
  982. public event RequestTerrain OnRequestTerrain;
  983. public event RezScript OnRezScript;
  984. public event UpdateTaskInventory OnUpdateTaskInventory;
  985. public event MoveTaskInventory OnMoveTaskItem;
  986. public event RemoveTaskInventory OnRemoveTaskItem;
  987. public event RequestAsset OnRequestAsset;
  988. public event UUIDNameRequest OnNameFromUUIDRequest;
  989. public event ParcelAccessListRequest OnParcelAccessListRequest;
  990. public event ParcelAccessListUpdateRequest OnParcelAccessListUpdateRequest;
  991. public event ParcelPropertiesRequest OnParcelPropertiesRequest;
  992. public event ParcelDivideRequest OnParcelDivideRequest;
  993. public event ParcelJoinRequest OnParcelJoinRequest;
  994. public event ParcelPropertiesUpdateRequest OnParcelPropertiesUpdateRequest;
  995. public event ParcelSelectObjects OnParcelSelectObjects;
  996. public event ParcelObjectOwnerRequest OnParcelObjectOwnerRequest;
  997. public event ParcelAbandonRequest OnParcelAbandonRequest;
  998. public event ParcelGodForceOwner OnParcelGodForceOwner;
  999. public event ParcelReclaim OnParcelReclaim;
  1000. public event ParcelReturnObjectsRequest OnParcelReturnObjectsRequest;
  1001. public event ParcelDeedToGroup OnParcelDeedToGroup;
  1002. public event RegionInfoRequest OnRegionInfoRequest;
  1003. public event EstateCovenantRequest OnEstateCovenantRequest;
  1004. public event FriendActionDelegate OnApproveFriendRequest;
  1005. public event FriendActionDelegate OnDenyFriendRequest;
  1006. public event FriendshipTermination OnTerminateFriendship;
  1007. public event MoneyTransferRequest OnMoneyTransferRequest;
  1008. public event EconomyDataRequest OnEconomyDataRequest;
  1009. public event MoneyBalanceRequest OnMoneyBalanceRequest;
  1010. public event ParcelBuy OnParcelBuy;
  1011. public event UUIDNameRequest OnTeleportHomeRequest;
  1012. public event UUIDNameRequest OnUUIDGroupNameRequest;
  1013. public event ScriptAnswer OnScriptAnswer;
  1014. public event RequestPayPrice OnRequestPayPrice;
  1015. public event ObjectSaleInfo OnObjectSaleInfo;
  1016. public event ObjectBuy OnObjectBuy;
  1017. public event BuyObjectInventory OnBuyObjectInventory;
  1018. public event AgentSit OnUndo;
  1019. public event ForceReleaseControls OnForceReleaseControls;
  1020. public event GodLandStatRequest OnLandStatRequest;
  1021. public event RequestObjectPropertiesFamily OnObjectGroupRequest;
  1022. public event DetailedEstateDataRequest OnDetailedEstateDataRequest;
  1023. public event SetEstateFlagsRequest OnSetEstateFlagsRequest;
  1024. public event SetEstateTerrainBaseTexture OnSetEstateTerrainBaseTexture;
  1025. public event SetEstateTerrainDetailTexture OnSetEstateTerrainDetailTexture;
  1026. public event SetEstateTerrainTextureHeights OnSetEstateTerrainTextureHeights;
  1027. public event CommitEstateTerrainTextureRequest OnCommitEstateTerrainTextureRequest;
  1028. public event SetRegionTerrainSettings OnSetRegionTerrainSettings;
  1029. public event BakeTerrain OnBakeTerrain;
  1030. public event RequestTerrain OnUploadTerrain;
  1031. public event EstateChangeInfo OnEstateChangeInfo;
  1032. public event EstateRestartSimRequest OnEstateRestartSimRequest;
  1033. public event EstateChangeCovenantRequest OnEstateChangeCovenantRequest;
  1034. public event UpdateEstateAccessDeltaRequest OnUpdateEstateAccessDeltaRequest;
  1035. public event SimulatorBlueBoxMessageRequest OnSimulatorBlueBoxMessageRequest;
  1036. public event EstateBlueBoxMessageRequest OnEstateBlueBoxMessageRequest;
  1037. public event EstateDebugRegionRequest OnEstateDebugRegionRequest;
  1038. public event EstateTeleportOneUserHomeRequest OnEstateTeleportOneUserHomeRequest;
  1039. public event EstateTeleportAllUsersHomeRequest OnEstateTeleportAllUsersHomeRequest;
  1040. public event RegionHandleRequest OnRegionHandleRequest;
  1041. public event ParcelInfoRequest OnParcelInfoRequest;
  1042. public event ScriptReset OnScriptReset;
  1043. public event GetScriptRunning OnGetScriptRunning;
  1044. public event SetScriptRunning OnSetScriptRunning;
  1045. public event UpdateVector OnAutoPilotGo;
  1046. public event TerrainUnacked OnUnackedTerrain;
  1047. public event ActivateGesture OnActivateGesture;
  1048. public event DeactivateGesture OnDeactivateGesture;
  1049. public event ObjectOwner OnObjectOwner;
  1050. public event DirPlacesQuery OnDirPlacesQuery;
  1051. public event DirFindQuery OnDirFindQuery;
  1052. public event DirLandQuery OnDirLandQuery;
  1053. public event DirPopularQuery OnDirPopularQuery;
  1054. public event DirClassifiedQuery OnDirClassifiedQuery;
  1055. public event EventInfoRequest OnEventInfoRequest;
  1056. public event ParcelSetOtherCleanTime OnParcelSetOtherCleanTime;
  1057. public event MapItemRequest OnMapItemRequest;
  1058. public event OfferCallingCard OnOfferCallingCard;
  1059. public event AcceptCallingCard OnAcceptCallingCard;
  1060. public event DeclineCallingCard OnDeclineCallingCard;
  1061. public event SoundTrigger OnSoundTrigger;
  1062. public event StartLure OnStartLure;
  1063. public event TeleportLureRequest OnTeleportLureRequest;
  1064. public event NetworkStats OnNetworkStatsUpdate;
  1065. public event ClassifiedInfoRequest OnClassifiedInfoRequest;
  1066. public event ClassifiedInfoUpdate OnClassifiedInfoUpdate;
  1067. public event ClassifiedDelete OnClassifiedDelete;
  1068. public event ClassifiedDelete OnClassifiedGodDelete;
  1069. public event EventNotificationAddRequest OnEventNotificationAddRequest;
  1070. public event EventNotificationRemoveRequest OnEventNotificationRemoveRequest;
  1071. public event EventGodDelete OnEventGodDelete;
  1072. public event ParcelDwellRequest OnParcelDwellRequest;
  1073. public event UserInfoRequest OnUserInfoRequest;
  1074. public event UpdateUserInfo OnUpdateUserInfo;
  1075. public event RetrieveInstantMessages OnRetrieveInstantMessages;
  1076. public event PickDelete OnPickDelete;
  1077. public event PickGodDelete OnPickGodDelete;
  1078. public event PickInfoUpdate OnPickInfoUpdate;
  1079. public event AvatarNotesUpdate OnAvatarNotesUpdate;
  1080. public event MuteListRequest OnMuteListRequest;
  1081. //public event AvatarInterestUpdate OnAvatarInterestUpdate;
  1082. public event PlacesQuery OnPlacesQuery;
  1083. public void ActivateGesture(UUID assetId, UUID gestureId)
  1084. {
  1085. }
  1086. public void DeactivateGesture(UUID assetId, UUID gestureId)
  1087. {
  1088. }
  1089. // Sound
  1090. public void SoundTrigger(UUID soundId, UUID owerid, UUID Objectid,UUID ParentId,float Gain, Vector3 Position,UInt64 Handle)
  1091. {
  1092. }
  1093. #region Scene/Avatar to Client
  1094. public void SendRegionHandshake(RegionInfo regionInfo, RegionHandshakeArgs args)
  1095. {
  1096. RegionHandshakePacket handshake = (RegionHandshakePacket)PacketPool.Instance.GetPacket(PacketType.RegionHandshake);
  1097. handshake.RegionInfo = new RegionHandshakePacket.RegionInfoBlock();
  1098. handshake.RegionInfo.BillableFactor = args.billableFactor;
  1099. handshake.RegionInfo.IsEstateManager = args.isEstateManager;
  1100. handshake.RegionInfo.TerrainHeightRange00 = args.terrainHeightRange0;
  1101. handshake.RegionInfo.TerrainHeightRange01 = args.terrainHeightRange1;
  1102. handshake.RegionInfo.TerrainHeightRange10 = args.terrainHeightRange2;
  1103. handshake.RegionInfo.TerrainHeightRange11 = args.terrainHeightRange3;
  1104. handshake.RegionInfo.TerrainStartHeight00 = args.terrainStartHeight0;
  1105. handshake.RegionInfo.TerrainStartHeight01 = args.terrainStartHeight1;
  1106. handshake.RegionInfo.TerrainStartHeight10 = args.terrainStartHeight2;
  1107. handshake.RegionInfo.TerrainStartHeight11 = args.terrainStartHeight3;
  1108. handshake.RegionInfo.SimAccess = args.simAccess;
  1109. handshake.RegionInfo.WaterHeight = args.waterHeight;
  1110. handshake.RegionInfo.RegionFlags = args.regionFlags;
  1111. handshake.RegionInfo.SimName = Utils.StringToBytes(args.regionName);
  1112. handshake.RegionInfo.SimOwner = args.SimOwner;
  1113. handshake.RegionInfo.TerrainBase0 = args.terrainBase0;
  1114. handshake.RegionInfo.TerrainBase1 = args.terrainBase1;
  1115. handshake.RegionInfo.TerrainBase2 = args.terrainBase2;
  1116. handshake.RegionInfo.TerrainBase3 = args.terrainBase3;
  1117. handshake.RegionInfo.TerrainDetail0 = args.terrainDetail0;
  1118. handshake.RegionInfo.TerrainDetail1 = args.terrainDetail1;
  1119. handshake.RegionInfo.TerrainDetail2 = args.terrainDetail2;
  1120. handshake.RegionInfo.TerrainDetail3 = args.terrainDetail3;
  1121. handshake.RegionInfo.CacheID = UUID.Random(); //I guess this is for the client to remember an old setting?
  1122. handshake.RegionInfo2 = new RegionHandshakePacket.RegionInfo2Block();
  1123. handshake.RegionInfo2.RegionID = regionInfo.RegionID;
  1124. handshake.RegionInfo3 = new RegionHandshakePacket.RegionInfo3Block();
  1125. handshake.RegionInfo3.CPUClassID = 9;
  1126. handshake.RegionInfo3.CPURatio = 1;
  1127. handshake.RegionInfo3.ColoName = Utils.EmptyBytes;
  1128. handshake.RegionInfo3.ProductName = Utils.EmptyBytes;
  1129. handshake.RegionInfo3.ProductSKU = Utils.EmptyBytes;
  1130. OutPacket(handshake, ThrottleOutPacketType.Task);
  1131. }
  1132. /// <summary>
  1133. ///
  1134. /// </summary>
  1135. public void MoveAgentIntoRegion(RegionInfo regInfo, Vector3 pos, Vector3 look)
  1136. {
  1137. AgentMovementCompletePacket mov = (AgentMovementCompletePacket)PacketPool.Instance.GetPacket(PacketType.AgentMovementComplete);
  1138. mov.SimData.ChannelVersion = m_channelVersion;
  1139. mov.AgentData.SessionID = m_sessionId;
  1140. mov.AgentData.AgentID = AgentId;
  1141. mov.Data.RegionHandle = regInfo.RegionHandle;
  1142. mov.Data.Timestamp = (uint)Util.UnixTimeSinceEpoch();
  1143. if ((pos.X == 0) && (pos.Y == 0) && (pos.Z == 0))
  1144. {
  1145. mov.Data.Position = m_startpos;
  1146. }
  1147. else
  1148. {
  1149. mov.Data.Position = pos;
  1150. }
  1151. mov.Data.LookAt = look;
  1152. // Hack to get this out immediately and skip the throttles
  1153. OutPacket(mov, ThrottleOutPacketType.Unknown);
  1154. }
  1155. public void SendChatMessage(string message, byte type, Vector3 fromPos, string fromName,
  1156. UUID fromAgentID, byte source, byte audible)
  1157. {
  1158. ChatFromSimulatorPacket reply = (ChatFromSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.ChatFromSimulator);
  1159. reply.ChatData.Audible = audible;
  1160. reply.ChatData.Message = Utils.StringToBytes(message);
  1161. reply.ChatData.ChatType = type;
  1162. reply.ChatData.SourceType = source;
  1163. reply.ChatData.Position = fromPos;
  1164. reply.ChatData.FromName = Utils.StringToBytes(fromName);
  1165. reply.ChatData.OwnerID = fromAgentID;
  1166. reply.ChatData.SourceID = fromAgentID;
  1167. OutPacket(reply, ThrottleOutPacketType.Task);
  1168. }
  1169. /// <summary>
  1170. /// Send an instant message to this client
  1171. /// </summary>
  1172. //
  1173. // Don't remove transaction ID! Groups and item gives need to set it!
  1174. public void SendInstantMessage(GridInstantMessage im)
  1175. {
  1176. if (((Scene)(m_scene)).Permissions.CanInstantMessage(new UUID(im.fromAgentID), new UUID(im.toAgentID)))
  1177. {
  1178. ImprovedInstantMessagePacket msg
  1179. = (ImprovedInstantMessagePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedInstantMessage);
  1180. msg.AgentData.AgentID = new UUID(im.fromAgentID);
  1181. msg.AgentData.SessionID = UUID.Zero;
  1182. msg.MessageBlock.FromAgentName = Utils.StringToBytes(im.fromAgentName);
  1183. msg.MessageBlock.Dialog = im.dialog;
  1184. msg.MessageBlock.FromGroup = im.fromGroup;
  1185. if (im.imSessionID == UUID.Zero.Guid)
  1186. msg.MessageBlock.ID = new UUID(im.fromAgentID) ^ new UUID(im.toAgentID);
  1187. else
  1188. msg.MessageBlock.ID = new UUID(im.imSessionID);
  1189. msg.MessageBlock.Offline = im.offline;
  1190. msg.MessageBlock.ParentEstateID = im.ParentEstateID;
  1191. msg.MessageBlock.Position = im.Position;
  1192. msg.MessageBlock.RegionID = new UUID(im.RegionID);
  1193. msg.MessageBlock.Timestamp = im.timestamp;
  1194. msg.MessageBlock.ToAgentID = new UUID(im.toAgentID);
  1195. // Cap the message length at 1099. There is a limit in ImprovedInstantMessagePacket
  1196. // the limit is 1100 but a 0 byte gets added to mark the end of the string
  1197. if (im.message != null && im.message.Length > 1099)
  1198. msg.MessageBlock.Message = Utils.StringToBytes(im.message.Substring(0, 1099));
  1199. else
  1200. msg.MessageBlock.Message = Utils.StringToBytes(im.message);
  1201. msg.MessageBlock.BinaryBucket = im.binaryBucket;
  1202. if (im.message.StartsWith("[grouptest]"))
  1203. { // this block is test code for implementing group IM - delete when group IM is finished
  1204. IEventQueue eq = Scene.RequestModuleInterface<IEventQueue>();
  1205. if (eq != null)
  1206. {
  1207. im.dialog = 17;
  1208. //eq.ChatterboxInvitation(
  1209. // new UUID("00000000-68f9-1111-024e-222222111123"),
  1210. // "OpenSimulator Testing", im.fromAgentID, im.message, im.toAgentID, im.fromAgentName, im.dialog, 0,
  1211. // false, 0, new Vector3(), 1, im.imSessionID, im.fromGroup, im.binaryBucket);
  1212. eq.ChatterboxInvitation(
  1213. new UUID("00000000-68f9-1111-024e-222222111123"),
  1214. "OpenSimulator Testing", new UUID(im.fromAgentID), im.message, new UUID(im.toAgentID), im.fromAgentName, im.dialog, 0,
  1215. false, 0, new Vector3(), 1, new UUID(im.imSessionID), im.fromGroup, Utils.StringToBytes("OpenSimulator Testing"));
  1216. eq.ChatterBoxSessionAgentListUpdates(
  1217. new UUID("00000000-68f9-1111-024e-222222111123"),
  1218. new UUID(im.fromAgentID), new UUID(im.toAgentID), false, false, false);
  1219. }
  1220. Console.WriteLine("SendInstantMessage: " + msg);
  1221. }
  1222. else
  1223. OutPacket(msg, ThrottleOutPacketType.Task);
  1224. }
  1225. }
  1226. public void SendGenericMessage(string method, List<string> message)
  1227. {
  1228. GenericMessagePacket gmp = new GenericMessagePacket();
  1229. gmp.MethodData.Method = Utils.StringToBytes(method);
  1230. gmp.ParamList = new GenericMessagePacket.ParamListBlock[message.Count];
  1231. int i = 0;
  1232. foreach (string val in message)
  1233. {
  1234. gmp.ParamList[i] = new GenericMessagePacket.ParamListBlock();
  1235. gmp.ParamList[i++].Parameter = Utils.StringToBytes(val);
  1236. }
  1237. OutPacket(gmp, ThrottleOutPacketType.Task);
  1238. }
  1239. /// <summary>
  1240. /// Send the region heightmap to the client
  1241. /// </summary>
  1242. /// <param name="map">heightmap</param>
  1243. public virtual void SendLayerData(float[] map)
  1244. {
  1245. ThreadPool.QueueUserWorkItem(DoSendLayerData, map);
  1246. }
  1247. /// <summary>
  1248. /// Send terrain layer information to the client.
  1249. /// </summary>
  1250. /// <param name="o"></param>
  1251. private void DoSendLayerData(object o)
  1252. {
  1253. float[] map = (float[])o;
  1254. try
  1255. {
  1256. for (int y = 0; y < 16; y++)
  1257. {
  1258. // For some terrains, sending more than one terrain patch at once results in a libsecondlife exception
  1259. // see http://opensimulator.org/mantis/view.php?id=1662
  1260. //for (int x = 0; x < 16; x += 4)
  1261. //{
  1262. // SendLayerPacket(map, y, x);
  1263. // Thread.Sleep(150);
  1264. //}
  1265. for (int x = 0; x < 16; x++)
  1266. {
  1267. SendLayerData(x, y, LLHeightFieldMoronize(map));
  1268. Thread.Sleep(35);
  1269. }
  1270. }
  1271. }
  1272. catch (Exception e)
  1273. {
  1274. m_log.Warn("[CLIENT]: ClientView.API.cs: SendLayerData() - Failed with exception " + e);
  1275. }
  1276. }
  1277. /// <summary>
  1278. /// Sends a set of four patches (x, x+1, ..., x+3) to the client
  1279. /// </summary>
  1280. /// <param name="map">heightmap</param>
  1281. /// <param name="px">X coordinate for patches 0..12</param>
  1282. /// <param name="py">Y coordinate for patches 0..15</param>
  1283. // private void SendLayerPacket(float[] map, int y, int x)
  1284. // {
  1285. // int[] patches = new int[4];
  1286. // patches[0] = x + 0 + y * 16;
  1287. // patches[1] = x + 1 + y * 16;
  1288. // patches[2] = x + 2 + y * 16;
  1289. // patches[3] = x + 3 + y * 16;
  1290. // Packet layerpack = LLClientView.TerrainManager.CreateLandPacket(map, patches);
  1291. // OutPacket(layerpack, ThrottleOutPacketType.Land);
  1292. // }
  1293. /// <summary>
  1294. /// Sends a specified patch to a client
  1295. /// </summary>
  1296. /// <param name="px">Patch coordinate (x) 0..15</param>
  1297. /// <param name="py">Patch coordinate (y) 0..15</param>
  1298. /// <param name="map">heightmap</param>
  1299. public void SendLayerData(int px, int py, float[] map)
  1300. {
  1301. try
  1302. {
  1303. int[] patches = new int[1];
  1304. int patchx, patchy;
  1305. patchx = px;
  1306. patchy = py;
  1307. patches[0] = patchx + 0 + patchy * 16;
  1308. LayerDataPacket layerpack = TerrainCompressor.CreateLandPacket(((map.Length==65536)? map : LLHeightFieldMoronize(map)), patches);
  1309. layerpack.Header.Zerocoded = true;
  1310. OutPacket(layerpack, ThrottleOutPacketType.Land);
  1311. }
  1312. catch (Exception e)
  1313. {
  1314. m_log.Warn("[client]: ClientView.API.cs: SendLayerData() - Failed with exception " + e.ToString());
  1315. }
  1316. }
  1317. /// <summary>
  1318. /// Munges heightfield into the LLUDP backed in restricted heightfield.
  1319. /// </summary>
  1320. /// <param name="map">float array in the base; Constants.RegionSize</param>
  1321. /// <returns>float array in the base 256</returns>
  1322. internal float[] LLHeightFieldMoronize(float[] map)
  1323. {
  1324. if (map.Length == 65536)
  1325. return map;
  1326. else
  1327. {
  1328. float[] returnmap = new float[65536];
  1329. if (map.Length < 65535)
  1330. {
  1331. // rebase the vector stride to 256
  1332. for (int i = 0; i < Constants.RegionSize; i++)
  1333. Array.Copy(map, i * (int)Constants.RegionSize, returnmap, i * 256, (int)Constants.RegionSize);
  1334. }
  1335. else
  1336. {
  1337. for (int i = 0; i < 256; i++)
  1338. Array.Copy(map, i * (int)Constants.RegionSize, returnmap, i * 256, 256);
  1339. }
  1340. //Array.Copy(map,0,returnmap,0,(map.Length < 65536)? map.Length : 65536);
  1341. return returnmap;
  1342. }
  1343. }
  1344. /// <summary>
  1345. /// Send the wind matrix to the client
  1346. /// </summary>
  1347. /// <param name="windSpeeds">16x16 array of wind speeds</param>
  1348. public virtual void SendWindData(Vector2[] windSpeeds)
  1349. {
  1350. ThreadPool.QueueUserWorkItem(new WaitCallback(DoSendWindData), (object)windSpeeds);
  1351. }
  1352. /// <summary>
  1353. /// Send the cloud matrix to the client
  1354. /// </summary>
  1355. /// <param name="windSpeeds">16x16 array of cloud densities</param>
  1356. public virtual void SendCloudData(float[] cloudDensity)
  1357. {
  1358. ThreadPool.QueueUserWorkItem(new WaitCallback(DoSendCloudData), (object)cloudDensity);
  1359. }
  1360. /// <summary>
  1361. /// Send wind layer information to the client.
  1362. /// </summary>
  1363. /// <param name="o"></param>
  1364. private void DoSendWindData(object o)
  1365. {
  1366. Vector2[] windSpeeds = (Vector2[])o;
  1367. TerrainPatch[] patches = new TerrainPatch[2];
  1368. patches[0] = new TerrainPatch();
  1369. patches[0].Data = new float[16 * 16];
  1370. patches[1] = new TerrainPatch();
  1371. patches[1].Data = new float[16 * 16];
  1372. for (int y = 0; y < 16; y++)
  1373. {
  1374. for (int x = 0; x < 16; x++)
  1375. {
  1376. patches[0].Data[y * 16 + x] = windSpeeds[y * 16 + x].X;
  1377. patches[1].Data[y * 16 + x] = windSpeeds[y * 16 + x].Y;
  1378. }
  1379. }
  1380. LayerDataPacket layerpack = TerrainCompressor.CreateLayerDataPacket(patches, TerrainPatch.LayerType.Wind);
  1381. layerpack.Header.Zerocoded = true;
  1382. OutPacket(layerpack, ThrottleOutPacketType.Wind);
  1383. }
  1384. /// <summary>
  1385. /// Send cloud layer information to the client.
  1386. /// </summary>
  1387. /// <param name="o"></param>
  1388. private void DoSendCloudData(object o)
  1389. {
  1390. float[] cloudCover = (float[])o;
  1391. TerrainPatch[] patches = new TerrainPatch[1];
  1392. patches[0] = new TerrainPatch();
  1393. patches[0].Data = new float[16 * 16];
  1394. for (int y = 0; y < 16; y++)
  1395. {
  1396. for (int x = 0; x < 16; x++)
  1397. {
  1398. patches[0].Data[y * 16 + x] = cloudCover[y * 16 + x];
  1399. }
  1400. }
  1401. LayerDataPacket layerpack = TerrainCompressor.CreateLayerDataPacket(patches, TerrainPatch.LayerType.Cloud);
  1402. layerpack.Header.Zerocoded = true;
  1403. OutPacket(layerpack, ThrottleOutPacketType.Cloud);
  1404. }
  1405. /// <summary>
  1406. /// Tell the client that the given neighbour region is ready to receive a child agent.
  1407. /// </summary>
  1408. public virtual void InformClientOfNeighbour(ulong neighbourHandle, IPEndPoint neighbourEndPoint)
  1409. {
  1410. IPAddress neighbourIP = neighbourEndPoint.Address;
  1411. ushort neighbourPort = (ushort)neighbourEndPoint.Port;
  1412. EnableSimulatorPacket enablesimpacket = (EnableSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.EnableSimulator);
  1413. // TODO: don't create new blocks if recycling an old packet
  1414. enablesimpacket.SimulatorInfo = new EnableSimulatorPacket.SimulatorInfoBlock();
  1415. enablesimpacket.SimulatorInfo.Handle = neighbourHandle;
  1416. byte[] byteIP = neighbourIP.GetAddressBytes();
  1417. enablesimpacket.SimulatorInfo.IP = (uint)byteIP[3] << 24;
  1418. enablesimpacket.SimulatorInfo.IP += (uint)byteIP[2] << 16;
  1419. enablesimpacket.SimulatorInfo.IP += (uint)byteIP[1] << 8;
  1420. enablesimpacket.SimulatorInfo.IP += (uint)byteIP[0];
  1421. enablesimpacket.SimulatorInfo.Port = neighbourPort;
  1422. enablesimpacket.Header.Reliable = true; // ESP's should be reliable.
  1423. OutPacket(enablesimpacket, ThrottleOutPacketType.Task);
  1424. }
  1425. public AgentCircuitData RequestClientInfo()
  1426. {
  1427. AgentCircuitData agentData = new AgentCircuitData();
  1428. agentData.AgentID = AgentId;
  1429. agentData.SessionID = m_sessionId;
  1430. agentData.SecureSessionID = SecureSessionId;
  1431. agentData.circuitcode = m_circuitCode;
  1432. agentData.child = false;
  1433. agentData.firstname = m_firstName;
  1434. agentData.lastname = m_lastName;
  1435. ICapabilitiesModule capsModule = m_scene.RequestModuleInterface<ICapabilitiesModule>();
  1436. if (capsModule == null) // can happen when shutting down.
  1437. return agentData;
  1438. agentData.CapsPath = capsModule.GetCapsPath(m_agentId);
  1439. agentData.ChildrenCapSeeds = new Dictionary<ulong,string>(capsModule.GetChildrenSeeds(m_agentId));
  1440. return agentData;
  1441. }
  1442. public virtual void CrossRegion(ulong newRegionHandle, Vector3 pos, Vector3 lookAt, IPEndPoint externalIPEndPoint,
  1443. string capsURL)
  1444. {
  1445. Vector3 look = new Vector3(lookAt.X * 10, lookAt.Y * 10, lookAt.Z * 10);
  1446. //CrossedRegionPacket newSimPack = (CrossedRegionPacket)PacketPool.Instance.GetPacket(PacketType.CrossedRegion);
  1447. CrossedRegionPacket newSimPack = new CrossedRegionPacket();
  1448. // TODO: don't create new blocks if recycling an old packet
  1449. newSimPack.AgentData = new CrossedRegionPacket.AgentDataBlock();
  1450. newSimPack.AgentData.AgentID = AgentId;
  1451. newSimPack.AgentData.SessionID = m_sessionId;
  1452. newSimPack.Info = new CrossedRegionPacket.InfoBlock();
  1453. newSimPack.Info.Position = pos;
  1454. newSimPack.Info.LookAt = look;
  1455. newSimPack.RegionData = new CrossedRegionPacket.RegionDataBlock();
  1456. newSimPack.RegionData.RegionHandle = newRegionHandle;
  1457. byte[] byteIP = externalIPEndPoint.Address.GetAddressBytes();
  1458. newSimPack.RegionData.SimIP = (uint)byteIP[3] << 24;
  1459. newSimPack.RegionData.SimIP += (uint)byteIP[2] << 16;
  1460. newSimPack.RegionData.SimIP += (uint)byteIP[1] << 8;
  1461. newSimPack.RegionData.SimIP += (uint)byteIP[0];
  1462. newSimPack.RegionData.SimPort = (ushort)externalIPEndPoint.Port;
  1463. newSimPack.RegionData.SeedCapability = Utils.StringToBytes(capsURL);
  1464. // Hack to get this out immediately and skip throttles
  1465. OutPacket(newSimPack, ThrottleOutPacketType.Unknown);
  1466. }
  1467. internal void SendMapBlockSplit(List<MapBlockData> mapBlocks, uint flag)
  1468. {
  1469. MapBlockReplyPacket mapReply = (MapBlockReplyPacket)PacketPool.Instance.GetPacket(PacketType.MapBlockReply);
  1470. // TODO: don't create new blocks if recycling an old packet
  1471. MapBlockData[] mapBlocks2 = mapBlocks.ToArray();
  1472. mapReply.AgentData.AgentID = AgentId;
  1473. mapReply.Data = new MapBlockReplyPacket.DataBlock[mapBlocks2.Length];
  1474. mapReply.AgentData.Flags = flag;
  1475. for (int i = 0; i < mapBlocks2.Length; i++)
  1476. {
  1477. mapReply.Data[i] = new MapBlockReplyPacket.DataBlock();
  1478. mapReply.Data[i].MapImageID = mapBlocks2[i].MapImageId;
  1479. //m_log.Warn(mapBlocks2[i].MapImageId.ToString());
  1480. mapReply.Data[i].X = mapBlocks2[i].X;
  1481. mapReply.Data[i].Y = mapBlocks2[i].Y;
  1482. mapReply.Data[i].WaterHeight = mapBlocks2[i].WaterHeight;
  1483. mapReply.Data[i].Name = Utils.StringToBytes(mapBlocks2[i].Name);
  1484. mapReply.Data[i].RegionFlags = mapBlocks2[i].RegionFlags;
  1485. mapReply.Data[i].Access = mapBlocks2[i].Access;
  1486. mapReply.Data[i].Agents = mapBlocks2[i].Agents;
  1487. }
  1488. OutPacket(mapReply, ThrottleOutPacketType.Land);
  1489. }
  1490. public void SendMapBlock(List<MapBlockData> mapBlocks, uint flag)
  1491. {
  1492. MapBlockData[] mapBlocks2 = mapBlocks.ToArray();
  1493. int maxsend = 10;
  1494. //int packets = Math.Ceiling(mapBlocks2.Length / maxsend);
  1495. List<MapBlockData> sendingBlocks = new List<MapBlockData>();
  1496. for (int i = 0; i < mapBlocks2.Length; i++)
  1497. {
  1498. sendingBlocks.Add(mapBlocks2[i]);
  1499. if (((i + 1) == mapBlocks2.Length) || (((i + 1) % maxsend) == 0))
  1500. {
  1501. SendMapBlockSplit(sendingBlocks, flag);
  1502. sendingBlocks = new List<MapBlockData>();
  1503. }
  1504. }
  1505. }
  1506. public void SendLocalTeleport(Vector3 position, Vector3 lookAt, uint flags)
  1507. {
  1508. TeleportLocalPacket tpLocal = (TeleportLocalPacket)PacketPool.Instance.GetPacket(PacketType.TeleportLocal);
  1509. tpLocal.Info.AgentID = AgentId;
  1510. tpLocal.Info.TeleportFlags = flags;
  1511. tpLocal.Info.LocationID = 2;
  1512. tpLocal.Info.LookAt = lookAt;
  1513. tpLocal.Info.Position = position;
  1514. // Hack to get this out immediately and skip throttles
  1515. OutPacket(tpLocal, ThrottleOutPacketType.Unknown);
  1516. }
  1517. public virtual void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint newRegionEndPoint, uint locationID,
  1518. uint flags, string capsURL)
  1519. {
  1520. //TeleportFinishPacket teleport = (TeleportFinishPacket)PacketPool.Instance.GetPacket(PacketType.TeleportFinish);
  1521. TeleportFinishPacket teleport = new TeleportFinishPacket();
  1522. teleport.Info.AgentID = AgentId;
  1523. teleport.Info.RegionHandle = regionHandle;
  1524. teleport.Info.SimAccess = simAccess;
  1525. teleport.Info.SeedCapability = Utils.StringToBytes(capsURL);
  1526. IPAddress oIP = newRegionEndPoint.Address;
  1527. byte[] byteIP = oIP.GetAddressBytes();
  1528. uint ip = (uint)byteIP[3] << 24;
  1529. ip += (uint)byteIP[2] << 16;
  1530. ip += (uint)byteIP[1] << 8;
  1531. ip += (uint)byteIP[0];
  1532. teleport.Info.SimIP = ip;
  1533. teleport.Info.SimPort = (ushort)newRegionEndPoint.Port;
  1534. teleport.Info.LocationID = 4;
  1535. teleport.Info.TeleportFlags = 1 << 4;
  1536. // Hack to get this out immediately and skip throttles.
  1537. OutPacket(teleport, ThrottleOutPacketType.Unknown);
  1538. }
  1539. /// <summary>
  1540. /// Inform the client that a teleport attempt has failed
  1541. /// </summary>
  1542. public void SendTeleportFailed(string reason)
  1543. {
  1544. TeleportFailedPacket tpFailed = (TeleportFailedPacket)PacketPool.Instance.GetPacket(PacketType.TeleportFailed);
  1545. tpFailed.Info.AgentID = AgentId;
  1546. tpFailed.Info.Reason = Utils.StringToBytes(reason);
  1547. tpFailed.AlertInfo = new TeleportFailedPacket.AlertInfoBlock[0];
  1548. // Hack to get this out immediately and skip throttles
  1549. OutPacket(tpFailed, ThrottleOutPacketType.Unknown);
  1550. }
  1551. /// <summary>
  1552. ///
  1553. /// </summary>
  1554. public void SendTeleportLocationStart()
  1555. {
  1556. //TeleportStartPacket tpStart = (TeleportStartPacket)PacketPool.Instance.GetPacket(PacketType.TeleportStart);
  1557. TeleportStartPacket tpStart = new TeleportStartPacket();
  1558. tpStart.Info.TeleportFlags = 16; // Teleport via location
  1559. // Hack to get this out immediately and skip throttles
  1560. OutPacket(tpStart, ThrottleOutPacketType.Unknown);
  1561. }
  1562. public void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance)
  1563. {
  1564. MoneyBalanceReplyPacket money = (MoneyBalanceReplyPacket)PacketPool.Instance.GetPacket(PacketType.MoneyBalanceReply);
  1565. money.MoneyData.AgentID = AgentId;
  1566. money.MoneyData.TransactionID = transaction;
  1567. money.MoneyData.TransactionSuccess = success;
  1568. money.MoneyData.Description = description;
  1569. money.MoneyData.MoneyBalance = balance;
  1570. OutPacket(money, ThrottleOutPacketType.Task);
  1571. }
  1572. public void SendPayPrice(UUID objectID, int[] payPrice)
  1573. {
  1574. if (payPrice[0] == 0 &&
  1575. payPrice[1] == 0 &&
  1576. payPrice[2] == 0 &&
  1577. payPrice[3] == 0 &&
  1578. payPrice[4] == 0)
  1579. return;
  1580. PayPriceReplyPacket payPriceReply = (PayPriceReplyPacket)PacketPool.Instance.GetPacket(PacketType.PayPriceReply);
  1581. payPriceReply.ObjectData.ObjectID = objectID;
  1582. payPriceReply.ObjectData.DefaultPayPrice = payPrice[0];
  1583. payPriceReply.ButtonData = new PayPriceReplyPacket.ButtonDataBlock[4];
  1584. payPriceReply.ButtonData[0] = new PayPriceReplyPacket.ButtonDataBlock();
  1585. payPriceReply.ButtonData[0].PayButton = payPrice[1];
  1586. payPriceReply.ButtonData[1] = new PayPriceReplyPacket.ButtonDataBlock();
  1587. payPriceReply.ButtonData[1].PayButton = payPrice[2];
  1588. payPriceReply.ButtonData[2] = new PayPriceReplyPacket.ButtonDataBlock();
  1589. payPriceReply.ButtonData[2].PayButton = payPrice[3];
  1590. payPriceReply.ButtonData[3] = new PayPriceReplyPacket.ButtonDataBlock();
  1591. payPriceReply.ButtonData[3].PayButton = payPrice[4];
  1592. OutPacket(payPriceReply, ThrottleOutPacketType.Task);
  1593. }
  1594. public void SendStartPingCheck(byte seq)
  1595. {
  1596. StartPingCheckPacket pc = (StartPingCheckPacket)PacketPool.Instance.GetPacket(PacketType.StartPingCheck);
  1597. pc.PingID.PingID = seq;
  1598. pc.Header.Reliable = false;
  1599. OutPacket(pc, ThrottleOutPacketType.Unknown);
  1600. }
  1601. public void SendKillObject(ulong regionHandle, uint localID)
  1602. {
  1603. KillObjectPacket kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject);
  1604. // TODO: don't create new blocks if recycling an old packet
  1605. kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
  1606. kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
  1607. kill.ObjectData[0].ID = localID;
  1608. kill.Header.Reliable = true;
  1609. kill.Header.Zerocoded = true;
  1610. OutPacket(kill, ThrottleOutPacketType.Task);
  1611. }
  1612. /// <summary>
  1613. /// Send information about the items contained in a folder to the client.
  1614. ///
  1615. /// XXX This method needs some refactoring loving
  1616. /// </summary>
  1617. /// <param name="ownerID">The owner of the folder</param>
  1618. /// <param name="folderID">The id of the folder</param>
  1619. /// <param name="items">The items contained in the folder identified by folderID</param>
  1620. /// <param name="folders"></param>
  1621. /// <param name="fetchFolders">Do we need to send folder information?</param>
  1622. /// <param name="fetchItems">Do we need to send item information?</param>
  1623. public void SendInventoryFolderDetails(UUID ownerID, UUID folderID, List<InventoryItemBase> items,
  1624. List<InventoryFolderBase> folders,
  1625. bool fetchFolders, bool fetchItems)
  1626. {
  1627. // An inventory descendents packet consists of a single agent section and an inventory details
  1628. // section for each inventory item. The size of each inventory item is approximately 550 bytes.
  1629. // In theory, UDP has a maximum packet size of 64k, so it should be possible to send descendent
  1630. // packets containing metadata for in excess of 100 items. But in practice, there may be other
  1631. // factors (e.g. firewalls) restraining the maximum UDP packet size. See,
  1632. //
  1633. // http://opensimulator.org/mantis/view.php?id=226
  1634. //
  1635. // for one example of this kind of thing. In fact, the Linden servers appear to only send about
  1636. // 6 to 7 items at a time, so let's stick with 6
  1637. int MAX_ITEMS_PER_PACKET = 6;
  1638. //Ckrinke This variable is not used, so comment out to remove the warning from the compiler (3-21-08)
  1639. //Ckrinke uint FULL_MASK_PERMISSIONS = 2147483647;
  1640. int itemsSent = 0;
  1641. if (fetchItems)
  1642. {
  1643. InventoryDescendentsPacket descend = CreateInventoryDescendentsPacket(ownerID, folderID);
  1644. if (items.Count < MAX_ITEMS_PER_PACKET)
  1645. {
  1646. descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[items.Count];
  1647. }
  1648. else
  1649. {
  1650. descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[MAX_ITEMS_PER_PACKET];
  1651. }
  1652. // Descendents must contain the *total* number of descendents (plus folders, whether we
  1653. // fetch them or not), not the number of entries we send in this packet. For consistency,
  1654. // I'll use it for folder-requests, too, although I wasn't able to get one with
  1655. // FetchFolders = true.
  1656. // TODO this should be checked with FetchFolders = true
  1657. descend.AgentData.Descendents = items.Count + folders.Count;
  1658. int count = 0;
  1659. int i = 0;
  1660. foreach (InventoryItemBase item in items)
  1661. {
  1662. descend.ItemData[i] = new InventoryDescendentsPacket.ItemDataBlock();
  1663. descend.ItemData[i].ItemID = item.ID;
  1664. descend.ItemData[i].AssetID = item.AssetID;
  1665. descend.ItemData[i].CreatorID = item.CreatorIdAsUuid;
  1666. descend.ItemData[i].BaseMask = item.BasePermissions;
  1667. descend.ItemData[i].Description = LLUtil.StringToPacketBytes(item.Description);
  1668. descend.ItemData[i].EveryoneMask = item.EveryOnePermissions;
  1669. descend.ItemData[i].OwnerMask = item.CurrentPermissions;
  1670. descend.ItemData[i].FolderID = item.Folder;
  1671. descend.ItemData[i].InvType = (sbyte)item.InvType;
  1672. descend.ItemData[i].Name = LLUtil.StringToPacketBytes(item.Name);
  1673. descend.ItemData[i].NextOwnerMask = item.NextPermissions;
  1674. descend.ItemData[i].OwnerID = item.Owner;
  1675. descend.ItemData[i].Type = (sbyte)item.AssetType;
  1676. descend.ItemData[i].GroupID = item.GroupID;
  1677. descend.ItemData[i].GroupOwned = item.GroupOwned;
  1678. descend.ItemData[i].GroupMask = item.GroupPermissions;
  1679. descend.ItemData[i].CreationDate = item.CreationDate;
  1680. descend.ItemData[i].SalePrice = item.SalePrice;
  1681. descend.ItemData[i].SaleType = item.SaleType;
  1682. descend.ItemData[i].Flags = item.Flags;
  1683. descend.ItemData[i].CRC =
  1684. Helpers.InventoryCRC(descend.ItemData[i].CreationDate, descend.ItemData[i].SaleType,
  1685. descend.ItemData[i].InvType, descend.ItemData[i].Type,
  1686. descend.ItemData[i].AssetID, descend.ItemData[i].GroupID,
  1687. descend.ItemData[i].SalePrice,
  1688. descend.ItemData[i].OwnerID, descend.ItemData[i].CreatorID,
  1689. descend.ItemData[i].ItemID, descend.ItemData[i].FolderID,
  1690. descend.ItemData[i].EveryoneMask,
  1691. descend.ItemData[i].Flags, descend.ItemData[i].OwnerMask,
  1692. descend.ItemData[i].GroupMask, item.CurrentPermissions);
  1693. i++;
  1694. count++;
  1695. itemsSent++;
  1696. if (i == MAX_ITEMS_PER_PACKET)
  1697. {
  1698. descend.Header.Zerocoded = true;
  1699. AddNullFolderBlockToDecendentsPacket(ref descend);
  1700. OutPacket(descend, ThrottleOutPacketType.Asset);
  1701. if ((items.Count - count) > 0)
  1702. {
  1703. descend = CreateInventoryDescendentsPacket(ownerID, folderID);
  1704. if ((items.Count - count) < MAX_ITEMS_PER_PACKET)
  1705. {
  1706. descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[items.Count - count];
  1707. }
  1708. else
  1709. {
  1710. descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[MAX_ITEMS_PER_PACKET];
  1711. }
  1712. descend.AgentData.Descendents = items.Count + folders.Count;
  1713. i = 0;
  1714. }
  1715. }
  1716. }
  1717. if (0 < i && i < MAX_ITEMS_PER_PACKET)
  1718. {
  1719. AddNullFolderBlockToDecendentsPacket(ref descend);
  1720. OutPacket(descend, ThrottleOutPacketType.Asset);
  1721. }
  1722. }
  1723. //send subfolders
  1724. if (fetchFolders)
  1725. {
  1726. InventoryDescendentsPacket descend = CreateInventoryDescendentsPacket(ownerID, folderID);
  1727. if (folders.Count < MAX_ITEMS_PER_PACKET)
  1728. {
  1729. descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[folders.Count];
  1730. }
  1731. else
  1732. {
  1733. descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[MAX_ITEMS_PER_PACKET];
  1734. }
  1735. // Not sure if this scenario ever actually occurs, but nonetheless we include the items
  1736. // count even if we're not sending item data for the same reasons as above.
  1737. descend.AgentData.Descendents = items.Count + folders.Count;
  1738. int i = 0;
  1739. int count = 0;
  1740. foreach (InventoryFolderBase folder in folders)
  1741. {
  1742. descend.FolderData[i] = new InventoryDescendentsPacket.FolderDataBlock();
  1743. descend.FolderData[i].FolderID = folder.ID;
  1744. descend.FolderData[i].Name = LLUtil.StringToPacketBytes(folder.Name);
  1745. descend.FolderData[i].ParentID = folder.ParentID;
  1746. descend.FolderData[i].Type = (sbyte)folder.Type;
  1747. i++;
  1748. count++;
  1749. itemsSent++;
  1750. if (i == MAX_ITEMS_PER_PACKET)
  1751. {
  1752. AddNullItemBlockToDescendentsPacket(ref descend);
  1753. OutPacket(descend, ThrottleOutPacketType.Asset);
  1754. if ((folders.Count - count) > 0)
  1755. {
  1756. descend = CreateInventoryDescendentsPacket(ownerID, folderID);
  1757. if ((folders.Count - count) < MAX_ITEMS_PER_PACKET)
  1758. {
  1759. descend.FolderData =
  1760. new InventoryDescendentsPacket.FolderDataBlock[folders.Count - count];
  1761. }
  1762. else
  1763. {
  1764. descend.FolderData =
  1765. new InventoryDescendentsPacket.FolderDataBlock[MAX_ITEMS_PER_PACKET];
  1766. }
  1767. descend.AgentData.Descendents = items.Count + folders.Count;
  1768. i = 0;
  1769. }
  1770. }
  1771. }
  1772. if (0 < i && i < MAX_ITEMS_PER_PACKET)
  1773. {
  1774. AddNullItemBlockToDescendentsPacket(ref descend);
  1775. OutPacket(descend, ThrottleOutPacketType.Asset);
  1776. }
  1777. }
  1778. if (itemsSent == 0)
  1779. {
  1780. // no items found.
  1781. InventoryDescendentsPacket descend = CreateInventoryDescendentsPacket(ownerID, folderID);
  1782. descend.AgentData.Descendents = 0;
  1783. AddNullItemBlockToDescendentsPacket(ref descend);
  1784. AddNullFolderBlockToDecendentsPacket(ref descend);
  1785. OutPacket(descend, ThrottleOutPacketType.Asset);
  1786. }
  1787. }
  1788. private void AddNullFolderBlockToDecendentsPacket(ref InventoryDescendentsPacket packet)
  1789. {
  1790. packet.FolderData = new InventoryDescendentsPacket.FolderDataBlock[1];
  1791. packet.FolderData[0] = new InventoryDescendentsPacket.FolderDataBlock();
  1792. packet.FolderData[0].FolderID = UUID.Zero;
  1793. packet.FolderData[0].ParentID = UUID.Zero;
  1794. packet.FolderData[0].Type = -1;
  1795. packet.FolderData[0].Name = new byte[0];
  1796. }
  1797. private void AddNullItemBlockToDescendentsPacket(ref InventoryDescendentsPacket packet)
  1798. {
  1799. packet.ItemData = new InventoryDescendentsPacket.ItemDataBlock[1];
  1800. packet.ItemData[0] = new InventoryDescendentsPacket.ItemDataBlock();
  1801. packet.ItemData[0].ItemID = UUID.Zero;
  1802. packet.ItemData[0].AssetID = UUID.Zero;
  1803. packet.ItemData[0].CreatorID = UUID.Zero;
  1804. packet.ItemData[0].BaseMask = 0;
  1805. packet.ItemData[0].Description = new byte[0];
  1806. packet.ItemData[0].EveryoneMask = 0;
  1807. packet.ItemData[0].OwnerMask = 0;
  1808. packet.ItemData[0].FolderID = UUID.Zero;
  1809. packet.ItemData[0].InvType = (sbyte)0;
  1810. packet.ItemData[0].Name = new byte[0];
  1811. packet.ItemData[0].NextOwnerMask = 0;
  1812. packet.ItemData[0].OwnerID = UUID.Zero;
  1813. packet.ItemData[0].Type = -1;
  1814. packet.ItemData[0].GroupID = UUID.Zero;
  1815. packet.ItemData[0].GroupOwned = false;
  1816. packet.ItemData[0].GroupMask = 0;
  1817. packet.ItemData[0].CreationDate = 0;
  1818. packet.ItemData[0].SalePrice = 0;
  1819. packet.ItemData[0].SaleType = 0;
  1820. packet.ItemData[0].Flags = 0;
  1821. // No need to add CRC
  1822. }
  1823. private InventoryDescendentsPacket CreateInventoryDescendentsPacket(UUID ownerID, UUID folderID)
  1824. {
  1825. InventoryDescendentsPacket descend = (InventoryDescendentsPacket)PacketPool.Instance.GetPacket(PacketType.InventoryDescendents);
  1826. descend.Header.Zerocoded = true;
  1827. descend.AgentData.AgentID = AgentId;
  1828. descend.AgentData.OwnerID = ownerID;
  1829. descend.AgentData.FolderID = folderID;
  1830. descend.AgentData.Version = 1;
  1831. return descend;
  1832. }
  1833. public void SendInventoryItemDetails(UUID ownerID, InventoryItemBase item)
  1834. {
  1835. const uint FULL_MASK_PERMISSIONS = (uint)PermissionMask.All;
  1836. FetchInventoryReplyPacket inventoryReply = (FetchInventoryReplyPacket)PacketPool.Instance.GetPacket(PacketType.FetchInventoryReply);
  1837. // TODO: don't create new blocks if recycling an old packet
  1838. inventoryReply.AgentData.AgentID = AgentId;
  1839. inventoryReply.InventoryData = new FetchInventoryReplyPacket.InventoryDataBlock[1];
  1840. inventoryReply.InventoryData[0] = new FetchInventoryReplyPacket.InventoryDataBlock();
  1841. inventoryReply.InventoryData[0].ItemID = item.ID;
  1842. inventoryReply.InventoryData[0].AssetID = item.AssetID;
  1843. inventoryReply.InventoryData[0].CreatorID = item.CreatorIdAsUuid;
  1844. inventoryReply.InventoryData[0].BaseMask = item.BasePermissions;
  1845. inventoryReply.InventoryData[0].CreationDate = item.CreationDate;
  1846. inventoryReply.InventoryData[0].Description = LLUtil.StringToPacketBytes(item.Description);
  1847. inventoryReply.InventoryData[0].EveryoneMask = item.EveryOnePermissions;
  1848. inventoryReply.InventoryData[0].FolderID = item.Folder;
  1849. inventoryReply.InventoryData[0].InvType = (sbyte)item.InvType;
  1850. inventoryReply.InventoryData[0].Name = LLUtil.StringToPacketBytes(item.Name);
  1851. inventoryReply.InventoryData[0].NextOwnerMask = item.NextPermissions;
  1852. inventoryReply.InventoryData[0].OwnerID = item.Owner;
  1853. inventoryReply.InventoryData[0].OwnerMask = item.CurrentPermissions;
  1854. inventoryReply.InventoryData[0].Type = (sbyte)item.AssetType;
  1855. inventoryReply.InventoryData[0].GroupID = item.GroupID;
  1856. inventoryReply.InventoryData[0].GroupOwned = item.GroupOwned;
  1857. inventoryReply.InventoryData[0].GroupMask = item.GroupPermissions;
  1858. inventoryReply.InventoryData[0].Flags = item.Flags;
  1859. inventoryReply.InventoryData[0].SalePrice = item.SalePrice;
  1860. inventoryReply.InventoryData[0].SaleType = item.SaleType;
  1861. inventoryReply.InventoryData[0].CRC =
  1862. Helpers.InventoryCRC(
  1863. 1000, 0, inventoryReply.InventoryData[0].InvType,
  1864. inventoryReply.InventoryData[0].Type, inventoryReply.InventoryData[0].AssetID,
  1865. inventoryReply.InventoryData[0].GroupID, 100,
  1866. inventoryReply.InventoryData[0].OwnerID, inventoryReply.InventoryData[0].CreatorID,
  1867. inventoryReply.InventoryData[0].ItemID, inventoryReply.InventoryData[0].FolderID,
  1868. FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS,
  1869. FULL_MASK_PERMISSIONS);
  1870. inventoryReply.Header.Zerocoded = true;
  1871. OutPacket(inventoryReply, ThrottleOutPacketType.Asset);
  1872. }
  1873. protected void SendBulkUpdateInventoryFolder(InventoryFolderBase folderBase)
  1874. {
  1875. // We will use the same transaction id for all the separate packets to be sent out in this update.
  1876. UUID transactionId = UUID.Random();
  1877. List<BulkUpdateInventoryPacket.FolderDataBlock> folderDataBlocks
  1878. = new List<BulkUpdateInventoryPacket.FolderDataBlock>();
  1879. SendBulkUpdateInventoryFolderRecursive(folderBase, ref folderDataBlocks, transactionId);
  1880. if (folderDataBlocks.Count > 0)
  1881. {
  1882. // We'll end up with some unsent folder blocks if there were some empty folders at the end of the list
  1883. // Send these now
  1884. BulkUpdateInventoryPacket bulkUpdate
  1885. = (BulkUpdateInventoryPacket)PacketPool.Instance.GetPacket(PacketType.BulkUpdateInventory);
  1886. bulkUpdate.Header.Zerocoded = true;
  1887. bulkUpdate.AgentData.AgentID = AgentId;
  1888. bulkUpdate.AgentData.TransactionID = transactionId;
  1889. bulkUpdate.FolderData = folderDataBlocks.ToArray();
  1890. List<BulkUpdateInventoryPacket.ItemDataBlock> foo = new List<BulkUpdateInventoryPacket.ItemDataBlock>();
  1891. bulkUpdate.ItemData = foo.ToArray();
  1892. //m_log.Debug("SendBulkUpdateInventory :" + bulkUpdate);
  1893. OutPacket(bulkUpdate, ThrottleOutPacketType.Asset);
  1894. }
  1895. }
  1896. /// <summary>
  1897. /// Recursively construct bulk update packets to send folders and items
  1898. /// </summary>
  1899. /// <param name="folder"></param>
  1900. /// <param name="folderDataBlocks"></param>
  1901. /// <param name="transactionId"></param>
  1902. private void SendBulkUpdateInventoryFolderRecursive(
  1903. InventoryFolderBase folder, ref List<BulkUpdateInventoryPacket.FolderDataBlock> folderDataBlocks,
  1904. UUID transactionId)
  1905. {
  1906. folderDataBlocks.Add(GenerateBulkUpdateFolderDataBlock(folder));
  1907. const int MAX_ITEMS_PER_PACKET = 5;
  1908. IInventoryService invService = m_scene.RequestModuleInterface<IInventoryService>();
  1909. // If there are any items then we have to start sending them off in this packet - the next folder will have
  1910. // to be in its own bulk update packet. Also, we can only fit 5 items in a packet (at least this was the limit
  1911. // being used on the Linden grid at 20081203).
  1912. InventoryCollection contents = invService.GetFolderContent(AgentId, folder.ID); // folder.RequestListOfItems();
  1913. List<InventoryItemBase> items = contents.Items;
  1914. while (items.Count > 0)
  1915. {
  1916. BulkUpdateInventoryPacket bulkUpdate
  1917. = (BulkUpdateInventoryPacket)PacketPool.Instance.GetPacket(PacketType.BulkUpdateInventory);
  1918. bulkUpdate.Header.Zerocoded = true;
  1919. bulkUpdate.AgentData.AgentID = AgentId;
  1920. bulkUpdate.AgentData.TransactionID = transactionId;
  1921. bulkUpdate.FolderData = folderDataBlocks.ToArray();
  1922. int itemsToSend = (items.Count > MAX_ITEMS_PER_PACKET ? MAX_ITEMS_PER_PACKET : items.Count);
  1923. bulkUpdate.ItemData = new BulkUpdateInventoryPacket.ItemDataBlock[itemsToSend];
  1924. for (int i = 0; i < itemsToSend; i++)
  1925. {
  1926. // Remove from the end of the list so that we don't incur a performance penalty
  1927. bulkUpdate.ItemData[i] = GenerateBulkUpdateItemDataBlock(items[items.Count - 1]);
  1928. items.RemoveAt(items.Count - 1);
  1929. }
  1930. //m_log.Debug("SendBulkUpdateInventoryRecursive :" + bulkUpdate);
  1931. OutPacket(bulkUpdate, ThrottleOutPacketType.Asset);
  1932. folderDataBlocks = new List<BulkUpdateInventoryPacket.FolderDataBlock>();
  1933. // If we're going to be sending another items packet then it needs to contain just the folder to which those
  1934. // items belong.
  1935. if (items.Count > 0)
  1936. folderDataBlocks.Add(GenerateBulkUpdateFolderDataBlock(folder));
  1937. }
  1938. List<InventoryFolderBase> subFolders = contents.Folders;
  1939. foreach (InventoryFolderBase subFolder in subFolders)
  1940. {
  1941. SendBulkUpdateInventoryFolderRecursive(subFolder, ref folderDataBlocks, transactionId);
  1942. }
  1943. }
  1944. /// <summary>
  1945. /// Generate a bulk update inventory data block for the given folder
  1946. /// </summary>
  1947. /// <param name="folder"></param>
  1948. /// <returns></returns>
  1949. private BulkUpdateInventoryPacket.FolderDataBlock GenerateBulkUpdateFolderDataBlock(InventoryFolderBase folder)
  1950. {
  1951. BulkUpdateInventoryPacket.FolderDataBlock folderBlock = new BulkUpdateInventoryPacket.FolderDataBlock();
  1952. folderBlock.FolderID = folder.ID;
  1953. folderBlock.ParentID = folder.ParentID;
  1954. folderBlock.Type = -1;
  1955. folderBlock.Name = LLUtil.StringToPacketBytes(folder.Name);
  1956. return folderBlock;
  1957. }
  1958. /// <summary>
  1959. /// Generate a bulk update inventory data block for the given item
  1960. /// </summary>
  1961. /// <param name="item"></param>
  1962. /// <returns></returns>
  1963. private BulkUpdateInventoryPacket.ItemDataBlock GenerateBulkUpdateItemDataBlock(InventoryItemBase item)
  1964. {
  1965. BulkUpdateInventoryPacket.ItemDataBlock itemBlock = new BulkUpdateInventoryPacket.ItemDataBlock();
  1966. itemBlock.ItemID = item.ID;
  1967. itemBlock.AssetID = item.AssetID;
  1968. itemBlock.CreatorID = item.CreatorIdAsUuid;
  1969. itemBlock.BaseMask = item.BasePermissions;
  1970. itemBlock.Description = LLUtil.StringToPacketBytes(item.Description);
  1971. itemBlock.EveryoneMask = item.EveryOnePermissions;
  1972. itemBlock.FolderID = item.Folder;
  1973. itemBlock.InvType = (sbyte)item.InvType;
  1974. itemBlock.Name = LLUtil.StringToPacketBytes(item.Name);
  1975. itemBlock.NextOwnerMask = item.NextPermissions;
  1976. itemBlock.OwnerID = item.Owner;
  1977. itemBlock.OwnerMask = item.CurrentPermissions;
  1978. itemBlock.Type = (sbyte)item.AssetType;
  1979. itemBlock.GroupID = item.GroupID;
  1980. itemBlock.GroupOwned = item.GroupOwned;
  1981. itemBlock.GroupMask = item.GroupPermissions;
  1982. itemBlock.Flags = item.Flags;
  1983. itemBlock.SalePrice = item.SalePrice;
  1984. itemBlock.SaleType = item.SaleType;
  1985. itemBlock.CreationDate = item.CreationDate;
  1986. itemBlock.CRC =
  1987. Helpers.InventoryCRC(
  1988. 1000, 0, itemBlock.InvType,
  1989. itemBlock.Type, itemBlock.AssetID,
  1990. itemBlock.GroupID, 100,
  1991. itemBlock.OwnerID, itemBlock.CreatorID,
  1992. itemBlock.ItemID, itemBlock.FolderID,
  1993. (uint)PermissionMask.All, 1, (uint)PermissionMask.All, (uint)PermissionMask.All,
  1994. (uint)PermissionMask.All);
  1995. return itemBlock;
  1996. }
  1997. public void SendBulkUpdateInventory(InventoryNodeBase node)
  1998. {
  1999. if (node is InventoryItemBase)
  2000. SendBulkUpdateInventoryItem((InventoryItemBase)node);
  2001. else if (node is InventoryFolderBase)
  2002. SendBulkUpdateInventoryFolder((InventoryFolderBase)node);
  2003. else
  2004. m_log.ErrorFormat("[CLIENT]: Client for {0} sent unknown inventory node named {1}", Name, node.Name);
  2005. }
  2006. protected void SendBulkUpdateInventoryItem(InventoryItemBase item)
  2007. {
  2008. const uint FULL_MASK_PERMISSIONS = (uint)PermissionMask.All;
  2009. BulkUpdateInventoryPacket bulkUpdate
  2010. = (BulkUpdateInventoryPacket)PacketPool.Instance.GetPacket(PacketType.BulkUpdateInventory);
  2011. bulkUpdate.AgentData.AgentID = AgentId;
  2012. bulkUpdate.AgentData.TransactionID = UUID.Random();
  2013. bulkUpdate.FolderData = new BulkUpdateInventoryPacket.FolderDataBlock[1];
  2014. bulkUpdate.FolderData[0] = new BulkUpdateInventoryPacket.FolderDataBlock();
  2015. bulkUpdate.FolderData[0].FolderID = UUID.Zero;
  2016. bulkUpdate.FolderData[0].ParentID = UUID.Zero;
  2017. bulkUpdate.FolderData[0].Type = -1;
  2018. bulkUpdate.FolderData[0].Name = new byte[0];
  2019. bulkUpdate.ItemData = new BulkUpdateInventoryPacket.ItemDataBlock[1];
  2020. bulkUpdate.ItemData[0] = new BulkUpdateInventoryPacket.ItemDataBlock();
  2021. bulkUpdate.ItemData[0].ItemID = item.ID;
  2022. bulkUpdate.ItemData[0].AssetID = item.AssetID;
  2023. bulkUpdate.ItemData[0].CreatorID = item.CreatorIdAsUuid;
  2024. bulkUpdate.ItemData[0].BaseMask = item.BasePermissions;
  2025. bulkUpdate.ItemData[0].CreationDate = item.CreationDate;
  2026. bulkUpdate.ItemData[0].Description = LLUtil.StringToPacketBytes(item.Description);
  2027. bulkUpdate.ItemData[0].EveryoneMask = item.EveryOnePermissions;
  2028. bulkUpdate.ItemData[0].FolderID = item.Folder;
  2029. bulkUpdate.ItemData[0].InvType = (sbyte)item.InvType;
  2030. bulkUpdate.ItemData[0].Name = LLUtil.StringToPacketBytes(item.Name);
  2031. bulkUpdate.ItemData[0].NextOwnerMask = item.NextPermissions;
  2032. bulkUpdate.ItemData[0].OwnerID = item.Owner;
  2033. bulkUpdate.ItemData[0].OwnerMask = item.CurrentPermissions;
  2034. bulkUpdate.ItemData[0].Type = (sbyte)item.AssetType;
  2035. bulkUpdate.ItemData[0].GroupID = item.GroupID;
  2036. bulkUpdate.ItemData[0].GroupOwned = item.GroupOwned;
  2037. bulkUpdate.ItemData[0].GroupMask = item.GroupPermissions;
  2038. bulkUpdate.ItemData[0].Flags = item.Flags;
  2039. bulkUpdate.ItemData[0].SalePrice = item.SalePrice;
  2040. bulkUpdate.ItemData[0].SaleType = item.SaleType;
  2041. bulkUpdate.ItemData[0].CRC =
  2042. Helpers.InventoryCRC(1000, 0, bulkUpdate.ItemData[0].InvType,
  2043. bulkUpdate.ItemData[0].Type, bulkUpdate.ItemData[0].AssetID,
  2044. bulkUpdate.ItemData[0].GroupID, 100,
  2045. bulkUpdate.ItemData[0].OwnerID, bulkUpdate.ItemData[0].CreatorID,
  2046. bulkUpdate.ItemData[0].ItemID, bulkUpdate.ItemData[0].FolderID,
  2047. FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS,
  2048. FULL_MASK_PERMISSIONS);
  2049. bulkUpdate.Header.Zerocoded = true;
  2050. OutPacket(bulkUpdate, ThrottleOutPacketType.Asset);
  2051. }
  2052. /// <see>IClientAPI.SendInventoryItemCreateUpdate(InventoryItemBase)</see>
  2053. public void SendInventoryItemCreateUpdate(InventoryItemBase Item, uint callbackId)
  2054. {
  2055. const uint FULL_MASK_PERMISSIONS = (uint)PermissionMask.All;
  2056. UpdateCreateInventoryItemPacket InventoryReply
  2057. = (UpdateCreateInventoryItemPacket)PacketPool.Instance.GetPacket(
  2058. PacketType.UpdateCreateInventoryItem);
  2059. // TODO: don't create new blocks if recycling an old packet
  2060. InventoryReply.AgentData.AgentID = AgentId;
  2061. InventoryReply.AgentData.SimApproved = true;
  2062. InventoryReply.InventoryData = new UpdateCreateInventoryItemPacket.InventoryDataBlock[1];
  2063. InventoryReply.InventoryData[0] = new UpdateCreateInventoryItemPacket.InventoryDataBlock();
  2064. InventoryReply.InventoryData[0].ItemID = Item.ID;
  2065. InventoryReply.InventoryData[0].AssetID = Item.AssetID;
  2066. InventoryReply.InventoryData[0].CreatorID = Item.CreatorIdAsUuid;
  2067. InventoryReply.InventoryData[0].BaseMask = Item.BasePermissions;
  2068. InventoryReply.InventoryData[0].Description = LLUtil.StringToPacketBytes(Item.Description);
  2069. InventoryReply.InventoryData[0].EveryoneMask = Item.EveryOnePermissions;
  2070. InventoryReply.InventoryData[0].FolderID = Item.Folder;
  2071. InventoryReply.InventoryData[0].InvType = (sbyte)Item.InvType;
  2072. InventoryReply.InventoryData[0].Name = LLUtil.StringToPacketBytes(Item.Name);
  2073. InventoryReply.InventoryData[0].NextOwnerMask = Item.NextPermissions;
  2074. InventoryReply.InventoryData[0].OwnerID = Item.Owner;
  2075. InventoryReply.InventoryData[0].OwnerMask = Item.CurrentPermissions;
  2076. InventoryReply.InventoryData[0].Type = (sbyte)Item.AssetType;
  2077. InventoryReply.InventoryData[0].CallbackID = callbackId;
  2078. InventoryReply.InventoryData[0].GroupID = Item.GroupID;
  2079. InventoryReply.InventoryData[0].GroupOwned = Item.GroupOwned;
  2080. InventoryReply.InventoryData[0].GroupMask = Item.GroupPermissions;
  2081. InventoryReply.InventoryData[0].Flags = Item.Flags;
  2082. InventoryReply.InventoryData[0].SalePrice = Item.SalePrice;
  2083. InventoryReply.InventoryData[0].SaleType = Item.SaleType;
  2084. InventoryReply.InventoryData[0].CreationDate = Item.CreationDate;
  2085. InventoryReply.InventoryData[0].CRC =
  2086. Helpers.InventoryCRC(1000, 0, InventoryReply.InventoryData[0].InvType,
  2087. InventoryReply.InventoryData[0].Type, InventoryReply.InventoryData[0].AssetID,
  2088. InventoryReply.InventoryData[0].GroupID, 100,
  2089. InventoryReply.InventoryData[0].OwnerID, InventoryReply.InventoryData[0].CreatorID,
  2090. InventoryReply.InventoryData[0].ItemID, InventoryReply.InventoryData[0].FolderID,
  2091. FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS,
  2092. FULL_MASK_PERMISSIONS);
  2093. InventoryReply.Header.Zerocoded = true;
  2094. OutPacket(InventoryReply, ThrottleOutPacketType.Asset);
  2095. }
  2096. public void SendRemoveInventoryItem(UUID itemID)
  2097. {
  2098. RemoveInventoryItemPacket remove = (RemoveInventoryItemPacket)PacketPool.Instance.GetPacket(PacketType.RemoveInventoryItem);
  2099. // TODO: don't create new blocks if recycling an old packet
  2100. remove.AgentData.AgentID = AgentId;
  2101. remove.AgentData.SessionID = m_sessionId;
  2102. remove.InventoryData = new RemoveInventoryItemPacket.InventoryDataBlock[1];
  2103. remove.InventoryData[0] = new RemoveInventoryItemPacket.InventoryDataBlock();
  2104. remove.InventoryData[0].ItemID = itemID;
  2105. remove.Header.Zerocoded = true;
  2106. OutPacket(remove, ThrottleOutPacketType.Asset);
  2107. }
  2108. public void SendTakeControls(int controls, bool passToAgent, bool TakeControls)
  2109. {
  2110. ScriptControlChangePacket scriptcontrol = (ScriptControlChangePacket)PacketPool.Instance.GetPacket(PacketType.ScriptControlChange);
  2111. ScriptControlChangePacket.DataBlock[] data = new ScriptControlChangePacket.DataBlock[1];
  2112. ScriptControlChangePacket.DataBlock ddata = new ScriptControlChangePacket.DataBlock();
  2113. ddata.Controls = (uint)controls;
  2114. ddata.PassToAgent = passToAgent;
  2115. ddata.TakeControls = TakeControls;
  2116. data[0] = ddata;
  2117. scriptcontrol.Data = data;
  2118. OutPacket(scriptcontrol, ThrottleOutPacketType.Task);
  2119. }
  2120. public void SendTaskInventory(UUID taskID, short serial, byte[] fileName)
  2121. {
  2122. ReplyTaskInventoryPacket replytask = (ReplyTaskInventoryPacket)PacketPool.Instance.GetPacket(PacketType.ReplyTaskInventory);
  2123. replytask.InventoryData.TaskID = taskID;
  2124. replytask.InventoryData.Serial = serial;
  2125. replytask.InventoryData.Filename = fileName;
  2126. OutPacket(replytask, ThrottleOutPacketType.Asset);
  2127. }
  2128. public void SendXferPacket(ulong xferID, uint packet, byte[] data)
  2129. {
  2130. SendXferPacketPacket sendXfer = (SendXferPacketPacket)PacketPool.Instance.GetPacket(PacketType.SendXferPacket);
  2131. sendXfer.XferID.ID = xferID;
  2132. sendXfer.XferID.Packet = packet;
  2133. sendXfer.DataPacket.Data = data;
  2134. OutPacket(sendXfer, ThrottleOutPacketType.Task);
  2135. }
  2136. public void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit,
  2137. int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor,
  2138. int PriceParcelClaim, float PriceParcelClaimFactor, int PriceParcelRent, int PricePublicObjectDecay,
  2139. int PricePublicObjectDelete, int PriceRentLight, int PriceUpload, int TeleportMinPrice, float TeleportPriceExponent)
  2140. {
  2141. EconomyDataPacket economyData = (EconomyDataPacket)PacketPool.Instance.GetPacket(PacketType.EconomyData);
  2142. economyData.Info.EnergyEfficiency = EnergyEfficiency;
  2143. economyData.Info.ObjectCapacity = ObjectCapacity;
  2144. economyData.Info.ObjectCount = ObjectCount;
  2145. economyData.Info.PriceEnergyUnit = PriceEnergyUnit;
  2146. economyData.Info.PriceGroupCreate = PriceGroupCreate;
  2147. economyData.Info.PriceObjectClaim = PriceObjectClaim;
  2148. economyData.Info.PriceObjectRent = PriceObjectRent;
  2149. economyData.Info.PriceObjectScaleFactor = PriceObjectScaleFactor;
  2150. economyData.Info.PriceParcelClaim = PriceParcelClaim;
  2151. economyData.Info.PriceParcelClaimFactor = PriceParcelClaimFactor;
  2152. economyData.Info.PriceParcelRent = PriceParcelRent;
  2153. economyData.Info.PricePublicObjectDecay = PricePublicObjectDecay;
  2154. economyData.Info.PricePublicObjectDelete = PricePublicObjectDelete;
  2155. economyData.Info.PriceRentLight = PriceRentLight;
  2156. economyData.Info.PriceUpload = PriceUpload;
  2157. economyData.Info.TeleportMinPrice = TeleportMinPrice;
  2158. economyData.Info.TeleportPriceExponent = TeleportPriceExponent;
  2159. economyData.Header.Reliable = true;
  2160. OutPacket(economyData, ThrottleOutPacketType.Unknown);
  2161. }
  2162. public void SendAvatarPickerReply(AvatarPickerReplyAgentDataArgs AgentData, List<AvatarPickerReplyDataArgs> Data)
  2163. {
  2164. //construct the AvatarPickerReply packet.
  2165. AvatarPickerReplyPacket replyPacket = new AvatarPickerReplyPacket();
  2166. replyPacket.AgentData.AgentID = AgentData.AgentID;
  2167. replyPacket.AgentData.QueryID = AgentData.QueryID;
  2168. //int i = 0;
  2169. List<AvatarPickerReplyPacket.DataBlock> data_block = new List<AvatarPickerReplyPacket.DataBlock>();
  2170. foreach (AvatarPickerReplyDataArgs arg in Data)
  2171. {
  2172. AvatarPickerReplyPacket.DataBlock db = new AvatarPickerReplyPacket.DataBlock();
  2173. db.AvatarID = arg.AvatarID;
  2174. db.FirstName = arg.FirstName;
  2175. db.LastName = arg.LastName;
  2176. data_block.Add(db);
  2177. }
  2178. replyPacket.Data = data_block.ToArray();
  2179. OutPacket(replyPacket, ThrottleOutPacketType.Task);
  2180. }
  2181. public void SendAgentDataUpdate(UUID agentid, UUID activegroupid, string firstname, string lastname, ulong grouppowers, string groupname, string grouptitle)
  2182. {
  2183. m_activeGroupID = activegroupid;
  2184. m_activeGroupName = groupname;
  2185. m_activeGroupPowers = grouppowers;
  2186. AgentDataUpdatePacket sendAgentDataUpdate = (AgentDataUpdatePacket)PacketPool.Instance.GetPacket(PacketType.AgentDataUpdate);
  2187. sendAgentDataUpdate.AgentData.ActiveGroupID = activegroupid;
  2188. sendAgentDataUpdate.AgentData.AgentID = agentid;
  2189. sendAgentDataUpdate.AgentData.FirstName = Utils.StringToBytes(firstname);
  2190. sendAgentDataUpdate.AgentData.GroupName = Utils.StringToBytes(groupname);
  2191. sendAgentDataUpdate.AgentData.GroupPowers = grouppowers;
  2192. sendAgentDataUpdate.AgentData.GroupTitle = Utils.StringToBytes(grouptitle);
  2193. sendAgentDataUpdate.AgentData.LastName = Utils.StringToBytes(lastname);
  2194. OutPacket(sendAgentDataUpdate, ThrottleOutPacketType.Task);
  2195. }
  2196. /// <summary>
  2197. /// Send an alert message to the client. On the Linden client (tested 1.19.1.4), this pops up a brief duration
  2198. /// blue information box in the bottom right hand corner.
  2199. /// </summary>
  2200. /// <param name="message"></param>
  2201. public void SendAlertMessage(string message)
  2202. {
  2203. AlertMessagePacket alertPack = (AlertMessagePacket)PacketPool.Instance.GetPacket(PacketType.AlertMessage);
  2204. alertPack.AlertData = new AlertMessagePacket.AlertDataBlock();
  2205. alertPack.AlertData.Message = Utils.StringToBytes(message);
  2206. alertPack.AlertInfo = new AlertMessagePacket.AlertInfoBlock[0];
  2207. OutPacket(alertPack, ThrottleOutPacketType.Task);
  2208. }
  2209. /// <summary>
  2210. /// Send an agent alert message to the client.
  2211. /// </summary>
  2212. /// <param name="message"></param>
  2213. /// <param name="modal">On the linden client, if this true then it displays a one button text box placed in the
  2214. /// middle of the window. If false, the message is displayed in a brief duration blue information box (as for
  2215. /// the AlertMessage packet).</param>
  2216. public void SendAgentAlertMessage(string message, bool modal)
  2217. {
  2218. OutPacket(BuildAgentAlertPacket(message, modal), ThrottleOutPacketType.Task);
  2219. }
  2220. /// <summary>
  2221. /// Construct an agent alert packet
  2222. /// </summary>
  2223. /// <param name="message"></param>
  2224. /// <param name="modal"></param>
  2225. /// <returns></returns>
  2226. protected AgentAlertMessagePacket BuildAgentAlertPacket(string message, bool modal)
  2227. {
  2228. AgentAlertMessagePacket alertPack = (AgentAlertMessagePacket)PacketPool.Instance.GetPacket(PacketType.AgentAlertMessage);
  2229. alertPack.AgentData.AgentID = AgentId;
  2230. alertPack.AlertData.Message = Utils.StringToBytes(message);
  2231. alertPack.AlertData.Modal = modal;
  2232. return alertPack;
  2233. }
  2234. public void SendLoadURL(string objectname, UUID objectID, UUID ownerID, bool groupOwned, string message,
  2235. string url)
  2236. {
  2237. LoadURLPacket loadURL = (LoadURLPacket)PacketPool.Instance.GetPacket(PacketType.LoadURL);
  2238. loadURL.Data.ObjectName = Utils.StringToBytes(objectname);
  2239. loadURL.Data.ObjectID = objectID;
  2240. loadURL.Data.OwnerID = ownerID;
  2241. loadURL.Data.OwnerIsGroup = groupOwned;
  2242. loadURL.Data.Message = Utils.StringToBytes(message);
  2243. loadURL.Data.URL = Utils.StringToBytes(url);
  2244. OutPacket(loadURL, ThrottleOutPacketType.Task);
  2245. }
  2246. public void SendDialog(string objectname, UUID objectID, string ownerFirstName, string ownerLastName, string msg, UUID textureID, int ch, string[] buttonlabels)
  2247. {
  2248. ScriptDialogPacket dialog = (ScriptDialogPacket)PacketPool.Instance.GetPacket(PacketType.ScriptDialog);
  2249. dialog.Data.ObjectID = objectID;
  2250. dialog.Data.ObjectName = Utils.StringToBytes(objectname);
  2251. // this is the username of the *owner*
  2252. dialog.Data.FirstName = Utils.StringToBytes(ownerFirstName);
  2253. dialog.Data.LastName = Utils.StringToBytes(ownerLastName);
  2254. dialog.Data.Message = Utils.StringToBytes(msg);
  2255. dialog.Data.ImageID = textureID;
  2256. dialog.Data.ChatChannel = ch;
  2257. ScriptDialogPacket.ButtonsBlock[] buttons = new ScriptDialogPacket.ButtonsBlock[buttonlabels.Length];
  2258. for (int i = 0; i < buttonlabels.Length; i++)
  2259. {
  2260. buttons[i] = new ScriptDialogPacket.ButtonsBlock();
  2261. buttons[i].ButtonLabel = Utils.StringToBytes(buttonlabels[i]);
  2262. }
  2263. dialog.Buttons = buttons;
  2264. OutPacket(dialog, ThrottleOutPacketType.Task);
  2265. }
  2266. public void SendPreLoadSound(UUID objectID, UUID ownerID, UUID soundID)
  2267. {
  2268. PreloadSoundPacket preSound = (PreloadSoundPacket)PacketPool.Instance.GetPacket(PacketType.PreloadSound);
  2269. // TODO: don't create new blocks if recycling an old packet
  2270. preSound.DataBlock = new PreloadSoundPacket.DataBlockBlock[1];
  2271. preSound.DataBlock[0] = new PreloadSoundPacket.DataBlockBlock();
  2272. preSound.DataBlock[0].ObjectID = objectID;
  2273. preSound.DataBlock[0].OwnerID = ownerID;
  2274. preSound.DataBlock[0].SoundID = soundID;
  2275. preSound.Header.Zerocoded = true;
  2276. OutPacket(preSound, ThrottleOutPacketType.Task);
  2277. }
  2278. public void SendPlayAttachedSound(UUID soundID, UUID objectID, UUID ownerID, float gain, byte flags)
  2279. {
  2280. AttachedSoundPacket sound = (AttachedSoundPacket)PacketPool.Instance.GetPacket(PacketType.AttachedSound);
  2281. sound.DataBlock.SoundID = soundID;
  2282. sound.DataBlock.ObjectID = objectID;
  2283. sound.DataBlock.OwnerID = ownerID;
  2284. sound.DataBlock.Gain = gain;
  2285. sound.DataBlock.Flags = flags;
  2286. OutPacket(sound, ThrottleOutPacketType.Task);
  2287. }
  2288. public void SendTriggeredSound(UUID soundID, UUID ownerID, UUID objectID, UUID parentID, ulong handle, Vector3 position, float gain)
  2289. {
  2290. SoundTriggerPacket sound = (SoundTriggerPacket)PacketPool.Instance.GetPacket(PacketType.SoundTrigger);
  2291. sound.SoundData.SoundID = soundID;
  2292. sound.SoundData.OwnerID = ownerID;
  2293. sound.SoundData.ObjectID = objectID;
  2294. sound.SoundData.ParentID = parentID;
  2295. sound.SoundData.Handle = handle;
  2296. sound.SoundData.Position = position;
  2297. sound.SoundData.Gain = gain;
  2298. OutPacket(sound, ThrottleOutPacketType.Task);
  2299. }
  2300. public void SendAttachedSoundGainChange(UUID objectID, float gain)
  2301. {
  2302. AttachedSoundGainChangePacket sound = (AttachedSoundGainChangePacket)PacketPool.Instance.GetPacket(PacketType.AttachedSoundGainChange);
  2303. sound.DataBlock.ObjectID = objectID;
  2304. sound.DataBlock.Gain = gain;
  2305. OutPacket(sound, ThrottleOutPacketType.Task);
  2306. }
  2307. public void SendSunPos(Vector3 Position, Vector3 Velocity, ulong CurrentTime, uint SecondsPerSunCycle, uint SecondsPerYear, float OrbitalPosition)
  2308. {
  2309. // Viewers based on the Linden viwer code, do wacky things for oribital positions from Midnight to Sunrise
  2310. // So adjust for that
  2311. // Contributed by: Godfrey
  2312. if (OrbitalPosition > m_sunPainDaHalfOrbitalCutoff) // things get weird from midnight to sunrise
  2313. {
  2314. OrbitalPosition = (OrbitalPosition - m_sunPainDaHalfOrbitalCutoff) * 0.6666666667f + m_sunPainDaHalfOrbitalCutoff;
  2315. }
  2316. SimulatorViewerTimeMessagePacket viewertime = (SimulatorViewerTimeMessagePacket)PacketPool.Instance.GetPacket(PacketType.SimulatorViewerTimeMessage);
  2317. viewertime.TimeInfo.SunDirection = Position;
  2318. viewertime.TimeInfo.SunAngVelocity = Velocity;
  2319. // Sun module used to add 6 hours to adjust for linden sun hour, adding here
  2320. // to prevent existing code from breaking if it assumed that 6 hours were included.
  2321. // 21600 == 6 hours * 60 minutes * 60 Seconds
  2322. viewertime.TimeInfo.UsecSinceStart = CurrentTime + 21600;
  2323. viewertime.TimeInfo.SecPerDay = SecondsPerSunCycle;
  2324. viewertime.TimeInfo.SecPerYear = SecondsPerYear;
  2325. viewertime.TimeInfo.SunPhase = OrbitalPosition;
  2326. viewertime.Header.Reliable = false;
  2327. viewertime.Header.Zerocoded = true;
  2328. OutPacket(viewertime, ThrottleOutPacketType.Task);
  2329. }
  2330. // Currently Deprecated
  2331. public void SendViewerTime(int phase)
  2332. {
  2333. /*
  2334. Console.WriteLine("SunPhase: {0}", phase);
  2335. SimulatorViewerTimeMessagePacket viewertime = (SimulatorViewerTimeMessagePacket)PacketPool.Instance.GetPacket(PacketType.SimulatorViewerTimeMessage);
  2336. //viewertime.TimeInfo.SecPerDay = 86400;
  2337. //viewertime.TimeInfo.SecPerYear = 31536000;
  2338. viewertime.TimeInfo.SecPerDay = 1000;
  2339. viewertime.TimeInfo.SecPerYear = 365000;
  2340. viewertime.TimeInfo.SunPhase = 1;
  2341. int sunPhase = (phase + 2) / 2;
  2342. if ((sunPhase < 6) || (sunPhase > 36))
  2343. {
  2344. viewertime.TimeInfo.SunDirection = new Vector3(0f, 0.8f, -0.8f);
  2345. Console.WriteLine("sending night");
  2346. }
  2347. else
  2348. {
  2349. if (sunPhase < 12)
  2350. {
  2351. sunPhase = 12;
  2352. }
  2353. sunPhase = sunPhase - 12;
  2354. float yValue = 0.1f * (sunPhase);
  2355. Console.WriteLine("Computed SunPhase: {0}, yValue: {1}", sunPhase, yValue);
  2356. if (yValue > 1.2f)
  2357. {
  2358. yValue = yValue - 1.2f;
  2359. }
  2360. yValue = Util.Clip(yValue, 0, 1);
  2361. if (sunPhase < 14)
  2362. {
  2363. yValue = 1 - yValue;
  2364. }
  2365. if (sunPhase < 12)
  2366. {
  2367. yValue *= -1;
  2368. }
  2369. viewertime.TimeInfo.SunDirection = new Vector3(0f, yValue, 0.3f);
  2370. Console.WriteLine("sending sun update " + yValue);
  2371. }
  2372. viewertime.TimeInfo.SunAngVelocity = new Vector3(0, 0.0f, 10.0f);
  2373. viewertime.TimeInfo.UsecSinceStart = (ulong)Util.UnixTimeSinceEpoch();
  2374. viewertime.Header.Reliable = false;
  2375. OutPacket(viewertime, ThrottleOutPacketType.Task);
  2376. */
  2377. }
  2378. public void SendViewerEffect(ViewerEffectPacket.EffectBlock[] effectBlocks)
  2379. {
  2380. ViewerEffectPacket packet = (ViewerEffectPacket)PacketPool.Instance.GetPacket(PacketType.ViewerEffect);
  2381. packet.Effect = effectBlocks;
  2382. packet.AgentData.AgentID = AgentId;
  2383. packet.AgentData.SessionID = SessionId;
  2384. packet.Header.Reliable = false;
  2385. packet.Header.Zerocoded = true;
  2386. OutPacket(packet, ThrottleOutPacketType.Task);
  2387. }
  2388. public void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, Byte[] charterMember,
  2389. string flAbout, uint flags, UUID flImageID, UUID imageID, string profileURL,
  2390. UUID partnerID)
  2391. {
  2392. AvatarPropertiesReplyPacket avatarReply = (AvatarPropertiesReplyPacket)PacketPool.Instance.GetPacket(PacketType.AvatarPropertiesReply);
  2393. avatarReply.AgentData.AgentID = AgentId;
  2394. avatarReply.AgentData.AvatarID = avatarID;
  2395. if (aboutText != null)
  2396. avatarReply.PropertiesData.AboutText = Utils.StringToBytes(aboutText);
  2397. else
  2398. avatarReply.PropertiesData.AboutText = Utils.StringToBytes("");
  2399. avatarReply.PropertiesData.BornOn = Utils.StringToBytes(bornOn);
  2400. avatarReply.PropertiesData.CharterMember = charterMember;
  2401. if (flAbout != null)
  2402. avatarReply.PropertiesData.FLAboutText = Utils.StringToBytes(flAbout);
  2403. else
  2404. avatarReply.PropertiesData.FLAboutText = Utils.StringToBytes("");
  2405. avatarReply.PropertiesData.Flags = flags;
  2406. avatarReply.PropertiesData.FLImageID = flImageID;
  2407. avatarReply.PropertiesData.ImageID = imageID;
  2408. avatarReply.PropertiesData.ProfileURL = Utils.StringToBytes(profileURL);
  2409. avatarReply.PropertiesData.PartnerID = partnerID;
  2410. OutPacket(avatarReply, ThrottleOutPacketType.Task);
  2411. }
  2412. #endregion
  2413. // Gesture
  2414. #region Appearance/ Wearables Methods
  2415. public void SendWearables(AvatarWearable[] wearables, int serial)
  2416. {
  2417. AgentWearablesUpdatePacket aw = (AgentWearablesUpdatePacket)PacketPool.Instance.GetPacket(PacketType.AgentWearablesUpdate);
  2418. aw.AgentData.AgentID = AgentId;
  2419. aw.AgentData.SerialNum = (uint)serial;
  2420. aw.AgentData.SessionID = m_sessionId;
  2421. // TODO: don't create new blocks if recycling an old packet
  2422. aw.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[13];
  2423. AgentWearablesUpdatePacket.WearableDataBlock awb;
  2424. for (int i = 0; i < wearables.Length; i++)
  2425. {
  2426. awb = new AgentWearablesUpdatePacket.WearableDataBlock();
  2427. awb.WearableType = (byte)i;
  2428. awb.AssetID = wearables[i].AssetID;
  2429. awb.ItemID = wearables[i].ItemID;
  2430. aw.WearableData[i] = awb;
  2431. // m_log.DebugFormat(
  2432. // "[APPEARANCE]: Sending wearable item/asset {0} {1} (index {2}) for {3}",
  2433. // awb.ItemID, awb.AssetID, i, Name);
  2434. }
  2435. OutPacket(aw, ThrottleOutPacketType.Task);
  2436. }
  2437. public void SendAppearance(UUID agentID, byte[] visualParams, byte[] textureEntry)
  2438. {
  2439. AvatarAppearancePacket avp = (AvatarAppearancePacket)PacketPool.Instance.GetPacket(PacketType.AvatarAppearance);
  2440. // TODO: don't create new blocks if recycling an old packet
  2441. avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218];
  2442. avp.ObjectData.TextureEntry = textureEntry;
  2443. AvatarAppearancePacket.VisualParamBlock avblock = null;
  2444. for (int i = 0; i < visualParams.Length; i++)
  2445. {
  2446. avblock = new AvatarAppearancePacket.VisualParamBlock();
  2447. avblock.ParamValue = visualParams[i];
  2448. avp.VisualParam[i] = avblock;
  2449. }
  2450. avp.Sender.IsTrial = false;
  2451. avp.Sender.ID = agentID;
  2452. OutPacket(avp, ThrottleOutPacketType.Task);
  2453. }
  2454. public void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId, UUID[] objectIDs)
  2455. {
  2456. //m_log.DebugFormat("[CLIENT]: Sending animations to {0}", Name);
  2457. AvatarAnimationPacket ani = (AvatarAnimationPacket)PacketPool.Instance.GetPacket(PacketType.AvatarAnimation);
  2458. // TODO: don't create new blocks if recycling an old packet
  2459. ani.AnimationSourceList = new AvatarAnimationPacket.AnimationSourceListBlock[animations.Length];
  2460. ani.Sender = new AvatarAnimationPacket.SenderBlock();
  2461. ani.Sender.ID = sourceAgentId;
  2462. ani.AnimationList = new AvatarAnimationPacket.AnimationListBlock[animations.Length];
  2463. ani.PhysicalAvatarEventList = new AvatarAnimationPacket.PhysicalAvatarEventListBlock[0];
  2464. for (int i = 0; i < animations.Length; ++i)
  2465. {
  2466. ani.AnimationList[i] = new AvatarAnimationPacket.AnimationListBlock();
  2467. ani.AnimationList[i].AnimID = animations[i];
  2468. ani.AnimationList[i].AnimSequenceID = seqs[i];
  2469. ani.AnimationSourceList[i] = new AvatarAnimationPacket.AnimationSourceListBlock();
  2470. ani.AnimationSourceList[i].ObjectID = objectIDs[i];
  2471. if (objectIDs[i] == UUID.Zero)
  2472. ani.AnimationSourceList[i].ObjectID = sourceAgentId;
  2473. }
  2474. ani.Header.Reliable = false;
  2475. OutPacket(ani, ThrottleOutPacketType.Task);
  2476. }
  2477. #endregion
  2478. #region Avatar Packet/data sending Methods
  2479. /// <summary>
  2480. /// send a objectupdate packet with information about the clients avatar
  2481. /// </summary>
  2482. public void SendAvatarData(ulong regionHandle, string firstName, string lastName, string grouptitle, UUID avatarID,
  2483. uint avatarLocalID, Vector3 Pos, byte[] textureEntry, uint parentID, Quaternion rotation)
  2484. {
  2485. ObjectUpdatePacket objupdate = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
  2486. // TODO: don't create new blocks if recycling an old packet
  2487. objupdate.RegionData.RegionHandle = regionHandle;
  2488. objupdate.RegionData.TimeDilation = ushort.MaxValue;
  2489. objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
  2490. objupdate.ObjectData[0] = CreateDefaultAvatarPacket(textureEntry);
  2491. //give this avatar object a local id and assign the user a name
  2492. objupdate.ObjectData[0].ID = avatarLocalID;
  2493. objupdate.ObjectData[0].FullID = avatarID;
  2494. objupdate.ObjectData[0].ParentID = parentID;
  2495. objupdate.ObjectData[0].NameValue =
  2496. Utils.StringToBytes("FirstName STRING RW SV " + firstName + "\nLastName STRING RW SV " + lastName + "\nTitle STRING RW SV " + grouptitle);
  2497. Vector3 pos2 = new Vector3(Pos.X, Pos.Y, Pos.Z);
  2498. byte[] pb = pos2.GetBytes();
  2499. Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length);
  2500. byte[] rot = rotation.GetBytes();
  2501. Array.Copy(rot, 0, objupdate.ObjectData[0].ObjectData, 52, rot.Length);
  2502. objupdate.Header.Zerocoded = true;
  2503. OutPacket(objupdate, ThrottleOutPacketType.Task);
  2504. }
  2505. /// <summary>
  2506. /// Send a terse positional/rotation/velocity update about an avatar
  2507. /// to the client. This avatar can be that of the client itself.
  2508. /// </summary>
  2509. public virtual void SendAvatarTerseUpdate(ulong regionHandle,
  2510. ushort timeDilation, uint localID, Vector3 position,
  2511. Vector3 velocity, Quaternion rotation, UUID agentid)
  2512. {
  2513. if (rotation.X == rotation.Y &&
  2514. rotation.Y == rotation.Z &&
  2515. rotation.Z == rotation.W && rotation.W == 0)
  2516. rotation = Quaternion.Identity;
  2517. ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock =
  2518. CreateAvatarImprovedBlock(localID, position, velocity,rotation);
  2519. lock (m_avatarTerseUpdates)
  2520. {
  2521. m_avatarTerseUpdates.Add(terseBlock);
  2522. // If packet is full or own movement packet, send it.
  2523. if (m_avatarTerseUpdates.Count >= m_avatarTerseUpdatesPerPacket)
  2524. {
  2525. ProcessAvatarTerseUpdates(this, null);
  2526. }
  2527. else if (m_avatarTerseUpdates.Count == 1)
  2528. {
  2529. lock (m_avatarTerseUpdateTimer)
  2530. m_avatarTerseUpdateTimer.Start();
  2531. }
  2532. }
  2533. }
  2534. private void ProcessAvatarTerseUpdates(object sender, ElapsedEventArgs e)
  2535. {
  2536. lock (m_avatarTerseUpdates)
  2537. {
  2538. ImprovedTerseObjectUpdatePacket terse = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate);
  2539. terse.RegionData = new ImprovedTerseObjectUpdatePacket.RegionDataBlock();
  2540. terse.RegionData.RegionHandle = Scene.RegionInfo.RegionHandle;
  2541. terse.RegionData.TimeDilation =
  2542. (ushort)(Scene.TimeDilation * ushort.MaxValue);
  2543. int max = m_avatarTerseUpdatesPerPacket;
  2544. if (max > m_avatarTerseUpdates.Count)
  2545. max = m_avatarTerseUpdates.Count;
  2546. int count = 0;
  2547. int size = 0;
  2548. byte[] zerobuffer = new byte[1024];
  2549. byte[] blockbuffer = new byte[1024];
  2550. for (count = 0 ; count < max ; count++)
  2551. {
  2552. int length = 0;
  2553. m_avatarTerseUpdates[count].ToBytes(blockbuffer, ref length);
  2554. length = Helpers.ZeroEncode(blockbuffer, length, zerobuffer);
  2555. if (size + length > m_packetMTU)
  2556. break;
  2557. size += length;
  2558. }
  2559. terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[count];
  2560. for (int i = 0 ; i < count ; i++)
  2561. {
  2562. terse.ObjectData[i] = m_avatarTerseUpdates[0];
  2563. m_avatarTerseUpdates.RemoveAt(0);
  2564. }
  2565. terse.Header.Reliable = false;
  2566. terse.Header.Zerocoded = true;
  2567. OutPacket(terse, ThrottleOutPacketType.Task);
  2568. if (m_avatarTerseUpdates.Count == 0)
  2569. {
  2570. lock (m_avatarTerseUpdateTimer)
  2571. m_avatarTerseUpdateTimer.Stop();
  2572. }
  2573. }
  2574. }
  2575. public void SendCoarseLocationUpdate(List<UUID> users, List<Vector3> CoarseLocations)
  2576. {
  2577. if (!IsActive) return; // We don't need to update inactive clients.
  2578. CoarseLocationUpdatePacket loc = (CoarseLocationUpdatePacket)PacketPool.Instance.GetPacket(PacketType.CoarseLocationUpdate);
  2579. // TODO: don't create new blocks if recycling an old packet
  2580. int total = CoarseLocations.Count;
  2581. CoarseLocationUpdatePacket.IndexBlock ib =
  2582. new CoarseLocationUpdatePacket.IndexBlock();
  2583. loc.Location = new CoarseLocationUpdatePacket.LocationBlock[total];
  2584. loc.AgentData = new CoarseLocationUpdatePacket.AgentDataBlock[total];
  2585. for (int i = 0; i < total; i++)
  2586. {
  2587. CoarseLocationUpdatePacket.LocationBlock lb =
  2588. new CoarseLocationUpdatePacket.LocationBlock();
  2589. lb.X = (byte)CoarseLocations[i].X;
  2590. lb.Y = (byte)CoarseLocations[i].Y;
  2591. lb.Z = CoarseLocations[i].Z > 1024 ? (byte)0 : (byte)(CoarseLocations[i].Z * 0.25);
  2592. loc.Location[i] = lb;
  2593. loc.AgentData[i] = new CoarseLocationUpdatePacket.AgentDataBlock();
  2594. loc.AgentData[i].AgentID = users[i];
  2595. }
  2596. ib.You = -1;
  2597. ib.Prey = -1;
  2598. loc.Index = ib;
  2599. loc.Header.Reliable = false;
  2600. loc.Header.Zerocoded = true;
  2601. OutPacket(loc, ThrottleOutPacketType.Task);
  2602. }
  2603. #endregion
  2604. #region Primitive Packet/data Sending Methods
  2605. /// <summary>
  2606. ///
  2607. /// </summary>
  2608. /// <param name="localID"></param>
  2609. /// <param name="rotation"></param>
  2610. /// <param name="attachPoint"></param>
  2611. public void AttachObject(uint localID, Quaternion rotation, byte attachPoint, UUID ownerID)
  2612. {
  2613. if (attachPoint > 30 && ownerID != AgentId) // Someone else's HUD
  2614. return;
  2615. ObjectAttachPacket attach = (ObjectAttachPacket)PacketPool.Instance.GetPacket(PacketType.ObjectAttach);
  2616. // TODO: don't create new blocks if recycling an old packet
  2617. attach.AgentData.AgentID = AgentId;
  2618. attach.AgentData.SessionID = m_sessionId;
  2619. attach.AgentData.AttachmentPoint = attachPoint;
  2620. attach.ObjectData = new ObjectAttachPacket.ObjectDataBlock[1];
  2621. attach.ObjectData[0] = new ObjectAttachPacket.ObjectDataBlock();
  2622. attach.ObjectData[0].ObjectLocalID = localID;
  2623. attach.ObjectData[0].Rotation = rotation;
  2624. attach.Header.Zerocoded = true;
  2625. OutPacket(attach, ThrottleOutPacketType.Task);
  2626. }
  2627. public void SendPrimitiveToClient(
  2628. ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape,
  2629. Vector3 pos, Vector3 vel, Vector3 acc, Quaternion rotation, Vector3 rvel,
  2630. uint flags, UUID objectID, UUID ownerID, string text, byte[] color,
  2631. uint parentID, byte[] particleSystem, byte clickAction, byte material)
  2632. {
  2633. byte[] textureanim = new byte[0];
  2634. SendPrimitiveToClient(regionHandle, timeDilation, localID, primShape, pos, vel,
  2635. acc, rotation, rvel, flags,
  2636. objectID, ownerID, text, color, parentID, particleSystem,
  2637. clickAction, material, textureanim, false, 0, UUID.Zero, UUID.Zero, 0, 0, 0);
  2638. }
  2639. public void SendPrimitiveToClient(
  2640. ulong regionHandle, ushort timeDilation, uint localID, PrimitiveBaseShape primShape,
  2641. Vector3 pos, Vector3 velocity, Vector3 acceleration, Quaternion rotation, Vector3 rotational_velocity,
  2642. uint flags,
  2643. UUID objectID, UUID ownerID, string text, byte[] color, uint parentID, byte[] particleSystem,
  2644. byte clickAction, byte material, byte[] textureanim, bool attachment, uint AttachPoint, UUID AssetId, UUID SoundId, double SoundGain, byte SoundFlags, double SoundRadius)
  2645. {
  2646. if (AttachPoint > 30 && ownerID != AgentId) // Someone else's HUD
  2647. return;
  2648. if (primShape.PCode == 9 && primShape.State != 0 && parentID == 0)
  2649. return;
  2650. if (rotation.X == rotation.Y && rotation.Y == rotation.Z && rotation.Z == rotation.W && rotation.W == 0)
  2651. rotation = Quaternion.Identity;
  2652. ObjectUpdatePacket.ObjectDataBlock objectData = CreatePrimUpdateBlock(primShape, flags);
  2653. objectData.ID = localID;
  2654. objectData.FullID = objectID;
  2655. objectData.OwnerID = ownerID;
  2656. objectData.Text = LLUtil.StringToPacketBytes(text);
  2657. objectData.TextColor[0] = color[0];
  2658. objectData.TextColor[1] = color[1];
  2659. objectData.TextColor[2] = color[2];
  2660. objectData.TextColor[3] = color[3];
  2661. objectData.ParentID = parentID;
  2662. objectData.PSBlock = particleSystem;
  2663. objectData.ClickAction = clickAction;
  2664. objectData.Material = material;
  2665. objectData.Flags = 0;
  2666. if (attachment)
  2667. {
  2668. // Necessary???
  2669. objectData.JointAxisOrAnchor = new Vector3(0, 0, 2);
  2670. objectData.JointPivot = new Vector3(0, 0, 0);
  2671. // Item from inventory???
  2672. objectData.NameValue =
  2673. Utils.StringToBytes("AttachItemID STRING RW SV " + AssetId.Guid);
  2674. objectData.State = (byte)((AttachPoint % 16) * 16 + (AttachPoint / 16));
  2675. }
  2676. // Xantor 20080528: Send sound info as well
  2677. // Xantor 20080530: Zero out everything if there's no SoundId, so zerocompression will work again
  2678. objectData.Sound = SoundId;
  2679. if (SoundId == UUID.Zero)
  2680. {
  2681. objectData.OwnerID = UUID.Zero;
  2682. objectData.Gain = 0.0f;
  2683. objectData.Radius = 0.0f;
  2684. objectData.Flags = 0;
  2685. }
  2686. else
  2687. {
  2688. objectData.OwnerID = ownerID;
  2689. objectData.Gain = (float)SoundGain;
  2690. objectData.Radius = (float)SoundRadius;
  2691. objectData.Flags = SoundFlags;
  2692. }
  2693. byte[] pb = pos.GetBytes();
  2694. Array.Copy(pb, 0, objectData.ObjectData, 0, pb.Length);
  2695. byte[] vel = velocity.GetBytes();
  2696. Array.Copy(vel, 0, objectData.ObjectData, pb.Length, vel.Length);
  2697. byte[] rot = rotation.GetBytes();
  2698. Array.Copy(rot, 0, objectData.ObjectData, 36, rot.Length);
  2699. byte[] rvel = rotational_velocity.GetBytes();
  2700. Array.Copy(rvel, 0, objectData.ObjectData, 36 + rot.Length, rvel.Length);
  2701. if (textureanim.Length > 0)
  2702. {
  2703. objectData.TextureAnim = textureanim;
  2704. }
  2705. lock (m_primFullUpdates)
  2706. {
  2707. if (m_primFullUpdates.Count == 0)
  2708. m_primFullUpdateTimer.Start();
  2709. m_primFullUpdates.Add(objectData);
  2710. if (m_primFullUpdates.Count >= m_primFullUpdatesPerPacket)
  2711. ProcessPrimFullUpdates(this, null);
  2712. }
  2713. }
  2714. // Unlike the other timers, this one is only started after
  2715. // the first request is seen.
  2716. void ProcessTextureRequests(object sender, ElapsedEventArgs e)
  2717. {
  2718. if (m_imageManager != null)
  2719. {
  2720. if (m_imageManager.ProcessImageQueue(m_textureSendLimit,
  2721. m_textureDataLimit))
  2722. {
  2723. lock (m_textureRequestTimer)
  2724. m_textureRequestTimer.Start();
  2725. }
  2726. }
  2727. }
  2728. void ProcessPrimFullUpdates(object sender, ElapsedEventArgs e)
  2729. {
  2730. lock (m_primFullUpdates)
  2731. {
  2732. if (m_primFullUpdates.Count == 0 && m_primFullUpdateTimer.Enabled)
  2733. {
  2734. lock (m_primFullUpdateTimer)
  2735. m_primFullUpdateTimer.Stop();
  2736. return;
  2737. }
  2738. ObjectUpdatePacket outPacket =
  2739. (ObjectUpdatePacket)PacketPool.Instance.GetPacket(
  2740. PacketType.ObjectUpdate);
  2741. outPacket.RegionData.RegionHandle =
  2742. Scene.RegionInfo.RegionHandle;
  2743. outPacket.RegionData.TimeDilation =
  2744. (ushort)(Scene.TimeDilation * ushort.MaxValue);
  2745. int max = m_primFullUpdates.Count;
  2746. if (max > m_primFullUpdatesPerPacket)
  2747. max = m_primFullUpdatesPerPacket;
  2748. int count = 0;
  2749. int size = 0;
  2750. byte[] zerobuffer = new byte[1024];
  2751. byte[] blockbuffer = new byte[1024];
  2752. for (count = 0 ; count < max ; count++)
  2753. {
  2754. int length = 0;
  2755. m_primFullUpdates[count].ToBytes(blockbuffer, ref length);
  2756. length = Helpers.ZeroEncode(blockbuffer, length, zerobuffer);
  2757. if (size + length > m_packetMTU)
  2758. break;
  2759. size += length;
  2760. }
  2761. outPacket.ObjectData =
  2762. new ObjectUpdatePacket.ObjectDataBlock[count];
  2763. for (int index = 0 ; index < count ; index++)
  2764. {
  2765. outPacket.ObjectData[index] = m_primFullUpdates[0];
  2766. m_primFullUpdates.RemoveAt(0);
  2767. }
  2768. outPacket.Header.Zerocoded = true;
  2769. OutPacket(outPacket, ThrottleOutPacketType.Task | ThrottleOutPacketType.LowPriority);
  2770. if (m_primFullUpdates.Count == 0 && m_primFullUpdateTimer.Enabled)
  2771. lock (m_primFullUpdateTimer)
  2772. m_primFullUpdateTimer.Stop();
  2773. }
  2774. }
  2775. /// <summary>
  2776. ///
  2777. /// </summary>
  2778. public void SendPrimTerseUpdate(ulong regionHandle, ushort timeDilation, uint localID, Vector3 position,
  2779. Quaternion rotation, Vector3 velocity, Vector3 rotationalvelocity, byte state, UUID AssetId, UUID ownerID, int attachPoint)
  2780. {
  2781. if (attachPoint > 30 && ownerID != AgentId) // Someone else's HUD
  2782. return;
  2783. if (rotation.X == rotation.Y && rotation.Y == rotation.Z && rotation.Z == rotation.W && rotation.W == 0)
  2784. rotation = Quaternion.Identity;
  2785. ImprovedTerseObjectUpdatePacket.ObjectDataBlock objectData =
  2786. CreatePrimImprovedBlock(localID, position, rotation,
  2787. velocity, rotationalvelocity, state);
  2788. lock (m_primTerseUpdates)
  2789. {
  2790. if (m_primTerseUpdates.Count == 0)
  2791. m_primTerseUpdateTimer.Start();
  2792. m_primTerseUpdates.Add(objectData);
  2793. if (m_primTerseUpdates.Count >= m_primTerseUpdatesPerPacket)
  2794. ProcessPrimTerseUpdates(this, null);
  2795. }
  2796. }
  2797. void ProcessPrimTerseUpdates(object sender, ElapsedEventArgs e)
  2798. {
  2799. lock (m_primTerseUpdates)
  2800. {
  2801. if (m_primTerseUpdates.Count == 0)
  2802. {
  2803. lock (m_primTerseUpdateTimer)
  2804. m_primTerseUpdateTimer.Stop();
  2805. return;
  2806. }
  2807. ImprovedTerseObjectUpdatePacket outPacket =
  2808. (ImprovedTerseObjectUpdatePacket)
  2809. PacketPool.Instance.GetPacket(
  2810. PacketType.ImprovedTerseObjectUpdate);
  2811. outPacket.RegionData.RegionHandle =
  2812. Scene.RegionInfo.RegionHandle;
  2813. outPacket.RegionData.TimeDilation =
  2814. (ushort)(Scene.TimeDilation * ushort.MaxValue);
  2815. int max = m_primTerseUpdates.Count;
  2816. if (max > m_primTerseUpdatesPerPacket)
  2817. max = m_primTerseUpdatesPerPacket;
  2818. int count = 0;
  2819. int size = 0;
  2820. byte[] zerobuffer = new byte[1024];
  2821. byte[] blockbuffer = new byte[1024];
  2822. for (count = 0 ; count < max ; count++)
  2823. {
  2824. int length = 0;
  2825. m_primTerseUpdates[count].ToBytes(blockbuffer, ref length);
  2826. length = Helpers.ZeroEncode(blockbuffer, length, zerobuffer);
  2827. if (size + length > m_packetMTU)
  2828. break;
  2829. size += length;
  2830. }
  2831. outPacket.ObjectData =
  2832. new ImprovedTerseObjectUpdatePacket.
  2833. ObjectDataBlock[count];
  2834. for (int index = 0 ; index < count ; index++)
  2835. {
  2836. outPacket.ObjectData[index] = m_primTerseUpdates[0];
  2837. m_primTerseUpdates.RemoveAt(0);
  2838. }
  2839. outPacket.Header.Reliable = false;
  2840. outPacket.Header.Zerocoded = true;
  2841. OutPacket(outPacket, ThrottleOutPacketType.Task | ThrottleOutPacketType.LowPriority);
  2842. if (m_primTerseUpdates.Count == 0)
  2843. lock (m_primTerseUpdateTimer)
  2844. m_primTerseUpdateTimer.Stop();
  2845. }
  2846. }
  2847. public void FlushPrimUpdates()
  2848. {
  2849. while (m_primFullUpdates.Count > 0)
  2850. {
  2851. ProcessPrimFullUpdates(this, null);
  2852. }
  2853. while (m_primTerseUpdates.Count > 0)
  2854. {
  2855. ProcessPrimTerseUpdates(this, null);
  2856. }
  2857. while (m_avatarTerseUpdates.Count > 0)
  2858. {
  2859. ProcessAvatarTerseUpdates(this, null);
  2860. }
  2861. }
  2862. public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID)
  2863. {
  2864. AssetUploadCompletePacket newPack = new AssetUploadCompletePacket();
  2865. newPack.AssetBlock.Type = AssetType;
  2866. newPack.AssetBlock.Success = Success;
  2867. newPack.AssetBlock.UUID = AssetFullID;
  2868. newPack.Header.Zerocoded = true;
  2869. OutPacket(newPack, ThrottleOutPacketType.Asset);
  2870. }
  2871. public void SendXferRequest(ulong XferID, short AssetType, UUID vFileID, byte FilePath, byte[] FileName)
  2872. {
  2873. RequestXferPacket newPack = new RequestXferPacket();
  2874. newPack.XferID.ID = XferID;
  2875. newPack.XferID.VFileType = AssetType;
  2876. newPack.XferID.VFileID = vFileID;
  2877. newPack.XferID.FilePath = FilePath;
  2878. newPack.XferID.Filename = FileName;
  2879. newPack.Header.Zerocoded = true;
  2880. OutPacket(newPack, ThrottleOutPacketType.Asset);
  2881. }
  2882. public void SendConfirmXfer(ulong xferID, uint PacketID)
  2883. {
  2884. ConfirmXferPacketPacket newPack = new ConfirmXferPacketPacket();
  2885. newPack.XferID.ID = xferID;
  2886. newPack.XferID.Packet = PacketID;
  2887. newPack.Header.Zerocoded = true;
  2888. OutPacket(newPack, ThrottleOutPacketType.Asset);
  2889. }
  2890. public void SendInitiateDownload(string simFileName, string clientFileName)
  2891. {
  2892. InitiateDownloadPacket newPack = new InitiateDownloadPacket();
  2893. newPack.AgentData.AgentID = AgentId;
  2894. newPack.FileData.SimFilename = Utils.StringToBytes(simFileName);
  2895. newPack.FileData.ViewerFilename = Utils.StringToBytes(clientFileName);
  2896. OutPacket(newPack, ThrottleOutPacketType.Asset);
  2897. }
  2898. public void SendImageFirstPart(
  2899. ushort numParts, UUID ImageUUID, uint ImageSize, byte[] ImageData, byte imageCodec)
  2900. {
  2901. ImageDataPacket im = new ImageDataPacket();
  2902. im.Header.Reliable = false;
  2903. im.ImageID.Packets = numParts;
  2904. im.ImageID.ID = ImageUUID;
  2905. if (ImageSize > 0)
  2906. im.ImageID.Size = ImageSize;
  2907. im.ImageData.Data = ImageData;
  2908. im.ImageID.Codec = imageCodec;
  2909. im.Header.Zerocoded = true;
  2910. OutPacket(im, ThrottleOutPacketType.Texture);
  2911. }
  2912. public void SendImageNextPart(ushort partNumber, UUID imageUuid, byte[] imageData)
  2913. {
  2914. ImagePacketPacket im = new ImagePacketPacket();
  2915. im.Header.Reliable = false;
  2916. im.ImageID.Packet = partNumber;
  2917. im.ImageID.ID = imageUuid;
  2918. im.ImageData.Data = imageData;
  2919. OutPacket(im, ThrottleOutPacketType.Texture);
  2920. }
  2921. public void SendImageNotFound(UUID imageid)
  2922. {
  2923. ImageNotInDatabasePacket notFoundPacket
  2924. = (ImageNotInDatabasePacket)PacketPool.Instance.GetPacket(PacketType.ImageNotInDatabase);
  2925. notFoundPacket.ImageID.ID = imageid;
  2926. OutPacket(notFoundPacket, ThrottleOutPacketType.Texture);
  2927. }
  2928. public void SendShutdownConnectionNotice()
  2929. {
  2930. OutPacket(PacketPool.Instance.GetPacket(PacketType.DisableSimulator), ThrottleOutPacketType.Unknown);
  2931. }
  2932. public void SendSimStats(SimStats stats)
  2933. {
  2934. SimStatsPacket pack = new SimStatsPacket();
  2935. pack.Region = new SimStatsPacket.RegionBlock();
  2936. pack.Region.RegionX = stats.RegionX;
  2937. pack.Region.RegionY = stats.RegionY;
  2938. pack.Region.RegionFlags = stats.RegionFlags;
  2939. pack.Region.ObjectCapacity = stats.ObjectCapacity;
  2940. //pack.Region = //stats.RegionBlock;
  2941. pack.Stat = stats.StatsBlock;
  2942. pack.Header.Reliable = false;
  2943. OutPacket(pack, ThrottleOutPacketType.Task);
  2944. }
  2945. public void SendObjectPropertiesFamilyData(uint RequestFlags, UUID ObjectUUID, UUID OwnerID, UUID GroupID,
  2946. uint BaseMask, uint OwnerMask, uint GroupMask, uint EveryoneMask,
  2947. uint NextOwnerMask, int OwnershipCost, byte SaleType, int SalePrice, uint Category,
  2948. UUID LastOwnerID, string ObjectName, string Description)
  2949. {
  2950. ObjectPropertiesFamilyPacket objPropFamilyPack = (ObjectPropertiesFamilyPacket)PacketPool.Instance.GetPacket(PacketType.ObjectPropertiesFamily);
  2951. // TODO: don't create new blocks if recycling an old packet
  2952. ObjectPropertiesFamilyPacket.ObjectDataBlock objPropDB = new ObjectPropertiesFamilyPacket.ObjectDataBlock();
  2953. objPropDB.RequestFlags = RequestFlags;
  2954. objPropDB.ObjectID = ObjectUUID;
  2955. if (OwnerID == GroupID)
  2956. objPropDB.OwnerID = UUID.Zero;
  2957. else
  2958. objPropDB.OwnerID = OwnerID;
  2959. objPropDB.GroupID = GroupID;
  2960. objPropDB.BaseMask = BaseMask;
  2961. objPropDB.OwnerMask = OwnerMask;
  2962. objPropDB.GroupMask = GroupMask;
  2963. objPropDB.EveryoneMask = EveryoneMask;
  2964. objPropDB.NextOwnerMask = NextOwnerMask;
  2965. // TODO: More properties are needed in SceneObjectPart!
  2966. objPropDB.OwnershipCost = OwnershipCost;
  2967. objPropDB.SaleType = SaleType;
  2968. objPropDB.SalePrice = SalePrice;
  2969. objPropDB.Category = Category;
  2970. objPropDB.LastOwnerID = LastOwnerID;
  2971. objPropDB.Name = LLUtil.StringToPacketBytes(ObjectName);
  2972. objPropDB.Description = LLUtil.StringToPacketBytes(Description);
  2973. objPropFamilyPack.ObjectData = objPropDB;
  2974. objPropFamilyPack.Header.Zerocoded = true;
  2975. OutPacket(objPropFamilyPack, ThrottleOutPacketType.Task);
  2976. }
  2977. public void SendObjectPropertiesReply(
  2978. UUID ItemID, ulong CreationDate, UUID CreatorUUID, UUID FolderUUID, UUID FromTaskUUID,
  2979. UUID GroupUUID, short InventorySerial, UUID LastOwnerUUID, UUID ObjectUUID,
  2980. UUID OwnerUUID, string TouchTitle, byte[] TextureID, string SitTitle, string ItemName,
  2981. string ItemDescription, uint OwnerMask, uint NextOwnerMask, uint GroupMask, uint EveryoneMask,
  2982. uint BaseMask, byte saleType, int salePrice)
  2983. {
  2984. ObjectPropertiesPacket proper = (ObjectPropertiesPacket)PacketPool.Instance.GetPacket(PacketType.ObjectProperties);
  2985. // TODO: don't create new blocks if recycling an old packet
  2986. proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[1];
  2987. proper.ObjectData[0] = new ObjectPropertiesPacket.ObjectDataBlock();
  2988. proper.ObjectData[0].ItemID = ItemID;
  2989. proper.ObjectData[0].CreationDate = CreationDate;
  2990. proper.ObjectData[0].CreatorID = CreatorUUID;
  2991. proper.ObjectData[0].FolderID = FolderUUID;
  2992. proper.ObjectData[0].FromTaskID = FromTaskUUID;
  2993. proper.ObjectData[0].GroupID = GroupUUID;
  2994. proper.ObjectData[0].InventorySerial = InventorySerial;
  2995. proper.ObjectData[0].LastOwnerID = LastOwnerUUID;
  2996. // proper.ObjectData[0].LastOwnerID = UUID.Zero;
  2997. proper.ObjectData[0].ObjectID = ObjectUUID;
  2998. if (OwnerUUID == GroupUUID)
  2999. proper.ObjectData[0].OwnerID = UUID.Zero;
  3000. else
  3001. proper.ObjectData[0].OwnerID = OwnerUUID;
  3002. proper.ObjectData[0].TouchName = LLUtil.StringToPacketBytes(TouchTitle);
  3003. proper.ObjectData[0].TextureID = TextureID;
  3004. proper.ObjectData[0].SitName = LLUtil.StringToPacketBytes(SitTitle);
  3005. proper.ObjectData[0].Name = LLUtil.StringToPacketBytes(ItemName);
  3006. proper.ObjectData[0].Description = LLUtil.StringToPacketBytes(ItemDescription);
  3007. proper.ObjectData[0].OwnerMask = OwnerMask;
  3008. proper.ObjectData[0].NextOwnerMask = NextOwnerMask;
  3009. proper.ObjectData[0].GroupMask = GroupMask;
  3010. proper.ObjectData[0].EveryoneMask = EveryoneMask;
  3011. proper.ObjectData[0].BaseMask = BaseMask;
  3012. // proper.ObjectData[0].AggregatePerms = 53;
  3013. // proper.ObjectData[0].AggregatePermTextures = 0;
  3014. // proper.ObjectData[0].AggregatePermTexturesOwner = 0;
  3015. proper.ObjectData[0].SaleType = saleType;
  3016. proper.ObjectData[0].SalePrice = salePrice;
  3017. proper.Header.Zerocoded = true;
  3018. OutPacket(proper, ThrottleOutPacketType.Task);
  3019. }
  3020. #endregion
  3021. #region Estate Data Sending Methods
  3022. private static bool convertParamStringToBool(byte[] field)
  3023. {
  3024. string s = Utils.BytesToString(field);
  3025. if (s == "1" || s.ToLower() == "y" || s.ToLower() == "yes" || s.ToLower() == "t" || s.ToLower() == "true")
  3026. {
  3027. return true;
  3028. }
  3029. return false;
  3030. }
  3031. public void SendEstateManagersList(UUID invoice, UUID[] EstateManagers, uint estateID)
  3032. {
  3033. EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket();
  3034. packet.AgentData.TransactionID = UUID.Random();
  3035. packet.AgentData.AgentID = AgentId;
  3036. packet.AgentData.SessionID = SessionId;
  3037. packet.MethodData.Invoice = invoice;
  3038. packet.MethodData.Method = Utils.StringToBytes("setaccess");
  3039. EstateOwnerMessagePacket.ParamListBlock[] returnblock = new EstateOwnerMessagePacket.ParamListBlock[6 + EstateManagers.Length];
  3040. for (int i = 0; i < (6 + EstateManagers.Length); i++)
  3041. {
  3042. returnblock[i] = new EstateOwnerMessagePacket.ParamListBlock();
  3043. }
  3044. int j = 0;
  3045. returnblock[j].Parameter = Utils.StringToBytes(estateID.ToString()); j++;
  3046. returnblock[j].Parameter = Utils.StringToBytes(((int)Constants.EstateAccessCodex.EstateManagers).ToString()); j++;
  3047. returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
  3048. returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
  3049. returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
  3050. returnblock[j].Parameter = Utils.StringToBytes(EstateManagers.Length.ToString()); j++;
  3051. for (int i = 0; i < EstateManagers.Length; i++)
  3052. {
  3053. returnblock[j].Parameter = EstateManagers[i].GetBytes(); j++;
  3054. }
  3055. packet.ParamList = returnblock;
  3056. packet.Header.Reliable = false;
  3057. OutPacket(packet, ThrottleOutPacketType.Task);
  3058. }
  3059. public void SendBannedUserList(UUID invoice, EstateBan[] bl, uint estateID)
  3060. {
  3061. List<UUID>BannedUsers = new List<UUID>();
  3062. for (int i = 0; i < bl.Length; i++)
  3063. {
  3064. if (bl[i] == null)
  3065. continue;
  3066. if (bl[i].BannedUserID == UUID.Zero)
  3067. continue;
  3068. BannedUsers.Add(bl[i].BannedUserID);
  3069. }
  3070. EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket();
  3071. packet.AgentData.TransactionID = UUID.Random();
  3072. packet.AgentData.AgentID = AgentId;
  3073. packet.AgentData.SessionID = SessionId;
  3074. packet.MethodData.Invoice = invoice;
  3075. packet.MethodData.Method = Utils.StringToBytes("setaccess");
  3076. EstateOwnerMessagePacket.ParamListBlock[] returnblock = new EstateOwnerMessagePacket.ParamListBlock[6 + BannedUsers.Count];
  3077. for (int i = 0; i < (6 + BannedUsers.Count); i++)
  3078. {
  3079. returnblock[i] = new EstateOwnerMessagePacket.ParamListBlock();
  3080. }
  3081. int j = 0;
  3082. returnblock[j].Parameter = Utils.StringToBytes(estateID.ToString()); j++;
  3083. returnblock[j].Parameter = Utils.StringToBytes(((int)Constants.EstateAccessCodex.EstateBans).ToString()); j++;
  3084. returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
  3085. returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
  3086. returnblock[j].Parameter = Utils.StringToBytes(BannedUsers.Count.ToString()); j++;
  3087. returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
  3088. foreach (UUID banned in BannedUsers)
  3089. {
  3090. returnblock[j].Parameter = banned.GetBytes(); j++;
  3091. }
  3092. packet.ParamList = returnblock;
  3093. packet.Header.Reliable = false;
  3094. OutPacket(packet, ThrottleOutPacketType.Task);
  3095. }
  3096. public void SendRegionInfoToEstateMenu(RegionInfoForEstateMenuArgs args)
  3097. {
  3098. RegionInfoPacket rinfopack = new RegionInfoPacket();
  3099. RegionInfoPacket.RegionInfoBlock rinfoblk = new RegionInfoPacket.RegionInfoBlock();
  3100. rinfopack.AgentData.AgentID = AgentId;
  3101. rinfopack.AgentData.SessionID = SessionId;
  3102. rinfoblk.BillableFactor = args.billableFactor;
  3103. rinfoblk.EstateID = args.estateID;
  3104. rinfoblk.MaxAgents = args.maxAgents;
  3105. rinfoblk.ObjectBonusFactor = args.objectBonusFactor;
  3106. rinfoblk.ParentEstateID = args.parentEstateID;
  3107. rinfoblk.PricePerMeter = args.pricePerMeter;
  3108. rinfoblk.RedirectGridX = args.redirectGridX;
  3109. rinfoblk.RedirectGridY = args.redirectGridY;
  3110. rinfoblk.RegionFlags = args.regionFlags;
  3111. rinfoblk.SimAccess = args.simAccess;
  3112. rinfoblk.SunHour = args.sunHour;
  3113. rinfoblk.TerrainLowerLimit = args.terrainLowerLimit;
  3114. rinfoblk.TerrainRaiseLimit = args.terrainRaiseLimit;
  3115. rinfoblk.UseEstateSun = args.useEstateSun;
  3116. rinfoblk.WaterHeight = args.waterHeight;
  3117. rinfoblk.SimName = Utils.StringToBytes(args.simName);
  3118. rinfopack.RegionInfo2 = new RegionInfoPacket.RegionInfo2Block();
  3119. rinfopack.RegionInfo2.HardMaxAgents = uint.MaxValue;
  3120. rinfopack.RegionInfo2.HardMaxObjects = uint.MaxValue;
  3121. rinfopack.RegionInfo2.MaxAgents32 = uint.MaxValue;
  3122. rinfopack.RegionInfo2.ProductName = Utils.EmptyBytes;
  3123. rinfopack.RegionInfo2.ProductSKU = Utils.EmptyBytes;
  3124. rinfopack.HasVariableBlocks = true;
  3125. rinfopack.RegionInfo = rinfoblk;
  3126. rinfopack.AgentData = new RegionInfoPacket.AgentDataBlock();
  3127. rinfopack.AgentData.AgentID = AgentId;
  3128. rinfopack.AgentData.SessionID = SessionId;
  3129. OutPacket(rinfopack, ThrottleOutPacketType.Task);
  3130. }
  3131. public void SendEstateCovenantInformation(UUID covenant)
  3132. {
  3133. EstateCovenantReplyPacket einfopack = new EstateCovenantReplyPacket();
  3134. EstateCovenantReplyPacket.DataBlock edata = new EstateCovenantReplyPacket.DataBlock();
  3135. edata.CovenantID = covenant;
  3136. edata.CovenantTimestamp = 0;
  3137. if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero)
  3138. edata.EstateOwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
  3139. else
  3140. edata.EstateOwnerID = m_scene.RegionInfo.MasterAvatarAssignedUUID;
  3141. edata.EstateName = Utils.StringToBytes(m_scene.RegionInfo.EstateSettings.EstateName);
  3142. einfopack.Data = edata;
  3143. OutPacket(einfopack, ThrottleOutPacketType.Task);
  3144. }
  3145. public void SendDetailedEstateData(UUID invoice, string estateName, uint estateID, uint parentEstate, uint estateFlags, uint sunPosition, UUID covenant, string abuseEmail, UUID estateOwner)
  3146. {
  3147. EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket();
  3148. packet.MethodData.Invoice = invoice;
  3149. packet.AgentData.TransactionID = UUID.Random();
  3150. packet.MethodData.Method = Utils.StringToBytes("estateupdateinfo");
  3151. EstateOwnerMessagePacket.ParamListBlock[] returnblock = new EstateOwnerMessagePacket.ParamListBlock[10];
  3152. for (int i = 0; i < 10; i++)
  3153. {
  3154. returnblock[i] = new EstateOwnerMessagePacket.ParamListBlock();
  3155. }
  3156. //Sending Estate Settings
  3157. returnblock[0].Parameter = Utils.StringToBytes(estateName);
  3158. // TODO: remove this cruft once MasterAvatar is fully deprecated
  3159. //
  3160. returnblock[1].Parameter = Utils.StringToBytes(estateOwner.ToString());
  3161. returnblock[2].Parameter = Utils.StringToBytes(estateID.ToString());
  3162. returnblock[3].Parameter = Utils.StringToBytes(estateFlags.ToString());
  3163. returnblock[4].Parameter = Utils.StringToBytes(sunPosition.ToString());
  3164. returnblock[5].Parameter = Utils.StringToBytes(parentEstate.ToString());
  3165. returnblock[6].Parameter = Utils.StringToBytes(covenant.ToString());
  3166. returnblock[7].Parameter = Utils.StringToBytes("1160895077"); // what is this?
  3167. returnblock[8].Parameter = Utils.StringToBytes("1"); // what is this?
  3168. returnblock[9].Parameter = Utils.StringToBytes(abuseEmail);
  3169. packet.ParamList = returnblock;
  3170. packet.Header.Reliable = false;
  3171. //m_log.Debug("[ESTATE]: SIM--->" + packet.ToString());
  3172. OutPacket(packet, ThrottleOutPacketType.Task);
  3173. }
  3174. #endregion
  3175. #region Land Data Sending Methods
  3176. public void SendLandParcelOverlay(byte[] data, int sequence_id)
  3177. {
  3178. ParcelOverlayPacket packet = (ParcelOverlayPacket)PacketPool.Instance.GetPacket(PacketType.ParcelOverlay);
  3179. packet.ParcelData.Data = data;
  3180. packet.ParcelData.SequenceID = sequence_id;
  3181. packet.Header.Zerocoded = true;
  3182. OutPacket(packet, ThrottleOutPacketType.Task);
  3183. }
  3184. public void SendLandProperties(int sequence_id, bool snap_selection, int request_result, LandData landData, float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity, uint regionFlags)
  3185. {
  3186. ParcelPropertiesPacket updatePacket = (ParcelPropertiesPacket)PacketPool.Instance.GetPacket(PacketType.ParcelProperties);
  3187. // TODO: don't create new blocks if recycling an old packet
  3188. updatePacket.ParcelData.AABBMax = landData.AABBMax;
  3189. updatePacket.ParcelData.AABBMin = landData.AABBMin;
  3190. updatePacket.ParcelData.Area = landData.Area;
  3191. updatePacket.ParcelData.AuctionID = landData.AuctionID;
  3192. updatePacket.ParcelData.AuthBuyerID = landData.AuthBuyerID;
  3193. updatePacket.ParcelData.Bitmap = landData.Bitmap;
  3194. updatePacket.ParcelData.Desc = Utils.StringToBytes(landData.Description);
  3195. updatePacket.ParcelData.Category = (byte)landData.Category;
  3196. updatePacket.ParcelData.ClaimDate = landData.ClaimDate;
  3197. updatePacket.ParcelData.ClaimPrice = landData.ClaimPrice;
  3198. updatePacket.ParcelData.GroupID = landData.GroupID;
  3199. updatePacket.ParcelData.GroupPrims = landData.GroupPrims;
  3200. updatePacket.ParcelData.IsGroupOwned = landData.IsGroupOwned;
  3201. updatePacket.ParcelData.LandingType = landData.LandingType;
  3202. updatePacket.ParcelData.LocalID = landData.LocalID;
  3203. if (landData.Area > 0)
  3204. {
  3205. updatePacket.ParcelData.MaxPrims = parcelObjectCapacity;
  3206. }
  3207. else
  3208. {
  3209. updatePacket.ParcelData.MaxPrims = 0;
  3210. }
  3211. updatePacket.ParcelData.MediaAutoScale = landData.MediaAutoScale;
  3212. updatePacket.ParcelData.MediaID = landData.MediaID;
  3213. updatePacket.ParcelData.MediaURL = LLUtil.StringToPacketBytes(landData.MediaURL);
  3214. updatePacket.ParcelData.MusicURL = LLUtil.StringToPacketBytes(landData.MusicURL);
  3215. updatePacket.ParcelData.Name = Utils.StringToBytes(landData.Name);
  3216. updatePacket.ParcelData.OtherCleanTime = landData.OtherCleanTime;
  3217. updatePacket.ParcelData.OtherCount = 0; //unemplemented
  3218. updatePacket.ParcelData.OtherPrims = landData.OtherPrims;
  3219. updatePacket.ParcelData.OwnerID = landData.OwnerID;
  3220. updatePacket.ParcelData.OwnerPrims = landData.OwnerPrims;
  3221. updatePacket.ParcelData.ParcelFlags = landData.Flags;
  3222. updatePacket.ParcelData.ParcelPrimBonus = simObjectBonusFactor;
  3223. updatePacket.ParcelData.PassHours = landData.PassHours;
  3224. updatePacket.ParcelData.PassPrice = landData.PassPrice;
  3225. updatePacket.ParcelData.PublicCount = 0; //unemplemented
  3226. updatePacket.ParcelData.RegionDenyAnonymous = ((regionFlags & (uint)RegionFlags.DenyAnonymous) >
  3227. 0);
  3228. updatePacket.ParcelData.RegionDenyIdentified = ((regionFlags & (uint)RegionFlags.DenyIdentified) >
  3229. 0);
  3230. updatePacket.ParcelData.RegionDenyTransacted = ((regionFlags & (uint)RegionFlags.DenyTransacted) >
  3231. 0);
  3232. updatePacket.ParcelData.RegionPushOverride = ((regionFlags & (uint)RegionFlags.RestrictPushObject) >
  3233. 0);
  3234. updatePacket.ParcelData.RentPrice = 0;
  3235. updatePacket.ParcelData.RequestResult = request_result;
  3236. updatePacket.ParcelData.SalePrice = landData.SalePrice;
  3237. updatePacket.ParcelData.SelectedPrims = landData.SelectedPrims;
  3238. updatePacket.ParcelData.SelfCount = 0; //unemplemented
  3239. updatePacket.ParcelData.SequenceID = sequence_id;
  3240. if (landData.SimwideArea > 0)
  3241. {
  3242. updatePacket.ParcelData.SimWideMaxPrims = parcelObjectCapacity;
  3243. }
  3244. else
  3245. {
  3246. updatePacket.ParcelData.SimWideMaxPrims = 0;
  3247. }
  3248. updatePacket.ParcelData.SimWideTotalPrims = landData.SimwidePrims;
  3249. updatePacket.ParcelData.SnapSelection = snap_selection;
  3250. updatePacket.ParcelData.SnapshotID = landData.SnapshotID;
  3251. updatePacket.ParcelData.Status = (byte)landData.Status;
  3252. updatePacket.ParcelData.TotalPrims = landData.OwnerPrims + landData.GroupPrims + landData.OtherPrims +
  3253. landData.SelectedPrims;
  3254. updatePacket.ParcelData.UserLocation = landData.UserLocation;
  3255. updatePacket.ParcelData.UserLookAt = landData.UserLookAt;
  3256. updatePacket.Header.Zerocoded = true;
  3257. try
  3258. {
  3259. IEventQueue eq = Scene.RequestModuleInterface<IEventQueue>();
  3260. if (eq != null)
  3261. {
  3262. eq.ParcelProperties(updatePacket, this.AgentId);
  3263. }
  3264. }
  3265. catch (Exception ex)
  3266. {
  3267. m_log.Error("Unable to send parcel data via eventqueue - exception: " + ex.ToString());
  3268. m_log.Warn("sending parcel data via UDP");
  3269. OutPacket(updatePacket, ThrottleOutPacketType.Task);
  3270. }
  3271. }
  3272. public void SendLandAccessListData(List<UUID> avatars, uint accessFlag, int localLandID)
  3273. {
  3274. ParcelAccessListReplyPacket replyPacket = (ParcelAccessListReplyPacket)PacketPool.Instance.GetPacket(PacketType.ParcelAccessListReply);
  3275. replyPacket.Data.AgentID = AgentId;
  3276. replyPacket.Data.Flags = accessFlag;
  3277. replyPacket.Data.LocalID = localLandID;
  3278. replyPacket.Data.SequenceID = 0;
  3279. List<ParcelAccessListReplyPacket.ListBlock> list = new List<ParcelAccessListReplyPacket.ListBlock>();
  3280. foreach (UUID avatar in avatars)
  3281. {
  3282. ParcelAccessListReplyPacket.ListBlock block = new ParcelAccessListReplyPacket.ListBlock();
  3283. block.Flags = accessFlag;
  3284. block.ID = avatar;
  3285. block.Time = 0;
  3286. list.Add(block);
  3287. }
  3288. replyPacket.List = list.ToArray();
  3289. replyPacket.Header.Zerocoded = true;
  3290. OutPacket(replyPacket, ThrottleOutPacketType.Task);
  3291. }
  3292. public void SendForceClientSelectObjects(List<uint> ObjectIDs)
  3293. {
  3294. bool firstCall = true;
  3295. const int MAX_OBJECTS_PER_PACKET = 251;
  3296. ForceObjectSelectPacket pack = (ForceObjectSelectPacket)PacketPool.Instance.GetPacket(PacketType.ForceObjectSelect);
  3297. ForceObjectSelectPacket.DataBlock[] data;
  3298. while (ObjectIDs.Count > 0)
  3299. {
  3300. if (firstCall)
  3301. {
  3302. pack._Header.ResetList = true;
  3303. firstCall = false;
  3304. }
  3305. else
  3306. {
  3307. pack._Header.ResetList = false;
  3308. }
  3309. if (ObjectIDs.Count > MAX_OBJECTS_PER_PACKET)
  3310. {
  3311. data = new ForceObjectSelectPacket.DataBlock[MAX_OBJECTS_PER_PACKET];
  3312. }
  3313. else
  3314. {
  3315. data = new ForceObjectSelectPacket.DataBlock[ObjectIDs.Count];
  3316. }
  3317. int i;
  3318. for (i = 0; i < MAX_OBJECTS_PER_PACKET && ObjectIDs.Count > 0; i++)
  3319. {
  3320. data[i] = new ForceObjectSelectPacket.DataBlock();
  3321. data[i].LocalID = Convert.ToUInt32(ObjectIDs[0]);
  3322. ObjectIDs.RemoveAt(0);
  3323. }
  3324. pack.Data = data;
  3325. pack.Header.Zerocoded = true;
  3326. OutPacket(pack, ThrottleOutPacketType.Task);
  3327. }
  3328. }
  3329. public void SendCameraConstraint(Vector4 ConstraintPlane)
  3330. {
  3331. CameraConstraintPacket cpack = (CameraConstraintPacket)PacketPool.Instance.GetPacket(PacketType.CameraConstraint);
  3332. cpack.CameraCollidePlane = new CameraConstraintPacket.CameraCollidePlaneBlock();
  3333. cpack.CameraCollidePlane.Plane = ConstraintPlane;
  3334. //m_log.DebugFormat("[CLIENTVIEW]: Constraint {0}", ConstraintPlane);
  3335. OutPacket(cpack, ThrottleOutPacketType.Task);
  3336. }
  3337. public void SendLandObjectOwners(LandData land, List<UUID> groups, Dictionary<UUID, int> ownersAndCount)
  3338. {
  3339. int notifyCount = ownersAndCount.Count;
  3340. ParcelObjectOwnersReplyPacket pack = (ParcelObjectOwnersReplyPacket)PacketPool.Instance.GetPacket(PacketType.ParcelObjectOwnersReply);
  3341. if (notifyCount > 0)
  3342. {
  3343. if (notifyCount > 32)
  3344. {
  3345. m_log.InfoFormat(
  3346. "[LAND]: More than {0} avatars own prims on this parcel. Only sending back details of first {0}"
  3347. + " - a developer might want to investigate whether this is a hard limit", 32);
  3348. notifyCount = 32;
  3349. }
  3350. ParcelObjectOwnersReplyPacket.DataBlock[] dataBlock
  3351. = new ParcelObjectOwnersReplyPacket.DataBlock[notifyCount];
  3352. int num = 0;
  3353. foreach (UUID owner in ownersAndCount.Keys)
  3354. {
  3355. dataBlock[num] = new ParcelObjectOwnersReplyPacket.DataBlock();
  3356. dataBlock[num].Count = ownersAndCount[owner];
  3357. if (land.GroupID == owner || groups.Contains(owner))
  3358. dataBlock[num].IsGroupOwned = true;
  3359. dataBlock[num].OnlineStatus = true; //TODO: fix me later
  3360. dataBlock[num].OwnerID = owner;
  3361. num++;
  3362. if (num >= notifyCount)
  3363. {
  3364. break;
  3365. }
  3366. }
  3367. pack.Data = dataBlock;
  3368. }
  3369. pack.Header.Zerocoded = true;
  3370. this.OutPacket(pack, ThrottleOutPacketType.Task);
  3371. }
  3372. #endregion
  3373. #region Helper Methods
  3374. protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateAvatarImprovedBlock(uint localID, Vector3 pos,
  3375. Vector3 velocity,
  3376. Quaternion rotation)
  3377. {
  3378. byte[] bytes = new byte[60];
  3379. int i = 0;
  3380. ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = PacketPool.GetDataBlock<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>();
  3381. dat.TextureEntry = new byte[0]; // AvatarTemplate.TextureEntry;
  3382. uint ID = localID;
  3383. bytes[i++] = (byte)(ID % 256);
  3384. bytes[i++] = (byte)((ID >> 8) % 256);
  3385. bytes[i++] = (byte)((ID >> 16) % 256);
  3386. bytes[i++] = (byte)((ID >> 24) % 256);
  3387. bytes[i++] = 0;
  3388. bytes[i++] = 1;
  3389. i += 14;
  3390. bytes[i++] = 128;
  3391. bytes[i++] = 63;
  3392. byte[] pb = pos.GetBytes();
  3393. Array.Copy(pb, 0, bytes, i, pb.Length);
  3394. i += 12;
  3395. Vector3 internDirec = new Vector3(velocity.X, velocity.Y, velocity.Z);
  3396. internDirec = internDirec / 128.0f;
  3397. internDirec.X += 1;
  3398. internDirec.Y += 1;
  3399. internDirec.Z += 1;
  3400. ushort InternVelocityX = (ushort)(32768 * internDirec.X);
  3401. ushort InternVelocityY = (ushort)(32768 * internDirec.Y);
  3402. ushort InternVelocityZ = (ushort)(32768 * internDirec.Z);
  3403. ushort ac = 32767;
  3404. bytes[i++] = (byte)(InternVelocityX % 256);
  3405. bytes[i++] = (byte)((InternVelocityX >> 8) % 256);
  3406. bytes[i++] = (byte)(InternVelocityY % 256);
  3407. bytes[i++] = (byte)((InternVelocityY >> 8) % 256);
  3408. bytes[i++] = (byte)(InternVelocityZ % 256);
  3409. bytes[i++] = (byte)((InternVelocityZ >> 8) % 256);
  3410. //accel
  3411. bytes[i++] = (byte)(ac % 256);
  3412. bytes[i++] = (byte)((ac >> 8) % 256);
  3413. bytes[i++] = (byte)(ac % 256);
  3414. bytes[i++] = (byte)((ac >> 8) % 256);
  3415. bytes[i++] = (byte)(ac % 256);
  3416. bytes[i++] = (byte)((ac >> 8) % 256);
  3417. //rotation
  3418. ushort rw, rx, ry, rz;
  3419. rw = (ushort)(32768 * (rotation.W + 1));
  3420. rx = (ushort)(32768 * (rotation.X + 1));
  3421. ry = (ushort)(32768 * (rotation.Y + 1));
  3422. rz = (ushort)(32768 * (rotation.Z + 1));
  3423. //rot
  3424. bytes[i++] = (byte)(rx % 256);
  3425. bytes[i++] = (byte)((rx >> 8) % 256);
  3426. bytes[i++] = (byte)(ry % 256);
  3427. bytes[i++] = (byte)((ry >> 8) % 256);
  3428. bytes[i++] = (byte)(rz % 256);
  3429. bytes[i++] = (byte)((rz >> 8) % 256);
  3430. bytes[i++] = (byte)(rw % 256);
  3431. bytes[i++] = (byte)((rw >> 8) % 256);
  3432. //rotation vel
  3433. bytes[i++] = (byte)(ac % 256);
  3434. bytes[i++] = (byte)((ac >> 8) % 256);
  3435. bytes[i++] = (byte)(ac % 256);
  3436. bytes[i++] = (byte)((ac >> 8) % 256);
  3437. bytes[i++] = (byte)(ac % 256);
  3438. bytes[i++] = (byte)((ac >> 8) % 256);
  3439. dat.Data = bytes;
  3440. return (dat);
  3441. }
  3442. /// <summary>
  3443. ///
  3444. /// </summary>
  3445. /// <param name="localID"></param>
  3446. /// <param name="position"></param>
  3447. /// <param name="rotation"></param>
  3448. /// <returns></returns>
  3449. protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreatePrimImprovedBlock(uint localID,
  3450. Vector3 position,
  3451. Quaternion rotation,
  3452. Vector3 velocity,
  3453. Vector3 rotationalvelocity,
  3454. byte state)
  3455. {
  3456. uint ID = localID;
  3457. byte[] bytes = new byte[60];
  3458. int i = 0;
  3459. ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = PacketPool.GetDataBlock<ImprovedTerseObjectUpdatePacket.ObjectDataBlock>();
  3460. dat.TextureEntry = new byte[0];
  3461. bytes[i++] = (byte)(ID % 256);
  3462. bytes[i++] = (byte)((ID >> 8) % 256);
  3463. bytes[i++] = (byte)((ID >> 16) % 256);
  3464. bytes[i++] = (byte)((ID >> 24) % 256);
  3465. bytes[i++] = (byte)(((state & 0xf0) >> 4) | ((state & 0x0f) << 4));
  3466. bytes[i++] = 0;
  3467. byte[] pb = position.GetBytes();
  3468. Array.Copy(pb, 0, bytes, i, pb.Length);
  3469. i += 12;
  3470. ushort ac = 32767;
  3471. ushort velx, vely, velz;
  3472. Vector3 vel = new Vector3(velocity.X, velocity.Y, velocity.Z);
  3473. vel = vel / 128.0f;
  3474. vel.X += 1;
  3475. vel.Y += 1;
  3476. vel.Z += 1;
  3477. //vel
  3478. velx = (ushort)(32768 * (vel.X));
  3479. vely = (ushort)(32768 * (vel.Y));
  3480. velz = (ushort)(32768 * (vel.Z));
  3481. bytes[i++] = (byte)(velx % 256);
  3482. bytes[i++] = (byte)((velx >> 8) % 256);
  3483. bytes[i++] = (byte)(vely % 256);
  3484. bytes[i++] = (byte)((vely >> 8) % 256);
  3485. bytes[i++] = (byte)(velz % 256);
  3486. bytes[i++] = (byte)((velz >> 8) % 256);
  3487. //accel
  3488. bytes[i++] = (byte)(ac % 256);
  3489. bytes[i++] = (byte)((ac >> 8) % 256);
  3490. bytes[i++] = (byte)(ac % 256);
  3491. bytes[i++] = (byte)((ac >> 8) % 256);
  3492. bytes[i++] = (byte)(ac % 256);
  3493. bytes[i++] = (byte)((ac >> 8) % 256);
  3494. ushort rw, rx, ry, rz;
  3495. rw = (ushort)(32768 * (rotation.W + 1));
  3496. rx = (ushort)(32768 * (rotation.X + 1));
  3497. ry = (ushort)(32768 * (rotation.Y + 1));
  3498. rz = (ushort)(32768 * (rotation.Z + 1));
  3499. //rot
  3500. bytes[i++] = (byte)(rx % 256);
  3501. bytes[i++] = (byte)((rx >> 8) % 256);
  3502. bytes[i++] = (byte)(ry % 256);
  3503. bytes[i++] = (byte)((ry >> 8) % 256);
  3504. bytes[i++] = (byte)(rz % 256);
  3505. bytes[i++] = (byte)((rz >> 8) % 256);
  3506. bytes[i++] = (byte)(rw % 256);
  3507. bytes[i++] = (byte)((rw >> 8) % 256);
  3508. //rotation vel
  3509. Vector3 rvel = new Vector3(rotationalvelocity.X, rotationalvelocity.Y, rotationalvelocity.Z);
  3510. rvel = rvel / 128.0f;
  3511. rvel.X += 1;
  3512. rvel.Y += 1;
  3513. rvel.Z += 1;
  3514. //vel
  3515. ushort rvelx = (ushort)(32768 * (rvel.X));
  3516. ushort rvely = (ushort)(32768 * (rvel.Y));
  3517. ushort rvelz = (ushort)(32768 * (rvel.Z));
  3518. bytes[i++] = (byte)(rvelx % 256);
  3519. bytes[i++] = (byte)((rvelx >> 8) % 256);
  3520. bytes[i++] = (byte)(rvely % 256);
  3521. bytes[i++] = (byte)((rvely >> 8) % 256);
  3522. bytes[i++] = (byte)(rvelz % 256);
  3523. bytes[i++] = (byte)((rvelz >> 8) % 256);
  3524. dat.Data = bytes;
  3525. return dat;
  3526. }
  3527. /// <summary>
  3528. /// Create the ObjectDataBlock for a ObjectUpdatePacket (for a Primitive)
  3529. /// </summary>
  3530. /// <param name="primData"></param>
  3531. /// <returns></returns>
  3532. protected ObjectUpdatePacket.ObjectDataBlock CreatePrimUpdateBlock(PrimitiveBaseShape primShape, uint flags)
  3533. {
  3534. ObjectUpdatePacket.ObjectDataBlock objupdate = PacketPool.GetDataBlock<ObjectUpdatePacket.ObjectDataBlock>();
  3535. SetDefaultPrimPacketValues(objupdate);
  3536. objupdate.UpdateFlags = flags;
  3537. SetPrimPacketShapeData(objupdate, primShape);
  3538. if ((primShape.PCode == (byte)PCode.NewTree) || (primShape.PCode == (byte)PCode.Tree) || (primShape.PCode == (byte)PCode.Grass))
  3539. {
  3540. objupdate.Data = new byte[1];
  3541. objupdate.Data[0] = primShape.State;
  3542. }
  3543. return objupdate;
  3544. }
  3545. protected void SetPrimPacketShapeData(ObjectUpdatePacket.ObjectDataBlock objectData, PrimitiveBaseShape primData)
  3546. {
  3547. objectData.TextureEntry = primData.TextureEntry;
  3548. objectData.PCode = primData.PCode;
  3549. objectData.State = primData.State;
  3550. objectData.PathBegin = primData.PathBegin;
  3551. objectData.PathEnd = primData.PathEnd;
  3552. objectData.PathScaleX = primData.PathScaleX;
  3553. objectData.PathScaleY = primData.PathScaleY;
  3554. objectData.PathShearX = primData.PathShearX;
  3555. objectData.PathShearY = primData.PathShearY;
  3556. objectData.PathSkew = primData.PathSkew;
  3557. objectData.ProfileBegin = primData.ProfileBegin;
  3558. objectData.ProfileEnd = primData.ProfileEnd;
  3559. objectData.Scale = primData.Scale;
  3560. objectData.PathCurve = primData.PathCurve;
  3561. objectData.ProfileCurve = primData.ProfileCurve;
  3562. objectData.ProfileHollow = primData.ProfileHollow;
  3563. objectData.PathRadiusOffset = primData.PathRadiusOffset;
  3564. objectData.PathRevolutions = primData.PathRevolutions;
  3565. objectData.PathTaperX = primData.PathTaperX;
  3566. objectData.PathTaperY = primData.PathTaperY;
  3567. objectData.PathTwist = primData.PathTwist;
  3568. objectData.PathTwistBegin = primData.PathTwistBegin;
  3569. objectData.ExtraParams = primData.ExtraParams;
  3570. }
  3571. /// <summary>
  3572. /// Set some default values in a ObjectUpdatePacket
  3573. /// </summary>
  3574. /// <param name="objdata"></param>
  3575. protected void SetDefaultPrimPacketValues(ObjectUpdatePacket.ObjectDataBlock objdata)
  3576. {
  3577. objdata.PSBlock = new byte[0];
  3578. objdata.ExtraParams = new byte[1];
  3579. objdata.MediaURL = new byte[0];
  3580. objdata.NameValue = new byte[0];
  3581. objdata.Text = new byte[0];
  3582. objdata.TextColor = new byte[4];
  3583. objdata.JointAxisOrAnchor = new Vector3(0, 0, 0);
  3584. objdata.JointPivot = new Vector3(0, 0, 0);
  3585. objdata.Material = 3;
  3586. objdata.TextureAnim = new byte[0];
  3587. objdata.Sound = UUID.Zero;
  3588. objdata.State = 0;
  3589. objdata.Data = new byte[0];
  3590. objdata.ObjectData = new byte[60];
  3591. objdata.ObjectData[46] = 128;
  3592. objdata.ObjectData[47] = 63;
  3593. }
  3594. /// <summary>
  3595. ///
  3596. /// </summary>
  3597. /// <returns></returns>
  3598. public ObjectUpdatePacket.ObjectDataBlock CreateDefaultAvatarPacket(byte[] textureEntry)
  3599. {
  3600. ObjectUpdatePacket.ObjectDataBlock objdata = PacketPool.GetDataBlock<ObjectUpdatePacket.ObjectDataBlock>();
  3601. // new OpenMetaverse.Packets.ObjectUpdatePacket.ObjectDataBlock(data1, ref i);
  3602. SetDefaultAvatarPacketValues(ref objdata);
  3603. objdata.UpdateFlags = 61 + (9 << 8) + (130 << 16) + (16 << 24);
  3604. objdata.PathCurve = 16;
  3605. objdata.ProfileCurve = 1;
  3606. objdata.PathScaleX = 100;
  3607. objdata.PathScaleY = 100;
  3608. objdata.ParentID = 0;
  3609. objdata.OwnerID = UUID.Zero;
  3610. objdata.Scale = new Vector3(1, 1, 1);
  3611. objdata.PCode = (byte)PCode.Avatar;
  3612. if (textureEntry != null)
  3613. {
  3614. objdata.TextureEntry = textureEntry;
  3615. }
  3616. Vector3 pos = new Vector3(objdata.ObjectData, 16);
  3617. pos.X = 100f;
  3618. objdata.ID = 8880000;
  3619. objdata.NameValue = Utils.StringToBytes("FirstName STRING RW SV Test \nLastName STRING RW SV User ");
  3620. //Vector3 pos2 = new Vector3(100f, 100f, 23f);
  3621. //objdata.FullID=user.AgentId;
  3622. byte[] pb = pos.GetBytes();
  3623. Array.Copy(pb, 0, objdata.ObjectData, 16, pb.Length);
  3624. return objdata;
  3625. }
  3626. /// <summary>
  3627. ///
  3628. /// </summary>
  3629. /// <param name="objdata"></param>
  3630. protected void SetDefaultAvatarPacketValues(ref ObjectUpdatePacket.ObjectDataBlock objdata)
  3631. {
  3632. objdata.PSBlock = new byte[0];
  3633. objdata.ExtraParams = new byte[1];
  3634. objdata.MediaURL = new byte[0];
  3635. objdata.NameValue = new byte[0];
  3636. objdata.Text = new byte[0];
  3637. objdata.TextColor = new byte[4];
  3638. objdata.JointAxisOrAnchor = new Vector3(0, 0, 0);
  3639. objdata.JointPivot = new Vector3(0, 0, 0);
  3640. objdata.Material = 4;
  3641. objdata.TextureAnim = new byte[0];
  3642. objdata.Sound = UUID.Zero;
  3643. Primitive.TextureEntry ntex = new Primitive.TextureEntry(new UUID("00000000-0000-0000-5005-000000000005"));
  3644. objdata.TextureEntry = ntex.GetBytes();
  3645. objdata.State = 0;
  3646. objdata.Data = new byte[0];
  3647. objdata.ObjectData = new byte[76];
  3648. objdata.ObjectData[15] = 128;
  3649. objdata.ObjectData[16] = 63;
  3650. objdata.ObjectData[56] = 128;
  3651. objdata.ObjectData[61] = 102;
  3652. objdata.ObjectData[62] = 40;
  3653. objdata.ObjectData[63] = 61;
  3654. objdata.ObjectData[64] = 189;
  3655. }
  3656. public void SendNameReply(UUID profileId, string firstname, string lastname)
  3657. {
  3658. UUIDNameReplyPacket packet = (UUIDNameReplyPacket)PacketPool.Instance.GetPacket(PacketType.UUIDNameReply);
  3659. // TODO: don't create new blocks if recycling an old packet
  3660. packet.UUIDNameBlock = new UUIDNameReplyPacket.UUIDNameBlockBlock[1];
  3661. packet.UUIDNameBlock[0] = new UUIDNameReplyPacket.UUIDNameBlockBlock();
  3662. packet.UUIDNameBlock[0].ID = profileId;
  3663. packet.UUIDNameBlock[0].FirstName = Utils.StringToBytes(firstname);
  3664. packet.UUIDNameBlock[0].LastName = Utils.StringToBytes(lastname);
  3665. OutPacket(packet, ThrottleOutPacketType.Task);
  3666. }
  3667. #endregion
  3668. /// <summary>
  3669. /// This is a different way of processing packets then ProcessInPacket
  3670. /// </summary>
  3671. protected virtual void RegisterLocalPacketHandlers()
  3672. {
  3673. AddLocalPacketHandler(PacketType.LogoutRequest, Logout);
  3674. AddLocalPacketHandler(PacketType.ViewerEffect, HandleViewerEffect);
  3675. AddLocalPacketHandler(PacketType.AgentCachedTexture, AgentTextureCached);
  3676. AddLocalPacketHandler(PacketType.MultipleObjectUpdate, MultipleObjUpdate);
  3677. AddLocalPacketHandler(PacketType.MoneyTransferRequest, HandleMoneyTransferRequest);
  3678. AddLocalPacketHandler(PacketType.ParcelBuy, HandleParcelBuyRequest);
  3679. AddLocalPacketHandler(PacketType.UUIDGroupNameRequest, HandleUUIDGroupNameRequest);
  3680. AddLocalPacketHandler(PacketType.ObjectGroup, HandleObjectGroupRequest);
  3681. AddLocalPacketHandler(PacketType.GenericMessage, HandleGenericMessage);
  3682. }
  3683. private bool HandleMoneyTransferRequest(IClientAPI sender, Packet Pack)
  3684. {
  3685. MoneyTransferRequestPacket money = (MoneyTransferRequestPacket) Pack;
  3686. // validate the agent owns the agentID and sessionID
  3687. if (money.MoneyData.SourceID == sender.AgentId && money.AgentData.AgentID == sender.AgentId &&
  3688. money.AgentData.SessionID == sender.SessionId)
  3689. {
  3690. handlerMoneyTransferRequest = OnMoneyTransferRequest;
  3691. if (handlerMoneyTransferRequest != null)
  3692. {
  3693. handlerMoneyTransferRequest(money.MoneyData.SourceID, money.MoneyData.DestID,
  3694. money.MoneyData.Amount, money.MoneyData.TransactionType,
  3695. Util.FieldToString(money.MoneyData.Description));
  3696. }
  3697. return true;
  3698. }
  3699. return false;
  3700. }
  3701. private bool HandleParcelBuyRequest(IClientAPI sender, Packet Pack)
  3702. {
  3703. ParcelBuyPacket parcel = (ParcelBuyPacket) Pack;
  3704. if (parcel.AgentData.AgentID == AgentId && parcel.AgentData.SessionID == SessionId)
  3705. {
  3706. handlerParcelBuy = OnParcelBuy;
  3707. if (handlerParcelBuy != null)
  3708. {
  3709. handlerParcelBuy(parcel.AgentData.AgentID, parcel.Data.GroupID, parcel.Data.Final,
  3710. parcel.Data.IsGroupOwned,
  3711. parcel.Data.RemoveContribution, parcel.Data.LocalID, parcel.ParcelData.Area,
  3712. parcel.ParcelData.Price,
  3713. false);
  3714. }
  3715. return true;
  3716. }
  3717. return false;
  3718. }
  3719. private bool HandleUUIDGroupNameRequest(IClientAPI sender, Packet Pack)
  3720. {
  3721. UUIDGroupNameRequestPacket upack = (UUIDGroupNameRequestPacket)Pack;
  3722. for (int i = 0; i < upack.UUIDNameBlock.Length; i++)
  3723. {
  3724. handlerUUIDGroupNameRequest = OnUUIDGroupNameRequest;
  3725. if (handlerUUIDGroupNameRequest != null)
  3726. {
  3727. handlerUUIDGroupNameRequest(upack.UUIDNameBlock[i].ID, this);
  3728. }
  3729. }
  3730. return true;
  3731. }
  3732. public bool HandleGenericMessage(IClientAPI sender, Packet pack)
  3733. {
  3734. GenericMessagePacket gmpack = (GenericMessagePacket) pack;
  3735. if (m_genericPacketHandlers.Count == 0) return false;
  3736. if (gmpack.AgentData.SessionID != SessionId) return false;
  3737. handlerGenericMessage = null;
  3738. string method = Util.FieldToString(gmpack.MethodData.Method).ToLower().Trim();
  3739. if (m_genericPacketHandlers.TryGetValue(method, out handlerGenericMessage))
  3740. {
  3741. List<string> msg = new List<string>();
  3742. List<byte[]> msgBytes = new List<byte[]>();
  3743. if (handlerGenericMessage != null)
  3744. {
  3745. foreach (GenericMessagePacket.ParamListBlock block in gmpack.ParamList)
  3746. {
  3747. msg.Add(Util.FieldToString(block.Parameter));
  3748. msgBytes.Add(block.Parameter);
  3749. }
  3750. try
  3751. {
  3752. if (OnBinaryGenericMessage != null)
  3753. {
  3754. OnBinaryGenericMessage(this, method, msgBytes.ToArray());
  3755. }
  3756. handlerGenericMessage(sender, method, msg);
  3757. return true;
  3758. }
  3759. catch (Exception e)
  3760. {
  3761. m_log.Error("[GENERICMESSAGE] " + e);
  3762. }
  3763. }
  3764. }
  3765. m_log.Error("[GENERICMESSAGE] Not handling GenericMessage with method-type of: " + method);
  3766. return false;
  3767. }
  3768. public bool HandleObjectGroupRequest(IClientAPI sender, Packet Pack)
  3769. {
  3770. ObjectGroupPacket ogpack = (ObjectGroupPacket)Pack;
  3771. if (ogpack.AgentData.SessionID != SessionId) return false;
  3772. handlerObjectGroupRequest = OnObjectGroupRequest;
  3773. if (handlerObjectGroupRequest != null)
  3774. {
  3775. for (int i = 0; i < ogpack.ObjectData.Length; i++)
  3776. {
  3777. handlerObjectGroupRequest(this, ogpack.AgentData.GroupID, ogpack.ObjectData[i].ObjectLocalID, UUID.Zero);
  3778. }
  3779. }
  3780. return true;
  3781. }
  3782. private bool HandleViewerEffect(IClientAPI sender, Packet Pack)
  3783. {
  3784. ViewerEffectPacket viewer = (ViewerEffectPacket)Pack;
  3785. if (viewer.AgentData.SessionID != SessionId) return false;
  3786. handlerViewerEffect = OnViewerEffect;
  3787. if (handlerViewerEffect != null)
  3788. {
  3789. int length = viewer.Effect.Length;
  3790. List<ViewerEffectEventHandlerArg> args = new List<ViewerEffectEventHandlerArg>(length);
  3791. for (int i = 0; i < length; i++)
  3792. {
  3793. //copy the effects block arguments into the event handler arg.
  3794. ViewerEffectEventHandlerArg argument = new ViewerEffectEventHandlerArg();
  3795. argument.AgentID = viewer.Effect[i].AgentID;
  3796. argument.Color = viewer.Effect[i].Color;
  3797. argument.Duration = viewer.Effect[i].Duration;
  3798. argument.ID = viewer.Effect[i].ID;
  3799. argument.Type = viewer.Effect[i].Type;
  3800. argument.TypeData = viewer.Effect[i].TypeData;
  3801. args.Add(argument);
  3802. }
  3803. handlerViewerEffect(sender, args);
  3804. }
  3805. return true;
  3806. }
  3807. public void SendScriptQuestion(UUID taskID, string taskName, string ownerName, UUID itemID, int question)
  3808. {
  3809. ScriptQuestionPacket scriptQuestion = (ScriptQuestionPacket)PacketPool.Instance.GetPacket(PacketType.ScriptQuestion);
  3810. scriptQuestion.Data = new ScriptQuestionPacket.DataBlock();
  3811. // TODO: don't create new blocks if recycling an old packet
  3812. scriptQuestion.Data.TaskID = taskID;
  3813. scriptQuestion.Data.ItemID = itemID;
  3814. scriptQuestion.Data.Questions = question;
  3815. scriptQuestion.Data.ObjectName = Utils.StringToBytes(taskName);
  3816. scriptQuestion.Data.ObjectOwner = Utils.StringToBytes(ownerName);
  3817. OutPacket(scriptQuestion, ThrottleOutPacketType.Task);
  3818. }
  3819. private void InitDefaultAnimations()
  3820. {
  3821. using (XmlTextReader reader = new XmlTextReader("data/avataranimations.xml"))
  3822. {
  3823. XmlDocument doc = new XmlDocument();
  3824. doc.Load(reader);
  3825. if (doc.DocumentElement != null)
  3826. foreach (XmlNode nod in doc.DocumentElement.ChildNodes)
  3827. {
  3828. if (nod.Attributes["name"] != null)
  3829. {
  3830. string name = nod.Attributes["name"].Value.ToLower();
  3831. string id = nod.InnerText;
  3832. m_defaultAnimations.Add(name, (UUID)id);
  3833. }
  3834. }
  3835. }
  3836. }
  3837. public UUID GetDefaultAnimation(string name)
  3838. {
  3839. if (m_defaultAnimations.ContainsKey(name))
  3840. return m_defaultAnimations[name];
  3841. return UUID.Zero;
  3842. }
  3843. /// <summary>
  3844. /// Handler called when we receive a logout packet.
  3845. /// </summary>
  3846. /// <param name="client"></param>
  3847. /// <param name="packet"></param>
  3848. /// <returns></returns>
  3849. protected virtual bool Logout(IClientAPI client, Packet packet)
  3850. {
  3851. if (packet.Type == PacketType.LogoutRequest)
  3852. {
  3853. if (((LogoutRequestPacket)packet).AgentData.SessionID != SessionId) return false;
  3854. }
  3855. return Logout(client);
  3856. }
  3857. /// <summary>
  3858. ///
  3859. /// </summary>
  3860. /// <param name="client"></param>
  3861. /// <returns></returns>
  3862. protected virtual bool Logout(IClientAPI client)
  3863. {
  3864. m_log.InfoFormat("[CLIENT]: Got a logout request for {0} in {1}", Name, Scene.RegionInfo.RegionName);
  3865. handlerLogout = OnLogout;
  3866. if (handlerLogout != null)
  3867. {
  3868. handlerLogout(client);
  3869. }
  3870. return true;
  3871. }
  3872. /// <summary>
  3873. /// Send a response back to a client when it asks the asset server (via the region server) if it has
  3874. /// its appearance texture cached.
  3875. ///
  3876. /// At the moment, we always reply that there is no cached texture.
  3877. /// </summary>
  3878. /// <param name="simclient"></param>
  3879. /// <param name="packet"></param>
  3880. /// <returns></returns>
  3881. protected bool AgentTextureCached(IClientAPI simclient, Packet packet)
  3882. {
  3883. //m_log.Debug("texture cached: " + packet.ToString());
  3884. AgentCachedTexturePacket cachedtex = (AgentCachedTexturePacket)packet;
  3885. AgentCachedTextureResponsePacket cachedresp = (AgentCachedTextureResponsePacket)PacketPool.Instance.GetPacket(PacketType.AgentCachedTextureResponse);
  3886. if (cachedtex.AgentData.SessionID != SessionId) return false;
  3887. // TODO: don't create new blocks if recycling an old packet
  3888. cachedresp.AgentData.AgentID = AgentId;
  3889. cachedresp.AgentData.SessionID = m_sessionId;
  3890. cachedresp.AgentData.SerialNum = m_cachedTextureSerial;
  3891. m_cachedTextureSerial++;
  3892. cachedresp.WearableData =
  3893. new AgentCachedTextureResponsePacket.WearableDataBlock[cachedtex.WearableData.Length];
  3894. for (int i = 0; i < cachedtex.WearableData.Length; i++)
  3895. {
  3896. cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
  3897. cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex;
  3898. cachedresp.WearableData[i].TextureID = UUID.Zero;
  3899. cachedresp.WearableData[i].HostName = new byte[0];
  3900. }
  3901. cachedresp.Header.Zerocoded = true;
  3902. OutPacket(cachedresp, ThrottleOutPacketType.Task);
  3903. return true;
  3904. }
  3905. protected bool MultipleObjUpdate(IClientAPI simClient, Packet packet)
  3906. {
  3907. MultipleObjectUpdatePacket multipleupdate = (MultipleObjectUpdatePacket)packet;
  3908. if (multipleupdate.AgentData.SessionID != SessionId) return false;
  3909. // m_log.Debug("new multi update packet " + multipleupdate.ToString());
  3910. Scene tScene = (Scene)m_scene;
  3911. for (int i = 0; i < multipleupdate.ObjectData.Length; i++)
  3912. {
  3913. MultipleObjectUpdatePacket.ObjectDataBlock block = multipleupdate.ObjectData[i];
  3914. // Can't act on Null Data
  3915. if (block.Data != null)
  3916. {
  3917. uint localId = block.ObjectLocalID;
  3918. SceneObjectPart part = tScene.GetSceneObjectPart(localId);
  3919. if (part == null)
  3920. {
  3921. // It's a ghost! tell the client to delete it from view.
  3922. simClient.SendKillObject(Scene.RegionInfo.RegionHandle,
  3923. localId);
  3924. }
  3925. else
  3926. {
  3927. // UUID partId = part.UUID;
  3928. UpdatePrimGroupRotation handlerUpdatePrimGroupRotation;
  3929. switch (block.Type)
  3930. {
  3931. case 1:
  3932. Vector3 pos1 = new Vector3(block.Data, 0);
  3933. handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition;
  3934. if (handlerUpdatePrimSinglePosition != null)
  3935. {
  3936. // m_log.Debug("new movement position is " + pos.X + " , " + pos.Y + " , " + pos.Z);
  3937. handlerUpdatePrimSinglePosition(localId, pos1, this);
  3938. }
  3939. break;
  3940. case 2:
  3941. Quaternion rot1 = new Quaternion(block.Data, 0, true);
  3942. handlerUpdatePrimSingleRotation = OnUpdatePrimSingleRotation;
  3943. if (handlerUpdatePrimSingleRotation != null)
  3944. {
  3945. // m_log.Info("new tab rotation is " + rot1.X + " , " + rot1.Y + " , " + rot1.Z + " , " + rot1.W);
  3946. handlerUpdatePrimSingleRotation(localId, rot1, this);
  3947. }
  3948. break;
  3949. case 3:
  3950. Vector3 rotPos = new Vector3(block.Data, 0);
  3951. Quaternion rot2 = new Quaternion(block.Data, 12, true);
  3952. handlerUpdatePrimSingleRotationPosition = OnUpdatePrimSingleRotationPosition;
  3953. if (handlerUpdatePrimSingleRotationPosition != null)
  3954. {
  3955. // m_log.Debug("new mouse rotation position is " + rotPos.X + " , " + rotPos.Y + " , " + rotPos.Z);
  3956. // m_log.Info("new mouse rotation is " + rot2.X + " , " + rot2.Y + " , " + rot2.Z + " , " + rot2.W);
  3957. handlerUpdatePrimSingleRotationPosition(localId, rot2, rotPos, this);
  3958. }
  3959. break;
  3960. case 4:
  3961. case 20:
  3962. Vector3 scale4 = new Vector3(block.Data, 0);
  3963. handlerUpdatePrimScale = OnUpdatePrimScale;
  3964. if (handlerUpdatePrimScale != null)
  3965. {
  3966. // m_log.Debug("new scale is " + scale4.X + " , " + scale4.Y + " , " + scale4.Z);
  3967. handlerUpdatePrimScale(localId, scale4, this);
  3968. }
  3969. break;
  3970. case 5:
  3971. Vector3 scale1 = new Vector3(block.Data, 12);
  3972. Vector3 pos11 = new Vector3(block.Data, 0);
  3973. handlerUpdatePrimScale = OnUpdatePrimScale;
  3974. if (handlerUpdatePrimScale != null)
  3975. {
  3976. // m_log.Debug("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
  3977. handlerUpdatePrimScale(localId, scale1, this);
  3978. handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition;
  3979. if (handlerUpdatePrimSinglePosition != null)
  3980. {
  3981. handlerUpdatePrimSinglePosition(localId, pos11, this);
  3982. }
  3983. }
  3984. break;
  3985. case 9:
  3986. Vector3 pos2 = new Vector3(block.Data, 0);
  3987. handlerUpdateVector = OnUpdatePrimGroupPosition;
  3988. if (handlerUpdateVector != null)
  3989. {
  3990. handlerUpdateVector(localId, pos2, this);
  3991. }
  3992. break;
  3993. case 10:
  3994. Quaternion rot3 = new Quaternion(block.Data, 0, true);
  3995. handlerUpdatePrimRotation = OnUpdatePrimGroupRotation;
  3996. if (handlerUpdatePrimRotation != null)
  3997. {
  3998. // Console.WriteLine("new rotation is " + rot3.X + " , " + rot3.Y + " , " + rot3.Z + " , " + rot3.W);
  3999. handlerUpdatePrimRotation(localId, rot3, this);
  4000. }
  4001. break;
  4002. case 11:
  4003. Vector3 pos3 = new Vector3(block.Data, 0);
  4004. Quaternion rot4 = new Quaternion(block.Data, 12, true);
  4005. handlerUpdatePrimGroupRotation = OnUpdatePrimGroupMouseRotation;
  4006. if (handlerUpdatePrimGroupRotation != null)
  4007. {
  4008. // m_log.Debug("new rotation position is " + pos.X + " , " + pos.Y + " , " + pos.Z);
  4009. // m_log.Debug("new group mouse rotation is " + rot4.X + " , " + rot4.Y + " , " + rot4.Z + " , " + rot4.W);
  4010. handlerUpdatePrimGroupRotation(localId, pos3, rot4, this);
  4011. }
  4012. break;
  4013. case 12:
  4014. case 28:
  4015. Vector3 scale7 = new Vector3(block.Data, 0);
  4016. handlerUpdatePrimGroupScale = OnUpdatePrimGroupScale;
  4017. if (handlerUpdatePrimGroupScale != null)
  4018. {
  4019. // m_log.Debug("new scale is " + scale7.X + " , " + scale7.Y + " , " + scale7.Z);
  4020. handlerUpdatePrimGroupScale(localId, scale7, this);
  4021. }
  4022. break;
  4023. case 13:
  4024. Vector3 scale2 = new Vector3(block.Data, 12);
  4025. Vector3 pos4 = new Vector3(block.Data, 0);
  4026. handlerUpdatePrimScale = OnUpdatePrimScale;
  4027. if (handlerUpdatePrimScale != null)
  4028. {
  4029. //m_log.Debug("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
  4030. handlerUpdatePrimScale(localId, scale2, this);
  4031. // Change the position based on scale (for bug number 246)
  4032. handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition;
  4033. // m_log.Debug("new movement position is " + pos.X + " , " + pos.Y + " , " + pos.Z);
  4034. if (handlerUpdatePrimSinglePosition != null)
  4035. {
  4036. handlerUpdatePrimSinglePosition(localId, pos4, this);
  4037. }
  4038. }
  4039. break;
  4040. case 29:
  4041. Vector3 scale5 = new Vector3(block.Data, 12);
  4042. Vector3 pos5 = new Vector3(block.Data, 0);
  4043. handlerUpdatePrimGroupScale = OnUpdatePrimGroupScale;
  4044. if (handlerUpdatePrimGroupScale != null)
  4045. {
  4046. // m_log.Debug("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
  4047. handlerUpdatePrimGroupScale(localId, scale5, this);
  4048. handlerUpdateVector = OnUpdatePrimGroupPosition;
  4049. if (handlerUpdateVector != null)
  4050. {
  4051. handlerUpdateVector(localId, pos5, this);
  4052. }
  4053. }
  4054. break;
  4055. case 21:
  4056. Vector3 scale6 = new Vector3(block.Data, 12);
  4057. Vector3 pos6 = new Vector3(block.Data, 0);
  4058. handlerUpdatePrimScale = OnUpdatePrimScale;
  4059. if (handlerUpdatePrimScale != null)
  4060. {
  4061. // m_log.Debug("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
  4062. handlerUpdatePrimScale(localId, scale6, this);
  4063. handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition;
  4064. if (handlerUpdatePrimSinglePosition != null)
  4065. {
  4066. handlerUpdatePrimSinglePosition(localId, pos6, this);
  4067. }
  4068. }
  4069. break;
  4070. default:
  4071. m_log.Debug("[CLIENT] MultipleObjUpdate recieved an unknown packet type: " + (block.Type));
  4072. break;
  4073. }
  4074. }
  4075. }
  4076. }
  4077. return true;
  4078. }
  4079. public void RequestMapLayer()
  4080. {
  4081. //should be getting the map layer from the grid server
  4082. //send a layer covering the 800,800 - 1200,1200 area (should be covering the requested area)
  4083. MapLayerReplyPacket mapReply = (MapLayerReplyPacket)PacketPool.Instance.GetPacket(PacketType.MapLayerReply);
  4084. // TODO: don't create new blocks if recycling an old packet
  4085. mapReply.AgentData.AgentID = AgentId;
  4086. mapReply.AgentData.Flags = 0;
  4087. mapReply.LayerData = new MapLayerReplyPacket.LayerDataBlock[1];
  4088. mapReply.LayerData[0] = new MapLayerReplyPacket.LayerDataBlock();
  4089. mapReply.LayerData[0].Bottom = 0;
  4090. mapReply.LayerData[0].Left = 0;
  4091. mapReply.LayerData[0].Top = 30000;
  4092. mapReply.LayerData[0].Right = 30000;
  4093. mapReply.LayerData[0].ImageID = new UUID("00000000-0000-1111-9999-000000000006");
  4094. mapReply.Header.Zerocoded = true;
  4095. OutPacket(mapReply, ThrottleOutPacketType.Land);
  4096. }
  4097. public void RequestMapBlocksX(int minX, int minY, int maxX, int maxY)
  4098. {
  4099. /*
  4100. IList simMapProfiles = m_gridServer.RequestMapBlocks(minX, minY, maxX, maxY);
  4101. MapBlockReplyPacket mbReply = new MapBlockReplyPacket();
  4102. mbReply.AgentData.AgentId = AgentId;
  4103. int len;
  4104. if (simMapProfiles == null)
  4105. len = 0;
  4106. else
  4107. len = simMapProfiles.Count;
  4108. mbReply.Data = new MapBlockReplyPacket.DataBlock[len];
  4109. int iii;
  4110. for (iii = 0; iii < len; iii++)
  4111. {
  4112. Hashtable mp = (Hashtable)simMapProfiles[iii];
  4113. mbReply.Data[iii] = new MapBlockReplyPacket.DataBlock();
  4114. mbReply.Data[iii].Name = System.Text.Encoding.UTF8.GetBytes((string)mp["name"]);
  4115. mbReply.Data[iii].Access = System.Convert.ToByte(mp["access"]);
  4116. mbReply.Data[iii].Agents = System.Convert.ToByte(mp["agents"]);
  4117. mbReply.Data[iii].MapImageID = new UUID((string)mp["map-image-id"]);
  4118. mbReply.Data[iii].RegionFlags = System.Convert.ToUInt32(mp["region-flags"]);
  4119. mbReply.Data[iii].WaterHeight = System.Convert.ToByte(mp["water-height"]);
  4120. mbReply.Data[iii].X = System.Convert.ToUInt16(mp["x"]);
  4121. mbReply.Data[iii].Y = System.Convert.ToUInt16(mp["y"]);
  4122. }
  4123. this.OutPacket(mbReply, ThrottleOutPacketType.Land);
  4124. */
  4125. }
  4126. /// <summary>
  4127. /// returns a byte array of the client set throttles Gets multiplied by the multiplier
  4128. ///
  4129. /// </summary>
  4130. /// <param name="multiplier">non 1 multiplier for subdividing the throttles between individual regions</param>
  4131. /// <returns></returns>
  4132. public byte[] GetThrottlesPacked(float multiplier)
  4133. {
  4134. return m_PacketHandler.PacketQueue.GetThrottlesPacked(multiplier);
  4135. }
  4136. /// <summary>
  4137. /// sets the throttles from values supplied by the client
  4138. /// </summary>
  4139. /// <param name="throttles"></param>
  4140. public void SetChildAgentThrottle(byte[] throttles)
  4141. {
  4142. m_PacketHandler.PacketQueue.SetThrottleFromClient(throttles);
  4143. }
  4144. /// <summary>
  4145. /// Method gets called when a new packet has arrived from the UDP
  4146. /// server. This happens after it's been decoded into a libsl object.
  4147. /// </summary>
  4148. /// <param name="NewPack">object containing the packet.</param>
  4149. public virtual void InPacket(object NewPack)
  4150. {
  4151. // Cast NewPack to Packet.
  4152. m_PacketHandler.InPacket((Packet) NewPack);
  4153. }
  4154. /// <summary>
  4155. /// This is the starting point for sending a simulator packet out to the client.
  4156. ///
  4157. /// Please do not call this from outside the LindenUDP client stack.
  4158. /// </summary>
  4159. /// <param name="NewPack"></param>
  4160. /// <param name="throttlePacketType">Corresponds to the type of data that is going out. Enum</param>
  4161. public void OutPacket(Packet NewPack, ThrottleOutPacketType throttlePacketType)
  4162. {
  4163. m_PacketHandler.OutPacket(NewPack, throttlePacketType);
  4164. }
  4165. public bool AddMoney(int debit)
  4166. {
  4167. if (m_moneyBalance + debit >= 0)
  4168. {
  4169. m_moneyBalance += debit;
  4170. SendMoneyBalance(UUID.Zero, true, Utils.StringToBytes("Poof Poof!"), m_moneyBalance);
  4171. return true;
  4172. }
  4173. return false;
  4174. }
  4175. /// <summary>
  4176. /// Breaks down the genericMessagePacket into specific events
  4177. /// </summary>
  4178. /// <param name="gmMethod"></param>
  4179. /// <param name="gmInvoice"></param>
  4180. /// <param name="gmParams"></param>
  4181. public void DecipherGenericMessage(string gmMethod, UUID gmInvoice, GenericMessagePacket.ParamListBlock[] gmParams)
  4182. {
  4183. switch (gmMethod)
  4184. {
  4185. case "autopilot":
  4186. float locx;
  4187. float locy;
  4188. float locz;
  4189. try
  4190. {
  4191. uint regionX;
  4192. uint regionY;
  4193. Utils.LongToUInts(Scene.RegionInfo.RegionHandle, out regionX, out regionY);
  4194. locx = Convert.ToSingle(Utils.BytesToString(gmParams[0].Parameter)) - regionX;
  4195. locy = Convert.ToSingle(Utils.BytesToString(gmParams[1].Parameter)) - regionY;
  4196. locz = Convert.ToSingle(Utils.BytesToString(gmParams[2].Parameter));
  4197. }
  4198. catch (InvalidCastException)
  4199. {
  4200. m_log.Error("[CLIENT]: Invalid autopilot request");
  4201. return;
  4202. }
  4203. handlerAutoPilotGo = OnAutoPilotGo;
  4204. if (handlerAutoPilotGo != null)
  4205. {
  4206. handlerAutoPilotGo(0, new Vector3(locx, locy, locz), this);
  4207. }
  4208. m_log.InfoFormat("[CLIENT]: Client Requests autopilot to position <{0},{1},{2}>", locx, locy, locz);
  4209. break;
  4210. default:
  4211. m_log.Debug("[CLIENT]: Unknown Generic Message, Method: " + gmMethod + ". Invoice: " + gmInvoice + ". Dumping Params:");
  4212. for (int hi = 0; hi < gmParams.Length; hi++)
  4213. {
  4214. Console.WriteLine(gmParams[hi].ToString());
  4215. }
  4216. //gmpack.MethodData.
  4217. break;
  4218. }
  4219. }
  4220. /// <summary>
  4221. /// Entryway from the client to the simulator. All UDP packets from the client will end up here
  4222. /// </summary>
  4223. /// <param name="Pack">OpenMetaverse.packet</param>
  4224. public void ProcessInPacket(Packet Pack)
  4225. {
  4226. if (ProcessPacketMethod(Pack))
  4227. {
  4228. return;
  4229. }
  4230. const bool m_checkPackets = true;
  4231. // Main packet processing conditional
  4232. switch (Pack.Type)
  4233. {
  4234. #region Scene/Avatar
  4235. case PacketType.AvatarPropertiesRequest:
  4236. AvatarPropertiesRequestPacket avatarProperties = (AvatarPropertiesRequestPacket)Pack;
  4237. #region Packet Session and User Check
  4238. if (m_checkPackets)
  4239. {
  4240. if (avatarProperties.AgentData.SessionID != SessionId ||
  4241. avatarProperties.AgentData.AgentID != AgentId)
  4242. break;
  4243. }
  4244. #endregion
  4245. handlerRequestAvatarProperties = OnRequestAvatarProperties;
  4246. if (handlerRequestAvatarProperties != null)
  4247. {
  4248. handlerRequestAvatarProperties(this, avatarProperties.AgentData.AvatarID);
  4249. }
  4250. break;
  4251. case PacketType.ChatFromViewer:
  4252. ChatFromViewerPacket inchatpack = (ChatFromViewerPacket)Pack;
  4253. #region Packet Session and User Check
  4254. if (m_checkPackets)
  4255. {
  4256. if (inchatpack.AgentData.SessionID != SessionId ||
  4257. inchatpack.AgentData.AgentID != AgentId)
  4258. break;
  4259. }
  4260. #endregion
  4261. string fromName = String.Empty; //ClientAvatar.firstname + " " + ClientAvatar.lastname;
  4262. byte[] message = inchatpack.ChatData.Message;
  4263. byte type = inchatpack.ChatData.Type;
  4264. Vector3 fromPos = new Vector3(); // ClientAvatar.Pos;
  4265. // UUID fromAgentID = AgentId;
  4266. int channel = inchatpack.ChatData.Channel;
  4267. if (OnChatFromClient != null)
  4268. {
  4269. OSChatMessage args = new OSChatMessage();
  4270. args.Channel = channel;
  4271. args.From = fromName;
  4272. args.Message = Utils.BytesToString(message);
  4273. args.Type = (ChatTypeEnum)type;
  4274. args.Position = fromPos;
  4275. args.Scene = Scene;
  4276. args.Sender = this;
  4277. args.SenderUUID = this.AgentId;
  4278. handlerChatFromClient = OnChatFromClient;
  4279. if (handlerChatFromClient != null)
  4280. handlerChatFromClient(this, args);
  4281. }
  4282. break;
  4283. case PacketType.AvatarPropertiesUpdate:
  4284. AvatarPropertiesUpdatePacket avatarProps = (AvatarPropertiesUpdatePacket)Pack;
  4285. #region Packet Session and User Check
  4286. if (m_checkPackets)
  4287. {
  4288. if (avatarProps.AgentData.SessionID != SessionId ||
  4289. avatarProps.AgentData.AgentID != AgentId)
  4290. break;
  4291. }
  4292. #endregion
  4293. handlerUpdateAvatarProperties = OnUpdateAvatarProperties;
  4294. if (handlerUpdateAvatarProperties != null)
  4295. {
  4296. AvatarPropertiesUpdatePacket.PropertiesDataBlock Properties = avatarProps.PropertiesData;
  4297. UserProfileData UserProfile = new UserProfileData();
  4298. UserProfile.ID = AgentId;
  4299. UserProfile.AboutText = Utils.BytesToString(Properties.AboutText);
  4300. UserProfile.FirstLifeAboutText = Utils.BytesToString(Properties.FLAboutText);
  4301. UserProfile.FirstLifeImage = Properties.FLImageID;
  4302. UserProfile.Image = Properties.ImageID;
  4303. UserProfile.ProfileUrl = Utils.BytesToString(Properties.ProfileURL);
  4304. handlerUpdateAvatarProperties(this, UserProfile);
  4305. }
  4306. break;
  4307. case PacketType.ScriptDialogReply:
  4308. ScriptDialogReplyPacket rdialog = (ScriptDialogReplyPacket)Pack;
  4309. #region Packet Session and User Check
  4310. if (m_checkPackets)
  4311. {
  4312. if (rdialog.AgentData.SessionID != SessionId ||
  4313. rdialog.AgentData.AgentID != AgentId)
  4314. break;
  4315. }
  4316. #endregion
  4317. int ch = rdialog.Data.ChatChannel;
  4318. byte[] msg = rdialog.Data.ButtonLabel;
  4319. if (OnChatFromClient != null)
  4320. {
  4321. OSChatMessage args = new OSChatMessage();
  4322. args.Channel = ch;
  4323. args.From = String.Empty;
  4324. args.Message = Utils.BytesToString(msg);
  4325. args.Type = ChatTypeEnum.Shout;
  4326. args.Position = new Vector3();
  4327. args.Scene = Scene;
  4328. args.Sender = this;
  4329. handlerChatFromClient2 = OnChatFromClient;
  4330. if (handlerChatFromClient2 != null)
  4331. handlerChatFromClient2(this, args);
  4332. }
  4333. break;
  4334. case PacketType.ImprovedInstantMessage:
  4335. ImprovedInstantMessagePacket msgpack = (ImprovedInstantMessagePacket)Pack;
  4336. #region Packet Session and User Check
  4337. if (m_checkPackets)
  4338. {
  4339. if (msgpack.AgentData.SessionID != SessionId ||
  4340. msgpack.AgentData.AgentID != AgentId)
  4341. break;
  4342. }
  4343. #endregion
  4344. string IMfromName = Util.FieldToString(msgpack.MessageBlock.FromAgentName);
  4345. string IMmessage = Utils.BytesToString(msgpack.MessageBlock.Message);
  4346. handlerInstantMessage = OnInstantMessage;
  4347. if (handlerInstantMessage != null)
  4348. {
  4349. GridInstantMessage im = new GridInstantMessage(Scene,
  4350. msgpack.AgentData.AgentID,
  4351. IMfromName,
  4352. msgpack.MessageBlock.ToAgentID,
  4353. msgpack.MessageBlock.Dialog,
  4354. msgpack.MessageBlock.FromGroup,
  4355. IMmessage,
  4356. msgpack.MessageBlock.ID,
  4357. msgpack.MessageBlock.Offline != 0 ? true : false,
  4358. msgpack.MessageBlock.Position,
  4359. msgpack.MessageBlock.BinaryBucket);
  4360. handlerInstantMessage(this, im);
  4361. }
  4362. break;
  4363. case PacketType.AcceptFriendship:
  4364. AcceptFriendshipPacket afriendpack = (AcceptFriendshipPacket)Pack;
  4365. #region Packet Session and User Check
  4366. if (m_checkPackets)
  4367. {
  4368. if (afriendpack.AgentData.SessionID != SessionId ||
  4369. afriendpack.AgentData.AgentID != AgentId)
  4370. break;
  4371. }
  4372. #endregion
  4373. // My guess is this is the folder to stick the calling card into
  4374. List<UUID> callingCardFolders = new List<UUID>();
  4375. UUID agentID = afriendpack.AgentData.AgentID;
  4376. UUID transactionID = afriendpack.TransactionBlock.TransactionID;
  4377. for (int fi = 0; fi < afriendpack.FolderData.Length; fi++)
  4378. {
  4379. callingCardFolders.Add(afriendpack.FolderData[fi].FolderID);
  4380. }
  4381. handlerApproveFriendRequest = OnApproveFriendRequest;
  4382. if (handlerApproveFriendRequest != null)
  4383. {
  4384. handlerApproveFriendRequest(this, agentID, transactionID, callingCardFolders);
  4385. }
  4386. break;
  4387. case PacketType.DeclineFriendship:
  4388. DeclineFriendshipPacket dfriendpack = (DeclineFriendshipPacket)Pack;
  4389. #region Packet Session and User Check
  4390. if (m_checkPackets)
  4391. {
  4392. if (dfriendpack.AgentData.SessionID != SessionId ||
  4393. dfriendpack.AgentData.AgentID != AgentId)
  4394. break;
  4395. }
  4396. #endregion
  4397. if (OnDenyFriendRequest != null)
  4398. {
  4399. OnDenyFriendRequest(this,
  4400. dfriendpack.AgentData.AgentID,
  4401. dfriendpack.TransactionBlock.TransactionID,
  4402. null);
  4403. }
  4404. break;
  4405. case PacketType.TerminateFriendship:
  4406. TerminateFriendshipPacket tfriendpack = (TerminateFriendshipPacket)Pack;
  4407. #region Packet Session and User Check
  4408. if (m_checkPackets)
  4409. {
  4410. if (tfriendpack.AgentData.SessionID != SessionId ||
  4411. tfriendpack.AgentData.AgentID != AgentId)
  4412. break;
  4413. }
  4414. #endregion
  4415. UUID listOwnerAgentID = tfriendpack.AgentData.AgentID;
  4416. UUID exFriendID = tfriendpack.ExBlock.OtherID;
  4417. handlerTerminateFriendship = OnTerminateFriendship;
  4418. if (handlerTerminateFriendship != null)
  4419. {
  4420. handlerTerminateFriendship(this, listOwnerAgentID, exFriendID);
  4421. }
  4422. break;
  4423. case PacketType.RezObject:
  4424. RezObjectPacket rezPacket = (RezObjectPacket)Pack;
  4425. #region Packet Session and User Check
  4426. if (m_checkPackets)
  4427. {
  4428. if (rezPacket.AgentData.SessionID != SessionId ||
  4429. rezPacket.AgentData.AgentID != AgentId)
  4430. break;
  4431. }
  4432. #endregion
  4433. handlerRezObject = OnRezObject;
  4434. if (handlerRezObject != null)
  4435. {
  4436. handlerRezObject(this, rezPacket.InventoryData.ItemID, rezPacket.RezData.RayEnd,
  4437. rezPacket.RezData.RayStart, rezPacket.RezData.RayTargetID,
  4438. rezPacket.RezData.BypassRaycast, rezPacket.RezData.RayEndIsIntersection,
  4439. rezPacket.RezData.RezSelected, rezPacket.RezData.RemoveItem,
  4440. rezPacket.RezData.FromTaskID);
  4441. }
  4442. break;
  4443. case PacketType.DeRezObject:
  4444. DeRezObjectPacket DeRezPacket = (DeRezObjectPacket) Pack;
  4445. #region Packet Session and User Check
  4446. if (m_checkPackets)
  4447. {
  4448. if (DeRezPacket.AgentData.SessionID != SessionId ||
  4449. DeRezPacket.AgentData.AgentID != AgentId)
  4450. break;
  4451. }
  4452. #endregion
  4453. handlerDeRezObject = OnDeRezObject;
  4454. if (handlerDeRezObject != null)
  4455. {
  4456. List<uint> deRezIDs = new List<uint>();
  4457. foreach (DeRezObjectPacket.ObjectDataBlock data in
  4458. DeRezPacket.ObjectData)
  4459. {
  4460. deRezIDs.Add(data.ObjectLocalID);
  4461. }
  4462. // It just so happens that the values on the DeRezAction enumerator match the Destination
  4463. // values given by a Second Life client
  4464. handlerDeRezObject(this, deRezIDs,
  4465. DeRezPacket.AgentBlock.GroupID,
  4466. (DeRezAction)DeRezPacket.AgentBlock.Destination,
  4467. DeRezPacket.AgentBlock.DestinationID);
  4468. }
  4469. break;
  4470. case PacketType.ModifyLand:
  4471. ModifyLandPacket modify = (ModifyLandPacket)Pack;
  4472. #region Packet Session and User Check
  4473. if (m_checkPackets)
  4474. {
  4475. if (modify.AgentData.SessionID != SessionId ||
  4476. modify.AgentData.AgentID != AgentId)
  4477. break;
  4478. }
  4479. #endregion
  4480. //m_log.Info("[LAND]: LAND:" + modify.ToString());
  4481. if (modify.ParcelData.Length > 0)
  4482. {
  4483. if (OnModifyTerrain != null)
  4484. {
  4485. for (int i = 0; i < modify.ParcelData.Length; i++)
  4486. {
  4487. handlerModifyTerrain = OnModifyTerrain;
  4488. if (handlerModifyTerrain != null)
  4489. {
  4490. handlerModifyTerrain(AgentId, modify.ModifyBlock.Height, modify.ModifyBlock.Seconds,
  4491. modify.ModifyBlock.BrushSize,
  4492. modify.ModifyBlock.Action, modify.ParcelData[i].North,
  4493. modify.ParcelData[i].West, modify.ParcelData[i].South,
  4494. modify.ParcelData[i].East, AgentId);
  4495. }
  4496. }
  4497. }
  4498. }
  4499. break;
  4500. case PacketType.RegionHandshakeReply:
  4501. handlerRegionHandShakeReply = OnRegionHandShakeReply;
  4502. if (handlerRegionHandShakeReply != null)
  4503. {
  4504. handlerRegionHandShakeReply(this);
  4505. }
  4506. break;
  4507. case PacketType.AgentWearablesRequest:
  4508. handlerRequestWearables = OnRequestWearables;
  4509. if (handlerRequestWearables != null)
  4510. {
  4511. handlerRequestWearables();
  4512. }
  4513. handlerRequestAvatarsData = OnRequestAvatarsData;
  4514. if (handlerRequestAvatarsData != null)
  4515. {
  4516. handlerRequestAvatarsData(this);
  4517. }
  4518. break;
  4519. case PacketType.AgentSetAppearance:
  4520. AgentSetAppearancePacket appear = (AgentSetAppearancePacket)Pack;
  4521. #region Packet Session and User Check
  4522. if (m_checkPackets)
  4523. {
  4524. if (appear.AgentData.SessionID != SessionId ||
  4525. appear.AgentData.AgentID != AgentId)
  4526. break;
  4527. }
  4528. #endregion
  4529. handlerSetAppearance = OnSetAppearance;
  4530. if (handlerSetAppearance != null)
  4531. {
  4532. // Temporarily protect ourselves from the mantis #951 failure.
  4533. // However, we could do this for several other handlers where a failure isn't terminal
  4534. // for the client session anyway, in order to protect ourselves against bad code in plugins
  4535. try
  4536. {
  4537. List<byte> visualparams = new List<byte>();
  4538. foreach (AgentSetAppearancePacket.VisualParamBlock x in appear.VisualParam)
  4539. {
  4540. visualparams.Add(x.ParamValue);
  4541. }
  4542. handlerSetAppearance(appear.ObjectData.TextureEntry, visualparams);
  4543. }
  4544. catch (Exception e)
  4545. {
  4546. m_log.ErrorFormat(
  4547. "[CLIENT VIEW]: AgentSetApperance packet handler threw an exception, {0}",
  4548. e);
  4549. }
  4550. }
  4551. break;
  4552. case PacketType.AgentIsNowWearing:
  4553. if (OnAvatarNowWearing != null)
  4554. {
  4555. AgentIsNowWearingPacket nowWearing = (AgentIsNowWearingPacket)Pack;
  4556. #region Packet Session and User Check
  4557. if (m_checkPackets)
  4558. {
  4559. if (nowWearing.AgentData.SessionID != SessionId ||
  4560. nowWearing.AgentData.AgentID != AgentId)
  4561. break;
  4562. }
  4563. #endregion
  4564. AvatarWearingArgs wearingArgs = new AvatarWearingArgs();
  4565. for (int i = 0; i < nowWearing.WearableData.Length; i++)
  4566. {
  4567. AvatarWearingArgs.Wearable wearable =
  4568. new AvatarWearingArgs.Wearable(nowWearing.WearableData[i].ItemID,
  4569. nowWearing.WearableData[i].WearableType);
  4570. wearingArgs.NowWearing.Add(wearable);
  4571. }
  4572. handlerAvatarNowWearing = OnAvatarNowWearing;
  4573. if (handlerAvatarNowWearing != null)
  4574. {
  4575. handlerAvatarNowWearing(this, wearingArgs);
  4576. }
  4577. }
  4578. break;
  4579. case PacketType.RezSingleAttachmentFromInv:
  4580. handlerRezSingleAttachment = OnRezSingleAttachmentFromInv;
  4581. if (handlerRezSingleAttachment != null)
  4582. {
  4583. RezSingleAttachmentFromInvPacket rez = (RezSingleAttachmentFromInvPacket)Pack;
  4584. #region Packet Session and User Check
  4585. if (m_checkPackets)
  4586. {
  4587. if (rez.AgentData.SessionID != SessionId ||
  4588. rez.AgentData.AgentID != AgentId)
  4589. break;
  4590. }
  4591. #endregion
  4592. handlerRezSingleAttachment(this, rez.ObjectData.ItemID,
  4593. rez.ObjectData.AttachmentPt);
  4594. }
  4595. break;
  4596. case PacketType.RezMultipleAttachmentsFromInv:
  4597. handlerRezMultipleAttachments = OnRezMultipleAttachmentsFromInv;
  4598. if (handlerRezMultipleAttachments != null)
  4599. {
  4600. RezMultipleAttachmentsFromInvPacket rez = (RezMultipleAttachmentsFromInvPacket)Pack;
  4601. handlerRezMultipleAttachments(this, rez.HeaderData,
  4602. rez.ObjectData);
  4603. }
  4604. break;
  4605. case PacketType.DetachAttachmentIntoInv:
  4606. handlerDetachAttachmentIntoInv = OnDetachAttachmentIntoInv;
  4607. if (handlerDetachAttachmentIntoInv != null)
  4608. {
  4609. DetachAttachmentIntoInvPacket detachtoInv = (DetachAttachmentIntoInvPacket)Pack;
  4610. #region Packet Session and User Check
  4611. // UNSUPPORTED ON THIS PACKET
  4612. #endregion
  4613. UUID itemID = detachtoInv.ObjectData.ItemID;
  4614. // UUID ATTACH_agentID = detachtoInv.ObjectData.AgentID;
  4615. handlerDetachAttachmentIntoInv(itemID, this);
  4616. }
  4617. break;
  4618. case PacketType.ObjectAttach:
  4619. if (OnObjectAttach != null)
  4620. {
  4621. ObjectAttachPacket att = (ObjectAttachPacket)Pack;
  4622. #region Packet Session and User Check
  4623. if (m_checkPackets)
  4624. {
  4625. if (att.AgentData.SessionID != SessionId ||
  4626. att.AgentData.AgentID != AgentId)
  4627. break;
  4628. }
  4629. #endregion
  4630. handlerObjectAttach = OnObjectAttach;
  4631. if (handlerObjectAttach != null)
  4632. {
  4633. if (att.ObjectData.Length > 0)
  4634. {
  4635. handlerObjectAttach(this, att.ObjectData[0].ObjectLocalID, att.AgentData.AttachmentPoint, att.ObjectData[0].Rotation, false);
  4636. }
  4637. }
  4638. }
  4639. break;
  4640. case PacketType.ObjectDetach:
  4641. ObjectDetachPacket dett = (ObjectDetachPacket)Pack;
  4642. #region Packet Session and User Check
  4643. if (m_checkPackets)
  4644. {
  4645. if (dett.AgentData.SessionID != SessionId ||
  4646. dett.AgentData.AgentID != AgentId)
  4647. break;
  4648. }
  4649. #endregion
  4650. for (int j = 0; j < dett.ObjectData.Length; j++)
  4651. {
  4652. uint obj = dett.ObjectData[j].ObjectLocalID;
  4653. handlerObjectDetach = OnObjectDetach;
  4654. if (handlerObjectDetach != null)
  4655. {
  4656. handlerObjectDetach(obj, this);
  4657. }
  4658. }
  4659. break;
  4660. case PacketType.ObjectDrop:
  4661. ObjectDropPacket dropp = (ObjectDropPacket)Pack;
  4662. #region Packet Session and User Check
  4663. if (m_checkPackets)
  4664. {
  4665. if (dropp.AgentData.SessionID != SessionId ||
  4666. dropp.AgentData.AgentID != AgentId)
  4667. break;
  4668. }
  4669. #endregion
  4670. for (int j = 0; j < dropp.ObjectData.Length; j++)
  4671. {
  4672. uint obj = dropp.ObjectData[j].ObjectLocalID;
  4673. handlerObjectDrop = OnObjectDrop;
  4674. if (handlerObjectDrop != null)
  4675. {
  4676. handlerObjectDrop(obj, this);
  4677. }
  4678. }
  4679. break;
  4680. case PacketType.SetAlwaysRun:
  4681. SetAlwaysRunPacket run = (SetAlwaysRunPacket)Pack;
  4682. #region Packet Session and User Check
  4683. if (m_checkPackets)
  4684. {
  4685. if (run.AgentData.SessionID != SessionId ||
  4686. run.AgentData.AgentID != AgentId)
  4687. break;
  4688. }
  4689. #endregion
  4690. handlerSetAlwaysRun = OnSetAlwaysRun;
  4691. if (handlerSetAlwaysRun != null)
  4692. handlerSetAlwaysRun(this, run.AgentData.AlwaysRun);
  4693. break;
  4694. case PacketType.CompleteAgentMovement:
  4695. handlerCompleteMovementToRegion = OnCompleteMovementToRegion;
  4696. if (handlerCompleteMovementToRegion != null)
  4697. {
  4698. handlerCompleteMovementToRegion();
  4699. }
  4700. handlerCompleteMovementToRegion = null;
  4701. break;
  4702. case PacketType.AgentUpdate:
  4703. if (OnAgentUpdate != null)
  4704. {
  4705. bool update = false;
  4706. AgentUpdatePacket agenUpdate = (AgentUpdatePacket)Pack;
  4707. #region Packet Session and User Check
  4708. if (m_checkPackets)
  4709. {
  4710. if (agenUpdate.AgentData.SessionID != SessionId ||
  4711. agenUpdate.AgentData.AgentID != AgentId)
  4712. break;
  4713. }
  4714. #endregion
  4715. AgentUpdatePacket.AgentDataBlock x = agenUpdate.AgentData;
  4716. // We can only check when we have something to check
  4717. // against.
  4718. if (lastarg != null)
  4719. {
  4720. update =
  4721. (
  4722. (x.BodyRotation != lastarg.BodyRotation) ||
  4723. (x.CameraAtAxis != lastarg.CameraAtAxis) ||
  4724. (x.CameraCenter != lastarg.CameraCenter) ||
  4725. (x.CameraLeftAxis != lastarg.CameraLeftAxis) ||
  4726. (x.CameraUpAxis != lastarg.CameraUpAxis) ||
  4727. (x.ControlFlags != lastarg.ControlFlags) ||
  4728. (x.Far != lastarg.Far) ||
  4729. (x.Flags != lastarg.Flags) ||
  4730. (x.State != lastarg.State) ||
  4731. (x.HeadRotation != lastarg.HeadRotation) ||
  4732. (x.SessionID != lastarg.SessionID) ||
  4733. (x.AgentID != lastarg.AgentID)
  4734. );
  4735. }
  4736. else
  4737. update = true;
  4738. // These should be ordered from most-likely to
  4739. // least likely to change. I've made an initial
  4740. // guess at that.
  4741. if (update)
  4742. {
  4743. AgentUpdateArgs arg = new AgentUpdateArgs();
  4744. arg.AgentID = x.AgentID;
  4745. arg.BodyRotation = x.BodyRotation;
  4746. arg.CameraAtAxis = x.CameraAtAxis;
  4747. arg.CameraCenter = x.CameraCenter;
  4748. arg.CameraLeftAxis = x.CameraLeftAxis;
  4749. arg.CameraUpAxis = x.CameraUpAxis;
  4750. arg.ControlFlags = x.ControlFlags;
  4751. arg.Far = x.Far;
  4752. arg.Flags = x.Flags;
  4753. arg.HeadRotation = x.HeadRotation;
  4754. arg.SessionID = x.SessionID;
  4755. arg.State = x.State;
  4756. handlerAgentUpdate = OnAgentUpdate;
  4757. lastarg = arg; // save this set of arguments for nexttime
  4758. if (handlerAgentUpdate != null)
  4759. OnAgentUpdate(this, arg);
  4760. handlerAgentUpdate = null;
  4761. }
  4762. }
  4763. break;
  4764. case PacketType.AgentAnimation:
  4765. AgentAnimationPacket AgentAni = (AgentAnimationPacket)Pack;
  4766. #region Packet Session and User Check
  4767. if (m_checkPackets)
  4768. {
  4769. if (AgentAni.AgentData.SessionID != SessionId ||
  4770. AgentAni.AgentData.AgentID != AgentId)
  4771. break;
  4772. }
  4773. #endregion
  4774. handlerStartAnim = null;
  4775. handlerStopAnim = null;
  4776. for (int i = 0; i < AgentAni.AnimationList.Length; i++)
  4777. {
  4778. if (AgentAni.AnimationList[i].StartAnim)
  4779. {
  4780. handlerStartAnim = OnStartAnim;
  4781. if (handlerStartAnim != null)
  4782. {
  4783. handlerStartAnim(this, AgentAni.AnimationList[i].AnimID);
  4784. }
  4785. }
  4786. else
  4787. {
  4788. handlerStopAnim = OnStopAnim;
  4789. if (handlerStopAnim != null)
  4790. {
  4791. handlerStopAnim(this, AgentAni.AnimationList[i].AnimID);
  4792. }
  4793. }
  4794. }
  4795. break;
  4796. case PacketType.AgentRequestSit:
  4797. if (OnAgentRequestSit != null)
  4798. {
  4799. AgentRequestSitPacket agentRequestSit = (AgentRequestSitPacket)Pack;
  4800. #region Packet Session and User Check
  4801. if (m_checkPackets)
  4802. {
  4803. if (agentRequestSit.AgentData.SessionID != SessionId ||
  4804. agentRequestSit.AgentData.AgentID != AgentId)
  4805. break;
  4806. }
  4807. #endregion
  4808. handlerAgentRequestSit = OnAgentRequestSit;
  4809. if (handlerAgentRequestSit != null)
  4810. handlerAgentRequestSit(this, agentRequestSit.AgentData.AgentID,
  4811. agentRequestSit.TargetObject.TargetID, agentRequestSit.TargetObject.Offset);
  4812. }
  4813. break;
  4814. case PacketType.AgentSit:
  4815. if (OnAgentSit != null)
  4816. {
  4817. AgentSitPacket agentSit = (AgentSitPacket)Pack;
  4818. #region Packet Session and User Check
  4819. if (m_checkPackets)
  4820. {
  4821. if (agentSit.AgentData.SessionID != SessionId ||
  4822. agentSit.AgentData.AgentID != AgentId)
  4823. break;
  4824. }
  4825. #endregion
  4826. handlerAgentSit = OnAgentSit;
  4827. if (handlerAgentSit != null)
  4828. {
  4829. OnAgentSit(this, agentSit.AgentData.AgentID);
  4830. }
  4831. }
  4832. break;
  4833. case PacketType.SoundTrigger:
  4834. SoundTriggerPacket soundTriggerPacket = (SoundTriggerPacket)Pack;
  4835. #region Packet Session and User Check
  4836. if (m_checkPackets)
  4837. {
  4838. // UNSUPPORTED ON THIS PACKET
  4839. }
  4840. #endregion
  4841. handlerSoundTrigger = OnSoundTrigger;
  4842. if (handlerSoundTrigger != null)
  4843. {
  4844. handlerSoundTrigger(soundTriggerPacket.SoundData.SoundID, soundTriggerPacket.SoundData.OwnerID,
  4845. soundTriggerPacket.SoundData.ObjectID, soundTriggerPacket.SoundData.ParentID,
  4846. soundTriggerPacket.SoundData.Gain, soundTriggerPacket.SoundData.Position,
  4847. soundTriggerPacket.SoundData.Handle);
  4848. }
  4849. break;
  4850. case PacketType.AvatarPickerRequest:
  4851. AvatarPickerRequestPacket avRequestQuery = (AvatarPickerRequestPacket)Pack;
  4852. #region Packet Session and User Check
  4853. if (m_checkPackets)
  4854. {
  4855. if (avRequestQuery.AgentData.SessionID != SessionId ||
  4856. avRequestQuery.AgentData.AgentID != AgentId)
  4857. break;
  4858. }
  4859. #endregion
  4860. AvatarPickerRequestPacket.AgentDataBlock Requestdata = avRequestQuery.AgentData;
  4861. AvatarPickerRequestPacket.DataBlock querydata = avRequestQuery.Data;
  4862. //m_log.Debug("Agent Sends:" + Utils.BytesToString(querydata.Name));
  4863. handlerAvatarPickerRequest = OnAvatarPickerRequest;
  4864. if (handlerAvatarPickerRequest != null)
  4865. {
  4866. handlerAvatarPickerRequest(this, Requestdata.AgentID, Requestdata.QueryID,
  4867. Utils.BytesToString(querydata.Name));
  4868. }
  4869. break;
  4870. case PacketType.AgentDataUpdateRequest:
  4871. AgentDataUpdateRequestPacket avRequestDataUpdatePacket = (AgentDataUpdateRequestPacket)Pack;
  4872. #region Packet Session and User Check
  4873. if (m_checkPackets)
  4874. {
  4875. if (avRequestDataUpdatePacket.AgentData.SessionID != SessionId ||
  4876. avRequestDataUpdatePacket.AgentData.AgentID != AgentId)
  4877. break;
  4878. }
  4879. #endregion
  4880. handlerAgentDataUpdateRequest = OnAgentDataUpdateRequest;
  4881. if (handlerAgentDataUpdateRequest != null)
  4882. {
  4883. handlerAgentDataUpdateRequest(this, avRequestDataUpdatePacket.AgentData.AgentID, avRequestDataUpdatePacket.AgentData.SessionID);
  4884. }
  4885. break;
  4886. case PacketType.UserInfoRequest:
  4887. handlerUserInfoRequest = OnUserInfoRequest;
  4888. if (handlerUserInfoRequest != null)
  4889. {
  4890. handlerUserInfoRequest(this);
  4891. }
  4892. else
  4893. {
  4894. SendUserInfoReply(false, true, "");
  4895. }
  4896. break;
  4897. case PacketType.UpdateUserInfo:
  4898. UpdateUserInfoPacket updateUserInfo = (UpdateUserInfoPacket)Pack;
  4899. #region Packet Session and User Check
  4900. if (m_checkPackets)
  4901. {
  4902. if (updateUserInfo.AgentData.SessionID != SessionId ||
  4903. updateUserInfo.AgentData.AgentID != AgentId)
  4904. break;
  4905. }
  4906. #endregion
  4907. handlerUpdateUserInfo = OnUpdateUserInfo;
  4908. if (handlerUpdateUserInfo != null)
  4909. {
  4910. bool visible = true;
  4911. string DirectoryVisibility =
  4912. Utils.BytesToString(updateUserInfo.UserData.DirectoryVisibility);
  4913. if (DirectoryVisibility == "hidden")
  4914. visible = false;
  4915. handlerUpdateUserInfo(
  4916. updateUserInfo.UserData.IMViaEMail,
  4917. visible, this);
  4918. }
  4919. break;
  4920. case PacketType.SetStartLocationRequest:
  4921. SetStartLocationRequestPacket avSetStartLocationRequestPacket = (SetStartLocationRequestPacket)Pack;
  4922. #region Packet Session and User Check
  4923. if (m_checkPackets)
  4924. {
  4925. if (avSetStartLocationRequestPacket.AgentData.SessionID != SessionId ||
  4926. avSetStartLocationRequestPacket.AgentData.AgentID != AgentId)
  4927. break;
  4928. }
  4929. #endregion
  4930. if (avSetStartLocationRequestPacket.AgentData.AgentID == AgentId && avSetStartLocationRequestPacket.AgentData.SessionID == SessionId)
  4931. {
  4932. handlerSetStartLocationRequest = OnSetStartLocationRequest;
  4933. if (handlerSetStartLocationRequest != null)
  4934. {
  4935. handlerSetStartLocationRequest(this, 0, avSetStartLocationRequestPacket.StartLocationData.LocationPos,
  4936. avSetStartLocationRequestPacket.StartLocationData.LocationLookAt,
  4937. avSetStartLocationRequestPacket.StartLocationData.LocationID);
  4938. }
  4939. }
  4940. break;
  4941. case PacketType.AgentThrottle:
  4942. AgentThrottlePacket atpack = (AgentThrottlePacket)Pack;
  4943. #region Packet Session and User Check
  4944. if (m_checkPackets)
  4945. {
  4946. if (atpack.AgentData.SessionID != SessionId ||
  4947. atpack.AgentData.AgentID != AgentId)
  4948. break;
  4949. }
  4950. #endregion
  4951. m_PacketHandler.PacketQueue.SetThrottleFromClient(atpack.Throttle.Throttles);
  4952. break;
  4953. case PacketType.AgentPause:
  4954. m_probesWithNoIngressPackets = 0;
  4955. m_clientBlocked = true;
  4956. break;
  4957. case PacketType.AgentResume:
  4958. m_probesWithNoIngressPackets = 0;
  4959. m_clientBlocked = false;
  4960. SendStartPingCheck(0);
  4961. break;
  4962. case PacketType.ForceScriptControlRelease:
  4963. handlerForceReleaseControls = OnForceReleaseControls;
  4964. if (handlerForceReleaseControls != null)
  4965. {
  4966. handlerForceReleaseControls(this, AgentId);
  4967. }
  4968. break;
  4969. #endregion
  4970. #region Objects/m_sceneObjects
  4971. case PacketType.ObjectLink:
  4972. ObjectLinkPacket link = (ObjectLinkPacket)Pack;
  4973. #region Packet Session and User Check
  4974. if (m_checkPackets)
  4975. {
  4976. if (link.AgentData.SessionID != SessionId ||
  4977. link.AgentData.AgentID != AgentId)
  4978. break;
  4979. }
  4980. #endregion
  4981. uint parentprimid = 0;
  4982. List<uint> childrenprims = new List<uint>();
  4983. if (link.ObjectData.Length > 1)
  4984. {
  4985. parentprimid = link.ObjectData[0].ObjectLocalID;
  4986. for (int i = 1; i < link.ObjectData.Length; i++)
  4987. {
  4988. childrenprims.Add(link.ObjectData[i].ObjectLocalID);
  4989. }
  4990. }
  4991. handlerLinkObjects = OnLinkObjects;
  4992. if (handlerLinkObjects != null)
  4993. {
  4994. handlerLinkObjects(this, parentprimid, childrenprims);
  4995. }
  4996. break;
  4997. case PacketType.ObjectDelink:
  4998. ObjectDelinkPacket delink = (ObjectDelinkPacket)Pack;
  4999. #region Packet Session and User Check
  5000. if (m_checkPackets)
  5001. {
  5002. if (delink.AgentData.SessionID != SessionId ||
  5003. delink.AgentData.AgentID != AgentId)
  5004. break;
  5005. }
  5006. #endregion
  5007. // It appears the prim at index 0 is not always the root prim (for
  5008. // instance, when one prim of a link set has been edited independently
  5009. // of the others). Therefore, we'll pass all the ids onto the delink
  5010. // method for it to decide which is the root.
  5011. List<uint> prims = new List<uint>();
  5012. for (int i = 0; i < delink.ObjectData.Length; i++)
  5013. {
  5014. prims.Add(delink.ObjectData[i].ObjectLocalID);
  5015. }
  5016. handlerDelinkObjects = OnDelinkObjects;
  5017. if (handlerDelinkObjects != null)
  5018. {
  5019. handlerDelinkObjects(prims);
  5020. }
  5021. break;
  5022. case PacketType.ObjectAdd:
  5023. if (OnAddPrim != null)
  5024. {
  5025. ObjectAddPacket addPacket = (ObjectAddPacket)Pack;
  5026. #region Packet Session and User Check
  5027. if (m_checkPackets)
  5028. {
  5029. if (addPacket.AgentData.SessionID != SessionId ||
  5030. addPacket.AgentData.AgentID != AgentId)
  5031. break;
  5032. }
  5033. #endregion
  5034. PrimitiveBaseShape shape = GetShapeFromAddPacket(addPacket);
  5035. // m_log.Info("[REZData]: " + addPacket.ToString());
  5036. //BypassRaycast: 1
  5037. //RayStart: <69.79469, 158.2652, 98.40343>
  5038. //RayEnd: <61.97724, 141.995, 92.58341>
  5039. //RayTargetID: 00000000-0000-0000-0000-000000000000
  5040. //Check to see if adding the prim is allowed; useful for any module wanting to restrict the
  5041. //object from rezing initially
  5042. handlerAddPrim = OnAddPrim;
  5043. if (handlerAddPrim != null)
  5044. handlerAddPrim(AgentId, ActiveGroupId, addPacket.ObjectData.RayEnd, addPacket.ObjectData.Rotation, shape, addPacket.ObjectData.BypassRaycast, addPacket.ObjectData.RayStart, addPacket.ObjectData.RayTargetID, addPacket.ObjectData.RayEndIsIntersection);
  5045. }
  5046. break;
  5047. case PacketType.ObjectShape:
  5048. ObjectShapePacket shapePacket = (ObjectShapePacket)Pack;
  5049. #region Packet Session and User Check
  5050. if (m_checkPackets)
  5051. {
  5052. if (shapePacket.AgentData.SessionID != SessionId ||
  5053. shapePacket.AgentData.AgentID != AgentId)
  5054. break;
  5055. }
  5056. #endregion
  5057. handlerUpdatePrimShape = null;
  5058. for (int i = 0; i < shapePacket.ObjectData.Length; i++)
  5059. {
  5060. handlerUpdatePrimShape = OnUpdatePrimShape;
  5061. if (handlerUpdatePrimShape != null)
  5062. {
  5063. UpdateShapeArgs shapeData = new UpdateShapeArgs();
  5064. shapeData.ObjectLocalID = shapePacket.ObjectData[i].ObjectLocalID;
  5065. shapeData.PathBegin = shapePacket.ObjectData[i].PathBegin;
  5066. shapeData.PathCurve = shapePacket.ObjectData[i].PathCurve;
  5067. shapeData.PathEnd = shapePacket.ObjectData[i].PathEnd;
  5068. shapeData.PathRadiusOffset = shapePacket.ObjectData[i].PathRadiusOffset;
  5069. shapeData.PathRevolutions = shapePacket.ObjectData[i].PathRevolutions;
  5070. shapeData.PathScaleX = shapePacket.ObjectData[i].PathScaleX;
  5071. shapeData.PathScaleY = shapePacket.ObjectData[i].PathScaleY;
  5072. shapeData.PathShearX = shapePacket.ObjectData[i].PathShearX;
  5073. shapeData.PathShearY = shapePacket.ObjectData[i].PathShearY;
  5074. shapeData.PathSkew = shapePacket.ObjectData[i].PathSkew;
  5075. shapeData.PathTaperX = shapePacket.ObjectData[i].PathTaperX;
  5076. shapeData.PathTaperY = shapePacket.ObjectData[i].PathTaperY;
  5077. shapeData.PathTwist = shapePacket.ObjectData[i].PathTwist;
  5078. shapeData.PathTwistBegin = shapePacket.ObjectData[i].PathTwistBegin;
  5079. shapeData.ProfileBegin = shapePacket.ObjectData[i].ProfileBegin;
  5080. shapeData.ProfileCurve = shapePacket.ObjectData[i].ProfileCurve;
  5081. shapeData.ProfileEnd = shapePacket.ObjectData[i].ProfileEnd;
  5082. shapeData.ProfileHollow = shapePacket.ObjectData[i].ProfileHollow;
  5083. handlerUpdatePrimShape(m_agentId, shapePacket.ObjectData[i].ObjectLocalID,
  5084. shapeData);
  5085. }
  5086. }
  5087. break;
  5088. case PacketType.ObjectExtraParams:
  5089. ObjectExtraParamsPacket extraPar = (ObjectExtraParamsPacket)Pack;
  5090. #region Packet Session and User Check
  5091. if (m_checkPackets)
  5092. {
  5093. if (extraPar.AgentData.SessionID != SessionId ||
  5094. extraPar.AgentData.AgentID != AgentId)
  5095. break;
  5096. }
  5097. #endregion
  5098. handlerUpdateExtraParams = OnUpdateExtraParams;
  5099. if (handlerUpdateExtraParams != null)
  5100. {
  5101. for (int i = 0 ; i < extraPar.ObjectData.Length ; i++)
  5102. {
  5103. handlerUpdateExtraParams(m_agentId, extraPar.ObjectData[i].ObjectLocalID,
  5104. extraPar.ObjectData[i].ParamType,
  5105. extraPar.ObjectData[i].ParamInUse, extraPar.ObjectData[i].ParamData);
  5106. }
  5107. }
  5108. break;
  5109. case PacketType.ObjectDuplicate:
  5110. ObjectDuplicatePacket dupe = (ObjectDuplicatePacket)Pack;
  5111. #region Packet Session and User Check
  5112. if (m_checkPackets)
  5113. {
  5114. if (dupe.AgentData.SessionID != SessionId ||
  5115. dupe.AgentData.AgentID != AgentId)
  5116. break;
  5117. }
  5118. #endregion
  5119. ObjectDuplicatePacket.AgentDataBlock AgentandGroupData = dupe.AgentData;
  5120. handlerObjectDuplicate = null;
  5121. for (int i = 0; i < dupe.ObjectData.Length; i++)
  5122. {
  5123. handlerObjectDuplicate = OnObjectDuplicate;
  5124. if (handlerObjectDuplicate != null)
  5125. {
  5126. handlerObjectDuplicate(dupe.ObjectData[i].ObjectLocalID, dupe.SharedData.Offset,
  5127. dupe.SharedData.DuplicateFlags, AgentandGroupData.AgentID,
  5128. AgentandGroupData.GroupID);
  5129. }
  5130. }
  5131. break;
  5132. case PacketType.RequestMultipleObjects:
  5133. RequestMultipleObjectsPacket incomingRequest = (RequestMultipleObjectsPacket)Pack;
  5134. #region Packet Session and User Check
  5135. if (m_checkPackets)
  5136. {
  5137. if (incomingRequest.AgentData.SessionID != SessionId ||
  5138. incomingRequest.AgentData.AgentID != AgentId)
  5139. break;
  5140. }
  5141. #endregion
  5142. handlerObjectRequest = null;
  5143. for (int i = 0; i < incomingRequest.ObjectData.Length; i++)
  5144. {
  5145. handlerObjectRequest = OnObjectRequest;
  5146. if (handlerObjectRequest != null)
  5147. {
  5148. handlerObjectRequest(incomingRequest.ObjectData[i].ID, this);
  5149. }
  5150. }
  5151. break;
  5152. case PacketType.ObjectSelect:
  5153. ObjectSelectPacket incomingselect = (ObjectSelectPacket)Pack;
  5154. #region Packet Session and User Check
  5155. if (m_checkPackets)
  5156. {
  5157. if (incomingselect.AgentData.SessionID != SessionId ||
  5158. incomingselect.AgentData.AgentID != AgentId)
  5159. break;
  5160. }
  5161. #endregion
  5162. handlerObjectSelect = null;
  5163. for (int i = 0; i < incomingselect.ObjectData.Length; i++)
  5164. {
  5165. handlerObjectSelect = OnObjectSelect;
  5166. if (handlerObjectSelect != null)
  5167. {
  5168. handlerObjectSelect(incomingselect.ObjectData[i].ObjectLocalID, this);
  5169. }
  5170. }
  5171. break;
  5172. case PacketType.ObjectDeselect:
  5173. ObjectDeselectPacket incomingdeselect = (ObjectDeselectPacket)Pack;
  5174. #region Packet Session and User Check
  5175. if (m_checkPackets)
  5176. {
  5177. if (incomingdeselect.AgentData.SessionID != SessionId ||
  5178. incomingdeselect.AgentData.AgentID != AgentId)
  5179. break;
  5180. }
  5181. #endregion
  5182. handlerObjectDeselect = null;
  5183. for (int i = 0; i < incomingdeselect.ObjectData.Length; i++)
  5184. {
  5185. handlerObjectDeselect = OnObjectDeselect;
  5186. if (handlerObjectDeselect != null)
  5187. {
  5188. OnObjectDeselect(incomingdeselect.ObjectData[i].ObjectLocalID, this);
  5189. }
  5190. }
  5191. break;
  5192. case PacketType.ObjectPosition:
  5193. // DEPRECATED: but till libsecondlife removes it, people will use it
  5194. ObjectPositionPacket position = (ObjectPositionPacket)Pack;
  5195. #region Packet Session and User Check
  5196. if (m_checkPackets)
  5197. {
  5198. if (position.AgentData.SessionID != SessionId ||
  5199. position.AgentData.AgentID != AgentId)
  5200. break;
  5201. }
  5202. #endregion
  5203. for (int i = 0; i < position.ObjectData.Length; i++)
  5204. {
  5205. handlerUpdateVector = OnUpdatePrimGroupPosition;
  5206. if (handlerUpdateVector != null)
  5207. handlerUpdateVector(position.ObjectData[i].ObjectLocalID, position.ObjectData[i].Position, this);
  5208. }
  5209. break;
  5210. case PacketType.ObjectScale:
  5211. // DEPRECATED: but till libsecondlife removes it, people will use it
  5212. ObjectScalePacket scale = (ObjectScalePacket)Pack;
  5213. #region Packet Session and User Check
  5214. if (m_checkPackets)
  5215. {
  5216. if (scale.AgentData.SessionID != SessionId ||
  5217. scale.AgentData.AgentID != AgentId)
  5218. break;
  5219. }
  5220. #endregion
  5221. for (int i = 0; i < scale.ObjectData.Length; i++)
  5222. {
  5223. handlerUpdatePrimGroupScale = OnUpdatePrimGroupScale;
  5224. if (handlerUpdatePrimGroupScale != null)
  5225. handlerUpdatePrimGroupScale(scale.ObjectData[i].ObjectLocalID, scale.ObjectData[i].Scale, this);
  5226. }
  5227. break;
  5228. case PacketType.ObjectRotation:
  5229. // DEPRECATED: but till libsecondlife removes it, people will use it
  5230. ObjectRotationPacket rotation = (ObjectRotationPacket)Pack;
  5231. #region Packet Session and User Check
  5232. if (m_checkPackets)
  5233. {
  5234. if (rotation.AgentData.SessionID != SessionId ||
  5235. rotation.AgentData.AgentID != AgentId)
  5236. break;
  5237. }
  5238. #endregion
  5239. for (int i = 0; i < rotation.ObjectData.Length; i++)
  5240. {
  5241. handlerUpdatePrimRotation = OnUpdatePrimGroupRotation;
  5242. if (handlerUpdatePrimRotation != null)
  5243. handlerUpdatePrimRotation(rotation.ObjectData[i].ObjectLocalID, rotation.ObjectData[i].Rotation, this);
  5244. }
  5245. break;
  5246. case PacketType.ObjectFlagUpdate:
  5247. ObjectFlagUpdatePacket flags = (ObjectFlagUpdatePacket)Pack;
  5248. #region Packet Session and User Check
  5249. if (m_checkPackets)
  5250. {
  5251. if (flags.AgentData.SessionID != SessionId ||
  5252. flags.AgentData.AgentID != AgentId)
  5253. break;
  5254. }
  5255. #endregion
  5256. handlerUpdatePrimFlags = OnUpdatePrimFlags;
  5257. if (handlerUpdatePrimFlags != null)
  5258. {
  5259. byte[] data = Pack.ToBytes();
  5260. // 46,47,48 are special positions within the packet
  5261. // This may change so perhaps we need a better way
  5262. // of storing this (OMV.FlagUpdatePacket.UsePhysics,etc?)
  5263. bool UsePhysics = (data[46] != 0) ? true : false;
  5264. bool IsTemporary = (data[47] != 0) ? true : false;
  5265. bool IsPhantom = (data[48] != 0) ? true : false;
  5266. handlerUpdatePrimFlags(flags.AgentData.ObjectLocalID, UsePhysics, IsTemporary, IsPhantom, this);
  5267. }
  5268. break;
  5269. case PacketType.ObjectImage:
  5270. ObjectImagePacket imagePack = (ObjectImagePacket)Pack;
  5271. handlerUpdatePrimTexture = null;
  5272. for (int i = 0; i < imagePack.ObjectData.Length; i++)
  5273. {
  5274. handlerUpdatePrimTexture = OnUpdatePrimTexture;
  5275. if (handlerUpdatePrimTexture != null)
  5276. {
  5277. handlerUpdatePrimTexture(imagePack.ObjectData[i].ObjectLocalID,
  5278. imagePack.ObjectData[i].TextureEntry, this);
  5279. }
  5280. }
  5281. break;
  5282. case PacketType.ObjectGrab:
  5283. ObjectGrabPacket grab = (ObjectGrabPacket)Pack;
  5284. #region Packet Session and User Check
  5285. if (m_checkPackets)
  5286. {
  5287. if (grab.AgentData.SessionID != SessionId ||
  5288. grab.AgentData.AgentID != AgentId)
  5289. break;
  5290. }
  5291. #endregion
  5292. handlerGrabObject = OnGrabObject;
  5293. if (handlerGrabObject != null)
  5294. {
  5295. List<SurfaceTouchEventArgs> touchArgs = new List<SurfaceTouchEventArgs>();
  5296. if ((grab.SurfaceInfo != null) && (grab.SurfaceInfo.Length > 0))
  5297. {
  5298. foreach (ObjectGrabPacket.SurfaceInfoBlock surfaceInfo in grab.SurfaceInfo)
  5299. {
  5300. SurfaceTouchEventArgs arg = new SurfaceTouchEventArgs();
  5301. arg.Binormal = surfaceInfo.Binormal;
  5302. arg.FaceIndex = surfaceInfo.FaceIndex;
  5303. arg.Normal = surfaceInfo.Normal;
  5304. arg.Position = surfaceInfo.Position;
  5305. arg.STCoord = surfaceInfo.STCoord;
  5306. arg.UVCoord = surfaceInfo.UVCoord;
  5307. touchArgs.Add(arg);
  5308. }
  5309. }
  5310. handlerGrabObject(grab.ObjectData.LocalID, grab.ObjectData.GrabOffset, this, touchArgs);
  5311. }
  5312. break;
  5313. case PacketType.ObjectGrabUpdate:
  5314. ObjectGrabUpdatePacket grabUpdate = (ObjectGrabUpdatePacket)Pack;
  5315. #region Packet Session and User Check
  5316. if (m_checkPackets)
  5317. {
  5318. if (grabUpdate.AgentData.SessionID != SessionId ||
  5319. grabUpdate.AgentData.AgentID != AgentId)
  5320. break;
  5321. }
  5322. #endregion
  5323. handlerGrabUpdate = OnGrabUpdate;
  5324. if (handlerGrabUpdate != null)
  5325. {
  5326. List<SurfaceTouchEventArgs> touchArgs = new List<SurfaceTouchEventArgs>();
  5327. if ((grabUpdate.SurfaceInfo != null) && (grabUpdate.SurfaceInfo.Length > 0))
  5328. {
  5329. foreach (ObjectGrabUpdatePacket.SurfaceInfoBlock surfaceInfo in grabUpdate.SurfaceInfo)
  5330. {
  5331. SurfaceTouchEventArgs arg = new SurfaceTouchEventArgs();
  5332. arg.Binormal = surfaceInfo.Binormal;
  5333. arg.FaceIndex = surfaceInfo.FaceIndex;
  5334. arg.Normal = surfaceInfo.Normal;
  5335. arg.Position = surfaceInfo.Position;
  5336. arg.STCoord = surfaceInfo.STCoord;
  5337. arg.UVCoord = surfaceInfo.UVCoord;
  5338. touchArgs.Add(arg);
  5339. }
  5340. }
  5341. handlerGrabUpdate(grabUpdate.ObjectData.ObjectID, grabUpdate.ObjectData.GrabOffsetInitial,
  5342. grabUpdate.ObjectData.GrabPosition, this, touchArgs);
  5343. }
  5344. break;
  5345. case PacketType.ObjectDeGrab:
  5346. ObjectDeGrabPacket deGrab = (ObjectDeGrabPacket)Pack;
  5347. #region Packet Session and User Check
  5348. if (m_checkPackets)
  5349. {
  5350. if (deGrab.AgentData.SessionID != SessionId ||
  5351. deGrab.AgentData.AgentID != AgentId)
  5352. break;
  5353. }
  5354. #endregion
  5355. handlerDeGrabObject = OnDeGrabObject;
  5356. if (handlerDeGrabObject != null)
  5357. {
  5358. List<SurfaceTouchEventArgs> touchArgs = new List<SurfaceTouchEventArgs>();
  5359. if ((deGrab.SurfaceInfo != null) && (deGrab.SurfaceInfo.Length > 0))
  5360. {
  5361. foreach (ObjectDeGrabPacket.SurfaceInfoBlock surfaceInfo in deGrab.SurfaceInfo)
  5362. {
  5363. SurfaceTouchEventArgs arg = new SurfaceTouchEventArgs();
  5364. arg.Binormal = surfaceInfo.Binormal;
  5365. arg.FaceIndex = surfaceInfo.FaceIndex;
  5366. arg.Normal = surfaceInfo.Normal;
  5367. arg.Position = surfaceInfo.Position;
  5368. arg.STCoord = surfaceInfo.STCoord;
  5369. arg.UVCoord = surfaceInfo.UVCoord;
  5370. touchArgs.Add(arg);
  5371. }
  5372. }
  5373. handlerDeGrabObject(deGrab.ObjectData.LocalID, this, touchArgs);
  5374. }
  5375. break;
  5376. case PacketType.ObjectSpinStart:
  5377. //m_log.Warn("[CLIENT]: unhandled ObjectSpinStart packet");
  5378. ObjectSpinStartPacket spinStart = (ObjectSpinStartPacket)Pack;
  5379. #region Packet Session and User Check
  5380. if (m_checkPackets)
  5381. {
  5382. if (spinStart.AgentData.SessionID != SessionId ||
  5383. spinStart.AgentData.AgentID != AgentId)
  5384. break;
  5385. }
  5386. #endregion
  5387. handlerSpinStart = OnSpinStart;
  5388. if (handlerSpinStart != null)
  5389. {
  5390. handlerSpinStart(spinStart.ObjectData.ObjectID, this);
  5391. }
  5392. break;
  5393. case PacketType.ObjectSpinUpdate:
  5394. //m_log.Warn("[CLIENT]: unhandled ObjectSpinUpdate packet");
  5395. ObjectSpinUpdatePacket spinUpdate = (ObjectSpinUpdatePacket)Pack;
  5396. #region Packet Session and User Check
  5397. if (m_checkPackets)
  5398. {
  5399. if (spinUpdate.AgentData.SessionID != SessionId ||
  5400. spinUpdate.AgentData.AgentID != AgentId)
  5401. break;
  5402. }
  5403. #endregion
  5404. Vector3 axis;
  5405. float angle;
  5406. spinUpdate.ObjectData.Rotation.GetAxisAngle(out axis, out angle);
  5407. //m_log.Warn("[CLIENT]: ObjectSpinUpdate packet rot axis:" + axis + " angle:" + angle);
  5408. handlerSpinUpdate = OnSpinUpdate;
  5409. if (handlerSpinUpdate != null)
  5410. {
  5411. handlerSpinUpdate(spinUpdate.ObjectData.ObjectID, spinUpdate.ObjectData.Rotation, this);
  5412. }
  5413. break;
  5414. case PacketType.ObjectSpinStop:
  5415. //m_log.Warn("[CLIENT]: unhandled ObjectSpinStop packet");
  5416. ObjectSpinStopPacket spinStop = (ObjectSpinStopPacket)Pack;
  5417. #region Packet Session and User Check
  5418. if (m_checkPackets)
  5419. {
  5420. if (spinStop.AgentData.SessionID != SessionId ||
  5421. spinStop.AgentData.AgentID != AgentId)
  5422. break;
  5423. }
  5424. #endregion
  5425. handlerSpinStop = OnSpinStop;
  5426. if (handlerSpinStop != null)
  5427. {
  5428. handlerSpinStop(spinStop.ObjectData.ObjectID, this);
  5429. }
  5430. break;
  5431. case PacketType.ObjectDescription:
  5432. ObjectDescriptionPacket objDes = (ObjectDescriptionPacket)Pack;
  5433. #region Packet Session and User Check
  5434. if (m_checkPackets)
  5435. {
  5436. if (objDes.AgentData.SessionID != SessionId ||
  5437. objDes.AgentData.AgentID != AgentId)
  5438. break;
  5439. }
  5440. #endregion
  5441. handlerObjectDescription = null;
  5442. for (int i = 0; i < objDes.ObjectData.Length; i++)
  5443. {
  5444. handlerObjectDescription = OnObjectDescription;
  5445. if (handlerObjectDescription != null)
  5446. {
  5447. handlerObjectDescription(this, objDes.ObjectData[i].LocalID,
  5448. Util.FieldToString(objDes.ObjectData[i].Description));
  5449. }
  5450. }
  5451. break;
  5452. case PacketType.ObjectName:
  5453. ObjectNamePacket objName = (ObjectNamePacket)Pack;
  5454. #region Packet Session and User Check
  5455. if (m_checkPackets)
  5456. {
  5457. if (objName.AgentData.SessionID != SessionId ||
  5458. objName.AgentData.AgentID != AgentId)
  5459. break;
  5460. }
  5461. #endregion
  5462. handlerObjectName = null;
  5463. for (int i = 0; i < objName.ObjectData.Length; i++)
  5464. {
  5465. handlerObjectName = OnObjectName;
  5466. if (handlerObjectName != null)
  5467. {
  5468. handlerObjectName(this, objName.ObjectData[i].LocalID,
  5469. Util.FieldToString(objName.ObjectData[i].Name));
  5470. }
  5471. }
  5472. break;
  5473. case PacketType.ObjectPermissions:
  5474. if (OnObjectPermissions != null)
  5475. {
  5476. ObjectPermissionsPacket newobjPerms = (ObjectPermissionsPacket)Pack;
  5477. #region Packet Session and User Check
  5478. if (m_checkPackets)
  5479. {
  5480. if (newobjPerms.AgentData.SessionID != SessionId ||
  5481. newobjPerms.AgentData.AgentID != AgentId)
  5482. break;
  5483. }
  5484. #endregion
  5485. UUID AgentID = newobjPerms.AgentData.AgentID;
  5486. UUID SessionID = newobjPerms.AgentData.SessionID;
  5487. handlerObjectPermissions = null;
  5488. for (int i = 0; i < newobjPerms.ObjectData.Length; i++)
  5489. {
  5490. ObjectPermissionsPacket.ObjectDataBlock permChanges = newobjPerms.ObjectData[i];
  5491. byte field = permChanges.Field;
  5492. uint localID = permChanges.ObjectLocalID;
  5493. uint mask = permChanges.Mask;
  5494. byte set = permChanges.Set;
  5495. handlerObjectPermissions = OnObjectPermissions;
  5496. if (handlerObjectPermissions != null)
  5497. handlerObjectPermissions(this, AgentID, SessionID, field, localID, mask, set);
  5498. }
  5499. }
  5500. // Here's our data,
  5501. // PermField contains the field the info goes into
  5502. // PermField determines which mask we're changing
  5503. //
  5504. // chmask is the mask of the change
  5505. // setTF is whether we're adding it or taking it away
  5506. //
  5507. // objLocalID is the localID of the object.
  5508. // Unfortunately, we have to pass the event the packet because objData is an array
  5509. // That means multiple object perms may be updated in a single packet.
  5510. break;
  5511. case PacketType.Undo:
  5512. UndoPacket undoitem = (UndoPacket)Pack;
  5513. #region Packet Session and User Check
  5514. if (m_checkPackets)
  5515. {
  5516. if (undoitem.AgentData.SessionID != SessionId ||
  5517. undoitem.AgentData.AgentID != AgentId)
  5518. break;
  5519. }
  5520. #endregion
  5521. if (undoitem.ObjectData.Length > 0)
  5522. {
  5523. for (int i = 0; i < undoitem.ObjectData.Length; i++)
  5524. {
  5525. UUID objiD = undoitem.ObjectData[i].ObjectID;
  5526. handlerOnUndo = OnUndo;
  5527. if (handlerOnUndo != null)
  5528. {
  5529. handlerOnUndo(this, objiD);
  5530. }
  5531. }
  5532. }
  5533. break;
  5534. case PacketType.ObjectDuplicateOnRay:
  5535. ObjectDuplicateOnRayPacket dupeOnRay = (ObjectDuplicateOnRayPacket)Pack;
  5536. #region Packet Session and User Check
  5537. if (m_checkPackets)
  5538. {
  5539. if (dupeOnRay.AgentData.SessionID != SessionId ||
  5540. dupeOnRay.AgentData.AgentID != AgentId)
  5541. break;
  5542. }
  5543. #endregion
  5544. handlerObjectDuplicateOnRay = null;
  5545. for (int i = 0; i < dupeOnRay.ObjectData.Length; i++)
  5546. {
  5547. handlerObjectDuplicateOnRay = OnObjectDuplicateOnRay;
  5548. if (handlerObjectDuplicateOnRay != null)
  5549. {
  5550. handlerObjectDuplicateOnRay(dupeOnRay.ObjectData[i].ObjectLocalID, dupeOnRay.AgentData.DuplicateFlags,
  5551. dupeOnRay.AgentData.AgentID, dupeOnRay.AgentData.GroupID, dupeOnRay.AgentData.RayTargetID, dupeOnRay.AgentData.RayEnd,
  5552. dupeOnRay.AgentData.RayStart, dupeOnRay.AgentData.BypassRaycast, dupeOnRay.AgentData.RayEndIsIntersection,
  5553. dupeOnRay.AgentData.CopyCenters, dupeOnRay.AgentData.CopyRotates);
  5554. }
  5555. }
  5556. break;
  5557. case PacketType.RequestObjectPropertiesFamily:
  5558. //This powers the little tooltip that appears when you move your mouse over an object
  5559. RequestObjectPropertiesFamilyPacket packToolTip = (RequestObjectPropertiesFamilyPacket)Pack;
  5560. #region Packet Session and User Check
  5561. if (m_checkPackets)
  5562. {
  5563. if (packToolTip.AgentData.SessionID != SessionId ||
  5564. packToolTip.AgentData.AgentID != AgentId)
  5565. break;
  5566. }
  5567. #endregion
  5568. RequestObjectPropertiesFamilyPacket.ObjectDataBlock packObjBlock = packToolTip.ObjectData;
  5569. handlerRequestObjectPropertiesFamily = OnRequestObjectPropertiesFamily;
  5570. if (handlerRequestObjectPropertiesFamily != null)
  5571. {
  5572. handlerRequestObjectPropertiesFamily(this, m_agentId, packObjBlock.RequestFlags,
  5573. packObjBlock.ObjectID);
  5574. }
  5575. break;
  5576. case PacketType.ObjectIncludeInSearch:
  5577. //This lets us set objects to appear in search (stuff like DataSnapshot, etc)
  5578. ObjectIncludeInSearchPacket packInSearch = (ObjectIncludeInSearchPacket)Pack;
  5579. handlerObjectIncludeInSearch = null;
  5580. #region Packet Session and User Check
  5581. if (m_checkPackets)
  5582. {
  5583. if (packInSearch.AgentData.SessionID != SessionId ||
  5584. packInSearch.AgentData.AgentID != AgentId)
  5585. break;
  5586. }
  5587. #endregion
  5588. foreach (ObjectIncludeInSearchPacket.ObjectDataBlock objData in packInSearch.ObjectData)
  5589. {
  5590. bool inSearch = objData.IncludeInSearch;
  5591. uint localID = objData.ObjectLocalID;
  5592. handlerObjectIncludeInSearch = OnObjectIncludeInSearch;
  5593. if (handlerObjectIncludeInSearch != null)
  5594. {
  5595. handlerObjectIncludeInSearch(this, inSearch, localID);
  5596. }
  5597. }
  5598. break;
  5599. case PacketType.ScriptAnswerYes:
  5600. ScriptAnswerYesPacket scriptAnswer = (ScriptAnswerYesPacket)Pack;
  5601. #region Packet Session and User Check
  5602. if (m_checkPackets)
  5603. {
  5604. if (scriptAnswer.AgentData.SessionID != SessionId ||
  5605. scriptAnswer.AgentData.AgentID != AgentId)
  5606. break;
  5607. }
  5608. #endregion
  5609. handlerScriptAnswer = OnScriptAnswer;
  5610. if (handlerScriptAnswer != null)
  5611. {
  5612. handlerScriptAnswer(this, scriptAnswer.Data.TaskID, scriptAnswer.Data.ItemID, scriptAnswer.Data.Questions);
  5613. }
  5614. break;
  5615. case PacketType.ObjectClickAction:
  5616. ObjectClickActionPacket ocpacket = (ObjectClickActionPacket)Pack;
  5617. #region Packet Session and User Check
  5618. if (m_checkPackets)
  5619. {
  5620. if (ocpacket.AgentData.SessionID != SessionId ||
  5621. ocpacket.AgentData.AgentID != AgentId)
  5622. break;
  5623. }
  5624. #endregion
  5625. handlerObjectClickAction = OnObjectClickAction;
  5626. if (handlerObjectClickAction != null)
  5627. {
  5628. foreach (ObjectClickActionPacket.ObjectDataBlock odata in ocpacket.ObjectData)
  5629. {
  5630. byte action = odata.ClickAction;
  5631. uint localID = odata.ObjectLocalID;
  5632. handlerObjectClickAction(this, localID, action.ToString());
  5633. }
  5634. }
  5635. break;
  5636. case PacketType.ObjectMaterial:
  5637. ObjectMaterialPacket ompacket = (ObjectMaterialPacket)Pack;
  5638. #region Packet Session and User Check
  5639. if (m_checkPackets)
  5640. {
  5641. if (ompacket.AgentData.SessionID != SessionId ||
  5642. ompacket.AgentData.AgentID != AgentId)
  5643. break;
  5644. }
  5645. #endregion
  5646. handlerObjectMaterial = OnObjectMaterial;
  5647. if (handlerObjectMaterial != null)
  5648. {
  5649. foreach (ObjectMaterialPacket.ObjectDataBlock odata in ompacket.ObjectData)
  5650. {
  5651. byte material = odata.Material;
  5652. uint localID = odata.ObjectLocalID;
  5653. handlerObjectMaterial(this, localID, material.ToString());
  5654. }
  5655. }
  5656. break;
  5657. #endregion
  5658. #region Inventory/Asset/Other related packets
  5659. case PacketType.RequestImage:
  5660. RequestImagePacket imageRequest = (RequestImagePacket)Pack;
  5661. //m_log.Debug("image request: " + Pack.ToString());
  5662. #region Packet Session and User Check
  5663. if (m_checkPackets)
  5664. {
  5665. if (imageRequest.AgentData.SessionID != SessionId ||
  5666. imageRequest.AgentData.AgentID != AgentId)
  5667. break;
  5668. }
  5669. #endregion
  5670. //handlerTextureRequest = null;
  5671. for (int i = 0; i < imageRequest.RequestImage.Length; i++)
  5672. {
  5673. if (OnRequestTexture != null)
  5674. {
  5675. TextureRequestArgs args = new TextureRequestArgs();
  5676. args.RequestedAssetID = imageRequest.RequestImage[i].Image;
  5677. args.DiscardLevel = imageRequest.RequestImage[i].DiscardLevel;
  5678. args.PacketNumber = imageRequest.RequestImage[i].Packet;
  5679. args.Priority = imageRequest.RequestImage[i].DownloadPriority;
  5680. args.requestSequence = imageRequest.Header.Sequence;
  5681. //handlerTextureRequest = OnRequestTexture;
  5682. //if (handlerTextureRequest != null)
  5683. //OnRequestTexture(this, args);
  5684. // in the end, we null this, so we have to check if it's null
  5685. if (m_imageManager != null)
  5686. {
  5687. m_imageManager.EnqueueReq(args);
  5688. lock (m_textureRequestTimer)
  5689. m_textureRequestTimer.Start();
  5690. }
  5691. }
  5692. }
  5693. break;
  5694. case PacketType.TransferRequest:
  5695. //m_log.Debug("ClientView.ProcessPackets.cs:ProcessInPacket() - Got transfer request");
  5696. TransferRequestPacket transfer = (TransferRequestPacket)Pack;
  5697. //m_log.Debug("Transfer Request: " + transfer.ToString());
  5698. // Validate inventory transfers
  5699. // Has to be done here, because AssetCache can't do it
  5700. //
  5701. if (transfer.TransferInfo.SourceType == 3)
  5702. {
  5703. UUID taskID = new UUID(transfer.TransferInfo.Params, 48);
  5704. UUID itemID = new UUID(transfer.TransferInfo.Params, 64);
  5705. UUID requestID = new UUID(transfer.TransferInfo.Params, 80);
  5706. if (!(((Scene)m_scene).Permissions.BypassPermissions()))
  5707. {
  5708. if (taskID != UUID.Zero) // Prim
  5709. {
  5710. SceneObjectPart part = ((Scene)m_scene).GetSceneObjectPart(taskID);
  5711. if (part == null)
  5712. break;
  5713. if (part.OwnerID != AgentId)
  5714. break;
  5715. if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0)
  5716. break;
  5717. TaskInventoryItem ti = part.Inventory.GetInventoryItem(itemID);
  5718. if (ti == null)
  5719. break;
  5720. if (ti.OwnerID != AgentId)
  5721. break;
  5722. if ((ti.CurrentPermissions & ((uint)PermissionMask.Modify| (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer)) != ((uint)PermissionMask.Modify| (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer))
  5723. break;
  5724. if (ti.AssetID != requestID)
  5725. break;
  5726. }
  5727. else // Agent
  5728. {
  5729. IInventoryService invService = m_scene.RequestModuleInterface<IInventoryService>();
  5730. InventoryItemBase assetRequestItem = new InventoryItemBase(itemID, AgentId);
  5731. assetRequestItem = invService.GetItem(assetRequestItem);
  5732. if (assetRequestItem == null)
  5733. {
  5734. assetRequestItem = ((Scene)m_scene).CommsManager.UserProfileCacheService.LibraryRoot.FindItem(itemID);
  5735. if (assetRequestItem == null)
  5736. return;
  5737. }
  5738. // At this point, we need to apply perms
  5739. // only to notecards and scripts. All
  5740. // other asset types are always available
  5741. //
  5742. if (assetRequestItem.AssetType == 10)
  5743. {
  5744. if (!((Scene)m_scene).Permissions.CanViewScript(itemID, UUID.Zero, AgentId))
  5745. {
  5746. SendAgentAlertMessage("Insufficient permissions to view script", false);
  5747. break;
  5748. }
  5749. }
  5750. else if (assetRequestItem.AssetType == 7)
  5751. {
  5752. if (!((Scene)m_scene).Permissions.CanViewNotecard(itemID, UUID.Zero, AgentId))
  5753. {
  5754. SendAgentAlertMessage("Insufficient permissions to view notecard", false);
  5755. break;
  5756. }
  5757. }
  5758. if (assetRequestItem.AssetID != requestID)
  5759. break;
  5760. }
  5761. }
  5762. }
  5763. //m_assetCache.AddAssetRequest(this, transfer);
  5764. MakeAssetRequest(transfer);
  5765. /* RequestAsset = OnRequestAsset;
  5766. if (RequestAsset != null)
  5767. {
  5768. RequestAsset(this, transfer);
  5769. }*/
  5770. break;
  5771. case PacketType.AssetUploadRequest:
  5772. AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack;
  5773. // m_log.Debug("upload request " + request.ToString());
  5774. // m_log.Debug("upload request was for assetid: " + request.AssetBlock.TransactionID.Combine(this.SecureSessionId).ToString());
  5775. UUID temp = UUID.Combine(request.AssetBlock.TransactionID, SecureSessionId);
  5776. handlerAssetUploadRequest = OnAssetUploadRequest;
  5777. if (handlerAssetUploadRequest != null)
  5778. {
  5779. handlerAssetUploadRequest(this, temp,
  5780. request.AssetBlock.TransactionID, request.AssetBlock.Type,
  5781. request.AssetBlock.AssetData, request.AssetBlock.StoreLocal,
  5782. request.AssetBlock.Tempfile);
  5783. }
  5784. break;
  5785. case PacketType.RequestXfer:
  5786. RequestXferPacket xferReq = (RequestXferPacket)Pack;
  5787. handlerRequestXfer = OnRequestXfer;
  5788. if (handlerRequestXfer != null)
  5789. {
  5790. handlerRequestXfer(this, xferReq.XferID.ID, Util.FieldToString(xferReq.XferID.Filename));
  5791. }
  5792. break;
  5793. case PacketType.SendXferPacket:
  5794. SendXferPacketPacket xferRec = (SendXferPacketPacket)Pack;
  5795. handlerXferReceive = OnXferReceive;
  5796. if (handlerXferReceive != null)
  5797. {
  5798. handlerXferReceive(this, xferRec.XferID.ID, xferRec.XferID.Packet, xferRec.DataPacket.Data);
  5799. }
  5800. break;
  5801. case PacketType.ConfirmXferPacket:
  5802. ConfirmXferPacketPacket confirmXfer = (ConfirmXferPacketPacket)Pack;
  5803. handlerConfirmXfer = OnConfirmXfer;
  5804. if (handlerConfirmXfer != null)
  5805. {
  5806. handlerConfirmXfer(this, confirmXfer.XferID.ID, confirmXfer.XferID.Packet);
  5807. }
  5808. break;
  5809. case PacketType.AbortXfer:
  5810. AbortXferPacket abortXfer = (AbortXferPacket)Pack;
  5811. handlerAbortXfer = OnAbortXfer;
  5812. if (handlerAbortXfer != null)
  5813. {
  5814. handlerAbortXfer(this, abortXfer.XferID.ID);
  5815. }
  5816. break;
  5817. case PacketType.CreateInventoryFolder:
  5818. CreateInventoryFolderPacket invFolder = (CreateInventoryFolderPacket)Pack;
  5819. #region Packet Session and User Check
  5820. if (m_checkPackets)
  5821. {
  5822. if (invFolder.AgentData.SessionID != SessionId ||
  5823. invFolder.AgentData.AgentID != AgentId)
  5824. break;
  5825. }
  5826. #endregion
  5827. handlerCreateInventoryFolder = OnCreateNewInventoryFolder;
  5828. if (handlerCreateInventoryFolder != null)
  5829. {
  5830. handlerCreateInventoryFolder(this, invFolder.FolderData.FolderID,
  5831. (ushort)invFolder.FolderData.Type,
  5832. Util.FieldToString(invFolder.FolderData.Name),
  5833. invFolder.FolderData.ParentID);
  5834. }
  5835. break;
  5836. case PacketType.UpdateInventoryFolder:
  5837. if (OnUpdateInventoryFolder != null)
  5838. {
  5839. UpdateInventoryFolderPacket invFolderx = (UpdateInventoryFolderPacket)Pack;
  5840. #region Packet Session and User Check
  5841. if (m_checkPackets)
  5842. {
  5843. if (invFolderx.AgentData.SessionID != SessionId ||
  5844. invFolderx.AgentData.AgentID != AgentId)
  5845. break;
  5846. }
  5847. #endregion
  5848. handlerUpdateInventoryFolder = null;
  5849. for (int i = 0; i < invFolderx.FolderData.Length; i++)
  5850. {
  5851. handlerUpdateInventoryFolder = OnUpdateInventoryFolder;
  5852. if (handlerUpdateInventoryFolder != null)
  5853. {
  5854. OnUpdateInventoryFolder(this, invFolderx.FolderData[i].FolderID,
  5855. (ushort)invFolderx.FolderData[i].Type,
  5856. Util.FieldToString(invFolderx.FolderData[i].Name),
  5857. invFolderx.FolderData[i].ParentID);
  5858. }
  5859. }
  5860. }
  5861. break;
  5862. case PacketType.MoveInventoryFolder:
  5863. if (OnMoveInventoryFolder != null)
  5864. {
  5865. MoveInventoryFolderPacket invFoldery = (MoveInventoryFolderPacket)Pack;
  5866. #region Packet Session and User Check
  5867. if (m_checkPackets)
  5868. {
  5869. if (invFoldery.AgentData.SessionID != SessionId ||
  5870. invFoldery.AgentData.AgentID != AgentId)
  5871. break;
  5872. }
  5873. #endregion
  5874. handlerMoveInventoryFolder = null;
  5875. for (int i = 0; i < invFoldery.InventoryData.Length; i++)
  5876. {
  5877. handlerMoveInventoryFolder = OnMoveInventoryFolder;
  5878. if (handlerMoveInventoryFolder != null)
  5879. {
  5880. OnMoveInventoryFolder(this, invFoldery.InventoryData[i].FolderID,
  5881. invFoldery.InventoryData[i].ParentID);
  5882. }
  5883. }
  5884. }
  5885. break;
  5886. case PacketType.CreateInventoryItem:
  5887. CreateInventoryItemPacket createItem = (CreateInventoryItemPacket)Pack;
  5888. #region Packet Session and User Check
  5889. if (m_checkPackets)
  5890. {
  5891. if (createItem.AgentData.SessionID != SessionId ||
  5892. createItem.AgentData.AgentID != AgentId)
  5893. break;
  5894. }
  5895. #endregion
  5896. handlerCreateNewInventoryItem = OnCreateNewInventoryItem;
  5897. if (handlerCreateNewInventoryItem != null)
  5898. {
  5899. handlerCreateNewInventoryItem(this, createItem.InventoryBlock.TransactionID,
  5900. createItem.InventoryBlock.FolderID,
  5901. createItem.InventoryBlock.CallbackID,
  5902. Util.FieldToString(createItem.InventoryBlock.Description),
  5903. Util.FieldToString(createItem.InventoryBlock.Name),
  5904. createItem.InventoryBlock.InvType,
  5905. createItem.InventoryBlock.Type,
  5906. createItem.InventoryBlock.WearableType,
  5907. createItem.InventoryBlock.NextOwnerMask,
  5908. Util.UnixTimeSinceEpoch());
  5909. }
  5910. break;
  5911. case PacketType.FetchInventory:
  5912. if (OnFetchInventory != null)
  5913. {
  5914. FetchInventoryPacket FetchInventoryx = (FetchInventoryPacket)Pack;
  5915. #region Packet Session and User Check
  5916. if (m_checkPackets)
  5917. {
  5918. if (FetchInventoryx.AgentData.SessionID != SessionId ||
  5919. FetchInventoryx.AgentData.AgentID != AgentId)
  5920. break;
  5921. }
  5922. #endregion
  5923. handlerFetchInventory = null;
  5924. for (int i = 0; i < FetchInventoryx.InventoryData.Length; i++)
  5925. {
  5926. handlerFetchInventory = OnFetchInventory;
  5927. if (handlerFetchInventory != null)
  5928. {
  5929. OnFetchInventory(this, FetchInventoryx.InventoryData[i].ItemID,
  5930. FetchInventoryx.InventoryData[i].OwnerID);
  5931. }
  5932. }
  5933. }
  5934. break;
  5935. case PacketType.FetchInventoryDescendents:
  5936. FetchInventoryDescendentsPacket Fetch = (FetchInventoryDescendentsPacket)Pack;
  5937. #region Packet Session and User Check
  5938. if (m_checkPackets)
  5939. {
  5940. if (Fetch.AgentData.SessionID != SessionId ||
  5941. Fetch.AgentData.AgentID != AgentId)
  5942. break;
  5943. }
  5944. #endregion
  5945. handlerFetchInventoryDescendents = OnFetchInventoryDescendents;
  5946. if (handlerFetchInventoryDescendents != null)
  5947. {
  5948. handlerFetchInventoryDescendents(this, Fetch.InventoryData.FolderID, Fetch.InventoryData.OwnerID,
  5949. Fetch.InventoryData.FetchFolders, Fetch.InventoryData.FetchItems,
  5950. Fetch.InventoryData.SortOrder);
  5951. }
  5952. break;
  5953. case PacketType.PurgeInventoryDescendents:
  5954. PurgeInventoryDescendentsPacket Purge = (PurgeInventoryDescendentsPacket)Pack;
  5955. #region Packet Session and User Check
  5956. if (m_checkPackets)
  5957. {
  5958. if (Purge.AgentData.SessionID != SessionId ||
  5959. Purge.AgentData.AgentID != AgentId)
  5960. break;
  5961. }
  5962. #endregion
  5963. handlerPurgeInventoryDescendents = OnPurgeInventoryDescendents;
  5964. if (handlerPurgeInventoryDescendents != null)
  5965. {
  5966. handlerPurgeInventoryDescendents(this, Purge.InventoryData.FolderID);
  5967. }
  5968. break;
  5969. case PacketType.UpdateInventoryItem:
  5970. UpdateInventoryItemPacket inventoryItemUpdate = (UpdateInventoryItemPacket)Pack;
  5971. #region Packet Session and User Check
  5972. if (m_checkPackets)
  5973. {
  5974. if (inventoryItemUpdate.AgentData.SessionID != SessionId ||
  5975. inventoryItemUpdate.AgentData.AgentID != AgentId)
  5976. break;
  5977. }
  5978. #endregion
  5979. if (OnUpdateInventoryItem != null)
  5980. {
  5981. handlerUpdateInventoryItem = null;
  5982. for (int i = 0; i < inventoryItemUpdate.InventoryData.Length; i++)
  5983. {
  5984. handlerUpdateInventoryItem = OnUpdateInventoryItem;
  5985. if (handlerUpdateInventoryItem != null)
  5986. {
  5987. InventoryItemBase itemUpd = new InventoryItemBase();
  5988. itemUpd.ID = inventoryItemUpdate.InventoryData[i].ItemID;
  5989. itemUpd.Name = Util.FieldToString(inventoryItemUpdate.InventoryData[i].Name);
  5990. itemUpd.Description = Util.FieldToString(inventoryItemUpdate.InventoryData[i].Description);
  5991. itemUpd.GroupID = inventoryItemUpdate.InventoryData[i].GroupID;
  5992. itemUpd.GroupOwned = inventoryItemUpdate.InventoryData[i].GroupOwned;
  5993. itemUpd.GroupPermissions = inventoryItemUpdate.InventoryData[i].GroupMask;
  5994. itemUpd.NextPermissions = inventoryItemUpdate.InventoryData[i].NextOwnerMask;
  5995. itemUpd.EveryOnePermissions = inventoryItemUpdate.InventoryData[i].EveryoneMask;
  5996. itemUpd.CreationDate = inventoryItemUpdate.InventoryData[i].CreationDate;
  5997. itemUpd.Folder = inventoryItemUpdate.InventoryData[i].FolderID;
  5998. itemUpd.InvType = inventoryItemUpdate.InventoryData[i].InvType;
  5999. itemUpd.SalePrice = inventoryItemUpdate.InventoryData[i].SalePrice;
  6000. itemUpd.SaleType = inventoryItemUpdate.InventoryData[i].SaleType;
  6001. itemUpd.Flags = inventoryItemUpdate.InventoryData[i].Flags;
  6002. /*
  6003. OnUpdateInventoryItem(this, inventoryItemUpdate.InventoryData[i].TransactionID,
  6004. inventoryItemUpdate.InventoryData[i].ItemID,
  6005. Util.FieldToString(inventoryItemUpdate.InventoryData[i].Name),
  6006. Util.FieldToString(inventoryItemUpdate.InventoryData[i].Description),
  6007. inventoryItemUpdate.InventoryData[i].NextOwnerMask);
  6008. */
  6009. OnUpdateInventoryItem(this, inventoryItemUpdate.InventoryData[i].TransactionID,
  6010. inventoryItemUpdate.InventoryData[i].ItemID,
  6011. itemUpd);
  6012. }
  6013. }
  6014. }
  6015. //m_log.Debug(Pack.ToString());
  6016. /*for (int i = 0; i < inventoryItemUpdate.InventoryData.Length; i++)
  6017. {
  6018. if (inventoryItemUpdate.InventoryData[i].TransactionID != UUID.Zero)
  6019. {
  6020. AssetBase asset = m_assetCache.GetAsset(inventoryItemUpdate.InventoryData[i].TransactionID.Combine(this.SecureSessionId));
  6021. if (asset != null)
  6022. {
  6023. // m_log.Debug("updating inventory item, found asset" + asset.FullID.ToString() + " already in cache");
  6024. m_inventoryCache.UpdateInventoryItemAsset(this, inventoryItemUpdate.InventoryData[i].ItemID, asset);
  6025. }
  6026. else
  6027. {
  6028. asset = this.UploadAssets.AddUploadToAssetCache(inventoryItemUpdate.InventoryData[i].TransactionID);
  6029. if (asset != null)
  6030. {
  6031. //m_log.Debug("updating inventory item, adding asset" + asset.FullID.ToString() + " to cache");
  6032. m_inventoryCache.UpdateInventoryItemAsset(this, inventoryItemUpdate.InventoryData[i].ItemID, asset);
  6033. }
  6034. else
  6035. {
  6036. //m_log.Debug("trying to update inventory item, but asset is null");
  6037. }
  6038. }
  6039. }
  6040. else
  6041. {
  6042. m_inventoryCache.UpdateInventoryItemDetails(this, inventoryItemUpdate.InventoryData[i].ItemID, inventoryItemUpdate.InventoryData[i]); ;
  6043. }
  6044. }*/
  6045. break;
  6046. case PacketType.CopyInventoryItem:
  6047. CopyInventoryItemPacket copyitem = (CopyInventoryItemPacket)Pack;
  6048. #region Packet Session and User Check
  6049. if (m_checkPackets)
  6050. {
  6051. if (copyitem.AgentData.SessionID != SessionId ||
  6052. copyitem.AgentData.AgentID != AgentId)
  6053. break;
  6054. }
  6055. #endregion
  6056. handlerCopyInventoryItem = null;
  6057. if (OnCopyInventoryItem != null)
  6058. {
  6059. foreach (CopyInventoryItemPacket.InventoryDataBlock datablock in copyitem.InventoryData)
  6060. {
  6061. handlerCopyInventoryItem = OnCopyInventoryItem;
  6062. if (handlerCopyInventoryItem != null)
  6063. {
  6064. handlerCopyInventoryItem(this, datablock.CallbackID, datablock.OldAgentID,
  6065. datablock.OldItemID, datablock.NewFolderID,
  6066. Util.FieldToString(datablock.NewName));
  6067. }
  6068. }
  6069. }
  6070. break;
  6071. case PacketType.MoveInventoryItem:
  6072. MoveInventoryItemPacket moveitem = (MoveInventoryItemPacket)Pack;
  6073. #region Packet Session and User Check
  6074. if (m_checkPackets)
  6075. {
  6076. if (moveitem.AgentData.SessionID != SessionId ||
  6077. moveitem.AgentData.AgentID != AgentId)
  6078. break;
  6079. }
  6080. #endregion
  6081. if (OnMoveInventoryItem != null)
  6082. {
  6083. handlerMoveInventoryItem = null;
  6084. InventoryItemBase itm = null;
  6085. List<InventoryItemBase> items = new List<InventoryItemBase>();
  6086. foreach (MoveInventoryItemPacket.InventoryDataBlock datablock in moveitem.InventoryData)
  6087. {
  6088. itm = new InventoryItemBase(datablock.ItemID, AgentId);
  6089. itm.Folder = datablock.FolderID;
  6090. itm.Name = Util.FieldToString(datablock.NewName);
  6091. // weird, comes out as empty string
  6092. //m_log.DebugFormat("[XXX] new name: {0}", itm.Name);
  6093. items.Add(itm);
  6094. }
  6095. handlerMoveInventoryItem = OnMoveInventoryItem;
  6096. if (handlerMoveInventoryItem != null)
  6097. {
  6098. handlerMoveInventoryItem(this, items);
  6099. }
  6100. }
  6101. break;
  6102. case PacketType.RemoveInventoryItem:
  6103. RemoveInventoryItemPacket removeItem = (RemoveInventoryItemPacket)Pack;
  6104. #region Packet Session and User Check
  6105. if (m_checkPackets)
  6106. {
  6107. if (removeItem.AgentData.SessionID != SessionId ||
  6108. removeItem.AgentData.AgentID != AgentId)
  6109. break;
  6110. }
  6111. #endregion
  6112. if (OnRemoveInventoryItem != null)
  6113. {
  6114. handlerRemoveInventoryItem = null;
  6115. List<UUID> uuids = new List<UUID>();
  6116. foreach (RemoveInventoryItemPacket.InventoryDataBlock datablock in removeItem.InventoryData)
  6117. {
  6118. uuids.Add(datablock.ItemID);
  6119. }
  6120. handlerRemoveInventoryItem = OnRemoveInventoryItem;
  6121. if (handlerRemoveInventoryItem != null)
  6122. {
  6123. handlerRemoveInventoryItem(this, uuids);
  6124. }
  6125. }
  6126. break;
  6127. case PacketType.RemoveInventoryFolder:
  6128. RemoveInventoryFolderPacket removeFolder = (RemoveInventoryFolderPacket)Pack;
  6129. #region Packet Session and User Check
  6130. if (m_checkPackets)
  6131. {
  6132. if (removeFolder.AgentData.SessionID != SessionId ||
  6133. removeFolder.AgentData.AgentID != AgentId)
  6134. break;
  6135. }
  6136. #endregion
  6137. if (OnRemoveInventoryFolder != null)
  6138. {
  6139. handlerRemoveInventoryFolder = null;
  6140. List<UUID> uuids = new List<UUID>();
  6141. foreach (RemoveInventoryFolderPacket.FolderDataBlock datablock in removeFolder.FolderData)
  6142. {
  6143. uuids.Add(datablock.FolderID);
  6144. }
  6145. handlerRemoveInventoryFolder = OnRemoveInventoryFolder;
  6146. if (handlerRemoveInventoryFolder != null)
  6147. {
  6148. handlerRemoveInventoryFolder(this, uuids);
  6149. }
  6150. }
  6151. break;
  6152. case PacketType.RemoveInventoryObjects:
  6153. RemoveInventoryObjectsPacket removeObject = (RemoveInventoryObjectsPacket)Pack;
  6154. #region Packet Session and User Check
  6155. if (m_checkPackets)
  6156. {
  6157. if (removeObject.AgentData.SessionID != SessionId ||
  6158. removeObject.AgentData.AgentID != AgentId)
  6159. break;
  6160. }
  6161. #endregion
  6162. if (OnRemoveInventoryFolder != null)
  6163. {
  6164. handlerRemoveInventoryFolder = null;
  6165. List<UUID> uuids = new List<UUID>();
  6166. foreach (RemoveInventoryObjectsPacket.FolderDataBlock datablock in removeObject.FolderData)
  6167. {
  6168. uuids.Add(datablock.FolderID);
  6169. }
  6170. handlerRemoveInventoryFolder = OnRemoveInventoryFolder;
  6171. if (handlerRemoveInventoryFolder != null)
  6172. {
  6173. handlerRemoveInventoryFolder(this, uuids);
  6174. }
  6175. }
  6176. if (OnRemoveInventoryItem != null)
  6177. {
  6178. handlerRemoveInventoryItem = null;
  6179. List<UUID> uuids = new List<UUID>();
  6180. foreach (RemoveInventoryObjectsPacket.ItemDataBlock datablock in removeObject.ItemData)
  6181. {
  6182. uuids.Add(datablock.ItemID);
  6183. }
  6184. handlerRemoveInventoryItem = OnRemoveInventoryItem;
  6185. if (handlerRemoveInventoryItem != null)
  6186. {
  6187. handlerRemoveInventoryItem(this, uuids);
  6188. }
  6189. }
  6190. break;
  6191. case PacketType.RequestTaskInventory:
  6192. RequestTaskInventoryPacket requesttask = (RequestTaskInventoryPacket)Pack;
  6193. #region Packet Session and User Check
  6194. if (m_checkPackets)
  6195. {
  6196. if (requesttask.AgentData.SessionID != SessionId ||
  6197. requesttask.AgentData.AgentID != AgentId)
  6198. break;
  6199. }
  6200. #endregion
  6201. handlerRequestTaskInventory = OnRequestTaskInventory;
  6202. if (handlerRequestTaskInventory != null)
  6203. {
  6204. handlerRequestTaskInventory(this, requesttask.InventoryData.LocalID);
  6205. }
  6206. break;
  6207. case PacketType.UpdateTaskInventory:
  6208. UpdateTaskInventoryPacket updatetask = (UpdateTaskInventoryPacket)Pack;
  6209. #region Packet Session and User Check
  6210. if (m_checkPackets)
  6211. {
  6212. if (updatetask.AgentData.SessionID != SessionId ||
  6213. updatetask.AgentData.AgentID != AgentId)
  6214. break;
  6215. }
  6216. #endregion
  6217. if (OnUpdateTaskInventory != null)
  6218. {
  6219. if (updatetask.UpdateData.Key == 0)
  6220. {
  6221. handlerUpdateTaskInventory = OnUpdateTaskInventory;
  6222. if (handlerUpdateTaskInventory != null)
  6223. {
  6224. TaskInventoryItem newTaskItem = new TaskInventoryItem();
  6225. newTaskItem.ItemID = updatetask.InventoryData.ItemID;
  6226. newTaskItem.ParentID = updatetask.InventoryData.FolderID;
  6227. newTaskItem.CreatorID = updatetask.InventoryData.CreatorID;
  6228. newTaskItem.OwnerID = updatetask.InventoryData.OwnerID;
  6229. newTaskItem.GroupID = updatetask.InventoryData.GroupID;
  6230. newTaskItem.BasePermissions = updatetask.InventoryData.BaseMask;
  6231. newTaskItem.CurrentPermissions = updatetask.InventoryData.OwnerMask;
  6232. newTaskItem.GroupPermissions = updatetask.InventoryData.GroupMask;
  6233. newTaskItem.EveryonePermissions = updatetask.InventoryData.EveryoneMask;
  6234. newTaskItem.NextPermissions = updatetask.InventoryData.NextOwnerMask;
  6235. //newTaskItem.GroupOwned=updatetask.InventoryData.GroupOwned;
  6236. newTaskItem.Type = updatetask.InventoryData.Type;
  6237. newTaskItem.InvType = updatetask.InventoryData.InvType;
  6238. newTaskItem.Flags = updatetask.InventoryData.Flags;
  6239. //newTaskItem.SaleType=updatetask.InventoryData.SaleType;
  6240. //newTaskItem.SalePrice=updatetask.InventoryData.SalePrice;;
  6241. newTaskItem.Name = Util.FieldToString(updatetask.InventoryData.Name);
  6242. newTaskItem.Description = Util.FieldToString(updatetask.InventoryData.Description);
  6243. newTaskItem.CreationDate = (uint)updatetask.InventoryData.CreationDate;
  6244. handlerUpdateTaskInventory(this, updatetask.InventoryData.TransactionID,
  6245. newTaskItem, updatetask.UpdateData.LocalID);
  6246. }
  6247. }
  6248. }
  6249. break;
  6250. case PacketType.RemoveTaskInventory:
  6251. RemoveTaskInventoryPacket removeTask = (RemoveTaskInventoryPacket)Pack;
  6252. #region Packet Session and User Check
  6253. if (m_checkPackets)
  6254. {
  6255. if (removeTask.AgentData.SessionID != SessionId ||
  6256. removeTask.AgentData.AgentID != AgentId)
  6257. break;
  6258. }
  6259. #endregion
  6260. handlerRemoveTaskItem = OnRemoveTaskItem;
  6261. if (handlerRemoveTaskItem != null)
  6262. {
  6263. handlerRemoveTaskItem(this, removeTask.InventoryData.ItemID, removeTask.InventoryData.LocalID);
  6264. }
  6265. break;
  6266. case PacketType.MoveTaskInventory:
  6267. MoveTaskInventoryPacket moveTaskInventoryPacket = (MoveTaskInventoryPacket)Pack;
  6268. #region Packet Session and User Check
  6269. if (m_checkPackets)
  6270. {
  6271. if (moveTaskInventoryPacket.AgentData.SessionID != SessionId ||
  6272. moveTaskInventoryPacket.AgentData.AgentID != AgentId)
  6273. break;
  6274. }
  6275. #endregion
  6276. handlerMoveTaskItem = OnMoveTaskItem;
  6277. if (handlerMoveTaskItem != null)
  6278. {
  6279. handlerMoveTaskItem(
  6280. this, moveTaskInventoryPacket.AgentData.FolderID,
  6281. moveTaskInventoryPacket.InventoryData.LocalID,
  6282. moveTaskInventoryPacket.InventoryData.ItemID);
  6283. }
  6284. break;
  6285. case PacketType.RezScript:
  6286. //m_log.Debug(Pack.ToString());
  6287. RezScriptPacket rezScriptx = (RezScriptPacket)Pack;
  6288. #region Packet Session and User Check
  6289. if (m_checkPackets)
  6290. {
  6291. if (rezScriptx.AgentData.SessionID != SessionId ||
  6292. rezScriptx.AgentData.AgentID != AgentId)
  6293. break;
  6294. }
  6295. #endregion
  6296. handlerRezScript = OnRezScript;
  6297. InventoryItemBase item = new InventoryItemBase();
  6298. item.ID = rezScriptx.InventoryBlock.ItemID;
  6299. item.Folder = rezScriptx.InventoryBlock.FolderID;
  6300. item.CreatorId = rezScriptx.InventoryBlock.CreatorID.ToString();
  6301. item.Owner = rezScriptx.InventoryBlock.OwnerID;
  6302. item.BasePermissions = rezScriptx.InventoryBlock.BaseMask;
  6303. item.CurrentPermissions = rezScriptx.InventoryBlock.OwnerMask;
  6304. item.EveryOnePermissions = rezScriptx.InventoryBlock.EveryoneMask;
  6305. item.NextPermissions = rezScriptx.InventoryBlock.NextOwnerMask;
  6306. item.GroupPermissions = rezScriptx.InventoryBlock.GroupMask;
  6307. item.GroupOwned = rezScriptx.InventoryBlock.GroupOwned;
  6308. item.GroupID = rezScriptx.InventoryBlock.GroupID;
  6309. item.AssetType = rezScriptx.InventoryBlock.Type;
  6310. item.InvType = rezScriptx.InventoryBlock.InvType;
  6311. item.Flags = rezScriptx.InventoryBlock.Flags;
  6312. item.SaleType = rezScriptx.InventoryBlock.SaleType;
  6313. item.SalePrice = rezScriptx.InventoryBlock.SalePrice;
  6314. item.Name = Util.FieldToString(rezScriptx.InventoryBlock.Name);
  6315. item.Description = Util.FieldToString(rezScriptx.InventoryBlock.Description);
  6316. item.CreationDate = rezScriptx.InventoryBlock.CreationDate;
  6317. if (handlerRezScript != null)
  6318. {
  6319. handlerRezScript(this, item, rezScriptx.InventoryBlock.TransactionID, rezScriptx.UpdateBlock.ObjectLocalID);
  6320. }
  6321. break;
  6322. case PacketType.MapLayerRequest:
  6323. RequestMapLayer();
  6324. break;
  6325. case PacketType.MapBlockRequest:
  6326. MapBlockRequestPacket MapRequest = (MapBlockRequestPacket)Pack;
  6327. #region Packet Session and User Check
  6328. if (m_checkPackets)
  6329. {
  6330. if (MapRequest.AgentData.SessionID != SessionId ||
  6331. MapRequest.AgentData.AgentID != AgentId)
  6332. break;
  6333. }
  6334. #endregion
  6335. handlerRequestMapBlocks = OnRequestMapBlocks;
  6336. if (handlerRequestMapBlocks != null)
  6337. {
  6338. handlerRequestMapBlocks(this, MapRequest.PositionData.MinX, MapRequest.PositionData.MinY,
  6339. MapRequest.PositionData.MaxX, MapRequest.PositionData.MaxY, MapRequest.AgentData.Flags);
  6340. }
  6341. break;
  6342. case PacketType.MapNameRequest:
  6343. MapNameRequestPacket map = (MapNameRequestPacket)Pack;
  6344. #region Packet Session and User Check
  6345. if (m_checkPackets)
  6346. {
  6347. if (map.AgentData.SessionID != SessionId ||
  6348. map.AgentData.AgentID != AgentId)
  6349. break;
  6350. }
  6351. #endregion
  6352. string mapName = Encoding.UTF8.GetString(map.NameData.Name, 0,
  6353. map.NameData.Name.Length - 1);
  6354. handlerMapNameRequest = OnMapNameRequest;
  6355. if (handlerMapNameRequest != null)
  6356. {
  6357. handlerMapNameRequest(this, mapName);
  6358. }
  6359. break;
  6360. case PacketType.TeleportLandmarkRequest:
  6361. TeleportLandmarkRequestPacket tpReq = (TeleportLandmarkRequestPacket)Pack;
  6362. #region Packet Session and User Check
  6363. if (m_checkPackets)
  6364. {
  6365. if (tpReq.Info.SessionID != SessionId ||
  6366. tpReq.Info.AgentID != AgentId)
  6367. break;
  6368. }
  6369. #endregion
  6370. UUID lmid = tpReq.Info.LandmarkID;
  6371. AssetLandmark lm;
  6372. if (lmid != UUID.Zero)
  6373. {
  6374. //AssetBase lma = m_assetCache.GetAsset(lmid, false);
  6375. AssetBase lma = m_assetService.Get(lmid.ToString());
  6376. if (lma == null)
  6377. {
  6378. // Failed to find landmark
  6379. TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
  6380. tpCancel.Info.SessionID = tpReq.Info.SessionID;
  6381. tpCancel.Info.AgentID = tpReq.Info.AgentID;
  6382. OutPacket(tpCancel, ThrottleOutPacketType.Task);
  6383. }
  6384. try
  6385. {
  6386. lm = new AssetLandmark(lma);
  6387. }
  6388. catch (NullReferenceException)
  6389. {
  6390. // asset not found generates null ref inside the assetlandmark constructor.
  6391. TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
  6392. tpCancel.Info.SessionID = tpReq.Info.SessionID;
  6393. tpCancel.Info.AgentID = tpReq.Info.AgentID;
  6394. OutPacket(tpCancel, ThrottleOutPacketType.Task);
  6395. break;
  6396. }
  6397. }
  6398. else
  6399. {
  6400. // Teleport home request
  6401. handlerTeleportHomeRequest = OnTeleportHomeRequest;
  6402. if (handlerTeleportHomeRequest != null)
  6403. {
  6404. handlerTeleportHomeRequest(AgentId, this);
  6405. }
  6406. break;
  6407. }
  6408. handlerTeleportLandmarkRequest = OnTeleportLandmarkRequest;
  6409. if (handlerTeleportLandmarkRequest != null)
  6410. {
  6411. handlerTeleportLandmarkRequest(this, lm.RegionID, lm.Position);
  6412. }
  6413. else
  6414. {
  6415. //no event handler so cancel request
  6416. TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
  6417. tpCancel.Info.AgentID = tpReq.Info.AgentID;
  6418. tpCancel.Info.SessionID = tpReq.Info.SessionID;
  6419. OutPacket(tpCancel, ThrottleOutPacketType.Task);
  6420. }
  6421. break;
  6422. case PacketType.TeleportLocationRequest:
  6423. TeleportLocationRequestPacket tpLocReq = (TeleportLocationRequestPacket)Pack;
  6424. // m_log.Debug(tpLocReq.ToString());
  6425. #region Packet Session and User Check
  6426. if (m_checkPackets)
  6427. {
  6428. if (tpLocReq.AgentData.SessionID != SessionId ||
  6429. tpLocReq.AgentData.AgentID != AgentId)
  6430. break;
  6431. }
  6432. #endregion
  6433. handlerTeleportLocationRequest = OnTeleportLocationRequest;
  6434. if (handlerTeleportLocationRequest != null)
  6435. {
  6436. handlerTeleportLocationRequest(this, tpLocReq.Info.RegionHandle, tpLocReq.Info.Position,
  6437. tpLocReq.Info.LookAt, 16);
  6438. }
  6439. else
  6440. {
  6441. //no event handler so cancel request
  6442. TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
  6443. tpCancel.Info.SessionID = tpLocReq.AgentData.SessionID;
  6444. tpCancel.Info.AgentID = tpLocReq.AgentData.AgentID;
  6445. OutPacket(tpCancel, ThrottleOutPacketType.Task);
  6446. }
  6447. break;
  6448. #endregion
  6449. case PacketType.UUIDNameRequest:
  6450. UUIDNameRequestPacket incoming = (UUIDNameRequestPacket)Pack;
  6451. foreach (UUIDNameRequestPacket.UUIDNameBlockBlock UUIDBlock in incoming.UUIDNameBlock)
  6452. {
  6453. handlerNameRequest = OnNameFromUUIDRequest;
  6454. if (handlerNameRequest != null)
  6455. {
  6456. handlerNameRequest(UUIDBlock.ID, this);
  6457. }
  6458. }
  6459. break;
  6460. #region Parcel related packets
  6461. case PacketType.RegionHandleRequest:
  6462. RegionHandleRequestPacket rhrPack = (RegionHandleRequestPacket)Pack;
  6463. handlerRegionHandleRequest = OnRegionHandleRequest;
  6464. if (handlerRegionHandleRequest != null)
  6465. {
  6466. handlerRegionHandleRequest(this, rhrPack.RequestBlock.RegionID);
  6467. }
  6468. break;
  6469. case PacketType.ParcelInfoRequest:
  6470. ParcelInfoRequestPacket pirPack = (ParcelInfoRequestPacket)Pack;
  6471. #region Packet Session and User Check
  6472. if (m_checkPackets)
  6473. {
  6474. if (pirPack.AgentData.SessionID != SessionId ||
  6475. pirPack.AgentData.AgentID != AgentId)
  6476. break;
  6477. }
  6478. #endregion
  6479. handlerParcelInfoRequest = OnParcelInfoRequest;
  6480. if (handlerParcelInfoRequest != null)
  6481. {
  6482. handlerParcelInfoRequest(this, pirPack.Data.ParcelID);
  6483. }
  6484. break;
  6485. case PacketType.ParcelAccessListRequest:
  6486. ParcelAccessListRequestPacket requestPacket = (ParcelAccessListRequestPacket)Pack;
  6487. #region Packet Session and User Check
  6488. if (m_checkPackets)
  6489. {
  6490. if (requestPacket.AgentData.SessionID != SessionId ||
  6491. requestPacket.AgentData.AgentID != AgentId)
  6492. break;
  6493. }
  6494. #endregion
  6495. handlerParcelAccessListRequest = OnParcelAccessListRequest;
  6496. if (handlerParcelAccessListRequest != null)
  6497. {
  6498. handlerParcelAccessListRequest(requestPacket.AgentData.AgentID, requestPacket.AgentData.SessionID,
  6499. requestPacket.Data.Flags, requestPacket.Data.SequenceID,
  6500. requestPacket.Data.LocalID, this);
  6501. }
  6502. break;
  6503. case PacketType.ParcelAccessListUpdate:
  6504. ParcelAccessListUpdatePacket updatePacket = (ParcelAccessListUpdatePacket)Pack;
  6505. #region Packet Session and User Check
  6506. if (m_checkPackets)
  6507. {
  6508. if (updatePacket.AgentData.SessionID != SessionId ||
  6509. updatePacket.AgentData.AgentID != AgentId)
  6510. break;
  6511. }
  6512. #endregion
  6513. List<ParcelManager.ParcelAccessEntry> entries = new List<ParcelManager.ParcelAccessEntry>();
  6514. foreach (ParcelAccessListUpdatePacket.ListBlock block in updatePacket.List)
  6515. {
  6516. ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
  6517. entry.AgentID = block.ID;
  6518. entry.Flags = (AccessList)block.Flags;
  6519. entry.Time = new DateTime();
  6520. entries.Add(entry);
  6521. }
  6522. handlerParcelAccessListUpdateRequest = OnParcelAccessListUpdateRequest;
  6523. if (handlerParcelAccessListUpdateRequest != null)
  6524. {
  6525. handlerParcelAccessListUpdateRequest(updatePacket.AgentData.AgentID,
  6526. updatePacket.AgentData.SessionID, updatePacket.Data.Flags,
  6527. updatePacket.Data.LocalID, entries, this);
  6528. }
  6529. break;
  6530. case PacketType.ParcelPropertiesRequest:
  6531. ParcelPropertiesRequestPacket propertiesRequest = (ParcelPropertiesRequestPacket)Pack;
  6532. #region Packet Session and User Check
  6533. if (m_checkPackets)
  6534. {
  6535. if (propertiesRequest.AgentData.SessionID != SessionId ||
  6536. propertiesRequest.AgentData.AgentID != AgentId)
  6537. break;
  6538. }
  6539. #endregion
  6540. handlerParcelPropertiesRequest = OnParcelPropertiesRequest;
  6541. if (handlerParcelPropertiesRequest != null)
  6542. {
  6543. handlerParcelPropertiesRequest((int)Math.Round(propertiesRequest.ParcelData.West),
  6544. (int)Math.Round(propertiesRequest.ParcelData.South),
  6545. (int)Math.Round(propertiesRequest.ParcelData.East),
  6546. (int)Math.Round(propertiesRequest.ParcelData.North),
  6547. propertiesRequest.ParcelData.SequenceID,
  6548. propertiesRequest.ParcelData.SnapSelection, this);
  6549. }
  6550. break;
  6551. case PacketType.ParcelDivide:
  6552. ParcelDividePacket landDivide = (ParcelDividePacket)Pack;
  6553. #region Packet Session and User Check
  6554. if (m_checkPackets)
  6555. {
  6556. if (landDivide.AgentData.SessionID != SessionId ||
  6557. landDivide.AgentData.AgentID != AgentId)
  6558. break;
  6559. }
  6560. #endregion
  6561. handlerParcelDivideRequest = OnParcelDivideRequest;
  6562. if (handlerParcelDivideRequest != null)
  6563. {
  6564. handlerParcelDivideRequest((int)Math.Round(landDivide.ParcelData.West),
  6565. (int)Math.Round(landDivide.ParcelData.South),
  6566. (int)Math.Round(landDivide.ParcelData.East),
  6567. (int)Math.Round(landDivide.ParcelData.North), this);
  6568. }
  6569. break;
  6570. case PacketType.ParcelJoin:
  6571. ParcelJoinPacket landJoin = (ParcelJoinPacket)Pack;
  6572. #region Packet Session and User Check
  6573. if (m_checkPackets)
  6574. {
  6575. if (landJoin.AgentData.SessionID != SessionId ||
  6576. landJoin.AgentData.AgentID != AgentId)
  6577. break;
  6578. }
  6579. #endregion
  6580. handlerParcelJoinRequest = OnParcelJoinRequest;
  6581. if (handlerParcelJoinRequest != null)
  6582. {
  6583. handlerParcelJoinRequest((int)Math.Round(landJoin.ParcelData.West),
  6584. (int)Math.Round(landJoin.ParcelData.South),
  6585. (int)Math.Round(landJoin.ParcelData.East),
  6586. (int)Math.Round(landJoin.ParcelData.North), this);
  6587. }
  6588. break;
  6589. case PacketType.ParcelPropertiesUpdate:
  6590. ParcelPropertiesUpdatePacket parcelPropertiesPacket = (ParcelPropertiesUpdatePacket)Pack;
  6591. #region Packet Session and User Check
  6592. if (m_checkPackets)
  6593. {
  6594. if (parcelPropertiesPacket.AgentData.SessionID != SessionId ||
  6595. parcelPropertiesPacket.AgentData.AgentID != AgentId)
  6596. break;
  6597. }
  6598. #endregion
  6599. handlerParcelPropertiesUpdateRequest = OnParcelPropertiesUpdateRequest;
  6600. if (handlerParcelPropertiesUpdateRequest != null)
  6601. {
  6602. LandUpdateArgs args = new LandUpdateArgs();
  6603. args.AuthBuyerID = parcelPropertiesPacket.ParcelData.AuthBuyerID;
  6604. args.Category = (ParcelCategory)parcelPropertiesPacket.ParcelData.Category;
  6605. args.Desc = Utils.BytesToString(parcelPropertiesPacket.ParcelData.Desc);
  6606. args.GroupID = parcelPropertiesPacket.ParcelData.GroupID;
  6607. args.LandingType = parcelPropertiesPacket.ParcelData.LandingType;
  6608. args.MediaAutoScale = parcelPropertiesPacket.ParcelData.MediaAutoScale;
  6609. args.MediaID = parcelPropertiesPacket.ParcelData.MediaID;
  6610. args.MediaURL = Utils.BytesToString(parcelPropertiesPacket.ParcelData.MediaURL);
  6611. args.MusicURL = Utils.BytesToString(parcelPropertiesPacket.ParcelData.MusicURL);
  6612. args.Name = Utils.BytesToString(parcelPropertiesPacket.ParcelData.Name);
  6613. args.ParcelFlags = parcelPropertiesPacket.ParcelData.ParcelFlags;
  6614. args.PassHours = parcelPropertiesPacket.ParcelData.PassHours;
  6615. args.PassPrice = parcelPropertiesPacket.ParcelData.PassPrice;
  6616. args.SalePrice = parcelPropertiesPacket.ParcelData.SalePrice;
  6617. args.SnapshotID = parcelPropertiesPacket.ParcelData.SnapshotID;
  6618. args.UserLocation = parcelPropertiesPacket.ParcelData.UserLocation;
  6619. args.UserLookAt = parcelPropertiesPacket.ParcelData.UserLookAt;
  6620. handlerParcelPropertiesUpdateRequest(args, parcelPropertiesPacket.ParcelData.LocalID, this);
  6621. }
  6622. break;
  6623. case PacketType.ParcelSelectObjects:
  6624. ParcelSelectObjectsPacket selectPacket = (ParcelSelectObjectsPacket)Pack;
  6625. #region Packet Session and User Check
  6626. if (m_checkPackets)
  6627. {
  6628. if (selectPacket.AgentData.SessionID != SessionId ||
  6629. selectPacket.AgentData.AgentID != AgentId)
  6630. break;
  6631. }
  6632. #endregion
  6633. List<UUID> returnIDs = new List<UUID>();
  6634. foreach (ParcelSelectObjectsPacket.ReturnIDsBlock rb in
  6635. selectPacket.ReturnIDs)
  6636. {
  6637. returnIDs.Add(rb.ReturnID);
  6638. }
  6639. handlerParcelSelectObjects = OnParcelSelectObjects;
  6640. if (handlerParcelSelectObjects != null)
  6641. {
  6642. handlerParcelSelectObjects(selectPacket.ParcelData.LocalID,
  6643. Convert.ToInt32(selectPacket.ParcelData.ReturnType), returnIDs, this);
  6644. }
  6645. break;
  6646. case PacketType.ParcelObjectOwnersRequest:
  6647. //m_log.Debug(Pack.ToString());
  6648. ParcelObjectOwnersRequestPacket reqPacket = (ParcelObjectOwnersRequestPacket)Pack;
  6649. #region Packet Session and User Check
  6650. if (m_checkPackets)
  6651. {
  6652. if (reqPacket.AgentData.SessionID != SessionId ||
  6653. reqPacket.AgentData.AgentID != AgentId)
  6654. break;
  6655. }
  6656. #endregion
  6657. handlerParcelObjectOwnerRequest = OnParcelObjectOwnerRequest;
  6658. if (handlerParcelObjectOwnerRequest != null)
  6659. {
  6660. handlerParcelObjectOwnerRequest(reqPacket.ParcelData.LocalID, this);
  6661. }
  6662. break;
  6663. case PacketType.ParcelGodForceOwner:
  6664. ParcelGodForceOwnerPacket godForceOwnerPacket = (ParcelGodForceOwnerPacket)Pack;
  6665. #region Packet Session and User Check
  6666. if (m_checkPackets)
  6667. {
  6668. if (godForceOwnerPacket.AgentData.SessionID != SessionId ||
  6669. godForceOwnerPacket.AgentData.AgentID != AgentId)
  6670. break;
  6671. }
  6672. #endregion
  6673. handlerParcelGodForceOwner = OnParcelGodForceOwner;
  6674. if (handlerParcelGodForceOwner != null)
  6675. {
  6676. handlerParcelGodForceOwner(godForceOwnerPacket.Data.LocalID, godForceOwnerPacket.Data.OwnerID, this);
  6677. }
  6678. break;
  6679. case PacketType.ParcelRelease:
  6680. ParcelReleasePacket releasePacket = (ParcelReleasePacket)Pack;
  6681. #region Packet Session and User Check
  6682. if (m_checkPackets)
  6683. {
  6684. if (releasePacket.AgentData.SessionID != SessionId ||
  6685. releasePacket.AgentData.AgentID != AgentId)
  6686. break;
  6687. }
  6688. #endregion
  6689. handlerParcelAbandonRequest = OnParcelAbandonRequest;
  6690. if (handlerParcelAbandonRequest != null)
  6691. {
  6692. handlerParcelAbandonRequest(releasePacket.Data.LocalID, this);
  6693. }
  6694. break;
  6695. case PacketType.ParcelReclaim:
  6696. ParcelReclaimPacket reclaimPacket = (ParcelReclaimPacket)Pack;
  6697. #region Packet Session and User Check
  6698. if (m_checkPackets)
  6699. {
  6700. if (reclaimPacket.AgentData.SessionID != SessionId ||
  6701. reclaimPacket.AgentData.AgentID != AgentId)
  6702. break;
  6703. }
  6704. #endregion
  6705. handlerParcelReclaim = OnParcelReclaim;
  6706. if (handlerParcelReclaim != null)
  6707. {
  6708. handlerParcelReclaim(reclaimPacket.Data.LocalID, this);
  6709. }
  6710. break;
  6711. case PacketType.ParcelReturnObjects:
  6712. ParcelReturnObjectsPacket parcelReturnObjects = (ParcelReturnObjectsPacket)Pack;
  6713. #region Packet Session and User Check
  6714. if (m_checkPackets)
  6715. {
  6716. if (parcelReturnObjects.AgentData.SessionID != SessionId ||
  6717. parcelReturnObjects.AgentData.AgentID != AgentId)
  6718. break;
  6719. }
  6720. #endregion
  6721. UUID[] puserselectedOwnerIDs = new UUID[parcelReturnObjects.OwnerIDs.Length];
  6722. for (int parceliterator = 0; parceliterator < parcelReturnObjects.OwnerIDs.Length; parceliterator++)
  6723. puserselectedOwnerIDs[parceliterator] = parcelReturnObjects.OwnerIDs[parceliterator].OwnerID;
  6724. UUID[] puserselectedTaskIDs = new UUID[parcelReturnObjects.TaskIDs.Length];
  6725. for (int parceliterator = 0; parceliterator < parcelReturnObjects.TaskIDs.Length; parceliterator++)
  6726. puserselectedTaskIDs[parceliterator] = parcelReturnObjects.TaskIDs[parceliterator].TaskID;
  6727. handlerParcelReturnObjectsRequest = OnParcelReturnObjectsRequest;
  6728. if (handlerParcelReturnObjectsRequest != null)
  6729. {
  6730. handlerParcelReturnObjectsRequest(parcelReturnObjects.ParcelData.LocalID, parcelReturnObjects.ParcelData.ReturnType, puserselectedOwnerIDs, puserselectedTaskIDs, this);
  6731. }
  6732. break;
  6733. case PacketType.ParcelSetOtherCleanTime:
  6734. ParcelSetOtherCleanTimePacket parcelSetOtherCleanTimePacket = (ParcelSetOtherCleanTimePacket)Pack;
  6735. #region Packet Session and User Check
  6736. if (m_checkPackets)
  6737. {
  6738. if (parcelSetOtherCleanTimePacket.AgentData.SessionID != SessionId ||
  6739. parcelSetOtherCleanTimePacket.AgentData.AgentID != AgentId)
  6740. break;
  6741. }
  6742. #endregion
  6743. handlerParcelSetOtherCleanTime = OnParcelSetOtherCleanTime;
  6744. if (handlerParcelSetOtherCleanTime != null)
  6745. {
  6746. handlerParcelSetOtherCleanTime(this,
  6747. parcelSetOtherCleanTimePacket.ParcelData.LocalID,
  6748. parcelSetOtherCleanTimePacket.ParcelData.OtherCleanTime);
  6749. }
  6750. break;
  6751. case PacketType.LandStatRequest:
  6752. LandStatRequestPacket lsrp = (LandStatRequestPacket)Pack;
  6753. #region Packet Session and User Check
  6754. if (m_checkPackets)
  6755. {
  6756. if (lsrp.AgentData.SessionID != SessionId ||
  6757. lsrp.AgentData.AgentID != AgentId)
  6758. break;
  6759. }
  6760. #endregion
  6761. handlerLandStatRequest = OnLandStatRequest;
  6762. if (handlerLandStatRequest != null)
  6763. {
  6764. handlerLandStatRequest(lsrp.RequestData.ParcelLocalID, lsrp.RequestData.ReportType, lsrp.RequestData.RequestFlags, Utils.BytesToString(lsrp.RequestData.Filter), this);
  6765. }
  6766. break;
  6767. case PacketType.ParcelDwellRequest:
  6768. ParcelDwellRequestPacket dwellrq =
  6769. (ParcelDwellRequestPacket)Pack;
  6770. #region Packet Session and User Check
  6771. if (m_checkPackets)
  6772. {
  6773. if (dwellrq.AgentData.SessionID != SessionId ||
  6774. dwellrq.AgentData.AgentID != AgentId)
  6775. break;
  6776. }
  6777. #endregion
  6778. handlerParcelDwellRequest = OnParcelDwellRequest;
  6779. if (handlerParcelDwellRequest != null)
  6780. {
  6781. handlerParcelDwellRequest(dwellrq.Data.LocalID, this);
  6782. }
  6783. break;
  6784. #endregion
  6785. #region Estate Packets
  6786. case PacketType.EstateOwnerMessage:
  6787. EstateOwnerMessagePacket messagePacket = (EstateOwnerMessagePacket)Pack;
  6788. //m_log.Debug(messagePacket.ToString());
  6789. #region Packet Session and User Check
  6790. if (m_checkPackets)
  6791. {
  6792. if (messagePacket.AgentData.SessionID != SessionId ||
  6793. messagePacket.AgentData.AgentID != AgentId)
  6794. break;
  6795. }
  6796. #endregion
  6797. switch (Utils.BytesToString(messagePacket.MethodData.Method))
  6798. {
  6799. case "getinfo":
  6800. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  6801. {
  6802. OnDetailedEstateDataRequest(this, messagePacket.MethodData.Invoice);
  6803. }
  6804. break;
  6805. case "setregioninfo":
  6806. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  6807. {
  6808. OnSetEstateFlagsRequest(convertParamStringToBool(messagePacket.ParamList[0].Parameter), convertParamStringToBool(messagePacket.ParamList[1].Parameter),
  6809. convertParamStringToBool(messagePacket.ParamList[2].Parameter), !convertParamStringToBool(messagePacket.ParamList[3].Parameter),
  6810. Convert.ToInt16(Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[4].Parameter))),
  6811. (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[5].Parameter)),
  6812. Convert.ToInt16(Utils.BytesToString(messagePacket.ParamList[6].Parameter)),
  6813. convertParamStringToBool(messagePacket.ParamList[7].Parameter), convertParamStringToBool(messagePacket.ParamList[8].Parameter));
  6814. }
  6815. break;
  6816. // case "texturebase":
  6817. // if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  6818. // {
  6819. // foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  6820. // {
  6821. // string s = Utils.BytesToString(block.Parameter);
  6822. // string[] splitField = s.Split(' ');
  6823. // if (splitField.Length == 2)
  6824. // {
  6825. // UUID tempUUID = new UUID(splitField[1]);
  6826. // OnSetEstateTerrainBaseTexture(this, Convert.ToInt16(splitField[0]), tempUUID);
  6827. // }
  6828. // }
  6829. // }
  6830. // break;
  6831. case "texturedetail":
  6832. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  6833. {
  6834. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  6835. {
  6836. string s = Utils.BytesToString(block.Parameter);
  6837. string[] splitField = s.Split(' ');
  6838. if (splitField.Length == 2)
  6839. {
  6840. Int16 corner = Convert.ToInt16(splitField[0]);
  6841. UUID textureUUID = new UUID(splitField[1]);
  6842. OnSetEstateTerrainDetailTexture(this, corner, textureUUID);
  6843. }
  6844. }
  6845. }
  6846. break;
  6847. case "textureheights":
  6848. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  6849. {
  6850. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  6851. {
  6852. string s = Utils.BytesToString(block.Parameter);
  6853. string[] splitField = s.Split(' ');
  6854. if (splitField.Length == 3)
  6855. {
  6856. Int16 corner = Convert.ToInt16(splitField[0]);
  6857. float lowValue = (float)Convert.ToDecimal(splitField[1]);
  6858. float highValue = (float)Convert.ToDecimal(splitField[2]);
  6859. OnSetEstateTerrainTextureHeights(this, corner, lowValue, highValue);
  6860. }
  6861. }
  6862. }
  6863. break;
  6864. case "texturecommit":
  6865. OnCommitEstateTerrainTextureRequest(this);
  6866. break;
  6867. case "setregionterrain":
  6868. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  6869. {
  6870. if (messagePacket.ParamList.Length != 9)
  6871. {
  6872. m_log.Error("EstateOwnerMessage: SetRegionTerrain method has a ParamList of invalid length");
  6873. }
  6874. else
  6875. {
  6876. try
  6877. {
  6878. string tmp = Utils.BytesToString(messagePacket.ParamList[0].Parameter);
  6879. if (!tmp.Contains(".")) tmp += ".00";
  6880. float WaterHeight = (float)Convert.ToDecimal(tmp);
  6881. tmp = Utils.BytesToString(messagePacket.ParamList[1].Parameter);
  6882. if (!tmp.Contains(".")) tmp += ".00";
  6883. float TerrainRaiseLimit = (float)Convert.ToDecimal(tmp);
  6884. tmp = Utils.BytesToString(messagePacket.ParamList[2].Parameter);
  6885. if (!tmp.Contains(".")) tmp += ".00";
  6886. float TerrainLowerLimit = (float)Convert.ToDecimal(tmp);
  6887. bool UseEstateSun = convertParamStringToBool(messagePacket.ParamList[3].Parameter);
  6888. bool UseFixedSun = convertParamStringToBool(messagePacket.ParamList[4].Parameter);
  6889. float SunHour = (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[5].Parameter));
  6890. bool UseGlobal = convertParamStringToBool(messagePacket.ParamList[6].Parameter);
  6891. bool EstateFixedSun = convertParamStringToBool(messagePacket.ParamList[7].Parameter);
  6892. float EstateSunHour = (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[8].Parameter));
  6893. OnSetRegionTerrainSettings(WaterHeight, TerrainRaiseLimit, TerrainLowerLimit, UseEstateSun, UseFixedSun, SunHour, UseGlobal, EstateFixedSun, EstateSunHour);
  6894. }
  6895. catch (Exception ex)
  6896. {
  6897. m_log.Error("EstateOwnerMessage: Exception while setting terrain settings: \n" + messagePacket + "\n" + ex);
  6898. }
  6899. }
  6900. }
  6901. break;
  6902. case "restart":
  6903. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  6904. {
  6905. // There's only 1 block in the estateResetSim.. and that's the number of seconds till restart.
  6906. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  6907. {
  6908. float timeSeconds;
  6909. Utils.TryParseSingle(Utils.BytesToString(block.Parameter), out timeSeconds);
  6910. timeSeconds = (int)timeSeconds;
  6911. OnEstateRestartSimRequest(this, (int)timeSeconds);
  6912. }
  6913. }
  6914. break;
  6915. case "estatechangecovenantid":
  6916. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  6917. {
  6918. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  6919. {
  6920. UUID newCovenantID = new UUID(Utils.BytesToString(block.Parameter));
  6921. OnEstateChangeCovenantRequest(this, newCovenantID);
  6922. }
  6923. }
  6924. break;
  6925. case "estateaccessdelta": // Estate access delta manages the banlist and allow list too.
  6926. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  6927. {
  6928. int estateAccessType = Convert.ToInt16(Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  6929. OnUpdateEstateAccessDeltaRequest(this, messagePacket.MethodData.Invoice, estateAccessType, new UUID(Utils.BytesToString(messagePacket.ParamList[2].Parameter)));
  6930. }
  6931. break;
  6932. case "simulatormessage":
  6933. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  6934. {
  6935. UUID invoice = messagePacket.MethodData.Invoice;
  6936. UUID SenderID = new UUID(Utils.BytesToString(messagePacket.ParamList[2].Parameter));
  6937. string SenderName = Utils.BytesToString(messagePacket.ParamList[3].Parameter);
  6938. string Message = Utils.BytesToString(messagePacket.ParamList[4].Parameter);
  6939. UUID sessionID = messagePacket.AgentData.SessionID;
  6940. OnSimulatorBlueBoxMessageRequest(this, invoice, SenderID, sessionID, SenderName, Message);
  6941. }
  6942. break;
  6943. case "instantmessage":
  6944. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  6945. {
  6946. if (messagePacket.ParamList.Length < 5)
  6947. break;
  6948. UUID invoice = messagePacket.MethodData.Invoice;
  6949. UUID SenderID = new UUID(Utils.BytesToString(messagePacket.ParamList[2].Parameter));
  6950. string SenderName = Utils.BytesToString(messagePacket.ParamList[3].Parameter);
  6951. string Message = Utils.BytesToString(messagePacket.ParamList[4].Parameter);
  6952. UUID sessionID = messagePacket.AgentData.SessionID;
  6953. OnEstateBlueBoxMessageRequest(this, invoice, SenderID, sessionID, SenderName, Message);
  6954. }
  6955. break;
  6956. case "setregiondebug":
  6957. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  6958. {
  6959. UUID invoice = messagePacket.MethodData.Invoice;
  6960. UUID SenderID = messagePacket.AgentData.AgentID;
  6961. bool scripted = convertParamStringToBool(messagePacket.ParamList[0].Parameter);
  6962. bool collisionEvents = convertParamStringToBool(messagePacket.ParamList[1].Parameter);
  6963. bool physics = convertParamStringToBool(messagePacket.ParamList[2].Parameter);
  6964. OnEstateDebugRegionRequest(this, invoice, SenderID, scripted, collisionEvents, physics);
  6965. }
  6966. break;
  6967. case "teleporthomeuser":
  6968. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  6969. {
  6970. UUID invoice = messagePacket.MethodData.Invoice;
  6971. UUID SenderID = messagePacket.AgentData.AgentID;
  6972. UUID Prey;
  6973. UUID.TryParse(Utils.BytesToString(messagePacket.ParamList[1].Parameter), out Prey);
  6974. OnEstateTeleportOneUserHomeRequest(this, invoice, SenderID, Prey);
  6975. }
  6976. break;
  6977. case "teleporthomeallusers":
  6978. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  6979. {
  6980. UUID invoice = messagePacket.MethodData.Invoice;
  6981. UUID SenderID = messagePacket.AgentData.AgentID;
  6982. OnEstateTeleportAllUsersHomeRequest(this, invoice, SenderID);
  6983. }
  6984. break;
  6985. case "colliders":
  6986. handlerLandStatRequest = OnLandStatRequest;
  6987. if (handlerLandStatRequest != null)
  6988. {
  6989. handlerLandStatRequest(0, 1, 0, "", this);
  6990. }
  6991. break;
  6992. case "scripts":
  6993. handlerLandStatRequest = OnLandStatRequest;
  6994. if (handlerLandStatRequest != null)
  6995. {
  6996. handlerLandStatRequest(0, 0, 0, "", this);
  6997. }
  6998. break;
  6999. case "terrain":
  7000. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  7001. {
  7002. if (messagePacket.ParamList.Length > 0)
  7003. {
  7004. if (Utils.BytesToString(messagePacket.ParamList[0].Parameter) == "bake")
  7005. {
  7006. handlerBakeTerrain = OnBakeTerrain;
  7007. if (handlerBakeTerrain != null)
  7008. {
  7009. handlerBakeTerrain(this);
  7010. }
  7011. }
  7012. if (Utils.BytesToString(messagePacket.ParamList[0].Parameter) == "download filename")
  7013. {
  7014. if (messagePacket.ParamList.Length > 1)
  7015. {
  7016. handlerRequestTerrain = OnRequestTerrain;
  7017. if (handlerRequestTerrain != null)
  7018. {
  7019. handlerRequestTerrain(this, Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  7020. }
  7021. }
  7022. }
  7023. if (Utils.BytesToString(messagePacket.ParamList[0].Parameter) == "upload filename")
  7024. {
  7025. if (messagePacket.ParamList.Length > 1)
  7026. {
  7027. handlerUploadTerrain = OnUploadTerrain;
  7028. if (handlerUploadTerrain != null)
  7029. {
  7030. handlerUploadTerrain(this, Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  7031. }
  7032. }
  7033. }
  7034. }
  7035. }
  7036. break;
  7037. case "estatechangeinfo":
  7038. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  7039. {
  7040. UUID invoice = messagePacket.MethodData.Invoice;
  7041. UUID SenderID = messagePacket.AgentData.AgentID;
  7042. UInt32 param1 = Convert.ToUInt32(Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  7043. UInt32 param2 = Convert.ToUInt32(Utils.BytesToString(messagePacket.ParamList[2].Parameter));
  7044. handlerEstateChangeInfo = OnEstateChangeInfo;
  7045. if (handlerEstateChangeInfo != null)
  7046. {
  7047. handlerEstateChangeInfo(this, invoice, SenderID, param1, param2);
  7048. }
  7049. }
  7050. break;
  7051. default:
  7052. m_log.Error("EstateOwnerMessage: Unknown method requested\n" + messagePacket);
  7053. break;
  7054. }
  7055. //int parcelID, uint reportType, uint requestflags, string filter
  7056. //lsrp.RequestData.ParcelLocalID;
  7057. //lsrp.RequestData.ReportType; // 1 = colliders, 0 = scripts
  7058. //lsrp.RequestData.RequestFlags;
  7059. //lsrp.RequestData.Filter;
  7060. break;
  7061. case PacketType.RequestRegionInfo:
  7062. RequestRegionInfoPacket.AgentDataBlock mPacket = ((RequestRegionInfoPacket)Pack).AgentData;
  7063. #region Packet Session and User Check
  7064. if (m_checkPackets)
  7065. {
  7066. if (mPacket.SessionID != SessionId ||
  7067. mPacket.AgentID != AgentId)
  7068. break;
  7069. }
  7070. #endregion
  7071. handlerRegionInfoRequest = OnRegionInfoRequest;
  7072. if (handlerRegionInfoRequest != null)
  7073. {
  7074. handlerRegionInfoRequest(this);
  7075. }
  7076. break;
  7077. case PacketType.EstateCovenantRequest:
  7078. //EstateCovenantRequestPacket.AgentDataBlock epack =
  7079. // ((EstateCovenantRequestPacket)Pack).AgentData;
  7080. handlerEstateCovenantRequest = OnEstateCovenantRequest;
  7081. if (handlerEstateCovenantRequest != null)
  7082. {
  7083. handlerEstateCovenantRequest(this);
  7084. }
  7085. break;
  7086. #endregion
  7087. #region GodPackets
  7088. case PacketType.RequestGodlikePowers:
  7089. RequestGodlikePowersPacket rglpPack = (RequestGodlikePowersPacket)Pack;
  7090. RequestGodlikePowersPacket.RequestBlockBlock rblock = rglpPack.RequestBlock;
  7091. UUID token = rblock.Token;
  7092. RequestGodlikePowersPacket.AgentDataBlock ablock = rglpPack.AgentData;
  7093. handlerReqGodlikePowers = OnRequestGodlikePowers;
  7094. if (handlerReqGodlikePowers != null)
  7095. {
  7096. handlerReqGodlikePowers(ablock.AgentID, ablock.SessionID, token, rblock.Godlike, this);
  7097. }
  7098. break;
  7099. case PacketType.GodKickUser:
  7100. GodKickUserPacket gkupack = (GodKickUserPacket)Pack;
  7101. if (gkupack.UserInfo.GodSessionID == SessionId && AgentId == gkupack.UserInfo.GodID)
  7102. {
  7103. handlerGodKickUser = OnGodKickUser;
  7104. if (handlerGodKickUser != null)
  7105. {
  7106. handlerGodKickUser(gkupack.UserInfo.GodID, gkupack.UserInfo.GodSessionID,
  7107. gkupack.UserInfo.AgentID, (uint)0, gkupack.UserInfo.Reason);
  7108. }
  7109. }
  7110. else
  7111. {
  7112. SendAgentAlertMessage("Kick request denied", false);
  7113. }
  7114. //KickUserPacket kupack = new KickUserPacket();
  7115. //KickUserPacket.UserInfoBlock kupackib = kupack.UserInfo;
  7116. //kupack.UserInfo.AgentID = gkupack.UserInfo.AgentID;
  7117. //kupack.UserInfo.SessionID = gkupack.UserInfo.GodSessionID;
  7118. //kupack.TargetBlock.TargetIP = (uint)0;
  7119. //kupack.TargetBlock.TargetPort = (ushort)0;
  7120. //kupack.UserInfo.Reason = gkupack.UserInfo.Reason;
  7121. //OutPacket(kupack, ThrottleOutPacketType.Task);
  7122. break;
  7123. #endregion
  7124. #region Economy/Transaction Packets
  7125. case PacketType.MoneyBalanceRequest:
  7126. MoneyBalanceRequestPacket moneybalancerequestpacket = (MoneyBalanceRequestPacket)Pack;
  7127. #region Packet Session and User Check
  7128. if (m_checkPackets)
  7129. {
  7130. if (moneybalancerequestpacket.AgentData.SessionID != SessionId ||
  7131. moneybalancerequestpacket.AgentData.AgentID != AgentId)
  7132. break;
  7133. }
  7134. #endregion
  7135. handlerMoneyBalanceRequest = OnMoneyBalanceRequest;
  7136. if (handlerMoneyBalanceRequest != null)
  7137. {
  7138. handlerMoneyBalanceRequest(this, moneybalancerequestpacket.AgentData.AgentID, moneybalancerequestpacket.AgentData.SessionID, moneybalancerequestpacket.MoneyData.TransactionID);
  7139. }
  7140. break;
  7141. case PacketType.EconomyDataRequest:
  7142. handlerEconomoyDataRequest = OnEconomyDataRequest;
  7143. if (handlerEconomoyDataRequest != null)
  7144. {
  7145. handlerEconomoyDataRequest(AgentId);
  7146. }
  7147. break;
  7148. case PacketType.RequestPayPrice:
  7149. RequestPayPricePacket requestPayPricePacket = (RequestPayPricePacket)Pack;
  7150. handlerRequestPayPrice = OnRequestPayPrice;
  7151. if (handlerRequestPayPrice != null)
  7152. {
  7153. handlerRequestPayPrice(this, requestPayPricePacket.ObjectData.ObjectID);
  7154. }
  7155. break;
  7156. case PacketType.ObjectSaleInfo:
  7157. ObjectSaleInfoPacket objectSaleInfoPacket = (ObjectSaleInfoPacket)Pack;
  7158. #region Packet Session and User Check
  7159. if (m_checkPackets)
  7160. {
  7161. if (objectSaleInfoPacket.AgentData.SessionID != SessionId ||
  7162. objectSaleInfoPacket.AgentData.AgentID != AgentId)
  7163. break;
  7164. }
  7165. #endregion
  7166. handlerObjectSaleInfo = OnObjectSaleInfo;
  7167. if (handlerObjectSaleInfo != null)
  7168. {
  7169. foreach (ObjectSaleInfoPacket.ObjectDataBlock d
  7170. in objectSaleInfoPacket.ObjectData)
  7171. {
  7172. handlerObjectSaleInfo(this,
  7173. objectSaleInfoPacket.AgentData.AgentID,
  7174. objectSaleInfoPacket.AgentData.SessionID,
  7175. d.LocalID,
  7176. d.SaleType,
  7177. d.SalePrice);
  7178. }
  7179. }
  7180. break;
  7181. case PacketType.ObjectBuy:
  7182. ObjectBuyPacket objectBuyPacket = (ObjectBuyPacket)Pack;
  7183. #region Packet Session and User Check
  7184. if (m_checkPackets)
  7185. {
  7186. if (objectBuyPacket.AgentData.SessionID != SessionId ||
  7187. objectBuyPacket.AgentData.AgentID != AgentId)
  7188. break;
  7189. }
  7190. #endregion
  7191. handlerObjectBuy = OnObjectBuy;
  7192. if (handlerObjectBuy != null)
  7193. {
  7194. foreach (ObjectBuyPacket.ObjectDataBlock d
  7195. in objectBuyPacket.ObjectData)
  7196. {
  7197. handlerObjectBuy(this,
  7198. objectBuyPacket.AgentData.AgentID,
  7199. objectBuyPacket.AgentData.SessionID,
  7200. objectBuyPacket.AgentData.GroupID,
  7201. objectBuyPacket.AgentData.CategoryID,
  7202. d.ObjectLocalID,
  7203. d.SaleType,
  7204. d.SalePrice);
  7205. }
  7206. }
  7207. break;
  7208. #endregion
  7209. #region Script Packets
  7210. case PacketType.GetScriptRunning:
  7211. GetScriptRunningPacket scriptRunning = (GetScriptRunningPacket)Pack;
  7212. handlerGetScriptRunning = OnGetScriptRunning;
  7213. if (handlerGetScriptRunning != null)
  7214. {
  7215. handlerGetScriptRunning(this, scriptRunning.Script.ObjectID, scriptRunning.Script.ItemID);
  7216. }
  7217. break;
  7218. case PacketType.SetScriptRunning:
  7219. SetScriptRunningPacket setScriptRunning = (SetScriptRunningPacket)Pack;
  7220. #region Packet Session and User Check
  7221. if (m_checkPackets)
  7222. {
  7223. if (setScriptRunning.AgentData.SessionID != SessionId ||
  7224. setScriptRunning.AgentData.AgentID != AgentId)
  7225. break;
  7226. }
  7227. #endregion
  7228. handlerSetScriptRunning = OnSetScriptRunning;
  7229. if (handlerSetScriptRunning != null)
  7230. {
  7231. handlerSetScriptRunning(this, setScriptRunning.Script.ObjectID, setScriptRunning.Script.ItemID, setScriptRunning.Script.Running);
  7232. }
  7233. break;
  7234. case PacketType.ScriptReset:
  7235. ScriptResetPacket scriptResetPacket = (ScriptResetPacket)Pack;
  7236. #region Packet Session and User Check
  7237. if (m_checkPackets)
  7238. {
  7239. if (scriptResetPacket.AgentData.SessionID != SessionId ||
  7240. scriptResetPacket.AgentData.AgentID != AgentId)
  7241. break;
  7242. }
  7243. #endregion
  7244. handlerScriptReset = OnScriptReset;
  7245. if (handlerScriptReset != null)
  7246. {
  7247. handlerScriptReset(this, scriptResetPacket.Script.ObjectID, scriptResetPacket.Script.ItemID);
  7248. }
  7249. break;
  7250. #endregion
  7251. #region Gesture Managment
  7252. case PacketType.ActivateGestures:
  7253. ActivateGesturesPacket activateGesturePacket = (ActivateGesturesPacket)Pack;
  7254. #region Packet Session and User Check
  7255. if (m_checkPackets)
  7256. {
  7257. if (activateGesturePacket.AgentData.SessionID != SessionId ||
  7258. activateGesturePacket.AgentData.AgentID != AgentId)
  7259. break;
  7260. }
  7261. #endregion
  7262. handlerActivateGesture = OnActivateGesture;
  7263. if (handlerActivateGesture != null)
  7264. {
  7265. handlerActivateGesture(this,
  7266. activateGesturePacket.Data[0].AssetID,
  7267. activateGesturePacket.Data[0].ItemID);
  7268. }
  7269. else m_log.Error("Null pointer for activateGesture");
  7270. break;
  7271. case PacketType.DeactivateGestures:
  7272. DeactivateGesturesPacket deactivateGesturePacket = (DeactivateGesturesPacket)Pack;
  7273. #region Packet Session and User Check
  7274. if (m_checkPackets)
  7275. {
  7276. if (deactivateGesturePacket.AgentData.SessionID != SessionId ||
  7277. deactivateGesturePacket.AgentData.AgentID != AgentId)
  7278. break;
  7279. }
  7280. #endregion
  7281. handlerDeactivateGesture = OnDeactivateGesture;
  7282. if (handlerDeactivateGesture != null)
  7283. {
  7284. handlerDeactivateGesture(this, deactivateGesturePacket.Data[0].ItemID);
  7285. }
  7286. break;
  7287. case PacketType.ObjectOwner:
  7288. ObjectOwnerPacket objectOwnerPacket = (ObjectOwnerPacket)Pack;
  7289. #region Packet Session and User Check
  7290. if (m_checkPackets)
  7291. {
  7292. if (objectOwnerPacket.AgentData.SessionID != SessionId ||
  7293. objectOwnerPacket.AgentData.AgentID != AgentId)
  7294. break;
  7295. }
  7296. #endregion
  7297. List<uint> localIDs = new List<uint>();
  7298. foreach (ObjectOwnerPacket.ObjectDataBlock d in objectOwnerPacket.ObjectData)
  7299. localIDs.Add(d.ObjectLocalID);
  7300. handlerObjectOwner = OnObjectOwner;
  7301. if (handlerObjectOwner != null)
  7302. {
  7303. handlerObjectOwner(this, objectOwnerPacket.HeaderData.OwnerID, objectOwnerPacket.HeaderData.GroupID, localIDs);
  7304. }
  7305. break;
  7306. #endregion
  7307. #region unimplemented handlers
  7308. case PacketType.StartPingCheck:
  7309. // Send the client the ping response back
  7310. // Pass the same PingID in the matching packet
  7311. // Handled In the packet processing
  7312. //m_log.Debug("[CLIENT]: possibly unhandled StartPingCheck packet");
  7313. break;
  7314. case PacketType.CompletePingCheck:
  7315. // TODO: Perhaps this should be processed on the Sim to determine whether or not to drop a dead client
  7316. //m_log.Warn("[CLIENT]: unhandled CompletePingCheck packet");
  7317. break;
  7318. case PacketType.ViewerStats:
  7319. // TODO: handle this packet
  7320. //m_log.Warn("[CLIENT]: unhandled ViewerStats packet");
  7321. break;
  7322. case PacketType.MapItemRequest:
  7323. MapItemRequestPacket mirpk = (MapItemRequestPacket)Pack;
  7324. #region Packet Session and User Check
  7325. if (m_checkPackets)
  7326. {
  7327. if (mirpk.AgentData.SessionID != SessionId ||
  7328. mirpk.AgentData.AgentID != AgentId)
  7329. break;
  7330. }
  7331. #endregion
  7332. //m_log.Debug(mirpk.ToString());
  7333. handlerMapItemRequest = OnMapItemRequest;
  7334. if (handlerMapItemRequest != null)
  7335. {
  7336. handlerMapItemRequest(this,mirpk.AgentData.Flags, mirpk.AgentData.EstateID,
  7337. mirpk.AgentData.Godlike,mirpk.RequestData.ItemType,
  7338. mirpk.RequestData.RegionHandle);
  7339. }
  7340. break;
  7341. case PacketType.TransferAbort:
  7342. // TODO: handle this packet
  7343. //m_log.Warn("[CLIENT]: unhandled TransferAbort packet");
  7344. break;
  7345. case PacketType.MuteListRequest:
  7346. MuteListRequestPacket muteListRequest =
  7347. (MuteListRequestPacket)Pack;
  7348. #region Packet Session and User Check
  7349. if (m_checkPackets)
  7350. {
  7351. if (muteListRequest.AgentData.SessionID != SessionId ||
  7352. muteListRequest.AgentData.AgentID != AgentId)
  7353. break;
  7354. }
  7355. #endregion
  7356. handlerMuteListRequest = OnMuteListRequest;
  7357. if (handlerMuteListRequest != null)
  7358. {
  7359. handlerMuteListRequest(this, muteListRequest.MuteData.MuteCRC);
  7360. }
  7361. else
  7362. {
  7363. SendUseCachedMuteList();
  7364. }
  7365. break;
  7366. case PacketType.UseCircuitCode:
  7367. // Don't display this one, we handle it at a lower level
  7368. break;
  7369. case PacketType.AgentHeightWidth:
  7370. // TODO: handle this packet
  7371. //m_log.Warn("[CLIENT]: unhandled AgentHeightWidth packet");
  7372. break;
  7373. case PacketType.InventoryDescendents:
  7374. // TODO: handle this packet
  7375. //m_log.Warn("[CLIENT]: unhandled InventoryDescent packet");
  7376. break;
  7377. case PacketType.DirPlacesQuery:
  7378. DirPlacesQueryPacket dirPlacesQueryPacket = (DirPlacesQueryPacket)Pack;
  7379. //m_log.Debug(dirPlacesQueryPacket.ToString());
  7380. #region Packet Session and User Check
  7381. if (m_checkPackets)
  7382. {
  7383. if (dirPlacesQueryPacket.AgentData.SessionID != SessionId ||
  7384. dirPlacesQueryPacket.AgentData.AgentID != AgentId)
  7385. break;
  7386. }
  7387. #endregion
  7388. handlerDirPlacesQuery = OnDirPlacesQuery;
  7389. if (handlerDirPlacesQuery != null)
  7390. {
  7391. handlerDirPlacesQuery(this,
  7392. dirPlacesQueryPacket.QueryData.QueryID,
  7393. Utils.BytesToString(
  7394. dirPlacesQueryPacket.QueryData.QueryText),
  7395. (int)dirPlacesQueryPacket.QueryData.QueryFlags,
  7396. (int)dirPlacesQueryPacket.QueryData.Category,
  7397. Utils.BytesToString(
  7398. dirPlacesQueryPacket.QueryData.SimName),
  7399. dirPlacesQueryPacket.QueryData.QueryStart);
  7400. }
  7401. break;
  7402. case PacketType.DirFindQuery:
  7403. DirFindQueryPacket dirFindQueryPacket = (DirFindQueryPacket)Pack;
  7404. #region Packet Session and User Check
  7405. if (m_checkPackets)
  7406. {
  7407. if (dirFindQueryPacket.AgentData.SessionID != SessionId ||
  7408. dirFindQueryPacket.AgentData.AgentID != AgentId)
  7409. break;
  7410. }
  7411. #endregion
  7412. handlerDirFindQuery = OnDirFindQuery;
  7413. if (handlerDirFindQuery != null)
  7414. {
  7415. handlerDirFindQuery(this,
  7416. dirFindQueryPacket.QueryData.QueryID,
  7417. Utils.BytesToString(
  7418. dirFindQueryPacket.QueryData.QueryText),
  7419. dirFindQueryPacket.QueryData.QueryFlags,
  7420. dirFindQueryPacket.QueryData.QueryStart);
  7421. }
  7422. break;
  7423. case PacketType.DirLandQuery:
  7424. DirLandQueryPacket dirLandQueryPacket = (DirLandQueryPacket)Pack;
  7425. #region Packet Session and User Check
  7426. if (m_checkPackets)
  7427. {
  7428. if (dirLandQueryPacket.AgentData.SessionID != SessionId ||
  7429. dirLandQueryPacket.AgentData.AgentID != AgentId)
  7430. break;
  7431. }
  7432. #endregion
  7433. handlerDirLandQuery = OnDirLandQuery;
  7434. if (handlerDirLandQuery != null)
  7435. {
  7436. handlerDirLandQuery(this,
  7437. dirLandQueryPacket.QueryData.QueryID,
  7438. dirLandQueryPacket.QueryData.QueryFlags,
  7439. dirLandQueryPacket.QueryData.SearchType,
  7440. dirLandQueryPacket.QueryData.Price,
  7441. dirLandQueryPacket.QueryData.Area,
  7442. dirLandQueryPacket.QueryData.QueryStart);
  7443. }
  7444. break;
  7445. case PacketType.DirPopularQuery:
  7446. DirPopularQueryPacket dirPopularQueryPacket = (DirPopularQueryPacket)Pack;
  7447. #region Packet Session and User Check
  7448. if (m_checkPackets)
  7449. {
  7450. if (dirPopularQueryPacket.AgentData.SessionID != SessionId ||
  7451. dirPopularQueryPacket.AgentData.AgentID != AgentId)
  7452. break;
  7453. }
  7454. #endregion
  7455. handlerDirPopularQuery = OnDirPopularQuery;
  7456. if (handlerDirPopularQuery != null)
  7457. {
  7458. handlerDirPopularQuery(this,
  7459. dirPopularQueryPacket.QueryData.QueryID,
  7460. dirPopularQueryPacket.QueryData.QueryFlags);
  7461. }
  7462. break;
  7463. case PacketType.DirClassifiedQuery:
  7464. DirClassifiedQueryPacket dirClassifiedQueryPacket = (DirClassifiedQueryPacket)Pack;
  7465. #region Packet Session and User Check
  7466. if (m_checkPackets)
  7467. {
  7468. if (dirClassifiedQueryPacket.AgentData.SessionID != SessionId ||
  7469. dirClassifiedQueryPacket.AgentData.AgentID != AgentId)
  7470. break;
  7471. }
  7472. #endregion
  7473. handlerDirClassifiedQuery = OnDirClassifiedQuery;
  7474. if (handlerDirClassifiedQuery != null)
  7475. {
  7476. handlerDirClassifiedQuery(this,
  7477. dirClassifiedQueryPacket.QueryData.QueryID,
  7478. Utils.BytesToString(
  7479. dirClassifiedQueryPacket.QueryData.QueryText),
  7480. dirClassifiedQueryPacket.QueryData.QueryFlags,
  7481. dirClassifiedQueryPacket.QueryData.Category,
  7482. dirClassifiedQueryPacket.QueryData.QueryStart);
  7483. }
  7484. break;
  7485. case PacketType.EventInfoRequest:
  7486. EventInfoRequestPacket eventInfoRequestPacket = (EventInfoRequestPacket)Pack;
  7487. #region Packet Session and User Check
  7488. if (m_checkPackets)
  7489. {
  7490. if (eventInfoRequestPacket.AgentData.SessionID != SessionId ||
  7491. eventInfoRequestPacket.AgentData.AgentID != AgentId)
  7492. break;
  7493. }
  7494. #endregion
  7495. if (OnEventInfoRequest != null)
  7496. {
  7497. OnEventInfoRequest(this, eventInfoRequestPacket.EventData.EventID);
  7498. }
  7499. break;
  7500. #region Calling Card
  7501. case PacketType.OfferCallingCard:
  7502. OfferCallingCardPacket offerCallingCardPacket = (OfferCallingCardPacket)Pack;
  7503. #region Packet Session and User Check
  7504. if (m_checkPackets)
  7505. {
  7506. if (offerCallingCardPacket.AgentData.SessionID != SessionId ||
  7507. offerCallingCardPacket.AgentData.AgentID != AgentId)
  7508. break;
  7509. }
  7510. #endregion
  7511. if (OnOfferCallingCard != null)
  7512. {
  7513. OnOfferCallingCard(this,
  7514. offerCallingCardPacket.AgentBlock.DestID,
  7515. offerCallingCardPacket.AgentBlock.TransactionID);
  7516. }
  7517. break;
  7518. case PacketType.AcceptCallingCard:
  7519. AcceptCallingCardPacket acceptCallingCardPacket = (AcceptCallingCardPacket)Pack;
  7520. #region Packet Session and User Check
  7521. if (m_checkPackets)
  7522. {
  7523. if (acceptCallingCardPacket.AgentData.SessionID != SessionId ||
  7524. acceptCallingCardPacket.AgentData.AgentID != AgentId)
  7525. break;
  7526. }
  7527. #endregion
  7528. // according to http://wiki.secondlife.com/wiki/AcceptCallingCard FolderData should
  7529. // contain exactly one entry
  7530. if (OnAcceptCallingCard != null && acceptCallingCardPacket.FolderData.Length > 0)
  7531. {
  7532. OnAcceptCallingCard(this,
  7533. acceptCallingCardPacket.TransactionBlock.TransactionID,
  7534. acceptCallingCardPacket.FolderData[0].FolderID);
  7535. }
  7536. break;
  7537. case PacketType.DeclineCallingCard:
  7538. DeclineCallingCardPacket declineCallingCardPacket = (DeclineCallingCardPacket)Pack;
  7539. #region Packet Session and User Check
  7540. if (m_checkPackets)
  7541. {
  7542. if (declineCallingCardPacket.AgentData.SessionID != SessionId ||
  7543. declineCallingCardPacket.AgentData.AgentID != AgentId)
  7544. break;
  7545. }
  7546. #endregion
  7547. if (OnDeclineCallingCard != null)
  7548. {
  7549. OnDeclineCallingCard(this,
  7550. declineCallingCardPacket.TransactionBlock.TransactionID);
  7551. }
  7552. break;
  7553. #endregion
  7554. #region Groups
  7555. case PacketType.ActivateGroup:
  7556. ActivateGroupPacket activateGroupPacket = (ActivateGroupPacket)Pack;
  7557. #region Packet Session and User Check
  7558. if (m_checkPackets)
  7559. {
  7560. if (activateGroupPacket.AgentData.SessionID != SessionId ||
  7561. activateGroupPacket.AgentData.AgentID != AgentId)
  7562. break;
  7563. }
  7564. #endregion
  7565. if (m_GroupsModule != null)
  7566. {
  7567. m_GroupsModule.ActivateGroup(this, activateGroupPacket.AgentData.GroupID);
  7568. m_GroupsModule.SendAgentGroupDataUpdate(this);
  7569. }
  7570. break;
  7571. case PacketType.GroupTitlesRequest:
  7572. GroupTitlesRequestPacket groupTitlesRequest =
  7573. (GroupTitlesRequestPacket)Pack;
  7574. #region Packet Session and User Check
  7575. if (m_checkPackets)
  7576. {
  7577. if (groupTitlesRequest.AgentData.SessionID != SessionId ||
  7578. groupTitlesRequest.AgentData.AgentID != AgentId)
  7579. break;
  7580. }
  7581. #endregion
  7582. if (m_GroupsModule != null)
  7583. {
  7584. GroupTitlesReplyPacket groupTitlesReply = (GroupTitlesReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupTitlesReply);
  7585. groupTitlesReply.AgentData =
  7586. new GroupTitlesReplyPacket.AgentDataBlock();
  7587. groupTitlesReply.AgentData.AgentID = AgentId;
  7588. groupTitlesReply.AgentData.GroupID =
  7589. groupTitlesRequest.AgentData.GroupID;
  7590. groupTitlesReply.AgentData.RequestID =
  7591. groupTitlesRequest.AgentData.RequestID;
  7592. List<GroupTitlesData> titles =
  7593. m_GroupsModule.GroupTitlesRequest(this,
  7594. groupTitlesRequest.AgentData.GroupID);
  7595. groupTitlesReply.GroupData =
  7596. new GroupTitlesReplyPacket.GroupDataBlock[titles.Count];
  7597. int i = 0;
  7598. foreach (GroupTitlesData d in titles)
  7599. {
  7600. groupTitlesReply.GroupData[i] =
  7601. new GroupTitlesReplyPacket.GroupDataBlock();
  7602. groupTitlesReply.GroupData[i].Title =
  7603. Utils.StringToBytes(d.Name);
  7604. groupTitlesReply.GroupData[i].RoleID =
  7605. d.UUID;
  7606. groupTitlesReply.GroupData[i].Selected =
  7607. d.Selected;
  7608. i++;
  7609. }
  7610. OutPacket(groupTitlesReply, ThrottleOutPacketType.Task);
  7611. }
  7612. break;
  7613. case PacketType.GroupProfileRequest:
  7614. GroupProfileRequestPacket groupProfileRequest =
  7615. (GroupProfileRequestPacket)Pack;
  7616. #region Packet Session and User Check
  7617. if (m_checkPackets)
  7618. {
  7619. if (groupProfileRequest.AgentData.SessionID != SessionId ||
  7620. groupProfileRequest.AgentData.AgentID != AgentId)
  7621. break;
  7622. }
  7623. #endregion
  7624. if (m_GroupsModule != null)
  7625. {
  7626. GroupProfileReplyPacket groupProfileReply = (GroupProfileReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupProfileReply);
  7627. groupProfileReply.AgentData = new GroupProfileReplyPacket.AgentDataBlock();
  7628. groupProfileReply.GroupData = new GroupProfileReplyPacket.GroupDataBlock();
  7629. groupProfileReply.AgentData.AgentID = AgentId;
  7630. GroupProfileData d = m_GroupsModule.GroupProfileRequest(this,
  7631. groupProfileRequest.GroupData.GroupID);
  7632. groupProfileReply.GroupData.GroupID = d.GroupID;
  7633. groupProfileReply.GroupData.Name = Utils.StringToBytes(d.Name);
  7634. groupProfileReply.GroupData.Charter = Utils.StringToBytes(d.Charter);
  7635. groupProfileReply.GroupData.ShowInList = d.ShowInList;
  7636. groupProfileReply.GroupData.MemberTitle = Utils.StringToBytes(d.MemberTitle);
  7637. groupProfileReply.GroupData.PowersMask = d.PowersMask;
  7638. groupProfileReply.GroupData.InsigniaID = d.InsigniaID;
  7639. groupProfileReply.GroupData.FounderID = d.FounderID;
  7640. groupProfileReply.GroupData.MembershipFee = d.MembershipFee;
  7641. groupProfileReply.GroupData.OpenEnrollment = d.OpenEnrollment;
  7642. groupProfileReply.GroupData.Money = d.Money;
  7643. groupProfileReply.GroupData.GroupMembershipCount = d.GroupMembershipCount;
  7644. groupProfileReply.GroupData.GroupRolesCount = d.GroupRolesCount;
  7645. groupProfileReply.GroupData.AllowPublish = d.AllowPublish;
  7646. groupProfileReply.GroupData.MaturePublish = d.MaturePublish;
  7647. groupProfileReply.GroupData.OwnerRole = d.OwnerRole;
  7648. OutPacket(groupProfileReply, ThrottleOutPacketType.Task);
  7649. }
  7650. break;
  7651. case PacketType.GroupMembersRequest:
  7652. GroupMembersRequestPacket groupMembersRequestPacket =
  7653. (GroupMembersRequestPacket)Pack;
  7654. #region Packet Session and User Check
  7655. if (m_checkPackets)
  7656. {
  7657. if (groupMembersRequestPacket.AgentData.SessionID != SessionId ||
  7658. groupMembersRequestPacket.AgentData.AgentID != AgentId)
  7659. break;
  7660. }
  7661. #endregion
  7662. if (m_GroupsModule != null)
  7663. {
  7664. List<GroupMembersData> members =
  7665. m_GroupsModule.GroupMembersRequest(this, groupMembersRequestPacket.GroupData.GroupID);
  7666. int memberCount = members.Count;
  7667. while (true)
  7668. {
  7669. int blockCount = members.Count;
  7670. if (blockCount > 40)
  7671. blockCount = 40;
  7672. GroupMembersReplyPacket groupMembersReply = (GroupMembersReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupMembersReply);
  7673. groupMembersReply.AgentData =
  7674. new GroupMembersReplyPacket.AgentDataBlock();
  7675. groupMembersReply.GroupData =
  7676. new GroupMembersReplyPacket.GroupDataBlock();
  7677. groupMembersReply.MemberData =
  7678. new GroupMembersReplyPacket.MemberDataBlock[
  7679. blockCount];
  7680. groupMembersReply.AgentData.AgentID = AgentId;
  7681. groupMembersReply.GroupData.GroupID =
  7682. groupMembersRequestPacket.GroupData.GroupID;
  7683. groupMembersReply.GroupData.RequestID =
  7684. groupMembersRequestPacket.GroupData.RequestID;
  7685. groupMembersReply.GroupData.MemberCount = memberCount;
  7686. for (int i = 0 ; i < blockCount ; i++)
  7687. {
  7688. GroupMembersData m = members[0];
  7689. members.RemoveAt(0);
  7690. groupMembersReply.MemberData[i] =
  7691. new GroupMembersReplyPacket.MemberDataBlock();
  7692. groupMembersReply.MemberData[i].AgentID =
  7693. m.AgentID;
  7694. groupMembersReply.MemberData[i].Contribution =
  7695. m.Contribution;
  7696. groupMembersReply.MemberData[i].OnlineStatus =
  7697. Utils.StringToBytes(m.OnlineStatus);
  7698. groupMembersReply.MemberData[i].AgentPowers =
  7699. m.AgentPowers;
  7700. groupMembersReply.MemberData[i].Title =
  7701. Utils.StringToBytes(m.Title);
  7702. groupMembersReply.MemberData[i].IsOwner =
  7703. m.IsOwner;
  7704. }
  7705. OutPacket(groupMembersReply, ThrottleOutPacketType.Task);
  7706. if (members.Count == 0)
  7707. break;
  7708. }
  7709. }
  7710. break;
  7711. case PacketType.GroupRoleDataRequest:
  7712. GroupRoleDataRequestPacket groupRolesRequest =
  7713. (GroupRoleDataRequestPacket)Pack;
  7714. #region Packet Session and User Check
  7715. if (m_checkPackets)
  7716. {
  7717. if (groupRolesRequest.AgentData.SessionID != SessionId ||
  7718. groupRolesRequest.AgentData.AgentID != AgentId)
  7719. break;
  7720. }
  7721. #endregion
  7722. if (m_GroupsModule != null)
  7723. {
  7724. GroupRoleDataReplyPacket groupRolesReply = (GroupRoleDataReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupRoleDataReply);
  7725. groupRolesReply.AgentData =
  7726. new GroupRoleDataReplyPacket.AgentDataBlock();
  7727. groupRolesReply.AgentData.AgentID = AgentId;
  7728. groupRolesReply.GroupData =
  7729. new GroupRoleDataReplyPacket.GroupDataBlock();
  7730. groupRolesReply.GroupData.GroupID =
  7731. groupRolesRequest.GroupData.GroupID;
  7732. groupRolesReply.GroupData.RequestID =
  7733. groupRolesRequest.GroupData.RequestID;
  7734. List<GroupRolesData> titles =
  7735. m_GroupsModule.GroupRoleDataRequest(this,
  7736. groupRolesRequest.GroupData.GroupID);
  7737. groupRolesReply.GroupData.RoleCount =
  7738. titles.Count;
  7739. groupRolesReply.RoleData =
  7740. new GroupRoleDataReplyPacket.RoleDataBlock[titles.Count];
  7741. int i = 0;
  7742. foreach (GroupRolesData d in titles)
  7743. {
  7744. groupRolesReply.RoleData[i] =
  7745. new GroupRoleDataReplyPacket.RoleDataBlock();
  7746. groupRolesReply.RoleData[i].RoleID =
  7747. d.RoleID;
  7748. groupRolesReply.RoleData[i].Name =
  7749. Utils.StringToBytes(d.Name);
  7750. groupRolesReply.RoleData[i].Title =
  7751. Utils.StringToBytes(d.Title);
  7752. groupRolesReply.RoleData[i].Description =
  7753. Utils.StringToBytes(d.Description);
  7754. groupRolesReply.RoleData[i].Powers =
  7755. d.Powers;
  7756. groupRolesReply.RoleData[i].Members =
  7757. (uint)d.Members;
  7758. i++;
  7759. }
  7760. OutPacket(groupRolesReply, ThrottleOutPacketType.Task);
  7761. }
  7762. break;
  7763. case PacketType.GroupRoleMembersRequest:
  7764. GroupRoleMembersRequestPacket groupRoleMembersRequest =
  7765. (GroupRoleMembersRequestPacket)Pack;
  7766. #region Packet Session and User Check
  7767. if (m_checkPackets)
  7768. {
  7769. if (groupRoleMembersRequest.AgentData.SessionID != SessionId ||
  7770. groupRoleMembersRequest.AgentData.AgentID != AgentId)
  7771. break;
  7772. }
  7773. #endregion
  7774. if (m_GroupsModule != null)
  7775. {
  7776. List<GroupRoleMembersData> mappings =
  7777. m_GroupsModule.GroupRoleMembersRequest(this,
  7778. groupRoleMembersRequest.GroupData.GroupID);
  7779. int mappingsCount = mappings.Count;
  7780. while (mappings.Count > 0)
  7781. {
  7782. int pairs = mappings.Count;
  7783. if (pairs > 32)
  7784. pairs = 32;
  7785. GroupRoleMembersReplyPacket groupRoleMembersReply = (GroupRoleMembersReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupRoleMembersReply);
  7786. groupRoleMembersReply.AgentData =
  7787. new GroupRoleMembersReplyPacket.AgentDataBlock();
  7788. groupRoleMembersReply.AgentData.AgentID =
  7789. AgentId;
  7790. groupRoleMembersReply.AgentData.GroupID =
  7791. groupRoleMembersRequest.GroupData.GroupID;
  7792. groupRoleMembersReply.AgentData.RequestID =
  7793. groupRoleMembersRequest.GroupData.RequestID;
  7794. groupRoleMembersReply.AgentData.TotalPairs =
  7795. (uint)mappingsCount;
  7796. groupRoleMembersReply.MemberData =
  7797. new GroupRoleMembersReplyPacket.MemberDataBlock[pairs];
  7798. for (int i = 0 ; i < pairs ; i++)
  7799. {
  7800. GroupRoleMembersData d = mappings[0];
  7801. mappings.RemoveAt(0);
  7802. groupRoleMembersReply.MemberData[i] =
  7803. new GroupRoleMembersReplyPacket.MemberDataBlock();
  7804. groupRoleMembersReply.MemberData[i].RoleID =
  7805. d.RoleID;
  7806. groupRoleMembersReply.MemberData[i].MemberID =
  7807. d.MemberID;
  7808. }
  7809. OutPacket(groupRoleMembersReply, ThrottleOutPacketType.Task);
  7810. }
  7811. }
  7812. break;
  7813. case PacketType.CreateGroupRequest:
  7814. CreateGroupRequestPacket createGroupRequest =
  7815. (CreateGroupRequestPacket)Pack;
  7816. #region Packet Session and User Check
  7817. if (m_checkPackets)
  7818. {
  7819. if (createGroupRequest.AgentData.SessionID != SessionId ||
  7820. createGroupRequest.AgentData.AgentID != AgentId)
  7821. break;
  7822. }
  7823. #endregion
  7824. if (m_GroupsModule != null)
  7825. {
  7826. m_GroupsModule.CreateGroup(this,
  7827. Utils.BytesToString(createGroupRequest.GroupData.Name),
  7828. Utils.BytesToString(createGroupRequest.GroupData.Charter),
  7829. createGroupRequest.GroupData.ShowInList,
  7830. createGroupRequest.GroupData.InsigniaID,
  7831. createGroupRequest.GroupData.MembershipFee,
  7832. createGroupRequest.GroupData.OpenEnrollment,
  7833. createGroupRequest.GroupData.AllowPublish,
  7834. createGroupRequest.GroupData.MaturePublish);
  7835. }
  7836. break;
  7837. case PacketType.UpdateGroupInfo:
  7838. UpdateGroupInfoPacket updateGroupInfo =
  7839. (UpdateGroupInfoPacket)Pack;
  7840. #region Packet Session and User Check
  7841. if (m_checkPackets)
  7842. {
  7843. if (updateGroupInfo.AgentData.SessionID != SessionId ||
  7844. updateGroupInfo.AgentData.AgentID != AgentId)
  7845. break;
  7846. }
  7847. #endregion
  7848. if (m_GroupsModule != null)
  7849. {
  7850. m_GroupsModule.UpdateGroupInfo(this,
  7851. updateGroupInfo.GroupData.GroupID,
  7852. Utils.BytesToString(updateGroupInfo.GroupData.Charter),
  7853. updateGroupInfo.GroupData.ShowInList,
  7854. updateGroupInfo.GroupData.InsigniaID,
  7855. updateGroupInfo.GroupData.MembershipFee,
  7856. updateGroupInfo.GroupData.OpenEnrollment,
  7857. updateGroupInfo.GroupData.AllowPublish,
  7858. updateGroupInfo.GroupData.MaturePublish);
  7859. }
  7860. break;
  7861. case PacketType.SetGroupAcceptNotices:
  7862. SetGroupAcceptNoticesPacket setGroupAcceptNotices =
  7863. (SetGroupAcceptNoticesPacket)Pack;
  7864. #region Packet Session and User Check
  7865. if (m_checkPackets)
  7866. {
  7867. if (setGroupAcceptNotices.AgentData.SessionID != SessionId ||
  7868. setGroupAcceptNotices.AgentData.AgentID != AgentId)
  7869. break;
  7870. }
  7871. #endregion
  7872. if (m_GroupsModule != null)
  7873. {
  7874. m_GroupsModule.SetGroupAcceptNotices(this,
  7875. setGroupAcceptNotices.Data.GroupID,
  7876. setGroupAcceptNotices.Data.AcceptNotices,
  7877. setGroupAcceptNotices.NewData.ListInProfile);
  7878. }
  7879. break;
  7880. case PacketType.GroupTitleUpdate:
  7881. GroupTitleUpdatePacket groupTitleUpdate =
  7882. (GroupTitleUpdatePacket)Pack;
  7883. #region Packet Session and User Check
  7884. if (m_checkPackets)
  7885. {
  7886. if (groupTitleUpdate.AgentData.SessionID != SessionId ||
  7887. groupTitleUpdate.AgentData.AgentID != AgentId)
  7888. break;
  7889. }
  7890. #endregion
  7891. if (m_GroupsModule != null)
  7892. {
  7893. m_GroupsModule.GroupTitleUpdate(this,
  7894. groupTitleUpdate.AgentData.GroupID,
  7895. groupTitleUpdate.AgentData.TitleRoleID);
  7896. }
  7897. break;
  7898. case PacketType.ParcelDeedToGroup:
  7899. ParcelDeedToGroupPacket parcelDeedToGroup = (ParcelDeedToGroupPacket)Pack;
  7900. if (m_GroupsModule != null)
  7901. {
  7902. handlerParcelDeedToGroup = OnParcelDeedToGroup;
  7903. if (handlerParcelDeedToGroup != null)
  7904. {
  7905. handlerParcelDeedToGroup(parcelDeedToGroup.Data.LocalID, parcelDeedToGroup.Data.GroupID,this);
  7906. }
  7907. }
  7908. break;
  7909. case PacketType.GroupNoticesListRequest:
  7910. GroupNoticesListRequestPacket groupNoticesListRequest =
  7911. (GroupNoticesListRequestPacket)Pack;
  7912. #region Packet Session and User Check
  7913. if (m_checkPackets)
  7914. {
  7915. if (groupNoticesListRequest.AgentData.SessionID != SessionId ||
  7916. groupNoticesListRequest.AgentData.AgentID != AgentId)
  7917. break;
  7918. }
  7919. #endregion
  7920. if (m_GroupsModule != null)
  7921. {
  7922. GroupNoticeData[] gn =
  7923. m_GroupsModule.GroupNoticesListRequest(this,
  7924. groupNoticesListRequest.Data.GroupID);
  7925. GroupNoticesListReplyPacket groupNoticesListReply = (GroupNoticesListReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupNoticesListReply);
  7926. groupNoticesListReply.AgentData =
  7927. new GroupNoticesListReplyPacket.AgentDataBlock();
  7928. groupNoticesListReply.AgentData.AgentID = AgentId;
  7929. groupNoticesListReply.AgentData.GroupID = groupNoticesListRequest.Data.GroupID;
  7930. groupNoticesListReply.Data = new GroupNoticesListReplyPacket.DataBlock[gn.Length];
  7931. int i = 0;
  7932. foreach (GroupNoticeData g in gn)
  7933. {
  7934. groupNoticesListReply.Data[i] = new GroupNoticesListReplyPacket.DataBlock();
  7935. groupNoticesListReply.Data[i].NoticeID =
  7936. g.NoticeID;
  7937. groupNoticesListReply.Data[i].Timestamp =
  7938. g.Timestamp;
  7939. groupNoticesListReply.Data[i].FromName =
  7940. Utils.StringToBytes(g.FromName);
  7941. groupNoticesListReply.Data[i].Subject =
  7942. Utils.StringToBytes(g.Subject);
  7943. groupNoticesListReply.Data[i].HasAttachment =
  7944. g.HasAttachment;
  7945. groupNoticesListReply.Data[i].AssetType =
  7946. g.AssetType;
  7947. i++;
  7948. }
  7949. OutPacket(groupNoticesListReply, ThrottleOutPacketType.Task);
  7950. }
  7951. break;
  7952. case PacketType.GroupNoticeRequest:
  7953. GroupNoticeRequestPacket groupNoticeRequest =
  7954. (GroupNoticeRequestPacket)Pack;
  7955. #region Packet Session and User Check
  7956. if (m_checkPackets)
  7957. {
  7958. if (groupNoticeRequest.AgentData.SessionID != SessionId ||
  7959. groupNoticeRequest.AgentData.AgentID != AgentId)
  7960. break;
  7961. }
  7962. #endregion
  7963. if (m_GroupsModule != null)
  7964. {
  7965. m_GroupsModule.GroupNoticeRequest(this,
  7966. groupNoticeRequest.Data.GroupNoticeID);
  7967. }
  7968. break;
  7969. case PacketType.GroupRoleUpdate:
  7970. GroupRoleUpdatePacket groupRoleUpdate =
  7971. (GroupRoleUpdatePacket)Pack;
  7972. #region Packet Session and User Check
  7973. if (m_checkPackets)
  7974. {
  7975. if (groupRoleUpdate.AgentData.SessionID != SessionId ||
  7976. groupRoleUpdate.AgentData.AgentID != AgentId)
  7977. break;
  7978. }
  7979. #endregion
  7980. if (m_GroupsModule != null)
  7981. {
  7982. foreach (GroupRoleUpdatePacket.RoleDataBlock d in
  7983. groupRoleUpdate.RoleData)
  7984. {
  7985. m_GroupsModule.GroupRoleUpdate(this,
  7986. groupRoleUpdate.AgentData.GroupID,
  7987. d.RoleID,
  7988. Utils.BytesToString(d.Name),
  7989. Utils.BytesToString(d.Description),
  7990. Utils.BytesToString(d.Title),
  7991. d.Powers,
  7992. d.UpdateType);
  7993. }
  7994. m_GroupsModule.NotifyChange(groupRoleUpdate.AgentData.GroupID);
  7995. }
  7996. break;
  7997. case PacketType.GroupRoleChanges:
  7998. GroupRoleChangesPacket groupRoleChanges =
  7999. (GroupRoleChangesPacket)Pack;
  8000. #region Packet Session and User Check
  8001. if (m_checkPackets)
  8002. {
  8003. if (groupRoleChanges.AgentData.SessionID != SessionId ||
  8004. groupRoleChanges.AgentData.AgentID != AgentId)
  8005. break;
  8006. }
  8007. #endregion
  8008. if (m_GroupsModule != null)
  8009. {
  8010. foreach (GroupRoleChangesPacket.RoleChangeBlock d in
  8011. groupRoleChanges.RoleChange)
  8012. {
  8013. m_GroupsModule.GroupRoleChanges(this,
  8014. groupRoleChanges.AgentData.GroupID,
  8015. d.RoleID,
  8016. d.MemberID,
  8017. d.Change);
  8018. }
  8019. m_GroupsModule.NotifyChange(groupRoleChanges.AgentData.GroupID);
  8020. }
  8021. break;
  8022. case PacketType.JoinGroupRequest:
  8023. JoinGroupRequestPacket joinGroupRequest =
  8024. (JoinGroupRequestPacket)Pack;
  8025. #region Packet Session and User Check
  8026. if (m_checkPackets)
  8027. {
  8028. if (joinGroupRequest.AgentData.SessionID != SessionId ||
  8029. joinGroupRequest.AgentData.AgentID != AgentId)
  8030. break;
  8031. }
  8032. #endregion
  8033. if (m_GroupsModule != null)
  8034. {
  8035. m_GroupsModule.JoinGroupRequest(this,
  8036. joinGroupRequest.GroupData.GroupID);
  8037. }
  8038. break;
  8039. case PacketType.LeaveGroupRequest:
  8040. LeaveGroupRequestPacket leaveGroupRequest =
  8041. (LeaveGroupRequestPacket)Pack;
  8042. #region Packet Session and User Check
  8043. if (m_checkPackets)
  8044. {
  8045. if (leaveGroupRequest.AgentData.SessionID != SessionId ||
  8046. leaveGroupRequest.AgentData.AgentID != AgentId)
  8047. break;
  8048. }
  8049. #endregion
  8050. if (m_GroupsModule != null)
  8051. {
  8052. m_GroupsModule.LeaveGroupRequest(this,
  8053. leaveGroupRequest.GroupData.GroupID);
  8054. }
  8055. break;
  8056. case PacketType.EjectGroupMemberRequest:
  8057. EjectGroupMemberRequestPacket ejectGroupMemberRequest =
  8058. (EjectGroupMemberRequestPacket)Pack;
  8059. #region Packet Session and User Check
  8060. if (m_checkPackets)
  8061. {
  8062. if (ejectGroupMemberRequest.AgentData.SessionID != SessionId ||
  8063. ejectGroupMemberRequest.AgentData.AgentID != AgentId)
  8064. break;
  8065. }
  8066. #endregion
  8067. if (m_GroupsModule != null)
  8068. {
  8069. foreach (EjectGroupMemberRequestPacket.EjectDataBlock e
  8070. in ejectGroupMemberRequest.EjectData)
  8071. {
  8072. m_GroupsModule.EjectGroupMemberRequest(this,
  8073. ejectGroupMemberRequest.GroupData.GroupID,
  8074. e.EjecteeID);
  8075. }
  8076. }
  8077. break;
  8078. case PacketType.InviteGroupRequest:
  8079. InviteGroupRequestPacket inviteGroupRequest =
  8080. (InviteGroupRequestPacket)Pack;
  8081. #region Packet Session and User Check
  8082. if (m_checkPackets)
  8083. {
  8084. if (inviteGroupRequest.AgentData.SessionID != SessionId ||
  8085. inviteGroupRequest.AgentData.AgentID != AgentId)
  8086. break;
  8087. }
  8088. #endregion
  8089. if (m_GroupsModule != null)
  8090. {
  8091. foreach (InviteGroupRequestPacket.InviteDataBlock b in
  8092. inviteGroupRequest.InviteData)
  8093. {
  8094. m_GroupsModule.InviteGroupRequest(this,
  8095. inviteGroupRequest.GroupData.GroupID,
  8096. b.InviteeID,
  8097. b.RoleID);
  8098. }
  8099. }
  8100. break;
  8101. #endregion
  8102. case PacketType.StartLure:
  8103. StartLurePacket startLureRequest = (StartLurePacket)Pack;
  8104. #region Packet Session and User Check
  8105. if (m_checkPackets)
  8106. {
  8107. if (startLureRequest.AgentData.SessionID != SessionId ||
  8108. startLureRequest.AgentData.AgentID != AgentId)
  8109. break;
  8110. }
  8111. #endregion
  8112. handlerStartLure = OnStartLure;
  8113. if (handlerStartLure != null)
  8114. handlerStartLure(startLureRequest.Info.LureType,
  8115. Utils.BytesToString(
  8116. startLureRequest.Info.Message),
  8117. startLureRequest.TargetData[0].TargetID,
  8118. this);
  8119. break;
  8120. case PacketType.TeleportLureRequest:
  8121. TeleportLureRequestPacket teleportLureRequest =
  8122. (TeleportLureRequestPacket)Pack;
  8123. #region Packet Session and User Check
  8124. if (m_checkPackets)
  8125. {
  8126. if (teleportLureRequest.Info.SessionID != SessionId ||
  8127. teleportLureRequest.Info.AgentID != AgentId)
  8128. break;
  8129. }
  8130. #endregion
  8131. handlerTeleportLureRequest = OnTeleportLureRequest;
  8132. if (handlerTeleportLureRequest != null)
  8133. handlerTeleportLureRequest(
  8134. teleportLureRequest.Info.LureID,
  8135. teleportLureRequest.Info.TeleportFlags,
  8136. this);
  8137. break;
  8138. case PacketType.ClassifiedInfoRequest:
  8139. ClassifiedInfoRequestPacket classifiedInfoRequest =
  8140. (ClassifiedInfoRequestPacket)Pack;
  8141. #region Packet Session and User Check
  8142. if (m_checkPackets)
  8143. {
  8144. if (classifiedInfoRequest.AgentData.SessionID != SessionId ||
  8145. classifiedInfoRequest.AgentData.AgentID != AgentId)
  8146. break;
  8147. }
  8148. #endregion
  8149. handlerClassifiedInfoRequest = OnClassifiedInfoRequest;
  8150. if (handlerClassifiedInfoRequest != null)
  8151. handlerClassifiedInfoRequest(
  8152. classifiedInfoRequest.Data.ClassifiedID,
  8153. this);
  8154. break;
  8155. case PacketType.ClassifiedInfoUpdate:
  8156. ClassifiedInfoUpdatePacket classifiedInfoUpdate =
  8157. (ClassifiedInfoUpdatePacket)Pack;
  8158. #region Packet Session and User Check
  8159. if (m_checkPackets)
  8160. {
  8161. if (classifiedInfoUpdate.AgentData.SessionID != SessionId ||
  8162. classifiedInfoUpdate.AgentData.AgentID != AgentId)
  8163. break;
  8164. }
  8165. #endregion
  8166. handlerClassifiedInfoUpdate = OnClassifiedInfoUpdate;
  8167. if (handlerClassifiedInfoUpdate != null)
  8168. handlerClassifiedInfoUpdate(
  8169. classifiedInfoUpdate.Data.ClassifiedID,
  8170. classifiedInfoUpdate.Data.Category,
  8171. Utils.BytesToString(
  8172. classifiedInfoUpdate.Data.Name),
  8173. Utils.BytesToString(
  8174. classifiedInfoUpdate.Data.Desc),
  8175. classifiedInfoUpdate.Data.ParcelID,
  8176. classifiedInfoUpdate.Data.ParentEstate,
  8177. classifiedInfoUpdate.Data.SnapshotID,
  8178. new Vector3(
  8179. classifiedInfoUpdate.Data.PosGlobal),
  8180. classifiedInfoUpdate.Data.ClassifiedFlags,
  8181. classifiedInfoUpdate.Data.PriceForListing,
  8182. this);
  8183. break;
  8184. case PacketType.ClassifiedDelete:
  8185. ClassifiedDeletePacket classifiedDelete =
  8186. (ClassifiedDeletePacket)Pack;
  8187. #region Packet Session and User Check
  8188. if (m_checkPackets)
  8189. {
  8190. if (classifiedDelete.AgentData.SessionID != SessionId ||
  8191. classifiedDelete.AgentData.AgentID != AgentId)
  8192. break;
  8193. }
  8194. #endregion
  8195. handlerClassifiedDelete = OnClassifiedDelete;
  8196. if (handlerClassifiedDelete != null)
  8197. handlerClassifiedDelete(
  8198. classifiedDelete.Data.ClassifiedID,
  8199. this);
  8200. break;
  8201. case PacketType.ClassifiedGodDelete:
  8202. ClassifiedGodDeletePacket classifiedGodDelete =
  8203. (ClassifiedGodDeletePacket)Pack;
  8204. #region Packet Session and User Check
  8205. if (m_checkPackets)
  8206. {
  8207. if (classifiedGodDelete.AgentData.SessionID != SessionId ||
  8208. classifiedGodDelete.AgentData.AgentID != AgentId)
  8209. break;
  8210. }
  8211. #endregion
  8212. handlerClassifiedGodDelete = OnClassifiedGodDelete;
  8213. if (handlerClassifiedGodDelete != null)
  8214. handlerClassifiedGodDelete(
  8215. classifiedGodDelete.Data.ClassifiedID,
  8216. this);
  8217. break;
  8218. case PacketType.EventGodDelete:
  8219. EventGodDeletePacket eventGodDelete =
  8220. (EventGodDeletePacket)Pack;
  8221. #region Packet Session and User Check
  8222. if (m_checkPackets)
  8223. {
  8224. if (eventGodDelete.AgentData.SessionID != SessionId ||
  8225. eventGodDelete.AgentData.AgentID != AgentId)
  8226. break;
  8227. }
  8228. #endregion
  8229. handlerEventGodDelete = OnEventGodDelete;
  8230. if (handlerEventGodDelete != null)
  8231. handlerEventGodDelete(
  8232. eventGodDelete.EventData.EventID,
  8233. eventGodDelete.QueryData.QueryID,
  8234. Utils.BytesToString(
  8235. eventGodDelete.QueryData.QueryText),
  8236. eventGodDelete.QueryData.QueryFlags,
  8237. eventGodDelete.QueryData.QueryStart,
  8238. this);
  8239. break;
  8240. case PacketType.EventNotificationAddRequest:
  8241. EventNotificationAddRequestPacket eventNotificationAdd =
  8242. (EventNotificationAddRequestPacket)Pack;
  8243. #region Packet Session and User Check
  8244. if (m_checkPackets)
  8245. {
  8246. if (eventNotificationAdd.AgentData.SessionID != SessionId ||
  8247. eventNotificationAdd.AgentData.AgentID != AgentId)
  8248. break;
  8249. }
  8250. #endregion
  8251. handlerEventNotificationAddRequest = OnEventNotificationAddRequest;
  8252. if (handlerEventNotificationAddRequest != null)
  8253. handlerEventNotificationAddRequest(
  8254. eventNotificationAdd.EventData.EventID, this);
  8255. break;
  8256. case PacketType.EventNotificationRemoveRequest:
  8257. EventNotificationRemoveRequestPacket eventNotificationRemove =
  8258. (EventNotificationRemoveRequestPacket)Pack;
  8259. #region Packet Session and User Check
  8260. if (m_checkPackets)
  8261. {
  8262. if (eventNotificationRemove.AgentData.SessionID != SessionId ||
  8263. eventNotificationRemove.AgentData.AgentID != AgentId)
  8264. break;
  8265. }
  8266. #endregion
  8267. handlerEventNotificationRemoveRequest = OnEventNotificationRemoveRequest;
  8268. if (handlerEventNotificationRemoveRequest != null)
  8269. handlerEventNotificationRemoveRequest(
  8270. eventNotificationRemove.EventData.EventID, this);
  8271. break;
  8272. case PacketType.RetrieveInstantMessages:
  8273. RetrieveInstantMessagesPacket rimpInstantMessagePack = (RetrieveInstantMessagesPacket)Pack;
  8274. #region Packet Session and User Check
  8275. if (m_checkPackets)
  8276. {
  8277. if (rimpInstantMessagePack.AgentData.SessionID != SessionId ||
  8278. rimpInstantMessagePack.AgentData.AgentID != AgentId)
  8279. break;
  8280. }
  8281. #endregion
  8282. handlerRetrieveInstantMessages = OnRetrieveInstantMessages;
  8283. if (handlerRetrieveInstantMessages != null)
  8284. handlerRetrieveInstantMessages(this);
  8285. break;
  8286. case PacketType.PickDelete:
  8287. PickDeletePacket pickDelete =
  8288. (PickDeletePacket)Pack;
  8289. #region Packet Session and User Check
  8290. if (m_checkPackets)
  8291. {
  8292. if (pickDelete.AgentData.SessionID != SessionId ||
  8293. pickDelete.AgentData.AgentID != AgentId)
  8294. break;
  8295. }
  8296. #endregion
  8297. handlerPickDelete = OnPickDelete;
  8298. if (handlerPickDelete != null)
  8299. handlerPickDelete(this, pickDelete.Data.PickID);
  8300. break;
  8301. case PacketType.PickGodDelete:
  8302. PickGodDeletePacket pickGodDelete =
  8303. (PickGodDeletePacket)Pack;
  8304. #region Packet Session and User Check
  8305. if (m_checkPackets)
  8306. {
  8307. if (pickGodDelete.AgentData.SessionID != SessionId ||
  8308. pickGodDelete.AgentData.AgentID != AgentId)
  8309. break;
  8310. }
  8311. #endregion
  8312. handlerPickGodDelete = OnPickGodDelete;
  8313. if (handlerPickGodDelete != null)
  8314. handlerPickGodDelete(this,
  8315. pickGodDelete.AgentData.AgentID,
  8316. pickGodDelete.Data.PickID,
  8317. pickGodDelete.Data.QueryID);
  8318. break;
  8319. case PacketType.PickInfoUpdate:
  8320. PickInfoUpdatePacket pickInfoUpdate =
  8321. (PickInfoUpdatePacket)Pack;
  8322. #region Packet Session and User Check
  8323. if (m_checkPackets)
  8324. {
  8325. if (pickInfoUpdate.AgentData.SessionID != SessionId ||
  8326. pickInfoUpdate.AgentData.AgentID != AgentId)
  8327. break;
  8328. }
  8329. #endregion
  8330. handlerPickInfoUpdate = OnPickInfoUpdate;
  8331. if (handlerPickInfoUpdate != null)
  8332. handlerPickInfoUpdate(this,
  8333. pickInfoUpdate.Data.PickID,
  8334. pickInfoUpdate.Data.CreatorID,
  8335. pickInfoUpdate.Data.TopPick,
  8336. Utils.BytesToString(pickInfoUpdate.Data.Name),
  8337. Utils.BytesToString(pickInfoUpdate.Data.Desc),
  8338. pickInfoUpdate.Data.SnapshotID,
  8339. pickInfoUpdate.Data.SortOrder,
  8340. pickInfoUpdate.Data.Enabled);
  8341. break;
  8342. case PacketType.AvatarNotesUpdate:
  8343. AvatarNotesUpdatePacket avatarNotesUpdate =
  8344. (AvatarNotesUpdatePacket)Pack;
  8345. #region Packet Session and User Check
  8346. if (m_checkPackets)
  8347. {
  8348. if (avatarNotesUpdate.AgentData.SessionID != SessionId ||
  8349. avatarNotesUpdate.AgentData.AgentID != AgentId)
  8350. break;
  8351. }
  8352. #endregion
  8353. handlerAvatarNotesUpdate = OnAvatarNotesUpdate;
  8354. if (handlerAvatarNotesUpdate != null)
  8355. handlerAvatarNotesUpdate(this,
  8356. avatarNotesUpdate.Data.TargetID,
  8357. Utils.BytesToString(avatarNotesUpdate.Data.Notes));
  8358. break;
  8359. // case PacketType.AvatarInterestsUpdate:
  8360. // AvatarInterestsUpdatePacket avatarInterestUpdate =
  8361. // (AvatarInterestsUpdatePacket)Pack;
  8362. //
  8363. // break;
  8364. case PacketType.PlacesQuery:
  8365. PlacesQueryPacket placesQueryPacket =
  8366. (PlacesQueryPacket)Pack;
  8367. handlerPlacesQuery = OnPlacesQuery;
  8368. if (handlerPlacesQuery != null)
  8369. handlerPlacesQuery(placesQueryPacket.AgentData.QueryID,
  8370. placesQueryPacket.TransactionData.TransactionID,
  8371. Utils.BytesToString(
  8372. placesQueryPacket.QueryData.QueryText),
  8373. placesQueryPacket.QueryData.QueryFlags,
  8374. (byte)placesQueryPacket.QueryData.Category,
  8375. Utils.BytesToString(
  8376. placesQueryPacket.QueryData.SimName),
  8377. this);
  8378. break;
  8379. default:
  8380. m_log.Warn("[CLIENT]: unhandled packet " + Pack);
  8381. break;
  8382. #endregion
  8383. }
  8384. PacketPool.Instance.ReturnPacket(Pack);
  8385. }
  8386. private static PrimitiveBaseShape GetShapeFromAddPacket(ObjectAddPacket addPacket)
  8387. {
  8388. PrimitiveBaseShape shape = new PrimitiveBaseShape();
  8389. shape.PCode = addPacket.ObjectData.PCode;
  8390. shape.State = addPacket.ObjectData.State;
  8391. shape.PathBegin = addPacket.ObjectData.PathBegin;
  8392. shape.PathEnd = addPacket.ObjectData.PathEnd;
  8393. shape.PathScaleX = addPacket.ObjectData.PathScaleX;
  8394. shape.PathScaleY = addPacket.ObjectData.PathScaleY;
  8395. shape.PathShearX = addPacket.ObjectData.PathShearX;
  8396. shape.PathShearY = addPacket.ObjectData.PathShearY;
  8397. shape.PathSkew = addPacket.ObjectData.PathSkew;
  8398. shape.ProfileBegin = addPacket.ObjectData.ProfileBegin;
  8399. shape.ProfileEnd = addPacket.ObjectData.ProfileEnd;
  8400. shape.Scale = addPacket.ObjectData.Scale;
  8401. shape.PathCurve = addPacket.ObjectData.PathCurve;
  8402. shape.ProfileCurve = addPacket.ObjectData.ProfileCurve;
  8403. shape.ProfileHollow = addPacket.ObjectData.ProfileHollow;
  8404. shape.PathRadiusOffset = addPacket.ObjectData.PathRadiusOffset;
  8405. shape.PathRevolutions = addPacket.ObjectData.PathRevolutions;
  8406. shape.PathTaperX = addPacket.ObjectData.PathTaperX;
  8407. shape.PathTaperY = addPacket.ObjectData.PathTaperY;
  8408. shape.PathTwist = addPacket.ObjectData.PathTwist;
  8409. shape.PathTwistBegin = addPacket.ObjectData.PathTwistBegin;
  8410. Primitive.TextureEntry ntex = new Primitive.TextureEntry(new UUID("89556747-24cb-43ed-920b-47caed15465f"));
  8411. shape.TextureEntry = ntex.GetBytes();
  8412. //shape.Textures = ntex;
  8413. return shape;
  8414. }
  8415. /// <summary>
  8416. /// Send the client an Estate message blue box pop-down with a single OK button
  8417. /// </summary>
  8418. /// <param name="FromAvatarID"></param>
  8419. /// <param name="fromSessionID"></param>
  8420. /// <param name="FromAvatarName"></param>
  8421. /// <param name="Message"></param>
  8422. public void SendBlueBoxMessage(UUID FromAvatarID, String FromAvatarName, String Message)
  8423. {
  8424. if (!ChildAgentStatus())
  8425. SendInstantMessage(new GridInstantMessage(null, FromAvatarID, FromAvatarName, AgentId, 1, Message, false, new Vector3()));
  8426. //SendInstantMessage(FromAvatarID, fromSessionID, Message, AgentId, SessionId, FromAvatarName, (byte)21,(uint) Util.UnixTimeSinceEpoch());
  8427. }
  8428. public void SendLogoutPacket()
  8429. {
  8430. // I know this is a bit of a hack, however there are times when you don't
  8431. // want to send this, but still need to do the rest of the shutdown process
  8432. // this method gets called from the packet server.. which makes it practically
  8433. // impossible to do any other way.
  8434. if (m_SendLogoutPacketWhenClosing)
  8435. {
  8436. LogoutReplyPacket logReply = (LogoutReplyPacket)PacketPool.Instance.GetPacket(PacketType.LogoutReply);
  8437. // TODO: don't create new blocks if recycling an old packet
  8438. logReply.AgentData.AgentID = AgentId;
  8439. logReply.AgentData.SessionID = SessionId;
  8440. logReply.InventoryData = new LogoutReplyPacket.InventoryDataBlock[1];
  8441. logReply.InventoryData[0] = new LogoutReplyPacket.InventoryDataBlock();
  8442. logReply.InventoryData[0].ItemID = UUID.Zero;
  8443. OutPacket(logReply, ThrottleOutPacketType.Task);
  8444. }
  8445. }
  8446. public void SendHealth(float health)
  8447. {
  8448. HealthMessagePacket healthpacket = (HealthMessagePacket)PacketPool.Instance.GetPacket(PacketType.HealthMessage);
  8449. healthpacket.HealthData.Health = health;
  8450. OutPacket(healthpacket, ThrottleOutPacketType.Task);
  8451. }
  8452. public void SendAgentOnline(UUID[] agentIDs)
  8453. {
  8454. OnlineNotificationPacket onp = new OnlineNotificationPacket();
  8455. OnlineNotificationPacket.AgentBlockBlock[] onpb = new OnlineNotificationPacket.AgentBlockBlock[agentIDs.Length];
  8456. for (int i = 0; i < agentIDs.Length; i++)
  8457. {
  8458. OnlineNotificationPacket.AgentBlockBlock onpbl = new OnlineNotificationPacket.AgentBlockBlock();
  8459. onpbl.AgentID = agentIDs[i];
  8460. onpb[i] = onpbl;
  8461. }
  8462. onp.AgentBlock = onpb;
  8463. onp.Header.Reliable = true;
  8464. OutPacket(onp, ThrottleOutPacketType.Task);
  8465. }
  8466. public void SendAgentOffline(UUID[] agentIDs)
  8467. {
  8468. OfflineNotificationPacket offp = new OfflineNotificationPacket();
  8469. OfflineNotificationPacket.AgentBlockBlock[] offpb = new OfflineNotificationPacket.AgentBlockBlock[agentIDs.Length];
  8470. for (int i = 0; i < agentIDs.Length; i++)
  8471. {
  8472. OfflineNotificationPacket.AgentBlockBlock onpbl = new OfflineNotificationPacket.AgentBlockBlock();
  8473. onpbl.AgentID = agentIDs[i];
  8474. offpb[i] = onpbl;
  8475. }
  8476. offp.AgentBlock = offpb;
  8477. offp.Header.Reliable = true;
  8478. OutPacket(offp, ThrottleOutPacketType.Task);
  8479. }
  8480. public void SendSitResponse(UUID TargetID, Vector3 OffsetPos, Quaternion SitOrientation, bool autopilot,
  8481. Vector3 CameraAtOffset, Vector3 CameraEyeOffset, bool ForceMouseLook)
  8482. {
  8483. AvatarSitResponsePacket avatarSitResponse = new AvatarSitResponsePacket();
  8484. avatarSitResponse.SitObject.ID = TargetID;
  8485. if (CameraAtOffset != Vector3.Zero)
  8486. {
  8487. avatarSitResponse.SitTransform.CameraAtOffset = CameraAtOffset;
  8488. avatarSitResponse.SitTransform.CameraEyeOffset = CameraEyeOffset;
  8489. }
  8490. avatarSitResponse.SitTransform.ForceMouselook = ForceMouseLook;
  8491. avatarSitResponse.SitTransform.AutoPilot = autopilot;
  8492. avatarSitResponse.SitTransform.SitPosition = OffsetPos;
  8493. avatarSitResponse.SitTransform.SitRotation = SitOrientation;
  8494. OutPacket(avatarSitResponse, ThrottleOutPacketType.Task);
  8495. }
  8496. public void SendAdminResponse(UUID Token, uint AdminLevel)
  8497. {
  8498. GrantGodlikePowersPacket respondPacket = new GrantGodlikePowersPacket();
  8499. GrantGodlikePowersPacket.GrantDataBlock gdb = new GrantGodlikePowersPacket.GrantDataBlock();
  8500. GrantGodlikePowersPacket.AgentDataBlock adb = new GrantGodlikePowersPacket.AgentDataBlock();
  8501. adb.AgentID = AgentId;
  8502. adb.SessionID = SessionId; // More security
  8503. gdb.GodLevel = (byte)AdminLevel;
  8504. gdb.Token = Token;
  8505. //respondPacket.AgentData = (GrantGodlikePowersPacket.AgentDataBlock)ablock;
  8506. respondPacket.GrantData = gdb;
  8507. respondPacket.AgentData = adb;
  8508. OutPacket(respondPacket, ThrottleOutPacketType.Task);
  8509. }
  8510. public void SendGroupMembership(GroupMembershipData[] GroupMembership)
  8511. {
  8512. m_groupPowers.Clear();
  8513. AgentGroupDataUpdatePacket Groupupdate = new AgentGroupDataUpdatePacket();
  8514. AgentGroupDataUpdatePacket.GroupDataBlock[] Groups = new AgentGroupDataUpdatePacket.GroupDataBlock[GroupMembership.Length];
  8515. for (int i = 0; i < GroupMembership.Length; i++)
  8516. {
  8517. m_groupPowers[GroupMembership[i].GroupID] = GroupMembership[i].GroupPowers;
  8518. AgentGroupDataUpdatePacket.GroupDataBlock Group = new AgentGroupDataUpdatePacket.GroupDataBlock();
  8519. Group.AcceptNotices = GroupMembership[i].AcceptNotices;
  8520. Group.Contribution = GroupMembership[i].Contribution;
  8521. Group.GroupID = GroupMembership[i].GroupID;
  8522. Group.GroupInsigniaID = GroupMembership[i].GroupPicture;
  8523. Group.GroupName = Utils.StringToBytes(GroupMembership[i].GroupName);
  8524. Group.GroupPowers = GroupMembership[i].GroupPowers;
  8525. Groups[i] = Group;
  8526. }
  8527. Groupupdate.GroupData = Groups;
  8528. Groupupdate.AgentData = new AgentGroupDataUpdatePacket.AgentDataBlock();
  8529. Groupupdate.AgentData.AgentID = AgentId;
  8530. OutPacket(Groupupdate, ThrottleOutPacketType.Task);
  8531. try
  8532. {
  8533. IEventQueue eq = Scene.RequestModuleInterface<IEventQueue>();
  8534. if (eq != null)
  8535. {
  8536. eq.GroupMembership(Groupupdate, this.AgentId);
  8537. }
  8538. }
  8539. catch (Exception ex)
  8540. {
  8541. m_log.Error("Unable to send group membership data via eventqueue - exception: " + ex.ToString());
  8542. m_log.Warn("sending group membership data via UDP");
  8543. OutPacket(Groupupdate, ThrottleOutPacketType.Task);
  8544. }
  8545. }
  8546. public void SendGroupNameReply(UUID groupLLUID, string GroupName)
  8547. {
  8548. UUIDGroupNameReplyPacket pack = new UUIDGroupNameReplyPacket();
  8549. UUIDGroupNameReplyPacket.UUIDNameBlockBlock[] uidnameblock = new UUIDGroupNameReplyPacket.UUIDNameBlockBlock[1];
  8550. UUIDGroupNameReplyPacket.UUIDNameBlockBlock uidnamebloc = new UUIDGroupNameReplyPacket.UUIDNameBlockBlock();
  8551. uidnamebloc.ID = groupLLUID;
  8552. uidnamebloc.GroupName = Utils.StringToBytes(GroupName);
  8553. uidnameblock[0] = uidnamebloc;
  8554. pack.UUIDNameBlock = uidnameblock;
  8555. OutPacket(pack, ThrottleOutPacketType.Task);
  8556. }
  8557. public void SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia)
  8558. {
  8559. LandStatReplyPacket lsrp = new LandStatReplyPacket();
  8560. // LandStatReplyPacket.RequestDataBlock lsreqdpb = new LandStatReplyPacket.RequestDataBlock();
  8561. LandStatReplyPacket.ReportDataBlock[] lsrepdba = new LandStatReplyPacket.ReportDataBlock[lsrpia.Length];
  8562. //LandStatReplyPacket.ReportDataBlock lsrepdb = new LandStatReplyPacket.ReportDataBlock();
  8563. // lsrepdb.
  8564. lsrp.RequestData.ReportType = reportType;
  8565. lsrp.RequestData.RequestFlags = requestFlags;
  8566. lsrp.RequestData.TotalObjectCount = resultCount;
  8567. for (int i = 0; i < lsrpia.Length; i++)
  8568. {
  8569. LandStatReplyPacket.ReportDataBlock lsrepdb = new LandStatReplyPacket.ReportDataBlock();
  8570. lsrepdb.LocationX = lsrpia[i].LocationX;
  8571. lsrepdb.LocationY = lsrpia[i].LocationY;
  8572. lsrepdb.LocationZ = lsrpia[i].LocationZ;
  8573. lsrepdb.Score = lsrpia[i].Score;
  8574. lsrepdb.TaskID = lsrpia[i].TaskID;
  8575. lsrepdb.TaskLocalID = lsrpia[i].TaskLocalID;
  8576. lsrepdb.TaskName = Utils.StringToBytes(lsrpia[i].TaskName);
  8577. lsrepdb.OwnerName = Utils.StringToBytes(lsrpia[i].OwnerName);
  8578. lsrepdba[i] = lsrepdb;
  8579. }
  8580. lsrp.ReportData = lsrepdba;
  8581. OutPacket(lsrp, ThrottleOutPacketType.Task);
  8582. }
  8583. public void SendScriptRunningReply(UUID objectID, UUID itemID, bool running)
  8584. {
  8585. ScriptRunningReplyPacket scriptRunningReply = new ScriptRunningReplyPacket();
  8586. scriptRunningReply.Script.ObjectID = objectID;
  8587. scriptRunningReply.Script.ItemID = itemID;
  8588. scriptRunningReply.Script.Running = running;
  8589. OutPacket(scriptRunningReply, ThrottleOutPacketType.Task);
  8590. }
  8591. public void SendAsset(AssetRequestToClient req)
  8592. {
  8593. //m_log.Debug("sending asset " + req.RequestAssetID);
  8594. TransferInfoPacket Transfer = new TransferInfoPacket();
  8595. Transfer.TransferInfo.ChannelType = 2;
  8596. Transfer.TransferInfo.Status = 0;
  8597. Transfer.TransferInfo.TargetType = 0;
  8598. if (req.AssetRequestSource == 2)
  8599. {
  8600. Transfer.TransferInfo.Params = new byte[20];
  8601. Array.Copy(req.RequestAssetID.GetBytes(), 0, Transfer.TransferInfo.Params, 0, 16);
  8602. int assType = req.AssetInf.Type;
  8603. Array.Copy(Utils.IntToBytes(assType), 0, Transfer.TransferInfo.Params, 16, 4);
  8604. }
  8605. else if (req.AssetRequestSource == 3)
  8606. {
  8607. Transfer.TransferInfo.Params = req.Params;
  8608. // Transfer.TransferInfo.Params = new byte[100];
  8609. //Array.Copy(req.RequestUser.AgentId.GetBytes(), 0, Transfer.TransferInfo.Params, 0, 16);
  8610. //Array.Copy(req.RequestUser.SessionId.GetBytes(), 0, Transfer.TransferInfo.Params, 16, 16);
  8611. }
  8612. Transfer.TransferInfo.Size = req.AssetInf.Data.Length;
  8613. Transfer.TransferInfo.TransferID = req.TransferRequestID;
  8614. Transfer.Header.Zerocoded = true;
  8615. OutPacket(Transfer, ThrottleOutPacketType.Asset);
  8616. if (req.NumPackets == 1)
  8617. {
  8618. TransferPacketPacket TransferPacket = new TransferPacketPacket();
  8619. TransferPacket.TransferData.Packet = 0;
  8620. TransferPacket.TransferData.ChannelType = 2;
  8621. TransferPacket.TransferData.TransferID = req.TransferRequestID;
  8622. TransferPacket.TransferData.Data = req.AssetInf.Data;
  8623. TransferPacket.TransferData.Status = 1;
  8624. TransferPacket.Header.Zerocoded = true;
  8625. OutPacket(TransferPacket, ThrottleOutPacketType.Asset);
  8626. }
  8627. else
  8628. {
  8629. int processedLength = 0;
  8630. int maxChunkSize = Settings.MAX_PACKET_SIZE - 100;
  8631. int packetNumber = 0;
  8632. while (processedLength < req.AssetInf.Data.Length)
  8633. {
  8634. TransferPacketPacket TransferPacket = new TransferPacketPacket();
  8635. TransferPacket.TransferData.Packet = packetNumber;
  8636. TransferPacket.TransferData.ChannelType = 2;
  8637. TransferPacket.TransferData.TransferID = req.TransferRequestID;
  8638. int chunkSize = Math.Min(req.AssetInf.Data.Length - processedLength, maxChunkSize);
  8639. byte[] chunk = new byte[chunkSize];
  8640. Array.Copy(req.AssetInf.Data, processedLength, chunk, 0, chunk.Length);
  8641. TransferPacket.TransferData.Data = chunk;
  8642. // 0 indicates more packets to come, 1 indicates last packet
  8643. if (req.AssetInf.Data.Length - processedLength > maxChunkSize)
  8644. {
  8645. TransferPacket.TransferData.Status = 0;
  8646. }
  8647. else
  8648. {
  8649. TransferPacket.TransferData.Status = 1;
  8650. }
  8651. TransferPacket.Header.Zerocoded = true;
  8652. OutPacket(TransferPacket, ThrottleOutPacketType.Asset);
  8653. processedLength += chunkSize;
  8654. packetNumber++;
  8655. }
  8656. }
  8657. }
  8658. public void SendTexture(AssetBase TextureAsset)
  8659. {
  8660. }
  8661. public ClientInfo GetClientInfo()
  8662. {
  8663. ClientInfo info = m_PacketHandler.GetClientInfo();
  8664. info.userEP = m_userEndPoint;
  8665. info.proxyEP = m_proxyEndPoint;
  8666. info.agentcircuit = new sAgentCircuitData(RequestClientInfo());
  8667. return info;
  8668. }
  8669. public EndPoint GetClientEP()
  8670. {
  8671. return m_userEndPoint;
  8672. }
  8673. public void SetClientInfo(ClientInfo info)
  8674. {
  8675. m_PacketHandler.SetClientInfo(info);
  8676. }
  8677. #region Media Parcel Members
  8678. public void SendParcelMediaCommand(uint flags, ParcelMediaCommandEnum command, float time)
  8679. {
  8680. ParcelMediaCommandMessagePacket commandMessagePacket = new ParcelMediaCommandMessagePacket();
  8681. commandMessagePacket.CommandBlock.Flags = flags;
  8682. commandMessagePacket.CommandBlock.Command =(uint) command;
  8683. commandMessagePacket.CommandBlock.Time = time;
  8684. OutPacket(commandMessagePacket, ThrottleOutPacketType.Unknown);
  8685. }
  8686. public void SendParcelMediaUpdate(string mediaUrl, UUID mediaTextureID,
  8687. byte autoScale, string mediaType, string mediaDesc, int mediaWidth, int mediaHeight,
  8688. byte mediaLoop)
  8689. {
  8690. ParcelMediaUpdatePacket updatePacket = new ParcelMediaUpdatePacket();
  8691. updatePacket.DataBlock.MediaURL = Utils.StringToBytes(mediaUrl);
  8692. updatePacket.DataBlock.MediaID = mediaTextureID;
  8693. updatePacket.DataBlock.MediaAutoScale = autoScale;
  8694. updatePacket.DataBlockExtended.MediaType = Utils.StringToBytes(mediaType);
  8695. updatePacket.DataBlockExtended.MediaDesc = Utils.StringToBytes(mediaDesc);
  8696. updatePacket.DataBlockExtended.MediaWidth = mediaWidth;
  8697. updatePacket.DataBlockExtended.MediaHeight = mediaHeight;
  8698. updatePacket.DataBlockExtended.MediaLoop = mediaLoop;
  8699. OutPacket(updatePacket, ThrottleOutPacketType.Unknown);
  8700. }
  8701. #endregion
  8702. #region Camera
  8703. public void SendSetFollowCamProperties (UUID objectID, SortedDictionary<int, float> parameters)
  8704. {
  8705. SetFollowCamPropertiesPacket packet = (SetFollowCamPropertiesPacket)PacketPool.Instance.GetPacket(PacketType.SetFollowCamProperties);
  8706. packet.ObjectData.ObjectID = objectID;
  8707. SetFollowCamPropertiesPacket.CameraPropertyBlock[] camPropBlock = new SetFollowCamPropertiesPacket.CameraPropertyBlock[parameters.Count];
  8708. uint idx = 0;
  8709. foreach (KeyValuePair<int, float> pair in parameters)
  8710. {
  8711. SetFollowCamPropertiesPacket.CameraPropertyBlock block = new SetFollowCamPropertiesPacket.CameraPropertyBlock();
  8712. block.Type = pair.Key;
  8713. block.Value = pair.Value;
  8714. camPropBlock[idx++] = block;
  8715. }
  8716. packet.CameraProperty = camPropBlock;
  8717. OutPacket(packet, ThrottleOutPacketType.Task);
  8718. }
  8719. public void SendClearFollowCamProperties (UUID objectID)
  8720. {
  8721. ClearFollowCamPropertiesPacket packet = (ClearFollowCamPropertiesPacket)PacketPool.Instance.GetPacket(PacketType.ClearFollowCamProperties);
  8722. packet.ObjectData.ObjectID = objectID;
  8723. OutPacket(packet, ThrottleOutPacketType.Task);
  8724. }
  8725. #endregion
  8726. public void SendRegionHandle(UUID regionID, ulong handle) {
  8727. RegionIDAndHandleReplyPacket reply = (RegionIDAndHandleReplyPacket)PacketPool.Instance.GetPacket(PacketType.RegionIDAndHandleReply);
  8728. reply.ReplyBlock.RegionID = regionID;
  8729. reply.ReplyBlock.RegionHandle = handle;
  8730. OutPacket(reply, ThrottleOutPacketType.Land);
  8731. }
  8732. public void SendParcelInfo(RegionInfo info, LandData land, UUID parcelID, uint x, uint y)
  8733. {
  8734. ParcelInfoReplyPacket reply = (ParcelInfoReplyPacket)PacketPool.Instance.GetPacket(PacketType.ParcelInfoReply);
  8735. reply.AgentData.AgentID = m_agentId;
  8736. reply.Data.ParcelID = parcelID;
  8737. reply.Data.OwnerID = land.OwnerID;
  8738. reply.Data.Name = Utils.StringToBytes(land.Name);
  8739. reply.Data.Desc = Utils.StringToBytes(land.Description);
  8740. reply.Data.ActualArea = land.Area;
  8741. reply.Data.BillableArea = land.Area; // TODO: what is this?
  8742. // Bit 0: Mature, bit 7: on sale, other bits: no idea
  8743. reply.Data.Flags = (byte)(
  8744. ((land.Flags & (uint)ParcelFlags.MaturePublish) != 0 ? (1 << 0) : 0) +
  8745. ((land.Flags & (uint)ParcelFlags.ForSale) != 0 ? (1 << 7) : 0));
  8746. Vector3 pos = land.UserLocation;
  8747. if (pos.Equals(Vector3.Zero))
  8748. {
  8749. pos = (land.AABBMax + land.AABBMin) * 0.5f;
  8750. }
  8751. reply.Data.GlobalX = info.RegionLocX * Constants.RegionSize + x;
  8752. reply.Data.GlobalY = info.RegionLocY * Constants.RegionSize + y;
  8753. reply.Data.GlobalZ = pos.Z;
  8754. reply.Data.SimName = Utils.StringToBytes(info.RegionName);
  8755. reply.Data.SnapshotID = land.SnapshotID;
  8756. reply.Data.Dwell = land.Dwell;
  8757. reply.Data.SalePrice = land.SalePrice;
  8758. reply.Data.AuctionID = (int)land.AuctionID;
  8759. OutPacket(reply, ThrottleOutPacketType.Land);
  8760. }
  8761. public void SendScriptTeleportRequest(string objName, string simName, Vector3 pos, Vector3 lookAt)
  8762. {
  8763. ScriptTeleportRequestPacket packet = (ScriptTeleportRequestPacket)PacketPool.Instance.GetPacket(PacketType.ScriptTeleportRequest);
  8764. packet.Data.ObjectName = Utils.StringToBytes(objName);
  8765. packet.Data.SimName = Utils.StringToBytes(simName);
  8766. packet.Data.SimPosition = pos;
  8767. packet.Data.LookAt = lookAt;
  8768. OutPacket(packet, ThrottleOutPacketType.Task);
  8769. }
  8770. public void SetClientOption(string option, string value)
  8771. {
  8772. switch (option)
  8773. {
  8774. case "ReliableIsImportant":
  8775. bool val;
  8776. if (bool.TryParse(value, out val))
  8777. m_PacketHandler.ReliableIsImportant = val;
  8778. break;
  8779. default:
  8780. break;
  8781. }
  8782. }
  8783. public string GetClientOption(string option)
  8784. {
  8785. switch (option)
  8786. {
  8787. case "ReliableIsImportant":
  8788. return m_PacketHandler.ReliableIsImportant.ToString();
  8789. default:
  8790. break;
  8791. }
  8792. return string.Empty;
  8793. }
  8794. public void SendDirPlacesReply(UUID queryID, DirPlacesReplyData[] data)
  8795. {
  8796. DirPlacesReplyPacket packet = (DirPlacesReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirPlacesReply);
  8797. packet.AgentData = new DirPlacesReplyPacket.AgentDataBlock();
  8798. packet.QueryData = new DirPlacesReplyPacket.QueryDataBlock[1];
  8799. packet.QueryData[0] = new DirPlacesReplyPacket.QueryDataBlock();
  8800. packet.QueryReplies =
  8801. new DirPlacesReplyPacket.QueryRepliesBlock[data.Length];
  8802. packet.StatusData = new DirPlacesReplyPacket.StatusDataBlock[
  8803. data.Length];
  8804. packet.AgentData.AgentID = AgentId;
  8805. packet.QueryData[0].QueryID = queryID;
  8806. int i = 0;
  8807. foreach (DirPlacesReplyData d in data)
  8808. {
  8809. packet.QueryReplies[i] =
  8810. new DirPlacesReplyPacket.QueryRepliesBlock();
  8811. packet.StatusData[i] = new DirPlacesReplyPacket.StatusDataBlock();
  8812. packet.QueryReplies[i].ParcelID = d.parcelID;
  8813. packet.QueryReplies[i].Name = Utils.StringToBytes(d.name);
  8814. packet.QueryReplies[i].ForSale = d.forSale;
  8815. packet.QueryReplies[i].Auction = d.auction;
  8816. packet.QueryReplies[i].Dwell = d.dwell;
  8817. packet.StatusData[i].Status = d.Status;
  8818. i++;
  8819. }
  8820. OutPacket(packet, ThrottleOutPacketType.Task);
  8821. }
  8822. public void SendDirPeopleReply(UUID queryID, DirPeopleReplyData[] data)
  8823. {
  8824. DirPeopleReplyPacket packet = (DirPeopleReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirPeopleReply);
  8825. packet.AgentData = new DirPeopleReplyPacket.AgentDataBlock();
  8826. packet.AgentData.AgentID = AgentId;
  8827. packet.QueryData = new DirPeopleReplyPacket.QueryDataBlock();
  8828. packet.QueryData.QueryID = queryID;
  8829. packet.QueryReplies = new DirPeopleReplyPacket.QueryRepliesBlock[
  8830. data.Length];
  8831. int i = 0;
  8832. foreach (DirPeopleReplyData d in data)
  8833. {
  8834. packet.QueryReplies[i] = new DirPeopleReplyPacket.QueryRepliesBlock();
  8835. packet.QueryReplies[i].AgentID = d.agentID;
  8836. packet.QueryReplies[i].FirstName =
  8837. Utils.StringToBytes(d.firstName);
  8838. packet.QueryReplies[i].LastName =
  8839. Utils.StringToBytes(d.lastName);
  8840. packet.QueryReplies[i].Group =
  8841. Utils.StringToBytes(d.group);
  8842. packet.QueryReplies[i].Online = d.online;
  8843. packet.QueryReplies[i].Reputation = d.reputation;
  8844. i++;
  8845. }
  8846. OutPacket(packet, ThrottleOutPacketType.Task);
  8847. }
  8848. public void SendDirEventsReply(UUID queryID, DirEventsReplyData[] data)
  8849. {
  8850. DirEventsReplyPacket packet = (DirEventsReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirEventsReply);
  8851. packet.AgentData = new DirEventsReplyPacket.AgentDataBlock();
  8852. packet.AgentData.AgentID = AgentId;
  8853. packet.QueryData = new DirEventsReplyPacket.QueryDataBlock();
  8854. packet.QueryData.QueryID = queryID;
  8855. packet.QueryReplies = new DirEventsReplyPacket.QueryRepliesBlock[
  8856. data.Length];
  8857. packet.StatusData = new DirEventsReplyPacket.StatusDataBlock[
  8858. data.Length];
  8859. int i = 0;
  8860. foreach (DirEventsReplyData d in data)
  8861. {
  8862. packet.QueryReplies[i] = new DirEventsReplyPacket.QueryRepliesBlock();
  8863. packet.StatusData[i] = new DirEventsReplyPacket.StatusDataBlock();
  8864. packet.QueryReplies[i].OwnerID = d.ownerID;
  8865. packet.QueryReplies[i].Name =
  8866. Utils.StringToBytes(d.name);
  8867. packet.QueryReplies[i].EventID = d.eventID;
  8868. packet.QueryReplies[i].Date =
  8869. Utils.StringToBytes(d.date);
  8870. packet.QueryReplies[i].UnixTime = d.unixTime;
  8871. packet.QueryReplies[i].EventFlags = d.eventFlags;
  8872. packet.StatusData[i].Status = d.Status;
  8873. i++;
  8874. }
  8875. OutPacket(packet, ThrottleOutPacketType.Task);
  8876. }
  8877. public void SendDirGroupsReply(UUID queryID, DirGroupsReplyData[] data)
  8878. {
  8879. DirGroupsReplyPacket packet = (DirGroupsReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirGroupsReply);
  8880. packet.AgentData = new DirGroupsReplyPacket.AgentDataBlock();
  8881. packet.AgentData.AgentID = AgentId;
  8882. packet.QueryData = new DirGroupsReplyPacket.QueryDataBlock();
  8883. packet.QueryData.QueryID = queryID;
  8884. packet.QueryReplies = new DirGroupsReplyPacket.QueryRepliesBlock[
  8885. data.Length];
  8886. int i = 0;
  8887. foreach (DirGroupsReplyData d in data)
  8888. {
  8889. packet.QueryReplies[i] = new DirGroupsReplyPacket.QueryRepliesBlock();
  8890. packet.QueryReplies[i].GroupID = d.groupID;
  8891. packet.QueryReplies[i].GroupName =
  8892. Utils.StringToBytes(d.groupName);
  8893. packet.QueryReplies[i].Members = d.members;
  8894. packet.QueryReplies[i].SearchOrder = d.searchOrder;
  8895. i++;
  8896. }
  8897. OutPacket(packet, ThrottleOutPacketType.Task);
  8898. }
  8899. public void SendDirClassifiedReply(UUID queryID, DirClassifiedReplyData[] data)
  8900. {
  8901. DirClassifiedReplyPacket packet = (DirClassifiedReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirClassifiedReply);
  8902. packet.AgentData = new DirClassifiedReplyPacket.AgentDataBlock();
  8903. packet.AgentData.AgentID = AgentId;
  8904. packet.QueryData = new DirClassifiedReplyPacket.QueryDataBlock();
  8905. packet.QueryData.QueryID = queryID;
  8906. packet.QueryReplies = new DirClassifiedReplyPacket.QueryRepliesBlock[
  8907. data.Length];
  8908. packet.StatusData = new DirClassifiedReplyPacket.StatusDataBlock[
  8909. data.Length];
  8910. int i = 0;
  8911. foreach (DirClassifiedReplyData d in data)
  8912. {
  8913. packet.QueryReplies[i] = new DirClassifiedReplyPacket.QueryRepliesBlock();
  8914. packet.StatusData[i] = new DirClassifiedReplyPacket.StatusDataBlock();
  8915. packet.QueryReplies[i].ClassifiedID = d.classifiedID;
  8916. packet.QueryReplies[i].Name =
  8917. Utils.StringToBytes(d.name);
  8918. packet.QueryReplies[i].ClassifiedFlags = d.classifiedFlags;
  8919. packet.QueryReplies[i].CreationDate = d.creationDate;
  8920. packet.QueryReplies[i].ExpirationDate = d.expirationDate;
  8921. packet.QueryReplies[i].PriceForListing = d.price;
  8922. packet.StatusData[i].Status = d.Status;
  8923. i++;
  8924. }
  8925. OutPacket(packet, ThrottleOutPacketType.Task);
  8926. }
  8927. public void SendDirLandReply(UUID queryID, DirLandReplyData[] data)
  8928. {
  8929. DirLandReplyPacket packet = (DirLandReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirLandReply);
  8930. packet.AgentData = new DirLandReplyPacket.AgentDataBlock();
  8931. packet.AgentData.AgentID = AgentId;
  8932. packet.QueryData = new DirLandReplyPacket.QueryDataBlock();
  8933. packet.QueryData.QueryID = queryID;
  8934. packet.QueryReplies = new DirLandReplyPacket.QueryRepliesBlock[
  8935. data.Length];
  8936. int i = 0;
  8937. foreach (DirLandReplyData d in data)
  8938. {
  8939. packet.QueryReplies[i] = new DirLandReplyPacket.QueryRepliesBlock();
  8940. packet.QueryReplies[i].ParcelID = d.parcelID;
  8941. packet.QueryReplies[i].Name =
  8942. Utils.StringToBytes(d.name);
  8943. packet.QueryReplies[i].Auction = d.auction;
  8944. packet.QueryReplies[i].ForSale = d.forSale;
  8945. packet.QueryReplies[i].SalePrice = d.salePrice;
  8946. packet.QueryReplies[i].ActualArea = d.actualArea;
  8947. i++;
  8948. }
  8949. OutPacket(packet, ThrottleOutPacketType.Task);
  8950. }
  8951. public void SendDirPopularReply(UUID queryID, DirPopularReplyData[] data)
  8952. {
  8953. DirPopularReplyPacket packet = (DirPopularReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirPopularReply);
  8954. packet.AgentData = new DirPopularReplyPacket.AgentDataBlock();
  8955. packet.AgentData.AgentID = AgentId;
  8956. packet.QueryData = new DirPopularReplyPacket.QueryDataBlock();
  8957. packet.QueryData.QueryID = queryID;
  8958. packet.QueryReplies = new DirPopularReplyPacket.QueryRepliesBlock[
  8959. data.Length];
  8960. int i = 0;
  8961. foreach (DirPopularReplyData d in data)
  8962. {
  8963. packet.QueryReplies[i] = new DirPopularReplyPacket.QueryRepliesBlock();
  8964. packet.QueryReplies[i].ParcelID = d.parcelID;
  8965. packet.QueryReplies[i].Name =
  8966. Utils.StringToBytes(d.name);
  8967. packet.QueryReplies[i].Dwell = d.dwell;
  8968. i++;
  8969. }
  8970. OutPacket(packet, ThrottleOutPacketType.Task);
  8971. }
  8972. public void SendEventInfoReply(EventData data)
  8973. {
  8974. EventInfoReplyPacket packet = (EventInfoReplyPacket)PacketPool.Instance.GetPacket(PacketType.EventInfoReply);
  8975. packet.AgentData = new EventInfoReplyPacket.AgentDataBlock();
  8976. packet.AgentData.AgentID = AgentId;
  8977. packet.EventData = new EventInfoReplyPacket.EventDataBlock();
  8978. packet.EventData.EventID = data.eventID;
  8979. packet.EventData.Creator = Utils.StringToBytes(data.creator);
  8980. packet.EventData.Name = Utils.StringToBytes(data.name);
  8981. packet.EventData.Category = Utils.StringToBytes(data.category);
  8982. packet.EventData.Desc = Utils.StringToBytes(data.description);
  8983. packet.EventData.Date = Utils.StringToBytes(data.date);
  8984. packet.EventData.DateUTC = data.dateUTC;
  8985. packet.EventData.Duration = data.duration;
  8986. packet.EventData.Cover = data.cover;
  8987. packet.EventData.Amount = data.amount;
  8988. packet.EventData.SimName = Utils.StringToBytes(data.simName);
  8989. packet.EventData.GlobalPos = new Vector3d(data.globalPos);
  8990. packet.EventData.EventFlags = data.eventFlags;
  8991. OutPacket(packet, ThrottleOutPacketType.Task);
  8992. }
  8993. public void SendMapItemReply(mapItemReply[] replies, uint mapitemtype, uint flags)
  8994. {
  8995. MapItemReplyPacket mirplk = new MapItemReplyPacket();
  8996. mirplk.AgentData.AgentID = AgentId;
  8997. mirplk.RequestData.ItemType = mapitemtype;
  8998. mirplk.Data = new MapItemReplyPacket.DataBlock[replies.Length];
  8999. for (int i = 0; i < replies.Length; i++)
  9000. {
  9001. MapItemReplyPacket.DataBlock mrdata = new MapItemReplyPacket.DataBlock();
  9002. mrdata.X = replies[i].x;
  9003. mrdata.Y = replies[i].y;
  9004. mrdata.ID = replies[i].id;
  9005. mrdata.Extra = replies[i].Extra;
  9006. mrdata.Extra2 = replies[i].Extra2;
  9007. mrdata.Name = Utils.StringToBytes(replies[i].name);
  9008. mirplk.Data[i] = mrdata;
  9009. }
  9010. //m_log.Debug(mirplk.ToString());
  9011. OutPacket(mirplk, ThrottleOutPacketType.Task);
  9012. }
  9013. public void SendOfferCallingCard(UUID srcID, UUID transactionID)
  9014. {
  9015. // a bit special, as this uses AgentID to store the source instead
  9016. // of the destination. The destination (the receiver) goes into destID
  9017. OfferCallingCardPacket p = (OfferCallingCardPacket)PacketPool.Instance.GetPacket(PacketType.OfferCallingCard);
  9018. p.AgentData.AgentID = srcID;
  9019. p.AgentData.SessionID = UUID.Zero;
  9020. p.AgentBlock.DestID = AgentId;
  9021. p.AgentBlock.TransactionID = transactionID;
  9022. OutPacket(p, ThrottleOutPacketType.Task);
  9023. }
  9024. public void SendAcceptCallingCard(UUID transactionID)
  9025. {
  9026. AcceptCallingCardPacket p = (AcceptCallingCardPacket)PacketPool.Instance.GetPacket(PacketType.AcceptCallingCard);
  9027. p.AgentData.AgentID = AgentId;
  9028. p.AgentData.SessionID = UUID.Zero;
  9029. p.FolderData = new AcceptCallingCardPacket.FolderDataBlock[1];
  9030. p.FolderData[0] = new AcceptCallingCardPacket.FolderDataBlock();
  9031. p.FolderData[0].FolderID = UUID.Zero;
  9032. OutPacket(p, ThrottleOutPacketType.Task);
  9033. }
  9034. public void SendDeclineCallingCard(UUID transactionID)
  9035. {
  9036. DeclineCallingCardPacket p = (DeclineCallingCardPacket)PacketPool.Instance.GetPacket(PacketType.DeclineCallingCard);
  9037. p.AgentData.AgentID = AgentId;
  9038. p.AgentData.SessionID = UUID.Zero;
  9039. p.TransactionBlock.TransactionID = transactionID;
  9040. OutPacket(p, ThrottleOutPacketType.Task);
  9041. }
  9042. public void SendTerminateFriend(UUID exFriendID)
  9043. {
  9044. TerminateFriendshipPacket p = (TerminateFriendshipPacket)PacketPool.Instance.GetPacket(PacketType.TerminateFriendship);
  9045. p.AgentData.AgentID = AgentId;
  9046. p.AgentData.SessionID = SessionId;
  9047. p.ExBlock.OtherID = exFriendID;
  9048. OutPacket(p, ThrottleOutPacketType.Task);
  9049. }
  9050. public void SendAvatarGroupsReply(UUID avatarID, GroupMembershipData[] data)
  9051. {
  9052. AvatarGroupsReplyPacket p = (AvatarGroupsReplyPacket)PacketPool.Instance.GetPacket(PacketType.AvatarGroupsReply);
  9053. p.AgentData = new AvatarGroupsReplyPacket.AgentDataBlock();
  9054. p.AgentData.AgentID = AgentId;
  9055. p.AgentData.AvatarID = avatarID;
  9056. p.GroupData = new AvatarGroupsReplyPacket.GroupDataBlock[data.Length];
  9057. int i = 0;
  9058. foreach (GroupMembershipData m in data)
  9059. {
  9060. p.GroupData[i] = new AvatarGroupsReplyPacket.GroupDataBlock();
  9061. p.GroupData[i].GroupPowers = m.GroupPowers;
  9062. p.GroupData[i].AcceptNotices = m.AcceptNotices;
  9063. p.GroupData[i].GroupTitle = Utils.StringToBytes(m.GroupTitle);
  9064. p.GroupData[i].GroupID = m.GroupID;
  9065. p.GroupData[i].GroupName = Utils.StringToBytes(m.GroupName);
  9066. p.GroupData[i].GroupInsigniaID = m.GroupPicture;
  9067. i++;
  9068. }
  9069. p.NewGroupData = new AvatarGroupsReplyPacket.NewGroupDataBlock();
  9070. p.NewGroupData.ListInProfile = true;
  9071. OutPacket(p, ThrottleOutPacketType.Task);
  9072. }
  9073. public void SendJoinGroupReply(UUID groupID, bool success)
  9074. {
  9075. JoinGroupReplyPacket p = (JoinGroupReplyPacket)PacketPool.Instance.GetPacket(PacketType.JoinGroupReply);
  9076. p.AgentData = new JoinGroupReplyPacket.AgentDataBlock();
  9077. p.AgentData.AgentID = AgentId;
  9078. p.GroupData = new JoinGroupReplyPacket.GroupDataBlock();
  9079. p.GroupData.GroupID = groupID;
  9080. p.GroupData.Success = success;
  9081. OutPacket(p, ThrottleOutPacketType.Task);
  9082. }
  9083. public void SendEjectGroupMemberReply(UUID agentID, UUID groupID, bool success)
  9084. {
  9085. EjectGroupMemberReplyPacket p = (EjectGroupMemberReplyPacket)PacketPool.Instance.GetPacket(PacketType.EjectGroupMemberReply);
  9086. p.AgentData = new EjectGroupMemberReplyPacket.AgentDataBlock();
  9087. p.AgentData.AgentID = agentID;
  9088. p.GroupData = new EjectGroupMemberReplyPacket.GroupDataBlock();
  9089. p.GroupData.GroupID = groupID;
  9090. p.EjectData = new EjectGroupMemberReplyPacket.EjectDataBlock();
  9091. p.EjectData.Success = success;
  9092. OutPacket(p, ThrottleOutPacketType.Task);
  9093. }
  9094. public void SendLeaveGroupReply(UUID groupID, bool success)
  9095. {
  9096. LeaveGroupReplyPacket p = (LeaveGroupReplyPacket)PacketPool.Instance.GetPacket(PacketType.LeaveGroupReply);
  9097. p.AgentData = new LeaveGroupReplyPacket.AgentDataBlock();
  9098. p.AgentData.AgentID = AgentId;
  9099. p.GroupData = new LeaveGroupReplyPacket.GroupDataBlock();
  9100. p.GroupData.GroupID = groupID;
  9101. p.GroupData.Success = success;
  9102. OutPacket(p, ThrottleOutPacketType.Task);
  9103. }
  9104. public void SendAvatarClassifiedReply(UUID targetID, UUID[] classifiedID, string[] name)
  9105. {
  9106. if (classifiedID.Length != name.Length)
  9107. return;
  9108. AvatarClassifiedReplyPacket ac =
  9109. (AvatarClassifiedReplyPacket)PacketPool.Instance.GetPacket(
  9110. PacketType.AvatarClassifiedReply);
  9111. ac.AgentData = new AvatarClassifiedReplyPacket.AgentDataBlock();
  9112. ac.AgentData.AgentID = AgentId;
  9113. ac.AgentData.TargetID = targetID;
  9114. ac.Data = new AvatarClassifiedReplyPacket.DataBlock[classifiedID.Length];
  9115. int i;
  9116. for (i = 0 ; i < classifiedID.Length ; i++)
  9117. {
  9118. ac.Data[i].ClassifiedID = classifiedID[i];
  9119. ac.Data[i].Name = Utils.StringToBytes(name[i]);
  9120. }
  9121. OutPacket(ac, ThrottleOutPacketType.Task);
  9122. }
  9123. public void SendClassifiedInfoReply(UUID classifiedID, UUID creatorID, uint creationDate, uint expirationDate, uint category, string name, string description, UUID parcelID, uint parentEstate, UUID snapshotID, string simName, Vector3 globalPos, string parcelName, byte classifiedFlags, int price)
  9124. {
  9125. ClassifiedInfoReplyPacket cr =
  9126. (ClassifiedInfoReplyPacket)PacketPool.Instance.GetPacket(
  9127. PacketType.ClassifiedInfoReply);
  9128. cr.AgentData = new ClassifiedInfoReplyPacket.AgentDataBlock();
  9129. cr.AgentData.AgentID = AgentId;
  9130. cr.Data = new ClassifiedInfoReplyPacket.DataBlock();
  9131. cr.Data.ClassifiedID = classifiedID;
  9132. cr.Data.CreatorID = creatorID;
  9133. cr.Data.CreationDate = creationDate;
  9134. cr.Data.ExpirationDate = expirationDate;
  9135. cr.Data.Category = category;
  9136. cr.Data.Name = Utils.StringToBytes(name);
  9137. cr.Data.Desc = Utils.StringToBytes(description);
  9138. cr.Data.ParcelID = parcelID;
  9139. cr.Data.ParentEstate = parentEstate;
  9140. cr.Data.SnapshotID = snapshotID;
  9141. cr.Data.SimName = Utils.StringToBytes(simName);
  9142. cr.Data.PosGlobal = new Vector3d(globalPos);
  9143. cr.Data.ParcelName = Utils.StringToBytes(parcelName);
  9144. cr.Data.ClassifiedFlags = classifiedFlags;
  9145. cr.Data.PriceForListing = price;
  9146. OutPacket(cr, ThrottleOutPacketType.Task);
  9147. }
  9148. public void SendAgentDropGroup(UUID groupID)
  9149. {
  9150. AgentDropGroupPacket dg =
  9151. (AgentDropGroupPacket)PacketPool.Instance.GetPacket(
  9152. PacketType.AgentDropGroup);
  9153. dg.AgentData = new AgentDropGroupPacket.AgentDataBlock();
  9154. dg.AgentData.AgentID = AgentId;
  9155. dg.AgentData.GroupID = groupID;
  9156. OutPacket(dg, ThrottleOutPacketType.Task);
  9157. }
  9158. public void SendAvatarNotesReply(UUID targetID, string text)
  9159. {
  9160. AvatarNotesReplyPacket an =
  9161. (AvatarNotesReplyPacket)PacketPool.Instance.GetPacket(
  9162. PacketType.AvatarNotesReply);
  9163. an.AgentData = new AvatarNotesReplyPacket.AgentDataBlock();
  9164. an.AgentData.AgentID = AgentId;
  9165. an.Data = new AvatarNotesReplyPacket.DataBlock();
  9166. an.Data.TargetID = targetID;
  9167. an.Data.Notes = Utils.StringToBytes(text);
  9168. OutPacket(an, ThrottleOutPacketType.Task);
  9169. }
  9170. public void SendAvatarPicksReply(UUID targetID, Dictionary<UUID, string> picks)
  9171. {
  9172. AvatarPicksReplyPacket ap =
  9173. (AvatarPicksReplyPacket)PacketPool.Instance.GetPacket(
  9174. PacketType.AvatarPicksReply);
  9175. ap.AgentData = new AvatarPicksReplyPacket.AgentDataBlock();
  9176. ap.AgentData.AgentID = AgentId;
  9177. ap.AgentData.TargetID = targetID;
  9178. ap.Data = new AvatarPicksReplyPacket.DataBlock[picks.Count];
  9179. int i = 0;
  9180. foreach (KeyValuePair<UUID, string> pick in picks)
  9181. {
  9182. ap.Data[i] = new AvatarPicksReplyPacket.DataBlock();
  9183. ap.Data[i].PickID = pick.Key;
  9184. ap.Data[i].PickName = Utils.StringToBytes(pick.Value);
  9185. i++;
  9186. }
  9187. OutPacket(ap, ThrottleOutPacketType.Task);
  9188. }
  9189. public void SendAvatarClassifiedReply(UUID targetID, Dictionary<UUID, string> classifieds)
  9190. {
  9191. AvatarClassifiedReplyPacket ac =
  9192. (AvatarClassifiedReplyPacket)PacketPool.Instance.GetPacket(
  9193. PacketType.AvatarClassifiedReply);
  9194. ac.AgentData = new AvatarClassifiedReplyPacket.AgentDataBlock();
  9195. ac.AgentData.AgentID = AgentId;
  9196. ac.AgentData.TargetID = targetID;
  9197. ac.Data = new AvatarClassifiedReplyPacket.DataBlock[classifieds.Count];
  9198. int i = 0;
  9199. foreach (KeyValuePair<UUID, string> classified in classifieds)
  9200. {
  9201. ac.Data[i] = new AvatarClassifiedReplyPacket.DataBlock();
  9202. ac.Data[i].ClassifiedID = classified.Key;
  9203. ac.Data[i].Name = Utils.StringToBytes(classified.Value);
  9204. i++;
  9205. }
  9206. OutPacket(ac, ThrottleOutPacketType.Task);
  9207. }
  9208. public void SendParcelDwellReply(int localID, UUID parcelID, float dwell)
  9209. {
  9210. ParcelDwellReplyPacket pd =
  9211. (ParcelDwellReplyPacket)PacketPool.Instance.GetPacket(
  9212. PacketType.ParcelDwellReply);
  9213. pd.AgentData = new ParcelDwellReplyPacket.AgentDataBlock();
  9214. pd.AgentData.AgentID = AgentId;
  9215. pd.Data = new ParcelDwellReplyPacket.DataBlock();
  9216. pd.Data.LocalID = localID;
  9217. pd.Data.ParcelID = parcelID;
  9218. pd.Data.Dwell = dwell;
  9219. OutPacket(pd, ThrottleOutPacketType.Land);
  9220. }
  9221. public void SendUserInfoReply(bool imViaEmail, bool visible, string email)
  9222. {
  9223. UserInfoReplyPacket ur =
  9224. (UserInfoReplyPacket)PacketPool.Instance.GetPacket(
  9225. PacketType.UserInfoReply);
  9226. string Visible = "hidden";
  9227. if (visible)
  9228. Visible = "default";
  9229. ur.AgentData = new UserInfoReplyPacket.AgentDataBlock();
  9230. ur.AgentData.AgentID = AgentId;
  9231. ur.UserData = new UserInfoReplyPacket.UserDataBlock();
  9232. ur.UserData.IMViaEMail = imViaEmail;
  9233. ur.UserData.DirectoryVisibility = Utils.StringToBytes(Visible);
  9234. ur.UserData.EMail = Utils.StringToBytes(email);
  9235. OutPacket(ur, ThrottleOutPacketType.Task);
  9236. }
  9237. public void KillEndDone()
  9238. {
  9239. KillPacket kp = new KillPacket();
  9240. OutPacket(kp, ThrottleOutPacketType.Task | ThrottleOutPacketType.LowPriority);
  9241. }
  9242. #region IClientCore
  9243. private readonly Dictionary<Type, object> m_clientInterfaces = new Dictionary<Type, object>();
  9244. /// <summary>
  9245. /// Register an interface on this client, should only be called in the constructor.
  9246. /// </summary>
  9247. /// <typeparam name="T"></typeparam>
  9248. /// <param name="iface"></param>
  9249. protected void RegisterInterface<T>(T iface)
  9250. {
  9251. lock (m_clientInterfaces)
  9252. {
  9253. if (!m_clientInterfaces.ContainsKey(typeof(T)))
  9254. {
  9255. m_clientInterfaces.Add(typeof(T), iface);
  9256. }
  9257. }
  9258. }
  9259. protected virtual void RegisterInterfaces()
  9260. {
  9261. RegisterInterface<IClientIM>(this);
  9262. RegisterInterface<IClientChat>(this);
  9263. RegisterInterface<IClientIPEndpoint>(this);
  9264. }
  9265. public bool TryGet<T>(out T iface)
  9266. {
  9267. if (m_clientInterfaces.ContainsKey(typeof(T)))
  9268. {
  9269. iface = (T)m_clientInterfaces[typeof(T)];
  9270. return true;
  9271. }
  9272. iface = default(T);
  9273. return false;
  9274. }
  9275. public T Get<T>()
  9276. {
  9277. return (T)m_clientInterfaces[typeof(T)];
  9278. }
  9279. public void Disconnect(string reason)
  9280. {
  9281. Kick(reason);
  9282. Thread.Sleep(1000);
  9283. Close(true);
  9284. }
  9285. public void Disconnect()
  9286. {
  9287. Close(true);
  9288. }
  9289. #endregion
  9290. public void RefreshGroupMembership()
  9291. {
  9292. if (m_GroupsModule != null)
  9293. {
  9294. GroupMembershipData[] GroupMembership =
  9295. m_GroupsModule.GetMembershipData(AgentId);
  9296. m_groupPowers.Clear();
  9297. for (int i = 0; i < GroupMembership.Length; i++)
  9298. {
  9299. m_groupPowers[GroupMembership[i].GroupID] = GroupMembership[i].GroupPowers;
  9300. }
  9301. }
  9302. }
  9303. public void SendCreateGroupReply(UUID groupID, bool success, string message)
  9304. {
  9305. CreateGroupReplyPacket createGroupReply = (CreateGroupReplyPacket)PacketPool.Instance.GetPacket(PacketType.CreateGroupReply);
  9306. createGroupReply.AgentData =
  9307. new CreateGroupReplyPacket.AgentDataBlock();
  9308. createGroupReply.ReplyData =
  9309. new CreateGroupReplyPacket.ReplyDataBlock();
  9310. createGroupReply.AgentData.AgentID = AgentId;
  9311. createGroupReply.ReplyData.GroupID = groupID;
  9312. createGroupReply.ReplyData.Success = success;
  9313. createGroupReply.ReplyData.Message = Utils.StringToBytes(message);
  9314. OutPacket(createGroupReply, ThrottleOutPacketType.Task);
  9315. }
  9316. public void SendUseCachedMuteList()
  9317. {
  9318. UseCachedMuteListPacket useCachedMuteList = (UseCachedMuteListPacket)PacketPool.Instance.GetPacket(PacketType.UseCachedMuteList);
  9319. useCachedMuteList.AgentData = new UseCachedMuteListPacket.AgentDataBlock();
  9320. useCachedMuteList.AgentData.AgentID = AgentId;
  9321. OutPacket(useCachedMuteList, ThrottleOutPacketType.Task);
  9322. }
  9323. public void SendMuteListUpdate(string filename)
  9324. {
  9325. MuteListUpdatePacket muteListUpdate = (MuteListUpdatePacket)PacketPool.Instance.GetPacket(PacketType.MuteListUpdate);
  9326. muteListUpdate.MuteData = new MuteListUpdatePacket.MuteDataBlock();
  9327. muteListUpdate.MuteData.AgentID = AgentId;
  9328. muteListUpdate.MuteData.Filename = Utils.StringToBytes(filename);
  9329. OutPacket(muteListUpdate, ThrottleOutPacketType.Task);
  9330. }
  9331. public void SendPickInfoReply(UUID pickID,UUID creatorID, bool topPick, UUID parcelID, string name, string desc, UUID snapshotID, string user, string originalName, string simName, Vector3 posGlobal, int sortOrder, bool enabled)
  9332. {
  9333. PickInfoReplyPacket pickInfoReply = (PickInfoReplyPacket)PacketPool.Instance.GetPacket(PacketType.PickInfoReply);
  9334. pickInfoReply.AgentData = new PickInfoReplyPacket.AgentDataBlock();
  9335. pickInfoReply.AgentData.AgentID = AgentId;
  9336. pickInfoReply.Data = new PickInfoReplyPacket.DataBlock();
  9337. pickInfoReply.Data.PickID = pickID;
  9338. pickInfoReply.Data.CreatorID = creatorID;
  9339. pickInfoReply.Data.TopPick = topPick;
  9340. pickInfoReply.Data.ParcelID = parcelID;
  9341. pickInfoReply.Data.Name = Utils.StringToBytes(name);
  9342. pickInfoReply.Data.Desc = Utils.StringToBytes(desc);
  9343. pickInfoReply.Data.SnapshotID = snapshotID;
  9344. pickInfoReply.Data.User = Utils.StringToBytes(user);
  9345. pickInfoReply.Data.OriginalName = Utils.StringToBytes(originalName);
  9346. pickInfoReply.Data.SimName = Utils.StringToBytes(simName);
  9347. pickInfoReply.Data.PosGlobal = new Vector3d(posGlobal);
  9348. pickInfoReply.Data.SortOrder = sortOrder;
  9349. pickInfoReply.Data.Enabled = enabled;
  9350. OutPacket(pickInfoReply, ThrottleOutPacketType.Task);
  9351. }
  9352. public string Report()
  9353. {
  9354. LLPacketHandler handler = (LLPacketHandler) m_PacketHandler;
  9355. return handler.PacketQueue.GetStats();
  9356. }
  9357. public string XReport(string uptime, string version)
  9358. {
  9359. return "";
  9360. }
  9361. public void MakeAssetRequest(TransferRequestPacket transferRequest)
  9362. {
  9363. UUID requestID = UUID.Zero;
  9364. if (transferRequest.TransferInfo.SourceType == 2)
  9365. {
  9366. //direct asset request
  9367. requestID = new UUID(transferRequest.TransferInfo.Params, 0);
  9368. }
  9369. else if (transferRequest.TransferInfo.SourceType == 3)
  9370. {
  9371. //inventory asset request
  9372. requestID = new UUID(transferRequest.TransferInfo.Params, 80);
  9373. //m_log.Debug("asset request " + requestID);
  9374. }
  9375. //check to see if asset is in local cache, if not we need to request it from asset server.
  9376. //m_log.Debug("asset request " + requestID);
  9377. m_assetService.Get(requestID.ToString(), transferRequest, AssetReceived);
  9378. }
  9379. protected void AssetReceived(string id, Object sender, AssetBase asset)
  9380. {
  9381. TransferRequestPacket transferRequest = (TransferRequestPacket)sender;
  9382. UUID requestID = UUID.Zero;
  9383. byte source = 2;
  9384. if (transferRequest.TransferInfo.SourceType == 2)
  9385. {
  9386. //direct asset request
  9387. requestID = new UUID(transferRequest.TransferInfo.Params, 0);
  9388. }
  9389. else if (transferRequest.TransferInfo.SourceType == 3)
  9390. {
  9391. //inventory asset request
  9392. requestID = new UUID(transferRequest.TransferInfo.Params, 80);
  9393. source = 3;
  9394. //m_log.Debug("asset request " + requestID);
  9395. }
  9396. // FIXME: We never tell the client about assets which do not exist when requested by this transfer mechanism, which can't be right.
  9397. if (null == asset)
  9398. {
  9399. //m_log.DebugFormat("[ASSET CACHE]: Asset transfer request for asset which is {0} already known to be missing. Dropping", requestID);
  9400. return;
  9401. }
  9402. // Scripts cannot be retrieved by direct request
  9403. if (transferRequest.TransferInfo.SourceType == 2 && asset.Type == 10)
  9404. return;
  9405. // The asset is known to exist and is in our cache, so add it to the AssetRequests list
  9406. AssetRequestToClient req = new AssetRequestToClient();
  9407. req.AssetInf = asset;
  9408. req.AssetRequestSource = source;
  9409. req.IsTextureRequest = false;
  9410. req.NumPackets = CalculateNumPackets(asset.Data);
  9411. req.Params = transferRequest.TransferInfo.Params;
  9412. req.RequestAssetID = requestID;
  9413. req.TransferRequestID = transferRequest.TransferInfo.TransferID;
  9414. SendAsset(req);
  9415. }
  9416. /// <summary>
  9417. /// Calculate the number of packets required to send the asset to the client.
  9418. /// </summary>
  9419. /// <param name="data"></param>
  9420. /// <returns></returns>
  9421. private static int CalculateNumPackets(byte[] data)
  9422. {
  9423. const uint m_maxPacketSize = 600;
  9424. int numPackets = 1;
  9425. if (data.LongLength > m_maxPacketSize)
  9426. {
  9427. // over max number of bytes so split up file
  9428. long restData = data.LongLength - m_maxPacketSize;
  9429. int restPackets = (int)((restData + m_maxPacketSize - 1) / m_maxPacketSize);
  9430. numPackets += restPackets;
  9431. }
  9432. return numPackets;
  9433. }
  9434. #region IClientIPEndpoint Members
  9435. public IPAddress EndPoint
  9436. {
  9437. get
  9438. {
  9439. if (m_userEndPoint is IPEndPoint)
  9440. {
  9441. IPEndPoint ep = (IPEndPoint)m_userEndPoint;
  9442. return ep.Address;
  9443. }
  9444. return null;
  9445. }
  9446. }
  9447. #endregion
  9448. }
  9449. }