LLClientView.cs 729 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364
  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 OpenMetaverse.StructuredData;
  40. using OpenSim.Framework;
  41. using OpenSim.Framework.Client;
  42. using OpenSim.Framework.Communications.Cache;
  43. using OpenSim.Framework.Statistics;
  44. using OpenSim.Region.Framework.Interfaces;
  45. using OpenSim.Region.Framework.Scenes;
  46. using OpenSim.Region.Framework.Scenes.Hypergrid;
  47. using OpenSim.Services.Interfaces;
  48. using Timer = System.Timers.Timer;
  49. using AssetLandmark = OpenSim.Framework.AssetLandmark;
  50. using Nini.Config;
  51. namespace OpenSim.Region.ClientStack.LindenUDP
  52. {
  53. #region Enums
  54. /// <summary>
  55. /// Specifies the fields that have been changed when sending a prim or
  56. /// avatar update
  57. /// </summary>
  58. [Flags]
  59. public enum PrimUpdateFlags : uint
  60. {
  61. None = 0,
  62. AttachmentPoint = 1 << 0,
  63. Material = 1 << 1,
  64. ClickAction = 1 << 2,
  65. Scale = 1 << 3,
  66. ParentID = 1 << 4,
  67. PrimFlags = 1 << 5,
  68. PrimData = 1 << 6,
  69. MediaURL = 1 << 7,
  70. ScratchPad = 1 << 8,
  71. Textures = 1 << 9,
  72. TextureAnim = 1 << 10,
  73. NameValue = 1 << 11,
  74. Position = 1 << 12,
  75. Rotation = 1 << 13,
  76. Velocity = 1 << 14,
  77. Acceleration = 1 << 15,
  78. AngularVelocity = 1 << 16,
  79. CollisionPlane = 1 << 17,
  80. Text = 1 << 18,
  81. Particles = 1 << 19,
  82. ExtraData = 1 << 20,
  83. Sound = 1 << 21,
  84. Joint = 1 << 22,
  85. FullUpdate = UInt32.MaxValue
  86. }
  87. #endregion Enums
  88. public delegate bool PacketMethod(IClientAPI simClient, Packet packet);
  89. /// <summary>
  90. /// Handles new client connections
  91. /// Constructor takes a single Packet and authenticates everything
  92. /// </summary>
  93. public class LLClientView : IClientAPI, IClientCore, IClientIM, IClientChat, IClientIPEndpoint, IStatsCollector
  94. {
  95. #region Events
  96. public event GenericMessage OnGenericMessage;
  97. public event BinaryGenericMessage OnBinaryGenericMessage;
  98. public event Action<IClientAPI> OnLogout;
  99. public event ObjectPermissions OnObjectPermissions;
  100. public event Action<IClientAPI> OnConnectionClosed;
  101. public event ViewerEffectEventHandler OnViewerEffect;
  102. public event ImprovedInstantMessage OnInstantMessage;
  103. public event ChatMessage OnChatFromClient;
  104. public event TextureRequest OnRequestTexture;
  105. public event RezObject OnRezObject;
  106. public event DeRezObject OnDeRezObject;
  107. public event ModifyTerrain OnModifyTerrain;
  108. public event Action<IClientAPI> OnRegionHandShakeReply;
  109. public event GenericCall2 OnRequestWearables;
  110. public event SetAppearance OnSetAppearance;
  111. public event AvatarNowWearing OnAvatarNowWearing;
  112. public event RezSingleAttachmentFromInv OnRezSingleAttachmentFromInv;
  113. public event RezMultipleAttachmentsFromInv OnRezMultipleAttachmentsFromInv;
  114. public event UUIDNameRequest OnDetachAttachmentIntoInv;
  115. public event ObjectAttach OnObjectAttach;
  116. public event ObjectDeselect OnObjectDetach;
  117. public event ObjectDrop OnObjectDrop;
  118. public event GenericCall2 OnCompleteMovementToRegion;
  119. public event UpdateAgent OnAgentUpdate;
  120. public event AgentRequestSit OnAgentRequestSit;
  121. public event AgentSit OnAgentSit;
  122. public event AvatarPickerRequest OnAvatarPickerRequest;
  123. public event StartAnim OnStartAnim;
  124. public event StopAnim OnStopAnim;
  125. public event Action<IClientAPI> OnRequestAvatarsData;
  126. public event LinkObjects OnLinkObjects;
  127. public event DelinkObjects OnDelinkObjects;
  128. public event GrabObject OnGrabObject;
  129. public event DeGrabObject OnDeGrabObject;
  130. public event SpinStart OnSpinStart;
  131. public event SpinStop OnSpinStop;
  132. public event ObjectDuplicate OnObjectDuplicate;
  133. public event ObjectDuplicateOnRay OnObjectDuplicateOnRay;
  134. public event MoveObject OnGrabUpdate;
  135. public event SpinObject OnSpinUpdate;
  136. public event AddNewPrim OnAddPrim;
  137. public event RequestGodlikePowers OnRequestGodlikePowers;
  138. public event GodKickUser OnGodKickUser;
  139. public event ObjectExtraParams OnUpdateExtraParams;
  140. public event UpdateShape OnUpdatePrimShape;
  141. public event ObjectRequest OnObjectRequest;
  142. public event ObjectSelect OnObjectSelect;
  143. public event ObjectDeselect OnObjectDeselect;
  144. public event GenericCall7 OnObjectDescription;
  145. public event GenericCall7 OnObjectName;
  146. public event GenericCall7 OnObjectClickAction;
  147. public event GenericCall7 OnObjectMaterial;
  148. public event ObjectIncludeInSearch OnObjectIncludeInSearch;
  149. public event RequestObjectPropertiesFamily OnRequestObjectPropertiesFamily;
  150. public event UpdatePrimFlags OnUpdatePrimFlags;
  151. public event UpdatePrimTexture OnUpdatePrimTexture;
  152. public event UpdateVector OnUpdatePrimGroupPosition;
  153. public event UpdateVector OnUpdatePrimSinglePosition;
  154. public event UpdatePrimRotation OnUpdatePrimGroupRotation;
  155. public event UpdatePrimSingleRotation OnUpdatePrimSingleRotation;
  156. public event UpdatePrimSingleRotationPosition OnUpdatePrimSingleRotationPosition;
  157. public event UpdatePrimGroupRotation OnUpdatePrimGroupMouseRotation;
  158. public event UpdateVector OnUpdatePrimScale;
  159. public event UpdateVector OnUpdatePrimGroupScale;
  160. public event StatusChange OnChildAgentStatus;
  161. public event GenericCall2 OnStopMovement;
  162. public event Action<UUID> OnRemoveAvatar;
  163. public event RequestMapBlocks OnRequestMapBlocks;
  164. public event RequestMapName OnMapNameRequest;
  165. public event TeleportLocationRequest OnTeleportLocationRequest;
  166. public event TeleportLandmarkRequest OnTeleportLandmarkRequest;
  167. public event DisconnectUser OnDisconnectUser;
  168. public event RequestAvatarProperties OnRequestAvatarProperties;
  169. public event SetAlwaysRun OnSetAlwaysRun;
  170. public event FetchInventory OnAgentDataUpdateRequest;
  171. public event TeleportLocationRequest OnSetStartLocationRequest;
  172. public event UpdateAvatarProperties OnUpdateAvatarProperties;
  173. public event CreateNewInventoryItem OnCreateNewInventoryItem;
  174. public event CreateInventoryFolder OnCreateNewInventoryFolder;
  175. public event UpdateInventoryFolder OnUpdateInventoryFolder;
  176. public event MoveInventoryFolder OnMoveInventoryFolder;
  177. public event FetchInventoryDescendents OnFetchInventoryDescendents;
  178. public event PurgeInventoryDescendents OnPurgeInventoryDescendents;
  179. public event FetchInventory OnFetchInventory;
  180. public event RequestTaskInventory OnRequestTaskInventory;
  181. public event UpdateInventoryItem OnUpdateInventoryItem;
  182. public event CopyInventoryItem OnCopyInventoryItem;
  183. public event MoveInventoryItem OnMoveInventoryItem;
  184. public event RemoveInventoryItem OnRemoveInventoryItem;
  185. public event RemoveInventoryFolder OnRemoveInventoryFolder;
  186. public event UDPAssetUploadRequest OnAssetUploadRequest;
  187. public event XferReceive OnXferReceive;
  188. public event RequestXfer OnRequestXfer;
  189. public event ConfirmXfer OnConfirmXfer;
  190. public event AbortXfer OnAbortXfer;
  191. public event RequestTerrain OnRequestTerrain;
  192. public event RezScript OnRezScript;
  193. public event UpdateTaskInventory OnUpdateTaskInventory;
  194. public event MoveTaskInventory OnMoveTaskItem;
  195. public event RemoveTaskInventory OnRemoveTaskItem;
  196. public event RequestAsset OnRequestAsset;
  197. public event UUIDNameRequest OnNameFromUUIDRequest;
  198. public event ParcelAccessListRequest OnParcelAccessListRequest;
  199. public event ParcelAccessListUpdateRequest OnParcelAccessListUpdateRequest;
  200. public event ParcelPropertiesRequest OnParcelPropertiesRequest;
  201. public event ParcelDivideRequest OnParcelDivideRequest;
  202. public event ParcelJoinRequest OnParcelJoinRequest;
  203. public event ParcelPropertiesUpdateRequest OnParcelPropertiesUpdateRequest;
  204. public event ParcelSelectObjects OnParcelSelectObjects;
  205. public event ParcelObjectOwnerRequest OnParcelObjectOwnerRequest;
  206. public event ParcelAbandonRequest OnParcelAbandonRequest;
  207. public event ParcelGodForceOwner OnParcelGodForceOwner;
  208. public event ParcelReclaim OnParcelReclaim;
  209. public event ParcelReturnObjectsRequest OnParcelReturnObjectsRequest;
  210. public event ParcelDeedToGroup OnParcelDeedToGroup;
  211. public event RegionInfoRequest OnRegionInfoRequest;
  212. public event EstateCovenantRequest OnEstateCovenantRequest;
  213. public event FriendActionDelegate OnApproveFriendRequest;
  214. public event FriendActionDelegate OnDenyFriendRequest;
  215. public event FriendshipTermination OnTerminateFriendship;
  216. public event GrantUserFriendRights OnGrantUserRights;
  217. public event MoneyTransferRequest OnMoneyTransferRequest;
  218. public event EconomyDataRequest OnEconomyDataRequest;
  219. public event MoneyBalanceRequest OnMoneyBalanceRequest;
  220. public event ParcelBuy OnParcelBuy;
  221. public event UUIDNameRequest OnTeleportHomeRequest;
  222. public event UUIDNameRequest OnUUIDGroupNameRequest;
  223. public event ScriptAnswer OnScriptAnswer;
  224. public event RequestPayPrice OnRequestPayPrice;
  225. public event ObjectSaleInfo OnObjectSaleInfo;
  226. public event ObjectBuy OnObjectBuy;
  227. public event BuyObjectInventory OnBuyObjectInventory;
  228. public event AgentSit OnUndo;
  229. public event ForceReleaseControls OnForceReleaseControls;
  230. public event GodLandStatRequest OnLandStatRequest;
  231. public event RequestObjectPropertiesFamily OnObjectGroupRequest;
  232. public event DetailedEstateDataRequest OnDetailedEstateDataRequest;
  233. public event SetEstateFlagsRequest OnSetEstateFlagsRequest;
  234. public event SetEstateTerrainBaseTexture OnSetEstateTerrainBaseTexture;
  235. public event SetEstateTerrainDetailTexture OnSetEstateTerrainDetailTexture;
  236. public event SetEstateTerrainTextureHeights OnSetEstateTerrainTextureHeights;
  237. public event CommitEstateTerrainTextureRequest OnCommitEstateTerrainTextureRequest;
  238. public event SetRegionTerrainSettings OnSetRegionTerrainSettings;
  239. public event BakeTerrain OnBakeTerrain;
  240. public event RequestTerrain OnUploadTerrain;
  241. public event EstateChangeInfo OnEstateChangeInfo;
  242. public event EstateRestartSimRequest OnEstateRestartSimRequest;
  243. public event EstateChangeCovenantRequest OnEstateChangeCovenantRequest;
  244. public event UpdateEstateAccessDeltaRequest OnUpdateEstateAccessDeltaRequest;
  245. public event SimulatorBlueBoxMessageRequest OnSimulatorBlueBoxMessageRequest;
  246. public event EstateBlueBoxMessageRequest OnEstateBlueBoxMessageRequest;
  247. public event EstateDebugRegionRequest OnEstateDebugRegionRequest;
  248. public event EstateTeleportOneUserHomeRequest OnEstateTeleportOneUserHomeRequest;
  249. public event EstateTeleportAllUsersHomeRequest OnEstateTeleportAllUsersHomeRequest;
  250. public event RegionHandleRequest OnRegionHandleRequest;
  251. public event ParcelInfoRequest OnParcelInfoRequest;
  252. public event ScriptReset OnScriptReset;
  253. public event GetScriptRunning OnGetScriptRunning;
  254. public event SetScriptRunning OnSetScriptRunning;
  255. public event UpdateVector OnAutoPilotGo;
  256. public event TerrainUnacked OnUnackedTerrain;
  257. public event ActivateGesture OnActivateGesture;
  258. public event DeactivateGesture OnDeactivateGesture;
  259. public event ObjectOwner OnObjectOwner;
  260. public event DirPlacesQuery OnDirPlacesQuery;
  261. public event DirFindQuery OnDirFindQuery;
  262. public event DirLandQuery OnDirLandQuery;
  263. public event DirPopularQuery OnDirPopularQuery;
  264. public event DirClassifiedQuery OnDirClassifiedQuery;
  265. public event EventInfoRequest OnEventInfoRequest;
  266. public event ParcelSetOtherCleanTime OnParcelSetOtherCleanTime;
  267. public event MapItemRequest OnMapItemRequest;
  268. public event OfferCallingCard OnOfferCallingCard;
  269. public event AcceptCallingCard OnAcceptCallingCard;
  270. public event DeclineCallingCard OnDeclineCallingCard;
  271. public event SoundTrigger OnSoundTrigger;
  272. public event StartLure OnStartLure;
  273. public event TeleportLureRequest OnTeleportLureRequest;
  274. public event NetworkStats OnNetworkStatsUpdate;
  275. public event ClassifiedInfoRequest OnClassifiedInfoRequest;
  276. public event ClassifiedInfoUpdate OnClassifiedInfoUpdate;
  277. public event ClassifiedDelete OnClassifiedDelete;
  278. public event ClassifiedDelete OnClassifiedGodDelete;
  279. public event EventNotificationAddRequest OnEventNotificationAddRequest;
  280. public event EventNotificationRemoveRequest OnEventNotificationRemoveRequest;
  281. public event EventGodDelete OnEventGodDelete;
  282. public event ParcelDwellRequest OnParcelDwellRequest;
  283. public event UserInfoRequest OnUserInfoRequest;
  284. public event UpdateUserInfo OnUpdateUserInfo;
  285. public event RetrieveInstantMessages OnRetrieveInstantMessages;
  286. public event PickDelete OnPickDelete;
  287. public event PickGodDelete OnPickGodDelete;
  288. public event PickInfoUpdate OnPickInfoUpdate;
  289. public event AvatarNotesUpdate OnAvatarNotesUpdate;
  290. public event MuteListRequest OnMuteListRequest;
  291. public event AvatarInterestUpdate OnAvatarInterestUpdate;
  292. public event PlacesQuery OnPlacesQuery;
  293. public event AgentFOV OnAgentFOV;
  294. public event FindAgentUpdate OnFindAgent;
  295. public event TrackAgentUpdate OnTrackAgent;
  296. public event NewUserReport OnUserReport;
  297. public event SaveStateHandler OnSaveState;
  298. public event GroupAccountSummaryRequest OnGroupAccountSummaryRequest;
  299. public event GroupAccountDetailsRequest OnGroupAccountDetailsRequest;
  300. public event GroupAccountTransactionsRequest OnGroupAccountTransactionsRequest;
  301. public event FreezeUserUpdate OnParcelFreezeUser;
  302. public event EjectUserUpdate OnParcelEjectUser;
  303. public event ParcelBuyPass OnParcelBuyPass;
  304. public event ParcelGodMark OnParcelGodMark;
  305. public event GroupActiveProposalsRequest OnGroupActiveProposalsRequest;
  306. public event GroupVoteHistoryRequest OnGroupVoteHistoryRequest;
  307. public event SimWideDeletesDelegate OnSimWideDeletes;
  308. public event SendPostcard OnSendPostcard;
  309. public event MuteListEntryUpdate OnUpdateMuteListEntry;
  310. public event MuteListEntryRemove OnRemoveMuteListEntry;
  311. public event GodlikeMessage onGodlikeMessage;
  312. public event GodUpdateRegionInfoUpdate OnGodUpdateRegionInfoUpdate;
  313. #endregion Events
  314. #region Class Members
  315. // LLClientView Only
  316. public delegate void BinaryGenericMessage(Object sender, string method, byte[][] args);
  317. /// <summary>Used to adjust Sun Orbit values so Linden based viewers properly position sun</summary>
  318. private const float m_sunPainDaHalfOrbitalCutoff = 4.712388980384689858f;
  319. private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
  320. protected static Dictionary<PacketType, PacketMethod> PacketHandlers = new Dictionary<PacketType, PacketMethod>(); //Global/static handlers for all clients
  321. private readonly LLUDPServer m_udpServer;
  322. private readonly LLUDPClient m_udpClient;
  323. private readonly UUID m_sessionId;
  324. private readonly UUID m_secureSessionId;
  325. protected readonly UUID m_agentId;
  326. private readonly uint m_circuitCode;
  327. private readonly byte[] m_channelVersion = Utils.EmptyBytes;
  328. private readonly Dictionary<string, UUID> m_defaultAnimations = new Dictionary<string, UUID>();
  329. private readonly IGroupsModule m_GroupsModule;
  330. private int m_cachedTextureSerial;
  331. protected PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_avatarTerseUpdates;
  332. private PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_primTerseUpdates;
  333. private PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock> m_primFullUpdates;
  334. private int m_moneyBalance;
  335. private int m_animationSequenceNumber = 1;
  336. private bool m_SendLogoutPacketWhenClosing = true;
  337. private AgentUpdateArgs lastarg;
  338. private bool m_IsActive = true;
  339. protected Dictionary<PacketType, PacketProcessor> m_packetHandlers = new Dictionary<PacketType, PacketProcessor>();
  340. protected Dictionary<string, GenericMessage> m_genericPacketHandlers = new Dictionary<string, GenericMessage>(); //PauPaw:Local Generic Message handlers
  341. protected Scene m_scene;
  342. protected LLImageManager m_imageManager;
  343. protected string m_firstName;
  344. protected string m_lastName;
  345. protected Thread m_clientThread;
  346. protected Vector3 m_startpos;
  347. protected EndPoint m_userEndPoint;
  348. protected UUID m_activeGroupID;
  349. protected string m_activeGroupName = String.Empty;
  350. protected ulong m_activeGroupPowers;
  351. protected Dictionary<UUID, ulong> m_groupPowers = new Dictionary<UUID, ulong>();
  352. protected int m_terrainCheckerCount;
  353. protected uint m_agentFOVCounter;
  354. protected IAssetService m_assetService;
  355. private IHyperAssetService m_hyperAssets;
  356. private const bool m_checkPackets = true;
  357. private Timer m_propertiesPacketTimer;
  358. private List<ObjectPropertiesPacket.ObjectDataBlock> m_propertiesBlocks = new List<ObjectPropertiesPacket.ObjectDataBlock>();
  359. #endregion Class Members
  360. #region Properties
  361. public LLUDPClient UDPClient { get { return m_udpClient; } }
  362. public IPEndPoint RemoteEndPoint { get { return m_udpClient.RemoteEndPoint; } }
  363. public UUID SecureSessionId { get { return m_secureSessionId; } }
  364. public IScene Scene { get { return m_scene; } }
  365. public UUID SessionId { get { return m_sessionId; } }
  366. public Vector3 StartPos
  367. {
  368. get { return m_startpos; }
  369. set { m_startpos = value; }
  370. }
  371. public UUID AgentId { get { return m_agentId; } }
  372. public UUID ActiveGroupId { get { return m_activeGroupID; } }
  373. public string ActiveGroupName { get { return m_activeGroupName; } }
  374. public ulong ActiveGroupPowers { get { return m_activeGroupPowers; } }
  375. public bool IsGroupMember(UUID groupID) { return m_groupPowers.ContainsKey(groupID); }
  376. /// <summary>
  377. /// First name of the agent/avatar represented by the client
  378. /// </summary>
  379. public string FirstName { get { return m_firstName; } }
  380. /// <summary>
  381. /// Last name of the agent/avatar represented by the client
  382. /// </summary>
  383. public string LastName { get { return m_lastName; } }
  384. /// <summary>
  385. /// Full name of the client (first name and last name)
  386. /// </summary>
  387. public string Name { get { return FirstName + " " + LastName; } }
  388. public uint CircuitCode { get { return m_circuitCode; } }
  389. public int MoneyBalance { get { return m_moneyBalance; } }
  390. public int NextAnimationSequenceNumber { get { return m_animationSequenceNumber++; } }
  391. public bool IsActive
  392. {
  393. get { return m_IsActive; }
  394. set { m_IsActive = value; }
  395. }
  396. public bool SendLogoutPacketWhenClosing { set { m_SendLogoutPacketWhenClosing = value; } }
  397. #endregion Properties
  398. /// <summary>
  399. /// Constructor
  400. /// </summary>
  401. public LLClientView(EndPoint remoteEP, Scene scene, LLUDPServer udpServer, LLUDPClient udpClient, AuthenticateResponse sessionInfo,
  402. UUID agentId, UUID sessionId, uint circuitCode)
  403. {
  404. RegisterInterface<IClientIM>(this);
  405. RegisterInterface<IClientChat>(this);
  406. RegisterInterface<IClientIPEndpoint>(this);
  407. InitDefaultAnimations();
  408. m_scene = scene;
  409. m_avatarTerseUpdates = new PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock>();
  410. m_primTerseUpdates = new PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock>();
  411. m_primFullUpdates = new PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock>(m_scene.Entities.Count);
  412. m_assetService = m_scene.RequestModuleInterface<IAssetService>();
  413. m_hyperAssets = m_scene.RequestModuleInterface<IHyperAssetService>();
  414. m_GroupsModule = scene.RequestModuleInterface<IGroupsModule>();
  415. m_imageManager = new LLImageManager(this, m_assetService, Scene.RequestModuleInterface<IJ2KDecoder>());
  416. m_channelVersion = Util.StringToBytes256(scene.GetSimulatorVersion());
  417. m_agentId = agentId;
  418. m_sessionId = sessionId;
  419. m_secureSessionId = sessionInfo.LoginInfo.SecureSession;
  420. m_circuitCode = circuitCode;
  421. m_userEndPoint = remoteEP;
  422. m_firstName = sessionInfo.LoginInfo.First;
  423. m_lastName = sessionInfo.LoginInfo.Last;
  424. m_startpos = sessionInfo.LoginInfo.StartPos;
  425. m_moneyBalance = 1000;
  426. m_udpServer = udpServer;
  427. m_udpClient = udpClient;
  428. m_udpClient.OnQueueEmpty += HandleQueueEmpty;
  429. m_udpClient.OnPacketStats += PopulateStats;
  430. m_propertiesPacketTimer = new Timer(100);
  431. m_propertiesPacketTimer.Elapsed += ProcessObjectPropertiesPacket;
  432. RegisterLocalPacketHandlers();
  433. }
  434. public void SetDebugPacketLevel(int newDebug)
  435. {
  436. }
  437. #region Client Methods
  438. /// <summary>
  439. /// Shut down the client view
  440. /// </summary>
  441. public void Close()
  442. {
  443. m_log.DebugFormat(
  444. "[CLIENT]: Close has been called for {0} attached to scene {1}",
  445. Name, m_scene.RegionInfo.RegionName);
  446. // Send the STOP packet
  447. DisableSimulatorPacket disable = (DisableSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.DisableSimulator);
  448. OutPacket(disable, ThrottleOutPacketType.Unknown);
  449. IsActive = false;
  450. // Shutdown the image manager
  451. if (m_imageManager != null)
  452. m_imageManager.Close();
  453. // Fire the callback for this connection closing
  454. if (OnConnectionClosed != null)
  455. OnConnectionClosed(this);
  456. // Flush all of the packets out of the UDP server for this client
  457. if (m_udpServer != null)
  458. m_udpServer.Flush(m_udpClient);
  459. // Remove ourselves from the scene
  460. m_scene.RemoveClient(AgentId);
  461. // We can't reach into other scenes and close the connection
  462. // We need to do this over grid communications
  463. //m_scene.CloseAllAgents(CircuitCode);
  464. // Disable UDP handling for this client
  465. m_udpClient.Shutdown();
  466. //m_log.InfoFormat("[CLIENTVIEW] Memory pre GC {0}", System.GC.GetTotalMemory(false));
  467. //GC.Collect();
  468. //m_log.InfoFormat("[CLIENTVIEW] Memory post GC {0}", System.GC.GetTotalMemory(true));
  469. }
  470. public void Kick(string message)
  471. {
  472. if (!ChildAgentStatus())
  473. {
  474. KickUserPacket kupack = (KickUserPacket)PacketPool.Instance.GetPacket(PacketType.KickUser);
  475. kupack.UserInfo.AgentID = AgentId;
  476. kupack.UserInfo.SessionID = SessionId;
  477. kupack.TargetBlock.TargetIP = 0;
  478. kupack.TargetBlock.TargetPort = 0;
  479. kupack.UserInfo.Reason = Util.StringToBytes256(message);
  480. OutPacket(kupack, ThrottleOutPacketType.Task);
  481. // You must sleep here or users get no message!
  482. Thread.Sleep(500);
  483. }
  484. }
  485. public void Stop()
  486. {
  487. }
  488. #endregion Client Methods
  489. #region Packet Handling
  490. public void PopulateStats(int inPackets, int outPackets, int unAckedBytes)
  491. {
  492. NetworkStats handlerNetworkStatsUpdate = OnNetworkStatsUpdate;
  493. if (handlerNetworkStatsUpdate != null)
  494. {
  495. handlerNetworkStatsUpdate(inPackets, outPackets, unAckedBytes);
  496. }
  497. }
  498. public static bool AddPacketHandler(PacketType packetType, PacketMethod handler)
  499. {
  500. bool result = false;
  501. lock (PacketHandlers)
  502. {
  503. if (!PacketHandlers.ContainsKey(packetType))
  504. {
  505. PacketHandlers.Add(packetType, handler);
  506. result = true;
  507. }
  508. }
  509. return result;
  510. }
  511. public bool AddLocalPacketHandler(PacketType packetType, PacketMethod handler)
  512. {
  513. return AddLocalPacketHandler(packetType, handler, true);
  514. }
  515. public bool AddLocalPacketHandler(PacketType packetType, PacketMethod handler, bool async)
  516. {
  517. bool result = false;
  518. lock (m_packetHandlers)
  519. {
  520. if (!m_packetHandlers.ContainsKey(packetType))
  521. {
  522. m_packetHandlers.Add(packetType, new PacketProcessor() { method = handler, Async = async });
  523. result = true;
  524. }
  525. }
  526. return result;
  527. }
  528. public bool AddGenericPacketHandler(string MethodName, GenericMessage handler)
  529. {
  530. MethodName = MethodName.ToLower().Trim();
  531. bool result = false;
  532. lock (m_genericPacketHandlers)
  533. {
  534. if (!m_genericPacketHandlers.ContainsKey(MethodName))
  535. {
  536. m_genericPacketHandlers.Add(MethodName, handler);
  537. result = true;
  538. }
  539. }
  540. return result;
  541. }
  542. /// <summary>
  543. /// Try to process a packet using registered packet handlers
  544. /// </summary>
  545. /// <param name="packet"></param>
  546. /// <returns>True if a handler was found which successfully processed the packet.</returns>
  547. protected virtual bool ProcessPacketMethod(Packet packet)
  548. {
  549. bool result = false;
  550. PacketProcessor pprocessor;
  551. if (m_packetHandlers.TryGetValue(packet.Type, out pprocessor))
  552. {
  553. //there is a local handler for this packet type
  554. if (pprocessor.Async)
  555. {
  556. object obj = new AsyncPacketProcess(this, pprocessor.method, packet);
  557. Util.FireAndForget(ProcessSpecificPacketAsync,obj);
  558. result = true;
  559. }
  560. else
  561. {
  562. result = pprocessor.method(this, packet);
  563. }
  564. }
  565. else
  566. {
  567. //there is not a local handler so see if there is a Global handler
  568. PacketMethod method = null;
  569. bool found;
  570. lock (PacketHandlers)
  571. {
  572. found = PacketHandlers.TryGetValue(packet.Type, out method);
  573. }
  574. if (found)
  575. {
  576. result = method(this, packet);
  577. }
  578. }
  579. return result;
  580. }
  581. public void ProcessSpecificPacketAsync(object state)
  582. {
  583. AsyncPacketProcess packetObject = (AsyncPacketProcess)state;
  584. packetObject.result = packetObject.Method(packetObject.ClientView, packetObject.Pack);
  585. }
  586. #endregion Packet Handling
  587. # region Setup
  588. public virtual void Start()
  589. {
  590. m_scene.AddNewClient(this);
  591. RefreshGroupMembership();
  592. }
  593. # endregion
  594. public void ActivateGesture(UUID assetId, UUID gestureId)
  595. {
  596. }
  597. public void DeactivateGesture(UUID assetId, UUID gestureId)
  598. {
  599. }
  600. // Sound
  601. public void SoundTrigger(UUID soundId, UUID owerid, UUID Objectid, UUID ParentId, float Gain, Vector3 Position, UInt64 Handle)
  602. {
  603. }
  604. #region Scene/Avatar to Client
  605. public void SendRegionHandshake(RegionInfo regionInfo, RegionHandshakeArgs args)
  606. {
  607. RegionHandshakePacket handshake = (RegionHandshakePacket)PacketPool.Instance.GetPacket(PacketType.RegionHandshake);
  608. handshake.RegionInfo = new RegionHandshakePacket.RegionInfoBlock();
  609. handshake.RegionInfo.BillableFactor = args.billableFactor;
  610. handshake.RegionInfo.IsEstateManager = args.isEstateManager;
  611. handshake.RegionInfo.TerrainHeightRange00 = args.terrainHeightRange0;
  612. handshake.RegionInfo.TerrainHeightRange01 = args.terrainHeightRange1;
  613. handshake.RegionInfo.TerrainHeightRange10 = args.terrainHeightRange2;
  614. handshake.RegionInfo.TerrainHeightRange11 = args.terrainHeightRange3;
  615. handshake.RegionInfo.TerrainStartHeight00 = args.terrainStartHeight0;
  616. handshake.RegionInfo.TerrainStartHeight01 = args.terrainStartHeight1;
  617. handshake.RegionInfo.TerrainStartHeight10 = args.terrainStartHeight2;
  618. handshake.RegionInfo.TerrainStartHeight11 = args.terrainStartHeight3;
  619. handshake.RegionInfo.SimAccess = args.simAccess;
  620. handshake.RegionInfo.WaterHeight = args.waterHeight;
  621. handshake.RegionInfo.RegionFlags = args.regionFlags;
  622. handshake.RegionInfo.SimName = Util.StringToBytes256(args.regionName);
  623. handshake.RegionInfo.SimOwner = args.SimOwner;
  624. handshake.RegionInfo.TerrainBase0 = args.terrainBase0;
  625. handshake.RegionInfo.TerrainBase1 = args.terrainBase1;
  626. handshake.RegionInfo.TerrainBase2 = args.terrainBase2;
  627. handshake.RegionInfo.TerrainBase3 = args.terrainBase3;
  628. handshake.RegionInfo.TerrainDetail0 = args.terrainDetail0;
  629. handshake.RegionInfo.TerrainDetail1 = args.terrainDetail1;
  630. handshake.RegionInfo.TerrainDetail2 = args.terrainDetail2;
  631. handshake.RegionInfo.TerrainDetail3 = args.terrainDetail3;
  632. handshake.RegionInfo.CacheID = UUID.Random(); //I guess this is for the client to remember an old setting?
  633. handshake.RegionInfo2 = new RegionHandshakePacket.RegionInfo2Block();
  634. handshake.RegionInfo2.RegionID = regionInfo.RegionID;
  635. handshake.RegionInfo3 = new RegionHandshakePacket.RegionInfo3Block();
  636. handshake.RegionInfo3.CPUClassID = 9;
  637. handshake.RegionInfo3.CPURatio = 1;
  638. handshake.RegionInfo3.ColoName = Utils.EmptyBytes;
  639. handshake.RegionInfo3.ProductName = Utils.EmptyBytes;
  640. handshake.RegionInfo3.ProductSKU = Utils.EmptyBytes;
  641. OutPacket(handshake, ThrottleOutPacketType.Task);
  642. }
  643. /// <summary>
  644. ///
  645. /// </summary>
  646. public void MoveAgentIntoRegion(RegionInfo regInfo, Vector3 pos, Vector3 look)
  647. {
  648. AgentMovementCompletePacket mov = (AgentMovementCompletePacket)PacketPool.Instance.GetPacket(PacketType.AgentMovementComplete);
  649. mov.SimData.ChannelVersion = m_channelVersion;
  650. mov.AgentData.SessionID = m_sessionId;
  651. mov.AgentData.AgentID = AgentId;
  652. mov.Data.RegionHandle = regInfo.RegionHandle;
  653. mov.Data.Timestamp = (uint)Util.UnixTimeSinceEpoch();
  654. if ((pos.X == 0) && (pos.Y == 0) && (pos.Z == 0))
  655. {
  656. mov.Data.Position = m_startpos;
  657. }
  658. else
  659. {
  660. mov.Data.Position = pos;
  661. }
  662. mov.Data.LookAt = look;
  663. // Hack to get this out immediately and skip the throttles
  664. OutPacket(mov, ThrottleOutPacketType.Unknown);
  665. }
  666. public void SendChatMessage(string message, byte type, Vector3 fromPos, string fromName,
  667. UUID fromAgentID, byte source, byte audible)
  668. {
  669. ChatFromSimulatorPacket reply = (ChatFromSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.ChatFromSimulator);
  670. reply.ChatData.Audible = audible;
  671. reply.ChatData.Message = Util.StringToBytes1024(message);
  672. reply.ChatData.ChatType = type;
  673. reply.ChatData.SourceType = source;
  674. reply.ChatData.Position = fromPos;
  675. reply.ChatData.FromName = Util.StringToBytes256(fromName);
  676. reply.ChatData.OwnerID = fromAgentID;
  677. reply.ChatData.SourceID = fromAgentID;
  678. OutPacket(reply, ThrottleOutPacketType.Task);
  679. }
  680. /// <summary>
  681. /// Send an instant message to this client
  682. /// </summary>
  683. //
  684. // Don't remove transaction ID! Groups and item gives need to set it!
  685. public void SendInstantMessage(GridInstantMessage im)
  686. {
  687. if (((Scene)(m_scene)).Permissions.CanInstantMessage(new UUID(im.fromAgentID), new UUID(im.toAgentID)))
  688. {
  689. ImprovedInstantMessagePacket msg
  690. = (ImprovedInstantMessagePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedInstantMessage);
  691. msg.AgentData.AgentID = new UUID(im.fromAgentID);
  692. msg.AgentData.SessionID = UUID.Zero;
  693. msg.MessageBlock.FromAgentName = Util.StringToBytes256(im.fromAgentName);
  694. msg.MessageBlock.Dialog = im.dialog;
  695. msg.MessageBlock.FromGroup = im.fromGroup;
  696. if (im.imSessionID == UUID.Zero.Guid)
  697. msg.MessageBlock.ID = new UUID(im.fromAgentID) ^ new UUID(im.toAgentID);
  698. else
  699. msg.MessageBlock.ID = new UUID(im.imSessionID);
  700. msg.MessageBlock.Offline = im.offline;
  701. msg.MessageBlock.ParentEstateID = im.ParentEstateID;
  702. msg.MessageBlock.Position = im.Position;
  703. msg.MessageBlock.RegionID = new UUID(im.RegionID);
  704. msg.MessageBlock.Timestamp = im.timestamp;
  705. msg.MessageBlock.ToAgentID = new UUID(im.toAgentID);
  706. msg.MessageBlock.Message = Util.StringToBytes1024(im.message);
  707. msg.MessageBlock.BinaryBucket = im.binaryBucket;
  708. if (im.message.StartsWith("[grouptest]"))
  709. { // this block is test code for implementing group IM - delete when group IM is finished
  710. IEventQueue eq = Scene.RequestModuleInterface<IEventQueue>();
  711. if (eq != null)
  712. {
  713. im.dialog = 17;
  714. //eq.ChatterboxInvitation(
  715. // new UUID("00000000-68f9-1111-024e-222222111123"),
  716. // "OpenSimulator Testing", im.fromAgentID, im.message, im.toAgentID, im.fromAgentName, im.dialog, 0,
  717. // false, 0, new Vector3(), 1, im.imSessionID, im.fromGroup, im.binaryBucket);
  718. eq.ChatterboxInvitation(
  719. new UUID("00000000-68f9-1111-024e-222222111123"),
  720. "OpenSimulator Testing", new UUID(im.fromAgentID), im.message, new UUID(im.toAgentID), im.fromAgentName, im.dialog, 0,
  721. false, 0, new Vector3(), 1, new UUID(im.imSessionID), im.fromGroup, Util.StringToBytes256("OpenSimulator Testing"));
  722. eq.ChatterBoxSessionAgentListUpdates(
  723. new UUID("00000000-68f9-1111-024e-222222111123"),
  724. new UUID(im.fromAgentID), new UUID(im.toAgentID), false, false, false);
  725. }
  726. Console.WriteLine("SendInstantMessage: " + msg);
  727. }
  728. else
  729. OutPacket(msg, ThrottleOutPacketType.Task);
  730. }
  731. }
  732. public void SendGenericMessage(string method, List<string> message)
  733. {
  734. GenericMessagePacket gmp = new GenericMessagePacket();
  735. gmp.MethodData.Method = Util.StringToBytes256(method);
  736. gmp.ParamList = new GenericMessagePacket.ParamListBlock[message.Count];
  737. int i = 0;
  738. foreach (string val in message)
  739. {
  740. gmp.ParamList[i] = new GenericMessagePacket.ParamListBlock();
  741. gmp.ParamList[i++].Parameter = Util.StringToBytes256(val);
  742. }
  743. OutPacket(gmp, ThrottleOutPacketType.Task);
  744. }
  745. public void SendGroupActiveProposals(UUID groupID, UUID transactionID, GroupActiveProposals[] Proposals)
  746. {
  747. int i = 0;
  748. foreach (GroupActiveProposals Proposal in Proposals)
  749. {
  750. GroupActiveProposalItemReplyPacket GAPIRP = new GroupActiveProposalItemReplyPacket();
  751. GAPIRP.AgentData.AgentID = AgentId;
  752. GAPIRP.AgentData.GroupID = groupID;
  753. GAPIRP.TransactionData.TransactionID = transactionID;
  754. GAPIRP.TransactionData.TotalNumItems = ((uint)i+1);
  755. GroupActiveProposalItemReplyPacket.ProposalDataBlock ProposalData = new GroupActiveProposalItemReplyPacket.ProposalDataBlock();
  756. GAPIRP.ProposalData = new GroupActiveProposalItemReplyPacket.ProposalDataBlock[1];
  757. ProposalData.VoteCast = Utils.StringToBytes("false");
  758. ProposalData.VoteID = new UUID(Proposal.VoteID);
  759. ProposalData.VoteInitiator = new UUID(Proposal.VoteInitiator);
  760. ProposalData.Majority = (float)Convert.ToInt32(Proposal.Majority);
  761. ProposalData.Quorum = Convert.ToInt32(Proposal.Quorum);
  762. ProposalData.TerseDateID = Utils.StringToBytes(Proposal.TerseDateID);
  763. ProposalData.StartDateTime = Utils.StringToBytes(Proposal.StartDateTime);
  764. ProposalData.EndDateTime = Utils.StringToBytes(Proposal.EndDateTime);
  765. ProposalData.ProposalText = Utils.StringToBytes(Proposal.ProposalText);
  766. ProposalData.AlreadyVoted = false;
  767. GAPIRP.ProposalData[i] = ProposalData;
  768. OutPacket(GAPIRP, ThrottleOutPacketType.Task);
  769. i++;
  770. }
  771. if (Proposals.Length == 0)
  772. {
  773. GroupActiveProposalItemReplyPacket GAPIRP = new GroupActiveProposalItemReplyPacket();
  774. GAPIRP.AgentData.AgentID = AgentId;
  775. GAPIRP.AgentData.GroupID = groupID;
  776. GAPIRP.TransactionData.TransactionID = transactionID;
  777. GAPIRP.TransactionData.TotalNumItems = 1;
  778. GroupActiveProposalItemReplyPacket.ProposalDataBlock ProposalData = new GroupActiveProposalItemReplyPacket.ProposalDataBlock();
  779. GAPIRP.ProposalData = new GroupActiveProposalItemReplyPacket.ProposalDataBlock[1];
  780. ProposalData.VoteCast = Utils.StringToBytes("false");
  781. ProposalData.VoteID = UUID.Zero;
  782. ProposalData.VoteInitiator = UUID.Zero;
  783. ProposalData.Majority = 0;
  784. ProposalData.Quorum = 0;
  785. ProposalData.TerseDateID = Utils.StringToBytes("");
  786. ProposalData.StartDateTime = Utils.StringToBytes("");
  787. ProposalData.EndDateTime = Utils.StringToBytes("");
  788. ProposalData.ProposalText = Utils.StringToBytes("");
  789. ProposalData.AlreadyVoted = false;
  790. GAPIRP.ProposalData[0] = ProposalData;
  791. OutPacket(GAPIRP, ThrottleOutPacketType.Task);
  792. }
  793. }
  794. public void SendGroupVoteHistory(UUID groupID, UUID transactionID, GroupVoteHistory[] Votes)
  795. {
  796. int i = 0;
  797. foreach (GroupVoteHistory Vote in Votes)
  798. {
  799. GroupVoteHistoryItemReplyPacket GVHIRP = new GroupVoteHistoryItemReplyPacket();
  800. GVHIRP.AgentData.AgentID = AgentId;
  801. GVHIRP.AgentData.GroupID = groupID;
  802. GVHIRP.TransactionData.TransactionID = transactionID;
  803. GVHIRP.TransactionData.TotalNumItems = ((uint)i+1);
  804. GVHIRP.HistoryItemData.VoteID = new UUID(Vote.VoteID);
  805. GVHIRP.HistoryItemData.VoteInitiator = new UUID(Vote.VoteInitiator);
  806. GVHIRP.HistoryItemData.Majority = (float)Convert.ToInt32(Vote.Majority);
  807. GVHIRP.HistoryItemData.Quorum = Convert.ToInt32(Vote.Quorum);
  808. GVHIRP.HistoryItemData.TerseDateID = Utils.StringToBytes(Vote.TerseDateID);
  809. GVHIRP.HistoryItemData.StartDateTime = Utils.StringToBytes(Vote.StartDateTime);
  810. GVHIRP.HistoryItemData.EndDateTime = Utils.StringToBytes(Vote.EndDateTime);
  811. GVHIRP.HistoryItemData.VoteType = Utils.StringToBytes(Vote.VoteType);
  812. GVHIRP.HistoryItemData.VoteResult = Utils.StringToBytes(Vote.VoteResult);
  813. GVHIRP.HistoryItemData.ProposalText = Utils.StringToBytes(Vote.ProposalText);
  814. GroupVoteHistoryItemReplyPacket.VoteItemBlock VoteItem = new GroupVoteHistoryItemReplyPacket.VoteItemBlock();
  815. GVHIRP.VoteItem = new GroupVoteHistoryItemReplyPacket.VoteItemBlock[1];
  816. VoteItem.CandidateID = UUID.Zero;
  817. VoteItem.NumVotes = 0; //TODO: FIX THIS!!!
  818. VoteItem.VoteCast = Utils.StringToBytes("Yes");
  819. GVHIRP.VoteItem[i] = VoteItem;
  820. OutPacket(GVHIRP, ThrottleOutPacketType.Task);
  821. i++;
  822. }
  823. if (Votes.Length == 0)
  824. {
  825. GroupVoteHistoryItemReplyPacket GVHIRP = new GroupVoteHistoryItemReplyPacket();
  826. GVHIRP.AgentData.AgentID = AgentId;
  827. GVHIRP.AgentData.GroupID = groupID;
  828. GVHIRP.TransactionData.TransactionID = transactionID;
  829. GVHIRP.TransactionData.TotalNumItems = 0;
  830. GVHIRP.HistoryItemData.VoteID = UUID.Zero;
  831. GVHIRP.HistoryItemData.VoteInitiator = UUID.Zero;
  832. GVHIRP.HistoryItemData.Majority = 0;
  833. GVHIRP.HistoryItemData.Quorum = 0;
  834. GVHIRP.HistoryItemData.TerseDateID = Utils.StringToBytes("");
  835. GVHIRP.HistoryItemData.StartDateTime = Utils.StringToBytes("");
  836. GVHIRP.HistoryItemData.EndDateTime = Utils.StringToBytes("");
  837. GVHIRP.HistoryItemData.VoteType = Utils.StringToBytes("");
  838. GVHIRP.HistoryItemData.VoteResult = Utils.StringToBytes("");
  839. GVHIRP.HistoryItemData.ProposalText = Utils.StringToBytes("");
  840. GroupVoteHistoryItemReplyPacket.VoteItemBlock VoteItem = new GroupVoteHistoryItemReplyPacket.VoteItemBlock();
  841. GVHIRP.VoteItem = new GroupVoteHistoryItemReplyPacket.VoteItemBlock[1];
  842. VoteItem.CandidateID = UUID.Zero;
  843. VoteItem.NumVotes = 0; //TODO: FIX THIS!!!
  844. VoteItem.VoteCast = Utils.StringToBytes("No");
  845. GVHIRP.VoteItem[0] = VoteItem;
  846. OutPacket(GVHIRP, ThrottleOutPacketType.Task);
  847. }
  848. }
  849. public void SendGroupAccountingDetails(IClientAPI sender,UUID groupID, UUID transactionID, UUID sessionID, int amt)
  850. {
  851. GroupAccountDetailsReplyPacket GADRP = new GroupAccountDetailsReplyPacket();
  852. GADRP.AgentData = new GroupAccountDetailsReplyPacket.AgentDataBlock();
  853. GADRP.AgentData.AgentID = sender.AgentId;
  854. GADRP.AgentData.GroupID = groupID;
  855. GADRP.HistoryData = new GroupAccountDetailsReplyPacket.HistoryDataBlock[1];
  856. GroupAccountDetailsReplyPacket.HistoryDataBlock History = new GroupAccountDetailsReplyPacket.HistoryDataBlock();
  857. GADRP.MoneyData = new GroupAccountDetailsReplyPacket.MoneyDataBlock();
  858. GADRP.MoneyData.CurrentInterval = 0;
  859. GADRP.MoneyData.IntervalDays = 7;
  860. GADRP.MoneyData.RequestID = transactionID;
  861. GADRP.MoneyData.StartDate = Utils.StringToBytes(DateTime.Today.ToString());
  862. History.Amount = amt;
  863. History.Description = Utils.StringToBytes("");
  864. GADRP.HistoryData[0] = History;
  865. OutPacket(GADRP, ThrottleOutPacketType.Task);
  866. }
  867. public void SendGroupAccountingSummary(IClientAPI sender,UUID groupID, uint moneyAmt, int totalTier, int usedTier)
  868. {
  869. GroupAccountSummaryReplyPacket GASRP =
  870. (GroupAccountSummaryReplyPacket)PacketPool.Instance.GetPacket(
  871. PacketType.GroupAccountSummaryReply);
  872. GASRP.AgentData = new GroupAccountSummaryReplyPacket.AgentDataBlock();
  873. GASRP.AgentData.AgentID = sender.AgentId;
  874. GASRP.AgentData.GroupID = groupID;
  875. GASRP.MoneyData = new GroupAccountSummaryReplyPacket.MoneyDataBlock();
  876. GASRP.MoneyData.Balance = (int)moneyAmt;
  877. GASRP.MoneyData.TotalCredits = totalTier;
  878. GASRP.MoneyData.TotalDebits = usedTier;
  879. GASRP.MoneyData.StartDate = new byte[1];
  880. GASRP.MoneyData.CurrentInterval = 1;
  881. GASRP.MoneyData.GroupTaxCurrent = 0;
  882. GASRP.MoneyData.GroupTaxEstimate = 0;
  883. GASRP.MoneyData.IntervalDays = 0;
  884. GASRP.MoneyData.LandTaxCurrent = 0;
  885. GASRP.MoneyData.LandTaxEstimate = 0;
  886. GASRP.MoneyData.LastTaxDate = new byte[1];
  887. GASRP.MoneyData.LightTaxCurrent = 0;
  888. GASRP.MoneyData.TaxDate = new byte[1];
  889. GASRP.MoneyData.RequestID = sender.AgentId;
  890. GASRP.MoneyData.ParcelDirFeeEstimate = 0;
  891. GASRP.MoneyData.ParcelDirFeeCurrent = 0;
  892. GASRP.MoneyData.ObjectTaxEstimate = 0;
  893. GASRP.MoneyData.NonExemptMembers = 0;
  894. GASRP.MoneyData.ObjectTaxCurrent = 0;
  895. GASRP.MoneyData.LightTaxEstimate = 0;
  896. OutPacket(GASRP, ThrottleOutPacketType.Task);
  897. }
  898. public void SendGroupTransactionsSummaryDetails(IClientAPI sender,UUID groupID, UUID transactionID, UUID sessionID, int amt)
  899. {
  900. GroupAccountTransactionsReplyPacket GATRP =
  901. (GroupAccountTransactionsReplyPacket)PacketPool.Instance.GetPacket(
  902. PacketType.GroupAccountTransactionsReply);
  903. GATRP.AgentData = new GroupAccountTransactionsReplyPacket.AgentDataBlock();
  904. GATRP.AgentData.AgentID = sender.AgentId;
  905. GATRP.AgentData.GroupID = groupID;
  906. GATRP.MoneyData = new GroupAccountTransactionsReplyPacket.MoneyDataBlock();
  907. GATRP.MoneyData.CurrentInterval = 0;
  908. GATRP.MoneyData.IntervalDays = 7;
  909. GATRP.MoneyData.RequestID = transactionID;
  910. GATRP.MoneyData.StartDate = Utils.StringToBytes(DateTime.Today.ToString());
  911. GATRP.HistoryData = new GroupAccountTransactionsReplyPacket.HistoryDataBlock[1];
  912. GroupAccountTransactionsReplyPacket.HistoryDataBlock History = new GroupAccountTransactionsReplyPacket.HistoryDataBlock();
  913. History.Amount = 0;
  914. History.Item = Utils.StringToBytes("");
  915. History.Time = Utils.StringToBytes("");
  916. History.Type = 0;
  917. History.User = Utils.StringToBytes("");
  918. GATRP.HistoryData[0] = History;
  919. OutPacket(GATRP, ThrottleOutPacketType.Task);
  920. }
  921. /// <summary>
  922. /// Send the region heightmap to the client
  923. /// </summary>
  924. /// <param name="map">heightmap</param>
  925. public virtual void SendLayerData(float[] map)
  926. {
  927. Util.FireAndForget(DoSendLayerData, map);
  928. }
  929. /// <summary>
  930. /// Send terrain layer information to the client.
  931. /// </summary>
  932. /// <param name="o"></param>
  933. private void DoSendLayerData(object o)
  934. {
  935. float[] map = LLHeightFieldMoronize((float[])o);
  936. try
  937. {
  938. //for (int y = 0; y < 16; y++)
  939. //{
  940. // for (int x = 0; x < 16; x++)
  941. // {
  942. // SendLayerData(x, y, map);
  943. // }
  944. //}
  945. // Send LayerData in a spiral pattern. Fun!
  946. SendLayerTopRight(map, 0, 0, 15, 15);
  947. }
  948. catch (Exception e)
  949. {
  950. m_log.Error("[CLIENT]: SendLayerData() Failed with exception: " + e.Message, e);
  951. }
  952. }
  953. private void SendLayerTopRight(float[] map, int x1, int y1, int x2, int y2)
  954. {
  955. // Row
  956. for (int i = x1; i <= x2; i++)
  957. SendLayerData(i, y1, map);
  958. // Column
  959. for (int j = y1 + 1; j <= y2; j++)
  960. SendLayerData(x2, j, map);
  961. if (x2 - x1 > 0)
  962. SendLayerBottomLeft(map, x1, y1 + 1, x2 - 1, y2);
  963. }
  964. void SendLayerBottomLeft(float[] map, int x1, int y1, int x2, int y2)
  965. {
  966. // Row in reverse
  967. for (int i = x2; i >= x1; i--)
  968. SendLayerData(i, y2, map);
  969. // Column in reverse
  970. for (int j = y2 - 1; j >= y1; j--)
  971. SendLayerData(x1, j, map);
  972. if (x2 - x1 > 0)
  973. SendLayerTopRight(map, x1 + 1, y1, x2, y2 - 1);
  974. }
  975. /// <summary>
  976. /// Sends a set of four patches (x, x+1, ..., x+3) to the client
  977. /// </summary>
  978. /// <param name="map">heightmap</param>
  979. /// <param name="px">X coordinate for patches 0..12</param>
  980. /// <param name="py">Y coordinate for patches 0..15</param>
  981. // private void SendLayerPacket(float[] map, int y, int x)
  982. // {
  983. // int[] patches = new int[4];
  984. // patches[0] = x + 0 + y * 16;
  985. // patches[1] = x + 1 + y * 16;
  986. // patches[2] = x + 2 + y * 16;
  987. // patches[3] = x + 3 + y * 16;
  988. // Packet layerpack = LLClientView.TerrainManager.CreateLandPacket(map, patches);
  989. // OutPacket(layerpack, ThrottleOutPacketType.Land);
  990. // }
  991. /// <summary>
  992. /// Sends a specified patch to a client
  993. /// </summary>
  994. /// <param name="px">Patch coordinate (x) 0..15</param>
  995. /// <param name="py">Patch coordinate (y) 0..15</param>
  996. /// <param name="map">heightmap</param>
  997. public void SendLayerData(int px, int py, float[] map)
  998. {
  999. try
  1000. {
  1001. int[] patches = new int[] { py * 16 + px };
  1002. float[] heightmap = (map.Length == 65536) ?
  1003. map :
  1004. LLHeightFieldMoronize(map);
  1005. LayerDataPacket layerpack = TerrainCompressor.CreateLandPacket(heightmap, patches);
  1006. layerpack.Header.Reliable = true;
  1007. OutPacket(layerpack, ThrottleOutPacketType.Land);
  1008. }
  1009. catch (Exception e)
  1010. {
  1011. m_log.Error("[CLIENT]: SendLayerData() Failed with exception: " + e.Message, e);
  1012. }
  1013. }
  1014. /// <summary>
  1015. /// Munges heightfield into the LLUDP backed in restricted heightfield.
  1016. /// </summary>
  1017. /// <param name="map">float array in the base; Constants.RegionSize</param>
  1018. /// <returns>float array in the base 256</returns>
  1019. internal float[] LLHeightFieldMoronize(float[] map)
  1020. {
  1021. if (map.Length == 65536)
  1022. return map;
  1023. else
  1024. {
  1025. float[] returnmap = new float[65536];
  1026. if (map.Length < 65535)
  1027. {
  1028. // rebase the vector stride to 256
  1029. for (int i = 0; i < Constants.RegionSize; i++)
  1030. Array.Copy(map, i * (int)Constants.RegionSize, returnmap, i * 256, (int)Constants.RegionSize);
  1031. }
  1032. else
  1033. {
  1034. for (int i = 0; i < 256; i++)
  1035. Array.Copy(map, i * (int)Constants.RegionSize, returnmap, i * 256, 256);
  1036. }
  1037. //Array.Copy(map,0,returnmap,0,(map.Length < 65536)? map.Length : 65536);
  1038. return returnmap;
  1039. }
  1040. }
  1041. /// <summary>
  1042. /// Send the wind matrix to the client
  1043. /// </summary>
  1044. /// <param name="windSpeeds">16x16 array of wind speeds</param>
  1045. public virtual void SendWindData(Vector2[] windSpeeds)
  1046. {
  1047. Util.FireAndForget(DoSendWindData, windSpeeds);
  1048. }
  1049. /// <summary>
  1050. /// Send the cloud matrix to the client
  1051. /// </summary>
  1052. /// <param name="windSpeeds">16x16 array of cloud densities</param>
  1053. public virtual void SendCloudData(float[] cloudDensity)
  1054. {
  1055. Util.FireAndForget(DoSendCloudData, cloudDensity);
  1056. }
  1057. /// <summary>
  1058. /// Send wind layer information to the client.
  1059. /// </summary>
  1060. /// <param name="o"></param>
  1061. private void DoSendWindData(object o)
  1062. {
  1063. Vector2[] windSpeeds = (Vector2[])o;
  1064. TerrainPatch[] patches = new TerrainPatch[2];
  1065. patches[0] = new TerrainPatch();
  1066. patches[0].Data = new float[16 * 16];
  1067. patches[1] = new TerrainPatch();
  1068. patches[1].Data = new float[16 * 16];
  1069. for (int y = 0; y < 16; y++)
  1070. {
  1071. for (int x = 0; x < 16; x++)
  1072. {
  1073. patches[0].Data[y * 16 + x] = windSpeeds[y * 16 + x].X;
  1074. patches[1].Data[y * 16 + x] = windSpeeds[y * 16 + x].Y;
  1075. }
  1076. }
  1077. LayerDataPacket layerpack = TerrainCompressor.CreateLayerDataPacket(patches, TerrainPatch.LayerType.Wind);
  1078. layerpack.Header.Zerocoded = true;
  1079. OutPacket(layerpack, ThrottleOutPacketType.Wind);
  1080. }
  1081. /// <summary>
  1082. /// Send cloud layer information to the client.
  1083. /// </summary>
  1084. /// <param name="o"></param>
  1085. private void DoSendCloudData(object o)
  1086. {
  1087. float[] cloudCover = (float[])o;
  1088. TerrainPatch[] patches = new TerrainPatch[1];
  1089. patches[0] = new TerrainPatch();
  1090. patches[0].Data = new float[16 * 16];
  1091. for (int y = 0; y < 16; y++)
  1092. {
  1093. for (int x = 0; x < 16; x++)
  1094. {
  1095. patches[0].Data[y * 16 + x] = cloudCover[y * 16 + x];
  1096. }
  1097. }
  1098. LayerDataPacket layerpack = TerrainCompressor.CreateLayerDataPacket(patches, TerrainPatch.LayerType.Cloud);
  1099. layerpack.Header.Zerocoded = true;
  1100. OutPacket(layerpack, ThrottleOutPacketType.Cloud);
  1101. }
  1102. /// <summary>
  1103. /// Tell the client that the given neighbour region is ready to receive a child agent.
  1104. /// </summary>
  1105. public virtual void InformClientOfNeighbour(ulong neighbourHandle, IPEndPoint neighbourEndPoint)
  1106. {
  1107. IPAddress neighbourIP = neighbourEndPoint.Address;
  1108. ushort neighbourPort = (ushort)neighbourEndPoint.Port;
  1109. EnableSimulatorPacket enablesimpacket = (EnableSimulatorPacket)PacketPool.Instance.GetPacket(PacketType.EnableSimulator);
  1110. // TODO: don't create new blocks if recycling an old packet
  1111. enablesimpacket.SimulatorInfo = new EnableSimulatorPacket.SimulatorInfoBlock();
  1112. enablesimpacket.SimulatorInfo.Handle = neighbourHandle;
  1113. byte[] byteIP = neighbourIP.GetAddressBytes();
  1114. enablesimpacket.SimulatorInfo.IP = (uint)byteIP[3] << 24;
  1115. enablesimpacket.SimulatorInfo.IP += (uint)byteIP[2] << 16;
  1116. enablesimpacket.SimulatorInfo.IP += (uint)byteIP[1] << 8;
  1117. enablesimpacket.SimulatorInfo.IP += (uint)byteIP[0];
  1118. enablesimpacket.SimulatorInfo.Port = neighbourPort;
  1119. enablesimpacket.Header.Reliable = true; // ESP's should be reliable.
  1120. OutPacket(enablesimpacket, ThrottleOutPacketType.Task);
  1121. }
  1122. public AgentCircuitData RequestClientInfo()
  1123. {
  1124. AgentCircuitData agentData = new AgentCircuitData();
  1125. agentData.AgentID = AgentId;
  1126. agentData.SessionID = m_sessionId;
  1127. agentData.SecureSessionID = SecureSessionId;
  1128. agentData.circuitcode = m_circuitCode;
  1129. agentData.child = false;
  1130. agentData.firstname = m_firstName;
  1131. agentData.lastname = m_lastName;
  1132. ICapabilitiesModule capsModule = m_scene.RequestModuleInterface<ICapabilitiesModule>();
  1133. if (capsModule == null) // can happen when shutting down.
  1134. return agentData;
  1135. agentData.CapsPath = capsModule.GetCapsPath(m_agentId);
  1136. agentData.ChildrenCapSeeds = new Dictionary<ulong, string>(capsModule.GetChildrenSeeds(m_agentId));
  1137. return agentData;
  1138. }
  1139. public virtual void CrossRegion(ulong newRegionHandle, Vector3 pos, Vector3 lookAt, IPEndPoint externalIPEndPoint,
  1140. string capsURL)
  1141. {
  1142. Vector3 look = new Vector3(lookAt.X * 10, lookAt.Y * 10, lookAt.Z * 10);
  1143. //CrossedRegionPacket newSimPack = (CrossedRegionPacket)PacketPool.Instance.GetPacket(PacketType.CrossedRegion);
  1144. CrossedRegionPacket newSimPack = new CrossedRegionPacket();
  1145. // TODO: don't create new blocks if recycling an old packet
  1146. newSimPack.AgentData = new CrossedRegionPacket.AgentDataBlock();
  1147. newSimPack.AgentData.AgentID = AgentId;
  1148. newSimPack.AgentData.SessionID = m_sessionId;
  1149. newSimPack.Info = new CrossedRegionPacket.InfoBlock();
  1150. newSimPack.Info.Position = pos;
  1151. newSimPack.Info.LookAt = look;
  1152. newSimPack.RegionData = new CrossedRegionPacket.RegionDataBlock();
  1153. newSimPack.RegionData.RegionHandle = newRegionHandle;
  1154. byte[] byteIP = externalIPEndPoint.Address.GetAddressBytes();
  1155. newSimPack.RegionData.SimIP = (uint)byteIP[3] << 24;
  1156. newSimPack.RegionData.SimIP += (uint)byteIP[2] << 16;
  1157. newSimPack.RegionData.SimIP += (uint)byteIP[1] << 8;
  1158. newSimPack.RegionData.SimIP += (uint)byteIP[0];
  1159. newSimPack.RegionData.SimPort = (ushort)externalIPEndPoint.Port;
  1160. newSimPack.RegionData.SeedCapability = Util.StringToBytes256(capsURL);
  1161. // Hack to get this out immediately and skip throttles
  1162. OutPacket(newSimPack, ThrottleOutPacketType.Unknown);
  1163. }
  1164. internal void SendMapBlockSplit(List<MapBlockData> mapBlocks, uint flag)
  1165. {
  1166. MapBlockReplyPacket mapReply = (MapBlockReplyPacket)PacketPool.Instance.GetPacket(PacketType.MapBlockReply);
  1167. // TODO: don't create new blocks if recycling an old packet
  1168. MapBlockData[] mapBlocks2 = mapBlocks.ToArray();
  1169. mapReply.AgentData.AgentID = AgentId;
  1170. mapReply.Data = new MapBlockReplyPacket.DataBlock[mapBlocks2.Length];
  1171. mapReply.AgentData.Flags = flag;
  1172. for (int i = 0; i < mapBlocks2.Length; i++)
  1173. {
  1174. mapReply.Data[i] = new MapBlockReplyPacket.DataBlock();
  1175. mapReply.Data[i].MapImageID = mapBlocks2[i].MapImageId;
  1176. //m_log.Warn(mapBlocks2[i].MapImageId.ToString());
  1177. mapReply.Data[i].X = mapBlocks2[i].X;
  1178. mapReply.Data[i].Y = mapBlocks2[i].Y;
  1179. mapReply.Data[i].WaterHeight = mapBlocks2[i].WaterHeight;
  1180. mapReply.Data[i].Name = Utils.StringToBytes(mapBlocks2[i].Name);
  1181. mapReply.Data[i].RegionFlags = mapBlocks2[i].RegionFlags;
  1182. mapReply.Data[i].Access = mapBlocks2[i].Access;
  1183. mapReply.Data[i].Agents = mapBlocks2[i].Agents;
  1184. }
  1185. OutPacket(mapReply, ThrottleOutPacketType.Land);
  1186. }
  1187. public void SendMapBlock(List<MapBlockData> mapBlocks, uint flag)
  1188. {
  1189. MapBlockData[] mapBlocks2 = mapBlocks.ToArray();
  1190. int maxsend = 10;
  1191. //int packets = Math.Ceiling(mapBlocks2.Length / maxsend);
  1192. List<MapBlockData> sendingBlocks = new List<MapBlockData>();
  1193. for (int i = 0; i < mapBlocks2.Length; i++)
  1194. {
  1195. sendingBlocks.Add(mapBlocks2[i]);
  1196. if (((i + 1) == mapBlocks2.Length) || (((i + 1) % maxsend) == 0))
  1197. {
  1198. SendMapBlockSplit(sendingBlocks, flag);
  1199. sendingBlocks = new List<MapBlockData>();
  1200. }
  1201. }
  1202. }
  1203. public void SendLocalTeleport(Vector3 position, Vector3 lookAt, uint flags)
  1204. {
  1205. TeleportLocalPacket tpLocal = (TeleportLocalPacket)PacketPool.Instance.GetPacket(PacketType.TeleportLocal);
  1206. tpLocal.Info.AgentID = AgentId;
  1207. tpLocal.Info.TeleportFlags = flags;
  1208. tpLocal.Info.LocationID = 2;
  1209. tpLocal.Info.LookAt = lookAt;
  1210. tpLocal.Info.Position = position;
  1211. // Hack to get this out immediately and skip throttles
  1212. OutPacket(tpLocal, ThrottleOutPacketType.Unknown);
  1213. }
  1214. public virtual void SendRegionTeleport(ulong regionHandle, byte simAccess, IPEndPoint newRegionEndPoint, uint locationID,
  1215. uint flags, string capsURL)
  1216. {
  1217. //TeleportFinishPacket teleport = (TeleportFinishPacket)PacketPool.Instance.GetPacket(PacketType.TeleportFinish);
  1218. TeleportFinishPacket teleport = new TeleportFinishPacket();
  1219. teleport.Info.AgentID = AgentId;
  1220. teleport.Info.RegionHandle = regionHandle;
  1221. teleport.Info.SimAccess = simAccess;
  1222. teleport.Info.SeedCapability = Util.StringToBytes256(capsURL);
  1223. IPAddress oIP = newRegionEndPoint.Address;
  1224. byte[] byteIP = oIP.GetAddressBytes();
  1225. uint ip = (uint)byteIP[3] << 24;
  1226. ip += (uint)byteIP[2] << 16;
  1227. ip += (uint)byteIP[1] << 8;
  1228. ip += (uint)byteIP[0];
  1229. teleport.Info.SimIP = ip;
  1230. teleport.Info.SimPort = (ushort)newRegionEndPoint.Port;
  1231. teleport.Info.LocationID = 4;
  1232. teleport.Info.TeleportFlags = 1 << 4;
  1233. // Hack to get this out immediately and skip throttles.
  1234. OutPacket(teleport, ThrottleOutPacketType.Unknown);
  1235. }
  1236. /// <summary>
  1237. /// Inform the client that a teleport attempt has failed
  1238. /// </summary>
  1239. public void SendTeleportFailed(string reason)
  1240. {
  1241. TeleportFailedPacket tpFailed = (TeleportFailedPacket)PacketPool.Instance.GetPacket(PacketType.TeleportFailed);
  1242. tpFailed.Info.AgentID = AgentId;
  1243. tpFailed.Info.Reason = Util.StringToBytes256(reason);
  1244. tpFailed.AlertInfo = new TeleportFailedPacket.AlertInfoBlock[0];
  1245. // Hack to get this out immediately and skip throttles
  1246. OutPacket(tpFailed, ThrottleOutPacketType.Unknown);
  1247. }
  1248. /// <summary>
  1249. ///
  1250. /// </summary>
  1251. public void SendTeleportLocationStart()
  1252. {
  1253. //TeleportStartPacket tpStart = (TeleportStartPacket)PacketPool.Instance.GetPacket(PacketType.TeleportStart);
  1254. TeleportStartPacket tpStart = new TeleportStartPacket();
  1255. tpStart.Info.TeleportFlags = 16; // Teleport via location
  1256. // Hack to get this out immediately and skip throttles
  1257. OutPacket(tpStart, ThrottleOutPacketType.Unknown);
  1258. }
  1259. public void SendMoneyBalance(UUID transaction, bool success, byte[] description, int balance)
  1260. {
  1261. MoneyBalanceReplyPacket money = (MoneyBalanceReplyPacket)PacketPool.Instance.GetPacket(PacketType.MoneyBalanceReply);
  1262. money.MoneyData.AgentID = AgentId;
  1263. money.MoneyData.TransactionID = transaction;
  1264. money.MoneyData.TransactionSuccess = success;
  1265. money.MoneyData.Description = description;
  1266. money.MoneyData.MoneyBalance = balance;
  1267. OutPacket(money, ThrottleOutPacketType.Task);
  1268. }
  1269. public void SendPayPrice(UUID objectID, int[] payPrice)
  1270. {
  1271. if (payPrice[0] == 0 &&
  1272. payPrice[1] == 0 &&
  1273. payPrice[2] == 0 &&
  1274. payPrice[3] == 0 &&
  1275. payPrice[4] == 0)
  1276. return;
  1277. PayPriceReplyPacket payPriceReply = (PayPriceReplyPacket)PacketPool.Instance.GetPacket(PacketType.PayPriceReply);
  1278. payPriceReply.ObjectData.ObjectID = objectID;
  1279. payPriceReply.ObjectData.DefaultPayPrice = payPrice[0];
  1280. payPriceReply.ButtonData = new PayPriceReplyPacket.ButtonDataBlock[4];
  1281. payPriceReply.ButtonData[0] = new PayPriceReplyPacket.ButtonDataBlock();
  1282. payPriceReply.ButtonData[0].PayButton = payPrice[1];
  1283. payPriceReply.ButtonData[1] = new PayPriceReplyPacket.ButtonDataBlock();
  1284. payPriceReply.ButtonData[1].PayButton = payPrice[2];
  1285. payPriceReply.ButtonData[2] = new PayPriceReplyPacket.ButtonDataBlock();
  1286. payPriceReply.ButtonData[2].PayButton = payPrice[3];
  1287. payPriceReply.ButtonData[3] = new PayPriceReplyPacket.ButtonDataBlock();
  1288. payPriceReply.ButtonData[3].PayButton = payPrice[4];
  1289. OutPacket(payPriceReply, ThrottleOutPacketType.Task);
  1290. }
  1291. public void SendStartPingCheck(byte seq)
  1292. {
  1293. StartPingCheckPacket pc = (StartPingCheckPacket)PacketPool.Instance.GetPacket(PacketType.StartPingCheck);
  1294. pc.Header.Reliable = false;
  1295. pc.PingID.PingID = seq;
  1296. // We *could* get OldestUnacked, but it would hurt performance and not provide any benefit
  1297. pc.PingID.OldestUnacked = 0;
  1298. OutPacket(pc, ThrottleOutPacketType.Unknown);
  1299. }
  1300. public void SendKillObject(ulong regionHandle, uint localID)
  1301. {
  1302. KillObjectPacket kill = (KillObjectPacket)PacketPool.Instance.GetPacket(PacketType.KillObject);
  1303. // TODO: don't create new blocks if recycling an old packet
  1304. kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
  1305. kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
  1306. kill.ObjectData[0].ID = localID;
  1307. kill.Header.Reliable = true;
  1308. kill.Header.Zerocoded = true;
  1309. OutPacket(kill, ThrottleOutPacketType.State);
  1310. }
  1311. /// <summary>
  1312. /// Send information about the items contained in a folder to the client.
  1313. ///
  1314. /// XXX This method needs some refactoring loving
  1315. /// </summary>
  1316. /// <param name="ownerID">The owner of the folder</param>
  1317. /// <param name="folderID">The id of the folder</param>
  1318. /// <param name="items">The items contained in the folder identified by folderID</param>
  1319. /// <param name="folders"></param>
  1320. /// <param name="fetchFolders">Do we need to send folder information?</param>
  1321. /// <param name="fetchItems">Do we need to send item information?</param>
  1322. public void SendInventoryFolderDetails(UUID ownerID, UUID folderID, List<InventoryItemBase> items,
  1323. List<InventoryFolderBase> folders, int version,
  1324. bool fetchFolders, bool fetchItems)
  1325. {
  1326. // An inventory descendents packet consists of a single agent section and an inventory details
  1327. // section for each inventory item. The size of each inventory item is approximately 550 bytes.
  1328. // In theory, UDP has a maximum packet size of 64k, so it should be possible to send descendent
  1329. // packets containing metadata for in excess of 100 items. But in practice, there may be other
  1330. // factors (e.g. firewalls) restraining the maximum UDP packet size. See,
  1331. //
  1332. // http://opensimulator.org/mantis/view.php?id=226
  1333. //
  1334. // for one example of this kind of thing. In fact, the Linden servers appear to only send about
  1335. // 6 to 7 items at a time, so let's stick with 6
  1336. int MAX_ITEMS_PER_PACKET = 5;
  1337. int MAX_FOLDERS_PER_PACKET = 6;
  1338. int totalItems = fetchItems ? items.Count : 0;
  1339. int totalFolders = fetchFolders ? folders.Count : 0;
  1340. int itemsSent = 0;
  1341. int foldersSent = 0;
  1342. int foldersToSend = 0;
  1343. int itemsToSend = 0;
  1344. InventoryDescendentsPacket currentPacket = null;
  1345. // Handle empty folders
  1346. //
  1347. if (totalItems == 0 && totalFolders == 0)
  1348. currentPacket = CreateInventoryDescendentsPacket(ownerID, folderID, version, items.Count + folders.Count, 0, 0);
  1349. // To preserve SL compatibility, we will NOT combine folders and items in one packet
  1350. //
  1351. while (itemsSent < totalItems || foldersSent < totalFolders)
  1352. {
  1353. if (currentPacket == null) // Start a new packet
  1354. {
  1355. foldersToSend = totalFolders - foldersSent;
  1356. if (foldersToSend > MAX_FOLDERS_PER_PACKET)
  1357. foldersToSend = MAX_FOLDERS_PER_PACKET;
  1358. if (foldersToSend == 0)
  1359. {
  1360. itemsToSend = totalItems - itemsSent;
  1361. if (itemsToSend > MAX_ITEMS_PER_PACKET)
  1362. itemsToSend = MAX_ITEMS_PER_PACKET;
  1363. }
  1364. currentPacket = CreateInventoryDescendentsPacket(ownerID, folderID, version, items.Count + folders.Count, foldersToSend, itemsToSend);
  1365. }
  1366. if (foldersToSend-- > 0)
  1367. currentPacket.FolderData[foldersSent % MAX_FOLDERS_PER_PACKET] = CreateFolderDataBlock(folders[foldersSent++]);
  1368. else if (itemsToSend-- > 0)
  1369. currentPacket.ItemData[itemsSent % MAX_ITEMS_PER_PACKET] = CreateItemDataBlock(items[itemsSent++]);
  1370. else
  1371. {
  1372. OutPacket(currentPacket, ThrottleOutPacketType.Asset, false);
  1373. currentPacket = null;
  1374. }
  1375. }
  1376. if (currentPacket != null)
  1377. OutPacket(currentPacket, ThrottleOutPacketType.Asset, false);
  1378. }
  1379. private InventoryDescendentsPacket.FolderDataBlock CreateFolderDataBlock(InventoryFolderBase folder)
  1380. {
  1381. InventoryDescendentsPacket.FolderDataBlock newBlock = new InventoryDescendentsPacket.FolderDataBlock();
  1382. newBlock.FolderID = folder.ID;
  1383. newBlock.Name = Util.StringToBytes256(folder.Name);
  1384. newBlock.ParentID = folder.ParentID;
  1385. newBlock.Type = (sbyte)folder.Type;
  1386. return newBlock;
  1387. }
  1388. private InventoryDescendentsPacket.ItemDataBlock CreateItemDataBlock(InventoryItemBase item)
  1389. {
  1390. InventoryDescendentsPacket.ItemDataBlock newBlock = new InventoryDescendentsPacket.ItemDataBlock();
  1391. newBlock.ItemID = item.ID;
  1392. newBlock.AssetID = item.AssetID;
  1393. newBlock.CreatorID = item.CreatorIdAsUuid;
  1394. newBlock.BaseMask = item.BasePermissions;
  1395. newBlock.Description = Util.StringToBytes256(item.Description);
  1396. newBlock.EveryoneMask = item.EveryOnePermissions;
  1397. newBlock.OwnerMask = item.CurrentPermissions;
  1398. newBlock.FolderID = item.Folder;
  1399. newBlock.InvType = (sbyte)item.InvType;
  1400. newBlock.Name = Util.StringToBytes256(item.Name);
  1401. newBlock.NextOwnerMask = item.NextPermissions;
  1402. newBlock.OwnerID = item.Owner;
  1403. newBlock.Type = (sbyte)item.AssetType;
  1404. newBlock.GroupID = item.GroupID;
  1405. newBlock.GroupOwned = item.GroupOwned;
  1406. newBlock.GroupMask = item.GroupPermissions;
  1407. newBlock.CreationDate = item.CreationDate;
  1408. newBlock.SalePrice = item.SalePrice;
  1409. newBlock.SaleType = item.SaleType;
  1410. newBlock.Flags = item.Flags;
  1411. newBlock.CRC =
  1412. Helpers.InventoryCRC(newBlock.CreationDate, newBlock.SaleType,
  1413. newBlock.InvType, newBlock.Type,
  1414. newBlock.AssetID, newBlock.GroupID,
  1415. newBlock.SalePrice,
  1416. newBlock.OwnerID, newBlock.CreatorID,
  1417. newBlock.ItemID, newBlock.FolderID,
  1418. newBlock.EveryoneMask,
  1419. newBlock.Flags, newBlock.OwnerMask,
  1420. newBlock.GroupMask, newBlock.NextOwnerMask);
  1421. return newBlock;
  1422. }
  1423. private void AddNullFolderBlockToDecendentsPacket(ref InventoryDescendentsPacket packet)
  1424. {
  1425. packet.FolderData = new InventoryDescendentsPacket.FolderDataBlock[1];
  1426. packet.FolderData[0] = new InventoryDescendentsPacket.FolderDataBlock();
  1427. packet.FolderData[0].FolderID = UUID.Zero;
  1428. packet.FolderData[0].ParentID = UUID.Zero;
  1429. packet.FolderData[0].Type = -1;
  1430. packet.FolderData[0].Name = new byte[0];
  1431. }
  1432. private void AddNullItemBlockToDescendentsPacket(ref InventoryDescendentsPacket packet)
  1433. {
  1434. packet.ItemData = new InventoryDescendentsPacket.ItemDataBlock[1];
  1435. packet.ItemData[0] = new InventoryDescendentsPacket.ItemDataBlock();
  1436. packet.ItemData[0].ItemID = UUID.Zero;
  1437. packet.ItemData[0].AssetID = UUID.Zero;
  1438. packet.ItemData[0].CreatorID = UUID.Zero;
  1439. packet.ItemData[0].BaseMask = 0;
  1440. packet.ItemData[0].Description = new byte[0];
  1441. packet.ItemData[0].EveryoneMask = 0;
  1442. packet.ItemData[0].OwnerMask = 0;
  1443. packet.ItemData[0].FolderID = UUID.Zero;
  1444. packet.ItemData[0].InvType = (sbyte)0;
  1445. packet.ItemData[0].Name = new byte[0];
  1446. packet.ItemData[0].NextOwnerMask = 0;
  1447. packet.ItemData[0].OwnerID = UUID.Zero;
  1448. packet.ItemData[0].Type = -1;
  1449. packet.ItemData[0].GroupID = UUID.Zero;
  1450. packet.ItemData[0].GroupOwned = false;
  1451. packet.ItemData[0].GroupMask = 0;
  1452. packet.ItemData[0].CreationDate = 0;
  1453. packet.ItemData[0].SalePrice = 0;
  1454. packet.ItemData[0].SaleType = 0;
  1455. packet.ItemData[0].Flags = 0;
  1456. // No need to add CRC
  1457. }
  1458. private InventoryDescendentsPacket CreateInventoryDescendentsPacket(UUID ownerID, UUID folderID, int version, int descendents, int folders, int items)
  1459. {
  1460. InventoryDescendentsPacket descend = (InventoryDescendentsPacket)PacketPool.Instance.GetPacket(PacketType.InventoryDescendents);
  1461. descend.Header.Zerocoded = true;
  1462. descend.AgentData.AgentID = AgentId;
  1463. descend.AgentData.OwnerID = ownerID;
  1464. descend.AgentData.FolderID = folderID;
  1465. descend.AgentData.Version = version;
  1466. descend.AgentData.Descendents = descendents;
  1467. if (folders > 0)
  1468. descend.FolderData = new InventoryDescendentsPacket.FolderDataBlock[folders];
  1469. else
  1470. AddNullFolderBlockToDecendentsPacket(ref descend);
  1471. if (items > 0)
  1472. descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[items];
  1473. else
  1474. AddNullItemBlockToDescendentsPacket(ref descend);
  1475. return descend;
  1476. }
  1477. public void SendInventoryItemDetails(UUID ownerID, InventoryItemBase item)
  1478. {
  1479. const uint FULL_MASK_PERMISSIONS = (uint)PermissionMask.All;
  1480. FetchInventoryReplyPacket inventoryReply = (FetchInventoryReplyPacket)PacketPool.Instance.GetPacket(PacketType.FetchInventoryReply);
  1481. // TODO: don't create new blocks if recycling an old packet
  1482. inventoryReply.AgentData.AgentID = AgentId;
  1483. inventoryReply.InventoryData = new FetchInventoryReplyPacket.InventoryDataBlock[1];
  1484. inventoryReply.InventoryData[0] = new FetchInventoryReplyPacket.InventoryDataBlock();
  1485. inventoryReply.InventoryData[0].ItemID = item.ID;
  1486. inventoryReply.InventoryData[0].AssetID = item.AssetID;
  1487. inventoryReply.InventoryData[0].CreatorID = item.CreatorIdAsUuid;
  1488. inventoryReply.InventoryData[0].BaseMask = item.BasePermissions;
  1489. inventoryReply.InventoryData[0].CreationDate = item.CreationDate;
  1490. inventoryReply.InventoryData[0].Description = Util.StringToBytes256(item.Description);
  1491. inventoryReply.InventoryData[0].EveryoneMask = item.EveryOnePermissions;
  1492. inventoryReply.InventoryData[0].FolderID = item.Folder;
  1493. inventoryReply.InventoryData[0].InvType = (sbyte)item.InvType;
  1494. inventoryReply.InventoryData[0].Name = Util.StringToBytes256(item.Name);
  1495. inventoryReply.InventoryData[0].NextOwnerMask = item.NextPermissions;
  1496. inventoryReply.InventoryData[0].OwnerID = item.Owner;
  1497. inventoryReply.InventoryData[0].OwnerMask = item.CurrentPermissions;
  1498. inventoryReply.InventoryData[0].Type = (sbyte)item.AssetType;
  1499. inventoryReply.InventoryData[0].GroupID = item.GroupID;
  1500. inventoryReply.InventoryData[0].GroupOwned = item.GroupOwned;
  1501. inventoryReply.InventoryData[0].GroupMask = item.GroupPermissions;
  1502. inventoryReply.InventoryData[0].Flags = item.Flags;
  1503. inventoryReply.InventoryData[0].SalePrice = item.SalePrice;
  1504. inventoryReply.InventoryData[0].SaleType = item.SaleType;
  1505. inventoryReply.InventoryData[0].CRC =
  1506. Helpers.InventoryCRC(
  1507. 1000, 0, inventoryReply.InventoryData[0].InvType,
  1508. inventoryReply.InventoryData[0].Type, inventoryReply.InventoryData[0].AssetID,
  1509. inventoryReply.InventoryData[0].GroupID, 100,
  1510. inventoryReply.InventoryData[0].OwnerID, inventoryReply.InventoryData[0].CreatorID,
  1511. inventoryReply.InventoryData[0].ItemID, inventoryReply.InventoryData[0].FolderID,
  1512. FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS,
  1513. FULL_MASK_PERMISSIONS);
  1514. inventoryReply.Header.Zerocoded = true;
  1515. OutPacket(inventoryReply, ThrottleOutPacketType.Asset);
  1516. }
  1517. protected void SendBulkUpdateInventoryFolder(InventoryFolderBase folderBase)
  1518. {
  1519. // We will use the same transaction id for all the separate packets to be sent out in this update.
  1520. UUID transactionId = UUID.Random();
  1521. List<BulkUpdateInventoryPacket.FolderDataBlock> folderDataBlocks
  1522. = new List<BulkUpdateInventoryPacket.FolderDataBlock>();
  1523. SendBulkUpdateInventoryFolderRecursive(folderBase, ref folderDataBlocks, transactionId);
  1524. if (folderDataBlocks.Count > 0)
  1525. {
  1526. // We'll end up with some unsent folder blocks if there were some empty folders at the end of the list
  1527. // Send these now
  1528. BulkUpdateInventoryPacket bulkUpdate
  1529. = (BulkUpdateInventoryPacket)PacketPool.Instance.GetPacket(PacketType.BulkUpdateInventory);
  1530. bulkUpdate.Header.Zerocoded = true;
  1531. bulkUpdate.AgentData.AgentID = AgentId;
  1532. bulkUpdate.AgentData.TransactionID = transactionId;
  1533. bulkUpdate.FolderData = folderDataBlocks.ToArray();
  1534. List<BulkUpdateInventoryPacket.ItemDataBlock> foo = new List<BulkUpdateInventoryPacket.ItemDataBlock>();
  1535. bulkUpdate.ItemData = foo.ToArray();
  1536. //m_log.Debug("SendBulkUpdateInventory :" + bulkUpdate);
  1537. OutPacket(bulkUpdate, ThrottleOutPacketType.Asset);
  1538. }
  1539. }
  1540. /// <summary>
  1541. /// Recursively construct bulk update packets to send folders and items
  1542. /// </summary>
  1543. /// <param name="folder"></param>
  1544. /// <param name="folderDataBlocks"></param>
  1545. /// <param name="transactionId"></param>
  1546. private void SendBulkUpdateInventoryFolderRecursive(
  1547. InventoryFolderBase folder, ref List<BulkUpdateInventoryPacket.FolderDataBlock> folderDataBlocks,
  1548. UUID transactionId)
  1549. {
  1550. folderDataBlocks.Add(GenerateBulkUpdateFolderDataBlock(folder));
  1551. const int MAX_ITEMS_PER_PACKET = 5;
  1552. IInventoryService invService = m_scene.RequestModuleInterface<IInventoryService>();
  1553. // If there are any items then we have to start sending them off in this packet - the next folder will have
  1554. // to be in its own bulk update packet. Also, we can only fit 5 items in a packet (at least this was the limit
  1555. // being used on the Linden grid at 20081203).
  1556. InventoryCollection contents = invService.GetFolderContent(AgentId, folder.ID); // folder.RequestListOfItems();
  1557. List<InventoryItemBase> items = contents.Items;
  1558. while (items.Count > 0)
  1559. {
  1560. BulkUpdateInventoryPacket bulkUpdate
  1561. = (BulkUpdateInventoryPacket)PacketPool.Instance.GetPacket(PacketType.BulkUpdateInventory);
  1562. bulkUpdate.Header.Zerocoded = true;
  1563. bulkUpdate.AgentData.AgentID = AgentId;
  1564. bulkUpdate.AgentData.TransactionID = transactionId;
  1565. bulkUpdate.FolderData = folderDataBlocks.ToArray();
  1566. int itemsToSend = (items.Count > MAX_ITEMS_PER_PACKET ? MAX_ITEMS_PER_PACKET : items.Count);
  1567. bulkUpdate.ItemData = new BulkUpdateInventoryPacket.ItemDataBlock[itemsToSend];
  1568. for (int i = 0; i < itemsToSend; i++)
  1569. {
  1570. // Remove from the end of the list so that we don't incur a performance penalty
  1571. bulkUpdate.ItemData[i] = GenerateBulkUpdateItemDataBlock(items[items.Count - 1]);
  1572. items.RemoveAt(items.Count - 1);
  1573. }
  1574. //m_log.Debug("SendBulkUpdateInventoryRecursive :" + bulkUpdate);
  1575. OutPacket(bulkUpdate, ThrottleOutPacketType.Asset);
  1576. folderDataBlocks = new List<BulkUpdateInventoryPacket.FolderDataBlock>();
  1577. // If we're going to be sending another items packet then it needs to contain just the folder to which those
  1578. // items belong.
  1579. if (items.Count > 0)
  1580. folderDataBlocks.Add(GenerateBulkUpdateFolderDataBlock(folder));
  1581. }
  1582. List<InventoryFolderBase> subFolders = contents.Folders;
  1583. foreach (InventoryFolderBase subFolder in subFolders)
  1584. {
  1585. SendBulkUpdateInventoryFolderRecursive(subFolder, ref folderDataBlocks, transactionId);
  1586. }
  1587. }
  1588. /// <summary>
  1589. /// Generate a bulk update inventory data block for the given folder
  1590. /// </summary>
  1591. /// <param name="folder"></param>
  1592. /// <returns></returns>
  1593. private BulkUpdateInventoryPacket.FolderDataBlock GenerateBulkUpdateFolderDataBlock(InventoryFolderBase folder)
  1594. {
  1595. BulkUpdateInventoryPacket.FolderDataBlock folderBlock = new BulkUpdateInventoryPacket.FolderDataBlock();
  1596. folderBlock.FolderID = folder.ID;
  1597. folderBlock.ParentID = folder.ParentID;
  1598. folderBlock.Type = -1;
  1599. folderBlock.Name = Util.StringToBytes256(folder.Name);
  1600. return folderBlock;
  1601. }
  1602. /// <summary>
  1603. /// Generate a bulk update inventory data block for the given item
  1604. /// </summary>
  1605. /// <param name="item"></param>
  1606. /// <returns></returns>
  1607. private BulkUpdateInventoryPacket.ItemDataBlock GenerateBulkUpdateItemDataBlock(InventoryItemBase item)
  1608. {
  1609. BulkUpdateInventoryPacket.ItemDataBlock itemBlock = new BulkUpdateInventoryPacket.ItemDataBlock();
  1610. itemBlock.ItemID = item.ID;
  1611. itemBlock.AssetID = item.AssetID;
  1612. itemBlock.CreatorID = item.CreatorIdAsUuid;
  1613. itemBlock.BaseMask = item.BasePermissions;
  1614. itemBlock.Description = Util.StringToBytes256(item.Description);
  1615. itemBlock.EveryoneMask = item.EveryOnePermissions;
  1616. itemBlock.FolderID = item.Folder;
  1617. itemBlock.InvType = (sbyte)item.InvType;
  1618. itemBlock.Name = Util.StringToBytes256(item.Name);
  1619. itemBlock.NextOwnerMask = item.NextPermissions;
  1620. itemBlock.OwnerID = item.Owner;
  1621. itemBlock.OwnerMask = item.CurrentPermissions;
  1622. itemBlock.Type = (sbyte)item.AssetType;
  1623. itemBlock.GroupID = item.GroupID;
  1624. itemBlock.GroupOwned = item.GroupOwned;
  1625. itemBlock.GroupMask = item.GroupPermissions;
  1626. itemBlock.Flags = item.Flags;
  1627. itemBlock.SalePrice = item.SalePrice;
  1628. itemBlock.SaleType = item.SaleType;
  1629. itemBlock.CreationDate = item.CreationDate;
  1630. itemBlock.CRC =
  1631. Helpers.InventoryCRC(
  1632. 1000, 0, itemBlock.InvType,
  1633. itemBlock.Type, itemBlock.AssetID,
  1634. itemBlock.GroupID, 100,
  1635. itemBlock.OwnerID, itemBlock.CreatorID,
  1636. itemBlock.ItemID, itemBlock.FolderID,
  1637. (uint)PermissionMask.All, 1, (uint)PermissionMask.All, (uint)PermissionMask.All,
  1638. (uint)PermissionMask.All);
  1639. return itemBlock;
  1640. }
  1641. public void SendBulkUpdateInventory(InventoryNodeBase node)
  1642. {
  1643. if (node is InventoryItemBase)
  1644. SendBulkUpdateInventoryItem((InventoryItemBase)node);
  1645. else if (node is InventoryFolderBase)
  1646. SendBulkUpdateInventoryFolder((InventoryFolderBase)node);
  1647. else
  1648. m_log.ErrorFormat("[CLIENT]: Client for {0} sent unknown inventory node named {1}", Name, node.Name);
  1649. }
  1650. protected void SendBulkUpdateInventoryItem(InventoryItemBase item)
  1651. {
  1652. const uint FULL_MASK_PERMISSIONS = (uint)PermissionMask.All;
  1653. BulkUpdateInventoryPacket bulkUpdate
  1654. = (BulkUpdateInventoryPacket)PacketPool.Instance.GetPacket(PacketType.BulkUpdateInventory);
  1655. bulkUpdate.AgentData.AgentID = AgentId;
  1656. bulkUpdate.AgentData.TransactionID = UUID.Random();
  1657. bulkUpdate.FolderData = new BulkUpdateInventoryPacket.FolderDataBlock[1];
  1658. bulkUpdate.FolderData[0] = new BulkUpdateInventoryPacket.FolderDataBlock();
  1659. bulkUpdate.FolderData[0].FolderID = UUID.Zero;
  1660. bulkUpdate.FolderData[0].ParentID = UUID.Zero;
  1661. bulkUpdate.FolderData[0].Type = -1;
  1662. bulkUpdate.FolderData[0].Name = new byte[0];
  1663. bulkUpdate.ItemData = new BulkUpdateInventoryPacket.ItemDataBlock[1];
  1664. bulkUpdate.ItemData[0] = new BulkUpdateInventoryPacket.ItemDataBlock();
  1665. bulkUpdate.ItemData[0].ItemID = item.ID;
  1666. bulkUpdate.ItemData[0].AssetID = item.AssetID;
  1667. bulkUpdate.ItemData[0].CreatorID = item.CreatorIdAsUuid;
  1668. bulkUpdate.ItemData[0].BaseMask = item.BasePermissions;
  1669. bulkUpdate.ItemData[0].CreationDate = item.CreationDate;
  1670. bulkUpdate.ItemData[0].Description = Util.StringToBytes256(item.Description);
  1671. bulkUpdate.ItemData[0].EveryoneMask = item.EveryOnePermissions;
  1672. bulkUpdate.ItemData[0].FolderID = item.Folder;
  1673. bulkUpdate.ItemData[0].InvType = (sbyte)item.InvType;
  1674. bulkUpdate.ItemData[0].Name = Util.StringToBytes256(item.Name);
  1675. bulkUpdate.ItemData[0].NextOwnerMask = item.NextPermissions;
  1676. bulkUpdate.ItemData[0].OwnerID = item.Owner;
  1677. bulkUpdate.ItemData[0].OwnerMask = item.CurrentPermissions;
  1678. bulkUpdate.ItemData[0].Type = (sbyte)item.AssetType;
  1679. bulkUpdate.ItemData[0].GroupID = item.GroupID;
  1680. bulkUpdate.ItemData[0].GroupOwned = item.GroupOwned;
  1681. bulkUpdate.ItemData[0].GroupMask = item.GroupPermissions;
  1682. bulkUpdate.ItemData[0].Flags = item.Flags;
  1683. bulkUpdate.ItemData[0].SalePrice = item.SalePrice;
  1684. bulkUpdate.ItemData[0].SaleType = item.SaleType;
  1685. bulkUpdate.ItemData[0].CRC =
  1686. Helpers.InventoryCRC(1000, 0, bulkUpdate.ItemData[0].InvType,
  1687. bulkUpdate.ItemData[0].Type, bulkUpdate.ItemData[0].AssetID,
  1688. bulkUpdate.ItemData[0].GroupID, 100,
  1689. bulkUpdate.ItemData[0].OwnerID, bulkUpdate.ItemData[0].CreatorID,
  1690. bulkUpdate.ItemData[0].ItemID, bulkUpdate.ItemData[0].FolderID,
  1691. FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS,
  1692. FULL_MASK_PERMISSIONS);
  1693. bulkUpdate.Header.Zerocoded = true;
  1694. OutPacket(bulkUpdate, ThrottleOutPacketType.Asset);
  1695. }
  1696. /// <see>IClientAPI.SendInventoryItemCreateUpdate(InventoryItemBase)</see>
  1697. public void SendInventoryItemCreateUpdate(InventoryItemBase Item, uint callbackId)
  1698. {
  1699. const uint FULL_MASK_PERMISSIONS = (uint)PermissionMask.All;
  1700. UpdateCreateInventoryItemPacket InventoryReply
  1701. = (UpdateCreateInventoryItemPacket)PacketPool.Instance.GetPacket(
  1702. PacketType.UpdateCreateInventoryItem);
  1703. // TODO: don't create new blocks if recycling an old packet
  1704. InventoryReply.AgentData.AgentID = AgentId;
  1705. InventoryReply.AgentData.SimApproved = true;
  1706. InventoryReply.InventoryData = new UpdateCreateInventoryItemPacket.InventoryDataBlock[1];
  1707. InventoryReply.InventoryData[0] = new UpdateCreateInventoryItemPacket.InventoryDataBlock();
  1708. InventoryReply.InventoryData[0].ItemID = Item.ID;
  1709. InventoryReply.InventoryData[0].AssetID = Item.AssetID;
  1710. InventoryReply.InventoryData[0].CreatorID = Item.CreatorIdAsUuid;
  1711. InventoryReply.InventoryData[0].BaseMask = Item.BasePermissions;
  1712. InventoryReply.InventoryData[0].Description = Util.StringToBytes256(Item.Description);
  1713. InventoryReply.InventoryData[0].EveryoneMask = Item.EveryOnePermissions;
  1714. InventoryReply.InventoryData[0].FolderID = Item.Folder;
  1715. InventoryReply.InventoryData[0].InvType = (sbyte)Item.InvType;
  1716. InventoryReply.InventoryData[0].Name = Util.StringToBytes256(Item.Name);
  1717. InventoryReply.InventoryData[0].NextOwnerMask = Item.NextPermissions;
  1718. InventoryReply.InventoryData[0].OwnerID = Item.Owner;
  1719. InventoryReply.InventoryData[0].OwnerMask = Item.CurrentPermissions;
  1720. InventoryReply.InventoryData[0].Type = (sbyte)Item.AssetType;
  1721. InventoryReply.InventoryData[0].CallbackID = callbackId;
  1722. InventoryReply.InventoryData[0].GroupID = Item.GroupID;
  1723. InventoryReply.InventoryData[0].GroupOwned = Item.GroupOwned;
  1724. InventoryReply.InventoryData[0].GroupMask = Item.GroupPermissions;
  1725. InventoryReply.InventoryData[0].Flags = Item.Flags;
  1726. InventoryReply.InventoryData[0].SalePrice = Item.SalePrice;
  1727. InventoryReply.InventoryData[0].SaleType = Item.SaleType;
  1728. InventoryReply.InventoryData[0].CreationDate = Item.CreationDate;
  1729. InventoryReply.InventoryData[0].CRC =
  1730. Helpers.InventoryCRC(1000, 0, InventoryReply.InventoryData[0].InvType,
  1731. InventoryReply.InventoryData[0].Type, InventoryReply.InventoryData[0].AssetID,
  1732. InventoryReply.InventoryData[0].GroupID, 100,
  1733. InventoryReply.InventoryData[0].OwnerID, InventoryReply.InventoryData[0].CreatorID,
  1734. InventoryReply.InventoryData[0].ItemID, InventoryReply.InventoryData[0].FolderID,
  1735. FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS,
  1736. FULL_MASK_PERMISSIONS);
  1737. InventoryReply.Header.Zerocoded = true;
  1738. OutPacket(InventoryReply, ThrottleOutPacketType.Asset);
  1739. }
  1740. public void SendRemoveInventoryItem(UUID itemID)
  1741. {
  1742. RemoveInventoryItemPacket remove = (RemoveInventoryItemPacket)PacketPool.Instance.GetPacket(PacketType.RemoveInventoryItem);
  1743. // TODO: don't create new blocks if recycling an old packet
  1744. remove.AgentData.AgentID = AgentId;
  1745. remove.AgentData.SessionID = m_sessionId;
  1746. remove.InventoryData = new RemoveInventoryItemPacket.InventoryDataBlock[1];
  1747. remove.InventoryData[0] = new RemoveInventoryItemPacket.InventoryDataBlock();
  1748. remove.InventoryData[0].ItemID = itemID;
  1749. remove.Header.Zerocoded = true;
  1750. OutPacket(remove, ThrottleOutPacketType.Asset);
  1751. }
  1752. public void SendTakeControls(int controls, bool passToAgent, bool TakeControls)
  1753. {
  1754. ScriptControlChangePacket scriptcontrol = (ScriptControlChangePacket)PacketPool.Instance.GetPacket(PacketType.ScriptControlChange);
  1755. ScriptControlChangePacket.DataBlock[] data = new ScriptControlChangePacket.DataBlock[1];
  1756. ScriptControlChangePacket.DataBlock ddata = new ScriptControlChangePacket.DataBlock();
  1757. ddata.Controls = (uint)controls;
  1758. ddata.PassToAgent = passToAgent;
  1759. ddata.TakeControls = TakeControls;
  1760. data[0] = ddata;
  1761. scriptcontrol.Data = data;
  1762. OutPacket(scriptcontrol, ThrottleOutPacketType.Task);
  1763. }
  1764. public void SendTaskInventory(UUID taskID, short serial, byte[] fileName)
  1765. {
  1766. ReplyTaskInventoryPacket replytask = (ReplyTaskInventoryPacket)PacketPool.Instance.GetPacket(PacketType.ReplyTaskInventory);
  1767. replytask.InventoryData.TaskID = taskID;
  1768. replytask.InventoryData.Serial = serial;
  1769. replytask.InventoryData.Filename = fileName;
  1770. OutPacket(replytask, ThrottleOutPacketType.Asset);
  1771. }
  1772. public void SendXferPacket(ulong xferID, uint packet, byte[] data)
  1773. {
  1774. SendXferPacketPacket sendXfer = (SendXferPacketPacket)PacketPool.Instance.GetPacket(PacketType.SendXferPacket);
  1775. sendXfer.XferID.ID = xferID;
  1776. sendXfer.XferID.Packet = packet;
  1777. sendXfer.DataPacket.Data = data;
  1778. OutPacket(sendXfer, ThrottleOutPacketType.Asset);
  1779. }
  1780. public void SendEconomyData(float EnergyEfficiency, int ObjectCapacity, int ObjectCount, int PriceEnergyUnit,
  1781. int PriceGroupCreate, int PriceObjectClaim, float PriceObjectRent, float PriceObjectScaleFactor,
  1782. int PriceParcelClaim, float PriceParcelClaimFactor, int PriceParcelRent, int PricePublicObjectDecay,
  1783. int PricePublicObjectDelete, int PriceRentLight, int PriceUpload, int TeleportMinPrice, float TeleportPriceExponent)
  1784. {
  1785. EconomyDataPacket economyData = (EconomyDataPacket)PacketPool.Instance.GetPacket(PacketType.EconomyData);
  1786. economyData.Info.EnergyEfficiency = EnergyEfficiency;
  1787. economyData.Info.ObjectCapacity = ObjectCapacity;
  1788. economyData.Info.ObjectCount = ObjectCount;
  1789. economyData.Info.PriceEnergyUnit = PriceEnergyUnit;
  1790. economyData.Info.PriceGroupCreate = PriceGroupCreate;
  1791. economyData.Info.PriceObjectClaim = PriceObjectClaim;
  1792. economyData.Info.PriceObjectRent = PriceObjectRent;
  1793. economyData.Info.PriceObjectScaleFactor = PriceObjectScaleFactor;
  1794. economyData.Info.PriceParcelClaim = PriceParcelClaim;
  1795. economyData.Info.PriceParcelClaimFactor = PriceParcelClaimFactor;
  1796. economyData.Info.PriceParcelRent = PriceParcelRent;
  1797. economyData.Info.PricePublicObjectDecay = PricePublicObjectDecay;
  1798. economyData.Info.PricePublicObjectDelete = PricePublicObjectDelete;
  1799. economyData.Info.PriceRentLight = PriceRentLight;
  1800. economyData.Info.PriceUpload = PriceUpload;
  1801. economyData.Info.TeleportMinPrice = TeleportMinPrice;
  1802. economyData.Info.TeleportPriceExponent = TeleportPriceExponent;
  1803. economyData.Header.Reliable = true;
  1804. OutPacket(economyData, ThrottleOutPacketType.Task);
  1805. }
  1806. public void SendAvatarPickerReply(AvatarPickerReplyAgentDataArgs AgentData, List<AvatarPickerReplyDataArgs> Data)
  1807. {
  1808. //construct the AvatarPickerReply packet.
  1809. AvatarPickerReplyPacket replyPacket = new AvatarPickerReplyPacket();
  1810. replyPacket.AgentData.AgentID = AgentData.AgentID;
  1811. replyPacket.AgentData.QueryID = AgentData.QueryID;
  1812. //int i = 0;
  1813. List<AvatarPickerReplyPacket.DataBlock> data_block = new List<AvatarPickerReplyPacket.DataBlock>();
  1814. foreach (AvatarPickerReplyDataArgs arg in Data)
  1815. {
  1816. AvatarPickerReplyPacket.DataBlock db = new AvatarPickerReplyPacket.DataBlock();
  1817. db.AvatarID = arg.AvatarID;
  1818. db.FirstName = arg.FirstName;
  1819. db.LastName = arg.LastName;
  1820. data_block.Add(db);
  1821. }
  1822. replyPacket.Data = data_block.ToArray();
  1823. OutPacket(replyPacket, ThrottleOutPacketType.Task);
  1824. }
  1825. public void SendAgentDataUpdate(UUID agentid, UUID activegroupid, string firstname, string lastname, ulong grouppowers, string groupname, string grouptitle)
  1826. {
  1827. m_activeGroupID = activegroupid;
  1828. m_activeGroupName = groupname;
  1829. m_activeGroupPowers = grouppowers;
  1830. AgentDataUpdatePacket sendAgentDataUpdate = (AgentDataUpdatePacket)PacketPool.Instance.GetPacket(PacketType.AgentDataUpdate);
  1831. sendAgentDataUpdate.AgentData.ActiveGroupID = activegroupid;
  1832. sendAgentDataUpdate.AgentData.AgentID = agentid;
  1833. sendAgentDataUpdate.AgentData.FirstName = Util.StringToBytes256(firstname);
  1834. sendAgentDataUpdate.AgentData.GroupName = Util.StringToBytes256(groupname);
  1835. sendAgentDataUpdate.AgentData.GroupPowers = grouppowers;
  1836. sendAgentDataUpdate.AgentData.GroupTitle = Util.StringToBytes256(grouptitle);
  1837. sendAgentDataUpdate.AgentData.LastName = Util.StringToBytes256(lastname);
  1838. OutPacket(sendAgentDataUpdate, ThrottleOutPacketType.Task);
  1839. }
  1840. /// <summary>
  1841. /// Send an alert message to the client. On the Linden client (tested 1.19.1.4), this pops up a brief duration
  1842. /// blue information box in the bottom right hand corner.
  1843. /// </summary>
  1844. /// <param name="message"></param>
  1845. public void SendAlertMessage(string message)
  1846. {
  1847. AlertMessagePacket alertPack = (AlertMessagePacket)PacketPool.Instance.GetPacket(PacketType.AlertMessage);
  1848. alertPack.AlertData = new AlertMessagePacket.AlertDataBlock();
  1849. alertPack.AlertData.Message = Util.StringToBytes256(message);
  1850. alertPack.AlertInfo = new AlertMessagePacket.AlertInfoBlock[0];
  1851. OutPacket(alertPack, ThrottleOutPacketType.Task);
  1852. }
  1853. /// <summary>
  1854. /// Send an agent alert message to the client.
  1855. /// </summary>
  1856. /// <param name="message"></param>
  1857. /// <param name="modal">On the linden client, if this true then it displays a one button text box placed in the
  1858. /// middle of the window. If false, the message is displayed in a brief duration blue information box (as for
  1859. /// the AlertMessage packet).</param>
  1860. public void SendAgentAlertMessage(string message, bool modal)
  1861. {
  1862. OutPacket(BuildAgentAlertPacket(message, modal), ThrottleOutPacketType.Task);
  1863. }
  1864. /// <summary>
  1865. /// Construct an agent alert packet
  1866. /// </summary>
  1867. /// <param name="message"></param>
  1868. /// <param name="modal"></param>
  1869. /// <returns></returns>
  1870. public AgentAlertMessagePacket BuildAgentAlertPacket(string message, bool modal)
  1871. {
  1872. AgentAlertMessagePacket alertPack = (AgentAlertMessagePacket)PacketPool.Instance.GetPacket(PacketType.AgentAlertMessage);
  1873. alertPack.AgentData.AgentID = AgentId;
  1874. alertPack.AlertData.Message = Util.StringToBytes256(message);
  1875. alertPack.AlertData.Modal = modal;
  1876. return alertPack;
  1877. }
  1878. public void SendLoadURL(string objectname, UUID objectID, UUID ownerID, bool groupOwned, string message,
  1879. string url)
  1880. {
  1881. LoadURLPacket loadURL = (LoadURLPacket)PacketPool.Instance.GetPacket(PacketType.LoadURL);
  1882. loadURL.Data.ObjectName = Util.StringToBytes256(objectname);
  1883. loadURL.Data.ObjectID = objectID;
  1884. loadURL.Data.OwnerID = ownerID;
  1885. loadURL.Data.OwnerIsGroup = groupOwned;
  1886. loadURL.Data.Message = Util.StringToBytes256(message);
  1887. loadURL.Data.URL = Util.StringToBytes256(url);
  1888. OutPacket(loadURL, ThrottleOutPacketType.Task);
  1889. }
  1890. public void SendDialog(string objectname, UUID objectID, string ownerFirstName, string ownerLastName, string msg, UUID textureID, int ch, string[] buttonlabels)
  1891. {
  1892. ScriptDialogPacket dialog = (ScriptDialogPacket)PacketPool.Instance.GetPacket(PacketType.ScriptDialog);
  1893. dialog.Data.ObjectID = objectID;
  1894. dialog.Data.ObjectName = Util.StringToBytes256(objectname);
  1895. // this is the username of the *owner*
  1896. dialog.Data.FirstName = Util.StringToBytes256(ownerFirstName);
  1897. dialog.Data.LastName = Util.StringToBytes256(ownerLastName);
  1898. dialog.Data.Message = Util.StringToBytes1024(msg);
  1899. dialog.Data.ImageID = textureID;
  1900. dialog.Data.ChatChannel = ch;
  1901. ScriptDialogPacket.ButtonsBlock[] buttons = new ScriptDialogPacket.ButtonsBlock[buttonlabels.Length];
  1902. for (int i = 0; i < buttonlabels.Length; i++)
  1903. {
  1904. buttons[i] = new ScriptDialogPacket.ButtonsBlock();
  1905. buttons[i].ButtonLabel = Util.StringToBytes256(buttonlabels[i]);
  1906. }
  1907. dialog.Buttons = buttons;
  1908. OutPacket(dialog, ThrottleOutPacketType.Task);
  1909. }
  1910. public void SendPreLoadSound(UUID objectID, UUID ownerID, UUID soundID)
  1911. {
  1912. PreloadSoundPacket preSound = (PreloadSoundPacket)PacketPool.Instance.GetPacket(PacketType.PreloadSound);
  1913. // TODO: don't create new blocks if recycling an old packet
  1914. preSound.DataBlock = new PreloadSoundPacket.DataBlockBlock[1];
  1915. preSound.DataBlock[0] = new PreloadSoundPacket.DataBlockBlock();
  1916. preSound.DataBlock[0].ObjectID = objectID;
  1917. preSound.DataBlock[0].OwnerID = ownerID;
  1918. preSound.DataBlock[0].SoundID = soundID;
  1919. preSound.Header.Zerocoded = true;
  1920. OutPacket(preSound, ThrottleOutPacketType.Task);
  1921. }
  1922. public void SendPlayAttachedSound(UUID soundID, UUID objectID, UUID ownerID, float gain, byte flags)
  1923. {
  1924. AttachedSoundPacket sound = (AttachedSoundPacket)PacketPool.Instance.GetPacket(PacketType.AttachedSound);
  1925. sound.DataBlock.SoundID = soundID;
  1926. sound.DataBlock.ObjectID = objectID;
  1927. sound.DataBlock.OwnerID = ownerID;
  1928. sound.DataBlock.Gain = gain;
  1929. sound.DataBlock.Flags = flags;
  1930. OutPacket(sound, ThrottleOutPacketType.Task);
  1931. }
  1932. public void SendTriggeredSound(UUID soundID, UUID ownerID, UUID objectID, UUID parentID, ulong handle, Vector3 position, float gain)
  1933. {
  1934. SoundTriggerPacket sound = (SoundTriggerPacket)PacketPool.Instance.GetPacket(PacketType.SoundTrigger);
  1935. sound.SoundData.SoundID = soundID;
  1936. sound.SoundData.OwnerID = ownerID;
  1937. sound.SoundData.ObjectID = objectID;
  1938. sound.SoundData.ParentID = parentID;
  1939. sound.SoundData.Handle = handle;
  1940. sound.SoundData.Position = position;
  1941. sound.SoundData.Gain = gain;
  1942. OutPacket(sound, ThrottleOutPacketType.Task);
  1943. }
  1944. public void SendAttachedSoundGainChange(UUID objectID, float gain)
  1945. {
  1946. AttachedSoundGainChangePacket sound = (AttachedSoundGainChangePacket)PacketPool.Instance.GetPacket(PacketType.AttachedSoundGainChange);
  1947. sound.DataBlock.ObjectID = objectID;
  1948. sound.DataBlock.Gain = gain;
  1949. OutPacket(sound, ThrottleOutPacketType.Task);
  1950. }
  1951. public void SendSunPos(Vector3 Position, Vector3 Velocity, ulong CurrentTime, uint SecondsPerSunCycle, uint SecondsPerYear, float OrbitalPosition)
  1952. {
  1953. // Viewers based on the Linden viwer code, do wacky things for oribital positions from Midnight to Sunrise
  1954. // So adjust for that
  1955. // Contributed by: Godfrey
  1956. if (OrbitalPosition > m_sunPainDaHalfOrbitalCutoff) // things get weird from midnight to sunrise
  1957. {
  1958. OrbitalPosition = (OrbitalPosition - m_sunPainDaHalfOrbitalCutoff) * 0.6666666667f + m_sunPainDaHalfOrbitalCutoff;
  1959. }
  1960. SimulatorViewerTimeMessagePacket viewertime = (SimulatorViewerTimeMessagePacket)PacketPool.Instance.GetPacket(PacketType.SimulatorViewerTimeMessage);
  1961. viewertime.TimeInfo.SunDirection = Position;
  1962. viewertime.TimeInfo.SunAngVelocity = Velocity;
  1963. // Sun module used to add 6 hours to adjust for linden sun hour, adding here
  1964. // to prevent existing code from breaking if it assumed that 6 hours were included.
  1965. // 21600 == 6 hours * 60 minutes * 60 Seconds
  1966. viewertime.TimeInfo.UsecSinceStart = CurrentTime + 21600;
  1967. viewertime.TimeInfo.SecPerDay = SecondsPerSunCycle;
  1968. viewertime.TimeInfo.SecPerYear = SecondsPerYear;
  1969. viewertime.TimeInfo.SunPhase = OrbitalPosition;
  1970. viewertime.Header.Reliable = false;
  1971. viewertime.Header.Zerocoded = true;
  1972. OutPacket(viewertime, ThrottleOutPacketType.Task);
  1973. }
  1974. // Currently Deprecated
  1975. public void SendViewerTime(int phase)
  1976. {
  1977. /*
  1978. Console.WriteLine("SunPhase: {0}", phase);
  1979. SimulatorViewerTimeMessagePacket viewertime = (SimulatorViewerTimeMessagePacket)PacketPool.Instance.GetPacket(PacketType.SimulatorViewerTimeMessage);
  1980. //viewertime.TimeInfo.SecPerDay = 86400;
  1981. //viewertime.TimeInfo.SecPerYear = 31536000;
  1982. viewertime.TimeInfo.SecPerDay = 1000;
  1983. viewertime.TimeInfo.SecPerYear = 365000;
  1984. viewertime.TimeInfo.SunPhase = 1;
  1985. int sunPhase = (phase + 2) / 2;
  1986. if ((sunPhase < 6) || (sunPhase > 36))
  1987. {
  1988. viewertime.TimeInfo.SunDirection = new Vector3(0f, 0.8f, -0.8f);
  1989. Console.WriteLine("sending night");
  1990. }
  1991. else
  1992. {
  1993. if (sunPhase < 12)
  1994. {
  1995. sunPhase = 12;
  1996. }
  1997. sunPhase = sunPhase - 12;
  1998. float yValue = 0.1f * (sunPhase);
  1999. Console.WriteLine("Computed SunPhase: {0}, yValue: {1}", sunPhase, yValue);
  2000. if (yValue > 1.2f)
  2001. {
  2002. yValue = yValue - 1.2f;
  2003. }
  2004. yValue = Util.Clip(yValue, 0, 1);
  2005. if (sunPhase < 14)
  2006. {
  2007. yValue = 1 - yValue;
  2008. }
  2009. if (sunPhase < 12)
  2010. {
  2011. yValue *= -1;
  2012. }
  2013. viewertime.TimeInfo.SunDirection = new Vector3(0f, yValue, 0.3f);
  2014. Console.WriteLine("sending sun update " + yValue);
  2015. }
  2016. viewertime.TimeInfo.SunAngVelocity = new Vector3(0, 0.0f, 10.0f);
  2017. viewertime.TimeInfo.UsecSinceStart = (ulong)Util.UnixTimeSinceEpoch();
  2018. viewertime.Header.Reliable = false;
  2019. OutPacket(viewertime, ThrottleOutPacketType.Task);
  2020. */
  2021. }
  2022. public void SendViewerEffect(ViewerEffectPacket.EffectBlock[] effectBlocks)
  2023. {
  2024. ViewerEffectPacket packet = (ViewerEffectPacket)PacketPool.Instance.GetPacket(PacketType.ViewerEffect);
  2025. packet.Header.Reliable = false;
  2026. packet.Header.Zerocoded = true;
  2027. packet.AgentData.AgentID = AgentId;
  2028. packet.AgentData.SessionID = SessionId;
  2029. packet.Effect = effectBlocks;
  2030. OutPacket(packet, ThrottleOutPacketType.State);
  2031. }
  2032. public void SendAvatarProperties(UUID avatarID, string aboutText, string bornOn, Byte[] charterMember,
  2033. string flAbout, uint flags, UUID flImageID, UUID imageID, string profileURL,
  2034. UUID partnerID)
  2035. {
  2036. AvatarPropertiesReplyPacket avatarReply = (AvatarPropertiesReplyPacket)PacketPool.Instance.GetPacket(PacketType.AvatarPropertiesReply);
  2037. avatarReply.AgentData.AgentID = AgentId;
  2038. avatarReply.AgentData.AvatarID = avatarID;
  2039. if (aboutText != null)
  2040. avatarReply.PropertiesData.AboutText = Util.StringToBytes1024(aboutText);
  2041. else
  2042. avatarReply.PropertiesData.AboutText = Utils.EmptyBytes;
  2043. avatarReply.PropertiesData.BornOn = Util.StringToBytes256(bornOn);
  2044. avatarReply.PropertiesData.CharterMember = charterMember;
  2045. if (flAbout != null)
  2046. avatarReply.PropertiesData.FLAboutText = Util.StringToBytes256(flAbout);
  2047. else
  2048. avatarReply.PropertiesData.FLAboutText = Utils.EmptyBytes;
  2049. avatarReply.PropertiesData.Flags = flags;
  2050. avatarReply.PropertiesData.FLImageID = flImageID;
  2051. avatarReply.PropertiesData.ImageID = imageID;
  2052. avatarReply.PropertiesData.ProfileURL = Util.StringToBytes256(profileURL);
  2053. avatarReply.PropertiesData.PartnerID = partnerID;
  2054. OutPacket(avatarReply, ThrottleOutPacketType.Task);
  2055. }
  2056. /// <summary>
  2057. /// Send the client an Estate message blue box pop-down with a single OK button
  2058. /// </summary>
  2059. /// <param name="FromAvatarID"></param>
  2060. /// <param name="fromSessionID"></param>
  2061. /// <param name="FromAvatarName"></param>
  2062. /// <param name="Message"></param>
  2063. public void SendBlueBoxMessage(UUID FromAvatarID, String FromAvatarName, String Message)
  2064. {
  2065. if (!ChildAgentStatus())
  2066. SendInstantMessage(new GridInstantMessage(null, FromAvatarID, FromAvatarName, AgentId, 1, Message, false, new Vector3()));
  2067. //SendInstantMessage(FromAvatarID, fromSessionID, Message, AgentId, SessionId, FromAvatarName, (byte)21,(uint) Util.UnixTimeSinceEpoch());
  2068. }
  2069. public void SendLogoutPacket()
  2070. {
  2071. // I know this is a bit of a hack, however there are times when you don't
  2072. // want to send this, but still need to do the rest of the shutdown process
  2073. // this method gets called from the packet server.. which makes it practically
  2074. // impossible to do any other way.
  2075. if (m_SendLogoutPacketWhenClosing)
  2076. {
  2077. LogoutReplyPacket logReply = (LogoutReplyPacket)PacketPool.Instance.GetPacket(PacketType.LogoutReply);
  2078. // TODO: don't create new blocks if recycling an old packet
  2079. logReply.AgentData.AgentID = AgentId;
  2080. logReply.AgentData.SessionID = SessionId;
  2081. logReply.InventoryData = new LogoutReplyPacket.InventoryDataBlock[1];
  2082. logReply.InventoryData[0] = new LogoutReplyPacket.InventoryDataBlock();
  2083. logReply.InventoryData[0].ItemID = UUID.Zero;
  2084. OutPacket(logReply, ThrottleOutPacketType.Task);
  2085. }
  2086. }
  2087. public void SendHealth(float health)
  2088. {
  2089. HealthMessagePacket healthpacket = (HealthMessagePacket)PacketPool.Instance.GetPacket(PacketType.HealthMessage);
  2090. healthpacket.HealthData.Health = health;
  2091. OutPacket(healthpacket, ThrottleOutPacketType.Task);
  2092. }
  2093. public void SendAgentOnline(UUID[] agentIDs)
  2094. {
  2095. OnlineNotificationPacket onp = new OnlineNotificationPacket();
  2096. OnlineNotificationPacket.AgentBlockBlock[] onpb = new OnlineNotificationPacket.AgentBlockBlock[agentIDs.Length];
  2097. for (int i = 0; i < agentIDs.Length; i++)
  2098. {
  2099. OnlineNotificationPacket.AgentBlockBlock onpbl = new OnlineNotificationPacket.AgentBlockBlock();
  2100. onpbl.AgentID = agentIDs[i];
  2101. onpb[i] = onpbl;
  2102. }
  2103. onp.AgentBlock = onpb;
  2104. onp.Header.Reliable = true;
  2105. OutPacket(onp, ThrottleOutPacketType.Task);
  2106. }
  2107. public void SendAgentOffline(UUID[] agentIDs)
  2108. {
  2109. OfflineNotificationPacket offp = new OfflineNotificationPacket();
  2110. OfflineNotificationPacket.AgentBlockBlock[] offpb = new OfflineNotificationPacket.AgentBlockBlock[agentIDs.Length];
  2111. for (int i = 0; i < agentIDs.Length; i++)
  2112. {
  2113. OfflineNotificationPacket.AgentBlockBlock onpbl = new OfflineNotificationPacket.AgentBlockBlock();
  2114. onpbl.AgentID = agentIDs[i];
  2115. offpb[i] = onpbl;
  2116. }
  2117. offp.AgentBlock = offpb;
  2118. offp.Header.Reliable = true;
  2119. OutPacket(offp, ThrottleOutPacketType.Task);
  2120. }
  2121. public void SendSitResponse(UUID TargetID, Vector3 OffsetPos, Quaternion SitOrientation, bool autopilot,
  2122. Vector3 CameraAtOffset, Vector3 CameraEyeOffset, bool ForceMouseLook)
  2123. {
  2124. AvatarSitResponsePacket avatarSitResponse = new AvatarSitResponsePacket();
  2125. avatarSitResponse.SitObject.ID = TargetID;
  2126. if (CameraAtOffset != Vector3.Zero)
  2127. {
  2128. avatarSitResponse.SitTransform.CameraAtOffset = CameraAtOffset;
  2129. avatarSitResponse.SitTransform.CameraEyeOffset = CameraEyeOffset;
  2130. }
  2131. avatarSitResponse.SitTransform.ForceMouselook = ForceMouseLook;
  2132. avatarSitResponse.SitTransform.AutoPilot = autopilot;
  2133. avatarSitResponse.SitTransform.SitPosition = OffsetPos;
  2134. avatarSitResponse.SitTransform.SitRotation = SitOrientation;
  2135. OutPacket(avatarSitResponse, ThrottleOutPacketType.Task);
  2136. }
  2137. public void SendAdminResponse(UUID Token, uint AdminLevel)
  2138. {
  2139. GrantGodlikePowersPacket respondPacket = new GrantGodlikePowersPacket();
  2140. GrantGodlikePowersPacket.GrantDataBlock gdb = new GrantGodlikePowersPacket.GrantDataBlock();
  2141. GrantGodlikePowersPacket.AgentDataBlock adb = new GrantGodlikePowersPacket.AgentDataBlock();
  2142. adb.AgentID = AgentId;
  2143. adb.SessionID = SessionId; // More security
  2144. gdb.GodLevel = (byte)AdminLevel;
  2145. gdb.Token = Token;
  2146. //respondPacket.AgentData = (GrantGodlikePowersPacket.AgentDataBlock)ablock;
  2147. respondPacket.GrantData = gdb;
  2148. respondPacket.AgentData = adb;
  2149. OutPacket(respondPacket, ThrottleOutPacketType.Task);
  2150. }
  2151. public void SendGroupMembership(GroupMembershipData[] GroupMembership)
  2152. {
  2153. m_groupPowers.Clear();
  2154. AgentGroupDataUpdatePacket Groupupdate = new AgentGroupDataUpdatePacket();
  2155. AgentGroupDataUpdatePacket.GroupDataBlock[] Groups = new AgentGroupDataUpdatePacket.GroupDataBlock[GroupMembership.Length];
  2156. for (int i = 0; i < GroupMembership.Length; i++)
  2157. {
  2158. m_groupPowers[GroupMembership[i].GroupID] = GroupMembership[i].GroupPowers;
  2159. AgentGroupDataUpdatePacket.GroupDataBlock Group = new AgentGroupDataUpdatePacket.GroupDataBlock();
  2160. Group.AcceptNotices = GroupMembership[i].AcceptNotices;
  2161. Group.Contribution = GroupMembership[i].Contribution;
  2162. Group.GroupID = GroupMembership[i].GroupID;
  2163. Group.GroupInsigniaID = GroupMembership[i].GroupPicture;
  2164. Group.GroupName = Util.StringToBytes256(GroupMembership[i].GroupName);
  2165. Group.GroupPowers = GroupMembership[i].GroupPowers;
  2166. Groups[i] = Group;
  2167. }
  2168. Groupupdate.GroupData = Groups;
  2169. Groupupdate.AgentData = new AgentGroupDataUpdatePacket.AgentDataBlock();
  2170. Groupupdate.AgentData.AgentID = AgentId;
  2171. OutPacket(Groupupdate, ThrottleOutPacketType.Task);
  2172. try
  2173. {
  2174. IEventQueue eq = Scene.RequestModuleInterface<IEventQueue>();
  2175. if (eq != null)
  2176. {
  2177. eq.GroupMembership(Groupupdate, this.AgentId);
  2178. }
  2179. }
  2180. catch (Exception ex)
  2181. {
  2182. m_log.Error("Unable to send group membership data via eventqueue - exception: " + ex.ToString());
  2183. m_log.Warn("sending group membership data via UDP");
  2184. OutPacket(Groupupdate, ThrottleOutPacketType.Task);
  2185. }
  2186. }
  2187. public void SendGroupNameReply(UUID groupLLUID, string GroupName)
  2188. {
  2189. UUIDGroupNameReplyPacket pack = new UUIDGroupNameReplyPacket();
  2190. UUIDGroupNameReplyPacket.UUIDNameBlockBlock[] uidnameblock = new UUIDGroupNameReplyPacket.UUIDNameBlockBlock[1];
  2191. UUIDGroupNameReplyPacket.UUIDNameBlockBlock uidnamebloc = new UUIDGroupNameReplyPacket.UUIDNameBlockBlock();
  2192. uidnamebloc.ID = groupLLUID;
  2193. uidnamebloc.GroupName = Util.StringToBytes256(GroupName);
  2194. uidnameblock[0] = uidnamebloc;
  2195. pack.UUIDNameBlock = uidnameblock;
  2196. OutPacket(pack, ThrottleOutPacketType.Task);
  2197. }
  2198. public void SendLandStatReply(uint reportType, uint requestFlags, uint resultCount, LandStatReportItem[] lsrpia)
  2199. {
  2200. LandStatReplyPacket lsrp = new LandStatReplyPacket();
  2201. // LandStatReplyPacket.RequestDataBlock lsreqdpb = new LandStatReplyPacket.RequestDataBlock();
  2202. LandStatReplyPacket.ReportDataBlock[] lsrepdba = new LandStatReplyPacket.ReportDataBlock[lsrpia.Length];
  2203. //LandStatReplyPacket.ReportDataBlock lsrepdb = new LandStatReplyPacket.ReportDataBlock();
  2204. // lsrepdb.
  2205. lsrp.RequestData.ReportType = reportType;
  2206. lsrp.RequestData.RequestFlags = requestFlags;
  2207. lsrp.RequestData.TotalObjectCount = resultCount;
  2208. for (int i = 0; i < lsrpia.Length; i++)
  2209. {
  2210. LandStatReplyPacket.ReportDataBlock lsrepdb = new LandStatReplyPacket.ReportDataBlock();
  2211. lsrepdb.LocationX = lsrpia[i].LocationX;
  2212. lsrepdb.LocationY = lsrpia[i].LocationY;
  2213. lsrepdb.LocationZ = lsrpia[i].LocationZ;
  2214. lsrepdb.Score = lsrpia[i].Score;
  2215. lsrepdb.TaskID = lsrpia[i].TaskID;
  2216. lsrepdb.TaskLocalID = lsrpia[i].TaskLocalID;
  2217. lsrepdb.TaskName = Util.StringToBytes256(lsrpia[i].TaskName);
  2218. lsrepdb.OwnerName = Util.StringToBytes256(lsrpia[i].OwnerName);
  2219. lsrepdba[i] = lsrepdb;
  2220. }
  2221. lsrp.ReportData = lsrepdba;
  2222. OutPacket(lsrp, ThrottleOutPacketType.Task);
  2223. }
  2224. public void SendScriptRunningReply(UUID objectID, UUID itemID, bool running)
  2225. {
  2226. ScriptRunningReplyPacket scriptRunningReply = new ScriptRunningReplyPacket();
  2227. scriptRunningReply.Script.ObjectID = objectID;
  2228. scriptRunningReply.Script.ItemID = itemID;
  2229. scriptRunningReply.Script.Running = running;
  2230. OutPacket(scriptRunningReply, ThrottleOutPacketType.Task);
  2231. }
  2232. public void SendAsset(AssetRequestToClient req)
  2233. {
  2234. //m_log.Debug("sending asset " + req.RequestAssetID);
  2235. TransferInfoPacket Transfer = new TransferInfoPacket();
  2236. Transfer.TransferInfo.ChannelType = 2;
  2237. Transfer.TransferInfo.Status = 0;
  2238. Transfer.TransferInfo.TargetType = 0;
  2239. if (req.AssetRequestSource == 2)
  2240. {
  2241. Transfer.TransferInfo.Params = new byte[20];
  2242. Array.Copy(req.RequestAssetID.GetBytes(), 0, Transfer.TransferInfo.Params, 0, 16);
  2243. int assType = req.AssetInf.Type;
  2244. Array.Copy(Utils.IntToBytes(assType), 0, Transfer.TransferInfo.Params, 16, 4);
  2245. }
  2246. else if (req.AssetRequestSource == 3)
  2247. {
  2248. Transfer.TransferInfo.Params = req.Params;
  2249. // Transfer.TransferInfo.Params = new byte[100];
  2250. //Array.Copy(req.RequestUser.AgentId.GetBytes(), 0, Transfer.TransferInfo.Params, 0, 16);
  2251. //Array.Copy(req.RequestUser.SessionId.GetBytes(), 0, Transfer.TransferInfo.Params, 16, 16);
  2252. }
  2253. Transfer.TransferInfo.Size = req.AssetInf.Data.Length;
  2254. Transfer.TransferInfo.TransferID = req.TransferRequestID;
  2255. Transfer.Header.Zerocoded = true;
  2256. OutPacket(Transfer, ThrottleOutPacketType.Asset);
  2257. if (req.NumPackets == 1)
  2258. {
  2259. TransferPacketPacket TransferPacket = new TransferPacketPacket();
  2260. TransferPacket.TransferData.Packet = 0;
  2261. TransferPacket.TransferData.ChannelType = 2;
  2262. TransferPacket.TransferData.TransferID = req.TransferRequestID;
  2263. TransferPacket.TransferData.Data = req.AssetInf.Data;
  2264. TransferPacket.TransferData.Status = 1;
  2265. TransferPacket.Header.Zerocoded = true;
  2266. OutPacket(TransferPacket, ThrottleOutPacketType.Asset);
  2267. }
  2268. else
  2269. {
  2270. int processedLength = 0;
  2271. int maxChunkSize = Settings.MAX_PACKET_SIZE - 100;
  2272. int packetNumber = 0;
  2273. while (processedLength < req.AssetInf.Data.Length)
  2274. {
  2275. TransferPacketPacket TransferPacket = new TransferPacketPacket();
  2276. TransferPacket.TransferData.Packet = packetNumber;
  2277. TransferPacket.TransferData.ChannelType = 2;
  2278. TransferPacket.TransferData.TransferID = req.TransferRequestID;
  2279. int chunkSize = Math.Min(req.AssetInf.Data.Length - processedLength, maxChunkSize);
  2280. byte[] chunk = new byte[chunkSize];
  2281. Array.Copy(req.AssetInf.Data, processedLength, chunk, 0, chunk.Length);
  2282. TransferPacket.TransferData.Data = chunk;
  2283. // 0 indicates more packets to come, 1 indicates last packet
  2284. if (req.AssetInf.Data.Length - processedLength > maxChunkSize)
  2285. {
  2286. TransferPacket.TransferData.Status = 0;
  2287. }
  2288. else
  2289. {
  2290. TransferPacket.TransferData.Status = 1;
  2291. }
  2292. TransferPacket.Header.Zerocoded = true;
  2293. OutPacket(TransferPacket, ThrottleOutPacketType.Asset);
  2294. processedLength += chunkSize;
  2295. packetNumber++;
  2296. }
  2297. }
  2298. }
  2299. public void SendTexture(AssetBase TextureAsset)
  2300. {
  2301. }
  2302. public void SendRegionHandle(UUID regionID, ulong handle)
  2303. {
  2304. RegionIDAndHandleReplyPacket reply = (RegionIDAndHandleReplyPacket)PacketPool.Instance.GetPacket(PacketType.RegionIDAndHandleReply);
  2305. reply.ReplyBlock.RegionID = regionID;
  2306. reply.ReplyBlock.RegionHandle = handle;
  2307. OutPacket(reply, ThrottleOutPacketType.Land);
  2308. }
  2309. public void SendParcelInfo(RegionInfo info, LandData land, UUID parcelID, uint x, uint y)
  2310. {
  2311. ParcelInfoReplyPacket reply = (ParcelInfoReplyPacket)PacketPool.Instance.GetPacket(PacketType.ParcelInfoReply);
  2312. reply.AgentData.AgentID = m_agentId;
  2313. reply.Data.ParcelID = parcelID;
  2314. reply.Data.OwnerID = land.OwnerID;
  2315. reply.Data.Name = Utils.StringToBytes(land.Name);
  2316. reply.Data.Desc = Utils.StringToBytes(land.Description);
  2317. reply.Data.ActualArea = land.Area;
  2318. reply.Data.BillableArea = land.Area; // TODO: what is this?
  2319. // Bit 0: Mature, bit 7: on sale, other bits: no idea
  2320. reply.Data.Flags = (byte)(
  2321. ((land.Flags & (uint)ParcelFlags.MaturePublish) != 0 ? (1 << 0) : 0) +
  2322. ((land.Flags & (uint)ParcelFlags.ForSale) != 0 ? (1 << 7) : 0));
  2323. Vector3 pos = land.UserLocation;
  2324. if (pos.Equals(Vector3.Zero))
  2325. {
  2326. pos = (land.AABBMax + land.AABBMin) * 0.5f;
  2327. }
  2328. reply.Data.GlobalX = info.RegionLocX * Constants.RegionSize + x;
  2329. reply.Data.GlobalY = info.RegionLocY * Constants.RegionSize + y;
  2330. reply.Data.GlobalZ = pos.Z;
  2331. reply.Data.SimName = Utils.StringToBytes(info.RegionName);
  2332. reply.Data.SnapshotID = land.SnapshotID;
  2333. reply.Data.Dwell = land.Dwell;
  2334. reply.Data.SalePrice = land.SalePrice;
  2335. reply.Data.AuctionID = (int)land.AuctionID;
  2336. OutPacket(reply, ThrottleOutPacketType.Land);
  2337. }
  2338. public void SendScriptTeleportRequest(string objName, string simName, Vector3 pos, Vector3 lookAt)
  2339. {
  2340. ScriptTeleportRequestPacket packet = (ScriptTeleportRequestPacket)PacketPool.Instance.GetPacket(PacketType.ScriptTeleportRequest);
  2341. packet.Data.ObjectName = Utils.StringToBytes(objName);
  2342. packet.Data.SimName = Utils.StringToBytes(simName);
  2343. packet.Data.SimPosition = pos;
  2344. packet.Data.LookAt = lookAt;
  2345. OutPacket(packet, ThrottleOutPacketType.Task);
  2346. }
  2347. public void SendDirPlacesReply(UUID queryID, DirPlacesReplyData[] data)
  2348. {
  2349. DirPlacesReplyPacket packet = (DirPlacesReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirPlacesReply);
  2350. packet.AgentData = new DirPlacesReplyPacket.AgentDataBlock();
  2351. packet.QueryData = new DirPlacesReplyPacket.QueryDataBlock[1];
  2352. packet.QueryData[0] = new DirPlacesReplyPacket.QueryDataBlock();
  2353. packet.QueryReplies =
  2354. new DirPlacesReplyPacket.QueryRepliesBlock[data.Length];
  2355. packet.StatusData = new DirPlacesReplyPacket.StatusDataBlock[
  2356. data.Length];
  2357. packet.AgentData.AgentID = AgentId;
  2358. packet.QueryData[0].QueryID = queryID;
  2359. int i = 0;
  2360. foreach (DirPlacesReplyData d in data)
  2361. {
  2362. packet.QueryReplies[i] =
  2363. new DirPlacesReplyPacket.QueryRepliesBlock();
  2364. packet.StatusData[i] = new DirPlacesReplyPacket.StatusDataBlock();
  2365. packet.QueryReplies[i].ParcelID = d.parcelID;
  2366. packet.QueryReplies[i].Name = Utils.StringToBytes(d.name);
  2367. packet.QueryReplies[i].ForSale = d.forSale;
  2368. packet.QueryReplies[i].Auction = d.auction;
  2369. packet.QueryReplies[i].Dwell = d.dwell;
  2370. packet.StatusData[i].Status = d.Status;
  2371. i++;
  2372. }
  2373. OutPacket(packet, ThrottleOutPacketType.Task);
  2374. }
  2375. public void SendDirPeopleReply(UUID queryID, DirPeopleReplyData[] data)
  2376. {
  2377. DirPeopleReplyPacket packet = (DirPeopleReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirPeopleReply);
  2378. packet.AgentData = new DirPeopleReplyPacket.AgentDataBlock();
  2379. packet.AgentData.AgentID = AgentId;
  2380. packet.QueryData = new DirPeopleReplyPacket.QueryDataBlock();
  2381. packet.QueryData.QueryID = queryID;
  2382. packet.QueryReplies = new DirPeopleReplyPacket.QueryRepliesBlock[
  2383. data.Length];
  2384. int i = 0;
  2385. foreach (DirPeopleReplyData d in data)
  2386. {
  2387. packet.QueryReplies[i] = new DirPeopleReplyPacket.QueryRepliesBlock();
  2388. packet.QueryReplies[i].AgentID = d.agentID;
  2389. packet.QueryReplies[i].FirstName =
  2390. Utils.StringToBytes(d.firstName);
  2391. packet.QueryReplies[i].LastName =
  2392. Utils.StringToBytes(d.lastName);
  2393. packet.QueryReplies[i].Group =
  2394. Utils.StringToBytes(d.group);
  2395. packet.QueryReplies[i].Online = d.online;
  2396. packet.QueryReplies[i].Reputation = d.reputation;
  2397. i++;
  2398. }
  2399. OutPacket(packet, ThrottleOutPacketType.Task);
  2400. }
  2401. public void SendDirEventsReply(UUID queryID, DirEventsReplyData[] data)
  2402. {
  2403. DirEventsReplyPacket packet = (DirEventsReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirEventsReply);
  2404. packet.AgentData = new DirEventsReplyPacket.AgentDataBlock();
  2405. packet.AgentData.AgentID = AgentId;
  2406. packet.QueryData = new DirEventsReplyPacket.QueryDataBlock();
  2407. packet.QueryData.QueryID = queryID;
  2408. packet.QueryReplies = new DirEventsReplyPacket.QueryRepliesBlock[
  2409. data.Length];
  2410. packet.StatusData = new DirEventsReplyPacket.StatusDataBlock[
  2411. data.Length];
  2412. int i = 0;
  2413. foreach (DirEventsReplyData d in data)
  2414. {
  2415. packet.QueryReplies[i] = new DirEventsReplyPacket.QueryRepliesBlock();
  2416. packet.StatusData[i] = new DirEventsReplyPacket.StatusDataBlock();
  2417. packet.QueryReplies[i].OwnerID = d.ownerID;
  2418. packet.QueryReplies[i].Name =
  2419. Utils.StringToBytes(d.name);
  2420. packet.QueryReplies[i].EventID = d.eventID;
  2421. packet.QueryReplies[i].Date =
  2422. Utils.StringToBytes(d.date);
  2423. packet.QueryReplies[i].UnixTime = d.unixTime;
  2424. packet.QueryReplies[i].EventFlags = d.eventFlags;
  2425. packet.StatusData[i].Status = d.Status;
  2426. i++;
  2427. }
  2428. OutPacket(packet, ThrottleOutPacketType.Task);
  2429. }
  2430. public void SendDirGroupsReply(UUID queryID, DirGroupsReplyData[] data)
  2431. {
  2432. DirGroupsReplyPacket packet = (DirGroupsReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirGroupsReply);
  2433. packet.AgentData = new DirGroupsReplyPacket.AgentDataBlock();
  2434. packet.AgentData.AgentID = AgentId;
  2435. packet.QueryData = new DirGroupsReplyPacket.QueryDataBlock();
  2436. packet.QueryData.QueryID = queryID;
  2437. packet.QueryReplies = new DirGroupsReplyPacket.QueryRepliesBlock[
  2438. data.Length];
  2439. int i = 0;
  2440. foreach (DirGroupsReplyData d in data)
  2441. {
  2442. packet.QueryReplies[i] = new DirGroupsReplyPacket.QueryRepliesBlock();
  2443. packet.QueryReplies[i].GroupID = d.groupID;
  2444. packet.QueryReplies[i].GroupName =
  2445. Utils.StringToBytes(d.groupName);
  2446. packet.QueryReplies[i].Members = d.members;
  2447. packet.QueryReplies[i].SearchOrder = d.searchOrder;
  2448. i++;
  2449. }
  2450. OutPacket(packet, ThrottleOutPacketType.Task);
  2451. }
  2452. public void SendDirClassifiedReply(UUID queryID, DirClassifiedReplyData[] data)
  2453. {
  2454. DirClassifiedReplyPacket packet = (DirClassifiedReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirClassifiedReply);
  2455. packet.AgentData = new DirClassifiedReplyPacket.AgentDataBlock();
  2456. packet.AgentData.AgentID = AgentId;
  2457. packet.QueryData = new DirClassifiedReplyPacket.QueryDataBlock();
  2458. packet.QueryData.QueryID = queryID;
  2459. packet.QueryReplies = new DirClassifiedReplyPacket.QueryRepliesBlock[
  2460. data.Length];
  2461. packet.StatusData = new DirClassifiedReplyPacket.StatusDataBlock[
  2462. data.Length];
  2463. int i = 0;
  2464. foreach (DirClassifiedReplyData d in data)
  2465. {
  2466. packet.QueryReplies[i] = new DirClassifiedReplyPacket.QueryRepliesBlock();
  2467. packet.StatusData[i] = new DirClassifiedReplyPacket.StatusDataBlock();
  2468. packet.QueryReplies[i].ClassifiedID = d.classifiedID;
  2469. packet.QueryReplies[i].Name =
  2470. Utils.StringToBytes(d.name);
  2471. packet.QueryReplies[i].ClassifiedFlags = d.classifiedFlags;
  2472. packet.QueryReplies[i].CreationDate = d.creationDate;
  2473. packet.QueryReplies[i].ExpirationDate = d.expirationDate;
  2474. packet.QueryReplies[i].PriceForListing = d.price;
  2475. packet.StatusData[i].Status = d.Status;
  2476. i++;
  2477. }
  2478. OutPacket(packet, ThrottleOutPacketType.Task);
  2479. }
  2480. public void SendDirLandReply(UUID queryID, DirLandReplyData[] data)
  2481. {
  2482. DirLandReplyPacket packet = (DirLandReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirLandReply);
  2483. packet.AgentData = new DirLandReplyPacket.AgentDataBlock();
  2484. packet.AgentData.AgentID = AgentId;
  2485. packet.QueryData = new DirLandReplyPacket.QueryDataBlock();
  2486. packet.QueryData.QueryID = queryID;
  2487. packet.QueryReplies = new DirLandReplyPacket.QueryRepliesBlock[
  2488. data.Length];
  2489. int i = 0;
  2490. foreach (DirLandReplyData d in data)
  2491. {
  2492. packet.QueryReplies[i] = new DirLandReplyPacket.QueryRepliesBlock();
  2493. packet.QueryReplies[i].ParcelID = d.parcelID;
  2494. packet.QueryReplies[i].Name =
  2495. Utils.StringToBytes(d.name);
  2496. packet.QueryReplies[i].Auction = d.auction;
  2497. packet.QueryReplies[i].ForSale = d.forSale;
  2498. packet.QueryReplies[i].SalePrice = d.salePrice;
  2499. packet.QueryReplies[i].ActualArea = d.actualArea;
  2500. i++;
  2501. }
  2502. OutPacket(packet, ThrottleOutPacketType.Task);
  2503. }
  2504. public void SendDirPopularReply(UUID queryID, DirPopularReplyData[] data)
  2505. {
  2506. DirPopularReplyPacket packet = (DirPopularReplyPacket)PacketPool.Instance.GetPacket(PacketType.DirPopularReply);
  2507. packet.AgentData = new DirPopularReplyPacket.AgentDataBlock();
  2508. packet.AgentData.AgentID = AgentId;
  2509. packet.QueryData = new DirPopularReplyPacket.QueryDataBlock();
  2510. packet.QueryData.QueryID = queryID;
  2511. packet.QueryReplies = new DirPopularReplyPacket.QueryRepliesBlock[
  2512. data.Length];
  2513. int i = 0;
  2514. foreach (DirPopularReplyData d in data)
  2515. {
  2516. packet.QueryReplies[i] = new DirPopularReplyPacket.QueryRepliesBlock();
  2517. packet.QueryReplies[i].ParcelID = d.parcelID;
  2518. packet.QueryReplies[i].Name =
  2519. Utils.StringToBytes(d.name);
  2520. packet.QueryReplies[i].Dwell = d.dwell;
  2521. i++;
  2522. }
  2523. OutPacket(packet, ThrottleOutPacketType.Task);
  2524. }
  2525. public void SendEventInfoReply(EventData data)
  2526. {
  2527. EventInfoReplyPacket packet = (EventInfoReplyPacket)PacketPool.Instance.GetPacket(PacketType.EventInfoReply);
  2528. packet.AgentData = new EventInfoReplyPacket.AgentDataBlock();
  2529. packet.AgentData.AgentID = AgentId;
  2530. packet.EventData = new EventInfoReplyPacket.EventDataBlock();
  2531. packet.EventData.EventID = data.eventID;
  2532. packet.EventData.Creator = Utils.StringToBytes(data.creator);
  2533. packet.EventData.Name = Utils.StringToBytes(data.name);
  2534. packet.EventData.Category = Utils.StringToBytes(data.category);
  2535. packet.EventData.Desc = Utils.StringToBytes(data.description);
  2536. packet.EventData.Date = Utils.StringToBytes(data.date);
  2537. packet.EventData.DateUTC = data.dateUTC;
  2538. packet.EventData.Duration = data.duration;
  2539. packet.EventData.Cover = data.cover;
  2540. packet.EventData.Amount = data.amount;
  2541. packet.EventData.SimName = Utils.StringToBytes(data.simName);
  2542. packet.EventData.GlobalPos = new Vector3d(data.globalPos);
  2543. packet.EventData.EventFlags = data.eventFlags;
  2544. OutPacket(packet, ThrottleOutPacketType.Task);
  2545. }
  2546. public void SendMapItemReply(mapItemReply[] replies, uint mapitemtype, uint flags)
  2547. {
  2548. MapItemReplyPacket mirplk = new MapItemReplyPacket();
  2549. mirplk.AgentData.AgentID = AgentId;
  2550. mirplk.RequestData.ItemType = mapitemtype;
  2551. mirplk.Data = new MapItemReplyPacket.DataBlock[replies.Length];
  2552. for (int i = 0; i < replies.Length; i++)
  2553. {
  2554. MapItemReplyPacket.DataBlock mrdata = new MapItemReplyPacket.DataBlock();
  2555. mrdata.X = replies[i].x;
  2556. mrdata.Y = replies[i].y;
  2557. mrdata.ID = replies[i].id;
  2558. mrdata.Extra = replies[i].Extra;
  2559. mrdata.Extra2 = replies[i].Extra2;
  2560. mrdata.Name = Utils.StringToBytes(replies[i].name);
  2561. mirplk.Data[i] = mrdata;
  2562. }
  2563. //m_log.Debug(mirplk.ToString());
  2564. OutPacket(mirplk, ThrottleOutPacketType.Task);
  2565. }
  2566. public void SendOfferCallingCard(UUID srcID, UUID transactionID)
  2567. {
  2568. // a bit special, as this uses AgentID to store the source instead
  2569. // of the destination. The destination (the receiver) goes into destID
  2570. OfferCallingCardPacket p = (OfferCallingCardPacket)PacketPool.Instance.GetPacket(PacketType.OfferCallingCard);
  2571. p.AgentData.AgentID = srcID;
  2572. p.AgentData.SessionID = UUID.Zero;
  2573. p.AgentBlock.DestID = AgentId;
  2574. p.AgentBlock.TransactionID = transactionID;
  2575. OutPacket(p, ThrottleOutPacketType.Task);
  2576. }
  2577. public void SendAcceptCallingCard(UUID transactionID)
  2578. {
  2579. AcceptCallingCardPacket p = (AcceptCallingCardPacket)PacketPool.Instance.GetPacket(PacketType.AcceptCallingCard);
  2580. p.AgentData.AgentID = AgentId;
  2581. p.AgentData.SessionID = UUID.Zero;
  2582. p.FolderData = new AcceptCallingCardPacket.FolderDataBlock[1];
  2583. p.FolderData[0] = new AcceptCallingCardPacket.FolderDataBlock();
  2584. p.FolderData[0].FolderID = UUID.Zero;
  2585. OutPacket(p, ThrottleOutPacketType.Task);
  2586. }
  2587. public void SendDeclineCallingCard(UUID transactionID)
  2588. {
  2589. DeclineCallingCardPacket p = (DeclineCallingCardPacket)PacketPool.Instance.GetPacket(PacketType.DeclineCallingCard);
  2590. p.AgentData.AgentID = AgentId;
  2591. p.AgentData.SessionID = UUID.Zero;
  2592. p.TransactionBlock.TransactionID = transactionID;
  2593. OutPacket(p, ThrottleOutPacketType.Task);
  2594. }
  2595. public void SendTerminateFriend(UUID exFriendID)
  2596. {
  2597. TerminateFriendshipPacket p = (TerminateFriendshipPacket)PacketPool.Instance.GetPacket(PacketType.TerminateFriendship);
  2598. p.AgentData.AgentID = AgentId;
  2599. p.AgentData.SessionID = SessionId;
  2600. p.ExBlock.OtherID = exFriendID;
  2601. OutPacket(p, ThrottleOutPacketType.Task);
  2602. }
  2603. public void SendAvatarGroupsReply(UUID avatarID, GroupMembershipData[] data)
  2604. {
  2605. OSDMap llsd = new OSDMap(3);
  2606. OSDArray AgentData = new OSDArray(1);
  2607. OSDMap AgentDataMap = new OSDMap(1);
  2608. AgentDataMap.Add("AgentID", OSD.FromUUID(this.AgentId));
  2609. AgentDataMap.Add("AvatarID", OSD.FromUUID(avatarID));
  2610. AgentData.Add(AgentDataMap);
  2611. llsd.Add("AgentData", AgentData);
  2612. OSDArray GroupData = new OSDArray(data.Length);
  2613. OSDArray NewGroupData = new OSDArray(data.Length);
  2614. foreach (GroupMembershipData m in data)
  2615. {
  2616. OSDMap GroupDataMap = new OSDMap(6);
  2617. OSDMap NewGroupDataMap = new OSDMap(1);
  2618. GroupDataMap.Add("GroupPowers", OSD.FromBinary(m.GroupPowers));
  2619. GroupDataMap.Add("AcceptNotices", OSD.FromBoolean(m.AcceptNotices));
  2620. GroupDataMap.Add("GroupTitle", OSD.FromString(m.GroupTitle));
  2621. GroupDataMap.Add("GroupID", OSD.FromUUID(m.GroupID));
  2622. GroupDataMap.Add("GroupName", OSD.FromString(m.GroupName));
  2623. GroupDataMap.Add("GroupInsigniaID", OSD.FromUUID(m.GroupPicture));
  2624. NewGroupDataMap.Add("ListInProfile", OSD.FromBoolean(m.ListInProfile));
  2625. GroupData.Add(GroupDataMap);
  2626. NewGroupData.Add(NewGroupDataMap);
  2627. }
  2628. llsd.Add("GroupData", GroupData);
  2629. llsd.Add("NewGroupData", NewGroupData);
  2630. IEventQueue eq = this.Scene.RequestModuleInterface<IEventQueue>();
  2631. if (eq != null)
  2632. {
  2633. eq.Enqueue(BuildEvent("AvatarGroupsReply", llsd), this.AgentId);
  2634. }
  2635. }
  2636. public void SendJoinGroupReply(UUID groupID, bool success)
  2637. {
  2638. JoinGroupReplyPacket p = (JoinGroupReplyPacket)PacketPool.Instance.GetPacket(PacketType.JoinGroupReply);
  2639. p.AgentData = new JoinGroupReplyPacket.AgentDataBlock();
  2640. p.AgentData.AgentID = AgentId;
  2641. p.GroupData = new JoinGroupReplyPacket.GroupDataBlock();
  2642. p.GroupData.GroupID = groupID;
  2643. p.GroupData.Success = success;
  2644. OutPacket(p, ThrottleOutPacketType.Task);
  2645. }
  2646. public void SendEjectGroupMemberReply(UUID agentID, UUID groupID, bool success)
  2647. {
  2648. EjectGroupMemberReplyPacket p = (EjectGroupMemberReplyPacket)PacketPool.Instance.GetPacket(PacketType.EjectGroupMemberReply);
  2649. p.AgentData = new EjectGroupMemberReplyPacket.AgentDataBlock();
  2650. p.AgentData.AgentID = agentID;
  2651. p.GroupData = new EjectGroupMemberReplyPacket.GroupDataBlock();
  2652. p.GroupData.GroupID = groupID;
  2653. p.EjectData = new EjectGroupMemberReplyPacket.EjectDataBlock();
  2654. p.EjectData.Success = success;
  2655. OutPacket(p, ThrottleOutPacketType.Task);
  2656. }
  2657. public void SendLeaveGroupReply(UUID groupID, bool success)
  2658. {
  2659. LeaveGroupReplyPacket p = (LeaveGroupReplyPacket)PacketPool.Instance.GetPacket(PacketType.LeaveGroupReply);
  2660. p.AgentData = new LeaveGroupReplyPacket.AgentDataBlock();
  2661. p.AgentData.AgentID = AgentId;
  2662. p.GroupData = new LeaveGroupReplyPacket.GroupDataBlock();
  2663. p.GroupData.GroupID = groupID;
  2664. p.GroupData.Success = success;
  2665. OutPacket(p, ThrottleOutPacketType.Task);
  2666. }
  2667. public void SendAvatarClassifiedReply(UUID targetID, UUID[] classifiedID, string[] name)
  2668. {
  2669. if (classifiedID.Length != name.Length)
  2670. return;
  2671. AvatarClassifiedReplyPacket ac =
  2672. (AvatarClassifiedReplyPacket)PacketPool.Instance.GetPacket(
  2673. PacketType.AvatarClassifiedReply);
  2674. ac.AgentData = new AvatarClassifiedReplyPacket.AgentDataBlock();
  2675. ac.AgentData.AgentID = AgentId;
  2676. ac.AgentData.TargetID = targetID;
  2677. ac.Data = new AvatarClassifiedReplyPacket.DataBlock[classifiedID.Length];
  2678. int i;
  2679. for (i = 0; i < classifiedID.Length; i++)
  2680. {
  2681. ac.Data[i].ClassifiedID = classifiedID[i];
  2682. ac.Data[i].Name = Utils.StringToBytes(name[i]);
  2683. }
  2684. OutPacket(ac, ThrottleOutPacketType.Task);
  2685. }
  2686. 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)
  2687. {
  2688. ClassifiedInfoReplyPacket cr =
  2689. (ClassifiedInfoReplyPacket)PacketPool.Instance.GetPacket(
  2690. PacketType.ClassifiedInfoReply);
  2691. cr.AgentData = new ClassifiedInfoReplyPacket.AgentDataBlock();
  2692. cr.AgentData.AgentID = AgentId;
  2693. cr.Data = new ClassifiedInfoReplyPacket.DataBlock();
  2694. cr.Data.ClassifiedID = classifiedID;
  2695. cr.Data.CreatorID = creatorID;
  2696. cr.Data.CreationDate = creationDate;
  2697. cr.Data.ExpirationDate = expirationDate;
  2698. cr.Data.Category = category;
  2699. cr.Data.Name = Utils.StringToBytes(name);
  2700. cr.Data.Desc = Utils.StringToBytes(description);
  2701. cr.Data.ParcelID = parcelID;
  2702. cr.Data.ParentEstate = parentEstate;
  2703. cr.Data.SnapshotID = snapshotID;
  2704. cr.Data.SimName = Utils.StringToBytes(simName);
  2705. cr.Data.PosGlobal = new Vector3d(globalPos);
  2706. cr.Data.ParcelName = Utils.StringToBytes(parcelName);
  2707. cr.Data.ClassifiedFlags = classifiedFlags;
  2708. cr.Data.PriceForListing = price;
  2709. OutPacket(cr, ThrottleOutPacketType.Task);
  2710. }
  2711. public void SendAgentDropGroup(UUID groupID)
  2712. {
  2713. AgentDropGroupPacket dg =
  2714. (AgentDropGroupPacket)PacketPool.Instance.GetPacket(
  2715. PacketType.AgentDropGroup);
  2716. dg.AgentData = new AgentDropGroupPacket.AgentDataBlock();
  2717. dg.AgentData.AgentID = AgentId;
  2718. dg.AgentData.GroupID = groupID;
  2719. OutPacket(dg, ThrottleOutPacketType.Task);
  2720. }
  2721. public void SendAvatarNotesReply(UUID targetID, string text)
  2722. {
  2723. AvatarNotesReplyPacket an =
  2724. (AvatarNotesReplyPacket)PacketPool.Instance.GetPacket(
  2725. PacketType.AvatarNotesReply);
  2726. an.AgentData = new AvatarNotesReplyPacket.AgentDataBlock();
  2727. an.AgentData.AgentID = AgentId;
  2728. an.Data = new AvatarNotesReplyPacket.DataBlock();
  2729. an.Data.TargetID = targetID;
  2730. an.Data.Notes = Utils.StringToBytes(text);
  2731. OutPacket(an, ThrottleOutPacketType.Task);
  2732. }
  2733. public void SendAvatarPicksReply(UUID targetID, Dictionary<UUID, string> picks)
  2734. {
  2735. AvatarPicksReplyPacket ap =
  2736. (AvatarPicksReplyPacket)PacketPool.Instance.GetPacket(
  2737. PacketType.AvatarPicksReply);
  2738. ap.AgentData = new AvatarPicksReplyPacket.AgentDataBlock();
  2739. ap.AgentData.AgentID = AgentId;
  2740. ap.AgentData.TargetID = targetID;
  2741. ap.Data = new AvatarPicksReplyPacket.DataBlock[picks.Count];
  2742. int i = 0;
  2743. foreach (KeyValuePair<UUID, string> pick in picks)
  2744. {
  2745. ap.Data[i] = new AvatarPicksReplyPacket.DataBlock();
  2746. ap.Data[i].PickID = pick.Key;
  2747. ap.Data[i].PickName = Utils.StringToBytes(pick.Value);
  2748. i++;
  2749. }
  2750. OutPacket(ap, ThrottleOutPacketType.Task);
  2751. }
  2752. public void SendAvatarClassifiedReply(UUID targetID, Dictionary<UUID, string> classifieds)
  2753. {
  2754. AvatarClassifiedReplyPacket ac =
  2755. (AvatarClassifiedReplyPacket)PacketPool.Instance.GetPacket(
  2756. PacketType.AvatarClassifiedReply);
  2757. ac.AgentData = new AvatarClassifiedReplyPacket.AgentDataBlock();
  2758. ac.AgentData.AgentID = AgentId;
  2759. ac.AgentData.TargetID = targetID;
  2760. ac.Data = new AvatarClassifiedReplyPacket.DataBlock[classifieds.Count];
  2761. int i = 0;
  2762. foreach (KeyValuePair<UUID, string> classified in classifieds)
  2763. {
  2764. ac.Data[i] = new AvatarClassifiedReplyPacket.DataBlock();
  2765. ac.Data[i].ClassifiedID = classified.Key;
  2766. ac.Data[i].Name = Utils.StringToBytes(classified.Value);
  2767. i++;
  2768. }
  2769. OutPacket(ac, ThrottleOutPacketType.Task);
  2770. }
  2771. public void SendParcelDwellReply(int localID, UUID parcelID, float dwell)
  2772. {
  2773. ParcelDwellReplyPacket pd =
  2774. (ParcelDwellReplyPacket)PacketPool.Instance.GetPacket(
  2775. PacketType.ParcelDwellReply);
  2776. pd.AgentData = new ParcelDwellReplyPacket.AgentDataBlock();
  2777. pd.AgentData.AgentID = AgentId;
  2778. pd.Data = new ParcelDwellReplyPacket.DataBlock();
  2779. pd.Data.LocalID = localID;
  2780. pd.Data.ParcelID = parcelID;
  2781. pd.Data.Dwell = dwell;
  2782. OutPacket(pd, ThrottleOutPacketType.Land);
  2783. }
  2784. public void SendUserInfoReply(bool imViaEmail, bool visible, string email)
  2785. {
  2786. UserInfoReplyPacket ur =
  2787. (UserInfoReplyPacket)PacketPool.Instance.GetPacket(
  2788. PacketType.UserInfoReply);
  2789. string Visible = "hidden";
  2790. if (visible)
  2791. Visible = "default";
  2792. ur.AgentData = new UserInfoReplyPacket.AgentDataBlock();
  2793. ur.AgentData.AgentID = AgentId;
  2794. ur.UserData = new UserInfoReplyPacket.UserDataBlock();
  2795. ur.UserData.IMViaEMail = imViaEmail;
  2796. ur.UserData.DirectoryVisibility = Utils.StringToBytes(Visible);
  2797. ur.UserData.EMail = Utils.StringToBytes(email);
  2798. OutPacket(ur, ThrottleOutPacketType.Task);
  2799. }
  2800. public void SendCreateGroupReply(UUID groupID, bool success, string message)
  2801. {
  2802. CreateGroupReplyPacket createGroupReply = (CreateGroupReplyPacket)PacketPool.Instance.GetPacket(PacketType.CreateGroupReply);
  2803. createGroupReply.AgentData =
  2804. new CreateGroupReplyPacket.AgentDataBlock();
  2805. createGroupReply.ReplyData =
  2806. new CreateGroupReplyPacket.ReplyDataBlock();
  2807. createGroupReply.AgentData.AgentID = AgentId;
  2808. createGroupReply.ReplyData.GroupID = groupID;
  2809. createGroupReply.ReplyData.Success = success;
  2810. createGroupReply.ReplyData.Message = Utils.StringToBytes(message);
  2811. OutPacket(createGroupReply, ThrottleOutPacketType.Task);
  2812. }
  2813. public void SendUseCachedMuteList()
  2814. {
  2815. UseCachedMuteListPacket useCachedMuteList = (UseCachedMuteListPacket)PacketPool.Instance.GetPacket(PacketType.UseCachedMuteList);
  2816. useCachedMuteList.AgentData = new UseCachedMuteListPacket.AgentDataBlock();
  2817. useCachedMuteList.AgentData.AgentID = AgentId;
  2818. OutPacket(useCachedMuteList, ThrottleOutPacketType.Task);
  2819. }
  2820. public void SendMuteListUpdate(string filename)
  2821. {
  2822. MuteListUpdatePacket muteListUpdate = (MuteListUpdatePacket)PacketPool.Instance.GetPacket(PacketType.MuteListUpdate);
  2823. muteListUpdate.MuteData = new MuteListUpdatePacket.MuteDataBlock();
  2824. muteListUpdate.MuteData.AgentID = AgentId;
  2825. muteListUpdate.MuteData.Filename = Utils.StringToBytes(filename);
  2826. OutPacket(muteListUpdate, ThrottleOutPacketType.Task);
  2827. }
  2828. 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)
  2829. {
  2830. PickInfoReplyPacket pickInfoReply = (PickInfoReplyPacket)PacketPool.Instance.GetPacket(PacketType.PickInfoReply);
  2831. pickInfoReply.AgentData = new PickInfoReplyPacket.AgentDataBlock();
  2832. pickInfoReply.AgentData.AgentID = AgentId;
  2833. pickInfoReply.Data = new PickInfoReplyPacket.DataBlock();
  2834. pickInfoReply.Data.PickID = pickID;
  2835. pickInfoReply.Data.CreatorID = creatorID;
  2836. pickInfoReply.Data.TopPick = topPick;
  2837. pickInfoReply.Data.ParcelID = parcelID;
  2838. pickInfoReply.Data.Name = Utils.StringToBytes(name);
  2839. pickInfoReply.Data.Desc = Utils.StringToBytes(desc);
  2840. pickInfoReply.Data.SnapshotID = snapshotID;
  2841. pickInfoReply.Data.User = Utils.StringToBytes(user);
  2842. pickInfoReply.Data.OriginalName = Utils.StringToBytes(originalName);
  2843. pickInfoReply.Data.SimName = Utils.StringToBytes(simName);
  2844. pickInfoReply.Data.PosGlobal = new Vector3d(posGlobal);
  2845. pickInfoReply.Data.SortOrder = sortOrder;
  2846. pickInfoReply.Data.Enabled = enabled;
  2847. OutPacket(pickInfoReply, ThrottleOutPacketType.Task);
  2848. }
  2849. #endregion Scene/Avatar to Client
  2850. // Gesture
  2851. #region Appearance/ Wearables Methods
  2852. public void SendWearables(AvatarWearable[] wearables, int serial)
  2853. {
  2854. AgentWearablesUpdatePacket aw = (AgentWearablesUpdatePacket)PacketPool.Instance.GetPacket(PacketType.AgentWearablesUpdate);
  2855. aw.AgentData.AgentID = AgentId;
  2856. aw.AgentData.SerialNum = (uint)serial;
  2857. aw.AgentData.SessionID = m_sessionId;
  2858. // TODO: don't create new blocks if recycling an old packet
  2859. aw.WearableData = new AgentWearablesUpdatePacket.WearableDataBlock[13];
  2860. AgentWearablesUpdatePacket.WearableDataBlock awb;
  2861. for (int i = 0; i < wearables.Length; i++)
  2862. {
  2863. awb = new AgentWearablesUpdatePacket.WearableDataBlock();
  2864. awb.WearableType = (byte)i;
  2865. awb.AssetID = wearables[i].AssetID;
  2866. awb.ItemID = wearables[i].ItemID;
  2867. aw.WearableData[i] = awb;
  2868. // m_log.DebugFormat(
  2869. // "[APPEARANCE]: Sending wearable item/asset {0} {1} (index {2}) for {3}",
  2870. // awb.ItemID, awb.AssetID, i, Name);
  2871. }
  2872. OutPacket(aw, ThrottleOutPacketType.Task);
  2873. }
  2874. public void SendAppearance(UUID agentID, byte[] visualParams, byte[] textureEntry)
  2875. {
  2876. AvatarAppearancePacket avp = (AvatarAppearancePacket)PacketPool.Instance.GetPacket(PacketType.AvatarAppearance);
  2877. // TODO: don't create new blocks if recycling an old packet
  2878. avp.VisualParam = new AvatarAppearancePacket.VisualParamBlock[218];
  2879. avp.ObjectData.TextureEntry = textureEntry;
  2880. AvatarAppearancePacket.VisualParamBlock avblock = null;
  2881. for (int i = 0; i < visualParams.Length; i++)
  2882. {
  2883. avblock = new AvatarAppearancePacket.VisualParamBlock();
  2884. avblock.ParamValue = visualParams[i];
  2885. avp.VisualParam[i] = avblock;
  2886. }
  2887. avp.Sender.IsTrial = false;
  2888. avp.Sender.ID = agentID;
  2889. OutPacket(avp, ThrottleOutPacketType.Task);
  2890. }
  2891. public void SendAnimations(UUID[] animations, int[] seqs, UUID sourceAgentId, UUID[] objectIDs)
  2892. {
  2893. //m_log.DebugFormat("[CLIENT]: Sending animations to {0}", Name);
  2894. AvatarAnimationPacket ani = (AvatarAnimationPacket)PacketPool.Instance.GetPacket(PacketType.AvatarAnimation);
  2895. // TODO: don't create new blocks if recycling an old packet
  2896. ani.AnimationSourceList = new AvatarAnimationPacket.AnimationSourceListBlock[animations.Length];
  2897. ani.Sender = new AvatarAnimationPacket.SenderBlock();
  2898. ani.Sender.ID = sourceAgentId;
  2899. ani.AnimationList = new AvatarAnimationPacket.AnimationListBlock[animations.Length];
  2900. ani.PhysicalAvatarEventList = new AvatarAnimationPacket.PhysicalAvatarEventListBlock[0];
  2901. for (int i = 0; i < animations.Length; ++i)
  2902. {
  2903. ani.AnimationList[i] = new AvatarAnimationPacket.AnimationListBlock();
  2904. ani.AnimationList[i].AnimID = animations[i];
  2905. ani.AnimationList[i].AnimSequenceID = seqs[i];
  2906. ani.AnimationSourceList[i] = new AvatarAnimationPacket.AnimationSourceListBlock();
  2907. ani.AnimationSourceList[i].ObjectID = objectIDs[i];
  2908. if (objectIDs[i] == UUID.Zero)
  2909. ani.AnimationSourceList[i].ObjectID = sourceAgentId;
  2910. }
  2911. ani.Header.Reliable = false;
  2912. OutPacket(ani, ThrottleOutPacketType.Task);
  2913. }
  2914. #endregion
  2915. #region Avatar Packet/Data Sending Methods
  2916. /// <summary>
  2917. /// Send an ObjectUpdate packet with information about an avatar
  2918. /// </summary>
  2919. public void SendAvatarData(SendAvatarData data)
  2920. {
  2921. ObjectUpdatePacket objupdate = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
  2922. objupdate.Header.Zerocoded = true;
  2923. objupdate.RegionData.RegionHandle = data.RegionHandle;
  2924. objupdate.RegionData.TimeDilation = ushort.MaxValue;
  2925. objupdate.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[1];
  2926. objupdate.ObjectData[0] = CreateAvatarUpdateBlock(data);
  2927. OutPacket(objupdate, ThrottleOutPacketType.Task);
  2928. }
  2929. /// <summary>
  2930. /// Send a terse positional/rotation/velocity update about an avatar
  2931. /// to the client. This avatar can be that of the client itself.
  2932. /// </summary>
  2933. public virtual void SendAvatarTerseUpdate(SendAvatarTerseData data)
  2934. {
  2935. if (data.Priority == double.NaN)
  2936. {
  2937. m_log.Error("[LLClientView] SendAvatarTerseUpdate received a NaN priority, dropping update");
  2938. return;
  2939. }
  2940. Quaternion rotation = data.Rotation;
  2941. if (rotation.W == 0.0f && rotation.X == 0.0f && rotation.Y == 0.0f && rotation.Z == 0.0f)
  2942. rotation = Quaternion.Identity;
  2943. ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateImprovedTerseBlock(data);
  2944. lock (m_avatarTerseUpdates.SyncRoot)
  2945. m_avatarTerseUpdates.Enqueue(data.Priority, terseBlock, data.LocalID);
  2946. // If we received an update about our own avatar, process the avatar update priority queue immediately
  2947. if (data.AgentID == m_agentId)
  2948. ProcessAvatarTerseUpdates();
  2949. }
  2950. protected void ProcessAvatarTerseUpdates()
  2951. {
  2952. ImprovedTerseObjectUpdatePacket terse = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate);
  2953. terse.Header.Reliable = false;
  2954. terse.Header.Zerocoded = true;
  2955. //terse.RegionData = new ImprovedTerseObjectUpdatePacket.RegionDataBlock();
  2956. terse.RegionData.RegionHandle = Scene.RegionInfo.RegionHandle;
  2957. terse.RegionData.TimeDilation = (ushort)(Scene.TimeDilation * ushort.MaxValue);
  2958. lock (m_avatarTerseUpdates.SyncRoot)
  2959. {
  2960. int count = Math.Min(m_avatarTerseUpdates.Count, m_udpServer.AvatarTerseUpdatesPerPacket);
  2961. if (count == 0)
  2962. return;
  2963. terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[count];
  2964. for (int i = 0; i < count; i++)
  2965. terse.ObjectData[i] = m_avatarTerseUpdates.Dequeue();
  2966. }
  2967. // HACK: Using the task category until the tiered reprioritization code is in
  2968. OutPacket(terse, ThrottleOutPacketType.Task);
  2969. }
  2970. public void SendCoarseLocationUpdate(List<UUID> users, List<Vector3> CoarseLocations)
  2971. {
  2972. if (!IsActive) return; // We don't need to update inactive clients.
  2973. CoarseLocationUpdatePacket loc = (CoarseLocationUpdatePacket)PacketPool.Instance.GetPacket(PacketType.CoarseLocationUpdate);
  2974. loc.Header.Reliable = false;
  2975. // Each packet can only hold around 62 avatar positions and the client clears the mini-map each time
  2976. // a CoarseLocationUpdate packet is received. Oh well.
  2977. int total = Math.Min(CoarseLocations.Count, 60);
  2978. CoarseLocationUpdatePacket.IndexBlock ib = new CoarseLocationUpdatePacket.IndexBlock();
  2979. loc.Location = new CoarseLocationUpdatePacket.LocationBlock[total];
  2980. loc.AgentData = new CoarseLocationUpdatePacket.AgentDataBlock[total];
  2981. int selfindex = -1;
  2982. for (int i = 0; i < total; i++)
  2983. {
  2984. CoarseLocationUpdatePacket.LocationBlock lb =
  2985. new CoarseLocationUpdatePacket.LocationBlock();
  2986. lb.X = (byte)CoarseLocations[i].X;
  2987. lb.Y = (byte)CoarseLocations[i].Y;
  2988. lb.Z = CoarseLocations[i].Z > 1024 ? (byte)0 : (byte)(CoarseLocations[i].Z * 0.25f);
  2989. loc.Location[i] = lb;
  2990. loc.AgentData[i] = new CoarseLocationUpdatePacket.AgentDataBlock();
  2991. loc.AgentData[i].AgentID = users[i];
  2992. if (users[i] == AgentId)
  2993. selfindex = i;
  2994. }
  2995. ib.You = (short)selfindex;
  2996. ib.Prey = -1;
  2997. loc.Index = ib;
  2998. OutPacket(loc, ThrottleOutPacketType.Task);
  2999. }
  3000. #endregion Avatar Packet/Data Sending Methods
  3001. #region Primitive Packet/Data Sending Methods
  3002. public void SendPrimitiveToClient(SendPrimitiveData data)
  3003. {
  3004. if (data.priority == double.NaN)
  3005. {
  3006. m_log.Error("[LLClientView] SendPrimitiveToClient received a NaN priority, dropping update");
  3007. return;
  3008. }
  3009. Quaternion rotation = data.rotation;
  3010. if (rotation.W == 0.0f && rotation.X == 0.0f && rotation.Y == 0.0f && rotation.Z == 0.0f)
  3011. rotation = Quaternion.Identity;
  3012. if (data.AttachPoint > 30 && data.ownerID != AgentId) // Someone else's HUD
  3013. return;
  3014. if (data.primShape.State != 0 && data.parentID == 0 && data.primShape.PCode == 9)
  3015. return;
  3016. ObjectUpdatePacket.ObjectDataBlock objectData = CreatePrimUpdateBlock(data);
  3017. lock (m_primFullUpdates.SyncRoot)
  3018. m_primFullUpdates.Enqueue(data.priority, objectData, data.localID);
  3019. }
  3020. void ProcessPrimFullUpdates()
  3021. {
  3022. ObjectUpdatePacket outPacket = (ObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ObjectUpdate);
  3023. outPacket.Header.Zerocoded = true;
  3024. outPacket.RegionData.RegionHandle = Scene.RegionInfo.RegionHandle;
  3025. outPacket.RegionData.TimeDilation = (ushort)(Scene.TimeDilation * ushort.MaxValue);
  3026. lock (m_primFullUpdates.SyncRoot)
  3027. {
  3028. int count = Math.Min(m_primFullUpdates.Count, m_udpServer.PrimFullUpdatesPerPacket);
  3029. if (count == 0)
  3030. return;
  3031. outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[count];
  3032. for (int i = 0; i < count; i++)
  3033. outPacket.ObjectData[i] = m_primFullUpdates.Dequeue();
  3034. }
  3035. OutPacket(outPacket, ThrottleOutPacketType.State);
  3036. }
  3037. public void SendPrimTerseUpdate(SendPrimitiveTerseData data)
  3038. {
  3039. if (data.Priority == double.NaN)
  3040. {
  3041. m_log.Error("[LLClientView] SendPrimTerseUpdate received a NaN priority, dropping update");
  3042. return;
  3043. }
  3044. Quaternion rotation = data.Rotation;
  3045. if (rotation.W == 0.0f && rotation.X == 0.0f && rotation.Y == 0.0f && rotation.Z == 0.0f)
  3046. rotation = Quaternion.Identity;
  3047. if (data.AttachPoint > 30 && data.OwnerID != AgentId) // Someone else's HUD
  3048. return;
  3049. ImprovedTerseObjectUpdatePacket.ObjectDataBlock objectData = CreateImprovedTerseBlock(data);
  3050. lock (m_primTerseUpdates.SyncRoot)
  3051. m_primTerseUpdates.Enqueue(data.Priority, objectData, data.LocalID);
  3052. }
  3053. void ProcessPrimTerseUpdates()
  3054. {
  3055. ImprovedTerseObjectUpdatePacket outPacket = (ImprovedTerseObjectUpdatePacket)PacketPool.Instance.GetPacket(PacketType.ImprovedTerseObjectUpdate);
  3056. outPacket.Header.Reliable = false;
  3057. outPacket.Header.Zerocoded = true;
  3058. outPacket.RegionData.RegionHandle = Scene.RegionInfo.RegionHandle;
  3059. outPacket.RegionData.TimeDilation = (ushort)(Scene.TimeDilation * ushort.MaxValue);
  3060. lock (m_primTerseUpdates.SyncRoot)
  3061. {
  3062. int count = Math.Min(m_primTerseUpdates.Count, m_udpServer.PrimTerseUpdatesPerPacket);
  3063. if (count == 0)
  3064. return;
  3065. outPacket.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[count];
  3066. for (int i = 0; i < count; i++)
  3067. outPacket.ObjectData[i] = m_primTerseUpdates.Dequeue();
  3068. }
  3069. OutPacket(outPacket, ThrottleOutPacketType.State);
  3070. }
  3071. public void ReprioritizeUpdates(StateUpdateTypes type, UpdatePriorityHandler handler)
  3072. {
  3073. PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock>.UpdatePriorityHandler terse_update_priority_handler =
  3074. delegate(ref double priority, uint local_id)
  3075. {
  3076. priority = handler(new UpdatePriorityData(priority, local_id));
  3077. return priority != double.NaN;
  3078. };
  3079. PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock>.UpdatePriorityHandler update_priority_handler =
  3080. delegate(ref double priority, uint local_id)
  3081. {
  3082. priority = handler(new UpdatePriorityData(priority, local_id));
  3083. return priority != double.NaN;
  3084. };
  3085. if ((type & StateUpdateTypes.AvatarTerse) != 0)
  3086. {
  3087. lock (m_avatarTerseUpdates.SyncRoot)
  3088. m_avatarTerseUpdates.Reprioritize(terse_update_priority_handler);
  3089. }
  3090. if ((type & StateUpdateTypes.PrimitiveFull) != 0)
  3091. {
  3092. lock (m_primFullUpdates.SyncRoot)
  3093. m_primFullUpdates.Reprioritize(update_priority_handler);
  3094. }
  3095. if ((type & StateUpdateTypes.PrimitiveTerse) != 0)
  3096. {
  3097. lock (m_primTerseUpdates.SyncRoot)
  3098. m_primTerseUpdates.Reprioritize(terse_update_priority_handler);
  3099. }
  3100. }
  3101. public void FlushPrimUpdates()
  3102. {
  3103. while (m_primFullUpdates.Count > 0)
  3104. {
  3105. ProcessPrimFullUpdates();
  3106. }
  3107. while (m_primTerseUpdates.Count > 0)
  3108. {
  3109. ProcessPrimTerseUpdates();
  3110. }
  3111. while (m_avatarTerseUpdates.Count > 0)
  3112. {
  3113. ProcessAvatarTerseUpdates();
  3114. }
  3115. }
  3116. #endregion Primitive Packet/Data Sending Methods
  3117. /// <summary>
  3118. ///
  3119. /// </summary>
  3120. /// <param name="localID"></param>
  3121. /// <param name="rotation"></param>
  3122. /// <param name="attachPoint"></param>
  3123. public void AttachObject(uint localID, Quaternion rotation, byte attachPoint, UUID ownerID)
  3124. {
  3125. if (attachPoint > 30 && ownerID != AgentId) // Someone else's HUD
  3126. return;
  3127. ObjectAttachPacket attach = (ObjectAttachPacket)PacketPool.Instance.GetPacket(PacketType.ObjectAttach);
  3128. // TODO: don't create new blocks if recycling an old packet
  3129. attach.AgentData.AgentID = AgentId;
  3130. attach.AgentData.SessionID = m_sessionId;
  3131. attach.AgentData.AttachmentPoint = attachPoint;
  3132. attach.ObjectData = new ObjectAttachPacket.ObjectDataBlock[1];
  3133. attach.ObjectData[0] = new ObjectAttachPacket.ObjectDataBlock();
  3134. attach.ObjectData[0].ObjectLocalID = localID;
  3135. attach.ObjectData[0].Rotation = rotation;
  3136. attach.Header.Zerocoded = true;
  3137. OutPacket(attach, ThrottleOutPacketType.Task);
  3138. }
  3139. void HandleQueueEmpty(ThrottleOutPacketTypeFlags categories)
  3140. {
  3141. if ((categories & ThrottleOutPacketTypeFlags.Task) != 0)
  3142. {
  3143. lock (m_avatarTerseUpdates.SyncRoot)
  3144. {
  3145. if (m_avatarTerseUpdates.Count > 0)
  3146. ProcessAvatarTerseUpdates();
  3147. }
  3148. }
  3149. if ((categories & ThrottleOutPacketTypeFlags.State) != 0)
  3150. {
  3151. lock (m_primFullUpdates.SyncRoot)
  3152. {
  3153. if (m_primFullUpdates.Count > 0)
  3154. ProcessPrimFullUpdates();
  3155. }
  3156. lock (m_primTerseUpdates.SyncRoot)
  3157. {
  3158. if (m_primTerseUpdates.Count > 0)
  3159. ProcessPrimTerseUpdates();
  3160. }
  3161. }
  3162. if ((categories & ThrottleOutPacketTypeFlags.Texture) != 0)
  3163. {
  3164. ProcessTextureRequests();
  3165. }
  3166. }
  3167. void ProcessTextureRequests()
  3168. {
  3169. if (m_imageManager != null)
  3170. m_imageManager.ProcessImageQueue(m_udpServer.TextureSendLimit);
  3171. }
  3172. public void SendAssetUploadCompleteMessage(sbyte AssetType, bool Success, UUID AssetFullID)
  3173. {
  3174. AssetUploadCompletePacket newPack = new AssetUploadCompletePacket();
  3175. newPack.AssetBlock.Type = AssetType;
  3176. newPack.AssetBlock.Success = Success;
  3177. newPack.AssetBlock.UUID = AssetFullID;
  3178. newPack.Header.Zerocoded = true;
  3179. OutPacket(newPack, ThrottleOutPacketType.Asset);
  3180. }
  3181. public void SendXferRequest(ulong XferID, short AssetType, UUID vFileID, byte FilePath, byte[] FileName)
  3182. {
  3183. RequestXferPacket newPack = new RequestXferPacket();
  3184. newPack.XferID.ID = XferID;
  3185. newPack.XferID.VFileType = AssetType;
  3186. newPack.XferID.VFileID = vFileID;
  3187. newPack.XferID.FilePath = FilePath;
  3188. newPack.XferID.Filename = FileName;
  3189. newPack.Header.Zerocoded = true;
  3190. OutPacket(newPack, ThrottleOutPacketType.Asset);
  3191. }
  3192. public void SendConfirmXfer(ulong xferID, uint PacketID)
  3193. {
  3194. ConfirmXferPacketPacket newPack = new ConfirmXferPacketPacket();
  3195. newPack.XferID.ID = xferID;
  3196. newPack.XferID.Packet = PacketID;
  3197. newPack.Header.Zerocoded = true;
  3198. OutPacket(newPack, ThrottleOutPacketType.Asset);
  3199. }
  3200. public void SendInitiateDownload(string simFileName, string clientFileName)
  3201. {
  3202. InitiateDownloadPacket newPack = new InitiateDownloadPacket();
  3203. newPack.AgentData.AgentID = AgentId;
  3204. newPack.FileData.SimFilename = Utils.StringToBytes(simFileName);
  3205. newPack.FileData.ViewerFilename = Utils.StringToBytes(clientFileName);
  3206. OutPacket(newPack, ThrottleOutPacketType.Asset);
  3207. }
  3208. public void SendImageFirstPart(
  3209. ushort numParts, UUID ImageUUID, uint ImageSize, byte[] ImageData, byte imageCodec)
  3210. {
  3211. ImageDataPacket im = new ImageDataPacket();
  3212. im.Header.Reliable = false;
  3213. im.ImageID.Packets = numParts;
  3214. im.ImageID.ID = ImageUUID;
  3215. if (ImageSize > 0)
  3216. im.ImageID.Size = ImageSize;
  3217. im.ImageData.Data = ImageData;
  3218. im.ImageID.Codec = imageCodec;
  3219. im.Header.Zerocoded = true;
  3220. OutPacket(im, ThrottleOutPacketType.Texture);
  3221. }
  3222. public void SendImageNextPart(ushort partNumber, UUID imageUuid, byte[] imageData)
  3223. {
  3224. ImagePacketPacket im = new ImagePacketPacket();
  3225. im.Header.Reliable = false;
  3226. im.ImageID.Packet = partNumber;
  3227. im.ImageID.ID = imageUuid;
  3228. im.ImageData.Data = imageData;
  3229. OutPacket(im, ThrottleOutPacketType.Texture);
  3230. }
  3231. public void SendImageNotFound(UUID imageid)
  3232. {
  3233. ImageNotInDatabasePacket notFoundPacket
  3234. = (ImageNotInDatabasePacket)PacketPool.Instance.GetPacket(PacketType.ImageNotInDatabase);
  3235. notFoundPacket.ImageID.ID = imageid;
  3236. OutPacket(notFoundPacket, ThrottleOutPacketType.Texture);
  3237. }
  3238. public void SendShutdownConnectionNotice()
  3239. {
  3240. OutPacket(PacketPool.Instance.GetPacket(PacketType.DisableSimulator), ThrottleOutPacketType.Unknown);
  3241. }
  3242. public void SendSimStats(SimStats stats)
  3243. {
  3244. SimStatsPacket pack = new SimStatsPacket();
  3245. pack.Region = new SimStatsPacket.RegionBlock();
  3246. pack.Region.RegionX = stats.RegionX;
  3247. pack.Region.RegionY = stats.RegionY;
  3248. pack.Region.RegionFlags = stats.RegionFlags;
  3249. pack.Region.ObjectCapacity = stats.ObjectCapacity;
  3250. //pack.Region = //stats.RegionBlock;
  3251. pack.Stat = stats.StatsBlock;
  3252. pack.Header.Reliable = false;
  3253. OutPacket(pack, ThrottleOutPacketType.Task);
  3254. }
  3255. public void SendObjectPropertiesFamilyData(uint RequestFlags, UUID ObjectUUID, UUID OwnerID, UUID GroupID,
  3256. uint BaseMask, uint OwnerMask, uint GroupMask, uint EveryoneMask,
  3257. uint NextOwnerMask, int OwnershipCost, byte SaleType, int SalePrice, uint Category,
  3258. UUID LastOwnerID, string ObjectName, string Description)
  3259. {
  3260. ObjectPropertiesFamilyPacket objPropFamilyPack = (ObjectPropertiesFamilyPacket)PacketPool.Instance.GetPacket(PacketType.ObjectPropertiesFamily);
  3261. // TODO: don't create new blocks if recycling an old packet
  3262. ObjectPropertiesFamilyPacket.ObjectDataBlock objPropDB = new ObjectPropertiesFamilyPacket.ObjectDataBlock();
  3263. objPropDB.RequestFlags = RequestFlags;
  3264. objPropDB.ObjectID = ObjectUUID;
  3265. if (OwnerID == GroupID)
  3266. objPropDB.OwnerID = UUID.Zero;
  3267. else
  3268. objPropDB.OwnerID = OwnerID;
  3269. objPropDB.GroupID = GroupID;
  3270. objPropDB.BaseMask = BaseMask;
  3271. objPropDB.OwnerMask = OwnerMask;
  3272. objPropDB.GroupMask = GroupMask;
  3273. objPropDB.EveryoneMask = EveryoneMask;
  3274. objPropDB.NextOwnerMask = NextOwnerMask;
  3275. // TODO: More properties are needed in SceneObjectPart!
  3276. objPropDB.OwnershipCost = OwnershipCost;
  3277. objPropDB.SaleType = SaleType;
  3278. objPropDB.SalePrice = SalePrice;
  3279. objPropDB.Category = Category;
  3280. objPropDB.LastOwnerID = LastOwnerID;
  3281. objPropDB.Name = Util.StringToBytes256(ObjectName);
  3282. objPropDB.Description = Util.StringToBytes256(Description);
  3283. objPropFamilyPack.ObjectData = objPropDB;
  3284. objPropFamilyPack.Header.Zerocoded = true;
  3285. OutPacket(objPropFamilyPack, ThrottleOutPacketType.Task);
  3286. }
  3287. public void SendObjectPropertiesReply(
  3288. UUID ItemID, ulong CreationDate, UUID CreatorUUID, UUID FolderUUID, UUID FromTaskUUID,
  3289. UUID GroupUUID, short InventorySerial, UUID LastOwnerUUID, UUID ObjectUUID,
  3290. UUID OwnerUUID, string TouchTitle, byte[] TextureID, string SitTitle, string ItemName,
  3291. string ItemDescription, uint OwnerMask, uint NextOwnerMask, uint GroupMask, uint EveryoneMask,
  3292. uint BaseMask, byte saleType, int salePrice)
  3293. {
  3294. //ObjectPropertiesPacket proper = (ObjectPropertiesPacket)PacketPool.Instance.GetPacket(PacketType.ObjectProperties);
  3295. // TODO: don't create new blocks if recycling an old packet
  3296. ObjectPropertiesPacket.ObjectDataBlock block =
  3297. new ObjectPropertiesPacket.ObjectDataBlock();
  3298. block.ItemID = ItemID;
  3299. block.CreationDate = CreationDate;
  3300. block.CreatorID = CreatorUUID;
  3301. block.FolderID = FolderUUID;
  3302. block.FromTaskID = FromTaskUUID;
  3303. block.GroupID = GroupUUID;
  3304. block.InventorySerial = InventorySerial;
  3305. block.LastOwnerID = LastOwnerUUID;
  3306. // proper.ObjectData[0].LastOwnerID = UUID.Zero;
  3307. block.ObjectID = ObjectUUID;
  3308. if (OwnerUUID == GroupUUID)
  3309. block.OwnerID = UUID.Zero;
  3310. else
  3311. block.OwnerID = OwnerUUID;
  3312. block.TouchName = Util.StringToBytes256(TouchTitle);
  3313. block.TextureID = TextureID;
  3314. block.SitName = Util.StringToBytes256(SitTitle);
  3315. block.Name = Util.StringToBytes256(ItemName);
  3316. block.Description = Util.StringToBytes256(ItemDescription);
  3317. block.OwnerMask = OwnerMask;
  3318. block.NextOwnerMask = NextOwnerMask;
  3319. block.GroupMask = GroupMask;
  3320. block.EveryoneMask = EveryoneMask;
  3321. block.BaseMask = BaseMask;
  3322. // proper.ObjectData[0].AggregatePerms = 53;
  3323. // proper.ObjectData[0].AggregatePermTextures = 0;
  3324. // proper.ObjectData[0].AggregatePermTexturesOwner = 0;
  3325. block.SaleType = saleType;
  3326. block.SalePrice = salePrice;
  3327. lock (m_propertiesPacketTimer)
  3328. {
  3329. m_propertiesBlocks.Add(block);
  3330. int length = 0;
  3331. foreach (ObjectPropertiesPacket.ObjectDataBlock b in m_propertiesBlocks)
  3332. {
  3333. length += b.Length;
  3334. }
  3335. if (length > 1100) // FIXME: use real MTU
  3336. {
  3337. ProcessObjectPropertiesPacket(null, null);
  3338. m_propertiesPacketTimer.Stop();
  3339. return;
  3340. }
  3341. m_propertiesPacketTimer.Stop();
  3342. m_propertiesPacketTimer.Start();
  3343. }
  3344. //proper.Header.Zerocoded = true;
  3345. //OutPacket(proper, ThrottleOutPacketType.Task);
  3346. }
  3347. private void ProcessObjectPropertiesPacket(Object sender, ElapsedEventArgs e)
  3348. {
  3349. ObjectPropertiesPacket proper = (ObjectPropertiesPacket)PacketPool.Instance.GetPacket(PacketType.ObjectProperties);
  3350. lock (m_propertiesPacketTimer)
  3351. {
  3352. m_propertiesPacketTimer.Stop();
  3353. proper.ObjectData = new ObjectPropertiesPacket.ObjectDataBlock[m_propertiesBlocks.Count];
  3354. int index = 0;
  3355. foreach (ObjectPropertiesPacket.ObjectDataBlock b in m_propertiesBlocks)
  3356. {
  3357. proper.ObjectData[index++] = b;
  3358. }
  3359. m_propertiesBlocks.Clear();
  3360. }
  3361. proper.Header.Zerocoded = true;
  3362. OutPacket(proper, ThrottleOutPacketType.Task);
  3363. }
  3364. #region Estate Data Sending Methods
  3365. private static bool convertParamStringToBool(byte[] field)
  3366. {
  3367. string s = Utils.BytesToString(field);
  3368. if (s == "1" || s.ToLower() == "y" || s.ToLower() == "yes" || s.ToLower() == "t" || s.ToLower() == "true")
  3369. {
  3370. return true;
  3371. }
  3372. return false;
  3373. }
  3374. public void SendEstateList(UUID invoice, int code, UUID[] Data, uint estateID)
  3375. {
  3376. EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket();
  3377. packet.AgentData.TransactionID = UUID.Random();
  3378. packet.AgentData.AgentID = AgentId;
  3379. packet.AgentData.SessionID = SessionId;
  3380. packet.MethodData.Invoice = invoice;
  3381. packet.MethodData.Method = Utils.StringToBytes("setaccess");
  3382. EstateOwnerMessagePacket.ParamListBlock[] returnblock = new EstateOwnerMessagePacket.ParamListBlock[6 + Data.Length];
  3383. for (int i = 0; i < (6 + Data.Length); i++)
  3384. {
  3385. returnblock[i] = new EstateOwnerMessagePacket.ParamListBlock();
  3386. }
  3387. int j = 0;
  3388. returnblock[j].Parameter = Utils.StringToBytes(estateID.ToString()); j++;
  3389. returnblock[j].Parameter = Utils.StringToBytes(code.ToString()); j++;
  3390. returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
  3391. returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
  3392. returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
  3393. returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
  3394. j = 2; // Agents
  3395. if ((code & 2) != 0)
  3396. j = 3; // Groups
  3397. if ((code & 8) != 0)
  3398. j = 5; // Managers
  3399. returnblock[j].Parameter = Utils.StringToBytes(Data.Length.ToString());
  3400. j = 6;
  3401. for (int i = 0; i < Data.Length; i++)
  3402. {
  3403. returnblock[j].Parameter = Data[i].GetBytes(); j++;
  3404. }
  3405. packet.ParamList = returnblock;
  3406. packet.Header.Reliable = true;
  3407. OutPacket(packet, ThrottleOutPacketType.Task);
  3408. }
  3409. public void SendBannedUserList(UUID invoice, EstateBan[] bl, uint estateID)
  3410. {
  3411. List<UUID> BannedUsers = new List<UUID>();
  3412. for (int i = 0; i < bl.Length; i++)
  3413. {
  3414. if (bl[i] == null)
  3415. continue;
  3416. if (bl[i].BannedUserID == UUID.Zero)
  3417. continue;
  3418. BannedUsers.Add(bl[i].BannedUserID);
  3419. }
  3420. EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket();
  3421. packet.AgentData.TransactionID = UUID.Random();
  3422. packet.AgentData.AgentID = AgentId;
  3423. packet.AgentData.SessionID = SessionId;
  3424. packet.MethodData.Invoice = invoice;
  3425. packet.MethodData.Method = Utils.StringToBytes("setaccess");
  3426. EstateOwnerMessagePacket.ParamListBlock[] returnblock = new EstateOwnerMessagePacket.ParamListBlock[6 + BannedUsers.Count];
  3427. for (int i = 0; i < (6 + BannedUsers.Count); i++)
  3428. {
  3429. returnblock[i] = new EstateOwnerMessagePacket.ParamListBlock();
  3430. }
  3431. int j = 0;
  3432. returnblock[j].Parameter = Utils.StringToBytes(estateID.ToString()); j++;
  3433. returnblock[j].Parameter = Utils.StringToBytes(((int)Constants.EstateAccessCodex.EstateBans).ToString()); j++;
  3434. returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
  3435. returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
  3436. returnblock[j].Parameter = Utils.StringToBytes(BannedUsers.Count.ToString()); j++;
  3437. returnblock[j].Parameter = Utils.StringToBytes("0"); j++;
  3438. foreach (UUID banned in BannedUsers)
  3439. {
  3440. returnblock[j].Parameter = banned.GetBytes(); j++;
  3441. }
  3442. packet.ParamList = returnblock;
  3443. packet.Header.Reliable = false;
  3444. OutPacket(packet, ThrottleOutPacketType.Task);
  3445. }
  3446. public void SendRegionInfoToEstateMenu(RegionInfoForEstateMenuArgs args)
  3447. {
  3448. RegionInfoPacket rinfopack = new RegionInfoPacket();
  3449. RegionInfoPacket.RegionInfoBlock rinfoblk = new RegionInfoPacket.RegionInfoBlock();
  3450. rinfopack.AgentData.AgentID = AgentId;
  3451. rinfopack.AgentData.SessionID = SessionId;
  3452. rinfoblk.BillableFactor = args.billableFactor;
  3453. rinfoblk.EstateID = args.estateID;
  3454. rinfoblk.MaxAgents = args.maxAgents;
  3455. rinfoblk.ObjectBonusFactor = args.objectBonusFactor;
  3456. rinfoblk.ParentEstateID = args.parentEstateID;
  3457. rinfoblk.PricePerMeter = args.pricePerMeter;
  3458. rinfoblk.RedirectGridX = args.redirectGridX;
  3459. rinfoblk.RedirectGridY = args.redirectGridY;
  3460. rinfoblk.RegionFlags = args.regionFlags;
  3461. rinfoblk.SimAccess = args.simAccess;
  3462. rinfoblk.SunHour = args.sunHour;
  3463. rinfoblk.TerrainLowerLimit = args.terrainLowerLimit;
  3464. rinfoblk.TerrainRaiseLimit = args.terrainRaiseLimit;
  3465. rinfoblk.UseEstateSun = args.useEstateSun;
  3466. rinfoblk.WaterHeight = args.waterHeight;
  3467. rinfoblk.SimName = Utils.StringToBytes(args.simName);
  3468. rinfopack.RegionInfo2 = new RegionInfoPacket.RegionInfo2Block();
  3469. rinfopack.RegionInfo2.HardMaxAgents = uint.MaxValue;
  3470. rinfopack.RegionInfo2.HardMaxObjects = uint.MaxValue;
  3471. rinfopack.RegionInfo2.MaxAgents32 = uint.MaxValue;
  3472. rinfopack.RegionInfo2.ProductName = Utils.EmptyBytes;
  3473. rinfopack.RegionInfo2.ProductSKU = Utils.EmptyBytes;
  3474. rinfopack.HasVariableBlocks = true;
  3475. rinfopack.RegionInfo = rinfoblk;
  3476. rinfopack.AgentData = new RegionInfoPacket.AgentDataBlock();
  3477. rinfopack.AgentData.AgentID = AgentId;
  3478. rinfopack.AgentData.SessionID = SessionId;
  3479. OutPacket(rinfopack, ThrottleOutPacketType.Task);
  3480. }
  3481. public void SendEstateCovenantInformation(UUID covenant)
  3482. {
  3483. EstateCovenantReplyPacket einfopack = new EstateCovenantReplyPacket();
  3484. EstateCovenantReplyPacket.DataBlock edata = new EstateCovenantReplyPacket.DataBlock();
  3485. edata.CovenantID = covenant;
  3486. edata.CovenantTimestamp = 0;
  3487. if (m_scene.RegionInfo.EstateSettings.EstateOwner != UUID.Zero)
  3488. edata.EstateOwnerID = m_scene.RegionInfo.EstateSettings.EstateOwner;
  3489. else
  3490. edata.EstateOwnerID = m_scene.RegionInfo.MasterAvatarAssignedUUID;
  3491. edata.EstateName = Utils.StringToBytes(m_scene.RegionInfo.EstateSettings.EstateName);
  3492. einfopack.Data = edata;
  3493. OutPacket(einfopack, ThrottleOutPacketType.Task);
  3494. }
  3495. public void SendDetailedEstateData(UUID invoice, string estateName, uint estateID, uint parentEstate, uint estateFlags, uint sunPosition, UUID covenant, string abuseEmail, UUID estateOwner)
  3496. {
  3497. EstateOwnerMessagePacket packet = new EstateOwnerMessagePacket();
  3498. packet.MethodData.Invoice = invoice;
  3499. packet.AgentData.TransactionID = UUID.Random();
  3500. packet.MethodData.Method = Utils.StringToBytes("estateupdateinfo");
  3501. EstateOwnerMessagePacket.ParamListBlock[] returnblock = new EstateOwnerMessagePacket.ParamListBlock[10];
  3502. for (int i = 0; i < 10; i++)
  3503. {
  3504. returnblock[i] = new EstateOwnerMessagePacket.ParamListBlock();
  3505. }
  3506. //Sending Estate Settings
  3507. returnblock[0].Parameter = Utils.StringToBytes(estateName);
  3508. // TODO: remove this cruft once MasterAvatar is fully deprecated
  3509. //
  3510. returnblock[1].Parameter = Utils.StringToBytes(estateOwner.ToString());
  3511. returnblock[2].Parameter = Utils.StringToBytes(estateID.ToString());
  3512. returnblock[3].Parameter = Utils.StringToBytes(estateFlags.ToString());
  3513. returnblock[4].Parameter = Utils.StringToBytes(sunPosition.ToString());
  3514. returnblock[5].Parameter = Utils.StringToBytes(parentEstate.ToString());
  3515. returnblock[6].Parameter = Utils.StringToBytes(covenant.ToString());
  3516. returnblock[7].Parameter = Utils.StringToBytes("1160895077"); // what is this?
  3517. returnblock[8].Parameter = Utils.StringToBytes("1"); // what is this?
  3518. returnblock[9].Parameter = Utils.StringToBytes(abuseEmail);
  3519. packet.ParamList = returnblock;
  3520. packet.Header.Reliable = false;
  3521. //m_log.Debug("[ESTATE]: SIM--->" + packet.ToString());
  3522. OutPacket(packet, ThrottleOutPacketType.Task);
  3523. }
  3524. #endregion
  3525. #region Land Data Sending Methods
  3526. public void SendLandParcelOverlay(byte[] data, int sequence_id)
  3527. {
  3528. ParcelOverlayPacket packet = (ParcelOverlayPacket)PacketPool.Instance.GetPacket(PacketType.ParcelOverlay);
  3529. packet.ParcelData.Data = data;
  3530. packet.ParcelData.SequenceID = sequence_id;
  3531. packet.Header.Zerocoded = true;
  3532. OutPacket(packet, ThrottleOutPacketType.Task);
  3533. }
  3534. public void SendLandProperties(int sequence_id, bool snap_selection, int request_result, LandData landData, float simObjectBonusFactor, int parcelObjectCapacity, int simObjectCapacity, uint regionFlags)
  3535. {
  3536. ParcelPropertiesPacket updatePacket = (ParcelPropertiesPacket)PacketPool.Instance.GetPacket(PacketType.ParcelProperties);
  3537. // TODO: don't create new blocks if recycling an old packet
  3538. updatePacket.ParcelData.AABBMax = landData.AABBMax;
  3539. updatePacket.ParcelData.AABBMin = landData.AABBMin;
  3540. updatePacket.ParcelData.Area = landData.Area;
  3541. updatePacket.ParcelData.AuctionID = landData.AuctionID;
  3542. updatePacket.ParcelData.AuthBuyerID = landData.AuthBuyerID;
  3543. updatePacket.ParcelData.Bitmap = landData.Bitmap;
  3544. updatePacket.ParcelData.Desc = Utils.StringToBytes(landData.Description);
  3545. updatePacket.ParcelData.Category = (byte)landData.Category;
  3546. updatePacket.ParcelData.ClaimDate = landData.ClaimDate;
  3547. updatePacket.ParcelData.ClaimPrice = landData.ClaimPrice;
  3548. updatePacket.ParcelData.GroupID = landData.GroupID;
  3549. updatePacket.ParcelData.GroupPrims = landData.GroupPrims;
  3550. updatePacket.ParcelData.IsGroupOwned = landData.IsGroupOwned;
  3551. updatePacket.ParcelData.LandingType = landData.LandingType;
  3552. updatePacket.ParcelData.LocalID = landData.LocalID;
  3553. if (landData.Area > 0)
  3554. {
  3555. updatePacket.ParcelData.MaxPrims = parcelObjectCapacity;
  3556. }
  3557. else
  3558. {
  3559. updatePacket.ParcelData.MaxPrims = 0;
  3560. }
  3561. updatePacket.ParcelData.MediaAutoScale = landData.MediaAutoScale;
  3562. updatePacket.ParcelData.MediaID = landData.MediaID;
  3563. updatePacket.ParcelData.MediaURL = Util.StringToBytes256(landData.MediaURL);
  3564. updatePacket.ParcelData.MusicURL = Util.StringToBytes256(landData.MusicURL);
  3565. updatePacket.ParcelData.Name = Util.StringToBytes256(landData.Name);
  3566. updatePacket.ParcelData.OtherCleanTime = landData.OtherCleanTime;
  3567. updatePacket.ParcelData.OtherCount = 0; //TODO: Unimplemented
  3568. updatePacket.ParcelData.OtherPrims = landData.OtherPrims;
  3569. updatePacket.ParcelData.OwnerID = landData.OwnerID;
  3570. updatePacket.ParcelData.OwnerPrims = landData.OwnerPrims;
  3571. updatePacket.ParcelData.ParcelFlags = landData.Flags;
  3572. updatePacket.ParcelData.ParcelPrimBonus = simObjectBonusFactor;
  3573. updatePacket.ParcelData.PassHours = landData.PassHours;
  3574. updatePacket.ParcelData.PassPrice = landData.PassPrice;
  3575. updatePacket.ParcelData.PublicCount = 0; //TODO: Unimplemented
  3576. updatePacket.ParcelData.RegionDenyAnonymous = (regionFlags & (uint)RegionFlags.DenyAnonymous) > 0;
  3577. updatePacket.ParcelData.RegionDenyIdentified = (regionFlags & (uint)RegionFlags.DenyIdentified) > 0;
  3578. updatePacket.ParcelData.RegionDenyTransacted = (regionFlags & (uint)RegionFlags.DenyTransacted) > 0;
  3579. updatePacket.ParcelData.RegionPushOverride = (regionFlags & (uint)RegionFlags.RestrictPushObject) > 0;
  3580. updatePacket.ParcelData.RentPrice = 0;
  3581. updatePacket.ParcelData.RequestResult = request_result;
  3582. updatePacket.ParcelData.SalePrice = landData.SalePrice;
  3583. updatePacket.ParcelData.SelectedPrims = landData.SelectedPrims;
  3584. updatePacket.ParcelData.SelfCount = 0; //TODO: Unimplemented
  3585. updatePacket.ParcelData.SequenceID = sequence_id;
  3586. if (landData.SimwideArea > 0)
  3587. {
  3588. updatePacket.ParcelData.SimWideMaxPrims = parcelObjectCapacity;
  3589. }
  3590. else
  3591. {
  3592. updatePacket.ParcelData.SimWideMaxPrims = 0;
  3593. }
  3594. updatePacket.ParcelData.SimWideTotalPrims = landData.SimwidePrims;
  3595. updatePacket.ParcelData.SnapSelection = snap_selection;
  3596. updatePacket.ParcelData.SnapshotID = landData.SnapshotID;
  3597. updatePacket.ParcelData.Status = (byte)landData.Status;
  3598. updatePacket.ParcelData.TotalPrims = landData.OwnerPrims + landData.GroupPrims + landData.OtherPrims +
  3599. landData.SelectedPrims;
  3600. updatePacket.ParcelData.UserLocation = landData.UserLocation;
  3601. updatePacket.ParcelData.UserLookAt = landData.UserLookAt;
  3602. updatePacket.Header.Zerocoded = true;
  3603. try
  3604. {
  3605. IEventQueue eq = Scene.RequestModuleInterface<IEventQueue>();
  3606. if (eq != null)
  3607. {
  3608. eq.ParcelProperties(updatePacket, this.AgentId);
  3609. }
  3610. }
  3611. catch (Exception ex)
  3612. {
  3613. m_log.Error("Unable to send parcel data via eventqueue - exception: " + ex.ToString());
  3614. m_log.Warn("sending parcel data via UDP");
  3615. OutPacket(updatePacket, ThrottleOutPacketType.Task);
  3616. }
  3617. }
  3618. public void SendLandAccessListData(List<UUID> avatars, uint accessFlag, int localLandID)
  3619. {
  3620. ParcelAccessListReplyPacket replyPacket = (ParcelAccessListReplyPacket)PacketPool.Instance.GetPacket(PacketType.ParcelAccessListReply);
  3621. replyPacket.Data.AgentID = AgentId;
  3622. replyPacket.Data.Flags = accessFlag;
  3623. replyPacket.Data.LocalID = localLandID;
  3624. replyPacket.Data.SequenceID = 0;
  3625. List<ParcelAccessListReplyPacket.ListBlock> list = new List<ParcelAccessListReplyPacket.ListBlock>();
  3626. foreach (UUID avatar in avatars)
  3627. {
  3628. ParcelAccessListReplyPacket.ListBlock block = new ParcelAccessListReplyPacket.ListBlock();
  3629. block.Flags = accessFlag;
  3630. block.ID = avatar;
  3631. block.Time = 0;
  3632. list.Add(block);
  3633. }
  3634. replyPacket.List = list.ToArray();
  3635. replyPacket.Header.Zerocoded = true;
  3636. OutPacket(replyPacket, ThrottleOutPacketType.Task);
  3637. }
  3638. public void SendForceClientSelectObjects(List<uint> ObjectIDs)
  3639. {
  3640. bool firstCall = true;
  3641. const int MAX_OBJECTS_PER_PACKET = 251;
  3642. ForceObjectSelectPacket pack = (ForceObjectSelectPacket)PacketPool.Instance.GetPacket(PacketType.ForceObjectSelect);
  3643. ForceObjectSelectPacket.DataBlock[] data;
  3644. while (ObjectIDs.Count > 0)
  3645. {
  3646. if (firstCall)
  3647. {
  3648. pack._Header.ResetList = true;
  3649. firstCall = false;
  3650. }
  3651. else
  3652. {
  3653. pack._Header.ResetList = false;
  3654. }
  3655. if (ObjectIDs.Count > MAX_OBJECTS_PER_PACKET)
  3656. {
  3657. data = new ForceObjectSelectPacket.DataBlock[MAX_OBJECTS_PER_PACKET];
  3658. }
  3659. else
  3660. {
  3661. data = new ForceObjectSelectPacket.DataBlock[ObjectIDs.Count];
  3662. }
  3663. int i;
  3664. for (i = 0; i < MAX_OBJECTS_PER_PACKET && ObjectIDs.Count > 0; i++)
  3665. {
  3666. data[i] = new ForceObjectSelectPacket.DataBlock();
  3667. data[i].LocalID = Convert.ToUInt32(ObjectIDs[0]);
  3668. ObjectIDs.RemoveAt(0);
  3669. }
  3670. pack.Data = data;
  3671. pack.Header.Zerocoded = true;
  3672. OutPacket(pack, ThrottleOutPacketType.Task);
  3673. }
  3674. }
  3675. public void SendCameraConstraint(Vector4 ConstraintPlane)
  3676. {
  3677. CameraConstraintPacket cpack = (CameraConstraintPacket)PacketPool.Instance.GetPacket(PacketType.CameraConstraint);
  3678. cpack.CameraCollidePlane = new CameraConstraintPacket.CameraCollidePlaneBlock();
  3679. cpack.CameraCollidePlane.Plane = ConstraintPlane;
  3680. //m_log.DebugFormat("[CLIENTVIEW]: Constraint {0}", ConstraintPlane);
  3681. OutPacket(cpack, ThrottleOutPacketType.Task);
  3682. }
  3683. public void SendLandObjectOwners(LandData land, List<UUID> groups, Dictionary<UUID, int> ownersAndCount)
  3684. {
  3685. int notifyCount = ownersAndCount.Count;
  3686. ParcelObjectOwnersReplyPacket pack = (ParcelObjectOwnersReplyPacket)PacketPool.Instance.GetPacket(PacketType.ParcelObjectOwnersReply);
  3687. if (notifyCount > 0)
  3688. {
  3689. if (notifyCount > 32)
  3690. {
  3691. m_log.InfoFormat(
  3692. "[LAND]: More than {0} avatars own prims on this parcel. Only sending back details of first {0}"
  3693. + " - a developer might want to investigate whether this is a hard limit", 32);
  3694. notifyCount = 32;
  3695. }
  3696. ParcelObjectOwnersReplyPacket.DataBlock[] dataBlock
  3697. = new ParcelObjectOwnersReplyPacket.DataBlock[notifyCount];
  3698. int num = 0;
  3699. foreach (UUID owner in ownersAndCount.Keys)
  3700. {
  3701. dataBlock[num] = new ParcelObjectOwnersReplyPacket.DataBlock();
  3702. dataBlock[num].Count = ownersAndCount[owner];
  3703. if (land.GroupID == owner || groups.Contains(owner))
  3704. dataBlock[num].IsGroupOwned = true;
  3705. dataBlock[num].OnlineStatus = true; //TODO: fix me later
  3706. dataBlock[num].OwnerID = owner;
  3707. num++;
  3708. if (num >= notifyCount)
  3709. {
  3710. break;
  3711. }
  3712. }
  3713. pack.Data = dataBlock;
  3714. }
  3715. else
  3716. {
  3717. pack.Data = new ParcelObjectOwnersReplyPacket.DataBlock[0];
  3718. }
  3719. pack.Header.Zerocoded = true;
  3720. this.OutPacket(pack, ThrottleOutPacketType.Task);
  3721. }
  3722. #endregion
  3723. #region Helper Methods
  3724. protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateImprovedTerseBlock(SendAvatarTerseData data)
  3725. {
  3726. return CreateImprovedTerseBlock(true, data.LocalID, 0, data.CollisionPlane, data.Position, data.Velocity,
  3727. data.Acceleration, data.Rotation, Vector3.Zero, data.TextureEntry);
  3728. }
  3729. protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateImprovedTerseBlock(SendPrimitiveTerseData data)
  3730. {
  3731. return CreateImprovedTerseBlock(false, data.LocalID, data.AttachPoint, Vector4.Zero, data.Position, data.Velocity,
  3732. data.Acceleration, data.Rotation, data.AngularVelocity, data.TextureEntry);
  3733. }
  3734. protected ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateImprovedTerseBlock(bool avatar, uint localID, int attachPoint,
  3735. Vector4 collisionPlane, Vector3 position, Vector3 velocity, Vector3 acceleration, Quaternion rotation,
  3736. Vector3 angularVelocity, byte[] textureEntry)
  3737. {
  3738. int pos = 0;
  3739. byte[] data = new byte[(avatar ? 60 : 44)];
  3740. // LocalID
  3741. Utils.UIntToBytes(localID, data, pos);
  3742. pos += 4;
  3743. // Avatar/CollisionPlane
  3744. data[pos++] = (byte)((attachPoint % 16) * 16 + (attachPoint / 16)); ;
  3745. if (avatar)
  3746. {
  3747. data[pos++] = 1;
  3748. if (collisionPlane == Vector4.Zero)
  3749. collisionPlane = Vector4.UnitW;
  3750. //m_log.DebugFormat("CollisionPlane: {0}",collisionPlane);
  3751. collisionPlane.ToBytes(data, pos);
  3752. pos += 16;
  3753. }
  3754. else
  3755. {
  3756. ++pos;
  3757. }
  3758. // Position
  3759. position.ToBytes(data, pos);
  3760. pos += 12;
  3761. // Velocity
  3762. Utils.UInt16ToBytes(Utils.FloatToUInt16(velocity.X, -128.0f, 128.0f), data, pos); pos += 2;
  3763. Utils.UInt16ToBytes(Utils.FloatToUInt16(velocity.Y, -128.0f, 128.0f), data, pos); pos += 2;
  3764. Utils.UInt16ToBytes(Utils.FloatToUInt16(velocity.Z, -128.0f, 128.0f), data, pos); pos += 2;
  3765. // Acceleration
  3766. Utils.UInt16ToBytes(Utils.FloatToUInt16(acceleration.X, -64.0f, 64.0f), data, pos); pos += 2;
  3767. Utils.UInt16ToBytes(Utils.FloatToUInt16(acceleration.Y, -64.0f, 64.0f), data, pos); pos += 2;
  3768. Utils.UInt16ToBytes(Utils.FloatToUInt16(acceleration.Z, -64.0f, 64.0f), data, pos); pos += 2;
  3769. // Rotation
  3770. Utils.UInt16ToBytes(Utils.FloatToUInt16(rotation.X, -1.0f, 1.0f), data, pos); pos += 2;
  3771. Utils.UInt16ToBytes(Utils.FloatToUInt16(rotation.Y, -1.0f, 1.0f), data, pos); pos += 2;
  3772. Utils.UInt16ToBytes(Utils.FloatToUInt16(rotation.Z, -1.0f, 1.0f), data, pos); pos += 2;
  3773. Utils.UInt16ToBytes(Utils.FloatToUInt16(rotation.W, -1.0f, 1.0f), data, pos); pos += 2;
  3774. // Angular Velocity
  3775. Utils.UInt16ToBytes(Utils.FloatToUInt16(angularVelocity.X, -64.0f, 64.0f), data, pos); pos += 2;
  3776. Utils.UInt16ToBytes(Utils.FloatToUInt16(angularVelocity.Y, -64.0f, 64.0f), data, pos); pos += 2;
  3777. Utils.UInt16ToBytes(Utils.FloatToUInt16(angularVelocity.Z, -64.0f, 64.0f), data, pos); pos += 2;
  3778. ImprovedTerseObjectUpdatePacket.ObjectDataBlock block = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock();
  3779. block.Data = data;
  3780. if (textureEntry != null && textureEntry.Length > 0)
  3781. {
  3782. byte[] teBytesFinal = new byte[textureEntry.Length + 4];
  3783. // Texture Length
  3784. Utils.IntToBytes(textureEntry.Length, textureEntry, 0);
  3785. // Texture
  3786. Buffer.BlockCopy(textureEntry, 0, teBytesFinal, 4, textureEntry.Length);
  3787. block.TextureEntry = teBytesFinal;
  3788. }
  3789. else
  3790. {
  3791. block.TextureEntry = Utils.EmptyBytes;
  3792. }
  3793. return block;
  3794. }
  3795. protected ObjectUpdatePacket.ObjectDataBlock CreateAvatarUpdateBlock(SendAvatarData data)
  3796. {
  3797. byte[] objectData = new byte[76];
  3798. Vector4.UnitW.ToBytes(objectData, 0); // TODO: Collision plane support
  3799. data.Position.ToBytes(objectData, 16);
  3800. //data.Velocity.ToBytes(objectData, 28);
  3801. //data.Acceleration.ToBytes(objectData, 40);
  3802. data.Rotation.ToBytes(objectData, 52);
  3803. //data.AngularVelocity.ToBytes(objectData, 64);
  3804. ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock();
  3805. update.Data = Utils.EmptyBytes;
  3806. update.ExtraParams = new byte[1];
  3807. update.FullID = data.AvatarID;
  3808. update.ID = data.AvatarLocalID;
  3809. update.Material = (byte)Material.Flesh;
  3810. update.MediaURL = Utils.EmptyBytes;
  3811. update.NameValue = Utils.StringToBytes("FirstName STRING RW SV " + data.FirstName + "\nLastName STRING RW SV " +
  3812. data.LastName + "\nTitle STRING RW SV " + data.GroupTitle);
  3813. update.ObjectData = objectData;
  3814. update.ParentID = data.ParentID;
  3815. update.PathCurve = 16;
  3816. update.PathScaleX = 100;
  3817. update.PathScaleY = 100;
  3818. update.PCode = (byte)PCode.Avatar;
  3819. update.ProfileCurve = 1;
  3820. update.PSBlock = Utils.EmptyBytes;
  3821. update.Scale = new Vector3(0.45f,0.6f,1.9f);
  3822. update.Text = Utils.EmptyBytes;
  3823. update.TextColor = new byte[4];
  3824. update.TextureAnim = Utils.EmptyBytes;
  3825. update.TextureEntry = data.TextureEntry ?? Utils.EmptyBytes;
  3826. update.UpdateFlags = (uint)(PrimFlags.Physics | PrimFlags.ObjectModify | PrimFlags.ObjectCopy | PrimFlags.ObjectAnyOwner | PrimFlags.ObjectYouOwner | PrimFlags.ObjectMove | PrimFlags.InventoryEmpty | PrimFlags.ObjectTransfer | PrimFlags.ObjectOwnerModify);//61 + (9 << 8) + (130 << 16) + (16 << 24); // TODO: Replace these numbers with PrimFlags
  3827. return update;
  3828. }
  3829. protected ObjectUpdatePacket.ObjectDataBlock CreatePrimUpdateBlock(SendPrimitiveData data)
  3830. {
  3831. byte[] objectData = new byte[60];
  3832. data.pos.ToBytes(objectData, 0);
  3833. data.vel.ToBytes(objectData, 12);
  3834. data.acc.ToBytes(objectData, 24);
  3835. data.rotation.ToBytes(objectData, 36);
  3836. data.rvel.ToBytes(objectData, 48);
  3837. ObjectUpdatePacket.ObjectDataBlock update = new ObjectUpdatePacket.ObjectDataBlock();
  3838. update.ClickAction = (byte)data.clickAction;
  3839. update.CRC = 0;
  3840. update.ExtraParams = data.primShape.ExtraParams ?? Utils.EmptyBytes;
  3841. update.FullID = data.objectID;
  3842. update.ID = data.localID;
  3843. //update.JointAxisOrAnchor = Vector3.Zero; // These are deprecated
  3844. //update.JointPivot = Vector3.Zero;
  3845. //update.JointType = 0;
  3846. update.Material = data.material;
  3847. update.MediaURL = Utils.EmptyBytes; // FIXME: Support this in OpenSim
  3848. if (data.attachment)
  3849. {
  3850. update.NameValue = Util.StringToBytes256("AttachItemID STRING RW SV " + data.AssetId);
  3851. update.State = (byte)((data.AttachPoint % 16) * 16 + (data.AttachPoint / 16));
  3852. }
  3853. else
  3854. {
  3855. update.NameValue = Utils.EmptyBytes;
  3856. update.State = data.primShape.State;
  3857. }
  3858. update.ObjectData = objectData;
  3859. update.ParentID = data.parentID;
  3860. update.PathBegin = data.primShape.PathBegin;
  3861. update.PathCurve = data.primShape.PathCurve;
  3862. update.PathEnd = data.primShape.PathEnd;
  3863. update.PathRadiusOffset = data.primShape.PathRadiusOffset;
  3864. update.PathRevolutions = data.primShape.PathRevolutions;
  3865. update.PathScaleX = data.primShape.PathScaleX;
  3866. update.PathScaleY = data.primShape.PathScaleY;
  3867. update.PathShearX = data.primShape.PathShearX;
  3868. update.PathShearY = data.primShape.PathShearY;
  3869. update.PathSkew = data.primShape.PathSkew;
  3870. update.PathTaperX = data.primShape.PathTaperX;
  3871. update.PathTaperY = data.primShape.PathTaperY;
  3872. update.PathTwist = data.primShape.PathTwist;
  3873. update.PathTwistBegin = data.primShape.PathTwistBegin;
  3874. update.PCode = data.primShape.PCode;
  3875. update.ProfileBegin = data.primShape.ProfileBegin;
  3876. update.ProfileCurve = data.primShape.ProfileCurve;
  3877. update.ProfileEnd = data.primShape.ProfileEnd;
  3878. update.ProfileHollow = data.primShape.ProfileHollow;
  3879. update.PSBlock = data.particleSystem ?? Utils.EmptyBytes;
  3880. update.TextColor = data.color ?? Color4.Black.GetBytes(true);
  3881. update.TextureAnim = data.textureanim ?? Utils.EmptyBytes;
  3882. update.TextureEntry = data.primShape.TextureEntry ?? Utils.EmptyBytes;
  3883. update.Scale = data.primShape.Scale;
  3884. update.Text = Util.StringToBytes256(data.text);
  3885. update.UpdateFlags = (uint)data.flags;
  3886. if (data.SoundId != UUID.Zero)
  3887. {
  3888. update.Sound = data.SoundId;
  3889. update.OwnerID = data.ownerID;
  3890. update.Gain = (float)data.SoundVolume;
  3891. update.Radius = (float)data.SoundRadius;
  3892. update.Flags = data.SoundFlags;
  3893. }
  3894. switch ((PCode)data.primShape.PCode)
  3895. {
  3896. case PCode.Grass:
  3897. case PCode.Tree:
  3898. case PCode.NewTree:
  3899. update.Data = new byte[] { data.primShape.State };
  3900. break;
  3901. default:
  3902. // TODO: Support ScratchPad
  3903. //if (prim.ScratchPad != null)
  3904. //{
  3905. // update.Data = new byte[prim.ScratchPad.Length];
  3906. // Buffer.BlockCopy(prim.ScratchPad, 0, update.Data, 0, update.Data.Length);
  3907. //}
  3908. //else
  3909. //{
  3910. // update.Data = Utils.EmptyBytes;
  3911. //}
  3912. update.Data = Utils.EmptyBytes;
  3913. break;
  3914. }
  3915. return update;
  3916. }
  3917. public void SendNameReply(UUID profileId, string firstname, string lastname)
  3918. {
  3919. UUIDNameReplyPacket packet = (UUIDNameReplyPacket)PacketPool.Instance.GetPacket(PacketType.UUIDNameReply);
  3920. // TODO: don't create new blocks if recycling an old packet
  3921. packet.UUIDNameBlock = new UUIDNameReplyPacket.UUIDNameBlockBlock[1];
  3922. packet.UUIDNameBlock[0] = new UUIDNameReplyPacket.UUIDNameBlockBlock();
  3923. packet.UUIDNameBlock[0].ID = profileId;
  3924. packet.UUIDNameBlock[0].FirstName = Util.StringToBytes256(firstname);
  3925. packet.UUIDNameBlock[0].LastName = Util.StringToBytes256(lastname);
  3926. OutPacket(packet, ThrottleOutPacketType.Task);
  3927. }
  3928. public ulong GetGroupPowers(UUID groupID)
  3929. {
  3930. if (groupID == m_activeGroupID)
  3931. return m_activeGroupPowers;
  3932. if (m_groupPowers.ContainsKey(groupID))
  3933. return m_groupPowers[groupID];
  3934. return 0;
  3935. }
  3936. /// <summary>
  3937. /// This is a utility method used by single states to not duplicate kicks and blue card of death messages.
  3938. /// </summary>
  3939. public bool ChildAgentStatus()
  3940. {
  3941. return m_scene.PresenceChildStatus(AgentId);
  3942. }
  3943. #endregion
  3944. /// <summary>
  3945. /// This is a different way of processing packets then ProcessInPacket
  3946. /// </summary>
  3947. protected virtual void RegisterLocalPacketHandlers()
  3948. {
  3949. AddLocalPacketHandler(PacketType.LogoutRequest, HandleLogout);
  3950. AddLocalPacketHandler(PacketType.AgentUpdate, HandleAgentUpdate, false);
  3951. AddLocalPacketHandler(PacketType.ViewerEffect, HandleViewerEffect, false);
  3952. AddLocalPacketHandler(PacketType.AgentCachedTexture, HandleAgentTextureCached, false);
  3953. AddLocalPacketHandler(PacketType.MultipleObjectUpdate, HandleMultipleObjUpdate, false);
  3954. AddLocalPacketHandler(PacketType.MoneyTransferRequest, HandleMoneyTransferRequest, false);
  3955. AddLocalPacketHandler(PacketType.ParcelBuy, HandleParcelBuyRequest, false);
  3956. AddLocalPacketHandler(PacketType.UUIDGroupNameRequest, HandleUUIDGroupNameRequest, false);
  3957. AddLocalPacketHandler(PacketType.ObjectGroup, HandleObjectGroupRequest, false);
  3958. AddLocalPacketHandler(PacketType.GenericMessage, HandleGenericMessage);
  3959. AddLocalPacketHandler(PacketType.AvatarPropertiesRequest, HandleAvatarPropertiesRequest);
  3960. AddLocalPacketHandler(PacketType.ChatFromViewer, HandleChatFromViewer);
  3961. AddLocalPacketHandler(PacketType.AvatarPropertiesUpdate, HandlerAvatarPropertiesUpdate);
  3962. AddLocalPacketHandler(PacketType.ScriptDialogReply, HandlerScriptDialogReply);
  3963. AddLocalPacketHandler(PacketType.ImprovedInstantMessage, HandlerImprovedInstantMessage, false);
  3964. AddLocalPacketHandler(PacketType.AcceptFriendship, HandlerAcceptFriendship);
  3965. AddLocalPacketHandler(PacketType.DeclineFriendship, HandlerDeclineFriendship);
  3966. AddLocalPacketHandler(PacketType.TerminateFriendship, HandlerTerminateFrendship);
  3967. AddLocalPacketHandler(PacketType.RezObject, HandlerRezObject);
  3968. AddLocalPacketHandler(PacketType.DeRezObject, HandlerDeRezObject);
  3969. AddLocalPacketHandler(PacketType.ModifyLand, HandlerModifyLand);
  3970. AddLocalPacketHandler(PacketType.RegionHandshakeReply, HandlerRegionHandshakeReply);
  3971. AddLocalPacketHandler(PacketType.AgentWearablesRequest, HandlerAgentWearablesRequest);
  3972. AddLocalPacketHandler(PacketType.AgentSetAppearance, HandlerAgentSetAppearance);
  3973. AddLocalPacketHandler(PacketType.AgentIsNowWearing, HandlerAgentIsNowWearing);
  3974. AddLocalPacketHandler(PacketType.RezSingleAttachmentFromInv, HandlerRezSingleAttachmentFromInv);
  3975. AddLocalPacketHandler(PacketType.RezMultipleAttachmentsFromInv, HandleRezMultipleAttachmentsFromInv);
  3976. AddLocalPacketHandler(PacketType.DetachAttachmentIntoInv, HandleDetachAttachmentIntoInv);
  3977. AddLocalPacketHandler(PacketType.ObjectAttach, HandleObjectAttach);
  3978. AddLocalPacketHandler(PacketType.ObjectDetach, HandleObjectDetach);
  3979. AddLocalPacketHandler(PacketType.ObjectDrop, HandleObjectDrop);
  3980. AddLocalPacketHandler(PacketType.SetAlwaysRun, HandleSetAlwaysRun, false);
  3981. AddLocalPacketHandler(PacketType.CompleteAgentMovement, HandleCompleteAgentMovement);
  3982. AddLocalPacketHandler(PacketType.AgentAnimation, HandleAgentAnimation, false);
  3983. AddLocalPacketHandler(PacketType.AgentRequestSit, HandleAgentRequestSit);
  3984. AddLocalPacketHandler(PacketType.AgentSit, HandleAgentSit);
  3985. AddLocalPacketHandler(PacketType.SoundTrigger, HandleSoundTrigger);
  3986. AddLocalPacketHandler(PacketType.AvatarPickerRequest, HandleAvatarPickerRequest);
  3987. AddLocalPacketHandler(PacketType.AgentDataUpdateRequest, HandleAgentDataUpdateRequest);
  3988. AddLocalPacketHandler(PacketType.UserInfoRequest, HandleUserInfoRequest);
  3989. AddLocalPacketHandler(PacketType.UpdateUserInfo, HandleUpdateUserInfo);
  3990. AddLocalPacketHandler(PacketType.SetStartLocationRequest, HandleSetStartLocationRequest);
  3991. AddLocalPacketHandler(PacketType.AgentThrottle, HandleAgentThrottle, false);
  3992. AddLocalPacketHandler(PacketType.AgentPause, HandleAgentPause, false);
  3993. AddLocalPacketHandler(PacketType.AgentResume, HandleAgentResume, false);
  3994. AddLocalPacketHandler(PacketType.ForceScriptControlRelease, HandleForceScriptControlRelease);
  3995. AddLocalPacketHandler(PacketType.ObjectLink, HandleObjectLink);
  3996. AddLocalPacketHandler(PacketType.ObjectDelink, HandleObjectDelink);
  3997. AddLocalPacketHandler(PacketType.ObjectAdd, HandleObjectAdd);
  3998. AddLocalPacketHandler(PacketType.ObjectShape, HandleObjectShape);
  3999. AddLocalPacketHandler(PacketType.ObjectExtraParams, HandleObjectExtraParams);
  4000. AddLocalPacketHandler(PacketType.ObjectDuplicate, HandleObjectDuplicate);
  4001. AddLocalPacketHandler(PacketType.RequestMultipleObjects, HandleRequestMultipleObjects);
  4002. AddLocalPacketHandler(PacketType.ObjectSelect, HandleObjectSelect);
  4003. AddLocalPacketHandler(PacketType.ObjectDeselect, HandleObjectDeselect);
  4004. AddLocalPacketHandler(PacketType.ObjectPosition, HandleObjectPosition);
  4005. AddLocalPacketHandler(PacketType.ObjectScale, HandleObjectScale);
  4006. AddLocalPacketHandler(PacketType.ObjectRotation, HandleObjectRotation);
  4007. AddLocalPacketHandler(PacketType.ObjectFlagUpdate, HandleObjectFlagUpdate);
  4008. AddLocalPacketHandler(PacketType.ObjectImage, HandleObjectImage);
  4009. AddLocalPacketHandler(PacketType.ObjectGrab, HandleObjectGrab, false);
  4010. AddLocalPacketHandler(PacketType.ObjectGrabUpdate, HandleObjectGrabUpdate, false);
  4011. AddLocalPacketHandler(PacketType.ObjectDeGrab, HandleObjectDeGrab);
  4012. AddLocalPacketHandler(PacketType.ObjectSpinStart, HandleObjectSpinStart, false);
  4013. AddLocalPacketHandler(PacketType.ObjectSpinUpdate, HandleObjectSpinUpdate, false);
  4014. AddLocalPacketHandler(PacketType.ObjectSpinStop, HandleObjectSpinStop, false);
  4015. AddLocalPacketHandler(PacketType.ObjectDescription, HandleObjectDescription, false);
  4016. AddLocalPacketHandler(PacketType.ObjectName, HandleObjectName, false);
  4017. AddLocalPacketHandler(PacketType.ObjectPermissions, HandleObjectPermissions, false);
  4018. AddLocalPacketHandler(PacketType.Undo, HandleUndo, false);
  4019. AddLocalPacketHandler(PacketType.ObjectDuplicateOnRay, HandleObjectDuplicateOnRay);
  4020. AddLocalPacketHandler(PacketType.RequestObjectPropertiesFamily, HandleRequestObjectPropertiesFamily, false);
  4021. AddLocalPacketHandler(PacketType.ObjectIncludeInSearch, HandleObjectIncludeInSearch);
  4022. AddLocalPacketHandler(PacketType.ScriptAnswerYes, HandleScriptAnswerYes, false);
  4023. AddLocalPacketHandler(PacketType.ObjectClickAction, HandleObjectClickAction, false);
  4024. AddLocalPacketHandler(PacketType.ObjectMaterial, HandleObjectMaterial, false);
  4025. AddLocalPacketHandler(PacketType.RequestImage, HandleRequestImage);
  4026. AddLocalPacketHandler(PacketType.TransferRequest, HandleTransferRequest);
  4027. AddLocalPacketHandler(PacketType.AssetUploadRequest, HandleAssetUploadRequest);
  4028. AddLocalPacketHandler(PacketType.RequestXfer, HandleRequestXfer);
  4029. AddLocalPacketHandler(PacketType.SendXferPacket, HandleSendXferPacket);
  4030. AddLocalPacketHandler(PacketType.ConfirmXferPacket, HandleConfirmXferPacket);
  4031. AddLocalPacketHandler(PacketType.AbortXfer, HandleAbortXfer);
  4032. AddLocalPacketHandler(PacketType.CreateInventoryFolder, HandleCreateInventoryFolder);
  4033. AddLocalPacketHandler(PacketType.UpdateInventoryFolder, HandleUpdateInventoryFolder);
  4034. AddLocalPacketHandler(PacketType.MoveInventoryFolder, HandleMoveInventoryFolder);
  4035. AddLocalPacketHandler(PacketType.CreateInventoryItem, HandleCreateInventoryItem);
  4036. AddLocalPacketHandler(PacketType.FetchInventory, HandleFetchInventory);
  4037. AddLocalPacketHandler(PacketType.FetchInventoryDescendents, HandleFetchInventoryDescendents);
  4038. AddLocalPacketHandler(PacketType.PurgeInventoryDescendents, HandlePurgeInventoryDescendents);
  4039. AddLocalPacketHandler(PacketType.UpdateInventoryItem, HandleUpdateInventoryItem);
  4040. AddLocalPacketHandler(PacketType.CopyInventoryItem, HandleCopyInventoryItem);
  4041. AddLocalPacketHandler(PacketType.MoveInventoryItem, HandleMoveInventoryItem);
  4042. AddLocalPacketHandler(PacketType.RemoveInventoryItem, HandleRemoveInventoryItem);
  4043. AddLocalPacketHandler(PacketType.RemoveInventoryFolder, HandleRemoveInventoryFolder);
  4044. AddLocalPacketHandler(PacketType.RemoveInventoryObjects, HandleRemoveInventoryObjects);
  4045. AddLocalPacketHandler(PacketType.RequestTaskInventory, HandleRequestTaskInventory);
  4046. AddLocalPacketHandler(PacketType.UpdateTaskInventory, HandleUpdateTaskInventory);
  4047. AddLocalPacketHandler(PacketType.RemoveTaskInventory, HandleRemoveTaskInventory);
  4048. AddLocalPacketHandler(PacketType.MoveTaskInventory, HandleMoveTaskInventory);
  4049. AddLocalPacketHandler(PacketType.RezScript, HandleRezScript);
  4050. AddLocalPacketHandler(PacketType.MapLayerRequest, HandleMapLayerRequest, false);
  4051. AddLocalPacketHandler(PacketType.MapBlockRequest, HandleMapBlockRequest, false);
  4052. AddLocalPacketHandler(PacketType.MapNameRequest, HandleMapNameRequest, false);
  4053. AddLocalPacketHandler(PacketType.TeleportLandmarkRequest, HandleTeleportLandmarkRequest);
  4054. AddLocalPacketHandler(PacketType.TeleportLocationRequest, HandleTeleportLocationRequest);
  4055. AddLocalPacketHandler(PacketType.UUIDNameRequest, HandleUUIDNameRequest, false);
  4056. AddLocalPacketHandler(PacketType.RegionHandleRequest, HandleRegionHandleRequest);
  4057. AddLocalPacketHandler(PacketType.ParcelInfoRequest, HandleParcelInfoRequest, false);
  4058. AddLocalPacketHandler(PacketType.ParcelAccessListRequest, HandleParcelAccessListRequest, false);
  4059. AddLocalPacketHandler(PacketType.ParcelAccessListUpdate, HandleParcelAccessListUpdate, false);
  4060. AddLocalPacketHandler(PacketType.ParcelPropertiesRequest, HandleParcelPropertiesRequest, false);
  4061. AddLocalPacketHandler(PacketType.ParcelDivide, HandleParcelDivide);
  4062. AddLocalPacketHandler(PacketType.ParcelJoin, HandleParcelJoin);
  4063. AddLocalPacketHandler(PacketType.ParcelPropertiesUpdate, HandleParcelPropertiesUpdate);
  4064. AddLocalPacketHandler(PacketType.ParcelSelectObjects, HandleParcelSelectObjects);
  4065. AddLocalPacketHandler(PacketType.ParcelObjectOwnersRequest, HandleParcelObjectOwnersRequest);
  4066. AddLocalPacketHandler(PacketType.ParcelGodForceOwner, HandleParcelGodForceOwner);
  4067. AddLocalPacketHandler(PacketType.ParcelRelease, HandleParcelRelease);
  4068. AddLocalPacketHandler(PacketType.ParcelReclaim, HandleParcelReclaim);
  4069. AddLocalPacketHandler(PacketType.ParcelReturnObjects, HandleParcelReturnObjects);
  4070. AddLocalPacketHandler(PacketType.ParcelSetOtherCleanTime, HandleParcelSetOtherCleanTime);
  4071. AddLocalPacketHandler(PacketType.LandStatRequest, HandleLandStatRequest);
  4072. AddLocalPacketHandler(PacketType.ParcelDwellRequest, HandleParcelDwellRequest);
  4073. AddLocalPacketHandler(PacketType.EstateOwnerMessage, HandleEstateOwnerMessage);
  4074. AddLocalPacketHandler(PacketType.RequestRegionInfo, HandleRequestRegionInfo, false);
  4075. AddLocalPacketHandler(PacketType.EstateCovenantRequest, HandleEstateCovenantRequest);
  4076. AddLocalPacketHandler(PacketType.RequestGodlikePowers, HandleRequestGodlikePowers);
  4077. AddLocalPacketHandler(PacketType.GodKickUser, HandleGodKickUser);
  4078. AddLocalPacketHandler(PacketType.MoneyBalanceRequest, HandleMoneyBalanceRequest);
  4079. AddLocalPacketHandler(PacketType.EconomyDataRequest, HandleEconomyDataRequest);
  4080. AddLocalPacketHandler(PacketType.RequestPayPrice, HandleRequestPayPrice);
  4081. AddLocalPacketHandler(PacketType.ObjectSaleInfo, HandleObjectSaleInfo);
  4082. AddLocalPacketHandler(PacketType.ObjectBuy, HandleObjectBuy);
  4083. AddLocalPacketHandler(PacketType.GetScriptRunning, HandleGetScriptRunning);
  4084. AddLocalPacketHandler(PacketType.SetScriptRunning, HandleSetScriptRunning);
  4085. AddLocalPacketHandler(PacketType.ScriptReset, HandleScriptReset);
  4086. AddLocalPacketHandler(PacketType.ActivateGestures, HandleActivateGestures);
  4087. AddLocalPacketHandler(PacketType.DeactivateGestures, HandleDeactivateGestures);
  4088. AddLocalPacketHandler(PacketType.ObjectOwner, HandleObjectOwner);
  4089. AddLocalPacketHandler(PacketType.AgentFOV, HandleAgentFOV, false);
  4090. AddLocalPacketHandler(PacketType.ViewerStats, HandleViewerStats);
  4091. AddLocalPacketHandler(PacketType.MapItemRequest, HandleMapItemRequest, false);
  4092. AddLocalPacketHandler(PacketType.TransferAbort, HandleTransferAbort, false);
  4093. AddLocalPacketHandler(PacketType.MuteListRequest, HandleMuteListRequest, false);
  4094. AddLocalPacketHandler(PacketType.UseCircuitCode, HandleUseCircuitCode);
  4095. AddLocalPacketHandler(PacketType.AgentHeightWidth, HandleAgentHeightWidth, false);
  4096. AddLocalPacketHandler(PacketType.InventoryDescendents, HandleInventoryDescendents);
  4097. AddLocalPacketHandler(PacketType.DirPlacesQuery, HandleDirPlacesQuery);
  4098. AddLocalPacketHandler(PacketType.DirFindQuery, HandleDirFindQuery);
  4099. AddLocalPacketHandler(PacketType.DirLandQuery, HandleDirLandQuery);
  4100. AddLocalPacketHandler(PacketType.DirPopularQuery, HandleDirPopularQuery);
  4101. AddLocalPacketHandler(PacketType.DirClassifiedQuery, HandleDirClassifiedQuery);
  4102. AddLocalPacketHandler(PacketType.EventInfoRequest, HandleEventInfoRequest);
  4103. AddLocalPacketHandler(PacketType.OfferCallingCard, HandleOfferCallingCard);
  4104. AddLocalPacketHandler(PacketType.AcceptCallingCard, HandleAcceptCallingCard);
  4105. AddLocalPacketHandler(PacketType.DeclineCallingCard, HandleDeclineCallingCard);
  4106. AddLocalPacketHandler(PacketType.ActivateGroup, HandleActivateGroup);
  4107. AddLocalPacketHandler(PacketType.GroupTitlesRequest, HandleGroupTitlesRequest);
  4108. AddLocalPacketHandler(PacketType.GroupProfileRequest, HandleGroupProfileRequest);
  4109. AddLocalPacketHandler(PacketType.GroupMembersRequest, HandleGroupMembersRequest);
  4110. AddLocalPacketHandler(PacketType.GroupRoleDataRequest, HandleGroupRoleDataRequest);
  4111. AddLocalPacketHandler(PacketType.GroupRoleMembersRequest, HandleGroupRoleMembersRequest);
  4112. AddLocalPacketHandler(PacketType.CreateGroupRequest, HandleCreateGroupRequest);
  4113. AddLocalPacketHandler(PacketType.UpdateGroupInfo, HandleUpdateGroupInfo);
  4114. AddLocalPacketHandler(PacketType.SetGroupAcceptNotices, HandleSetGroupAcceptNotices);
  4115. AddLocalPacketHandler(PacketType.GroupTitleUpdate, HandleGroupTitleUpdate);
  4116. AddLocalPacketHandler(PacketType.ParcelDeedToGroup, HandleParcelDeedToGroup);
  4117. AddLocalPacketHandler(PacketType.GroupNoticesListRequest, HandleGroupNoticesListRequest);
  4118. AddLocalPacketHandler(PacketType.GroupNoticeRequest, HandleGroupNoticeRequest);
  4119. AddLocalPacketHandler(PacketType.GroupRoleUpdate, HandleGroupRoleUpdate);
  4120. AddLocalPacketHandler(PacketType.GroupRoleChanges, HandleGroupRoleChanges);
  4121. AddLocalPacketHandler(PacketType.JoinGroupRequest, HandleJoinGroupRequest);
  4122. AddLocalPacketHandler(PacketType.LeaveGroupRequest, HandleLeaveGroupRequest);
  4123. AddLocalPacketHandler(PacketType.EjectGroupMemberRequest, HandleEjectGroupMemberRequest);
  4124. AddLocalPacketHandler(PacketType.InviteGroupRequest, HandleInviteGroupRequest);
  4125. AddLocalPacketHandler(PacketType.StartLure, HandleStartLure);
  4126. AddLocalPacketHandler(PacketType.TeleportLureRequest, HandleTeleportLureRequest);
  4127. AddLocalPacketHandler(PacketType.ClassifiedInfoRequest, HandleClassifiedInfoRequest);
  4128. AddLocalPacketHandler(PacketType.ClassifiedInfoUpdate, HandleClassifiedInfoUpdate);
  4129. AddLocalPacketHandler(PacketType.ClassifiedDelete, HandleClassifiedDelete);
  4130. AddLocalPacketHandler(PacketType.ClassifiedGodDelete, HandleClassifiedGodDelete);
  4131. AddLocalPacketHandler(PacketType.EventGodDelete, HandleEventGodDelete);
  4132. AddLocalPacketHandler(PacketType.EventNotificationAddRequest, HandleEventNotificationAddRequest);
  4133. AddLocalPacketHandler(PacketType.EventNotificationRemoveRequest, HandleEventNotificationRemoveRequest);
  4134. AddLocalPacketHandler(PacketType.RetrieveInstantMessages, HandleRetrieveInstantMessages);
  4135. AddLocalPacketHandler(PacketType.PickDelete, HandlePickDelete);
  4136. AddLocalPacketHandler(PacketType.PickGodDelete, HandlePickGodDelete);
  4137. AddLocalPacketHandler(PacketType.PickInfoUpdate, HandlePickInfoUpdate);
  4138. AddLocalPacketHandler(PacketType.AvatarNotesUpdate, HandleAvatarNotesUpdate);
  4139. AddLocalPacketHandler(PacketType.AvatarInterestsUpdate, HandleAvatarInterestsUpdate);
  4140. AddLocalPacketHandler(PacketType.GrantUserRights, HandleGrantUserRights);
  4141. AddLocalPacketHandler(PacketType.PlacesQuery, HandlePlacesQuery);
  4142. AddLocalPacketHandler(PacketType.UpdateMuteListEntry, HandleUpdateMuteListEntry);
  4143. AddLocalPacketHandler(PacketType.RemoveMuteListEntry, HandleRemoveMuteListEntry);
  4144. AddLocalPacketHandler(PacketType.UserReport, HandleUserReport);
  4145. AddLocalPacketHandler(PacketType.FindAgent, HandleFindAgent);
  4146. AddLocalPacketHandler(PacketType.TrackAgent, HandleTrackAgent);
  4147. AddLocalPacketHandler(PacketType.GodUpdateRegionInfo, HandleGodUpdateRegionInfoUpdate);
  4148. AddLocalPacketHandler(PacketType.GodlikeMessage, HandleGodlikeMessage);
  4149. AddLocalPacketHandler(PacketType.StateSave, HandleSaveStatePacket);
  4150. AddLocalPacketHandler(PacketType.GroupAccountDetailsRequest, HandleGroupAccountDetailsRequest);
  4151. AddLocalPacketHandler(PacketType.GroupAccountSummaryRequest, HandleGroupAccountSummaryRequest);
  4152. AddLocalPacketHandler(PacketType.GroupAccountTransactionsRequest, HandleGroupTransactionsDetailsRequest);
  4153. AddLocalPacketHandler(PacketType.FreezeUser, HandleFreezeUser);
  4154. AddLocalPacketHandler(PacketType.EjectUser, HandleEjectUser);
  4155. AddLocalPacketHandler(PacketType.ParcelBuyPass, HandleParcelBuyPass);
  4156. AddLocalPacketHandler(PacketType.ParcelGodMarkAsContent, HandleParcelGodMarkAsContent);
  4157. AddLocalPacketHandler(PacketType.GroupActiveProposalsRequest, HandleGroupActiveProposalsRequest);
  4158. AddLocalPacketHandler(PacketType.GroupVoteHistoryRequest, HandleGroupVoteHistoryRequest);
  4159. AddLocalPacketHandler(PacketType.SimWideDeletes, HandleSimWideDeletes);
  4160. AddLocalPacketHandler(PacketType.SendPostcard, HandleSendPostcard);
  4161. }
  4162. #region Packet Handlers
  4163. #region Scene/Avatar
  4164. private bool HandleAgentUpdate(IClientAPI sener, Packet Pack)
  4165. {
  4166. if (OnAgentUpdate != null)
  4167. {
  4168. bool update = false;
  4169. AgentUpdatePacket agenUpdate = (AgentUpdatePacket)Pack;
  4170. #region Packet Session and User Check
  4171. if (agenUpdate.AgentData.SessionID != SessionId || agenUpdate.AgentData.AgentID != AgentId)
  4172. return false;
  4173. #endregion
  4174. AgentUpdatePacket.AgentDataBlock x = agenUpdate.AgentData;
  4175. // We can only check when we have something to check
  4176. // against.
  4177. if (lastarg != null)
  4178. {
  4179. update =
  4180. (
  4181. (x.BodyRotation != lastarg.BodyRotation) ||
  4182. (x.CameraAtAxis != lastarg.CameraAtAxis) ||
  4183. (x.CameraCenter != lastarg.CameraCenter) ||
  4184. (x.CameraLeftAxis != lastarg.CameraLeftAxis) ||
  4185. (x.CameraUpAxis != lastarg.CameraUpAxis) ||
  4186. (x.ControlFlags != lastarg.ControlFlags) ||
  4187. (x.Far != lastarg.Far) ||
  4188. (x.Flags != lastarg.Flags) ||
  4189. (x.State != lastarg.State) ||
  4190. (x.HeadRotation != lastarg.HeadRotation) ||
  4191. (x.SessionID != lastarg.SessionID) ||
  4192. (x.AgentID != lastarg.AgentID)
  4193. );
  4194. }
  4195. else
  4196. update = true;
  4197. // These should be ordered from most-likely to
  4198. // least likely to change. I've made an initial
  4199. // guess at that.
  4200. if (update)
  4201. {
  4202. AgentUpdateArgs arg = new AgentUpdateArgs();
  4203. arg.AgentID = x.AgentID;
  4204. arg.BodyRotation = x.BodyRotation;
  4205. arg.CameraAtAxis = x.CameraAtAxis;
  4206. arg.CameraCenter = x.CameraCenter;
  4207. arg.CameraLeftAxis = x.CameraLeftAxis;
  4208. arg.CameraUpAxis = x.CameraUpAxis;
  4209. arg.ControlFlags = x.ControlFlags;
  4210. arg.Far = x.Far;
  4211. arg.Flags = x.Flags;
  4212. arg.HeadRotation = x.HeadRotation;
  4213. arg.SessionID = x.SessionID;
  4214. arg.State = x.State;
  4215. UpdateAgent handlerAgentUpdate = OnAgentUpdate;
  4216. lastarg = arg; // save this set of arguments for nexttime
  4217. if (handlerAgentUpdate != null)
  4218. OnAgentUpdate(this, arg);
  4219. handlerAgentUpdate = null;
  4220. }
  4221. }
  4222. return true;
  4223. }
  4224. private bool HandleMoneyTransferRequest(IClientAPI sender, Packet Pack)
  4225. {
  4226. MoneyTransferRequestPacket money = (MoneyTransferRequestPacket)Pack;
  4227. // validate the agent owns the agentID and sessionID
  4228. if (money.MoneyData.SourceID == sender.AgentId && money.AgentData.AgentID == sender.AgentId &&
  4229. money.AgentData.SessionID == sender.SessionId)
  4230. {
  4231. MoneyTransferRequest handlerMoneyTransferRequest = OnMoneyTransferRequest;
  4232. if (handlerMoneyTransferRequest != null)
  4233. {
  4234. handlerMoneyTransferRequest(money.MoneyData.SourceID, money.MoneyData.DestID,
  4235. money.MoneyData.Amount, money.MoneyData.TransactionType,
  4236. Util.FieldToString(money.MoneyData.Description));
  4237. }
  4238. return true;
  4239. }
  4240. return false;
  4241. }
  4242. private bool HandleParcelGodMarkAsContent(IClientAPI client, Packet Packet)
  4243. {
  4244. ParcelGodMarkAsContentPacket ParcelGodMarkAsContent =
  4245. (ParcelGodMarkAsContentPacket)Packet;
  4246. ParcelGodMark ParcelGodMarkAsContentHandler = OnParcelGodMark;
  4247. if (ParcelGodMarkAsContentHandler != null)
  4248. {
  4249. ParcelGodMarkAsContentHandler(this,
  4250. ParcelGodMarkAsContent.AgentData.AgentID,
  4251. ParcelGodMarkAsContent.ParcelData.LocalID);
  4252. return true;
  4253. }
  4254. return false;
  4255. }
  4256. private bool HandleFreezeUser(IClientAPI client, Packet Packet)
  4257. {
  4258. FreezeUserPacket FreezeUser = (FreezeUserPacket)Packet;
  4259. FreezeUserUpdate FreezeUserHandler = OnParcelFreezeUser;
  4260. if (FreezeUserHandler != null)
  4261. {
  4262. FreezeUserHandler(this,
  4263. FreezeUser.AgentData.AgentID,
  4264. FreezeUser.Data.Flags,
  4265. FreezeUser.Data.TargetID);
  4266. return true;
  4267. }
  4268. return false;
  4269. }
  4270. private bool HandleEjectUser(IClientAPI client, Packet Packet)
  4271. {
  4272. EjectUserPacket EjectUser =
  4273. (EjectUserPacket)Packet;
  4274. EjectUserUpdate EjectUserHandler = OnParcelEjectUser;
  4275. if (EjectUserHandler != null)
  4276. {
  4277. EjectUserHandler(this,
  4278. EjectUser.AgentData.AgentID,
  4279. EjectUser.Data.Flags,
  4280. EjectUser.Data.TargetID);
  4281. return true;
  4282. }
  4283. return false;
  4284. }
  4285. private bool HandleParcelBuyPass(IClientAPI client, Packet Packet)
  4286. {
  4287. ParcelBuyPassPacket ParcelBuyPass =
  4288. (ParcelBuyPassPacket)Packet;
  4289. ParcelBuyPass ParcelBuyPassHandler = OnParcelBuyPass;
  4290. if (ParcelBuyPassHandler != null)
  4291. {
  4292. ParcelBuyPassHandler(this,
  4293. ParcelBuyPass.AgentData.AgentID,
  4294. ParcelBuyPass.ParcelData.LocalID);
  4295. return true;
  4296. }
  4297. return false;
  4298. }
  4299. private bool HandleParcelBuyRequest(IClientAPI sender, Packet Pack)
  4300. {
  4301. ParcelBuyPacket parcel = (ParcelBuyPacket)Pack;
  4302. if (parcel.AgentData.AgentID == AgentId && parcel.AgentData.SessionID == SessionId)
  4303. {
  4304. ParcelBuy handlerParcelBuy = OnParcelBuy;
  4305. if (handlerParcelBuy != null)
  4306. {
  4307. handlerParcelBuy(parcel.AgentData.AgentID, parcel.Data.GroupID, parcel.Data.Final,
  4308. parcel.Data.IsGroupOwned,
  4309. parcel.Data.RemoveContribution, parcel.Data.LocalID, parcel.ParcelData.Area,
  4310. parcel.ParcelData.Price,
  4311. false);
  4312. }
  4313. return true;
  4314. }
  4315. return false;
  4316. }
  4317. private bool HandleUUIDGroupNameRequest(IClientAPI sender, Packet Pack)
  4318. {
  4319. UUIDGroupNameRequestPacket upack = (UUIDGroupNameRequestPacket)Pack;
  4320. for (int i = 0; i < upack.UUIDNameBlock.Length; i++)
  4321. {
  4322. UUIDNameRequest handlerUUIDGroupNameRequest = OnUUIDGroupNameRequest;
  4323. if (handlerUUIDGroupNameRequest != null)
  4324. {
  4325. handlerUUIDGroupNameRequest(upack.UUIDNameBlock[i].ID, this);
  4326. }
  4327. }
  4328. return true;
  4329. }
  4330. public bool HandleGenericMessage(IClientAPI sender, Packet pack)
  4331. {
  4332. GenericMessagePacket gmpack = (GenericMessagePacket)pack;
  4333. if (m_genericPacketHandlers.Count == 0) return false;
  4334. if (gmpack.AgentData.SessionID != SessionId) return false;
  4335. GenericMessage handlerGenericMessage = null;
  4336. string method = Util.FieldToString(gmpack.MethodData.Method).ToLower().Trim();
  4337. if (m_genericPacketHandlers.TryGetValue(method, out handlerGenericMessage))
  4338. {
  4339. List<string> msg = new List<string>();
  4340. List<byte[]> msgBytes = new List<byte[]>();
  4341. if (handlerGenericMessage != null)
  4342. {
  4343. foreach (GenericMessagePacket.ParamListBlock block in gmpack.ParamList)
  4344. {
  4345. msg.Add(Util.FieldToString(block.Parameter));
  4346. msgBytes.Add(block.Parameter);
  4347. }
  4348. try
  4349. {
  4350. if (OnBinaryGenericMessage != null)
  4351. {
  4352. OnBinaryGenericMessage(this, method, msgBytes.ToArray());
  4353. }
  4354. handlerGenericMessage(sender, method, msg);
  4355. return true;
  4356. }
  4357. catch (Exception e)
  4358. {
  4359. m_log.Error("[GENERICMESSAGE] " + e);
  4360. }
  4361. }
  4362. }
  4363. m_log.Error("[GENERICMESSAGE] Not handling GenericMessage with method-type of: " + method);
  4364. return false;
  4365. }
  4366. public bool HandleObjectGroupRequest(IClientAPI sender, Packet Pack)
  4367. {
  4368. ObjectGroupPacket ogpack = (ObjectGroupPacket)Pack;
  4369. if (ogpack.AgentData.SessionID != SessionId) return false;
  4370. RequestObjectPropertiesFamily handlerObjectGroupRequest = OnObjectGroupRequest;
  4371. if (handlerObjectGroupRequest != null)
  4372. {
  4373. for (int i = 0; i < ogpack.ObjectData.Length; i++)
  4374. {
  4375. handlerObjectGroupRequest(this, ogpack.AgentData.GroupID, ogpack.ObjectData[i].ObjectLocalID, UUID.Zero);
  4376. }
  4377. }
  4378. return true;
  4379. }
  4380. private bool HandleViewerEffect(IClientAPI sender, Packet Pack)
  4381. {
  4382. ViewerEffectPacket viewer = (ViewerEffectPacket)Pack;
  4383. if (viewer.AgentData.SessionID != SessionId) return false;
  4384. ViewerEffectEventHandler handlerViewerEffect = OnViewerEffect;
  4385. if (handlerViewerEffect != null)
  4386. {
  4387. int length = viewer.Effect.Length;
  4388. List<ViewerEffectEventHandlerArg> args = new List<ViewerEffectEventHandlerArg>(length);
  4389. for (int i = 0; i < length; i++)
  4390. {
  4391. //copy the effects block arguments into the event handler arg.
  4392. ViewerEffectEventHandlerArg argument = new ViewerEffectEventHandlerArg();
  4393. argument.AgentID = viewer.Effect[i].AgentID;
  4394. argument.Color = viewer.Effect[i].Color;
  4395. argument.Duration = viewer.Effect[i].Duration;
  4396. argument.ID = viewer.Effect[i].ID;
  4397. argument.Type = viewer.Effect[i].Type;
  4398. argument.TypeData = viewer.Effect[i].TypeData;
  4399. args.Add(argument);
  4400. }
  4401. handlerViewerEffect(sender, args);
  4402. }
  4403. return true;
  4404. }
  4405. private bool HandleAvatarPropertiesRequest(IClientAPI sender, Packet Pack)
  4406. {
  4407. AvatarPropertiesRequestPacket avatarProperties = (AvatarPropertiesRequestPacket)Pack;
  4408. #region Packet Session and User Check
  4409. if (m_checkPackets)
  4410. {
  4411. if (avatarProperties.AgentData.SessionID != SessionId ||
  4412. avatarProperties.AgentData.AgentID != AgentId)
  4413. return true;
  4414. }
  4415. #endregion
  4416. RequestAvatarProperties handlerRequestAvatarProperties = OnRequestAvatarProperties;
  4417. if (handlerRequestAvatarProperties != null)
  4418. {
  4419. handlerRequestAvatarProperties(this, avatarProperties.AgentData.AvatarID);
  4420. }
  4421. return true;
  4422. }
  4423. private bool HandleChatFromViewer(IClientAPI sender, Packet Pack)
  4424. {
  4425. ChatFromViewerPacket inchatpack = (ChatFromViewerPacket)Pack;
  4426. #region Packet Session and User Check
  4427. if (m_checkPackets)
  4428. {
  4429. if (inchatpack.AgentData.SessionID != SessionId ||
  4430. inchatpack.AgentData.AgentID != AgentId)
  4431. return true;
  4432. }
  4433. #endregion
  4434. string fromName = String.Empty; //ClientAvatar.firstname + " " + ClientAvatar.lastname;
  4435. byte[] message = inchatpack.ChatData.Message;
  4436. byte type = inchatpack.ChatData.Type;
  4437. Vector3 fromPos = new Vector3(); // ClientAvatar.Pos;
  4438. // UUID fromAgentID = AgentId;
  4439. int channel = inchatpack.ChatData.Channel;
  4440. if (OnChatFromClient != null)
  4441. {
  4442. OSChatMessage args = new OSChatMessage();
  4443. args.Channel = channel;
  4444. args.From = fromName;
  4445. args.Message = Utils.BytesToString(message);
  4446. args.Type = (ChatTypeEnum)type;
  4447. args.Position = fromPos;
  4448. args.Scene = Scene;
  4449. args.Sender = this;
  4450. args.SenderUUID = this.AgentId;
  4451. ChatMessage handlerChatFromClient = OnChatFromClient;
  4452. if (handlerChatFromClient != null)
  4453. handlerChatFromClient(this, args);
  4454. }
  4455. return true;
  4456. }
  4457. private bool HandlerAvatarPropertiesUpdate(IClientAPI sender, Packet Pack)
  4458. {
  4459. AvatarPropertiesUpdatePacket avatarProps = (AvatarPropertiesUpdatePacket)Pack;
  4460. #region Packet Session and User Check
  4461. if (m_checkPackets)
  4462. {
  4463. if (avatarProps.AgentData.SessionID != SessionId ||
  4464. avatarProps.AgentData.AgentID != AgentId)
  4465. return true;
  4466. }
  4467. #endregion
  4468. UpdateAvatarProperties handlerUpdateAvatarProperties = OnUpdateAvatarProperties;
  4469. if (handlerUpdateAvatarProperties != null)
  4470. {
  4471. AvatarPropertiesUpdatePacket.PropertiesDataBlock Properties = avatarProps.PropertiesData;
  4472. UserProfileData UserProfile = new UserProfileData();
  4473. UserProfile.ID = AgentId;
  4474. UserProfile.AboutText = Utils.BytesToString(Properties.AboutText);
  4475. UserProfile.FirstLifeAboutText = Utils.BytesToString(Properties.FLAboutText);
  4476. UserProfile.FirstLifeImage = Properties.FLImageID;
  4477. UserProfile.Image = Properties.ImageID;
  4478. UserProfile.ProfileUrl = Utils.BytesToString(Properties.ProfileURL);
  4479. UserProfile.UserFlags &= ~3;
  4480. UserProfile.UserFlags |= Properties.AllowPublish ? 1 : 0;
  4481. UserProfile.UserFlags |= Properties.MaturePublish ? 2 : 0;
  4482. handlerUpdateAvatarProperties(this, UserProfile);
  4483. }
  4484. return true;
  4485. }
  4486. private bool HandlerScriptDialogReply(IClientAPI sender, Packet Pack)
  4487. {
  4488. ScriptDialogReplyPacket rdialog = (ScriptDialogReplyPacket)Pack;
  4489. #region Packet Session and User Check
  4490. if (m_checkPackets)
  4491. {
  4492. if (rdialog.AgentData.SessionID != SessionId ||
  4493. rdialog.AgentData.AgentID != AgentId)
  4494. return true;
  4495. }
  4496. #endregion
  4497. int ch = rdialog.Data.ChatChannel;
  4498. byte[] msg = rdialog.Data.ButtonLabel;
  4499. if (OnChatFromClient != null)
  4500. {
  4501. OSChatMessage args = new OSChatMessage();
  4502. args.Channel = ch;
  4503. args.From = String.Empty;
  4504. args.Message = Utils.BytesToString(msg);
  4505. args.Type = ChatTypeEnum.Shout;
  4506. args.Position = new Vector3();
  4507. args.Scene = Scene;
  4508. args.Sender = this;
  4509. ChatMessage handlerChatFromClient2 = OnChatFromClient;
  4510. if (handlerChatFromClient2 != null)
  4511. handlerChatFromClient2(this, args);
  4512. }
  4513. return true;
  4514. }
  4515. private bool HandlerImprovedInstantMessage(IClientAPI sender, Packet Pack)
  4516. {
  4517. ImprovedInstantMessagePacket msgpack = (ImprovedInstantMessagePacket)Pack;
  4518. #region Packet Session and User Check
  4519. if (m_checkPackets)
  4520. {
  4521. if (msgpack.AgentData.SessionID != SessionId ||
  4522. msgpack.AgentData.AgentID != AgentId)
  4523. return true;
  4524. }
  4525. #endregion
  4526. string IMfromName = Util.FieldToString(msgpack.MessageBlock.FromAgentName);
  4527. string IMmessage = Utils.BytesToString(msgpack.MessageBlock.Message);
  4528. ImprovedInstantMessage handlerInstantMessage = OnInstantMessage;
  4529. if (handlerInstantMessage != null)
  4530. {
  4531. GridInstantMessage im = new GridInstantMessage(Scene,
  4532. msgpack.AgentData.AgentID,
  4533. IMfromName,
  4534. msgpack.MessageBlock.ToAgentID,
  4535. msgpack.MessageBlock.Dialog,
  4536. msgpack.MessageBlock.FromGroup,
  4537. IMmessage,
  4538. msgpack.MessageBlock.ID,
  4539. msgpack.MessageBlock.Offline != 0 ? true : false,
  4540. msgpack.MessageBlock.Position,
  4541. msgpack.MessageBlock.BinaryBucket);
  4542. handlerInstantMessage(this, im);
  4543. }
  4544. return true;
  4545. }
  4546. private bool HandlerAcceptFriendship(IClientAPI sender, Packet Pack)
  4547. {
  4548. AcceptFriendshipPacket afriendpack = (AcceptFriendshipPacket)Pack;
  4549. #region Packet Session and User Check
  4550. if (m_checkPackets)
  4551. {
  4552. if (afriendpack.AgentData.SessionID != SessionId ||
  4553. afriendpack.AgentData.AgentID != AgentId)
  4554. return true;
  4555. }
  4556. #endregion
  4557. // My guess is this is the folder to stick the calling card into
  4558. List<UUID> callingCardFolders = new List<UUID>();
  4559. UUID agentID = afriendpack.AgentData.AgentID;
  4560. UUID transactionID = afriendpack.TransactionBlock.TransactionID;
  4561. for (int fi = 0; fi < afriendpack.FolderData.Length; fi++)
  4562. {
  4563. callingCardFolders.Add(afriendpack.FolderData[fi].FolderID);
  4564. }
  4565. FriendActionDelegate handlerApproveFriendRequest = OnApproveFriendRequest;
  4566. if (handlerApproveFriendRequest != null)
  4567. {
  4568. handlerApproveFriendRequest(this, agentID, transactionID, callingCardFolders);
  4569. }
  4570. return true;
  4571. }
  4572. private bool HandlerDeclineFriendship(IClientAPI sender, Packet Pack)
  4573. {
  4574. DeclineFriendshipPacket dfriendpack = (DeclineFriendshipPacket)Pack;
  4575. #region Packet Session and User Check
  4576. if (m_checkPackets)
  4577. {
  4578. if (dfriendpack.AgentData.SessionID != SessionId ||
  4579. dfriendpack.AgentData.AgentID != AgentId)
  4580. return true;
  4581. }
  4582. #endregion
  4583. if (OnDenyFriendRequest != null)
  4584. {
  4585. OnDenyFriendRequest(this,
  4586. dfriendpack.AgentData.AgentID,
  4587. dfriendpack.TransactionBlock.TransactionID,
  4588. null);
  4589. }
  4590. return true;
  4591. }
  4592. private bool HandlerTerminateFrendship(IClientAPI sender, Packet Pack)
  4593. {
  4594. TerminateFriendshipPacket tfriendpack = (TerminateFriendshipPacket)Pack;
  4595. #region Packet Session and User Check
  4596. if (m_checkPackets)
  4597. {
  4598. if (tfriendpack.AgentData.SessionID != SessionId ||
  4599. tfriendpack.AgentData.AgentID != AgentId)
  4600. return true;
  4601. }
  4602. #endregion
  4603. UUID listOwnerAgentID = tfriendpack.AgentData.AgentID;
  4604. UUID exFriendID = tfriendpack.ExBlock.OtherID;
  4605. FriendshipTermination handlerTerminateFriendship = OnTerminateFriendship;
  4606. if (handlerTerminateFriendship != null)
  4607. {
  4608. handlerTerminateFriendship(this, listOwnerAgentID, exFriendID);
  4609. }
  4610. return true;
  4611. }
  4612. private bool HandleFindAgent(IClientAPI client, Packet Packet)
  4613. {
  4614. FindAgentPacket FindAgent =
  4615. (FindAgentPacket)Packet;
  4616. FindAgentUpdate FindAgentHandler = OnFindAgent;
  4617. if (FindAgentHandler != null)
  4618. {
  4619. FindAgentHandler(this,FindAgent.AgentBlock.Hunter,FindAgent.AgentBlock.Prey);
  4620. return true;
  4621. }
  4622. return false;
  4623. }
  4624. private bool HandleTrackAgent(IClientAPI client, Packet Packet)
  4625. {
  4626. TrackAgentPacket TrackAgent =
  4627. (TrackAgentPacket)Packet;
  4628. TrackAgentUpdate TrackAgentHandler = OnTrackAgent;
  4629. if (TrackAgentHandler != null)
  4630. {
  4631. TrackAgentHandler(this,
  4632. TrackAgent.AgentData.AgentID,
  4633. TrackAgent.TargetData.PreyID);
  4634. return true;
  4635. }
  4636. return false;
  4637. }
  4638. private bool HandlerRezObject(IClientAPI sender, Packet Pack)
  4639. {
  4640. RezObjectPacket rezPacket = (RezObjectPacket)Pack;
  4641. #region Packet Session and User Check
  4642. if (m_checkPackets)
  4643. {
  4644. if (rezPacket.AgentData.SessionID != SessionId ||
  4645. rezPacket.AgentData.AgentID != AgentId)
  4646. return true;
  4647. }
  4648. #endregion
  4649. RezObject handlerRezObject = OnRezObject;
  4650. if (handlerRezObject != null)
  4651. {
  4652. handlerRezObject(this, rezPacket.InventoryData.ItemID, rezPacket.RezData.RayEnd,
  4653. rezPacket.RezData.RayStart, rezPacket.RezData.RayTargetID,
  4654. rezPacket.RezData.BypassRaycast, rezPacket.RezData.RayEndIsIntersection,
  4655. rezPacket.RezData.RezSelected, rezPacket.RezData.RemoveItem,
  4656. rezPacket.RezData.FromTaskID);
  4657. }
  4658. return true;
  4659. }
  4660. private bool HandlerDeRezObject(IClientAPI sender, Packet Pack)
  4661. {
  4662. DeRezObjectPacket DeRezPacket = (DeRezObjectPacket)Pack;
  4663. #region Packet Session and User Check
  4664. if (m_checkPackets)
  4665. {
  4666. if (DeRezPacket.AgentData.SessionID != SessionId ||
  4667. DeRezPacket.AgentData.AgentID != AgentId)
  4668. return true;
  4669. }
  4670. #endregion
  4671. DeRezObject handlerDeRezObject = OnDeRezObject;
  4672. if (handlerDeRezObject != null)
  4673. {
  4674. List<uint> deRezIDs = new List<uint>();
  4675. foreach (DeRezObjectPacket.ObjectDataBlock data in
  4676. DeRezPacket.ObjectData)
  4677. {
  4678. deRezIDs.Add(data.ObjectLocalID);
  4679. }
  4680. // It just so happens that the values on the DeRezAction enumerator match the Destination
  4681. // values given by a Second Life client
  4682. handlerDeRezObject(this, deRezIDs,
  4683. DeRezPacket.AgentBlock.GroupID,
  4684. (DeRezAction)DeRezPacket.AgentBlock.Destination,
  4685. DeRezPacket.AgentBlock.DestinationID);
  4686. }
  4687. return true;
  4688. }
  4689. private bool HandlerModifyLand(IClientAPI sender, Packet Pack)
  4690. {
  4691. ModifyLandPacket modify = (ModifyLandPacket)Pack;
  4692. #region Packet Session and User Check
  4693. if (m_checkPackets)
  4694. {
  4695. if (modify.AgentData.SessionID != SessionId ||
  4696. modify.AgentData.AgentID != AgentId)
  4697. return true;
  4698. }
  4699. #endregion
  4700. //m_log.Info("[LAND]: LAND:" + modify.ToString());
  4701. if (modify.ParcelData.Length > 0)
  4702. {
  4703. if (OnModifyTerrain != null)
  4704. {
  4705. for (int i = 0; i < modify.ParcelData.Length; i++)
  4706. {
  4707. ModifyTerrain handlerModifyTerrain = OnModifyTerrain;
  4708. if (handlerModifyTerrain != null)
  4709. {
  4710. handlerModifyTerrain(AgentId, modify.ModifyBlock.Height, modify.ModifyBlock.Seconds,
  4711. modify.ModifyBlock.BrushSize,
  4712. modify.ModifyBlock.Action, modify.ParcelData[i].North,
  4713. modify.ParcelData[i].West, modify.ParcelData[i].South,
  4714. modify.ParcelData[i].East, AgentId);
  4715. }
  4716. }
  4717. }
  4718. }
  4719. return true;
  4720. }
  4721. private bool HandlerRegionHandshakeReply(IClientAPI sender, Packet Pack)
  4722. {
  4723. Action<IClientAPI> handlerRegionHandShakeReply = OnRegionHandShakeReply;
  4724. if (handlerRegionHandShakeReply != null)
  4725. {
  4726. handlerRegionHandShakeReply(this);
  4727. }
  4728. return true;
  4729. }
  4730. private bool HandlerAgentWearablesRequest(IClientAPI sender, Packet Pack)
  4731. {
  4732. GenericCall2 handlerRequestWearables = OnRequestWearables;
  4733. if (handlerRequestWearables != null)
  4734. {
  4735. handlerRequestWearables();
  4736. }
  4737. Action<IClientAPI> handlerRequestAvatarsData = OnRequestAvatarsData;
  4738. if (handlerRequestAvatarsData != null)
  4739. {
  4740. handlerRequestAvatarsData(this);
  4741. }
  4742. return true;
  4743. }
  4744. private bool HandlerAgentSetAppearance(IClientAPI sender, Packet Pack)
  4745. {
  4746. AgentSetAppearancePacket appear = (AgentSetAppearancePacket)Pack;
  4747. #region Packet Session and User Check
  4748. if (m_checkPackets)
  4749. {
  4750. if (appear.AgentData.SessionID != SessionId ||
  4751. appear.AgentData.AgentID != AgentId)
  4752. return true;
  4753. }
  4754. #endregion
  4755. SetAppearance handlerSetAppearance = OnSetAppearance;
  4756. if (handlerSetAppearance != null)
  4757. {
  4758. // Temporarily protect ourselves from the mantis #951 failure.
  4759. // However, we could do this for several other handlers where a failure isn't terminal
  4760. // for the client session anyway, in order to protect ourselves against bad code in plugins
  4761. try
  4762. {
  4763. byte[] visualparams = new byte[appear.VisualParam.Length];
  4764. for (int i = 0; i < appear.VisualParam.Length; i++)
  4765. visualparams[i] = appear.VisualParam[i].ParamValue;
  4766. Primitive.TextureEntry te = null;
  4767. if (appear.ObjectData.TextureEntry.Length > 1)
  4768. te = new Primitive.TextureEntry(appear.ObjectData.TextureEntry, 0, appear.ObjectData.TextureEntry.Length);
  4769. handlerSetAppearance(te, visualparams);
  4770. }
  4771. catch (Exception e)
  4772. {
  4773. m_log.ErrorFormat(
  4774. "[CLIENT VIEW]: AgentSetApperance packet handler threw an exception, {0}",
  4775. e);
  4776. }
  4777. }
  4778. return true;
  4779. }
  4780. private bool HandlerAgentIsNowWearing(IClientAPI sender, Packet Pack)
  4781. {
  4782. if (OnAvatarNowWearing != null)
  4783. {
  4784. AgentIsNowWearingPacket nowWearing = (AgentIsNowWearingPacket)Pack;
  4785. #region Packet Session and User Check
  4786. if (m_checkPackets)
  4787. {
  4788. if (nowWearing.AgentData.SessionID != SessionId ||
  4789. nowWearing.AgentData.AgentID != AgentId)
  4790. return true;
  4791. }
  4792. #endregion
  4793. AvatarWearingArgs wearingArgs = new AvatarWearingArgs();
  4794. for (int i = 0; i < nowWearing.WearableData.Length; i++)
  4795. {
  4796. AvatarWearingArgs.Wearable wearable =
  4797. new AvatarWearingArgs.Wearable(nowWearing.WearableData[i].ItemID,
  4798. nowWearing.WearableData[i].WearableType);
  4799. wearingArgs.NowWearing.Add(wearable);
  4800. }
  4801. AvatarNowWearing handlerAvatarNowWearing = OnAvatarNowWearing;
  4802. if (handlerAvatarNowWearing != null)
  4803. {
  4804. handlerAvatarNowWearing(this, wearingArgs);
  4805. }
  4806. }
  4807. return true;
  4808. }
  4809. private bool HandlerRezSingleAttachmentFromInv(IClientAPI sender, Packet Pack)
  4810. {
  4811. RezSingleAttachmentFromInv handlerRezSingleAttachment = OnRezSingleAttachmentFromInv;
  4812. if (handlerRezSingleAttachment != null)
  4813. {
  4814. RezSingleAttachmentFromInvPacket rez = (RezSingleAttachmentFromInvPacket)Pack;
  4815. #region Packet Session and User Check
  4816. if (m_checkPackets)
  4817. {
  4818. if (rez.AgentData.SessionID != SessionId ||
  4819. rez.AgentData.AgentID != AgentId)
  4820. return true;
  4821. }
  4822. #endregion
  4823. handlerRezSingleAttachment(this, rez.ObjectData.ItemID,
  4824. rez.ObjectData.AttachmentPt);
  4825. }
  4826. return true;
  4827. }
  4828. private bool HandleRezMultipleAttachmentsFromInv(IClientAPI sender, Packet Pack)
  4829. {
  4830. RezMultipleAttachmentsFromInv handlerRezMultipleAttachments = OnRezMultipleAttachmentsFromInv;
  4831. if (handlerRezMultipleAttachments != null)
  4832. {
  4833. RezMultipleAttachmentsFromInvPacket rez = (RezMultipleAttachmentsFromInvPacket)Pack;
  4834. handlerRezMultipleAttachments(this, rez.HeaderData,
  4835. rez.ObjectData);
  4836. }
  4837. return true;
  4838. }
  4839. private bool HandleDetachAttachmentIntoInv(IClientAPI sender, Packet Pack)
  4840. {
  4841. UUIDNameRequest handlerDetachAttachmentIntoInv = OnDetachAttachmentIntoInv;
  4842. if (handlerDetachAttachmentIntoInv != null)
  4843. {
  4844. DetachAttachmentIntoInvPacket detachtoInv = (DetachAttachmentIntoInvPacket)Pack;
  4845. #region Packet Session and User Check
  4846. // UNSUPPORTED ON THIS PACKET
  4847. #endregion
  4848. UUID itemID = detachtoInv.ObjectData.ItemID;
  4849. // UUID ATTACH_agentID = detachtoInv.ObjectData.AgentID;
  4850. handlerDetachAttachmentIntoInv(itemID, this);
  4851. }
  4852. return true;
  4853. }
  4854. private bool HandleObjectAttach(IClientAPI sender, Packet Pack)
  4855. {
  4856. if (OnObjectAttach != null)
  4857. {
  4858. ObjectAttachPacket att = (ObjectAttachPacket)Pack;
  4859. #region Packet Session and User Check
  4860. if (m_checkPackets)
  4861. {
  4862. if (att.AgentData.SessionID != SessionId ||
  4863. att.AgentData.AgentID != AgentId)
  4864. return true;
  4865. }
  4866. #endregion
  4867. ObjectAttach handlerObjectAttach = OnObjectAttach;
  4868. if (handlerObjectAttach != null)
  4869. {
  4870. if (att.ObjectData.Length > 0)
  4871. {
  4872. handlerObjectAttach(this, att.ObjectData[0].ObjectLocalID, att.AgentData.AttachmentPoint, att.ObjectData[0].Rotation, false);
  4873. }
  4874. }
  4875. }
  4876. return true;
  4877. }
  4878. private bool HandleObjectDetach(IClientAPI sender, Packet Pack)
  4879. {
  4880. ObjectDetachPacket dett = (ObjectDetachPacket)Pack;
  4881. #region Packet Session and User Check
  4882. if (m_checkPackets)
  4883. {
  4884. if (dett.AgentData.SessionID != SessionId ||
  4885. dett.AgentData.AgentID != AgentId)
  4886. return true;
  4887. }
  4888. #endregion
  4889. for (int j = 0; j < dett.ObjectData.Length; j++)
  4890. {
  4891. uint obj = dett.ObjectData[j].ObjectLocalID;
  4892. ObjectDeselect handlerObjectDetach = OnObjectDetach;
  4893. if (handlerObjectDetach != null)
  4894. {
  4895. handlerObjectDetach(obj, this);
  4896. }
  4897. }
  4898. return true;
  4899. }
  4900. private bool HandleObjectDrop(IClientAPI sender, Packet Pack)
  4901. {
  4902. ObjectDropPacket dropp = (ObjectDropPacket)Pack;
  4903. #region Packet Session and User Check
  4904. if (m_checkPackets)
  4905. {
  4906. if (dropp.AgentData.SessionID != SessionId ||
  4907. dropp.AgentData.AgentID != AgentId)
  4908. return true;
  4909. }
  4910. #endregion
  4911. for (int j = 0; j < dropp.ObjectData.Length; j++)
  4912. {
  4913. uint obj = dropp.ObjectData[j].ObjectLocalID;
  4914. ObjectDrop handlerObjectDrop = OnObjectDrop;
  4915. if (handlerObjectDrop != null)
  4916. {
  4917. handlerObjectDrop(obj, this);
  4918. }
  4919. }
  4920. return true;
  4921. }
  4922. private bool HandleSetAlwaysRun(IClientAPI sender, Packet Pack)
  4923. {
  4924. SetAlwaysRunPacket run = (SetAlwaysRunPacket)Pack;
  4925. #region Packet Session and User Check
  4926. if (m_checkPackets)
  4927. {
  4928. if (run.AgentData.SessionID != SessionId ||
  4929. run.AgentData.AgentID != AgentId)
  4930. return true;
  4931. }
  4932. #endregion
  4933. SetAlwaysRun handlerSetAlwaysRun = OnSetAlwaysRun;
  4934. if (handlerSetAlwaysRun != null)
  4935. handlerSetAlwaysRun(this, run.AgentData.AlwaysRun);
  4936. return true;
  4937. }
  4938. private bool HandleCompleteAgentMovement(IClientAPI sender, Packet Pack)
  4939. {
  4940. GenericCall2 handlerCompleteMovementToRegion = OnCompleteMovementToRegion;
  4941. if (handlerCompleteMovementToRegion != null)
  4942. {
  4943. handlerCompleteMovementToRegion();
  4944. }
  4945. handlerCompleteMovementToRegion = null;
  4946. return true;
  4947. }
  4948. private bool HandleAgentAnimation(IClientAPI sender, Packet Pack)
  4949. {
  4950. AgentAnimationPacket AgentAni = (AgentAnimationPacket)Pack;
  4951. #region Packet Session and User Check
  4952. if (m_checkPackets)
  4953. {
  4954. if (AgentAni.AgentData.SessionID != SessionId ||
  4955. AgentAni.AgentData.AgentID != AgentId)
  4956. return true;
  4957. }
  4958. #endregion
  4959. StartAnim handlerStartAnim = null;
  4960. StopAnim handlerStopAnim = null;
  4961. for (int i = 0; i < AgentAni.AnimationList.Length; i++)
  4962. {
  4963. if (AgentAni.AnimationList[i].StartAnim)
  4964. {
  4965. handlerStartAnim = OnStartAnim;
  4966. if (handlerStartAnim != null)
  4967. {
  4968. handlerStartAnim(this, AgentAni.AnimationList[i].AnimID);
  4969. }
  4970. }
  4971. else
  4972. {
  4973. handlerStopAnim = OnStopAnim;
  4974. if (handlerStopAnim != null)
  4975. {
  4976. handlerStopAnim(this, AgentAni.AnimationList[i].AnimID);
  4977. }
  4978. }
  4979. }
  4980. return true;
  4981. }
  4982. private bool HandleAgentRequestSit(IClientAPI sender, Packet Pack)
  4983. {
  4984. if (OnAgentRequestSit != null)
  4985. {
  4986. AgentRequestSitPacket agentRequestSit = (AgentRequestSitPacket)Pack;
  4987. #region Packet Session and User Check
  4988. if (m_checkPackets)
  4989. {
  4990. if (agentRequestSit.AgentData.SessionID != SessionId ||
  4991. agentRequestSit.AgentData.AgentID != AgentId)
  4992. return true;
  4993. }
  4994. #endregion
  4995. AgentRequestSit handlerAgentRequestSit = OnAgentRequestSit;
  4996. if (handlerAgentRequestSit != null)
  4997. handlerAgentRequestSit(this, agentRequestSit.AgentData.AgentID,
  4998. agentRequestSit.TargetObject.TargetID, agentRequestSit.TargetObject.Offset);
  4999. }
  5000. return true;
  5001. }
  5002. private bool HandleAgentSit(IClientAPI sender, Packet Pack)
  5003. {
  5004. if (OnAgentSit != null)
  5005. {
  5006. AgentSitPacket agentSit = (AgentSitPacket)Pack;
  5007. #region Packet Session and User Check
  5008. if (m_checkPackets)
  5009. {
  5010. if (agentSit.AgentData.SessionID != SessionId ||
  5011. agentSit.AgentData.AgentID != AgentId)
  5012. return true;
  5013. }
  5014. #endregion
  5015. AgentSit handlerAgentSit = OnAgentSit;
  5016. if (handlerAgentSit != null)
  5017. {
  5018. OnAgentSit(this, agentSit.AgentData.AgentID);
  5019. }
  5020. }
  5021. return true;
  5022. }
  5023. private bool HandleSoundTrigger(IClientAPI sender, Packet Pack)
  5024. {
  5025. SoundTriggerPacket soundTriggerPacket = (SoundTriggerPacket)Pack;
  5026. #region Packet Session and User Check
  5027. if (m_checkPackets)
  5028. {
  5029. // UNSUPPORTED ON THIS PACKET
  5030. }
  5031. #endregion
  5032. SoundTrigger handlerSoundTrigger = OnSoundTrigger;
  5033. if (handlerSoundTrigger != null)
  5034. {
  5035. handlerSoundTrigger(soundTriggerPacket.SoundData.SoundID, soundTriggerPacket.SoundData.OwnerID,
  5036. soundTriggerPacket.SoundData.ObjectID, soundTriggerPacket.SoundData.ParentID,
  5037. soundTriggerPacket.SoundData.Gain, soundTriggerPacket.SoundData.Position,
  5038. soundTriggerPacket.SoundData.Handle);
  5039. }
  5040. return true;
  5041. }
  5042. private bool HandleAvatarPickerRequest(IClientAPI sender, Packet Pack)
  5043. {
  5044. AvatarPickerRequestPacket avRequestQuery = (AvatarPickerRequestPacket)Pack;
  5045. #region Packet Session and User Check
  5046. if (m_checkPackets)
  5047. {
  5048. if (avRequestQuery.AgentData.SessionID != SessionId ||
  5049. avRequestQuery.AgentData.AgentID != AgentId)
  5050. return true;
  5051. }
  5052. #endregion
  5053. AvatarPickerRequestPacket.AgentDataBlock Requestdata = avRequestQuery.AgentData;
  5054. AvatarPickerRequestPacket.DataBlock querydata = avRequestQuery.Data;
  5055. //m_log.Debug("Agent Sends:" + Utils.BytesToString(querydata.Name));
  5056. AvatarPickerRequest handlerAvatarPickerRequest = OnAvatarPickerRequest;
  5057. if (handlerAvatarPickerRequest != null)
  5058. {
  5059. handlerAvatarPickerRequest(this, Requestdata.AgentID, Requestdata.QueryID,
  5060. Utils.BytesToString(querydata.Name));
  5061. }
  5062. return true;
  5063. }
  5064. private bool HandleAgentDataUpdateRequest(IClientAPI sender, Packet Pack)
  5065. {
  5066. AgentDataUpdateRequestPacket avRequestDataUpdatePacket = (AgentDataUpdateRequestPacket)Pack;
  5067. #region Packet Session and User Check
  5068. if (m_checkPackets)
  5069. {
  5070. if (avRequestDataUpdatePacket.AgentData.SessionID != SessionId ||
  5071. avRequestDataUpdatePacket.AgentData.AgentID != AgentId)
  5072. return true;
  5073. }
  5074. #endregion
  5075. FetchInventory handlerAgentDataUpdateRequest = OnAgentDataUpdateRequest;
  5076. if (handlerAgentDataUpdateRequest != null)
  5077. {
  5078. handlerAgentDataUpdateRequest(this, avRequestDataUpdatePacket.AgentData.AgentID, avRequestDataUpdatePacket.AgentData.SessionID);
  5079. }
  5080. return true;
  5081. }
  5082. private bool HandleUserInfoRequest(IClientAPI sender, Packet Pack)
  5083. {
  5084. UserInfoRequest handlerUserInfoRequest = OnUserInfoRequest;
  5085. if (handlerUserInfoRequest != null)
  5086. {
  5087. handlerUserInfoRequest(this);
  5088. }
  5089. else
  5090. {
  5091. SendUserInfoReply(false, true, "");
  5092. }
  5093. return true;
  5094. }
  5095. private bool HandleUpdateUserInfo(IClientAPI sender, Packet Pack)
  5096. {
  5097. UpdateUserInfoPacket updateUserInfo = (UpdateUserInfoPacket)Pack;
  5098. #region Packet Session and User Check
  5099. if (m_checkPackets)
  5100. {
  5101. if (updateUserInfo.AgentData.SessionID != SessionId ||
  5102. updateUserInfo.AgentData.AgentID != AgentId)
  5103. return true;
  5104. }
  5105. #endregion
  5106. UpdateUserInfo handlerUpdateUserInfo = OnUpdateUserInfo;
  5107. if (handlerUpdateUserInfo != null)
  5108. {
  5109. bool visible = true;
  5110. string DirectoryVisibility =
  5111. Utils.BytesToString(updateUserInfo.UserData.DirectoryVisibility);
  5112. if (DirectoryVisibility == "hidden")
  5113. visible = false;
  5114. handlerUpdateUserInfo(
  5115. updateUserInfo.UserData.IMViaEMail,
  5116. visible, this);
  5117. }
  5118. return true;
  5119. }
  5120. private bool HandleSetStartLocationRequest(IClientAPI sender, Packet Pack)
  5121. {
  5122. SetStartLocationRequestPacket avSetStartLocationRequestPacket = (SetStartLocationRequestPacket)Pack;
  5123. #region Packet Session and User Check
  5124. if (m_checkPackets)
  5125. {
  5126. if (avSetStartLocationRequestPacket.AgentData.SessionID != SessionId ||
  5127. avSetStartLocationRequestPacket.AgentData.AgentID != AgentId)
  5128. return true;
  5129. }
  5130. #endregion
  5131. if (avSetStartLocationRequestPacket.AgentData.AgentID == AgentId && avSetStartLocationRequestPacket.AgentData.SessionID == SessionId)
  5132. {
  5133. // Linden Client limitation..
  5134. if (avSetStartLocationRequestPacket.StartLocationData.LocationPos.X == 255.5f
  5135. || avSetStartLocationRequestPacket.StartLocationData.LocationPos.Y == 255.5f)
  5136. {
  5137. ScenePresence avatar = null;
  5138. if (((Scene)m_scene).TryGetAvatar(AgentId, out avatar))
  5139. {
  5140. if (avSetStartLocationRequestPacket.StartLocationData.LocationPos.X == 255.5f)
  5141. {
  5142. avSetStartLocationRequestPacket.StartLocationData.LocationPos.X = avatar.AbsolutePosition.X;
  5143. }
  5144. if (avSetStartLocationRequestPacket.StartLocationData.LocationPos.Y == 255.5f)
  5145. {
  5146. avSetStartLocationRequestPacket.StartLocationData.LocationPos.Y = avatar.AbsolutePosition.Y;
  5147. }
  5148. }
  5149. }
  5150. TeleportLocationRequest handlerSetStartLocationRequest = OnSetStartLocationRequest;
  5151. if (handlerSetStartLocationRequest != null)
  5152. {
  5153. handlerSetStartLocationRequest(this, 0, avSetStartLocationRequestPacket.StartLocationData.LocationPos,
  5154. avSetStartLocationRequestPacket.StartLocationData.LocationLookAt,
  5155. avSetStartLocationRequestPacket.StartLocationData.LocationID);
  5156. }
  5157. }
  5158. return true;
  5159. }
  5160. private bool HandleAgentThrottle(IClientAPI sender, Packet Pack)
  5161. {
  5162. AgentThrottlePacket atpack = (AgentThrottlePacket)Pack;
  5163. #region Packet Session and User Check
  5164. if (m_checkPackets)
  5165. {
  5166. if (atpack.AgentData.SessionID != SessionId ||
  5167. atpack.AgentData.AgentID != AgentId)
  5168. return true;
  5169. }
  5170. #endregion
  5171. m_udpClient.SetThrottles(atpack.Throttle.Throttles);
  5172. return true;
  5173. }
  5174. private bool HandleAgentPause(IClientAPI sender, Packet Pack)
  5175. {
  5176. m_udpClient.IsPaused = true;
  5177. return true;
  5178. }
  5179. private bool HandleAgentResume(IClientAPI sender, Packet Pack)
  5180. {
  5181. m_udpClient.IsPaused = false;
  5182. SendStartPingCheck(m_udpClient.CurrentPingSequence++);
  5183. return true;
  5184. }
  5185. private bool HandleForceScriptControlRelease(IClientAPI sender, Packet Pack)
  5186. {
  5187. ForceReleaseControls handlerForceReleaseControls = OnForceReleaseControls;
  5188. if (handlerForceReleaseControls != null)
  5189. {
  5190. handlerForceReleaseControls(this, AgentId);
  5191. }
  5192. return true;
  5193. }
  5194. #endregion Scene/Avatar
  5195. #region Objects/m_sceneObjects
  5196. private bool HandleObjectLink(IClientAPI sender, Packet Pack)
  5197. {
  5198. ObjectLinkPacket link = (ObjectLinkPacket)Pack;
  5199. #region Packet Session and User Check
  5200. if (m_checkPackets)
  5201. {
  5202. if (link.AgentData.SessionID != SessionId ||
  5203. link.AgentData.AgentID != AgentId)
  5204. return true;
  5205. }
  5206. #endregion
  5207. uint parentprimid = 0;
  5208. List<uint> childrenprims = new List<uint>();
  5209. if (link.ObjectData.Length > 1)
  5210. {
  5211. parentprimid = link.ObjectData[0].ObjectLocalID;
  5212. for (int i = 1; i < link.ObjectData.Length; i++)
  5213. {
  5214. childrenprims.Add(link.ObjectData[i].ObjectLocalID);
  5215. }
  5216. }
  5217. LinkObjects handlerLinkObjects = OnLinkObjects;
  5218. if (handlerLinkObjects != null)
  5219. {
  5220. handlerLinkObjects(this, parentprimid, childrenprims);
  5221. }
  5222. return true;
  5223. }
  5224. private bool HandleObjectDelink(IClientAPI sender, Packet Pack)
  5225. {
  5226. ObjectDelinkPacket delink = (ObjectDelinkPacket)Pack;
  5227. #region Packet Session and User Check
  5228. if (m_checkPackets)
  5229. {
  5230. if (delink.AgentData.SessionID != SessionId ||
  5231. delink.AgentData.AgentID != AgentId)
  5232. return true;
  5233. }
  5234. #endregion
  5235. // It appears the prim at index 0 is not always the root prim (for
  5236. // instance, when one prim of a link set has been edited independently
  5237. // of the others). Therefore, we'll pass all the ids onto the delink
  5238. // method for it to decide which is the root.
  5239. List<uint> prims = new List<uint>();
  5240. for (int i = 0; i < delink.ObjectData.Length; i++)
  5241. {
  5242. prims.Add(delink.ObjectData[i].ObjectLocalID);
  5243. }
  5244. DelinkObjects handlerDelinkObjects = OnDelinkObjects;
  5245. if (handlerDelinkObjects != null)
  5246. {
  5247. handlerDelinkObjects(prims);
  5248. }
  5249. return true;
  5250. }
  5251. private bool HandleObjectAdd(IClientAPI sender, Packet Pack)
  5252. {
  5253. if (OnAddPrim != null)
  5254. {
  5255. ObjectAddPacket addPacket = (ObjectAddPacket)Pack;
  5256. #region Packet Session and User Check
  5257. if (m_checkPackets)
  5258. {
  5259. if (addPacket.AgentData.SessionID != SessionId ||
  5260. addPacket.AgentData.AgentID != AgentId)
  5261. return true;
  5262. }
  5263. #endregion
  5264. PrimitiveBaseShape shape = GetShapeFromAddPacket(addPacket);
  5265. // m_log.Info("[REZData]: " + addPacket.ToString());
  5266. //BypassRaycast: 1
  5267. //RayStart: <69.79469, 158.2652, 98.40343>
  5268. //RayEnd: <61.97724, 141.995, 92.58341>
  5269. //RayTargetID: 00000000-0000-0000-0000-000000000000
  5270. //Check to see if adding the prim is allowed; useful for any module wanting to restrict the
  5271. //object from rezing initially
  5272. AddNewPrim handlerAddPrim = OnAddPrim;
  5273. if (handlerAddPrim != null)
  5274. handlerAddPrim(AgentId, ActiveGroupId, addPacket.ObjectData.RayEnd, addPacket.ObjectData.Rotation, shape, addPacket.ObjectData.BypassRaycast, addPacket.ObjectData.RayStart, addPacket.ObjectData.RayTargetID, addPacket.ObjectData.RayEndIsIntersection);
  5275. }
  5276. return true;
  5277. }
  5278. private bool HandleObjectShape(IClientAPI sender, Packet Pack)
  5279. {
  5280. ObjectShapePacket shapePacket = (ObjectShapePacket)Pack;
  5281. #region Packet Session and User Check
  5282. if (m_checkPackets)
  5283. {
  5284. if (shapePacket.AgentData.SessionID != SessionId ||
  5285. shapePacket.AgentData.AgentID != AgentId)
  5286. return true;
  5287. }
  5288. #endregion
  5289. UpdateShape handlerUpdatePrimShape = null;
  5290. for (int i = 0; i < shapePacket.ObjectData.Length; i++)
  5291. {
  5292. handlerUpdatePrimShape = OnUpdatePrimShape;
  5293. if (handlerUpdatePrimShape != null)
  5294. {
  5295. UpdateShapeArgs shapeData = new UpdateShapeArgs();
  5296. shapeData.ObjectLocalID = shapePacket.ObjectData[i].ObjectLocalID;
  5297. shapeData.PathBegin = shapePacket.ObjectData[i].PathBegin;
  5298. shapeData.PathCurve = shapePacket.ObjectData[i].PathCurve;
  5299. shapeData.PathEnd = shapePacket.ObjectData[i].PathEnd;
  5300. shapeData.PathRadiusOffset = shapePacket.ObjectData[i].PathRadiusOffset;
  5301. shapeData.PathRevolutions = shapePacket.ObjectData[i].PathRevolutions;
  5302. shapeData.PathScaleX = shapePacket.ObjectData[i].PathScaleX;
  5303. shapeData.PathScaleY = shapePacket.ObjectData[i].PathScaleY;
  5304. shapeData.PathShearX = shapePacket.ObjectData[i].PathShearX;
  5305. shapeData.PathShearY = shapePacket.ObjectData[i].PathShearY;
  5306. shapeData.PathSkew = shapePacket.ObjectData[i].PathSkew;
  5307. shapeData.PathTaperX = shapePacket.ObjectData[i].PathTaperX;
  5308. shapeData.PathTaperY = shapePacket.ObjectData[i].PathTaperY;
  5309. shapeData.PathTwist = shapePacket.ObjectData[i].PathTwist;
  5310. shapeData.PathTwistBegin = shapePacket.ObjectData[i].PathTwistBegin;
  5311. shapeData.ProfileBegin = shapePacket.ObjectData[i].ProfileBegin;
  5312. shapeData.ProfileCurve = shapePacket.ObjectData[i].ProfileCurve;
  5313. shapeData.ProfileEnd = shapePacket.ObjectData[i].ProfileEnd;
  5314. shapeData.ProfileHollow = shapePacket.ObjectData[i].ProfileHollow;
  5315. handlerUpdatePrimShape(m_agentId, shapePacket.ObjectData[i].ObjectLocalID,
  5316. shapeData);
  5317. }
  5318. }
  5319. return true;
  5320. }
  5321. private bool HandleObjectExtraParams(IClientAPI sender, Packet Pack)
  5322. {
  5323. ObjectExtraParamsPacket extraPar = (ObjectExtraParamsPacket)Pack;
  5324. #region Packet Session and User Check
  5325. if (m_checkPackets)
  5326. {
  5327. if (extraPar.AgentData.SessionID != SessionId ||
  5328. extraPar.AgentData.AgentID != AgentId)
  5329. return true;
  5330. }
  5331. #endregion
  5332. ObjectExtraParams handlerUpdateExtraParams = OnUpdateExtraParams;
  5333. if (handlerUpdateExtraParams != null)
  5334. {
  5335. for (int i = 0; i < extraPar.ObjectData.Length; i++)
  5336. {
  5337. handlerUpdateExtraParams(m_agentId, extraPar.ObjectData[i].ObjectLocalID,
  5338. extraPar.ObjectData[i].ParamType,
  5339. extraPar.ObjectData[i].ParamInUse, extraPar.ObjectData[i].ParamData);
  5340. }
  5341. }
  5342. return true;
  5343. }
  5344. private bool HandleObjectDuplicate(IClientAPI sender, Packet Pack)
  5345. {
  5346. ObjectDuplicatePacket dupe = (ObjectDuplicatePacket)Pack;
  5347. #region Packet Session and User Check
  5348. if (m_checkPackets)
  5349. {
  5350. if (dupe.AgentData.SessionID != SessionId ||
  5351. dupe.AgentData.AgentID != AgentId)
  5352. return true;
  5353. }
  5354. #endregion
  5355. ObjectDuplicatePacket.AgentDataBlock AgentandGroupData = dupe.AgentData;
  5356. ObjectDuplicate handlerObjectDuplicate = null;
  5357. for (int i = 0; i < dupe.ObjectData.Length; i++)
  5358. {
  5359. handlerObjectDuplicate = OnObjectDuplicate;
  5360. if (handlerObjectDuplicate != null)
  5361. {
  5362. handlerObjectDuplicate(dupe.ObjectData[i].ObjectLocalID, dupe.SharedData.Offset,
  5363. dupe.SharedData.DuplicateFlags, AgentandGroupData.AgentID,
  5364. AgentandGroupData.GroupID);
  5365. }
  5366. }
  5367. return true;
  5368. }
  5369. private bool HandleRequestMultipleObjects(IClientAPI sender, Packet Pack)
  5370. {
  5371. RequestMultipleObjectsPacket incomingRequest = (RequestMultipleObjectsPacket)Pack;
  5372. #region Packet Session and User Check
  5373. if (m_checkPackets)
  5374. {
  5375. if (incomingRequest.AgentData.SessionID != SessionId ||
  5376. incomingRequest.AgentData.AgentID != AgentId)
  5377. return true;
  5378. }
  5379. #endregion
  5380. ObjectRequest handlerObjectRequest = null;
  5381. for (int i = 0; i < incomingRequest.ObjectData.Length; i++)
  5382. {
  5383. handlerObjectRequest = OnObjectRequest;
  5384. if (handlerObjectRequest != null)
  5385. {
  5386. handlerObjectRequest(incomingRequest.ObjectData[i].ID, this);
  5387. }
  5388. }
  5389. return true;
  5390. }
  5391. private bool HandleObjectSelect(IClientAPI sender, Packet Pack)
  5392. {
  5393. ObjectSelectPacket incomingselect = (ObjectSelectPacket)Pack;
  5394. #region Packet Session and User Check
  5395. if (m_checkPackets)
  5396. {
  5397. if (incomingselect.AgentData.SessionID != SessionId ||
  5398. incomingselect.AgentData.AgentID != AgentId)
  5399. return true;
  5400. }
  5401. #endregion
  5402. ObjectSelect handlerObjectSelect = null;
  5403. for (int i = 0; i < incomingselect.ObjectData.Length; i++)
  5404. {
  5405. handlerObjectSelect = OnObjectSelect;
  5406. if (handlerObjectSelect != null)
  5407. {
  5408. handlerObjectSelect(incomingselect.ObjectData[i].ObjectLocalID, this);
  5409. }
  5410. }
  5411. return true;
  5412. }
  5413. private bool HandleObjectDeselect(IClientAPI sender, Packet Pack)
  5414. {
  5415. ObjectDeselectPacket incomingdeselect = (ObjectDeselectPacket)Pack;
  5416. #region Packet Session and User Check
  5417. if (m_checkPackets)
  5418. {
  5419. if (incomingdeselect.AgentData.SessionID != SessionId ||
  5420. incomingdeselect.AgentData.AgentID != AgentId)
  5421. return true;
  5422. }
  5423. #endregion
  5424. ObjectDeselect handlerObjectDeselect = null;
  5425. for (int i = 0; i < incomingdeselect.ObjectData.Length; i++)
  5426. {
  5427. handlerObjectDeselect = OnObjectDeselect;
  5428. if (handlerObjectDeselect != null)
  5429. {
  5430. OnObjectDeselect(incomingdeselect.ObjectData[i].ObjectLocalID, this);
  5431. }
  5432. }
  5433. return true;
  5434. }
  5435. private bool HandleObjectPosition(IClientAPI sender, Packet Pack)
  5436. {
  5437. // DEPRECATED: but till libsecondlife removes it, people will use it
  5438. ObjectPositionPacket position = (ObjectPositionPacket)Pack;
  5439. #region Packet Session and User Check
  5440. if (m_checkPackets)
  5441. {
  5442. if (position.AgentData.SessionID != SessionId ||
  5443. position.AgentData.AgentID != AgentId)
  5444. return true;
  5445. }
  5446. #endregion
  5447. for (int i = 0; i < position.ObjectData.Length; i++)
  5448. {
  5449. UpdateVector handlerUpdateVector = OnUpdatePrimGroupPosition;
  5450. if (handlerUpdateVector != null)
  5451. handlerUpdateVector(position.ObjectData[i].ObjectLocalID, position.ObjectData[i].Position, this);
  5452. }
  5453. return true;
  5454. }
  5455. private bool HandleObjectScale(IClientAPI sender, Packet Pack)
  5456. {
  5457. // DEPRECATED: but till libsecondlife removes it, people will use it
  5458. ObjectScalePacket scale = (ObjectScalePacket)Pack;
  5459. #region Packet Session and User Check
  5460. if (m_checkPackets)
  5461. {
  5462. if (scale.AgentData.SessionID != SessionId ||
  5463. scale.AgentData.AgentID != AgentId)
  5464. return true;
  5465. }
  5466. #endregion
  5467. for (int i = 0; i < scale.ObjectData.Length; i++)
  5468. {
  5469. UpdateVector handlerUpdatePrimGroupScale = OnUpdatePrimGroupScale;
  5470. if (handlerUpdatePrimGroupScale != null)
  5471. handlerUpdatePrimGroupScale(scale.ObjectData[i].ObjectLocalID, scale.ObjectData[i].Scale, this);
  5472. }
  5473. return true;
  5474. }
  5475. private bool HandleObjectRotation(IClientAPI sender, Packet Pack)
  5476. {
  5477. // DEPRECATED: but till libsecondlife removes it, people will use it
  5478. ObjectRotationPacket rotation = (ObjectRotationPacket)Pack;
  5479. #region Packet Session and User Check
  5480. if (m_checkPackets)
  5481. {
  5482. if (rotation.AgentData.SessionID != SessionId ||
  5483. rotation.AgentData.AgentID != AgentId)
  5484. return true;
  5485. }
  5486. #endregion
  5487. for (int i = 0; i < rotation.ObjectData.Length; i++)
  5488. {
  5489. UpdatePrimRotation handlerUpdatePrimRotation = OnUpdatePrimGroupRotation;
  5490. if (handlerUpdatePrimRotation != null)
  5491. handlerUpdatePrimRotation(rotation.ObjectData[i].ObjectLocalID, rotation.ObjectData[i].Rotation, this);
  5492. }
  5493. return true;
  5494. }
  5495. private bool HandleObjectFlagUpdate(IClientAPI sender, Packet Pack)
  5496. {
  5497. ObjectFlagUpdatePacket flags = (ObjectFlagUpdatePacket)Pack;
  5498. #region Packet Session and User Check
  5499. if (m_checkPackets)
  5500. {
  5501. if (flags.AgentData.SessionID != SessionId ||
  5502. flags.AgentData.AgentID != AgentId)
  5503. return true;
  5504. }
  5505. #endregion
  5506. UpdatePrimFlags handlerUpdatePrimFlags = OnUpdatePrimFlags;
  5507. if (handlerUpdatePrimFlags != null)
  5508. {
  5509. byte[] data = Pack.ToBytes();
  5510. // 46,47,48 are special positions within the packet
  5511. // This may change so perhaps we need a better way
  5512. // of storing this (OMV.FlagUpdatePacket.UsePhysics,etc?)
  5513. bool UsePhysics = (data[46] != 0) ? true : false;
  5514. bool IsTemporary = (data[47] != 0) ? true : false;
  5515. bool IsPhantom = (data[48] != 0) ? true : false;
  5516. handlerUpdatePrimFlags(flags.AgentData.ObjectLocalID, UsePhysics, IsTemporary, IsPhantom, this);
  5517. }
  5518. return true;
  5519. }
  5520. private bool HandleObjectImage(IClientAPI sender, Packet Pack)
  5521. {
  5522. ObjectImagePacket imagePack = (ObjectImagePacket)Pack;
  5523. UpdatePrimTexture handlerUpdatePrimTexture = null;
  5524. for (int i = 0; i < imagePack.ObjectData.Length; i++)
  5525. {
  5526. handlerUpdatePrimTexture = OnUpdatePrimTexture;
  5527. if (handlerUpdatePrimTexture != null)
  5528. {
  5529. handlerUpdatePrimTexture(imagePack.ObjectData[i].ObjectLocalID,
  5530. imagePack.ObjectData[i].TextureEntry, this);
  5531. }
  5532. }
  5533. return true;
  5534. }
  5535. private bool HandleObjectGrab(IClientAPI sender, Packet Pack)
  5536. {
  5537. ObjectGrabPacket grab = (ObjectGrabPacket)Pack;
  5538. #region Packet Session and User Check
  5539. if (m_checkPackets)
  5540. {
  5541. if (grab.AgentData.SessionID != SessionId ||
  5542. grab.AgentData.AgentID != AgentId)
  5543. return true;
  5544. }
  5545. #endregion
  5546. GrabObject handlerGrabObject = OnGrabObject;
  5547. if (handlerGrabObject != null)
  5548. {
  5549. List<SurfaceTouchEventArgs> touchArgs = new List<SurfaceTouchEventArgs>();
  5550. if ((grab.SurfaceInfo != null) && (grab.SurfaceInfo.Length > 0))
  5551. {
  5552. foreach (ObjectGrabPacket.SurfaceInfoBlock surfaceInfo in grab.SurfaceInfo)
  5553. {
  5554. SurfaceTouchEventArgs arg = new SurfaceTouchEventArgs();
  5555. arg.Binormal = surfaceInfo.Binormal;
  5556. arg.FaceIndex = surfaceInfo.FaceIndex;
  5557. arg.Normal = surfaceInfo.Normal;
  5558. arg.Position = surfaceInfo.Position;
  5559. arg.STCoord = surfaceInfo.STCoord;
  5560. arg.UVCoord = surfaceInfo.UVCoord;
  5561. touchArgs.Add(arg);
  5562. }
  5563. }
  5564. handlerGrabObject(grab.ObjectData.LocalID, grab.ObjectData.GrabOffset, this, touchArgs);
  5565. }
  5566. return true;
  5567. }
  5568. private bool HandleObjectGrabUpdate(IClientAPI sender, Packet Pack)
  5569. {
  5570. ObjectGrabUpdatePacket grabUpdate = (ObjectGrabUpdatePacket)Pack;
  5571. #region Packet Session and User Check
  5572. if (m_checkPackets)
  5573. {
  5574. if (grabUpdate.AgentData.SessionID != SessionId ||
  5575. grabUpdate.AgentData.AgentID != AgentId)
  5576. return true;
  5577. }
  5578. #endregion
  5579. MoveObject handlerGrabUpdate = OnGrabUpdate;
  5580. if (handlerGrabUpdate != null)
  5581. {
  5582. List<SurfaceTouchEventArgs> touchArgs = new List<SurfaceTouchEventArgs>();
  5583. if ((grabUpdate.SurfaceInfo != null) && (grabUpdate.SurfaceInfo.Length > 0))
  5584. {
  5585. foreach (ObjectGrabUpdatePacket.SurfaceInfoBlock surfaceInfo in grabUpdate.SurfaceInfo)
  5586. {
  5587. SurfaceTouchEventArgs arg = new SurfaceTouchEventArgs();
  5588. arg.Binormal = surfaceInfo.Binormal;
  5589. arg.FaceIndex = surfaceInfo.FaceIndex;
  5590. arg.Normal = surfaceInfo.Normal;
  5591. arg.Position = surfaceInfo.Position;
  5592. arg.STCoord = surfaceInfo.STCoord;
  5593. arg.UVCoord = surfaceInfo.UVCoord;
  5594. touchArgs.Add(arg);
  5595. }
  5596. }
  5597. handlerGrabUpdate(grabUpdate.ObjectData.ObjectID, grabUpdate.ObjectData.GrabOffsetInitial,
  5598. grabUpdate.ObjectData.GrabPosition, this, touchArgs);
  5599. }
  5600. return true;
  5601. }
  5602. private bool HandleObjectDeGrab(IClientAPI sender, Packet Pack)
  5603. {
  5604. ObjectDeGrabPacket deGrab = (ObjectDeGrabPacket)Pack;
  5605. #region Packet Session and User Check
  5606. if (m_checkPackets)
  5607. {
  5608. if (deGrab.AgentData.SessionID != SessionId ||
  5609. deGrab.AgentData.AgentID != AgentId)
  5610. return true;
  5611. }
  5612. #endregion
  5613. DeGrabObject handlerDeGrabObject = OnDeGrabObject;
  5614. if (handlerDeGrabObject != null)
  5615. {
  5616. List<SurfaceTouchEventArgs> touchArgs = new List<SurfaceTouchEventArgs>();
  5617. if ((deGrab.SurfaceInfo != null) && (deGrab.SurfaceInfo.Length > 0))
  5618. {
  5619. foreach (ObjectDeGrabPacket.SurfaceInfoBlock surfaceInfo in deGrab.SurfaceInfo)
  5620. {
  5621. SurfaceTouchEventArgs arg = new SurfaceTouchEventArgs();
  5622. arg.Binormal = surfaceInfo.Binormal;
  5623. arg.FaceIndex = surfaceInfo.FaceIndex;
  5624. arg.Normal = surfaceInfo.Normal;
  5625. arg.Position = surfaceInfo.Position;
  5626. arg.STCoord = surfaceInfo.STCoord;
  5627. arg.UVCoord = surfaceInfo.UVCoord;
  5628. touchArgs.Add(arg);
  5629. }
  5630. }
  5631. handlerDeGrabObject(deGrab.ObjectData.LocalID, this, touchArgs);
  5632. }
  5633. return true;
  5634. }
  5635. private bool HandleObjectSpinStart(IClientAPI sender, Packet Pack)
  5636. {
  5637. //m_log.Warn("[CLIENT]: unhandled ObjectSpinStart packet");
  5638. ObjectSpinStartPacket spinStart = (ObjectSpinStartPacket)Pack;
  5639. #region Packet Session and User Check
  5640. if (m_checkPackets)
  5641. {
  5642. if (spinStart.AgentData.SessionID != SessionId ||
  5643. spinStart.AgentData.AgentID != AgentId)
  5644. return true;
  5645. }
  5646. #endregion
  5647. SpinStart handlerSpinStart = OnSpinStart;
  5648. if (handlerSpinStart != null)
  5649. {
  5650. handlerSpinStart(spinStart.ObjectData.ObjectID, this);
  5651. }
  5652. return true;
  5653. }
  5654. private bool HandleObjectSpinUpdate(IClientAPI sender, Packet Pack)
  5655. {
  5656. //m_log.Warn("[CLIENT]: unhandled ObjectSpinUpdate packet");
  5657. ObjectSpinUpdatePacket spinUpdate = (ObjectSpinUpdatePacket)Pack;
  5658. #region Packet Session and User Check
  5659. if (m_checkPackets)
  5660. {
  5661. if (spinUpdate.AgentData.SessionID != SessionId ||
  5662. spinUpdate.AgentData.AgentID != AgentId)
  5663. return true;
  5664. }
  5665. #endregion
  5666. Vector3 axis;
  5667. float angle;
  5668. spinUpdate.ObjectData.Rotation.GetAxisAngle(out axis, out angle);
  5669. //m_log.Warn("[CLIENT]: ObjectSpinUpdate packet rot axis:" + axis + " angle:" + angle);
  5670. SpinObject handlerSpinUpdate = OnSpinUpdate;
  5671. if (handlerSpinUpdate != null)
  5672. {
  5673. handlerSpinUpdate(spinUpdate.ObjectData.ObjectID, spinUpdate.ObjectData.Rotation, this);
  5674. }
  5675. return true;
  5676. }
  5677. private bool HandleObjectSpinStop(IClientAPI sender, Packet Pack)
  5678. {
  5679. //m_log.Warn("[CLIENT]: unhandled ObjectSpinStop packet");
  5680. ObjectSpinStopPacket spinStop = (ObjectSpinStopPacket)Pack;
  5681. #region Packet Session and User Check
  5682. if (m_checkPackets)
  5683. {
  5684. if (spinStop.AgentData.SessionID != SessionId ||
  5685. spinStop.AgentData.AgentID != AgentId)
  5686. return true;
  5687. }
  5688. #endregion
  5689. SpinStop handlerSpinStop = OnSpinStop;
  5690. if (handlerSpinStop != null)
  5691. {
  5692. handlerSpinStop(spinStop.ObjectData.ObjectID, this);
  5693. }
  5694. return true;
  5695. }
  5696. private bool HandleObjectDescription(IClientAPI sender, Packet Pack)
  5697. {
  5698. ObjectDescriptionPacket objDes = (ObjectDescriptionPacket)Pack;
  5699. #region Packet Session and User Check
  5700. if (m_checkPackets)
  5701. {
  5702. if (objDes.AgentData.SessionID != SessionId ||
  5703. objDes.AgentData.AgentID != AgentId)
  5704. return true;
  5705. }
  5706. #endregion
  5707. GenericCall7 handlerObjectDescription = null;
  5708. for (int i = 0; i < objDes.ObjectData.Length; i++)
  5709. {
  5710. handlerObjectDescription = OnObjectDescription;
  5711. if (handlerObjectDescription != null)
  5712. {
  5713. handlerObjectDescription(this, objDes.ObjectData[i].LocalID,
  5714. Util.FieldToString(objDes.ObjectData[i].Description));
  5715. }
  5716. }
  5717. return true;
  5718. }
  5719. private bool HandleObjectName(IClientAPI sender, Packet Pack)
  5720. {
  5721. ObjectNamePacket objName = (ObjectNamePacket)Pack;
  5722. #region Packet Session and User Check
  5723. if (m_checkPackets)
  5724. {
  5725. if (objName.AgentData.SessionID != SessionId ||
  5726. objName.AgentData.AgentID != AgentId)
  5727. return true;
  5728. }
  5729. #endregion
  5730. GenericCall7 handlerObjectName = null;
  5731. for (int i = 0; i < objName.ObjectData.Length; i++)
  5732. {
  5733. handlerObjectName = OnObjectName;
  5734. if (handlerObjectName != null)
  5735. {
  5736. handlerObjectName(this, objName.ObjectData[i].LocalID,
  5737. Util.FieldToString(objName.ObjectData[i].Name));
  5738. }
  5739. }
  5740. return true;
  5741. }
  5742. private bool HandleObjectPermissions(IClientAPI sender, Packet Pack)
  5743. {
  5744. if (OnObjectPermissions != null)
  5745. {
  5746. ObjectPermissionsPacket newobjPerms = (ObjectPermissionsPacket)Pack;
  5747. #region Packet Session and User Check
  5748. if (m_checkPackets)
  5749. {
  5750. if (newobjPerms.AgentData.SessionID != SessionId ||
  5751. newobjPerms.AgentData.AgentID != AgentId)
  5752. return true;
  5753. }
  5754. #endregion
  5755. UUID AgentID = newobjPerms.AgentData.AgentID;
  5756. UUID SessionID = newobjPerms.AgentData.SessionID;
  5757. ObjectPermissions handlerObjectPermissions = null;
  5758. for (int i = 0; i < newobjPerms.ObjectData.Length; i++)
  5759. {
  5760. ObjectPermissionsPacket.ObjectDataBlock permChanges = newobjPerms.ObjectData[i];
  5761. byte field = permChanges.Field;
  5762. uint localID = permChanges.ObjectLocalID;
  5763. uint mask = permChanges.Mask;
  5764. byte set = permChanges.Set;
  5765. handlerObjectPermissions = OnObjectPermissions;
  5766. if (handlerObjectPermissions != null)
  5767. handlerObjectPermissions(this, AgentID, SessionID, field, localID, mask, set);
  5768. }
  5769. }
  5770. // Here's our data,
  5771. // PermField contains the field the info goes into
  5772. // PermField determines which mask we're changing
  5773. //
  5774. // chmask is the mask of the change
  5775. // setTF is whether we're adding it or taking it away
  5776. //
  5777. // objLocalID is the localID of the object.
  5778. // Unfortunately, we have to pass the event the packet because objData is an array
  5779. // That means multiple object perms may be updated in a single packet.
  5780. return true;
  5781. }
  5782. private bool HandleUndo(IClientAPI sender, Packet Pack)
  5783. {
  5784. UndoPacket undoitem = (UndoPacket)Pack;
  5785. #region Packet Session and User Check
  5786. if (m_checkPackets)
  5787. {
  5788. if (undoitem.AgentData.SessionID != SessionId ||
  5789. undoitem.AgentData.AgentID != AgentId)
  5790. return true;
  5791. }
  5792. #endregion
  5793. if (undoitem.ObjectData.Length > 0)
  5794. {
  5795. for (int i = 0; i < undoitem.ObjectData.Length; i++)
  5796. {
  5797. UUID objiD = undoitem.ObjectData[i].ObjectID;
  5798. AgentSit handlerOnUndo = OnUndo;
  5799. if (handlerOnUndo != null)
  5800. {
  5801. handlerOnUndo(this, objiD);
  5802. }
  5803. }
  5804. }
  5805. return true;
  5806. }
  5807. private bool HandleObjectDuplicateOnRay(IClientAPI sender, Packet Pack)
  5808. {
  5809. ObjectDuplicateOnRayPacket dupeOnRay = (ObjectDuplicateOnRayPacket)Pack;
  5810. #region Packet Session and User Check
  5811. if (m_checkPackets)
  5812. {
  5813. if (dupeOnRay.AgentData.SessionID != SessionId ||
  5814. dupeOnRay.AgentData.AgentID != AgentId)
  5815. return true;
  5816. }
  5817. #endregion
  5818. ObjectDuplicateOnRay handlerObjectDuplicateOnRay = null;
  5819. for (int i = 0; i < dupeOnRay.ObjectData.Length; i++)
  5820. {
  5821. handlerObjectDuplicateOnRay = OnObjectDuplicateOnRay;
  5822. if (handlerObjectDuplicateOnRay != null)
  5823. {
  5824. handlerObjectDuplicateOnRay(dupeOnRay.ObjectData[i].ObjectLocalID, dupeOnRay.AgentData.DuplicateFlags,
  5825. dupeOnRay.AgentData.AgentID, dupeOnRay.AgentData.GroupID, dupeOnRay.AgentData.RayTargetID, dupeOnRay.AgentData.RayEnd,
  5826. dupeOnRay.AgentData.RayStart, dupeOnRay.AgentData.BypassRaycast, dupeOnRay.AgentData.RayEndIsIntersection,
  5827. dupeOnRay.AgentData.CopyCenters, dupeOnRay.AgentData.CopyRotates);
  5828. }
  5829. }
  5830. return true;
  5831. }
  5832. private bool HandleRequestObjectPropertiesFamily(IClientAPI sender, Packet Pack)
  5833. {
  5834. //This powers the little tooltip that appears when you move your mouse over an object
  5835. RequestObjectPropertiesFamilyPacket packToolTip = (RequestObjectPropertiesFamilyPacket)Pack;
  5836. #region Packet Session and User Check
  5837. if (m_checkPackets)
  5838. {
  5839. if (packToolTip.AgentData.SessionID != SessionId ||
  5840. packToolTip.AgentData.AgentID != AgentId)
  5841. return true;
  5842. }
  5843. #endregion
  5844. RequestObjectPropertiesFamilyPacket.ObjectDataBlock packObjBlock = packToolTip.ObjectData;
  5845. RequestObjectPropertiesFamily handlerRequestObjectPropertiesFamily = OnRequestObjectPropertiesFamily;
  5846. if (handlerRequestObjectPropertiesFamily != null)
  5847. {
  5848. handlerRequestObjectPropertiesFamily(this, m_agentId, packObjBlock.RequestFlags,
  5849. packObjBlock.ObjectID);
  5850. }
  5851. return true;
  5852. }
  5853. private bool HandleObjectIncludeInSearch(IClientAPI sender, Packet Pack)
  5854. {
  5855. //This lets us set objects to appear in search (stuff like DataSnapshot, etc)
  5856. ObjectIncludeInSearchPacket packInSearch = (ObjectIncludeInSearchPacket)Pack;
  5857. ObjectIncludeInSearch handlerObjectIncludeInSearch = null;
  5858. #region Packet Session and User Check
  5859. if (m_checkPackets)
  5860. {
  5861. if (packInSearch.AgentData.SessionID != SessionId ||
  5862. packInSearch.AgentData.AgentID != AgentId)
  5863. return true;
  5864. }
  5865. #endregion
  5866. foreach (ObjectIncludeInSearchPacket.ObjectDataBlock objData in packInSearch.ObjectData)
  5867. {
  5868. bool inSearch = objData.IncludeInSearch;
  5869. uint localID = objData.ObjectLocalID;
  5870. handlerObjectIncludeInSearch = OnObjectIncludeInSearch;
  5871. if (handlerObjectIncludeInSearch != null)
  5872. {
  5873. handlerObjectIncludeInSearch(this, inSearch, localID);
  5874. }
  5875. }
  5876. return true;
  5877. }
  5878. private bool HandleScriptAnswerYes(IClientAPI sender, Packet Pack)
  5879. {
  5880. ScriptAnswerYesPacket scriptAnswer = (ScriptAnswerYesPacket)Pack;
  5881. #region Packet Session and User Check
  5882. if (m_checkPackets)
  5883. {
  5884. if (scriptAnswer.AgentData.SessionID != SessionId ||
  5885. scriptAnswer.AgentData.AgentID != AgentId)
  5886. return true;
  5887. }
  5888. #endregion
  5889. ScriptAnswer handlerScriptAnswer = OnScriptAnswer;
  5890. if (handlerScriptAnswer != null)
  5891. {
  5892. handlerScriptAnswer(this, scriptAnswer.Data.TaskID, scriptAnswer.Data.ItemID, scriptAnswer.Data.Questions);
  5893. }
  5894. return true;
  5895. }
  5896. private bool HandleObjectClickAction(IClientAPI sender, Packet Pack)
  5897. {
  5898. ObjectClickActionPacket ocpacket = (ObjectClickActionPacket)Pack;
  5899. #region Packet Session and User Check
  5900. if (m_checkPackets)
  5901. {
  5902. if (ocpacket.AgentData.SessionID != SessionId ||
  5903. ocpacket.AgentData.AgentID != AgentId)
  5904. return true;
  5905. }
  5906. #endregion
  5907. GenericCall7 handlerObjectClickAction = OnObjectClickAction;
  5908. if (handlerObjectClickAction != null)
  5909. {
  5910. foreach (ObjectClickActionPacket.ObjectDataBlock odata in ocpacket.ObjectData)
  5911. {
  5912. byte action = odata.ClickAction;
  5913. uint localID = odata.ObjectLocalID;
  5914. handlerObjectClickAction(this, localID, action.ToString());
  5915. }
  5916. }
  5917. return true;
  5918. }
  5919. private bool HandleObjectMaterial(IClientAPI sender, Packet Pack)
  5920. {
  5921. ObjectMaterialPacket ompacket = (ObjectMaterialPacket)Pack;
  5922. #region Packet Session and User Check
  5923. if (m_checkPackets)
  5924. {
  5925. if (ompacket.AgentData.SessionID != SessionId ||
  5926. ompacket.AgentData.AgentID != AgentId)
  5927. return true;
  5928. }
  5929. #endregion
  5930. GenericCall7 handlerObjectMaterial = OnObjectMaterial;
  5931. if (handlerObjectMaterial != null)
  5932. {
  5933. foreach (ObjectMaterialPacket.ObjectDataBlock odata in ompacket.ObjectData)
  5934. {
  5935. byte material = odata.Material;
  5936. uint localID = odata.ObjectLocalID;
  5937. handlerObjectMaterial(this, localID, material.ToString());
  5938. }
  5939. }
  5940. return true;
  5941. }
  5942. #endregion Objects/m_sceneObjects
  5943. #region Inventory/Asset/Other related packets
  5944. private bool HandleRequestImage(IClientAPI sender, Packet Pack)
  5945. {
  5946. RequestImagePacket imageRequest = (RequestImagePacket)Pack;
  5947. //m_log.Debug("image request: " + Pack.ToString());
  5948. #region Packet Session and User Check
  5949. if (m_checkPackets)
  5950. {
  5951. if (imageRequest.AgentData.SessionID != SessionId ||
  5952. imageRequest.AgentData.AgentID != AgentId)
  5953. return true;
  5954. }
  5955. #endregion
  5956. //handlerTextureRequest = null;
  5957. for (int i = 0; i < imageRequest.RequestImage.Length; i++)
  5958. {
  5959. if (OnRequestTexture != null)
  5960. {
  5961. TextureRequestArgs args = new TextureRequestArgs();
  5962. RequestImagePacket.RequestImageBlock block = imageRequest.RequestImage[i];
  5963. args.RequestedAssetID = block.Image;
  5964. args.DiscardLevel = block.DiscardLevel;
  5965. args.PacketNumber = block.Packet;
  5966. args.Priority = block.DownloadPriority;
  5967. args.requestSequence = imageRequest.Header.Sequence;
  5968. // NOTE: This is not a built in part of the LLUDP protocol, but we double the
  5969. // priority of avatar textures to get avatars rezzing in faster than the
  5970. // surrounding scene
  5971. if ((ImageType)block.Type == ImageType.Baked)
  5972. args.Priority *= 2.0f;
  5973. //handlerTextureRequest = OnRequestTexture;
  5974. //if (handlerTextureRequest != null)
  5975. //OnRequestTexture(this, args);
  5976. // in the end, we null this, so we have to check if it's null
  5977. if (m_imageManager != null)
  5978. {
  5979. m_imageManager.EnqueueReq(args);
  5980. }
  5981. }
  5982. }
  5983. return true;
  5984. }
  5985. private bool HandleTransferRequest(IClientAPI sender, Packet Pack)
  5986. {
  5987. //m_log.Debug("ClientView.ProcessPackets.cs:ProcessInPacket() - Got transfer request");
  5988. TransferRequestPacket transfer = (TransferRequestPacket)Pack;
  5989. //m_log.Debug("Transfer Request: " + transfer.ToString());
  5990. // Validate inventory transfers
  5991. // Has to be done here, because AssetCache can't do it
  5992. //
  5993. UUID taskID = UUID.Zero;
  5994. if (transfer.TransferInfo.SourceType == 3)
  5995. {
  5996. taskID = new UUID(transfer.TransferInfo.Params, 48);
  5997. UUID itemID = new UUID(transfer.TransferInfo.Params, 64);
  5998. UUID requestID = new UUID(transfer.TransferInfo.Params, 80);
  5999. if (!(((Scene)m_scene).Permissions.BypassPermissions()))
  6000. {
  6001. if (taskID != UUID.Zero) // Prim
  6002. {
  6003. SceneObjectPart part = ((Scene)m_scene).GetSceneObjectPart(taskID);
  6004. if (part == null)
  6005. return true;
  6006. if (part.OwnerID != AgentId)
  6007. return true;
  6008. if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0)
  6009. return true;
  6010. TaskInventoryItem ti = part.Inventory.GetInventoryItem(itemID);
  6011. if (ti == null)
  6012. return true;
  6013. if (ti.OwnerID != AgentId)
  6014. return true;
  6015. if ((ti.CurrentPermissions & ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer)) != ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer))
  6016. return true;
  6017. if (ti.AssetID != requestID)
  6018. return true;
  6019. }
  6020. else // Agent
  6021. {
  6022. IInventoryService invService = m_scene.RequestModuleInterface<IInventoryService>();
  6023. InventoryItemBase assetRequestItem = new InventoryItemBase(itemID, AgentId);
  6024. assetRequestItem = invService.GetItem(assetRequestItem);
  6025. if (assetRequestItem == null)
  6026. {
  6027. assetRequestItem = ((Scene)m_scene).CommsManager.UserProfileCacheService.LibraryRoot.FindItem(itemID);
  6028. if (assetRequestItem == null)
  6029. return true;
  6030. }
  6031. // At this point, we need to apply perms
  6032. // only to notecards and scripts. All
  6033. // other asset types are always available
  6034. //
  6035. if (assetRequestItem.AssetType == 10)
  6036. {
  6037. if (!((Scene)m_scene).Permissions.CanViewScript(itemID, UUID.Zero, AgentId))
  6038. {
  6039. SendAgentAlertMessage("Insufficient permissions to view script", false);
  6040. return true;
  6041. }
  6042. }
  6043. else if (assetRequestItem.AssetType == 7)
  6044. {
  6045. if (!((Scene)m_scene).Permissions.CanViewNotecard(itemID, UUID.Zero, AgentId))
  6046. {
  6047. SendAgentAlertMessage("Insufficient permissions to view notecard", false);
  6048. return true;
  6049. }
  6050. }
  6051. if (assetRequestItem.AssetID != requestID)
  6052. return true;
  6053. }
  6054. }
  6055. }
  6056. //m_assetCache.AddAssetRequest(this, transfer);
  6057. MakeAssetRequest(transfer, taskID);
  6058. /* RequestAsset = OnRequestAsset;
  6059. if (RequestAsset != null)
  6060. {
  6061. RequestAsset(this, transfer);
  6062. }*/
  6063. return true;
  6064. }
  6065. private bool HandleAssetUploadRequest(IClientAPI sender, Packet Pack)
  6066. {
  6067. AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack;
  6068. // m_log.Debug("upload request " + request.ToString());
  6069. // m_log.Debug("upload request was for assetid: " + request.AssetBlock.TransactionID.Combine(this.SecureSessionId).ToString());
  6070. UUID temp = UUID.Combine(request.AssetBlock.TransactionID, SecureSessionId);
  6071. UDPAssetUploadRequest handlerAssetUploadRequest = OnAssetUploadRequest;
  6072. if (handlerAssetUploadRequest != null)
  6073. {
  6074. handlerAssetUploadRequest(this, temp,
  6075. request.AssetBlock.TransactionID, request.AssetBlock.Type,
  6076. request.AssetBlock.AssetData, request.AssetBlock.StoreLocal,
  6077. request.AssetBlock.Tempfile);
  6078. }
  6079. return true;
  6080. }
  6081. private bool HandleRequestXfer(IClientAPI sender, Packet Pack)
  6082. {
  6083. RequestXferPacket xferReq = (RequestXferPacket)Pack;
  6084. RequestXfer handlerRequestXfer = OnRequestXfer;
  6085. if (handlerRequestXfer != null)
  6086. {
  6087. handlerRequestXfer(this, xferReq.XferID.ID, Util.FieldToString(xferReq.XferID.Filename));
  6088. }
  6089. return true;
  6090. }
  6091. private bool HandleSendXferPacket(IClientAPI sender, Packet Pack)
  6092. {
  6093. SendXferPacketPacket xferRec = (SendXferPacketPacket)Pack;
  6094. XferReceive handlerXferReceive = OnXferReceive;
  6095. if (handlerXferReceive != null)
  6096. {
  6097. handlerXferReceive(this, xferRec.XferID.ID, xferRec.XferID.Packet, xferRec.DataPacket.Data);
  6098. }
  6099. return true;
  6100. }
  6101. private bool HandleConfirmXferPacket(IClientAPI sender, Packet Pack)
  6102. {
  6103. ConfirmXferPacketPacket confirmXfer = (ConfirmXferPacketPacket)Pack;
  6104. ConfirmXfer handlerConfirmXfer = OnConfirmXfer;
  6105. if (handlerConfirmXfer != null)
  6106. {
  6107. handlerConfirmXfer(this, confirmXfer.XferID.ID, confirmXfer.XferID.Packet);
  6108. }
  6109. return true;
  6110. }
  6111. private bool HandleAbortXfer(IClientAPI sender, Packet Pack)
  6112. {
  6113. AbortXferPacket abortXfer = (AbortXferPacket)Pack;
  6114. AbortXfer handlerAbortXfer = OnAbortXfer;
  6115. if (handlerAbortXfer != null)
  6116. {
  6117. handlerAbortXfer(this, abortXfer.XferID.ID);
  6118. }
  6119. return true;
  6120. }
  6121. private bool HandleCreateInventoryFolder(IClientAPI sender, Packet Pack)
  6122. {
  6123. CreateInventoryFolderPacket invFolder = (CreateInventoryFolderPacket)Pack;
  6124. #region Packet Session and User Check
  6125. if (m_checkPackets)
  6126. {
  6127. if (invFolder.AgentData.SessionID != SessionId ||
  6128. invFolder.AgentData.AgentID != AgentId)
  6129. return true;
  6130. }
  6131. #endregion
  6132. CreateInventoryFolder handlerCreateInventoryFolder = OnCreateNewInventoryFolder;
  6133. if (handlerCreateInventoryFolder != null)
  6134. {
  6135. handlerCreateInventoryFolder(this, invFolder.FolderData.FolderID,
  6136. (ushort)invFolder.FolderData.Type,
  6137. Util.FieldToString(invFolder.FolderData.Name),
  6138. invFolder.FolderData.ParentID);
  6139. }
  6140. return true;
  6141. }
  6142. private bool HandleUpdateInventoryFolder(IClientAPI sender, Packet Pack)
  6143. {
  6144. if (OnUpdateInventoryFolder != null)
  6145. {
  6146. UpdateInventoryFolderPacket invFolderx = (UpdateInventoryFolderPacket)Pack;
  6147. #region Packet Session and User Check
  6148. if (m_checkPackets)
  6149. {
  6150. if (invFolderx.AgentData.SessionID != SessionId ||
  6151. invFolderx.AgentData.AgentID != AgentId)
  6152. return true;
  6153. }
  6154. #endregion
  6155. UpdateInventoryFolder handlerUpdateInventoryFolder = null;
  6156. for (int i = 0; i < invFolderx.FolderData.Length; i++)
  6157. {
  6158. handlerUpdateInventoryFolder = OnUpdateInventoryFolder;
  6159. if (handlerUpdateInventoryFolder != null)
  6160. {
  6161. OnUpdateInventoryFolder(this, invFolderx.FolderData[i].FolderID,
  6162. (ushort)invFolderx.FolderData[i].Type,
  6163. Util.FieldToString(invFolderx.FolderData[i].Name),
  6164. invFolderx.FolderData[i].ParentID);
  6165. }
  6166. }
  6167. }
  6168. return true;
  6169. }
  6170. private bool HandleMoveInventoryFolder(IClientAPI sender, Packet Pack)
  6171. {
  6172. if (OnMoveInventoryFolder != null)
  6173. {
  6174. MoveInventoryFolderPacket invFoldery = (MoveInventoryFolderPacket)Pack;
  6175. #region Packet Session and User Check
  6176. if (m_checkPackets)
  6177. {
  6178. if (invFoldery.AgentData.SessionID != SessionId ||
  6179. invFoldery.AgentData.AgentID != AgentId)
  6180. return true;
  6181. }
  6182. #endregion
  6183. MoveInventoryFolder handlerMoveInventoryFolder = null;
  6184. for (int i = 0; i < invFoldery.InventoryData.Length; i++)
  6185. {
  6186. handlerMoveInventoryFolder = OnMoveInventoryFolder;
  6187. if (handlerMoveInventoryFolder != null)
  6188. {
  6189. OnMoveInventoryFolder(this, invFoldery.InventoryData[i].FolderID,
  6190. invFoldery.InventoryData[i].ParentID);
  6191. }
  6192. }
  6193. }
  6194. return true;
  6195. }
  6196. private bool HandleCreateInventoryItem(IClientAPI sender, Packet Pack)
  6197. {
  6198. CreateInventoryItemPacket createItem = (CreateInventoryItemPacket)Pack;
  6199. #region Packet Session and User Check
  6200. if (m_checkPackets)
  6201. {
  6202. if (createItem.AgentData.SessionID != SessionId ||
  6203. createItem.AgentData.AgentID != AgentId)
  6204. return true;
  6205. }
  6206. #endregion
  6207. CreateNewInventoryItem handlerCreateNewInventoryItem = OnCreateNewInventoryItem;
  6208. if (handlerCreateNewInventoryItem != null)
  6209. {
  6210. handlerCreateNewInventoryItem(this, createItem.InventoryBlock.TransactionID,
  6211. createItem.InventoryBlock.FolderID,
  6212. createItem.InventoryBlock.CallbackID,
  6213. Util.FieldToString(createItem.InventoryBlock.Description),
  6214. Util.FieldToString(createItem.InventoryBlock.Name),
  6215. createItem.InventoryBlock.InvType,
  6216. createItem.InventoryBlock.Type,
  6217. createItem.InventoryBlock.WearableType,
  6218. createItem.InventoryBlock.NextOwnerMask,
  6219. Util.UnixTimeSinceEpoch());
  6220. }
  6221. return true;
  6222. }
  6223. private bool HandleFetchInventory(IClientAPI sender, Packet Pack)
  6224. {
  6225. if (OnFetchInventory != null)
  6226. {
  6227. FetchInventoryPacket FetchInventoryx = (FetchInventoryPacket)Pack;
  6228. #region Packet Session and User Check
  6229. if (m_checkPackets)
  6230. {
  6231. if (FetchInventoryx.AgentData.SessionID != SessionId ||
  6232. FetchInventoryx.AgentData.AgentID != AgentId)
  6233. return true;
  6234. }
  6235. #endregion
  6236. FetchInventory handlerFetchInventory = null;
  6237. for (int i = 0; i < FetchInventoryx.InventoryData.Length; i++)
  6238. {
  6239. handlerFetchInventory = OnFetchInventory;
  6240. if (handlerFetchInventory != null)
  6241. {
  6242. OnFetchInventory(this, FetchInventoryx.InventoryData[i].ItemID,
  6243. FetchInventoryx.InventoryData[i].OwnerID);
  6244. }
  6245. }
  6246. }
  6247. return true;
  6248. }
  6249. private bool HandleFetchInventoryDescendents(IClientAPI sender, Packet Pack)
  6250. {
  6251. FetchInventoryDescendentsPacket Fetch = (FetchInventoryDescendentsPacket)Pack;
  6252. #region Packet Session and User Check
  6253. if (m_checkPackets)
  6254. {
  6255. if (Fetch.AgentData.SessionID != SessionId ||
  6256. Fetch.AgentData.AgentID != AgentId)
  6257. return true;
  6258. }
  6259. #endregion
  6260. FetchInventoryDescendents handlerFetchInventoryDescendents = OnFetchInventoryDescendents;
  6261. if (handlerFetchInventoryDescendents != null)
  6262. {
  6263. handlerFetchInventoryDescendents(this, Fetch.InventoryData.FolderID, Fetch.InventoryData.OwnerID,
  6264. Fetch.InventoryData.FetchFolders, Fetch.InventoryData.FetchItems,
  6265. Fetch.InventoryData.SortOrder);
  6266. }
  6267. return true;
  6268. }
  6269. private bool HandlePurgeInventoryDescendents(IClientAPI sender, Packet Pack)
  6270. {
  6271. PurgeInventoryDescendentsPacket Purge = (PurgeInventoryDescendentsPacket)Pack;
  6272. #region Packet Session and User Check
  6273. if (m_checkPackets)
  6274. {
  6275. if (Purge.AgentData.SessionID != SessionId ||
  6276. Purge.AgentData.AgentID != AgentId)
  6277. return true;
  6278. }
  6279. #endregion
  6280. PurgeInventoryDescendents handlerPurgeInventoryDescendents = OnPurgeInventoryDescendents;
  6281. if (handlerPurgeInventoryDescendents != null)
  6282. {
  6283. handlerPurgeInventoryDescendents(this, Purge.InventoryData.FolderID);
  6284. }
  6285. return true;
  6286. }
  6287. private bool HandleUpdateInventoryItem(IClientAPI sender, Packet Pack)
  6288. {
  6289. UpdateInventoryItemPacket inventoryItemUpdate = (UpdateInventoryItemPacket)Pack;
  6290. #region Packet Session and User Check
  6291. if (m_checkPackets)
  6292. {
  6293. if (inventoryItemUpdate.AgentData.SessionID != SessionId ||
  6294. inventoryItemUpdate.AgentData.AgentID != AgentId)
  6295. return true;
  6296. }
  6297. #endregion
  6298. if (OnUpdateInventoryItem != null)
  6299. {
  6300. UpdateInventoryItem handlerUpdateInventoryItem = null;
  6301. for (int i = 0; i < inventoryItemUpdate.InventoryData.Length; i++)
  6302. {
  6303. handlerUpdateInventoryItem = OnUpdateInventoryItem;
  6304. if (handlerUpdateInventoryItem != null)
  6305. {
  6306. InventoryItemBase itemUpd = new InventoryItemBase();
  6307. itemUpd.ID = inventoryItemUpdate.InventoryData[i].ItemID;
  6308. itemUpd.Name = Util.FieldToString(inventoryItemUpdate.InventoryData[i].Name);
  6309. itemUpd.Description = Util.FieldToString(inventoryItemUpdate.InventoryData[i].Description);
  6310. itemUpd.GroupID = inventoryItemUpdate.InventoryData[i].GroupID;
  6311. itemUpd.GroupOwned = inventoryItemUpdate.InventoryData[i].GroupOwned;
  6312. itemUpd.GroupPermissions = inventoryItemUpdate.InventoryData[i].GroupMask;
  6313. itemUpd.NextPermissions = inventoryItemUpdate.InventoryData[i].NextOwnerMask;
  6314. itemUpd.EveryOnePermissions = inventoryItemUpdate.InventoryData[i].EveryoneMask;
  6315. itemUpd.CreationDate = inventoryItemUpdate.InventoryData[i].CreationDate;
  6316. itemUpd.Folder = inventoryItemUpdate.InventoryData[i].FolderID;
  6317. itemUpd.InvType = inventoryItemUpdate.InventoryData[i].InvType;
  6318. itemUpd.SalePrice = inventoryItemUpdate.InventoryData[i].SalePrice;
  6319. itemUpd.SaleType = inventoryItemUpdate.InventoryData[i].SaleType;
  6320. itemUpd.Flags = inventoryItemUpdate.InventoryData[i].Flags;
  6321. OnUpdateInventoryItem(this, inventoryItemUpdate.InventoryData[i].TransactionID,
  6322. inventoryItemUpdate.InventoryData[i].ItemID,
  6323. itemUpd);
  6324. }
  6325. }
  6326. }
  6327. return true;
  6328. }
  6329. private bool HandleCopyInventoryItem(IClientAPI sender, Packet Pack)
  6330. {
  6331. CopyInventoryItemPacket copyitem = (CopyInventoryItemPacket)Pack;
  6332. #region Packet Session and User Check
  6333. if (m_checkPackets)
  6334. {
  6335. if (copyitem.AgentData.SessionID != SessionId ||
  6336. copyitem.AgentData.AgentID != AgentId)
  6337. return true;
  6338. }
  6339. #endregion
  6340. CopyInventoryItem handlerCopyInventoryItem = null;
  6341. if (OnCopyInventoryItem != null)
  6342. {
  6343. foreach (CopyInventoryItemPacket.InventoryDataBlock datablock in copyitem.InventoryData)
  6344. {
  6345. handlerCopyInventoryItem = OnCopyInventoryItem;
  6346. if (handlerCopyInventoryItem != null)
  6347. {
  6348. handlerCopyInventoryItem(this, datablock.CallbackID, datablock.OldAgentID,
  6349. datablock.OldItemID, datablock.NewFolderID,
  6350. Util.FieldToString(datablock.NewName));
  6351. }
  6352. }
  6353. }
  6354. return true;
  6355. }
  6356. private bool HandleMoveInventoryItem(IClientAPI sender, Packet Pack)
  6357. {
  6358. MoveInventoryItemPacket moveitem = (MoveInventoryItemPacket)Pack;
  6359. #region Packet Session and User Check
  6360. if (m_checkPackets)
  6361. {
  6362. if (moveitem.AgentData.SessionID != SessionId ||
  6363. moveitem.AgentData.AgentID != AgentId)
  6364. return true;
  6365. }
  6366. #endregion
  6367. if (OnMoveInventoryItem != null)
  6368. {
  6369. MoveInventoryItem handlerMoveInventoryItem = null;
  6370. InventoryItemBase itm = null;
  6371. List<InventoryItemBase> items = new List<InventoryItemBase>();
  6372. foreach (MoveInventoryItemPacket.InventoryDataBlock datablock in moveitem.InventoryData)
  6373. {
  6374. itm = new InventoryItemBase(datablock.ItemID, AgentId);
  6375. itm.Folder = datablock.FolderID;
  6376. itm.Name = Util.FieldToString(datablock.NewName);
  6377. // weird, comes out as empty string
  6378. //m_log.DebugFormat("[XXX] new name: {0}", itm.Name);
  6379. items.Add(itm);
  6380. }
  6381. handlerMoveInventoryItem = OnMoveInventoryItem;
  6382. if (handlerMoveInventoryItem != null)
  6383. {
  6384. handlerMoveInventoryItem(this, items);
  6385. }
  6386. }
  6387. return true;
  6388. }
  6389. private bool HandleRemoveInventoryItem(IClientAPI sender, Packet Pack)
  6390. {
  6391. RemoveInventoryItemPacket removeItem = (RemoveInventoryItemPacket)Pack;
  6392. #region Packet Session and User Check
  6393. if (m_checkPackets)
  6394. {
  6395. if (removeItem.AgentData.SessionID != SessionId ||
  6396. removeItem.AgentData.AgentID != AgentId)
  6397. return true;
  6398. }
  6399. #endregion
  6400. if (OnRemoveInventoryItem != null)
  6401. {
  6402. RemoveInventoryItem handlerRemoveInventoryItem = null;
  6403. List<UUID> uuids = new List<UUID>();
  6404. foreach (RemoveInventoryItemPacket.InventoryDataBlock datablock in removeItem.InventoryData)
  6405. {
  6406. uuids.Add(datablock.ItemID);
  6407. }
  6408. handlerRemoveInventoryItem = OnRemoveInventoryItem;
  6409. if (handlerRemoveInventoryItem != null)
  6410. {
  6411. handlerRemoveInventoryItem(this, uuids);
  6412. }
  6413. }
  6414. return true;
  6415. }
  6416. private bool HandleRemoveInventoryFolder(IClientAPI sender, Packet Pack)
  6417. {
  6418. RemoveInventoryFolderPacket removeFolder = (RemoveInventoryFolderPacket)Pack;
  6419. #region Packet Session and User Check
  6420. if (m_checkPackets)
  6421. {
  6422. if (removeFolder.AgentData.SessionID != SessionId ||
  6423. removeFolder.AgentData.AgentID != AgentId)
  6424. return true;
  6425. }
  6426. #endregion
  6427. if (OnRemoveInventoryFolder != null)
  6428. {
  6429. RemoveInventoryFolder handlerRemoveInventoryFolder = null;
  6430. List<UUID> uuids = new List<UUID>();
  6431. foreach (RemoveInventoryFolderPacket.FolderDataBlock datablock in removeFolder.FolderData)
  6432. {
  6433. uuids.Add(datablock.FolderID);
  6434. }
  6435. handlerRemoveInventoryFolder = OnRemoveInventoryFolder;
  6436. if (handlerRemoveInventoryFolder != null)
  6437. {
  6438. handlerRemoveInventoryFolder(this, uuids);
  6439. }
  6440. }
  6441. return true;
  6442. }
  6443. private bool HandleRemoveInventoryObjects(IClientAPI sender, Packet Pack)
  6444. {
  6445. RemoveInventoryObjectsPacket removeObject = (RemoveInventoryObjectsPacket)Pack;
  6446. #region Packet Session and User Check
  6447. if (m_checkPackets)
  6448. {
  6449. if (removeObject.AgentData.SessionID != SessionId ||
  6450. removeObject.AgentData.AgentID != AgentId)
  6451. return true;
  6452. }
  6453. #endregion
  6454. if (OnRemoveInventoryFolder != null)
  6455. {
  6456. RemoveInventoryFolder handlerRemoveInventoryFolder = null;
  6457. List<UUID> uuids = new List<UUID>();
  6458. foreach (RemoveInventoryObjectsPacket.FolderDataBlock datablock in removeObject.FolderData)
  6459. {
  6460. uuids.Add(datablock.FolderID);
  6461. }
  6462. handlerRemoveInventoryFolder = OnRemoveInventoryFolder;
  6463. if (handlerRemoveInventoryFolder != null)
  6464. {
  6465. handlerRemoveInventoryFolder(this, uuids);
  6466. }
  6467. }
  6468. if (OnRemoveInventoryItem != null)
  6469. {
  6470. RemoveInventoryItem handlerRemoveInventoryItem = null;
  6471. List<UUID> uuids = new List<UUID>();
  6472. foreach (RemoveInventoryObjectsPacket.ItemDataBlock datablock in removeObject.ItemData)
  6473. {
  6474. uuids.Add(datablock.ItemID);
  6475. }
  6476. handlerRemoveInventoryItem = OnRemoveInventoryItem;
  6477. if (handlerRemoveInventoryItem != null)
  6478. {
  6479. handlerRemoveInventoryItem(this, uuids);
  6480. }
  6481. }
  6482. return true;
  6483. }
  6484. private bool HandleRequestTaskInventory(IClientAPI sender, Packet Pack)
  6485. {
  6486. RequestTaskInventoryPacket requesttask = (RequestTaskInventoryPacket)Pack;
  6487. #region Packet Session and User Check
  6488. if (m_checkPackets)
  6489. {
  6490. if (requesttask.AgentData.SessionID != SessionId ||
  6491. requesttask.AgentData.AgentID != AgentId)
  6492. return true;
  6493. }
  6494. #endregion
  6495. RequestTaskInventory handlerRequestTaskInventory = OnRequestTaskInventory;
  6496. if (handlerRequestTaskInventory != null)
  6497. {
  6498. handlerRequestTaskInventory(this, requesttask.InventoryData.LocalID);
  6499. }
  6500. return true;
  6501. }
  6502. private bool HandleUpdateTaskInventory(IClientAPI sender, Packet Pack)
  6503. {
  6504. UpdateTaskInventoryPacket updatetask = (UpdateTaskInventoryPacket)Pack;
  6505. #region Packet Session and User Check
  6506. if (m_checkPackets)
  6507. {
  6508. if (updatetask.AgentData.SessionID != SessionId ||
  6509. updatetask.AgentData.AgentID != AgentId)
  6510. return true;
  6511. }
  6512. #endregion
  6513. if (OnUpdateTaskInventory != null)
  6514. {
  6515. if (updatetask.UpdateData.Key == 0)
  6516. {
  6517. UpdateTaskInventory handlerUpdateTaskInventory = OnUpdateTaskInventory;
  6518. if (handlerUpdateTaskInventory != null)
  6519. {
  6520. TaskInventoryItem newTaskItem = new TaskInventoryItem();
  6521. newTaskItem.ItemID = updatetask.InventoryData.ItemID;
  6522. newTaskItem.ParentID = updatetask.InventoryData.FolderID;
  6523. newTaskItem.CreatorID = updatetask.InventoryData.CreatorID;
  6524. newTaskItem.OwnerID = updatetask.InventoryData.OwnerID;
  6525. newTaskItem.GroupID = updatetask.InventoryData.GroupID;
  6526. newTaskItem.BasePermissions = updatetask.InventoryData.BaseMask;
  6527. newTaskItem.CurrentPermissions = updatetask.InventoryData.OwnerMask;
  6528. newTaskItem.GroupPermissions = updatetask.InventoryData.GroupMask;
  6529. newTaskItem.EveryonePermissions = updatetask.InventoryData.EveryoneMask;
  6530. newTaskItem.NextPermissions = updatetask.InventoryData.NextOwnerMask;
  6531. //newTaskItem.GroupOwned=updatetask.InventoryData.GroupOwned;
  6532. newTaskItem.Type = updatetask.InventoryData.Type;
  6533. newTaskItem.InvType = updatetask.InventoryData.InvType;
  6534. newTaskItem.Flags = updatetask.InventoryData.Flags;
  6535. //newTaskItem.SaleType=updatetask.InventoryData.SaleType;
  6536. //newTaskItem.SalePrice=updatetask.InventoryData.SalePrice;;
  6537. newTaskItem.Name = Util.FieldToString(updatetask.InventoryData.Name);
  6538. newTaskItem.Description = Util.FieldToString(updatetask.InventoryData.Description);
  6539. newTaskItem.CreationDate = (uint)updatetask.InventoryData.CreationDate;
  6540. handlerUpdateTaskInventory(this, updatetask.InventoryData.TransactionID,
  6541. newTaskItem, updatetask.UpdateData.LocalID);
  6542. }
  6543. }
  6544. }
  6545. return true;
  6546. }
  6547. private bool HandleRemoveTaskInventory(IClientAPI sender, Packet Pack)
  6548. {
  6549. RemoveTaskInventoryPacket removeTask = (RemoveTaskInventoryPacket)Pack;
  6550. #region Packet Session and User Check
  6551. if (m_checkPackets)
  6552. {
  6553. if (removeTask.AgentData.SessionID != SessionId ||
  6554. removeTask.AgentData.AgentID != AgentId)
  6555. return true;
  6556. }
  6557. #endregion
  6558. RemoveTaskInventory handlerRemoveTaskItem = OnRemoveTaskItem;
  6559. if (handlerRemoveTaskItem != null)
  6560. {
  6561. handlerRemoveTaskItem(this, removeTask.InventoryData.ItemID, removeTask.InventoryData.LocalID);
  6562. }
  6563. return true;
  6564. }
  6565. private bool HandleMoveTaskInventory(IClientAPI sender, Packet Pack)
  6566. {
  6567. MoveTaskInventoryPacket moveTaskInventoryPacket = (MoveTaskInventoryPacket)Pack;
  6568. #region Packet Session and User Check
  6569. if (m_checkPackets)
  6570. {
  6571. if (moveTaskInventoryPacket.AgentData.SessionID != SessionId ||
  6572. moveTaskInventoryPacket.AgentData.AgentID != AgentId)
  6573. return true;
  6574. }
  6575. #endregion
  6576. MoveTaskInventory handlerMoveTaskItem = OnMoveTaskItem;
  6577. if (handlerMoveTaskItem != null)
  6578. {
  6579. handlerMoveTaskItem(
  6580. this, moveTaskInventoryPacket.AgentData.FolderID,
  6581. moveTaskInventoryPacket.InventoryData.LocalID,
  6582. moveTaskInventoryPacket.InventoryData.ItemID);
  6583. }
  6584. return true;
  6585. }
  6586. private bool HandleRezScript(IClientAPI sender, Packet Pack)
  6587. {
  6588. //m_log.Debug(Pack.ToString());
  6589. RezScriptPacket rezScriptx = (RezScriptPacket)Pack;
  6590. #region Packet Session and User Check
  6591. if (m_checkPackets)
  6592. {
  6593. if (rezScriptx.AgentData.SessionID != SessionId ||
  6594. rezScriptx.AgentData.AgentID != AgentId)
  6595. return true;
  6596. }
  6597. #endregion
  6598. RezScript handlerRezScript = OnRezScript;
  6599. InventoryItemBase item = new InventoryItemBase();
  6600. item.ID = rezScriptx.InventoryBlock.ItemID;
  6601. item.Folder = rezScriptx.InventoryBlock.FolderID;
  6602. item.CreatorId = rezScriptx.InventoryBlock.CreatorID.ToString();
  6603. item.Owner = rezScriptx.InventoryBlock.OwnerID;
  6604. item.BasePermissions = rezScriptx.InventoryBlock.BaseMask;
  6605. item.CurrentPermissions = rezScriptx.InventoryBlock.OwnerMask;
  6606. item.EveryOnePermissions = rezScriptx.InventoryBlock.EveryoneMask;
  6607. item.NextPermissions = rezScriptx.InventoryBlock.NextOwnerMask;
  6608. item.GroupPermissions = rezScriptx.InventoryBlock.GroupMask;
  6609. item.GroupOwned = rezScriptx.InventoryBlock.GroupOwned;
  6610. item.GroupID = rezScriptx.InventoryBlock.GroupID;
  6611. item.AssetType = rezScriptx.InventoryBlock.Type;
  6612. item.InvType = rezScriptx.InventoryBlock.InvType;
  6613. item.Flags = rezScriptx.InventoryBlock.Flags;
  6614. item.SaleType = rezScriptx.InventoryBlock.SaleType;
  6615. item.SalePrice = rezScriptx.InventoryBlock.SalePrice;
  6616. item.Name = Util.FieldToString(rezScriptx.InventoryBlock.Name);
  6617. item.Description = Util.FieldToString(rezScriptx.InventoryBlock.Description);
  6618. item.CreationDate = rezScriptx.InventoryBlock.CreationDate;
  6619. if (handlerRezScript != null)
  6620. {
  6621. handlerRezScript(this, item, rezScriptx.InventoryBlock.TransactionID, rezScriptx.UpdateBlock.ObjectLocalID);
  6622. }
  6623. return true;
  6624. }
  6625. private bool HandleMapLayerRequest(IClientAPI sender, Packet Pack)
  6626. {
  6627. RequestMapLayer();
  6628. return true;
  6629. }
  6630. private bool HandleMapBlockRequest(IClientAPI sender, Packet Pack)
  6631. {
  6632. MapBlockRequestPacket MapRequest = (MapBlockRequestPacket)Pack;
  6633. #region Packet Session and User Check
  6634. if (m_checkPackets)
  6635. {
  6636. if (MapRequest.AgentData.SessionID != SessionId ||
  6637. MapRequest.AgentData.AgentID != AgentId)
  6638. return true;
  6639. }
  6640. #endregion
  6641. RequestMapBlocks handlerRequestMapBlocks = OnRequestMapBlocks;
  6642. if (handlerRequestMapBlocks != null)
  6643. {
  6644. handlerRequestMapBlocks(this, MapRequest.PositionData.MinX, MapRequest.PositionData.MinY,
  6645. MapRequest.PositionData.MaxX, MapRequest.PositionData.MaxY, MapRequest.AgentData.Flags);
  6646. }
  6647. return true;
  6648. }
  6649. private bool HandleMapNameRequest(IClientAPI sender, Packet Pack)
  6650. {
  6651. MapNameRequestPacket map = (MapNameRequestPacket)Pack;
  6652. #region Packet Session and User Check
  6653. if (m_checkPackets)
  6654. {
  6655. if (map.AgentData.SessionID != SessionId ||
  6656. map.AgentData.AgentID != AgentId)
  6657. return true;
  6658. }
  6659. #endregion
  6660. string mapName = Util.UTF8.GetString(map.NameData.Name, 0,
  6661. map.NameData.Name.Length - 1);
  6662. RequestMapName handlerMapNameRequest = OnMapNameRequest;
  6663. if (handlerMapNameRequest != null)
  6664. {
  6665. handlerMapNameRequest(this, mapName);
  6666. }
  6667. return true;
  6668. }
  6669. private bool HandleTeleportLandmarkRequest(IClientAPI sender, Packet Pack)
  6670. {
  6671. TeleportLandmarkRequestPacket tpReq = (TeleportLandmarkRequestPacket)Pack;
  6672. #region Packet Session and User Check
  6673. if (m_checkPackets)
  6674. {
  6675. if (tpReq.Info.SessionID != SessionId ||
  6676. tpReq.Info.AgentID != AgentId)
  6677. return true;
  6678. }
  6679. #endregion
  6680. UUID lmid = tpReq.Info.LandmarkID;
  6681. AssetLandmark lm;
  6682. if (lmid != UUID.Zero)
  6683. {
  6684. //AssetBase lma = m_assetCache.GetAsset(lmid, false);
  6685. AssetBase lma = m_assetService.Get(lmid.ToString());
  6686. if (lma == null)
  6687. {
  6688. // Failed to find landmark
  6689. TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
  6690. tpCancel.Info.SessionID = tpReq.Info.SessionID;
  6691. tpCancel.Info.AgentID = tpReq.Info.AgentID;
  6692. OutPacket(tpCancel, ThrottleOutPacketType.Task);
  6693. }
  6694. try
  6695. {
  6696. lm = new AssetLandmark(lma);
  6697. }
  6698. catch (NullReferenceException)
  6699. {
  6700. // asset not found generates null ref inside the assetlandmark constructor.
  6701. TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
  6702. tpCancel.Info.SessionID = tpReq.Info.SessionID;
  6703. tpCancel.Info.AgentID = tpReq.Info.AgentID;
  6704. OutPacket(tpCancel, ThrottleOutPacketType.Task);
  6705. return true;
  6706. }
  6707. }
  6708. else
  6709. {
  6710. // Teleport home request
  6711. UUIDNameRequest handlerTeleportHomeRequest = OnTeleportHomeRequest;
  6712. if (handlerTeleportHomeRequest != null)
  6713. {
  6714. handlerTeleportHomeRequest(AgentId, this);
  6715. }
  6716. return true;
  6717. }
  6718. TeleportLandmarkRequest handlerTeleportLandmarkRequest = OnTeleportLandmarkRequest;
  6719. if (handlerTeleportLandmarkRequest != null)
  6720. {
  6721. handlerTeleportLandmarkRequest(this, lm.RegionID, lm.Position);
  6722. }
  6723. else
  6724. {
  6725. //no event handler so cancel request
  6726. TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
  6727. tpCancel.Info.AgentID = tpReq.Info.AgentID;
  6728. tpCancel.Info.SessionID = tpReq.Info.SessionID;
  6729. OutPacket(tpCancel, ThrottleOutPacketType.Task);
  6730. }
  6731. return true;
  6732. }
  6733. private bool HandleTeleportLocationRequest(IClientAPI sender, Packet Pack)
  6734. {
  6735. TeleportLocationRequestPacket tpLocReq = (TeleportLocationRequestPacket)Pack;
  6736. // m_log.Debug(tpLocReq.ToString());
  6737. #region Packet Session and User Check
  6738. if (m_checkPackets)
  6739. {
  6740. if (tpLocReq.AgentData.SessionID != SessionId ||
  6741. tpLocReq.AgentData.AgentID != AgentId)
  6742. return true;
  6743. }
  6744. #endregion
  6745. TeleportLocationRequest handlerTeleportLocationRequest = OnTeleportLocationRequest;
  6746. if (handlerTeleportLocationRequest != null)
  6747. {
  6748. handlerTeleportLocationRequest(this, tpLocReq.Info.RegionHandle, tpLocReq.Info.Position,
  6749. tpLocReq.Info.LookAt, 16);
  6750. }
  6751. else
  6752. {
  6753. //no event handler so cancel request
  6754. TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
  6755. tpCancel.Info.SessionID = tpLocReq.AgentData.SessionID;
  6756. tpCancel.Info.AgentID = tpLocReq.AgentData.AgentID;
  6757. OutPacket(tpCancel, ThrottleOutPacketType.Task);
  6758. }
  6759. return true;
  6760. }
  6761. #endregion Inventory/Asset/Other related packets
  6762. private bool HandleUUIDNameRequest(IClientAPI sender, Packet Pack)
  6763. {
  6764. UUIDNameRequestPacket incoming = (UUIDNameRequestPacket)Pack;
  6765. foreach (UUIDNameRequestPacket.UUIDNameBlockBlock UUIDBlock in incoming.UUIDNameBlock)
  6766. {
  6767. UUIDNameRequest handlerNameRequest = OnNameFromUUIDRequest;
  6768. if (handlerNameRequest != null)
  6769. {
  6770. handlerNameRequest(UUIDBlock.ID, this);
  6771. }
  6772. }
  6773. return true;
  6774. }
  6775. #region Parcel related packets
  6776. private bool HandleRegionHandleRequest(IClientAPI sender, Packet Pack)
  6777. {
  6778. RegionHandleRequestPacket rhrPack = (RegionHandleRequestPacket)Pack;
  6779. RegionHandleRequest handlerRegionHandleRequest = OnRegionHandleRequest;
  6780. if (handlerRegionHandleRequest != null)
  6781. {
  6782. handlerRegionHandleRequest(this, rhrPack.RequestBlock.RegionID);
  6783. }
  6784. return true;
  6785. }
  6786. private bool HandleParcelInfoRequest(IClientAPI sender, Packet Pack)
  6787. {
  6788. ParcelInfoRequestPacket pirPack = (ParcelInfoRequestPacket)Pack;
  6789. #region Packet Session and User Check
  6790. if (m_checkPackets)
  6791. {
  6792. if (pirPack.AgentData.SessionID != SessionId ||
  6793. pirPack.AgentData.AgentID != AgentId)
  6794. return true;
  6795. }
  6796. #endregion
  6797. ParcelInfoRequest handlerParcelInfoRequest = OnParcelInfoRequest;
  6798. if (handlerParcelInfoRequest != null)
  6799. {
  6800. handlerParcelInfoRequest(this, pirPack.Data.ParcelID);
  6801. }
  6802. return true;
  6803. }
  6804. private bool HandleParcelAccessListRequest(IClientAPI sender, Packet Pack)
  6805. {
  6806. ParcelAccessListRequestPacket requestPacket = (ParcelAccessListRequestPacket)Pack;
  6807. #region Packet Session and User Check
  6808. if (m_checkPackets)
  6809. {
  6810. if (requestPacket.AgentData.SessionID != SessionId ||
  6811. requestPacket.AgentData.AgentID != AgentId)
  6812. return true;
  6813. }
  6814. #endregion
  6815. ParcelAccessListRequest handlerParcelAccessListRequest = OnParcelAccessListRequest;
  6816. if (handlerParcelAccessListRequest != null)
  6817. {
  6818. handlerParcelAccessListRequest(requestPacket.AgentData.AgentID, requestPacket.AgentData.SessionID,
  6819. requestPacket.Data.Flags, requestPacket.Data.SequenceID,
  6820. requestPacket.Data.LocalID, this);
  6821. }
  6822. return true;
  6823. }
  6824. private bool HandleParcelAccessListUpdate(IClientAPI sender, Packet Pack)
  6825. {
  6826. ParcelAccessListUpdatePacket updatePacket = (ParcelAccessListUpdatePacket)Pack;
  6827. #region Packet Session and User Check
  6828. if (m_checkPackets)
  6829. {
  6830. if (updatePacket.AgentData.SessionID != SessionId ||
  6831. updatePacket.AgentData.AgentID != AgentId)
  6832. return true;
  6833. }
  6834. #endregion
  6835. List<ParcelManager.ParcelAccessEntry> entries = new List<ParcelManager.ParcelAccessEntry>();
  6836. foreach (ParcelAccessListUpdatePacket.ListBlock block in updatePacket.List)
  6837. {
  6838. ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
  6839. entry.AgentID = block.ID;
  6840. entry.Flags = (AccessList)block.Flags;
  6841. entry.Time = new DateTime();
  6842. entries.Add(entry);
  6843. }
  6844. ParcelAccessListUpdateRequest handlerParcelAccessListUpdateRequest = OnParcelAccessListUpdateRequest;
  6845. if (handlerParcelAccessListUpdateRequest != null)
  6846. {
  6847. handlerParcelAccessListUpdateRequest(updatePacket.AgentData.AgentID,
  6848. updatePacket.AgentData.SessionID, updatePacket.Data.Flags,
  6849. updatePacket.Data.LocalID, entries, this);
  6850. }
  6851. return true;
  6852. }
  6853. private bool HandleParcelPropertiesRequest(IClientAPI sender, Packet Pack)
  6854. {
  6855. ParcelPropertiesRequestPacket propertiesRequest = (ParcelPropertiesRequestPacket)Pack;
  6856. #region Packet Session and User Check
  6857. if (m_checkPackets)
  6858. {
  6859. if (propertiesRequest.AgentData.SessionID != SessionId ||
  6860. propertiesRequest.AgentData.AgentID != AgentId)
  6861. return true;
  6862. }
  6863. #endregion
  6864. ParcelPropertiesRequest handlerParcelPropertiesRequest = OnParcelPropertiesRequest;
  6865. if (handlerParcelPropertiesRequest != null)
  6866. {
  6867. handlerParcelPropertiesRequest((int)Math.Round(propertiesRequest.ParcelData.West),
  6868. (int)Math.Round(propertiesRequest.ParcelData.South),
  6869. (int)Math.Round(propertiesRequest.ParcelData.East),
  6870. (int)Math.Round(propertiesRequest.ParcelData.North),
  6871. propertiesRequest.ParcelData.SequenceID,
  6872. propertiesRequest.ParcelData.SnapSelection, this);
  6873. }
  6874. return true;
  6875. }
  6876. private bool HandleParcelDivide(IClientAPI sender, Packet Pack)
  6877. {
  6878. ParcelDividePacket landDivide = (ParcelDividePacket)Pack;
  6879. #region Packet Session and User Check
  6880. if (m_checkPackets)
  6881. {
  6882. if (landDivide.AgentData.SessionID != SessionId ||
  6883. landDivide.AgentData.AgentID != AgentId)
  6884. return true;
  6885. }
  6886. #endregion
  6887. ParcelDivideRequest handlerParcelDivideRequest = OnParcelDivideRequest;
  6888. if (handlerParcelDivideRequest != null)
  6889. {
  6890. handlerParcelDivideRequest((int)Math.Round(landDivide.ParcelData.West),
  6891. (int)Math.Round(landDivide.ParcelData.South),
  6892. (int)Math.Round(landDivide.ParcelData.East),
  6893. (int)Math.Round(landDivide.ParcelData.North), this);
  6894. }
  6895. return true;
  6896. }
  6897. private bool HandleParcelJoin(IClientAPI sender, Packet Pack)
  6898. {
  6899. ParcelJoinPacket landJoin = (ParcelJoinPacket)Pack;
  6900. #region Packet Session and User Check
  6901. if (m_checkPackets)
  6902. {
  6903. if (landJoin.AgentData.SessionID != SessionId ||
  6904. landJoin.AgentData.AgentID != AgentId)
  6905. return true;
  6906. }
  6907. #endregion
  6908. ParcelJoinRequest handlerParcelJoinRequest = OnParcelJoinRequest;
  6909. if (handlerParcelJoinRequest != null)
  6910. {
  6911. handlerParcelJoinRequest((int)Math.Round(landJoin.ParcelData.West),
  6912. (int)Math.Round(landJoin.ParcelData.South),
  6913. (int)Math.Round(landJoin.ParcelData.East),
  6914. (int)Math.Round(landJoin.ParcelData.North), this);
  6915. }
  6916. return true;
  6917. }
  6918. private bool HandleParcelPropertiesUpdate(IClientAPI sender, Packet Pack)
  6919. {
  6920. ParcelPropertiesUpdatePacket parcelPropertiesPacket = (ParcelPropertiesUpdatePacket)Pack;
  6921. #region Packet Session and User Check
  6922. if (m_checkPackets)
  6923. {
  6924. if (parcelPropertiesPacket.AgentData.SessionID != SessionId ||
  6925. parcelPropertiesPacket.AgentData.AgentID != AgentId)
  6926. return true;
  6927. }
  6928. #endregion
  6929. ParcelPropertiesUpdateRequest handlerParcelPropertiesUpdateRequest = OnParcelPropertiesUpdateRequest;
  6930. if (handlerParcelPropertiesUpdateRequest != null)
  6931. {
  6932. LandUpdateArgs args = new LandUpdateArgs();
  6933. args.AuthBuyerID = parcelPropertiesPacket.ParcelData.AuthBuyerID;
  6934. args.Category = (ParcelCategory)parcelPropertiesPacket.ParcelData.Category;
  6935. args.Desc = Utils.BytesToString(parcelPropertiesPacket.ParcelData.Desc);
  6936. args.GroupID = parcelPropertiesPacket.ParcelData.GroupID;
  6937. args.LandingType = parcelPropertiesPacket.ParcelData.LandingType;
  6938. args.MediaAutoScale = parcelPropertiesPacket.ParcelData.MediaAutoScale;
  6939. args.MediaID = parcelPropertiesPacket.ParcelData.MediaID;
  6940. args.MediaURL = Utils.BytesToString(parcelPropertiesPacket.ParcelData.MediaURL);
  6941. args.MusicURL = Utils.BytesToString(parcelPropertiesPacket.ParcelData.MusicURL);
  6942. args.Name = Utils.BytesToString(parcelPropertiesPacket.ParcelData.Name);
  6943. args.ParcelFlags = parcelPropertiesPacket.ParcelData.ParcelFlags;
  6944. args.PassHours = parcelPropertiesPacket.ParcelData.PassHours;
  6945. args.PassPrice = parcelPropertiesPacket.ParcelData.PassPrice;
  6946. args.SalePrice = parcelPropertiesPacket.ParcelData.SalePrice;
  6947. args.SnapshotID = parcelPropertiesPacket.ParcelData.SnapshotID;
  6948. args.UserLocation = parcelPropertiesPacket.ParcelData.UserLocation;
  6949. args.UserLookAt = parcelPropertiesPacket.ParcelData.UserLookAt;
  6950. handlerParcelPropertiesUpdateRequest(args, parcelPropertiesPacket.ParcelData.LocalID, this);
  6951. }
  6952. return true;
  6953. }
  6954. private bool HandleParcelSelectObjects(IClientAPI sender, Packet Pack)
  6955. {
  6956. ParcelSelectObjectsPacket selectPacket = (ParcelSelectObjectsPacket)Pack;
  6957. #region Packet Session and User Check
  6958. if (m_checkPackets)
  6959. {
  6960. if (selectPacket.AgentData.SessionID != SessionId ||
  6961. selectPacket.AgentData.AgentID != AgentId)
  6962. return true;
  6963. }
  6964. #endregion
  6965. List<UUID> returnIDs = new List<UUID>();
  6966. foreach (ParcelSelectObjectsPacket.ReturnIDsBlock rb in
  6967. selectPacket.ReturnIDs)
  6968. {
  6969. returnIDs.Add(rb.ReturnID);
  6970. }
  6971. ParcelSelectObjects handlerParcelSelectObjects = OnParcelSelectObjects;
  6972. if (handlerParcelSelectObjects != null)
  6973. {
  6974. handlerParcelSelectObjects(selectPacket.ParcelData.LocalID,
  6975. Convert.ToInt32(selectPacket.ParcelData.ReturnType), returnIDs, this);
  6976. }
  6977. return true;
  6978. }
  6979. private bool HandleParcelObjectOwnersRequest(IClientAPI sender, Packet Pack)
  6980. {
  6981. ParcelObjectOwnersRequestPacket reqPacket = (ParcelObjectOwnersRequestPacket)Pack;
  6982. #region Packet Session and User Check
  6983. if (m_checkPackets)
  6984. {
  6985. if (reqPacket.AgentData.SessionID != SessionId ||
  6986. reqPacket.AgentData.AgentID != AgentId)
  6987. return true;
  6988. }
  6989. #endregion
  6990. ParcelObjectOwnerRequest handlerParcelObjectOwnerRequest = OnParcelObjectOwnerRequest;
  6991. if (handlerParcelObjectOwnerRequest != null)
  6992. {
  6993. handlerParcelObjectOwnerRequest(reqPacket.ParcelData.LocalID, this);
  6994. }
  6995. return true;
  6996. }
  6997. private bool HandleParcelGodForceOwner(IClientAPI sender, Packet Pack)
  6998. {
  6999. ParcelGodForceOwnerPacket godForceOwnerPacket = (ParcelGodForceOwnerPacket)Pack;
  7000. #region Packet Session and User Check
  7001. if (m_checkPackets)
  7002. {
  7003. if (godForceOwnerPacket.AgentData.SessionID != SessionId ||
  7004. godForceOwnerPacket.AgentData.AgentID != AgentId)
  7005. return true;
  7006. }
  7007. #endregion
  7008. ParcelGodForceOwner handlerParcelGodForceOwner = OnParcelGodForceOwner;
  7009. if (handlerParcelGodForceOwner != null)
  7010. {
  7011. handlerParcelGodForceOwner(godForceOwnerPacket.Data.LocalID, godForceOwnerPacket.Data.OwnerID, this);
  7012. }
  7013. return true;
  7014. }
  7015. private bool HandleParcelRelease(IClientAPI sender, Packet Pack)
  7016. {
  7017. ParcelReleasePacket releasePacket = (ParcelReleasePacket)Pack;
  7018. #region Packet Session and User Check
  7019. if (m_checkPackets)
  7020. {
  7021. if (releasePacket.AgentData.SessionID != SessionId ||
  7022. releasePacket.AgentData.AgentID != AgentId)
  7023. return true;
  7024. }
  7025. #endregion
  7026. ParcelAbandonRequest handlerParcelAbandonRequest = OnParcelAbandonRequest;
  7027. if (handlerParcelAbandonRequest != null)
  7028. {
  7029. handlerParcelAbandonRequest(releasePacket.Data.LocalID, this);
  7030. }
  7031. return true;
  7032. }
  7033. private bool HandleParcelReclaim(IClientAPI sender, Packet Pack)
  7034. {
  7035. ParcelReclaimPacket reclaimPacket = (ParcelReclaimPacket)Pack;
  7036. #region Packet Session and User Check
  7037. if (m_checkPackets)
  7038. {
  7039. if (reclaimPacket.AgentData.SessionID != SessionId ||
  7040. reclaimPacket.AgentData.AgentID != AgentId)
  7041. return true;
  7042. }
  7043. #endregion
  7044. ParcelReclaim handlerParcelReclaim = OnParcelReclaim;
  7045. if (handlerParcelReclaim != null)
  7046. {
  7047. handlerParcelReclaim(reclaimPacket.Data.LocalID, this);
  7048. }
  7049. return true;
  7050. }
  7051. private bool HandleParcelReturnObjects(IClientAPI sender, Packet Pack)
  7052. {
  7053. ParcelReturnObjectsPacket parcelReturnObjects = (ParcelReturnObjectsPacket)Pack;
  7054. #region Packet Session and User Check
  7055. if (m_checkPackets)
  7056. {
  7057. if (parcelReturnObjects.AgentData.SessionID != SessionId ||
  7058. parcelReturnObjects.AgentData.AgentID != AgentId)
  7059. return true;
  7060. }
  7061. #endregion
  7062. UUID[] puserselectedOwnerIDs = new UUID[parcelReturnObjects.OwnerIDs.Length];
  7063. for (int parceliterator = 0; parceliterator < parcelReturnObjects.OwnerIDs.Length; parceliterator++)
  7064. puserselectedOwnerIDs[parceliterator] = parcelReturnObjects.OwnerIDs[parceliterator].OwnerID;
  7065. UUID[] puserselectedTaskIDs = new UUID[parcelReturnObjects.TaskIDs.Length];
  7066. for (int parceliterator = 0; parceliterator < parcelReturnObjects.TaskIDs.Length; parceliterator++)
  7067. puserselectedTaskIDs[parceliterator] = parcelReturnObjects.TaskIDs[parceliterator].TaskID;
  7068. ParcelReturnObjectsRequest handlerParcelReturnObjectsRequest = OnParcelReturnObjectsRequest;
  7069. if (handlerParcelReturnObjectsRequest != null)
  7070. {
  7071. handlerParcelReturnObjectsRequest(parcelReturnObjects.ParcelData.LocalID, parcelReturnObjects.ParcelData.ReturnType, puserselectedOwnerIDs, puserselectedTaskIDs, this);
  7072. }
  7073. return true;
  7074. }
  7075. private bool HandleParcelSetOtherCleanTime(IClientAPI sender, Packet Pack)
  7076. {
  7077. ParcelSetOtherCleanTimePacket parcelSetOtherCleanTimePacket = (ParcelSetOtherCleanTimePacket)Pack;
  7078. #region Packet Session and User Check
  7079. if (m_checkPackets)
  7080. {
  7081. if (parcelSetOtherCleanTimePacket.AgentData.SessionID != SessionId ||
  7082. parcelSetOtherCleanTimePacket.AgentData.AgentID != AgentId)
  7083. return true;
  7084. }
  7085. #endregion
  7086. ParcelSetOtherCleanTime handlerParcelSetOtherCleanTime = OnParcelSetOtherCleanTime;
  7087. if (handlerParcelSetOtherCleanTime != null)
  7088. {
  7089. handlerParcelSetOtherCleanTime(this,
  7090. parcelSetOtherCleanTimePacket.ParcelData.LocalID,
  7091. parcelSetOtherCleanTimePacket.ParcelData.OtherCleanTime);
  7092. }
  7093. return true;
  7094. }
  7095. private bool HandleLandStatRequest(IClientAPI sender, Packet Pack)
  7096. {
  7097. LandStatRequestPacket lsrp = (LandStatRequestPacket)Pack;
  7098. #region Packet Session and User Check
  7099. if (m_checkPackets)
  7100. {
  7101. if (lsrp.AgentData.SessionID != SessionId ||
  7102. lsrp.AgentData.AgentID != AgentId)
  7103. return true;
  7104. }
  7105. #endregion
  7106. GodLandStatRequest handlerLandStatRequest = OnLandStatRequest;
  7107. if (handlerLandStatRequest != null)
  7108. {
  7109. handlerLandStatRequest(lsrp.RequestData.ParcelLocalID, lsrp.RequestData.ReportType, lsrp.RequestData.RequestFlags, Utils.BytesToString(lsrp.RequestData.Filter), this);
  7110. }
  7111. return true;
  7112. }
  7113. private bool HandleParcelDwellRequest(IClientAPI sender, Packet Pack)
  7114. {
  7115. ParcelDwellRequestPacket dwellrq =
  7116. (ParcelDwellRequestPacket)Pack;
  7117. #region Packet Session and User Check
  7118. if (m_checkPackets)
  7119. {
  7120. if (dwellrq.AgentData.SessionID != SessionId ||
  7121. dwellrq.AgentData.AgentID != AgentId)
  7122. return true;
  7123. }
  7124. #endregion
  7125. ParcelDwellRequest handlerParcelDwellRequest = OnParcelDwellRequest;
  7126. if (handlerParcelDwellRequest != null)
  7127. {
  7128. handlerParcelDwellRequest(dwellrq.Data.LocalID, this);
  7129. }
  7130. return true;
  7131. }
  7132. #endregion Parcel related packets
  7133. #region Estate Packets
  7134. private bool HandleEstateOwnerMessage(IClientAPI sender, Packet Pack)
  7135. {
  7136. EstateOwnerMessagePacket messagePacket = (EstateOwnerMessagePacket)Pack;
  7137. //m_log.Debug(messagePacket.ToString());
  7138. GodLandStatRequest handlerLandStatRequest;
  7139. #region Packet Session and User Check
  7140. if (m_checkPackets)
  7141. {
  7142. if (messagePacket.AgentData.SessionID != SessionId ||
  7143. messagePacket.AgentData.AgentID != AgentId)
  7144. return true;
  7145. }
  7146. #endregion
  7147. switch (Utils.BytesToString(messagePacket.MethodData.Method))
  7148. {
  7149. case "getinfo":
  7150. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  7151. {
  7152. OnDetailedEstateDataRequest(this, messagePacket.MethodData.Invoice);
  7153. }
  7154. return true;
  7155. case "setregioninfo":
  7156. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  7157. {
  7158. OnSetEstateFlagsRequest(convertParamStringToBool(messagePacket.ParamList[0].Parameter), convertParamStringToBool(messagePacket.ParamList[1].Parameter),
  7159. convertParamStringToBool(messagePacket.ParamList[2].Parameter), !convertParamStringToBool(messagePacket.ParamList[3].Parameter),
  7160. Convert.ToInt16(Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[4].Parameter))),
  7161. (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[5].Parameter)),
  7162. Convert.ToInt16(Utils.BytesToString(messagePacket.ParamList[6].Parameter)),
  7163. convertParamStringToBool(messagePacket.ParamList[7].Parameter), convertParamStringToBool(messagePacket.ParamList[8].Parameter));
  7164. }
  7165. return true;
  7166. // case "texturebase":
  7167. // if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  7168. // {
  7169. // foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  7170. // {
  7171. // string s = Utils.BytesToString(block.Parameter);
  7172. // string[] splitField = s.Split(' ');
  7173. // if (splitField.Length == 2)
  7174. // {
  7175. // UUID tempUUID = new UUID(splitField[1]);
  7176. // OnSetEstateTerrainBaseTexture(this, Convert.ToInt16(splitField[0]), tempUUID);
  7177. // }
  7178. // }
  7179. // }
  7180. // break;
  7181. case "texturedetail":
  7182. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  7183. {
  7184. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  7185. {
  7186. string s = Utils.BytesToString(block.Parameter);
  7187. string[] splitField = s.Split(' ');
  7188. if (splitField.Length == 2)
  7189. {
  7190. Int16 corner = Convert.ToInt16(splitField[0]);
  7191. UUID textureUUID = new UUID(splitField[1]);
  7192. OnSetEstateTerrainDetailTexture(this, corner, textureUUID);
  7193. }
  7194. }
  7195. }
  7196. return true;
  7197. case "textureheights":
  7198. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  7199. {
  7200. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  7201. {
  7202. string s = Utils.BytesToString(block.Parameter);
  7203. string[] splitField = s.Split(' ');
  7204. if (splitField.Length == 3)
  7205. {
  7206. Int16 corner = Convert.ToInt16(splitField[0]);
  7207. float lowValue = (float)Convert.ToDecimal(splitField[1]);
  7208. float highValue = (float)Convert.ToDecimal(splitField[2]);
  7209. OnSetEstateTerrainTextureHeights(this, corner, lowValue, highValue);
  7210. }
  7211. }
  7212. }
  7213. return true;
  7214. case "texturecommit":
  7215. OnCommitEstateTerrainTextureRequest(this);
  7216. return true;
  7217. case "setregionterrain":
  7218. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  7219. {
  7220. if (messagePacket.ParamList.Length != 9)
  7221. {
  7222. m_log.Error("EstateOwnerMessage: SetRegionTerrain method has a ParamList of invalid length");
  7223. }
  7224. else
  7225. {
  7226. try
  7227. {
  7228. string tmp = Utils.BytesToString(messagePacket.ParamList[0].Parameter);
  7229. if (!tmp.Contains(".")) tmp += ".00";
  7230. float WaterHeight = (float)Convert.ToDecimal(tmp);
  7231. tmp = Utils.BytesToString(messagePacket.ParamList[1].Parameter);
  7232. if (!tmp.Contains(".")) tmp += ".00";
  7233. float TerrainRaiseLimit = (float)Convert.ToDecimal(tmp);
  7234. tmp = Utils.BytesToString(messagePacket.ParamList[2].Parameter);
  7235. if (!tmp.Contains(".")) tmp += ".00";
  7236. float TerrainLowerLimit = (float)Convert.ToDecimal(tmp);
  7237. bool UseEstateSun = convertParamStringToBool(messagePacket.ParamList[3].Parameter);
  7238. bool UseFixedSun = convertParamStringToBool(messagePacket.ParamList[4].Parameter);
  7239. float SunHour = (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[5].Parameter));
  7240. bool UseGlobal = convertParamStringToBool(messagePacket.ParamList[6].Parameter);
  7241. bool EstateFixedSun = convertParamStringToBool(messagePacket.ParamList[7].Parameter);
  7242. float EstateSunHour = (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[8].Parameter));
  7243. OnSetRegionTerrainSettings(WaterHeight, TerrainRaiseLimit, TerrainLowerLimit, UseEstateSun, UseFixedSun, SunHour, UseGlobal, EstateFixedSun, EstateSunHour);
  7244. }
  7245. catch (Exception ex)
  7246. {
  7247. m_log.Error("EstateOwnerMessage: Exception while setting terrain settings: \n" + messagePacket + "\n" + ex);
  7248. }
  7249. }
  7250. }
  7251. return true;
  7252. case "restart":
  7253. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  7254. {
  7255. // There's only 1 block in the estateResetSim.. and that's the number of seconds till restart.
  7256. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  7257. {
  7258. float timeSeconds;
  7259. Utils.TryParseSingle(Utils.BytesToString(block.Parameter), out timeSeconds);
  7260. timeSeconds = (int)timeSeconds;
  7261. OnEstateRestartSimRequest(this, (int)timeSeconds);
  7262. }
  7263. }
  7264. return true;
  7265. case "estatechangecovenantid":
  7266. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  7267. {
  7268. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  7269. {
  7270. UUID newCovenantID = new UUID(Utils.BytesToString(block.Parameter));
  7271. OnEstateChangeCovenantRequest(this, newCovenantID);
  7272. }
  7273. }
  7274. return true;
  7275. case "estateaccessdelta": // Estate access delta manages the banlist and allow list too.
  7276. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  7277. {
  7278. int estateAccessType = Convert.ToInt16(Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  7279. OnUpdateEstateAccessDeltaRequest(this, messagePacket.MethodData.Invoice, estateAccessType, new UUID(Utils.BytesToString(messagePacket.ParamList[2].Parameter)));
  7280. }
  7281. return true;
  7282. case "simulatormessage":
  7283. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  7284. {
  7285. UUID invoice = messagePacket.MethodData.Invoice;
  7286. UUID SenderID = new UUID(Utils.BytesToString(messagePacket.ParamList[2].Parameter));
  7287. string SenderName = Utils.BytesToString(messagePacket.ParamList[3].Parameter);
  7288. string Message = Utils.BytesToString(messagePacket.ParamList[4].Parameter);
  7289. UUID sessionID = messagePacket.AgentData.SessionID;
  7290. OnSimulatorBlueBoxMessageRequest(this, invoice, SenderID, sessionID, SenderName, Message);
  7291. }
  7292. return true;
  7293. case "instantmessage":
  7294. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  7295. {
  7296. if (messagePacket.ParamList.Length < 5)
  7297. return true;
  7298. UUID invoice = messagePacket.MethodData.Invoice;
  7299. UUID SenderID = new UUID(Utils.BytesToString(messagePacket.ParamList[2].Parameter));
  7300. string SenderName = Utils.BytesToString(messagePacket.ParamList[3].Parameter);
  7301. string Message = Utils.BytesToString(messagePacket.ParamList[4].Parameter);
  7302. UUID sessionID = messagePacket.AgentData.SessionID;
  7303. OnEstateBlueBoxMessageRequest(this, invoice, SenderID, sessionID, SenderName, Message);
  7304. }
  7305. return true;
  7306. case "setregiondebug":
  7307. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  7308. {
  7309. UUID invoice = messagePacket.MethodData.Invoice;
  7310. UUID SenderID = messagePacket.AgentData.AgentID;
  7311. bool scripted = convertParamStringToBool(messagePacket.ParamList[0].Parameter);
  7312. bool collisionEvents = convertParamStringToBool(messagePacket.ParamList[1].Parameter);
  7313. bool physics = convertParamStringToBool(messagePacket.ParamList[2].Parameter);
  7314. OnEstateDebugRegionRequest(this, invoice, SenderID, scripted, collisionEvents, physics);
  7315. }
  7316. return true;
  7317. case "teleporthomeuser":
  7318. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  7319. {
  7320. UUID invoice = messagePacket.MethodData.Invoice;
  7321. UUID SenderID = messagePacket.AgentData.AgentID;
  7322. UUID Prey;
  7323. UUID.TryParse(Utils.BytesToString(messagePacket.ParamList[1].Parameter), out Prey);
  7324. OnEstateTeleportOneUserHomeRequest(this, invoice, SenderID, Prey);
  7325. }
  7326. return true;
  7327. case "teleporthomeallusers":
  7328. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  7329. {
  7330. UUID invoice = messagePacket.MethodData.Invoice;
  7331. UUID SenderID = messagePacket.AgentData.AgentID;
  7332. OnEstateTeleportAllUsersHomeRequest(this, invoice, SenderID);
  7333. }
  7334. return true;
  7335. case "colliders":
  7336. handlerLandStatRequest = OnLandStatRequest;
  7337. if (handlerLandStatRequest != null)
  7338. {
  7339. handlerLandStatRequest(0, 1, 0, "", this);
  7340. }
  7341. return true;
  7342. case "scripts":
  7343. handlerLandStatRequest = OnLandStatRequest;
  7344. if (handlerLandStatRequest != null)
  7345. {
  7346. handlerLandStatRequest(0, 0, 0, "", this);
  7347. }
  7348. return true;
  7349. case "terrain":
  7350. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  7351. {
  7352. if (messagePacket.ParamList.Length > 0)
  7353. {
  7354. if (Utils.BytesToString(messagePacket.ParamList[0].Parameter) == "bake")
  7355. {
  7356. BakeTerrain handlerBakeTerrain = OnBakeTerrain;
  7357. if (handlerBakeTerrain != null)
  7358. {
  7359. handlerBakeTerrain(this);
  7360. }
  7361. }
  7362. if (Utils.BytesToString(messagePacket.ParamList[0].Parameter) == "download filename")
  7363. {
  7364. if (messagePacket.ParamList.Length > 1)
  7365. {
  7366. RequestTerrain handlerRequestTerrain = OnRequestTerrain;
  7367. if (handlerRequestTerrain != null)
  7368. {
  7369. handlerRequestTerrain(this, Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  7370. }
  7371. }
  7372. }
  7373. if (Utils.BytesToString(messagePacket.ParamList[0].Parameter) == "upload filename")
  7374. {
  7375. if (messagePacket.ParamList.Length > 1)
  7376. {
  7377. RequestTerrain handlerUploadTerrain = OnUploadTerrain;
  7378. if (handlerUploadTerrain != null)
  7379. {
  7380. handlerUploadTerrain(this, Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  7381. }
  7382. }
  7383. }
  7384. }
  7385. }
  7386. return true;
  7387. case "estatechangeinfo":
  7388. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  7389. {
  7390. UUID invoice = messagePacket.MethodData.Invoice;
  7391. UUID SenderID = messagePacket.AgentData.AgentID;
  7392. UInt32 param1 = Convert.ToUInt32(Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  7393. UInt32 param2 = Convert.ToUInt32(Utils.BytesToString(messagePacket.ParamList[2].Parameter));
  7394. EstateChangeInfo handlerEstateChangeInfo = OnEstateChangeInfo;
  7395. if (handlerEstateChangeInfo != null)
  7396. {
  7397. handlerEstateChangeInfo(this, invoice, SenderID, param1, param2);
  7398. }
  7399. }
  7400. return true;
  7401. default:
  7402. m_log.Error("EstateOwnerMessage: Unknown method requested\n" + messagePacket);
  7403. return true;
  7404. }
  7405. //int parcelID, uint reportType, uint requestflags, string filter
  7406. //lsrp.RequestData.ParcelLocalID;
  7407. //lsrp.RequestData.ReportType; // 1 = colliders, 0 = scripts
  7408. //lsrp.RequestData.RequestFlags;
  7409. //lsrp.RequestData.Filter;
  7410. // return true;
  7411. }
  7412. private bool HandleRequestRegionInfo(IClientAPI sender, Packet Pack)
  7413. {
  7414. RequestRegionInfoPacket.AgentDataBlock mPacket = ((RequestRegionInfoPacket)Pack).AgentData;
  7415. #region Packet Session and User Check
  7416. if (m_checkPackets)
  7417. {
  7418. if (mPacket.SessionID != SessionId ||
  7419. mPacket.AgentID != AgentId)
  7420. return true;
  7421. }
  7422. #endregion
  7423. RegionInfoRequest handlerRegionInfoRequest = OnRegionInfoRequest;
  7424. if (handlerRegionInfoRequest != null)
  7425. {
  7426. handlerRegionInfoRequest(this);
  7427. }
  7428. return true;
  7429. }
  7430. private bool HandleEstateCovenantRequest(IClientAPI sender, Packet Pack)
  7431. {
  7432. //EstateCovenantRequestPacket.AgentDataBlock epack =
  7433. // ((EstateCovenantRequestPacket)Pack).AgentData;
  7434. EstateCovenantRequest handlerEstateCovenantRequest = OnEstateCovenantRequest;
  7435. if (handlerEstateCovenantRequest != null)
  7436. {
  7437. handlerEstateCovenantRequest(this);
  7438. }
  7439. return true;
  7440. }
  7441. #endregion Estate Packets
  7442. #region GodPackets
  7443. private bool HandleRequestGodlikePowers(IClientAPI sender, Packet Pack)
  7444. {
  7445. RequestGodlikePowersPacket rglpPack = (RequestGodlikePowersPacket)Pack;
  7446. RequestGodlikePowersPacket.RequestBlockBlock rblock = rglpPack.RequestBlock;
  7447. UUID token = rblock.Token;
  7448. RequestGodlikePowersPacket.AgentDataBlock ablock = rglpPack.AgentData;
  7449. RequestGodlikePowers handlerReqGodlikePowers = OnRequestGodlikePowers;
  7450. if (handlerReqGodlikePowers != null)
  7451. {
  7452. handlerReqGodlikePowers(ablock.AgentID, ablock.SessionID, token, rblock.Godlike, this);
  7453. }
  7454. return true;
  7455. }
  7456. private bool HandleGodUpdateRegionInfoUpdate(IClientAPI client, Packet Packet)
  7457. {
  7458. GodUpdateRegionInfoPacket GodUpdateRegionInfo =
  7459. (GodUpdateRegionInfoPacket)Packet;
  7460. GodUpdateRegionInfoUpdate handlerGodUpdateRegionInfo = OnGodUpdateRegionInfoUpdate;
  7461. if (handlerGodUpdateRegionInfo != null)
  7462. {
  7463. handlerGodUpdateRegionInfo(this,
  7464. GodUpdateRegionInfo.RegionInfo.BillableFactor,
  7465. GodUpdateRegionInfo.RegionInfo.EstateID,
  7466. GodUpdateRegionInfo.RegionInfo.RegionFlags,
  7467. GodUpdateRegionInfo.RegionInfo.SimName,
  7468. GodUpdateRegionInfo.RegionInfo.RedirectGridX,
  7469. GodUpdateRegionInfo.RegionInfo.RedirectGridY);
  7470. return true;
  7471. }
  7472. return false;
  7473. }
  7474. private bool HandleSimWideDeletes(IClientAPI client, Packet Packet)
  7475. {
  7476. SimWideDeletesPacket SimWideDeletesRequest =
  7477. (SimWideDeletesPacket)Packet;
  7478. SimWideDeletesDelegate handlerSimWideDeletesRequest = OnSimWideDeletes;
  7479. if (handlerSimWideDeletesRequest != null)
  7480. {
  7481. handlerSimWideDeletesRequest(this, SimWideDeletesRequest.AgentData.AgentID,(int)SimWideDeletesRequest.DataBlock.Flags,SimWideDeletesRequest.DataBlock.TargetID);
  7482. return true;
  7483. }
  7484. return false;
  7485. }
  7486. private bool HandleGodlikeMessage(IClientAPI client, Packet Packet)
  7487. {
  7488. GodlikeMessagePacket GodlikeMessage =
  7489. (GodlikeMessagePacket)Packet;
  7490. GodlikeMessage handlerGodlikeMessage = onGodlikeMessage;
  7491. if (handlerGodlikeMessage != null)
  7492. {
  7493. handlerGodlikeMessage(this,
  7494. GodlikeMessage.MethodData.Invoice,
  7495. GodlikeMessage.MethodData.Method,
  7496. GodlikeMessage.ParamList[0].Parameter);
  7497. return true;
  7498. }
  7499. return false;
  7500. }
  7501. private bool HandleSaveStatePacket(IClientAPI client, Packet Packet)
  7502. {
  7503. StateSavePacket SaveStateMessage =
  7504. (StateSavePacket)Packet;
  7505. SaveStateHandler handlerSaveStatePacket = OnSaveState;
  7506. if (handlerSaveStatePacket != null)
  7507. {
  7508. handlerSaveStatePacket(this,SaveStateMessage.AgentData.AgentID);
  7509. return true;
  7510. }
  7511. return false;
  7512. }
  7513. private bool HandleGodKickUser(IClientAPI sender, Packet Pack)
  7514. {
  7515. GodKickUserPacket gkupack = (GodKickUserPacket)Pack;
  7516. if (gkupack.UserInfo.GodSessionID == SessionId && AgentId == gkupack.UserInfo.GodID)
  7517. {
  7518. GodKickUser handlerGodKickUser = OnGodKickUser;
  7519. if (handlerGodKickUser != null)
  7520. {
  7521. handlerGodKickUser(gkupack.UserInfo.GodID, gkupack.UserInfo.GodSessionID,
  7522. gkupack.UserInfo.AgentID, (uint)0, gkupack.UserInfo.Reason);
  7523. }
  7524. }
  7525. else
  7526. {
  7527. SendAgentAlertMessage("Kick request denied", false);
  7528. }
  7529. //KickUserPacket kupack = new KickUserPacket();
  7530. //KickUserPacket.UserInfoBlock kupackib = kupack.UserInfo;
  7531. //kupack.UserInfo.AgentID = gkupack.UserInfo.AgentID;
  7532. //kupack.UserInfo.SessionID = gkupack.UserInfo.GodSessionID;
  7533. //kupack.TargetBlock.TargetIP = (uint)0;
  7534. //kupack.TargetBlock.TargetPort = (ushort)0;
  7535. //kupack.UserInfo.Reason = gkupack.UserInfo.Reason;
  7536. //OutPacket(kupack, ThrottleOutPacketType.Task);
  7537. return true;
  7538. }
  7539. #endregion GodPackets
  7540. #region Economy/Transaction Packets
  7541. private bool HandleMoneyBalanceRequest(IClientAPI sender, Packet Pack)
  7542. {
  7543. MoneyBalanceRequestPacket moneybalancerequestpacket = (MoneyBalanceRequestPacket)Pack;
  7544. #region Packet Session and User Check
  7545. if (m_checkPackets)
  7546. {
  7547. if (moneybalancerequestpacket.AgentData.SessionID != SessionId ||
  7548. moneybalancerequestpacket.AgentData.AgentID != AgentId)
  7549. return true;
  7550. }
  7551. #endregion
  7552. MoneyBalanceRequest handlerMoneyBalanceRequest = OnMoneyBalanceRequest;
  7553. if (handlerMoneyBalanceRequest != null)
  7554. {
  7555. handlerMoneyBalanceRequest(this, moneybalancerequestpacket.AgentData.AgentID, moneybalancerequestpacket.AgentData.SessionID, moneybalancerequestpacket.MoneyData.TransactionID);
  7556. }
  7557. return true;
  7558. }
  7559. private bool HandleEconomyDataRequest(IClientAPI sender, Packet Pack)
  7560. {
  7561. EconomyDataRequest handlerEconomoyDataRequest = OnEconomyDataRequest;
  7562. if (handlerEconomoyDataRequest != null)
  7563. {
  7564. handlerEconomoyDataRequest(AgentId);
  7565. }
  7566. return true;
  7567. }
  7568. private bool HandleRequestPayPrice(IClientAPI sender, Packet Pack)
  7569. {
  7570. RequestPayPricePacket requestPayPricePacket = (RequestPayPricePacket)Pack;
  7571. RequestPayPrice handlerRequestPayPrice = OnRequestPayPrice;
  7572. if (handlerRequestPayPrice != null)
  7573. {
  7574. handlerRequestPayPrice(this, requestPayPricePacket.ObjectData.ObjectID);
  7575. }
  7576. return true;
  7577. }
  7578. private bool HandleObjectSaleInfo(IClientAPI sender, Packet Pack)
  7579. {
  7580. ObjectSaleInfoPacket objectSaleInfoPacket = (ObjectSaleInfoPacket)Pack;
  7581. #region Packet Session and User Check
  7582. if (m_checkPackets)
  7583. {
  7584. if (objectSaleInfoPacket.AgentData.SessionID != SessionId ||
  7585. objectSaleInfoPacket.AgentData.AgentID != AgentId)
  7586. return true;
  7587. }
  7588. #endregion
  7589. ObjectSaleInfo handlerObjectSaleInfo = OnObjectSaleInfo;
  7590. if (handlerObjectSaleInfo != null)
  7591. {
  7592. foreach (ObjectSaleInfoPacket.ObjectDataBlock d
  7593. in objectSaleInfoPacket.ObjectData)
  7594. {
  7595. handlerObjectSaleInfo(this,
  7596. objectSaleInfoPacket.AgentData.AgentID,
  7597. objectSaleInfoPacket.AgentData.SessionID,
  7598. d.LocalID,
  7599. d.SaleType,
  7600. d.SalePrice);
  7601. }
  7602. }
  7603. return true;
  7604. }
  7605. private bool HandleObjectBuy(IClientAPI sender, Packet Pack)
  7606. {
  7607. ObjectBuyPacket objectBuyPacket = (ObjectBuyPacket)Pack;
  7608. #region Packet Session and User Check
  7609. if (m_checkPackets)
  7610. {
  7611. if (objectBuyPacket.AgentData.SessionID != SessionId ||
  7612. objectBuyPacket.AgentData.AgentID != AgentId)
  7613. return true;
  7614. }
  7615. #endregion
  7616. ObjectBuy handlerObjectBuy = OnObjectBuy;
  7617. if (handlerObjectBuy != null)
  7618. {
  7619. foreach (ObjectBuyPacket.ObjectDataBlock d
  7620. in objectBuyPacket.ObjectData)
  7621. {
  7622. handlerObjectBuy(this,
  7623. objectBuyPacket.AgentData.AgentID,
  7624. objectBuyPacket.AgentData.SessionID,
  7625. objectBuyPacket.AgentData.GroupID,
  7626. objectBuyPacket.AgentData.CategoryID,
  7627. d.ObjectLocalID,
  7628. d.SaleType,
  7629. d.SalePrice);
  7630. }
  7631. }
  7632. return true;
  7633. }
  7634. #endregion Economy/Transaction Packets
  7635. #region Script Packets
  7636. private bool HandleGetScriptRunning(IClientAPI sender, Packet Pack)
  7637. {
  7638. GetScriptRunningPacket scriptRunning = (GetScriptRunningPacket)Pack;
  7639. GetScriptRunning handlerGetScriptRunning = OnGetScriptRunning;
  7640. if (handlerGetScriptRunning != null)
  7641. {
  7642. handlerGetScriptRunning(this, scriptRunning.Script.ObjectID, scriptRunning.Script.ItemID);
  7643. }
  7644. return true;
  7645. }
  7646. private bool HandleSetScriptRunning(IClientAPI sender, Packet Pack)
  7647. {
  7648. SetScriptRunningPacket setScriptRunning = (SetScriptRunningPacket)Pack;
  7649. #region Packet Session and User Check
  7650. if (m_checkPackets)
  7651. {
  7652. if (setScriptRunning.AgentData.SessionID != SessionId ||
  7653. setScriptRunning.AgentData.AgentID != AgentId)
  7654. return true;
  7655. }
  7656. #endregion
  7657. SetScriptRunning handlerSetScriptRunning = OnSetScriptRunning;
  7658. if (handlerSetScriptRunning != null)
  7659. {
  7660. handlerSetScriptRunning(this, setScriptRunning.Script.ObjectID, setScriptRunning.Script.ItemID, setScriptRunning.Script.Running);
  7661. }
  7662. return true;
  7663. }
  7664. private bool HandleScriptReset(IClientAPI sender, Packet Pack)
  7665. {
  7666. ScriptResetPacket scriptResetPacket = (ScriptResetPacket)Pack;
  7667. #region Packet Session and User Check
  7668. if (m_checkPackets)
  7669. {
  7670. if (scriptResetPacket.AgentData.SessionID != SessionId ||
  7671. scriptResetPacket.AgentData.AgentID != AgentId)
  7672. return true;
  7673. }
  7674. #endregion
  7675. ScriptReset handlerScriptReset = OnScriptReset;
  7676. if (handlerScriptReset != null)
  7677. {
  7678. handlerScriptReset(this, scriptResetPacket.Script.ObjectID, scriptResetPacket.Script.ItemID);
  7679. }
  7680. return true;
  7681. }
  7682. #endregion Script Packets
  7683. #region Gesture Managment
  7684. private bool HandleActivateGestures(IClientAPI sender, Packet Pack)
  7685. {
  7686. ActivateGesturesPacket activateGesturePacket = (ActivateGesturesPacket)Pack;
  7687. #region Packet Session and User Check
  7688. if (m_checkPackets)
  7689. {
  7690. if (activateGesturePacket.AgentData.SessionID != SessionId ||
  7691. activateGesturePacket.AgentData.AgentID != AgentId)
  7692. return true;
  7693. }
  7694. #endregion
  7695. ActivateGesture handlerActivateGesture = OnActivateGesture;
  7696. if (handlerActivateGesture != null)
  7697. {
  7698. handlerActivateGesture(this,
  7699. activateGesturePacket.Data[0].AssetID,
  7700. activateGesturePacket.Data[0].ItemID);
  7701. }
  7702. else m_log.Error("Null pointer for activateGesture");
  7703. return true;
  7704. }
  7705. private bool HandleDeactivateGestures(IClientAPI sender, Packet Pack)
  7706. {
  7707. DeactivateGesturesPacket deactivateGesturePacket = (DeactivateGesturesPacket)Pack;
  7708. #region Packet Session and User Check
  7709. if (m_checkPackets)
  7710. {
  7711. if (deactivateGesturePacket.AgentData.SessionID != SessionId ||
  7712. deactivateGesturePacket.AgentData.AgentID != AgentId)
  7713. return true;
  7714. }
  7715. #endregion
  7716. DeactivateGesture handlerDeactivateGesture = OnDeactivateGesture;
  7717. if (handlerDeactivateGesture != null)
  7718. {
  7719. handlerDeactivateGesture(this, deactivateGesturePacket.Data[0].ItemID);
  7720. }
  7721. return true;
  7722. }
  7723. private bool HandleObjectOwner(IClientAPI sender, Packet Pack)
  7724. {
  7725. ObjectOwnerPacket objectOwnerPacket = (ObjectOwnerPacket)Pack;
  7726. #region Packet Session and User Check
  7727. if (m_checkPackets)
  7728. {
  7729. if (objectOwnerPacket.AgentData.SessionID != SessionId ||
  7730. objectOwnerPacket.AgentData.AgentID != AgentId)
  7731. return true;
  7732. }
  7733. #endregion
  7734. List<uint> localIDs = new List<uint>();
  7735. foreach (ObjectOwnerPacket.ObjectDataBlock d in objectOwnerPacket.ObjectData)
  7736. localIDs.Add(d.ObjectLocalID);
  7737. ObjectOwner handlerObjectOwner = OnObjectOwner;
  7738. if (handlerObjectOwner != null)
  7739. {
  7740. handlerObjectOwner(this, objectOwnerPacket.HeaderData.OwnerID, objectOwnerPacket.HeaderData.GroupID, localIDs);
  7741. }
  7742. return true;
  7743. }
  7744. #endregion Gesture Managment
  7745. private bool HandleAgentFOV(IClientAPI sender, Packet Pack)
  7746. {
  7747. AgentFOVPacket fovPacket = (AgentFOVPacket)Pack;
  7748. if (fovPacket.FOVBlock.GenCounter > m_agentFOVCounter)
  7749. {
  7750. m_agentFOVCounter = fovPacket.FOVBlock.GenCounter;
  7751. AgentFOV handlerAgentFOV = OnAgentFOV;
  7752. if (handlerAgentFOV != null)
  7753. {
  7754. handlerAgentFOV(this, fovPacket.FOVBlock.VerticalAngle);
  7755. }
  7756. }
  7757. return true;
  7758. }
  7759. #region unimplemented handlers
  7760. private bool HandleViewerStats(IClientAPI sender, Packet Pack)
  7761. {
  7762. // TODO: handle this packet
  7763. //m_log.Warn("[CLIENT]: unhandled ViewerStats packet");
  7764. return true;
  7765. }
  7766. private bool HandleMapItemRequest(IClientAPI sender, Packet Pack)
  7767. {
  7768. MapItemRequestPacket mirpk = (MapItemRequestPacket)Pack;
  7769. #region Packet Session and User Check
  7770. if (m_checkPackets)
  7771. {
  7772. if (mirpk.AgentData.SessionID != SessionId ||
  7773. mirpk.AgentData.AgentID != AgentId)
  7774. return true;
  7775. }
  7776. #endregion
  7777. //m_log.Debug(mirpk.ToString());
  7778. MapItemRequest handlerMapItemRequest = OnMapItemRequest;
  7779. if (handlerMapItemRequest != null)
  7780. {
  7781. handlerMapItemRequest(this, mirpk.AgentData.Flags, mirpk.AgentData.EstateID,
  7782. mirpk.AgentData.Godlike, mirpk.RequestData.ItemType,
  7783. mirpk.RequestData.RegionHandle);
  7784. }
  7785. return true;
  7786. }
  7787. private bool HandleTransferAbort(IClientAPI sender, Packet Pack)
  7788. {
  7789. return true;
  7790. }
  7791. private bool HandleMuteListRequest(IClientAPI sender, Packet Pack)
  7792. {
  7793. MuteListRequestPacket muteListRequest =
  7794. (MuteListRequestPacket)Pack;
  7795. #region Packet Session and User Check
  7796. if (m_checkPackets)
  7797. {
  7798. if (muteListRequest.AgentData.SessionID != SessionId ||
  7799. muteListRequest.AgentData.AgentID != AgentId)
  7800. return true;
  7801. }
  7802. #endregion
  7803. MuteListRequest handlerMuteListRequest = OnMuteListRequest;
  7804. if (handlerMuteListRequest != null)
  7805. {
  7806. handlerMuteListRequest(this, muteListRequest.MuteData.MuteCRC);
  7807. }
  7808. else
  7809. {
  7810. SendUseCachedMuteList();
  7811. }
  7812. return true;
  7813. }
  7814. private bool HandleUpdateMuteListEntry(IClientAPI client, Packet Packet)
  7815. {
  7816. UpdateMuteListEntryPacket UpdateMuteListEntry =
  7817. (UpdateMuteListEntryPacket)Packet;
  7818. MuteListEntryUpdate handlerUpdateMuteListEntry = OnUpdateMuteListEntry;
  7819. if (handlerUpdateMuteListEntry != null)
  7820. {
  7821. handlerUpdateMuteListEntry(this, UpdateMuteListEntry.MuteData.MuteID,
  7822. Utils.BytesToString(UpdateMuteListEntry.MuteData.MuteName),
  7823. UpdateMuteListEntry.MuteData.MuteType,
  7824. UpdateMuteListEntry.AgentData.AgentID);
  7825. return true;
  7826. }
  7827. return false;
  7828. }
  7829. private bool HandleRemoveMuteListEntry(IClientAPI client, Packet Packet)
  7830. {
  7831. RemoveMuteListEntryPacket RemoveMuteListEntry =
  7832. (RemoveMuteListEntryPacket)Packet;
  7833. MuteListEntryRemove handlerRemoveMuteListEntry = OnRemoveMuteListEntry;
  7834. if (handlerRemoveMuteListEntry != null)
  7835. {
  7836. handlerRemoveMuteListEntry(this,
  7837. RemoveMuteListEntry.MuteData.MuteID,
  7838. Utils.BytesToString(RemoveMuteListEntry.MuteData.MuteName),
  7839. RemoveMuteListEntry.AgentData.AgentID);
  7840. return true;
  7841. }
  7842. return false;
  7843. }
  7844. private bool HandleUserReport(IClientAPI client, Packet Packet)
  7845. {
  7846. UserReportPacket UserReport =
  7847. (UserReportPacket)Packet;
  7848. NewUserReport handlerUserReport = OnUserReport;
  7849. if (handlerUserReport != null)
  7850. {
  7851. handlerUserReport(this,
  7852. Utils.BytesToString(UserReport.ReportData.AbuseRegionName),
  7853. UserReport.ReportData.AbuserID,
  7854. UserReport.ReportData.Category,
  7855. UserReport.ReportData.CheckFlags,
  7856. Utils.BytesToString(UserReport.ReportData.Details),
  7857. UserReport.ReportData.ObjectID,
  7858. UserReport.ReportData.Position,
  7859. UserReport.ReportData.ReportType,
  7860. UserReport.ReportData.ScreenshotID,
  7861. Utils.BytesToString(UserReport.ReportData.Summary),
  7862. UserReport.AgentData.AgentID);
  7863. return true;
  7864. }
  7865. return false;
  7866. }
  7867. private bool HandleSendPostcard(IClientAPI client, Packet packet)
  7868. {
  7869. SendPostcardPacket SendPostcard =
  7870. (SendPostcardPacket)packet;
  7871. SendPostcard handlerSendPostcard = OnSendPostcard;
  7872. if (handlerSendPostcard != null)
  7873. {
  7874. handlerSendPostcard(this);
  7875. return true;
  7876. }
  7877. return false;
  7878. }
  7879. private bool HandleUseCircuitCode(IClientAPI sender, Packet Pack)
  7880. {
  7881. return true;
  7882. }
  7883. private bool HandleAgentHeightWidth(IClientAPI sender, Packet Pack)
  7884. {
  7885. return true;
  7886. }
  7887. private bool HandleInventoryDescendents(IClientAPI sender, Packet Pack)
  7888. {
  7889. return true;
  7890. }
  7891. #endregion unimplemented handlers
  7892. #region Dir handlers
  7893. private bool HandleDirPlacesQuery(IClientAPI sender, Packet Pack)
  7894. {
  7895. DirPlacesQueryPacket dirPlacesQueryPacket = (DirPlacesQueryPacket)Pack;
  7896. //m_log.Debug(dirPlacesQueryPacket.ToString());
  7897. #region Packet Session and User Check
  7898. if (m_checkPackets)
  7899. {
  7900. if (dirPlacesQueryPacket.AgentData.SessionID != SessionId ||
  7901. dirPlacesQueryPacket.AgentData.AgentID != AgentId)
  7902. return true;
  7903. }
  7904. #endregion
  7905. DirPlacesQuery handlerDirPlacesQuery = OnDirPlacesQuery;
  7906. if (handlerDirPlacesQuery != null)
  7907. {
  7908. handlerDirPlacesQuery(this,
  7909. dirPlacesQueryPacket.QueryData.QueryID,
  7910. Utils.BytesToString(
  7911. dirPlacesQueryPacket.QueryData.QueryText),
  7912. (int)dirPlacesQueryPacket.QueryData.QueryFlags,
  7913. (int)dirPlacesQueryPacket.QueryData.Category,
  7914. Utils.BytesToString(
  7915. dirPlacesQueryPacket.QueryData.SimName),
  7916. dirPlacesQueryPacket.QueryData.QueryStart);
  7917. }
  7918. return true;
  7919. }
  7920. private bool HandleDirFindQuery(IClientAPI sender, Packet Pack)
  7921. {
  7922. DirFindQueryPacket dirFindQueryPacket = (DirFindQueryPacket)Pack;
  7923. #region Packet Session and User Check
  7924. if (m_checkPackets)
  7925. {
  7926. if (dirFindQueryPacket.AgentData.SessionID != SessionId ||
  7927. dirFindQueryPacket.AgentData.AgentID != AgentId)
  7928. return true;
  7929. }
  7930. #endregion
  7931. DirFindQuery handlerDirFindQuery = OnDirFindQuery;
  7932. if (handlerDirFindQuery != null)
  7933. {
  7934. handlerDirFindQuery(this,
  7935. dirFindQueryPacket.QueryData.QueryID,
  7936. Utils.BytesToString(
  7937. dirFindQueryPacket.QueryData.QueryText),
  7938. dirFindQueryPacket.QueryData.QueryFlags,
  7939. dirFindQueryPacket.QueryData.QueryStart);
  7940. }
  7941. return true;
  7942. }
  7943. private bool HandleDirLandQuery(IClientAPI sender, Packet Pack)
  7944. {
  7945. DirLandQueryPacket dirLandQueryPacket = (DirLandQueryPacket)Pack;
  7946. #region Packet Session and User Check
  7947. if (m_checkPackets)
  7948. {
  7949. if (dirLandQueryPacket.AgentData.SessionID != SessionId ||
  7950. dirLandQueryPacket.AgentData.AgentID != AgentId)
  7951. return true;
  7952. }
  7953. #endregion
  7954. DirLandQuery handlerDirLandQuery = OnDirLandQuery;
  7955. if (handlerDirLandQuery != null)
  7956. {
  7957. handlerDirLandQuery(this,
  7958. dirLandQueryPacket.QueryData.QueryID,
  7959. dirLandQueryPacket.QueryData.QueryFlags,
  7960. dirLandQueryPacket.QueryData.SearchType,
  7961. dirLandQueryPacket.QueryData.Price,
  7962. dirLandQueryPacket.QueryData.Area,
  7963. dirLandQueryPacket.QueryData.QueryStart);
  7964. }
  7965. return true;
  7966. }
  7967. private bool HandleDirPopularQuery(IClientAPI sender, Packet Pack)
  7968. {
  7969. DirPopularQueryPacket dirPopularQueryPacket = (DirPopularQueryPacket)Pack;
  7970. #region Packet Session and User Check
  7971. if (m_checkPackets)
  7972. {
  7973. if (dirPopularQueryPacket.AgentData.SessionID != SessionId ||
  7974. dirPopularQueryPacket.AgentData.AgentID != AgentId)
  7975. return true;
  7976. }
  7977. #endregion
  7978. DirPopularQuery handlerDirPopularQuery = OnDirPopularQuery;
  7979. if (handlerDirPopularQuery != null)
  7980. {
  7981. handlerDirPopularQuery(this,
  7982. dirPopularQueryPacket.QueryData.QueryID,
  7983. dirPopularQueryPacket.QueryData.QueryFlags);
  7984. }
  7985. return true;
  7986. }
  7987. private bool HandleDirClassifiedQuery(IClientAPI sender, Packet Pack)
  7988. {
  7989. DirClassifiedQueryPacket dirClassifiedQueryPacket = (DirClassifiedQueryPacket)Pack;
  7990. #region Packet Session and User Check
  7991. if (m_checkPackets)
  7992. {
  7993. if (dirClassifiedQueryPacket.AgentData.SessionID != SessionId ||
  7994. dirClassifiedQueryPacket.AgentData.AgentID != AgentId)
  7995. return true;
  7996. }
  7997. #endregion
  7998. DirClassifiedQuery handlerDirClassifiedQuery = OnDirClassifiedQuery;
  7999. if (handlerDirClassifiedQuery != null)
  8000. {
  8001. handlerDirClassifiedQuery(this,
  8002. dirClassifiedQueryPacket.QueryData.QueryID,
  8003. Utils.BytesToString(
  8004. dirClassifiedQueryPacket.QueryData.QueryText),
  8005. dirClassifiedQueryPacket.QueryData.QueryFlags,
  8006. dirClassifiedQueryPacket.QueryData.Category,
  8007. dirClassifiedQueryPacket.QueryData.QueryStart);
  8008. }
  8009. return true;
  8010. }
  8011. private bool HandleEventInfoRequest(IClientAPI sender, Packet Pack)
  8012. {
  8013. EventInfoRequestPacket eventInfoRequestPacket = (EventInfoRequestPacket)Pack;
  8014. #region Packet Session and User Check
  8015. if (m_checkPackets)
  8016. {
  8017. if (eventInfoRequestPacket.AgentData.SessionID != SessionId ||
  8018. eventInfoRequestPacket.AgentData.AgentID != AgentId)
  8019. return true;
  8020. }
  8021. #endregion
  8022. if (OnEventInfoRequest != null)
  8023. {
  8024. OnEventInfoRequest(this, eventInfoRequestPacket.EventData.EventID);
  8025. }
  8026. return true;
  8027. }
  8028. #endregion
  8029. #region Calling Card
  8030. private bool HandleOfferCallingCard(IClientAPI sender, Packet Pack)
  8031. {
  8032. OfferCallingCardPacket offerCallingCardPacket = (OfferCallingCardPacket)Pack;
  8033. #region Packet Session and User Check
  8034. if (m_checkPackets)
  8035. {
  8036. if (offerCallingCardPacket.AgentData.SessionID != SessionId ||
  8037. offerCallingCardPacket.AgentData.AgentID != AgentId)
  8038. return true;
  8039. }
  8040. #endregion
  8041. if (OnOfferCallingCard != null)
  8042. {
  8043. OnOfferCallingCard(this,
  8044. offerCallingCardPacket.AgentBlock.DestID,
  8045. offerCallingCardPacket.AgentBlock.TransactionID);
  8046. }
  8047. return true;
  8048. }
  8049. private bool HandleAcceptCallingCard(IClientAPI sender, Packet Pack)
  8050. {
  8051. AcceptCallingCardPacket acceptCallingCardPacket = (AcceptCallingCardPacket)Pack;
  8052. #region Packet Session and User Check
  8053. if (m_checkPackets)
  8054. {
  8055. if (acceptCallingCardPacket.AgentData.SessionID != SessionId ||
  8056. acceptCallingCardPacket.AgentData.AgentID != AgentId)
  8057. return true;
  8058. }
  8059. #endregion
  8060. // according to http://wiki.secondlife.com/wiki/AcceptCallingCard FolderData should
  8061. // contain exactly one entry
  8062. if (OnAcceptCallingCard != null && acceptCallingCardPacket.FolderData.Length > 0)
  8063. {
  8064. OnAcceptCallingCard(this,
  8065. acceptCallingCardPacket.TransactionBlock.TransactionID,
  8066. acceptCallingCardPacket.FolderData[0].FolderID);
  8067. }
  8068. return true;
  8069. }
  8070. private bool HandleDeclineCallingCard(IClientAPI sender, Packet Pack)
  8071. {
  8072. DeclineCallingCardPacket declineCallingCardPacket = (DeclineCallingCardPacket)Pack;
  8073. #region Packet Session and User Check
  8074. if (m_checkPackets)
  8075. {
  8076. if (declineCallingCardPacket.AgentData.SessionID != SessionId ||
  8077. declineCallingCardPacket.AgentData.AgentID != AgentId)
  8078. return true;
  8079. }
  8080. #endregion
  8081. if (OnDeclineCallingCard != null)
  8082. {
  8083. OnDeclineCallingCard(this,
  8084. declineCallingCardPacket.TransactionBlock.TransactionID);
  8085. }
  8086. return true;
  8087. }
  8088. #endregion Calling Card
  8089. #region Groups
  8090. private bool HandleActivateGroup(IClientAPI sender, Packet Pack)
  8091. {
  8092. ActivateGroupPacket activateGroupPacket = (ActivateGroupPacket)Pack;
  8093. #region Packet Session and User Check
  8094. if (m_checkPackets)
  8095. {
  8096. if (activateGroupPacket.AgentData.SessionID != SessionId ||
  8097. activateGroupPacket.AgentData.AgentID != AgentId)
  8098. return true;
  8099. }
  8100. #endregion
  8101. if (m_GroupsModule != null)
  8102. {
  8103. m_GroupsModule.ActivateGroup(this, activateGroupPacket.AgentData.GroupID);
  8104. m_GroupsModule.SendAgentGroupDataUpdate(this);
  8105. }
  8106. return true;
  8107. }
  8108. private bool HandleGroupVoteHistoryRequest(IClientAPI client, Packet Packet)
  8109. {
  8110. GroupVoteHistoryRequestPacket GroupVoteHistoryRequest =
  8111. (GroupVoteHistoryRequestPacket)Packet;
  8112. GroupVoteHistoryRequest handlerGroupVoteHistoryRequest = OnGroupVoteHistoryRequest;
  8113. if (handlerGroupVoteHistoryRequest != null)
  8114. {
  8115. handlerGroupVoteHistoryRequest(this, GroupVoteHistoryRequest.AgentData.AgentID,GroupVoteHistoryRequest.AgentData.SessionID,GroupVoteHistoryRequest.GroupData.GroupID,GroupVoteHistoryRequest.TransactionData.TransactionID);
  8116. return true;
  8117. }
  8118. return false;
  8119. }
  8120. private bool HandleGroupActiveProposalsRequest(IClientAPI client, Packet Packet)
  8121. {
  8122. GroupActiveProposalsRequestPacket GroupActiveProposalsRequest =
  8123. (GroupActiveProposalsRequestPacket)Packet;
  8124. GroupActiveProposalsRequest handlerGroupActiveProposalsRequest = OnGroupActiveProposalsRequest;
  8125. if (handlerGroupActiveProposalsRequest != null)
  8126. {
  8127. handlerGroupActiveProposalsRequest(this, GroupActiveProposalsRequest.AgentData.AgentID,GroupActiveProposalsRequest.AgentData.SessionID,GroupActiveProposalsRequest.GroupData.GroupID,GroupActiveProposalsRequest.TransactionData.TransactionID);
  8128. return true;
  8129. }
  8130. return false;
  8131. }
  8132. private bool HandleGroupAccountDetailsRequest(IClientAPI client, Packet Packet)
  8133. {
  8134. GroupAccountDetailsRequestPacket GroupAccountDetailsRequest =
  8135. (GroupAccountDetailsRequestPacket)Packet;
  8136. GroupAccountDetailsRequest handlerGroupAccountDetailsRequest = OnGroupAccountDetailsRequest;
  8137. if (handlerGroupAccountDetailsRequest != null)
  8138. {
  8139. handlerGroupAccountDetailsRequest(this, GroupAccountDetailsRequest.AgentData.AgentID,GroupAccountDetailsRequest.AgentData.GroupID,GroupAccountDetailsRequest.MoneyData.RequestID,GroupAccountDetailsRequest.AgentData.SessionID);
  8140. return true;
  8141. }
  8142. return false;
  8143. }
  8144. private bool HandleGroupAccountSummaryRequest(IClientAPI client, Packet Packet)
  8145. {
  8146. GroupAccountSummaryRequestPacket GroupAccountSummaryRequest =
  8147. (GroupAccountSummaryRequestPacket)Packet;
  8148. GroupAccountSummaryRequest handlerGroupAccountSummaryRequest = OnGroupAccountSummaryRequest;
  8149. if (handlerGroupAccountSummaryRequest != null)
  8150. {
  8151. handlerGroupAccountSummaryRequest(this, GroupAccountSummaryRequest.AgentData.AgentID,GroupAccountSummaryRequest.AgentData.GroupID);
  8152. return true;
  8153. }
  8154. return false;
  8155. }
  8156. private bool HandleGroupTransactionsDetailsRequest(IClientAPI client, Packet Packet)
  8157. {
  8158. GroupAccountTransactionsRequestPacket GroupAccountTransactionsRequest =
  8159. (GroupAccountTransactionsRequestPacket)Packet;
  8160. GroupAccountTransactionsRequest handlerGroupAccountTransactionsRequest = OnGroupAccountTransactionsRequest;
  8161. if (handlerGroupAccountTransactionsRequest != null)
  8162. {
  8163. handlerGroupAccountTransactionsRequest(this, GroupAccountTransactionsRequest.AgentData.AgentID,GroupAccountTransactionsRequest.AgentData.GroupID,GroupAccountTransactionsRequest.MoneyData.RequestID,GroupAccountTransactionsRequest.AgentData.SessionID);
  8164. return true;
  8165. }
  8166. return false;
  8167. }
  8168. private bool HandleGroupTitlesRequest(IClientAPI sender, Packet Pack)
  8169. {
  8170. GroupTitlesRequestPacket groupTitlesRequest =
  8171. (GroupTitlesRequestPacket)Pack;
  8172. #region Packet Session and User Check
  8173. if (m_checkPackets)
  8174. {
  8175. if (groupTitlesRequest.AgentData.SessionID != SessionId ||
  8176. groupTitlesRequest.AgentData.AgentID != AgentId)
  8177. return true;
  8178. }
  8179. #endregion
  8180. if (m_GroupsModule != null)
  8181. {
  8182. GroupTitlesReplyPacket groupTitlesReply = (GroupTitlesReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupTitlesReply);
  8183. groupTitlesReply.AgentData =
  8184. new GroupTitlesReplyPacket.AgentDataBlock();
  8185. groupTitlesReply.AgentData.AgentID = AgentId;
  8186. groupTitlesReply.AgentData.GroupID =
  8187. groupTitlesRequest.AgentData.GroupID;
  8188. groupTitlesReply.AgentData.RequestID =
  8189. groupTitlesRequest.AgentData.RequestID;
  8190. List<GroupTitlesData> titles =
  8191. m_GroupsModule.GroupTitlesRequest(this,
  8192. groupTitlesRequest.AgentData.GroupID);
  8193. groupTitlesReply.GroupData =
  8194. new GroupTitlesReplyPacket.GroupDataBlock[titles.Count];
  8195. int i = 0;
  8196. foreach (GroupTitlesData d in titles)
  8197. {
  8198. groupTitlesReply.GroupData[i] =
  8199. new GroupTitlesReplyPacket.GroupDataBlock();
  8200. groupTitlesReply.GroupData[i].Title =
  8201. Util.StringToBytes256(d.Name);
  8202. groupTitlesReply.GroupData[i].RoleID =
  8203. d.UUID;
  8204. groupTitlesReply.GroupData[i].Selected =
  8205. d.Selected;
  8206. i++;
  8207. }
  8208. OutPacket(groupTitlesReply, ThrottleOutPacketType.Task);
  8209. }
  8210. return true;
  8211. }
  8212. private bool HandleGroupProfileRequest(IClientAPI sender, Packet Pack)
  8213. {
  8214. GroupProfileRequestPacket groupProfileRequest =
  8215. (GroupProfileRequestPacket)Pack;
  8216. #region Packet Session and User Check
  8217. if (m_checkPackets)
  8218. {
  8219. if (groupProfileRequest.AgentData.SessionID != SessionId ||
  8220. groupProfileRequest.AgentData.AgentID != AgentId)
  8221. return true;
  8222. }
  8223. #endregion
  8224. if (m_GroupsModule != null)
  8225. {
  8226. GroupProfileReplyPacket groupProfileReply = (GroupProfileReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupProfileReply);
  8227. groupProfileReply.AgentData = new GroupProfileReplyPacket.AgentDataBlock();
  8228. groupProfileReply.GroupData = new GroupProfileReplyPacket.GroupDataBlock();
  8229. groupProfileReply.AgentData.AgentID = AgentId;
  8230. GroupProfileData d = m_GroupsModule.GroupProfileRequest(this,
  8231. groupProfileRequest.GroupData.GroupID);
  8232. groupProfileReply.GroupData.GroupID = d.GroupID;
  8233. groupProfileReply.GroupData.Name = Util.StringToBytes256(d.Name);
  8234. groupProfileReply.GroupData.Charter = Util.StringToBytes1024(d.Charter);
  8235. groupProfileReply.GroupData.ShowInList = d.ShowInList;
  8236. groupProfileReply.GroupData.MemberTitle = Util.StringToBytes256(d.MemberTitle);
  8237. groupProfileReply.GroupData.PowersMask = d.PowersMask;
  8238. groupProfileReply.GroupData.InsigniaID = d.InsigniaID;
  8239. groupProfileReply.GroupData.FounderID = d.FounderID;
  8240. groupProfileReply.GroupData.MembershipFee = d.MembershipFee;
  8241. groupProfileReply.GroupData.OpenEnrollment = d.OpenEnrollment;
  8242. groupProfileReply.GroupData.Money = d.Money;
  8243. groupProfileReply.GroupData.GroupMembershipCount = d.GroupMembershipCount;
  8244. groupProfileReply.GroupData.GroupRolesCount = d.GroupRolesCount;
  8245. groupProfileReply.GroupData.AllowPublish = d.AllowPublish;
  8246. groupProfileReply.GroupData.MaturePublish = d.MaturePublish;
  8247. groupProfileReply.GroupData.OwnerRole = d.OwnerRole;
  8248. OutPacket(groupProfileReply, ThrottleOutPacketType.Task);
  8249. }
  8250. return true;
  8251. }
  8252. private bool HandleGroupMembersRequest(IClientAPI sender, Packet Pack)
  8253. {
  8254. GroupMembersRequestPacket groupMembersRequestPacket =
  8255. (GroupMembersRequestPacket)Pack;
  8256. #region Packet Session and User Check
  8257. if (m_checkPackets)
  8258. {
  8259. if (groupMembersRequestPacket.AgentData.SessionID != SessionId ||
  8260. groupMembersRequestPacket.AgentData.AgentID != AgentId)
  8261. return true;
  8262. }
  8263. #endregion
  8264. if (m_GroupsModule != null)
  8265. {
  8266. List<GroupMembersData> members =
  8267. m_GroupsModule.GroupMembersRequest(this, groupMembersRequestPacket.GroupData.GroupID);
  8268. int memberCount = members.Count;
  8269. while (true)
  8270. {
  8271. int blockCount = members.Count;
  8272. if (blockCount > 40)
  8273. blockCount = 40;
  8274. GroupMembersReplyPacket groupMembersReply = (GroupMembersReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupMembersReply);
  8275. groupMembersReply.AgentData =
  8276. new GroupMembersReplyPacket.AgentDataBlock();
  8277. groupMembersReply.GroupData =
  8278. new GroupMembersReplyPacket.GroupDataBlock();
  8279. groupMembersReply.MemberData =
  8280. new GroupMembersReplyPacket.MemberDataBlock[
  8281. blockCount];
  8282. groupMembersReply.AgentData.AgentID = AgentId;
  8283. groupMembersReply.GroupData.GroupID =
  8284. groupMembersRequestPacket.GroupData.GroupID;
  8285. groupMembersReply.GroupData.RequestID =
  8286. groupMembersRequestPacket.GroupData.RequestID;
  8287. groupMembersReply.GroupData.MemberCount = memberCount;
  8288. for (int i = 0; i < blockCount; i++)
  8289. {
  8290. GroupMembersData m = members[0];
  8291. members.RemoveAt(0);
  8292. groupMembersReply.MemberData[i] =
  8293. new GroupMembersReplyPacket.MemberDataBlock();
  8294. groupMembersReply.MemberData[i].AgentID =
  8295. m.AgentID;
  8296. groupMembersReply.MemberData[i].Contribution =
  8297. m.Contribution;
  8298. groupMembersReply.MemberData[i].OnlineStatus =
  8299. Util.StringToBytes256(m.OnlineStatus);
  8300. groupMembersReply.MemberData[i].AgentPowers =
  8301. m.AgentPowers;
  8302. groupMembersReply.MemberData[i].Title =
  8303. Util.StringToBytes256(m.Title);
  8304. groupMembersReply.MemberData[i].IsOwner =
  8305. m.IsOwner;
  8306. }
  8307. OutPacket(groupMembersReply, ThrottleOutPacketType.Task);
  8308. if (members.Count == 0)
  8309. return true;
  8310. }
  8311. }
  8312. return true;
  8313. }
  8314. private bool HandleGroupRoleDataRequest(IClientAPI sender, Packet Pack)
  8315. {
  8316. GroupRoleDataRequestPacket groupRolesRequest =
  8317. (GroupRoleDataRequestPacket)Pack;
  8318. #region Packet Session and User Check
  8319. if (m_checkPackets)
  8320. {
  8321. if (groupRolesRequest.AgentData.SessionID != SessionId ||
  8322. groupRolesRequest.AgentData.AgentID != AgentId)
  8323. return true;
  8324. }
  8325. #endregion
  8326. if (m_GroupsModule != null)
  8327. {
  8328. GroupRoleDataReplyPacket groupRolesReply = (GroupRoleDataReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupRoleDataReply);
  8329. groupRolesReply.AgentData =
  8330. new GroupRoleDataReplyPacket.AgentDataBlock();
  8331. groupRolesReply.AgentData.AgentID = AgentId;
  8332. groupRolesReply.GroupData =
  8333. new GroupRoleDataReplyPacket.GroupDataBlock();
  8334. groupRolesReply.GroupData.GroupID =
  8335. groupRolesRequest.GroupData.GroupID;
  8336. groupRolesReply.GroupData.RequestID =
  8337. groupRolesRequest.GroupData.RequestID;
  8338. List<GroupRolesData> titles =
  8339. m_GroupsModule.GroupRoleDataRequest(this,
  8340. groupRolesRequest.GroupData.GroupID);
  8341. groupRolesReply.GroupData.RoleCount =
  8342. titles.Count;
  8343. groupRolesReply.RoleData =
  8344. new GroupRoleDataReplyPacket.RoleDataBlock[titles.Count];
  8345. int i = 0;
  8346. foreach (GroupRolesData d in titles)
  8347. {
  8348. groupRolesReply.RoleData[i] =
  8349. new GroupRoleDataReplyPacket.RoleDataBlock();
  8350. groupRolesReply.RoleData[i].RoleID =
  8351. d.RoleID;
  8352. groupRolesReply.RoleData[i].Name =
  8353. Util.StringToBytes256(d.Name);
  8354. groupRolesReply.RoleData[i].Title =
  8355. Util.StringToBytes256(d.Title);
  8356. groupRolesReply.RoleData[i].Description =
  8357. Util.StringToBytes1024(d.Description);
  8358. groupRolesReply.RoleData[i].Powers =
  8359. d.Powers;
  8360. groupRolesReply.RoleData[i].Members =
  8361. (uint)d.Members;
  8362. i++;
  8363. }
  8364. OutPacket(groupRolesReply, ThrottleOutPacketType.Task);
  8365. }
  8366. return true;
  8367. }
  8368. private bool HandleGroupRoleMembersRequest(IClientAPI sender, Packet Pack)
  8369. {
  8370. GroupRoleMembersRequestPacket groupRoleMembersRequest =
  8371. (GroupRoleMembersRequestPacket)Pack;
  8372. #region Packet Session and User Check
  8373. if (m_checkPackets)
  8374. {
  8375. if (groupRoleMembersRequest.AgentData.SessionID != SessionId ||
  8376. groupRoleMembersRequest.AgentData.AgentID != AgentId)
  8377. return true;
  8378. }
  8379. #endregion
  8380. if (m_GroupsModule != null)
  8381. {
  8382. List<GroupRoleMembersData> mappings =
  8383. m_GroupsModule.GroupRoleMembersRequest(this,
  8384. groupRoleMembersRequest.GroupData.GroupID);
  8385. int mappingsCount = mappings.Count;
  8386. while (mappings.Count > 0)
  8387. {
  8388. int pairs = mappings.Count;
  8389. if (pairs > 32)
  8390. pairs = 32;
  8391. GroupRoleMembersReplyPacket groupRoleMembersReply = (GroupRoleMembersReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupRoleMembersReply);
  8392. groupRoleMembersReply.AgentData =
  8393. new GroupRoleMembersReplyPacket.AgentDataBlock();
  8394. groupRoleMembersReply.AgentData.AgentID =
  8395. AgentId;
  8396. groupRoleMembersReply.AgentData.GroupID =
  8397. groupRoleMembersRequest.GroupData.GroupID;
  8398. groupRoleMembersReply.AgentData.RequestID =
  8399. groupRoleMembersRequest.GroupData.RequestID;
  8400. groupRoleMembersReply.AgentData.TotalPairs =
  8401. (uint)mappingsCount;
  8402. groupRoleMembersReply.MemberData =
  8403. new GroupRoleMembersReplyPacket.MemberDataBlock[pairs];
  8404. for (int i = 0; i < pairs; i++)
  8405. {
  8406. GroupRoleMembersData d = mappings[0];
  8407. mappings.RemoveAt(0);
  8408. groupRoleMembersReply.MemberData[i] =
  8409. new GroupRoleMembersReplyPacket.MemberDataBlock();
  8410. groupRoleMembersReply.MemberData[i].RoleID =
  8411. d.RoleID;
  8412. groupRoleMembersReply.MemberData[i].MemberID =
  8413. d.MemberID;
  8414. }
  8415. OutPacket(groupRoleMembersReply, ThrottleOutPacketType.Task);
  8416. }
  8417. }
  8418. return true;
  8419. }
  8420. private bool HandleCreateGroupRequest(IClientAPI sender, Packet Pack)
  8421. {
  8422. CreateGroupRequestPacket createGroupRequest =
  8423. (CreateGroupRequestPacket)Pack;
  8424. #region Packet Session and User Check
  8425. if (m_checkPackets)
  8426. {
  8427. if (createGroupRequest.AgentData.SessionID != SessionId ||
  8428. createGroupRequest.AgentData.AgentID != AgentId)
  8429. return true;
  8430. }
  8431. #endregion
  8432. if (m_GroupsModule != null)
  8433. {
  8434. m_GroupsModule.CreateGroup(this,
  8435. Utils.BytesToString(createGroupRequest.GroupData.Name),
  8436. Utils.BytesToString(createGroupRequest.GroupData.Charter),
  8437. createGroupRequest.GroupData.ShowInList,
  8438. createGroupRequest.GroupData.InsigniaID,
  8439. createGroupRequest.GroupData.MembershipFee,
  8440. createGroupRequest.GroupData.OpenEnrollment,
  8441. createGroupRequest.GroupData.AllowPublish,
  8442. createGroupRequest.GroupData.MaturePublish);
  8443. }
  8444. return true;
  8445. }
  8446. private bool HandleUpdateGroupInfo(IClientAPI sender, Packet Pack)
  8447. {
  8448. UpdateGroupInfoPacket updateGroupInfo =
  8449. (UpdateGroupInfoPacket)Pack;
  8450. #region Packet Session and User Check
  8451. if (m_checkPackets)
  8452. {
  8453. if (updateGroupInfo.AgentData.SessionID != SessionId ||
  8454. updateGroupInfo.AgentData.AgentID != AgentId)
  8455. return true;
  8456. }
  8457. #endregion
  8458. if (m_GroupsModule != null)
  8459. {
  8460. m_GroupsModule.UpdateGroupInfo(this,
  8461. updateGroupInfo.GroupData.GroupID,
  8462. Utils.BytesToString(updateGroupInfo.GroupData.Charter),
  8463. updateGroupInfo.GroupData.ShowInList,
  8464. updateGroupInfo.GroupData.InsigniaID,
  8465. updateGroupInfo.GroupData.MembershipFee,
  8466. updateGroupInfo.GroupData.OpenEnrollment,
  8467. updateGroupInfo.GroupData.AllowPublish,
  8468. updateGroupInfo.GroupData.MaturePublish);
  8469. }
  8470. return true;
  8471. }
  8472. private bool HandleSetGroupAcceptNotices(IClientAPI sender, Packet Pack)
  8473. {
  8474. SetGroupAcceptNoticesPacket setGroupAcceptNotices =
  8475. (SetGroupAcceptNoticesPacket)Pack;
  8476. #region Packet Session and User Check
  8477. if (m_checkPackets)
  8478. {
  8479. if (setGroupAcceptNotices.AgentData.SessionID != SessionId ||
  8480. setGroupAcceptNotices.AgentData.AgentID != AgentId)
  8481. return true;
  8482. }
  8483. #endregion
  8484. if (m_GroupsModule != null)
  8485. {
  8486. m_GroupsModule.SetGroupAcceptNotices(this,
  8487. setGroupAcceptNotices.Data.GroupID,
  8488. setGroupAcceptNotices.Data.AcceptNotices,
  8489. setGroupAcceptNotices.NewData.ListInProfile);
  8490. }
  8491. return true;
  8492. }
  8493. private bool HandleGroupTitleUpdate(IClientAPI sender, Packet Pack)
  8494. {
  8495. GroupTitleUpdatePacket groupTitleUpdate =
  8496. (GroupTitleUpdatePacket)Pack;
  8497. #region Packet Session and User Check
  8498. if (m_checkPackets)
  8499. {
  8500. if (groupTitleUpdate.AgentData.SessionID != SessionId ||
  8501. groupTitleUpdate.AgentData.AgentID != AgentId)
  8502. return true;
  8503. }
  8504. #endregion
  8505. if (m_GroupsModule != null)
  8506. {
  8507. m_GroupsModule.GroupTitleUpdate(this,
  8508. groupTitleUpdate.AgentData.GroupID,
  8509. groupTitleUpdate.AgentData.TitleRoleID);
  8510. }
  8511. return true;
  8512. }
  8513. private bool HandleParcelDeedToGroup(IClientAPI sender, Packet Pack)
  8514. {
  8515. ParcelDeedToGroupPacket parcelDeedToGroup = (ParcelDeedToGroupPacket)Pack;
  8516. if (m_GroupsModule != null)
  8517. {
  8518. ParcelDeedToGroup handlerParcelDeedToGroup = OnParcelDeedToGroup;
  8519. if (handlerParcelDeedToGroup != null)
  8520. {
  8521. handlerParcelDeedToGroup(parcelDeedToGroup.Data.LocalID, parcelDeedToGroup.Data.GroupID, this);
  8522. }
  8523. }
  8524. return true;
  8525. }
  8526. private bool HandleGroupNoticesListRequest(IClientAPI sender, Packet Pack)
  8527. {
  8528. GroupNoticesListRequestPacket groupNoticesListRequest =
  8529. (GroupNoticesListRequestPacket)Pack;
  8530. #region Packet Session and User Check
  8531. if (m_checkPackets)
  8532. {
  8533. if (groupNoticesListRequest.AgentData.SessionID != SessionId ||
  8534. groupNoticesListRequest.AgentData.AgentID != AgentId)
  8535. return true;
  8536. }
  8537. #endregion
  8538. if (m_GroupsModule != null)
  8539. {
  8540. GroupNoticeData[] gn =
  8541. m_GroupsModule.GroupNoticesListRequest(this,
  8542. groupNoticesListRequest.Data.GroupID);
  8543. GroupNoticesListReplyPacket groupNoticesListReply = (GroupNoticesListReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupNoticesListReply);
  8544. groupNoticesListReply.AgentData =
  8545. new GroupNoticesListReplyPacket.AgentDataBlock();
  8546. groupNoticesListReply.AgentData.AgentID = AgentId;
  8547. groupNoticesListReply.AgentData.GroupID = groupNoticesListRequest.Data.GroupID;
  8548. groupNoticesListReply.Data = new GroupNoticesListReplyPacket.DataBlock[gn.Length];
  8549. int i = 0;
  8550. foreach (GroupNoticeData g in gn)
  8551. {
  8552. groupNoticesListReply.Data[i] = new GroupNoticesListReplyPacket.DataBlock();
  8553. groupNoticesListReply.Data[i].NoticeID =
  8554. g.NoticeID;
  8555. groupNoticesListReply.Data[i].Timestamp =
  8556. g.Timestamp;
  8557. groupNoticesListReply.Data[i].FromName =
  8558. Util.StringToBytes256(g.FromName);
  8559. groupNoticesListReply.Data[i].Subject =
  8560. Util.StringToBytes256(g.Subject);
  8561. groupNoticesListReply.Data[i].HasAttachment =
  8562. g.HasAttachment;
  8563. groupNoticesListReply.Data[i].AssetType =
  8564. g.AssetType;
  8565. i++;
  8566. }
  8567. OutPacket(groupNoticesListReply, ThrottleOutPacketType.Task);
  8568. }
  8569. return true;
  8570. }
  8571. private bool HandleGroupNoticeRequest(IClientAPI sender, Packet Pack)
  8572. {
  8573. GroupNoticeRequestPacket groupNoticeRequest =
  8574. (GroupNoticeRequestPacket)Pack;
  8575. #region Packet Session and User Check
  8576. if (m_checkPackets)
  8577. {
  8578. if (groupNoticeRequest.AgentData.SessionID != SessionId ||
  8579. groupNoticeRequest.AgentData.AgentID != AgentId)
  8580. return true;
  8581. }
  8582. #endregion
  8583. if (m_GroupsModule != null)
  8584. {
  8585. m_GroupsModule.GroupNoticeRequest(this,
  8586. groupNoticeRequest.Data.GroupNoticeID);
  8587. }
  8588. return true;
  8589. }
  8590. private bool HandleGroupRoleUpdate(IClientAPI sender, Packet Pack)
  8591. {
  8592. GroupRoleUpdatePacket groupRoleUpdate =
  8593. (GroupRoleUpdatePacket)Pack;
  8594. #region Packet Session and User Check
  8595. if (m_checkPackets)
  8596. {
  8597. if (groupRoleUpdate.AgentData.SessionID != SessionId ||
  8598. groupRoleUpdate.AgentData.AgentID != AgentId)
  8599. return true;
  8600. }
  8601. #endregion
  8602. if (m_GroupsModule != null)
  8603. {
  8604. foreach (GroupRoleUpdatePacket.RoleDataBlock d in
  8605. groupRoleUpdate.RoleData)
  8606. {
  8607. m_GroupsModule.GroupRoleUpdate(this,
  8608. groupRoleUpdate.AgentData.GroupID,
  8609. d.RoleID,
  8610. Utils.BytesToString(d.Name),
  8611. Utils.BytesToString(d.Description),
  8612. Utils.BytesToString(d.Title),
  8613. d.Powers,
  8614. d.UpdateType);
  8615. }
  8616. m_GroupsModule.NotifyChange(groupRoleUpdate.AgentData.GroupID);
  8617. }
  8618. return true;
  8619. }
  8620. private bool HandleGroupRoleChanges(IClientAPI sender, Packet Pack)
  8621. {
  8622. GroupRoleChangesPacket groupRoleChanges =
  8623. (GroupRoleChangesPacket)Pack;
  8624. #region Packet Session and User Check
  8625. if (m_checkPackets)
  8626. {
  8627. if (groupRoleChanges.AgentData.SessionID != SessionId ||
  8628. groupRoleChanges.AgentData.AgentID != AgentId)
  8629. return true;
  8630. }
  8631. #endregion
  8632. if (m_GroupsModule != null)
  8633. {
  8634. foreach (GroupRoleChangesPacket.RoleChangeBlock d in
  8635. groupRoleChanges.RoleChange)
  8636. {
  8637. m_GroupsModule.GroupRoleChanges(this,
  8638. groupRoleChanges.AgentData.GroupID,
  8639. d.RoleID,
  8640. d.MemberID,
  8641. d.Change);
  8642. }
  8643. m_GroupsModule.NotifyChange(groupRoleChanges.AgentData.GroupID);
  8644. }
  8645. return true;
  8646. }
  8647. private bool HandleJoinGroupRequest(IClientAPI sender, Packet Pack)
  8648. {
  8649. JoinGroupRequestPacket joinGroupRequest =
  8650. (JoinGroupRequestPacket)Pack;
  8651. #region Packet Session and User Check
  8652. if (m_checkPackets)
  8653. {
  8654. if (joinGroupRequest.AgentData.SessionID != SessionId ||
  8655. joinGroupRequest.AgentData.AgentID != AgentId)
  8656. return true;
  8657. }
  8658. #endregion
  8659. if (m_GroupsModule != null)
  8660. {
  8661. m_GroupsModule.JoinGroupRequest(this,
  8662. joinGroupRequest.GroupData.GroupID);
  8663. }
  8664. return true;
  8665. }
  8666. private bool HandleLeaveGroupRequest(IClientAPI sender, Packet Pack)
  8667. {
  8668. LeaveGroupRequestPacket leaveGroupRequest =
  8669. (LeaveGroupRequestPacket)Pack;
  8670. #region Packet Session and User Check
  8671. if (m_checkPackets)
  8672. {
  8673. if (leaveGroupRequest.AgentData.SessionID != SessionId ||
  8674. leaveGroupRequest.AgentData.AgentID != AgentId)
  8675. return true;
  8676. }
  8677. #endregion
  8678. if (m_GroupsModule != null)
  8679. {
  8680. m_GroupsModule.LeaveGroupRequest(this,
  8681. leaveGroupRequest.GroupData.GroupID);
  8682. }
  8683. return true;
  8684. }
  8685. private bool HandleEjectGroupMemberRequest(IClientAPI sender, Packet Pack)
  8686. {
  8687. EjectGroupMemberRequestPacket ejectGroupMemberRequest =
  8688. (EjectGroupMemberRequestPacket)Pack;
  8689. #region Packet Session and User Check
  8690. if (m_checkPackets)
  8691. {
  8692. if (ejectGroupMemberRequest.AgentData.SessionID != SessionId ||
  8693. ejectGroupMemberRequest.AgentData.AgentID != AgentId)
  8694. return true;
  8695. }
  8696. #endregion
  8697. if (m_GroupsModule != null)
  8698. {
  8699. foreach (EjectGroupMemberRequestPacket.EjectDataBlock e
  8700. in ejectGroupMemberRequest.EjectData)
  8701. {
  8702. m_GroupsModule.EjectGroupMemberRequest(this,
  8703. ejectGroupMemberRequest.GroupData.GroupID,
  8704. e.EjecteeID);
  8705. }
  8706. }
  8707. return true;
  8708. }
  8709. private bool HandleInviteGroupRequest(IClientAPI sender, Packet Pack)
  8710. {
  8711. InviteGroupRequestPacket inviteGroupRequest =
  8712. (InviteGroupRequestPacket)Pack;
  8713. #region Packet Session and User Check
  8714. if (m_checkPackets)
  8715. {
  8716. if (inviteGroupRequest.AgentData.SessionID != SessionId ||
  8717. inviteGroupRequest.AgentData.AgentID != AgentId)
  8718. return true;
  8719. }
  8720. #endregion
  8721. if (m_GroupsModule != null)
  8722. {
  8723. foreach (InviteGroupRequestPacket.InviteDataBlock b in
  8724. inviteGroupRequest.InviteData)
  8725. {
  8726. m_GroupsModule.InviteGroupRequest(this,
  8727. inviteGroupRequest.GroupData.GroupID,
  8728. b.InviteeID,
  8729. b.RoleID);
  8730. }
  8731. }
  8732. return true;
  8733. }
  8734. #endregion Groups
  8735. private bool HandleStartLure(IClientAPI sender, Packet Pack)
  8736. {
  8737. StartLurePacket startLureRequest = (StartLurePacket)Pack;
  8738. #region Packet Session and User Check
  8739. if (m_checkPackets)
  8740. {
  8741. if (startLureRequest.AgentData.SessionID != SessionId ||
  8742. startLureRequest.AgentData.AgentID != AgentId)
  8743. return true;
  8744. }
  8745. #endregion
  8746. StartLure handlerStartLure = OnStartLure;
  8747. if (handlerStartLure != null)
  8748. handlerStartLure(startLureRequest.Info.LureType,
  8749. Utils.BytesToString(
  8750. startLureRequest.Info.Message),
  8751. startLureRequest.TargetData[0].TargetID,
  8752. this);
  8753. return true;
  8754. }
  8755. private bool HandleTeleportLureRequest(IClientAPI sender, Packet Pack)
  8756. {
  8757. TeleportLureRequestPacket teleportLureRequest =
  8758. (TeleportLureRequestPacket)Pack;
  8759. #region Packet Session and User Check
  8760. if (m_checkPackets)
  8761. {
  8762. if (teleportLureRequest.Info.SessionID != SessionId ||
  8763. teleportLureRequest.Info.AgentID != AgentId)
  8764. return true;
  8765. }
  8766. #endregion
  8767. TeleportLureRequest handlerTeleportLureRequest = OnTeleportLureRequest;
  8768. if (handlerTeleportLureRequest != null)
  8769. handlerTeleportLureRequest(
  8770. teleportLureRequest.Info.LureID,
  8771. teleportLureRequest.Info.TeleportFlags,
  8772. this);
  8773. return true;
  8774. }
  8775. private bool HandleClassifiedInfoRequest(IClientAPI sender, Packet Pack)
  8776. {
  8777. ClassifiedInfoRequestPacket classifiedInfoRequest =
  8778. (ClassifiedInfoRequestPacket)Pack;
  8779. #region Packet Session and User Check
  8780. if (m_checkPackets)
  8781. {
  8782. if (classifiedInfoRequest.AgentData.SessionID != SessionId ||
  8783. classifiedInfoRequest.AgentData.AgentID != AgentId)
  8784. return true;
  8785. }
  8786. #endregion
  8787. ClassifiedInfoRequest handlerClassifiedInfoRequest = OnClassifiedInfoRequest;
  8788. if (handlerClassifiedInfoRequest != null)
  8789. handlerClassifiedInfoRequest(
  8790. classifiedInfoRequest.Data.ClassifiedID,
  8791. this);
  8792. return true;
  8793. }
  8794. private bool HandleClassifiedInfoUpdate(IClientAPI sender, Packet Pack)
  8795. {
  8796. ClassifiedInfoUpdatePacket classifiedInfoUpdate =
  8797. (ClassifiedInfoUpdatePacket)Pack;
  8798. #region Packet Session and User Check
  8799. if (m_checkPackets)
  8800. {
  8801. if (classifiedInfoUpdate.AgentData.SessionID != SessionId ||
  8802. classifiedInfoUpdate.AgentData.AgentID != AgentId)
  8803. return true;
  8804. }
  8805. #endregion
  8806. ClassifiedInfoUpdate handlerClassifiedInfoUpdate = OnClassifiedInfoUpdate;
  8807. if (handlerClassifiedInfoUpdate != null)
  8808. handlerClassifiedInfoUpdate(
  8809. classifiedInfoUpdate.Data.ClassifiedID,
  8810. classifiedInfoUpdate.Data.Category,
  8811. Utils.BytesToString(
  8812. classifiedInfoUpdate.Data.Name),
  8813. Utils.BytesToString(
  8814. classifiedInfoUpdate.Data.Desc),
  8815. classifiedInfoUpdate.Data.ParcelID,
  8816. classifiedInfoUpdate.Data.ParentEstate,
  8817. classifiedInfoUpdate.Data.SnapshotID,
  8818. new Vector3(
  8819. classifiedInfoUpdate.Data.PosGlobal),
  8820. classifiedInfoUpdate.Data.ClassifiedFlags,
  8821. classifiedInfoUpdate.Data.PriceForListing,
  8822. this);
  8823. return true;
  8824. }
  8825. private bool HandleClassifiedDelete(IClientAPI sender, Packet Pack)
  8826. {
  8827. ClassifiedDeletePacket classifiedDelete =
  8828. (ClassifiedDeletePacket)Pack;
  8829. #region Packet Session and User Check
  8830. if (m_checkPackets)
  8831. {
  8832. if (classifiedDelete.AgentData.SessionID != SessionId ||
  8833. classifiedDelete.AgentData.AgentID != AgentId)
  8834. return true;
  8835. }
  8836. #endregion
  8837. ClassifiedDelete handlerClassifiedDelete = OnClassifiedDelete;
  8838. if (handlerClassifiedDelete != null)
  8839. handlerClassifiedDelete(
  8840. classifiedDelete.Data.ClassifiedID,
  8841. this);
  8842. return true;
  8843. }
  8844. private bool HandleClassifiedGodDelete(IClientAPI sender, Packet Pack)
  8845. {
  8846. ClassifiedGodDeletePacket classifiedGodDelete =
  8847. (ClassifiedGodDeletePacket)Pack;
  8848. #region Packet Session and User Check
  8849. if (m_checkPackets)
  8850. {
  8851. if (classifiedGodDelete.AgentData.SessionID != SessionId ||
  8852. classifiedGodDelete.AgentData.AgentID != AgentId)
  8853. return true;
  8854. }
  8855. #endregion
  8856. ClassifiedDelete handlerClassifiedGodDelete = OnClassifiedGodDelete;
  8857. if (handlerClassifiedGodDelete != null)
  8858. handlerClassifiedGodDelete(
  8859. classifiedGodDelete.Data.ClassifiedID,
  8860. this);
  8861. return true;
  8862. }
  8863. private bool HandleEventGodDelete(IClientAPI sender, Packet Pack)
  8864. {
  8865. EventGodDeletePacket eventGodDelete =
  8866. (EventGodDeletePacket)Pack;
  8867. #region Packet Session and User Check
  8868. if (m_checkPackets)
  8869. {
  8870. if (eventGodDelete.AgentData.SessionID != SessionId ||
  8871. eventGodDelete.AgentData.AgentID != AgentId)
  8872. return true;
  8873. }
  8874. #endregion
  8875. EventGodDelete handlerEventGodDelete = OnEventGodDelete;
  8876. if (handlerEventGodDelete != null)
  8877. handlerEventGodDelete(
  8878. eventGodDelete.EventData.EventID,
  8879. eventGodDelete.QueryData.QueryID,
  8880. Utils.BytesToString(
  8881. eventGodDelete.QueryData.QueryText),
  8882. eventGodDelete.QueryData.QueryFlags,
  8883. eventGodDelete.QueryData.QueryStart,
  8884. this);
  8885. return true;
  8886. }
  8887. private bool HandleEventNotificationAddRequest(IClientAPI sender, Packet Pack)
  8888. {
  8889. EventNotificationAddRequestPacket eventNotificationAdd =
  8890. (EventNotificationAddRequestPacket)Pack;
  8891. #region Packet Session and User Check
  8892. if (m_checkPackets)
  8893. {
  8894. if (eventNotificationAdd.AgentData.SessionID != SessionId ||
  8895. eventNotificationAdd.AgentData.AgentID != AgentId)
  8896. return true;
  8897. }
  8898. #endregion
  8899. EventNotificationAddRequest handlerEventNotificationAddRequest = OnEventNotificationAddRequest;
  8900. if (handlerEventNotificationAddRequest != null)
  8901. handlerEventNotificationAddRequest(
  8902. eventNotificationAdd.EventData.EventID, this);
  8903. return true;
  8904. }
  8905. private bool HandleEventNotificationRemoveRequest(IClientAPI sender, Packet Pack)
  8906. {
  8907. EventNotificationRemoveRequestPacket eventNotificationRemove =
  8908. (EventNotificationRemoveRequestPacket)Pack;
  8909. #region Packet Session and User Check
  8910. if (m_checkPackets)
  8911. {
  8912. if (eventNotificationRemove.AgentData.SessionID != SessionId ||
  8913. eventNotificationRemove.AgentData.AgentID != AgentId)
  8914. return true;
  8915. }
  8916. #endregion
  8917. EventNotificationRemoveRequest handlerEventNotificationRemoveRequest = OnEventNotificationRemoveRequest;
  8918. if (handlerEventNotificationRemoveRequest != null)
  8919. handlerEventNotificationRemoveRequest(
  8920. eventNotificationRemove.EventData.EventID, this);
  8921. return true;
  8922. }
  8923. private bool HandleRetrieveInstantMessages(IClientAPI sender, Packet Pack)
  8924. {
  8925. RetrieveInstantMessagesPacket rimpInstantMessagePack = (RetrieveInstantMessagesPacket)Pack;
  8926. #region Packet Session and User Check
  8927. if (m_checkPackets)
  8928. {
  8929. if (rimpInstantMessagePack.AgentData.SessionID != SessionId ||
  8930. rimpInstantMessagePack.AgentData.AgentID != AgentId)
  8931. return true;
  8932. }
  8933. #endregion
  8934. RetrieveInstantMessages handlerRetrieveInstantMessages = OnRetrieveInstantMessages;
  8935. if (handlerRetrieveInstantMessages != null)
  8936. handlerRetrieveInstantMessages(this);
  8937. return true;
  8938. }
  8939. private bool HandlePickDelete(IClientAPI sender, Packet Pack)
  8940. {
  8941. PickDeletePacket pickDelete =
  8942. (PickDeletePacket)Pack;
  8943. #region Packet Session and User Check
  8944. if (m_checkPackets)
  8945. {
  8946. if (pickDelete.AgentData.SessionID != SessionId ||
  8947. pickDelete.AgentData.AgentID != AgentId)
  8948. return true;
  8949. }
  8950. #endregion
  8951. PickDelete handlerPickDelete = OnPickDelete;
  8952. if (handlerPickDelete != null)
  8953. handlerPickDelete(this, pickDelete.Data.PickID);
  8954. return true;
  8955. }
  8956. private bool HandlePickGodDelete(IClientAPI sender, Packet Pack)
  8957. {
  8958. PickGodDeletePacket pickGodDelete =
  8959. (PickGodDeletePacket)Pack;
  8960. #region Packet Session and User Check
  8961. if (m_checkPackets)
  8962. {
  8963. if (pickGodDelete.AgentData.SessionID != SessionId ||
  8964. pickGodDelete.AgentData.AgentID != AgentId)
  8965. return true;
  8966. }
  8967. #endregion
  8968. PickGodDelete handlerPickGodDelete = OnPickGodDelete;
  8969. if (handlerPickGodDelete != null)
  8970. handlerPickGodDelete(this,
  8971. pickGodDelete.AgentData.AgentID,
  8972. pickGodDelete.Data.PickID,
  8973. pickGodDelete.Data.QueryID);
  8974. return true;
  8975. }
  8976. private bool HandlePickInfoUpdate(IClientAPI sender, Packet Pack)
  8977. {
  8978. PickInfoUpdatePacket pickInfoUpdate =
  8979. (PickInfoUpdatePacket)Pack;
  8980. #region Packet Session and User Check
  8981. if (m_checkPackets)
  8982. {
  8983. if (pickInfoUpdate.AgentData.SessionID != SessionId ||
  8984. pickInfoUpdate.AgentData.AgentID != AgentId)
  8985. return true;
  8986. }
  8987. #endregion
  8988. PickInfoUpdate handlerPickInfoUpdate = OnPickInfoUpdate;
  8989. if (handlerPickInfoUpdate != null)
  8990. handlerPickInfoUpdate(this,
  8991. pickInfoUpdate.Data.PickID,
  8992. pickInfoUpdate.Data.CreatorID,
  8993. pickInfoUpdate.Data.TopPick,
  8994. Utils.BytesToString(pickInfoUpdate.Data.Name),
  8995. Utils.BytesToString(pickInfoUpdate.Data.Desc),
  8996. pickInfoUpdate.Data.SnapshotID,
  8997. pickInfoUpdate.Data.SortOrder,
  8998. pickInfoUpdate.Data.Enabled);
  8999. return true;
  9000. }
  9001. private bool HandleAvatarNotesUpdate(IClientAPI sender, Packet Pack)
  9002. {
  9003. AvatarNotesUpdatePacket avatarNotesUpdate =
  9004. (AvatarNotesUpdatePacket)Pack;
  9005. #region Packet Session and User Check
  9006. if (m_checkPackets)
  9007. {
  9008. if (avatarNotesUpdate.AgentData.SessionID != SessionId ||
  9009. avatarNotesUpdate.AgentData.AgentID != AgentId)
  9010. return true;
  9011. }
  9012. #endregion
  9013. AvatarNotesUpdate handlerAvatarNotesUpdate = OnAvatarNotesUpdate;
  9014. if (handlerAvatarNotesUpdate != null)
  9015. handlerAvatarNotesUpdate(this,
  9016. avatarNotesUpdate.Data.TargetID,
  9017. Utils.BytesToString(avatarNotesUpdate.Data.Notes));
  9018. return true;
  9019. }
  9020. private bool HandleAvatarInterestsUpdate(IClientAPI sender, Packet Pack)
  9021. {
  9022. AvatarInterestsUpdatePacket avatarInterestUpdate =
  9023. (AvatarInterestsUpdatePacket)Pack;
  9024. #region Packet Session and User Check
  9025. if (m_checkPackets)
  9026. {
  9027. if (avatarInterestUpdate.AgentData.SessionID != SessionId ||
  9028. avatarInterestUpdate.AgentData.AgentID != AgentId)
  9029. return true;
  9030. }
  9031. #endregion
  9032. AvatarInterestUpdate handlerAvatarInterestUpdate = OnAvatarInterestUpdate;
  9033. if (handlerAvatarInterestUpdate != null)
  9034. handlerAvatarInterestUpdate(this,
  9035. avatarInterestUpdate.PropertiesData.WantToMask,
  9036. Utils.BytesToString(avatarInterestUpdate.PropertiesData.WantToText),
  9037. avatarInterestUpdate.PropertiesData.SkillsMask,
  9038. Utils.BytesToString(avatarInterestUpdate.PropertiesData.SkillsText),
  9039. Utils.BytesToString(avatarInterestUpdate.PropertiesData.LanguagesText));
  9040. return true;
  9041. }
  9042. private bool HandleGrantUserRights(IClientAPI sender, Packet Pack)
  9043. {
  9044. GrantUserRightsPacket GrantUserRights =
  9045. (GrantUserRightsPacket)Pack;
  9046. #region Packet Session and User Check
  9047. if (m_checkPackets)
  9048. {
  9049. if (GrantUserRights.AgentData.SessionID != SessionId ||
  9050. GrantUserRights.AgentData.AgentID != AgentId)
  9051. return true;
  9052. }
  9053. #endregion
  9054. GrantUserFriendRights GrantUserRightsHandler = OnGrantUserRights;
  9055. if (GrantUserRightsHandler != null)
  9056. GrantUserRightsHandler(this,
  9057. GrantUserRights.AgentData.AgentID,
  9058. GrantUserRights.Rights[0].AgentRelated,
  9059. GrantUserRights.Rights[0].RelatedRights);
  9060. return true;
  9061. }
  9062. private bool HandlePlacesQuery(IClientAPI sender, Packet Pack)
  9063. {
  9064. PlacesQueryPacket placesQueryPacket =
  9065. (PlacesQueryPacket)Pack;
  9066. PlacesQuery handlerPlacesQuery = OnPlacesQuery;
  9067. if (handlerPlacesQuery != null)
  9068. handlerPlacesQuery(placesQueryPacket.AgentData.QueryID,
  9069. placesQueryPacket.TransactionData.TransactionID,
  9070. Utils.BytesToString(
  9071. placesQueryPacket.QueryData.QueryText),
  9072. placesQueryPacket.QueryData.QueryFlags,
  9073. (byte)placesQueryPacket.QueryData.Category,
  9074. Utils.BytesToString(
  9075. placesQueryPacket.QueryData.SimName),
  9076. this);
  9077. return true;
  9078. }
  9079. #endregion Packet Handlers
  9080. public void SendScriptQuestion(UUID taskID, string taskName, string ownerName, UUID itemID, int question)
  9081. {
  9082. ScriptQuestionPacket scriptQuestion = (ScriptQuestionPacket)PacketPool.Instance.GetPacket(PacketType.ScriptQuestion);
  9083. scriptQuestion.Data = new ScriptQuestionPacket.DataBlock();
  9084. // TODO: don't create new blocks if recycling an old packet
  9085. scriptQuestion.Data.TaskID = taskID;
  9086. scriptQuestion.Data.ItemID = itemID;
  9087. scriptQuestion.Data.Questions = question;
  9088. scriptQuestion.Data.ObjectName = Util.StringToBytes256(taskName);
  9089. scriptQuestion.Data.ObjectOwner = Util.StringToBytes256(ownerName);
  9090. OutPacket(scriptQuestion, ThrottleOutPacketType.Task);
  9091. }
  9092. private void InitDefaultAnimations()
  9093. {
  9094. using (XmlTextReader reader = new XmlTextReader("data/avataranimations.xml"))
  9095. {
  9096. XmlDocument doc = new XmlDocument();
  9097. doc.Load(reader);
  9098. if (doc.DocumentElement != null)
  9099. foreach (XmlNode nod in doc.DocumentElement.ChildNodes)
  9100. {
  9101. if (nod.Attributes["name"] != null)
  9102. {
  9103. string name = nod.Attributes["name"].Value.ToLower();
  9104. string id = nod.InnerText;
  9105. m_defaultAnimations.Add(name, (UUID)id);
  9106. }
  9107. }
  9108. }
  9109. }
  9110. public UUID GetDefaultAnimation(string name)
  9111. {
  9112. if (m_defaultAnimations.ContainsKey(name))
  9113. return m_defaultAnimations[name];
  9114. return UUID.Zero;
  9115. }
  9116. /// <summary>
  9117. /// Handler called when we receive a logout packet.
  9118. /// </summary>
  9119. /// <param name="client"></param>
  9120. /// <param name="packet"></param>
  9121. /// <returns></returns>
  9122. protected virtual bool HandleLogout(IClientAPI client, Packet packet)
  9123. {
  9124. if (packet.Type == PacketType.LogoutRequest)
  9125. {
  9126. if (((LogoutRequestPacket)packet).AgentData.SessionID != SessionId) return false;
  9127. }
  9128. return Logout(client);
  9129. }
  9130. /// <summary>
  9131. ///
  9132. /// </summary>
  9133. /// <param name="client"></param>
  9134. /// <returns></returns>
  9135. protected virtual bool Logout(IClientAPI client)
  9136. {
  9137. m_log.InfoFormat("[CLIENT]: Got a logout request for {0} in {1}", Name, Scene.RegionInfo.RegionName);
  9138. Action<IClientAPI> handlerLogout = OnLogout;
  9139. if (handlerLogout != null)
  9140. {
  9141. handlerLogout(client);
  9142. }
  9143. return true;
  9144. }
  9145. /// <summary>
  9146. /// Send a response back to a client when it asks the asset server (via the region server) if it has
  9147. /// its appearance texture cached.
  9148. ///
  9149. /// At the moment, we always reply that there is no cached texture.
  9150. /// </summary>
  9151. /// <param name="simclient"></param>
  9152. /// <param name="packet"></param>
  9153. /// <returns></returns>
  9154. protected bool HandleAgentTextureCached(IClientAPI simclient, Packet packet)
  9155. {
  9156. //m_log.Debug("texture cached: " + packet.ToString());
  9157. AgentCachedTexturePacket cachedtex = (AgentCachedTexturePacket)packet;
  9158. AgentCachedTextureResponsePacket cachedresp = (AgentCachedTextureResponsePacket)PacketPool.Instance.GetPacket(PacketType.AgentCachedTextureResponse);
  9159. if (cachedtex.AgentData.SessionID != SessionId) return false;
  9160. // TODO: don't create new blocks if recycling an old packet
  9161. cachedresp.AgentData.AgentID = AgentId;
  9162. cachedresp.AgentData.SessionID = m_sessionId;
  9163. cachedresp.AgentData.SerialNum = m_cachedTextureSerial;
  9164. m_cachedTextureSerial++;
  9165. cachedresp.WearableData =
  9166. new AgentCachedTextureResponsePacket.WearableDataBlock[cachedtex.WearableData.Length];
  9167. for (int i = 0; i < cachedtex.WearableData.Length; i++)
  9168. {
  9169. cachedresp.WearableData[i] = new AgentCachedTextureResponsePacket.WearableDataBlock();
  9170. cachedresp.WearableData[i].TextureIndex = cachedtex.WearableData[i].TextureIndex;
  9171. cachedresp.WearableData[i].TextureID = UUID.Zero;
  9172. cachedresp.WearableData[i].HostName = new byte[0];
  9173. }
  9174. cachedresp.Header.Zerocoded = true;
  9175. OutPacket(cachedresp, ThrottleOutPacketType.Task);
  9176. return true;
  9177. }
  9178. protected bool HandleMultipleObjUpdate(IClientAPI simClient, Packet packet)
  9179. {
  9180. MultipleObjectUpdatePacket multipleupdate = (MultipleObjectUpdatePacket)packet;
  9181. if (multipleupdate.AgentData.SessionID != SessionId) return false;
  9182. // m_log.Debug("new multi update packet " + multipleupdate.ToString());
  9183. Scene tScene = (Scene)m_scene;
  9184. for (int i = 0; i < multipleupdate.ObjectData.Length; i++)
  9185. {
  9186. MultipleObjectUpdatePacket.ObjectDataBlock block = multipleupdate.ObjectData[i];
  9187. // Can't act on Null Data
  9188. if (block.Data != null)
  9189. {
  9190. uint localId = block.ObjectLocalID;
  9191. SceneObjectPart part = tScene.GetSceneObjectPart(localId);
  9192. if (part == null)
  9193. {
  9194. // It's a ghost! tell the client to delete it from view.
  9195. simClient.SendKillObject(Scene.RegionInfo.RegionHandle,
  9196. localId);
  9197. }
  9198. else
  9199. {
  9200. // UUID partId = part.UUID;
  9201. UpdatePrimGroupRotation handlerUpdatePrimGroupRotation;
  9202. switch (block.Type)
  9203. {
  9204. case 1:
  9205. Vector3 pos1 = new Vector3(block.Data, 0);
  9206. UpdateVector handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition;
  9207. if (handlerUpdatePrimSinglePosition != null)
  9208. {
  9209. // m_log.Debug("new movement position is " + pos.X + " , " + pos.Y + " , " + pos.Z);
  9210. handlerUpdatePrimSinglePosition(localId, pos1, this);
  9211. }
  9212. break;
  9213. case 2:
  9214. Quaternion rot1 = new Quaternion(block.Data, 0, true);
  9215. UpdatePrimSingleRotation handlerUpdatePrimSingleRotation = OnUpdatePrimSingleRotation;
  9216. if (handlerUpdatePrimSingleRotation != null)
  9217. {
  9218. // m_log.Info("new tab rotation is " + rot1.X + " , " + rot1.Y + " , " + rot1.Z + " , " + rot1.W);
  9219. handlerUpdatePrimSingleRotation(localId, rot1, this);
  9220. }
  9221. break;
  9222. case 3:
  9223. Vector3 rotPos = new Vector3(block.Data, 0);
  9224. Quaternion rot2 = new Quaternion(block.Data, 12, true);
  9225. UpdatePrimSingleRotationPosition handlerUpdatePrimSingleRotationPosition = OnUpdatePrimSingleRotationPosition;
  9226. if (handlerUpdatePrimSingleRotationPosition != null)
  9227. {
  9228. // m_log.Debug("new mouse rotation position is " + rotPos.X + " , " + rotPos.Y + " , " + rotPos.Z);
  9229. // m_log.Info("new mouse rotation is " + rot2.X + " , " + rot2.Y + " , " + rot2.Z + " , " + rot2.W);
  9230. handlerUpdatePrimSingleRotationPosition(localId, rot2, rotPos, this);
  9231. }
  9232. break;
  9233. case 4:
  9234. case 20:
  9235. Vector3 scale4 = new Vector3(block.Data, 0);
  9236. UpdateVector handlerUpdatePrimScale = OnUpdatePrimScale;
  9237. if (handlerUpdatePrimScale != null)
  9238. {
  9239. // m_log.Debug("new scale is " + scale4.X + " , " + scale4.Y + " , " + scale4.Z);
  9240. handlerUpdatePrimScale(localId, scale4, this);
  9241. }
  9242. break;
  9243. case 5:
  9244. Vector3 scale1 = new Vector3(block.Data, 12);
  9245. Vector3 pos11 = new Vector3(block.Data, 0);
  9246. handlerUpdatePrimScale = OnUpdatePrimScale;
  9247. if (handlerUpdatePrimScale != null)
  9248. {
  9249. // m_log.Debug("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
  9250. handlerUpdatePrimScale(localId, scale1, this);
  9251. handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition;
  9252. if (handlerUpdatePrimSinglePosition != null)
  9253. {
  9254. handlerUpdatePrimSinglePosition(localId, pos11, this);
  9255. }
  9256. }
  9257. break;
  9258. case 9:
  9259. Vector3 pos2 = new Vector3(block.Data, 0);
  9260. UpdateVector handlerUpdateVector = OnUpdatePrimGroupPosition;
  9261. if (handlerUpdateVector != null)
  9262. {
  9263. handlerUpdateVector(localId, pos2, this);
  9264. }
  9265. break;
  9266. case 10:
  9267. Quaternion rot3 = new Quaternion(block.Data, 0, true);
  9268. UpdatePrimRotation handlerUpdatePrimRotation = OnUpdatePrimGroupRotation;
  9269. if (handlerUpdatePrimRotation != null)
  9270. {
  9271. // Console.WriteLine("new rotation is " + rot3.X + " , " + rot3.Y + " , " + rot3.Z + " , " + rot3.W);
  9272. handlerUpdatePrimRotation(localId, rot3, this);
  9273. }
  9274. break;
  9275. case 11:
  9276. Vector3 pos3 = new Vector3(block.Data, 0);
  9277. Quaternion rot4 = new Quaternion(block.Data, 12, true);
  9278. handlerUpdatePrimGroupRotation = OnUpdatePrimGroupMouseRotation;
  9279. if (handlerUpdatePrimGroupRotation != null)
  9280. {
  9281. // m_log.Debug("new rotation position is " + pos.X + " , " + pos.Y + " , " + pos.Z);
  9282. // m_log.Debug("new group mouse rotation is " + rot4.X + " , " + rot4.Y + " , " + rot4.Z + " , " + rot4.W);
  9283. handlerUpdatePrimGroupRotation(localId, pos3, rot4, this);
  9284. }
  9285. break;
  9286. case 12:
  9287. case 28:
  9288. Vector3 scale7 = new Vector3(block.Data, 0);
  9289. UpdateVector handlerUpdatePrimGroupScale = OnUpdatePrimGroupScale;
  9290. if (handlerUpdatePrimGroupScale != null)
  9291. {
  9292. // m_log.Debug("new scale is " + scale7.X + " , " + scale7.Y + " , " + scale7.Z);
  9293. handlerUpdatePrimGroupScale(localId, scale7, this);
  9294. }
  9295. break;
  9296. case 13:
  9297. Vector3 scale2 = new Vector3(block.Data, 12);
  9298. Vector3 pos4 = new Vector3(block.Data, 0);
  9299. handlerUpdatePrimScale = OnUpdatePrimScale;
  9300. if (handlerUpdatePrimScale != null)
  9301. {
  9302. //m_log.Debug("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
  9303. handlerUpdatePrimScale(localId, scale2, this);
  9304. // Change the position based on scale (for bug number 246)
  9305. handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition;
  9306. // m_log.Debug("new movement position is " + pos.X + " , " + pos.Y + " , " + pos.Z);
  9307. if (handlerUpdatePrimSinglePosition != null)
  9308. {
  9309. handlerUpdatePrimSinglePosition(localId, pos4, this);
  9310. }
  9311. }
  9312. break;
  9313. case 29:
  9314. Vector3 scale5 = new Vector3(block.Data, 12);
  9315. Vector3 pos5 = new Vector3(block.Data, 0);
  9316. handlerUpdatePrimGroupScale = OnUpdatePrimGroupScale;
  9317. if (handlerUpdatePrimGroupScale != null)
  9318. {
  9319. // m_log.Debug("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
  9320. handlerUpdatePrimGroupScale(localId, scale5, this);
  9321. handlerUpdateVector = OnUpdatePrimGroupPosition;
  9322. if (handlerUpdateVector != null)
  9323. {
  9324. handlerUpdateVector(localId, pos5, this);
  9325. }
  9326. }
  9327. break;
  9328. case 21:
  9329. Vector3 scale6 = new Vector3(block.Data, 12);
  9330. Vector3 pos6 = new Vector3(block.Data, 0);
  9331. handlerUpdatePrimScale = OnUpdatePrimScale;
  9332. if (handlerUpdatePrimScale != null)
  9333. {
  9334. // m_log.Debug("new scale is " + scale.X + " , " + scale.Y + " , " + scale.Z);
  9335. handlerUpdatePrimScale(localId, scale6, this);
  9336. handlerUpdatePrimSinglePosition = OnUpdatePrimSinglePosition;
  9337. if (handlerUpdatePrimSinglePosition != null)
  9338. {
  9339. handlerUpdatePrimSinglePosition(localId, pos6, this);
  9340. }
  9341. }
  9342. break;
  9343. default:
  9344. m_log.Debug("[CLIENT] MultipleObjUpdate recieved an unknown packet type: " + (block.Type));
  9345. break;
  9346. }
  9347. }
  9348. }
  9349. }
  9350. return true;
  9351. }
  9352. public void RequestMapLayer()
  9353. {
  9354. //should be getting the map layer from the grid server
  9355. //send a layer covering the 800,800 - 1200,1200 area (should be covering the requested area)
  9356. MapLayerReplyPacket mapReply = (MapLayerReplyPacket)PacketPool.Instance.GetPacket(PacketType.MapLayerReply);
  9357. // TODO: don't create new blocks if recycling an old packet
  9358. mapReply.AgentData.AgentID = AgentId;
  9359. mapReply.AgentData.Flags = 0;
  9360. mapReply.LayerData = new MapLayerReplyPacket.LayerDataBlock[1];
  9361. mapReply.LayerData[0] = new MapLayerReplyPacket.LayerDataBlock();
  9362. mapReply.LayerData[0].Bottom = 0;
  9363. mapReply.LayerData[0].Left = 0;
  9364. mapReply.LayerData[0].Top = 30000;
  9365. mapReply.LayerData[0].Right = 30000;
  9366. mapReply.LayerData[0].ImageID = new UUID("00000000-0000-1111-9999-000000000006");
  9367. mapReply.Header.Zerocoded = true;
  9368. OutPacket(mapReply, ThrottleOutPacketType.Land);
  9369. }
  9370. public void RequestMapBlocksX(int minX, int minY, int maxX, int maxY)
  9371. {
  9372. /*
  9373. IList simMapProfiles = m_gridServer.RequestMapBlocks(minX, minY, maxX, maxY);
  9374. MapBlockReplyPacket mbReply = new MapBlockReplyPacket();
  9375. mbReply.AgentData.AgentId = AgentId;
  9376. int len;
  9377. if (simMapProfiles == null)
  9378. len = 0;
  9379. else
  9380. len = simMapProfiles.Count;
  9381. mbReply.Data = new MapBlockReplyPacket.DataBlock[len];
  9382. int iii;
  9383. for (iii = 0; iii < len; iii++)
  9384. {
  9385. Hashtable mp = (Hashtable)simMapProfiles[iii];
  9386. mbReply.Data[iii] = new MapBlockReplyPacket.DataBlock();
  9387. mbReply.Data[iii].Name = Util.UTF8.GetBytes((string)mp["name"]);
  9388. mbReply.Data[iii].Access = System.Convert.ToByte(mp["access"]);
  9389. mbReply.Data[iii].Agents = System.Convert.ToByte(mp["agents"]);
  9390. mbReply.Data[iii].MapImageID = new UUID((string)mp["map-image-id"]);
  9391. mbReply.Data[iii].RegionFlags = System.Convert.ToUInt32(mp["region-flags"]);
  9392. mbReply.Data[iii].WaterHeight = System.Convert.ToByte(mp["water-height"]);
  9393. mbReply.Data[iii].X = System.Convert.ToUInt16(mp["x"]);
  9394. mbReply.Data[iii].Y = System.Convert.ToUInt16(mp["y"]);
  9395. }
  9396. this.OutPacket(mbReply, ThrottleOutPacketType.Land);
  9397. */
  9398. }
  9399. /// <summary>
  9400. /// Sets the throttles from values supplied by the client
  9401. /// </summary>
  9402. /// <param name="throttles"></param>
  9403. public void SetChildAgentThrottle(byte[] throttles)
  9404. {
  9405. m_udpClient.SetThrottles(throttles);
  9406. }
  9407. /// <summary>
  9408. /// Get the current throttles for this client as a packed byte array
  9409. /// </summary>
  9410. /// <param name="multiplier">Unused</param>
  9411. /// <returns></returns>
  9412. public byte[] GetThrottlesPacked(float multiplier)
  9413. {
  9414. return m_udpClient.GetThrottlesPacked();
  9415. }
  9416. /// <summary>
  9417. /// Cruft?
  9418. /// </summary>
  9419. public virtual void InPacket(object NewPack)
  9420. {
  9421. throw new NotImplementedException();
  9422. }
  9423. /// <summary>
  9424. /// This is the starting point for sending a simulator packet out to the client
  9425. /// </summary>
  9426. /// <param name="packet">Packet to send</param>
  9427. /// <param name="throttlePacketType">Throttling category for the packet</param>
  9428. protected void OutPacket(Packet packet, ThrottleOutPacketType throttlePacketType)
  9429. {
  9430. #region BinaryStats
  9431. LLUDPServer.LogPacketHeader(false, m_circuitCode, 0, packet.Type, (ushort)packet.Length);
  9432. #endregion BinaryStats
  9433. m_udpServer.SendPacket(m_udpClient, packet, throttlePacketType, true);
  9434. }
  9435. /// <summary>
  9436. /// This is the starting point for sending a simulator packet out to the client
  9437. /// </summary>
  9438. /// <param name="packet">Packet to send</param>
  9439. /// <param name="throttlePacketType">Throttling category for the packet</param>
  9440. /// <param name="doAutomaticSplitting">True to automatically split oversized
  9441. /// packets (the default), or false to disable splitting if the calling code
  9442. /// handles splitting manually</param>
  9443. protected void OutPacket(Packet packet, ThrottleOutPacketType throttlePacketType, bool doAutomaticSplitting)
  9444. {
  9445. m_udpServer.SendPacket(m_udpClient, packet, throttlePacketType, doAutomaticSplitting);
  9446. }
  9447. public bool AddMoney(int debit)
  9448. {
  9449. if (m_moneyBalance + debit >= 0)
  9450. {
  9451. m_moneyBalance += debit;
  9452. SendMoneyBalance(UUID.Zero, true, Util.StringToBytes256("Poof Poof!"), m_moneyBalance);
  9453. return true;
  9454. }
  9455. return false;
  9456. }
  9457. /// <summary>
  9458. /// Breaks down the genericMessagePacket into specific events
  9459. /// </summary>
  9460. /// <param name="gmMethod"></param>
  9461. /// <param name="gmInvoice"></param>
  9462. /// <param name="gmParams"></param>
  9463. public void DecipherGenericMessage(string gmMethod, UUID gmInvoice, GenericMessagePacket.ParamListBlock[] gmParams)
  9464. {
  9465. switch (gmMethod)
  9466. {
  9467. case "autopilot":
  9468. float locx;
  9469. float locy;
  9470. float locz;
  9471. try
  9472. {
  9473. uint regionX;
  9474. uint regionY;
  9475. Utils.LongToUInts(Scene.RegionInfo.RegionHandle, out regionX, out regionY);
  9476. locx = Convert.ToSingle(Utils.BytesToString(gmParams[0].Parameter)) - regionX;
  9477. locy = Convert.ToSingle(Utils.BytesToString(gmParams[1].Parameter)) - regionY;
  9478. locz = Convert.ToSingle(Utils.BytesToString(gmParams[2].Parameter));
  9479. }
  9480. catch (InvalidCastException)
  9481. {
  9482. m_log.Error("[CLIENT]: Invalid autopilot request");
  9483. return;
  9484. }
  9485. UpdateVector handlerAutoPilotGo = OnAutoPilotGo;
  9486. if (handlerAutoPilotGo != null)
  9487. {
  9488. handlerAutoPilotGo(0, new Vector3(locx, locy, locz), this);
  9489. }
  9490. m_log.InfoFormat("[CLIENT]: Client Requests autopilot to position <{0},{1},{2}>", locx, locy, locz);
  9491. break;
  9492. default:
  9493. m_log.Debug("[CLIENT]: Unknown Generic Message, Method: " + gmMethod + ". Invoice: " + gmInvoice + ". Dumping Params:");
  9494. for (int hi = 0; hi < gmParams.Length; hi++)
  9495. {
  9496. Console.WriteLine(gmParams[hi].ToString());
  9497. }
  9498. //gmpack.MethodData.
  9499. break;
  9500. }
  9501. }
  9502. /// <summary>
  9503. /// Entryway from the client to the simulator. All UDP packets from the client will end up here
  9504. /// </summary>
  9505. /// <param name="Pack">OpenMetaverse.packet</param>
  9506. public void ProcessInPacket(Packet Pack)
  9507. {
  9508. if (ProcessPacketMethod(Pack))
  9509. {
  9510. PacketPool.Instance.ReturnPacket(Pack);
  9511. return;
  9512. }
  9513. // Main packet processing conditional
  9514. switch (Pack.Type)
  9515. {
  9516. #region CommentedOut
  9517. /*
  9518. #region Scene/Avatar
  9519. case PacketType.AvatarPropertiesRequest:
  9520. AvatarPropertiesRequestPacket avatarProperties = (AvatarPropertiesRequestPacket)Pack;
  9521. #region Packet Session and User Check
  9522. if (m_checkPackets)
  9523. {
  9524. if (avatarProperties.AgentData.SessionID != SessionId ||
  9525. avatarProperties.AgentData.AgentID != AgentId)
  9526. break;
  9527. }
  9528. #endregion
  9529. RequestAvatarProperties handlerRequestAvatarProperties = OnRequestAvatarProperties;
  9530. if (handlerRequestAvatarProperties != null)
  9531. {
  9532. handlerRequestAvatarProperties(this, avatarProperties.AgentData.AvatarID);
  9533. }
  9534. break;
  9535. case PacketType.ChatFromViewer:
  9536. ChatFromViewerPacket inchatpack = (ChatFromViewerPacket)Pack;
  9537. #region Packet Session and User Check
  9538. if (m_checkPackets)
  9539. {
  9540. if (inchatpack.AgentData.SessionID != SessionId ||
  9541. inchatpack.AgentData.AgentID != AgentId)
  9542. break;
  9543. }
  9544. #endregion
  9545. string fromName = String.Empty; //ClientAvatar.firstname + " " + ClientAvatar.lastname;
  9546. byte[] message = inchatpack.ChatData.Message;
  9547. byte type = inchatpack.ChatData.Type;
  9548. Vector3 fromPos = new Vector3(); // ClientAvatar.Pos;
  9549. // UUID fromAgentID = AgentId;
  9550. int channel = inchatpack.ChatData.Channel;
  9551. if (OnChatFromClient != null)
  9552. {
  9553. OSChatMessage args = new OSChatMessage();
  9554. args.Channel = channel;
  9555. args.From = fromName;
  9556. args.Message = Utils.BytesToString(message);
  9557. args.Type = (ChatTypeEnum)type;
  9558. args.Position = fromPos;
  9559. args.Scene = Scene;
  9560. args.Sender = this;
  9561. args.SenderUUID = this.AgentId;
  9562. ChatMessage handlerChatFromClient = OnChatFromClient;
  9563. if (handlerChatFromClient != null)
  9564. handlerChatFromClient(this, args);
  9565. }
  9566. break;
  9567. case PacketType.AvatarPropertiesUpdate:
  9568. AvatarPropertiesUpdatePacket avatarProps = (AvatarPropertiesUpdatePacket)Pack;
  9569. #region Packet Session and User Check
  9570. if (m_checkPackets)
  9571. {
  9572. if (avatarProps.AgentData.SessionID != SessionId ||
  9573. avatarProps.AgentData.AgentID != AgentId)
  9574. break;
  9575. }
  9576. #endregion
  9577. UpdateAvatarProperties handlerUpdateAvatarProperties = OnUpdateAvatarProperties;
  9578. if (handlerUpdateAvatarProperties != null)
  9579. {
  9580. AvatarPropertiesUpdatePacket.PropertiesDataBlock Properties = avatarProps.PropertiesData;
  9581. UserProfileData UserProfile = new UserProfileData();
  9582. UserProfile.ID = AgentId;
  9583. UserProfile.AboutText = Utils.BytesToString(Properties.AboutText);
  9584. UserProfile.FirstLifeAboutText = Utils.BytesToString(Properties.FLAboutText);
  9585. UserProfile.FirstLifeImage = Properties.FLImageID;
  9586. UserProfile.Image = Properties.ImageID;
  9587. UserProfile.ProfileUrl = Utils.BytesToString(Properties.ProfileURL);
  9588. handlerUpdateAvatarProperties(this, UserProfile);
  9589. }
  9590. break;
  9591. case PacketType.ScriptDialogReply:
  9592. ScriptDialogReplyPacket rdialog = (ScriptDialogReplyPacket)Pack;
  9593. #region Packet Session and User Check
  9594. if (m_checkPackets)
  9595. {
  9596. if (rdialog.AgentData.SessionID != SessionId ||
  9597. rdialog.AgentData.AgentID != AgentId)
  9598. break;
  9599. }
  9600. #endregion
  9601. int ch = rdialog.Data.ChatChannel;
  9602. byte[] msg = rdialog.Data.ButtonLabel;
  9603. if (OnChatFromClient != null)
  9604. {
  9605. OSChatMessage args = new OSChatMessage();
  9606. args.Channel = ch;
  9607. args.From = String.Empty;
  9608. args.Message = Utils.BytesToString(msg);
  9609. args.Type = ChatTypeEnum.Shout;
  9610. args.Position = new Vector3();
  9611. args.Scene = Scene;
  9612. args.Sender = this;
  9613. ChatMessage handlerChatFromClient2 = OnChatFromClient;
  9614. if (handlerChatFromClient2 != null)
  9615. handlerChatFromClient2(this, args);
  9616. }
  9617. break;
  9618. case PacketType.ImprovedInstantMessage:
  9619. ImprovedInstantMessagePacket msgpack = (ImprovedInstantMessagePacket)Pack;
  9620. #region Packet Session and User Check
  9621. if (m_checkPackets)
  9622. {
  9623. if (msgpack.AgentData.SessionID != SessionId ||
  9624. msgpack.AgentData.AgentID != AgentId)
  9625. break;
  9626. }
  9627. #endregion
  9628. string IMfromName = Util.FieldToString(msgpack.MessageBlock.FromAgentName);
  9629. string IMmessage = Utils.BytesToString(msgpack.MessageBlock.Message);
  9630. ImprovedInstantMessage handlerInstantMessage = OnInstantMessage;
  9631. if (handlerInstantMessage != null)
  9632. {
  9633. GridInstantMessage im = new GridInstantMessage(Scene,
  9634. msgpack.AgentData.AgentID,
  9635. IMfromName,
  9636. msgpack.MessageBlock.ToAgentID,
  9637. msgpack.MessageBlock.Dialog,
  9638. msgpack.MessageBlock.FromGroup,
  9639. IMmessage,
  9640. msgpack.MessageBlock.ID,
  9641. msgpack.MessageBlock.Offline != 0 ? true : false,
  9642. msgpack.MessageBlock.Position,
  9643. msgpack.MessageBlock.BinaryBucket);
  9644. handlerInstantMessage(this, im);
  9645. }
  9646. break;
  9647. case PacketType.AcceptFriendship:
  9648. AcceptFriendshipPacket afriendpack = (AcceptFriendshipPacket)Pack;
  9649. #region Packet Session and User Check
  9650. if (m_checkPackets)
  9651. {
  9652. if (afriendpack.AgentData.SessionID != SessionId ||
  9653. afriendpack.AgentData.AgentID != AgentId)
  9654. break;
  9655. }
  9656. #endregion
  9657. // My guess is this is the folder to stick the calling card into
  9658. List<UUID> callingCardFolders = new List<UUID>();
  9659. UUID agentID = afriendpack.AgentData.AgentID;
  9660. UUID transactionID = afriendpack.TransactionBlock.TransactionID;
  9661. for (int fi = 0; fi < afriendpack.FolderData.Length; fi++)
  9662. {
  9663. callingCardFolders.Add(afriendpack.FolderData[fi].FolderID);
  9664. }
  9665. FriendActionDelegate handlerApproveFriendRequest = OnApproveFriendRequest;
  9666. if (handlerApproveFriendRequest != null)
  9667. {
  9668. handlerApproveFriendRequest(this, agentID, transactionID, callingCardFolders);
  9669. }
  9670. break;
  9671. case PacketType.DeclineFriendship:
  9672. DeclineFriendshipPacket dfriendpack = (DeclineFriendshipPacket)Pack;
  9673. #region Packet Session and User Check
  9674. if (m_checkPackets)
  9675. {
  9676. if (dfriendpack.AgentData.SessionID != SessionId ||
  9677. dfriendpack.AgentData.AgentID != AgentId)
  9678. break;
  9679. }
  9680. #endregion
  9681. if (OnDenyFriendRequest != null)
  9682. {
  9683. OnDenyFriendRequest(this,
  9684. dfriendpack.AgentData.AgentID,
  9685. dfriendpack.TransactionBlock.TransactionID,
  9686. null);
  9687. }
  9688. break;
  9689. case PacketType.TerminateFriendship:
  9690. TerminateFriendshipPacket tfriendpack = (TerminateFriendshipPacket)Pack;
  9691. #region Packet Session and User Check
  9692. if (m_checkPackets)
  9693. {
  9694. if (tfriendpack.AgentData.SessionID != SessionId ||
  9695. tfriendpack.AgentData.AgentID != AgentId)
  9696. break;
  9697. }
  9698. #endregion
  9699. UUID listOwnerAgentID = tfriendpack.AgentData.AgentID;
  9700. UUID exFriendID = tfriendpack.ExBlock.OtherID;
  9701. FriendshipTermination handlerTerminateFriendship = OnTerminateFriendship;
  9702. if (handlerTerminateFriendship != null)
  9703. {
  9704. handlerTerminateFriendship(this, listOwnerAgentID, exFriendID);
  9705. }
  9706. break;
  9707. case PacketType.RezObject:
  9708. RezObjectPacket rezPacket = (RezObjectPacket)Pack;
  9709. #region Packet Session and User Check
  9710. if (m_checkPackets)
  9711. {
  9712. if (rezPacket.AgentData.SessionID != SessionId ||
  9713. rezPacket.AgentData.AgentID != AgentId)
  9714. break;
  9715. }
  9716. #endregion
  9717. RezObject handlerRezObject = OnRezObject;
  9718. if (handlerRezObject != null)
  9719. {
  9720. handlerRezObject(this, rezPacket.InventoryData.ItemID, rezPacket.RezData.RayEnd,
  9721. rezPacket.RezData.RayStart, rezPacket.RezData.RayTargetID,
  9722. rezPacket.RezData.BypassRaycast, rezPacket.RezData.RayEndIsIntersection,
  9723. rezPacket.RezData.RezSelected, rezPacket.RezData.RemoveItem,
  9724. rezPacket.RezData.FromTaskID);
  9725. }
  9726. break;
  9727. case PacketType.DeRezObject:
  9728. DeRezObjectPacket DeRezPacket = (DeRezObjectPacket)Pack;
  9729. #region Packet Session and User Check
  9730. if (m_checkPackets)
  9731. {
  9732. if (DeRezPacket.AgentData.SessionID != SessionId ||
  9733. DeRezPacket.AgentData.AgentID != AgentId)
  9734. break;
  9735. }
  9736. #endregion
  9737. DeRezObject handlerDeRezObject = OnDeRezObject;
  9738. if (handlerDeRezObject != null)
  9739. {
  9740. List<uint> deRezIDs = new List<uint>();
  9741. foreach (DeRezObjectPacket.ObjectDataBlock data in
  9742. DeRezPacket.ObjectData)
  9743. {
  9744. deRezIDs.Add(data.ObjectLocalID);
  9745. }
  9746. // It just so happens that the values on the DeRezAction enumerator match the Destination
  9747. // values given by a Second Life client
  9748. handlerDeRezObject(this, deRezIDs,
  9749. DeRezPacket.AgentBlock.GroupID,
  9750. (DeRezAction)DeRezPacket.AgentBlock.Destination,
  9751. DeRezPacket.AgentBlock.DestinationID);
  9752. }
  9753. break;
  9754. case PacketType.ModifyLand:
  9755. ModifyLandPacket modify = (ModifyLandPacket)Pack;
  9756. #region Packet Session and User Check
  9757. if (m_checkPackets)
  9758. {
  9759. if (modify.AgentData.SessionID != SessionId ||
  9760. modify.AgentData.AgentID != AgentId)
  9761. break;
  9762. }
  9763. #endregion
  9764. //m_log.Info("[LAND]: LAND:" + modify.ToString());
  9765. if (modify.ParcelData.Length > 0)
  9766. {
  9767. if (OnModifyTerrain != null)
  9768. {
  9769. for (int i = 0; i < modify.ParcelData.Length; i++)
  9770. {
  9771. ModifyTerrain handlerModifyTerrain = OnModifyTerrain;
  9772. if (handlerModifyTerrain != null)
  9773. {
  9774. handlerModifyTerrain(AgentId, modify.ModifyBlock.Height, modify.ModifyBlock.Seconds,
  9775. modify.ModifyBlock.BrushSize,
  9776. modify.ModifyBlock.Action, modify.ParcelData[i].North,
  9777. modify.ParcelData[i].West, modify.ParcelData[i].South,
  9778. modify.ParcelData[i].East, AgentId);
  9779. }
  9780. }
  9781. }
  9782. }
  9783. break;
  9784. case PacketType.RegionHandshakeReply:
  9785. Action<IClientAPI> handlerRegionHandShakeReply = OnRegionHandShakeReply;
  9786. if (handlerRegionHandShakeReply != null)
  9787. {
  9788. handlerRegionHandShakeReply(this);
  9789. }
  9790. break;
  9791. case PacketType.AgentWearablesRequest:
  9792. GenericCall2 handlerRequestWearables = OnRequestWearables;
  9793. if (handlerRequestWearables != null)
  9794. {
  9795. handlerRequestWearables();
  9796. }
  9797. Action<IClientAPI> handlerRequestAvatarsData = OnRequestAvatarsData;
  9798. if (handlerRequestAvatarsData != null)
  9799. {
  9800. handlerRequestAvatarsData(this);
  9801. }
  9802. break;
  9803. case PacketType.AgentSetAppearance:
  9804. AgentSetAppearancePacket appear = (AgentSetAppearancePacket)Pack;
  9805. #region Packet Session and User Check
  9806. if (m_checkPackets)
  9807. {
  9808. if (appear.AgentData.SessionID != SessionId ||
  9809. appear.AgentData.AgentID != AgentId)
  9810. break;
  9811. }
  9812. #endregion
  9813. SetAppearance handlerSetAppearance = OnSetAppearance;
  9814. if (handlerSetAppearance != null)
  9815. {
  9816. // Temporarily protect ourselves from the mantis #951 failure.
  9817. // However, we could do this for several other handlers where a failure isn't terminal
  9818. // for the client session anyway, in order to protect ourselves against bad code in plugins
  9819. try
  9820. {
  9821. byte[] visualparams = new byte[appear.VisualParam.Length];
  9822. for (int i = 0; i < appear.VisualParam.Length; i++)
  9823. visualparams[i] = appear.VisualParam[i].ParamValue;
  9824. Primitive.TextureEntry te = null;
  9825. if (appear.ObjectData.TextureEntry.Length > 1)
  9826. te = new Primitive.TextureEntry(appear.ObjectData.TextureEntry, 0, appear.ObjectData.TextureEntry.Length);
  9827. handlerSetAppearance(te, visualparams);
  9828. }
  9829. catch (Exception e)
  9830. {
  9831. m_log.ErrorFormat(
  9832. "[CLIENT VIEW]: AgentSetApperance packet handler threw an exception, {0}",
  9833. e);
  9834. }
  9835. }
  9836. break;
  9837. case PacketType.AgentIsNowWearing:
  9838. if (OnAvatarNowWearing != null)
  9839. {
  9840. AgentIsNowWearingPacket nowWearing = (AgentIsNowWearingPacket)Pack;
  9841. #region Packet Session and User Check
  9842. if (m_checkPackets)
  9843. {
  9844. if (nowWearing.AgentData.SessionID != SessionId ||
  9845. nowWearing.AgentData.AgentID != AgentId)
  9846. break;
  9847. }
  9848. #endregion
  9849. AvatarWearingArgs wearingArgs = new AvatarWearingArgs();
  9850. for (int i = 0; i < nowWearing.WearableData.Length; i++)
  9851. {
  9852. AvatarWearingArgs.Wearable wearable =
  9853. new AvatarWearingArgs.Wearable(nowWearing.WearableData[i].ItemID,
  9854. nowWearing.WearableData[i].WearableType);
  9855. wearingArgs.NowWearing.Add(wearable);
  9856. }
  9857. AvatarNowWearing handlerAvatarNowWearing = OnAvatarNowWearing;
  9858. if (handlerAvatarNowWearing != null)
  9859. {
  9860. handlerAvatarNowWearing(this, wearingArgs);
  9861. }
  9862. }
  9863. break;
  9864. case PacketType.RezSingleAttachmentFromInv:
  9865. RezSingleAttachmentFromInv handlerRezSingleAttachment = OnRezSingleAttachmentFromInv;
  9866. if (handlerRezSingleAttachment != null)
  9867. {
  9868. RezSingleAttachmentFromInvPacket rez = (RezSingleAttachmentFromInvPacket)Pack;
  9869. #region Packet Session and User Check
  9870. if (m_checkPackets)
  9871. {
  9872. if (rez.AgentData.SessionID != SessionId ||
  9873. rez.AgentData.AgentID != AgentId)
  9874. break;
  9875. }
  9876. #endregion
  9877. handlerRezSingleAttachment(this, rez.ObjectData.ItemID,
  9878. rez.ObjectData.AttachmentPt);
  9879. }
  9880. break;
  9881. case PacketType.RezMultipleAttachmentsFromInv:
  9882. RezMultipleAttachmentsFromInv handlerRezMultipleAttachments = OnRezMultipleAttachmentsFromInv;
  9883. if (handlerRezMultipleAttachments != null)
  9884. {
  9885. RezMultipleAttachmentsFromInvPacket rez = (RezMultipleAttachmentsFromInvPacket)Pack;
  9886. handlerRezMultipleAttachments(this, rez.HeaderData,
  9887. rez.ObjectData);
  9888. }
  9889. break;
  9890. case PacketType.DetachAttachmentIntoInv:
  9891. UUIDNameRequest handlerDetachAttachmentIntoInv = OnDetachAttachmentIntoInv;
  9892. if (handlerDetachAttachmentIntoInv != null)
  9893. {
  9894. DetachAttachmentIntoInvPacket detachtoInv = (DetachAttachmentIntoInvPacket)Pack;
  9895. #region Packet Session and User Check
  9896. // UNSUPPORTED ON THIS PACKET
  9897. #endregion
  9898. UUID itemID = detachtoInv.ObjectData.ItemID;
  9899. // UUID ATTACH_agentID = detachtoInv.ObjectData.AgentID;
  9900. handlerDetachAttachmentIntoInv(itemID, this);
  9901. }
  9902. break;
  9903. case PacketType.ObjectAttach:
  9904. if (OnObjectAttach != null)
  9905. {
  9906. ObjectAttachPacket att = (ObjectAttachPacket)Pack;
  9907. #region Packet Session and User Check
  9908. if (m_checkPackets)
  9909. {
  9910. if (att.AgentData.SessionID != SessionId ||
  9911. att.AgentData.AgentID != AgentId)
  9912. break;
  9913. }
  9914. #endregion
  9915. ObjectAttach handlerObjectAttach = OnObjectAttach;
  9916. if (handlerObjectAttach != null)
  9917. {
  9918. if (att.ObjectData.Length > 0)
  9919. {
  9920. handlerObjectAttach(this, att.ObjectData[0].ObjectLocalID, att.AgentData.AttachmentPoint, att.ObjectData[0].Rotation, false);
  9921. }
  9922. }
  9923. }
  9924. break;
  9925. case PacketType.ObjectDetach:
  9926. ObjectDetachPacket dett = (ObjectDetachPacket)Pack;
  9927. #region Packet Session and User Check
  9928. if (m_checkPackets)
  9929. {
  9930. if (dett.AgentData.SessionID != SessionId ||
  9931. dett.AgentData.AgentID != AgentId)
  9932. break;
  9933. }
  9934. #endregion
  9935. for (int j = 0; j < dett.ObjectData.Length; j++)
  9936. {
  9937. uint obj = dett.ObjectData[j].ObjectLocalID;
  9938. ObjectDeselect handlerObjectDetach = OnObjectDetach;
  9939. if (handlerObjectDetach != null)
  9940. {
  9941. handlerObjectDetach(obj, this);
  9942. }
  9943. }
  9944. break;
  9945. case PacketType.ObjectDrop:
  9946. ObjectDropPacket dropp = (ObjectDropPacket)Pack;
  9947. #region Packet Session and User Check
  9948. if (m_checkPackets)
  9949. {
  9950. if (dropp.AgentData.SessionID != SessionId ||
  9951. dropp.AgentData.AgentID != AgentId)
  9952. break;
  9953. }
  9954. #endregion
  9955. for (int j = 0; j < dropp.ObjectData.Length; j++)
  9956. {
  9957. uint obj = dropp.ObjectData[j].ObjectLocalID;
  9958. ObjectDrop handlerObjectDrop = OnObjectDrop;
  9959. if (handlerObjectDrop != null)
  9960. {
  9961. handlerObjectDrop(obj, this);
  9962. }
  9963. }
  9964. break;
  9965. case PacketType.SetAlwaysRun:
  9966. SetAlwaysRunPacket run = (SetAlwaysRunPacket)Pack;
  9967. #region Packet Session and User Check
  9968. if (m_checkPackets)
  9969. {
  9970. if (run.AgentData.SessionID != SessionId ||
  9971. run.AgentData.AgentID != AgentId)
  9972. break;
  9973. }
  9974. #endregion
  9975. SetAlwaysRun handlerSetAlwaysRun = OnSetAlwaysRun;
  9976. if (handlerSetAlwaysRun != null)
  9977. handlerSetAlwaysRun(this, run.AgentData.AlwaysRun);
  9978. break;
  9979. case PacketType.CompleteAgentMovement:
  9980. GenericCall2 handlerCompleteMovementToRegion = OnCompleteMovementToRegion;
  9981. if (handlerCompleteMovementToRegion != null)
  9982. {
  9983. handlerCompleteMovementToRegion();
  9984. }
  9985. handlerCompleteMovementToRegion = null;
  9986. break;
  9987. case PacketType.AgentAnimation:
  9988. AgentAnimationPacket AgentAni = (AgentAnimationPacket)Pack;
  9989. #region Packet Session and User Check
  9990. if (m_checkPackets)
  9991. {
  9992. if (AgentAni.AgentData.SessionID != SessionId ||
  9993. AgentAni.AgentData.AgentID != AgentId)
  9994. break;
  9995. }
  9996. #endregion
  9997. StartAnim handlerStartAnim = null;
  9998. StopAnim handlerStopAnim = null;
  9999. for (int i = 0; i < AgentAni.AnimationList.Length; i++)
  10000. {
  10001. if (AgentAni.AnimationList[i].StartAnim)
  10002. {
  10003. handlerStartAnim = OnStartAnim;
  10004. if (handlerStartAnim != null)
  10005. {
  10006. handlerStartAnim(this, AgentAni.AnimationList[i].AnimID);
  10007. }
  10008. }
  10009. else
  10010. {
  10011. handlerStopAnim = OnStopAnim;
  10012. if (handlerStopAnim != null)
  10013. {
  10014. handlerStopAnim(this, AgentAni.AnimationList[i].AnimID);
  10015. }
  10016. }
  10017. }
  10018. break;
  10019. case PacketType.AgentRequestSit:
  10020. if (OnAgentRequestSit != null)
  10021. {
  10022. AgentRequestSitPacket agentRequestSit = (AgentRequestSitPacket)Pack;
  10023. #region Packet Session and User Check
  10024. if (m_checkPackets)
  10025. {
  10026. if (agentRequestSit.AgentData.SessionID != SessionId ||
  10027. agentRequestSit.AgentData.AgentID != AgentId)
  10028. break;
  10029. }
  10030. #endregion
  10031. AgentRequestSit handlerAgentRequestSit = OnAgentRequestSit;
  10032. if (handlerAgentRequestSit != null)
  10033. handlerAgentRequestSit(this, agentRequestSit.AgentData.AgentID,
  10034. agentRequestSit.TargetObject.TargetID, agentRequestSit.TargetObject.Offset);
  10035. }
  10036. break;
  10037. case PacketType.AgentSit:
  10038. if (OnAgentSit != null)
  10039. {
  10040. AgentSitPacket agentSit = (AgentSitPacket)Pack;
  10041. #region Packet Session and User Check
  10042. if (m_checkPackets)
  10043. {
  10044. if (agentSit.AgentData.SessionID != SessionId ||
  10045. agentSit.AgentData.AgentID != AgentId)
  10046. break;
  10047. }
  10048. #endregion
  10049. AgentSit handlerAgentSit = OnAgentSit;
  10050. if (handlerAgentSit != null)
  10051. {
  10052. OnAgentSit(this, agentSit.AgentData.AgentID);
  10053. }
  10054. }
  10055. break;
  10056. case PacketType.SoundTrigger:
  10057. SoundTriggerPacket soundTriggerPacket = (SoundTriggerPacket)Pack;
  10058. #region Packet Session and User Check
  10059. if (m_checkPackets)
  10060. {
  10061. // UNSUPPORTED ON THIS PACKET
  10062. }
  10063. #endregion
  10064. SoundTrigger handlerSoundTrigger = OnSoundTrigger;
  10065. if (handlerSoundTrigger != null)
  10066. {
  10067. handlerSoundTrigger(soundTriggerPacket.SoundData.SoundID, soundTriggerPacket.SoundData.OwnerID,
  10068. soundTriggerPacket.SoundData.ObjectID, soundTriggerPacket.SoundData.ParentID,
  10069. soundTriggerPacket.SoundData.Gain, soundTriggerPacket.SoundData.Position,
  10070. soundTriggerPacket.SoundData.Handle);
  10071. }
  10072. break;
  10073. case PacketType.AvatarPickerRequest:
  10074. AvatarPickerRequestPacket avRequestQuery = (AvatarPickerRequestPacket)Pack;
  10075. #region Packet Session and User Check
  10076. if (m_checkPackets)
  10077. {
  10078. if (avRequestQuery.AgentData.SessionID != SessionId ||
  10079. avRequestQuery.AgentData.AgentID != AgentId)
  10080. break;
  10081. }
  10082. #endregion
  10083. AvatarPickerRequestPacket.AgentDataBlock Requestdata = avRequestQuery.AgentData;
  10084. AvatarPickerRequestPacket.DataBlock querydata = avRequestQuery.Data;
  10085. //m_log.Debug("Agent Sends:" + Utils.BytesToString(querydata.Name));
  10086. AvatarPickerRequest handlerAvatarPickerRequest = OnAvatarPickerRequest;
  10087. if (handlerAvatarPickerRequest != null)
  10088. {
  10089. handlerAvatarPickerRequest(this, Requestdata.AgentID, Requestdata.QueryID,
  10090. Utils.BytesToString(querydata.Name));
  10091. }
  10092. break;
  10093. case PacketType.AgentDataUpdateRequest:
  10094. AgentDataUpdateRequestPacket avRequestDataUpdatePacket = (AgentDataUpdateRequestPacket)Pack;
  10095. #region Packet Session and User Check
  10096. if (m_checkPackets)
  10097. {
  10098. if (avRequestDataUpdatePacket.AgentData.SessionID != SessionId ||
  10099. avRequestDataUpdatePacket.AgentData.AgentID != AgentId)
  10100. break;
  10101. }
  10102. #endregion
  10103. FetchInventory handlerAgentDataUpdateRequest = OnAgentDataUpdateRequest;
  10104. if (handlerAgentDataUpdateRequest != null)
  10105. {
  10106. handlerAgentDataUpdateRequest(this, avRequestDataUpdatePacket.AgentData.AgentID, avRequestDataUpdatePacket.AgentData.SessionID);
  10107. }
  10108. break;
  10109. case PacketType.UserInfoRequest:
  10110. UserInfoRequest handlerUserInfoRequest = OnUserInfoRequest;
  10111. if (handlerUserInfoRequest != null)
  10112. {
  10113. handlerUserInfoRequest(this);
  10114. }
  10115. else
  10116. {
  10117. SendUserInfoReply(false, true, "");
  10118. }
  10119. break;
  10120. case PacketType.UpdateUserInfo:
  10121. UpdateUserInfoPacket updateUserInfo = (UpdateUserInfoPacket)Pack;
  10122. #region Packet Session and User Check
  10123. if (m_checkPackets)
  10124. {
  10125. if (updateUserInfo.AgentData.SessionID != SessionId ||
  10126. updateUserInfo.AgentData.AgentID != AgentId)
  10127. break;
  10128. }
  10129. #endregion
  10130. UpdateUserInfo handlerUpdateUserInfo = OnUpdateUserInfo;
  10131. if (handlerUpdateUserInfo != null)
  10132. {
  10133. bool visible = true;
  10134. string DirectoryVisibility =
  10135. Utils.BytesToString(updateUserInfo.UserData.DirectoryVisibility);
  10136. if (DirectoryVisibility == "hidden")
  10137. visible = false;
  10138. handlerUpdateUserInfo(
  10139. updateUserInfo.UserData.IMViaEMail,
  10140. visible, this);
  10141. }
  10142. break;
  10143. case PacketType.SetStartLocationRequest:
  10144. SetStartLocationRequestPacket avSetStartLocationRequestPacket = (SetStartLocationRequestPacket)Pack;
  10145. #region Packet Session and User Check
  10146. if (m_checkPackets)
  10147. {
  10148. if (avSetStartLocationRequestPacket.AgentData.SessionID != SessionId ||
  10149. avSetStartLocationRequestPacket.AgentData.AgentID != AgentId)
  10150. break;
  10151. }
  10152. #endregion
  10153. if (avSetStartLocationRequestPacket.AgentData.AgentID == AgentId && avSetStartLocationRequestPacket.AgentData.SessionID == SessionId)
  10154. {
  10155. TeleportLocationRequest handlerSetStartLocationRequest = OnSetStartLocationRequest;
  10156. if (handlerSetStartLocationRequest != null)
  10157. {
  10158. handlerSetStartLocationRequest(this, 0, avSetStartLocationRequestPacket.StartLocationData.LocationPos,
  10159. avSetStartLocationRequestPacket.StartLocationData.LocationLookAt,
  10160. avSetStartLocationRequestPacket.StartLocationData.LocationID);
  10161. }
  10162. }
  10163. break;
  10164. case PacketType.AgentThrottle:
  10165. AgentThrottlePacket atpack = (AgentThrottlePacket)Pack;
  10166. #region Packet Session and User Check
  10167. if (m_checkPackets)
  10168. {
  10169. if (atpack.AgentData.SessionID != SessionId ||
  10170. atpack.AgentData.AgentID != AgentId)
  10171. break;
  10172. }
  10173. #endregion
  10174. m_udpClient.SetThrottles(atpack.Throttle.Throttles);
  10175. break;
  10176. case PacketType.AgentPause:
  10177. m_udpClient.IsPaused = true;
  10178. break;
  10179. case PacketType.AgentResume:
  10180. m_udpClient.IsPaused = false;
  10181. SendStartPingCheck(m_udpClient.CurrentPingSequence++);
  10182. break;
  10183. case PacketType.ForceScriptControlRelease:
  10184. ForceReleaseControls handlerForceReleaseControls = OnForceReleaseControls;
  10185. if (handlerForceReleaseControls != null)
  10186. {
  10187. handlerForceReleaseControls(this, AgentId);
  10188. }
  10189. break;
  10190. #endregion
  10191. //#region Objects/m_sceneObjects
  10192. case PacketType.ObjectLink:
  10193. ObjectLinkPacket link = (ObjectLinkPacket)Pack;
  10194. #region Packet Session and User Check
  10195. if (m_checkPackets)
  10196. {
  10197. if (link.AgentData.SessionID != SessionId ||
  10198. link.AgentData.AgentID != AgentId)
  10199. break;
  10200. }
  10201. #endregion
  10202. uint parentprimid = 0;
  10203. List<uint> childrenprims = new List<uint>();
  10204. if (link.ObjectData.Length > 1)
  10205. {
  10206. parentprimid = link.ObjectData[0].ObjectLocalID;
  10207. for (int i = 1; i < link.ObjectData.Length; i++)
  10208. {
  10209. childrenprims.Add(link.ObjectData[i].ObjectLocalID);
  10210. }
  10211. }
  10212. LinkObjects handlerLinkObjects = OnLinkObjects;
  10213. if (handlerLinkObjects != null)
  10214. {
  10215. handlerLinkObjects(this, parentprimid, childrenprims);
  10216. }
  10217. break;
  10218. case PacketType.ObjectDelink:
  10219. ObjectDelinkPacket delink = (ObjectDelinkPacket)Pack;
  10220. #region Packet Session and User Check
  10221. if (m_checkPackets)
  10222. {
  10223. if (delink.AgentData.SessionID != SessionId ||
  10224. delink.AgentData.AgentID != AgentId)
  10225. break;
  10226. }
  10227. #endregion
  10228. // It appears the prim at index 0 is not always the root prim (for
  10229. // instance, when one prim of a link set has been edited independently
  10230. // of the others). Therefore, we'll pass all the ids onto the delink
  10231. // method for it to decide which is the root.
  10232. List<uint> prims = new List<uint>();
  10233. for (int i = 0; i < delink.ObjectData.Length; i++)
  10234. {
  10235. prims.Add(delink.ObjectData[i].ObjectLocalID);
  10236. }
  10237. DelinkObjects handlerDelinkObjects = OnDelinkObjects;
  10238. if (handlerDelinkObjects != null)
  10239. {
  10240. handlerDelinkObjects(prims);
  10241. }
  10242. break;
  10243. case PacketType.ObjectAdd:
  10244. if (OnAddPrim != null)
  10245. {
  10246. ObjectAddPacket addPacket = (ObjectAddPacket)Pack;
  10247. #region Packet Session and User Check
  10248. if (m_checkPackets)
  10249. {
  10250. if (addPacket.AgentData.SessionID != SessionId ||
  10251. addPacket.AgentData.AgentID != AgentId)
  10252. break;
  10253. }
  10254. #endregion
  10255. PrimitiveBaseShape shape = GetShapeFromAddPacket(addPacket);
  10256. // m_log.Info("[REZData]: " + addPacket.ToString());
  10257. //BypassRaycast: 1
  10258. //RayStart: <69.79469, 158.2652, 98.40343>
  10259. //RayEnd: <61.97724, 141.995, 92.58341>
  10260. //RayTargetID: 00000000-0000-0000-0000-000000000000
  10261. //Check to see if adding the prim is allowed; useful for any module wanting to restrict the
  10262. //object from rezing initially
  10263. AddNewPrim handlerAddPrim = OnAddPrim;
  10264. if (handlerAddPrim != null)
  10265. handlerAddPrim(AgentId, ActiveGroupId, addPacket.ObjectData.RayEnd, addPacket.ObjectData.Rotation, shape, addPacket.ObjectData.BypassRaycast, addPacket.ObjectData.RayStart, addPacket.ObjectData.RayTargetID, addPacket.ObjectData.RayEndIsIntersection);
  10266. }
  10267. break;
  10268. case PacketType.ObjectShape:
  10269. ObjectShapePacket shapePacket = (ObjectShapePacket)Pack;
  10270. #region Packet Session and User Check
  10271. if (m_checkPackets)
  10272. {
  10273. if (shapePacket.AgentData.SessionID != SessionId ||
  10274. shapePacket.AgentData.AgentID != AgentId)
  10275. break;
  10276. }
  10277. #endregion
  10278. UpdateShape handlerUpdatePrimShape = null;
  10279. for (int i = 0; i < shapePacket.ObjectData.Length; i++)
  10280. {
  10281. handlerUpdatePrimShape = OnUpdatePrimShape;
  10282. if (handlerUpdatePrimShape != null)
  10283. {
  10284. UpdateShapeArgs shapeData = new UpdateShapeArgs();
  10285. shapeData.ObjectLocalID = shapePacket.ObjectData[i].ObjectLocalID;
  10286. shapeData.PathBegin = shapePacket.ObjectData[i].PathBegin;
  10287. shapeData.PathCurve = shapePacket.ObjectData[i].PathCurve;
  10288. shapeData.PathEnd = shapePacket.ObjectData[i].PathEnd;
  10289. shapeData.PathRadiusOffset = shapePacket.ObjectData[i].PathRadiusOffset;
  10290. shapeData.PathRevolutions = shapePacket.ObjectData[i].PathRevolutions;
  10291. shapeData.PathScaleX = shapePacket.ObjectData[i].PathScaleX;
  10292. shapeData.PathScaleY = shapePacket.ObjectData[i].PathScaleY;
  10293. shapeData.PathShearX = shapePacket.ObjectData[i].PathShearX;
  10294. shapeData.PathShearY = shapePacket.ObjectData[i].PathShearY;
  10295. shapeData.PathSkew = shapePacket.ObjectData[i].PathSkew;
  10296. shapeData.PathTaperX = shapePacket.ObjectData[i].PathTaperX;
  10297. shapeData.PathTaperY = shapePacket.ObjectData[i].PathTaperY;
  10298. shapeData.PathTwist = shapePacket.ObjectData[i].PathTwist;
  10299. shapeData.PathTwistBegin = shapePacket.ObjectData[i].PathTwistBegin;
  10300. shapeData.ProfileBegin = shapePacket.ObjectData[i].ProfileBegin;
  10301. shapeData.ProfileCurve = shapePacket.ObjectData[i].ProfileCurve;
  10302. shapeData.ProfileEnd = shapePacket.ObjectData[i].ProfileEnd;
  10303. shapeData.ProfileHollow = shapePacket.ObjectData[i].ProfileHollow;
  10304. handlerUpdatePrimShape(m_agentId, shapePacket.ObjectData[i].ObjectLocalID,
  10305. shapeData);
  10306. }
  10307. }
  10308. break;
  10309. case PacketType.ObjectExtraParams:
  10310. ObjectExtraParamsPacket extraPar = (ObjectExtraParamsPacket)Pack;
  10311. #region Packet Session and User Check
  10312. if (m_checkPackets)
  10313. {
  10314. if (extraPar.AgentData.SessionID != SessionId ||
  10315. extraPar.AgentData.AgentID != AgentId)
  10316. break;
  10317. }
  10318. #endregion
  10319. ObjectExtraParams handlerUpdateExtraParams = OnUpdateExtraParams;
  10320. if (handlerUpdateExtraParams != null)
  10321. {
  10322. for (int i = 0; i < extraPar.ObjectData.Length; i++)
  10323. {
  10324. handlerUpdateExtraParams(m_agentId, extraPar.ObjectData[i].ObjectLocalID,
  10325. extraPar.ObjectData[i].ParamType,
  10326. extraPar.ObjectData[i].ParamInUse, extraPar.ObjectData[i].ParamData);
  10327. }
  10328. }
  10329. break;
  10330. case PacketType.ObjectDuplicate:
  10331. ObjectDuplicatePacket dupe = (ObjectDuplicatePacket)Pack;
  10332. #region Packet Session and User Check
  10333. if (m_checkPackets)
  10334. {
  10335. if (dupe.AgentData.SessionID != SessionId ||
  10336. dupe.AgentData.AgentID != AgentId)
  10337. break;
  10338. }
  10339. #endregion
  10340. ObjectDuplicatePacket.AgentDataBlock AgentandGroupData = dupe.AgentData;
  10341. ObjectDuplicate handlerObjectDuplicate = null;
  10342. for (int i = 0; i < dupe.ObjectData.Length; i++)
  10343. {
  10344. handlerObjectDuplicate = OnObjectDuplicate;
  10345. if (handlerObjectDuplicate != null)
  10346. {
  10347. handlerObjectDuplicate(dupe.ObjectData[i].ObjectLocalID, dupe.SharedData.Offset,
  10348. dupe.SharedData.DuplicateFlags, AgentandGroupData.AgentID,
  10349. AgentandGroupData.GroupID);
  10350. }
  10351. }
  10352. break;
  10353. case PacketType.RequestMultipleObjects:
  10354. RequestMultipleObjectsPacket incomingRequest = (RequestMultipleObjectsPacket)Pack;
  10355. #region Packet Session and User Check
  10356. if (m_checkPackets)
  10357. {
  10358. if (incomingRequest.AgentData.SessionID != SessionId ||
  10359. incomingRequest.AgentData.AgentID != AgentId)
  10360. break;
  10361. }
  10362. #endregion
  10363. ObjectRequest handlerObjectRequest = null;
  10364. for (int i = 0; i < incomingRequest.ObjectData.Length; i++)
  10365. {
  10366. handlerObjectRequest = OnObjectRequest;
  10367. if (handlerObjectRequest != null)
  10368. {
  10369. handlerObjectRequest(incomingRequest.ObjectData[i].ID, this);
  10370. }
  10371. }
  10372. break;
  10373. case PacketType.ObjectSelect:
  10374. ObjectSelectPacket incomingselect = (ObjectSelectPacket)Pack;
  10375. #region Packet Session and User Check
  10376. if (m_checkPackets)
  10377. {
  10378. if (incomingselect.AgentData.SessionID != SessionId ||
  10379. incomingselect.AgentData.AgentID != AgentId)
  10380. break;
  10381. }
  10382. #endregion
  10383. ObjectSelect handlerObjectSelect = null;
  10384. for (int i = 0; i < incomingselect.ObjectData.Length; i++)
  10385. {
  10386. handlerObjectSelect = OnObjectSelect;
  10387. if (handlerObjectSelect != null)
  10388. {
  10389. handlerObjectSelect(incomingselect.ObjectData[i].ObjectLocalID, this);
  10390. }
  10391. }
  10392. break;
  10393. case PacketType.ObjectDeselect:
  10394. ObjectDeselectPacket incomingdeselect = (ObjectDeselectPacket)Pack;
  10395. #region Packet Session and User Check
  10396. if (m_checkPackets)
  10397. {
  10398. if (incomingdeselect.AgentData.SessionID != SessionId ||
  10399. incomingdeselect.AgentData.AgentID != AgentId)
  10400. break;
  10401. }
  10402. #endregion
  10403. ObjectDeselect handlerObjectDeselect = null;
  10404. for (int i = 0; i < incomingdeselect.ObjectData.Length; i++)
  10405. {
  10406. handlerObjectDeselect = OnObjectDeselect;
  10407. if (handlerObjectDeselect != null)
  10408. {
  10409. OnObjectDeselect(incomingdeselect.ObjectData[i].ObjectLocalID, this);
  10410. }
  10411. }
  10412. break;
  10413. case PacketType.ObjectPosition:
  10414. // DEPRECATED: but till libsecondlife removes it, people will use it
  10415. ObjectPositionPacket position = (ObjectPositionPacket)Pack;
  10416. #region Packet Session and User Check
  10417. if (m_checkPackets)
  10418. {
  10419. if (position.AgentData.SessionID != SessionId ||
  10420. position.AgentData.AgentID != AgentId)
  10421. break;
  10422. }
  10423. #endregion
  10424. for (int i = 0; i < position.ObjectData.Length; i++)
  10425. {
  10426. UpdateVector handlerUpdateVector = OnUpdatePrimGroupPosition;
  10427. if (handlerUpdateVector != null)
  10428. handlerUpdateVector(position.ObjectData[i].ObjectLocalID, position.ObjectData[i].Position, this);
  10429. }
  10430. break;
  10431. case PacketType.ObjectScale:
  10432. // DEPRECATED: but till libsecondlife removes it, people will use it
  10433. ObjectScalePacket scale = (ObjectScalePacket)Pack;
  10434. #region Packet Session and User Check
  10435. if (m_checkPackets)
  10436. {
  10437. if (scale.AgentData.SessionID != SessionId ||
  10438. scale.AgentData.AgentID != AgentId)
  10439. break;
  10440. }
  10441. #endregion
  10442. for (int i = 0; i < scale.ObjectData.Length; i++)
  10443. {
  10444. UpdateVector handlerUpdatePrimGroupScale = OnUpdatePrimGroupScale;
  10445. if (handlerUpdatePrimGroupScale != null)
  10446. handlerUpdatePrimGroupScale(scale.ObjectData[i].ObjectLocalID, scale.ObjectData[i].Scale, this);
  10447. }
  10448. break;
  10449. case PacketType.ObjectRotation:
  10450. // DEPRECATED: but till libsecondlife removes it, people will use it
  10451. ObjectRotationPacket rotation = (ObjectRotationPacket)Pack;
  10452. #region Packet Session and User Check
  10453. if (m_checkPackets)
  10454. {
  10455. if (rotation.AgentData.SessionID != SessionId ||
  10456. rotation.AgentData.AgentID != AgentId)
  10457. break;
  10458. }
  10459. #endregion
  10460. for (int i = 0; i < rotation.ObjectData.Length; i++)
  10461. {
  10462. UpdatePrimRotation handlerUpdatePrimRotation = OnUpdatePrimGroupRotation;
  10463. if (handlerUpdatePrimRotation != null)
  10464. handlerUpdatePrimRotation(rotation.ObjectData[i].ObjectLocalID, rotation.ObjectData[i].Rotation, this);
  10465. }
  10466. break;
  10467. case PacketType.ObjectFlagUpdate:
  10468. ObjectFlagUpdatePacket flags = (ObjectFlagUpdatePacket)Pack;
  10469. #region Packet Session and User Check
  10470. if (m_checkPackets)
  10471. {
  10472. if (flags.AgentData.SessionID != SessionId ||
  10473. flags.AgentData.AgentID != AgentId)
  10474. break;
  10475. }
  10476. #endregion
  10477. UpdatePrimFlags handlerUpdatePrimFlags = OnUpdatePrimFlags;
  10478. if (handlerUpdatePrimFlags != null)
  10479. {
  10480. byte[] data = Pack.ToBytes();
  10481. // 46,47,48 are special positions within the packet
  10482. // This may change so perhaps we need a better way
  10483. // of storing this (OMV.FlagUpdatePacket.UsePhysics,etc?)
  10484. bool UsePhysics = (data[46] != 0) ? true : false;
  10485. bool IsTemporary = (data[47] != 0) ? true : false;
  10486. bool IsPhantom = (data[48] != 0) ? true : false;
  10487. handlerUpdatePrimFlags(flags.AgentData.ObjectLocalID, UsePhysics, IsTemporary, IsPhantom, this);
  10488. }
  10489. break;
  10490. case PacketType.ObjectImage:
  10491. ObjectImagePacket imagePack = (ObjectImagePacket)Pack;
  10492. UpdatePrimTexture handlerUpdatePrimTexture = null;
  10493. for (int i = 0; i < imagePack.ObjectData.Length; i++)
  10494. {
  10495. handlerUpdatePrimTexture = OnUpdatePrimTexture;
  10496. if (handlerUpdatePrimTexture != null)
  10497. {
  10498. handlerUpdatePrimTexture(imagePack.ObjectData[i].ObjectLocalID,
  10499. imagePack.ObjectData[i].TextureEntry, this);
  10500. }
  10501. }
  10502. break;
  10503. case PacketType.ObjectGrab:
  10504. ObjectGrabPacket grab = (ObjectGrabPacket)Pack;
  10505. #region Packet Session and User Check
  10506. if (m_checkPackets)
  10507. {
  10508. if (grab.AgentData.SessionID != SessionId ||
  10509. grab.AgentData.AgentID != AgentId)
  10510. break;
  10511. }
  10512. #endregion
  10513. GrabObject handlerGrabObject = OnGrabObject;
  10514. if (handlerGrabObject != null)
  10515. {
  10516. List<SurfaceTouchEventArgs> touchArgs = new List<SurfaceTouchEventArgs>();
  10517. if ((grab.SurfaceInfo != null) && (grab.SurfaceInfo.Length > 0))
  10518. {
  10519. foreach (ObjectGrabPacket.SurfaceInfoBlock surfaceInfo in grab.SurfaceInfo)
  10520. {
  10521. SurfaceTouchEventArgs arg = new SurfaceTouchEventArgs();
  10522. arg.Binormal = surfaceInfo.Binormal;
  10523. arg.FaceIndex = surfaceInfo.FaceIndex;
  10524. arg.Normal = surfaceInfo.Normal;
  10525. arg.Position = surfaceInfo.Position;
  10526. arg.STCoord = surfaceInfo.STCoord;
  10527. arg.UVCoord = surfaceInfo.UVCoord;
  10528. touchArgs.Add(arg);
  10529. }
  10530. }
  10531. handlerGrabObject(grab.ObjectData.LocalID, grab.ObjectData.GrabOffset, this, touchArgs);
  10532. }
  10533. break;
  10534. case PacketType.ObjectGrabUpdate:
  10535. ObjectGrabUpdatePacket grabUpdate = (ObjectGrabUpdatePacket)Pack;
  10536. #region Packet Session and User Check
  10537. if (m_checkPackets)
  10538. {
  10539. if (grabUpdate.AgentData.SessionID != SessionId ||
  10540. grabUpdate.AgentData.AgentID != AgentId)
  10541. break;
  10542. }
  10543. #endregion
  10544. MoveObject handlerGrabUpdate = OnGrabUpdate;
  10545. if (handlerGrabUpdate != null)
  10546. {
  10547. List<SurfaceTouchEventArgs> touchArgs = new List<SurfaceTouchEventArgs>();
  10548. if ((grabUpdate.SurfaceInfo != null) && (grabUpdate.SurfaceInfo.Length > 0))
  10549. {
  10550. foreach (ObjectGrabUpdatePacket.SurfaceInfoBlock surfaceInfo in grabUpdate.SurfaceInfo)
  10551. {
  10552. SurfaceTouchEventArgs arg = new SurfaceTouchEventArgs();
  10553. arg.Binormal = surfaceInfo.Binormal;
  10554. arg.FaceIndex = surfaceInfo.FaceIndex;
  10555. arg.Normal = surfaceInfo.Normal;
  10556. arg.Position = surfaceInfo.Position;
  10557. arg.STCoord = surfaceInfo.STCoord;
  10558. arg.UVCoord = surfaceInfo.UVCoord;
  10559. touchArgs.Add(arg);
  10560. }
  10561. }
  10562. handlerGrabUpdate(grabUpdate.ObjectData.ObjectID, grabUpdate.ObjectData.GrabOffsetInitial,
  10563. grabUpdate.ObjectData.GrabPosition, this, touchArgs);
  10564. }
  10565. break;
  10566. case PacketType.ObjectDeGrab:
  10567. ObjectDeGrabPacket deGrab = (ObjectDeGrabPacket)Pack;
  10568. #region Packet Session and User Check
  10569. if (m_checkPackets)
  10570. {
  10571. if (deGrab.AgentData.SessionID != SessionId ||
  10572. deGrab.AgentData.AgentID != AgentId)
  10573. break;
  10574. }
  10575. #endregion
  10576. DeGrabObject handlerDeGrabObject = OnDeGrabObject;
  10577. if (handlerDeGrabObject != null)
  10578. {
  10579. List<SurfaceTouchEventArgs> touchArgs = new List<SurfaceTouchEventArgs>();
  10580. if ((deGrab.SurfaceInfo != null) && (deGrab.SurfaceInfo.Length > 0))
  10581. {
  10582. foreach (ObjectDeGrabPacket.SurfaceInfoBlock surfaceInfo in deGrab.SurfaceInfo)
  10583. {
  10584. SurfaceTouchEventArgs arg = new SurfaceTouchEventArgs();
  10585. arg.Binormal = surfaceInfo.Binormal;
  10586. arg.FaceIndex = surfaceInfo.FaceIndex;
  10587. arg.Normal = surfaceInfo.Normal;
  10588. arg.Position = surfaceInfo.Position;
  10589. arg.STCoord = surfaceInfo.STCoord;
  10590. arg.UVCoord = surfaceInfo.UVCoord;
  10591. touchArgs.Add(arg);
  10592. }
  10593. }
  10594. handlerDeGrabObject(deGrab.ObjectData.LocalID, this, touchArgs);
  10595. }
  10596. break;
  10597. case PacketType.ObjectSpinStart:
  10598. //m_log.Warn("[CLIENT]: unhandled ObjectSpinStart packet");
  10599. ObjectSpinStartPacket spinStart = (ObjectSpinStartPacket)Pack;
  10600. #region Packet Session and User Check
  10601. if (m_checkPackets)
  10602. {
  10603. if (spinStart.AgentData.SessionID != SessionId ||
  10604. spinStart.AgentData.AgentID != AgentId)
  10605. break;
  10606. }
  10607. #endregion
  10608. SpinStart handlerSpinStart = OnSpinStart;
  10609. if (handlerSpinStart != null)
  10610. {
  10611. handlerSpinStart(spinStart.ObjectData.ObjectID, this);
  10612. }
  10613. break;
  10614. case PacketType.ObjectSpinUpdate:
  10615. //m_log.Warn("[CLIENT]: unhandled ObjectSpinUpdate packet");
  10616. ObjectSpinUpdatePacket spinUpdate = (ObjectSpinUpdatePacket)Pack;
  10617. #region Packet Session and User Check
  10618. if (m_checkPackets)
  10619. {
  10620. if (spinUpdate.AgentData.SessionID != SessionId ||
  10621. spinUpdate.AgentData.AgentID != AgentId)
  10622. break;
  10623. }
  10624. #endregion
  10625. Vector3 axis;
  10626. float angle;
  10627. spinUpdate.ObjectData.Rotation.GetAxisAngle(out axis, out angle);
  10628. //m_log.Warn("[CLIENT]: ObjectSpinUpdate packet rot axis:" + axis + " angle:" + angle);
  10629. SpinObject handlerSpinUpdate = OnSpinUpdate;
  10630. if (handlerSpinUpdate != null)
  10631. {
  10632. handlerSpinUpdate(spinUpdate.ObjectData.ObjectID, spinUpdate.ObjectData.Rotation, this);
  10633. }
  10634. break;
  10635. case PacketType.ObjectSpinStop:
  10636. //m_log.Warn("[CLIENT]: unhandled ObjectSpinStop packet");
  10637. ObjectSpinStopPacket spinStop = (ObjectSpinStopPacket)Pack;
  10638. #region Packet Session and User Check
  10639. if (m_checkPackets)
  10640. {
  10641. if (spinStop.AgentData.SessionID != SessionId ||
  10642. spinStop.AgentData.AgentID != AgentId)
  10643. break;
  10644. }
  10645. #endregion
  10646. SpinStop handlerSpinStop = OnSpinStop;
  10647. if (handlerSpinStop != null)
  10648. {
  10649. handlerSpinStop(spinStop.ObjectData.ObjectID, this);
  10650. }
  10651. break;
  10652. case PacketType.ObjectDescription:
  10653. ObjectDescriptionPacket objDes = (ObjectDescriptionPacket)Pack;
  10654. #region Packet Session and User Check
  10655. if (m_checkPackets)
  10656. {
  10657. if (objDes.AgentData.SessionID != SessionId ||
  10658. objDes.AgentData.AgentID != AgentId)
  10659. break;
  10660. }
  10661. #endregion
  10662. GenericCall7 handlerObjectDescription = null;
  10663. for (int i = 0; i < objDes.ObjectData.Length; i++)
  10664. {
  10665. handlerObjectDescription = OnObjectDescription;
  10666. if (handlerObjectDescription != null)
  10667. {
  10668. handlerObjectDescription(this, objDes.ObjectData[i].LocalID,
  10669. Util.FieldToString(objDes.ObjectData[i].Description));
  10670. }
  10671. }
  10672. break;
  10673. case PacketType.ObjectName:
  10674. ObjectNamePacket objName = (ObjectNamePacket)Pack;
  10675. #region Packet Session and User Check
  10676. if (m_checkPackets)
  10677. {
  10678. if (objName.AgentData.SessionID != SessionId ||
  10679. objName.AgentData.AgentID != AgentId)
  10680. break;
  10681. }
  10682. #endregion
  10683. GenericCall7 handlerObjectName = null;
  10684. for (int i = 0; i < objName.ObjectData.Length; i++)
  10685. {
  10686. handlerObjectName = OnObjectName;
  10687. if (handlerObjectName != null)
  10688. {
  10689. handlerObjectName(this, objName.ObjectData[i].LocalID,
  10690. Util.FieldToString(objName.ObjectData[i].Name));
  10691. }
  10692. }
  10693. break;
  10694. case PacketType.ObjectPermissions:
  10695. if (OnObjectPermissions != null)
  10696. {
  10697. ObjectPermissionsPacket newobjPerms = (ObjectPermissionsPacket)Pack;
  10698. #region Packet Session and User Check
  10699. if (m_checkPackets)
  10700. {
  10701. if (newobjPerms.AgentData.SessionID != SessionId ||
  10702. newobjPerms.AgentData.AgentID != AgentId)
  10703. break;
  10704. }
  10705. #endregion
  10706. UUID AgentID = newobjPerms.AgentData.AgentID;
  10707. UUID SessionID = newobjPerms.AgentData.SessionID;
  10708. ObjectPermissions handlerObjectPermissions = null;
  10709. for (int i = 0; i < newobjPerms.ObjectData.Length; i++)
  10710. {
  10711. ObjectPermissionsPacket.ObjectDataBlock permChanges = newobjPerms.ObjectData[i];
  10712. byte field = permChanges.Field;
  10713. uint localID = permChanges.ObjectLocalID;
  10714. uint mask = permChanges.Mask;
  10715. byte set = permChanges.Set;
  10716. handlerObjectPermissions = OnObjectPermissions;
  10717. if (handlerObjectPermissions != null)
  10718. handlerObjectPermissions(this, AgentID, SessionID, field, localID, mask, set);
  10719. }
  10720. }
  10721. // Here's our data,
  10722. // PermField contains the field the info goes into
  10723. // PermField determines which mask we're changing
  10724. //
  10725. // chmask is the mask of the change
  10726. // setTF is whether we're adding it or taking it away
  10727. //
  10728. // objLocalID is the localID of the object.
  10729. // Unfortunately, we have to pass the event the packet because objData is an array
  10730. // That means multiple object perms may be updated in a single packet.
  10731. break;
  10732. case PacketType.Undo:
  10733. UndoPacket undoitem = (UndoPacket)Pack;
  10734. #region Packet Session and User Check
  10735. if (m_checkPackets)
  10736. {
  10737. if (undoitem.AgentData.SessionID != SessionId ||
  10738. undoitem.AgentData.AgentID != AgentId)
  10739. break;
  10740. }
  10741. #endregion
  10742. if (undoitem.ObjectData.Length > 0)
  10743. {
  10744. for (int i = 0; i < undoitem.ObjectData.Length; i++)
  10745. {
  10746. UUID objiD = undoitem.ObjectData[i].ObjectID;
  10747. AgentSit handlerOnUndo = OnUndo;
  10748. if (handlerOnUndo != null)
  10749. {
  10750. handlerOnUndo(this, objiD);
  10751. }
  10752. }
  10753. }
  10754. break;
  10755. case PacketType.ObjectDuplicateOnRay:
  10756. ObjectDuplicateOnRayPacket dupeOnRay = (ObjectDuplicateOnRayPacket)Pack;
  10757. #region Packet Session and User Check
  10758. if (m_checkPackets)
  10759. {
  10760. if (dupeOnRay.AgentData.SessionID != SessionId ||
  10761. dupeOnRay.AgentData.AgentID != AgentId)
  10762. break;
  10763. }
  10764. #endregion
  10765. ObjectDuplicateOnRay handlerObjectDuplicateOnRay = null;
  10766. for (int i = 0; i < dupeOnRay.ObjectData.Length; i++)
  10767. {
  10768. handlerObjectDuplicateOnRay = OnObjectDuplicateOnRay;
  10769. if (handlerObjectDuplicateOnRay != null)
  10770. {
  10771. handlerObjectDuplicateOnRay(dupeOnRay.ObjectData[i].ObjectLocalID, dupeOnRay.AgentData.DuplicateFlags,
  10772. dupeOnRay.AgentData.AgentID, dupeOnRay.AgentData.GroupID, dupeOnRay.AgentData.RayTargetID, dupeOnRay.AgentData.RayEnd,
  10773. dupeOnRay.AgentData.RayStart, dupeOnRay.AgentData.BypassRaycast, dupeOnRay.AgentData.RayEndIsIntersection,
  10774. dupeOnRay.AgentData.CopyCenters, dupeOnRay.AgentData.CopyRotates);
  10775. }
  10776. }
  10777. break;
  10778. case PacketType.RequestObjectPropertiesFamily:
  10779. //This powers the little tooltip that appears when you move your mouse over an object
  10780. RequestObjectPropertiesFamilyPacket packToolTip = (RequestObjectPropertiesFamilyPacket)Pack;
  10781. #region Packet Session and User Check
  10782. if (m_checkPackets)
  10783. {
  10784. if (packToolTip.AgentData.SessionID != SessionId ||
  10785. packToolTip.AgentData.AgentID != AgentId)
  10786. break;
  10787. }
  10788. #endregion
  10789. RequestObjectPropertiesFamilyPacket.ObjectDataBlock packObjBlock = packToolTip.ObjectData;
  10790. RequestObjectPropertiesFamily handlerRequestObjectPropertiesFamily = OnRequestObjectPropertiesFamily;
  10791. if (handlerRequestObjectPropertiesFamily != null)
  10792. {
  10793. handlerRequestObjectPropertiesFamily(this, m_agentId, packObjBlock.RequestFlags,
  10794. packObjBlock.ObjectID);
  10795. }
  10796. break;
  10797. case PacketType.ObjectIncludeInSearch:
  10798. //This lets us set objects to appear in search (stuff like DataSnapshot, etc)
  10799. ObjectIncludeInSearchPacket packInSearch = (ObjectIncludeInSearchPacket)Pack;
  10800. ObjectIncludeInSearch handlerObjectIncludeInSearch = null;
  10801. #region Packet Session and User Check
  10802. if (m_checkPackets)
  10803. {
  10804. if (packInSearch.AgentData.SessionID != SessionId ||
  10805. packInSearch.AgentData.AgentID != AgentId)
  10806. break;
  10807. }
  10808. #endregion
  10809. foreach (ObjectIncludeInSearchPacket.ObjectDataBlock objData in packInSearch.ObjectData)
  10810. {
  10811. bool inSearch = objData.IncludeInSearch;
  10812. uint localID = objData.ObjectLocalID;
  10813. handlerObjectIncludeInSearch = OnObjectIncludeInSearch;
  10814. if (handlerObjectIncludeInSearch != null)
  10815. {
  10816. handlerObjectIncludeInSearch(this, inSearch, localID);
  10817. }
  10818. }
  10819. break;
  10820. case PacketType.ScriptAnswerYes:
  10821. ScriptAnswerYesPacket scriptAnswer = (ScriptAnswerYesPacket)Pack;
  10822. #region Packet Session and User Check
  10823. if (m_checkPackets)
  10824. {
  10825. if (scriptAnswer.AgentData.SessionID != SessionId ||
  10826. scriptAnswer.AgentData.AgentID != AgentId)
  10827. break;
  10828. }
  10829. #endregion
  10830. ScriptAnswer handlerScriptAnswer = OnScriptAnswer;
  10831. if (handlerScriptAnswer != null)
  10832. {
  10833. handlerScriptAnswer(this, scriptAnswer.Data.TaskID, scriptAnswer.Data.ItemID, scriptAnswer.Data.Questions);
  10834. }
  10835. break;
  10836. case PacketType.ObjectClickAction:
  10837. ObjectClickActionPacket ocpacket = (ObjectClickActionPacket)Pack;
  10838. #region Packet Session and User Check
  10839. if (m_checkPackets)
  10840. {
  10841. if (ocpacket.AgentData.SessionID != SessionId ||
  10842. ocpacket.AgentData.AgentID != AgentId)
  10843. break;
  10844. }
  10845. #endregion
  10846. GenericCall7 handlerObjectClickAction = OnObjectClickAction;
  10847. if (handlerObjectClickAction != null)
  10848. {
  10849. foreach (ObjectClickActionPacket.ObjectDataBlock odata in ocpacket.ObjectData)
  10850. {
  10851. byte action = odata.ClickAction;
  10852. uint localID = odata.ObjectLocalID;
  10853. handlerObjectClickAction(this, localID, action.ToString());
  10854. }
  10855. }
  10856. break;
  10857. case PacketType.ObjectMaterial:
  10858. ObjectMaterialPacket ompacket = (ObjectMaterialPacket)Pack;
  10859. #region Packet Session and User Check
  10860. if (m_checkPackets)
  10861. {
  10862. if (ompacket.AgentData.SessionID != SessionId ||
  10863. ompacket.AgentData.AgentID != AgentId)
  10864. break;
  10865. }
  10866. #endregion
  10867. GenericCall7 handlerObjectMaterial = OnObjectMaterial;
  10868. if (handlerObjectMaterial != null)
  10869. {
  10870. foreach (ObjectMaterialPacket.ObjectDataBlock odata in ompacket.ObjectData)
  10871. {
  10872. byte material = odata.Material;
  10873. uint localID = odata.ObjectLocalID;
  10874. handlerObjectMaterial(this, localID, material.ToString());
  10875. }
  10876. }
  10877. break;
  10878. //#endregion
  10879. //#region Inventory/Asset/Other related packets
  10880. case PacketType.RequestImage:
  10881. RequestImagePacket imageRequest = (RequestImagePacket)Pack;
  10882. //m_log.Debug("image request: " + Pack.ToString());
  10883. #region Packet Session and User Check
  10884. if (m_checkPackets)
  10885. {
  10886. if (imageRequest.AgentData.SessionID != SessionId ||
  10887. imageRequest.AgentData.AgentID != AgentId)
  10888. break;
  10889. }
  10890. #endregion
  10891. //handlerTextureRequest = null;
  10892. for (int i = 0; i < imageRequest.RequestImage.Length; i++)
  10893. {
  10894. if (OnRequestTexture != null)
  10895. {
  10896. TextureRequestArgs args = new TextureRequestArgs();
  10897. RequestImagePacket.RequestImageBlock block = imageRequest.RequestImage[i];
  10898. args.RequestedAssetID = block.Image;
  10899. args.DiscardLevel = block.DiscardLevel;
  10900. args.PacketNumber = block.Packet;
  10901. args.Priority = block.DownloadPriority;
  10902. args.requestSequence = imageRequest.Header.Sequence;
  10903. // NOTE: This is not a built in part of the LLUDP protocol, but we double the
  10904. // priority of avatar textures to get avatars rezzing in faster than the
  10905. // surrounding scene
  10906. if ((ImageType)block.Type == ImageType.Baked)
  10907. args.Priority *= 2.0f;
  10908. //handlerTextureRequest = OnRequestTexture;
  10909. //if (handlerTextureRequest != null)
  10910. //OnRequestTexture(this, args);
  10911. // in the end, we null this, so we have to check if it's null
  10912. if (m_imageManager != null)
  10913. {
  10914. m_imageManager.EnqueueReq(args);
  10915. }
  10916. }
  10917. }
  10918. break;
  10919. case PacketType.TransferRequest:
  10920. //m_log.Debug("ClientView.ProcessPackets.cs:ProcessInPacket() - Got transfer request");
  10921. TransferRequestPacket transfer = (TransferRequestPacket)Pack;
  10922. //m_log.Debug("Transfer Request: " + transfer.ToString());
  10923. // Validate inventory transfers
  10924. // Has to be done here, because AssetCache can't do it
  10925. //
  10926. UUID taskID = UUID.Zero;
  10927. if (transfer.TransferInfo.SourceType == 3)
  10928. {
  10929. taskID = new UUID(transfer.TransferInfo.Params, 48);
  10930. UUID itemID = new UUID(transfer.TransferInfo.Params, 64);
  10931. UUID requestID = new UUID(transfer.TransferInfo.Params, 80);
  10932. if (!(((Scene)m_scene).Permissions.BypassPermissions()))
  10933. {
  10934. if (taskID != UUID.Zero) // Prim
  10935. {
  10936. SceneObjectPart part = ((Scene)m_scene).GetSceneObjectPart(taskID);
  10937. if (part == null)
  10938. break;
  10939. if (part.OwnerID != AgentId)
  10940. break;
  10941. if ((part.OwnerMask & (uint)PermissionMask.Modify) == 0)
  10942. break;
  10943. TaskInventoryItem ti = part.Inventory.GetInventoryItem(itemID);
  10944. if (ti == null)
  10945. break;
  10946. if (ti.OwnerID != AgentId)
  10947. break;
  10948. if ((ti.CurrentPermissions & ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer)) != ((uint)PermissionMask.Modify | (uint)PermissionMask.Copy | (uint)PermissionMask.Transfer))
  10949. break;
  10950. if (ti.AssetID != requestID)
  10951. break;
  10952. }
  10953. else // Agent
  10954. {
  10955. IInventoryService invService = m_scene.RequestModuleInterface<IInventoryService>();
  10956. InventoryItemBase assetRequestItem = new InventoryItemBase(itemID, AgentId);
  10957. assetRequestItem = invService.GetItem(assetRequestItem);
  10958. if (assetRequestItem == null)
  10959. {
  10960. assetRequestItem = ((Scene)m_scene).CommsManager.UserProfileCacheService.LibraryRoot.FindItem(itemID);
  10961. if (assetRequestItem == null)
  10962. return;
  10963. }
  10964. // At this point, we need to apply perms
  10965. // only to notecards and scripts. All
  10966. // other asset types are always available
  10967. //
  10968. if (assetRequestItem.AssetType == 10)
  10969. {
  10970. if (!((Scene)m_scene).Permissions.CanViewScript(itemID, UUID.Zero, AgentId))
  10971. {
  10972. SendAgentAlertMessage("Insufficient permissions to view script", false);
  10973. break;
  10974. }
  10975. }
  10976. else if (assetRequestItem.AssetType == 7)
  10977. {
  10978. if (!((Scene)m_scene).Permissions.CanViewNotecard(itemID, UUID.Zero, AgentId))
  10979. {
  10980. SendAgentAlertMessage("Insufficient permissions to view notecard", false);
  10981. break;
  10982. }
  10983. }
  10984. if (assetRequestItem.AssetID != requestID)
  10985. break;
  10986. }
  10987. }
  10988. }
  10989. //m_assetCache.AddAssetRequest(this, transfer);
  10990. MakeAssetRequest(transfer, taskID);
  10991. // RequestAsset = OnRequestAsset;
  10992. // if (RequestAsset != null)
  10993. // {
  10994. // RequestAsset(this, transfer);
  10995. // }
  10996. break;
  10997. case PacketType.AssetUploadRequest:
  10998. AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack;
  10999. // m_log.Debug("upload request " + request.ToString());
  11000. // m_log.Debug("upload request was for assetid: " + request.AssetBlock.TransactionID.Combine(this.SecureSessionId).ToString());
  11001. UUID temp = UUID.Combine(request.AssetBlock.TransactionID, SecureSessionId);
  11002. UDPAssetUploadRequest handlerAssetUploadRequest = OnAssetUploadRequest;
  11003. if (handlerAssetUploadRequest != null)
  11004. {
  11005. handlerAssetUploadRequest(this, temp,
  11006. request.AssetBlock.TransactionID, request.AssetBlock.Type,
  11007. request.AssetBlock.AssetData, request.AssetBlock.StoreLocal,
  11008. request.AssetBlock.Tempfile);
  11009. }
  11010. break;
  11011. case PacketType.RequestXfer:
  11012. RequestXferPacket xferReq = (RequestXferPacket)Pack;
  11013. RequestXfer handlerRequestXfer = OnRequestXfer;
  11014. if (handlerRequestXfer != null)
  11015. {
  11016. handlerRequestXfer(this, xferReq.XferID.ID, Util.FieldToString(xferReq.XferID.Filename));
  11017. }
  11018. break;
  11019. case PacketType.SendXferPacket:
  11020. SendXferPacketPacket xferRec = (SendXferPacketPacket)Pack;
  11021. XferReceive handlerXferReceive = OnXferReceive;
  11022. if (handlerXferReceive != null)
  11023. {
  11024. handlerXferReceive(this, xferRec.XferID.ID, xferRec.XferID.Packet, xferRec.DataPacket.Data);
  11025. }
  11026. break;
  11027. case PacketType.ConfirmXferPacket:
  11028. ConfirmXferPacketPacket confirmXfer = (ConfirmXferPacketPacket)Pack;
  11029. ConfirmXfer handlerConfirmXfer = OnConfirmXfer;
  11030. if (handlerConfirmXfer != null)
  11031. {
  11032. handlerConfirmXfer(this, confirmXfer.XferID.ID, confirmXfer.XferID.Packet);
  11033. }
  11034. break;
  11035. case PacketType.AbortXfer:
  11036. AbortXferPacket abortXfer = (AbortXferPacket)Pack;
  11037. AbortXfer handlerAbortXfer = OnAbortXfer;
  11038. if (handlerAbortXfer != null)
  11039. {
  11040. handlerAbortXfer(this, abortXfer.XferID.ID);
  11041. }
  11042. break;
  11043. case PacketType.CreateInventoryFolder:
  11044. CreateInventoryFolderPacket invFolder = (CreateInventoryFolderPacket)Pack;
  11045. #region Packet Session and User Check
  11046. if (m_checkPackets)
  11047. {
  11048. if (invFolder.AgentData.SessionID != SessionId ||
  11049. invFolder.AgentData.AgentID != AgentId)
  11050. break;
  11051. }
  11052. #endregion
  11053. CreateInventoryFolder handlerCreateInventoryFolder = OnCreateNewInventoryFolder;
  11054. if (handlerCreateInventoryFolder != null)
  11055. {
  11056. handlerCreateInventoryFolder(this, invFolder.FolderData.FolderID,
  11057. (ushort)invFolder.FolderData.Type,
  11058. Util.FieldToString(invFolder.FolderData.Name),
  11059. invFolder.FolderData.ParentID);
  11060. }
  11061. break;
  11062. case PacketType.UpdateInventoryFolder:
  11063. if (OnUpdateInventoryFolder != null)
  11064. {
  11065. UpdateInventoryFolderPacket invFolderx = (UpdateInventoryFolderPacket)Pack;
  11066. #region Packet Session and User Check
  11067. if (m_checkPackets)
  11068. {
  11069. if (invFolderx.AgentData.SessionID != SessionId ||
  11070. invFolderx.AgentData.AgentID != AgentId)
  11071. break;
  11072. }
  11073. #endregion
  11074. UpdateInventoryFolder handlerUpdateInventoryFolder = null;
  11075. for (int i = 0; i < invFolderx.FolderData.Length; i++)
  11076. {
  11077. handlerUpdateInventoryFolder = OnUpdateInventoryFolder;
  11078. if (handlerUpdateInventoryFolder != null)
  11079. {
  11080. OnUpdateInventoryFolder(this, invFolderx.FolderData[i].FolderID,
  11081. (ushort)invFolderx.FolderData[i].Type,
  11082. Util.FieldToString(invFolderx.FolderData[i].Name),
  11083. invFolderx.FolderData[i].ParentID);
  11084. }
  11085. }
  11086. }
  11087. break;
  11088. case PacketType.MoveInventoryFolder:
  11089. if (OnMoveInventoryFolder != null)
  11090. {
  11091. MoveInventoryFolderPacket invFoldery = (MoveInventoryFolderPacket)Pack;
  11092. #region Packet Session and User Check
  11093. if (m_checkPackets)
  11094. {
  11095. if (invFoldery.AgentData.SessionID != SessionId ||
  11096. invFoldery.AgentData.AgentID != AgentId)
  11097. break;
  11098. }
  11099. #endregion
  11100. MoveInventoryFolder handlerMoveInventoryFolder = null;
  11101. for (int i = 0; i < invFoldery.InventoryData.Length; i++)
  11102. {
  11103. handlerMoveInventoryFolder = OnMoveInventoryFolder;
  11104. if (handlerMoveInventoryFolder != null)
  11105. {
  11106. OnMoveInventoryFolder(this, invFoldery.InventoryData[i].FolderID,
  11107. invFoldery.InventoryData[i].ParentID);
  11108. }
  11109. }
  11110. }
  11111. break;
  11112. case PacketType.CreateInventoryItem:
  11113. CreateInventoryItemPacket createItem = (CreateInventoryItemPacket)Pack;
  11114. #region Packet Session and User Check
  11115. if (m_checkPackets)
  11116. {
  11117. if (createItem.AgentData.SessionID != SessionId ||
  11118. createItem.AgentData.AgentID != AgentId)
  11119. break;
  11120. }
  11121. #endregion
  11122. CreateNewInventoryItem handlerCreateNewInventoryItem = OnCreateNewInventoryItem;
  11123. if (handlerCreateNewInventoryItem != null)
  11124. {
  11125. handlerCreateNewInventoryItem(this, createItem.InventoryBlock.TransactionID,
  11126. createItem.InventoryBlock.FolderID,
  11127. createItem.InventoryBlock.CallbackID,
  11128. Util.FieldToString(createItem.InventoryBlock.Description),
  11129. Util.FieldToString(createItem.InventoryBlock.Name),
  11130. createItem.InventoryBlock.InvType,
  11131. createItem.InventoryBlock.Type,
  11132. createItem.InventoryBlock.WearableType,
  11133. createItem.InventoryBlock.NextOwnerMask,
  11134. Util.UnixTimeSinceEpoch());
  11135. }
  11136. break;
  11137. case PacketType.FetchInventory:
  11138. if (OnFetchInventory != null)
  11139. {
  11140. FetchInventoryPacket FetchInventoryx = (FetchInventoryPacket)Pack;
  11141. #region Packet Session and User Check
  11142. if (m_checkPackets)
  11143. {
  11144. if (FetchInventoryx.AgentData.SessionID != SessionId ||
  11145. FetchInventoryx.AgentData.AgentID != AgentId)
  11146. break;
  11147. }
  11148. #endregion
  11149. FetchInventory handlerFetchInventory = null;
  11150. for (int i = 0; i < FetchInventoryx.InventoryData.Length; i++)
  11151. {
  11152. handlerFetchInventory = OnFetchInventory;
  11153. if (handlerFetchInventory != null)
  11154. {
  11155. OnFetchInventory(this, FetchInventoryx.InventoryData[i].ItemID,
  11156. FetchInventoryx.InventoryData[i].OwnerID);
  11157. }
  11158. }
  11159. }
  11160. break;
  11161. case PacketType.FetchInventoryDescendents:
  11162. FetchInventoryDescendentsPacket Fetch = (FetchInventoryDescendentsPacket)Pack;
  11163. #region Packet Session and User Check
  11164. if (m_checkPackets)
  11165. {
  11166. if (Fetch.AgentData.SessionID != SessionId ||
  11167. Fetch.AgentData.AgentID != AgentId)
  11168. break;
  11169. }
  11170. #endregion
  11171. FetchInventoryDescendents handlerFetchInventoryDescendents = OnFetchInventoryDescendents;
  11172. if (handlerFetchInventoryDescendents != null)
  11173. {
  11174. handlerFetchInventoryDescendents(this, Fetch.InventoryData.FolderID, Fetch.InventoryData.OwnerID,
  11175. Fetch.InventoryData.FetchFolders, Fetch.InventoryData.FetchItems,
  11176. Fetch.InventoryData.SortOrder);
  11177. }
  11178. break;
  11179. case PacketType.PurgeInventoryDescendents:
  11180. PurgeInventoryDescendentsPacket Purge = (PurgeInventoryDescendentsPacket)Pack;
  11181. #region Packet Session and User Check
  11182. if (m_checkPackets)
  11183. {
  11184. if (Purge.AgentData.SessionID != SessionId ||
  11185. Purge.AgentData.AgentID != AgentId)
  11186. break;
  11187. }
  11188. #endregion
  11189. PurgeInventoryDescendents handlerPurgeInventoryDescendents = OnPurgeInventoryDescendents;
  11190. if (handlerPurgeInventoryDescendents != null)
  11191. {
  11192. handlerPurgeInventoryDescendents(this, Purge.InventoryData.FolderID);
  11193. }
  11194. break;
  11195. case PacketType.UpdateInventoryItem:
  11196. UpdateInventoryItemPacket inventoryItemUpdate = (UpdateInventoryItemPacket)Pack;
  11197. #region Packet Session and User Check
  11198. if (m_checkPackets)
  11199. {
  11200. if (inventoryItemUpdate.AgentData.SessionID != SessionId ||
  11201. inventoryItemUpdate.AgentData.AgentID != AgentId)
  11202. break;
  11203. }
  11204. #endregion
  11205. if (OnUpdateInventoryItem != null)
  11206. {
  11207. UpdateInventoryItem handlerUpdateInventoryItem = null;
  11208. for (int i = 0; i < inventoryItemUpdate.InventoryData.Length; i++)
  11209. {
  11210. handlerUpdateInventoryItem = OnUpdateInventoryItem;
  11211. if (handlerUpdateInventoryItem != null)
  11212. {
  11213. InventoryItemBase itemUpd = new InventoryItemBase();
  11214. itemUpd.ID = inventoryItemUpdate.InventoryData[i].ItemID;
  11215. itemUpd.Name = Util.FieldToString(inventoryItemUpdate.InventoryData[i].Name);
  11216. itemUpd.Description = Util.FieldToString(inventoryItemUpdate.InventoryData[i].Description);
  11217. itemUpd.GroupID = inventoryItemUpdate.InventoryData[i].GroupID;
  11218. itemUpd.GroupOwned = inventoryItemUpdate.InventoryData[i].GroupOwned;
  11219. itemUpd.GroupPermissions = inventoryItemUpdate.InventoryData[i].GroupMask;
  11220. itemUpd.NextPermissions = inventoryItemUpdate.InventoryData[i].NextOwnerMask;
  11221. itemUpd.EveryOnePermissions = inventoryItemUpdate.InventoryData[i].EveryoneMask;
  11222. itemUpd.CreationDate = inventoryItemUpdate.InventoryData[i].CreationDate;
  11223. itemUpd.Folder = inventoryItemUpdate.InventoryData[i].FolderID;
  11224. itemUpd.InvType = inventoryItemUpdate.InventoryData[i].InvType;
  11225. itemUpd.SalePrice = inventoryItemUpdate.InventoryData[i].SalePrice;
  11226. itemUpd.SaleType = inventoryItemUpdate.InventoryData[i].SaleType;
  11227. itemUpd.Flags = inventoryItemUpdate.InventoryData[i].Flags;
  11228. OnUpdateInventoryItem(this, inventoryItemUpdate.InventoryData[i].TransactionID,
  11229. inventoryItemUpdate.InventoryData[i].ItemID,
  11230. itemUpd);
  11231. }
  11232. }
  11233. }
  11234. break;
  11235. case PacketType.CopyInventoryItem:
  11236. CopyInventoryItemPacket copyitem = (CopyInventoryItemPacket)Pack;
  11237. #region Packet Session and User Check
  11238. if (m_checkPackets)
  11239. {
  11240. if (copyitem.AgentData.SessionID != SessionId ||
  11241. copyitem.AgentData.AgentID != AgentId)
  11242. break;
  11243. }
  11244. #endregion
  11245. CopyInventoryItem handlerCopyInventoryItem = null;
  11246. if (OnCopyInventoryItem != null)
  11247. {
  11248. foreach (CopyInventoryItemPacket.InventoryDataBlock datablock in copyitem.InventoryData)
  11249. {
  11250. handlerCopyInventoryItem = OnCopyInventoryItem;
  11251. if (handlerCopyInventoryItem != null)
  11252. {
  11253. handlerCopyInventoryItem(this, datablock.CallbackID, datablock.OldAgentID,
  11254. datablock.OldItemID, datablock.NewFolderID,
  11255. Util.FieldToString(datablock.NewName));
  11256. }
  11257. }
  11258. }
  11259. break;
  11260. case PacketType.MoveInventoryItem:
  11261. MoveInventoryItemPacket moveitem = (MoveInventoryItemPacket)Pack;
  11262. #region Packet Session and User Check
  11263. if (m_checkPackets)
  11264. {
  11265. if (moveitem.AgentData.SessionID != SessionId ||
  11266. moveitem.AgentData.AgentID != AgentId)
  11267. break;
  11268. }
  11269. #endregion
  11270. if (OnMoveInventoryItem != null)
  11271. {
  11272. MoveInventoryItem handlerMoveInventoryItem = null;
  11273. InventoryItemBase itm = null;
  11274. List<InventoryItemBase> items = new List<InventoryItemBase>();
  11275. foreach (MoveInventoryItemPacket.InventoryDataBlock datablock in moveitem.InventoryData)
  11276. {
  11277. itm = new InventoryItemBase(datablock.ItemID, AgentId);
  11278. itm.Folder = datablock.FolderID;
  11279. itm.Name = Util.FieldToString(datablock.NewName);
  11280. // weird, comes out as empty string
  11281. //m_log.DebugFormat("[XXX] new name: {0}", itm.Name);
  11282. items.Add(itm);
  11283. }
  11284. handlerMoveInventoryItem = OnMoveInventoryItem;
  11285. if (handlerMoveInventoryItem != null)
  11286. {
  11287. handlerMoveInventoryItem(this, items);
  11288. }
  11289. }
  11290. break;
  11291. case PacketType.RemoveInventoryItem:
  11292. RemoveInventoryItemPacket removeItem = (RemoveInventoryItemPacket)Pack;
  11293. #region Packet Session and User Check
  11294. if (m_checkPackets)
  11295. {
  11296. if (removeItem.AgentData.SessionID != SessionId ||
  11297. removeItem.AgentData.AgentID != AgentId)
  11298. break;
  11299. }
  11300. #endregion
  11301. if (OnRemoveInventoryItem != null)
  11302. {
  11303. RemoveInventoryItem handlerRemoveInventoryItem = null;
  11304. List<UUID> uuids = new List<UUID>();
  11305. foreach (RemoveInventoryItemPacket.InventoryDataBlock datablock in removeItem.InventoryData)
  11306. {
  11307. uuids.Add(datablock.ItemID);
  11308. }
  11309. handlerRemoveInventoryItem = OnRemoveInventoryItem;
  11310. if (handlerRemoveInventoryItem != null)
  11311. {
  11312. handlerRemoveInventoryItem(this, uuids);
  11313. }
  11314. }
  11315. break;
  11316. case PacketType.RemoveInventoryFolder:
  11317. RemoveInventoryFolderPacket removeFolder = (RemoveInventoryFolderPacket)Pack;
  11318. #region Packet Session and User Check
  11319. if (m_checkPackets)
  11320. {
  11321. if (removeFolder.AgentData.SessionID != SessionId ||
  11322. removeFolder.AgentData.AgentID != AgentId)
  11323. break;
  11324. }
  11325. #endregion
  11326. if (OnRemoveInventoryFolder != null)
  11327. {
  11328. RemoveInventoryFolder handlerRemoveInventoryFolder = null;
  11329. List<UUID> uuids = new List<UUID>();
  11330. foreach (RemoveInventoryFolderPacket.FolderDataBlock datablock in removeFolder.FolderData)
  11331. {
  11332. uuids.Add(datablock.FolderID);
  11333. }
  11334. handlerRemoveInventoryFolder = OnRemoveInventoryFolder;
  11335. if (handlerRemoveInventoryFolder != null)
  11336. {
  11337. handlerRemoveInventoryFolder(this, uuids);
  11338. }
  11339. }
  11340. break;
  11341. case PacketType.RemoveInventoryObjects:
  11342. RemoveInventoryObjectsPacket removeObject = (RemoveInventoryObjectsPacket)Pack;
  11343. #region Packet Session and User Check
  11344. if (m_checkPackets)
  11345. {
  11346. if (removeObject.AgentData.SessionID != SessionId ||
  11347. removeObject.AgentData.AgentID != AgentId)
  11348. break;
  11349. }
  11350. #endregion
  11351. if (OnRemoveInventoryFolder != null)
  11352. {
  11353. RemoveInventoryFolder handlerRemoveInventoryFolder = null;
  11354. List<UUID> uuids = new List<UUID>();
  11355. foreach (RemoveInventoryObjectsPacket.FolderDataBlock datablock in removeObject.FolderData)
  11356. {
  11357. uuids.Add(datablock.FolderID);
  11358. }
  11359. handlerRemoveInventoryFolder = OnRemoveInventoryFolder;
  11360. if (handlerRemoveInventoryFolder != null)
  11361. {
  11362. handlerRemoveInventoryFolder(this, uuids);
  11363. }
  11364. }
  11365. if (OnRemoveInventoryItem != null)
  11366. {
  11367. RemoveInventoryItem handlerRemoveInventoryItem = null;
  11368. List<UUID> uuids = new List<UUID>();
  11369. foreach (RemoveInventoryObjectsPacket.ItemDataBlock datablock in removeObject.ItemData)
  11370. {
  11371. uuids.Add(datablock.ItemID);
  11372. }
  11373. handlerRemoveInventoryItem = OnRemoveInventoryItem;
  11374. if (handlerRemoveInventoryItem != null)
  11375. {
  11376. handlerRemoveInventoryItem(this, uuids);
  11377. }
  11378. }
  11379. break;
  11380. case PacketType.RequestTaskInventory:
  11381. RequestTaskInventoryPacket requesttask = (RequestTaskInventoryPacket)Pack;
  11382. #region Packet Session and User Check
  11383. if (m_checkPackets)
  11384. {
  11385. if (requesttask.AgentData.SessionID != SessionId ||
  11386. requesttask.AgentData.AgentID != AgentId)
  11387. break;
  11388. }
  11389. #endregion
  11390. RequestTaskInventory handlerRequestTaskInventory = OnRequestTaskInventory;
  11391. if (handlerRequestTaskInventory != null)
  11392. {
  11393. handlerRequestTaskInventory(this, requesttask.InventoryData.LocalID);
  11394. }
  11395. break;
  11396. case PacketType.UpdateTaskInventory:
  11397. UpdateTaskInventoryPacket updatetask = (UpdateTaskInventoryPacket)Pack;
  11398. #region Packet Session and User Check
  11399. if (m_checkPackets)
  11400. {
  11401. if (updatetask.AgentData.SessionID != SessionId ||
  11402. updatetask.AgentData.AgentID != AgentId)
  11403. break;
  11404. }
  11405. #endregion
  11406. if (OnUpdateTaskInventory != null)
  11407. {
  11408. if (updatetask.UpdateData.Key == 0)
  11409. {
  11410. UpdateTaskInventory handlerUpdateTaskInventory = OnUpdateTaskInventory;
  11411. if (handlerUpdateTaskInventory != null)
  11412. {
  11413. TaskInventoryItem newTaskItem = new TaskInventoryItem();
  11414. newTaskItem.ItemID = updatetask.InventoryData.ItemID;
  11415. newTaskItem.ParentID = updatetask.InventoryData.FolderID;
  11416. newTaskItem.CreatorID = updatetask.InventoryData.CreatorID;
  11417. newTaskItem.OwnerID = updatetask.InventoryData.OwnerID;
  11418. newTaskItem.GroupID = updatetask.InventoryData.GroupID;
  11419. newTaskItem.BasePermissions = updatetask.InventoryData.BaseMask;
  11420. newTaskItem.CurrentPermissions = updatetask.InventoryData.OwnerMask;
  11421. newTaskItem.GroupPermissions = updatetask.InventoryData.GroupMask;
  11422. newTaskItem.EveryonePermissions = updatetask.InventoryData.EveryoneMask;
  11423. newTaskItem.NextPermissions = updatetask.InventoryData.NextOwnerMask;
  11424. //newTaskItem.GroupOwned=updatetask.InventoryData.GroupOwned;
  11425. newTaskItem.Type = updatetask.InventoryData.Type;
  11426. newTaskItem.InvType = updatetask.InventoryData.InvType;
  11427. newTaskItem.Flags = updatetask.InventoryData.Flags;
  11428. //newTaskItem.SaleType=updatetask.InventoryData.SaleType;
  11429. //newTaskItem.SalePrice=updatetask.InventoryData.SalePrice;;
  11430. newTaskItem.Name = Util.FieldToString(updatetask.InventoryData.Name);
  11431. newTaskItem.Description = Util.FieldToString(updatetask.InventoryData.Description);
  11432. newTaskItem.CreationDate = (uint)updatetask.InventoryData.CreationDate;
  11433. handlerUpdateTaskInventory(this, updatetask.InventoryData.TransactionID,
  11434. newTaskItem, updatetask.UpdateData.LocalID);
  11435. }
  11436. }
  11437. }
  11438. break;
  11439. case PacketType.RemoveTaskInventory:
  11440. RemoveTaskInventoryPacket removeTask = (RemoveTaskInventoryPacket)Pack;
  11441. #region Packet Session and User Check
  11442. if (m_checkPackets)
  11443. {
  11444. if (removeTask.AgentData.SessionID != SessionId ||
  11445. removeTask.AgentData.AgentID != AgentId)
  11446. break;
  11447. }
  11448. #endregion
  11449. RemoveTaskInventory handlerRemoveTaskItem = OnRemoveTaskItem;
  11450. if (handlerRemoveTaskItem != null)
  11451. {
  11452. handlerRemoveTaskItem(this, removeTask.InventoryData.ItemID, removeTask.InventoryData.LocalID);
  11453. }
  11454. break;
  11455. case PacketType.MoveTaskInventory:
  11456. MoveTaskInventoryPacket moveTaskInventoryPacket = (MoveTaskInventoryPacket)Pack;
  11457. #region Packet Session and User Check
  11458. if (m_checkPackets)
  11459. {
  11460. if (moveTaskInventoryPacket.AgentData.SessionID != SessionId ||
  11461. moveTaskInventoryPacket.AgentData.AgentID != AgentId)
  11462. break;
  11463. }
  11464. #endregion
  11465. MoveTaskInventory handlerMoveTaskItem = OnMoveTaskItem;
  11466. if (handlerMoveTaskItem != null)
  11467. {
  11468. handlerMoveTaskItem(
  11469. this, moveTaskInventoryPacket.AgentData.FolderID,
  11470. moveTaskInventoryPacket.InventoryData.LocalID,
  11471. moveTaskInventoryPacket.InventoryData.ItemID);
  11472. }
  11473. break;
  11474. case PacketType.RezScript:
  11475. //m_log.Debug(Pack.ToString());
  11476. RezScriptPacket rezScriptx = (RezScriptPacket)Pack;
  11477. #region Packet Session and User Check
  11478. if (m_checkPackets)
  11479. {
  11480. if (rezScriptx.AgentData.SessionID != SessionId ||
  11481. rezScriptx.AgentData.AgentID != AgentId)
  11482. break;
  11483. }
  11484. #endregion
  11485. RezScript handlerRezScript = OnRezScript;
  11486. InventoryItemBase item = new InventoryItemBase();
  11487. item.ID = rezScriptx.InventoryBlock.ItemID;
  11488. item.Folder = rezScriptx.InventoryBlock.FolderID;
  11489. item.CreatorId = rezScriptx.InventoryBlock.CreatorID.ToString();
  11490. item.Owner = rezScriptx.InventoryBlock.OwnerID;
  11491. item.BasePermissions = rezScriptx.InventoryBlock.BaseMask;
  11492. item.CurrentPermissions = rezScriptx.InventoryBlock.OwnerMask;
  11493. item.EveryOnePermissions = rezScriptx.InventoryBlock.EveryoneMask;
  11494. item.NextPermissions = rezScriptx.InventoryBlock.NextOwnerMask;
  11495. item.GroupPermissions = rezScriptx.InventoryBlock.GroupMask;
  11496. item.GroupOwned = rezScriptx.InventoryBlock.GroupOwned;
  11497. item.GroupID = rezScriptx.InventoryBlock.GroupID;
  11498. item.AssetType = rezScriptx.InventoryBlock.Type;
  11499. item.InvType = rezScriptx.InventoryBlock.InvType;
  11500. item.Flags = rezScriptx.InventoryBlock.Flags;
  11501. item.SaleType = rezScriptx.InventoryBlock.SaleType;
  11502. item.SalePrice = rezScriptx.InventoryBlock.SalePrice;
  11503. item.Name = Util.FieldToString(rezScriptx.InventoryBlock.Name);
  11504. item.Description = Util.FieldToString(rezScriptx.InventoryBlock.Description);
  11505. item.CreationDate = rezScriptx.InventoryBlock.CreationDate;
  11506. if (handlerRezScript != null)
  11507. {
  11508. handlerRezScript(this, item, rezScriptx.InventoryBlock.TransactionID, rezScriptx.UpdateBlock.ObjectLocalID);
  11509. }
  11510. break;
  11511. case PacketType.MapLayerRequest:
  11512. RequestMapLayer();
  11513. break;
  11514. case PacketType.MapBlockRequest:
  11515. MapBlockRequestPacket MapRequest = (MapBlockRequestPacket)Pack;
  11516. #region Packet Session and User Check
  11517. if (m_checkPackets)
  11518. {
  11519. if (MapRequest.AgentData.SessionID != SessionId ||
  11520. MapRequest.AgentData.AgentID != AgentId)
  11521. break;
  11522. }
  11523. #endregion
  11524. RequestMapBlocks handlerRequestMapBlocks = OnRequestMapBlocks;
  11525. if (handlerRequestMapBlocks != null)
  11526. {
  11527. handlerRequestMapBlocks(this, MapRequest.PositionData.MinX, MapRequest.PositionData.MinY,
  11528. MapRequest.PositionData.MaxX, MapRequest.PositionData.MaxY, MapRequest.AgentData.Flags);
  11529. }
  11530. break;
  11531. case PacketType.MapNameRequest:
  11532. MapNameRequestPacket map = (MapNameRequestPacket)Pack;
  11533. #region Packet Session and User Check
  11534. if (m_checkPackets)
  11535. {
  11536. if (map.AgentData.SessionID != SessionId ||
  11537. map.AgentData.AgentID != AgentId)
  11538. break;
  11539. }
  11540. #endregion
  11541. string mapName = Util.UTF8.GetString(map.NameData.Name, 0,
  11542. map.NameData.Name.Length - 1);
  11543. RequestMapName handlerMapNameRequest = OnMapNameRequest;
  11544. if (handlerMapNameRequest != null)
  11545. {
  11546. handlerMapNameRequest(this, mapName);
  11547. }
  11548. break;
  11549. case PacketType.TeleportLandmarkRequest:
  11550. TeleportLandmarkRequestPacket tpReq = (TeleportLandmarkRequestPacket)Pack;
  11551. #region Packet Session and User Check
  11552. if (m_checkPackets)
  11553. {
  11554. if (tpReq.Info.SessionID != SessionId ||
  11555. tpReq.Info.AgentID != AgentId)
  11556. break;
  11557. }
  11558. #endregion
  11559. UUID lmid = tpReq.Info.LandmarkID;
  11560. AssetLandmark lm;
  11561. if (lmid != UUID.Zero)
  11562. {
  11563. //AssetBase lma = m_assetCache.GetAsset(lmid, false);
  11564. AssetBase lma = m_assetService.Get(lmid.ToString());
  11565. if (lma == null)
  11566. {
  11567. // Failed to find landmark
  11568. TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
  11569. tpCancel.Info.SessionID = tpReq.Info.SessionID;
  11570. tpCancel.Info.AgentID = tpReq.Info.AgentID;
  11571. OutPacket(tpCancel, ThrottleOutPacketType.Task);
  11572. }
  11573. try
  11574. {
  11575. lm = new AssetLandmark(lma);
  11576. }
  11577. catch (NullReferenceException)
  11578. {
  11579. // asset not found generates null ref inside the assetlandmark constructor.
  11580. TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
  11581. tpCancel.Info.SessionID = tpReq.Info.SessionID;
  11582. tpCancel.Info.AgentID = tpReq.Info.AgentID;
  11583. OutPacket(tpCancel, ThrottleOutPacketType.Task);
  11584. break;
  11585. }
  11586. }
  11587. else
  11588. {
  11589. // Teleport home request
  11590. UUIDNameRequest handlerTeleportHomeRequest = OnTeleportHomeRequest;
  11591. if (handlerTeleportHomeRequest != null)
  11592. {
  11593. handlerTeleportHomeRequest(AgentId, this);
  11594. }
  11595. break;
  11596. }
  11597. TeleportLandmarkRequest handlerTeleportLandmarkRequest = OnTeleportLandmarkRequest;
  11598. if (handlerTeleportLandmarkRequest != null)
  11599. {
  11600. handlerTeleportLandmarkRequest(this, lm.RegionID, lm.Position);
  11601. }
  11602. else
  11603. {
  11604. //no event handler so cancel request
  11605. TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
  11606. tpCancel.Info.AgentID = tpReq.Info.AgentID;
  11607. tpCancel.Info.SessionID = tpReq.Info.SessionID;
  11608. OutPacket(tpCancel, ThrottleOutPacketType.Task);
  11609. }
  11610. break;
  11611. case PacketType.TeleportLocationRequest:
  11612. TeleportLocationRequestPacket tpLocReq = (TeleportLocationRequestPacket)Pack;
  11613. // m_log.Debug(tpLocReq.ToString());
  11614. #region Packet Session and User Check
  11615. if (m_checkPackets)
  11616. {
  11617. if (tpLocReq.AgentData.SessionID != SessionId ||
  11618. tpLocReq.AgentData.AgentID != AgentId)
  11619. break;
  11620. }
  11621. #endregion
  11622. TeleportLocationRequest handlerTeleportLocationRequest = OnTeleportLocationRequest;
  11623. if (handlerTeleportLocationRequest != null)
  11624. {
  11625. handlerTeleportLocationRequest(this, tpLocReq.Info.RegionHandle, tpLocReq.Info.Position,
  11626. tpLocReq.Info.LookAt, 16);
  11627. }
  11628. else
  11629. {
  11630. //no event handler so cancel request
  11631. TeleportCancelPacket tpCancel = (TeleportCancelPacket)PacketPool.Instance.GetPacket(PacketType.TeleportCancel);
  11632. tpCancel.Info.SessionID = tpLocReq.AgentData.SessionID;
  11633. tpCancel.Info.AgentID = tpLocReq.AgentData.AgentID;
  11634. OutPacket(tpCancel, ThrottleOutPacketType.Task);
  11635. }
  11636. break;
  11637. //#endregion
  11638. case PacketType.UUIDNameRequest:
  11639. UUIDNameRequestPacket incoming = (UUIDNameRequestPacket)Pack;
  11640. foreach (UUIDNameRequestPacket.UUIDNameBlockBlock UUIDBlock in incoming.UUIDNameBlock)
  11641. {
  11642. UUIDNameRequest handlerNameRequest = OnNameFromUUIDRequest;
  11643. if (handlerNameRequest != null)
  11644. {
  11645. handlerNameRequest(UUIDBlock.ID, this);
  11646. }
  11647. }
  11648. break;
  11649. //#region Parcel related packets
  11650. case PacketType.RegionHandleRequest:
  11651. RegionHandleRequestPacket rhrPack = (RegionHandleRequestPacket)Pack;
  11652. RegionHandleRequest handlerRegionHandleRequest = OnRegionHandleRequest;
  11653. if (handlerRegionHandleRequest != null)
  11654. {
  11655. handlerRegionHandleRequest(this, rhrPack.RequestBlock.RegionID);
  11656. }
  11657. break;
  11658. case PacketType.ParcelInfoRequest:
  11659. ParcelInfoRequestPacket pirPack = (ParcelInfoRequestPacket)Pack;
  11660. #region Packet Session and User Check
  11661. if (m_checkPackets)
  11662. {
  11663. if (pirPack.AgentData.SessionID != SessionId ||
  11664. pirPack.AgentData.AgentID != AgentId)
  11665. break;
  11666. }
  11667. #endregion
  11668. ParcelInfoRequest handlerParcelInfoRequest = OnParcelInfoRequest;
  11669. if (handlerParcelInfoRequest != null)
  11670. {
  11671. handlerParcelInfoRequest(this, pirPack.Data.ParcelID);
  11672. }
  11673. break;
  11674. case PacketType.ParcelAccessListRequest:
  11675. ParcelAccessListRequestPacket requestPacket = (ParcelAccessListRequestPacket)Pack;
  11676. #region Packet Session and User Check
  11677. if (m_checkPackets)
  11678. {
  11679. if (requestPacket.AgentData.SessionID != SessionId ||
  11680. requestPacket.AgentData.AgentID != AgentId)
  11681. break;
  11682. }
  11683. #endregion
  11684. ParcelAccessListRequest handlerParcelAccessListRequest = OnParcelAccessListRequest;
  11685. if (handlerParcelAccessListRequest != null)
  11686. {
  11687. handlerParcelAccessListRequest(requestPacket.AgentData.AgentID, requestPacket.AgentData.SessionID,
  11688. requestPacket.Data.Flags, requestPacket.Data.SequenceID,
  11689. requestPacket.Data.LocalID, this);
  11690. }
  11691. break;
  11692. case PacketType.ParcelAccessListUpdate:
  11693. ParcelAccessListUpdatePacket updatePacket = (ParcelAccessListUpdatePacket)Pack;
  11694. #region Packet Session and User Check
  11695. if (m_checkPackets)
  11696. {
  11697. if (updatePacket.AgentData.SessionID != SessionId ||
  11698. updatePacket.AgentData.AgentID != AgentId)
  11699. break;
  11700. }
  11701. #endregion
  11702. List<ParcelManager.ParcelAccessEntry> entries = new List<ParcelManager.ParcelAccessEntry>();
  11703. foreach (ParcelAccessListUpdatePacket.ListBlock block in updatePacket.List)
  11704. {
  11705. ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry();
  11706. entry.AgentID = block.ID;
  11707. entry.Flags = (AccessList)block.Flags;
  11708. entry.Time = new DateTime();
  11709. entries.Add(entry);
  11710. }
  11711. ParcelAccessListUpdateRequest handlerParcelAccessListUpdateRequest = OnParcelAccessListUpdateRequest;
  11712. if (handlerParcelAccessListUpdateRequest != null)
  11713. {
  11714. handlerParcelAccessListUpdateRequest(updatePacket.AgentData.AgentID,
  11715. updatePacket.AgentData.SessionID, updatePacket.Data.Flags,
  11716. updatePacket.Data.LocalID, entries, this);
  11717. }
  11718. break;
  11719. case PacketType.ParcelPropertiesRequest:
  11720. ParcelPropertiesRequestPacket propertiesRequest = (ParcelPropertiesRequestPacket)Pack;
  11721. #region Packet Session and User Check
  11722. if (m_checkPackets)
  11723. {
  11724. if (propertiesRequest.AgentData.SessionID != SessionId ||
  11725. propertiesRequest.AgentData.AgentID != AgentId)
  11726. break;
  11727. }
  11728. #endregion
  11729. ParcelPropertiesRequest handlerParcelPropertiesRequest = OnParcelPropertiesRequest;
  11730. if (handlerParcelPropertiesRequest != null)
  11731. {
  11732. handlerParcelPropertiesRequest((int)Math.Round(propertiesRequest.ParcelData.West),
  11733. (int)Math.Round(propertiesRequest.ParcelData.South),
  11734. (int)Math.Round(propertiesRequest.ParcelData.East),
  11735. (int)Math.Round(propertiesRequest.ParcelData.North),
  11736. propertiesRequest.ParcelData.SequenceID,
  11737. propertiesRequest.ParcelData.SnapSelection, this);
  11738. }
  11739. break;
  11740. case PacketType.ParcelDivide:
  11741. ParcelDividePacket landDivide = (ParcelDividePacket)Pack;
  11742. #region Packet Session and User Check
  11743. if (m_checkPackets)
  11744. {
  11745. if (landDivide.AgentData.SessionID != SessionId ||
  11746. landDivide.AgentData.AgentID != AgentId)
  11747. break;
  11748. }
  11749. #endregion
  11750. ParcelDivideRequest handlerParcelDivideRequest = OnParcelDivideRequest;
  11751. if (handlerParcelDivideRequest != null)
  11752. {
  11753. handlerParcelDivideRequest((int)Math.Round(landDivide.ParcelData.West),
  11754. (int)Math.Round(landDivide.ParcelData.South),
  11755. (int)Math.Round(landDivide.ParcelData.East),
  11756. (int)Math.Round(landDivide.ParcelData.North), this);
  11757. }
  11758. break;
  11759. case PacketType.ParcelJoin:
  11760. ParcelJoinPacket landJoin = (ParcelJoinPacket)Pack;
  11761. #region Packet Session and User Check
  11762. if (m_checkPackets)
  11763. {
  11764. if (landJoin.AgentData.SessionID != SessionId ||
  11765. landJoin.AgentData.AgentID != AgentId)
  11766. break;
  11767. }
  11768. #endregion
  11769. ParcelJoinRequest handlerParcelJoinRequest = OnParcelJoinRequest;
  11770. if (handlerParcelJoinRequest != null)
  11771. {
  11772. handlerParcelJoinRequest((int)Math.Round(landJoin.ParcelData.West),
  11773. (int)Math.Round(landJoin.ParcelData.South),
  11774. (int)Math.Round(landJoin.ParcelData.East),
  11775. (int)Math.Round(landJoin.ParcelData.North), this);
  11776. }
  11777. break;
  11778. case PacketType.ParcelPropertiesUpdate:
  11779. ParcelPropertiesUpdatePacket parcelPropertiesPacket = (ParcelPropertiesUpdatePacket)Pack;
  11780. #region Packet Session and User Check
  11781. if (m_checkPackets)
  11782. {
  11783. if (parcelPropertiesPacket.AgentData.SessionID != SessionId ||
  11784. parcelPropertiesPacket.AgentData.AgentID != AgentId)
  11785. break;
  11786. }
  11787. #endregion
  11788. ParcelPropertiesUpdateRequest handlerParcelPropertiesUpdateRequest = OnParcelPropertiesUpdateRequest;
  11789. if (handlerParcelPropertiesUpdateRequest != null)
  11790. {
  11791. LandUpdateArgs args = new LandUpdateArgs();
  11792. args.AuthBuyerID = parcelPropertiesPacket.ParcelData.AuthBuyerID;
  11793. args.Category = (ParcelCategory)parcelPropertiesPacket.ParcelData.Category;
  11794. args.Desc = Utils.BytesToString(parcelPropertiesPacket.ParcelData.Desc);
  11795. args.GroupID = parcelPropertiesPacket.ParcelData.GroupID;
  11796. args.LandingType = parcelPropertiesPacket.ParcelData.LandingType;
  11797. args.MediaAutoScale = parcelPropertiesPacket.ParcelData.MediaAutoScale;
  11798. args.MediaID = parcelPropertiesPacket.ParcelData.MediaID;
  11799. args.MediaURL = Utils.BytesToString(parcelPropertiesPacket.ParcelData.MediaURL);
  11800. args.MusicURL = Utils.BytesToString(parcelPropertiesPacket.ParcelData.MusicURL);
  11801. args.Name = Utils.BytesToString(parcelPropertiesPacket.ParcelData.Name);
  11802. args.ParcelFlags = parcelPropertiesPacket.ParcelData.ParcelFlags;
  11803. args.PassHours = parcelPropertiesPacket.ParcelData.PassHours;
  11804. args.PassPrice = parcelPropertiesPacket.ParcelData.PassPrice;
  11805. args.SalePrice = parcelPropertiesPacket.ParcelData.SalePrice;
  11806. args.SnapshotID = parcelPropertiesPacket.ParcelData.SnapshotID;
  11807. args.UserLocation = parcelPropertiesPacket.ParcelData.UserLocation;
  11808. args.UserLookAt = parcelPropertiesPacket.ParcelData.UserLookAt;
  11809. handlerParcelPropertiesUpdateRequest(args, parcelPropertiesPacket.ParcelData.LocalID, this);
  11810. }
  11811. break;
  11812. case PacketType.ParcelSelectObjects:
  11813. ParcelSelectObjectsPacket selectPacket = (ParcelSelectObjectsPacket)Pack;
  11814. #region Packet Session and User Check
  11815. if (m_checkPackets)
  11816. {
  11817. if (selectPacket.AgentData.SessionID != SessionId ||
  11818. selectPacket.AgentData.AgentID != AgentId)
  11819. break;
  11820. }
  11821. #endregion
  11822. List<UUID> returnIDs = new List<UUID>();
  11823. foreach (ParcelSelectObjectsPacket.ReturnIDsBlock rb in
  11824. selectPacket.ReturnIDs)
  11825. {
  11826. returnIDs.Add(rb.ReturnID);
  11827. }
  11828. ParcelSelectObjects handlerParcelSelectObjects = OnParcelSelectObjects;
  11829. if (handlerParcelSelectObjects != null)
  11830. {
  11831. handlerParcelSelectObjects(selectPacket.ParcelData.LocalID,
  11832. Convert.ToInt32(selectPacket.ParcelData.ReturnType), returnIDs, this);
  11833. }
  11834. break;
  11835. case PacketType.ParcelObjectOwnersRequest:
  11836. //m_log.Debug(Pack.ToString());
  11837. ParcelObjectOwnersRequestPacket reqPacket = (ParcelObjectOwnersRequestPacket)Pack;
  11838. #region Packet Session and User Check
  11839. if (m_checkPackets)
  11840. {
  11841. if (reqPacket.AgentData.SessionID != SessionId ||
  11842. reqPacket.AgentData.AgentID != AgentId)
  11843. break;
  11844. }
  11845. #endregion
  11846. ParcelObjectOwnerRequest handlerParcelObjectOwnerRequest = OnParcelObjectOwnerRequest;
  11847. if (handlerParcelObjectOwnerRequest != null)
  11848. {
  11849. handlerParcelObjectOwnerRequest(reqPacket.ParcelData.LocalID, this);
  11850. }
  11851. break;
  11852. case PacketType.ParcelGodForceOwner:
  11853. ParcelGodForceOwnerPacket godForceOwnerPacket = (ParcelGodForceOwnerPacket)Pack;
  11854. #region Packet Session and User Check
  11855. if (m_checkPackets)
  11856. {
  11857. if (godForceOwnerPacket.AgentData.SessionID != SessionId ||
  11858. godForceOwnerPacket.AgentData.AgentID != AgentId)
  11859. break;
  11860. }
  11861. #endregion
  11862. ParcelGodForceOwner handlerParcelGodForceOwner = OnParcelGodForceOwner;
  11863. if (handlerParcelGodForceOwner != null)
  11864. {
  11865. handlerParcelGodForceOwner(godForceOwnerPacket.Data.LocalID, godForceOwnerPacket.Data.OwnerID, this);
  11866. }
  11867. break;
  11868. case PacketType.ParcelRelease:
  11869. ParcelReleasePacket releasePacket = (ParcelReleasePacket)Pack;
  11870. #region Packet Session and User Check
  11871. if (m_checkPackets)
  11872. {
  11873. if (releasePacket.AgentData.SessionID != SessionId ||
  11874. releasePacket.AgentData.AgentID != AgentId)
  11875. break;
  11876. }
  11877. #endregion
  11878. ParcelAbandonRequest handlerParcelAbandonRequest = OnParcelAbandonRequest;
  11879. if (handlerParcelAbandonRequest != null)
  11880. {
  11881. handlerParcelAbandonRequest(releasePacket.Data.LocalID, this);
  11882. }
  11883. break;
  11884. case PacketType.ParcelReclaim:
  11885. ParcelReclaimPacket reclaimPacket = (ParcelReclaimPacket)Pack;
  11886. #region Packet Session and User Check
  11887. if (m_checkPackets)
  11888. {
  11889. if (reclaimPacket.AgentData.SessionID != SessionId ||
  11890. reclaimPacket.AgentData.AgentID != AgentId)
  11891. break;
  11892. }
  11893. #endregion
  11894. ParcelReclaim handlerParcelReclaim = OnParcelReclaim;
  11895. if (handlerParcelReclaim != null)
  11896. {
  11897. handlerParcelReclaim(reclaimPacket.Data.LocalID, this);
  11898. }
  11899. break;
  11900. case PacketType.ParcelReturnObjects:
  11901. ParcelReturnObjectsPacket parcelReturnObjects = (ParcelReturnObjectsPacket)Pack;
  11902. #region Packet Session and User Check
  11903. if (m_checkPackets)
  11904. {
  11905. if (parcelReturnObjects.AgentData.SessionID != SessionId ||
  11906. parcelReturnObjects.AgentData.AgentID != AgentId)
  11907. break;
  11908. }
  11909. #endregion
  11910. UUID[] puserselectedOwnerIDs = new UUID[parcelReturnObjects.OwnerIDs.Length];
  11911. for (int parceliterator = 0; parceliterator < parcelReturnObjects.OwnerIDs.Length; parceliterator++)
  11912. puserselectedOwnerIDs[parceliterator] = parcelReturnObjects.OwnerIDs[parceliterator].OwnerID;
  11913. UUID[] puserselectedTaskIDs = new UUID[parcelReturnObjects.TaskIDs.Length];
  11914. for (int parceliterator = 0; parceliterator < parcelReturnObjects.TaskIDs.Length; parceliterator++)
  11915. puserselectedTaskIDs[parceliterator] = parcelReturnObjects.TaskIDs[parceliterator].TaskID;
  11916. ParcelReturnObjectsRequest handlerParcelReturnObjectsRequest = OnParcelReturnObjectsRequest;
  11917. if (handlerParcelReturnObjectsRequest != null)
  11918. {
  11919. handlerParcelReturnObjectsRequest(parcelReturnObjects.ParcelData.LocalID, parcelReturnObjects.ParcelData.ReturnType, puserselectedOwnerIDs, puserselectedTaskIDs, this);
  11920. }
  11921. break;
  11922. case PacketType.ParcelSetOtherCleanTime:
  11923. ParcelSetOtherCleanTimePacket parcelSetOtherCleanTimePacket = (ParcelSetOtherCleanTimePacket)Pack;
  11924. #region Packet Session and User Check
  11925. if (m_checkPackets)
  11926. {
  11927. if (parcelSetOtherCleanTimePacket.AgentData.SessionID != SessionId ||
  11928. parcelSetOtherCleanTimePacket.AgentData.AgentID != AgentId)
  11929. break;
  11930. }
  11931. #endregion
  11932. ParcelSetOtherCleanTime handlerParcelSetOtherCleanTime = OnParcelSetOtherCleanTime;
  11933. if (handlerParcelSetOtherCleanTime != null)
  11934. {
  11935. handlerParcelSetOtherCleanTime(this,
  11936. parcelSetOtherCleanTimePacket.ParcelData.LocalID,
  11937. parcelSetOtherCleanTimePacket.ParcelData.OtherCleanTime);
  11938. }
  11939. break;
  11940. case PacketType.LandStatRequest:
  11941. LandStatRequestPacket lsrp = (LandStatRequestPacket)Pack;
  11942. #region Packet Session and User Check
  11943. if (m_checkPackets)
  11944. {
  11945. if (lsrp.AgentData.SessionID != SessionId ||
  11946. lsrp.AgentData.AgentID != AgentId)
  11947. break;
  11948. }
  11949. #endregion
  11950. GodLandStatRequest handlerLandStatRequest = OnLandStatRequest;
  11951. if (handlerLandStatRequest != null)
  11952. {
  11953. handlerLandStatRequest(lsrp.RequestData.ParcelLocalID, lsrp.RequestData.ReportType, lsrp.RequestData.RequestFlags, Utils.BytesToString(lsrp.RequestData.Filter), this);
  11954. }
  11955. break;
  11956. case PacketType.ParcelDwellRequest:
  11957. ParcelDwellRequestPacket dwellrq =
  11958. (ParcelDwellRequestPacket)Pack;
  11959. #region Packet Session and User Check
  11960. if (m_checkPackets)
  11961. {
  11962. if (dwellrq.AgentData.SessionID != SessionId ||
  11963. dwellrq.AgentData.AgentID != AgentId)
  11964. break;
  11965. }
  11966. #endregion
  11967. ParcelDwellRequest handlerParcelDwellRequest = OnParcelDwellRequest;
  11968. if (handlerParcelDwellRequest != null)
  11969. {
  11970. handlerParcelDwellRequest(dwellrq.Data.LocalID, this);
  11971. }
  11972. break;
  11973. //#endregion
  11974. //#region Estate Packets
  11975. case PacketType.EstateOwnerMessage:
  11976. EstateOwnerMessagePacket messagePacket = (EstateOwnerMessagePacket)Pack;
  11977. //m_log.Debug(messagePacket.ToString());
  11978. #region Packet Session and User Check
  11979. if (m_checkPackets)
  11980. {
  11981. if (messagePacket.AgentData.SessionID != SessionId ||
  11982. messagePacket.AgentData.AgentID != AgentId)
  11983. break;
  11984. }
  11985. #endregion
  11986. switch (Utils.BytesToString(messagePacket.MethodData.Method))
  11987. {
  11988. case "getinfo":
  11989. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  11990. {
  11991. OnDetailedEstateDataRequest(this, messagePacket.MethodData.Invoice);
  11992. }
  11993. break;
  11994. case "setregioninfo":
  11995. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  11996. {
  11997. OnSetEstateFlagsRequest(convertParamStringToBool(messagePacket.ParamList[0].Parameter), convertParamStringToBool(messagePacket.ParamList[1].Parameter),
  11998. convertParamStringToBool(messagePacket.ParamList[2].Parameter), !convertParamStringToBool(messagePacket.ParamList[3].Parameter),
  11999. Convert.ToInt16(Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[4].Parameter))),
  12000. (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[5].Parameter)),
  12001. Convert.ToInt16(Utils.BytesToString(messagePacket.ParamList[6].Parameter)),
  12002. convertParamStringToBool(messagePacket.ParamList[7].Parameter), convertParamStringToBool(messagePacket.ParamList[8].Parameter));
  12003. }
  12004. break;
  12005. // case "texturebase":
  12006. // if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  12007. // {
  12008. // foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  12009. // {
  12010. // string s = Utils.BytesToString(block.Parameter);
  12011. // string[] splitField = s.Split(' ');
  12012. // if (splitField.Length == 2)
  12013. // {
  12014. // UUID tempUUID = new UUID(splitField[1]);
  12015. // OnSetEstateTerrainBaseTexture(this, Convert.ToInt16(splitField[0]), tempUUID);
  12016. // }
  12017. // }
  12018. // }
  12019. // break;
  12020. case "texturedetail":
  12021. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  12022. {
  12023. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  12024. {
  12025. string s = Utils.BytesToString(block.Parameter);
  12026. string[] splitField = s.Split(' ');
  12027. if (splitField.Length == 2)
  12028. {
  12029. Int16 corner = Convert.ToInt16(splitField[0]);
  12030. UUID textureUUID = new UUID(splitField[1]);
  12031. OnSetEstateTerrainDetailTexture(this, corner, textureUUID);
  12032. }
  12033. }
  12034. }
  12035. break;
  12036. case "textureheights":
  12037. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  12038. {
  12039. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  12040. {
  12041. string s = Utils.BytesToString(block.Parameter);
  12042. string[] splitField = s.Split(' ');
  12043. if (splitField.Length == 3)
  12044. {
  12045. Int16 corner = Convert.ToInt16(splitField[0]);
  12046. float lowValue = (float)Convert.ToDecimal(splitField[1]);
  12047. float highValue = (float)Convert.ToDecimal(splitField[2]);
  12048. OnSetEstateTerrainTextureHeights(this, corner, lowValue, highValue);
  12049. }
  12050. }
  12051. }
  12052. break;
  12053. case "texturecommit":
  12054. OnCommitEstateTerrainTextureRequest(this);
  12055. break;
  12056. case "setregionterrain":
  12057. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  12058. {
  12059. if (messagePacket.ParamList.Length != 9)
  12060. {
  12061. m_log.Error("EstateOwnerMessage: SetRegionTerrain method has a ParamList of invalid length");
  12062. }
  12063. else
  12064. {
  12065. try
  12066. {
  12067. string tmp = Utils.BytesToString(messagePacket.ParamList[0].Parameter);
  12068. if (!tmp.Contains(".")) tmp += ".00";
  12069. float WaterHeight = (float)Convert.ToDecimal(tmp);
  12070. tmp = Utils.BytesToString(messagePacket.ParamList[1].Parameter);
  12071. if (!tmp.Contains(".")) tmp += ".00";
  12072. float TerrainRaiseLimit = (float)Convert.ToDecimal(tmp);
  12073. tmp = Utils.BytesToString(messagePacket.ParamList[2].Parameter);
  12074. if (!tmp.Contains(".")) tmp += ".00";
  12075. float TerrainLowerLimit = (float)Convert.ToDecimal(tmp);
  12076. bool UseEstateSun = convertParamStringToBool(messagePacket.ParamList[3].Parameter);
  12077. bool UseFixedSun = convertParamStringToBool(messagePacket.ParamList[4].Parameter);
  12078. float SunHour = (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[5].Parameter));
  12079. bool UseGlobal = convertParamStringToBool(messagePacket.ParamList[6].Parameter);
  12080. bool EstateFixedSun = convertParamStringToBool(messagePacket.ParamList[7].Parameter);
  12081. float EstateSunHour = (float)Convert.ToDecimal(Utils.BytesToString(messagePacket.ParamList[8].Parameter));
  12082. OnSetRegionTerrainSettings(WaterHeight, TerrainRaiseLimit, TerrainLowerLimit, UseEstateSun, UseFixedSun, SunHour, UseGlobal, EstateFixedSun, EstateSunHour);
  12083. }
  12084. catch (Exception ex)
  12085. {
  12086. m_log.Error("EstateOwnerMessage: Exception while setting terrain settings: \n" + messagePacket + "\n" + ex);
  12087. }
  12088. }
  12089. }
  12090. break;
  12091. case "restart":
  12092. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  12093. {
  12094. // There's only 1 block in the estateResetSim.. and that's the number of seconds till restart.
  12095. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  12096. {
  12097. float timeSeconds;
  12098. Utils.TryParseSingle(Utils.BytesToString(block.Parameter), out timeSeconds);
  12099. timeSeconds = (int)timeSeconds;
  12100. OnEstateRestartSimRequest(this, (int)timeSeconds);
  12101. }
  12102. }
  12103. break;
  12104. case "estatechangecovenantid":
  12105. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  12106. {
  12107. foreach (EstateOwnerMessagePacket.ParamListBlock block in messagePacket.ParamList)
  12108. {
  12109. UUID newCovenantID = new UUID(Utils.BytesToString(block.Parameter));
  12110. OnEstateChangeCovenantRequest(this, newCovenantID);
  12111. }
  12112. }
  12113. break;
  12114. case "estateaccessdelta": // Estate access delta manages the banlist and allow list too.
  12115. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  12116. {
  12117. int estateAccessType = Convert.ToInt16(Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  12118. OnUpdateEstateAccessDeltaRequest(this, messagePacket.MethodData.Invoice, estateAccessType, new UUID(Utils.BytesToString(messagePacket.ParamList[2].Parameter)));
  12119. }
  12120. break;
  12121. case "simulatormessage":
  12122. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  12123. {
  12124. UUID invoice = messagePacket.MethodData.Invoice;
  12125. UUID SenderID = new UUID(Utils.BytesToString(messagePacket.ParamList[2].Parameter));
  12126. string SenderName = Utils.BytesToString(messagePacket.ParamList[3].Parameter);
  12127. string Message = Utils.BytesToString(messagePacket.ParamList[4].Parameter);
  12128. UUID sessionID = messagePacket.AgentData.SessionID;
  12129. OnSimulatorBlueBoxMessageRequest(this, invoice, SenderID, sessionID, SenderName, Message);
  12130. }
  12131. break;
  12132. case "instantmessage":
  12133. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  12134. {
  12135. if (messagePacket.ParamList.Length < 5)
  12136. break;
  12137. UUID invoice = messagePacket.MethodData.Invoice;
  12138. UUID SenderID = new UUID(Utils.BytesToString(messagePacket.ParamList[2].Parameter));
  12139. string SenderName = Utils.BytesToString(messagePacket.ParamList[3].Parameter);
  12140. string Message = Utils.BytesToString(messagePacket.ParamList[4].Parameter);
  12141. UUID sessionID = messagePacket.AgentData.SessionID;
  12142. OnEstateBlueBoxMessageRequest(this, invoice, SenderID, sessionID, SenderName, Message);
  12143. }
  12144. break;
  12145. case "setregiondebug":
  12146. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  12147. {
  12148. UUID invoice = messagePacket.MethodData.Invoice;
  12149. UUID SenderID = messagePacket.AgentData.AgentID;
  12150. bool scripted = convertParamStringToBool(messagePacket.ParamList[0].Parameter);
  12151. bool collisionEvents = convertParamStringToBool(messagePacket.ParamList[1].Parameter);
  12152. bool physics = convertParamStringToBool(messagePacket.ParamList[2].Parameter);
  12153. OnEstateDebugRegionRequest(this, invoice, SenderID, scripted, collisionEvents, physics);
  12154. }
  12155. break;
  12156. case "teleporthomeuser":
  12157. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  12158. {
  12159. UUID invoice = messagePacket.MethodData.Invoice;
  12160. UUID SenderID = messagePacket.AgentData.AgentID;
  12161. UUID Prey;
  12162. UUID.TryParse(Utils.BytesToString(messagePacket.ParamList[1].Parameter), out Prey);
  12163. OnEstateTeleportOneUserHomeRequest(this, invoice, SenderID, Prey);
  12164. }
  12165. break;
  12166. case "teleporthomeallusers":
  12167. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  12168. {
  12169. UUID invoice = messagePacket.MethodData.Invoice;
  12170. UUID SenderID = messagePacket.AgentData.AgentID;
  12171. OnEstateTeleportAllUsersHomeRequest(this, invoice, SenderID);
  12172. }
  12173. break;
  12174. case "colliders":
  12175. handlerLandStatRequest = OnLandStatRequest;
  12176. if (handlerLandStatRequest != null)
  12177. {
  12178. handlerLandStatRequest(0, 1, 0, "", this);
  12179. }
  12180. break;
  12181. case "scripts":
  12182. handlerLandStatRequest = OnLandStatRequest;
  12183. if (handlerLandStatRequest != null)
  12184. {
  12185. handlerLandStatRequest(0, 0, 0, "", this);
  12186. }
  12187. break;
  12188. case "terrain":
  12189. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  12190. {
  12191. if (messagePacket.ParamList.Length > 0)
  12192. {
  12193. if (Utils.BytesToString(messagePacket.ParamList[0].Parameter) == "bake")
  12194. {
  12195. BakeTerrain handlerBakeTerrain = OnBakeTerrain;
  12196. if (handlerBakeTerrain != null)
  12197. {
  12198. handlerBakeTerrain(this);
  12199. }
  12200. }
  12201. if (Utils.BytesToString(messagePacket.ParamList[0].Parameter) == "download filename")
  12202. {
  12203. if (messagePacket.ParamList.Length > 1)
  12204. {
  12205. RequestTerrain handlerRequestTerrain = OnRequestTerrain;
  12206. if (handlerRequestTerrain != null)
  12207. {
  12208. handlerRequestTerrain(this, Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  12209. }
  12210. }
  12211. }
  12212. if (Utils.BytesToString(messagePacket.ParamList[0].Parameter) == "upload filename")
  12213. {
  12214. if (messagePacket.ParamList.Length > 1)
  12215. {
  12216. RequestTerrain handlerUploadTerrain = OnUploadTerrain;
  12217. if (handlerUploadTerrain != null)
  12218. {
  12219. handlerUploadTerrain(this, Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  12220. }
  12221. }
  12222. }
  12223. }
  12224. }
  12225. break;
  12226. case "estatechangeinfo":
  12227. if (((Scene)m_scene).Permissions.CanIssueEstateCommand(AgentId, false))
  12228. {
  12229. UUID invoice = messagePacket.MethodData.Invoice;
  12230. UUID SenderID = messagePacket.AgentData.AgentID;
  12231. UInt32 param1 = Convert.ToUInt32(Utils.BytesToString(messagePacket.ParamList[1].Parameter));
  12232. UInt32 param2 = Convert.ToUInt32(Utils.BytesToString(messagePacket.ParamList[2].Parameter));
  12233. EstateChangeInfo handlerEstateChangeInfo = OnEstateChangeInfo;
  12234. if (handlerEstateChangeInfo != null)
  12235. {
  12236. handlerEstateChangeInfo(this, invoice, SenderID, param1, param2);
  12237. }
  12238. }
  12239. break;
  12240. default:
  12241. m_log.Error("EstateOwnerMessage: Unknown method requested\n" + messagePacket);
  12242. break;
  12243. }
  12244. //int parcelID, uint reportType, uint requestflags, string filter
  12245. //lsrp.RequestData.ParcelLocalID;
  12246. //lsrp.RequestData.ReportType; // 1 = colliders, 0 = scripts
  12247. //lsrp.RequestData.RequestFlags;
  12248. //lsrp.RequestData.Filter;
  12249. break;
  12250. case PacketType.RequestRegionInfo:
  12251. RequestRegionInfoPacket.AgentDataBlock mPacket = ((RequestRegionInfoPacket)Pack).AgentData;
  12252. #region Packet Session and User Check
  12253. if (m_checkPackets)
  12254. {
  12255. if (mPacket.SessionID != SessionId ||
  12256. mPacket.AgentID != AgentId)
  12257. break;
  12258. }
  12259. #endregion
  12260. RegionInfoRequest handlerRegionInfoRequest = OnRegionInfoRequest;
  12261. if (handlerRegionInfoRequest != null)
  12262. {
  12263. handlerRegionInfoRequest(this);
  12264. }
  12265. break;
  12266. case PacketType.EstateCovenantRequest:
  12267. //EstateCovenantRequestPacket.AgentDataBlock epack =
  12268. // ((EstateCovenantRequestPacket)Pack).AgentData;
  12269. EstateCovenantRequest handlerEstateCovenantRequest = OnEstateCovenantRequest;
  12270. if (handlerEstateCovenantRequest != null)
  12271. {
  12272. handlerEstateCovenantRequest(this);
  12273. }
  12274. break;
  12275. //#endregion
  12276. //#region GodPackets
  12277. case PacketType.RequestGodlikePowers:
  12278. RequestGodlikePowersPacket rglpPack = (RequestGodlikePowersPacket)Pack;
  12279. RequestGodlikePowersPacket.RequestBlockBlock rblock = rglpPack.RequestBlock;
  12280. UUID token = rblock.Token;
  12281. RequestGodlikePowersPacket.AgentDataBlock ablock = rglpPack.AgentData;
  12282. RequestGodlikePowers handlerReqGodlikePowers = OnRequestGodlikePowers;
  12283. if (handlerReqGodlikePowers != null)
  12284. {
  12285. handlerReqGodlikePowers(ablock.AgentID, ablock.SessionID, token, rblock.Godlike, this);
  12286. }
  12287. break;
  12288. case PacketType.GodKickUser:
  12289. GodKickUserPacket gkupack = (GodKickUserPacket)Pack;
  12290. if (gkupack.UserInfo.GodSessionID == SessionId && AgentId == gkupack.UserInfo.GodID)
  12291. {
  12292. GodKickUser handlerGodKickUser = OnGodKickUser;
  12293. if (handlerGodKickUser != null)
  12294. {
  12295. handlerGodKickUser(gkupack.UserInfo.GodID, gkupack.UserInfo.GodSessionID,
  12296. gkupack.UserInfo.AgentID, gkupack.UserInfo.KickFlags, gkupack.UserInfo.Reason,gkupack.UserInfo);
  12297. }
  12298. }
  12299. else
  12300. {
  12301. SendAgentAlertMessage("Kick request denied", false);
  12302. }
  12303. //KickUserPacket kupack = new KickUserPacket();
  12304. //KickUserPacket.UserInfoBlock kupackib = kupack.UserInfo;
  12305. //kupack.UserInfo.AgentID = gkupack.UserInfo.AgentID;
  12306. //kupack.UserInfo.SessionID = gkupack.UserInfo.GodSessionID;
  12307. //kupack.TargetBlock.TargetIP = (uint)0;
  12308. //kupack.TargetBlock.TargetPort = (ushort)0;
  12309. //kupack.UserInfo.Reason = gkupack.UserInfo.Reason;
  12310. //OutPacket(kupack, ThrottleOutPacketType.Task);
  12311. break;
  12312. //#endregion
  12313. //#region Economy/Transaction Packets
  12314. case PacketType.MoneyBalanceRequest:
  12315. MoneyBalanceRequestPacket moneybalancerequestpacket = (MoneyBalanceRequestPacket)Pack;
  12316. #region Packet Session and User Check
  12317. if (m_checkPackets)
  12318. {
  12319. if (moneybalancerequestpacket.AgentData.SessionID != SessionId ||
  12320. moneybalancerequestpacket.AgentData.AgentID != AgentId)
  12321. break;
  12322. }
  12323. #endregion
  12324. MoneyBalanceRequest handlerMoneyBalanceRequest = OnMoneyBalanceRequest;
  12325. if (handlerMoneyBalanceRequest != null)
  12326. {
  12327. handlerMoneyBalanceRequest(this, moneybalancerequestpacket.AgentData.AgentID, moneybalancerequestpacket.AgentData.SessionID, moneybalancerequestpacket.MoneyData.TransactionID);
  12328. }
  12329. break;
  12330. case PacketType.EconomyDataRequest:
  12331. EconomyDataRequest handlerEconomoyDataRequest = OnEconomyDataRequest;
  12332. if (handlerEconomoyDataRequest != null)
  12333. {
  12334. handlerEconomoyDataRequest(AgentId);
  12335. }
  12336. break;
  12337. case PacketType.RequestPayPrice:
  12338. RequestPayPricePacket requestPayPricePacket = (RequestPayPricePacket)Pack;
  12339. RequestPayPrice handlerRequestPayPrice = OnRequestPayPrice;
  12340. if (handlerRequestPayPrice != null)
  12341. {
  12342. handlerRequestPayPrice(this, requestPayPricePacket.ObjectData.ObjectID);
  12343. }
  12344. break;
  12345. case PacketType.ObjectSaleInfo:
  12346. ObjectSaleInfoPacket objectSaleInfoPacket = (ObjectSaleInfoPacket)Pack;
  12347. #region Packet Session and User Check
  12348. if (m_checkPackets)
  12349. {
  12350. if (objectSaleInfoPacket.AgentData.SessionID != SessionId ||
  12351. objectSaleInfoPacket.AgentData.AgentID != AgentId)
  12352. break;
  12353. }
  12354. #endregion
  12355. ObjectSaleInfo handlerObjectSaleInfo = OnObjectSaleInfo;
  12356. if (handlerObjectSaleInfo != null)
  12357. {
  12358. foreach (ObjectSaleInfoPacket.ObjectDataBlock d
  12359. in objectSaleInfoPacket.ObjectData)
  12360. {
  12361. handlerObjectSaleInfo(this,
  12362. objectSaleInfoPacket.AgentData.AgentID,
  12363. objectSaleInfoPacket.AgentData.SessionID,
  12364. d.LocalID,
  12365. d.SaleType,
  12366. d.SalePrice);
  12367. }
  12368. }
  12369. break;
  12370. case PacketType.ObjectBuy:
  12371. ObjectBuyPacket objectBuyPacket = (ObjectBuyPacket)Pack;
  12372. #region Packet Session and User Check
  12373. if (m_checkPackets)
  12374. {
  12375. if (objectBuyPacket.AgentData.SessionID != SessionId ||
  12376. objectBuyPacket.AgentData.AgentID != AgentId)
  12377. break;
  12378. }
  12379. #endregion
  12380. ObjectBuy handlerObjectBuy = OnObjectBuy;
  12381. if (handlerObjectBuy != null)
  12382. {
  12383. foreach (ObjectBuyPacket.ObjectDataBlock d
  12384. in objectBuyPacket.ObjectData)
  12385. {
  12386. handlerObjectBuy(this,
  12387. objectBuyPacket.AgentData.AgentID,
  12388. objectBuyPacket.AgentData.SessionID,
  12389. objectBuyPacket.AgentData.GroupID,
  12390. objectBuyPacket.AgentData.CategoryID,
  12391. d.ObjectLocalID,
  12392. d.SaleType,
  12393. d.SalePrice);
  12394. }
  12395. }
  12396. break;
  12397. //#endregion
  12398. //#region Script Packets
  12399. case PacketType.GetScriptRunning:
  12400. GetScriptRunningPacket scriptRunning = (GetScriptRunningPacket)Pack;
  12401. GetScriptRunning handlerGetScriptRunning = OnGetScriptRunning;
  12402. if (handlerGetScriptRunning != null)
  12403. {
  12404. handlerGetScriptRunning(this, scriptRunning.Script.ObjectID, scriptRunning.Script.ItemID);
  12405. }
  12406. break;
  12407. case PacketType.SetScriptRunning:
  12408. SetScriptRunningPacket setScriptRunning = (SetScriptRunningPacket)Pack;
  12409. #region Packet Session and User Check
  12410. if (m_checkPackets)
  12411. {
  12412. if (setScriptRunning.AgentData.SessionID != SessionId ||
  12413. setScriptRunning.AgentData.AgentID != AgentId)
  12414. break;
  12415. }
  12416. #endregion
  12417. SetScriptRunning handlerSetScriptRunning = OnSetScriptRunning;
  12418. if (handlerSetScriptRunning != null)
  12419. {
  12420. handlerSetScriptRunning(this, setScriptRunning.Script.ObjectID, setScriptRunning.Script.ItemID, setScriptRunning.Script.Running);
  12421. }
  12422. break;
  12423. case PacketType.ScriptReset:
  12424. ScriptResetPacket scriptResetPacket = (ScriptResetPacket)Pack;
  12425. #region Packet Session and User Check
  12426. if (m_checkPackets)
  12427. {
  12428. if (scriptResetPacket.AgentData.SessionID != SessionId ||
  12429. scriptResetPacket.AgentData.AgentID != AgentId)
  12430. break;
  12431. }
  12432. #endregion
  12433. ScriptReset handlerScriptReset = OnScriptReset;
  12434. if (handlerScriptReset != null)
  12435. {
  12436. handlerScriptReset(this, scriptResetPacket.Script.ObjectID, scriptResetPacket.Script.ItemID);
  12437. }
  12438. break;
  12439. //#endregion
  12440. //#region Gesture Managment
  12441. case PacketType.ActivateGestures:
  12442. ActivateGesturesPacket activateGesturePacket = (ActivateGesturesPacket)Pack;
  12443. #region Packet Session and User Check
  12444. if (m_checkPackets)
  12445. {
  12446. if (activateGesturePacket.AgentData.SessionID != SessionId ||
  12447. activateGesturePacket.AgentData.AgentID != AgentId)
  12448. break;
  12449. }
  12450. #endregion
  12451. ActivateGesture handlerActivateGesture = OnActivateGesture;
  12452. if (handlerActivateGesture != null)
  12453. {
  12454. handlerActivateGesture(this,
  12455. activateGesturePacket.Data[0].AssetID,
  12456. activateGesturePacket.Data[0].ItemID);
  12457. }
  12458. else m_log.Error("Null pointer for activateGesture");
  12459. break;
  12460. case PacketType.DeactivateGestures:
  12461. DeactivateGesturesPacket deactivateGesturePacket = (DeactivateGesturesPacket)Pack;
  12462. #region Packet Session and User Check
  12463. if (m_checkPackets)
  12464. {
  12465. if (deactivateGesturePacket.AgentData.SessionID != SessionId ||
  12466. deactivateGesturePacket.AgentData.AgentID != AgentId)
  12467. break;
  12468. }
  12469. #endregion
  12470. DeactivateGesture handlerDeactivateGesture = OnDeactivateGesture;
  12471. if (handlerDeactivateGesture != null)
  12472. {
  12473. handlerDeactivateGesture(this, deactivateGesturePacket.Data[0].ItemID);
  12474. }
  12475. break;
  12476. case PacketType.ObjectOwner:
  12477. ObjectOwnerPacket objectOwnerPacket = (ObjectOwnerPacket)Pack;
  12478. #region Packet Session and User Check
  12479. if (m_checkPackets)
  12480. {
  12481. if (objectOwnerPacket.AgentData.SessionID != SessionId ||
  12482. objectOwnerPacket.AgentData.AgentID != AgentId)
  12483. break;
  12484. }
  12485. #endregion
  12486. List<uint> localIDs = new List<uint>();
  12487. foreach (ObjectOwnerPacket.ObjectDataBlock d in objectOwnerPacket.ObjectData)
  12488. localIDs.Add(d.ObjectLocalID);
  12489. ObjectOwner handlerObjectOwner = OnObjectOwner;
  12490. if (handlerObjectOwner != null)
  12491. {
  12492. handlerObjectOwner(this, objectOwnerPacket.HeaderData.OwnerID, objectOwnerPacket.HeaderData.GroupID, localIDs);
  12493. }
  12494. break;
  12495. //#endregion
  12496. case PacketType.AgentFOV:
  12497. AgentFOVPacket fovPacket = (AgentFOVPacket)Pack;
  12498. if (fovPacket.FOVBlock.GenCounter > m_agentFOVCounter)
  12499. {
  12500. m_agentFOVCounter = fovPacket.FOVBlock.GenCounter;
  12501. AgentFOV handlerAgentFOV = OnAgentFOV;
  12502. if (handlerAgentFOV != null)
  12503. {
  12504. handlerAgentFOV(this, fovPacket.FOVBlock.VerticalAngle);
  12505. }
  12506. }
  12507. break;
  12508. //#region unimplemented handlers
  12509. case PacketType.ViewerStats:
  12510. // TODO: handle this packet
  12511. //m_log.Warn("[CLIENT]: unhandled ViewerStats packet");
  12512. break;
  12513. case PacketType.MapItemRequest:
  12514. MapItemRequestPacket mirpk = (MapItemRequestPacket)Pack;
  12515. #region Packet Session and User Check
  12516. if (m_checkPackets)
  12517. {
  12518. if (mirpk.AgentData.SessionID != SessionId ||
  12519. mirpk.AgentData.AgentID != AgentId)
  12520. break;
  12521. }
  12522. #endregion
  12523. //m_log.Debug(mirpk.ToString());
  12524. MapItemRequest handlerMapItemRequest = OnMapItemRequest;
  12525. if (handlerMapItemRequest != null)
  12526. {
  12527. handlerMapItemRequest(this, mirpk.AgentData.Flags, mirpk.AgentData.EstateID,
  12528. mirpk.AgentData.Godlike, mirpk.RequestData.ItemType,
  12529. mirpk.RequestData.RegionHandle);
  12530. }
  12531. break;
  12532. case PacketType.TransferAbort:
  12533. // TODO: handle this packet
  12534. //m_log.Warn("[CLIENT]: unhandled TransferAbort packet");
  12535. break;
  12536. case PacketType.MuteListRequest:
  12537. MuteListRequestPacket muteListRequest =
  12538. (MuteListRequestPacket)Pack;
  12539. #region Packet Session and User Check
  12540. if (m_checkPackets)
  12541. {
  12542. if (muteListRequest.AgentData.SessionID != SessionId ||
  12543. muteListRequest.AgentData.AgentID != AgentId)
  12544. break;
  12545. }
  12546. #endregion
  12547. MuteListRequest handlerMuteListRequest = OnMuteListRequest;
  12548. if (handlerMuteListRequest != null)
  12549. {
  12550. handlerMuteListRequest(this, muteListRequest.MuteData.MuteCRC);
  12551. }
  12552. else
  12553. {
  12554. SendUseCachedMuteList();
  12555. }
  12556. break;
  12557. case PacketType.UseCircuitCode:
  12558. // Don't display this one, we handle it at a lower level
  12559. break;
  12560. case PacketType.AgentHeightWidth:
  12561. // TODO: handle this packet
  12562. //m_log.Warn("[CLIENT]: unhandled AgentHeightWidth packet");
  12563. break;
  12564. case PacketType.InventoryDescendents:
  12565. // TODO: handle this packet
  12566. //m_log.Warn("[CLIENT]: unhandled InventoryDescent packet");
  12567. break;
  12568. case PacketType.DirPlacesQuery:
  12569. DirPlacesQueryPacket dirPlacesQueryPacket = (DirPlacesQueryPacket)Pack;
  12570. //m_log.Debug(dirPlacesQueryPacket.ToString());
  12571. #region Packet Session and User Check
  12572. if (m_checkPackets)
  12573. {
  12574. if (dirPlacesQueryPacket.AgentData.SessionID != SessionId ||
  12575. dirPlacesQueryPacket.AgentData.AgentID != AgentId)
  12576. break;
  12577. }
  12578. #endregion
  12579. DirPlacesQuery handlerDirPlacesQuery = OnDirPlacesQuery;
  12580. if (handlerDirPlacesQuery != null)
  12581. {
  12582. handlerDirPlacesQuery(this,
  12583. dirPlacesQueryPacket.QueryData.QueryID,
  12584. Utils.BytesToString(
  12585. dirPlacesQueryPacket.QueryData.QueryText),
  12586. (int)dirPlacesQueryPacket.QueryData.QueryFlags,
  12587. (int)dirPlacesQueryPacket.QueryData.Category,
  12588. Utils.BytesToString(
  12589. dirPlacesQueryPacket.QueryData.SimName),
  12590. dirPlacesQueryPacket.QueryData.QueryStart);
  12591. }
  12592. break;
  12593. case PacketType.DirFindQuery:
  12594. DirFindQueryPacket dirFindQueryPacket = (DirFindQueryPacket)Pack;
  12595. #region Packet Session and User Check
  12596. if (m_checkPackets)
  12597. {
  12598. if (dirFindQueryPacket.AgentData.SessionID != SessionId ||
  12599. dirFindQueryPacket.AgentData.AgentID != AgentId)
  12600. break;
  12601. }
  12602. #endregion
  12603. DirFindQuery handlerDirFindQuery = OnDirFindQuery;
  12604. if (handlerDirFindQuery != null)
  12605. {
  12606. handlerDirFindQuery(this,
  12607. dirFindQueryPacket.QueryData.QueryID,
  12608. Utils.BytesToString(
  12609. dirFindQueryPacket.QueryData.QueryText),
  12610. dirFindQueryPacket.QueryData.QueryFlags,
  12611. dirFindQueryPacket.QueryData.QueryStart);
  12612. }
  12613. break;
  12614. case PacketType.DirLandQuery:
  12615. DirLandQueryPacket dirLandQueryPacket = (DirLandQueryPacket)Pack;
  12616. #region Packet Session and User Check
  12617. if (m_checkPackets)
  12618. {
  12619. if (dirLandQueryPacket.AgentData.SessionID != SessionId ||
  12620. dirLandQueryPacket.AgentData.AgentID != AgentId)
  12621. break;
  12622. }
  12623. #endregion
  12624. DirLandQuery handlerDirLandQuery = OnDirLandQuery;
  12625. if (handlerDirLandQuery != null)
  12626. {
  12627. handlerDirLandQuery(this,
  12628. dirLandQueryPacket.QueryData.QueryID,
  12629. dirLandQueryPacket.QueryData.QueryFlags,
  12630. dirLandQueryPacket.QueryData.SearchType,
  12631. dirLandQueryPacket.QueryData.Price,
  12632. dirLandQueryPacket.QueryData.Area,
  12633. dirLandQueryPacket.QueryData.QueryStart);
  12634. }
  12635. break;
  12636. case PacketType.DirPopularQuery:
  12637. DirPopularQueryPacket dirPopularQueryPacket = (DirPopularQueryPacket)Pack;
  12638. #region Packet Session and User Check
  12639. if (m_checkPackets)
  12640. {
  12641. if (dirPopularQueryPacket.AgentData.SessionID != SessionId ||
  12642. dirPopularQueryPacket.AgentData.AgentID != AgentId)
  12643. break;
  12644. }
  12645. #endregion
  12646. DirPopularQuery handlerDirPopularQuery = OnDirPopularQuery;
  12647. if (handlerDirPopularQuery != null)
  12648. {
  12649. handlerDirPopularQuery(this,
  12650. dirPopularQueryPacket.QueryData.QueryID,
  12651. dirPopularQueryPacket.QueryData.QueryFlags);
  12652. }
  12653. break;
  12654. case PacketType.DirClassifiedQuery:
  12655. DirClassifiedQueryPacket dirClassifiedQueryPacket = (DirClassifiedQueryPacket)Pack;
  12656. #region Packet Session and User Check
  12657. if (m_checkPackets)
  12658. {
  12659. if (dirClassifiedQueryPacket.AgentData.SessionID != SessionId ||
  12660. dirClassifiedQueryPacket.AgentData.AgentID != AgentId)
  12661. break;
  12662. }
  12663. #endregion
  12664. DirClassifiedQuery handlerDirClassifiedQuery = OnDirClassifiedQuery;
  12665. if (handlerDirClassifiedQuery != null)
  12666. {
  12667. handlerDirClassifiedQuery(this,
  12668. dirClassifiedQueryPacket.QueryData.QueryID,
  12669. Utils.BytesToString(
  12670. dirClassifiedQueryPacket.QueryData.QueryText),
  12671. dirClassifiedQueryPacket.QueryData.QueryFlags,
  12672. dirClassifiedQueryPacket.QueryData.Category,
  12673. dirClassifiedQueryPacket.QueryData.QueryStart);
  12674. }
  12675. break;
  12676. case PacketType.EventInfoRequest:
  12677. EventInfoRequestPacket eventInfoRequestPacket = (EventInfoRequestPacket)Pack;
  12678. #region Packet Session and User Check
  12679. if (m_checkPackets)
  12680. {
  12681. if (eventInfoRequestPacket.AgentData.SessionID != SessionId ||
  12682. eventInfoRequestPacket.AgentData.AgentID != AgentId)
  12683. break;
  12684. }
  12685. #endregion
  12686. if (OnEventInfoRequest != null)
  12687. {
  12688. OnEventInfoRequest(this, eventInfoRequestPacket.EventData.EventID);
  12689. }
  12690. break;
  12691. //#region Calling Card
  12692. case PacketType.OfferCallingCard:
  12693. OfferCallingCardPacket offerCallingCardPacket = (OfferCallingCardPacket)Pack;
  12694. #region Packet Session and User Check
  12695. if (m_checkPackets)
  12696. {
  12697. if (offerCallingCardPacket.AgentData.SessionID != SessionId ||
  12698. offerCallingCardPacket.AgentData.AgentID != AgentId)
  12699. break;
  12700. }
  12701. #endregion
  12702. if (OnOfferCallingCard != null)
  12703. {
  12704. OnOfferCallingCard(this,
  12705. offerCallingCardPacket.AgentBlock.DestID,
  12706. offerCallingCardPacket.AgentBlock.TransactionID);
  12707. }
  12708. break;
  12709. case PacketType.AcceptCallingCard:
  12710. AcceptCallingCardPacket acceptCallingCardPacket = (AcceptCallingCardPacket)Pack;
  12711. #region Packet Session and User Check
  12712. if (m_checkPackets)
  12713. {
  12714. if (acceptCallingCardPacket.AgentData.SessionID != SessionId ||
  12715. acceptCallingCardPacket.AgentData.AgentID != AgentId)
  12716. break;
  12717. }
  12718. #endregion
  12719. // according to http://wiki.secondlife.com/wiki/AcceptCallingCard FolderData should
  12720. // contain exactly one entry
  12721. if (OnAcceptCallingCard != null && acceptCallingCardPacket.FolderData.Length > 0)
  12722. {
  12723. OnAcceptCallingCard(this,
  12724. acceptCallingCardPacket.TransactionBlock.TransactionID,
  12725. acceptCallingCardPacket.FolderData[0].FolderID);
  12726. }
  12727. break;
  12728. case PacketType.DeclineCallingCard:
  12729. DeclineCallingCardPacket declineCallingCardPacket = (DeclineCallingCardPacket)Pack;
  12730. #region Packet Session and User Check
  12731. if (m_checkPackets)
  12732. {
  12733. if (declineCallingCardPacket.AgentData.SessionID != SessionId ||
  12734. declineCallingCardPacket.AgentData.AgentID != AgentId)
  12735. break;
  12736. }
  12737. #endregion
  12738. if (OnDeclineCallingCard != null)
  12739. {
  12740. OnDeclineCallingCard(this,
  12741. declineCallingCardPacket.TransactionBlock.TransactionID);
  12742. }
  12743. break;
  12744. //#endregion
  12745. //#region Groups
  12746. case PacketType.ActivateGroup:
  12747. ActivateGroupPacket activateGroupPacket = (ActivateGroupPacket)Pack;
  12748. #region Packet Session and User Check
  12749. if (m_checkPackets)
  12750. {
  12751. if (activateGroupPacket.AgentData.SessionID != SessionId ||
  12752. activateGroupPacket.AgentData.AgentID != AgentId)
  12753. break;
  12754. }
  12755. #endregion
  12756. if (m_GroupsModule != null)
  12757. {
  12758. m_GroupsModule.ActivateGroup(this, activateGroupPacket.AgentData.GroupID);
  12759. m_GroupsModule.SendAgentGroupDataUpdate(this);
  12760. }
  12761. break;
  12762. case PacketType.GroupTitlesRequest:
  12763. GroupTitlesRequestPacket groupTitlesRequest =
  12764. (GroupTitlesRequestPacket)Pack;
  12765. #region Packet Session and User Check
  12766. if (m_checkPackets)
  12767. {
  12768. if (groupTitlesRequest.AgentData.SessionID != SessionId ||
  12769. groupTitlesRequest.AgentData.AgentID != AgentId)
  12770. break;
  12771. }
  12772. #endregion
  12773. if (m_GroupsModule != null)
  12774. {
  12775. GroupTitlesReplyPacket groupTitlesReply = (GroupTitlesReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupTitlesReply);
  12776. groupTitlesReply.AgentData =
  12777. new GroupTitlesReplyPacket.AgentDataBlock();
  12778. groupTitlesReply.AgentData.AgentID = AgentId;
  12779. groupTitlesReply.AgentData.GroupID =
  12780. groupTitlesRequest.AgentData.GroupID;
  12781. groupTitlesReply.AgentData.RequestID =
  12782. groupTitlesRequest.AgentData.RequestID;
  12783. List<GroupTitlesData> titles =
  12784. m_GroupsModule.GroupTitlesRequest(this,
  12785. groupTitlesRequest.AgentData.GroupID);
  12786. groupTitlesReply.GroupData =
  12787. new GroupTitlesReplyPacket.GroupDataBlock[titles.Count];
  12788. int i = 0;
  12789. foreach (GroupTitlesData d in titles)
  12790. {
  12791. groupTitlesReply.GroupData[i] =
  12792. new GroupTitlesReplyPacket.GroupDataBlock();
  12793. groupTitlesReply.GroupData[i].Title =
  12794. Util.StringToBytes256(d.Name);
  12795. groupTitlesReply.GroupData[i].RoleID =
  12796. d.UUID;
  12797. groupTitlesReply.GroupData[i].Selected =
  12798. d.Selected;
  12799. i++;
  12800. }
  12801. OutPacket(groupTitlesReply, ThrottleOutPacketType.Task);
  12802. }
  12803. break;
  12804. case PacketType.GroupProfileRequest:
  12805. GroupProfileRequestPacket groupProfileRequest =
  12806. (GroupProfileRequestPacket)Pack;
  12807. #region Packet Session and User Check
  12808. if (m_checkPackets)
  12809. {
  12810. if (groupProfileRequest.AgentData.SessionID != SessionId ||
  12811. groupProfileRequest.AgentData.AgentID != AgentId)
  12812. break;
  12813. }
  12814. #endregion
  12815. if (m_GroupsModule != null)
  12816. {
  12817. GroupProfileReplyPacket groupProfileReply = (GroupProfileReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupProfileReply);
  12818. groupProfileReply.AgentData = new GroupProfileReplyPacket.AgentDataBlock();
  12819. groupProfileReply.GroupData = new GroupProfileReplyPacket.GroupDataBlock();
  12820. groupProfileReply.AgentData.AgentID = AgentId;
  12821. GroupProfileData d = m_GroupsModule.GroupProfileRequest(this,
  12822. groupProfileRequest.GroupData.GroupID);
  12823. groupProfileReply.GroupData.GroupID = d.GroupID;
  12824. groupProfileReply.GroupData.Name = Util.StringToBytes256(d.Name);
  12825. groupProfileReply.GroupData.Charter = Util.StringToBytes1024(d.Charter);
  12826. groupProfileReply.GroupData.ShowInList = d.ShowInList;
  12827. groupProfileReply.GroupData.MemberTitle = Util.StringToBytes256(d.MemberTitle);
  12828. groupProfileReply.GroupData.PowersMask = d.PowersMask;
  12829. groupProfileReply.GroupData.InsigniaID = d.InsigniaID;
  12830. groupProfileReply.GroupData.FounderID = d.FounderID;
  12831. groupProfileReply.GroupData.MembershipFee = d.MembershipFee;
  12832. groupProfileReply.GroupData.OpenEnrollment = d.OpenEnrollment;
  12833. groupProfileReply.GroupData.Money = d.Money;
  12834. groupProfileReply.GroupData.GroupMembershipCount = d.GroupMembershipCount;
  12835. groupProfileReply.GroupData.GroupRolesCount = d.GroupRolesCount;
  12836. groupProfileReply.GroupData.AllowPublish = d.AllowPublish;
  12837. groupProfileReply.GroupData.MaturePublish = d.MaturePublish;
  12838. groupProfileReply.GroupData.OwnerRole = d.OwnerRole;
  12839. OutPacket(groupProfileReply, ThrottleOutPacketType.Task);
  12840. }
  12841. break;
  12842. case PacketType.GroupMembersRequest:
  12843. GroupMembersRequestPacket groupMembersRequestPacket =
  12844. (GroupMembersRequestPacket)Pack;
  12845. #region Packet Session and User Check
  12846. if (m_checkPackets)
  12847. {
  12848. if (groupMembersRequestPacket.AgentData.SessionID != SessionId ||
  12849. groupMembersRequestPacket.AgentData.AgentID != AgentId)
  12850. break;
  12851. }
  12852. #endregion
  12853. if (m_GroupsModule != null)
  12854. {
  12855. List<GroupMembersData> members =
  12856. m_GroupsModule.GroupMembersRequest(this, groupMembersRequestPacket.GroupData.GroupID);
  12857. int memberCount = members.Count;
  12858. while (true)
  12859. {
  12860. int blockCount = members.Count;
  12861. if (blockCount > 40)
  12862. blockCount = 40;
  12863. GroupMembersReplyPacket groupMembersReply = (GroupMembersReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupMembersReply);
  12864. groupMembersReply.AgentData =
  12865. new GroupMembersReplyPacket.AgentDataBlock();
  12866. groupMembersReply.GroupData =
  12867. new GroupMembersReplyPacket.GroupDataBlock();
  12868. groupMembersReply.MemberData =
  12869. new GroupMembersReplyPacket.MemberDataBlock[
  12870. blockCount];
  12871. groupMembersReply.AgentData.AgentID = AgentId;
  12872. groupMembersReply.GroupData.GroupID =
  12873. groupMembersRequestPacket.GroupData.GroupID;
  12874. groupMembersReply.GroupData.RequestID =
  12875. groupMembersRequestPacket.GroupData.RequestID;
  12876. groupMembersReply.GroupData.MemberCount = memberCount;
  12877. for (int i = 0; i < blockCount; i++)
  12878. {
  12879. GroupMembersData m = members[0];
  12880. members.RemoveAt(0);
  12881. groupMembersReply.MemberData[i] =
  12882. new GroupMembersReplyPacket.MemberDataBlock();
  12883. groupMembersReply.MemberData[i].AgentID =
  12884. m.AgentID;
  12885. groupMembersReply.MemberData[i].Contribution =
  12886. m.Contribution;
  12887. groupMembersReply.MemberData[i].OnlineStatus =
  12888. Util.StringToBytes256(m.OnlineStatus);
  12889. groupMembersReply.MemberData[i].AgentPowers =
  12890. m.AgentPowers;
  12891. groupMembersReply.MemberData[i].Title =
  12892. Util.StringToBytes256(m.Title);
  12893. groupMembersReply.MemberData[i].IsOwner =
  12894. m.IsOwner;
  12895. }
  12896. OutPacket(groupMembersReply, ThrottleOutPacketType.Task);
  12897. if (members.Count == 0)
  12898. break;
  12899. }
  12900. }
  12901. break;
  12902. case PacketType.GroupRoleDataRequest:
  12903. GroupRoleDataRequestPacket groupRolesRequest =
  12904. (GroupRoleDataRequestPacket)Pack;
  12905. #region Packet Session and User Check
  12906. if (m_checkPackets)
  12907. {
  12908. if (groupRolesRequest.AgentData.SessionID != SessionId ||
  12909. groupRolesRequest.AgentData.AgentID != AgentId)
  12910. break;
  12911. }
  12912. #endregion
  12913. if (m_GroupsModule != null)
  12914. {
  12915. GroupRoleDataReplyPacket groupRolesReply = (GroupRoleDataReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupRoleDataReply);
  12916. groupRolesReply.AgentData =
  12917. new GroupRoleDataReplyPacket.AgentDataBlock();
  12918. groupRolesReply.AgentData.AgentID = AgentId;
  12919. groupRolesReply.GroupData =
  12920. new GroupRoleDataReplyPacket.GroupDataBlock();
  12921. groupRolesReply.GroupData.GroupID =
  12922. groupRolesRequest.GroupData.GroupID;
  12923. groupRolesReply.GroupData.RequestID =
  12924. groupRolesRequest.GroupData.RequestID;
  12925. List<GroupRolesData> titles =
  12926. m_GroupsModule.GroupRoleDataRequest(this,
  12927. groupRolesRequest.GroupData.GroupID);
  12928. groupRolesReply.GroupData.RoleCount =
  12929. titles.Count;
  12930. groupRolesReply.RoleData =
  12931. new GroupRoleDataReplyPacket.RoleDataBlock[titles.Count];
  12932. int i = 0;
  12933. foreach (GroupRolesData d in titles)
  12934. {
  12935. groupRolesReply.RoleData[i] =
  12936. new GroupRoleDataReplyPacket.RoleDataBlock();
  12937. groupRolesReply.RoleData[i].RoleID =
  12938. d.RoleID;
  12939. groupRolesReply.RoleData[i].Name =
  12940. Util.StringToBytes256(d.Name);
  12941. groupRolesReply.RoleData[i].Title =
  12942. Util.StringToBytes256(d.Title);
  12943. groupRolesReply.RoleData[i].Description =
  12944. Util.StringToBytes1024(d.Description);
  12945. groupRolesReply.RoleData[i].Powers =
  12946. d.Powers;
  12947. groupRolesReply.RoleData[i].Members =
  12948. (uint)d.Members;
  12949. i++;
  12950. }
  12951. OutPacket(groupRolesReply, ThrottleOutPacketType.Task);
  12952. }
  12953. break;
  12954. case PacketType.GroupRoleMembersRequest:
  12955. GroupRoleMembersRequestPacket groupRoleMembersRequest =
  12956. (GroupRoleMembersRequestPacket)Pack;
  12957. #region Packet Session and User Check
  12958. if (m_checkPackets)
  12959. {
  12960. if (groupRoleMembersRequest.AgentData.SessionID != SessionId ||
  12961. groupRoleMembersRequest.AgentData.AgentID != AgentId)
  12962. break;
  12963. }
  12964. #endregion
  12965. if (m_GroupsModule != null)
  12966. {
  12967. List<GroupRoleMembersData> mappings =
  12968. m_GroupsModule.GroupRoleMembersRequest(this,
  12969. groupRoleMembersRequest.GroupData.GroupID);
  12970. int mappingsCount = mappings.Count;
  12971. while (mappings.Count > 0)
  12972. {
  12973. int pairs = mappings.Count;
  12974. if (pairs > 32)
  12975. pairs = 32;
  12976. GroupRoleMembersReplyPacket groupRoleMembersReply = (GroupRoleMembersReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupRoleMembersReply);
  12977. groupRoleMembersReply.AgentData =
  12978. new GroupRoleMembersReplyPacket.AgentDataBlock();
  12979. groupRoleMembersReply.AgentData.AgentID =
  12980. AgentId;
  12981. groupRoleMembersReply.AgentData.GroupID =
  12982. groupRoleMembersRequest.GroupData.GroupID;
  12983. groupRoleMembersReply.AgentData.RequestID =
  12984. groupRoleMembersRequest.GroupData.RequestID;
  12985. groupRoleMembersReply.AgentData.TotalPairs =
  12986. (uint)mappingsCount;
  12987. groupRoleMembersReply.MemberData =
  12988. new GroupRoleMembersReplyPacket.MemberDataBlock[pairs];
  12989. for (int i = 0; i < pairs; i++)
  12990. {
  12991. GroupRoleMembersData d = mappings[0];
  12992. mappings.RemoveAt(0);
  12993. groupRoleMembersReply.MemberData[i] =
  12994. new GroupRoleMembersReplyPacket.MemberDataBlock();
  12995. groupRoleMembersReply.MemberData[i].RoleID =
  12996. d.RoleID;
  12997. groupRoleMembersReply.MemberData[i].MemberID =
  12998. d.MemberID;
  12999. }
  13000. OutPacket(groupRoleMembersReply, ThrottleOutPacketType.Task);
  13001. }
  13002. }
  13003. break;
  13004. case PacketType.CreateGroupRequest:
  13005. CreateGroupRequestPacket createGroupRequest =
  13006. (CreateGroupRequestPacket)Pack;
  13007. #region Packet Session and User Check
  13008. if (m_checkPackets)
  13009. {
  13010. if (createGroupRequest.AgentData.SessionID != SessionId ||
  13011. createGroupRequest.AgentData.AgentID != AgentId)
  13012. break;
  13013. }
  13014. #endregion
  13015. if (m_GroupsModule != null)
  13016. {
  13017. m_GroupsModule.CreateGroup(this,
  13018. Utils.BytesToString(createGroupRequest.GroupData.Name),
  13019. Utils.BytesToString(createGroupRequest.GroupData.Charter),
  13020. createGroupRequest.GroupData.ShowInList,
  13021. createGroupRequest.GroupData.InsigniaID,
  13022. createGroupRequest.GroupData.MembershipFee,
  13023. createGroupRequest.GroupData.OpenEnrollment,
  13024. createGroupRequest.GroupData.AllowPublish,
  13025. createGroupRequest.GroupData.MaturePublish);
  13026. }
  13027. break;
  13028. case PacketType.UpdateGroupInfo:
  13029. UpdateGroupInfoPacket updateGroupInfo =
  13030. (UpdateGroupInfoPacket)Pack;
  13031. #region Packet Session and User Check
  13032. if (m_checkPackets)
  13033. {
  13034. if (updateGroupInfo.AgentData.SessionID != SessionId ||
  13035. updateGroupInfo.AgentData.AgentID != AgentId)
  13036. break;
  13037. }
  13038. #endregion
  13039. if (m_GroupsModule != null)
  13040. {
  13041. m_GroupsModule.UpdateGroupInfo(this,
  13042. updateGroupInfo.GroupData.GroupID,
  13043. Utils.BytesToString(updateGroupInfo.GroupData.Charter),
  13044. updateGroupInfo.GroupData.ShowInList,
  13045. updateGroupInfo.GroupData.InsigniaID,
  13046. updateGroupInfo.GroupData.MembershipFee,
  13047. updateGroupInfo.GroupData.OpenEnrollment,
  13048. updateGroupInfo.GroupData.AllowPublish,
  13049. updateGroupInfo.GroupData.MaturePublish);
  13050. }
  13051. break;
  13052. case PacketType.SetGroupAcceptNotices:
  13053. SetGroupAcceptNoticesPacket setGroupAcceptNotices =
  13054. (SetGroupAcceptNoticesPacket)Pack;
  13055. #region Packet Session and User Check
  13056. if (m_checkPackets)
  13057. {
  13058. if (setGroupAcceptNotices.AgentData.SessionID != SessionId ||
  13059. setGroupAcceptNotices.AgentData.AgentID != AgentId)
  13060. break;
  13061. }
  13062. #endregion
  13063. if (m_GroupsModule != null)
  13064. {
  13065. m_GroupsModule.SetGroupAcceptNotices(this,
  13066. setGroupAcceptNotices.Data.GroupID,
  13067. setGroupAcceptNotices.Data.AcceptNotices,
  13068. setGroupAcceptNotices.NewData.ListInProfile);
  13069. }
  13070. break;
  13071. case PacketType.GroupTitleUpdate:
  13072. GroupTitleUpdatePacket groupTitleUpdate =
  13073. (GroupTitleUpdatePacket)Pack;
  13074. #region Packet Session and User Check
  13075. if (m_checkPackets)
  13076. {
  13077. if (groupTitleUpdate.AgentData.SessionID != SessionId ||
  13078. groupTitleUpdate.AgentData.AgentID != AgentId)
  13079. break;
  13080. }
  13081. #endregion
  13082. if (m_GroupsModule != null)
  13083. {
  13084. m_GroupsModule.GroupTitleUpdate(this,
  13085. groupTitleUpdate.AgentData.GroupID,
  13086. groupTitleUpdate.AgentData.TitleRoleID);
  13087. }
  13088. break;
  13089. case PacketType.ParcelDeedToGroup:
  13090. ParcelDeedToGroupPacket parcelDeedToGroup = (ParcelDeedToGroupPacket)Pack;
  13091. if (m_GroupsModule != null)
  13092. {
  13093. ParcelDeedToGroup handlerParcelDeedToGroup = OnParcelDeedToGroup;
  13094. if (handlerParcelDeedToGroup != null)
  13095. {
  13096. handlerParcelDeedToGroup(parcelDeedToGroup.Data.LocalID, parcelDeedToGroup.Data.GroupID, this);
  13097. }
  13098. }
  13099. break;
  13100. case PacketType.GroupNoticesListRequest:
  13101. GroupNoticesListRequestPacket groupNoticesListRequest =
  13102. (GroupNoticesListRequestPacket)Pack;
  13103. #region Packet Session and User Check
  13104. if (m_checkPackets)
  13105. {
  13106. if (groupNoticesListRequest.AgentData.SessionID != SessionId ||
  13107. groupNoticesListRequest.AgentData.AgentID != AgentId)
  13108. break;
  13109. }
  13110. #endregion
  13111. if (m_GroupsModule != null)
  13112. {
  13113. GroupNoticeData[] gn =
  13114. m_GroupsModule.GroupNoticesListRequest(this,
  13115. groupNoticesListRequest.Data.GroupID);
  13116. GroupNoticesListReplyPacket groupNoticesListReply = (GroupNoticesListReplyPacket)PacketPool.Instance.GetPacket(PacketType.GroupNoticesListReply);
  13117. groupNoticesListReply.AgentData =
  13118. new GroupNoticesListReplyPacket.AgentDataBlock();
  13119. groupNoticesListReply.AgentData.AgentID = AgentId;
  13120. groupNoticesListReply.AgentData.GroupID = groupNoticesListRequest.Data.GroupID;
  13121. groupNoticesListReply.Data = new GroupNoticesListReplyPacket.DataBlock[gn.Length];
  13122. int i = 0;
  13123. foreach (GroupNoticeData g in gn)
  13124. {
  13125. groupNoticesListReply.Data[i] = new GroupNoticesListReplyPacket.DataBlock();
  13126. groupNoticesListReply.Data[i].NoticeID =
  13127. g.NoticeID;
  13128. groupNoticesListReply.Data[i].Timestamp =
  13129. g.Timestamp;
  13130. groupNoticesListReply.Data[i].FromName =
  13131. Util.StringToBytes256(g.FromName);
  13132. groupNoticesListReply.Data[i].Subject =
  13133. Util.StringToBytes256(g.Subject);
  13134. groupNoticesListReply.Data[i].HasAttachment =
  13135. g.HasAttachment;
  13136. groupNoticesListReply.Data[i].AssetType =
  13137. g.AssetType;
  13138. i++;
  13139. }
  13140. OutPacket(groupNoticesListReply, ThrottleOutPacketType.Task);
  13141. }
  13142. break;
  13143. case PacketType.GroupNoticeRequest:
  13144. GroupNoticeRequestPacket groupNoticeRequest =
  13145. (GroupNoticeRequestPacket)Pack;
  13146. #region Packet Session and User Check
  13147. if (m_checkPackets)
  13148. {
  13149. if (groupNoticeRequest.AgentData.SessionID != SessionId ||
  13150. groupNoticeRequest.AgentData.AgentID != AgentId)
  13151. break;
  13152. }
  13153. #endregion
  13154. if (m_GroupsModule != null)
  13155. {
  13156. m_GroupsModule.GroupNoticeRequest(this,
  13157. groupNoticeRequest.Data.GroupNoticeID);
  13158. }
  13159. break;
  13160. case PacketType.GroupRoleUpdate:
  13161. GroupRoleUpdatePacket groupRoleUpdate =
  13162. (GroupRoleUpdatePacket)Pack;
  13163. #region Packet Session and User Check
  13164. if (m_checkPackets)
  13165. {
  13166. if (groupRoleUpdate.AgentData.SessionID != SessionId ||
  13167. groupRoleUpdate.AgentData.AgentID != AgentId)
  13168. break;
  13169. }
  13170. #endregion
  13171. if (m_GroupsModule != null)
  13172. {
  13173. foreach (GroupRoleUpdatePacket.RoleDataBlock d in
  13174. groupRoleUpdate.RoleData)
  13175. {
  13176. m_GroupsModule.GroupRoleUpdate(this,
  13177. groupRoleUpdate.AgentData.GroupID,
  13178. d.RoleID,
  13179. Utils.BytesToString(d.Name),
  13180. Utils.BytesToString(d.Description),
  13181. Utils.BytesToString(d.Title),
  13182. d.Powers,
  13183. d.UpdateType);
  13184. }
  13185. m_GroupsModule.NotifyChange(groupRoleUpdate.AgentData.GroupID);
  13186. }
  13187. break;
  13188. case PacketType.GroupRoleChanges:
  13189. GroupRoleChangesPacket groupRoleChanges =
  13190. (GroupRoleChangesPacket)Pack;
  13191. #region Packet Session and User Check
  13192. if (m_checkPackets)
  13193. {
  13194. if (groupRoleChanges.AgentData.SessionID != SessionId ||
  13195. groupRoleChanges.AgentData.AgentID != AgentId)
  13196. break;
  13197. }
  13198. #endregion
  13199. if (m_GroupsModule != null)
  13200. {
  13201. foreach (GroupRoleChangesPacket.RoleChangeBlock d in
  13202. groupRoleChanges.RoleChange)
  13203. {
  13204. m_GroupsModule.GroupRoleChanges(this,
  13205. groupRoleChanges.AgentData.GroupID,
  13206. d.RoleID,
  13207. d.MemberID,
  13208. d.Change);
  13209. }
  13210. m_GroupsModule.NotifyChange(groupRoleChanges.AgentData.GroupID);
  13211. }
  13212. break;
  13213. case PacketType.JoinGroupRequest:
  13214. JoinGroupRequestPacket joinGroupRequest =
  13215. (JoinGroupRequestPacket)Pack;
  13216. #region Packet Session and User Check
  13217. if (m_checkPackets)
  13218. {
  13219. if (joinGroupRequest.AgentData.SessionID != SessionId ||
  13220. joinGroupRequest.AgentData.AgentID != AgentId)
  13221. break;
  13222. }
  13223. #endregion
  13224. if (m_GroupsModule != null)
  13225. {
  13226. m_GroupsModule.JoinGroupRequest(this,
  13227. joinGroupRequest.GroupData.GroupID);
  13228. }
  13229. break;
  13230. case PacketType.LeaveGroupRequest:
  13231. LeaveGroupRequestPacket leaveGroupRequest =
  13232. (LeaveGroupRequestPacket)Pack;
  13233. #region Packet Session and User Check
  13234. if (m_checkPackets)
  13235. {
  13236. if (leaveGroupRequest.AgentData.SessionID != SessionId ||
  13237. leaveGroupRequest.AgentData.AgentID != AgentId)
  13238. break;
  13239. }
  13240. #endregion
  13241. if (m_GroupsModule != null)
  13242. {
  13243. m_GroupsModule.LeaveGroupRequest(this,
  13244. leaveGroupRequest.GroupData.GroupID);
  13245. }
  13246. break;
  13247. case PacketType.EjectGroupMemberRequest:
  13248. EjectGroupMemberRequestPacket ejectGroupMemberRequest =
  13249. (EjectGroupMemberRequestPacket)Pack;
  13250. #region Packet Session and User Check
  13251. if (m_checkPackets)
  13252. {
  13253. if (ejectGroupMemberRequest.AgentData.SessionID != SessionId ||
  13254. ejectGroupMemberRequest.AgentData.AgentID != AgentId)
  13255. break;
  13256. }
  13257. #endregion
  13258. if (m_GroupsModule != null)
  13259. {
  13260. foreach (EjectGroupMemberRequestPacket.EjectDataBlock e
  13261. in ejectGroupMemberRequest.EjectData)
  13262. {
  13263. m_GroupsModule.EjectGroupMemberRequest(this,
  13264. ejectGroupMemberRequest.GroupData.GroupID,
  13265. e.EjecteeID);
  13266. }
  13267. }
  13268. break;
  13269. case PacketType.InviteGroupRequest:
  13270. InviteGroupRequestPacket inviteGroupRequest =
  13271. (InviteGroupRequestPacket)Pack;
  13272. #region Packet Session and User Check
  13273. if (m_checkPackets)
  13274. {
  13275. if (inviteGroupRequest.AgentData.SessionID != SessionId ||
  13276. inviteGroupRequest.AgentData.AgentID != AgentId)
  13277. break;
  13278. }
  13279. #endregion
  13280. if (m_GroupsModule != null)
  13281. {
  13282. foreach (InviteGroupRequestPacket.InviteDataBlock b in
  13283. inviteGroupRequest.InviteData)
  13284. {
  13285. m_GroupsModule.InviteGroupRequest(this,
  13286. inviteGroupRequest.GroupData.GroupID,
  13287. b.InviteeID,
  13288. b.RoleID);
  13289. }
  13290. }
  13291. break;
  13292. //#endregion
  13293. case PacketType.StartLure:
  13294. StartLurePacket startLureRequest = (StartLurePacket)Pack;
  13295. #region Packet Session and User Check
  13296. if (m_checkPackets)
  13297. {
  13298. if (startLureRequest.AgentData.SessionID != SessionId ||
  13299. startLureRequest.AgentData.AgentID != AgentId)
  13300. break;
  13301. }
  13302. #endregion
  13303. StartLure handlerStartLure = OnStartLure;
  13304. if (handlerStartLure != null)
  13305. handlerStartLure(startLureRequest.Info.LureType,
  13306. Utils.BytesToString(
  13307. startLureRequest.Info.Message),
  13308. startLureRequest.TargetData[0].TargetID,
  13309. this);
  13310. break;
  13311. case PacketType.TeleportLureRequest:
  13312. TeleportLureRequestPacket teleportLureRequest =
  13313. (TeleportLureRequestPacket)Pack;
  13314. #region Packet Session and User Check
  13315. if (m_checkPackets)
  13316. {
  13317. if (teleportLureRequest.Info.SessionID != SessionId ||
  13318. teleportLureRequest.Info.AgentID != AgentId)
  13319. break;
  13320. }
  13321. #endregion
  13322. TeleportLureRequest handlerTeleportLureRequest = OnTeleportLureRequest;
  13323. if (handlerTeleportLureRequest != null)
  13324. handlerTeleportLureRequest(
  13325. teleportLureRequest.Info.LureID,
  13326. teleportLureRequest.Info.TeleportFlags,
  13327. this);
  13328. break;
  13329. case PacketType.ClassifiedInfoRequest:
  13330. ClassifiedInfoRequestPacket classifiedInfoRequest =
  13331. (ClassifiedInfoRequestPacket)Pack;
  13332. #region Packet Session and User Check
  13333. if (m_checkPackets)
  13334. {
  13335. if (classifiedInfoRequest.AgentData.SessionID != SessionId ||
  13336. classifiedInfoRequest.AgentData.AgentID != AgentId)
  13337. break;
  13338. }
  13339. #endregion
  13340. ClassifiedInfoRequest handlerClassifiedInfoRequest = OnClassifiedInfoRequest;
  13341. if (handlerClassifiedInfoRequest != null)
  13342. handlerClassifiedInfoRequest(
  13343. classifiedInfoRequest.Data.ClassifiedID,
  13344. this);
  13345. break;
  13346. case PacketType.ClassifiedInfoUpdate:
  13347. ClassifiedInfoUpdatePacket classifiedInfoUpdate =
  13348. (ClassifiedInfoUpdatePacket)Pack;
  13349. #region Packet Session and User Check
  13350. if (m_checkPackets)
  13351. {
  13352. if (classifiedInfoUpdate.AgentData.SessionID != SessionId ||
  13353. classifiedInfoUpdate.AgentData.AgentID != AgentId)
  13354. break;
  13355. }
  13356. #endregion
  13357. ClassifiedInfoUpdate handlerClassifiedInfoUpdate = OnClassifiedInfoUpdate;
  13358. if (handlerClassifiedInfoUpdate != null)
  13359. handlerClassifiedInfoUpdate(
  13360. classifiedInfoUpdate.Data.ClassifiedID,
  13361. classifiedInfoUpdate.Data.Category,
  13362. Utils.BytesToString(
  13363. classifiedInfoUpdate.Data.Name),
  13364. Utils.BytesToString(
  13365. classifiedInfoUpdate.Data.Desc),
  13366. classifiedInfoUpdate.Data.ParcelID,
  13367. classifiedInfoUpdate.Data.ParentEstate,
  13368. classifiedInfoUpdate.Data.SnapshotID,
  13369. new Vector3(
  13370. classifiedInfoUpdate.Data.PosGlobal),
  13371. classifiedInfoUpdate.Data.ClassifiedFlags,
  13372. classifiedInfoUpdate.Data.PriceForListing,
  13373. this);
  13374. break;
  13375. case PacketType.ClassifiedDelete:
  13376. ClassifiedDeletePacket classifiedDelete =
  13377. (ClassifiedDeletePacket)Pack;
  13378. #region Packet Session and User Check
  13379. if (m_checkPackets)
  13380. {
  13381. if (classifiedDelete.AgentData.SessionID != SessionId ||
  13382. classifiedDelete.AgentData.AgentID != AgentId)
  13383. break;
  13384. }
  13385. #endregion
  13386. ClassifiedDelete handlerClassifiedDelete = OnClassifiedDelete;
  13387. if (handlerClassifiedDelete != null)
  13388. handlerClassifiedDelete(
  13389. classifiedDelete.Data.ClassifiedID,
  13390. this);
  13391. break;
  13392. case PacketType.ClassifiedGodDelete:
  13393. ClassifiedGodDeletePacket classifiedGodDelete =
  13394. (ClassifiedGodDeletePacket)Pack;
  13395. #region Packet Session and User Check
  13396. if (m_checkPackets)
  13397. {
  13398. if (classifiedGodDelete.AgentData.SessionID != SessionId ||
  13399. classifiedGodDelete.AgentData.AgentID != AgentId)
  13400. break;
  13401. }
  13402. #endregion
  13403. ClassifiedDelete handlerClassifiedGodDelete = OnClassifiedGodDelete;
  13404. if (handlerClassifiedGodDelete != null)
  13405. handlerClassifiedGodDelete(
  13406. classifiedGodDelete.Data.ClassifiedID,
  13407. this);
  13408. break;
  13409. case PacketType.EventGodDelete:
  13410. EventGodDeletePacket eventGodDelete =
  13411. (EventGodDeletePacket)Pack;
  13412. #region Packet Session and User Check
  13413. if (m_checkPackets)
  13414. {
  13415. if (eventGodDelete.AgentData.SessionID != SessionId ||
  13416. eventGodDelete.AgentData.AgentID != AgentId)
  13417. break;
  13418. }
  13419. #endregion
  13420. EventGodDelete handlerEventGodDelete = OnEventGodDelete;
  13421. if (handlerEventGodDelete != null)
  13422. handlerEventGodDelete(
  13423. eventGodDelete.EventData.EventID,
  13424. eventGodDelete.QueryData.QueryID,
  13425. Utils.BytesToString(
  13426. eventGodDelete.QueryData.QueryText),
  13427. eventGodDelete.QueryData.QueryFlags,
  13428. eventGodDelete.QueryData.QueryStart,
  13429. this);
  13430. break;
  13431. case PacketType.EventNotificationAddRequest:
  13432. EventNotificationAddRequestPacket eventNotificationAdd =
  13433. (EventNotificationAddRequestPacket)Pack;
  13434. #region Packet Session and User Check
  13435. if (m_checkPackets)
  13436. {
  13437. if (eventNotificationAdd.AgentData.SessionID != SessionId ||
  13438. eventNotificationAdd.AgentData.AgentID != AgentId)
  13439. break;
  13440. }
  13441. #endregion
  13442. EventNotificationAddRequest handlerEventNotificationAddRequest = OnEventNotificationAddRequest;
  13443. if (handlerEventNotificationAddRequest != null)
  13444. handlerEventNotificationAddRequest(
  13445. eventNotificationAdd.EventData.EventID, this);
  13446. break;
  13447. case PacketType.EventNotificationRemoveRequest:
  13448. EventNotificationRemoveRequestPacket eventNotificationRemove =
  13449. (EventNotificationRemoveRequestPacket)Pack;
  13450. #region Packet Session and User Check
  13451. if (m_checkPackets)
  13452. {
  13453. if (eventNotificationRemove.AgentData.SessionID != SessionId ||
  13454. eventNotificationRemove.AgentData.AgentID != AgentId)
  13455. break;
  13456. }
  13457. #endregion
  13458. EventNotificationRemoveRequest handlerEventNotificationRemoveRequest = OnEventNotificationRemoveRequest;
  13459. if (handlerEventNotificationRemoveRequest != null)
  13460. handlerEventNotificationRemoveRequest(
  13461. eventNotificationRemove.EventData.EventID, this);
  13462. break;
  13463. case PacketType.RetrieveInstantMessages:
  13464. RetrieveInstantMessagesPacket rimpInstantMessagePack = (RetrieveInstantMessagesPacket)Pack;
  13465. #region Packet Session and User Check
  13466. if (m_checkPackets)
  13467. {
  13468. if (rimpInstantMessagePack.AgentData.SessionID != SessionId ||
  13469. rimpInstantMessagePack.AgentData.AgentID != AgentId)
  13470. break;
  13471. }
  13472. #endregion
  13473. RetrieveInstantMessages handlerRetrieveInstantMessages = OnRetrieveInstantMessages;
  13474. if (handlerRetrieveInstantMessages != null)
  13475. handlerRetrieveInstantMessages(this);
  13476. break;
  13477. case PacketType.PickDelete:
  13478. PickDeletePacket pickDelete =
  13479. (PickDeletePacket)Pack;
  13480. #region Packet Session and User Check
  13481. if (m_checkPackets)
  13482. {
  13483. if (pickDelete.AgentData.SessionID != SessionId ||
  13484. pickDelete.AgentData.AgentID != AgentId)
  13485. break;
  13486. }
  13487. #endregion
  13488. PickDelete handlerPickDelete = OnPickDelete;
  13489. if (handlerPickDelete != null)
  13490. handlerPickDelete(this, pickDelete.Data.PickID);
  13491. break;
  13492. case PacketType.PickGodDelete:
  13493. PickGodDeletePacket pickGodDelete =
  13494. (PickGodDeletePacket)Pack;
  13495. #region Packet Session and User Check
  13496. if (m_checkPackets)
  13497. {
  13498. if (pickGodDelete.AgentData.SessionID != SessionId ||
  13499. pickGodDelete.AgentData.AgentID != AgentId)
  13500. break;
  13501. }
  13502. #endregion
  13503. PickGodDelete handlerPickGodDelete = OnPickGodDelete;
  13504. if (handlerPickGodDelete != null)
  13505. handlerPickGodDelete(this,
  13506. pickGodDelete.AgentData.AgentID,
  13507. pickGodDelete.Data.PickID,
  13508. pickGodDelete.Data.QueryID);
  13509. break;
  13510. case PacketType.PickInfoUpdate:
  13511. PickInfoUpdatePacket pickInfoUpdate =
  13512. (PickInfoUpdatePacket)Pack;
  13513. #region Packet Session and User Check
  13514. if (m_checkPackets)
  13515. {
  13516. if (pickInfoUpdate.AgentData.SessionID != SessionId ||
  13517. pickInfoUpdate.AgentData.AgentID != AgentId)
  13518. break;
  13519. }
  13520. #endregion
  13521. PickInfoUpdate handlerPickInfoUpdate = OnPickInfoUpdate;
  13522. if (handlerPickInfoUpdate != null)
  13523. handlerPickInfoUpdate(this,
  13524. pickInfoUpdate.Data.PickID,
  13525. pickInfoUpdate.Data.CreatorID,
  13526. pickInfoUpdate.Data.TopPick,
  13527. Utils.BytesToString(pickInfoUpdate.Data.Name),
  13528. Utils.BytesToString(pickInfoUpdate.Data.Desc),
  13529. pickInfoUpdate.Data.SnapshotID,
  13530. pickInfoUpdate.Data.SortOrder,
  13531. pickInfoUpdate.Data.Enabled);
  13532. break;
  13533. case PacketType.AvatarNotesUpdate:
  13534. AvatarNotesUpdatePacket avatarNotesUpdate =
  13535. (AvatarNotesUpdatePacket)Pack;
  13536. #region Packet Session and User Check
  13537. if (m_checkPackets)
  13538. {
  13539. if (avatarNotesUpdate.AgentData.SessionID != SessionId ||
  13540. avatarNotesUpdate.AgentData.AgentID != AgentId)
  13541. break;
  13542. }
  13543. #endregion
  13544. AvatarNotesUpdate handlerAvatarNotesUpdate = OnAvatarNotesUpdate;
  13545. if (handlerAvatarNotesUpdate != null)
  13546. handlerAvatarNotesUpdate(this,
  13547. avatarNotesUpdate.Data.TargetID,
  13548. Utils.BytesToString(avatarNotesUpdate.Data.Notes));
  13549. break;
  13550. case PacketType.AvatarInterestsUpdate:
  13551. AvatarInterestsUpdatePacket avatarInterestUpdate =
  13552. (AvatarInterestsUpdatePacket)Pack;
  13553. #region Packet Session and User Check
  13554. if (m_checkPackets)
  13555. {
  13556. if (avatarInterestUpdate.AgentData.SessionID != SessionId ||
  13557. avatarInterestUpdate.AgentData.AgentID != AgentId)
  13558. break;
  13559. }
  13560. #endregion
  13561. AvatarInterestUpdate handlerAvatarInterestUpdate = OnAvatarInterestUpdate;
  13562. if (handlerAvatarInterestUpdate != null)
  13563. handlerAvatarInterestUpdate(this,
  13564. avatarInterestUpdate.PropertiesData.WantToMask,
  13565. Utils.BytesToString(avatarInterestUpdate.PropertiesData.WantToText),
  13566. avatarInterestUpdate.PropertiesData.SkillsMask,
  13567. Utils.BytesToString(avatarInterestUpdate.PropertiesData.SkillsText),
  13568. Utils.BytesToString(avatarInterestUpdate.PropertiesData.LanguagesText));
  13569. break;
  13570. case PacketType.GrantUserRights:
  13571. GrantUserRightsPacket GrantUserRights =
  13572. (GrantUserRightsPacket)Pack;
  13573. #region Packet Session and User Check
  13574. if (m_checkPackets)
  13575. {
  13576. if (GrantUserRights.AgentData.SessionID != SessionId ||
  13577. GrantUserRights.AgentData.AgentID != AgentId)
  13578. break;
  13579. }
  13580. #endregion
  13581. GrantUserFriendRights GrantUserRightsHandler = OnGrantUserRights;
  13582. if (GrantUserRightsHandler != null)
  13583. GrantUserRightsHandler(this,
  13584. GrantUserRights.AgentData.AgentID,
  13585. GrantUserRights.Rights[0].AgentRelated,
  13586. GrantUserRights.Rights[0].RelatedRights);
  13587. break;
  13588. case PacketType.PlacesQuery:
  13589. PlacesQueryPacket placesQueryPacket =
  13590. (PlacesQueryPacket)Pack;
  13591. PlacesQuery handlerPlacesQuery = OnPlacesQuery;
  13592. if (handlerPlacesQuery != null)
  13593. handlerPlacesQuery(placesQueryPacket.AgentData.QueryID,
  13594. placesQueryPacket.TransactionData.TransactionID,
  13595. Utils.BytesToString(
  13596. placesQueryPacket.QueryData.QueryText),
  13597. placesQueryPacket.QueryData.QueryFlags,
  13598. (byte)placesQueryPacket.QueryData.Category,
  13599. Utils.BytesToString(
  13600. placesQueryPacket.QueryData.SimName),
  13601. this);
  13602. break;
  13603. */
  13604. #endregion
  13605. default:
  13606. m_log.Warn("[CLIENT]: unhandled packet " + Pack);
  13607. break;
  13608. }
  13609. PacketPool.Instance.ReturnPacket(Pack);
  13610. }
  13611. private static PrimitiveBaseShape GetShapeFromAddPacket(ObjectAddPacket addPacket)
  13612. {
  13613. PrimitiveBaseShape shape = new PrimitiveBaseShape();
  13614. shape.PCode = addPacket.ObjectData.PCode;
  13615. shape.State = addPacket.ObjectData.State;
  13616. shape.PathBegin = addPacket.ObjectData.PathBegin;
  13617. shape.PathEnd = addPacket.ObjectData.PathEnd;
  13618. shape.PathScaleX = addPacket.ObjectData.PathScaleX;
  13619. shape.PathScaleY = addPacket.ObjectData.PathScaleY;
  13620. shape.PathShearX = addPacket.ObjectData.PathShearX;
  13621. shape.PathShearY = addPacket.ObjectData.PathShearY;
  13622. shape.PathSkew = addPacket.ObjectData.PathSkew;
  13623. shape.ProfileBegin = addPacket.ObjectData.ProfileBegin;
  13624. shape.ProfileEnd = addPacket.ObjectData.ProfileEnd;
  13625. shape.Scale = addPacket.ObjectData.Scale;
  13626. shape.PathCurve = addPacket.ObjectData.PathCurve;
  13627. shape.ProfileCurve = addPacket.ObjectData.ProfileCurve;
  13628. shape.ProfileHollow = addPacket.ObjectData.ProfileHollow;
  13629. shape.PathRadiusOffset = addPacket.ObjectData.PathRadiusOffset;
  13630. shape.PathRevolutions = addPacket.ObjectData.PathRevolutions;
  13631. shape.PathTaperX = addPacket.ObjectData.PathTaperX;
  13632. shape.PathTaperY = addPacket.ObjectData.PathTaperY;
  13633. shape.PathTwist = addPacket.ObjectData.PathTwist;
  13634. shape.PathTwistBegin = addPacket.ObjectData.PathTwistBegin;
  13635. Primitive.TextureEntry ntex = new Primitive.TextureEntry(new UUID("89556747-24cb-43ed-920b-47caed15465f"));
  13636. shape.TextureEntry = ntex.GetBytes();
  13637. //shape.Textures = ntex;
  13638. return shape;
  13639. }
  13640. public ClientInfo GetClientInfo()
  13641. {
  13642. ClientInfo info = m_udpClient.GetClientInfo();
  13643. info.userEP = m_userEndPoint;
  13644. info.proxyEP = null;
  13645. info.agentcircuit = new sAgentCircuitData(RequestClientInfo());
  13646. return info;
  13647. }
  13648. public void SetClientInfo(ClientInfo info)
  13649. {
  13650. m_udpClient.SetClientInfo(info);
  13651. }
  13652. public EndPoint GetClientEP()
  13653. {
  13654. return m_userEndPoint;
  13655. }
  13656. #region Media Parcel Members
  13657. public void SendParcelMediaCommand(uint flags, ParcelMediaCommandEnum command, float time)
  13658. {
  13659. ParcelMediaCommandMessagePacket commandMessagePacket = new ParcelMediaCommandMessagePacket();
  13660. commandMessagePacket.CommandBlock.Flags = flags;
  13661. commandMessagePacket.CommandBlock.Command = (uint)command;
  13662. commandMessagePacket.CommandBlock.Time = time;
  13663. OutPacket(commandMessagePacket, ThrottleOutPacketType.Task);
  13664. }
  13665. public void SendParcelMediaUpdate(string mediaUrl, UUID mediaTextureID,
  13666. byte autoScale, string mediaType, string mediaDesc, int mediaWidth, int mediaHeight,
  13667. byte mediaLoop)
  13668. {
  13669. ParcelMediaUpdatePacket updatePacket = new ParcelMediaUpdatePacket();
  13670. updatePacket.DataBlock.MediaURL = Util.StringToBytes256(mediaUrl);
  13671. updatePacket.DataBlock.MediaID = mediaTextureID;
  13672. updatePacket.DataBlock.MediaAutoScale = autoScale;
  13673. updatePacket.DataBlockExtended.MediaType = Util.StringToBytes256(mediaType);
  13674. updatePacket.DataBlockExtended.MediaDesc = Util.StringToBytes256(mediaDesc);
  13675. updatePacket.DataBlockExtended.MediaWidth = mediaWidth;
  13676. updatePacket.DataBlockExtended.MediaHeight = mediaHeight;
  13677. updatePacket.DataBlockExtended.MediaLoop = mediaLoop;
  13678. OutPacket(updatePacket, ThrottleOutPacketType.Task);
  13679. }
  13680. #endregion
  13681. #region Camera
  13682. public void SendSetFollowCamProperties(UUID objectID, SortedDictionary<int, float> parameters)
  13683. {
  13684. SetFollowCamPropertiesPacket packet = (SetFollowCamPropertiesPacket)PacketPool.Instance.GetPacket(PacketType.SetFollowCamProperties);
  13685. packet.ObjectData.ObjectID = objectID;
  13686. SetFollowCamPropertiesPacket.CameraPropertyBlock[] camPropBlock = new SetFollowCamPropertiesPacket.CameraPropertyBlock[parameters.Count];
  13687. uint idx = 0;
  13688. foreach (KeyValuePair<int, float> pair in parameters)
  13689. {
  13690. SetFollowCamPropertiesPacket.CameraPropertyBlock block = new SetFollowCamPropertiesPacket.CameraPropertyBlock();
  13691. block.Type = pair.Key;
  13692. block.Value = pair.Value;
  13693. camPropBlock[idx++] = block;
  13694. }
  13695. packet.CameraProperty = camPropBlock;
  13696. OutPacket(packet, ThrottleOutPacketType.Task);
  13697. }
  13698. public void SendClearFollowCamProperties(UUID objectID)
  13699. {
  13700. ClearFollowCamPropertiesPacket packet = (ClearFollowCamPropertiesPacket)PacketPool.Instance.GetPacket(PacketType.ClearFollowCamProperties);
  13701. packet.ObjectData.ObjectID = objectID;
  13702. OutPacket(packet, ThrottleOutPacketType.Task);
  13703. }
  13704. #endregion
  13705. public void SetClientOption(string option, string value)
  13706. {
  13707. switch (option)
  13708. {
  13709. default:
  13710. break;
  13711. }
  13712. }
  13713. public string GetClientOption(string option)
  13714. {
  13715. switch (option)
  13716. {
  13717. default:
  13718. break;
  13719. }
  13720. return string.Empty;
  13721. }
  13722. public void KillEndDone()
  13723. {
  13724. }
  13725. #region IClientCore
  13726. private readonly Dictionary<Type, object> m_clientInterfaces = new Dictionary<Type, object>();
  13727. /// <summary>
  13728. /// Register an interface on this client, should only be called in the constructor.
  13729. /// </summary>
  13730. /// <typeparam name="T"></typeparam>
  13731. /// <param name="iface"></param>
  13732. protected void RegisterInterface<T>(T iface)
  13733. {
  13734. lock (m_clientInterfaces)
  13735. {
  13736. if (!m_clientInterfaces.ContainsKey(typeof(T)))
  13737. {
  13738. m_clientInterfaces.Add(typeof(T), iface);
  13739. }
  13740. }
  13741. }
  13742. public bool TryGet<T>(out T iface)
  13743. {
  13744. if (m_clientInterfaces.ContainsKey(typeof(T)))
  13745. {
  13746. iface = (T)m_clientInterfaces[typeof(T)];
  13747. return true;
  13748. }
  13749. iface = default(T);
  13750. return false;
  13751. }
  13752. public T Get<T>()
  13753. {
  13754. return (T)m_clientInterfaces[typeof(T)];
  13755. }
  13756. public void Disconnect(string reason)
  13757. {
  13758. Kick(reason);
  13759. Thread.Sleep(1000);
  13760. Close();
  13761. }
  13762. public void Disconnect()
  13763. {
  13764. Close();
  13765. }
  13766. #endregion
  13767. public void RefreshGroupMembership()
  13768. {
  13769. if (m_GroupsModule != null)
  13770. {
  13771. GroupMembershipData[] GroupMembership =
  13772. m_GroupsModule.GetMembershipData(AgentId);
  13773. m_groupPowers.Clear();
  13774. for (int i = 0; i < GroupMembership.Length; i++)
  13775. {
  13776. m_groupPowers[GroupMembership[i].GroupID] = GroupMembership[i].GroupPowers;
  13777. }
  13778. }
  13779. }
  13780. public string Report()
  13781. {
  13782. return m_udpClient.GetStats();
  13783. }
  13784. public string XReport(string uptime, string version)
  13785. {
  13786. return String.Empty;
  13787. }
  13788. public void MakeAssetRequest(TransferRequestPacket transferRequest, UUID taskID)
  13789. {
  13790. UUID requestID = UUID.Zero;
  13791. if (transferRequest.TransferInfo.SourceType == 2)
  13792. {
  13793. //direct asset request
  13794. requestID = new UUID(transferRequest.TransferInfo.Params, 0);
  13795. }
  13796. else if (transferRequest.TransferInfo.SourceType == 3)
  13797. {
  13798. //inventory asset request
  13799. requestID = new UUID(transferRequest.TransferInfo.Params, 80);
  13800. //m_log.Debug("[XXX] inventory asset request " + requestID);
  13801. //if (taskID == UUID.Zero) // Agent
  13802. // if (m_scene is HGScene)
  13803. // {
  13804. // m_log.Debug("[XXX] hg asset request " + requestID);
  13805. // // We may need to fetch the asset from the user's asset server into the local asset server
  13806. // HGAssetMapper mapper = ((HGScene)m_scene).AssetMapper;
  13807. // mapper.Get(requestID, AgentId);
  13808. // }
  13809. }
  13810. //check to see if asset is in local cache, if not we need to request it from asset server.
  13811. //m_log.Debug("asset request " + requestID);
  13812. m_assetService.Get(requestID.ToString(), transferRequest, AssetReceived);
  13813. }
  13814. protected void AssetReceived(string id, Object sender, AssetBase asset)
  13815. {
  13816. TransferRequestPacket transferRequest = (TransferRequestPacket)sender;
  13817. UUID requestID = UUID.Zero;
  13818. byte source = 2;
  13819. if ((transferRequest.TransferInfo.SourceType == 2) || (transferRequest.TransferInfo.SourceType == 2222))
  13820. {
  13821. //direct asset request
  13822. requestID = new UUID(transferRequest.TransferInfo.Params, 0);
  13823. }
  13824. else if ((transferRequest.TransferInfo.SourceType == 3) || (transferRequest.TransferInfo.SourceType == 3333))
  13825. {
  13826. //inventory asset request
  13827. requestID = new UUID(transferRequest.TransferInfo.Params, 80);
  13828. source = 3;
  13829. //m_log.Debug("asset request " + requestID);
  13830. }
  13831. if (null == asset)
  13832. {
  13833. if ((m_hyperAssets != null) && (transferRequest.TransferInfo.SourceType < 2000))
  13834. {
  13835. // Try the user's inventory, but only if it's different from the regions'
  13836. string userAssets = m_hyperAssets.GetUserAssetServer(AgentId);
  13837. if ((userAssets != string.Empty) && (userAssets != m_hyperAssets.GetSimAssetServer()))
  13838. {
  13839. m_log.DebugFormat("[CLIENT]: asset {0} not found in local asset storage. Trying user's storage.", id);
  13840. if (transferRequest.TransferInfo.SourceType == 2)
  13841. transferRequest.TransferInfo.SourceType = 2222; // marker
  13842. else if (transferRequest.TransferInfo.SourceType == 3)
  13843. transferRequest.TransferInfo.SourceType = 3333; // marker
  13844. m_assetService.Get(userAssets + "/" + id, transferRequest, AssetReceived);
  13845. return;
  13846. }
  13847. }
  13848. //m_log.DebugFormat("[ASSET CACHE]: Asset transfer request for asset which is {0} already known to be missing. Dropping", requestID);
  13849. // FIXME: We never tell the client about assets which do not exist when requested by this transfer mechanism, which can't be right.
  13850. return;
  13851. }
  13852. // Scripts cannot be retrieved by direct request
  13853. if (transferRequest.TransferInfo.SourceType == 2 && asset.Type == 10)
  13854. return;
  13855. // The asset is known to exist and is in our cache, so add it to the AssetRequests list
  13856. AssetRequestToClient req = new AssetRequestToClient();
  13857. req.AssetInf = asset;
  13858. req.AssetRequestSource = source;
  13859. req.IsTextureRequest = false;
  13860. req.NumPackets = CalculateNumPackets(asset.Data);
  13861. req.Params = transferRequest.TransferInfo.Params;
  13862. req.RequestAssetID = requestID;
  13863. req.TransferRequestID = transferRequest.TransferInfo.TransferID;
  13864. SendAsset(req);
  13865. }
  13866. /// <summary>
  13867. /// Calculate the number of packets required to send the asset to the client.
  13868. /// </summary>
  13869. /// <param name="data"></param>
  13870. /// <returns></returns>
  13871. private static int CalculateNumPackets(byte[] data)
  13872. {
  13873. const uint m_maxPacketSize = 600;
  13874. int numPackets = 1;
  13875. if (data.LongLength > m_maxPacketSize)
  13876. {
  13877. // over max number of bytes so split up file
  13878. long restData = data.LongLength - m_maxPacketSize;
  13879. int restPackets = (int)((restData + m_maxPacketSize - 1) / m_maxPacketSize);
  13880. numPackets += restPackets;
  13881. }
  13882. return numPackets;
  13883. }
  13884. #region IClientIPEndpoint Members
  13885. public IPAddress EndPoint
  13886. {
  13887. get
  13888. {
  13889. if (m_userEndPoint is IPEndPoint)
  13890. {
  13891. IPEndPoint ep = (IPEndPoint)m_userEndPoint;
  13892. return ep.Address;
  13893. }
  13894. return null;
  13895. }
  13896. }
  13897. #endregion
  13898. public void SendRebakeAvatarTextures(UUID textureID)
  13899. {
  13900. RebakeAvatarTexturesPacket pack =
  13901. (RebakeAvatarTexturesPacket)PacketPool.Instance.GetPacket(PacketType.RebakeAvatarTextures);
  13902. pack.TextureData = new RebakeAvatarTexturesPacket.TextureDataBlock();
  13903. pack.TextureData.TextureID = textureID;
  13904. OutPacket(pack, ThrottleOutPacketType.Task);
  13905. }
  13906. #region PriorityQueue
  13907. public class PriorityQueue<TPriority, TValue>
  13908. {
  13909. internal delegate bool UpdatePriorityHandler(ref TPriority priority, uint local_id);
  13910. private MinHeap<MinHeapItem>[] m_heaps = new MinHeap<MinHeapItem>[1];
  13911. private Dictionary<uint, LookupItem> m_lookupTable;
  13912. private Comparison<TPriority> m_comparison;
  13913. private object m_syncRoot = new object();
  13914. internal PriorityQueue() :
  13915. this(MinHeap<MinHeapItem>.DEFAULT_CAPACITY, Comparer<TPriority>.Default) { }
  13916. internal PriorityQueue(int capacity) :
  13917. this(capacity, Comparer<TPriority>.Default) { }
  13918. internal PriorityQueue(IComparer<TPriority> comparer) :
  13919. this(new Comparison<TPriority>(comparer.Compare)) { }
  13920. internal PriorityQueue(Comparison<TPriority> comparison) :
  13921. this(MinHeap<MinHeapItem>.DEFAULT_CAPACITY, comparison) { }
  13922. internal PriorityQueue(int capacity, IComparer<TPriority> comparer) :
  13923. this(capacity, new Comparison<TPriority>(comparer.Compare)) { }
  13924. internal PriorityQueue(int capacity, Comparison<TPriority> comparison)
  13925. {
  13926. m_lookupTable = new Dictionary<uint, LookupItem>(capacity);
  13927. for (int i = 0; i < m_heaps.Length; ++i)
  13928. m_heaps[i] = new MinHeap<MinHeapItem>(capacity);
  13929. this.m_comparison = comparison;
  13930. }
  13931. public object SyncRoot { get { return this.m_syncRoot; } }
  13932. internal int Count
  13933. {
  13934. get
  13935. {
  13936. int count = 0;
  13937. for (int i = 0; i < m_heaps.Length; ++i)
  13938. count = m_heaps[i].Count;
  13939. return count;
  13940. }
  13941. }
  13942. public bool Enqueue(TPriority priority, TValue value, uint local_id)
  13943. {
  13944. LookupItem item;
  13945. if (m_lookupTable.TryGetValue(local_id, out item))
  13946. {
  13947. item.Heap[item.Handle] = new MinHeapItem(priority, value, local_id, this.m_comparison);
  13948. return false;
  13949. }
  13950. else
  13951. {
  13952. item.Heap = m_heaps[0];
  13953. item.Heap.Add(new MinHeapItem(priority, value, local_id, this.m_comparison), ref item.Handle);
  13954. m_lookupTable.Add(local_id, item);
  13955. return true;
  13956. }
  13957. }
  13958. internal TValue Peek()
  13959. {
  13960. for (int i = 0; i < m_heaps.Length; ++i)
  13961. if (m_heaps[i].Count > 0)
  13962. return m_heaps[i].Min().Value;
  13963. throw new InvalidOperationException(string.Format("The {0} is empty", this.GetType().ToString()));
  13964. }
  13965. internal TValue Dequeue()
  13966. {
  13967. for (int i = 0; i < m_heaps.Length; ++i)
  13968. {
  13969. if (m_heaps[i].Count > 0)
  13970. {
  13971. MinHeapItem item = m_heaps[i].RemoveMin();
  13972. m_lookupTable.Remove(item.LocalID);
  13973. return item.Value;
  13974. }
  13975. }
  13976. throw new InvalidOperationException(string.Format("The {0} is empty", this.GetType().ToString()));
  13977. }
  13978. internal void Reprioritize(UpdatePriorityHandler handler)
  13979. {
  13980. MinHeapItem item;
  13981. TPriority priority;
  13982. foreach (LookupItem lookup in new List<LookupItem>(this.m_lookupTable.Values))
  13983. {
  13984. if (lookup.Heap.TryGetValue(lookup.Handle, out item))
  13985. {
  13986. priority = item.Priority;
  13987. if (handler(ref priority, item.LocalID))
  13988. {
  13989. if (lookup.Heap.ContainsHandle(lookup.Handle))
  13990. lookup.Heap[lookup.Handle] =
  13991. new MinHeapItem(priority, item.Value, item.LocalID, this.m_comparison);
  13992. }
  13993. else
  13994. {
  13995. m_log.Warn("[LLCLIENTVIEW]: UpdatePriorityHandler returned false, dropping update");
  13996. lookup.Heap.Remove(lookup.Handle);
  13997. this.m_lookupTable.Remove(item.LocalID);
  13998. }
  13999. }
  14000. }
  14001. }
  14002. #region MinHeapItem
  14003. private struct MinHeapItem : IComparable<MinHeapItem>
  14004. {
  14005. private TPriority priority;
  14006. private TValue value;
  14007. private uint local_id;
  14008. private Comparison<TPriority> comparison;
  14009. internal MinHeapItem(TPriority priority, TValue value, uint local_id) :
  14010. this(priority, value, local_id, Comparer<TPriority>.Default) { }
  14011. internal MinHeapItem(TPriority priority, TValue value, uint local_id, IComparer<TPriority> comparer) :
  14012. this(priority, value, local_id, new Comparison<TPriority>(comparer.Compare)) { }
  14013. internal MinHeapItem(TPriority priority, TValue value, uint local_id, Comparison<TPriority> comparison)
  14014. {
  14015. this.priority = priority;
  14016. this.value = value;
  14017. this.local_id = local_id;
  14018. this.comparison = comparison;
  14019. }
  14020. internal TPriority Priority { get { return this.priority; } }
  14021. internal TValue Value { get { return this.value; } }
  14022. internal uint LocalID { get { return this.local_id; } }
  14023. public override string ToString()
  14024. {
  14025. StringBuilder sb = new StringBuilder();
  14026. sb.Append("[");
  14027. if (this.priority != null)
  14028. sb.Append(this.priority.ToString());
  14029. sb.Append(",");
  14030. if (this.value != null)
  14031. sb.Append(this.value.ToString());
  14032. sb.Append("]");
  14033. return sb.ToString();
  14034. }
  14035. public int CompareTo(MinHeapItem other)
  14036. {
  14037. return this.comparison(this.priority, other.priority);
  14038. }
  14039. }
  14040. #endregion
  14041. #region LookupItem
  14042. private struct LookupItem
  14043. {
  14044. internal MinHeap<MinHeapItem> Heap;
  14045. internal IHandle Handle;
  14046. }
  14047. #endregion
  14048. }
  14049. public struct PacketProcessor
  14050. {
  14051. public PacketMethod method;
  14052. public bool Async;
  14053. }
  14054. public class AsyncPacketProcess
  14055. {
  14056. public bool result = false;
  14057. public readonly LLClientView ClientView = null;
  14058. public readonly Packet Pack = null;
  14059. public readonly PacketMethod Method = null;
  14060. public AsyncPacketProcess(LLClientView pClientview, PacketMethod pMethod, Packet pPack)
  14061. {
  14062. ClientView = pClientview;
  14063. Method = pMethod;
  14064. Pack = pPack;
  14065. }
  14066. }
  14067. #endregion
  14068. public static OSD BuildEvent(string eventName, OSD eventBody)
  14069. {
  14070. OSDMap osdEvent = new OSDMap(2);
  14071. osdEvent.Add("message", new OSDString(eventName));
  14072. osdEvent.Add("body", eventBody);
  14073. return osdEvent;
  14074. }
  14075. public void SendAvatarInterestsReply(UUID avatarID, uint wantMask, string wantText, uint skillsMask, string skillsText, string languages)
  14076. {
  14077. AvatarInterestsReplyPacket packet = (AvatarInterestsReplyPacket)PacketPool.Instance.GetPacket(PacketType.AvatarInterestsReply);
  14078. packet.AgentData = new AvatarInterestsReplyPacket.AgentDataBlock();
  14079. packet.AgentData.AgentID = AgentId;
  14080. packet.AgentData.AvatarID = avatarID;
  14081. packet.PropertiesData = new AvatarInterestsReplyPacket.PropertiesDataBlock();
  14082. packet.PropertiesData.WantToMask = wantMask;
  14083. packet.PropertiesData.WantToText = Utils.StringToBytes(wantText);
  14084. packet.PropertiesData.SkillsMask = skillsMask;
  14085. packet.PropertiesData.SkillsText = Utils.StringToBytes(skillsText);
  14086. packet.PropertiesData.LanguagesText = Utils.StringToBytes(languages);
  14087. OutPacket(packet, ThrottleOutPacketType.Task);
  14088. }
  14089. }
  14090. }