add some persistence (mysql only)
parent
24c4cf74c6
commit
ffca7de65d
|
@ -62,7 +62,7 @@ namespace OpenSim.Data.MySQL
|
||||||
/// </summary>
|
/// </summary>
|
||||||
private object m_dbLock = new object();
|
private object m_dbLock = new object();
|
||||||
|
|
||||||
protected virtual Assembly Assembly
|
protected Assembly Assembly
|
||||||
{
|
{
|
||||||
get { return GetType().Assembly; }
|
get { return GetType().Assembly; }
|
||||||
}
|
}
|
||||||
|
@ -76,7 +76,7 @@ namespace OpenSim.Data.MySQL
|
||||||
Initialise(connectionString);
|
Initialise(connectionString);
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void Initialise(string connectionString)
|
public void Initialise(string connectionString)
|
||||||
{
|
{
|
||||||
m_connectionString = connectionString;
|
m_connectionString = connectionString;
|
||||||
|
|
||||||
|
@ -189,7 +189,7 @@ namespace OpenSim.Data.MySQL
|
||||||
"AttachedPosY, AttachedPosZ, " +
|
"AttachedPosY, AttachedPosZ, " +
|
||||||
"PhysicsShapeType, Density, GravityModifier, " +
|
"PhysicsShapeType, Density, GravityModifier, " +
|
||||||
"Friction, Restitution, Vehicle, PhysInertia, DynAttrs, " +
|
"Friction, Restitution, Vehicle, PhysInertia, DynAttrs, " +
|
||||||
"RotationAxisLocks" +
|
"RotationAxisLocks, sopanims" +
|
||||||
") values (" + "?UUID, " +
|
") values (" + "?UUID, " +
|
||||||
"?CreationDate, ?Name, ?Text, " +
|
"?CreationDate, ?Name, ?Text, " +
|
||||||
"?Description, ?SitName, ?TouchName, " +
|
"?Description, ?SitName, ?TouchName, " +
|
||||||
|
@ -226,7 +226,7 @@ namespace OpenSim.Data.MySQL
|
||||||
"?AttachedPosY, ?AttachedPosZ, " +
|
"?AttachedPosY, ?AttachedPosZ, " +
|
||||||
"?PhysicsShapeType, ?Density, ?GravityModifier, " +
|
"?PhysicsShapeType, ?Density, ?GravityModifier, " +
|
||||||
"?Friction, ?Restitution, ?Vehicle, ?PhysInertia, ?DynAttrs," +
|
"?Friction, ?Restitution, ?Vehicle, ?PhysInertia, ?DynAttrs," +
|
||||||
"?RotationAxisLocks)";
|
"?RotationAxisLocks, ?sopanims)";
|
||||||
|
|
||||||
FillPrimCommand(cmd, prim, obj.UUID, regionUUID);
|
FillPrimCommand(cmd, prim, obj.UUID, regionUUID);
|
||||||
|
|
||||||
|
@ -1499,6 +1499,19 @@ namespace OpenSim.Data.MySQL
|
||||||
pdata = PhysicsInertiaData.FromXml2(row["PhysInertia"].ToString());
|
pdata = PhysicsInertiaData.FromXml2(row["PhysInertia"].ToString());
|
||||||
prim.PhysicsInertia = pdata;
|
prim.PhysicsInertia = pdata;
|
||||||
|
|
||||||
|
if (!(row["sopanims"] is DBNull))
|
||||||
|
{
|
||||||
|
Byte[] data = (byte[])row["sopanims"];
|
||||||
|
if (data.Length > 0)
|
||||||
|
prim.DeSerializeAnimations(data);
|
||||||
|
else
|
||||||
|
prim.Animations = null;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
prim.Animations = null;
|
||||||
|
}
|
||||||
|
|
||||||
return prim;
|
return prim;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1878,6 +1891,11 @@ namespace OpenSim.Data.MySQL
|
||||||
cmd.Parameters.AddWithValue("Friction", (double)prim.Friction);
|
cmd.Parameters.AddWithValue("Friction", (double)prim.Friction);
|
||||||
cmd.Parameters.AddWithValue("Restitution", (double)prim.Restitution);
|
cmd.Parameters.AddWithValue("Restitution", (double)prim.Restitution);
|
||||||
cmd.Parameters.AddWithValue("RotationAxisLocks", prim.RotationAxisLocks);
|
cmd.Parameters.AddWithValue("RotationAxisLocks", prim.RotationAxisLocks);
|
||||||
|
|
||||||
|
if (prim.Animations!= null)
|
||||||
|
cmd.Parameters.AddWithValue("sopanims", prim.SerializeAnimations());
|
||||||
|
else
|
||||||
|
cmd.Parameters.AddWithValue("sopanims", null);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -467,3 +467,10 @@ COMMIT;
|
||||||
BEGIN;
|
BEGIN;
|
||||||
ALTER TABLE `prims` ADD COLUMN `PhysInertia` TEXT default NULL;
|
ALTER TABLE `prims` ADD COLUMN `PhysInertia` TEXT default NULL;
|
||||||
COMMIT;
|
COMMIT;
|
||||||
|
|
||||||
|
:VERSION 58 #----- Add sop animations
|
||||||
|
|
||||||
|
BEGIN;
|
||||||
|
ALTER TABLE `prims` ADD COLUMN `sopanims` blob default NULL;
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
|
|
@ -2424,8 +2424,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Send an alert message to the client. On the Linden client (tested 1.19.1.4), this pops up a brief duration
|
/// Send an alert message to the client. This pops up a brief duration information box at a corner
|
||||||
/// blue information box in the bottom right hand corner.
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="message"></param>
|
/// <param name="message"></param>
|
||||||
public void SendAlertMessage(string message)
|
public void SendAlertMessage(string message)
|
||||||
|
@ -2463,17 +2462,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
/// middle of the window. If false, the message is displayed in a brief duration blue information box (as for
|
/// middle of the window. If false, the message is displayed in a brief duration blue information box (as for
|
||||||
/// the AlertMessage packet).</param>
|
/// the AlertMessage packet).</param>
|
||||||
public void SendAgentAlertMessage(string message, bool modal)
|
public void SendAgentAlertMessage(string message, bool modal)
|
||||||
{
|
|
||||||
OutPacket(BuildAgentAlertPacket(message, modal), ThrottleOutPacketType.Task);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Construct an agent alert packet
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="message"></param>
|
|
||||||
/// <param name="modal"></param>
|
|
||||||
/// <returns></returns>
|
|
||||||
public AgentAlertMessagePacket BuildAgentAlertPacket(string message, bool modal)
|
|
||||||
{
|
{
|
||||||
// Prepend a slash to make the message come up in the top right
|
// Prepend a slash to make the message come up in the top right
|
||||||
// again.
|
// again.
|
||||||
|
@ -2484,8 +2472,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
alertPack.AgentData.AgentID = AgentId;
|
alertPack.AgentData.AgentID = AgentId;
|
||||||
alertPack.AlertData.Message = Util.StringToBytes256(message);
|
alertPack.AlertData.Message = Util.StringToBytes256(message);
|
||||||
alertPack.AlertData.Modal = modal;
|
alertPack.AlertData.Modal = modal;
|
||||||
|
OutPacket(alertPack, ThrottleOutPacketType.Task);
|
||||||
return alertPack;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SendLoadURL(string objectname, UUID objectID, UUID ownerID, bool groupOwned, string message,
|
public void SendLoadURL(string objectname, UUID objectID, UUID ownerID, bool groupOwned, string message,
|
||||||
|
|
|
@ -64,21 +64,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
public delegate void SynchronizeSceneHandler(Scene scene);
|
public delegate void SynchronizeSceneHandler(Scene scene);
|
||||||
|
|
||||||
protected static int m_animationSequenceNumber = (int)(Util.GetTimeStampTicks() & 0x5fffafL);
|
|
||||||
|
|
||||||
public int NextObjectAnimationSequenceNumber
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
int ret = Interlocked.Increment(ref m_animationSequenceNumber);
|
|
||||||
if (ret <= 0 )
|
|
||||||
{
|
|
||||||
m_animationSequenceNumber = (int)(Util.GetTimeStampTicks() & 0xafff5fL);
|
|
||||||
ret = Interlocked.Increment(ref m_animationSequenceNumber);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#region Fields
|
#region Fields
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -32,6 +32,8 @@ using System.IO;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.Serialization;
|
using System.Runtime.Serialization;
|
||||||
using System.Security.Permissions;
|
using System.Security.Permissions;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Text;
|
||||||
using System.Xml;
|
using System.Xml;
|
||||||
using System.Xml.Serialization;
|
using System.Xml.Serialization;
|
||||||
using log4net;
|
using log4net;
|
||||||
|
@ -5657,13 +5659,29 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
UpdatePrimFlags(wasUsingPhysics,wasTemporary,wasPhantom,makeVolumeDetect,false);
|
UpdatePrimFlags(wasUsingPhysics,wasTemporary,wasPhantom,makeVolumeDetect,false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static int m_animationSequenceNumber = (int)(Util.GetTimeStampTicks() & 0x5fffafL);
|
||||||
|
public static int NextObjectAnimationSequenceNumber
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
int ret = Interlocked.Increment(ref m_animationSequenceNumber);
|
||||||
|
if (ret <= 0)
|
||||||
|
{
|
||||||
|
m_animationSequenceNumber = (int)(Util.GetTimeStampTicks() & 0xafff5fL);
|
||||||
|
ret = Interlocked.Increment(ref m_animationSequenceNumber);
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private object animsLock = new object();
|
private object animsLock = new object();
|
||||||
public Dictionary<UUID, int> Animations = null;
|
public Dictionary<UUID, int> Animations = null;
|
||||||
public Dictionary<UUID, string> AnimationsNames = null;
|
public Dictionary<UUID, string> AnimationsNames = null;
|
||||||
|
|
||||||
public bool AddAnimation(UUID animId, string animName)
|
public bool AddAnimation(UUID animId, string animName)
|
||||||
{
|
{
|
||||||
if (ParentGroup == null || ParentGroup.IsDeleted || ParentGroup.inTransit)
|
if (animId == UUID.Zero || string.IsNullOrEmpty(animName) ||
|
||||||
|
ParentGroup == null || ParentGroup.IsDeleted || ParentGroup.inTransit)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
lock (animsLock)
|
lock (animsLock)
|
||||||
|
@ -5676,7 +5694,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (Animations.ContainsKey(animId))
|
if (Animations.ContainsKey(animId))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
Animations[animId] = ParentGroup.Scene.NextObjectAnimationSequenceNumber;
|
Animations[animId] = NextObjectAnimationSequenceNumber;
|
||||||
AnimationsNames[animId] = animName;
|
AnimationsNames[animId] = animName;
|
||||||
ScheduleUpdate(PrimUpdateFlags.Animations);
|
ScheduleUpdate(PrimUpdateFlags.Animations);
|
||||||
}
|
}
|
||||||
|
@ -5685,7 +5703,7 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
|
|
||||||
public bool RemoveAnimation(UUID animId)
|
public bool RemoveAnimation(UUID animId)
|
||||||
{
|
{
|
||||||
if (ParentGroup == null || ParentGroup.IsDeleted || ParentGroup.inTransit)
|
if (animId == UUID.Zero || ParentGroup == null || ParentGroup.IsDeleted || ParentGroup.inTransit)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
lock (animsLock)
|
lock (animsLock)
|
||||||
|
@ -5726,5 +5744,87 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
return Animations.Count;
|
return Animations.Count;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Byte[] SerializeAnimations()
|
||||||
|
{
|
||||||
|
if (AnimationsNames == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
|
||||||
|
lock (animsLock)
|
||||||
|
{
|
||||||
|
if (AnimationsNames.Count == 0)
|
||||||
|
return new byte[] { 0 };
|
||||||
|
|
||||||
|
using (MemoryStream ms = new MemoryStream())
|
||||||
|
{
|
||||||
|
byte[] tmp = Utils.UInt16ToBytes((ushort)Animations.Count);
|
||||||
|
ms.Write(tmp, 0, 2);
|
||||||
|
|
||||||
|
foreach(KeyValuePair<UUID,string> kvp in AnimationsNames)
|
||||||
|
{
|
||||||
|
tmp = kvp.Key.GetBytes();
|
||||||
|
ms.Write(tmp, 0, 16);
|
||||||
|
if(string.IsNullOrEmpty(kvp.Value))
|
||||||
|
ms.WriteByte(0);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
byte[] str = Util.StringToBytes(kvp.Value, 64);
|
||||||
|
int len = str.Length - 1;
|
||||||
|
ms.WriteByte((byte)len);
|
||||||
|
ms.Write(str, 0 , len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ms.ToArray();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void DeSerializeAnimations(Byte[] data)
|
||||||
|
{
|
||||||
|
if(data == null)
|
||||||
|
{
|
||||||
|
Animations = null;
|
||||||
|
AnimationsNames = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (data.Length < 2)
|
||||||
|
{
|
||||||
|
Animations = new Dictionary<UUID, int>();
|
||||||
|
AnimationsNames = new Dictionary<UUID, string>();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
int count = (int)Utils.BytesToUInt16(data, 0);
|
||||||
|
if(count == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
Animations = new Dictionary<UUID, int>(count);
|
||||||
|
AnimationsNames = new Dictionary<UUID, string>(count);
|
||||||
|
int pos = 2;
|
||||||
|
while(--count >= 0)
|
||||||
|
{
|
||||||
|
UUID id = new UUID(data, pos);
|
||||||
|
if(id == UUID.Zero)
|
||||||
|
break;
|
||||||
|
pos += 16;
|
||||||
|
int strlen = data[pos++];
|
||||||
|
string name = UTF8Encoding.UTF8.GetString(data, pos, strlen);
|
||||||
|
if(string.IsNullOrEmpty(name))
|
||||||
|
break;
|
||||||
|
pos += strlen;
|
||||||
|
Animations[id] = NextObjectAnimationSequenceNumber;
|
||||||
|
AnimationsNames[id] = name;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
catch { }
|
||||||
|
|
||||||
|
Animations = null;
|
||||||
|
AnimationsNames = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue