Merged makomk's patch as per bug #61

Rescued my brain ready to implement animations and proper velocity encoding
adam
gareth 2007-03-04 00:44:26 +00:00
parent b29618fc3c
commit 572ab93936
6 changed files with 147 additions and 13 deletions

View File

@ -46,7 +46,7 @@ namespace OpenSim
/// </summary>
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);
}
}

View File

@ -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<uint> 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();

View File

@ -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();
@ -93,6 +115,68 @@ namespace OpenSim.world
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();
aw.AgentData.AgentID = this.ControllingClient.AgentID;
@ -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;
}
}
}
}

View File

@ -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<Entity> 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<Entity>();
@ -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;

View File

@ -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());
}
}
}
}
}

View File

@ -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);
}
}
}
}