2007-03-22 10:11:15 +00:00
using System ;
using System.Collections.Generic ;
using System.IO ;
using System.Text ;
using libsecondlife ;
using libsecondlife.Packets ;
using OpenSim.Physics.Manager ;
2007-03-26 19:05:50 +00:00
using OpenSim.Framework.Inventory ;
2007-03-22 10:11:15 +00:00
using Axiom.MathLib ;
namespace OpenSim.world
{
2007-04-04 16:31:35 +00:00
public partial class Avatar : Entity
2007-03-22 10:11:15 +00:00
{
public static bool PhysicsEngineFlying = false ;
2007-03-23 16:05:32 +00:00
public static AvatarAnimations Animations ;
public string firstname ;
2007-03-22 10:11:15 +00:00
public string lastname ;
public SimClient ControllingClient ;
2007-03-23 14:24:21 +00:00
public LLUUID current_anim ;
2007-03-23 16:05:32 +00:00
public int anim_seq ;
2007-03-22 10:11:15 +00:00
private static libsecondlife . Packets . ObjectUpdatePacket . ObjectDataBlock AvatarTemplate ;
private bool updateflag = false ;
private byte movementflag = 0 ;
private List < NewForce > forcesList = new List < NewForce > ( ) ;
private short _updateCount = 0 ;
private Axiom . MathLib . Quaternion bodyRot ;
2007-03-26 19:05:50 +00:00
private LLObject . TextureEntry avatarAppearanceTexture = null ;
private byte [ ] visualParams ;
private AvatarWearable [ ] Wearables ;
2007-03-23 16:05:32 +00:00
private LLVector3 positionLastFrame = new LLVector3 ( 0 , 0 , 0 ) ;
2007-03-27 21:42:14 +00:00
private ulong m_regionHandle ;
private Dictionary < uint , SimClient > m_clientThreads ;
private string m_regionName ;
2007-04-25 18:12:06 +00:00
private ushort m_regionWaterHeight ;
private bool m_regionTerraform ;
2007-04-11 20:07:58 +00:00
//private bool childShadowAvatar = false;
2007-03-22 10:11:15 +00:00
2007-04-25 18:12:06 +00:00
public Avatar ( SimClient TheClient , World world , string regionName , Dictionary < uint , SimClient > clientThreads , ulong regionHandle , bool regionTerraform , ushort regionWater )
2007-03-22 10:11:15 +00:00
{
2007-03-27 21:42:14 +00:00
m_world = world ;
m_clientThreads = clientThreads ;
m_regionName = regionName ;
m_regionHandle = regionHandle ;
2007-04-25 18:12:06 +00:00
m_regionTerraform = regionTerraform ;
m_regionWaterHeight = regionWater ;
2007-03-28 13:08:27 +00:00
2007-03-22 10:11:15 +00:00
OpenSim . Framework . Console . MainConsole . Instance . WriteLine ( "Avatar.cs - Loading details from grid (DUMMY)" ) ;
ControllingClient = TheClient ;
2007-03-28 13:08:27 +00:00
localid = 8880000 + ( this . m_world . _localNumber + + ) ;
2007-04-17 12:03:52 +00:00
Pos = ControllingClient . startpos ;
2007-03-26 19:05:50 +00:00
visualParams = new byte [ 218 ] ;
for ( int i = 0 ; i < 218 ; i + + )
{
visualParams [ i ] = 100 ;
}
Wearables = new AvatarWearable [ 13 ] ; //should be 13 of these
for ( int i = 0 ; i < 13 ; i + + )
{
Wearables [ i ] = new AvatarWearable ( ) ;
}
this . Wearables [ 0 ] . AssetID = new LLUUID ( "66c41e39-38f9-f75a-024e-585989bfab73" ) ;
this . Wearables [ 0 ] . ItemID = LLUUID . Random ( ) ;
this . avatarAppearanceTexture = new LLObject . TextureEntry ( new LLUUID ( "00000000-0000-0000-5005-000000000005" ) ) ;
2007-04-17 12:03:52 +00:00
2007-03-23 16:05:32 +00:00
}
2007-03-22 10:11:15 +00:00
public PhysicsActor PhysActor
{
set
{
this . _physActor = value ;
}
}
public override void addForces ( )
{
lock ( this . forcesList )
{
if ( this . forcesList . Count > 0 )
{
for ( int i = 0 ; i < this . forcesList . Count ; i + + )
{
NewForce force = this . forcesList [ i ] ;
PhysicsVector phyVector = new PhysicsVector ( force . X , force . Y , force . Z ) ;
2007-03-28 13:08:27 +00:00
lock ( m_world . LockPhysicsEngine )
{
this . _physActor . Velocity = phyVector ;
}
2007-03-22 10:11:15 +00:00
this . updateflag = true ;
this . velocity = new LLVector3 ( force . X , force . Y , force . Z ) ; //shouldn't really be doing this
// but as we are setting the velocity (rather than using real forces) at the moment it is okay.
}
for ( int i = 0 ; i < this . forcesList . Count ; i + + )
{
this . forcesList . RemoveAt ( 0 ) ;
}
}
}
}
public static void SetupTemplate ( string name )
{
FileInfo fInfo = new FileInfo ( name ) ;
long numBytes = fInfo . Length ;
FileStream fStream = new FileStream ( name , FileMode . Open , FileAccess . Read ) ;
BinaryReader br = new BinaryReader ( fStream ) ;
byte [ ] data1 = br . ReadBytes ( ( int ) numBytes ) ;
br . Close ( ) ;
fStream . Close ( ) ;
2007-04-30 15:38:51 +00:00
2007-04-26 12:56:14 +00:00
libsecondlife . Packets . ObjectUpdatePacket . ObjectDataBlock objdata = new ObjectUpdatePacket . ObjectDataBlock ( ) ; // new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock(data1, ref i);
2007-03-22 10:11:15 +00:00
2007-04-26 12:56:14 +00:00
SetDefaultPacketValues ( objdata ) ;
2007-04-30 15:38:51 +00:00
objdata . TextureEntry = data1 ;
2007-04-26 12:56:14 +00:00
objdata . UpdateFlags = 61 + ( 9 < < 8 ) + ( 130 < < 16 ) + ( 16 < < 24 ) ;
objdata . PathCurve = 16 ;
objdata . ProfileCurve = 1 ;
objdata . PathScaleX = 100 ;
objdata . PathScaleY = 100 ;
objdata . ParentID = 0 ;
objdata . OwnerID = LLUUID . Zero ;
objdata . Scale = new LLVector3 ( 1 , 1 , 1 ) ;
objdata . PCode = 47 ;
2007-03-22 10:11:15 +00:00
System . Text . Encoding enc = System . Text . Encoding . ASCII ;
libsecondlife . LLVector3 pos = new LLVector3 ( objdata . ObjectData , 16 ) ;
pos . X = 100f ;
objdata . ID = 8880000 ;
objdata . NameValue = enc . GetBytes ( "FirstName STRING RW SV Test \nLastName STRING RW SV User \0" ) ;
libsecondlife . LLVector3 pos2 = new LLVector3 ( 100f , 100f , 23f ) ;
//objdata.FullID=user.AgentID;
byte [ ] pb = pos . GetBytes ( ) ;
Array . Copy ( pb , 0 , objdata . ObjectData , 16 , pb . Length ) ;
Avatar . AvatarTemplate = objdata ;
}
2007-04-26 12:56:14 +00:00
protected static void SetDefaultPacketValues ( ObjectUpdatePacket . ObjectDataBlock objdata )
{
objdata . PSBlock = new byte [ 0 ] ;
objdata . ExtraParams = new byte [ 1 ] ;
objdata . MediaURL = new byte [ 0 ] ;
objdata . NameValue = new byte [ 0 ] ;
objdata . Text = new byte [ 0 ] ;
objdata . TextColor = new byte [ 4 ] ;
objdata . JointAxisOrAnchor = new LLVector3 ( 0 , 0 , 0 ) ;
objdata . JointPivot = new LLVector3 ( 0 , 0 , 0 ) ;
objdata . Material = 4 ;
objdata . TextureAnim = new byte [ 0 ] ;
objdata . Sound = LLUUID . Zero ;
LLObject . TextureEntry ntex = new LLObject . TextureEntry ( new LLUUID ( "00000000-0000-0000-5005-000000000005" ) ) ;
objdata . TextureEntry = ntex . ToBytes ( ) ;
objdata . State = 0 ;
objdata . Data = new byte [ 0 ] ;
2007-04-26 17:29:41 +00:00
objdata . ObjectData = new byte [ 76 ] ;
objdata . ObjectData [ 15 ] = 128 ;
objdata . ObjectData [ 16 ] = 63 ;
objdata . ObjectData [ 56 ] = 128 ;
objdata . ObjectData [ 61 ] = 102 ;
objdata . ObjectData [ 62 ] = 40 ;
objdata . ObjectData [ 63 ] = 61 ;
objdata . ObjectData [ 64 ] = 189 ;
2007-04-26 12:56:14 +00:00
}
2007-03-22 10:11:15 +00:00
public void CompleteMovement ( World RegionInfo )
{
OpenSim . Framework . Console . MainConsole . Instance . WriteLine ( "Avatar.cs:CompleteMovement() - Constructing AgentMovementComplete packet" ) ;
AgentMovementCompletePacket mov = new AgentMovementCompletePacket ( ) ;
mov . AgentData . SessionID = this . ControllingClient . SessionID ;
mov . AgentData . AgentID = this . ControllingClient . AgentID ;
2007-03-28 13:08:27 +00:00
mov . Data . RegionHandle = this . m_regionHandle ;
2007-03-22 10:11:15 +00:00
// TODO - dynamicalise this stuff
mov . Data . Timestamp = 1172750370 ;
2007-04-17 01:38:20 +00:00
mov . Data . Position = this . ControllingClient . startpos ;
2007-03-22 10:11:15 +00:00
mov . Data . LookAt = new LLVector3 ( 0.99f , 0.042f , 0 ) ;
ControllingClient . OutPacket ( mov ) ;
}
public void HandleUpdate ( AgentUpdatePacket pack )
{
2007-04-25 18:12:06 +00:00
if ( ( ( uint ) pack . AgentData . ControlFlags & ( uint ) MainAvatar . ControlFlags . AGENT_CONTROL_FLY ) ! = 0 )
2007-03-22 10:11:15 +00:00
{
2007-03-23 18:54:42 +00:00
if ( this . _physActor . Flying = = false )
{
this . current_anim = Animations . AnimsLLUUID [ "ANIM_AGENT_FLY" ] ;
this . anim_seq = 1 ;
this . SendAnimPack ( ) ;
}
2007-03-22 10:11:15 +00:00
this . _physActor . Flying = true ;
2007-04-04 16:31:35 +00:00
2007-03-22 10:11:15 +00:00
}
else
{
2007-03-23 18:54:42 +00:00
if ( this . _physActor . Flying = = true )
{
this . current_anim = Animations . AnimsLLUUID [ "ANIM_AGENT_STAND" ] ;
this . anim_seq = 1 ;
this . SendAnimPack ( ) ;
}
2007-03-22 10:11:15 +00:00
this . _physActor . Flying = false ;
}
2007-04-25 18:12:06 +00:00
if ( ( ( uint ) pack . AgentData . ControlFlags & ( uint ) MainAvatar . ControlFlags . AGENT_CONTROL_AT_POS ) ! = 0 )
2007-03-22 10:11:15 +00:00
{
Axiom . MathLib . Quaternion q = new Axiom . MathLib . Quaternion ( pack . AgentData . BodyRotation . W , pack . AgentData . BodyRotation . X , pack . AgentData . BodyRotation . Y , pack . AgentData . BodyRotation . Z ) ;
if ( ( ( movementflag & 1 ) = = 0 ) | | ( q ! = this . bodyRot ) )
{
2007-03-23 16:05:32 +00:00
2007-03-23 18:54:42 +00:00
if ( ( ( movementflag & 1 ) = = 0 ) & & ( ! this . _physActor . Flying ) )
2007-03-23 14:24:21 +00:00
{
2007-03-23 16:05:32 +00:00
this . current_anim = Animations . AnimsLLUUID [ "ANIM_AGENT_WALK" ] ;
this . anim_seq = 1 ;
this . SendAnimPack ( ) ;
}
2007-03-23 14:24:21 +00:00
2007-03-23 16:05:32 +00:00
//we should add a new force to the list
2007-03-22 10:11:15 +00:00
// but for now we will deal with velocities
NewForce newVelocity = new NewForce ( ) ;
Axiom . MathLib . Vector3 v3 = new Axiom . MathLib . Vector3 ( 1 , 0 , 0 ) ;
Axiom . MathLib . Vector3 direc = q * v3 ;
direc . Normalize ( ) ;
//work out velocity for sim physics system
direc = direc * ( ( 0.03f ) * 128f ) ;
if ( this . _physActor . Flying )
direc * = 2 ;
newVelocity . X = direc . x ;
newVelocity . Y = direc . y ;
newVelocity . Z = direc . z ;
this . forcesList . Add ( newVelocity ) ;
movementflag = 1 ;
this . bodyRot = q ;
}
}
2007-04-25 18:12:06 +00:00
else if ( ( ( ( uint ) pack . AgentData . ControlFlags & ( uint ) MainAvatar . ControlFlags . AGENT_CONTROL_UP_POS ) ! = 0 ) & & ( PhysicsEngineFlying ) )
2007-03-22 10:11:15 +00:00
{
if ( ( ( movementflag & 2 ) = = 0 ) & & this . _physActor . Flying )
{
//we should add a new force to the list
// but for now we will deal with velocities
NewForce newVelocity = new NewForce ( ) ;
Axiom . MathLib . Vector3 v3 = new Axiom . MathLib . Vector3 ( 0 , 0 , 1 ) ;
Axiom . MathLib . Vector3 direc = v3 ;
direc . Normalize ( ) ;
//work out velocity for sim physics system
direc = direc * ( ( 0.03f ) * 128f * 2 ) ;
newVelocity . X = direc . x ;
newVelocity . Y = direc . y ;
newVelocity . Z = direc . z ;
this . forcesList . Add ( newVelocity ) ;
movementflag = 2 ;
}
}
2007-04-25 18:12:06 +00:00
else if ( ( ( ( uint ) pack . AgentData . ControlFlags & ( uint ) MainAvatar . ControlFlags . AGENT_CONTROL_UP_NEG ) ! = 0 ) & & ( PhysicsEngineFlying ) )
2007-03-22 10:11:15 +00:00
{
if ( ( ( movementflag & 4 ) = = 0 ) & & this . _physActor . Flying )
{
//we should add a new force to the list
// but for now we will deal with velocities
NewForce newVelocity = new NewForce ( ) ;
Axiom . MathLib . Vector3 v3 = new Axiom . MathLib . Vector3 ( 0 , 0 , - 1 ) ;
//Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion(pack.AgentData.BodyRotation.W, pack.AgentData.BodyRotation.X, pack.AgentData.BodyRotation.Y, pack.AgentData.BodyRotation.Z);
Axiom . MathLib . Vector3 direc = v3 ;
direc . Normalize ( ) ;
//work out velocity for sim physics system
direc = direc * ( ( 0.03f ) * 128f * 2 ) ;
newVelocity . X = direc . x ;
newVelocity . Y = direc . y ;
newVelocity . Z = direc . z ;
this . forcesList . Add ( newVelocity ) ;
movementflag = 4 ;
}
}
2007-04-25 18:12:06 +00:00
else if ( ( ( uint ) pack . AgentData . ControlFlags & ( uint ) MainAvatar . ControlFlags . AGENT_CONTROL_AT_NEG ) ! = 0 )
2007-03-22 10:11:15 +00:00
{
Axiom . MathLib . Quaternion q = new Axiom . MathLib . Quaternion ( pack . AgentData . BodyRotation . W , pack . AgentData . BodyRotation . X , pack . AgentData . BodyRotation . Y , pack . AgentData . BodyRotation . Z ) ;
if ( ( ( movementflag & 8 ) = = 0 ) | | ( q ! = this . bodyRot ) )
{
//we should add a new force to the list
// but for now we will deal with velocities
NewForce newVelocity = new NewForce ( ) ;
Axiom . MathLib . Vector3 v3 = new Axiom . MathLib . Vector3 ( - 1 , 0 , 0 ) ;
Axiom . MathLib . Vector3 direc = q * v3 ;
direc . Normalize ( ) ;
//work out velocity for sim physics system
direc = direc * ( ( 0.03f ) * 128f ) ;
if ( this . _physActor . Flying )
direc * = 2 ;
newVelocity . X = direc . x ;
newVelocity . Y = direc . y ;
newVelocity . Z = direc . z ;
this . forcesList . Add ( newVelocity ) ;
movementflag = 8 ;
this . bodyRot = q ;
}
}
else
{
2007-03-23 16:05:32 +00:00
if ( movementflag = = 16 )
{
movementflag = 0 ;
}
2007-03-22 10:11:15 +00:00
if ( ( movementflag ) ! = 0 )
{
NewForce newVelocity = new NewForce ( ) ;
newVelocity . X = 0 ;
newVelocity . Y = 0 ;
newVelocity . Z = 0 ;
this . forcesList . Add ( newVelocity ) ;
movementflag = 0 ;
2007-03-23 14:24:21 +00:00
// We're standing still, so make it show!
2007-03-23 18:54:42 +00:00
if ( this . _physActor . Flying = = false )
{
this . current_anim = Animations . AnimsLLUUID [ "ANIM_AGENT_STAND" ] ;
this . anim_seq = 1 ;
this . SendAnimPack ( ) ;
}
2007-03-23 16:05:32 +00:00
this . movementflag = 16 ;
2007-03-23 18:54:42 +00:00
2007-03-23 16:05:32 +00:00
}
2007-03-22 10:11:15 +00:00
}
}
2007-04-25 18:12:06 +00:00
//really really should be moved somewhere else (RegionInfo.cs ?)
2007-03-22 10:11:15 +00:00
public void SendRegionHandshake ( World RegionInfo )
{
OpenSim . Framework . Console . MainConsole . Instance . WriteLine ( "Avatar.cs:SendRegionHandshake() - Creating empty RegionHandshake packet" ) ;
System . Text . Encoding _enc = System . Text . Encoding . ASCII ;
RegionHandshakePacket handshake = new RegionHandshakePacket ( ) ;
OpenSim . Framework . Console . MainConsole . Instance . WriteLine ( "Avatar.cs:SendRegionhandshake() - Filling in RegionHandshake details" ) ;
handshake . RegionInfo . BillableFactor = 0 ;
handshake . RegionInfo . IsEstateManager = false ;
handshake . RegionInfo . TerrainHeightRange00 = 60 ;
handshake . RegionInfo . TerrainHeightRange01 = 60 ;
handshake . RegionInfo . TerrainHeightRange10 = 60 ;
handshake . RegionInfo . TerrainHeightRange11 = 60 ;
handshake . RegionInfo . TerrainStartHeight00 = 10 ;
handshake . RegionInfo . TerrainStartHeight01 = 10 ;
handshake . RegionInfo . TerrainStartHeight10 = 10 ;
handshake . RegionInfo . TerrainStartHeight11 = 10 ;
handshake . RegionInfo . SimAccess = 13 ;
2007-04-25 18:12:06 +00:00
handshake . RegionInfo . WaterHeight = m_regionWaterHeight ;
uint regionFlags = 72458694 ;
if ( this . m_regionTerraform )
{
regionFlags - = 64 ;
}
handshake . RegionInfo . RegionFlags = regionFlags ;
2007-03-27 21:42:14 +00:00
handshake . RegionInfo . SimName = _enc . GetBytes ( m_regionName + "\0" ) ;
2007-03-22 10:11:15 +00:00
handshake . RegionInfo . SimOwner = new LLUUID ( "00000000-0000-0000-0000-000000000000" ) ;
handshake . RegionInfo . TerrainBase0 = new LLUUID ( "b8d3965a-ad78-bf43-699b-bff8eca6c975" ) ;
handshake . RegionInfo . TerrainBase1 = new LLUUID ( "abb783e6-3e93-26c0-248a-247666855da3" ) ;
handshake . RegionInfo . TerrainBase2 = new LLUUID ( "179cdabd-398a-9b6b-1391-4dc333ba321f" ) ;
handshake . RegionInfo . TerrainBase3 = new LLUUID ( "beb169c7-11ea-fff2-efe5-0f24dc881df2" ) ;
handshake . RegionInfo . TerrainDetail0 = new LLUUID ( "00000000-0000-0000-0000-000000000000" ) ;
handshake . RegionInfo . TerrainDetail1 = new LLUUID ( "00000000-0000-0000-0000-000000000000" ) ;
handshake . RegionInfo . TerrainDetail2 = new LLUUID ( "00000000-0000-0000-0000-000000000000" ) ;
handshake . RegionInfo . TerrainDetail3 = new LLUUID ( "00000000-0000-0000-0000-000000000000" ) ;
handshake . RegionInfo . CacheID = new LLUUID ( "545ec0a5-5751-1026-8a0b-216e38a7ab37" ) ;
OpenSim . Framework . Console . MainConsole . Instance . WriteLine ( "Avatar.cs:SendRegionHandshake() - Sending RegionHandshake packet" ) ;
this . ControllingClient . OutPacket ( handshake ) ;
}
2007-03-23 16:05:32 +00:00
public static void LoadAnims ( )
{
Avatar . Animations = new AvatarAnimations ( ) ;
Avatar . Animations . LoadAnims ( ) ;
2007-03-23 13:04:06 +00:00
}
2007-03-28 13:08:27 +00:00
public override void LandRenegerated ( )
{
2007-04-11 05:19:27 +00:00
Pos = new LLVector3 ( 100.0f , 100.0f , m_world . Terrain [ ( int ) Pos . X , ( int ) Pos . Y ] + 50.0f ) ;
2007-03-28 13:08:27 +00:00
}
2007-03-22 10:11:15 +00:00
}
public class NewForce
{
public float X ;
public float Y ;
public float Z ;
public NewForce ( )
{
}
}
2007-03-23 13:04:06 +00:00
2007-03-22 10:11:15 +00:00
}