Clean up. Added GridManager and teleport between regions/sims.

brokenplugins
MW 2007-02-02 17:23:56 +00:00
parent f5398c7260
commit e75e6f426b
11 changed files with 733 additions and 450 deletions

View File

@ -32,122 +32,173 @@ using libsecondlife.AssetSystem;
using System.IO;
using Axiom.MathLib;
namespace Second_server
namespace OpenSim
{
/// <summary>
/// Description of Agent_Manager.
/// </summary>
public class Agent_Manager
public class AgentManager
{
public Dictionary<libsecondlife.LLUUID,Avatar_data> Agent_list;
//public uint number_agents=0;
public Dictionary<libsecondlife.LLUUID,AvatarData> AgentList;
private uint local_numer=0;
private Server server;
public Prim_manager prim_man;
private byte [] data1;
public PrimManager Prim_Manager;
private libsecondlife.Packets.RegionHandshakePacket reg;
private libsecondlife.Packets.RegionHandshakePacket RegionPacket;
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)
public libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock AvatarTemplate;
/// <summary>
///
/// </summary>
/// <param name="serve"></param>
public AgentManager(Server serve)
{
Agent_list=new Dictionary<libsecondlife.LLUUID,Avatar_data>();
AgentList=new Dictionary<libsecondlife.LLUUID,AvatarData>();
server=serve;
this.initialise();
}
//***************************************************
public Avatar_data Get_Agent(LLUUID id)
/// <summary>
///
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
public AvatarData GetAgent(LLUUID id)
{
if(!this.Agent_list.ContainsKey(id))
if(!this.AgentList.ContainsKey(id))
{
return null;
}
else
{
Avatar_data ad=this.Agent_list[id];
AvatarData ad=this.AgentList[id];
return ad;
}
}
public void Add_Agent(Avatar_data agent)
/// <summary>
///
/// </summary>
/// <param name="agent"></param>
public void AddAgent(AvatarData agent)
{
this.Agent_list.Add(agent.Full_ID,agent);
this.AgentList.Add(agent.FullID,agent);
}
/// <summary>
///
/// </summary>
/// <param name="User_info"></param>
/// <param name="first"></param>
/// <param name="last"></param>
/// <returns></returns>
///
public bool New_Agent(User_Agent_info User_info)
/// <summary>
///
/// </summary>
/// <param name="User_info"></param>
/// <param name="first"></param>
/// <param name="last"></param>
/// <returns></returns>
public bool NewAgent(User_Agent_info User_info, string first, string last)
{
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);
AvatarData agent=new AvatarData();
agent.FullID=User_info.AgentID;
agent.NetInfo=User_info;
agent.NetInfo.first_name=first;
agent.NetInfo.last_name=last;
agent.Position=new LLVector3(100,100,22);
this.AgentList.Add(agent.FullID,agent);
return(true);
}
public void Agent_join(User_Agent_info User_info)
/// <summary>
///
/// </summary>
/// <param name="UserInfo"></param>
public void RemoveAgent(User_Agent_info UserInfo)
{
this.AgentList.Remove(UserInfo.AgentID);
//tell other clients to delete this avatar
}
/// <summary>
///
/// </summary>
/// <param name="User_info"></param>
public void AgentJoin(User_Agent_info User_info)
{
//send region data
server.SendPacket(reg,true,User_info);
server.SendPacket(RegionPacket,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.RegionHandle=Globals.Instance.RegionHandle;
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()
/// <summary>
///
/// </summary>
public void UpdatePositions()
{
//update positions
foreach (KeyValuePair<libsecondlife.LLUUID,Avatar_data> kp in this.Agent_list)
foreach (KeyValuePair<libsecondlife.LLUUID,AvatarData> kp in this.AgentList)
{
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);
kp.Value.Position.X+=(kp.Value.Velocity.X*0.2f);
kp.Value.Position.Y+=(kp.Value.Velocity.Y*0.2f);
kp.Value.Position.Z+=(kp.Value.Velocity.Z*0.2f);
}
}
//**************************************************************
/// <summary>
///
/// </summary>
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");
RegionPacket=new RegionHandshakePacket();
RegionPacket.RegionInfo.BillableFactor=0;
RegionPacket.RegionInfo.IsEstateManager=false;
RegionPacket.RegionInfo.TerrainHeightRange00=60;
RegionPacket.RegionInfo.TerrainHeightRange01=60;
RegionPacket.RegionInfo.TerrainHeightRange10=60;
RegionPacket.RegionInfo.TerrainHeightRange11=60;
RegionPacket.RegionInfo.TerrainStartHeight00=20;
RegionPacket.RegionInfo.TerrainStartHeight01=20;
RegionPacket.RegionInfo.TerrainStartHeight10=20;
RegionPacket.RegionInfo.TerrainStartHeight11=20;
RegionPacket.RegionInfo.SimAccess=13;
RegionPacket.RegionInfo.WaterHeight=5;
RegionPacket.RegionInfo.RegionFlags=72458694;
RegionPacket.RegionInfo.SimName=enc.GetBytes( Globals.Instance.RegionName);
RegionPacket.RegionInfo.SimOwner=new LLUUID("00000000-0000-0000-0000-000000000000");
RegionPacket.RegionInfo.TerrainBase0=new LLUUID("b8d3965a-ad78-bf43-699b-bff8eca6c975");
RegionPacket.RegionInfo.TerrainBase1=new LLUUID("abb783e6-3e93-26c0-248a-247666855da3");
RegionPacket.RegionInfo.TerrainBase2=new LLUUID("179cdabd-398a-9b6b-1391-4dc333ba321f");
RegionPacket.RegionInfo.TerrainBase3=new LLUUID("beb169c7-11ea-fff2-efe5-0f24dc881df2");
RegionPacket.RegionInfo.TerrainDetail0=new LLUUID("00000000-0000-0000-0000-000000000000");
RegionPacket.RegionInfo.TerrainDetail1=new LLUUID("00000000-0000-0000-0000-000000000000");
RegionPacket.RegionInfo.TerrainDetail2=new LLUUID("00000000-0000-0000-0000-000000000000");
RegionPacket.RegionInfo.TerrainDetail3=new LLUUID("00000000-0000-0000-0000-000000000000");
RegionPacket.RegionInfo.CacheID=new LLUUID("545ec0a5-5751-1026-8a0b-216e38a7ab37");
this.SetupTemplate("objectupate168.dat");
}
public void setuptemplate(string name)
/// <summary>
///
/// </summary>
/// <param name="name"></param>
private void SetupTemplate(string name)
{
/*ObjectUpdatePacket objupdate=new ObjectUpdatePacket();
objupdate.RegionData.RegionHandle=1096213093147648;
@ -184,95 +235,87 @@ namespace Second_server
Array.Copy(pb,0,objdata.ObjectData,16,pb.Length);
avatar_template=objdata;
AvatarTemplate=objdata;
}
//**********************************************************
public void send_intial_data(User_Agent_info User_info)
/// <summary>
///
/// </summary>
/// <param name="User_info"></param>
public void SendInitialData(User_Agent_info User_info)
{
//shouldn't really have to read all this in from disk for every new client?
//shouldn't have to read all this in from disk for every new client
string data_path=System.AppDomain.CurrentDomain.BaseDirectory + @"\layer_data\";
//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);
this.SendLayerData(User_info,ref layerpack,data_path+@"layerdata0.dat");
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);
this.SendLayerData(User_info,ref layerpack,data_path+@"layerdata1.dat");
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);
this.SendLayerData(User_info,ref layerpack,data_path+@"layerdata2.dat");
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);
this.SendLayerData(User_info,ref layerpack,data_path+@"layerdata3.dat");
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);
this.SendLayerData(User_info,ref layerpack,data_path+@"layerdata4.dat");
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);
this.SendLayerData(User_info,ref layerpack,data_path+@"layerdata5.dat");
//send intial set of captured prims data?
this.prim_man.Read_Prim_database( "objectdatabase.ini",User_info);
this.Prim_Manager.ReadPrimDatabase( "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);
this.SendInitialAvatarPosition(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)
foreach (KeyValuePair<libsecondlife.LLUUID,AvatarData> kp in this.AgentList)
{
if(kp.Value.Net_info.AgentID!=User_info.AgentID)
if(kp.Value.NetInfo.AgentID!=User_info.AgentID)
{
this.send_other_avatar_position(User_info,kp.Value);
this.SendOtherAvatarPosition(User_info,kp.Value);
}
}
}
}
public void send_intial_avatar_position(User_Agent_info User_info)
/// <summary>
///
/// </summary>
/// <param name="User_info"></param>
public void SendInitialAvatarPosition(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.RegionHandle=Globals.Instance.RegionHandle;
objupdate.RegionData.TimeDilation=64096;
objupdate.ObjectData=new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1];
objupdate.ObjectData[0]=avatar_template;
objupdate.ObjectData[0]=AvatarTemplate;
//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;
this.GetAgent(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;
objupdate.ObjectData[0].NameValue=enc.GetBytes("FirstName STRING RW SV "+User_info.first_name+"\nLastName STRING RW SV "+User_info.last_name+" \0");
User_info.name="FirstName STRING RW SV "+User_info.first_name+"\nLastName STRING RW SV "+User_info.last_name+" \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();
@ -283,36 +326,23 @@ namespace Second_server
server.SendPacket(objupdate,true,User_info);
//send this info to other existing clients
foreach (KeyValuePair<libsecondlife.LLUUID,Avatar_data> kp in this.Agent_list)
foreach (KeyValuePair<libsecondlife.LLUUID,AvatarData> kp in this.AgentList)
{
if(kp.Value.Net_info.AgentID!=User_info.AgentID)
if(kp.Value.NetInfo.AgentID!=User_info.AgentID)
{
server.SendPacket(objupdate,true,kp.Value.Net_info);
this.send_other_apper(kp.Value.Net_info,objupdate.ObjectData[0].FullID);
server.SendPacket(objupdate,true,kp.Value.NetInfo);
this.SendOtherAppearance(kp.Value.NetInfo,objupdate.ObjectData[0].FullID);
}
}
}
public void send_intial_avatar_apper(User_Agent_info user)
/// <summary>
///
/// </summary>
/// <param name="user"></param>
public void SendIntialAvatarAppearance(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;
@ -323,22 +353,18 @@ namespace Second_server
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;*/
awb.WearableType=(byte)0;
awb.AssetID=new LLUUID("66c41e39-38f9-f75a-024e-585989bfab73");
awb.ItemID=new LLUUID("b7878441893b094917f791174bc8401c");
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();
@ -348,13 +374,15 @@ namespace Second_server
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)
/// <summary>
///
/// </summary>
/// <param name="user"></param>
/// <param name="id"></param>
public void SendOtherAppearance(User_Agent_info user,LLUUID id)
{
AvatarAppearancePacket avp=new AvatarAppearancePacket();
@ -384,21 +412,25 @@ namespace Second_server
server.SendPacket(avp,true,user);
}
public void send_test_avatar_position(User_Agent_info User_info)
/// <summary>
///
/// </summary>
/// <param name="User_info"></param>
/// <param name="avd"></param>
public void SendOtherAvatarPosition(User_Agent_info User_info, AvatarData avd)
{
//send a objectupdate packet with information about the clients avatar
ObjectUpdatePacket objupdate=new ObjectUpdatePacket();
objupdate.RegionData.RegionHandle=1096213093147648;
objupdate.RegionData.RegionHandle=Globals.Instance.RegionHandle;
objupdate.RegionData.TimeDilation=64500;
objupdate.ObjectData=new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1];
objupdate.ObjectData[0]=avatar_template;
objupdate.ObjectData[0]=AvatarTemplate;
//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);
objupdate.ObjectData[0].ID=avd.NetInfo.localID;
objupdate.ObjectData[0].FullID=avd.NetInfo.AgentID;//new LLUUID("00000000-0000-0000-5665-000000000034");
objupdate.ObjectData[0].NameValue=enc.GetBytes(avd.NetInfo.name);//enc.GetBytes("FirstName STRING RW SV Test"+ this.local_numer+"\nLastName STRING RW SV User \0");
libsecondlife.LLVector3 pos2=new LLVector3(avd.Position.X,avd.Position.Y,avd.Position.Z);
byte[] pb=pos2.GetBytes();
@ -407,37 +439,16 @@ namespace Second_server
server.SendPacket(objupdate,true,User_info);
this.send_other_apper(User_info,new LLUUID("00000000-0000-0000-5665-000000000034"));
this.SendOtherAppearance(User_info,avd.NetInfo.AgentID);//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)
/// <summary>
///
/// </summary>
/// <param name="User_info"></param>
/// <param name="line"></param>
public void SendChatMessage(User_Agent_info User_info, string line)
{
libsecondlife.Packets.ChatFromSimulatorPacket reply=new ChatFromSimulatorPacket();
reply.ChatData.Audible=1;
@ -452,23 +463,33 @@ namespace Second_server
server.SendPacket(reply,true,User_info);
//send to all users
foreach (KeyValuePair<libsecondlife.LLUUID,Avatar_data> kp in this.Agent_list)
foreach (KeyValuePair<libsecondlife.LLUUID,AvatarData> kp in this.AgentList)
{
if(kp.Value.Net_info.AgentID!=User_info.AgentID)
if(kp.Value.NetInfo.AgentID!=User_info.AgentID)
{
server.SendPacket(reply,true,kp.Value.Net_info);
server.SendPacket(reply,true,kp.Value.NetInfo);
}
}
}
//*************************************************************
public void send_move_command(User_Agent_info user, bool stop,float x, float y, float z, uint av_id, libsecondlife.LLQuaternion body)
/// <summary>
///
/// </summary>
/// <param name="user"></param>
/// <param name="stop"></param>
/// <param name="x"></param>
/// <param name="y"></param>
/// <param name="z"></param>
/// <param name="av_id"></param>
/// <param name="body"></param>
public void SendMoveCommand(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.RegionHandle=Globals.Instance.RegionHandle;;
im.RegionData.TimeDilation=64096;
im.ObjectData=new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1];
@ -477,7 +498,7 @@ namespace Second_server
im.ObjectData[0]=dat;
dat.TextureEntry=avatar_template.TextureEntry;
dat.TextureEntry=AvatarTemplate.TextureEntry;
libsecondlife.LLVector3 pos2=new LLVector3(x,y,z);
bytes[i++] = (byte)(ID % 256);
@ -571,16 +592,22 @@ namespace Second_server
server.SendPacket(im,true,user);
//should send to all users.
foreach (KeyValuePair<libsecondlife.LLUUID,Avatar_data> kp in this.Agent_list)
foreach (KeyValuePair<libsecondlife.LLUUID,AvatarData> kp in this.AgentList)
{
if(kp.Value.Net_info.AgentID!=user.AgentID)
if(kp.Value.NetInfo.AgentID!=user.AgentID)
{
server.SendPacket(im,true,kp.Value.Net_info);
server.SendPacket(im,true,kp.Value.NetInfo);
}
}
}
//*************************************************************
public void read_layerdata(User_Agent_info User_info,ref LayerDataPacket lay,string name)
/// <summary>
///
/// </summary>
/// <param name="User_info"></param>
/// <param name="lay"></param>
/// <param name="name"></param>
public void SendLayerData(User_Agent_info User_info,ref LayerDataPacket lay,string name)
{
FileInfo fInfo = new FileInfo(name);
@ -590,7 +617,7 @@ namespace Second_server
BinaryReader br = new BinaryReader(fStream);
data1 = br.ReadBytes((int)numBytes);
byte [] data1 = br.ReadBytes((int)numBytes);
br.Close();
@ -601,18 +628,32 @@ namespace Second_server
}
}
public class Avatar_data
public class AvatarData
{
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 User_Agent_info NetInfo;
public LLUUID FullID;
public LLVector3 Position;
public LLVector3 Velocity=new LLVector3(0,0,0);
//public LLQuaternion Rotation;
public bool Walk=false;
public bool Started=false;
//public TextureEntry TextureEntry;
public Avatar_data()
public AvatarData()
{
}
}
/*
public class AvatarParams
{
public byte[] Params;
public AvatarParams()
{
}
}
*/
}

