diff options
First part of border crossing fix.
Diffstat (limited to 'OpenSim/OpenSim.RegionServer/world/Avatar.Update.cs')
-rw-r--r-- | OpenSim/OpenSim.RegionServer/world/Avatar.Update.cs | 130 |
1 files changed, 67 insertions, 63 deletions
diff --git a/OpenSim/OpenSim.RegionServer/world/Avatar.Update.cs b/OpenSim/OpenSim.RegionServer/world/Avatar.Update.cs index e49fab3..ed1ffc0 100644 --- a/OpenSim/OpenSim.RegionServer/world/Avatar.Update.cs +++ b/OpenSim/OpenSim.RegionServer/world/Avatar.Update.cs | |||
@@ -10,89 +10,93 @@ namespace OpenSim.world | |||
10 | { | 10 | { |
11 | public override void update() | 11 | public override void update() |
12 | { | 12 | { |
13 | if (this._physActor == null) | 13 | if (!this.childAvatar) |
14 | { | 14 | { |
15 | //HACKHACK: Note to work out why this entity does not have a physics actor | 15 | if (this._physActor == null) |
16 | // and prehaps create one. | ||
17 | return; | ||
18 | } | ||
19 | libsecondlife.LLVector3 pos2 = new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z); | ||
20 | if (this.updateflag) | ||
21 | { | ||
22 | //need to send movement info | ||
23 | //so create the improvedterseobjectupdate packet | ||
24 | //use CreateTerseBlock() | ||
25 | ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateTerseBlock(); | ||
26 | ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket(); | ||
27 | terse.RegionData.RegionHandle = m_regionHandle; // FIXME | ||
28 | terse.RegionData.TimeDilation = 64096; | ||
29 | terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; | ||
30 | terse.ObjectData[0] = terseBlock; | ||
31 | List<Avatar> avList = this.m_world.RequestAvatarList(); | ||
32 | foreach (Avatar client in avList) | ||
33 | { | 16 | { |
34 | client.SendPacketToViewer(terse); | 17 | //HACKHACK: Note to work out why this entity does not have a physics actor |
18 | // and prehaps create one. | ||
19 | return; | ||
35 | } | 20 | } |
21 | libsecondlife.LLVector3 pos2 = new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z); | ||
22 | if (this.updateflag) | ||
23 | { | ||
24 | //need to send movement info | ||
25 | //so create the improvedterseobjectupdate packet | ||
26 | //use CreateTerseBlock() | ||
27 | ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateTerseBlock(); | ||
28 | ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket(); | ||
29 | terse.RegionData.RegionHandle = m_regionHandle; // FIXME | ||
30 | terse.RegionData.TimeDilation = 64096; | ||
31 | terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; | ||
32 | terse.ObjectData[0] = terseBlock; | ||
33 | List<Avatar> avList = this.m_world.RequestAvatarList(); | ||
34 | foreach (Avatar client in avList) | ||
35 | { | ||
36 | client.SendPacketToViewer(terse); | ||
37 | } | ||
36 | 38 | ||
37 | updateflag = false; | 39 | updateflag = false; |
38 | //this._updateCount = 0; | 40 | //this._updateCount = 0; |
39 | } | 41 | } |
40 | else | 42 | else |
41 | { | ||
42 | |||
43 | if ((pos2 != this.positionLastFrame) || (this.movementflag == 16)) | ||
44 | { | 43 | { |
45 | _updateCount++; | 44 | |
46 | if (((!PhysicsEngineFlying) && (_updateCount > 3)) || (PhysicsEngineFlying) && (_updateCount > 0)) | 45 | if ((pos2 != this.positionLastFrame) || (this.movementflag == 16)) |
47 | { | 46 | { |
48 | //It has been a while since last update was sent so lets send one. | 47 | _updateCount++; |
49 | ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateTerseBlock(); | 48 | if (((!PhysicsEngineFlying) && (_updateCount > 3)) || (PhysicsEngineFlying) && (_updateCount > 0)) |
50 | ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket(); | ||
51 | terse.RegionData.RegionHandle = m_regionHandle; // FIXME | ||
52 | terse.RegionData.TimeDilation = 64096; | ||
53 | terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; | ||
54 | terse.ObjectData[0] = terseBlock; | ||
55 | List<Avatar> avList = this.m_world.RequestAvatarList(); | ||
56 | foreach (Avatar client in avList) | ||
57 | { | 49 | { |
58 | client.SendPacketToViewer(terse); | 50 | //It has been a while since last update was sent so lets send one. |
51 | ImprovedTerseObjectUpdatePacket.ObjectDataBlock terseBlock = CreateTerseBlock(); | ||
52 | ImprovedTerseObjectUpdatePacket terse = new ImprovedTerseObjectUpdatePacket(); | ||
53 | terse.RegionData.RegionHandle = m_regionHandle; // FIXME | ||
54 | terse.RegionData.TimeDilation = 64096; | ||
55 | terse.ObjectData = new ImprovedTerseObjectUpdatePacket.ObjectDataBlock[1]; | ||
56 | terse.ObjectData[0] = terseBlock; | ||
57 | List<Avatar> avList = this.m_world.RequestAvatarList(); | ||
58 | foreach (Avatar client in avList) | ||
59 | { | ||
60 | client.SendPacketToViewer(terse); | ||
61 | } | ||
62 | _updateCount = 0; | ||
59 | } | 63 | } |
60 | _updateCount = 0; | ||
61 | } | ||
62 | 64 | ||
63 | if (this.movementflag == 16) | 65 | if (this.movementflag == 16) |
64 | { | 66 | { |
65 | movementflag = 0; | 67 | movementflag = 0; |
68 | } | ||
66 | } | 69 | } |
67 | } | ||
68 | |||
69 | } | ||
70 | this.positionLastFrame = pos2; | ||
71 | 70 | ||
72 | if (!this.ControllingClient.m_sandboxMode) | ||
73 | { | ||
74 | if (pos2.X < 0) | ||
75 | { | ||
76 | ControllingClient.CrossSimBorder(new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z)); | ||
77 | } | 71 | } |
72 | this.positionLastFrame = pos2; | ||
78 | 73 | ||
79 | if (pos2.Y < 0) | 74 | if (!this.ControllingClient.m_sandboxMode) |
80 | { | 75 | { |
81 | ControllingClient.CrossSimBorder(new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z)); | 76 | if (pos2.X < 0) |
82 | } | 77 | { |
78 | ControllingClient.CrossSimBorder(new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z)); | ||
79 | } | ||
83 | 80 | ||
84 | if (pos2.X > 255) | 81 | if (pos2.Y < 0) |
85 | { | 82 | { |
86 | ControllingClient.CrossSimBorder(new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z)); | 83 | ControllingClient.CrossSimBorder(new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z)); |
87 | } | 84 | } |
88 | 85 | ||
89 | if (pos2.Y > 255) | 86 | if (pos2.X > 255) |
90 | { | 87 | { |
91 | ControllingClient.CrossSimBorder(new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z)); | 88 | ControllingClient.CrossSimBorder(new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z)); |
89 | } | ||
90 | |||
91 | if (pos2.Y > 255) | ||
92 | { | ||
93 | ControllingClient.CrossSimBorder(new LLVector3(this._physActor.Position.X, this._physActor.Position.Y, this._physActor.Position.Z)); | ||
94 | } | ||
92 | } | 95 | } |
93 | } | 96 | } |
94 | 97 | ||
95 | } | 98 | } |
99 | |||
96 | public void SendUpdateToOtherClient(Avatar remoteAvatar) | 100 | public void SendUpdateToOtherClient(Avatar remoteAvatar) |
97 | { | 101 | { |
98 | ObjectUpdatePacket objupdate = CreateUpdatePacket(); | 102 | ObjectUpdatePacket objupdate = CreateUpdatePacket(); |