diff --git a/src/Main.cs b/src/Main.cs index 146d837b7c..fe2183b58c 100644 --- a/src/Main.cs +++ b/src/Main.cs @@ -46,7 +46,7 @@ namespace OpenSim /// public class OpenSim_Main { - private static OpenSim_Main sim; + public static OpenSim_Main sim; public static SimConfig cfg; public static World local_world; private static Thread MainListener; @@ -68,6 +68,7 @@ namespace OpenSim sim.Startup(); while(true) { local_world.DoStuff(); + Thread.Sleep(100); } } diff --git a/src/OpenSimClient.cs b/src/OpenSimClient.cs index 47f6dbfda3..696031d3e3 100644 --- a/src/OpenSimClient.cs +++ b/src/OpenSimClient.cs @@ -60,6 +60,7 @@ namespace OpenSim private const int MAX_APPENDED_ACKS = 10; private const int RESEND_TIMEOUT = 4000; private const int MAX_SEQUENCE = 0xFFFFFF; + private Queue Inbox; public void ack_pack(Packet Pack) { //libsecondlife.Packets.PacketAckPacket ack_it = new PacketAckPacket(); @@ -152,16 +153,22 @@ namespace OpenSim break; case PacketType.LogoutRequest: Console.WriteLine("OpenSimClient.cs:ProcessInPacket() - Got a logout request"); - OpenSim_Main.local_world.Entities.Remove(this.AgentID); + lock(OpenSim_Main.local_world.Entities) { + OpenSim_Main.local_world.Entities.Remove(this.AgentID); + } WebRequest DeleteSession = WebRequest.Create(OpenSim_Main.cfg.GridURL + "/usersessions/" + OpenSim_Main.cfg.GridSendKey + "/" + this.AgentID.ToString() + this.CircuitCode.ToString() + "/delete"); WebResponse GridResponse = DeleteSession.GetResponse(); StreamReader sr = new StreamReader(GridResponse.GetResponseStream()); String grTest = sr.ReadLine(); sr.Close(); GridResponse.Close(); + Console.WriteLine("DEBUG: " + grTest); this.ClientThread.Abort(); break; + case PacketType.AgentUpdate: + ClientAvatar.HandleAgentUpdate((AgentUpdatePacket)Pack); + break; } } @@ -315,6 +322,7 @@ namespace OpenSim { foreach (uint ack in NewPack.Header.AckList) { + Console.WriteLine("Got appended ack: "+ack); NeedAck.Remove(ack); } } @@ -329,6 +337,7 @@ namespace OpenSim { foreach (PacketAckPacket.PacketsBlock block in ackPacket.Packets) { + Console.WriteLine("Got PacketAck: "+block.ID); NeedAck.Remove(block.ID); } } @@ -398,6 +407,7 @@ namespace OpenSim private void AuthUser() { Console.WriteLine("OpenSimClient.cs:AuthUser() - Authenticating new user request with grid"); WebRequest CheckSession = WebRequest.Create(OpenSim_Main.cfg.GridURL + "/usersessions/" + OpenSim_Main.cfg.GridSendKey + "/" + cirpack.CircuitCode.ID.ToString() + "/" + cirpack.CircuitCode.Code.ToString() + "/exists"); + Console.WriteLine(OpenSim_Main.cfg.GridURL); WebResponse GridResponse = CheckSession.GetResponse(); StreamReader sr = new StreamReader(GridResponse.GetResponseStream()); String grTest = sr.ReadLine(); diff --git a/src/world/Avatar.cs b/src/world/Avatar.cs index f3905cd357..68606c4ca4 100644 --- a/src/world/Avatar.cs +++ b/src/world/Avatar.cs @@ -4,6 +4,7 @@ using System.IO; using System.Text; using libsecondlife; using libsecondlife.Packets; +using Axiom.MathLib; namespace OpenSim.world { @@ -12,16 +13,37 @@ namespace OpenSim.world public string firstname; public string lastname; public OpenSimClient ControllingClient; + public uint CurrentKeyMask; + private libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock AvatarTemplate; public Avatar(OpenSimClient TheClient) { Console.WriteLine("Avatar.cs - Loading details from grid (DUMMY)"); ControllingClient=TheClient; SetupTemplate("avatar-template.dat"); + + position = new LLVector3(100.0f,100.0f,60.0f); } - public void update() { - base.update(); + public override void update() { + lock(this) { + base.update(); + + Console.WriteLine("KeyMask: " + this.CurrentKeyMask); + + if((this.CurrentKeyMask & (uint)MainAvatar.AgentUpdateFlags.AGENT_CONTROL_AT_POS) != 0) { + Vector3 tmpVelocity = this.rotation * new Vector3(1.0f,0.0f,0.0f); + tmpVelocity.Normalize(); tmpVelocity = tmpVelocity * 0.3f; + this.velocity.X = tmpVelocity.x; + this.velocity.Y = tmpVelocity.y; + this.velocity.Z = tmpVelocity.z; + Console.WriteLine("Walking at "+ this.velocity.ToString()); + } else { + this.velocity.X=0; + this.velocity.Y=0; + this.velocity.Z=0; + } + } } private void SetupTemplate(string name) @@ -41,7 +63,7 @@ namespace OpenSim.world System.Text.Encoding enc = System.Text.Encoding.ASCII; libsecondlife.LLVector3 pos = new LLVector3(objdata.ObjectData, 16); pos.X = 100f; - objdata.ID = 8880000; + objdata.ID = this.localid; objdata.NameValue = enc.GetBytes("FirstName STRING RW SV Test \nLastName STRING RW SV User \0"); libsecondlife.LLVector3 pos2 = new LLVector3(100f,100f,23f); //objdata.FullID=user.AgentID; @@ -60,7 +82,7 @@ namespace OpenSim.world mov.Data.RegionHandle = OpenSim_Main.cfg.RegionHandle; // TODO - dynamicalise this stuff mov.Data.Timestamp = 1172750370; - mov.Data.Position = new LLVector3(100f, 100f, 23f); + mov.Data.Position = new LLVector3((float)this.position.X, (float)this.position.Y, (float)this.position.Z); mov.Data.LookAt = new LLVector3(0.99f, 0.042f, 0); Console.WriteLine("Sending AgentMovementComplete packet"); @@ -79,12 +101,12 @@ namespace OpenSim.world objupdate.ObjectData[0] = AvatarTemplate; //give this avatar object a local id and assign the user a name - objupdate.ObjectData[0].ID = 8880000 + OpenSim_Main.local_world._localNumber; + objupdate.ObjectData[0].ID = this.localid; //User_info.name="Test"+this.local_numer+" User"; objupdate.ObjectData[0].FullID = ControllingClient.AgentID; objupdate.ObjectData[0].NameValue = _enc.GetBytes("FirstName STRING RW SV " + firstname + "\nLastName STRING RW SV " + lastname + " \0"); - libsecondlife.LLVector3 pos2 = new LLVector3(100f, 100.0f, 23.0f); + libsecondlife.LLVector3 pos2 = new LLVector3((float)this.position.X, (float)this.position.Y, (float)this.position.Z); byte[] pb = pos2.GetBytes(); @@ -92,6 +114,68 @@ namespace OpenSim.world OpenSim_Main.local_world._localNumber++; this.ControllingClient.OutPacket(objupdate); } + + public override ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateTerseBlock() { + byte[] bytes = new byte[60]; + int i=0; + ImprovedTerseObjectUpdatePacket.ObjectDataBlock dat = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock(); + + dat.TextureEntry = AvatarTemplate.TextureEntry; + libsecondlife.LLVector3 pos2 = new LLVector3(this.position.X, this.position.Y, this.position.Z); + + uint ID = this.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)(ac % 256); // avatar.InternVelocityX + bytes[i++] = (byte)((ac>> 8) % 256); + bytes[i++] = (byte)(ac % 256); // avatar.InternVelocityY + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); // avatar.InternVelocityZ + bytes[i++] = (byte)((ac >> 8) % 256); + + //accel + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + + //rot + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + + //rotation vel + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + bytes[i++] = (byte)(ac % 256); + bytes[i++] = (byte)((ac >> 8) % 256); + + dat.Data=bytes; + return(dat); + + } public void SendInitialAppearance() { AgentWearablesUpdatePacket aw = new AgentWearablesUpdatePacket(); @@ -151,5 +235,16 @@ namespace OpenSim.world Console.WriteLine("Avatar.cs:SendRegionHandshake() - Sending RegionHandshake packet"); this.ControllingClient.OutPacket(handshake); } + + public void HandleAgentUpdate(AgentUpdatePacket update) { + lock(this) { + // FIXME: shouldn't update these direction + this.rotation = new Quaternion(update.AgentData.BodyRotation.W, update.AgentData.BodyRotation.X, update.AgentData.BodyRotation.Y, update.AgentData.BodyRotation.Z); + + this.CurrentKeyMask = update.AgentData.ControlFlags; + this.needupdate = true; + } + } + } } diff --git a/src/world/Entity.cs b/src/world/Entity.cs index 92ab2daeb5..7880a4675b 100644 --- a/src/world/Entity.cs +++ b/src/world/Entity.cs @@ -2,15 +2,18 @@ using System; using System.Collections.Generic; using System.Text; using Axiom.MathLib; +using libsecondlife; using OpenSim.types; +using libsecondlife.Packets; namespace OpenSim.world { public class Entity { protected libsecondlife.LLUUID uuid; - protected Vector3 position; - protected Vector3 velocity; + protected uint localid; + public LLVector3 position; + public LLVector3 velocity; protected Quaternion rotation; protected string name; protected List children; @@ -19,8 +22,9 @@ namespace OpenSim.world public Entity() { uuid = new libsecondlife.LLUUID(); - position = new Vector3(); - velocity = new Vector3(); + localid = 8880000 + (OpenSim_Main.local_world._localNumber++); // FIXME - race condition! + position = new LLVector3(); + velocity = new LLVector3(); rotation = new Quaternion(); name = "(basic entity)"; children = new List(); @@ -33,8 +37,14 @@ namespace OpenSim.world if(child.needupdate) child.update(); } + this.needupdate=false; } + public virtual ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateTerseBlock() { + return null; + } + + public virtual string getName() { return name; diff --git a/src/world/PhysicsEngine.cs b/src/world/PhysicsEngine.cs index 7585135109..a789828afd 100644 --- a/src/world/PhysicsEngine.cs +++ b/src/world/PhysicsEngine.cs @@ -18,6 +18,14 @@ namespace OpenSim.world } public void DoStuff(World simworld) { + foreach (libsecondlife.LLUUID UUID in simworld.Entities.Keys) + { + if( true /* simworld.Entities[UUID].needupdate */) { // FIXME! + simworld.Entities[UUID].position += simworld.Entities[UUID].velocity; + Console.WriteLine("Moving "+UUID.ToString()+ " to "+ simworld.Entities[UUID].position.ToString()); + } + + } } } } diff --git a/src/world/World.cs b/src/world/World.cs index 1fabca49f0..b261884c21 100644 --- a/src/world/World.cs +++ b/src/world/World.cs @@ -51,7 +51,17 @@ namespace OpenSim.world if(Entities[UUID].needupdate) { Entities[UUID].update(); } - + if(Entities[UUID] is Avatar) { // FIXME: only send updates when avatar moves. + ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = Entities[UUID].CreateTerseBlock(); + foreach(OpenSimClient client in OpenSim_Main.sim.ClientThreads.Values) { + ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket(); + terse.RegionData.RegionHandle = OpenSim_Main.cfg.RegionHandle; // FIXME + terse.RegionData.TimeDilation = 0; + terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; + terse.ObjectData[0] = terseBlock; + client.OutPacket(terse); + } + } } }