View File

@ -36,11 +36,11 @@ using System.Runtime.InteropServices;
// change them to the information which is associated with the assembly
// you compile.
[assembly: AssemblyTitle("Second-server")]
[assembly: AssemblyTitle("OpenSim")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("Second-server")]
[assembly: AssemblyProduct("OpenSim")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
@ -56,4 +56,4 @@ using System.Runtime.InteropServices;
// You can specify all values by your own or you can build default build and revision
// numbers with the '*' character (the default):
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("0.1.*")]

View File

@ -34,26 +34,26 @@ using libsecondlife.Packets;
using libsecondlife.AssetSystem;
using System.IO;
namespace Second_server
namespace OpenSim
{
/// <summary>
/// Description of Asset_manager.
/// </summary>
public class Asset_manager
public class AssetManager
{
public Dictionary<libsecondlife.LLUUID,Asset_info> Assets;
public Dictionary<libsecondlife.LLUUID,AssetInfo> Assets;
public ArrayList requests=new ArrayList(); //should change to a generic
// public ArrayList uploads=new ArrayList();
private Server server;
public Asset_manager(Server serve)
public AssetManager(Server serve)
{
server=serve;
Assets=new Dictionary<libsecondlife.LLUUID,Asset_info> ();
Assets=new Dictionary<libsecondlife.LLUUID,AssetInfo> ();
this.initialise();
}
public void add_request(User_Agent_info user, LLUUID asset_id, TransferRequestPacket tran_req)
public void AddRequest(User_Agent_info user, LLUUID asset_id, TransferRequestPacket tran_req)
{
if(!this.Assets.ContainsKey(asset_id))
@ -61,18 +61,18 @@ namespace Second_server
//not found asset
return;
}
Asset_info info=this.Assets[asset_id];
AssetInfo info=this.Assets[asset_id];
System.Console.WriteLine("send asset : "+asset_id);
//for now as it will be only skin or shape request just send back the asset
TransferInfoPacket tran_i=new TransferInfoPacket();
tran_i.TransferInfo.ChannelType=2;
tran_i.TransferInfo.Status=0;
tran_i.TransferInfo.TargetType=0;
tran_i.TransferInfo.Params=tran_req.TransferInfo.Params;
tran_i.TransferInfo.Size=info.data.Length;
tran_i.TransferInfo.TransferID=tran_req.TransferInfo.TransferID;
TransferInfoPacket Transfer=new TransferInfoPacket();
Transfer.TransferInfo.ChannelType=2;
Transfer.TransferInfo.Status=0;
Transfer.TransferInfo.TargetType=0;
Transfer.TransferInfo.Params=tran_req.TransferInfo.Params;
Transfer.TransferInfo.Size=info.data.Length;
Transfer.TransferInfo.TransferID=tran_req.TransferInfo.TransferID;
server.SendPacket(tran_i,true,user);
server.SendPacket(Transfer,true,user);
TransferPacketPacket tran_p=new TransferPacketPacket();
tran_p.TransferData.Packet=0;
@ -110,14 +110,17 @@ namespace Second_server
private void initialise()
{
//for now read in our test image
Asset_info im=new Asset_info();
AssetInfo im=new AssetInfo();
im.filename="base_shape.dat";
im.Full_ID=new LLUUID("66c41e39-38f9-f75a-024e-585989bfab73");
this.load_asset(im);
this.loadAsset(im);
this.Assets.Add(im.Full_ID,im);
}
private void load_asset(Asset_info info)
private void loadAsset(AssetInfo info)
{
//should request Asset from storage manager
//but for now read from file
string data_path = System.AppDomain.CurrentDomain.BaseDirectory + @"\assets\";
string filename=data_path+@info.filename;
FileInfo fInfo = new FileInfo(filename);
@ -135,21 +138,21 @@ namespace Second_server
}
}
public class Asset_request
public class AssetRequest
{
public User_Agent_info req_user;
public LLUUID req_image;
public Asset_info asset_inf;
public User_Agent_info RequestUser;
public LLUUID RequestImage;
public AssetInfo asset_inf;
public long data_pointer=0;
public int num_packets=0;
public int packet_counter=0;
public Asset_request()
public AssetRequest()
{
}
}
public class Asset_info
public class AssetInfo
{
public byte[] data;
public LLUUID Full_ID;
@ -159,7 +162,7 @@ namespace Second_server
public ulong last_used; //need to add a tick/time counter and keep record
// of how often images are requested to unload unused ones.
public Asset_info()
public AssetInfo()
{
}

View File

@ -38,11 +38,12 @@ using System.IO;
using Axiom.MathLib;
using log4net;
namespace Second_server {
namespace OpenSim
{
/// <summary>
/// Description of MainForm.
/// </summary>
public partial class Controller : Server_callback {
public partial class Controller : ServerCallback {
@ -54,51 +55,79 @@ namespace Second_server {
}
public Server server;
private Agent_Manager agent_man;
private Prim_manager prim_man;
private Texture_manager texture_man;
private Asset_manager asset_man;
private Login_manager login_man; //built in login server
public Logon _login;
private AgentManager Agent_Manager;
private PrimManager Prim_Manager;
private TextureManager Texture_Manager;
private AssetManager Asset_Manager;
private GridManager Grid_Manager;
private LoginManager Login_Manager; //built in login server
private ulong time; //ticks
private Timer timer1 = new Timer();
public Controller() {
_login=new Logon(); // should create a list for these.
server = new Server( this );
agent_man = new Agent_Manager( this.server );
prim_man = new Prim_manager( this.server );
texture_man = new Texture_manager( this.server );
asset_man = new Asset_manager( this.server );
prim_man.agent_man = agent_man;
agent_man.prim_man = prim_man;
login_man = new Login_manager(); // startup
login_man.startup(); // login server
timer1.Enabled = true;
Agent_Manager = new AgentManager( this.server );
Prim_Manager = new PrimManager( this.server );
Texture_Manager = new TextureManager( this.server );
Asset_Manager = new AssetManager( this.server );
Prim_Manager.Agent_Manager = Agent_Manager;
Agent_Manager.Prim_Manager = Prim_Manager;
Grid_Manager=new GridManager(this.server,Agent_Manager);
if(Globals.Instance.LoginSever)
{
Console.WriteLine("Starting login Server");
Login_Manager = new LoginManager(_login); // startup
Login_Manager.Startup(); // login server
}
timer1.Enabled = true;
timer1.Interval = 200;
timer1.Elapsed +=new ElapsedEventHandler( this.Timer1Tick );
}
public void main_callback( Packet pack, User_Agent_info User_info ) {
if( ( pack.Type != PacketType.StartPingCheck ) && ( pack.Type != PacketType.AgentUpdate ) ) {
System.Console.WriteLine(pack.Type);
public void MainCallback( Packet pack, User_Agent_info User_info ) {
//System.Console.WriteLine(pack.Type);
if( ( pack.Type != PacketType.StartPingCheck ) && ( pack.Type != PacketType.AgentUpdate ) ) {
// System.Console.WriteLine(pack.Type);
//this.richTextBox1.Text=this.richTextBox1.Text+"\n "+pack.Type;
}
if( pack.Type == PacketType.AgentSetAppearance ) {
System.Console.WriteLine(pack);
// System.Console.WriteLine(pack);
//this.richTextBox1.Text=this.richTextBox1.Text+"\n "+pack.Type;
}
if(pack.Type== PacketType.MapBlockRequest)
{
//int MinX, MinY, MaxX, MaxY;
MapBlockRequestPacket MapRequest=(MapBlockRequestPacket)pack;
this.Grid_Manager.RequestMapBlock(User_info,MapRequest.PositionData.MinX,MapRequest.PositionData.MinY,MapRequest.PositionData.MaxX,MapRequest.PositionData.MaxY);
}
if(pack.Type== PacketType.CloseCircuit)
{
this.Agent_Manager.RemoveAgent(User_info);
}
if(pack.Type== PacketType.MapLayerRequest)
{
this.Grid_Manager.RequestMapLayer(User_info);
}
if((pack.Type== PacketType.TeleportRequest ) ||(pack.Type== PacketType.TeleportLocationRequest))
{
TeleportLocationRequestPacket Request=(TeleportLocationRequestPacket)pack;
this.Grid_Manager.RequestTeleport(User_info,Request);
}
if( pack.Type == PacketType.TransferRequest ) {
TransferRequestPacket tran = (TransferRequestPacket)pack;
LLUUID id = new LLUUID( tran.TransferInfo.Params, 0 );
if( ( id == new LLUUID( "66c41e39-38f9-f75a-024e-585989bfab73" ) ) || ( id == new LLUUID( "e0ee49b5a4184df8d3c9a65361fe7f49" ) ) ) {
//System.Console.WriteLine(pack);
//System.Console.WriteLine(tran.TransferInfo.TransferID);
asset_man.add_request( User_info, id, tran );
//this.richTextBox1.Text=this.richTextBox1.Text+"\n "+pack.Type;
Asset_Manager.AddRequest( User_info, id, tran );
}
}
@ -111,23 +140,23 @@ namespace Second_server {
}
if( pack.Type == PacketType.CompleteAgentMovement ) {
// new client
agent_man.Agent_join( User_info );
Agent_Manager.AgentJoin( User_info );
}
if( pack.Type == PacketType.RequestImage ) {
RequestImagePacket image_req = (RequestImagePacket)pack;
for( int i = 0; i < image_req.RequestImage.Length; i++ ) {
this.texture_man.add_request( User_info, image_req.RequestImage[ i ].Image );
this.Texture_Manager.AddRequest( User_info, image_req.RequestImage[ i ].Image );
}
}
if( pack.Type == PacketType.RegionHandshakeReply ) {
//recieved regionhandshake so can now start sending info
agent_man.send_intial_data( User_info );
Agent_Manager.SendInitialData( User_info );
//this.setuptemplates("objectupate164.dat",User_info,false);
}
if( pack.Type == PacketType.ObjectAdd ) {
ObjectAddPacket ad = (ObjectAddPacket)pack;
prim_man.create_prim( User_info, ad.ObjectData.RayEnd, ad );
Prim_Manager.CreatePrim( User_info, ad.ObjectData.RayEnd, ad );
//this.send_prim(User_info,ad.ObjectData.RayEnd, ad);
}
if( pack.Type == PacketType.ObjectPosition ) {
@ -141,46 +170,55 @@ namespace Second_server {
if( mupd.ObjectData[ i ].Type == 9 ) //change position
{
libsecondlife.LLVector3 pos = new LLVector3( mupd.ObjectData[ i ].Data, 0 );
prim_man.update_prim_position( User_info, pos.X, pos.Y, pos.Z, mupd.ObjectData[ i ].ObjectLocalID );
// libsecondlife.LLQuaternion rot=new LLQuaternion(mupd.ObjectData[i].Data,12,true);
Prim_Manager.UpdatePrimPosition( User_info, pos, mupd.ObjectData[ i ].ObjectLocalID ,false ,libsecondlife.LLQuaternion.Identity);
//should update stored position of the prim
}
else if( mupd.ObjectData[ i ].Type == 10 )
{
//System.Console.WriteLine(mupd.ObjectData[ i ].Type);
//System.Console.WriteLine(mupd);
libsecondlife.LLVector3 pos = new LLVector3(100,100,22);
libsecondlife.LLQuaternion rot=new LLQuaternion(mupd.ObjectData[i].Data,0,true);
Prim_Manager.UpdatePrimPosition( User_info, pos, mupd.ObjectData[ i ].ObjectLocalID ,true ,rot);
}
}
}
if( pack.Type == PacketType.AgentWearablesRequest ) {
agent_man.send_intial_avatar_apper( User_info );
Agent_Manager.SendIntialAvatarAppearance( User_info );
}
if( pack.Type == PacketType.AgentUpdate ) {
AgentUpdatePacket ag = (AgentUpdatePacket)pack;
uint mask = ag.AgentData.ControlFlags & ( 1 );
Avatar_data m_av = agent_man.Get_Agent( User_info.AgentID );
AvatarData m_av = Agent_Manager.GetAgent( User_info.AgentID );
if( m_av != null ) {
if( m_av.started ) {
if( m_av.Started ) {
if( mask == ( 1 ) ) {
if( !m_av.walk ) {
if( !m_av.Walk ) {
//start walking
agent_man.send_move_command( User_info, false, m_av.pos.X, m_av.pos.Y, m_av.pos.Z, 0, ag.AgentData.BodyRotation );
Agent_Manager.SendMoveCommand( User_info, false, m_av.Position.X, m_av.Position.Y, m_av.Position.Z, 0, ag.AgentData.BodyRotation );
Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3( 1, 0, 0 );
Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion( ag.AgentData.BodyRotation.W, ag.AgentData.BodyRotation.X, ag.AgentData.BodyRotation.Y, ag.AgentData.BodyRotation.Z );
Axiom.MathLib.Vector3 direc = q * v3;
direc.Normalize();
direc = direc * ( ( 0.03f ) * 128f );
m_av.vel.X = direc.x;
m_av.vel.Y = direc.y;
m_av.vel.Z = direc.z;
m_av.walk = true;
m_av.Velocity.X = direc.x;
m_av.Velocity.Y = direc.y;
m_av.Velocity.Z = direc.z;
m_av.Walk = true;
}
}
else {
if( m_av.walk ) {
if( m_av.Walk ) {
//walking but key not pressed so need to stop
agent_man.send_move_command( User_info, true, m_av.pos.X, m_av.pos.Y, m_av.pos.Z, 0, ag.AgentData.BodyRotation );
m_av.walk = false;
m_av.vel.X = 0;
m_av.vel.Y = 0;
m_av.vel.Z = 0;
Agent_Manager.SendMoveCommand( User_info, true, m_av.Position.X, m_av.Position.Y, m_av.Position.Z, 0, ag.AgentData.BodyRotation );
m_av.Walk = false;
m_av.Velocity.X = 0;
m_av.Velocity.Y = 0;
m_av.Velocity.Z = 0;
}
}
}
@ -205,25 +243,52 @@ namespace Second_server {
else if( comp[ 0 ] == "veloc" ) {
}
else {
agent_man.send_chat_message( User_info, line );
Agent_Manager.SendChatMessage( User_info, line );
}
}
}
}
public void new_user( User_Agent_info User_info ) {
Console.WriteLine( "new user - {0} - has joined [session {1}]", User_info.AgentID.ToString(), User_info.SessionID.ToString() );
agent_man.New_Agent( User_info );
public void NewUserCallback( User_Agent_info UserInfo ) {
Console.WriteLine( "new user - {0} - has joined [session {1}]", UserInfo.AgentID.ToString(), UserInfo.SessionID.ToString() +"curcuit used"+UserInfo.circuitCode);
string first,last;
lock(_login)
{
first=_login.first;
last=_login.last;
//should get agentid and sessionid so they can be checked.
}
Agent_Manager.NewAgent( UserInfo ,first,last);
//now because of the lack of Global account management (User server etc)
//we need to reset the names back to default incase a teleport happens
//which will not have a Login name set, so they will use default names
lock(_login)
{
_login.first="Test";
_login.last="User";
}
}
public void error( string text ) {
public void ErrorCallback( string text ) {
Console.WriteLine( "error report: {0}", text );
}
void Timer1Tick( object sender, System.EventArgs e ) {
this.time++;
agent_man.tick();
texture_man.Do_work( time );
Agent_Manager.UpdatePositions();
Texture_Manager.DoWork( time );
}
}
}
public class Logon
{
public string first="Test";
public string last="User";
public LLUUID Agent;
public LLUUID Session;
public Logon()
{
}
}
}

View File

@ -25,7 +25,7 @@
* (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 Nwc.XmlRpc;
using System;
using System.IO;
using System.Net;
@ -33,24 +33,27 @@ using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Collections;
using libsecondlife;
namespace Second_server
namespace OpenSim
{
/// <summary>
/// Description of Login_manager.
/// </summary>
public class Login_manager
public class LoginManager
{
public Login_manager()
public LoginManager(Logon login)
{
Login=login;
}
public Logon Login;
public ushort loginPort = 8080;
public IPAddress clientAddress = IPAddress.Loopback;
public IPAddress remoteAddress = IPAddress.Any;
private Socket loginServer;
private Random RandomClass = new Random();
private int NumClients;
// InitializeLoginProxy: initialize the login proxy
private void InitializeLoginProxy() {
@ -59,7 +62,7 @@ namespace Second_server
loginServer.Listen(1);
}
public void startup()
public void Startup()
{
this.InitializeLoginProxy();
Thread runLoginProxy = new Thread(new ThreadStart(RunLoginProxy));
@ -67,7 +70,7 @@ namespace Second_server
runLoginProxy.Start();
}
private void RunLoginProxy() {
private void RunLoginProxy() {
try {
for (;;) {
Socket client = loginServer.Accept();
@ -121,11 +124,52 @@ namespace Second_server
if (match.Success)
contentLength = Convert.ToInt32(match.Groups[1].Captures[0].ToString());
} while (line != "");
System.Console.WriteLine(line);
// read the HTTP body into a buffer
char[] content = new char[contentLength];
reader.Read(content, 0, contentLength);
// System.Text.Encoding enc = System.Text.Encoding.ASCII;
XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(new String(content));
Hashtable requestData = (Hashtable)request.Params[0];
string first;
string last;
LLUUID Agent;
LLUUID Session;
//get login name
if(requestData.Contains("first"))
{
first=(string)requestData["first"];
}
else
{
first="test";
}
if(requestData.Contains("last"))
{
last=(string)requestData["last"];
}
else
{
last="User"+NumClients.ToString();
}
NumClients++;
//create a agent and session LLUUID
int AgentRand=this.RandomClass.Next(1,9999);
Agent=new LLUUID("99998888-"+AgentRand.ToString("0000")+"-4f52-8ec1-0b1d5cd6aead");
int SessionRand=this.RandomClass.Next(1,999);
Session=new LLUUID("aaaabbbb-8932-"+SessionRand.ToString("0000")+"-8664-58f53e442797");
//copy data to login object
lock(Login)
{
Login.first=first;
Login.last=last;
Login.Agent=Agent;
Login.Session=Session;
}
// forward the XML-RPC response to the client
writer.WriteLine("HTTP/1.0 200 OK");
@ -138,16 +182,16 @@ namespace Second_server
SR=File.OpenText("login.dat");
lines=SR.ReadLine();
writer.WriteLine(lines);
lines=SR.ReadLine();
int ran=this.RandomClass.Next(1,9999);
lines="<member><name>session_id</name><value><string>99998888-"+ran.ToString("0000")+"-4f52-8ec1-0b1d5cd6aead</string></value></member>";
lines=SR.ReadLine();
//lines="<member><name>session_id</name><value><string>"+Agent.ToString()+"</string></value></member>";
lines="<member><name>session_id</name><value><string>99998888-"+AgentRand.ToString("0000")+"-4f52-8ec1-0b1d5cd6aead</string></value></member>";
writer.WriteLine(lines);
lines=SR.ReadLine();
writer.WriteLine(lines);
lines=SR.ReadLine();
ran=this.RandomClass.Next(1,9999);
lines="<member><name>agent_id</name><value><string>aaaabbbb-8932-"+ran.ToString("0000")+"-8664-58f53e442797</string></value></member>";
//lines="<member><name>agent_id</name><value><string>"+Session.ToString()+"</string></value></member>";
lines="<member><name>agent_id</name><value><string>aaaabbbb-8932-"+SessionRand.ToString("0000")+"-8664-58f53e442797</string></value></member>";
writer.WriteLine(lines);
lines=SR.ReadLine();

View File

@ -35,53 +35,63 @@ using libsecondlife.AssetSystem;
using System.IO;
using Axiom.MathLib;
namespace Second_server
namespace OpenSim
{
/// <summary>
/// Description of Prim_manager.
/// </summary>
public class Prim_manager
public class PrimManager
{
private Server server;
public Agent_Manager agent_man;
public AgentManager Agent_Manager;
private uint prim_count;
public libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock object_template;
public Dictionary<libsecondlife.LLUUID,prim_info> Prim_list;
public Prim_manager(Server serve)
public libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock PrimTemplate;
public Dictionary<libsecondlife.LLUUID,PrimInfo> PrimList;
/// <summary>
///
/// </summary>
/// <param name="serve"></param>
public PrimManager(Server serve)
{
server=serve;
Prim_list=new Dictionary<libsecondlife.LLUUID,prim_info> ();
this.setuptemplates("objectupate164.dat");
PrimList=new Dictionary<libsecondlife.LLUUID,PrimInfo> ();
this.SetupTemplates("objectupate164.dat");
}
//*********************************************************************
public void create_prim(User_Agent_info User_info, libsecondlife.LLVector3 p1, ObjectAddPacket add_pack)
/// <summary>
///
/// </summary>
/// <param name="User_info"></param>
/// <param name="p1"></param>
/// <param name="add_pack"></param>
public void CreatePrim(User_Agent_info User_info, libsecondlife.LLVector3 p1, ObjectAddPacket add_pack)
{
ObjectUpdatePacket objupdate=new ObjectUpdatePacket();
objupdate.RegionData.RegionHandle=1096213093147648;
objupdate.RegionData.RegionHandle=Globals.Instance.RegionHandle;
objupdate.RegionData.TimeDilation=64096;
objupdate.ObjectData=new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1];
objupdate.ObjectData[0]=this.object_template;
objupdate.ObjectData[0].OwnerID=User_info.AgentID;
objupdate.ObjectData[0].PCode=add_pack.ObjectData.PCode;
objupdate.ObjectData[0].PathBegin=add_pack.ObjectData.PathBegin;
objupdate.ObjectData[0].PathEnd=add_pack.ObjectData.PathEnd;
objupdate.ObjectData[0].PathScaleX=add_pack.ObjectData.PathScaleX;
objupdate.ObjectData[0].PathScaleY=add_pack.ObjectData.PathScaleY;
objupdate.ObjectData[0].PathShearX=add_pack.ObjectData.PathShearX;
objupdate.ObjectData[0].PathShearY=add_pack.ObjectData.PathShearY;
objupdate.ObjectData[0].PathSkew=add_pack.ObjectData.PathSkew;
objupdate.ObjectData[0].ProfileBegin=add_pack.ObjectData.ProfileBegin;
objupdate.ObjectData[0].ProfileEnd=add_pack.ObjectData.ProfileEnd;
objupdate.ObjectData[0].Scale=add_pack.ObjectData.Scale;//new LLVector3(1,1,1);
objupdate.ObjectData[0].PathCurve=add_pack.ObjectData.PathCurve;
objupdate.ObjectData[0].ProfileCurve=add_pack.ObjectData.ProfileCurve;
objupdate.ObjectData[0].ParentID=0;
objupdate.ObjectData[0].ProfileHollow=add_pack.ObjectData.ProfileHollow;
PrimData PData=new PrimData();
objupdate.ObjectData[0]=this.PrimTemplate;
PData.OwnerID=objupdate.ObjectData[0].OwnerID=User_info.AgentID;
PData.PCode=objupdate.ObjectData[0].PCode=add_pack.ObjectData.PCode;
PData.PathBegin=objupdate.ObjectData[0].PathBegin=add_pack.ObjectData.PathBegin;
PData.PathEnd=objupdate.ObjectData[0].PathEnd=add_pack.ObjectData.PathEnd;
PData.PathScaleX=objupdate.ObjectData[0].PathScaleX=add_pack.ObjectData.PathScaleX;
PData.PathScaleY=objupdate.ObjectData[0].PathScaleY=add_pack.ObjectData.PathScaleY;
PData.PathShearX=objupdate.ObjectData[0].PathShearX=add_pack.ObjectData.PathShearX;
PData.PathShearY=objupdate.ObjectData[0].PathShearY=add_pack.ObjectData.PathShearY;
PData.PathSkew=objupdate.ObjectData[0].PathSkew=add_pack.ObjectData.PathSkew;
PData.ProfileBegin=objupdate.ObjectData[0].ProfileBegin=add_pack.ObjectData.ProfileBegin;
PData.ProfileEnd=objupdate.ObjectData[0].ProfileEnd=add_pack.ObjectData.ProfileEnd;
PData.Scale=objupdate.ObjectData[0].Scale=add_pack.ObjectData.Scale;//new LLVector3(1,1,1);
PData.PathCurve=objupdate.ObjectData[0].PathCurve=add_pack.ObjectData.PathCurve;
PData.ProfileCurve=objupdate.ObjectData[0].ProfileCurve=add_pack.ObjectData.ProfileCurve;
PData.ParentID=objupdate.ObjectData[0].ParentID=0;
PData.ProfileHollow=objupdate.ObjectData[0].ProfileHollow=add_pack.ObjectData.ProfileHollow;
//finish off copying rest of shape data
objupdate.ObjectData[0].ID=(uint)(702000+prim_count);
@ -95,30 +105,40 @@ namespace Second_server
server.SendPacket(objupdate,true,User_info);
//should send to all users
foreach (KeyValuePair<libsecondlife.LLUUID,Avatar_data> kp in agent_man.Agent_list)
foreach (KeyValuePair<libsecondlife.LLUUID,AvatarData> kp in Agent_Manager.AgentList)
{
if(kp.Value.Net_info.AgentID!=User_info.AgentID)
if(kp.Value.NetInfo.AgentID!=User_info.AgentID)
{
server.SendPacket(objupdate,true,kp.Value.Net_info);
server.SendPacket(objupdate,true,kp.Value.NetInfo);
}
}
//should store this infomation
prim_info n_prim=new prim_info();
n_prim.full_ID=objupdate.ObjectData[0].FullID;
n_prim.local_ID=objupdate.ObjectData[0].ID;
n_prim.pos=p1;
PrimInfo NewPrim=new PrimInfo();
NewPrim.FullID=objupdate.ObjectData[0].FullID;
NewPrim.LocalID=objupdate.ObjectData[0].ID;
NewPrim.Position=p1;
NewPrim.data=PData;
this.Prim_list.Add(n_prim.full_ID,n_prim);
this.PrimList.Add(NewPrim.FullID,NewPrim);
//store rest of data
}
public void update_prim_position(User_Agent_info user,float x, float y, float z,uint l_id)
/// <summary>
///
/// </summary>
/// <param name="User"></param>
/// <param name="position"></param>
/// <param name="LocalID"></param>
/// <param name="setRotation"></param>
/// <param name="rotation"></param>
public void UpdatePrimPosition(User_Agent_info User,LLVector3 position,uint LocalID,bool setRotation, LLQuaternion rotation)
{
prim_info pri=null;
foreach (KeyValuePair<libsecondlife.LLUUID,prim_info> kp in this.Prim_list)
PrimInfo pri=null;
foreach (KeyValuePair<libsecondlife.LLUUID,PrimInfo> kp in this.PrimList)
{
if(kp.Value.local_ID==l_id)
if(kp.Value.LocalID==LocalID)
{
pri=kp.Value;
}
@ -127,18 +147,37 @@ namespace Second_server
{
return;
}
uint ID=pri.local_ID;
uint ID=pri.LocalID;
libsecondlife.LLVector3 pos2=new LLVector3(position.X,position.Y,position.Z);
libsecondlife.LLQuaternion rotation2;
if(!setRotation)
{
pri.Position=pos2;
rotation2=new LLQuaternion(pri.Rotation.X,pri.Rotation.Y,pri.Rotation.Z,pri.Rotation.W);
}
else
{
rotation2=new LLQuaternion(rotation.X,rotation.Y,rotation.Z,rotation.W);
pos2=pri.Position;
pri.Rotation=rotation;
}
rotation2.W+=1;
rotation2.X+=1;
rotation2.Y+=1;
rotation2.Z+=1;
byte[] bytes=new byte[60];
ImprovedTerseObjectUpdatePacket im=new ImprovedTerseObjectUpdatePacket();
im.RegionData.RegionHandle=1096213093147648;
im.RegionData.RegionHandle=Globals.Instance.RegionHandle;
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=object_template.TextureEntry;
libsecondlife.LLVector3 pos2=new LLVector3(x,y,z);
dat.TextureEntry=PrimTemplate.TextureEntry;
//System.Console.WriteLine("new position is :"+position);
bytes[i++] = (byte)(ID % 256);
bytes[i++] = (byte)((ID >> 8) % 256);
@ -151,7 +190,7 @@ namespace Second_server
// bytes[i++]=128;
// bytes[i++]=63;
byte[] pb=pos2.GetBytes();
pri.pos=pos2;
pri.Position=pos2;
Array.Copy(pb,0,bytes,i,pb.Length);
i+=12;
ushort ac=32767;
@ -172,16 +211,36 @@ namespace Second_server
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);
//if(setRotation)
//{
ushort rw, rx,ry,rz;
rw=(ushort)(32768*rotation2.W);
rx=(ushort)(32768*rotation2.X);
ry=(ushort)(32768*rotation2.Y);
rz=(ushort)(32768*rotation2.Z);
//rot
bytes[i++] = (byte)(rx % 256);
bytes[i++] = (byte)((rx >> 8) % 256);
bytes[i++] = (byte)(ry % 256);
bytes[i++] = (byte)((ry >> 8) % 256);
bytes[i++] = (byte)(rz % 256);
bytes[i++] = (byte)((rz >> 8) % 256);
bytes[i++] = (byte)(rw % 256);
bytes[i++] = (byte)((rw >> 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);
bytes[i++] = (byte)(ac % 256);
bytes[i++] = (byte)((ac >> 8) % 256);
}*/
//rotation vel
bytes[i++] = (byte)(ac % 256);
bytes[i++] = (byte)((ac >> 8) % 256);
@ -193,23 +252,32 @@ namespace Second_server
dat.Data=bytes;
//server.SendPacket(im,true,user);
//should send to all users.
foreach (KeyValuePair<libsecondlife.LLUUID,Avatar_data> kp in agent_man.Agent_list)
foreach (KeyValuePair<libsecondlife.LLUUID,AvatarData> kp in Agent_Manager.AgentList)
{
if(kp.Value.Net_info.AgentID!=user.AgentID)
if(kp.Value.NetInfo.AgentID!=User.AgentID)
{
server.SendPacket(im,true,kp.Value.Net_info);
server.SendPacket(im,true,kp.Value.NetInfo);
}
}
}
public void send_existing_prims(User_Agent_info user)
/// <summary>
///
/// </summary>
/// <param name="user"></param>
public void SendExistingPrims(User_Agent_info user)
{
//send data for already created prims to a new joining user
}
//**************************************************************
public void setuptemplates(string name)
/// <summary>
///
/// </summary>
/// <param name="name"></param>
public void SetupTemplates(string name)
{
ObjectUpdatePacket objupdate=new ObjectUpdatePacket();
objupdate.RegionData.RegionHandle=1096213093147648;
objupdate.RegionData.RegionHandle=Globals.Instance.RegionHandle;
objupdate.RegionData.TimeDilation=64096;
objupdate.ObjectData=new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1];
@ -224,7 +292,7 @@ namespace Second_server
libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock objdata=new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock(data1,ref i);
objupdate.ObjectData[0]=objdata;
this.object_template=objdata;
this.PrimTemplate=objdata;
objdata.UpdateFlags=objdata.UpdateFlags+12-16+32+256;
objdata.OwnerID=new LLUUID("00000000-0000-0000-0000-000000000000");
//test adding a new texture to object , to test image downloading
@ -235,8 +303,13 @@ namespace Second_server
objdata.TextureEntry=ntex.ToBytes();
}
//********************************************************************
public void Read_Prim_database(string name,User_Agent_info user)
/// <summary>
///
/// </summary>
/// <param name="name"></param>
/// <param name="user"></param>
public void ReadPrimDatabase(string name,User_Agent_info user)
{
StreamReader SR;
string line;
@ -253,7 +326,7 @@ namespace Second_server
int num=Convert.ToInt32(comp[2]);
int start=Convert.ToInt32(comp[1]);
ObjectUpdatePacket objupdate=new ObjectUpdatePacket();
objupdate.RegionData.RegionHandle=1096213093147648;
objupdate.RegionData.RegionHandle=Globals.Instance.RegionHandle;
objupdate.RegionData.TimeDilation=64096;
objupdate.ObjectData=new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[num];
@ -285,24 +358,44 @@ namespace Second_server
}
}
public class prim_info
public class PrimInfo
{
public LLVector3 pos;
public LLVector3 vel;
public uint local_ID;
public LLUUID full_ID;
public prim_data data;
public LLVector3 Position;
public LLVector3 Velocity;
public LLQuaternion Rotation=LLQuaternion.Identity;
public uint LocalID;
public LLUUID FullID;
public PrimData data;
public prim_info()
public PrimInfo()
{
pos=new LLVector3(0,0,0);
vel=new LLVector3(0,0,0);
data=new prim_data();
Position=new LLVector3(0,0,0);
Velocity=new LLVector3(0,0,0);
//data=new PrimData();
}
}
public class prim_data
public class PrimData
{
public prim_data()
public LLUUID OwnerID;
public byte PCode;
public byte PathBegin;
public byte PathEnd;
public byte PathScaleX;
public byte PathScaleY;
public byte PathShearX;
public byte PathShearY;
public sbyte PathSkew;
public byte ProfileBegin;
public byte ProfileEnd;
public LLVector3 Scale;
public byte PathCurve;
public byte ProfileCurve;
public uint ParentID=0;
public byte ProfileHollow;
public bool DataBaseStorage=false;
public PrimData()
{
}

View File

@ -33,18 +33,18 @@ using System.Collections;
//using LuaInterface;
using libsecondlife;
namespace Second_server
namespace OpenSim
{
/// <summary>
/// Description of Script_manager.
/// </summary>
public class Script_manager
public class ScriptManager
{
//public LuaInterface.Lua Lu;
//private ArrayList scripts;
//private prim_info current_prim;
public Script_manager()
public ScriptManager()
{
}
@ -54,36 +54,52 @@ namespace Second_server
//register any lua routines , like check finish script one
Lu.OpenMathLib();
}*/
public void script_register( script_object_interface script)
private void RegisterFunctions()
{
//called by scripts to register themselves
//lu.RegisterFunction( "RegisterScript",this,this.GetType().GetMethod("ScriptRegister"));
//lu.RegisterFunction( "MoveObject",this,this.GetType().GetMethod("MoveObject"));
//lu.RegisterFunction( "Say",this,this.GetType().GetMethod("Say"));
}
public void Call_tick(prim_info prim)
public void Call_tick(PrimInfo prim)
{
//set current prim and then call tick function in linked script
}
public void Call_click(prim_info prim)
public void Call_touch(PrimInfo prim)
{
//set current prim and then call clicked function in linked script
}
private void Register_functions()
public void Call_on_rex(PrimInfo prim)
{
//lu.RegisterFunction( "register_script",this,this.GetType().GetMethod("script_register"));
//lu.RegisterFunction( "Move_object",this,this.GetType().GetMethod("Move_object"));
//set current prim and then call clicked function in linked script
}
//Lua registered functions
public void Move_object(float x ,float y, float z)
#region Lua Functions
public void ScriptRegister( script_object_interface script)
{
//called by scripts to register themselves
}
public void MoveObject(float x ,float y, float z)
{
}
public void Say(string message)
{
}
#endregion
}
public interface script_object_interface
{
void Frame_tick();
void clicked();
void frame_tick();
void touch(int num);
void on_rex(int num);
}
}

View File

@ -1,8 +1,8 @@
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<OutputType>Exe</OutputType>
<RootNamespace>Controller</RootNamespace>
<AssemblyName>Second-server</AssemblyName>
<RootNamespace>OpenSim</RootNamespace>
<AssemblyName>OpenSim</AssemblyName>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}</ProjectGuid>
@ -35,6 +35,10 @@
<Reference Include="System" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="libsecondlife">
<HintPath>bin\Release\libsecondlife.dll</HintPath>
<SpecificVersion>False</SpecificVersion>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="AssemblyInfo.cs" />
@ -47,12 +51,9 @@
<Compile Include="Asset_manager.cs" />
<Compile Include="Script_manager.cs" />
<Compile Include="Server.cs" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\libsecondlife\libsecondlife-cs\libsecondlife.csproj">
<Project>{D9CDEDFB-8169-4B03-B57F-0DF638F044EC}</Project>
<Name>libsecondlife</Name>
</ProjectReference>
<Compile Include="StorageManager.cs" />
<Compile Include="GridManager.cs" />
<Compile Include="Globals.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
</Project>

View File

@ -1,6 +1,6 @@

Microsoft Visual Studio Solution File, Format Version 9.00
# Visual Studio 2005
# SharpDevelop 2.1.0.2017
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Second-server", "Second-server.csproj", "{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "libsecondlife", "..\..\libsecondlife\libsecondlife-cs\libsecondlife.csproj", "{D9CDEDFB-8169-4B03-B57F-0DF638F044EC}"
@ -27,6 +27,8 @@ Global
{D9CDEDFB-8169-4B03-B57F-0DF638F044EC}.Release|.NET 1.1.Build.0 = Release|.NET 1.1
{D9CDEDFB-8169-4B03-B57F-0DF638F044EC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D9CDEDFB-8169-4B03-B57F-0DF638F044EC}.Release|Any CPU.Build.0 = Release|Any CPU
{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Debug|.NET 1.1.Build.0 = Debug|.NET 1.1
{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Release|.NET 1.1.Build.0 = Release|.NET 1.1
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -37,16 +37,17 @@ using System.Timers;
//really hacked , messy code
namespace Second_server
namespace OpenSim
{
/// <summary>
/// Description of Server.
/// </summary>
public interface Server_callback
public interface ServerCallback
{
void main_callback(Packet pack, User_Agent_info User_info);
void new_user(User_Agent_info User_info);
void error(string text);
//should replace with delegates
void MainCallback(Packet pack, User_Agent_info User_info);
void NewUserCallback(User_Agent_info User_info);
void ErrorCallback(string text);
}
public class Server
{
@ -91,7 +92,7 @@ namespace Second_server
get { return connected; }
}
private Server_callback callback_object;
private ServerCallback CallbackObject;
//private NetworkManager Network;
// private Dictionary<PacketType, List<NetworkManager.PacketCallback>> Callbacks;
private uint Sequence = 0;
@ -125,10 +126,10 @@ namespace Second_server
/// <param name="circuit"></param>
/// <param name="ip"></param>
/// <param name="port"></param>
public Server(Server_callback s_callback)
public Server(ServerCallback s_callback)
{
this.callback_object=s_callback;
this.CallbackObject=s_callback;
// Client = client;
// Network = client.Network;
// Callbacks = callbacks;
@ -148,7 +149,7 @@ namespace Second_server
// Create an endpoint that we will be communicating with (need it in two
// types due to .NET weirdness)
// ipEndPoint = new IPEndPoint(ip, port);
ipEndPoint = new IPEndPoint(IPAddress.Any, 1000);
ipEndPoint = new IPEndPoint(IPAddress.Any, Globals.Instance.IpPort);
endPoint = (EndPoint)ipEndPoint;
@ -486,7 +487,7 @@ namespace Second_server
new_user.endpoint=epSender;
new_user.Inbox = new Queue<uint>(Settings.INBOX_SIZE);
this.callback_object.new_user(new_user);
this.CallbackObject.NewUserCallback(new_user);
this.User_agents.Add(new_user);
}
@ -526,14 +527,14 @@ namespace Second_server
{
//error finding agent
this.callback_object.error("no user found");
this.CallbackObject.ErrorCallback("no user found");
return;
}
// Fail-safe check
if (packet == null)
{
this.callback_object.error("couldn't build packet");
this.CallbackObject.ErrorCallback("couldn't build packet");
// Client.Log("Couldn't build a message from the incoming data", Helpers.LogLevel.Warning);
return;
}
@ -615,7 +616,7 @@ namespace Second_server
}
// this.callback_object.error("calling callback");
this.callback_object.main_callback(packet,User_info);
this.CallbackObject.MainCallback(packet,User_info);
// this.callback_object.error("finished");
// Fire the registered packet events
#region FireCallbacks

View File

@ -36,26 +36,26 @@ using libsecondlife.AssetSystem;
using System.IO;
namespace Second_server
namespace OpenSim
{
/// <summary>
/// Description of Texture_manager.
/// </summary>
public class Texture_manager
public class TextureManager
{
public Dictionary<libsecondlife.LLUUID,Texture_image> textures;
public Dictionary<libsecondlife.LLUUID,TextureImage> textures;
public ArrayList requests=new ArrayList(); //should change to a generic
public ArrayList uploads=new ArrayList();
private Server server;
public Texture_manager(Server serve)
public TextureManager(Server serve)
{
server=serve;
textures=new Dictionary<libsecondlife.LLUUID,Texture_image> ();
textures=new Dictionary<libsecondlife.LLUUID,TextureImage> ();
this.initialise();
}
public void add_request(User_Agent_info user, LLUUID image_id)
public void AddRequest(User_Agent_info user, LLUUID image_id)
{
if(!this.textures.ContainsKey(image_id))
@ -66,10 +66,10 @@ namespace Second_server
server.SendPacket(im_not,true,user);
return;
}
Texture_image imag=this.textures[image_id];
Texture_request req=new Texture_request();
req.req_user=user;
req.req_image=image_id;
TextureImage imag=this.textures[image_id];
TextureRequest req=new TextureRequest();
req.RequestUser=user;
req.RequestImage=image_id;
req.image_info=imag;
if(imag.data.LongLength>1000) //should be bigger or smaller?
@ -87,11 +87,11 @@ namespace Second_server
}
public void add_texture(LLUUID image_id, string name, byte[] data)
public void AddTexture(LLUUID image_id, string name, byte[] data)
{
}
public void Do_work(ulong time)
public void DoWork(ulong time)
{
if(this.requests.Count==0)
{
@ -109,10 +109,10 @@ namespace Second_server
{
num=5;
}
Texture_request req;
TextureRequest req;
for(int i=0; i<num; i++)
{
req=(Texture_request)this.requests[i];
req=(TextureRequest)this.requests[i];
if(req.packet_counter==0)
{
@ -126,9 +126,10 @@ namespace Second_server
im.ImageID.Size=(uint)req.image_info.data.Length;
im.ImageData.Data=req.image_info.data;
im.ImageID.Codec=2;
server.SendPacket(im,true,req.req_user);
server.SendPacket(im,true,req.RequestUser);
req.packet_counter++;
req.image_info.last_used=time;
System.Console.WriteLine("sent texture: "+req.image_info.Full_ID);
}
else
{
@ -145,7 +146,7 @@ namespace Second_server
//remove requests that have been completed
for(int i=0; i<num; i++)
{
req=(Texture_request)this.requests[i];
req=(TextureRequest)this.requests[i];
if(req.packet_counter==req.num_packets)
{
this.requests.Remove(req);
@ -153,7 +154,7 @@ namespace Second_server
}
}
public void recieve_texture(Packet pack)
public void RecieveTexture(Packet pack)
{
}
@ -161,15 +162,31 @@ namespace Second_server
private void initialise()
{
//for now read in our test image
Texture_image im=new Texture_image();
TextureImage im=new TextureImage();
im.filename="testpic2.jp2";
im.Full_ID=new LLUUID("00000000-0000-0000-5005-000000000005");
this.load_image(im);
this.LoadImage(im);
this.textures.Add(im.Full_ID,im);
im=new TextureImage();
im.filename="map_base.jp2";
im.Full_ID=new LLUUID("00000000-0000-0000-7007-000000000006");
this.LoadImage(im);
this.textures.Add(im.Full_ID,im);
im=new TextureImage();
im.filename="map1.jp2";
im.Full_ID=new LLUUID("00000000-0000-0000-7009-000000000008");
this.LoadImage(im);
this.textures.Add(im.Full_ID,im);
}
private void load_image(Texture_image im)
private void LoadImage(TextureImage im)
{
string data_path=System.AppDomain.CurrentDomain.BaseDirectory + @"\textures\";
//should request Image from StorageManager
//but for now read from file
string data_path=System.AppDomain.CurrentDomain.BaseDirectory + @"\textures\";
string filename=data_path+@im.filename;
FileInfo fInfo = new FileInfo(filename);
@ -187,21 +204,21 @@ namespace Second_server
}
public class Texture_request
public class TextureRequest
{
public User_Agent_info req_user;
public LLUUID req_image;
public Texture_image image_info;
public User_Agent_info RequestUser;
public LLUUID RequestImage;
public TextureImage image_info;
public long data_pointer=0;
public int num_packets=0;
public int packet_counter=0;
public Texture_request()
public TextureRequest()
{
}
}
public class Texture_image
public class TextureImage
{
public byte[] data;
public LLUUID Full_ID;
@ -211,7 +228,7 @@ namespace Second_server
public ulong last_used; //need to add a tick/time counter and keep record
// of how often images are requested to unload unused ones.
public Texture_image()
public TextureImage()
{
}