From f60bc970eb925cd245cc77b1ae700b28d4589163 Mon Sep 17 00:00:00 2001 From: MW Date: Thu, 8 Mar 2007 13:21:24 +0000 Subject: Another attemp to fix the Session Logout bug World map data is now saved in database and recovered on startup. Primitives are now backed up to a local database and reloaded on startup. --- src/Config/SimConfig/Db4SimConfig.cs | 19 +++- src/Config/SimConfig/SimConfig.csproj | 4 + src/GridInterfaces/GridInterfaces.csproj | 1 + src/GridInterfaces/ILocalStorage.cs | 87 +++++++++++++++ src/LocalStorage/Db4LocalStorage/AssemblyInfo.cs | 31 ++++++ .../Db4LocalStorage/Db4LocalStorage.cs | 119 +++++++++++++++++++++ .../Db4LocalStorage/Db4LocalStorage.csproj | 53 +++++++++ .../Db4LocalStorage/Db4LocalStorage.sln | 7 ++ src/Main.cs | 5 + src/OpenSimClient.cs | 1 + src/OpenSimConsole.cs | 7 +- src/RemoteServers/RemoteGridServers/RemoteGrid.cs | 2 +- src/Second-server.sln | 10 ++ src/world/Entity.cs | 5 + src/world/Primitive.cs | 110 ++++++++++++++----- src/world/World.cs | 115 ++++++++++++++++---- 16 files changed, 524 insertions(+), 52 deletions(-) create mode 100644 src/GridInterfaces/ILocalStorage.cs create mode 100644 src/LocalStorage/Db4LocalStorage/AssemblyInfo.cs create mode 100644 src/LocalStorage/Db4LocalStorage/Db4LocalStorage.cs create mode 100644 src/LocalStorage/Db4LocalStorage/Db4LocalStorage.csproj create mode 100644 src/LocalStorage/Db4LocalStorage/Db4LocalStorage.sln diff --git a/src/Config/SimConfig/Db4SimConfig.cs b/src/Config/SimConfig/Db4SimConfig.cs index cc31328..4a06187 100644 --- a/src/Config/SimConfig/Db4SimConfig.cs +++ b/src/Config/SimConfig/Db4SimConfig.cs @@ -111,16 +111,19 @@ namespace Db40SimConfig ServerConsole.MainConsole.Instance.WriteLine("Config.cs:LoadWorld() - Loading world...."); World blank = new World(); ServerConsole.MainConsole.Instance.WriteLine("Config.cs:LoadWorld() - Looking for a heightmap in local DB"); - IObjectSet world_result = db.Get(new float[65536]); + IObjectSet world_result = db.Get(typeof(MapStorage)); if(world_result.Count>0) { ServerConsole.MainConsole.Instance.WriteLine("Config.cs:LoadWorld() - Found a heightmap in local database, loading"); - blank.LandMap=(float[])world_result.Next(); + MapStorage map=(MapStorage)world_result.Next(); + blank.LandMap = map.Map; } else { ServerConsole.MainConsole.Instance.WriteLine("Config.cs:LoadWorld() - No heightmap found, generating new one"); HeightmapGenHills hills = new HeightmapGenHills(); blank.LandMap = hills.GenerateHeightmap(200, 4.0f, 80.0f, false); ServerConsole.MainConsole.Instance.WriteLine("Config.cs:LoadWorld() - Saving heightmap to local database"); - db.Set(blank.LandMap); + MapStorage map= new MapStorage(); + map.Map = blank.LandMap; + db.Set(map); db.Commit(); } return blank; @@ -143,4 +146,14 @@ namespace Db40SimConfig db.Close(); } } + + public class MapStorage + { + public float[] Map; + + public MapStorage() + { + + } + } } diff --git a/src/Config/SimConfig/SimConfig.csproj b/src/Config/SimConfig/SimConfig.csproj index 08f0f24..3131405 100644 --- a/src/Config/SimConfig/SimConfig.csproj +++ b/src/Config/SimConfig/SimConfig.csproj @@ -44,6 +44,10 @@ {132A6E3E-8F2D-4BF5-BDFB-8555F53F334E} Second-server + + {5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9} + GridInterfaces + \ No newline at end of file diff --git a/src/GridInterfaces/GridInterfaces.csproj b/src/GridInterfaces/GridInterfaces.csproj index 3284e7f..bbdc9e9 100644 --- a/src/GridInterfaces/GridInterfaces.csproj +++ b/src/GridInterfaces/GridInterfaces.csproj @@ -35,6 +35,7 @@ + \ No newline at end of file diff --git a/src/GridInterfaces/ILocalStorage.cs b/src/GridInterfaces/ILocalStorage.cs new file mode 100644 index 0000000..5d6b9b1 --- /dev/null +++ b/src/GridInterfaces/ILocalStorage.cs @@ -0,0 +1,87 @@ +/* +* Copyright (c) OpenSim project, http://sim.opensecondlife.org/ +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ + +using System; +using libsecondlife; + +namespace GridInterfaces +{ + /// + /// ILocalStorage. Really hacked together right now needs cleaning up + /// + public interface ILocalStorage + { + void StorePrim(PrimStorage prim); + void RemovePrim(LLUUID primID); + void LoadPrimitives(ILocalStorageReceiver receiver); + void ShutDown(); + } + + public interface ILocalStorageReceiver + { + void PrimFromStorage(PrimStorage prim); + } + + public class PrimStorage + { + public PrimData Data; + public LLVector3 Position; + public LLQuaternion Rotation; + public uint LocalID; + public LLUUID FullID; + + public PrimStorage() + { + + } + + } + public class PrimData + { + public LLUUID OwnerID; + public byte PCode; + public byte PathBegin; + public byte PathEnd; + public byte PathScaleX; + public byte PathScaleY; + public byte PathShearX; + public byte PathShearY; + public sbyte PathSkew; + public byte ProfileBegin; + public byte ProfileEnd; + public LLVector3 Scale; + public byte PathCurve; + public byte ProfileCurve; + public uint ParentID=0; + public byte ProfileHollow; + + public PrimData() + { + + } + } +} diff --git a/src/LocalStorage/Db4LocalStorage/AssemblyInfo.cs b/src/LocalStorage/Db4LocalStorage/AssemblyInfo.cs new file mode 100644 index 0000000..6610606 --- /dev/null +++ b/src/LocalStorage/Db4LocalStorage/AssemblyInfo.cs @@ -0,0 +1,31 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Information about this assembly is defined by the following +// attributes. +// +// change them to the information which is associated with the assembly +// you compile. + +[assembly: AssemblyTitle("Db4LocalStorage")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Db4LocalStorage")] +[assembly: AssemblyCopyright("")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// This sets the default COM visibility of types in the assembly to invisible. +// If you need to expose a type to COM, use [ComVisible(true)] on that type. +[assembly: ComVisible(false)] + +// The assembly version has following format : +// +// Major.Minor.Build.Revision +// +// You can specify all values by your own or you can build default build and revision +// numbers with the '*' character (the default): + +[assembly: AssemblyVersion("1.0.*")] diff --git a/src/LocalStorage/Db4LocalStorage/Db4LocalStorage.cs b/src/LocalStorage/Db4LocalStorage/Db4LocalStorage.cs new file mode 100644 index 0000000..9dc81a1 --- /dev/null +++ b/src/LocalStorage/Db4LocalStorage/Db4LocalStorage.cs @@ -0,0 +1,119 @@ +/* +* Copyright (c) OpenSim project, http://sim.opensecondlife.org/ +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* * Redistributions of source code must retain the above copyright +* notice, this list of conditions and the following disclaimer. +* * Redistributions in binary form must reproduce the above copyright +* notice, this list of conditions and the following disclaimer in the +* documentation and/or other materials provided with the distribution. +* * Neither the name of the nor the +* names of its contributors may be used to endorse or promote products +* derived from this software without specific prior written permission. +* +* THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY +* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +* DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY +* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +* +*/ +using System; +using System.Collections.Generic; +using Db4objects.Db4o; +using Db4objects.Db4o.Query; +using libsecondlife; +using GridInterfaces; + +namespace Db4LocalStorage +{ + /// + /// + /// + public class Db4LocalStorage : ILocalStorage + { + private IObjectContainer db; + + public Db4LocalStorage() + { + try + { + db = Db4oFactory.OpenFile("localworld.yap"); + ServerConsole.MainConsole.Instance.WriteLine("Db4LocalStorage creation"); + } + catch(Exception e) + { + db.Close(); + ServerConsole.MainConsole.Instance.WriteLine("Db4LocalStorage :Constructor - Exception occured"); + ServerConsole.MainConsole.Instance.WriteLine(e.ToString()); + } + } + + public void StorePrim(PrimStorage prim) + { + IObjectSet result = db.Query(new UUIDQuery(prim.FullID)); + if(result.Count>0) + { + //prim already in storage + //so update it + PrimStorage found = (PrimStorage) result.Next(); + found.Data = prim.Data; + found.Position = prim.Position; + found.Rotation = prim.Rotation; + db.Set(found); + } + else + { + //not in storage + db.Set(prim); + } + } + + public void RemovePrim(LLUUID primID) + { + IObjectSet result = db.Query(new UUIDQuery(primID)); + if(result.Count>0) + { + PrimStorage found = (PrimStorage) result.Next(); + db.Delete(found); + } + } + + + public void LoadPrimitives(ILocalStorageReceiver receiver) + { + IObjectSet result = db.Get(typeof(PrimStorage)); + ServerConsole.MainConsole.Instance.WriteLine("Db4LocalStorage.cs: LoadPrimitives() - number of prims in storages is "+result.Count); + foreach (PrimStorage prim in result) { + receiver.PrimFromStorage(prim); + } + } + + public void ShutDown() + { + db.Commit(); + db.Close(); + } + } + + public class UUIDQuery : Predicate + { + private LLUUID _findID; + + public UUIDQuery(LLUUID find) + { + _findID = find; + } + public bool Match(PrimStorage prim) + { + return (prim.FullID == _findID); + } + } + +} diff --git a/src/LocalStorage/Db4LocalStorage/Db4LocalStorage.csproj b/src/LocalStorage/Db4LocalStorage/Db4LocalStorage.csproj new file mode 100644 index 0000000..9b5c487 --- /dev/null +++ b/src/LocalStorage/Db4LocalStorage/Db4LocalStorage.csproj @@ -0,0 +1,53 @@ + + + Library + Db4LocalStorage + Db4LocalStorage + Debug + AnyCPU + {74784F23-B0FD-484C-82C1-96C0215733DC} + + + bin\Debug\ + False + DEBUG;TRACE + True + Full + True + + + bin\Release\ + True + TRACE + False + None + False + + + + + + ..\..\..\bin\Db4objects.Db4o.dll + False + + + ..\..\..\..\..\..\..\Libsecond-dailys\libsl07-03\trunk\libsecondlife-cs\obj\Debug\libsecondlife.dll + False + + + + + + + + + {5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9} + GridInterfaces + + + {C9A6026D-8E0C-4FE4-8691-FB2A566AA245} + ServerConsole + + + + \ No newline at end of file diff --git a/src/LocalStorage/Db4LocalStorage/Db4LocalStorage.sln b/src/LocalStorage/Db4LocalStorage/Db4LocalStorage.sln new file mode 100644 index 0000000..89e4710 --- /dev/null +++ b/src/LocalStorage/Db4LocalStorage/Db4LocalStorage.sln @@ -0,0 +1,7 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# SharpDevelop 2.1.0.2017 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4LocalStorage", "Db4LocalStorage.csproj", "{74784F23-B0FD-484C-82C1-96C0215733DC}" +EndProject +Global +EndGlobal diff --git a/src/Main.cs b/src/Main.cs index 4fc7d54..600ce38 100644 --- a/src/Main.cs +++ b/src/Main.cs @@ -150,9 +150,13 @@ namespace OpenSim ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - Starting up messaging system"); local_world.PhysScene = this.physManager.GetPhysicsScene("PhysX"); //should be reading from the config file what physics engine to use local_world.PhysScene.SetTerrain(local_world.LandMap); + OpenSim_Main.gridServers.AssetServer.SetServerInfo(OpenSim_Main.cfg.AssetURL, OpenSim_Main.cfg.AssetSendKey); OpenSim_Main.gridServers.GridServer.SetServerInfo(OpenSim_Main.cfg.GridURL, OpenSim_Main.cfg.GridSendKey); + local_world.LoadStorageDLL("Db4LocalStorage.dll"); //all these dll names shouldn't be hard coded. + local_world.LoadPrimsFromStorage(); + MainServerListener(); } @@ -230,6 +234,7 @@ namespace OpenSim ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Shutdown() - Killing clients"); // IMPLEMENT THIS ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Shutdown() - Closing console and terminating"); + OpenSim_Main.local_world.Close(); ServerConsole.MainConsole.Instance.Close(); Environment.Exit(0); } diff --git a/src/OpenSimClient.cs b/src/OpenSimClient.cs index 9544e7b..1f9c70c 100644 --- a/src/OpenSimClient.cs +++ b/src/OpenSimClient.cs @@ -99,6 +99,7 @@ namespace OpenSim client.ClientAvatar.SendAppearanceToOtherAgent(this); } } + OpenSim_Main.local_world.GetInitialPrims(this); break; case PacketType.ObjectAdd: OpenSim_Main.local_world.AddNewPrim((ObjectAddPacket)Pack, this); diff --git a/src/OpenSimConsole.cs b/src/OpenSimConsole.cs index 7d8563f..80f36af 100644 --- a/src/OpenSimConsole.cs +++ b/src/OpenSimConsole.cs @@ -169,8 +169,11 @@ namespace OpenSim OpenSim.world.Avatar TempAv; this.WriteLine(String.Format("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16},{5,-16}","Firstname", "Lastname","Agent ID", "Session ID", "Circuit", "IP")); foreach (libsecondlife.LLUUID UUID in OpenSim_Main.local_world.Entities.Keys) { - TempAv=(OpenSim.world.Avatar)OpenSim_Main.local_world.Entities[UUID]; - this.WriteLine(String.Format("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16},{5,-16}",TempAv.firstname, TempAv.lastname,UUID, TempAv.ControllingClient.SessionID, TempAv.ControllingClient.CircuitCode, TempAv.ControllingClient.userEP.ToString())); + if(OpenSim_Main.local_world.Entities[UUID].ToString()== "OpenSim.world.Avatar") + { + TempAv=(OpenSim.world.Avatar)OpenSim_Main.local_world.Entities[UUID]; + this.WriteLine(String.Format("{0,-16}{1,-16}{2,-25}{3,-25}{4,-16},{5,-16}",TempAv.firstname, TempAv.lastname,UUID, TempAv.ControllingClient.SessionID, TempAv.ControllingClient.CircuitCode, TempAv.ControllingClient.userEP.ToString())); + } } break; } diff --git a/src/RemoteServers/RemoteGridServers/RemoteGrid.cs b/src/RemoteServers/RemoteGridServers/RemoteGrid.cs index f7c33e8..428d5f5 100644 --- a/src/RemoteServers/RemoteGridServers/RemoteGrid.cs +++ b/src/RemoteServers/RemoteGridServers/RemoteGrid.cs @@ -111,7 +111,7 @@ namespace RemoteGridServers public bool LogoutSession(LLUUID sessionID, LLUUID agentID, uint circuitCode) { - WebRequest DeleteSession = WebRequest.Create(GridServerUrl + "/usersessions/" + GridSendKey + "/" + agentID.ToString() + circuitCode.ToString() + "/delete"); + WebRequest DeleteSession = WebRequest.Create(GridServerUrl + "/usersessions/" + GridSendKey + "/" + agentID.ToString() + "/" + circuitCode.ToString() + "/delete"); WebResponse GridResponse = DeleteSession.GetResponse(); StreamReader sr = new StreamReader(GridResponse.GetResponseStream()); String grTest = sr.ReadLine(); diff --git a/src/Second-server.sln b/src/Second-server.sln index 96755ee..a460b2a 100644 --- a/src/Second-server.sln +++ b/src/Second-server.sln @@ -17,6 +17,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PhysXplugin", "physics\plug EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ServerConsole", "ServerConsole\ServerConsole\ServerConsole.csproj", "{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Db4LocalStorage", "LocalStorage\Db4LocalStorage\Db4LocalStorage.csproj", "{74784F23-B0FD-484C-82C1-96C0215733DC}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|.NET 1.1 = Debug|.NET 1.1 @@ -89,6 +91,14 @@ Global {C9A6026D-8E0C-4FE4-8691-FB2A566AA245}.Release|.NET 1.1.ActiveCfg = Release|.NET 1.1 {C9A6026D-8E0C-4FE4-8691-FB2A566AA245}.Release|Any CPU.Build.0 = Release|Any CPU {C9A6026D-8E0C-4FE4-8691-FB2A566AA245}.Release|Any CPU.ActiveCfg = Release|Any CPU + {74784F23-B0FD-484C-82C1-96C0215733DC}.Debug|.NET 1.1.Build.0 = Debug|.NET 1.1 + {74784F23-B0FD-484C-82C1-96C0215733DC}.Debug|.NET 1.1.ActiveCfg = Debug|.NET 1.1 + {74784F23-B0FD-484C-82C1-96C0215733DC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {74784F23-B0FD-484C-82C1-96C0215733DC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {74784F23-B0FD-484C-82C1-96C0215733DC}.Release|.NET 1.1.Build.0 = Release|.NET 1.1 + {74784F23-B0FD-484C-82C1-96C0215733DC}.Release|.NET 1.1.ActiveCfg = Release|.NET 1.1 + {74784F23-B0FD-484C-82C1-96C0215733DC}.Release|Any CPU.Build.0 = Release|Any CPU + {74784F23-B0FD-484C-82C1-96C0215733DC}.Release|Any CPU.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/world/Entity.cs b/src/world/Entity.cs index 147478b..ee4b2e4 100644 --- a/src/world/Entity.cs +++ b/src/world/Entity.cs @@ -58,5 +58,10 @@ namespace OpenSim.world return mesh; } + + public virtual void BackUp() + { + + } } } diff --git a/src/world/Primitive.cs b/src/world/Primitive.cs index 1fb7142..6029f76 100644 --- a/src/world/Primitive.cs +++ b/src/world/Primitive.cs @@ -4,6 +4,7 @@ using System.Text; using OpenSim.types; using libsecondlife; using libsecondlife.Packets; +using GridInterfaces; namespace OpenSim.world { @@ -15,7 +16,7 @@ namespace OpenSim.world protected bool newPrimFlag; protected bool updateFlag; protected ObjectUpdatePacket OurPacket; - + public bool UpdateFlag { get @@ -69,6 +70,14 @@ namespace OpenSim.world } this.updateFlag = false; } + + } + + public void UpdateClient(OpenSimClient RemoteClient) + { + byte[] pb = this.position.GetBytes(); + Array.Copy(pb, 0, OurPacket.ObjectData[0].ObjectData, 0, pb.Length); + RemoteClient.OutPacket(OurPacket); } public void CreateFromPacket( ObjectAddPacket addPacket, LLUUID agentID, uint localID) @@ -118,8 +127,7 @@ namespace OpenSim.world //finish off copying rest of shape data objupdate.ObjectData[0].ID = (uint)(localID); - objupdate.ObjectData[0].FullID = new LLUUID("edba7151-5857-acc5-b30b-f01efefda" + (localID- 702000).ToString("000")); - + objupdate.ObjectData[0].FullID = new LLUUID("edba7151-5857-acc5-b30b-f01efef" + (localID- 702000).ToString("00000")); objupdate.ObjectData[0].ObjectData = new byte[60]; objupdate.ObjectData[0].ObjectData[46] = 128; objupdate.ObjectData[0].ObjectData[47] = 63; @@ -135,6 +143,67 @@ namespace OpenSim.world this.OurPacket = objupdate; } + public void CreateFromStorage(PrimStorage store) + { + //need to clean this up as it shares a lot of code with CreateFromPacket() + ObjectUpdatePacket objupdate = new ObjectUpdatePacket(); + objupdate.RegionData.RegionHandle = OpenSim_Main.cfg.RegionHandle; + objupdate.RegionData.TimeDilation = 64096; + objupdate.ObjectData = new libsecondlife.Packets.ObjectUpdatePacket.ObjectDataBlock[1]; + + this.primData = store.Data; + objupdate.ObjectData[0] = new ObjectUpdatePacket.ObjectDataBlock(); + objupdate.ObjectData[0].PSBlock = new byte[0]; + objupdate.ObjectData[0].ExtraParams = new byte[1]; + objupdate.ObjectData[0].MediaURL = new byte[0]; + objupdate.ObjectData[0].NameValue = new byte[0]; + objupdate.ObjectData[0].PSBlock = new byte[0]; + objupdate.ObjectData[0].Text = new byte[0]; + objupdate.ObjectData[0].TextColor = new byte[4]; + objupdate.ObjectData[0].JointAxisOrAnchor = new LLVector3(0,0,0); + objupdate.ObjectData[0].JointPivot = new LLVector3(0,0,0); + objupdate.ObjectData[0].Material = 3; + objupdate.ObjectData[0].UpdateFlags=32+65536+131072+256+4+8+2048+524288+268435456; + objupdate.ObjectData[0].TextureAnim = new byte[0]; + objupdate.ObjectData[0].Sound = LLUUID.Zero; + LLObject.TextureEntry ntex = new LLObject.TextureEntry(new LLUUID("00000000-0000-0000-5005-000000000005")); + objupdate.ObjectData[0].TextureEntry = ntex.ToBytes(); + objupdate.ObjectData[0].State = 0; + objupdate.ObjectData[0].Data = new byte[0]; + objupdate.ObjectData[0].OwnerID = this.primData.OwnerID; + objupdate.ObjectData[0].PCode = this.primData.PCode; + objupdate.ObjectData[0].PathBegin = this.primData.PathBegin; + objupdate.ObjectData[0].PathEnd = this.primData.PathEnd; + objupdate.ObjectData[0].PathScaleX = this.primData.PathScaleX; + objupdate.ObjectData[0].PathScaleY = this.primData.PathScaleY; + objupdate.ObjectData[0].PathShearX = this.primData.PathShearX; + objupdate.ObjectData[0].PathShearY = this.primData.PathShearY; + objupdate.ObjectData[0].PathSkew = this.primData.PathSkew; + objupdate.ObjectData[0].ProfileBegin = this.primData.ProfileBegin; + objupdate.ObjectData[0].ProfileEnd = this.primData.ProfileEnd; + objupdate.ObjectData[0].Scale = this.primData.Scale; + objupdate.ObjectData[0].PathCurve = this.primData.PathCurve; + objupdate.ObjectData[0].ProfileCurve = this.primData.ProfileCurve; + objupdate.ObjectData[0].ParentID = 0; + objupdate.ObjectData[0].ProfileHollow = this.primData.ProfileHollow; + //finish off copying rest of shape data + + objupdate.ObjectData[0].ID = (uint)store.LocalID; + objupdate.ObjectData[0].FullID = store.FullID; + + objupdate.ObjectData[0].ObjectData = new byte[60]; + objupdate.ObjectData[0].ObjectData[46] = 128; + objupdate.ObjectData[0].ObjectData[47] = 63; + LLVector3 pos1= store.Position; + //update position + byte[] pb = pos1.GetBytes(); + Array.Copy(pb, 0, objupdate.ObjectData[0].ObjectData, 0, pb.Length); + + this.uuid = objupdate.ObjectData[0].FullID; + this.localid = objupdate.ObjectData[0].ID; + this.position = pos1; + this.OurPacket = objupdate; + } public ImprovedTerseObjectUpdatePacket.ObjectDataBlock CreateImprovedBlock() { uint ID = this.localid; @@ -200,30 +269,17 @@ namespace OpenSim.world dat.Data=bytes; return dat; } + + public override void BackUp() + { + PrimStorage pStore = new PrimStorage(); + pStore.Data = this.primData; + pStore.FullID = this.uuid; + pStore.LocalID = this.localid; + pStore.Position = this.position; + pStore.Rotation = new LLQuaternion(this.rotation.x, this.rotation.y, this.rotation.z , this.rotation.w); + OpenSim_Main.local_world.localStorage.StorePrim(pStore); + } } - public class PrimData - { - public LLUUID OwnerID; - public byte PCode; - public byte PathBegin; - public byte PathEnd; - public byte PathScaleX; - public byte PathScaleY; - public byte PathShearX; - public byte PathShearY; - public sbyte PathSkew; - public byte ProfileBegin; - public byte ProfileEnd; - public LLVector3 Scale; - public byte PathCurve; - public byte ProfileCurve; - public uint ParentID=0; - public byte ProfileHollow; - - public PrimData() - { - - } - } } diff --git a/src/world/World.cs b/src/world/World.cs index f6f58c7..6be9dd2 100644 --- a/src/world/World.cs +++ b/src/world/World.cs @@ -3,12 +3,14 @@ using libsecondlife; using libsecondlife.Packets; using System.Collections.Generic; using System.Text; +using System.Reflection; using System.IO; using PhysicsSystem; +using GridInterfaces; namespace OpenSim.world { - public class World + public class World : ILocalStorageReceiver { public Dictionary Entities; public float[] LandMap; @@ -17,9 +19,10 @@ namespace OpenSim.world private PhysicsScene phyScene; private float timeStep= 0.1f; private libsecondlife.TerrainManager TerrainManager; - + public ILocalStorage localStorage; private Random Rand = new Random(); private uint _primCount = 702000; + private int storageCount; public World() { @@ -48,8 +51,7 @@ namespace OpenSim.world public void Update() { - - if(this.phyScene.IsThreaded) + if(this.phyScene.IsThreaded) { this.phyScene.GetResults(); @@ -66,24 +68,95 @@ namespace OpenSim.world { Entities[UUID].update(); } + + //backup world data + this.storageCount++; + if(storageCount> 1200) //set to how often you want to backup (currently set for about every 2 minutes) + { + this.Backup(); + storageCount =0; + } } + public bool LoadStorageDLL(string dllName) + { + Assembly pluginAssembly = Assembly.LoadFrom(dllName); + ILocalStorage store = null; + + foreach (Type pluginType in pluginAssembly.GetTypes()) + { + if (pluginType.IsPublic) + { + if (!pluginType.IsAbstract) + { + Type typeInterface = pluginType.GetInterface("ILocalStorage", true); + + if (typeInterface != null) + { + ILocalStorage plug = (ILocalStorage)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString())); + store = plug; + break; + } + + typeInterface = null; + } + } + } + pluginAssembly = null; + this.localStorage = store; + return(store == null); + } + + public void LoadPrimsFromStorage() + { + ServerConsole.MainConsole.Instance.WriteLine("World.cs: LoadPrimsFromStorage() - Loading primitives"); + this.localStorage.LoadPrimitives(this); + } + + public void PrimFromStorage(PrimStorage prim) + { + if(prim.LocalID >= this._primCount) + { + _primCount = prim.LocalID + 1; + } + ServerConsole.MainConsole.Instance.WriteLine("World.cs: PrimFromStorage() - Reloading prim (localId "+ prim.LocalID+ " ) from storage"); + Primitive nPrim = new Primitive(); + nPrim.CreateFromStorage(prim); + this.Entities.Add(nPrim.uuid, nPrim); + } + + public void Close() + { + this.localStorage.ShutDown(); + } + public void SendLayerData(OpenSimClient RemoteClient) { int[] patches = new int[4]; - for (int y = 0; y < 16; y++) - { - for (int x = 0; x < 16; x = x + 4) - { - patches[0] = x + 0 + y * 16; - patches[1] = x + 1 + y * 16; - patches[2] = x + 2 + y * 16; - patches[3] = x + 3 + y * 16; + for (int y = 0; y < 16; y++) + { + for (int x = 0; x < 16; x = x + 4) + { + patches[0] = x + 0 + y * 16; + patches[1] = x + 1 + y * 16; + patches[2] = x + 2 + y * 16; + patches[3] = x + 3 + y * 16; - Packet layerpack = TerrainManager.CreateLandPacket(LandMap, patches); - RemoteClient.OutPacket(layerpack); - } - } + Packet layerpack = TerrainManager.CreateLandPacket(LandMap, patches); + RemoteClient.OutPacket(layerpack); + } + } + } + + public void GetInitialPrims(OpenSimClient RemoteClient) + { + foreach (libsecondlife.LLUUID UUID in Entities.Keys) + { + if(Entities[UUID].ToString()== "OpenSim.world.Primitive") + { + ((OpenSim.world.Primitive)Entities[UUID]).UpdateClient(RemoteClient); + } + } } public void AddViewerAgent(OpenSimClient AgentClient) { @@ -96,7 +169,7 @@ namespace OpenSim.world NewAvatar.PhysActor = this.phyScene.AddAvatar(new PhysicsVector(NewAvatar.position.X, NewAvatar.position.Y, NewAvatar.position.Z)); //this.Update(); // will work for now, but needs to be optimised so we don't update everything in the sim for each new user this.Entities.Add(AgentClient.AgentID, NewAvatar); - } + } public void AddNewPrim(ObjectAddPacket addPacket, OpenSimClient AgentClient) { @@ -109,8 +182,12 @@ namespace OpenSim.world public bool Backup() { /* TODO: Save the current world entities state. */ - - return false; + ServerConsole.MainConsole.Instance.WriteLine("World.cs: Backup() - Backing up Primitives"); + foreach (libsecondlife.LLUUID UUID in Entities.Keys) + { + Entities[UUID].BackUp(); + } + return true; } } -- cgit v1.1