Can now switch physics on and off on each prim (currently only works when using PhysX plugin and still needs more testing)
Users can now have a inventory and in sandbox mode each user is given a couple of test textures (note: should change the actual textures to better ones soon) Can now change the texture on the prims. Added a Local Asset server (a DB4o database) (although currently new created assets aren't backed up into it)physics-inventorytesting
commit
a84b9a318b
|
@ -0,0 +1,105 @@
|
|||
LLWearable version 22
|
||||
Female Shape and Outfit 3 Shape
|
||||
Created by system from avatar's appearance.
|
||||
permissions 0
|
||||
{
|
||||
base_mask 00082000
|
||||
owner_mask 00082000
|
||||
group_mask 00082000
|
||||
everyone_mask 00082000
|
||||
next_owner_mask 00082000
|
||||
creator_id 3d924400-038e-6ad9-920b-cfbb9b40585c
|
||||
owner_id 542ffb8e-8932-49b9-8664-58f53e442797
|
||||
last_owner_id 3d924400-038e-6ad9-920b-cfbb9b40585c
|
||||
group_id 00000000-0000-0000-0000-000000000000
|
||||
}
|
||||
sale_info 0
|
||||
{
|
||||
sale_type not
|
||||
sale_price 0
|
||||
}
|
||||
type 0
|
||||
parameters 82
|
||||
1 .21
|
||||
2 -.5
|
||||
4 -.11
|
||||
5 -.1
|
||||
6 -.3
|
||||
7 -.4
|
||||
8 -.5
|
||||
10 .7
|
||||
11 .34
|
||||
12 -.5
|
||||
13 0
|
||||
14 .04
|
||||
15 .58
|
||||
17 .56
|
||||
18 -.26
|
||||
19 -.73
|
||||
20 -.34
|
||||
21 -.01
|
||||
22 1
|
||||
23 -.5
|
||||
24 -.63
|
||||
25 .44
|
||||
27 .05
|
||||
33 -.24
|
||||
34 -.7
|
||||
35 -.16
|
||||
36 -.2
|
||||
37 -.98
|
||||
38 -.5
|
||||
80 0
|
||||
105 .07
|
||||
155 -.22
|
||||
157 0
|
||||
185 -1
|
||||
193 .86
|
||||
196 -.74
|
||||
505 .65
|
||||
506 .12
|
||||
507 -1.5
|
||||
515 0
|
||||
517 .16
|
||||
518 .8
|
||||
629 0
|
||||
637 0
|
||||
646 .4
|
||||
647 1
|
||||
649 .36
|
||||
650 .85
|
||||
652 .49
|
||||
653 -1
|
||||
656 0
|
||||
659 .65
|
||||
662 .5
|
||||
663 0
|
||||
664 0
|
||||
665 0
|
||||
675 -.15
|
||||
676 .26
|
||||
678 .28
|
||||
682 .27
|
||||
683 -.19
|
||||
684 -.09
|
||||
685 0
|
||||
690 .45
|
||||
692 .4
|
||||
693 -0
|
||||
753 -.5
|
||||
756 -.08
|
||||
758 .24
|
||||
759 .6
|
||||
760 .11
|
||||
764 -.38
|
||||
765 -.3
|
||||
769 .42
|
||||
773 .51
|
||||
795 .16
|
||||
796 .11
|
||||
799 .36
|
||||
841 0
|
||||
842 -.82
|
||||
879 0
|
||||
880 0
|
||||
textures 0
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
|
@ -0,0 +1,9 @@
|
|||
#!/bin/bash
|
||||
|
||||
MAJOR=0
|
||||
MINOR=1
|
||||
BUILD=`date +%s`
|
||||
REVISION=`svnversion | sed s/:// | sed s/M//`
|
||||
REALREVISION=`svnversion`
|
||||
cat src/VersionInfo.cs.template | sed s/@@VERSION/"$MAJOR.$MINOR, Build $BUILD, Revision $REALREVISION"/g >src/VersionInfo.cs
|
||||
echo -n $MAJOR.$MINOR.*.$REVISION >VERSION
|
|
@ -0,0 +1,80 @@
|
|||
<?xml version="1.0"?>
|
||||
<project name="OpenSim" default="build" basedir=".">
|
||||
<description>nant buildfile for OpenSim</description>
|
||||
<property name="debug" value="true" overwrite="false" />
|
||||
<target name="clean" description="remove all generated files">
|
||||
<delete file="bin/OpenSim.exe" failonerror="false" />
|
||||
<delete file="bin/OpenSim.pdb" failonerror="false" />
|
||||
</target>
|
||||
|
||||
<target name="svnupdate" description="updates to latest SVN">
|
||||
<exec program="svn">
|
||||
<arg value="update" />
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
<target name="upgrade" description="updates from SVN and then builds" depends="clean,svnupdate,build">
|
||||
|
||||
</target>
|
||||
|
||||
<target name="build" description="compiles the source code">
|
||||
|
||||
<exec program="genvers.sh" />
|
||||
<loadfile file="VERSION" property="svnver"/>
|
||||
|
||||
<asminfo output="src/AssemblyInfo.cs" language="CSharp">
|
||||
<imports>
|
||||
<import namespace="System" />
|
||||
<import namespace="System.Reflection" />
|
||||
<import namespace="System.Runtime.InteropServices" />
|
||||
</imports>
|
||||
<attributes>
|
||||
<attribute type="ComVisibleAttribute" value="false" />
|
||||
<attribute type="CLSCompliantAttribute" value="false" />
|
||||
<attribute type="AssemblyVersionAttribute" value="${svnver}" />
|
||||
<attribute type="AssemblyTitleAttribute" value="opensim" />
|
||||
<attribute type="AssemblyDescriptionAttribute" value="The C# implementation of the simulator portion of OGS" />
|
||||
<attribute type="AssemblyCopyrightAttribute" value="Copyright © OGS development team 2007"/>
|
||||
</attributes>
|
||||
</asminfo>
|
||||
|
||||
<nant>
|
||||
<buildfiles>
|
||||
<include name="src/GridInterfaces/default.build" />
|
||||
<include name="src/ServerConsole/default.build" />
|
||||
<include name="src/LocalServers/default.build" />
|
||||
<include name="src/RemoteServers/default.build" />
|
||||
<include name="src/physics/default.build" />
|
||||
<include name="src/physics/plugins/default.build" />
|
||||
</buildfiles>
|
||||
</nant>
|
||||
|
||||
<csc target="exe" output="bin/OpenSim.exe" debug="${debug}" verbose="true" warninglevel="4">
|
||||
<references basedir="bin/" failonempty="true">
|
||||
<include name="System" />
|
||||
<include name="System.Data" />
|
||||
<include name="System.Xml" />
|
||||
<include name="Axiom.MathLib.dll" />
|
||||
<include name="libsecondlife.dll" />
|
||||
<include name="log4net.dll" />
|
||||
<include name="Db4objects.Db4o.dll" />
|
||||
<include name="ServerConsole.dll" />
|
||||
<include name="GridInterfaces.dll" />
|
||||
<include name="PhysicsManager.dll" />
|
||||
</references>
|
||||
<sources basedir="src/">
|
||||
<include name="*.cs" />
|
||||
<include name="types/*.cs" />
|
||||
<include name="world/*.cs" />
|
||||
<include name="GridServers/*.cs" />
|
||||
<include name="Assets/*.cs" />
|
||||
</sources>
|
||||
</csc>
|
||||
|
||||
<nant>
|
||||
<buildfiles>
|
||||
<include name="src/Config/default.build" />
|
||||
</buildfiles>
|
||||
</nant>
|
||||
</target>
|
||||
</project>
|
|
@ -0,0 +1,555 @@
|
|||
/*
|
||||
* 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 <organization> 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 <copyright holder> ``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 <copyright holder> 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 System.Threading;
|
||||
using libsecondlife;
|
||||
using libsecondlife.Packets;
|
||||
using OpenSim;
|
||||
using OpenSim.GridServers;
|
||||
|
||||
namespace OpenSim.Assets
|
||||
{
|
||||
/// <summary>
|
||||
/// Manages local cache of assets and their sending to viewers.
|
||||
/// </summary>
|
||||
public class AssetCache : IAssetReceiver
|
||||
{
|
||||
public Dictionary<libsecondlife.LLUUID, AssetInfo> Assets;
|
||||
public Dictionary<libsecondlife.LLUUID, TextureImage> Textures;
|
||||
|
||||
public List<AssetRequest> AssetRequests = new List<AssetRequest>(); //assets ready to be sent to viewers
|
||||
public List<AssetRequest> TextureRequests = new List<AssetRequest>(); //textures ready to be sent
|
||||
|
||||
public Dictionary<LLUUID, AssetRequest> RequestedAssets = new Dictionary<LLUUID, AssetRequest>(); //Assets requested from the asset server
|
||||
public Dictionary<LLUUID, AssetRequest> RequestedTextures = new Dictionary<LLUUID, AssetRequest>(); //Textures requested from the asset server
|
||||
|
||||
private Dictionary<libsecondlife.LLUUID, AssetBase> IncomingAssets;
|
||||
|
||||
private IAssetServer _assetServer;
|
||||
private Thread _assetCacheThread;
|
||||
private LLUUID[] textureList = new LLUUID[2];
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public AssetCache( IAssetServer assetServer)
|
||||
{
|
||||
Console.WriteLine("Creating Asset cache");
|
||||
_assetServer = assetServer;
|
||||
_assetServer.SetReceiver(this);
|
||||
Assets = new Dictionary<libsecondlife.LLUUID, AssetInfo> ();
|
||||
Textures = new Dictionary<libsecondlife.LLUUID, TextureImage> ();
|
||||
IncomingAssets = new Dictionary<libsecondlife.LLUUID, AssetBase>();
|
||||
this._assetCacheThread = new Thread( new ThreadStart(RunAssetManager));
|
||||
this._assetCacheThread.IsBackground = true;
|
||||
this._assetCacheThread.Start();
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
public void RunAssetManager()
|
||||
{
|
||||
while(true)
|
||||
{
|
||||
try{
|
||||
this.ProcessAssetQueue();
|
||||
this.ProcessTextureQueue();
|
||||
Thread.Sleep(100);
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
Console.WriteLine(e.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void LoadDefaultTextureSet()
|
||||
{
|
||||
//hack: so we can give each user a set of textures
|
||||
textureList[0] = new LLUUID("00000000-0000-0000-9999-000000000001");
|
||||
textureList[1] = new LLUUID("00000000-0000-0000-9999-000000000002");
|
||||
for(int i = 0; i< textureList.Length; i++)
|
||||
{
|
||||
this._assetServer.RequestAsset(textureList[i], true);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public AssetBase[] CreateNewInventorySet(LLUUID agentID)
|
||||
{
|
||||
AssetBase[] inventorySet = new AssetBase[this.textureList.Length];
|
||||
for(int i = 0; i< textureList.Length; i++)
|
||||
{
|
||||
if(this.Textures.ContainsKey(textureList[i]))
|
||||
{
|
||||
inventorySet[i] = this.CloneImage(agentID, this.Textures[textureList[i]]);
|
||||
TextureImage image = new TextureImage(inventorySet[i]);
|
||||
this.Textures.Add(image.FullID, image);
|
||||
}
|
||||
}
|
||||
return inventorySet;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
private void ProcessTextureQueue()
|
||||
{
|
||||
if(this.TextureRequests.Count == 0)
|
||||
{
|
||||
//no requests waiting
|
||||
return;
|
||||
}
|
||||
int num;
|
||||
|
||||
if(this.TextureRequests.Count < 5)
|
||||
{
|
||||
//lower than 5 so do all of them
|
||||
num = this.TextureRequests.Count;
|
||||
}
|
||||
else
|
||||
{
|
||||
num=5;
|
||||
}
|
||||
AssetRequest req;
|
||||
for(int i = 0; i < num; i++)
|
||||
{
|
||||
req=(AssetRequest)this.TextureRequests[i];
|
||||
|
||||
if(req.PacketCounter == 0)
|
||||
{
|
||||
//first time for this request so send imagedata packet
|
||||
if(req.NumPackets == 1)
|
||||
{
|
||||
//only one packet so send whole file
|
||||
ImageDataPacket im = new ImageDataPacket();
|
||||
im.ImageID.Packets = 1;
|
||||
im.ImageID.ID = req.ImageInfo.FullID;
|
||||
im.ImageID.Size = (uint)req.ImageInfo.Data.Length;
|
||||
im.ImageData.Data = req.ImageInfo.Data;
|
||||
im.ImageID.Codec = 2;
|
||||
req.RequestUser.OutPacket(im);
|
||||
req.PacketCounter++;
|
||||
//req.ImageInfo.l= time;
|
||||
//System.Console.WriteLine("sent texture: "+req.image_info.FullID);
|
||||
}
|
||||
else
|
||||
{
|
||||
//more than one packet so split file up
|
||||
ImageDataPacket im = new ImageDataPacket();
|
||||
im.ImageID.Packets = (ushort)req.NumPackets;
|
||||
im.ImageID.ID = req.ImageInfo.FullID;
|
||||
im.ImageID.Size = (uint)req.ImageInfo.Data.Length;
|
||||
im.ImageData.Data = new byte[600];
|
||||
Array.Copy(req.ImageInfo.Data, 0, im.ImageData.Data, 0, 600);
|
||||
im.ImageID.Codec = 2;
|
||||
req.RequestUser.OutPacket(im);
|
||||
req.PacketCounter++;
|
||||
//req.ImageInfo.last_used = time;
|
||||
//System.Console.WriteLine("sent first packet of texture:
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//send imagepacket
|
||||
//more than one packet so split file up
|
||||
ImagePacketPacket im = new ImagePacketPacket();
|
||||
im.ImageID.Packet = (ushort)req.PacketCounter;
|
||||
im.ImageID.ID = req.ImageInfo.FullID;
|
||||
int size = req.ImageInfo.Data.Length - 600 - 1000*(req.PacketCounter - 1);
|
||||
if(size > 1000) size = 1000;
|
||||
im.ImageData.Data = new byte[size];
|
||||
Array.Copy(req.ImageInfo.Data, 600 + 1000*(req.PacketCounter - 1), im.ImageData.Data, 0, size);
|
||||
req.RequestUser.OutPacket(im);
|
||||
req.PacketCounter++;
|
||||
//req.ImageInfo.last_used = time;
|
||||
//System.Console.WriteLine("sent a packet of texture: "+req.image_info.FullID);
|
||||
}
|
||||
}
|
||||
|
||||
//remove requests that have been completed
|
||||
int count = 0;
|
||||
for(int i = 0; i < num; i++)
|
||||
{
|
||||
req=(AssetRequest)this.TextureRequests[count];
|
||||
if(req.PacketCounter == req.NumPackets)
|
||||
{
|
||||
this.TextureRequests.Remove(req);
|
||||
}
|
||||
else
|
||||
{
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
public void AssetReceived(AssetBase asset, bool IsTexture)
|
||||
{
|
||||
|
||||
if(asset.FullID != LLUUID.Zero) // if it is set to zero then the asset wasn't found by the server
|
||||
{
|
||||
//check if it is a texture or not
|
||||
//then add to the correct cache list
|
||||
//then check for waiting requests for this asset/texture (in the Requested lists)
|
||||
//and move those requests into the Requests list.
|
||||
if(IsTexture)
|
||||
{
|
||||
TextureImage image = new TextureImage(asset);
|
||||
this.Textures.Add(image.FullID, image);
|
||||
if(this.RequestedTextures.ContainsKey(image.FullID))
|
||||
{
|
||||
AssetRequest req = this.RequestedTextures[image.FullID];
|
||||
req.ImageInfo = image;
|
||||
this.RequestedTextures.Remove(image.FullID);
|
||||
this.TextureRequests.Add(req);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
AssetInfo assetInf = new AssetInfo(asset);
|
||||
this.Assets.Add(assetInf.FullID, assetInf);
|
||||
if(this.RequestedAssets.ContainsKey(assetInf.FullID))
|
||||
{
|
||||
AssetRequest req = this.RequestedAssets[assetInf.FullID];
|
||||
req.AssetInf = assetInf;
|
||||
this.RequestedAssets.Remove(assetInf.FullID);
|
||||
this.AssetRequests.Add(req);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void AssetNotFound(AssetBase asset)
|
||||
{
|
||||
//the asset server had no knowledge of requested asset
|
||||
|
||||
}
|
||||
|
||||
#region Assets
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="userInfo"></param>
|
||||
/// <param name="transferRequest"></param>
|
||||
public void AddAssetRequest(OpenSimClient userInfo, TransferRequestPacket transferRequest)
|
||||
{
|
||||
LLUUID requestID = new LLUUID(transferRequest.TransferInfo.Params, 0);
|
||||
//check to see if asset is in local cache, if not we need to request it from asset server.
|
||||
if(!this.Assets.ContainsKey(requestID))
|
||||
{
|
||||
//not found asset
|
||||
// so request from asset server
|
||||
AssetRequest request = new AssetRequest();
|
||||
request.RequestUser = userInfo;
|
||||
request.RequestAssetID = requestID;
|
||||
request.TransferRequestID = transferRequest.TransferInfo.TransferID;
|
||||
this.RequestedAssets.Add(requestID,request);
|
||||
this._assetServer.RequestAsset(requestID, false);
|
||||
return;
|
||||
}
|
||||
//it is in our cache
|
||||
AssetInfo asset = this.Assets[requestID];
|
||||
|
||||
//work out how many packets it should be sent in
|
||||
// and add to the AssetRequests list
|
||||
AssetRequest req = new AssetRequest();
|
||||
req.RequestUser = userInfo;
|
||||
req.RequestAssetID = requestID;
|
||||
req.TransferRequestID = transferRequest.TransferInfo.TransferID;
|
||||
req.AssetInf = asset;
|
||||
|
||||
if(asset.Data.LongLength>600)
|
||||
{
|
||||
//over 600 bytes so split up file
|
||||
req.NumPackets = 1 + (int)(asset.Data.Length-600+999)/1000;
|
||||
}
|
||||
else
|
||||
{
|
||||
req.NumPackets = 1;
|
||||
}
|
||||
|
||||
this.AssetRequests.Add(req);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
private void ProcessAssetQueue()
|
||||
{
|
||||
if(this.AssetRequests.Count == 0)
|
||||
{
|
||||
//no requests waiting
|
||||
return;
|
||||
}
|
||||
int num;
|
||||
|
||||
if(this.AssetRequests.Count < 5)
|
||||
{
|
||||
//lower than 5 so do all of them
|
||||
num = this.AssetRequests.Count;
|
||||
}
|
||||
else
|
||||
{
|
||||
num=5;
|
||||
}
|
||||
AssetRequest req;
|
||||
for(int i = 0; i < num; i++)
|
||||
{
|
||||
req=(AssetRequest)this.AssetRequests[i];
|
||||
|
||||
TransferInfoPacket Transfer = new TransferInfoPacket();
|
||||
Transfer.TransferInfo.ChannelType = 2;
|
||||
Transfer.TransferInfo.Status = 0;
|
||||
Transfer.TransferInfo.TargetType = 0;
|
||||
Transfer.TransferInfo.Params = req.RequestAssetID.GetBytes();
|
||||
Transfer.TransferInfo.Size = (int)req.AssetInf.Data.Length;
|
||||
Transfer.TransferInfo.TransferID = req.TransferRequestID;
|
||||
req.RequestUser.OutPacket(Transfer);
|
||||
|
||||
if(req.NumPackets == 1)
|
||||
{
|
||||
TransferPacketPacket TransferPacket = new TransferPacketPacket();
|
||||
TransferPacket.TransferData.Packet = 0;
|
||||
TransferPacket.TransferData.ChannelType = 2;
|
||||
TransferPacket.TransferData.TransferID=req.TransferRequestID;
|
||||
TransferPacket.TransferData.Data = req.AssetInf.Data;
|
||||
TransferPacket.TransferData.Status = 1;
|
||||
req.RequestUser.OutPacket(TransferPacket);
|
||||
}
|
||||
else
|
||||
{
|
||||
//more than one packet so split file up , for now it can't be bigger than 2000 bytes
|
||||
TransferPacketPacket TransferPacket = new TransferPacketPacket();
|
||||
TransferPacket.TransferData.Packet = 0;
|
||||
TransferPacket.TransferData.ChannelType = 2;
|
||||
TransferPacket.TransferData.TransferID=req.TransferRequestID;
|
||||
byte[] chunk = new byte[1000];
|
||||
Array.Copy(req.AssetInf.Data,chunk,1000);
|
||||
TransferPacket.TransferData.Data = chunk;
|
||||
TransferPacket.TransferData.Status = 0;
|
||||
req.RequestUser.OutPacket(TransferPacket);
|
||||
|
||||
TransferPacket = new TransferPacketPacket();
|
||||
TransferPacket.TransferData.Packet = 1;
|
||||
TransferPacket.TransferData.ChannelType = 2;
|
||||
TransferPacket.TransferData.TransferID = req.TransferRequestID;
|
||||
byte[] chunk1 = new byte[(req.AssetInf.Data.Length-1000)];
|
||||
Array.Copy(req.AssetInf.Data, 1000, chunk1, 0, chunk1.Length);
|
||||
TransferPacket.TransferData.Data = chunk1;
|
||||
TransferPacket.TransferData.Status = 1;
|
||||
req.RequestUser.OutPacket(TransferPacket);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//remove requests that have been completed
|
||||
for(int i = 0; i < num; i++)
|
||||
{
|
||||
this.AssetRequests.RemoveAt(0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public AssetInfo CloneAsset(LLUUID newOwner, AssetInfo sourceAsset)
|
||||
{
|
||||
AssetInfo newAsset = new AssetInfo();
|
||||
newAsset.Data = new byte[sourceAsset.Data.Length];
|
||||
Array.Copy(sourceAsset.Data, newAsset.Data, sourceAsset.Data.Length);
|
||||
newAsset.FullID = LLUUID.Random();
|
||||
newAsset.Type = sourceAsset.Type;
|
||||
newAsset.InvType = sourceAsset.InvType;
|
||||
return(newAsset);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Textures
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
/// <param name="userInfo"></param>
|
||||
/// <param name="imageID"></param>
|
||||
public void AddTextureRequest(OpenSimClient userInfo, LLUUID imageID)
|
||||
{
|
||||
//check to see if texture is in local cache, if not request from asset server
|
||||
if(!this.Textures.ContainsKey(imageID))
|
||||
{
|
||||
if(!this.RequestedTextures.ContainsKey(imageID))
|
||||
{
|
||||
//not is cache so request from asset server
|
||||
AssetRequest request = new AssetRequest();
|
||||
request.RequestUser = userInfo;
|
||||
request.RequestAssetID = imageID;
|
||||
request.IsTextureRequest = true;
|
||||
this.RequestedTextures.Add(imageID, request);
|
||||
this._assetServer.RequestAsset(imageID, true);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
TextureImage imag = this.Textures[imageID];
|
||||
AssetRequest req = new AssetRequest();
|
||||
req.RequestUser = userInfo;
|
||||
req.RequestAssetID = imageID;
|
||||
req.IsTextureRequest = true;
|
||||
req.ImageInfo = imag;
|
||||
|
||||
if(imag.Data.LongLength>600)
|
||||
{
|
||||
//over 600 bytes so split up file
|
||||
req.NumPackets = 1 + (int)(imag.Data.Length-600+999)/1000;
|
||||
}
|
||||
else
|
||||
{
|
||||
req.NumPackets = 1;
|
||||
}
|
||||
|
||||
this.TextureRequests.Add(req);
|
||||
}
|
||||
|
||||
public TextureImage CloneImage(LLUUID newOwner, TextureImage source)
|
||||
{
|
||||
TextureImage newImage = new TextureImage();
|
||||
newImage.Data = new byte[source.Data.Length];
|
||||
Array.Copy(source.Data,newImage.Data,source.Data.Length);
|
||||
//newImage.filename = source.filename;
|
||||
newImage.FullID = LLUUID.Random();
|
||||
newImage.Name = source.Name;
|
||||
return(newImage);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region viewer asset uploading
|
||||
/* public AssetBase UploadPacket(AssetUploadRequestPacket pack)
|
||||
{
|
||||
AssetBase asset = null;
|
||||
if(this.IncomingAssets.ContainsKey(pack.AssetBlock.TransactionID))
|
||||
{
|
||||
// not the first packet of this transaction
|
||||
asset = this.IncomingAssets[pack.AssetBlock.TransactionID];
|
||||
byte[] idata = new byte[asset.Data.Length + pack.AssetBlock.AssetData.Length];
|
||||
Array.Copy(asset.Data, 0, idata, 0, asset.Data.Length);
|
||||
Array.Copy(pack.AssetBlock.AssetData, 0, idata, asset.Data.Length, pack.AssetBlock.AssetData.Length);
|
||||
asset.Data = idata;
|
||||
}
|
||||
else
|
||||
{
|
||||
//first packet for transaction
|
||||
asset = new AssetBase();
|
||||
asset.FullID = LLUUID.Random();
|
||||
asset.Type = pack.AssetBlock.Type;
|
||||
asset.InvType = asset.Type;
|
||||
asset.Data = pack.AssetBlock.AssetData;
|
||||
//this.IncomingAssets.Add(pack.AssetBlock.TransactionID,asset);
|
||||
TextureImage image = new TextureImage(asset);
|
||||
this.Textures.Add(image.FullID, image);
|
||||
|
||||
}
|
||||
return asset;
|
||||
}
|
||||
|
||||
/*
|
||||
public AssetBase TransactionComplete(LLUUID transactionID)
|
||||
{
|
||||
AssetBase asset = null;
|
||||
if(this.IncomingAssets.ContainsKey(transactionID))
|
||||
{
|
||||
// not the first packet of this transaction
|
||||
asset = this.IncomingAssets[transactionID];
|
||||
if(asset.Type == 0)
|
||||
{
|
||||
TextureImage image = new TextureImage(asset);
|
||||
this.Textures.Add(image.FullID, image);
|
||||
}
|
||||
}
|
||||
return asset;
|
||||
}*/
|
||||
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
||||
public class AssetRequest
|
||||
{
|
||||
public OpenSimClient RequestUser;
|
||||
public LLUUID RequestAssetID;
|
||||
public AssetInfo AssetInf;
|
||||
public TextureImage ImageInfo;
|
||||
public LLUUID TransferRequestID;
|
||||
public long DataPointer = 0;
|
||||
public int NumPackets = 0;
|
||||
public int PacketCounter = 0;
|
||||
public bool IsTextureRequest;
|
||||
//public bool AssetInCache;
|
||||
//public int TimeRequested;
|
||||
|
||||
public AssetRequest()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public class AssetInfo : AssetBase
|
||||
{
|
||||
public AssetInfo()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public AssetInfo(AssetBase aBase)
|
||||
{
|
||||
Data= aBase.Data;
|
||||
FullID = aBase.FullID;
|
||||
Type = aBase.Type;
|
||||
InvType = aBase.InvType;
|
||||
Name= aBase.Name;
|
||||
Description = aBase.Description;
|
||||
}
|
||||
}
|
||||
|
||||
public class TextureImage : AssetBase
|
||||
{
|
||||
public TextureImage()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public TextureImage(AssetBase aBase)
|
||||
{
|
||||
Data= aBase.Data;
|
||||
FullID = aBase.FullID;
|
||||
Type = aBase.Type;
|
||||
InvType = aBase.InvType;
|
||||
Name= aBase.Name;
|
||||
Description = aBase.Description;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,299 @@
|
|||
/*
|
||||
* 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 <organization> 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 <copyright holder> ``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 <copyright holder> 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 libsecondlife;
|
||||
using OpenSim;
|
||||
using libsecondlife.Packets;
|
||||
using OpenSim.GridServers;
|
||||
|
||||
namespace OpenSim.Assets
|
||||
{
|
||||
/// <summary>
|
||||
/// Description of InventoryManager.
|
||||
/// </summary>
|
||||
public class InventoryManager
|
||||
{
|
||||
private Dictionary<LLUUID, AgentInventory> _agentsInventory;
|
||||
private List<UserServerRequest> _serverRequests; //list of requests made to user server.
|
||||
private System.Text.Encoding _enc = System.Text.Encoding.ASCII;
|
||||
private const uint FULL_MASK_PERMISSIONS = 2147483647;
|
||||
|
||||
public InventoryManager()
|
||||
{
|
||||
_agentsInventory = new Dictionary<LLUUID,AgentInventory>();
|
||||
_serverRequests = new List<UserServerRequest>();
|
||||
}
|
||||
|
||||
public void AddNewAgentsInventory(AgentInventory agentInventory)
|
||||
{
|
||||
this._agentsInventory.Add(agentInventory.AgentID, agentInventory);
|
||||
}
|
||||
|
||||
public void ClientLeaving(LLUUID clientID)
|
||||
{
|
||||
if(this._agentsInventory.ContainsKey(clientID))
|
||||
{
|
||||
this._agentsInventory.Remove(clientID);
|
||||
}
|
||||
|
||||
}
|
||||
public bool CreateNewInventoryFolder(OpenSimClient remoteClient, LLUUID folderID)
|
||||
{
|
||||
bool res = false;
|
||||
if(folderID != LLUUID.Zero) //don't create a folder with a zero id
|
||||
{
|
||||
if(this._agentsInventory.ContainsKey(remoteClient.AgentID))
|
||||
{
|
||||
res = this._agentsInventory[remoteClient.AgentID].CreateNewFolder(folderID);
|
||||
}
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
public LLUUID AddNewInventoryItem(OpenSimClient remoteClient, LLUUID folderID, AssetBase asset)
|
||||
{
|
||||
LLUUID newItem = null;
|
||||
if(this._agentsInventory.ContainsKey(remoteClient.AgentID))
|
||||
{
|
||||
newItem = this._agentsInventory[remoteClient.AgentID].AddToInventory(folderID, asset);
|
||||
}
|
||||
|
||||
return newItem;
|
||||
}
|
||||
|
||||
public void FetchInventoryDescendents(OpenSimClient userInfo, FetchInventoryDescendentsPacket FetchDescend)
|
||||
{
|
||||
if(this._agentsInventory.ContainsKey(userInfo.AgentID))
|
||||
{
|
||||
AgentInventory agentInventory = this._agentsInventory[userInfo.AgentID];
|
||||
if(FetchDescend.InventoryData.FetchItems)
|
||||
{
|
||||
if(agentInventory.Folders.ContainsKey(FetchDescend.InventoryData.FolderID))
|
||||
{
|
||||
InventoryFolder Folder = agentInventory.Folders[FetchDescend.InventoryData.FolderID];
|
||||
InventoryDescendentsPacket Descend = new InventoryDescendentsPacket();
|
||||
Descend.AgentData.AgentID = userInfo.AgentID;
|
||||
Descend.AgentData.OwnerID = Folder.OwnerID;
|
||||
Descend.AgentData.FolderID = FetchDescend.InventoryData.FolderID;
|
||||
Descend.AgentData.Descendents = Folder.Items.Count;
|
||||
Descend.AgentData.Version = Folder.Items.Count;
|
||||
|
||||
|
||||
Descend.ItemData = new InventoryDescendentsPacket.ItemDataBlock[Folder.Items.Count];
|
||||
for(int i = 0; i < Folder.Items.Count ; i++)
|
||||
{
|
||||
|
||||
InventoryItem Item=Folder.Items[i];
|
||||
Descend.ItemData[i] = new InventoryDescendentsPacket.ItemDataBlock();
|
||||
Descend.ItemData[i].ItemID = Item.ItemID;
|
||||
Descend.ItemData[i].AssetID = Item.AssetID;
|
||||
Descend.ItemData[i].CreatorID = Item.CreatorID;
|
||||
Descend.ItemData[i].BaseMask = FULL_MASK_PERMISSIONS;
|
||||
Descend.ItemData[i].CreationDate = 1000;
|
||||
Descend.ItemData[i].Description = _enc.GetBytes(Item.Description+"\0");
|
||||
Descend.ItemData[i].EveryoneMask = FULL_MASK_PERMISSIONS;
|
||||
Descend.ItemData[i].Flags = 1;
|
||||
Descend.ItemData[i].FolderID = Item.FolderID;
|
||||
Descend.ItemData[i].GroupID = new LLUUID("00000000-0000-0000-0000-000000000000");
|
||||
Descend.ItemData[i].GroupMask = FULL_MASK_PERMISSIONS;
|
||||
Descend.ItemData[i].InvType = Item.InvType;
|
||||
Descend.ItemData[i].Name = _enc.GetBytes(Item.Name+"\0");
|
||||
Descend.ItemData[i].NextOwnerMask = FULL_MASK_PERMISSIONS;
|
||||
Descend.ItemData[i].OwnerID = Item.OwnerID;
|
||||
Descend.ItemData[i].OwnerMask = FULL_MASK_PERMISSIONS;
|
||||
Descend.ItemData[i].SalePrice = 100;
|
||||
Descend.ItemData[i].SaleType = 0;
|
||||
Descend.ItemData[i].Type = Item.Type;
|
||||
Descend.ItemData[i].CRC=libsecondlife.Helpers.InventoryCRC(1000, 0, Descend.ItemData[i].InvType, Descend.ItemData[i].Type, Descend.ItemData[i].AssetID, Descend.ItemData[i].GroupID, 100, Descend.ItemData[i].OwnerID, Descend.ItemData[i].CreatorID, Descend.ItemData[i].ItemID, Descend.ItemData[i].FolderID, FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS);
|
||||
}
|
||||
userInfo.OutPacket(Descend);
|
||||
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.WriteLine("fetch subfolders");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void FetchInventory(OpenSimClient userInfo, FetchInventoryPacket FetchItems)
|
||||
{
|
||||
if(this._agentsInventory.ContainsKey(userInfo.AgentID))
|
||||
{
|
||||
AgentInventory agentInventory = this._agentsInventory[userInfo.AgentID];
|
||||
|
||||
for(int i = 0; i < FetchItems.InventoryData.Length; i++)
|
||||
{
|
||||
if(agentInventory.Items.ContainsKey(FetchItems.InventoryData[i].ItemID))
|
||||
{
|
||||
InventoryItem Item = agentInventory.Items[FetchItems.InventoryData[i].ItemID];
|
||||
FetchInventoryReplyPacket InventoryReply = new FetchInventoryReplyPacket();
|
||||
InventoryReply.AgentData.AgentID = userInfo.AgentID;
|
||||
InventoryReply.InventoryData = new FetchInventoryReplyPacket.InventoryDataBlock[1];
|
||||
InventoryReply.InventoryData[0] = new FetchInventoryReplyPacket.InventoryDataBlock();
|
||||
InventoryReply.InventoryData[0].ItemID = Item.ItemID;
|
||||
InventoryReply.InventoryData[0].AssetID = Item.AssetID;
|
||||
InventoryReply.InventoryData[0].CreatorID = Item.CreatorID;
|
||||
InventoryReply.InventoryData[0].BaseMask = FULL_MASK_PERMISSIONS;
|
||||
InventoryReply.InventoryData[0].CreationDate = 1000;
|
||||
InventoryReply.InventoryData[0].Description = _enc.GetBytes( Item.Description+"\0");
|
||||
InventoryReply.InventoryData[0].EveryoneMask = FULL_MASK_PERMISSIONS;
|
||||
InventoryReply.InventoryData[0].Flags = 1;
|
||||
InventoryReply.InventoryData[0].FolderID = Item.FolderID;
|
||||
InventoryReply.InventoryData[0].GroupID = new LLUUID("00000000-0000-0000-0000-000000000000");
|
||||
InventoryReply.InventoryData[0].GroupMask = FULL_MASK_PERMISSIONS;
|
||||
InventoryReply.InventoryData[0].InvType = Item.InvType;
|
||||
InventoryReply.InventoryData[0].Name = _enc.GetBytes(Item.Name+"\0");
|
||||
InventoryReply.InventoryData[0].NextOwnerMask = FULL_MASK_PERMISSIONS;
|
||||
InventoryReply.InventoryData[0].OwnerID = Item.OwnerID;
|
||||
InventoryReply.InventoryData[0].OwnerMask = FULL_MASK_PERMISSIONS;
|
||||
InventoryReply.InventoryData[0].SalePrice = 100;
|
||||
InventoryReply.InventoryData[0].SaleType = 0;
|
||||
InventoryReply.InventoryData[0].Type = Item.Type;
|
||||
InventoryReply.InventoryData[0].CRC = libsecondlife.Helpers.InventoryCRC(1000, 0, InventoryReply.InventoryData[0].InvType, InventoryReply.InventoryData[0].Type, InventoryReply.InventoryData[0].AssetID, InventoryReply.InventoryData[0].GroupID, 100, InventoryReply.InventoryData[0].OwnerID, InventoryReply.InventoryData[0].CreatorID, InventoryReply.InventoryData[0].ItemID, InventoryReply.InventoryData[0].FolderID, FULL_MASK_PERMISSIONS, 1, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS, FULL_MASK_PERMISSIONS);
|
||||
userInfo.OutPacket(InventoryReply);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class AgentInventory
|
||||
{
|
||||
//Holds the local copy of Inventory info for a agent
|
||||
public Dictionary<LLUUID, InventoryFolder> Folders;
|
||||
public Dictionary<LLUUID, InventoryItem> Items;
|
||||
public int LastCached; //time this was last stored/compared to user server
|
||||
public LLUUID AgentID;
|
||||
public AvatarWearable[] Wearables;
|
||||
|
||||
public AgentInventory()
|
||||
{
|
||||
Folders = new Dictionary<LLUUID, InventoryFolder>();
|
||||
Items = new Dictionary<LLUUID, InventoryItem>();
|
||||
Wearables = new AvatarWearable[2];
|
||||
for(int i = 0; i < 2; i++)
|
||||
{
|
||||
Wearables[i] = new AvatarWearable();
|
||||
}
|
||||
}
|
||||
|
||||
public bool CreateNewFolder(LLUUID folderID)
|
||||
{
|
||||
InventoryFolder Folder = new InventoryFolder();
|
||||
Folder.FolderID = folderID;
|
||||
Folder.OwnerID = this.AgentID;
|
||||
this.Folders.Add(Folder.FolderID, Folder);
|
||||
|
||||
return(true);
|
||||
}
|
||||
|
||||
public LLUUID AddToInventory( LLUUID folderID, AssetBase asset)
|
||||
{
|
||||
if(this.Folders.ContainsKey(folderID))
|
||||
{
|
||||
LLUUID NewItemID = LLUUID.Random();
|
||||
|
||||
InventoryItem Item = new InventoryItem();
|
||||
Item.FolderID = folderID;
|
||||
Item.OwnerID = AgentID;
|
||||
Item.AssetID = asset.FullID;
|
||||
Item.ItemID = NewItemID;
|
||||
Item.Type = asset.Type;
|
||||
Item.Name = asset.Name;
|
||||
Item.Description = asset.Description;
|
||||
Item.InvType = asset.InvType;
|
||||
this.Items.Add(Item.ItemID, Item);
|
||||
InventoryFolder Folder = Folders[Item.FolderID];
|
||||
Folder.Items.Add(Item);
|
||||
return(Item.ItemID);
|
||||
}
|
||||
else
|
||||
{
|
||||
return(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class InventoryFolder
|
||||
{
|
||||
public List<InventoryItem> Items;
|
||||
//public List<InventoryFolder> Subfolders;
|
||||
public LLUUID FolderID;
|
||||
public LLUUID OwnerID;
|
||||
public LLUUID ParentID;
|
||||
public string Name;
|
||||
public byte Type;
|
||||
|
||||
public InventoryFolder()
|
||||
{
|
||||
Items = new List<InventoryItem>();
|
||||
//Subfolders = new List<InventoryFolder>();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class InventoryItem
|
||||
{
|
||||
public LLUUID FolderID;
|
||||
public LLUUID OwnerID;
|
||||
public LLUUID ItemID;
|
||||
public LLUUID AssetID;
|
||||
public LLUUID CreatorID;
|
||||
public sbyte InvType;
|
||||
public sbyte Type;
|
||||
public string Name;
|
||||
public string Description;
|
||||
|
||||
public InventoryItem()
|
||||
{
|
||||
this.CreatorID = LLUUID.Zero;
|
||||
}
|
||||
}
|
||||
|
||||
public class UserServerRequest
|
||||
{
|
||||
public UserServerRequest()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public class AvatarWearable
|
||||
{
|
||||
public LLUUID AssetID = new LLUUID("00000000-0000-0000-0000-000000000000");
|
||||
public LLUUID ItemID = new LLUUID("00000000-0000-0000-0000-000000000000");
|
||||
|
||||
public AvatarWearable()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
/*
|
||||
Copyright (c) OpenSim project, http://osgrid.org/
|
||||
|
||||
* Copyright (c) <year>, <copyright holder>
|
||||
* All rights reserved.
|
||||
*
|
||||
* 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 <organization> 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 <copyright holder> ``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 <copyright holder> 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 System.IO;
|
||||
using libsecondlife;
|
||||
using OpenSim.world;
|
||||
|
||||
namespace OpenSim
|
||||
{
|
||||
/// <summary>
|
||||
/// This class handles connection to the underlying database used for configuration of the region.
|
||||
/// Region content is also stored by this class. The main entry point is InitConfig() which attempts to locate
|
||||
/// opensim.yap in the current working directory. If opensim.yap can not be found, default settings are loaded from
|
||||
/// what is hardcoded here and then saved into opensim.yap for future startups.
|
||||
/// </summary>
|
||||
|
||||
|
||||
public abstract class SimConfig
|
||||
{
|
||||
public string RegionName;
|
||||
|
||||
public uint RegionLocX;
|
||||
public uint RegionLocY;
|
||||
public ulong RegionHandle;
|
||||
|
||||
public int IPListenPort;
|
||||
public string IPListenAddr;
|
||||
|
||||
public string AssetURL;
|
||||
public string AssetSendKey;
|
||||
|
||||
public string GridURL;
|
||||
public string GridSendKey;
|
||||
|
||||
public abstract void InitConfig();
|
||||
public abstract void LoadFromGrid();
|
||||
public abstract World LoadWorld();
|
||||
public abstract void SaveMap();
|
||||
|
||||
}
|
||||
|
||||
public interface ISimConfig
|
||||
{
|
||||
SimConfig GetConfigObject();
|
||||
}
|
||||
}
|
|
@ -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("SimConfig")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("SimConfig")]
|
||||
[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.*")]
|
|
@ -0,0 +1,173 @@
|
|||
/*
|
||||
* 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 <organization> 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 <copyright holder> ``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 <copyright holder> 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 OpenSim;
|
||||
using OpenSim.world;
|
||||
using Db4objects.Db4o;
|
||||
|
||||
namespace Db40SimConfig
|
||||
{
|
||||
public class Db40ConfigPlugin: ISimConfig
|
||||
{
|
||||
public SimConfig GetConfigObject()
|
||||
{
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Loading Db40Config dll");
|
||||
return ( new DbSimConfig());
|
||||
}
|
||||
}
|
||||
|
||||
public class DbSimConfig :SimConfig
|
||||
{
|
||||
private IObjectContainer db;
|
||||
|
||||
public void LoadDefaults() {
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Config.cs:LoadDefaults() - Please press enter to retain default or enter new settings");
|
||||
|
||||
this.RegionName=ServerConsole.MainConsole.Instance.CmdPrompt("Name [OpenSim test]: ","OpenSim test");
|
||||
this.RegionLocX=(uint)Convert.ToInt32(ServerConsole.MainConsole.Instance.CmdPrompt("Grid Location X [997]: ","997"));
|
||||
this.RegionLocY=(uint)Convert.ToInt32(ServerConsole.MainConsole.Instance.CmdPrompt("Grid Location Y [996]: ","996"));
|
||||
this.IPListenPort=Convert.ToInt32(ServerConsole.MainConsole.Instance.CmdPrompt("UDP port for client connections [9000]: ","9000"));
|
||||
this.IPListenAddr=ServerConsole.MainConsole.Instance.CmdPrompt("IP Address to listen on for client connections [127.0.0.1]: ","127.0.0.1");
|
||||
|
||||
if(!OpenSim_Main.sim.sandbox)
|
||||
{
|
||||
this.AssetURL=ServerConsole.MainConsole.Instance.CmdPrompt("Asset server URL: ");
|
||||
this.AssetSendKey=ServerConsole.MainConsole.Instance.CmdPrompt("Asset server key: ");
|
||||
this.GridURL=ServerConsole.MainConsole.Instance.CmdPrompt("Grid server URL: ");
|
||||
this.GridSendKey=ServerConsole.MainConsole.Instance.CmdPrompt("Grid server key: ");
|
||||
}
|
||||
this.RegionHandle = Util.UIntsToLong((RegionLocX*256), (RegionLocY*256));
|
||||
}
|
||||
|
||||
public override void InitConfig() {
|
||||
try {
|
||||
db = Db4oFactory.OpenFile("opensim.yap");
|
||||
IObjectSet result = db.Get(typeof(DbSimConfig));
|
||||
if(result.Count==1) {
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Config.cs:InitConfig() - Found a SimConfig object in the local database, loading");
|
||||
foreach (DbSimConfig cfg in result) {
|
||||
this.RegionName = cfg.RegionName;
|
||||
this.RegionLocX = cfg.RegionLocX;
|
||||
this.RegionLocY = cfg.RegionLocY;
|
||||
this.RegionHandle = Util.UIntsToLong((RegionLocX*256), (RegionLocY*256));
|
||||
this.IPListenPort = cfg.IPListenPort;
|
||||
this.IPListenAddr = cfg.IPListenAddr;
|
||||
this.AssetURL = cfg.AssetURL;
|
||||
this.AssetSendKey = cfg.AssetSendKey;
|
||||
this.GridURL = cfg.GridURL;
|
||||
this.GridSendKey = cfg.GridSendKey;
|
||||
}
|
||||
} else {
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Config.cs:InitConfig() - Could not find object in database, loading precompiled defaults");
|
||||
LoadDefaults();
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Writing out default settings to local database");
|
||||
db.Set(this);
|
||||
}
|
||||
} catch(Exception e) {
|
||||
db.Close();
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Config.cs:InitConfig() - Exception occured");
|
||||
ServerConsole.MainConsole.Instance.WriteLine(e.ToString());
|
||||
}
|
||||
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Sim settings loaded:");
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Name: " + this.RegionName);
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Region Location: [" + this.RegionLocX.ToString() + "," + this.RegionLocY + "]");
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Region Handle: " + this.RegionHandle.ToString());
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Listening on IP: " + this.IPListenAddr + ":" + this.IPListenPort);
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Sandbox Mode? " + OpenSim_Main.sim.sandbox.ToString());
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Asset URL: " + this.AssetURL);
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Asset key: " + this.AssetSendKey);
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Grid URL: " + this.GridURL);
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Grid key: " + this.GridSendKey);
|
||||
}
|
||||
|
||||
public override World LoadWorld()
|
||||
{
|
||||
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(typeof(MapStorage));
|
||||
if(world_result.Count>0) {
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Config.cs:LoadWorld() - Found a heightmap in local database, loading");
|
||||
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");
|
||||
MapStorage map= new MapStorage();
|
||||
map.Map = blank.LandMap;
|
||||
db.Set(map);
|
||||
db.Commit();
|
||||
}
|
||||
return blank;
|
||||
}
|
||||
|
||||
public override void SaveMap()
|
||||
{
|
||||
IObjectSet world_result = db.Get(typeof(MapStorage));
|
||||
if(world_result.Count>0) {
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Config.cs:LoadWorld() - updating saved copy of heightmap in local database");
|
||||
MapStorage map=(MapStorage)world_result.Next();
|
||||
db.Delete(map);
|
||||
}
|
||||
MapStorage map1= new MapStorage();
|
||||
map1.Map = OpenSim_Main.local_world.LandMap;
|
||||
db.Set(map1);
|
||||
db.Commit();
|
||||
}
|
||||
|
||||
public override void LoadFromGrid() {
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Config.cs:LoadFromGrid() - dummy function, DOING ABSOLUTELY NOTHING AT ALL!!!");
|
||||
// TODO: Make this crap work
|
||||
/* WebRequest GridLogin = WebRequest.Create(this.GridURL + "regions/" + this.RegionHandle.ToString() + "/login");
|
||||
WebResponse GridResponse = GridLogin.GetResponse();
|
||||
byte[] idata = new byte[(int)GridResponse.ContentLength];
|
||||
BinaryReader br = new BinaryReader(GridResponse.GetResponseStream());
|
||||
|
||||
br.Close();
|
||||
GridResponse.Close();
|
||||
*/
|
||||
}
|
||||
|
||||
public void Shutdown() {
|
||||
db.Close();
|
||||
}
|
||||
}
|
||||
|
||||
public class MapStorage
|
||||
{
|
||||
public float[] Map;
|
||||
|
||||
public MapStorage()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<OutputType>Library</OutputType>
|
||||
<RootNamespace>SimConfig</RootNamespace>
|
||||
<AssemblyName>SimConfig</AssemblyName>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{B063760D-DB8D-4F64-B6FE-335FAD1E650A}</ProjectGuid>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<Optimize>False</Optimize>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugSymbols>True</DebugSymbols>
|
||||
<DebugType>Full</DebugType>
|
||||
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<Optimize>True</Optimize>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<DebugSymbols>False</DebugSymbols>
|
||||
<DebugType>None</DebugType>
|
||||
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="Db4objects.Db4o">
|
||||
<HintPath>..\..\..\bin\Db4objects.Db4o.dll</HintPath>
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Db4SimConfig.cs" />
|
||||
<Compile Include="AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\ServerConsole\ServerConsole\ServerConsole.csproj">
|
||||
<Project>{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}</Project>
|
||||
<Name>ServerConsole</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\Second-server.csproj">
|
||||
<Project>{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}</Project>
|
||||
<Name>Second-server</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\GridInterfaces\GridInterfaces.csproj">
|
||||
<Project>{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}</Project>
|
||||
<Name>GridInterfaces</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
|
||||
</Project>
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||
# SharpDevelop 2.1.0.2017
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimConfig", "SimConfig.csproj", "{B063760D-DB8D-4F64-B6FE-335FAD1E650A}"
|
||||
EndProject
|
||||
Global
|
||||
EndGlobal
|
|
@ -0,0 +1,52 @@
|
|||
<?xml version="1.0"?>
|
||||
<project name="OpenSim" default="build" basedir=".">
|
||||
<description>nant buildfile for OpenSim</description>
|
||||
<property name="debug" value="true" overwrite="false" />
|
||||
<target name="clean" description="remove all generated files">
|
||||
<delete file="../bin/SimConfig.dll" failonerror="false" />
|
||||
</target>
|
||||
|
||||
<target name="svnupdate" description="updates to latest SVN">
|
||||
<exec program="svn">
|
||||
<arg value="update" />
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
<target name="upgrade" description="updates from SVN and then builds" depends="clean,svnupdate,build">
|
||||
|
||||
</target>
|
||||
|
||||
<target name="build" description="compiles the source code">
|
||||
|
||||
<loadfile file="../../VERSION" property="svnver"/>
|
||||
<asminfo output="SimConfig/AssemblyInfo.cs" language="CSharp">
|
||||
<imports>
|
||||
<import namespace="System" />
|
||||
<import namespace="System.Reflection" />
|
||||
<import namespace="System.Runtime.InteropServices" />
|
||||
</imports>
|
||||
<attributes>
|
||||
<attribute type="ComVisibleAttribute" value="false" />
|
||||
<attribute type="CLSCompliantAttribute" value="false" />
|
||||
<attribute type="AssemblyVersionAttribute" value="${svnver}" />
|
||||
<attribute type="AssemblyTitleAttribute" value="opensim-simconfig" />
|
||||
<attribute type="AssemblyDescriptionAttribute" value="The default configuration handler" />
|
||||
<attribute type="AssemblyCopyrightAttribute" value="Copyright © OGS development team 2007"/>
|
||||
</attributes>
|
||||
</asminfo>
|
||||
|
||||
<csc target="library" output="../../bin/SimConfig.dll" debug="${debug}" verbose="true" warninglevel="4">
|
||||
<references basedir="../../bin/" failonempty="true">
|
||||
<include name="System" />
|
||||
<include name="System.Data" />
|
||||
<include name="System.Xml" />
|
||||
<include name="ServerConsole.dll" />
|
||||
<include name="OpenSim.exe" />
|
||||
<include name="Db4objects.Db4o.dll" />
|
||||
</references>
|
||||
<sources basedir="SimConfig/">
|
||||
<include name="*.cs" />
|
||||
</sources>
|
||||
</csc>
|
||||
</target>
|
||||
</project>
|
|
@ -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("GridInterfaces")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("GridInterfaces")]
|
||||
[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.*")]
|
|
@ -0,0 +1,41 @@
|
|||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<OutputType>Library</OutputType>
|
||||
<RootNamespace>GridInterfaces</RootNamespace>
|
||||
<AssemblyName>GridInterfaces</AssemblyName>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}</ProjectGuid>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<Optimize>False</Optimize>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugSymbols>True</DebugSymbols>
|
||||
<DebugType>Full</DebugType>
|
||||
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<Optimize>True</Optimize>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<DebugSymbols>False</DebugSymbols>
|
||||
<DebugType>None</DebugType>
|
||||
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="libsecondlife">
|
||||
<HintPath>..\..\bin\libsecondlife.dll</HintPath>
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="IAssetServer.cs" />
|
||||
<Compile Include="AssemblyInfo.cs" />
|
||||
<Compile Include="IGridServer.cs" />
|
||||
<Compile Include="ILocalStorage.cs" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
|
||||
</Project>
|
|
@ -0,0 +1,17 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||
# SharpDevelop 2.1.0.2017
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GridInterfaces", "GridInterfaces.csproj", "{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -0,0 +1,83 @@
|
|||
/*
|
||||
* 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 <organization> 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 <copyright holder> ``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 <copyright holder> 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.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using libsecondlife;
|
||||
|
||||
|
||||
namespace OpenSim.GridServers
|
||||
{
|
||||
/// <summary>
|
||||
/// Description of IAssetServer.
|
||||
/// </summary>
|
||||
|
||||
public interface IAssetServer
|
||||
{
|
||||
void SetReceiver(IAssetReceiver receiver);
|
||||
void RequestAsset(LLUUID assetID, bool isTexture);
|
||||
void UpdateAsset(AssetBase asset);
|
||||
void UploadNewAsset(AssetBase asset);
|
||||
void SetServerInfo(string ServerUrl, string ServerKey);
|
||||
void Close();
|
||||
}
|
||||
|
||||
// could change to delegate?
|
||||
public interface IAssetReceiver
|
||||
{
|
||||
void AssetReceived(AssetBase asset, bool IsTexture);
|
||||
void AssetNotFound(AssetBase asset);
|
||||
}
|
||||
|
||||
public struct ARequest
|
||||
{
|
||||
public LLUUID AssetID;
|
||||
public bool IsTexture;
|
||||
}
|
||||
|
||||
public class AssetBase
|
||||
{
|
||||
public byte[] Data;
|
||||
public LLUUID FullID;
|
||||
public sbyte Type;
|
||||
public sbyte InvType;
|
||||
public string Name;
|
||||
public string Description;
|
||||
|
||||
public AssetBase()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public interface IAssetPlugin
|
||||
{
|
||||
IAssetServer GetAssetServer();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,95 @@
|
|||
/*
|
||||
* 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 <organization> 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 <copyright holder> ``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 <copyright holder> 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 System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.IO;
|
||||
using libsecondlife;
|
||||
|
||||
namespace OpenSim.GridServers
|
||||
{
|
||||
/// <summary>
|
||||
/// Handles connection to Grid Servers.
|
||||
/// also Sim to Sim connections?
|
||||
/// </summary>
|
||||
|
||||
|
||||
|
||||
|
||||
public interface IGridServer
|
||||
{
|
||||
bool RequestConnection();
|
||||
UUIDBlock RequestUUIDBlock();
|
||||
void RequestNeighbours(); //should return a array of neighbouring regions
|
||||
AuthenticateResponse AuthenticateSession(LLUUID sessionID, LLUUID agentID, uint circuitCode);
|
||||
bool LogoutSession(LLUUID sessionID, LLUUID agentID, uint circuitCode);
|
||||
void SetServerInfo(string ServerUrl, string ServerKey);
|
||||
void Close();
|
||||
void AddNewSession(Login session); // only used by local version of grid server
|
||||
// and didn't use to be part of this interface until we put this in a dll
|
||||
}
|
||||
|
||||
public struct UUIDBlock
|
||||
{
|
||||
public LLUUID BlockStart;
|
||||
public LLUUID BlockEnd;
|
||||
}
|
||||
|
||||
public class AuthenticateResponse
|
||||
{
|
||||
public bool Authorised;
|
||||
public Login LoginInfo;
|
||||
|
||||
public AuthenticateResponse()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class Login
|
||||
{
|
||||
public string First = "Test";
|
||||
public string Last = "User";
|
||||
public LLUUID Agent;
|
||||
public LLUUID Session;
|
||||
public LLUUID InventoryFolder;
|
||||
public LLUUID BaseFolder;
|
||||
public Login()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public interface IGridPlugin
|
||||
{
|
||||
IGridServer GetGridServer();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,86 @@
|
|||
/*
|
||||
* 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 <organization> 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 <copyright holder> ``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 <copyright holder> 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
|
||||
{
|
||||
/// <summary>
|
||||
/// ILocalStorage. Really hacked together right now needs cleaning up
|
||||
/// </summary>
|
||||
public interface ILocalStorage
|
||||
{
|
||||
void StorePrim(PrimData prim);
|
||||
void RemovePrim(LLUUID primID);
|
||||
void LoadPrimitives(ILocalStorageReceiver receiver);
|
||||
void ShutDown();
|
||||
}
|
||||
|
||||
public interface ILocalStorageReceiver
|
||||
{
|
||||
void PrimFromStorage(PrimData prim);
|
||||
}
|
||||
|
||||
|
||||
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 sbyte PathRadiusOffset;
|
||||
public byte PathRevolutions;
|
||||
public sbyte PathTaperX;
|
||||
public sbyte PathTaperY;
|
||||
public sbyte PathTwist;
|
||||
public sbyte PathTwistBegin;
|
||||
|
||||
//following only used during prim storage
|
||||
public LLVector3 Position;
|
||||
public LLQuaternion Rotation;
|
||||
public uint LocalID;
|
||||
public LLUUID FullID;
|
||||
|
||||
public PrimData()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
<?xml version="1.0"?>
|
||||
<project name="OpenSim" default="build" basedir=".">
|
||||
<description>nant buildfile for OpenSim</description>
|
||||
<property name="debug" value="true" overwrite="false" />
|
||||
<target name="clean" description="remove all generated files">
|
||||
<delete file="../../bin/GridInterfaces.dll" failonerror="false" />
|
||||
</target>
|
||||
|
||||
<target name="svnupdate" description="updates to latest SVN">
|
||||
<exec program="svn">
|
||||
<arg value="update" />
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
<target name="upgrade" description="updates from SVN and then builds" depends="clean,svnupdate,build">
|
||||
|
||||
</target>
|
||||
|
||||
<target name="build" description="compiles the source code">
|
||||
|
||||
<loadfile file="../../VERSION" property="svnver"/>
|
||||
<asminfo output="AssemblyInfo.cs" language="CSharp">
|
||||
<imports>
|
||||
<import namespace="System" />
|
||||
<import namespace="System.Reflection" />
|
||||
<import namespace="System.Runtime.InteropServices" />
|
||||
</imports>
|
||||
<attributes>
|
||||
<attribute type="ComVisibleAttribute" value="false" />
|
||||
<attribute type="CLSCompliantAttribute" value="false" />
|
||||
<attribute type="AssemblyVersionAttribute" value="${svnver}" />
|
||||
<attribute type="AssemblyTitleAttribute" value="opensim-gridinterfaces" />
|
||||
<attribute type="AssemblyDescriptionAttribute" value="Definitions for OGS interface" />
|
||||
<attribute type="AssemblyCopyrightAttribute" value="Copyright © OGS development team 2007"/>
|
||||
</attributes>
|
||||
</asminfo>
|
||||
|
||||
<csc target="library" output="../../bin/GridInterfaces.dll" debug="${debug}" verbose="true" warninglevel="4">
|
||||
<references basedir="../../bin" failonempty="true">
|
||||
<include name="System" />
|
||||
<include name="System.Xml" />
|
||||
<include name="libsecondlife.dll" />
|
||||
</references>
|
||||
<sources basedir="./">
|
||||
<include name="*.cs" />
|
||||
</sources>
|
||||
</csc>
|
||||
</target>
|
||||
</project>
|
|
@ -0,0 +1,323 @@
|
|||
/*
|
||||
* 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 <organization> 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 <copyright holder> ``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 <copyright holder> 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 Nwc.XmlRpc;
|
||||
using System;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading;
|
||||
using System.Collections;
|
||||
using System.Security.Cryptography;
|
||||
using System.Xml;
|
||||
using libsecondlife;
|
||||
using OpenSim;
|
||||
|
||||
namespace OpenSim.GridServers
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// When running in local (default) mode , handles client logins.
|
||||
/// </summary>
|
||||
public class LoginServer
|
||||
{
|
||||
public LoginServer(IGridServer gridServer)
|
||||
{
|
||||
_gridServer = gridServer;
|
||||
}
|
||||
private Login _login;
|
||||
private IGridServer _gridServer;
|
||||
private ushort _loginPort = 8080;
|
||||
public IPAddress clientAddress = IPAddress.Loopback;
|
||||
public IPAddress remoteAddress = IPAddress.Any;
|
||||
private Socket loginServer;
|
||||
private Random RandomClass = new Random();
|
||||
private int NumClients;
|
||||
private string _defaultResponse;
|
||||
|
||||
private string _mpasswd;
|
||||
private bool _needPasswd=false;
|
||||
|
||||
// InitializeLogin: initialize the login
|
||||
private void InitializeLogin() {
|
||||
loginServer = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
|
||||
loginServer.Bind(new IPEndPoint(remoteAddress, _loginPort));
|
||||
loginServer.Listen(1);
|
||||
|
||||
this._needPasswd=false;
|
||||
//read in default response string
|
||||
StreamReader SR;
|
||||
string lines;
|
||||
SR=File.OpenText("new-login.dat");
|
||||
|
||||
//lines=SR.ReadLine();
|
||||
|
||||
while(!SR.EndOfStream)
|
||||
{
|
||||
lines = SR.ReadLine();
|
||||
_defaultResponse += lines;
|
||||
//lines = SR.ReadLine();
|
||||
}
|
||||
SR.Close();
|
||||
this._mpasswd = EncodePassword("testpass");
|
||||
}
|
||||
|
||||
public void Startup()
|
||||
{
|
||||
this.InitializeLogin();
|
||||
Thread runLoginProxy = new Thread(new ThreadStart(RunLogin));
|
||||
runLoginProxy.IsBackground = true;
|
||||
runLoginProxy.Start();
|
||||
}
|
||||
|
||||
private void RunLogin()
|
||||
{
|
||||
Console.WriteLine("Starting Login Server");
|
||||
try
|
||||
{
|
||||
for (;;)
|
||||
{
|
||||
Socket client = loginServer.Accept();
|
||||
IPEndPoint clientEndPoint = (IPEndPoint)client.RemoteEndPoint;
|
||||
|
||||
|
||||
NetworkStream networkStream = new NetworkStream(client);
|
||||
StreamReader networkReader = new StreamReader(networkStream);
|
||||
StreamWriter networkWriter = new StreamWriter(networkStream);
|
||||
|
||||
try
|
||||
{
|
||||
LoginRequest(networkReader, networkWriter);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(e.Message);
|
||||
}
|
||||
|
||||
networkWriter.Close();
|
||||
networkReader.Close();
|
||||
networkStream.Close();
|
||||
|
||||
client.Close();
|
||||
|
||||
// send any packets queued for injection
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Console.WriteLine(e.Message);
|
||||
Console.WriteLine(e.StackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
// ProxyLogin: proxy a login request
|
||||
private void LoginRequest(StreamReader reader, StreamWriter writer)
|
||||
{
|
||||
Console.WriteLine("LoginServer - new Login attempt");
|
||||
lock(this)
|
||||
{
|
||||
string line;
|
||||
int contentLength = 0;
|
||||
// read HTTP header
|
||||
do
|
||||
{
|
||||
// read one line of the header
|
||||
line = reader.ReadLine();
|
||||
|
||||
// check for premature EOF
|
||||
if (line == null)
|
||||
throw new Exception("EOF in client HTTP header");
|
||||
|
||||
// look for Content-Length
|
||||
Match match = (new Regex(@"Content-Length: (\d+)$")).Match(line);
|
||||
if (match.Success)
|
||||
contentLength = Convert.ToInt32(match.Groups[1].Captures[0].ToString());
|
||||
} while (line != "");
|
||||
|
||||
// read the HTTP body into a buffer
|
||||
char[] content = new char[contentLength];
|
||||
reader.Read(content, 0, contentLength);
|
||||
|
||||
XmlRpcRequest request = (XmlRpcRequest)(new XmlRpcRequestDeserializer()).Deserialize(new String(content));
|
||||
if(request.MethodName == "login_to_simulator")
|
||||
{
|
||||
Hashtable requestData = (Hashtable)request.Params[0];
|
||||
string first;
|
||||
string last;
|
||||
string passwd;
|
||||
LLUUID Agent;
|
||||
LLUUID Session;
|
||||
|
||||
//get login name
|
||||
if(requestData.Contains("first"))
|
||||
{
|
||||
first = (string)requestData["first"];
|
||||
}
|
||||
else
|
||||
{
|
||||
first = "test";
|
||||
}
|
||||
|
||||
if(requestData.Contains("last"))
|
||||
{
|
||||
last = (string)requestData["last"];
|
||||
}
|
||||
else
|
||||
{
|
||||
last = "User"+NumClients.ToString();
|
||||
}
|
||||
|
||||
if(requestData.Contains("passwd"))
|
||||
{
|
||||
passwd = (string)requestData["passwd"];
|
||||
}
|
||||
else
|
||||
{
|
||||
passwd = "notfound";
|
||||
}
|
||||
|
||||
if( !Authenticate(first, last, passwd))
|
||||
{
|
||||
// Fail miserably
|
||||
writer.WriteLine("HTTP/1.0 403 Authentication Forbidden");
|
||||
writer.WriteLine();
|
||||
return;
|
||||
}
|
||||
NumClients++;
|
||||
|
||||
//create a agent and session LLUUID
|
||||
Agent = GetAgentId( first, last );
|
||||
int SessionRand = this.RandomClass.Next(1,999);
|
||||
Session = new LLUUID("aaaabbbb-0200-"+SessionRand.ToString("0000")+"-8664-58f53e442797");
|
||||
|
||||
|
||||
XmlRpcResponse response =(XmlRpcResponse)(new XmlRpcResponseDeserializer()).Deserialize(this._defaultResponse);
|
||||
Hashtable responseData = (Hashtable)response.Value;
|
||||
|
||||
responseData["sim_port"] = OpenSim_Main.cfg.IPListenPort;
|
||||
responseData["sim_ip"] = OpenSim_Main.cfg.IPListenAddr;
|
||||
responseData["agent_id"] = Agent.ToStringHyphenated();
|
||||
responseData["session_id"] = Session.ToStringHyphenated();
|
||||
ArrayList InventoryList = (ArrayList) responseData["inventory-skeleton"];
|
||||
Hashtable Inventory1 = (Hashtable)InventoryList[0];
|
||||
Hashtable Inventory2 = (Hashtable)InventoryList[1];
|
||||
LLUUID BaseFolderID = LLUUID.Random();
|
||||
LLUUID InventoryFolderID = LLUUID.Random();
|
||||
Inventory2["name"] = "Base";
|
||||
Inventory2["folder_id"] = BaseFolderID.ToStringHyphenated();
|
||||
Inventory2["type_default"] =0;
|
||||
Inventory1["folder_id"] = InventoryFolderID.ToStringHyphenated();
|
||||
|
||||
ArrayList InventoryRoot = (ArrayList) responseData["inventory-root"];
|
||||
Hashtable Inventoryroot = (Hashtable)InventoryRoot[0];
|
||||
Inventoryroot["folder_id"] = InventoryFolderID.ToStringHyphenated();
|
||||
|
||||
CustomiseLoginResponse( responseData, first, last );
|
||||
|
||||
this._login = new Login();
|
||||
//copy data to login object
|
||||
_login.First = first;
|
||||
_login.Last = last;
|
||||
_login.Agent = Agent;
|
||||
_login.Session = Session;
|
||||
_login.BaseFolder = BaseFolderID;
|
||||
_login.InventoryFolder = InventoryFolderID;
|
||||
|
||||
//working on local computer so lets add to the gridserver's list of sessions
|
||||
this._gridServer.AddNewSession(_login);
|
||||
|
||||
// forward the XML-RPC response to the client
|
||||
writer.WriteLine("HTTP/1.0 200 OK");
|
||||
writer.WriteLine("Content-type: text/xml");
|
||||
writer.WriteLine();
|
||||
|
||||
XmlTextWriter responseWriter = new XmlTextWriter(writer);
|
||||
XmlRpcResponseSerializer.Singleton.Serialize(responseWriter, response);
|
||||
responseWriter.Close();
|
||||
}
|
||||
else
|
||||
{
|
||||
writer.WriteLine("HTTP/1.0 403 Authentication Forbidden");
|
||||
writer.WriteLine();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected virtual void CustomiseLoginResponse( Hashtable responseData, string first, string last )
|
||||
{
|
||||
}
|
||||
|
||||
protected virtual LLUUID GetAgentId(string firstName, string lastName)
|
||||
{
|
||||
LLUUID Agent;
|
||||
int AgentRand = this.RandomClass.Next(1,9999);
|
||||
Agent = new LLUUID("99998888-0100-"+AgentRand.ToString("0000")+"-8ec1-0b1d5cd6aead");
|
||||
return Agent;
|
||||
}
|
||||
|
||||
protected virtual bool Authenticate(string first, string last, string passwd)
|
||||
{
|
||||
if(this._needPasswd)
|
||||
{
|
||||
//every user needs the password to login
|
||||
string encodedPass = passwd.Remove(0,3); //remove $1$
|
||||
if(encodedPass == this._mpasswd)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//do not need password to login
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
private static string EncodePassword(string passwd)
|
||||
{
|
||||
Byte[] originalBytes;
|
||||
Byte[] encodedBytes;
|
||||
MD5 md5;
|
||||
|
||||
md5 = new MD5CryptoServiceProvider();
|
||||
originalBytes = ASCIIEncoding.Default.GetBytes(passwd);
|
||||
encodedBytes = md5.ComputeHash(originalBytes);
|
||||
|
||||
return Regex.Replace(BitConverter.ToString(encodedBytes), "-", "").ToLower();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,149 @@
|
|||
/*
|
||||
* 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 <organization> 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 <copyright holder> ``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 <copyright holder> 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;
|
||||
|
||||
namespace OpenSim
|
||||
{
|
||||
public class HeightmapGenHills
|
||||
{
|
||||
private Random Rand = new Random();
|
||||
private int NumHills;
|
||||
private float HillMin;
|
||||
private float HillMax;
|
||||
private bool Island;
|
||||
private float[] heightmap;
|
||||
|
||||
public float[] GenerateHeightmap(int numHills, float hillMin, float hillMax, bool island)
|
||||
{
|
||||
NumHills = numHills;
|
||||
HillMin = hillMin;
|
||||
HillMax = hillMax;
|
||||
Island = island;
|
||||
|
||||
heightmap = new float[256 * 256];
|
||||
|
||||
for (int i = 0; i < numHills; i++)
|
||||
{
|
||||
AddHill();
|
||||
}
|
||||
|
||||
Normalize();
|
||||
|
||||
return heightmap;
|
||||
}
|
||||
|
||||
private void AddHill()
|
||||
{
|
||||
float x, y;
|
||||
float radius = RandomRange(HillMin, HillMax);
|
||||
|
||||
if (Island)
|
||||
{
|
||||
// Which direction from the center of the map the hill is placed
|
||||
float theta = RandomRange(0, 6.28f);
|
||||
|
||||
// How far from the center of the map to place the hill. The radius
|
||||
// is subtracted from the range to prevent any part of the hill from
|
||||
// reaching the edge of the map
|
||||
float distance = RandomRange(radius / 2.0f, 128.0f - radius);
|
||||
|
||||
x = 128.0f + (float)Math.Cos(theta) * distance;
|
||||
y = 128.0f + (float)Math.Sin(theta) * distance;
|
||||
}
|
||||
else
|
||||
{
|
||||
x = RandomRange(-radius, 256.0f + radius);
|
||||
y = RandomRange(-radius, 256.0f + radius);
|
||||
}
|
||||
|
||||
float radiusSq = radius * radius;
|
||||
float distSq;
|
||||
float height;
|
||||
|
||||
int xMin = (int)(x - radius) - 1;
|
||||
int xMax = (int)(x + radius) + 1;
|
||||
if (xMin < 0) xMin = 0;
|
||||
if (xMax > 255) xMax = 255;
|
||||
|
||||
int yMin = (int)(y - radius) - 1;
|
||||
int yMax = (int)(y + radius) + 1;
|
||||
if (yMin < 0) yMin = 0;
|
||||
if (yMax > 255) yMax = 255;
|
||||
|
||||
// Loop through each affected cell and determine the height at that point
|
||||
for (int v = yMin; v <= yMax; ++v)
|
||||
{
|
||||
float fv = (float)v;
|
||||
|
||||
for (int h = xMin; h <= xMax; ++h)
|
||||
{
|
||||
float fh = (float)h;
|
||||
|
||||
// Determine how far from the center of this hill this point is
|
||||
distSq = (x - fh) * (x - fh) + (y - fv) * (y - fv);
|
||||
height = radiusSq - distSq;
|
||||
|
||||
// Don't add negative hill values
|
||||
if (height > 0.0f) heightmap[h + v * 256] += height;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void Normalize()
|
||||
{
|
||||
float min = heightmap[0];
|
||||
float max = heightmap[0];
|
||||
|
||||
for (int x = 0; x < 256; x++)
|
||||
{
|
||||
for (int y = 0; y < 256; y++)
|
||||
{
|
||||
if (heightmap[x + y * 256] < min) min = heightmap[x + y * 256];
|
||||
if (heightmap[x + y * 256] > max) max = heightmap[x + y * 256];
|
||||
}
|
||||
}
|
||||
|
||||
// Avoid a rare divide by zero
|
||||
if (min != max)
|
||||
{
|
||||
for (int x = 0; x < 256; x++)
|
||||
{
|
||||
for (int y = 0; y < 256; y++)
|
||||
{
|
||||
heightmap[x + y * 256] = ((heightmap[x + y * 256] - min) / (max - min)) * (HillMax - HillMin);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private float RandomRange(float min, float max)
|
||||
{
|
||||
return (float)Rand.NextDouble() * (max - min) + min;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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("LocalGridServers")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("LocalGridServers")]
|
||||
[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.*")]
|
|
@ -0,0 +1,355 @@
|
|||
/*
|
||||
* 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 <organization> 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 <copyright holder> ``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 <copyright holder> 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 System.Threading;
|
||||
using System.IO;
|
||||
using OpenSim.GridServers;
|
||||
using libsecondlife;
|
||||
using Db4objects.Db4o;
|
||||
using Db4objects.Db4o.Query;
|
||||
|
||||
namespace LocalGridServers
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
///
|
||||
public class LocalGridPlugin : IGridPlugin
|
||||
{
|
||||
public LocalGridPlugin()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public IGridServer GetGridServer()
|
||||
{
|
||||
return(new LocalGridServer());
|
||||
}
|
||||
}
|
||||
|
||||
public class LocalAssetPlugin : IAssetPlugin
|
||||
{
|
||||
public LocalAssetPlugin()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public IAssetServer GetAssetServer()
|
||||
{
|
||||
return(new LocalAssetServer());
|
||||
}
|
||||
}
|
||||
|
||||
public class LocalAssetServer : IAssetServer
|
||||
{
|
||||
private IAssetReceiver _receiver;
|
||||
private BlockingQueue<ARequest> _assetRequests;
|
||||
private IObjectContainer db;
|
||||
private Thread _localAssetServerThread;
|
||||
|
||||
public LocalAssetServer()
|
||||
{
|
||||
this._assetRequests = new BlockingQueue<ARequest>();
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Local Asset Server class created");
|
||||
try
|
||||
{
|
||||
db = Db4oFactory.OpenFile("assets.yap");
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Db4 Asset database creation");
|
||||
}
|
||||
catch(Exception e)
|
||||
{
|
||||
db.Close();
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Db4 Asset server :Constructor - Exception occured");
|
||||
ServerConsole.MainConsole.Instance.WriteLine(e.ToString());
|
||||
}
|
||||
this.SetUpAssetDatabase();
|
||||
this._localAssetServerThread = new Thread(new ThreadStart(RunRequests));
|
||||
this._localAssetServerThread.IsBackground = true;
|
||||
this._localAssetServerThread.Start();
|
||||
|
||||
}
|
||||
|
||||
public void SetReceiver(IAssetReceiver receiver)
|
||||
{
|
||||
this._receiver = receiver;
|
||||
}
|
||||
|
||||
public void RequestAsset(LLUUID assetID, bool isTexture)
|
||||
{
|
||||
ARequest req = new ARequest();
|
||||
req.AssetID = assetID;
|
||||
req.IsTexture = isTexture;
|
||||
this._assetRequests.Enqueue(req);
|
||||
}
|
||||
|
||||
public void UpdateAsset(AssetBase asset)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void UploadNewAsset(AssetBase asset)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void SetServerInfo(string ServerUrl, string ServerKey)
|
||||
{
|
||||
|
||||
}
|
||||
public void Close()
|
||||
{
|
||||
if(db != null)
|
||||
{
|
||||
Console.WriteLine("Closing local Asset server database");
|
||||
db.Close();
|
||||
}
|
||||
}
|
||||
|
||||
private void RunRequests()
|
||||
{
|
||||
while(true)
|
||||
{
|
||||
byte[] idata = null;
|
||||
bool found = false;
|
||||
AssetStorage foundAsset =null;
|
||||
ARequest req = this._assetRequests.Dequeue();
|
||||
IObjectSet result = db.Query(new AssetUUIDQuery(req.AssetID));
|
||||
if(result.Count>0)
|
||||
{
|
||||
foundAsset = (AssetStorage) result.Next();
|
||||
found = true;
|
||||
}
|
||||
|
||||
AssetBase asset = new AssetBase();
|
||||
if(found)
|
||||
{
|
||||
asset.FullID = foundAsset.UUID ;
|
||||
asset.Type = foundAsset.Type;
|
||||
asset.InvType = foundAsset.Type;
|
||||
asset.Name = foundAsset.Name;
|
||||
idata = foundAsset.Data;
|
||||
}
|
||||
else
|
||||
{
|
||||
asset.FullID = LLUUID.Zero;
|
||||
}
|
||||
asset.Data = idata;
|
||||
_receiver.AssetReceived(asset, req.IsTexture );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private void SetUpAssetDatabase()
|
||||
{
|
||||
Console.WriteLine("setting up Asset database");
|
||||
|
||||
AssetBase Image = new AssetBase();
|
||||
Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000001");
|
||||
Image.Name = "test Texture";
|
||||
this.LoadAsset(Image, true, "testpic2.jp2");
|
||||
AssetStorage store = new AssetStorage();
|
||||
store.Data = Image.Data;
|
||||
store.Name = Image.Name;
|
||||
store.UUID = Image.FullID;
|
||||
db.Set(store);
|
||||
db.Commit();
|
||||
|
||||
Image = new AssetBase();
|
||||
Image.FullID = new LLUUID("00000000-0000-0000-9999-000000000002");
|
||||
Image.Name = "test Texture2";
|
||||
this.LoadAsset(Image, true, "map_base.jp2");
|
||||
store = new AssetStorage();
|
||||
store.Data = Image.Data;
|
||||
store.Name = Image.Name;
|
||||
store.UUID = Image.FullID;
|
||||
db.Set(store);
|
||||
db.Commit();
|
||||
|
||||
|
||||
Image.FullID = new LLUUID("00000000-0000-0000-5005-000000000005");
|
||||
Image.Name = "Prim Base Texture";
|
||||
store = new AssetStorage();
|
||||
store.Data = Image.Data;
|
||||
store.Name = Image.Name;
|
||||
store.UUID = Image.FullID;
|
||||
db.Set(store);
|
||||
db.Commit();
|
||||
|
||||
Image = new AssetBase();
|
||||
Image.FullID = new LLUUID("66c41e39-38f9-f75a-024e-585989bfab73");
|
||||
Image.Name = "Shape";
|
||||
this.LoadAsset(Image, false, "base_shape.dat");
|
||||
store = new AssetStorage();
|
||||
store.Data = Image.Data;
|
||||
store.Name = Image.Name;
|
||||
store.UUID = Image.FullID;
|
||||
db.Set(store);
|
||||
db.Commit();
|
||||
|
||||
|
||||
}
|
||||
|
||||
private void LoadAsset(AssetBase info, bool image, string filename)
|
||||
{
|
||||
//should request Asset from storage manager
|
||||
//but for now read from file
|
||||
|
||||
string dataPath = System.AppDomain.CurrentDomain.BaseDirectory ; //+ folder;
|
||||
string fileName = Path.Combine(dataPath, filename);
|
||||
FileInfo fInfo = new FileInfo(fileName);
|
||||
long numBytes = fInfo.Length;
|
||||
FileStream fStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
|
||||
byte[] idata = new byte[numBytes];
|
||||
BinaryReader br = new BinaryReader(fStream);
|
||||
idata= br.ReadBytes((int)numBytes);
|
||||
br.Close();
|
||||
fStream.Close();
|
||||
info.Data = idata;
|
||||
//info.loaded=true;
|
||||
}
|
||||
}
|
||||
|
||||
public class LocalGridServer :IGridServer
|
||||
{
|
||||
public List<Login> Sessions = new List<Login>();
|
||||
|
||||
public LocalGridServer()
|
||||
{
|
||||
Sessions = new List<Login>();
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Local Grid Server class created");
|
||||
}
|
||||
|
||||
public bool RequestConnection()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
public AuthenticateResponse AuthenticateSession(LLUUID sessionID, LLUUID agentID, uint circuitCode)
|
||||
{
|
||||
//we are running local
|
||||
AuthenticateResponse user = new AuthenticateResponse();
|
||||
|
||||
lock(this.Sessions)
|
||||
{
|
||||
|
||||
for(int i = 0; i < Sessions.Count; i++)
|
||||
{
|
||||
if((Sessions[i].Agent == agentID) && (Sessions[i].Session == sessionID))
|
||||
{
|
||||
user.Authorised = true;
|
||||
user.LoginInfo = Sessions[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
return(user);
|
||||
}
|
||||
|
||||
public bool LogoutSession(LLUUID sessionID, LLUUID agentID, uint circuitCode)
|
||||
{
|
||||
return(true);
|
||||
}
|
||||
|
||||
public UUIDBlock RequestUUIDBlock()
|
||||
{
|
||||
UUIDBlock uuidBlock = new UUIDBlock();
|
||||
return(uuidBlock);
|
||||
}
|
||||
|
||||
public void RequestNeighbours()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
public void SetServerInfo(string ServerUrl, string ServerKey)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
|
||||
}
|
||||
/// <summary>
|
||||
/// used by the local login server to inform us of new sessions
|
||||
/// </summary>
|
||||
/// <param name="session"></param>
|
||||
public void AddNewSession(Login session)
|
||||
{
|
||||
lock(this.Sessions)
|
||||
{
|
||||
this.Sessions.Add(session);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class BlockingQueue< T > {
|
||||
private Queue< T > _queue = new Queue< T >();
|
||||
private object _queueSync = new object();
|
||||
|
||||
public void Enqueue(T value)
|
||||
{
|
||||
lock(_queueSync)
|
||||
{
|
||||
_queue.Enqueue(value);
|
||||
Monitor.Pulse(_queueSync);
|
||||
}
|
||||
}
|
||||
|
||||
public T Dequeue()
|
||||
{
|
||||
lock(_queueSync)
|
||||
{
|
||||
if( _queue.Count < 1)
|
||||
Monitor.Wait(_queueSync);
|
||||
|
||||
return _queue.Dequeue();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class AssetUUIDQuery : Predicate
|
||||
{
|
||||
private LLUUID _findID;
|
||||
|
||||
public AssetUUIDQuery(LLUUID find)
|
||||
{
|
||||
_findID = find;
|
||||
}
|
||||
public bool Match(AssetStorage asset)
|
||||
{
|
||||
return (asset.UUID == _findID);
|
||||
}
|
||||
}
|
||||
|
||||
public class AssetStorage
|
||||
{
|
||||
public byte[] Data;
|
||||
public sbyte Type;
|
||||
public string Name;
|
||||
public LLUUID UUID;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<OutputType>Library</OutputType>
|
||||
<RootNamespace>LocalGridServers</RootNamespace>
|
||||
<AssemblyName>LocalGridServers</AssemblyName>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{D7F0395B-FADC-4936-80A0-D95AACE92F62}</ProjectGuid>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<Optimize>False</Optimize>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugSymbols>True</DebugSymbols>
|
||||
<DebugType>Full</DebugType>
|
||||
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<Optimize>True</Optimize>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<DebugSymbols>False</DebugSymbols>
|
||||
<DebugType>None</DebugType>
|
||||
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="libsecondlife">
|
||||
<HintPath>..\..\..\bin\libsecondlife.dll</HintPath>
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
</Reference>
|
||||
<Reference Include="Db4objects.Db4o">
|
||||
<HintPath>..\..\..\bin\Db4objects.Db4o.dll</HintPath>
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="LocalGrid.cs" />
|
||||
<Compile Include="AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\ServerConsole\ServerConsole\ServerConsole.csproj">
|
||||
<Project>{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}</Project>
|
||||
<Name>ServerConsole</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\GridInterfaces\GridInterfaces.csproj">
|
||||
<Project>{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}</Project>
|
||||
<Name>GridInterfaces</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
|
||||
</Project>
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||
# SharpDevelop 2.1.0.2017
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocalGridServers", "LocalGridServers.csproj", "{D7F0395B-FADC-4936-80A0-D95AACE92F62}"
|
||||
EndProject
|
||||
Global
|
||||
EndGlobal
|
|
@ -0,0 +1,51 @@
|
|||
<?xml version="1.0"?>
|
||||
<project name="OpenSim" default="build" basedir=".">
|
||||
<description>nant buildfile for OpenSim</description>
|
||||
<property name="debug" value="true" overwrite="false" />
|
||||
<target name="clean" description="remove all generated files">
|
||||
<delete file="../../bin/LocalGridServers.dll" failonerror="false" />
|
||||
</target>
|
||||
|
||||
<target name="svnupdate" description="updates to latest SVN">
|
||||
<exec program="svn">
|
||||
<arg value="update" />
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
<target name="upgrade" description="updates from SVN and then builds" depends="clean,svnupdate,build">
|
||||
|
||||
</target>
|
||||
|
||||
<target name="build" description="compiles the source code">
|
||||
|
||||
<loadfile file="../../VERSION" property="svnver"/>
|
||||
<asminfo output="LocalGridServers/AssemblyInfo.cs" language="CSharp">
|
||||
<imports>
|
||||
<import namespace="System" />
|
||||
<import namespace="System.Reflection" />
|
||||
<import namespace="System.Runtime.InteropServices" />
|
||||
</imports>
|
||||
<attributes>
|
||||
<attribute type="ComVisibleAttribute" value="false" />
|
||||
<attribute type="CLSCompliantAttribute" value="false" />
|
||||
<attribute type="AssemblyVersionAttribute" value="${svnver}" />
|
||||
<attribute type="AssemblyTitleAttribute" value="opensim-localservers" />
|
||||
<attribute type="AssemblyDescriptionAttribute" value="local grid servers" />
|
||||
<attribute type="AssemblyCopyrightAttribute" value="Copyright © OGS development team 2007"/>
|
||||
</attributes>
|
||||
</asminfo>
|
||||
|
||||
<csc target="library" output="../../bin/LocalGridServers.dll" debug="${debug}" verbose="true" warninglevel="4">
|
||||
<references basedir="../../bin" failonempty="true">
|
||||
<include name="System" />
|
||||
<include name="System.Xml" />
|
||||
<include name="libsecondlife.dll" />
|
||||
<include name="GridInterfaces.dll" />
|
||||
<include name="ServerConsole.dll" />
|
||||
</references>
|
||||
<sources basedir="LocalGridServers/">
|
||||
<include name="*.cs" />
|
||||
</sources>
|
||||
</csc>
|
||||
</target>
|
||||
</project>
|
|
@ -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.*")]
|
|
@ -0,0 +1,139 @@
|
|||
/*
|
||||
* 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 <organization> 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 <copyright holder> ``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 <copyright holder> 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
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
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(PrimData prim)
|
||||
{
|
||||
IObjectSet result = db.Query(new UUIDQuery(prim.FullID));
|
||||
if(result.Count>0)
|
||||
{
|
||||
//prim already in storage
|
||||
//so update it
|
||||
PrimData found = (PrimData) result.Next();
|
||||
found.PathBegin = prim.PathBegin;
|
||||
found.PathCurve= prim.PathCurve;
|
||||
found.PathEnd = prim.PathEnd;
|
||||
found.PathRadiusOffset = prim.PathRadiusOffset;
|
||||
found.PathRevolutions = prim.PathRevolutions;
|
||||
found.PathScaleX= prim.PathScaleX;
|
||||
found.PathScaleY = prim.PathScaleY;
|
||||
found.PathShearX = prim.PathShearX;
|
||||
found.PathShearY = prim.PathShearY;
|
||||
found.PathSkew = prim.PathSkew;
|
||||
found.PathTaperX = prim.PathTaperX;
|
||||
found.PathTaperY = prim.PathTaperY;
|
||||
found.PathTwist = prim.PathTwist;
|
||||
found.PathTwistBegin = prim.PathTwistBegin;
|
||||
found.PCode = prim.PCode;
|
||||
found.ProfileBegin = prim.ProfileBegin;
|
||||
found.ProfileCurve = prim.ProfileCurve;
|
||||
found.ProfileEnd = prim.ProfileEnd;
|
||||
found.ProfileHollow = prim.ProfileHollow;
|
||||
found.Position = prim.Position;
|
||||
found.Rotation = prim.Rotation;
|
||||
db.Set(found);
|
||||
db.Commit();
|
||||
}
|
||||
else
|
||||
{
|
||||
//not in storage
|
||||
db.Set(prim);
|
||||
db.Commit();
|
||||
}
|
||||
}
|
||||
|
||||
public void RemovePrim(LLUUID primID)
|
||||
{
|
||||
IObjectSet result = db.Query(new UUIDQuery(primID));
|
||||
if(result.Count>0)
|
||||
{
|
||||
PrimData found = (PrimData) result.Next();
|
||||
db.Delete(found);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public void LoadPrimitives(ILocalStorageReceiver receiver)
|
||||
{
|
||||
IObjectSet result = db.Get(typeof(PrimData));
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Db4LocalStorage.cs: LoadPrimitives() - number of prims in storages is "+result.Count);
|
||||
foreach (PrimData 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(PrimData prim)
|
||||
{
|
||||
return (prim.FullID == _findID);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,53 @@
|
|||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<OutputType>Library</OutputType>
|
||||
<RootNamespace>Db4LocalStorage</RootNamespace>
|
||||
<AssemblyName>Db4LocalStorage</AssemblyName>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{74784F23-B0FD-484C-82C1-96C0215733DC}</ProjectGuid>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<Optimize>False</Optimize>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugSymbols>True</DebugSymbols>
|
||||
<DebugType>Full</DebugType>
|
||||
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<Optimize>True</Optimize>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<DebugSymbols>False</DebugSymbols>
|
||||
<DebugType>None</DebugType>
|
||||
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="libsecondlife">
|
||||
<HintPath>..\..\..\bin\libsecondlife.dll</HintPath>
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
</Reference>
|
||||
<Reference Include="Db4objects.Db4o">
|
||||
<HintPath>..\..\..\bin\Db4objects.Db4o.dll</HintPath>
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Db4LocalStorage.cs" />
|
||||
<Compile Include="AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\ServerConsole\ServerConsole\ServerConsole.csproj">
|
||||
<Project>{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}</Project>
|
||||
<Name>ServerConsole</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\GridInterfaces\GridInterfaces.csproj">
|
||||
<Project>{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}</Project>
|
||||
<Name>GridInterfaces</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
|
||||
</Project>
|
|
@ -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
|
|
@ -0,0 +1,341 @@
|
|||
/*
|
||||
Copyright (c) OpenSim project, http://osgrid.org/
|
||||
|
||||
|
||||
* All rights reserved.
|
||||
*
|
||||
* 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 <organization> 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 <copyright holder> ``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 <copyright holder> 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.Text;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Timers;
|
||||
using System.Reflection;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using libsecondlife;
|
||||
using libsecondlife.Packets;
|
||||
using OpenSim.world;
|
||||
using OpenSim.GridServers;
|
||||
using OpenSim.Assets;
|
||||
using ServerConsole;
|
||||
using PhysicsSystem;
|
||||
|
||||
namespace OpenSim
|
||||
{
|
||||
/// <summary>
|
||||
/// Description of MainForm.
|
||||
/// </summary>
|
||||
public class OpenSim_Main
|
||||
{
|
||||
public static OpenSim_Main sim;
|
||||
public static SimConfig cfg;
|
||||
public static World local_world;
|
||||
public static Grid gridServers;
|
||||
|
||||
public static Socket Server;
|
||||
private static IPEndPoint ServerIncoming;
|
||||
private static byte[] RecvBuffer = new byte[4096];
|
||||
private byte[] ZeroBuffer = new byte[8192];
|
||||
private static IPEndPoint ipeSender;
|
||||
private static EndPoint epSender;
|
||||
private static AsyncCallback ReceivedData;
|
||||
|
||||
public AssetCache assetCache;
|
||||
public InventoryManager inventoryManager;
|
||||
public DateTime startuptime;
|
||||
public Dictionary<EndPoint, OpenSimClient> ClientThreads = new Dictionary<EndPoint, OpenSimClient>();
|
||||
private PhysicsManager physManager;
|
||||
private System.Timers.Timer timer1 = new System.Timers.Timer();
|
||||
private string ConfigDll = "SimConfig.dll";
|
||||
private string _physicsEngine = "PhysX";
|
||||
public bool sandbox = false;
|
||||
public bool loginserver = false;
|
||||
|
||||
[STAThread]
|
||||
public static void Main( string[] args )
|
||||
{
|
||||
Console.WriteLine("OpenSim " + VersionInfo.Version + "\n");
|
||||
Console.WriteLine("Starting...\n");
|
||||
ServerConsole.MainConsole.Instance = new MServerConsole(ServerConsole.ConsoleBase.ConsoleType.Local,"",0);
|
||||
|
||||
sim = new OpenSim_Main();
|
||||
|
||||
for (int i = 0; i < args.Length; i++)
|
||||
{
|
||||
if(args[i] == "-sandbox")
|
||||
{
|
||||
sim.sandbox = true;
|
||||
}
|
||||
if(args[i] == "-loginserver")
|
||||
{
|
||||
sim.loginserver = true;
|
||||
}
|
||||
if(args[i] == "-realphysx")
|
||||
{
|
||||
sim._physicsEngine = "RealPhysX";
|
||||
OpenSim.world.Avatar.PhysicsEngineFlying = true;
|
||||
}
|
||||
}
|
||||
|
||||
//sim.SetUpAssetDatabase();
|
||||
OpenSim_Main.gridServers = new Grid();
|
||||
if(sim.sandbox)
|
||||
{
|
||||
OpenSim_Main.gridServers.AssetDll = "LocalGridServers.dll";
|
||||
OpenSim_Main.gridServers.GridDll = "LocalGridServers.dll";
|
||||
OpenSim_Main.gridServers.LoadPlugins();
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Starting in Sandbox mode");
|
||||
}
|
||||
else
|
||||
{
|
||||
OpenSim_Main.gridServers.AssetDll = "RemoteGridServers.dll";
|
||||
OpenSim_Main.gridServers.GridDll = "RemoteGridServers.dll";
|
||||
OpenSim_Main.gridServers.LoadPlugins();
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Starting in Grid mode");
|
||||
}
|
||||
|
||||
if(sim.loginserver && sim.sandbox)
|
||||
{
|
||||
LoginServer loginServer = new LoginServer(OpenSim_Main.gridServers.GridServer);
|
||||
loginServer.Startup();
|
||||
}
|
||||
|
||||
sim.assetCache = new AssetCache(OpenSim_Main.gridServers.AssetServer);
|
||||
sim.inventoryManager = new InventoryManager();
|
||||
|
||||
sim.Startup();
|
||||
|
||||
while(true) {
|
||||
ServerConsole.MainConsole.Instance.MainConsolePrompt();
|
||||
}
|
||||
}
|
||||
|
||||
private OpenSim_Main() {
|
||||
}
|
||||
|
||||
private void Startup() {
|
||||
startuptime=DateTime.Now;
|
||||
|
||||
// We check our local database first, then the grid for config options
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - Loading configuration");
|
||||
cfg = this.LoadConfigDll(this.ConfigDll);
|
||||
cfg.InitConfig();
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - Contacting gridserver");
|
||||
cfg.LoadFromGrid();
|
||||
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - We are " + cfg.RegionName + " at " + cfg.RegionLocX.ToString() + "," + cfg.RegionLocY.ToString());
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Initialising world");
|
||||
local_world = cfg.LoadWorld();
|
||||
|
||||
this.physManager = new PhysicsSystem.PhysicsManager();
|
||||
this.physManager.LoadPlugins();
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Startup() - Starting up messaging system");
|
||||
local_world.PhysScene = this.physManager.GetPhysicsScene(this._physicsEngine); //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();
|
||||
|
||||
this.assetCache.LoadDefaultTextureSet();
|
||||
MainServerListener();
|
||||
|
||||
timer1.Enabled = true;
|
||||
timer1.Interval = 100;
|
||||
timer1.Elapsed +=new ElapsedEventHandler( this.Timer1Tick );
|
||||
|
||||
|
||||
}
|
||||
|
||||
private SimConfig LoadConfigDll(string dllName)
|
||||
{
|
||||
Assembly pluginAssembly = Assembly.LoadFrom(dllName);
|
||||
SimConfig config = null;
|
||||
|
||||
foreach (Type pluginType in pluginAssembly.GetTypes())
|
||||
{
|
||||
if (pluginType.IsPublic)
|
||||
{
|
||||
if (!pluginType.IsAbstract)
|
||||
{
|
||||
Type typeInterface = pluginType.GetInterface("ISimConfig", true);
|
||||
|
||||
if (typeInterface != null)
|
||||
{
|
||||
ISimConfig plug = (ISimConfig)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
|
||||
config = plug.GetConfigObject();
|
||||
break;
|
||||
}
|
||||
|
||||
typeInterface = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
pluginAssembly = null;
|
||||
return config;
|
||||
}
|
||||
|
||||
private void OnReceivedData(IAsyncResult result) {
|
||||
ipeSender = new IPEndPoint(IPAddress.Any, 0);
|
||||
epSender = (EndPoint)ipeSender;
|
||||
Packet packet = null;
|
||||
int numBytes = Server.EndReceiveFrom(result, ref epSender);
|
||||
int packetEnd = numBytes - 1;
|
||||
packet = Packet.BuildPacket(RecvBuffer, ref packetEnd, ZeroBuffer);
|
||||
|
||||
// This is either a new client or a packet to send to an old one
|
||||
if(ClientThreads.ContainsKey(epSender)) {
|
||||
ClientThreads[epSender].InPacket(packet);
|
||||
} else if( packet.Type == PacketType.UseCircuitCode ) { // new client
|
||||
OpenSimClient newuser = new OpenSimClient(epSender,(UseCircuitCodePacket)packet);
|
||||
ClientThreads.Add(epSender, newuser);
|
||||
} else { // invalid client
|
||||
Console.Error.WriteLine("Main.cs:OnReceivedData() - WARNING: Got a packet from an invalid client - " + epSender.ToString());
|
||||
}
|
||||
Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null);
|
||||
}
|
||||
|
||||
private void MainServerListener() {
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:MainServerListener() - New thread started");
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:MainServerListener() - Opening UDP socket on " + cfg.IPListenAddr + ":" + cfg.IPListenPort);
|
||||
|
||||
ServerIncoming = new IPEndPoint(IPAddress.Any, cfg.IPListenPort);
|
||||
Server = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
|
||||
Server.Bind(ServerIncoming);
|
||||
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:MainServerListener() - UDP socket bound, getting ready to listen");
|
||||
|
||||
ipeSender = new IPEndPoint(IPAddress.Any, 0);
|
||||
epSender = (EndPoint) ipeSender;
|
||||
ReceivedData = new AsyncCallback(this.OnReceivedData);
|
||||
Server.BeginReceiveFrom(RecvBuffer, 0, RecvBuffer.Length, SocketFlags.None, ref epSender, ReceivedData, null);
|
||||
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:MainServerListener() - Listening...");
|
||||
|
||||
}
|
||||
|
||||
public static void Shutdown() {
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Shutdown() - Closing all threads");
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Main.cs:Shutdown() - Killing listener thread");
|
||||
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();
|
||||
OpenSim_Main.gridServers.Close();
|
||||
ServerConsole.MainConsole.Instance.Close();
|
||||
Environment.Exit(0);
|
||||
}
|
||||
|
||||
void Timer1Tick( object sender, System.EventArgs e )
|
||||
{
|
||||
|
||||
local_world.Update();
|
||||
}
|
||||
}
|
||||
|
||||
public class Grid
|
||||
{
|
||||
public IAssetServer AssetServer;
|
||||
public IGridServer GridServer;
|
||||
public string AssetDll = "";
|
||||
public string GridDll = "";
|
||||
|
||||
public Grid()
|
||||
{
|
||||
}
|
||||
|
||||
public void LoadPlugins()
|
||||
{
|
||||
this.AssetServer = this.LoadAssetDll(this.AssetDll);
|
||||
this.GridServer = this.LoadGridDll(this.GridDll);
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
this.AssetServer.Close();
|
||||
this.GridServer.Close();
|
||||
}
|
||||
private IAssetServer LoadAssetDll(string dllName)
|
||||
{
|
||||
Assembly pluginAssembly = Assembly.LoadFrom(dllName);
|
||||
IAssetServer server = null;
|
||||
|
||||
foreach (Type pluginType in pluginAssembly.GetTypes())
|
||||
{
|
||||
if (pluginType.IsPublic)
|
||||
{
|
||||
if (!pluginType.IsAbstract)
|
||||
{
|
||||
Type typeInterface = pluginType.GetInterface("IAssetPlugin", true);
|
||||
|
||||
if (typeInterface != null)
|
||||
{
|
||||
IAssetPlugin plug = (IAssetPlugin)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
|
||||
server = plug.GetAssetServer();
|
||||
break;
|
||||
}
|
||||
|
||||
typeInterface = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
pluginAssembly = null;
|
||||
return server;
|
||||
}
|
||||
|
||||
private IGridServer LoadGridDll(string dllName)
|
||||
{
|
||||
Assembly pluginAssembly = Assembly.LoadFrom(dllName);
|
||||
IGridServer server = null;
|
||||
|
||||
foreach (Type pluginType in pluginAssembly.GetTypes())
|
||||
{
|
||||
if (pluginType.IsPublic)
|
||||
{
|
||||
if (!pluginType.IsAbstract)
|
||||
{
|
||||
Type typeInterface = pluginType.GetInterface("IGridPlugin", true);
|
||||
|
||||
if (typeInterface != null)
|
||||
{
|
||||
IGridPlugin plug = (IGridPlugin)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
|
||||
server = plug.GetGridServer();
|
||||
break;
|
||||
}
|
||||
|
||||
typeInterface = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
pluginAssembly = null;
|
||||
return server;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,594 @@
|
|||
/*
|
||||
Copyright (c) OpenSim project, http://osgrid.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 <organization> 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 <copyright holder> ``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 <copyright holder> 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;
|
||||
using System.Collections.Generic;
|
||||
using libsecondlife;
|
||||
using libsecondlife.Packets;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.IO;
|
||||
using System.Threading;
|
||||
using System.Timers;
|
||||
using OpenSim.GridServers;
|
||||
using OpenSim.world;
|
||||
using OpenSim.Assets;
|
||||
|
||||
namespace OpenSim
|
||||
{
|
||||
/// <summary>
|
||||
/// Handles new client connections
|
||||
/// Constructor takes a single Packet and authenticates everything
|
||||
/// </summary>
|
||||
public class OpenSimClient {
|
||||
|
||||
public LLUUID AgentID;
|
||||
public LLUUID SessionID;
|
||||
public uint CircuitCode;
|
||||
public world.Avatar ClientAvatar;
|
||||
private UseCircuitCodePacket cirpack;
|
||||
private Thread ClientThread;
|
||||
public EndPoint userEP;
|
||||
private BlockingQueue<QueItem> PacketQueue;
|
||||
private Dictionary<uint, uint> PendingAcks = new Dictionary<uint, uint>();
|
||||
private Dictionary<uint, Packet> NeedAck = new Dictionary<uint, Packet>();
|
||||
private Dictionary<LLUUID, AssetBase> UploadedAssets = new Dictionary<LLUUID, AssetBase>();
|
||||
private System.Timers.Timer AckTimer;
|
||||
private uint Sequence = 0;
|
||||
private object SequenceLock = new object();
|
||||
private const int MAX_APPENDED_ACKS = 10;
|
||||
private const int RESEND_TIMEOUT = 4000;
|
||||
private const int MAX_SEQUENCE = 0xFFFFFF;
|
||||
private LLUUID newAssetFolder = LLUUID.Zero;
|
||||
private bool debug = false;
|
||||
|
||||
public void ack_pack(Packet Pack) {
|
||||
//libsecondlife.Packets.PacketAckPacket ack_it = new PacketAckPacket();
|
||||
//ack_it.Packets = new PacketAckPacket.PacketsBlock[1];
|
||||
//ack_it.Packets[0] = new PacketAckPacket.PacketsBlock();
|
||||
//ack_it.Packets[0].ID = Pack.Header.ID;
|
||||
//ack_it.Header.Reliable = false;
|
||||
|
||||
//OutPacket(ack_it);
|
||||
|
||||
if (Pack.Header.Reliable) {
|
||||
lock (PendingAcks) {
|
||||
uint sequence = (uint)Pack.Header.Sequence;
|
||||
if (!PendingAcks.ContainsKey(sequence)) { PendingAcks[sequence] = sequence; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ProcessInPacket(Packet Pack) {
|
||||
ack_pack(Pack);
|
||||
if(debug)
|
||||
{
|
||||
if(Pack.Type != PacketType.AgentUpdate)
|
||||
{
|
||||
Console.WriteLine(Pack.Type.ToString());
|
||||
}
|
||||
}
|
||||
switch(Pack.Type) {
|
||||
case PacketType.CompleteAgentMovement:
|
||||
ClientAvatar.CompleteMovement(OpenSim_Main.local_world);
|
||||
ClientAvatar.SendInitialPosition();
|
||||
break;
|
||||
case PacketType.RegionHandshakeReply:
|
||||
OpenSim_Main.local_world.SendLayerData(this);
|
||||
break;
|
||||
case PacketType.AgentWearablesRequest:
|
||||
ClientAvatar.SendInitialAppearance();
|
||||
foreach(OpenSimClient client in OpenSim_Main.sim.ClientThreads.Values) {
|
||||
if(client.AgentID != this.AgentID)
|
||||
{
|
||||
ObjectUpdatePacket objupdate = client.ClientAvatar.CreateUpdatePacket();
|
||||
this.OutPacket(objupdate);
|
||||
client.ClientAvatar.SendAppearanceToOtherAgent(this);
|
||||
}
|
||||
}
|
||||
OpenSim_Main.local_world.GetInitialPrims(this);
|
||||
break;
|
||||
case PacketType.ObjectAdd:
|
||||
OpenSim_Main.local_world.AddNewPrim((ObjectAddPacket)Pack, this);
|
||||
break;
|
||||
case PacketType.ObjectLink:
|
||||
ServerConsole.MainConsole.Instance.WriteLine(Pack.ToString());
|
||||
break;
|
||||
case PacketType.ObjectScale:
|
||||
ServerConsole.MainConsole.Instance.WriteLine(Pack.ToString());
|
||||
break;
|
||||
case PacketType.ObjectShape:
|
||||
ObjectShapePacket shape = (ObjectShapePacket)Pack;
|
||||
for(int i =0; i <shape.ObjectData.Length; i++)
|
||||
{
|
||||
foreach (Entity ent in OpenSim_Main.local_world.Entities.Values)
|
||||
{
|
||||
if(ent.localid == shape.ObjectData[i].ObjectLocalID)
|
||||
{
|
||||
((OpenSim.world.Primitive)ent).UpdateShape(shape.ObjectData[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case PacketType.MultipleObjectUpdate :
|
||||
MultipleObjectUpdatePacket multipleupdate = (MultipleObjectUpdatePacket)Pack;
|
||||
|
||||
for( int i = 0; i < multipleupdate.ObjectData.Length; i++ )
|
||||
{
|
||||
if( multipleupdate.ObjectData[ i ].Type == 9 ) //change position
|
||||
{
|
||||
libsecondlife.LLVector3 pos = new LLVector3(multipleupdate.ObjectData[ i ].Data, 0 );
|
||||
foreach (Entity ent in OpenSim_Main.local_world.Entities.Values)
|
||||
{
|
||||
if(ent.localid == multipleupdate.ObjectData[ i ].ObjectLocalID)
|
||||
{
|
||||
((OpenSim.world.Primitive)ent).UpdatePosition( pos);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
//should update stored position of the prim
|
||||
}
|
||||
else if(multipleupdate.ObjectData[i].Type == 10 )//rotation
|
||||
{
|
||||
libsecondlife.LLQuaternion rot = new LLQuaternion(multipleupdate.ObjectData[i].Data, 0, true);
|
||||
foreach (Entity ent in OpenSim_Main.local_world.Entities.Values)
|
||||
{
|
||||
if(ent.localid == multipleupdate.ObjectData[ i ].ObjectLocalID)
|
||||
{
|
||||
ent.rotation = new Axiom.MathLib.Quaternion(rot.W, rot.X, rot.Y, rot.W);
|
||||
((OpenSim.world.Primitive)ent).UpdateFlag = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if(multipleupdate.ObjectData[i].Type == 13 )//scale
|
||||
{
|
||||
|
||||
libsecondlife.LLVector3 scale = new LLVector3(multipleupdate.ObjectData[ i ].Data, 12 );
|
||||
foreach (Entity ent in OpenSim_Main.local_world.Entities.Values)
|
||||
{
|
||||
if(ent.localid == multipleupdate.ObjectData[ i ].ObjectLocalID)
|
||||
{
|
||||
((OpenSim.world.Primitive)ent).Scale = scale;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case PacketType.RequestImage:
|
||||
RequestImagePacket imageRequest = (RequestImagePacket) Pack;
|
||||
for( int i = 0; i < imageRequest.RequestImage.Length; i++ )
|
||||
{
|
||||
OpenSim_Main.sim.assetCache.AddTextureRequest(this, imageRequest.RequestImage[i].Image);
|
||||
}
|
||||
break;
|
||||
case PacketType.TransferRequest:
|
||||
//Console.WriteLine("OpenSimClient.cs:ProcessInPacket() - Got transfer request");
|
||||
TransferRequestPacket transfer = (TransferRequestPacket)Pack;
|
||||
OpenSim_Main.sim.assetCache.AddAssetRequest(this, transfer);
|
||||
break;
|
||||
case PacketType.AgentUpdate:
|
||||
ClientAvatar.HandleUpdate((AgentUpdatePacket)Pack);
|
||||
break;
|
||||
case PacketType.LogoutRequest:
|
||||
ServerConsole.MainConsole.Instance.WriteLine("OpenSimClient.cs:ProcessInPacket() - Got a logout request");
|
||||
//tell all clients to kill our object
|
||||
KillObjectPacket kill = new KillObjectPacket();
|
||||
kill.ObjectData = new KillObjectPacket.ObjectDataBlock[1];
|
||||
kill.ObjectData[0] = new KillObjectPacket.ObjectDataBlock();
|
||||
kill.ObjectData[0].ID = this.ClientAvatar.localid;
|
||||
foreach(OpenSimClient client in OpenSim_Main.sim.ClientThreads.Values) {
|
||||
client.OutPacket(kill);
|
||||
}
|
||||
OpenSim_Main.gridServers.GridServer.LogoutSession(this.SessionID, this.AgentID, this.CircuitCode);
|
||||
lock(OpenSim_Main.local_world.Entities) {
|
||||
OpenSim_Main.local_world.Entities.Remove(this.AgentID);
|
||||
}
|
||||
//need to do other cleaning up here too
|
||||
OpenSim_Main.sim.ClientThreads.Remove(this.userEP);
|
||||
this.ClientThread.Abort();
|
||||
break;
|
||||
case PacketType.ChatFromViewer:
|
||||
ChatFromViewerPacket inchatpack = (ChatFromViewerPacket)Pack;
|
||||
if(Helpers.FieldToString(inchatpack.ChatData.Message)=="") break;
|
||||
|
||||
System.Text.Encoding _enc = System.Text.Encoding.ASCII;
|
||||
libsecondlife.Packets.ChatFromSimulatorPacket reply = new ChatFromSimulatorPacket();
|
||||
reply.ChatData.Audible = 1;
|
||||
reply.ChatData.Message = inchatpack.ChatData.Message;
|
||||
reply.ChatData.ChatType = 1;
|
||||
reply.ChatData.SourceType = 1;
|
||||
reply.ChatData.Position = this.ClientAvatar.position;
|
||||
reply.ChatData.FromName = _enc.GetBytes(this.ClientAvatar.firstname + " " + this.ClientAvatar.lastname + "\0");
|
||||
reply.ChatData.OwnerID = this.AgentID;
|
||||
reply.ChatData.SourceID = this.AgentID;
|
||||
foreach(OpenSimClient client in OpenSim_Main.sim.ClientThreads.Values) {
|
||||
client.OutPacket(reply);
|
||||
}
|
||||
break;
|
||||
case PacketType.ObjectImage:
|
||||
ObjectImagePacket imagePack =(ObjectImagePacket) Pack;
|
||||
for(int i = 0 ; i < imagePack.ObjectData.Length; i++)
|
||||
{
|
||||
foreach (Entity ent in OpenSim_Main.local_world.Entities.Values)
|
||||
{
|
||||
if(ent.localid == imagePack.ObjectData[i].ObjectLocalID)
|
||||
{
|
||||
((OpenSim.world.Primitive)ent).UpdateTexture(imagePack.ObjectData[i].TextureEntry);
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
case PacketType.ObjectFlagUpdate:
|
||||
ObjectFlagUpdatePacket flags = (ObjectFlagUpdatePacket) Pack;
|
||||
foreach (Entity ent in OpenSim_Main.local_world.Entities.Values)
|
||||
{
|
||||
if(ent.localid == flags.AgentData.ObjectLocalID)
|
||||
{
|
||||
((OpenSim.world.Primitive)ent).UpdateObjectFlags(flags);
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
case PacketType.AssetUploadRequest:
|
||||
//AssetUploadRequestPacket request = (AssetUploadRequestPacket)Pack;
|
||||
//Console.WriteLine("upload request "+ request.AssetBlock.TransactionID);
|
||||
//AssetBase newAsset = OpenSim_Main.sim.assetCache.UploadPacket(request);
|
||||
//Console.WriteLine(request.ToString());
|
||||
|
||||
/*if(newAsset != null)
|
||||
{
|
||||
if(!this.UploadedAssets.ContainsKey(newAsset.FullID))
|
||||
{
|
||||
this.UploadedAssets.Add(newAsset.FullID, newAsset);
|
||||
}
|
||||
}*/
|
||||
/*AssetUploadCompletePacket response = new AssetUploadCompletePacket();
|
||||
response.AssetBlock.Type =request.AssetBlock.Type;
|
||||
response.AssetBlock.Success = false;
|
||||
response.AssetBlock.UUID = request.AssetBlock.TransactionID;
|
||||
|
||||
this.OutPacket(response);*/
|
||||
break;
|
||||
case PacketType.AssetUploadComplete:
|
||||
//AssetUploadCompletePacket complete = (AssetUploadCompletePacket)Pack;
|
||||
//Console.WriteLine("upload complete "+ complete.AssetBlock.UUID);
|
||||
|
||||
/*AssetBase completedAsset = OpenSim_Main.sim.assetCache.TransactionComplete(complete.AssetBlock.UUID);
|
||||
if(completedAsset != null)
|
||||
{
|
||||
if(!this.UploadedAssets.ContainsKey(completedAsset.FullID))
|
||||
{
|
||||
this.UploadedAssets.Remove(completedAsset.FullID);
|
||||
if(this.newAssetFolder != LLUUID.Zero)
|
||||
{
|
||||
OpenSim_Main.sim.inventoryManager.AddNewInventoryItem(this, this.newAssetFolder, completedAsset);
|
||||
}
|
||||
}
|
||||
} */
|
||||
break;
|
||||
case PacketType.CreateInventoryFolder:
|
||||
Console.WriteLine(Pack.ToString());
|
||||
break;
|
||||
case PacketType.CreateInventoryItem:
|
||||
Console.WriteLine(Pack.ToString());
|
||||
break;
|
||||
case PacketType.FetchInventory:
|
||||
Console.WriteLine("fetch item packet");
|
||||
FetchInventoryPacket FetchInventory = (FetchInventoryPacket)Pack;
|
||||
OpenSim_Main.sim.inventoryManager.FetchInventory(this, FetchInventory);
|
||||
break;
|
||||
case PacketType.FetchInventoryDescendents:
|
||||
FetchInventoryDescendentsPacket Fetch = (FetchInventoryDescendentsPacket)Pack;
|
||||
OpenSim_Main.sim.inventoryManager.FetchInventoryDescendents(this, Fetch);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void ResendUnacked()
|
||||
{
|
||||
int now = Environment.TickCount;
|
||||
|
||||
lock (NeedAck)
|
||||
{
|
||||
foreach (Packet packet in NeedAck.Values)
|
||||
{
|
||||
if ((now - packet.TickCount > RESEND_TIMEOUT) && (!packet.Header.Resent))
|
||||
{
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Resending " + packet.Type.ToString() + " packet, " +
|
||||
(now - packet.TickCount) + "ms have passed");
|
||||
|
||||
packet.Header.Resent = true;
|
||||
OutPacket(packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SendAcks()
|
||||
{
|
||||
lock (PendingAcks)
|
||||
{
|
||||
if (PendingAcks.Count > 0)
|
||||
{
|
||||
if (PendingAcks.Count > 250)
|
||||
{
|
||||
// FIXME: Handle the odd case where we have too many pending ACKs queued up
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Too many ACKs queued up!");
|
||||
return;
|
||||
}
|
||||
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Sending PacketAck");
|
||||
|
||||
|
||||
int i = 0;
|
||||
PacketAckPacket acks = new PacketAckPacket();
|
||||
acks.Packets = new PacketAckPacket.PacketsBlock[PendingAcks.Count];
|
||||
|
||||
foreach (uint ack in PendingAcks.Values)
|
||||
{
|
||||
acks.Packets[i] = new PacketAckPacket.PacketsBlock();
|
||||
acks.Packets[i].ID = ack;
|
||||
i++;
|
||||
}
|
||||
|
||||
acks.Header.Reliable = false;
|
||||
OutPacket(acks);
|
||||
|
||||
PendingAcks.Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void AckTimer_Elapsed(object sender, ElapsedEventArgs ea)
|
||||
{
|
||||
SendAcks();
|
||||
ResendUnacked();
|
||||
}
|
||||
|
||||
public void ProcessOutPacket(Packet Pack) {
|
||||
|
||||
// Keep track of when this packet was sent out
|
||||
Pack.TickCount = Environment.TickCount;
|
||||
|
||||
if (!Pack.Header.Resent)
|
||||
{
|
||||
// Set the sequence number
|
||||
lock (SequenceLock)
|
||||
{
|
||||
if (Sequence >= MAX_SEQUENCE)
|
||||
Sequence = 1;
|
||||
else
|
||||
Sequence++;
|
||||
Pack.Header.Sequence = Sequence;
|
||||
}
|
||||
|
||||
if (Pack.Header.Reliable) //DIRTY HACK
|
||||
{
|
||||
lock (NeedAck)
|
||||
{
|
||||
if (!NeedAck.ContainsKey(Pack.Header.Sequence))
|
||||
{
|
||||
NeedAck.Add(Pack.Header.Sequence, Pack);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Client.Log("Attempted to add a duplicate sequence number (" +
|
||||
// packet.Header.Sequence + ") to the NeedAck dictionary for packet type " +
|
||||
// packet.Type.ToString(), Helpers.LogLevel.Warning);
|
||||
}
|
||||
}
|
||||
|
||||
// Don't append ACKs to resent packets, in case that's what was causing the
|
||||
// delivery to fail
|
||||
if (!Pack.Header.Resent)
|
||||
{
|
||||
// Append any ACKs that need to be sent out to this packet
|
||||
lock (PendingAcks)
|
||||
{
|
||||
if (PendingAcks.Count > 0 && PendingAcks.Count < MAX_APPENDED_ACKS &&
|
||||
Pack.Type != PacketType.PacketAck &&
|
||||
Pack.Type != PacketType.LogoutRequest)
|
||||
{
|
||||
Pack.Header.AckList = new uint[PendingAcks.Count];
|
||||
int i = 0;
|
||||
|
||||
foreach (uint ack in PendingAcks.Values)
|
||||
{
|
||||
Pack.Header.AckList[i] = ack;
|
||||
i++;
|
||||
}
|
||||
|
||||
PendingAcks.Clear();
|
||||
Pack.Header.AppendedAcks = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//ServerConsole.MainConsole.Instance.WriteLine("OUT: \n" + Pack.ToString());
|
||||
|
||||
byte[] ZeroOutBuffer = new byte[4096];
|
||||
byte[] sendbuffer;
|
||||
sendbuffer = Pack.ToBytes();
|
||||
|
||||
try {
|
||||
if (Pack.Header.Zerocoded) {
|
||||
int packetsize = Helpers.ZeroEncode(sendbuffer, sendbuffer.Length, ZeroOutBuffer);
|
||||
OpenSim_Main.Server.SendTo(ZeroOutBuffer, packetsize, SocketFlags.None,userEP);
|
||||
} else {
|
||||
OpenSim_Main.Server.SendTo(sendbuffer, sendbuffer.Length, SocketFlags.None,userEP);
|
||||
}
|
||||
} catch (Exception) {
|
||||
ServerConsole.MainConsole.Instance.WriteLine("OpenSimClient.cs:ProcessOutPacket() - WARNING: Socket exception occurred on connection " + userEP.ToString() + " - killing thread");
|
||||
ClientThread.Abort();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void InPacket(Packet NewPack) {
|
||||
// Handle appended ACKs
|
||||
if (NewPack.Header.AppendedAcks)
|
||||
{
|
||||
lock (NeedAck)
|
||||
{
|
||||
foreach (uint ack in NewPack.Header.AckList)
|
||||
{
|
||||
NeedAck.Remove(ack);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Handle PacketAck packets
|
||||
if (NewPack.Type == PacketType.PacketAck)
|
||||
{
|
||||
PacketAckPacket ackPacket = (PacketAckPacket)NewPack;
|
||||
|
||||
lock (NeedAck)
|
||||
{
|
||||
foreach (PacketAckPacket.PacketsBlock block in ackPacket.Packets)
|
||||
{
|
||||
NeedAck.Remove(block.ID);
|
||||
}
|
||||
}
|
||||
} else if( ( NewPack.Type == PacketType.StartPingCheck ) ) {
|
||||
//reply to pingcheck
|
||||
libsecondlife.Packets.StartPingCheckPacket startPing = (libsecondlife.Packets.StartPingCheckPacket)NewPack;
|
||||
libsecondlife.Packets.CompletePingCheckPacket endPing = new CompletePingCheckPacket();
|
||||
endPing.PingID.PingID = startPing.PingID.PingID;
|
||||
OutPacket(endPing);
|
||||
}
|
||||
else
|
||||
{
|
||||
QueItem item = new QueItem();
|
||||
item.Packet = NewPack;
|
||||
item.Incoming = true;
|
||||
this.PacketQueue.Enqueue(item);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public void OutPacket(Packet NewPack) {
|
||||
QueItem item = new QueItem();
|
||||
item.Packet = NewPack;
|
||||
item.Incoming = false;
|
||||
this.PacketQueue.Enqueue(item);
|
||||
}
|
||||
|
||||
public OpenSimClient(EndPoint remoteEP, UseCircuitCodePacket initialcirpack) {
|
||||
ServerConsole.MainConsole.Instance.WriteLine("OpenSimClient.cs - Started up new client thread to handle incoming request");
|
||||
cirpack = initialcirpack;
|
||||
userEP = remoteEP;
|
||||
PacketQueue = new BlockingQueue<QueItem>();
|
||||
AckTimer = new System.Timers.Timer(500);
|
||||
AckTimer.Elapsed += new ElapsedEventHandler(AckTimer_Elapsed);
|
||||
AckTimer.Start();
|
||||
|
||||
ClientThread = new Thread(new ThreadStart(AuthUser));
|
||||
ClientThread.IsBackground = true;
|
||||
ClientThread.Start();
|
||||
}
|
||||
|
||||
private void ClientLoop() {
|
||||
ServerConsole.MainConsole.Instance.WriteLine("OpenSimClient.cs:ClientLoop() - Entered loop");
|
||||
while(true) {
|
||||
QueItem nextPacket = PacketQueue.Dequeue();
|
||||
if(nextPacket.Incoming)
|
||||
{
|
||||
//is a incoming packet
|
||||
ProcessInPacket(nextPacket.Packet);
|
||||
}
|
||||
else
|
||||
{
|
||||
//is a out going packet
|
||||
ProcessOutPacket(nextPacket.Packet);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void InitNewClient() {
|
||||
ServerConsole.MainConsole.Instance.WriteLine("OpenSimClient.cs:InitNewClient() - Adding viewer agent to world");
|
||||
OpenSim_Main.local_world.AddViewerAgent(this);
|
||||
world.Entity tempent=OpenSim_Main.local_world.Entities[this.AgentID];
|
||||
this.ClientAvatar=(world.Avatar)tempent;
|
||||
}
|
||||
|
||||
private void AuthUser()
|
||||
{
|
||||
AuthenticateResponse sessionInfo = OpenSim_Main.gridServers.GridServer.AuthenticateSession(cirpack.CircuitCode.SessionID, cirpack.CircuitCode.ID, cirpack.CircuitCode.Code);
|
||||
if(!sessionInfo.Authorised)
|
||||
{
|
||||
//session/circuit not authorised
|
||||
ServerConsole.MainConsole.Instance.WriteLine("OpenSimClient.cs:AuthUser() - New user request denied to " + userEP.ToString());
|
||||
ClientThread.Abort();
|
||||
}
|
||||
else
|
||||
{
|
||||
ServerConsole.MainConsole.Instance.WriteLine("OpenSimClient.cs:AuthUser() - Got authenticated connection from " + userEP.ToString());
|
||||
//session is authorised
|
||||
this.AgentID=cirpack.CircuitCode.ID;
|
||||
this.SessionID=cirpack.CircuitCode.SessionID;
|
||||
this.CircuitCode=cirpack.CircuitCode.Code;
|
||||
InitNewClient();
|
||||
this.ClientAvatar.firstname = sessionInfo.LoginInfo.First;
|
||||
this.ClientAvatar.lastname = sessionInfo.LoginInfo.Last;
|
||||
if(sessionInfo.LoginInfo.InventoryFolder != null)
|
||||
{
|
||||
this.CreateInventory(sessionInfo.LoginInfo.InventoryFolder);
|
||||
if(sessionInfo.LoginInfo.BaseFolder != null)
|
||||
{
|
||||
OpenSim_Main.sim.inventoryManager.CreateNewInventoryFolder(this, sessionInfo.LoginInfo.BaseFolder);
|
||||
this.newAssetFolder = sessionInfo.LoginInfo.BaseFolder;
|
||||
AssetBase[] inventorySet = OpenSim_Main.sim.assetCache.CreateNewInventorySet(this.AgentID);
|
||||
if(inventorySet != null)
|
||||
{
|
||||
for( int i = 0; i < inventorySet.Length; i++)
|
||||
{
|
||||
if(inventorySet[i] != null)
|
||||
{
|
||||
Console.WriteLine(Helpers.FieldToString(inventorySet[i].Data));
|
||||
OpenSim_Main.sim.inventoryManager.AddNewInventoryItem(this, sessionInfo.LoginInfo.BaseFolder, inventorySet[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
ClientLoop();
|
||||
}
|
||||
}
|
||||
|
||||
private void CreateInventory(LLUUID baseFolder)
|
||||
{
|
||||
AgentInventory inventory = new AgentInventory();
|
||||
inventory.AgentID = this.AgentID;
|
||||
OpenSim_Main.sim.inventoryManager.AddNewAgentsInventory(inventory);
|
||||
OpenSim_Main.sim.inventoryManager.CreateNewInventoryFolder(this, baseFolder);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,202 @@
|
|||
/*
|
||||
* 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 <organization> 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 <copyright holder> ``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 <copyright holder> 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;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using System.IO;
|
||||
using System.Net;
|
||||
using libsecondlife;
|
||||
using libsecondlife.Packets;
|
||||
using ServerConsole;
|
||||
|
||||
namespace OpenSim
|
||||
{
|
||||
/// <summary>
|
||||
/// Description of ServerConsole.
|
||||
/// </summary>
|
||||
public class MServerConsole : ConsoleBase
|
||||
{
|
||||
|
||||
private ConsoleType ConsType;
|
||||
StreamWriter Log;
|
||||
|
||||
|
||||
// STUPID HACK ALERT!!!! STUPID HACK ALERT!!!!!
|
||||
// constype - the type of console to use (see enum ConsoleType)
|
||||
// sparam - depending on the console type:
|
||||
// TCP - the IP to bind to (127.0.0.1 if blank)
|
||||
// Local - param ignored
|
||||
// SimChat - the AgentID of this sim's admin
|
||||
// and for the iparam:
|
||||
// TCP - the port to bind to
|
||||
// Local - param ignored
|
||||
// SimChat - the chat channel to accept commands from
|
||||
public MServerConsole(ConsoleType constype, string sparam, int iparam) {
|
||||
ConsType = constype;
|
||||
switch(constype) {
|
||||
case ConsoleType.Local:
|
||||
Console.WriteLine("ServerConsole.cs - creating new local console");
|
||||
Console.WriteLine("Logs will be saved to current directory in opensim-console.log");
|
||||
Log=File.AppendText("opensim-console.log");
|
||||
Log.WriteLine("========================================================================");
|
||||
//Log.WriteLine("OpenSim " + VersionInfo.Version + " Started at " + DateTime.Now.ToString());
|
||||
break;
|
||||
case ConsoleType.TCP:
|
||||
break;
|
||||
case ConsoleType.SimChat:
|
||||
break;
|
||||
|
||||
default:
|
||||
Console.WriteLine("ServerConsole.cs - what are you smoking? that isn't a valid console type!");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public override void Close() {
|
||||
Log.WriteLine("OpenSim shutdown at " + DateTime.Now.ToString());
|
||||
Log.Close();
|
||||
}
|
||||
|
||||
// You know what ReadLine() and WriteLine() do, right? And Read() and Write()? Right, you do actually know C#, right? Are you actually a programmer? Do you know english? Do you find my sense of humour in comments irritating? Good, glad you're still here
|
||||
public override void WriteLine(string Line) {
|
||||
Log.WriteLine(Line);
|
||||
Console.WriteLine(Line);
|
||||
return;
|
||||
}
|
||||
|
||||
public override string ReadLine() {
|
||||
string TempStr=Console.ReadLine();
|
||||
Log.WriteLine(TempStr);
|
||||
return TempStr;
|
||||
}
|
||||
|
||||
public override int Read() {
|
||||
int TempInt= Console.Read();
|
||||
Log.Write((char)TempInt);
|
||||
return TempInt;
|
||||
}
|
||||
|
||||
public override void Write(string Line) {
|
||||
Console.Write(Line);
|
||||
Log.Write(Line);
|
||||
return;
|
||||
}
|
||||
|
||||
// Displays a command prompt and waits for the user to enter a string, then returns that string
|
||||
public override string CmdPrompt(string prompt) {
|
||||
this.Write(prompt);
|
||||
return this.ReadLine();
|
||||
}
|
||||
|
||||
// Displays a command prompt and returns a default value if the user simply presses enter
|
||||
public override string CmdPrompt(string prompt, string defaultresponse) {
|
||||
string temp=CmdPrompt(prompt);
|
||||
if(temp=="") {
|
||||
return defaultresponse;
|
||||
} else {
|
||||
return temp;
|
||||
}
|
||||
}
|
||||
|
||||
// Displays a command prompt and returns a default value, user may only enter 1 of 2 options
|
||||
public override string CmdPrompt(string prompt, string defaultresponse, string OptionA, string OptionB) {
|
||||
bool itisdone=false;
|
||||
string temp=CmdPrompt(prompt,defaultresponse);
|
||||
while(itisdone==false) {
|
||||
if((temp==OptionA) || (temp==OptionB)) {
|
||||
itisdone=true;
|
||||
} else {
|
||||
this.WriteLine("Valid options are " + OptionA + " or " + OptionB);
|
||||
temp=CmdPrompt(prompt,defaultresponse);
|
||||
}
|
||||
}
|
||||
return temp;
|
||||
}
|
||||
|
||||
// Runs a command with a number of parameters
|
||||
public override Object RunCmd(string Cmd, string[] cmdparams) {
|
||||
switch(Cmd) {
|
||||
case "help":
|
||||
this.WriteLine("show users - show info about connected users");
|
||||
this.WriteLine("shutdown - disconnect all clients and shutdown");
|
||||
this.WriteLine("regenerate - regenerate the sim's terrain");
|
||||
break;
|
||||
|
||||
case "show":
|
||||
ShowCommands(cmdparams[0]);
|
||||
break;
|
||||
|
||||
case "regenerate":
|
||||
OpenSim_Main.local_world.RegenerateTerrain();
|
||||
break;
|
||||
|
||||
case "shutdown":
|
||||
OpenSim_Main.Shutdown();
|
||||
break;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
// Shows data about something
|
||||
public override void ShowCommands(string ShowWhat) {
|
||||
switch(ShowWhat) {
|
||||
case "uptime":
|
||||
this.WriteLine("OpenSim has been running since " + OpenSim_Main.sim.startuptime.ToString());
|
||||
this.WriteLine("That is " + (DateTime.Now-OpenSim_Main.sim.startuptime).ToString());
|
||||
break;
|
||||
case "users":
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
// Displays a prompt to the user and then runs the command they entered
|
||||
public override void MainConsolePrompt() {
|
||||
string[] tempstrarray;
|
||||
string tempstr = this.CmdPrompt("OpenSim-" + OpenSim_Main.cfg.RegionHandle.ToString() + " # ");
|
||||
tempstrarray = tempstr.Split(' ');
|
||||
string cmd=tempstrarray[0];
|
||||
Array.Reverse(tempstrarray);
|
||||
Array.Resize<string>(ref tempstrarray,tempstrarray.Length-1);
|
||||
Array.Reverse(tempstrarray);
|
||||
string[] cmdparams=(string[])tempstrarray;
|
||||
RunCmd(cmd,cmdparams);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -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("RemoteGridServers")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("RemoteGridServers")]
|
||||
[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.*")]
|
|
@ -0,0 +1,250 @@
|
|||
/*
|
||||
* 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 <organization> 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 <copyright holder> ``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 <copyright holder> 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 System.Threading;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.IO;
|
||||
using libsecondlife;
|
||||
using OpenSim.GridServers;
|
||||
|
||||
namespace RemoteGridServers
|
||||
{
|
||||
/// <summary>
|
||||
///
|
||||
/// </summary>
|
||||
///
|
||||
|
||||
public class RemoteGridPlugin : IGridPlugin
|
||||
{
|
||||
public RemoteGridPlugin()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public IGridServer GetGridServer()
|
||||
{
|
||||
return(new RemoteGridServer());
|
||||
}
|
||||
}
|
||||
|
||||
public class RemoteAssetPlugin : IAssetPlugin
|
||||
{
|
||||
public RemoteAssetPlugin()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public IAssetServer GetAssetServer()
|
||||
{
|
||||
return(new RemoteAssetServer());
|
||||
}
|
||||
}
|
||||
public class RemoteGridServer :IGridServer
|
||||
{
|
||||
private string GridServerUrl;
|
||||
private string GridSendKey;
|
||||
|
||||
public RemoteGridServer()
|
||||
{
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Remote Grid Server class created");
|
||||
}
|
||||
|
||||
public bool RequestConnection()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
public AuthenticateResponse AuthenticateSession(LLUUID sessionID, LLUUID agentID, uint circuitCode)
|
||||
{
|
||||
AuthenticateResponse user = new AuthenticateResponse();
|
||||
|
||||
WebRequest CheckSession = WebRequest.Create(GridServerUrl + "/usersessions/" + GridSendKey + "/" + agentID.ToString() + "/" + circuitCode.ToString() + "/exists");
|
||||
WebResponse GridResponse = CheckSession.GetResponse();
|
||||
StreamReader sr = new StreamReader(GridResponse.GetResponseStream());
|
||||
String grTest = sr.ReadLine();
|
||||
sr.Close();
|
||||
GridResponse.Close();
|
||||
if(String.IsNullOrEmpty(grTest) || grTest.Equals("1"))
|
||||
{
|
||||
// YAY! Valid login
|
||||
user.Authorised = true;
|
||||
user.LoginInfo = new Login();
|
||||
user.LoginInfo.Agent = agentID;
|
||||
user.LoginInfo.Session = sessionID;
|
||||
user.LoginInfo.First = "";
|
||||
user.LoginInfo.Last = "";
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// Invalid
|
||||
user.Authorised = false;
|
||||
}
|
||||
|
||||
return(user);
|
||||
}
|
||||
|
||||
public bool LogoutSession(LLUUID sessionID, LLUUID agentID, uint circuitCode)
|
||||
{
|
||||
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();
|
||||
sr.Close();
|
||||
GridResponse.Close();
|
||||
ServerConsole.MainConsole.Instance.WriteLine("DEBUG: " + grTest);
|
||||
return(true);
|
||||
}
|
||||
|
||||
public UUIDBlock RequestUUIDBlock()
|
||||
{
|
||||
UUIDBlock uuidBlock = new UUIDBlock();
|
||||
return(uuidBlock);
|
||||
}
|
||||
|
||||
public void RequestNeighbours()
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
public void SetServerInfo(string ServerUrl, string ServerKey)
|
||||
{
|
||||
this.GridServerUrl = ServerUrl;
|
||||
this.GridSendKey = ServerKey;
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void AddNewSession(Login session)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class RemoteAssetServer : IAssetServer
|
||||
{
|
||||
private IAssetReceiver _receiver;
|
||||
private BlockingQueue<ARequest> _assetRequests;
|
||||
private Thread _remoteAssetServerThread;
|
||||
private string AssetServerUrl;
|
||||
private string AssetSendKey;
|
||||
|
||||
public RemoteAssetServer()
|
||||
{
|
||||
this._assetRequests = new BlockingQueue<ARequest>();
|
||||
this._remoteAssetServerThread = new Thread(new ThreadStart(RunRequests));
|
||||
this._remoteAssetServerThread.IsBackground = true;
|
||||
this._remoteAssetServerThread.Start();
|
||||
ServerConsole.MainConsole.Instance.WriteLine("Remote Asset Server class created");
|
||||
}
|
||||
|
||||
public void SetReceiver(IAssetReceiver receiver)
|
||||
{
|
||||
this._receiver = receiver;
|
||||
}
|
||||
|
||||
public void RequestAsset(LLUUID assetID, bool isTexture)
|
||||
{
|
||||
ARequest req = new ARequest();
|
||||
req.AssetID = assetID;
|
||||
req.IsTexture = isTexture;
|
||||
this._assetRequests.Enqueue(req);
|
||||
}
|
||||
|
||||
public void UpdateAsset(AssetBase asset)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void UploadNewAsset(AssetBase asset)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void SetServerInfo(string ServerUrl, string ServerKey)
|
||||
{
|
||||
this.AssetServerUrl = ServerUrl;
|
||||
this.AssetSendKey = ServerKey;
|
||||
}
|
||||
|
||||
public void Close()
|
||||
{
|
||||
|
||||
}
|
||||
private void RunRequests()
|
||||
{
|
||||
while(true)
|
||||
{
|
||||
//we need to add support for the asset server not knowing about a requested asset
|
||||
ARequest req = this._assetRequests.Dequeue();
|
||||
LLUUID assetID = req.AssetID;
|
||||
ServerConsole.MainConsole.Instance.WriteLine(" RemoteAssetServer- Got a AssetServer request, processing it");
|
||||
WebRequest AssetLoad = WebRequest.Create(this.AssetServerUrl + "getasset/" + AssetSendKey + "/" + assetID + "/data");
|
||||
WebResponse AssetResponse = AssetLoad.GetResponse();
|
||||
byte[] idata = new byte[(int)AssetResponse.ContentLength];
|
||||
BinaryReader br = new BinaryReader(AssetResponse.GetResponseStream());
|
||||
idata = br.ReadBytes((int)AssetResponse.ContentLength);
|
||||
br.Close();
|
||||
|
||||
AssetBase asset = new AssetBase();
|
||||
asset.FullID = assetID;
|
||||
asset.Data = idata;
|
||||
_receiver.AssetReceived(asset, req.IsTexture );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class BlockingQueue< T > {
|
||||
private Queue< T > _queue = new Queue< T >();
|
||||
private object _queueSync = new object();
|
||||
|
||||
public void Enqueue(T value)
|
||||
{
|
||||
lock(_queueSync)
|
||||
{
|
||||
_queue.Enqueue(value);
|
||||
Monitor.Pulse(_queueSync);
|
||||
}
|
||||
}
|
||||
|
||||
public T Dequeue()
|
||||
{
|
||||
lock(_queueSync)
|
||||
{
|
||||
if( _queue.Count < 1)
|
||||
Monitor.Wait(_queueSync);
|
||||
|
||||
return _queue.Dequeue();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<OutputType>Library</OutputType>
|
||||
<RootNamespace>RemoteGridServers</RootNamespace>
|
||||
<AssemblyName>RemoteGridServers</AssemblyName>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{CF0E7E62-34F4-4AB2-BDBD-AFC63224A7E5}</ProjectGuid>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<Optimize>False</Optimize>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugSymbols>True</DebugSymbols>
|
||||
<DebugType>Full</DebugType>
|
||||
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<Optimize>True</Optimize>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<DebugSymbols>False</DebugSymbols>
|
||||
<DebugType>None</DebugType>
|
||||
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="libsecondlife">
|
||||
<HintPath>..\..\..\bin\libsecondlife.dll</HintPath>
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="RemoteGrid.cs" />
|
||||
<Compile Include="AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\ServerConsole\ServerConsole\ServerConsole.csproj">
|
||||
<Project>{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}</Project>
|
||||
<Name>ServerConsole</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\..\GridInterfaces\GridInterfaces.csproj">
|
||||
<Project>{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}</Project>
|
||||
<Name>GridInterfaces</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
|
||||
</Project>
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||
# SharpDevelop 2.1.0.2017
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RemoteGridServers", "RemoteGridServers.csproj", "{CF0E7E62-34F4-4AB2-BDBD-AFC63224A7E5}"
|
||||
EndProject
|
||||
Global
|
||||
EndGlobal
|
|
@ -0,0 +1,51 @@
|
|||
<?xml version="1.0"?>
|
||||
<project name="OpenSim" default="build" basedir=".">
|
||||
<description>nant buildfile for OpenSim</description>
|
||||
<property name="debug" value="true" overwrite="false" />
|
||||
<target name="clean" description="remove all generated files">
|
||||
<delete file="../../bin/RemoteGridServers.dll" failonerror="false" />
|
||||
</target>
|
||||
|
||||
<target name="svnupdate" description="updates to latest SVN">
|
||||
<exec program="svn">
|
||||
<arg value="update" />
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
<target name="upgrade" description="updates from SVN and then builds" depends="clean,svnupdate,build">
|
||||
|
||||
</target>
|
||||
|
||||
<target name="build" description="compiles the source code">
|
||||
|
||||
<loadfile file="../../VERSION" property="svnver"/>
|
||||
<asminfo output="RemoteGridServers/AssemblyInfo.cs" language="CSharp">
|
||||
<imports>
|
||||
<import namespace="System" />
|
||||
<import namespace="System.Reflection" />
|
||||
<import namespace="System.Runtime.InteropServices" />
|
||||
</imports>
|
||||
<attributes>
|
||||
<attribute type="ComVisibleAttribute" value="false" />
|
||||
<attribute type="CLSCompliantAttribute" value="false" />
|
||||
<attribute type="AssemblyVersionAttribute" value="${svnver}" />
|
||||
<attribute type="AssemblyTitleAttribute" value="opensim-remoteservers" />
|
||||
<attribute type="AssemblyDescriptionAttribute" value="Connects to remote OGS installation" />
|
||||
<attribute type="AssemblyCopyrightAttribute" value="Copyright © OGS development team 2007"/>
|
||||
</attributes>
|
||||
</asminfo>
|
||||
|
||||
<csc target="library" output="../../bin/RemoteGridServers.dll" debug="${debug}" verbose="true" warninglevel="4">
|
||||
<references basedir="../../bin" failonempty="true">
|
||||
<include name="System" />
|
||||
<include name="System.Xml" />
|
||||
<include name="libsecondlife.dll" />
|
||||
<include name="GridInterfaces.dll" />
|
||||
<include name="ServerConsole.dll" />
|
||||
</references>
|
||||
<sources basedir="RemoteGridServers/">
|
||||
<include name="*.cs" />
|
||||
</sources>
|
||||
</csc>
|
||||
</target>
|
||||
</project>
|
|
@ -0,0 +1,93 @@
|
|||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<RootNamespace>OpenSim</RootNamespace>
|
||||
<AssemblyName>OpenSim</AssemblyName>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}</ProjectGuid>
|
||||
<StartupObject>OpenSim.OpenSim_Main</StartupObject>
|
||||
<AllowUnsafeBlocks>False</AllowUnsafeBlocks>
|
||||
<NoStdLib>False</NoStdLib>
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<OutputPath>bin\</OutputPath>
|
||||
<Optimize>False</Optimize>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugSymbols>true</DebugSymbols>
|
||||
<DebugType>Full</DebugType>
|
||||
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||
<OutputPath>..\bin\</OutputPath>
|
||||
<Optimize>True</Optimize>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<DebugSymbols>False</DebugSymbols>
|
||||
<DebugType>None</DebugType>
|
||||
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Platform)' == 'AnyCPU' ">
|
||||
<RegisterForComInterop>False</RegisterForComInterop>
|
||||
<GenerateSerializationAssemblies>Auto</GenerateSerializationAssemblies>
|
||||
<BaseAddress>4194304</BaseAddress>
|
||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||
<FileAlignment>4096</FileAlignment>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Data" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="libsecondlife">
|
||||
<HintPath>..\bin\libsecondlife.dll</HintPath>
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
</Reference>
|
||||
<Reference Include="Axiom.MathLib">
|
||||
<HintPath>..\bin\Axiom.MathLib.dll</HintPath>
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
</Reference>
|
||||
<Reference Include="log4net">
|
||||
<HintPath>..\bin\log4net.dll</HintPath>
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="Config.cs" />
|
||||
<Compile Include="Main.cs" />
|
||||
<Compile Include="OpenSimClient.cs" />
|
||||
<Compile Include="types\Mesh.cs" />
|
||||
<Compile Include="types\Triangle.cs" />
|
||||
<Compile Include="Util.cs" />
|
||||
<Compile Include="world\Avatar.cs" />
|
||||
<Compile Include="world\Entity.cs" />
|
||||
<Compile Include="world\Primitive.cs" />
|
||||
<Compile Include="world\ScriptEngine.cs" />
|
||||
<Compile Include="world\scripting\IScript.cs" />
|
||||
<Compile Include="world\SurfacePatch.cs" />
|
||||
<Compile Include="world\World.cs" />
|
||||
<Compile Include="GridServers\LoginServer.cs" />
|
||||
<Compile Include="Assets\AssetCache.cs" />
|
||||
<Compile Include="OpenSimConsole.cs" />
|
||||
<Compile Include="HeightMapGenHills.cs" />
|
||||
<Compile Include="VersionInfo.cs" />
|
||||
<Compile Include="Assets\InventoryManager.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="GridServers" />
|
||||
<Folder Include="Assets" />
|
||||
<ProjectReference Include="GridInterfaces\GridInterfaces.csproj">
|
||||
<Project>{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}</Project>
|
||||
<Name>GridInterfaces</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="physics\PhysicsManager.csproj">
|
||||
<Project>{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}</Project>
|
||||
<Name>PhysicsManager</Name>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="ServerConsole\ServerConsole\ServerConsole.csproj">
|
||||
<Project>{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}</Project>
|
||||
<Name>ServerConsole</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
|
||||
</Project>
|
|
@ -0,0 +1,116 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||
# SharpDevelop 2.1.0.2017
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Second-server", "Second-server.csproj", "{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SimConfig", "Config\SimConfig\SimConfig.csproj", "{B063760D-DB8D-4F64-B6FE-335FAD1E650A}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LocalGridServers", "LocalServers\LocalGridServers\LocalGridServers.csproj", "{D7F0395B-FADC-4936-80A0-D95AACE92F62}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RemoteGridServers", "RemoteServers\RemoteGridServers\RemoteGridServers.csproj", "{CF0E7E62-34F4-4AB2-BDBD-AFC63224A7E5}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GridInterfaces", "GridInterfaces\GridInterfaces.csproj", "{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PhysicsManager", "physics\PhysicsManager.csproj", "{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PhysXplugin", "physics\plugins\PhysXplugin.csproj", "{ADB751AA-8426-4668-B1FA-43762126CEB3}"
|
||||
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
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RealPhysXplugin", "physics\RealPhysX\RealPhysXplugin\RealPhysXplugin.csproj", "{56C1D214-F389-4228-921A-0A3A0712C159}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|.NET 1.1 = Debug|.NET 1.1
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|.NET 1.1 = Release|.NET 1.1
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Debug|.NET 1.1.ActiveCfg = Debug|Any CPU
|
||||
{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Debug|.NET 1.1.Build.0 = Debug|Any CPU
|
||||
{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Release|.NET 1.1.ActiveCfg = Release|Any CPU
|
||||
{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Release|.NET 1.1.Build.0 = Release|.NET 1.1
|
||||
{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{132A6E3E-8F2D-4BF5-BDFB-8555F53F334E}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B063760D-DB8D-4F64-B6FE-335FAD1E650A}.Debug|.NET 1.1.Build.0 = Debug|.NET 1.1
|
||||
{B063760D-DB8D-4F64-B6FE-335FAD1E650A}.Debug|.NET 1.1.ActiveCfg = Debug|.NET 1.1
|
||||
{B063760D-DB8D-4F64-B6FE-335FAD1E650A}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B063760D-DB8D-4F64-B6FE-335FAD1E650A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B063760D-DB8D-4F64-B6FE-335FAD1E650A}.Release|.NET 1.1.Build.0 = Release|.NET 1.1
|
||||
{B063760D-DB8D-4F64-B6FE-335FAD1E650A}.Release|.NET 1.1.ActiveCfg = Release|.NET 1.1
|
||||
{B063760D-DB8D-4F64-B6FE-335FAD1E650A}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B063760D-DB8D-4F64-B6FE-335FAD1E650A}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}.Debug|.NET 1.1.Build.0 = Debug|.NET 1.1
|
||||
{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}.Debug|.NET 1.1.ActiveCfg = Debug|.NET 1.1
|
||||
{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}.Release|.NET 1.1.Build.0 = Release|.NET 1.1
|
||||
{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}.Release|.NET 1.1.ActiveCfg = Release|.NET 1.1
|
||||
{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{5DA3174D-42F9-416D-9F0B-AF41FA2BE2F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{D7F0395B-FADC-4936-80A0-D95AACE92F62}.Debug|.NET 1.1.Build.0 = Debug|.NET 1.1
|
||||
{D7F0395B-FADC-4936-80A0-D95AACE92F62}.Debug|.NET 1.1.ActiveCfg = Debug|.NET 1.1
|
||||
{D7F0395B-FADC-4936-80A0-D95AACE92F62}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{D7F0395B-FADC-4936-80A0-D95AACE92F62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{D7F0395B-FADC-4936-80A0-D95AACE92F62}.Release|.NET 1.1.Build.0 = Release|.NET 1.1
|
||||
{D7F0395B-FADC-4936-80A0-D95AACE92F62}.Release|.NET 1.1.ActiveCfg = Release|.NET 1.1
|
||||
{D7F0395B-FADC-4936-80A0-D95AACE92F62}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{D7F0395B-FADC-4936-80A0-D95AACE92F62}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{CF0E7E62-34F4-4AB2-BDBD-AFC63224A7E5}.Debug|.NET 1.1.Build.0 = Debug|.NET 1.1
|
||||
{CF0E7E62-34F4-4AB2-BDBD-AFC63224A7E5}.Debug|.NET 1.1.ActiveCfg = Debug|.NET 1.1
|
||||
{CF0E7E62-34F4-4AB2-BDBD-AFC63224A7E5}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{CF0E7E62-34F4-4AB2-BDBD-AFC63224A7E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{CF0E7E62-34F4-4AB2-BDBD-AFC63224A7E5}.Release|.NET 1.1.Build.0 = Release|.NET 1.1
|
||||
{CF0E7E62-34F4-4AB2-BDBD-AFC63224A7E5}.Release|.NET 1.1.ActiveCfg = Release|.NET 1.1
|
||||
{CF0E7E62-34F4-4AB2-BDBD-AFC63224A7E5}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{CF0E7E62-34F4-4AB2-BDBD-AFC63224A7E5}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}.Debug|.NET 1.1.Build.0 = Debug|.NET 1.1
|
||||
{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}.Debug|.NET 1.1.ActiveCfg = Debug|.NET 1.1
|
||||
{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}.Release|.NET 1.1.Build.0 = Release|.NET 1.1
|
||||
{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}.Release|.NET 1.1.ActiveCfg = Release|.NET 1.1
|
||||
{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{ADB751AA-8426-4668-B1FA-43762126CEB3}.Debug|.NET 1.1.Build.0 = Debug|.NET 1.1
|
||||
{ADB751AA-8426-4668-B1FA-43762126CEB3}.Debug|.NET 1.1.ActiveCfg = Debug|.NET 1.1
|
||||
{ADB751AA-8426-4668-B1FA-43762126CEB3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{ADB751AA-8426-4668-B1FA-43762126CEB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{ADB751AA-8426-4668-B1FA-43762126CEB3}.Release|.NET 1.1.Build.0 = Release|.NET 1.1
|
||||
{ADB751AA-8426-4668-B1FA-43762126CEB3}.Release|.NET 1.1.ActiveCfg = Release|.NET 1.1
|
||||
{ADB751AA-8426-4668-B1FA-43762126CEB3}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{ADB751AA-8426-4668-B1FA-43762126CEB3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}.Debug|.NET 1.1.Build.0 = Debug|.NET 1.1
|
||||
{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}.Debug|.NET 1.1.ActiveCfg = Debug|.NET 1.1
|
||||
{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}.Release|.NET 1.1.Build.0 = Release|.NET 1.1
|
||||
{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
|
||||
{56C1D214-F389-4228-921A-0A3A0712C159}.Debug|.NET 1.1.Build.0 = Debug|.NET 1.1
|
||||
{56C1D214-F389-4228-921A-0A3A0712C159}.Debug|.NET 1.1.ActiveCfg = Debug|.NET 1.1
|
||||
{56C1D214-F389-4228-921A-0A3A0712C159}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{56C1D214-F389-4228-921A-0A3A0712C159}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{56C1D214-F389-4228-921A-0A3A0712C159}.Release|.NET 1.1.Build.0 = Release|.NET 1.1
|
||||
{56C1D214-F389-4228-921A-0A3A0712C159}.Release|.NET 1.1.ActiveCfg = Release|.NET 1.1
|
||||
{56C1D214-F389-4228-921A-0A3A0712C159}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{56C1D214-F389-4228-921A-0A3A0712C159}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -0,0 +1,48 @@
|
|||
<?xml version="1.0"?>
|
||||
<project name="OpenSim" default="build" basedir=".">
|
||||
<description>nant buildfile for OpenSim</description>
|
||||
<property name="debug" value="true" overwrite="false" />
|
||||
<target name="clean" description="remove all generated files">
|
||||
<delete file="../../bin/ServerConsole.dll" failonerror="false" />
|
||||
</target>
|
||||
|
||||
<target name="svnupdate" description="updates to latest SVN">
|
||||
<exec program="svn">
|
||||
<arg value="update" />
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
<target name="upgrade" description="updates from SVN and then builds" depends="clean,svnupdate,build">
|
||||
|
||||
</target>
|
||||
|
||||
<target name="build" description="compiles the source code">
|
||||
|
||||
<loadfile file="../../VERSION" property="svnver"/>
|
||||
<asminfo output="ServerConsole/AssemblyInfo.cs" language="CSharp">
|
||||
<imports>
|
||||
<import namespace="System" />
|
||||
<import namespace="System.Reflection" />
|
||||
<import namespace="System.Runtime.InteropServices" />
|
||||
</imports>
|
||||
<attributes>
|
||||
<attribute type="ComVisibleAttribute" value="false" />
|
||||
<attribute type="CLSCompliantAttribute" value="false" />
|
||||
<attribute type="AssemblyVersionAttribute" value="${svnver}" />
|
||||
<attribute type="AssemblyTitleAttribute" value="opensim-serverconsole" />
|
||||
<attribute type="AssemblyDescriptionAttribute" value="The default server console" />
|
||||
<attribute type="AssemblyCopyrightAttribute" value="Copyright © OGS development team 2007"/>
|
||||
</attributes>
|
||||
</asminfo>
|
||||
|
||||
<csc target="library" output="../../bin/ServerConsole.dll" debug="${debug}" verbose="true" warninglevel="4">
|
||||
<references>
|
||||
<include name="System" />
|
||||
<include name="System.Xml" />
|
||||
</references>
|
||||
<sources basedir="ServerConsole/">
|
||||
<include name="*.cs" />
|
||||
</sources>
|
||||
</csc>
|
||||
</target>
|
||||
</project>
|
|
@ -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("PhysicsManager")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("PhysicsManager")]
|
||||
[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.*")]
|
|
@ -0,0 +1,188 @@
|
|||
/*
|
||||
* 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 <organization> 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 <copyright holder> ``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 <copyright holder> 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 System.Collections;
|
||||
using System.IO;
|
||||
using System.Reflection;
|
||||
using Axiom.MathLib;
|
||||
|
||||
namespace PhysicsSystem
|
||||
{
|
||||
/// <summary>
|
||||
/// Description of MyClass.
|
||||
/// </summary>
|
||||
public class PhysicsManager
|
||||
{
|
||||
private Dictionary<string, IPhysicsPlugin> _plugins=new Dictionary<string, IPhysicsPlugin>();
|
||||
|
||||
public PhysicsManager()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public PhysicsScene GetPhysicsScene(string engineName)
|
||||
{
|
||||
if(_plugins.ContainsKey(engineName))
|
||||
{
|
||||
ServerConsole.MainConsole.Instance.WriteLine("creating "+engineName);
|
||||
return _plugins[engineName].GetScene();
|
||||
}
|
||||
else
|
||||
{
|
||||
ServerConsole.MainConsole.Instance.WriteLine("couldn't find physicsEngine: "+ engineName);
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void LoadPlugins()
|
||||
{
|
||||
string path = Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory ,"Physics");
|
||||
string[] pluginFiles = Directory.GetFiles(path, "*.dll");
|
||||
|
||||
|
||||
for(int i= 0; i<pluginFiles.Length; i++)
|
||||
{
|
||||
this.AddPlugin(pluginFiles[i]);
|
||||
}
|
||||
}
|
||||
|
||||
private void AddPlugin(string FileName)
|
||||
{
|
||||
Assembly pluginAssembly = Assembly.LoadFrom(FileName);
|
||||
|
||||
foreach (Type pluginType in pluginAssembly.GetTypes())
|
||||
{
|
||||
if (pluginType.IsPublic)
|
||||
{
|
||||
if (!pluginType.IsAbstract)
|
||||
{
|
||||
Type typeInterface = pluginType.GetInterface("IPhysicsPlugin", true);
|
||||
|
||||
if (typeInterface != null)
|
||||
{
|
||||
IPhysicsPlugin plug = (IPhysicsPlugin)Activator.CreateInstance(pluginAssembly.GetType(pluginType.ToString()));
|
||||
plug.Init();
|
||||
this._plugins.Add(plug.GetName(),plug);
|
||||
|
||||
}
|
||||
|
||||
typeInterface = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pluginAssembly = null;
|
||||
}
|
||||
}
|
||||
public interface IPhysicsPlugin
|
||||
{
|
||||
bool Init();
|
||||
PhysicsScene GetScene();
|
||||
string GetName();
|
||||
void Dispose();
|
||||
}
|
||||
|
||||
public abstract class PhysicsScene
|
||||
{
|
||||
public abstract PhysicsActor AddAvatar(PhysicsVector position);
|
||||
|
||||
public abstract PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size);
|
||||
|
||||
public abstract void Simulate(float timeStep);
|
||||
|
||||
public abstract void GetResults();
|
||||
|
||||
public abstract void SetTerrain(float[] heightMap);
|
||||
|
||||
public abstract bool IsThreaded
|
||||
{
|
||||
get;
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class PhysicsActor
|
||||
{
|
||||
public abstract PhysicsVector Position
|
||||
{
|
||||
get;
|
||||
set;
|
||||
}
|
||||
|
||||
public abstract PhysicsVector Velocity
|
||||
{
|
||||
get;
|
||||
set;
|
||||
}
|
||||
|
||||
public abstract PhysicsVector Acceleration
|
||||
{
|
||||
get;
|
||||
}
|
||||
|
||||
public abstract Axiom.MathLib.Quaternion Orientation
|
||||
{
|
||||
get;
|
||||
set;
|
||||
}
|
||||
|
||||
public abstract bool Flying
|
||||
{
|
||||
get;
|
||||
set;
|
||||
}
|
||||
|
||||
public abstract bool Kinematic
|
||||
{
|
||||
get;
|
||||
set;
|
||||
}
|
||||
|
||||
public abstract void AddForce(PhysicsVector force);
|
||||
|
||||
public abstract void SetMomentum(PhysicsVector momentum);
|
||||
}
|
||||
|
||||
public class PhysicsVector
|
||||
{
|
||||
public float X;
|
||||
public float Y;
|
||||
public float Z;
|
||||
|
||||
public PhysicsVector()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public PhysicsVector(float x, float y, float z)
|
||||
{
|
||||
X = x;
|
||||
Y = y;
|
||||
Z = z;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<OutputType>Library</OutputType>
|
||||
<RootNamespace>PhysicsManager</RootNamespace>
|
||||
<AssemblyName>PhysicsManager</AssemblyName>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}</ProjectGuid>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<Optimize>False</Optimize>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugSymbols>True</DebugSymbols>
|
||||
<DebugType>Full</DebugType>
|
||||
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<Optimize>True</Optimize>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<DebugSymbols>False</DebugSymbols>
|
||||
<DebugType>None</DebugType>
|
||||
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="Axiom.MathLib">
|
||||
<HintPath>..\..\bin\Axiom.MathLib.dll</HintPath>
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="PhysicsManager.cs" />
|
||||
<Compile Include="AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\ServerConsole\ServerConsole\ServerConsole.csproj">
|
||||
<Project>{C9A6026D-8E0C-4FE4-8691-FB2A566AA245}</Project>
|
||||
<Name>ServerConsole</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
|
||||
</Project>
|
|
@ -0,0 +1,23 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||
# SharpDevelop 2.1.0.2017
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PhysicsManager", "PhysicsManager.csproj", "{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PhysXplugin", "..\PhysXplugin\PhysXplugin\PhysXplugin.csproj", "{ADB751AA-8426-4668-B1FA-43762126CEB3}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{ADB751AA-8426-4668-B1FA-43762126CEB3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{ADB751AA-8426-4668-B1FA-43762126CEB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{ADB751AA-8426-4668-B1FA-43762126CEB3}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{ADB751AA-8426-4668-B1FA-43762126CEB3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -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("RealPhysXplugin")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("RealPhysXplugin")]
|
||||
[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.*")]
|
|
@ -0,0 +1,422 @@
|
|||
/*
|
||||
* 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 <organization> 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 <copyright holder> ``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 <copyright holder> 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.
|
||||
*
|
||||
*/
|
||||
/*
|
||||
* 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 <organization> 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 <copyright holder> ``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 <copyright holder> 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 PhysicsSystem;
|
||||
using PhysXWrapper;
|
||||
|
||||
namespace PhysXplugin
|
||||
{
|
||||
/// <summary>
|
||||
/// Will be the PhysX plugin but for now will be a very basic physics engine
|
||||
/// </summary>
|
||||
public class PhysXPlugin : IPhysicsPlugin
|
||||
{
|
||||
private PhysXScene _mScene;
|
||||
|
||||
public PhysXPlugin()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public bool Init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public PhysicsScene GetScene()
|
||||
{
|
||||
if(_mScene == null)
|
||||
{
|
||||
_mScene = new PhysXScene();
|
||||
}
|
||||
return(_mScene);
|
||||
}
|
||||
|
||||
public string GetName()
|
||||
{
|
||||
return("RealPhysX");
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public class PhysXScene :PhysicsScene
|
||||
{
|
||||
private List<PhysXCharacter> _characters = new List<PhysXCharacter>();
|
||||
private List<PhysXPrim> _prims = new List<PhysXPrim>();
|
||||
private float[] _heightMap;
|
||||
private NxPhysicsSDK mySdk;
|
||||
private NxScene scene;
|
||||
|
||||
public PhysXScene()
|
||||
{
|
||||
mySdk = NxPhysicsSDK.CreateSDK();
|
||||
Console.WriteLine("Sdk created - now creating scene");
|
||||
scene = mySdk.CreateScene();
|
||||
|
||||
}
|
||||
|
||||
public override PhysicsActor AddAvatar(PhysicsVector position)
|
||||
{
|
||||
Vec3 pos = new Vec3();
|
||||
pos.X = position.X;
|
||||
pos.Y = position.Y;
|
||||
pos.Z = position.Z;
|
||||
PhysXCharacter act = new PhysXCharacter( scene.AddCharacter(pos));
|
||||
act.Position = position;
|
||||
_characters.Add(act);
|
||||
return act;
|
||||
}
|
||||
|
||||
public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size)
|
||||
{
|
||||
Vec3 pos = new Vec3();
|
||||
pos.X = position.X;
|
||||
pos.Y = position.Y;
|
||||
pos.Z = position.Z;
|
||||
Vec3 siz = new Vec3();
|
||||
siz.X = size.X;
|
||||
siz.Y = size.Y;
|
||||
siz.Z = size.Z;
|
||||
PhysXPrim act = new PhysXPrim( scene.AddNewBox(pos, siz));
|
||||
_prims.Add(act);
|
||||
return act;
|
||||
}
|
||||
public override void Simulate(float timeStep)
|
||||
{
|
||||
foreach (PhysXCharacter actor in _characters)
|
||||
{
|
||||
actor.Move(timeStep);
|
||||
}
|
||||
scene.Simulate(timeStep);
|
||||
scene.FetchResults();
|
||||
scene.UpdateControllers();
|
||||
|
||||
foreach (PhysXCharacter actor in _characters)
|
||||
{
|
||||
actor.UpdatePosition();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public override void GetResults()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override bool IsThreaded
|
||||
{
|
||||
get
|
||||
{
|
||||
return(false); // for now we won't be multithreaded
|
||||
}
|
||||
}
|
||||
|
||||
public override void SetTerrain(float[] heightMap)
|
||||
{
|
||||
this._heightMap = heightMap;
|
||||
this.scene.AddTerrain(heightMap);
|
||||
}
|
||||
}
|
||||
|
||||
public class PhysXCharacter : PhysicsActor
|
||||
{
|
||||
private PhysicsVector _position;
|
||||
private PhysicsVector _velocity;
|
||||
private PhysicsVector _acceleration;
|
||||
private NxCharacter _character;
|
||||
private bool flying;
|
||||
private float gravityAccel;
|
||||
|
||||
public PhysXCharacter(NxCharacter character)
|
||||
{
|
||||
_velocity = new PhysicsVector();
|
||||
_position = new PhysicsVector();
|
||||
_acceleration = new PhysicsVector();
|
||||
_character = character;
|
||||
}
|
||||
|
||||
public override bool Flying
|
||||
{
|
||||
get
|
||||
{
|
||||
return flying;
|
||||
}
|
||||
set
|
||||
{
|
||||
flying = value;
|
||||
}
|
||||
}
|
||||
|
||||
public override PhysicsVector Position
|
||||
{
|
||||
get
|
||||
{
|
||||
return _position;
|
||||
}
|
||||
set
|
||||
{
|
||||
_position = value;
|
||||
}
|
||||
}
|
||||
|
||||
public override PhysicsVector Velocity
|
||||
{
|
||||
get
|
||||
{
|
||||
return _velocity;
|
||||
}
|
||||
set
|
||||
{
|
||||
_velocity = value;
|
||||
}
|
||||
}
|
||||
|
||||
public override bool Kinematic
|
||||
{
|
||||
get
|
||||
{
|
||||
return false;
|
||||
}
|
||||
set
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public override Axiom.MathLib.Quaternion Orientation
|
||||
{
|
||||
get
|
||||
{
|
||||
return Axiom.MathLib.Quaternion.Identity;
|
||||
}
|
||||
set
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public override PhysicsVector Acceleration
|
||||
{
|
||||
get
|
||||
{
|
||||
return _acceleration;
|
||||
}
|
||||
|
||||
}
|
||||
public void SetAcceleration (PhysicsVector accel)
|
||||
{
|
||||
this._acceleration = accel;
|
||||
}
|
||||
|
||||
public override void AddForce(PhysicsVector force)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void SetMomentum(PhysicsVector momentum)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public void Move(float timeStep)
|
||||
{
|
||||
Vec3 vec = new Vec3();
|
||||
vec.X = this._velocity.X * timeStep;
|
||||
vec.Y = this._velocity.Y * timeStep;
|
||||
if(flying)
|
||||
{
|
||||
vec.Z = ( this._velocity.Z) * timeStep;
|
||||
}
|
||||
else
|
||||
{
|
||||
gravityAccel+= -9.8f;
|
||||
vec.Z = (gravityAccel + this._velocity.Z) * timeStep;
|
||||
}
|
||||
int res = this._character.Move(vec);
|
||||
if(res == 1)
|
||||
{
|
||||
gravityAccel = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public void UpdatePosition()
|
||||
{
|
||||
Vec3 vec = this._character.Position;
|
||||
this._position.X = vec.X;
|
||||
this._position.Y = vec.Y;
|
||||
this._position.Z = vec.Z;
|
||||
}
|
||||
}
|
||||
|
||||
public class PhysXPrim : PhysicsActor
|
||||
{
|
||||
private PhysicsVector _position;
|
||||
private PhysicsVector _velocity;
|
||||
private PhysicsVector _acceleration;
|
||||
private NxActor _prim;
|
||||
|
||||
public PhysXPrim(NxActor prim)
|
||||
{
|
||||
_velocity = new PhysicsVector();
|
||||
_position = new PhysicsVector();
|
||||
_acceleration = new PhysicsVector();
|
||||
_prim = prim;
|
||||
}
|
||||
public override bool Flying
|
||||
{
|
||||
get
|
||||
{
|
||||
return false; //no flying prims for you
|
||||
}
|
||||
set
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
public override PhysicsVector Position
|
||||
{
|
||||
get
|
||||
{
|
||||
PhysicsVector pos = new PhysicsVector();
|
||||
Vec3 vec = this._prim.Position;
|
||||
pos.X = vec.X;
|
||||
pos.Y = vec.Y;
|
||||
pos.Z = vec.Z;
|
||||
return pos;
|
||||
|
||||
}
|
||||
set
|
||||
{
|
||||
PhysicsVector vec = value;
|
||||
Vec3 pos = new Vec3();
|
||||
pos.X = vec.X;
|
||||
pos.Y = vec.Y;
|
||||
pos.Z = vec.Z;
|
||||
this._prim.Position = pos;
|
||||
}
|
||||
}
|
||||
|
||||
public override PhysicsVector Velocity
|
||||
{
|
||||
get
|
||||
{
|
||||
return _velocity;
|
||||
}
|
||||
set
|
||||
{
|
||||
_velocity = value;
|
||||
}
|
||||
}
|
||||
|
||||
public override bool Kinematic
|
||||
{
|
||||
get
|
||||
{
|
||||
return this._prim.Kinematic;
|
||||
}
|
||||
set
|
||||
{
|
||||
this._prim.Kinematic = value;
|
||||
}
|
||||
}
|
||||
|
||||
public override Axiom.MathLib.Quaternion Orientation
|
||||
{
|
||||
get
|
||||
{
|
||||
Axiom.MathLib.Quaternion res = new Axiom.MathLib.Quaternion();
|
||||
PhysXWrapper.Quaternion quat = this._prim.GetOrientation();
|
||||
res.w = quat.W;
|
||||
res.x = quat.X;
|
||||
res.y = quat.Y;
|
||||
res.z = quat.Z;
|
||||
return res;
|
||||
}
|
||||
set
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public override PhysicsVector Acceleration
|
||||
{
|
||||
get
|
||||
{
|
||||
return _acceleration;
|
||||
}
|
||||
|
||||
}
|
||||
public void SetAcceleration (PhysicsVector accel)
|
||||
{
|
||||
this._acceleration = accel;
|
||||
}
|
||||
|
||||
public override void AddForce(PhysicsVector force)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void SetMomentum(PhysicsVector momentum)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,49 @@
|
|||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<OutputType>Library</OutputType>
|
||||
<RootNamespace>RealPhysXplugin</RootNamespace>
|
||||
<AssemblyName>RealPhysXplugin</AssemblyName>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{56C1D214-F389-4228-921A-0A3A0712C159}</ProjectGuid>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<Optimize>False</Optimize>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugSymbols>True</DebugSymbols>
|
||||
<DebugType>Full</DebugType>
|
||||
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<Optimize>True</Optimize>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<DebugSymbols>False</DebugSymbols>
|
||||
<DebugType>None</DebugType>
|
||||
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="PhysX_Wrapper_Dotnet">
|
||||
<HintPath>..\..\..\..\bin\PhysX_Wrapper_Dotnet.dll</HintPath>
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
</Reference>
|
||||
<Reference Include="Axiom.MathLib">
|
||||
<HintPath>..\..\..\..\bin\Axiom.MathLib.dll</HintPath>
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="RealPhysX.cs" />
|
||||
<Compile Include="AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\..\PhysicsManager.csproj">
|
||||
<Project>{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}</Project>
|
||||
<Name>PhysicsManager</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
|
||||
</Project>
|
|
@ -0,0 +1,7 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||
# SharpDevelop 2.1.0.2017
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "RealPhysXplugin", "RealPhysXplugin.csproj", "{56C1D214-F389-4228-921A-0A3A0712C159}"
|
||||
EndProject
|
||||
Global
|
||||
EndGlobal
|
|
@ -0,0 +1,49 @@
|
|||
<?xml version="1.0"?>
|
||||
<project name="OpenSim" default="build" basedir=".">
|
||||
<description>nant buildfile for OpenSim</description>
|
||||
<property name="debug" value="true" overwrite="false" />
|
||||
<target name="clean" description="remove all generated files">
|
||||
<delete file="../../bin/PhysicsManager.dll" failonerror="false" />
|
||||
</target>
|
||||
|
||||
<target name="svnupdate" description="updates to latest SVN">
|
||||
<exec program="svn">
|
||||
<arg value="update" />
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
<target name="upgrade" description="updates from SVN and then builds" depends="clean,svnupdate,build">
|
||||
|
||||
</target>
|
||||
|
||||
<target name="build" description="compiles the source code">
|
||||
|
||||
<loadfile file="../../VERSION" property="svnver"/>
|
||||
<asminfo output="AssemblyInfo.cs" language="CSharp">
|
||||
<imports>
|
||||
<import namespace="System" />
|
||||
<import namespace="System.Reflection" />
|
||||
<import namespace="System.Runtime.InteropServices" />
|
||||
</imports>
|
||||
<attributes>
|
||||
<attribute type="ComVisibleAttribute" value="false" />
|
||||
<attribute type="CLSCompliantAttribute" value="false" />
|
||||
<attribute type="AssemblyVersionAttribute" value="${svnver}" />
|
||||
<attribute type="AssemblyTitleAttribute" value="opensim-physicsmanager" />
|
||||
<attribute type="AssemblyDescriptionAttribute" value="Handles physics plugins" />
|
||||
<attribute type="AssemblyCopyrightAttribute" value="Copyright © OGS development team 2007"/>
|
||||
</attributes>
|
||||
</asminfo>
|
||||
|
||||
<csc target="library" output="../../bin/PhysicsManager.dll" debug="${debug}" verbose="true" warninglevel="4">
|
||||
<references basedir="../../bin" failonempty="true">
|
||||
<include name="System" />
|
||||
<include name="System.Xml" />
|
||||
<include name="ServerConsole.dll" />
|
||||
</references>
|
||||
<sources basedir="./">
|
||||
<include name="*.cs" />
|
||||
</sources>
|
||||
</csc>
|
||||
</target>
|
||||
</project>
|
|
@ -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("PhysXplugin")]
|
||||
[assembly: AssemblyDescription("")]
|
||||
[assembly: AssemblyConfiguration("")]
|
||||
[assembly: AssemblyCompany("")]
|
||||
[assembly: AssemblyProduct("PhysXplugin")]
|
||||
[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.*")]
|
|
@ -0,0 +1,251 @@
|
|||
/*
|
||||
* 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 <organization> 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 <copyright holder> ``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 <copyright holder> 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 PhysicsSystem;
|
||||
|
||||
namespace PhysXplugin
|
||||
{
|
||||
/// <summary>
|
||||
/// Will be the PhysX plugin but for now will be a very basic physics engine
|
||||
/// </summary>
|
||||
public class PhysXPlugin : IPhysicsPlugin
|
||||
{
|
||||
private PhysXScene _mScene;
|
||||
|
||||
public PhysXPlugin()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public bool Init()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public PhysicsScene GetScene()
|
||||
{
|
||||
if(_mScene == null)
|
||||
{
|
||||
_mScene = new PhysXScene();
|
||||
}
|
||||
return(_mScene);
|
||||
}
|
||||
|
||||
public string GetName()
|
||||
{
|
||||
return("PhysX");
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public class PhysXScene :PhysicsScene
|
||||
{
|
||||
private List<PhysXActor> _actors = new List<PhysXActor>();
|
||||
private float[] _heightMap;
|
||||
|
||||
public PhysXScene()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override PhysicsActor AddAvatar(PhysicsVector position)
|
||||
{
|
||||
PhysXActor act = new PhysXActor();
|
||||
act.Position = position;
|
||||
_actors.Add(act);
|
||||
return act;
|
||||
}
|
||||
|
||||
public override PhysicsActor AddPrim(PhysicsVector position, PhysicsVector size)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public override void Simulate(float timeStep)
|
||||
{
|
||||
foreach (PhysXActor actor in _actors)
|
||||
{
|
||||
actor.Position.X = actor.Position.X + (actor.Velocity.X * timeStep);
|
||||
actor.Position.Y = actor.Position.Y + (actor.Velocity.Y * timeStep);
|
||||
actor.Position.Z = actor.Position.Z + (actor.Velocity.Z * timeStep);
|
||||
/*if(actor.Flying)
|
||||
{
|
||||
actor.Position.Z = actor.Position.Z + (actor.Velocity.Z * timeStep);
|
||||
}
|
||||
else
|
||||
{
|
||||
actor.Position.Z = actor.Position.Z + ((-9.8f + actor.Velocity.Z) * timeStep);
|
||||
}
|
||||
if(actor.Position.Z < (_heightMap[(int)actor.Position.Y * 256 + (int)actor.Position.X]+1))
|
||||
{*/
|
||||
actor.Position.Z = _heightMap[(int)actor.Position.Y * 256 + (int)actor.Position.X]+1;
|
||||
//}
|
||||
if(actor.Position.X<0)
|
||||
{
|
||||
actor.Position.X = 0;
|
||||
actor.Velocity.X = 0;
|
||||
}
|
||||
if(actor.Position.Y < 0)
|
||||
{
|
||||
actor.Position.Y = 0;
|
||||
actor.Velocity.Y = 0;
|
||||
}
|
||||
if(actor.Position.X > 255)
|
||||
{
|
||||
actor.Position.X = 255;
|
||||
actor.Velocity.X = 0;
|
||||
}
|
||||
if(actor.Position.Y > 255)
|
||||
{
|
||||
actor.Position.Y = 255;
|
||||
actor.Velocity.X = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public override void GetResults()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override bool IsThreaded
|
||||
{
|
||||
get
|
||||
{
|
||||
return(false); // for now we won't be multithreaded
|
||||
}
|
||||
}
|
||||
|
||||
public override void SetTerrain(float[] heightMap)
|
||||
{
|
||||
this._heightMap = heightMap;
|
||||
}
|
||||
}
|
||||
|
||||
public class PhysXActor : PhysicsActor
|
||||
{
|
||||
private PhysicsVector _position;
|
||||
private PhysicsVector _velocity;
|
||||
private PhysicsVector _acceleration;
|
||||
private bool flying;
|
||||
public PhysXActor()
|
||||
{
|
||||
_velocity = new PhysicsVector();
|
||||
_position = new PhysicsVector();
|
||||
_acceleration = new PhysicsVector();
|
||||
}
|
||||
|
||||
public override bool Flying
|
||||
{
|
||||
get
|
||||
{
|
||||
return false;
|
||||
}
|
||||
set
|
||||
{
|
||||
flying= value;
|
||||
}
|
||||
}
|
||||
|
||||
public override PhysicsVector Position
|
||||
{
|
||||
get
|
||||
{
|
||||
return _position;
|
||||
}
|
||||
set
|
||||
{
|
||||
_position = value;
|
||||
}
|
||||
}
|
||||
|
||||
public override PhysicsVector Velocity
|
||||
{
|
||||
get
|
||||
{
|
||||
return _velocity;
|
||||
}
|
||||
set
|
||||
{
|
||||
_velocity = value;
|
||||
}
|
||||
}
|
||||
|
||||
public override Axiom.MathLib.Quaternion Orientation
|
||||
{
|
||||
get
|
||||
{
|
||||
return Axiom.MathLib.Quaternion.Identity;
|
||||
}
|
||||
set
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public override PhysicsVector Acceleration
|
||||
{
|
||||
get
|
||||
{
|
||||
return _acceleration;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public override bool Kinematic
|
||||
{
|
||||
get
|
||||
{
|
||||
return true;
|
||||
}
|
||||
set
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
public void SetAcceleration (PhysicsVector accel)
|
||||
{
|
||||
this._acceleration = accel;
|
||||
}
|
||||
|
||||
public override void AddForce(PhysicsVector force)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void SetMomentum(PhysicsVector momentum)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<PropertyGroup>
|
||||
<OutputType>Library</OutputType>
|
||||
<RootNamespace>PhysXplugin</RootNamespace>
|
||||
<AssemblyName>PhysXplugin</AssemblyName>
|
||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||
<ProjectGuid>{ADB751AA-8426-4668-B1FA-43762126CEB3}</ProjectGuid>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
|
||||
<OutputPath>bin\Debug\</OutputPath>
|
||||
<Optimize>False</Optimize>
|
||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||
<DebugSymbols>True</DebugSymbols>
|
||||
<DebugType>Full</DebugType>
|
||||
<CheckForOverflowUnderflow>True</CheckForOverflowUnderflow>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||
<OutputPath>bin\Release\</OutputPath>
|
||||
<Optimize>True</Optimize>
|
||||
<DefineConstants>TRACE</DefineConstants>
|
||||
<DebugSymbols>False</DebugSymbols>
|
||||
<DebugType>None</DebugType>
|
||||
<CheckForOverflowUnderflow>False</CheckForOverflowUnderflow>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<Reference Include="System" />
|
||||
<Reference Include="System.Xml" />
|
||||
<Reference Include="Axiom.MathLib">
|
||||
<HintPath>..\..\..\bin\Axiom.MathLib.dll</HintPath>
|
||||
<SpecificVersion>False</SpecificVersion>
|
||||
</Reference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Compile Include="PhysXplugin.cs" />
|
||||
<Compile Include="AssemblyInfo.cs" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\PhysicsManager.csproj">
|
||||
<Project>{3C86A846-7977-4EE7-A8DC-DD487FA5DC2B}</Project>
|
||||
<Name>PhysicsManager</Name>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.Targets" />
|
||||
</Project>
|
|
@ -0,0 +1,17 @@
|
|||
|
||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||
# SharpDevelop 2.1.0.2017
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PhysXplugin", "PhysXplugin.csproj", "{ADB751AA-8426-4668-B1FA-43762126CEB3}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Release|Any CPU = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{ADB751AA-8426-4668-B1FA-43762126CEB3}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{ADB751AA-8426-4668-B1FA-43762126CEB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{ADB751AA-8426-4668-B1FA-43762126CEB3}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{ADB751AA-8426-4668-B1FA-43762126CEB3}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
EndGlobalSection
|
||||
EndGlobal
|
|
@ -0,0 +1,49 @@
|
|||
<?xml version="1.0"?>
|
||||
<project name="OpenSim" default="build" basedir=".">
|
||||
<description>nant buildfile for OpenSim</description>
|
||||
<property name="debug" value="true" overwrite="false" />
|
||||
<target name="clean" description="remove all generated files">
|
||||
<delete file="../../../bin/Physics/PhysXplugin.dll" failonerror="false" />
|
||||
</target>
|
||||
|
||||
<target name="svnupdate" description="updates to latest SVN">
|
||||
<exec program="svn">
|
||||
<arg value="update" />
|
||||
</exec>
|
||||
</target>
|
||||
|
||||
<target name="upgrade" description="updates from SVN and then builds" depends="clean,svnupdate,build">
|
||||
|
||||
</target>
|
||||
|
||||
<target name="build" description="compiles the source code">
|
||||
|
||||
<loadfile file="../../../VERSION" property="svnver"/>
|
||||
<asminfo output="AssemblyInfo.cs" language="CSharp">
|
||||
<imports>
|
||||
<import namespace="System" />
|
||||
<import namespace="System.Reflection" />
|
||||
<import namespace="System.Runtime.InteropServices" />
|
||||
</imports>
|
||||
<attributes>
|
||||
<attribute type="ComVisibleAttribute" value="false" />
|
||||
<attribute type="CLSCompliantAttribute" value="false" />
|
||||
<attribute type="AssemblyVersionAttribute" value="${svnver}" />
|
||||
<attribute type="AssemblyTitleAttribute" value="opensim-physicsmanager-physx" />
|
||||
<attribute type="AssemblyDescriptionAttribute" value="PhysX plugin for OpenSim" />
|
||||
<attribute type="AssemblyCopyrightAttribute" value="Copyright © OGS development team 2007"/>
|
||||
</attributes>
|
||||
</asminfo>
|
||||
|
||||
<csc target="library" output="../../../bin/Physics/PhysXplugin.dll" debug="${debug}" verbose="true" warninglevel="4">
|
||||
<references basedir="../../../bin" failonempty="true">
|
||||
<include name="System" />
|
||||
<include name="System.Xml" />
|
||||
<include name="PhysicsManager.dll" />
|
||||
</references>
|
||||
<sources basedir="./">
|
||||
<include name="*.cs" />
|
||||
</sources>
|
||||
</csc>
|
||||
</target>
|
||||
</project>
|
Loading…
Reference in New Issue