2007-01-31 22:09:20 +00:00
|
|
|
/*
|
|
|
|
Copyright (c) 2007 Michael Wright
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions are met:
|
|
|
|
* * Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* * Neither the name of the <organization> nor the
|
|
|
|
* names of its contributors may be used to endorse or promote products
|
|
|
|
* derived from this software without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY <copyright holder> ``AS IS'' AND ANY
|
|
|
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
|
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
|
|
* DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
|
|
|
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
|
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
|
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
|
|
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
|
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
|
|
|
using System;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
using libsecondlife;
|
|
|
|
using libsecondlife.Packets;
|
|
|
|
using libsecondlife.AssetSystem;
|
|
|
|
using System.IO;
|
|
|
|
using Axiom.MathLib;
|
|
|
|
|
|
|
|
namespace Second_server
|
|
|
|
{
|
|
|
|
/// <summary>
|
|
|
|
/// Description of Agent_Manager.
|
|
|
|
/// </summary>
|
|
|
|
public class Agent_Manager
|
|
|
|
{
|
|
|
|
public Dictionary<libsecondlife.LLUUID,Avatar_data> Agent_list;
|
|
|
|
//public uint number_agents=0;
|
|
|
|
private uint local_numer=0;
|
|
|
|
private Server server;
|
|
|
|
public Prim_manager prim_man;
|
|
|
|
private byte [] data1;
|
|
|
|
|
|
|
|
private libsecondlife.Packets.RegionHandshakePacket reg;
|
|
|
|
private System.Text.Encoding enc = System.Text.Encoding.ASCII;
|
|
|
|
public libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock avatar_template;
|
|
|
|
//private int appc=0;
|
|
|
|
|
|
|
|
public Agent_Manager(Server serve)
|
|
|
|
{
|
|
|
|
Agent_list=new Dictionary<libsecondlife.LLUUID,Avatar_data>();
|
|
|
|
server=serve;
|
|
|
|
this.initialise();
|
|
|
|
}
|
|
|
|
//***************************************************
|
|
|
|
public Avatar_data Get_Agent(LLUUID id)
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
if(!this.Agent_list.ContainsKey(id))
|
|
|
|
{
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
Avatar_data ad=this.Agent_list[id];
|
|
|
|
return ad;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Add_Agent(Avatar_data agent)
|
|
|
|
{
|
|
|
|
this.Agent_list.Add(agent.Full_ID,agent);
|
|
|
|
}
|
|
|
|
|
|
|
|
public bool New_Agent(User_Agent_info User_info)
|
|
|
|
{
|
|
|
|
Avatar_data ad=new Avatar_data();
|
|
|
|
ad.Full_ID=User_info.AgentID;
|
|
|
|
ad.Net_info=User_info;
|
|
|
|
ad.pos=new LLVector3(100,100,22);
|
|
|
|
this.Agent_list.Add(ad.Full_ID,ad);
|
|
|
|
return(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Agent_join(User_Agent_info User_info)
|
|
|
|
{
|
|
|
|
//send region data
|
|
|
|
server.SendPacket(reg,true,User_info);
|
|
|
|
|
|
|
|
//inform client of join comlete
|
|
|
|
libsecondlife.Packets.AgentMovementCompletePacket mov=new AgentMovementCompletePacket();
|
|
|
|
mov.AgentData.SessionID=User_info.SessionID;
|
|
|
|
mov.AgentData.AgentID=User_info.AgentID;
|
|
|
|
mov.Data.RegionHandle=1096213093147648;
|
|
|
|
mov.Data.Timestamp=1169838966;
|
|
|
|
mov.Data.Position=new LLVector3(100f,100f,22f);
|
|
|
|
mov.Data.LookAt=new LLVector3(0.99f,0.042f,0);
|
|
|
|
server.SendPacket(mov,true,User_info);
|
|
|
|
}
|
|
|
|
public void tick()
|
|
|
|
{
|
|
|
|
//update positions
|
|
|
|
foreach (KeyValuePair<libsecondlife.LLUUID,Avatar_data> kp in this.Agent_list)
|
|
|
|
{
|
|
|
|
|
|
|
|
kp.Value.pos.X+=(kp.Value.vel.X*0.2f);
|
|
|
|
kp.Value.pos.Y+=(kp.Value.vel.Y*0.2f);
|
|
|
|
kp.Value.pos.Z+=(kp.Value.vel.Z*0.2f);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//**************************************************************
|
|
|
|
private void initialise()
|
|
|
|
{
|
|
|
|
//Region data
|
|
|
|
reg=new RegionHandshakePacket();
|
|
|
|
reg.RegionInfo.BillableFactor=0;
|
|
|
|
reg.RegionInfo.IsEstateManager=false;
|
|
|
|
reg.RegionInfo.TerrainHeightRange00=60;
|
|
|
|
reg.RegionInfo.TerrainHeightRange01=60;
|
|
|
|
reg.RegionInfo.TerrainHeightRange10=60;
|
|
|
|
reg.RegionInfo.TerrainHeightRange11=60;
|
|
|
|
reg.RegionInfo.TerrainStartHeight00=20;
|
|
|
|
reg.RegionInfo.TerrainStartHeight01=20;
|
|
|
|
reg.RegionInfo.TerrainStartHeight10=20;
|
|
|
|
reg.RegionInfo.TerrainStartHeight11=20;
|
|
|
|
reg.RegionInfo.SimAccess=13;
|
|
|
|
reg.RegionInfo.WaterHeight=5;
|
|
|
|
reg.RegionInfo.RegionFlags=72458694;
|
|
|
|
reg.RegionInfo.SimName=enc.GetBytes( "Test Sandbox\0");
|
|
|
|
reg.RegionInfo.SimOwner=new LLUUID("00000000-0000-0000-0000-000000000000");
|
|
|
|
reg.RegionInfo.TerrainBase0=new LLUUID("b8d3965a-ad78-bf43-699b-bff8eca6c975");
|
|
|
|
reg.RegionInfo.TerrainBase1=new LLUUID("abb783e6-3e93-26c0-248a-247666855da3");
|
|
|
|
reg.RegionInfo.TerrainBase2=new LLUUID("179cdabd-398a-9b6b-1391-4dc333ba321f");
|
|
|
|
reg.RegionInfo.TerrainBase3=new LLUUID("beb169c7-11ea-fff2-efe5-0f24dc881df2");
|
|
|
|
reg.RegionInfo.TerrainDetail0=new LLUUID("00000000-0000-0000-0000-000000000000");
|
|
|
|
reg.RegionInfo.TerrainDetail1=new LLUUID("00000000-0000-0000-0000-000000000000");
|
|
|
|
reg.RegionInfo.TerrainDetail2=new LLUUID("00000000-0000-0000-0000-000000000000");
|
|
|
|
reg.RegionInfo.TerrainDetail3=new LLUUID("00000000-0000-0000-0000-000000000000");
|
|
|
|
reg.RegionInfo.CacheID=new LLUUID("545ec0a5-5751-1026-8a0b-216e38a7ab33");
|
|
|
|
|
|
|
|
this.setuptemplate("objectupate168.dat");
|
|
|
|
}
|
|
|
|
|
|
|
|
public void setuptemplate(string name)
|
|
|
|
{
|
|
|
|
/*ObjectUpdatePacket objupdate=new ObjectUpdatePacket();
|
|
|
|
objupdate.RegionData.RegionHandle=1096213093147648;
|
|
|
|
objupdate.RegionData.TimeDilation=64096;
|
|
|
|
objupdate.ObjectData=new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1];
|
|
|
|
*/
|
|
|
|
int i=0;
|
|
|
|
FileInfo fInfo = new FileInfo(name);
|
|
|
|
|
|
|
|
long numBytes = fInfo.Length;
|
|
|
|
|
|
|
|
FileStream fStream = new FileStream(name, FileMode.Open, FileAccess.Read);
|
|
|
|
|
|
|
|
BinaryReader br = new BinaryReader(fStream);
|
|
|
|
|
|
|
|
byte [] data1 = br.ReadBytes((int)numBytes);
|
|
|
|
|
|
|
|
br.Close();
|
|
|
|
|
|
|
|
fStream.Close();
|
|
|
|
|
|
|
|
libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock objdata=new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock(data1,ref i);
|
|
|
|
|
|
|
|
//objupdate.ObjectData[0]=objdata;
|
|
|
|
|
|
|
|
System.Text.Encoding enc = System.Text.Encoding.ASCII;
|
|
|
|
libsecondlife.LLVector3 pos=new LLVector3(objdata.ObjectData, 16);
|
|
|
|
pos.X=100f;
|
|
|
|
objdata.ID=8880000;
|
|
|
|
objdata.NameValue=enc.GetBytes("FirstName STRING RW SV Test \nLastName STRING RW SV User \0");
|
|
|
|
libsecondlife.LLVector3 pos2=new LLVector3(13.981f,100.0f,20.0f);
|
|
|
|
//objdata.FullID=user.AgentID;
|
|
|
|
byte[] pb=pos.GetBytes();
|
|
|
|
|
|
|
|
Array.Copy(pb,0,objdata.ObjectData,16,pb.Length);
|
|
|
|
|
|
|
|
avatar_template=objdata;
|
|
|
|
|
|
|
|
}
|
|
|
|
//**********************************************************
|
|
|
|
public void send_intial_data(User_Agent_info User_info)
|
|
|
|
{
|
|
|
|
|
|
|
|
//shouldn't really have to read all this in from disk for every new client?
|
2007-02-01 00:15:47 +00:00
|
|
|
string data_path=System.AppDomain.CurrentDomain.BaseDirectory + @"\layer_data\";
|
2007-01-31 22:09:20 +00:00
|
|
|
|
|
|
|
//send layerdata
|
|
|
|
LayerDataPacket layerpack=new LayerDataPacket();
|
|
|
|
layerpack.LayerID.Type=76;
|
|
|
|
//layerpack.LayerData.ReadfromFile(data_path+@"layerdata0.dat");
|
|
|
|
this.read_layerdata(User_info,ref layerpack,data_path+@"layerdata0.dat");
|
|
|
|
|
|
|
|
//server.SendPacket(layerpack,true,User_info);
|
|
|
|
|
|
|
|
LayerDataPacket layerpack1=new LayerDataPacket();
|
|
|
|
layerpack1.LayerID.Type=76;
|
|
|
|
//layerpack1.LayerData.ReadfromFile(data_path+@"layerdata1.dat");
|
|
|
|
this.read_layerdata(User_info,ref layerpack,data_path+@"layerdata1.dat");
|
|
|
|
//server.SendPacket(layerpack1,true,User_info);
|
|
|
|
|
|
|
|
LayerDataPacket layerpack2=new LayerDataPacket();
|
|
|
|
layerpack2.LayerID.Type=56;
|
|
|
|
//layerpack2.LayerData.ReadfromFile(data_path+@"layerdata2.dat");
|
|
|
|
this.read_layerdata(User_info,ref layerpack,data_path+@"layerdata2.dat");
|
|
|
|
//server.SendPacket(layerpack2,true,User_info);
|
|
|
|
|
|
|
|
LayerDataPacket layerpack3=new LayerDataPacket();
|
|
|
|
layerpack3.LayerID.Type=55;
|
|
|
|
//layerpack3.LayerData.ReadfromFile(data_path+@"layerdata3.dat");
|
|
|
|
this.read_layerdata(User_info,ref layerpack,data_path+@"layerdata3.dat");
|
|
|
|
//server.SendPacket(layerpack3,true,User_info);
|
|
|
|
|
|
|
|
LayerDataPacket layerpack4=new LayerDataPacket();
|
|
|
|
layerpack4.LayerID.Type=56;
|
|
|
|
//layerpack4.LayerData.ReadfromFile(data_path+@"layerdata4.dat");
|
|
|
|
this.read_layerdata(User_info,ref layerpack,data_path+@"layerdata4.dat");
|
|
|
|
//server.SendPacket(layerpack4,true,User_info);
|
|
|
|
|
|
|
|
LayerDataPacket layerpack5=new LayerDataPacket();
|
|
|
|
layerpack5.LayerID.Type=55;
|
|
|
|
//layerpack5.LayerData.ReadfromFile(data_path+@"layerdata5.dat");
|
|
|
|
this.read_layerdata(User_info,ref layerpack,data_path+@"layerdata5.dat");
|
|
|
|
//server.SendPacket(layerpack5,true,User_info);
|
|
|
|
|
|
|
|
|
|
|
|
//send intial set of captured prims data?
|
|
|
|
this.prim_man.Read_Prim_database( "objectdatabase.ini",User_info);
|
|
|
|
|
|
|
|
//send prims that have been created by users
|
|
|
|
//prim_man.send_existing_prims(User_info);
|
|
|
|
|
|
|
|
//send update about clients avatar
|
|
|
|
this.send_intial_avatar_position(User_info);
|
|
|
|
|
|
|
|
//send updates about all other users
|
|
|
|
//this.send_test_avatar_position(User_info);
|
|
|
|
foreach (KeyValuePair<libsecondlife.LLUUID,Avatar_data> kp in this.Agent_list)
|
|
|
|
{
|
|
|
|
if(kp.Value.Net_info.AgentID!=User_info.AgentID)
|
|
|
|
{
|
|
|
|
this.send_other_avatar_position(User_info,kp.Value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
public void send_intial_avatar_position(User_Agent_info User_info)
|
|
|
|
{
|
|
|
|
//send a objectupdate packet with information about the clients avatar
|
|
|
|
ObjectUpdatePacket objupdate=new ObjectUpdatePacket();
|
|
|
|
objupdate.RegionData.RegionHandle=1096213093147648;
|
|
|
|
objupdate.RegionData.TimeDilation=64096;
|
|
|
|
objupdate.ObjectData=new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1];
|
|
|
|
|
|
|
|
objupdate.ObjectData[0]=avatar_template;
|
|
|
|
//give this avatar object a local id and assign the user a name
|
|
|
|
objupdate.ObjectData[0].ID=8880000+this.local_numer;
|
|
|
|
User_info.localID=objupdate.ObjectData[0].ID;
|
|
|
|
//User_info.name="Test"+this.local_numer+" User";
|
|
|
|
this.Get_Agent(User_info.AgentID).started=true;
|
|
|
|
objupdate.ObjectData[0].FullID=User_info.AgentID;
|
|
|
|
objupdate.ObjectData[0].NameValue=enc.GetBytes("FirstName STRING RW SV Test"+ this.local_numer+"\nLastName STRING RW SV User \0");
|
|
|
|
User_info.name="FirstName STRING RW SV Test"+ this.local_numer+"\nLastName STRING RW SV User \0";
|
|
|
|
User_info.last_name="User";
|
|
|
|
User_info.first_name="Test"+this.local_numer;
|
|
|
|
libsecondlife.LLVector3 pos2=new LLVector3(100f,100.0f,22.0f);
|
|
|
|
|
|
|
|
byte[] pb=pos2.GetBytes();
|
|
|
|
|
|
|
|
Array.Copy(pb,0,objupdate.ObjectData[0].ObjectData,16,pb.Length);
|
|
|
|
this.local_numer++;
|
|
|
|
|
|
|
|
server.SendPacket(objupdate,true,User_info);
|
|
|
|
|
|
|
|
//send this info to other existing clients
|
|
|
|
foreach (KeyValuePair<libsecondlife.LLUUID,Avatar_data> kp in this.Agent_list)
|
|
|
|
{
|
|
|
|
if(kp.Value.Net_info.AgentID!=User_info.AgentID)
|
|
|
|
{
|
|
|
|
server.SendPacket(objupdate,true,kp.Value.Net_info);
|
|
|
|
this.send_other_apper(kp.Value.Net_info,objupdate.ObjectData[0].FullID);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
public void send_intial_avatar_apper(User_Agent_info user)
|
|
|
|
{
|
|
|
|
|
|
|
|
//seems that we don't send a avatarapperance for ourself.
|
|
|
|
/*AvatarAppearancePacket avp=new AvatarAppearancePacket();
|
|
|
|
|
|
|
|
avp.VisualParam=new AvatarAppearancePacket.VisualParamBlock[218];
|
|
|
|
avp.ObjectData.TextureEntry=this.avatar_template.TextureEntry;// br.ReadBytes((int)numBytes);
|
|
|
|
|
|
|
|
AvatarAppearancePacket.VisualParamBlock avblock=null;
|
|
|
|
for(int i=0; i<218; i++)
|
|
|
|
{
|
|
|
|
avblock=new AvatarAppearancePacket.VisualParamBlock();
|
|
|
|
avblock.ParamValue=(byte)100;
|
|
|
|
avp.VisualParam[i]=avblock;
|
|
|
|
}
|
|
|
|
|
|
|
|
avp.Sender.IsTrial=false;
|
|
|
|
avp.Sender.ID=user.AgentID;
|
|
|
|
*/
|
|
|
|
|
|
|
|
AgentWearablesUpdatePacket aw=new AgentWearablesUpdatePacket();
|
|
|
|
aw.AgentData.AgentID=user.AgentID;
|
|
|
|
aw.AgentData.SerialNum=0;//(uint)appc;
|
|
|
|
//appc++;
|
|
|
|
aw.AgentData.SessionID=user.SessionID;//new LLUUID("00000000-0000-0000-0000-000000000000");//user.SessionID;
|
|
|
|
|
|
|
|
aw.WearableData= new AgentWearablesUpdatePacket.WearableDataBlock[13];
|
|
|
|
AgentWearablesUpdatePacket.WearableDataBlock awb=null;
|
|
|
|
awb=new AgentWearablesUpdatePacket.WearableDataBlock();
|
|
|
|
awb.WearableType=(byte)0;
|
|
|
|
awb.AssetID=new LLUUID("66c41e39-38f9-f75a-024e-585989bfab73");
|
|
|
|
//awb.ItemID=new LLUUID("b7878000-0000-0000-0000-000000000000");
|
|
|
|
awb.ItemID=new LLUUID("b7878441893b094917f791174bc8401c");
|
|
|
|
//awb.ItemID=new LLUUID("00000000-0000-0000-0000-000000000000");
|
|
|
|
aw.WearableData[0]=awb;
|
|
|
|
|
|
|
|
|
|
|
|
/*awb=new AgentWearablesUpdatePacket.WearableDataBlock();
|
|
|
|
awb.WearableType=(byte)1;
|
|
|
|
awb.AssetID=new LLUUID("e0ee49b5a4184df8d3c9a65361fe7f49");
|
|
|
|
awb.ItemID=new LLUUID("193f0876fc11d143797454352f9c9c26");
|
|
|
|
//awb.ItemID=new LLUUID("00000000-0000-0000-0000-000000000000");
|
|
|
|
aw.WearableData[1]=awb;*/
|
|
|
|
|
|
|
|
|
|
|
|
for(int i=1; i<13; i++)
|
|
|
|
{
|
|
|
|
awb=new AgentWearablesUpdatePacket.WearableDataBlock();
|
|
|
|
awb.WearableType=(byte)i;
|
|
|
|
awb.AssetID=new LLUUID("00000000-0000-0000-0000-000000000000");
|
|
|
|
awb.ItemID=new LLUUID("00000000-0000-0000-0000-000000000000");
|
|
|
|
aw.WearableData[i]=awb;
|
|
|
|
}
|
|
|
|
|
|
|
|
//server.SendPacket(avp,true,user);
|
|
|
|
server.SendPacket(aw,true,user);
|
|
|
|
//System.Console.WriteLine(avp);
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
public void send_other_apper(User_Agent_info user,LLUUID id)
|
|
|
|
{
|
|
|
|
AvatarAppearancePacket avp=new AvatarAppearancePacket();
|
|
|
|
|
|
|
|
|
|
|
|
avp.VisualParam=new AvatarAppearancePacket.VisualParamBlock[218];
|
|
|
|
//avp.ObjectData.TextureEntry=this.avatar_template.TextureEntry;// br.ReadBytes((int)numBytes);
|
|
|
|
|
|
|
|
FileInfo fInfo = new FileInfo("Avatar_texture3.dat");
|
|
|
|
|
|
|
|
long numBytes = fInfo.Length;
|
|
|
|
FileStream fStream = new FileStream("Avatar_texture3.dat", FileMode.Open, FileAccess.Read);
|
|
|
|
BinaryReader br = new BinaryReader(fStream);
|
|
|
|
avp.ObjectData.TextureEntry= br.ReadBytes((int)numBytes);
|
|
|
|
br.Close();
|
|
|
|
fStream.Close();
|
|
|
|
|
|
|
|
AvatarAppearancePacket.VisualParamBlock avblock=null;
|
|
|
|
for(int i=0; i<218; i++)
|
|
|
|
{
|
|
|
|
avblock=new AvatarAppearancePacket.VisualParamBlock();
|
|
|
|
avblock.ParamValue=(byte)100;
|
|
|
|
avp.VisualParam[i]=avblock;
|
|
|
|
}
|
|
|
|
|
|
|
|
avp.Sender.IsTrial=false;
|
|
|
|
avp.Sender.ID=id;
|
|
|
|
server.SendPacket(avp,true,user);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public void send_test_avatar_position(User_Agent_info User_info)
|
|
|
|
{
|
|
|
|
//send a objectupdate packet with information about the clients avatar
|
|
|
|
ObjectUpdatePacket objupdate=new ObjectUpdatePacket();
|
|
|
|
objupdate.RegionData.RegionHandle=1096213093147648;
|
|
|
|
objupdate.RegionData.TimeDilation=64500;
|
|
|
|
objupdate.ObjectData=new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1];
|
|
|
|
|
|
|
|
objupdate.ObjectData[0]=avatar_template;
|
|
|
|
//give this avatar object a local id and assign the user a name
|
|
|
|
objupdate.ObjectData[0].ID=8880000+this.local_numer;
|
|
|
|
objupdate.ObjectData[0].FullID=new LLUUID("00000000-0000-0000-5665-000000000034");
|
|
|
|
objupdate.ObjectData[0].NameValue=enc.GetBytes("FirstName STRING RW SV Test"+ this.local_numer+"\nLastName STRING RW SV User \0");
|
|
|
|
libsecondlife.LLVector3 pos2=new LLVector3(120f,120.0f,22.0f);
|
|
|
|
|
|
|
|
byte[] pb=pos2.GetBytes();
|
|
|
|
|
|
|
|
Array.Copy(pb,0,objupdate.ObjectData[0].ObjectData,16,pb.Length);
|
|
|
|
this.local_numer++;
|
|
|
|
|
|
|
|
server.SendPacket(objupdate,true,User_info);
|
|
|
|
|
|
|
|
this.send_other_apper(User_info,new LLUUID("00000000-0000-0000-5665-000000000034"));
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
public void send_other_avatar_position(User_Agent_info User_info, Avatar_data avd)
|
|
|
|
{
|
|
|
|
//send a objectupdate packet with information about the clients avatar
|
|
|
|
ObjectUpdatePacket objupdate=new ObjectUpdatePacket();
|
|
|
|
objupdate.RegionData.RegionHandle=1096213093147648;
|
|
|
|
objupdate.RegionData.TimeDilation=64500;
|
|
|
|
objupdate.ObjectData=new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1];
|
|
|
|
|
|
|
|
objupdate.ObjectData[0]=avatar_template;
|
|
|
|
//give this avatar object a local id and assign the user a name
|
|
|
|
objupdate.ObjectData[0].ID=avd.Net_info.localID;
|
|
|
|
objupdate.ObjectData[0].FullID=avd.Net_info.AgentID;//new LLUUID("00000000-0000-0000-5665-000000000034");
|
|
|
|
objupdate.ObjectData[0].NameValue=enc.GetBytes(avd.Net_info.name);//enc.GetBytes("FirstName STRING RW SV Test"+ this.local_numer+"\nLastName STRING RW SV User \0");
|
|
|
|
libsecondlife.LLVector3 pos2=new LLVector3(avd.pos.X,avd.pos.Y,avd.pos.Z);
|
|
|
|
|
|
|
|
byte[] pb=pos2.GetBytes();
|
|
|
|
|
|
|
|
Array.Copy(pb,0,objupdate.ObjectData[0].ObjectData,16,pb.Length);
|
|
|
|
this.local_numer++;
|
|
|
|
|
|
|
|
server.SendPacket(objupdate,true,User_info);
|
|
|
|
|
|
|
|
this.send_other_apper(User_info,avd.Net_info.AgentID);//new LLUUID("00000000-0000-0000-5665-000000000034"));
|
|
|
|
|
|
|
|
}
|
|
|
|
//*************************************************************
|
|
|
|
public void send_chat_message(User_Agent_info User_info, string line)
|
|
|
|
{
|
|
|
|
libsecondlife.Packets.ChatFromSimulatorPacket reply=new ChatFromSimulatorPacket();
|
|
|
|
reply.ChatData.Audible=1;
|
|
|
|
reply.ChatData.Message=enc.GetBytes(line);
|
|
|
|
reply.ChatData.ChatType=1;
|
|
|
|
reply.ChatData.SourceType=1;
|
|
|
|
reply.ChatData.Position=new LLVector3(120,100,21); //should set to actual position
|
|
|
|
reply.ChatData.FromName=enc.GetBytes(User_info.first_name +" "+User_info.last_name +"\0"); //enc.GetBytes("Echo: \0"); //and actual name
|
|
|
|
reply.ChatData.OwnerID=User_info.AgentID;
|
|
|
|
reply.ChatData.SourceID=User_info.AgentID;
|
|
|
|
//echo to sender
|
|
|
|
server.SendPacket(reply,true,User_info);
|
|
|
|
|
|
|
|
//send to all users
|
|
|
|
foreach (KeyValuePair<libsecondlife.LLUUID,Avatar_data> kp in this.Agent_list)
|
|
|
|
{
|
|
|
|
if(kp.Value.Net_info.AgentID!=User_info.AgentID)
|
|
|
|
{
|
|
|
|
server.SendPacket(reply,true,kp.Value.Net_info);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//*************************************************************
|
|
|
|
public void send_move_command(User_Agent_info user, bool stop,float x, float y, float z, uint av_id, libsecondlife.LLQuaternion body)
|
|
|
|
{
|
|
|
|
uint ID=user.localID;
|
|
|
|
//ID=av_id;
|
|
|
|
byte[] bytes=new byte[60];
|
|
|
|
|
|
|
|
ImprovedTerseObjectUpdatePacket im=new ImprovedTerseObjectUpdatePacket();
|
|
|
|
im.RegionData.RegionHandle=1096213093147648;
|
|
|
|
im.RegionData.TimeDilation=64096;
|
|
|
|
|
|
|
|
im.ObjectData=new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
|
|
|
|
int i=0;
|
|
|
|
ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat=new ImprovedTerseObjectUpdatePacket.ObjectDataBlock();
|
|
|
|
|
|
|
|
im.ObjectData[0]=dat;
|
|
|
|
|
|
|
|
dat.TextureEntry=avatar_template.TextureEntry;
|
|
|
|
libsecondlife.LLVector3 pos2=new LLVector3(x,y,z);
|
|
|
|
|
|
|
|
bytes[i++] = (byte)(ID % 256);
|
|
|
|
bytes[i++] = (byte)((ID >> 8) % 256);
|
|
|
|
bytes[i++] = (byte)((ID >> 16) % 256);
|
|
|
|
bytes[i++] = (byte)((ID >> 24) % 256);
|
|
|
|
|
|
|
|
bytes[i++]=0;
|
|
|
|
bytes[i++]=1;
|
|
|
|
|
|
|
|
i+=14;
|
|
|
|
bytes[i++]=128;
|
|
|
|
bytes[i++]=63;
|
|
|
|
byte[] pb=pos2.GetBytes();
|
|
|
|
|
|
|
|
Array.Copy(pb,0,bytes,i,pb.Length);
|
|
|
|
i+=12;
|
|
|
|
ushort ac=32767;
|
|
|
|
Axiom.MathLib.Vector3 v3=new Axiom.MathLib.Vector3(1,0,0);
|
|
|
|
Axiom.MathLib.Quaternion q=new Axiom.MathLib.Quaternion(body.W,body.X,body.Y,body.Z);
|
|
|
|
Axiom.MathLib.Vector3 direc=q*v3;
|
|
|
|
direc.Normalize();
|
|
|
|
|
|
|
|
direc=direc*(0.03f);
|
|
|
|
direc.x+=1;
|
|
|
|
direc.y+=1;
|
|
|
|
direc.z+=1;
|
|
|
|
ushort dx,dy,dz;
|
|
|
|
dx=(ushort)(32768*direc.x);
|
|
|
|
dy=(ushort)(32768*direc.y);
|
|
|
|
dz=(ushort)(32768*direc.z);
|
|
|
|
|
|
|
|
//vel
|
|
|
|
if(!stop)
|
|
|
|
{
|
|
|
|
bytes[i++] = (byte)(dx % 256);
|
|
|
|
bytes[i++] = (byte)((dx >> 8) % 256);
|
|
|
|
|
|
|
|
bytes[i++] = (byte)(dy % 256);
|
|
|
|
bytes[i++] = (byte)((dy >> 8) % 256);
|
|
|
|
|
|
|
|
bytes[i++] = (byte)(dz % 256);
|
|
|
|
bytes[i++] = (byte)((dz >> 8) % 256);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
bytes[i++] = (byte)(ac % 256);
|
|
|
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
|
|
|
|
|
|
|
bytes[i++] = (byte)(ac % 256);
|
|
|
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
|
|
|
|
|
|
|
bytes[i++] = (byte)(ac % 256);
|
|
|
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
|
|
|
}
|
|
|
|
//accel
|
|
|
|
bytes[i++] = (byte)(ac % 256);
|
|
|
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
|
|
|
|
|
|
|
bytes[i++] = (byte)(ac % 256);
|
|
|
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
|
|
|
|
|
|
|
bytes[i++] = (byte)(ac % 256);
|
|
|
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
|
|
|
|
|
|
|
//rot
|
|
|
|
bytes[i++] = (byte)(ac % 256);
|
|
|
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
|
|
|
|
|
|
|
bytes[i++] = (byte)(ac % 256);
|
|
|
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
|
|
|
|
|
|
|
bytes[i++] = (byte)(ac % 256);
|
|
|
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
|
|
|
|
|
|
|
bytes[i++] = (byte)(ac % 256);
|
|
|
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
|
|
|
|
|
|
|
//rotation vel
|
|
|
|
bytes[i++] = (byte)(ac % 256);
|
|
|
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
|
|
|
|
|
|
|
bytes[i++] = (byte)(ac % 256);
|
|
|
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
|
|
|
|
|
|
|
bytes[i++] = (byte)(ac % 256);
|
|
|
|
bytes[i++] = (byte)((ac >> 8) % 256);
|
|
|
|
|
|
|
|
dat.Data=bytes;
|
|
|
|
|
|
|
|
server.SendPacket(im,true,user);
|
|
|
|
|
|
|
|
//should send to all users.
|
|
|
|
foreach (KeyValuePair<libsecondlife.LLUUID,Avatar_data> kp in this.Agent_list)
|
|
|
|
{
|
|
|
|
if(kp.Value.Net_info.AgentID!=user.AgentID)
|
|
|
|
{
|
|
|
|
server.SendPacket(im,true,kp.Value.Net_info);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
//*************************************************************
|
|
|
|
public void read_layerdata(User_Agent_info User_info,ref LayerDataPacket lay,string name)
|
|
|
|
{
|
|
|
|
FileInfo fInfo = new FileInfo(name);
|
|
|
|
|
|
|
|
long numBytes = fInfo.Length;
|
|
|
|
|
|
|
|
FileStream fStream = new FileStream(name, FileMode.Open, FileAccess.Read);
|
|
|
|
|
|
|
|
BinaryReader br = new BinaryReader(fStream);
|
|
|
|
|
|
|
|
data1 = br.ReadBytes((int)numBytes);
|
|
|
|
|
|
|
|
br.Close();
|
|
|
|
|
|
|
|
fStream.Close();
|
|
|
|
lay.LayerData.Data=data1;
|
|
|
|
server.SendPacket(lay,true,User_info);
|
|
|
|
//System.Console.WriteLine("sent");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public class Avatar_data
|
|
|
|
{
|
|
|
|
public User_Agent_info Net_info;
|
|
|
|
public LLUUID Full_ID;
|
|
|
|
public LLVector3 pos;
|
|
|
|
public LLVector3 vel=new LLVector3(0,0,0);
|
|
|
|
public bool walk=false;
|
|
|
|
public bool started=false;
|
|
|
|
|
|
|
|
public Avatar_data()
|
|
|
|
{
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|