Added support for movements
parent
10956993b7
commit
d6bf4ede92
|
@ -49,29 +49,34 @@ namespace OpenSim
|
||||||
|
|
||||||
public AgentName GetAgentName(LLUUID AgentID)
|
public AgentName GetAgentName(LLUUID AgentID)
|
||||||
{
|
{
|
||||||
|
|
||||||
AgentName name;
|
AgentName name;
|
||||||
if(AgentList.ContainsKey(AgentID))
|
lock(AgentList)
|
||||||
{
|
{
|
||||||
name=AgentList[AgentID].Name;
|
if(AgentList.ContainsKey(AgentID))
|
||||||
}
|
{
|
||||||
else
|
name=AgentList[AgentID].Name;
|
||||||
{
|
}
|
||||||
name = new AgentName();
|
else
|
||||||
|
{
|
||||||
|
name = new AgentName();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return(name);
|
return(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
public AgentProfile GetAgent(LLUUID id)
|
public AgentProfile GetAgent(LLUUID id)
|
||||||
{
|
{
|
||||||
if(!this.AgentList.ContainsKey(id))
|
lock(AgentList)
|
||||||
{
|
{
|
||||||
return null;
|
if(!this.AgentList.ContainsKey(id))
|
||||||
}
|
{
|
||||||
else
|
return null;
|
||||||
{
|
}
|
||||||
AgentProfile avatar = this.AgentList[id];
|
else
|
||||||
return avatar;
|
{
|
||||||
|
AgentProfile avatar = this.AgentList[id];
|
||||||
|
return avatar;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -193,6 +198,28 @@ namespace OpenSim
|
||||||
_server.SendPacket(packet, true, kp.Value.Avatar.NetInfo);
|
_server.SendPacket(packet, true, kp.Value.Avatar.NetInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void SendTerseUpdateLists()
|
||||||
|
{
|
||||||
|
foreach (KeyValuePair<libsecondlife.LLUUID, AgentProfile> kp in this.AgentList)
|
||||||
|
{
|
||||||
|
if(kp.Value.Avatar.TerseUpdateList.Count > 0)
|
||||||
|
{
|
||||||
|
ImprovedTerseObjectUpdatePacket im = new ImprovedTerseObjectUpdatePacket();
|
||||||
|
im.RegionData.RegionHandle = Globals.Instance.RegionHandle;;
|
||||||
|
im.RegionData.TimeDilation = 64096;
|
||||||
|
|
||||||
|
im.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[kp.Value.Avatar.TerseUpdateList.Count];
|
||||||
|
|
||||||
|
for(int i = 0; i < kp.Value.Avatar.TerseUpdateList.Count; i++)
|
||||||
|
{
|
||||||
|
im.ObjectData[i] = kp.Value.Avatar.TerseUpdateList[i];
|
||||||
|
}
|
||||||
|
_server.SendPacket(im, true, kp.Value.Avatar.NetInfo);
|
||||||
|
kp.Value.Avatar.TerseUpdateList.Clear();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public struct AgentName
|
public struct AgentName
|
||||||
|
@ -219,7 +246,7 @@ namespace OpenSim
|
||||||
public NetworkInfo NetInfo;
|
public NetworkInfo NetInfo;
|
||||||
public LLUUID FullID;
|
public LLUUID FullID;
|
||||||
public uint LocalID;
|
public uint LocalID;
|
||||||
//public LLQuaternion Rotation;
|
public LLQuaternion BodyRotation;
|
||||||
public bool Walk = false;
|
public bool Walk = false;
|
||||||
public bool Started = false;
|
public bool Started = false;
|
||||||
//public TextureEntry TextureEntry;
|
//public TextureEntry TextureEntry;
|
||||||
|
@ -248,8 +275,8 @@ namespace OpenSim
|
||||||
|
|
||||||
public class AvatarWearable
|
public class AvatarWearable
|
||||||
{
|
{
|
||||||
public LLUUID AssetID;
|
public LLUUID AssetID = new LLUUID("00000000-0000-0000-0000-000000000000");
|
||||||
public LLUUID ItemID;
|
public LLUUID ItemID = new LLUUID("00000000-0000-0000-0000-000000000000");
|
||||||
|
|
||||||
public AvatarWearable()
|
public AvatarWearable()
|
||||||
{
|
{
|
||||||
|
|
14
Assets.cs
14
Assets.cs
|
@ -41,7 +41,6 @@ namespace OpenSim
|
||||||
public sbyte InvType;
|
public sbyte InvType;
|
||||||
public string Name;
|
public string Name;
|
||||||
public string Description;
|
public string Description;
|
||||||
public string Filename;
|
|
||||||
|
|
||||||
public AssetBase()
|
public AssetBase()
|
||||||
{
|
{
|
||||||
|
@ -58,9 +57,10 @@ namespace OpenSim
|
||||||
this.PrimData = new PrimData();
|
this.PrimData = new PrimData();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
public class PrimData
|
public class PrimData : Node
|
||||||
{
|
{
|
||||||
public LLUUID OwnerID;
|
public LLUUID OwnerID;
|
||||||
|
public uint LocalID;
|
||||||
public byte PCode;
|
public byte PCode;
|
||||||
public byte PathBegin;
|
public byte PathBegin;
|
||||||
public byte PathEnd;
|
public byte PathEnd;
|
||||||
|
@ -82,6 +82,16 @@ namespace OpenSim
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void FromBytes(byte[] bytes)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte[] ToBytes()
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//a hangover from the old code, so is it needed for future use?
|
//a hangover from the old code, so is it needed for future use?
|
||||||
|
|
|
@ -71,7 +71,6 @@ namespace OpenSim
|
||||||
|
|
||||||
public void Open(string dbDir, string appName, Stream errStream) {
|
public void Open(string dbDir, string appName, Stream errStream) {
|
||||||
this.dbDir = dbDir;
|
this.dbDir = dbDir;
|
||||||
//Remove();
|
|
||||||
|
|
||||||
// open local prim database
|
// open local prim database
|
||||||
Db db = new Db(DbCreateFlags.None);
|
Db db = new Db(DbCreateFlags.None);
|
||||||
|
@ -152,7 +151,11 @@ namespace OpenSim
|
||||||
protected override void SerializeValue(PrimAsset value) {
|
protected override void SerializeValue(PrimAsset value) {
|
||||||
Formatter.Serialize<string>(value.Name);
|
Formatter.Serialize<string>(value.Name);
|
||||||
Formatter.Serialize<string>(value.Description);
|
Formatter.Serialize<string>(value.Description);
|
||||||
|
Formatter.Serialize<int>((int?)value.Data.Length);
|
||||||
|
for( int i = 0; i < value.Data.Length; i++)
|
||||||
|
{
|
||||||
|
Formatter.Serialize<byte>((byte?)value.Data[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void DeserializeInstance(ref PrimAsset instance) {
|
protected override void DeserializeInstance(ref PrimAsset instance) {
|
||||||
|
@ -163,12 +166,22 @@ namespace OpenSim
|
||||||
protected override void DeserializeMembers(PrimAsset instance) {
|
protected override void DeserializeMembers(PrimAsset instance) {
|
||||||
Formatter.Deserialize<string>(ref instance.Name);
|
Formatter.Deserialize<string>(ref instance.Name);
|
||||||
Formatter.Deserialize<string>(ref instance.Description);
|
Formatter.Deserialize<string>(ref instance.Description);
|
||||||
|
int dataLength;
|
||||||
|
dataLength =(int) Formatter.Deserialize<int>();
|
||||||
|
instance.Data = new byte[dataLength];
|
||||||
|
for( int i = 0; i < dataLength; i++)
|
||||||
|
{
|
||||||
|
instance.Data[i] =(byte) Formatter.Deserialize<byte>();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void SkipValue() {
|
protected override void SkipValue() {
|
||||||
if (Formatter.Skip<string>())
|
if (Formatter.Skip<string>())
|
||||||
Formatter.Skip<string>();
|
if (Formatter.Skip<string>())
|
||||||
|
if ( Formatter.Skip<int>())
|
||||||
|
Formatter.Skip<byte[]>();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -179,7 +192,11 @@ namespace OpenSim
|
||||||
protected override void SerializeValue(AssetBase value) {
|
protected override void SerializeValue(AssetBase value) {
|
||||||
Formatter.Serialize<string>(value.Name);
|
Formatter.Serialize<string>(value.Name);
|
||||||
Formatter.Serialize<string>(value.Description);
|
Formatter.Serialize<string>(value.Description);
|
||||||
|
Formatter.Serialize<int>((int?)value.Data.Length);
|
||||||
|
for( int i = 0; i < value.Data.Length; i++)
|
||||||
|
{
|
||||||
|
Formatter.Serialize<byte>((byte?)value.Data[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void DeserializeInstance(ref AssetBase instance) {
|
protected override void DeserializeInstance(ref AssetBase instance) {
|
||||||
|
@ -190,12 +207,21 @@ namespace OpenSim
|
||||||
protected override void DeserializeMembers(AssetBase instance) {
|
protected override void DeserializeMembers(AssetBase instance) {
|
||||||
Formatter.Deserialize<string>(ref instance.Name);
|
Formatter.Deserialize<string>(ref instance.Name);
|
||||||
Formatter.Deserialize<string>(ref instance.Description);
|
Formatter.Deserialize<string>(ref instance.Description);
|
||||||
|
int dataLength;
|
||||||
|
dataLength =(int) Formatter.Deserialize<int>();
|
||||||
|
instance.Data = new byte[dataLength];
|
||||||
|
for( int i = 0; i < dataLength; i++)
|
||||||
|
{
|
||||||
|
instance.Data[i] =(byte) Formatter.Deserialize<byte>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void SkipValue() {
|
protected override void SkipValue() {
|
||||||
if (Formatter.Skip<string>())
|
if (Formatter.Skip<string>())
|
||||||
Formatter.Skip<string>();
|
if (Formatter.Skip<string>())
|
||||||
|
if ( Formatter.Skip<int>())
|
||||||
|
Formatter.Skip<byte[]>();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,7 +105,13 @@ namespace OpenSim
|
||||||
Console.WriteLine("RegionHandshake reply");
|
Console.WriteLine("RegionHandshake reply");
|
||||||
Scene.SendTerrainData(this.NetInfo);
|
Scene.SendTerrainData(this.NetInfo);
|
||||||
Scene.AddNewAvatar(AgentManager.GetAgent(this.NetInfo.User.AgentID).Avatar);
|
Scene.AddNewAvatar(AgentManager.GetAgent(this.NetInfo.User.AgentID).Avatar);
|
||||||
// send current avatars and prims data
|
break;
|
||||||
|
case PacketType.AgentWearablesRequest:
|
||||||
|
AgentManager.RequestWearables(this.NetInfo);
|
||||||
|
break;
|
||||||
|
case PacketType.AgentUpdate:
|
||||||
|
AgentUpdatePacket agentUpdate = (AgentUpdatePacket)packet;
|
||||||
|
Scene.AvatarMovementCommand(this.NetInfo, agentUpdate);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -27,6 +27,7 @@ Copyright (c) OpenSim project, http://sim.opensecondlife.org/
|
||||||
|
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Timers;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using libsecondlife;
|
using libsecondlife;
|
||||||
using libsecondlife.Packets;
|
using libsecondlife.Packets;
|
||||||
|
@ -43,6 +44,7 @@ namespace OpenSim
|
||||||
private AssetManager _assetManager;
|
private AssetManager _assetManager;
|
||||||
private SceneGraph _scene;
|
private SceneGraph _scene;
|
||||||
private PrimManager _primManager;
|
private PrimManager _primManager;
|
||||||
|
private Timer timer1 = new Timer();
|
||||||
|
|
||||||
public static void Main(string[] args)
|
public static void Main(string[] args)
|
||||||
{
|
{
|
||||||
|
@ -50,14 +52,11 @@ namespace OpenSim
|
||||||
bool Run = true;
|
bool Run = true;
|
||||||
while( Run )
|
while( Run )
|
||||||
{
|
{
|
||||||
|
|
||||||
string input = Console.ReadLine();
|
string input = Console.ReadLine();
|
||||||
|
|
||||||
if(input == "Exit")
|
if(input == "Exit")
|
||||||
{
|
{
|
||||||
Run = false;
|
Run = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
BerkeleyDatabases.Instance.Close();
|
BerkeleyDatabases.Instance.Close();
|
||||||
|
@ -84,6 +83,9 @@ namespace OpenSim
|
||||||
_loginServer = new LoginServer(_backboneServers.UserServer);
|
_loginServer = new LoginServer(_backboneServers.UserServer);
|
||||||
_loginServer.Startup();
|
_loginServer.Startup();
|
||||||
}
|
}
|
||||||
|
timer1.Enabled = true;
|
||||||
|
timer1.Interval = 200;
|
||||||
|
timer1.Elapsed +=new ElapsedEventHandler( this.Timer1Tick );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,6 +100,12 @@ namespace OpenSim
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Timer1Tick( object sender, System.EventArgs e )
|
||||||
|
{
|
||||||
|
//this.time++;
|
||||||
|
this._scene.Update();
|
||||||
|
// this._assetManager.DoWork( time );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class BackboneServers
|
public class BackboneServers
|
||||||
|
|
|
@ -241,7 +241,7 @@ namespace OpenSim
|
||||||
|
|
||||||
XmlNode nodes = root.FirstChild;
|
XmlNode nodes = root.FirstChild;
|
||||||
if (nodes.Name != "Grid")
|
if (nodes.Name != "Grid")
|
||||||
throw new Exception("Error: Invalid File. <project> first child should be <Grid>");
|
throw new Exception("Error: Invalid File. <Root> first child should be <Grid>");
|
||||||
|
|
||||||
if (nodes.HasChildNodes) {
|
if (nodes.HasChildNodes) {
|
||||||
foreach( XmlNode xmlnc in nodes.ChildNodes)
|
foreach( XmlNode xmlnc in nodes.ChildNodes)
|
||||||
|
|
|
@ -52,10 +52,16 @@ namespace OpenSim
|
||||||
public List<InventoryFolder> Folders;
|
public List<InventoryFolder> Folders;
|
||||||
public int LastCached; //time this was last stored/compared to user server
|
public int LastCached; //time this was last stored/compared to user server
|
||||||
public LLUUID AgentID;
|
public LLUUID AgentID;
|
||||||
|
public AvatarWearable[] Wearables;
|
||||||
|
|
||||||
public AgentInventory()
|
public AgentInventory()
|
||||||
{
|
{
|
||||||
Folders = new List<InventoryFolder>();
|
Folders = new List<InventoryFolder>();
|
||||||
|
Wearables = new AvatarWearable[2];
|
||||||
|
for(int i = 0; i < 2; i++)
|
||||||
|
{
|
||||||
|
Wearables[i] = new AvatarWearable();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,7 @@ namespace OpenSim
|
||||||
}
|
}
|
||||||
public void CreateNewPrimStorage(PrimAsset prim)
|
public void CreateNewPrimStorage(PrimAsset prim)
|
||||||
{
|
{
|
||||||
|
Console.WriteLine("prim data length is: "+prim.Data.Length);
|
||||||
byte[] dataBuffer = new byte[4096];
|
byte[] dataBuffer = new byte[4096];
|
||||||
byte[] keyBuffer = new byte[256];
|
byte[] keyBuffer = new byte[256];
|
||||||
int index;
|
int index;
|
||||||
|
|
|
@ -39,6 +39,14 @@
|
||||||
<HintPath>bin\Debug\Kds.Serialization.dll</HintPath>
|
<HintPath>bin\Debug\Kds.Serialization.dll</HintPath>
|
||||||
<SpecificVersion>False</SpecificVersion>
|
<SpecificVersion>False</SpecificVersion>
|
||||||
</Reference>
|
</Reference>
|
||||||
|
<Reference Include="Axiom.MathLib">
|
||||||
|
<HintPath>bin\Debug\Axiom.MathLib.dll</HintPath>
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="log4net">
|
||||||
|
<HintPath>bin\Debug\log4net.dll</HintPath>
|
||||||
|
<SpecificVersion>False</SpecificVersion>
|
||||||
|
</Reference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="Controller.cs" />
|
<Compile Include="Controller.cs" />
|
||||||
|
|
|
@ -40,5 +40,23 @@ namespace OpenSim
|
||||||
{
|
{
|
||||||
_sceneGraph=sceneGraph;
|
_sceneGraph=sceneGraph;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void UpdatePhysics()
|
||||||
|
{
|
||||||
|
lock(this._sceneGraph.RootNode)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < _sceneGraph.RootNode.ChildrenCount; i++)
|
||||||
|
{
|
||||||
|
if(_sceneGraph.RootNode.GetChild(i).SceneType == 1) //check it is a avatar node
|
||||||
|
{
|
||||||
|
AvatarData avatar = (AvatarData)_sceneGraph.RootNode.GetChild(i);
|
||||||
|
avatar.Position.X += (avatar.Velocity.X * 0.2f);
|
||||||
|
avatar.Position.Y += (avatar.Velocity.Y * 0.2f);
|
||||||
|
avatar.Position.Z += (avatar.Velocity.Z * 0.2f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -41,17 +41,23 @@ namespace OpenSim
|
||||||
{
|
{
|
||||||
this._localPrimDB = new LocalPrimDb();
|
this._localPrimDB = new LocalPrimDb();
|
||||||
|
|
||||||
|
|
||||||
//database test
|
//database test
|
||||||
/*PrimAsset prim = new PrimAsset();
|
/*PrimAsset prim = new PrimAsset();
|
||||||
prim.Name="happy now";
|
prim.Name="happy now";
|
||||||
prim.Description= "test";
|
prim.Description= "test";
|
||||||
prim.FullID = new LLUUID("00000000-0000-0000-0000-000000000008");
|
prim.FullID = new LLUUID("00000000-0000-0000-0000-000000000008");
|
||||||
|
prim.Data= new byte[10];
|
||||||
|
prim.Data[0]=5;
|
||||||
|
prim.Data[1]=4;
|
||||||
|
prim.Data[2]=5;
|
||||||
|
prim.Data[3]=6;
|
||||||
|
prim.Data[4]=5;
|
||||||
this._localPrimDB.CreateNewPrimStorage(prim);
|
this._localPrimDB.CreateNewPrimStorage(prim);
|
||||||
|
|
||||||
PrimAsset prim1 = this._localPrimDB.GetPrimFromStroage( new LLUUID("00000000-0000-0000-0000-000000000008"));
|
PrimAsset prim1 = this._localPrimDB.GetPrimFromStroage( new LLUUID("00000000-0000-0000-0000-000000000008"));
|
||||||
Console.WriteLine("prim recieved : "+prim1.Name + " "+ prim1.Description);
|
Console.WriteLine("prim received : "+prim1.Name + " "+ prim1.Description);
|
||||||
|
Console.WriteLine("received prims data length is: "+prim1.Data.Length);
|
||||||
|
Console.WriteLine(Helpers.FieldToString(prim1.Data));
|
||||||
//this._localPrimDB.ReadWholedatabase();
|
//this._localPrimDB.ReadWholedatabase();
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
217
SceneGraph.cs
217
SceneGraph.cs
|
@ -31,6 +31,7 @@ using System.Collections.Generic;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using libsecondlife;
|
using libsecondlife;
|
||||||
using libsecondlife.Packets;
|
using libsecondlife.Packets;
|
||||||
|
using Axiom.MathLib;
|
||||||
|
|
||||||
namespace OpenSim
|
namespace OpenSim
|
||||||
{
|
{
|
||||||
|
@ -98,6 +99,7 @@ namespace OpenSim
|
||||||
public void Update()
|
public void Update()
|
||||||
{
|
{
|
||||||
// run physics engine to update positions etc since last frame
|
// run physics engine to update positions etc since last frame
|
||||||
|
this._physics.UpdatePhysics();
|
||||||
|
|
||||||
// process command list
|
// process command list
|
||||||
lock(this.Commands) //do we want to stop new commands being added while we process?
|
lock(this.Commands) //do we want to stop new commands being added while we process?
|
||||||
|
@ -108,6 +110,21 @@ namespace OpenSim
|
||||||
switch(command.CommandType)
|
switch(command.CommandType)
|
||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
|
//movement command
|
||||||
|
if(command.SObject.SceneType == 1)
|
||||||
|
{
|
||||||
|
AvatarData avatar =(AvatarData) command.SObject;
|
||||||
|
avatar.Walk = !avatar.Walk;
|
||||||
|
command.SObject.InternVelocityX = command.InternVelocityX;
|
||||||
|
command.SObject.InternVelocityY = command.InternVelocityY;
|
||||||
|
command.SObject.InternVelocityZ = command.InternVelocityZ;
|
||||||
|
|
||||||
|
command.SObject.Velocity = command.Velocity;
|
||||||
|
if((command.SObject.UpdateFlag & (1)) != 1)
|
||||||
|
{
|
||||||
|
command.SObject.UpdateFlag += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -128,15 +145,16 @@ namespace OpenSim
|
||||||
int updatemask = avatar.UpdateFlag & (128);
|
int updatemask = avatar.UpdateFlag & (128);
|
||||||
if(updatemask == 128) //is a new avatar?
|
if(updatemask == 128) //is a new avatar?
|
||||||
{
|
{
|
||||||
|
Console.WriteLine("new avatar has been added to scene so update it on the current scene");
|
||||||
|
|
||||||
this.SendAvatarDataToAll(avatar);
|
this.SendAvatarDataToAll(avatar);
|
||||||
|
|
||||||
//should send a avatar appearance to other clients except the avatar's owner
|
//should send a avatar appearance to other clients except the avatar's owner
|
||||||
|
this.SendAvatarAppearanceToAllExcept(avatar);
|
||||||
|
|
||||||
//and send complete scene update to the new avatar's owner
|
//and send complete scene update to the new avatar's owner
|
||||||
this.SendCompleteSceneTo(avatar);
|
this.SendCompleteSceneTo(avatar);
|
||||||
|
avatar.Started = true;
|
||||||
//reset new avatar flag
|
|
||||||
//avatar.UpdateFlag -= 128;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -167,9 +185,11 @@ namespace OpenSim
|
||||||
{
|
{
|
||||||
AvatarData avatar2 =(AvatarData) this.RootNode.GetChild(i);
|
AvatarData avatar2 =(AvatarData) this.RootNode.GetChild(i);
|
||||||
int newmask = avatar2.UpdateFlag & (128);
|
int newmask = avatar2.UpdateFlag & (128);
|
||||||
if(newmask != 128) //is a new avatar?
|
if(newmask != 128)
|
||||||
|
//is a new avatar?
|
||||||
|
//if it is then we don't need to tell it about updates as it has already received a full update of the scene
|
||||||
{
|
{
|
||||||
//no its not so let add to its updatelist
|
//but if it is not then we add to its updatelist
|
||||||
avatar2.TerseUpdateList.Add(this.CreateTerseBlock(avatar));
|
avatar2.TerseUpdateList.Add(this.CreateTerseBlock(avatar));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -187,6 +207,81 @@ namespace OpenSim
|
||||||
this.RootNode.GetChild(i).UpdateFlag = 0;
|
this.RootNode.GetChild(i).UpdateFlag = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this._agentManager.SendTerseUpdateLists();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AvatarMovementCommand(NetworkInfo userInfo, AgentUpdatePacket updatePacket)
|
||||||
|
{
|
||||||
|
uint mask = updatePacket.AgentData.ControlFlags & (1);
|
||||||
|
AvatarData avatar = _agentManager.GetAgent(userInfo.User.AgentID).Avatar;
|
||||||
|
if (avatar != null)
|
||||||
|
{
|
||||||
|
if (avatar.Started)
|
||||||
|
{
|
||||||
|
if (mask == (1))
|
||||||
|
{
|
||||||
|
if (!avatar.Walk)
|
||||||
|
{
|
||||||
|
UpdateCommand newCommand = new UpdateCommand();
|
||||||
|
newCommand.CommandType = 1;
|
||||||
|
newCommand.SObject = avatar;
|
||||||
|
//start walking
|
||||||
|
Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3(1, 0, 0);
|
||||||
|
Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(updatePacket.AgentData.BodyRotation.W, updatePacket.AgentData.BodyRotation.X, updatePacket.AgentData.BodyRotation.Y, updatePacket.AgentData.BodyRotation.Z);
|
||||||
|
Axiom.MathLib.Vector3 direc = q * v3;
|
||||||
|
direc.Normalize();
|
||||||
|
|
||||||
|
Axiom.MathLib.Vector3 internDirec = new Vector3(direc.x, direc.y, direc.z);
|
||||||
|
|
||||||
|
//work out velocity for sim physics system
|
||||||
|
direc = direc * ((0.03f) * 128f);
|
||||||
|
//because of us using a frame based system we can't update the avatar directly
|
||||||
|
//so we need to add the command to the list and let the update loop deal with it
|
||||||
|
newCommand.Velocity = new libsecondlife.LLVector3(0, 0 , 0);
|
||||||
|
newCommand.Velocity.X = direc.x;
|
||||||
|
newCommand.Velocity.Y = direc.y;
|
||||||
|
newCommand.Velocity.Z = direc.z;
|
||||||
|
//avatar.Walk = true;
|
||||||
|
|
||||||
|
//work out velocity for internal clients movement commands
|
||||||
|
internDirec = internDirec * (0.03f);
|
||||||
|
internDirec.x += 1;
|
||||||
|
internDirec.y += 1;
|
||||||
|
internDirec.z += 1;
|
||||||
|
|
||||||
|
newCommand.InternVelocityX = (ushort)(32768 * internDirec.x);
|
||||||
|
newCommand.InternVelocityY = (ushort)(32768 * internDirec.y);
|
||||||
|
newCommand.InternVelocityZ = (ushort)(32768 * internDirec.z);
|
||||||
|
lock(this.Commands)
|
||||||
|
{
|
||||||
|
this.Commands.Enqueue(newCommand);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (avatar.Walk)
|
||||||
|
{
|
||||||
|
UpdateCommand newCommand = new UpdateCommand();
|
||||||
|
newCommand.CommandType = 1;
|
||||||
|
newCommand.SObject = avatar;
|
||||||
|
//walking but key not pressed so need to stop
|
||||||
|
//avatar.Walk = false;
|
||||||
|
newCommand.Velocity.X = 0;
|
||||||
|
newCommand.Velocity.Y = 0;
|
||||||
|
newCommand.Velocity.Z = 0;
|
||||||
|
|
||||||
|
newCommand.InternVelocityX = (ushort)(32768 );
|
||||||
|
newCommand.InternVelocityY = (ushort)(32768 );
|
||||||
|
newCommand.InternVelocityZ = (ushort)(32768 );
|
||||||
|
lock(this.Commands)
|
||||||
|
{
|
||||||
|
this.Commands.Enqueue(newCommand);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#region send terrain data
|
#region send terrain data
|
||||||
|
@ -207,7 +302,7 @@ namespace OpenSim
|
||||||
Console.WriteLine("Sent terrain data");
|
Console.WriteLine("Sent terrain data");
|
||||||
|
|
||||||
//test
|
//test
|
||||||
this.SendAvatarData(userInfo);
|
//this.SendAvatarData(userInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -246,9 +341,11 @@ namespace OpenSim
|
||||||
|
|
||||||
public void AddNewAvatar(AvatarData avatar)
|
public void AddNewAvatar(AvatarData avatar)
|
||||||
{
|
{
|
||||||
|
Console.WriteLine("adding avatar to scene");
|
||||||
lock(this.RootNode)
|
lock(this.RootNode)
|
||||||
{
|
{
|
||||||
avatar.SceneName = "Avatar" + this._objectCount.ToString("00000");
|
avatar.SceneName = "Avatar" + this._objectCount.ToString("00000");
|
||||||
|
avatar.Position = new LLVector3(100f, 100f, 22f);
|
||||||
this._objectCount++;
|
this._objectCount++;
|
||||||
this.RootNode.AddChild(avatar);
|
this.RootNode.AddChild(avatar);
|
||||||
}
|
}
|
||||||
|
@ -316,6 +413,7 @@ namespace OpenSim
|
||||||
#endregion
|
#endregion
|
||||||
private void SendAvatarDataToAll(AvatarData avatar)
|
private void SendAvatarDataToAll(AvatarData avatar)
|
||||||
{
|
{
|
||||||
|
Console.WriteLine("sending avatar data");
|
||||||
ObjectUpdatePacket objupdate = new ObjectUpdatePacket();
|
ObjectUpdatePacket objupdate = new ObjectUpdatePacket();
|
||||||
objupdate.RegionData.RegionHandle = Globals.Instance.RegionHandle;
|
objupdate.RegionData.RegionHandle = Globals.Instance.RegionHandle;
|
||||||
objupdate.RegionData.TimeDilation = 0;
|
objupdate.RegionData.TimeDilation = 0;
|
||||||
|
@ -326,7 +424,7 @@ namespace OpenSim
|
||||||
objupdate.ObjectData[0].FullID = avatar.NetInfo.User.AgentID;
|
objupdate.ObjectData[0].FullID = avatar.NetInfo.User.AgentID;
|
||||||
objupdate.ObjectData[0].NameValue = _enc.GetBytes("FirstName STRING RW SV " + avatar.NetInfo.User.FirstName + "\nLastName STRING RW SV " + avatar.NetInfo.User.LastName + " \0");
|
objupdate.ObjectData[0].NameValue = _enc.GetBytes("FirstName STRING RW SV " + avatar.NetInfo.User.FirstName + "\nLastName STRING RW SV " + avatar.NetInfo.User.LastName + " \0");
|
||||||
|
|
||||||
libsecondlife.LLVector3 pos2 = new LLVector3(100f, 100.0f, 22.0f);
|
libsecondlife.LLVector3 pos2 = avatar.Position;
|
||||||
byte[] pb = pos2.GetBytes();
|
byte[] pb = pos2.GetBytes();
|
||||||
Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length);
|
Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 16, pb.Length);
|
||||||
|
|
||||||
|
@ -345,12 +443,109 @@ namespace OpenSim
|
||||||
|
|
||||||
public ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateTerseBlock(AvatarData avatar)
|
public ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateTerseBlock(AvatarData avatar)
|
||||||
{
|
{
|
||||||
return(null);
|
byte[] bytes = new byte[60];
|
||||||
|
int i=0;
|
||||||
|
ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock();
|
||||||
|
|
||||||
|
dat.TextureEntry = _avatarTemplate.TextureEntry;
|
||||||
|
libsecondlife.LLVector3 pos2 = new LLVector3(avatar.Position.X, avatar.Position.Y, avatar.Position.Z);
|
||||||
|
|
||||||
|
uint ID = avatar.LocalID;
|
||||||
|
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;
|
||||||
|
bytes[i++] = (byte)(avatar.InternVelocityX % 256);
|
||||||
|
bytes[i++] = (byte)((avatar.InternVelocityX >> 8) % 256);
|
||||||
|
|
||||||
|
bytes[i++] = (byte)(avatar.InternVelocityY % 256);
|
||||||
|
bytes[i++] = (byte)((avatar.InternVelocityY>> 8) % 256);
|
||||||
|
|
||||||
|
bytes[i++] = (byte)(avatar.InternVelocityZ % 256);
|
||||||
|
bytes[i++] = (byte)((avatar.InternVelocityZ >> 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;
|
||||||
|
return(dat);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendAvatarAppearanceToAllExcept(AvatarData avatar)
|
public void SendAvatarAppearanceToAllExcept(AvatarData avatar)
|
||||||
{
|
{
|
||||||
|
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)avatar.VisParams.Params[i];
|
||||||
|
avp.VisualParam[i] = avblock;
|
||||||
|
}
|
||||||
|
|
||||||
|
avp.Sender.IsTrial = false;
|
||||||
|
avp.Sender.ID = avatar.NetInfo.User.AgentID;
|
||||||
|
|
||||||
|
SendInfo send = new SendInfo();
|
||||||
|
send.Incr = true;
|
||||||
|
send.NetInfo = avatar.NetInfo;
|
||||||
|
send.Packet = avp;
|
||||||
|
send.SentTo = 2; //to all clients except avatar
|
||||||
|
this._updateSender.SendList.Enqueue(send);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -365,6 +560,9 @@ namespace OpenSim
|
||||||
public LLVector3 Position;
|
public LLVector3 Position;
|
||||||
public LLVector3 Velocity = new LLVector3(0,0,0);
|
public LLVector3 Velocity = new LLVector3(0,0,0);
|
||||||
public byte UpdateFlag;
|
public byte UpdateFlag;
|
||||||
|
public ushort InternVelocityX = 32768;
|
||||||
|
public ushort InternVelocityY = 32768;
|
||||||
|
public ushort InternVelocityZ = 32768;
|
||||||
|
|
||||||
public List<Node> ChildNodes
|
public List<Node> ChildNodes
|
||||||
{
|
{
|
||||||
|
@ -529,6 +727,9 @@ namespace OpenSim
|
||||||
public Node SObject;
|
public Node SObject;
|
||||||
public LLVector3 Position;
|
public LLVector3 Position;
|
||||||
public LLVector3 Velocity;
|
public LLVector3 Velocity;
|
||||||
|
public ushort InternVelocityX;
|
||||||
|
public ushort InternVelocityY;
|
||||||
|
public ushort InternVelocityZ;
|
||||||
public LLQuaternion Rotation;
|
public LLQuaternion Rotation;
|
||||||
|
|
||||||
public UpdateCommand()
|
public UpdateCommand()
|
||||||
|
|
|
@ -209,6 +209,7 @@ namespace OpenSim
|
||||||
/// <param name="incrementSequence">Increment sequence number?</param>
|
/// <param name="incrementSequence">Increment sequence number?</param>
|
||||||
public void SendPacket(Packet packet, bool incrementSequence, NetworkInfo User_info)
|
public void SendPacket(Packet packet, bool incrementSequence, NetworkInfo User_info)
|
||||||
{
|
{
|
||||||
|
|
||||||
lock(this._sendPacketSync)
|
lock(this._sendPacketSync)
|
||||||
{
|
{
|
||||||
byte[] buffer;
|
byte[] buffer;
|
||||||
|
@ -459,7 +460,6 @@ namespace OpenSim
|
||||||
{
|
{
|
||||||
temp_agent=(NetworkInfo)this.User_agents[ii];
|
temp_agent=(NetworkInfo)this.User_agents[ii];
|
||||||
IPEndPoint ag_ip=(IPEndPoint)temp_agent.endpoint;
|
IPEndPoint ag_ip=(IPEndPoint)temp_agent.endpoint;
|
||||||
//this.callback_object.error("searching: address is "+ag_ip.Address +"port number is: "+ag_ip.Port.ToString());
|
|
||||||
|
|
||||||
if((ag_ip.Address.ToString()==send_ip.Address.ToString()) && (ag_ip.Port.ToString()==send_ip.Port.ToString()))
|
if((ag_ip.Address.ToString()==send_ip.Address.ToString()) && (ag_ip.Port.ToString()==send_ip.Port.ToString()))
|
||||||
{
|
{
|
||||||
|
@ -486,14 +486,12 @@ namespace OpenSim
|
||||||
{
|
{
|
||||||
|
|
||||||
//error finding agent
|
//error finding agent
|
||||||
//this.CallbackObject.ErrorCallback("no user found");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fail-safe check
|
// Fail-safe check
|
||||||
if (packet == null)
|
if (packet == null)
|
||||||
{
|
{
|
||||||
//this.CallbackObject.ErrorCallback("couldn't build packet");
|
|
||||||
// Client.Log("Couldn't build a message from the incoming data", Helpers.LogLevel.Warning);
|
// Client.Log("Couldn't build a message from the incoming data", Helpers.LogLevel.Warning);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -525,7 +523,6 @@ namespace OpenSim
|
||||||
}
|
}
|
||||||
|
|
||||||
// Avoid firing a callback twice for the same packet
|
// Avoid firing a callback twice for the same packet
|
||||||
// this.callback_object.error("avoiding callback");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
Loading…
Reference in New Issue