diff options
Diffstat (limited to 'OpenSim/Region/Environment/Scenes/SceneObjectPart.cs')
-rw-r--r-- | OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | 118 |
1 files changed, 69 insertions, 49 deletions
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index bf6025e..6c76d54 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | |||
@@ -212,6 +212,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
212 | // It's not necessary to persist this | 212 | // It's not necessary to persist this |
213 | m_TextureAnimation = new byte[0]; | 213 | m_TextureAnimation = new byte[0]; |
214 | m_particleSystem = new byte[0]; | 214 | m_particleSystem = new byte[0]; |
215 | Rezzed = DateTime.Now; | ||
215 | } | 216 | } |
216 | 217 | ||
217 | public SceneObjectPart(ulong regionHandle, SceneObjectGroup parent, UUID ownerID, uint localID, | 218 | public SceneObjectPart(ulong regionHandle, SceneObjectGroup parent, UUID ownerID, uint localID, |
@@ -237,6 +238,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
237 | m_regionHandle = regionHandle; | 238 | m_regionHandle = regionHandle; |
238 | m_parentGroup = parent; | 239 | m_parentGroup = parent; |
239 | 240 | ||
241 | Rezzed = DateTime.Now; | ||
240 | _creationDate = (Int32) (DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; | 242 | _creationDate = (Int32) (DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; |
241 | _ownerID = ownerID; | 243 | _ownerID = ownerID; |
242 | _creatorID = _ownerID; | 244 | _creatorID = _ownerID; |
@@ -311,6 +313,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
311 | RotationOffset = rotation; | 313 | RotationOffset = rotation; |
312 | ObjectFlags = flags; | 314 | ObjectFlags = flags; |
313 | 315 | ||
316 | Rezzed = DateTime.Now; | ||
317 | |||
314 | m_TextureAnimation = new byte[0]; | 318 | m_TextureAnimation = new byte[0]; |
315 | m_particleSystem = new byte[0]; | 319 | m_particleSystem = new byte[0]; |
316 | // Since we don't store script state, this is only a 'temporary' objectflag now | 320 | // Since we don't store script state, this is only a 'temporary' objectflag now |
@@ -339,6 +343,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
339 | */ | 343 | */ |
340 | 344 | ||
341 | //System.Console.WriteLine("SceneObjectPart Deserialize END"); | 345 | //System.Console.WriteLine("SceneObjectPart Deserialize END"); |
346 | Rezzed = DateTime.Now; | ||
342 | } | 347 | } |
343 | 348 | ||
344 | #endregion Constructors | 349 | #endregion Constructors |
@@ -362,6 +367,7 @@ namespace OpenSim.Region.Environment.Scenes | |||
362 | private uint _nextOwnerMask = (uint)PermissionMask.All; | 367 | private uint _nextOwnerMask = (uint)PermissionMask.All; |
363 | private PrimFlags _flags = 0; | 368 | private PrimFlags _flags = 0; |
364 | private DateTime m_expires; | 369 | private DateTime m_expires; |
370 | private DateTime m_rezzed; | ||
365 | 371 | ||
366 | public UUID CreatorID { | 372 | public UUID CreatorID { |
367 | get | 373 | get |
@@ -459,6 +465,13 @@ namespace OpenSim.Region.Environment.Scenes | |||
459 | set { m_expires = value; } | 465 | set { m_expires = value; } |
460 | } | 466 | } |
461 | 467 | ||
468 | [XmlIgnore] | ||
469 | public DateTime Rezzed | ||
470 | { | ||
471 | get { return m_rezzed; } | ||
472 | set { m_rezzed = value; } | ||
473 | } | ||
474 | |||
462 | /// <summary> | 475 | /// <summary> |
463 | /// The position of the entire group that this prim belongs to. | 476 | /// The position of the entire group that this prim belongs to. |
464 | /// </summary> | 477 | /// </summary> |
@@ -1270,6 +1283,7 @@ if (m_shape != null) { | |||
1270 | dupe._objectSaleType = _objectSaleType; | 1283 | dupe._objectSaleType = _objectSaleType; |
1271 | dupe._salePrice = _salePrice; | 1284 | dupe._salePrice = _salePrice; |
1272 | dupe._category = _category; | 1285 | dupe._category = _category; |
1286 | dupe.m_rezzed = m_rezzed; | ||
1273 | 1287 | ||
1274 | dupe.TaskInventory = (TaskInventoryDictionary)dupe.TaskInventory.Clone(); | 1288 | dupe.TaskInventory = (TaskInventoryDictionary)dupe.TaskInventory.Clone(); |
1275 | 1289 | ||
@@ -2226,10 +2240,10 @@ if (m_shape != null) { | |||
2226 | /// Send a terse update to the client. | 2240 | /// Send a terse update to the client. |
2227 | /// </summary> | 2241 | /// </summary> |
2228 | /// <param name="remoteClient"></param> | 2242 | /// <param name="remoteClient"></param> |
2229 | public void SendTerseUpdate(IClientAPI remoteClient) | 2243 | // public void SendTerseUpdate(IClientAPI remoteClient) |
2230 | { | 2244 | // { |
2231 | m_parentGroup.SendPartTerseUpdate(remoteClient, this); | 2245 | // SendTerseUpdateToClient(remoteClient); |
2232 | } | 2246 | // } |
2233 | 2247 | ||
2234 | /// <summary> | 2248 | /// <summary> |
2235 | /// | 2249 | /// |
@@ -2239,54 +2253,14 @@ if (m_shape != null) { | |||
2239 | List<ScenePresence> avatars = m_parentGroup.Scene.GetScenePresences(); | 2253 | List<ScenePresence> avatars = m_parentGroup.Scene.GetScenePresences(); |
2240 | for (int i = 0; i < avatars.Count; i++) | 2254 | for (int i = 0; i < avatars.Count; i++) |
2241 | { | 2255 | { |
2242 | m_parentGroup.SendPartTerseUpdate(avatars[i].ControllingClient, this); | 2256 | SendTerseUpdateToClient(avatars[i].ControllingClient); |
2243 | } | ||
2244 | } | ||
2245 | |||
2246 | public void SendTerseUpdateToClient(IClientAPI remoteClient) | ||
2247 | { | ||
2248 | Vector3 lPos; | ||
2249 | lPos = OffsetPosition; | ||
2250 | Quaternion mRot = RotationOffset; | ||
2251 | // TODO: I have no idea why we are making this check. This should be sorted out | ||
2252 | if ((ObjectFlags & (uint) PrimFlags.Physics) == 0) | ||
2253 | { | ||
2254 | remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Velocity, RotationalVelocity, Shape.State, FromAssetID); | ||
2255 | } | ||
2256 | else | ||
2257 | { | ||
2258 | remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Velocity, | ||
2259 | RotationalVelocity); | ||
2260 | //System.Console.WriteLine("LID: " + LocalID + " RVel:" + RotationalVelocity.ToString() + " TD: " + ((ushort)(m_parentGroup.Scene.TimeDilation * 500000f)).ToString() + ":" + m_parentGroup.Scene.TimeDilation.ToString()); | ||
2261 | } | 2257 | } |
2262 | } | 2258 | } |
2263 | 2259 | ||
2264 | public void SendTerseUpdateToClient(IClientAPI remoteClient, Vector3 lPos) | 2260 | // public void SendTerseUpdateToClient(IClientAPI remoteClient, Vector3 lPos) |
2265 | { | 2261 | // { |
2266 | Quaternion mRot = RotationOffset; | 2262 | // SendTerseUpdateToClient(remoteclient); |
2267 | //bool isattachment = IsAttachment; | 2263 | // } |
2268 | //if (LocalId != ParentGroup.RootPart.LocalId) | ||
2269 | //isattachment = ParentGroup.RootPart.IsAttachment; | ||
2270 | |||
2271 | if (IsAttachment) | ||
2272 | { | ||
2273 | //m_log.Debug(AttachmentPoint.ToString()); | ||
2274 | remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Velocity, RotationalVelocity, (byte)((AttachmentPoint % 16) * 16 + (AttachmentPoint / 16)),FromAssetID); | ||
2275 | } | ||
2276 | else | ||
2277 | { | ||
2278 | if ((ObjectFlags & (uint)PrimFlags.Physics) == 0) | ||
2279 | { | ||
2280 | remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Velocity, RotationalVelocity, Shape.State, FromAssetID); | ||
2281 | } | ||
2282 | else | ||
2283 | { | ||
2284 | remoteClient.SendPrimTerseUpdate(m_regionHandle, (ushort)(m_parentGroup.GetTimeDilation() * (float)ushort.MaxValue), LocalId, lPos, mRot, Velocity, | ||
2285 | RotationalVelocity); | ||
2286 | //System.Console.WriteLine("LID: " + LocalID + "RVel:" + RotationalVelocity.ToString() + " TD: " + ((ushort)(m_parentGroup.Scene.TimeDilation * 500000f)).ToString() + ":" + m_parentGroup.Scene.TimeDilation.ToString()); | ||
2287 | } | ||
2288 | } | ||
2289 | } | ||
2290 | 2264 | ||
2291 | public void SetAttachmentPoint(uint AttachmentPoint) | 2265 | public void SetAttachmentPoint(uint AttachmentPoint) |
2292 | { | 2266 | { |
@@ -3257,6 +3231,15 @@ if (m_shape != null) { | |||
3257 | PhysActor.Shape = m_shape; | 3231 | PhysActor.Shape = m_shape; |
3258 | } | 3232 | } |
3259 | 3233 | ||
3234 | // This is what makes vehicle trailers work | ||
3235 | // A script in a child prim re-issues | ||
3236 | // llSetPrimitiveParams(PRIM_TYPE) every few seconds. That | ||
3237 | // prevents autoreturn. This is not well known. It also works | ||
3238 | // in SL. | ||
3239 | // | ||
3240 | if (ParentGroup.RootPart != this) | ||
3241 | ParentGroup.RootPart.Rezzed = DateTime.Now; | ||
3242 | |||
3260 | ParentGroup.HasGroupChanged = true; | 3243 | ParentGroup.HasGroupChanged = true; |
3261 | ScheduleFullUpdate(); | 3244 | ScheduleFullUpdate(); |
3262 | } | 3245 | } |
@@ -3427,5 +3410,42 @@ if (m_shape != null) { | |||
3427 | } | 3410 | } |
3428 | 3411 | ||
3429 | #endregion Public Methods | 3412 | #endregion Public Methods |
3413 | |||
3414 | private byte GetAttachPointEncoded() | ||
3415 | { | ||
3416 | return (byte)((AttachmentPoint % 16) * 16 + (AttachmentPoint / 16)); | ||
3417 | } | ||
3418 | |||
3419 | public void SendTerseUpdateToClient(IClientAPI remoteClient) | ||
3420 | { | ||
3421 | if (ParentGroup == null || ParentGroup.RootPart == null) | ||
3422 | return; | ||
3423 | |||
3424 | Vector3 lPos = OffsetPosition; | ||
3425 | |||
3426 | byte state = Shape.State; | ||
3427 | if (IsAttachment) | ||
3428 | { | ||
3429 | if (ParentGroup.RootPart != this) | ||
3430 | return; | ||
3431 | |||
3432 | lPos = ParentGroup.RootPart.AttachedPos; | ||
3433 | state = GetAttachPointEncoded(); | ||
3434 | } | ||
3435 | else | ||
3436 | { | ||
3437 | if (ParentGroup.RootPart == this) | ||
3438 | lPos = AbsolutePosition; | ||
3439 | } | ||
3440 | |||
3441 | remoteClient.SendPrimTerseUpdate(m_regionHandle, | ||
3442 | (ushort)(m_parentGroup.GetTimeDilation() * | ||
3443 | (float)ushort.MaxValue), LocalId, lPos, | ||
3444 | RotationOffset, Velocity, | ||
3445 | RotationalVelocity, state, FromAssetID); | ||
3446 | } | ||
3430 | } | 3447 | } |
3431 | } | 3448 | } |
3449 | |||
3450 | |||
3451 | |||