diff options
Diffstat (limited to 'OpenSim/OpenSim.Region/Scenes/ScenePresence.cs')
-rw-r--r-- | OpenSim/OpenSim.Region/Scenes/ScenePresence.cs | 313 |
1 files changed, 251 insertions, 62 deletions
diff --git a/OpenSim/OpenSim.Region/Scenes/ScenePresence.cs b/OpenSim/OpenSim.Region/Scenes/ScenePresence.cs index e22528a..1255606 100644 --- a/OpenSim/OpenSim.Region/Scenes/ScenePresence.cs +++ b/OpenSim/OpenSim.Region/Scenes/ScenePresence.cs | |||
@@ -48,7 +48,6 @@ namespace OpenSim.Region.Scenes | |||
48 | public IClientAPI ControllingClient; | 48 | public IClientAPI ControllingClient; |
49 | public LLUUID current_anim; | 49 | public LLUUID current_anim; |
50 | public int anim_seq; | 50 | public int anim_seq; |
51 | private static libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock AvatarTemplate; | ||
52 | private bool updateflag = false; | 51 | private bool updateflag = false; |
53 | private byte movementflag = 0; | 52 | private byte movementflag = 0; |
54 | private List<NewForce> forcesList = new List<NewForce>(); | 53 | private List<NewForce> forcesList = new List<NewForce>(); |
@@ -59,11 +58,31 @@ namespace OpenSim.Region.Scenes | |||
59 | private AvatarWearable[] Wearables; | 58 | private AvatarWearable[] Wearables; |
60 | private LLVector3 positionLastFrame = new LLVector3(0, 0, 0); | 59 | private LLVector3 positionLastFrame = new LLVector3(0, 0, 0); |
61 | private ulong m_regionHandle; | 60 | private ulong m_regionHandle; |
62 | private bool childAvatar = false; | 61 | private bool childAgent = false; |
63 | private bool newForce = false; | 62 | private bool newForce = false; |
64 | private bool newAvatar = false; | 63 | private bool newAvatar = false; |
64 | private IScenePresenceBody m_body; | ||
65 | 65 | ||
66 | protected RegionInfo m_regionInfo; | 66 | protected RegionInfo m_regionInfo; |
67 | |||
68 | #region Properties | ||
69 | /// <summary> | ||
70 | /// | ||
71 | /// </summary> | ||
72 | public PhysicsActor PhysActor | ||
73 | { | ||
74 | set | ||
75 | { | ||
76 | this._physActor = value; | ||
77 | } | ||
78 | get | ||
79 | { | ||
80 | return _physActor; | ||
81 | } | ||
82 | } | ||
83 | #endregion | ||
84 | |||
85 | #region Constructor(s) | ||
67 | /// <summary> | 86 | /// <summary> |
68 | /// | 87 | /// |
69 | /// </summary> | 88 | /// </summary> |
@@ -99,38 +118,25 @@ namespace OpenSim.Region.Scenes | |||
99 | ControllingClient.OnRequestWearables += this.SendOurAppearance; | 118 | ControllingClient.OnRequestWearables += this.SendOurAppearance; |
100 | //ControllingClient.OnSetAppearance += new SetAppearance(this.SetAppearance); | 119 | //ControllingClient.OnSetAppearance += new SetAppearance(this.SetAppearance); |
101 | ControllingClient.OnCompleteMovementToRegion += this.CompleteMovement; | 120 | ControllingClient.OnCompleteMovementToRegion += this.CompleteMovement; |
102 | ControllingClient.OnCompleteMovementToRegion += this.SendInitialPosition; | 121 | ControllingClient.OnCompleteMovementToRegion += this.SendInitialData; |
103 | ControllingClient.OnAgentUpdate += this.HandleAgentUpdate; | 122 | ControllingClient.OnAgentUpdate += this.HandleAgentUpdate; |
104 | // ControllingClient.OnStartAnim += new StartAnim(this.SendAnimPack); | 123 | // ControllingClient.OnStartAnim += new StartAnim(this.SendAnimPack); |
105 | // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange); | 124 | // ControllingClient.OnChildAgentStatus += new StatusChange(this.ChildStatusChange); |
106 | //ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement); | 125 | //ControllingClient.OnStopMovement += new GenericCall2(this.StopMovement); |
107 | |||
108 | } | ||
109 | 126 | ||
110 | /// <summary> | ||
111 | /// | ||
112 | /// </summary> | ||
113 | public PhysicsActor PhysActor | ||
114 | { | ||
115 | set | ||
116 | { | ||
117 | this._physActor = value; | ||
118 | } | ||
119 | get | ||
120 | { | ||
121 | return _physActor; | ||
122 | } | ||
123 | } | 127 | } |
128 | #endregion | ||
124 | 129 | ||
130 | #region Status Methods | ||
125 | /// <summary> | 131 | /// <summary> |
126 | /// | 132 | /// Not Used, most likely can be deleted |
127 | /// </summary> | 133 | /// </summary> |
128 | /// <param name="status"></param> | 134 | /// <param name="status"></param> |
129 | public void ChildStatusChange(bool status) | 135 | public void ChildStatusChange(bool status) |
130 | { | 136 | { |
131 | this.childAvatar = status; | 137 | this.childAgent = status; |
132 | 138 | ||
133 | if (this.childAvatar == true) | 139 | if (this.childAgent == true) |
134 | { | 140 | { |
135 | this.Velocity = new LLVector3(0, 0, 0); | 141 | this.Velocity = new LLVector3(0, 0, 0); |
136 | this.Pos = new LLVector3(128, 128, 70); | 142 | this.Pos = new LLVector3(128, 128, 70); |
@@ -142,18 +148,19 @@ namespace OpenSim.Region.Scenes | |||
142 | /// | 148 | /// |
143 | /// </summary> | 149 | /// </summary> |
144 | /// <param name="pos"></param> | 150 | /// <param name="pos"></param> |
145 | public void UpGradeAvatar(LLVector3 pos) | 151 | public void MakeAvatar(LLVector3 pos) |
146 | { | 152 | { |
147 | //this.childAvatar = false; | 153 | //this.childAvatar = false; |
148 | this.Pos = pos; | 154 | this.Pos = pos; |
149 | this.newAvatar = true; | 155 | this.newAvatar = true; |
156 | this.childAgent = false; | ||
150 | } | 157 | } |
151 | 158 | ||
152 | protected void DownGradeAvatar() | 159 | protected void MakeChildAgent() |
153 | { | 160 | { |
154 | this.Velocity = new LLVector3(0, 0, 0); | 161 | this.Velocity = new LLVector3(0, 0, 0); |
155 | this.Pos = new LLVector3(128, 128, 70); | 162 | this.Pos = new LLVector3(128, 128, 70); |
156 | this.childAvatar = true; | 163 | this.childAgent = true; |
157 | } | 164 | } |
158 | 165 | ||
159 | /// <summary> | 166 | /// <summary> |
@@ -169,46 +176,21 @@ namespace OpenSim.Region.Scenes | |||
169 | /// <summary> | 176 | /// <summary> |
170 | /// | 177 | /// |
171 | /// </summary> | 178 | /// </summary> |
172 | public override void addForces() | 179 | public void StopMovement() |
173 | { | 180 | { |
174 | newForce = false; | ||
175 | lock (this.forcesList) | ||
176 | { | ||
177 | if (this.forcesList.Count > 0) | ||
178 | { | ||
179 | for (int i = 0; i < this.forcesList.Count; i++) | ||
180 | { | ||
181 | NewForce force = this.forcesList[i]; | ||
182 | |||
183 | this.updateflag = true; | ||
184 | this.Velocity = new LLVector3(force.X, force.Y, force.Z); | ||
185 | this.newForce = true; | ||
186 | } | ||
187 | for (int i = 0; i < this.forcesList.Count; i++) | ||
188 | { | ||
189 | this.forcesList.RemoveAt(0); | ||
190 | } | ||
191 | } | ||
192 | } | ||
193 | } | ||
194 | 181 | ||
195 | public void SendTerseUpdateToClient(IClientAPI RemoteClient) | ||
196 | { | ||
197 | LLVector3 pos = this.Pos; | ||
198 | LLVector3 vel = this.Velocity; | ||
199 | RemoteClient.SendAvatarTerseUpdate(this.m_regionHandle, 64096, this.LocalId, new LLVector3(pos.X, pos.Y, pos.Z), new LLVector3(vel.X, vel.Y, vel.Z)); | ||
200 | } | 182 | } |
183 | #endregion | ||
201 | 184 | ||
185 | #region Event Handlers | ||
202 | /// <summary> | 186 | /// <summary> |
203 | /// | 187 | /// |
204 | /// </summary> | 188 | /// </summary> |
205 | public void SendTerseUpdateToALLClients() | 189 | /// <param name="texture"></param> |
190 | /// <param name="visualParam"></param> | ||
191 | public void SetAppearance(byte[] texture, AgentSetAppearancePacket.VisualParamBlock[] visualParam) | ||
206 | { | 192 | { |
207 | List<ScenePresence> avatars = this.m_world.RequestAvatarList(); | 193 | |
208 | for (int i = 0; i < avatars.Count; i++) | ||
209 | { | ||
210 | this.SendTerseUpdateToClient(avatars[i].ControllingClient); | ||
211 | } | ||
212 | } | 194 | } |
213 | 195 | ||
214 | /// <summary> | 196 | /// <summary> |
@@ -222,9 +204,9 @@ namespace OpenSim.Region.Scenes | |||
222 | look = new LLVector3(0.99f, 0.042f, 0); | 204 | look = new LLVector3(0.99f, 0.042f, 0); |
223 | } | 205 | } |
224 | this.ControllingClient.MoveAgentIntoRegion(m_regionInfo, Pos, look); | 206 | this.ControllingClient.MoveAgentIntoRegion(m_regionInfo, Pos, look); |
225 | if (this.childAvatar) | 207 | if (this.childAgent) |
226 | { | 208 | { |
227 | this.childAvatar = false; | 209 | this.childAgent = false; |
228 | } | 210 | } |
229 | } | 211 | } |
230 | 212 | ||
@@ -272,25 +254,232 @@ namespace OpenSim.Region.Scenes | |||
272 | movementflag = 0; | 254 | movementflag = 0; |
273 | } | 255 | } |
274 | } | 256 | } |
275 | 257 | ||
276 | } | 258 | } |
259 | #endregion | ||
277 | 260 | ||
261 | #region Overridden Methods | ||
278 | /// <summary> | 262 | /// <summary> |
279 | /// | 263 | /// |
280 | /// </summary> | 264 | /// </summary> |
281 | public static void LoadAnims() | 265 | public override void LandRenegerated() |
282 | { | 266 | { |
283 | 267 | ||
284 | } | 268 | } |
285 | 269 | ||
286 | /// <summary> | 270 | /// <summary> |
287 | /// | 271 | /// |
288 | /// </summary> | 272 | /// </summary> |
289 | public override void LandRenegerated() | 273 | public override void update() |
274 | { | ||
275 | if (this.childAgent == false) | ||
276 | { | ||
277 | if (this.newForce) | ||
278 | { | ||
279 | this.SendTerseUpdateToALLClients(); | ||
280 | _updateCount = 0; | ||
281 | } | ||
282 | else if (movementflag != 0) | ||
283 | { | ||
284 | _updateCount++; | ||
285 | if (_updateCount > 3) | ||
286 | { | ||
287 | this.SendTerseUpdateToALLClients(); | ||
288 | _updateCount = 0; | ||
289 | } | ||
290 | } | ||
291 | |||
292 | this.CheckForBorderCrossing(); | ||
293 | } | ||
294 | } | ||
295 | #endregion | ||
296 | |||
297 | #region Update Client(s) | ||
298 | /// <summary> | ||
299 | /// | ||
300 | /// </summary> | ||
301 | /// <param name="RemoteClient"></param> | ||
302 | public void SendTerseUpdateToClient(IClientAPI RemoteClient) | ||
303 | { | ||
304 | LLVector3 pos = this.Pos; | ||
305 | LLVector3 vel = this.Velocity; | ||
306 | RemoteClient.SendAvatarTerseUpdate(this.m_regionHandle, 64096, this.LocalId, new LLVector3(pos.X, pos.Y, pos.Z), new LLVector3(vel.X, vel.Y, vel.Z)); | ||
307 | } | ||
308 | |||
309 | /// <summary> | ||
310 | /// | ||
311 | /// </summary> | ||
312 | public void SendTerseUpdateToALLClients() | ||
313 | { | ||
314 | List<ScenePresence> avatars = this.m_world.RequestAvatarList(); | ||
315 | for (int i = 0; i < avatars.Count; i++) | ||
316 | { | ||
317 | this.SendTerseUpdateToClient(avatars[i].ControllingClient); | ||
318 | } | ||
319 | } | ||
320 | |||
321 | /// <summary> | ||
322 | /// | ||
323 | /// </summary> | ||
324 | /// <param name="remoteAvatar"></param> | ||
325 | public void SendFullUpdateToOtherClient(ScenePresence remoteAvatar) | ||
326 | { | ||
327 | remoteAvatar.ControllingClient.SendAvatarData(m_regionInfo.RegionHandle, this.firstname, this.lastname, this.uuid, this.LocalId, this.Pos); | ||
328 | } | ||
329 | |||
330 | /// <summary> | ||
331 | /// | ||
332 | /// </summary> | ||
333 | public void SendInitialData() | ||
334 | { | ||
335 | this.ControllingClient.SendAvatarData(m_regionInfo.RegionHandle, this.firstname, this.lastname, this.uuid, this.LocalId, this.Pos); | ||
336 | if (this.newAvatar) | ||
337 | { | ||
338 | this.m_world.InformClientOfNeighbours(this.ControllingClient); | ||
339 | this.newAvatar = false; | ||
340 | } | ||
341 | } | ||
342 | |||
343 | /// <summary> | ||
344 | /// | ||
345 | /// </summary> | ||
346 | /// <param name="OurClient"></param> | ||
347 | public void SendOurAppearance(IClientAPI OurClient) | ||
348 | { | ||
349 | this.ControllingClient.SendWearables(this.Wearables); | ||
350 | } | ||
351 | |||
352 | /// <summary> | ||
353 | /// | ||
354 | /// </summary> | ||
355 | /// <param name="avatarInfo"></param> | ||
356 | public void SendAppearanceToOtherAgent(ScenePresence avatarInfo) | ||
290 | { | 357 | { |
291 | 358 | ||
292 | } | 359 | } |
293 | 360 | ||
361 | /// <summary> | ||
362 | /// | ||
363 | /// </summary> | ||
364 | /// <param name="animID"></param> | ||
365 | /// <param name="seq"></param> | ||
366 | public void SendAnimPack(LLUUID animID, int seq) | ||
367 | { | ||
368 | |||
369 | |||
370 | } | ||
371 | |||
372 | /// <summary> | ||
373 | /// | ||
374 | /// </summary> | ||
375 | public void SendAnimPack() | ||
376 | { | ||
377 | |||
378 | } | ||
379 | #endregion | ||
380 | |||
381 | #region Border Crossing Methods | ||
382 | /// <summary> | ||
383 | /// | ||
384 | /// </summary> | ||
385 | protected void CheckForBorderCrossing() | ||
386 | { | ||
387 | LLVector3 pos2 = this.Pos; | ||
388 | LLVector3 vel = this.Velocity; | ||
389 | |||
390 | float timeStep = 0.2f; | ||
391 | pos2.X = pos2.X + (vel.X * timeStep); | ||
392 | pos2.Y = pos2.Y + (vel.Y * timeStep); | ||
393 | pos2.Z = pos2.Z + (vel.Z * timeStep); | ||
394 | |||
395 | if ((pos2.X < 0) || (pos2.X > 256)) | ||
396 | { | ||
397 | this.CrossToNewRegion(); | ||
398 | } | ||
399 | |||
400 | if ((pos2.Y < 0) || (pos2.Y > 256)) | ||
401 | { | ||
402 | this.CrossToNewRegion(); | ||
403 | } | ||
404 | } | ||
405 | |||
406 | /// <summary> | ||
407 | /// | ||
408 | /// </summary> | ||
409 | protected void CrossToNewRegion() | ||
410 | { | ||
411 | LLVector3 pos = this.Pos; | ||
412 | LLVector3 newpos = new LLVector3(pos.X, pos.Y, pos.Z); | ||
413 | uint neighbourx = this.m_regionInfo.RegionLocX; | ||
414 | uint neighboury = this.m_regionInfo.RegionLocY; | ||
415 | |||
416 | if (pos.X < 2) | ||
417 | { | ||
418 | neighbourx -= 1; | ||
419 | newpos.X = 254; | ||
420 | } | ||
421 | if (pos.X > 253) | ||
422 | { | ||
423 | neighbourx += 1; | ||
424 | newpos.X = 1; | ||
425 | } | ||
426 | if (pos.Y < 2) | ||
427 | { | ||
428 | neighboury -= 1; | ||
429 | newpos.Y = 254; | ||
430 | } | ||
431 | if (pos.Y > 253) | ||
432 | { | ||
433 | neighboury += 1; | ||
434 | newpos.Y = 1; | ||
435 | } | ||
436 | |||
437 | LLVector3 vel = this.velocity; | ||
438 | ulong neighbourHandle = Helpers.UIntsToLong((uint)(neighbourx * 256), (uint)(neighboury * 256)); | ||
439 | RegionInfo neighbourRegion = this.m_world.RequestNeighbouringRegionInfo(neighbourHandle); | ||
440 | if (neighbourRegion != null) | ||
441 | { | ||
442 | this.m_world.InformNeighbourOfCrossing(neighbourHandle, this.ControllingClient.AgentId, newpos); | ||
443 | this.MakeChildAgent(); | ||
444 | this.ControllingClient.CrossRegion(neighbourHandle, newpos, vel, System.Net.IPAddress.Parse(neighbourRegion.IPListenAddr), (ushort)neighbourRegion.IPListenPort); | ||
445 | |||
446 | } | ||
447 | } | ||
448 | #endregion | ||
449 | |||
450 | /// <summary> | ||
451 | /// | ||
452 | /// </summary> | ||
453 | public static void LoadAnims() | ||
454 | { | ||
455 | |||
456 | } | ||
457 | |||
458 | /// <summary> | ||
459 | /// | ||
460 | /// </summary> | ||
461 | public override void updateMovement() | ||
462 | { | ||
463 | newForce = false; | ||
464 | lock (this.forcesList) | ||
465 | { | ||
466 | if (this.forcesList.Count > 0) | ||
467 | { | ||
468 | for (int i = 0; i < this.forcesList.Count; i++) | ||
469 | { | ||
470 | NewForce force = this.forcesList[i]; | ||
471 | |||
472 | this.updateflag = true; | ||
473 | this.Velocity = new LLVector3(force.X, force.Y, force.Z); | ||
474 | this.newForce = true; | ||
475 | } | ||
476 | for (int i = 0; i < this.forcesList.Count; i++) | ||
477 | { | ||
478 | this.forcesList.RemoveAt(0); | ||
479 | } | ||
480 | } | ||
481 | } | ||
482 | } | ||
294 | 483 | ||
295 | public class NewForce | 484 | public class NewForce |
296 | { | 485 | { |