mirror of
git://opensimulator.org/git/opensim
synced 2026-08-14 09:02:50 +00:00
319 lines
14 KiB
C#
319 lines
14 KiB
C#
/*
|
|
Copyright (c) OpenSim project, http://sim.opensecondlife.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.Timers;
|
|
using System.Collections.Generic;
|
|
using libsecondlife;
|
|
using libsecondlife.Packets;
|
|
using System.Collections;
|
|
using System.Text;
|
|
using System.IO;
|
|
using Axiom.MathLib;
|
|
using log4net;
|
|
|
|
namespace OpenSim
|
|
{
|
|
/// <summary>
|
|
/// Description of MainForm.
|
|
/// </summary>
|
|
public partial class Controller : ServerCallback
|
|
{
|
|
|
|
[STAThread]
|
|
public static void Main( string[] args )
|
|
{
|
|
Controller c = new Controller();
|
|
while( true ) // fuckin' a
|
|
System.Threading.Thread.Sleep( 1000 );
|
|
}
|
|
|
|
private Server _server;
|
|
private Logon _login;
|
|
private AgentManager _agentManager;
|
|
private PrimManager _primManager;
|
|
private AssetManagement _assetManager;
|
|
private GridManager _gridManager;
|
|
private InventoryManager _inventoryManager;
|
|
private LoginManager _loginManager; //built in login server
|
|
private ulong time; //ticks
|
|
private Timer timer1 = new Timer();
|
|
|
|
|
|
public Controller() {
|
|
_login = new Logon(); // should create a list for these.
|
|
_server = new Server( this );
|
|
_agentManager = new AgentManager( this._server );
|
|
_primManager = new PrimManager( this._server );
|
|
_inventoryManager = new InventoryManager(this._server);
|
|
_assetManager = new AssetManagement(this._server, _inventoryManager );
|
|
_primManager.AgentManagement = _agentManager;
|
|
_agentManager.Prim_Manager = _primManager;
|
|
_agentManager.assetManager = _assetManager;
|
|
_gridManager = new GridManager(this._server, _agentManager);
|
|
|
|
if(Globals.Instance.LoginSever)
|
|
{
|
|
Console.WriteLine("Starting login Server");
|
|
_loginManager = new LoginManager(_login); // startup
|
|
_loginManager.Startup(); // login server
|
|
}
|
|
|
|
timer1.Enabled = true;
|
|
timer1.Interval = 200;
|
|
timer1.Elapsed +=new ElapsedEventHandler( this.Timer1Tick );
|
|
|
|
|
|
}
|
|
public void MainCallback( Packet pack, UserAgentInfo userInfo )
|
|
{
|
|
|
|
/*if( ( pack.Type != PacketType.StartPingCheck ) && ( pack.Type != PacketType.AgentUpdate ) ) {
|
|
//Log packet?
|
|
//System.Console.WriteLine(pack.Type);
|
|
//this.richTextBox1.Text = this.richTextBox1.Text + "\n " + pack.Type;
|
|
}*/
|
|
|
|
//should replace with a switch
|
|
if( pack.Type == PacketType.AgentSetAppearance ) {
|
|
|
|
}
|
|
else if( pack.Type == PacketType.FetchInventory)
|
|
{
|
|
FetchInventoryPacket FetchInventory = (FetchInventoryPacket)pack;
|
|
_inventoryManager.FetchInventory(userInfo, FetchInventory);
|
|
}
|
|
else if( pack.Type == PacketType.FetchInventoryDescendents)
|
|
{
|
|
FetchInventoryDescendentsPacket Fetch = (FetchInventoryDescendentsPacket)pack;
|
|
_inventoryManager.FetchInventoryDescendents(userInfo, Fetch);
|
|
}
|
|
else if(pack.Type == PacketType.MapBlockRequest)
|
|
{
|
|
MapBlockRequestPacket MapRequest=(MapBlockRequestPacket)pack;
|
|
this._gridManager.RequestMapBlock(userInfo, MapRequest.PositionData.MinX, MapRequest.PositionData.MinY, MapRequest.PositionData.MaxX, MapRequest.PositionData.MaxY);
|
|
|
|
}
|
|
else if(pack.Type == PacketType.CloseCircuit)
|
|
{
|
|
this._agentManager.RemoveAgent(userInfo);
|
|
}
|
|
else if(pack.Type == PacketType.MapLayerRequest)
|
|
{
|
|
this._gridManager.RequestMapLayer(userInfo);
|
|
}
|
|
else if((pack.Type == PacketType.TeleportRequest ) || (pack.Type == PacketType.TeleportLocationRequest))
|
|
{
|
|
TeleportLocationRequestPacket Request = (TeleportLocationRequestPacket)pack;
|
|
this._gridManager.RequestTeleport(userInfo,Request);
|
|
|
|
}
|
|
else if( pack.Type == PacketType.TransferRequest ) {
|
|
TransferRequestPacket transfer = (TransferRequestPacket)pack;
|
|
LLUUID id = new LLUUID( transfer.TransferInfo.Params, 0 );
|
|
_assetManager.AddAssetRequest( userInfo, id, transfer );
|
|
}
|
|
else if( ( pack.Type == PacketType.StartPingCheck ) ) {
|
|
//reply to pingcheck
|
|
libsecondlife.Packets.StartPingCheckPacket startping = (libsecondlife.Packets.StartPingCheckPacket)pack;
|
|
libsecondlife.Packets.CompletePingCheckPacket endping = new CompletePingCheckPacket();
|
|
endping.PingID.PingID = startping.PingID.PingID;
|
|
_server.SendPacket(endping, true, userInfo );
|
|
}
|
|
else if( pack.Type == PacketType.CompleteAgentMovement )
|
|
{
|
|
_agentManager.AgentJoin(userInfo );
|
|
}
|
|
else if( pack.Type == PacketType.RequestImage )
|
|
{
|
|
RequestImagePacket imageRequest = (RequestImagePacket)pack;
|
|
for( int i = 0; i < imageRequest.RequestImage.Length; i++ )
|
|
{
|
|
this._assetManager.AddTextureRequest(userInfo, imageRequest.RequestImage[i].Image);
|
|
}
|
|
}
|
|
else if( pack.Type == PacketType.RegionHandshakeReply ) {
|
|
//recieved regionhandshake so can now start sending info
|
|
_agentManager.SendInitialData(userInfo );
|
|
}
|
|
else if( pack.Type == PacketType.ObjectAdd )
|
|
{
|
|
ObjectAddPacket ad = (ObjectAddPacket)pack;
|
|
_primManager.CreatePrim(userInfo, ad.ObjectData.RayEnd, ad );
|
|
}
|
|
else if( pack.Type == PacketType.ObjectPosition ) {
|
|
//System.Console.WriteLine(pack.ToString());
|
|
}
|
|
else if( pack.Type == 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 );
|
|
_primManager.UpdatePrimPosition(userInfo, pos, multipleupdate.ObjectData[ i ].ObjectLocalID ,false ,libsecondlife.LLQuaternion.Identity);
|
|
//should update stored position of the prim
|
|
}
|
|
else if(multipleupdate.ObjectData[i].Type == 10 )//rotation
|
|
{
|
|
libsecondlife.LLVector3 pos = new LLVector3(100,100,22);
|
|
libsecondlife.LLQuaternion rot = new LLQuaternion(multipleupdate.ObjectData[i].Data, 0, true);
|
|
_primManager.UpdatePrimPosition(userInfo, pos, multipleupdate.ObjectData[ i ].ObjectLocalID, true ,rot);
|
|
}
|
|
}
|
|
}
|
|
else if( pack.Type == PacketType.AgentWearablesRequest )
|
|
{
|
|
_agentManager.SendIntialAvatarAppearance(userInfo );
|
|
}
|
|
else if(pack.Type == PacketType.AgentUpdate)
|
|
{
|
|
// System.Console.WriteLine("agent update");
|
|
AgentUpdatePacket agent = (AgentUpdatePacket)pack;
|
|
uint mask = agent.AgentData.ControlFlags & ( 1 );
|
|
AvatarData avatar = _agentManager.GetAgent(userInfo.AgentID );
|
|
if(avatar != null )
|
|
{
|
|
if(avatar.Started )
|
|
{
|
|
if( mask == ( 1 ) )
|
|
{
|
|
if(!avatar.Walk)
|
|
{
|
|
//start walking
|
|
_agentManager.SendMoveCommand(userInfo, false, avatar.Position.X, avatar.Position.Y, avatar.Position.Z, 0, agent.AgentData.BodyRotation );
|
|
Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3( 1, 0, 0 );
|
|
Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion( agent.AgentData.BodyRotation.W, agent.AgentData.BodyRotation.X, agent.AgentData.BodyRotation.Y, agent.AgentData.BodyRotation.Z );
|
|
Axiom.MathLib.Vector3 direc = q * v3;
|
|
direc.Normalize();
|
|
direc = direc * ( ( 0.03f ) * 128f );
|
|
|
|
avatar.Velocity.X = direc.x;
|
|
avatar.Velocity.Y = direc.y;
|
|
avatar.Velocity.Z = direc.z;
|
|
avatar.Walk = true;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if(avatar.Walk)
|
|
{
|
|
//walking but key not pressed so need to stop
|
|
_agentManager.SendMoveCommand(userInfo, true, avatar.Position.X, avatar.Position.Y, avatar.Position.Z, 0, agent.AgentData.BodyRotation );
|
|
avatar.Walk = false;
|
|
avatar.Velocity.X = 0;
|
|
avatar.Velocity.Y = 0;
|
|
avatar.Velocity.Z = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
}
|
|
}
|
|
else if( pack.Type == PacketType.ChatFromViewer )
|
|
{
|
|
ChatFromViewerPacket chat = (ChatFromViewerPacket)pack;
|
|
System.Text.Encoding enc = System.Text.Encoding.ASCII;
|
|
|
|
string myString = enc.GetString(chat.ChatData.Message );
|
|
if( myString != "" ) {
|
|
string[] comp = new string[ 10 ];
|
|
string delimStr = " , ";
|
|
char[] delimiter = delimStr.ToCharArray();
|
|
string line;
|
|
|
|
line = myString;
|
|
comp = line.Split( delimiter );
|
|
if( comp[ 0 ] == "pos" )
|
|
{
|
|
}
|
|
else if( comp[ 0 ] == "veloc" )
|
|
{
|
|
}
|
|
else
|
|
{
|
|
_agentManager.SendChatMessage(userInfo, line );
|
|
}
|
|
}
|
|
}
|
|
}
|
|
public void NewUserCallback(UserAgentInfo userInfo )
|
|
{
|
|
Console.WriteLine( "new user - {0} - has joined [session {1}]", userInfo.AgentID.ToString(), userInfo.SessionID.ToString() +"curcuit used"+userInfo.circuitCode);
|
|
string first,last;
|
|
LLUUID Base,Inventory;
|
|
lock(_login)
|
|
{
|
|
first=_login.First;
|
|
last=_login.Last;
|
|
Base=_login.BaseFolder;
|
|
Inventory=_login.InventoryFolder;
|
|
//should get agentid and sessionid so they can be checked.
|
|
}
|
|
_agentManager.NewAgent(userInfo, first, last, Base, Inventory);
|
|
//now because of the lack of Global account management (User server etc)
|
|
//we need to reset the names back to default incase a teleport happens
|
|
//which will not have a Login name set, so they will use default names
|
|
lock(_login)
|
|
{
|
|
_login.First="Test";
|
|
_login.Last="User";
|
|
}
|
|
}
|
|
|
|
public void ErrorCallback( string text ) {
|
|
Console.WriteLine( "error report: {0}", text );
|
|
}
|
|
|
|
void Timer1Tick( object sender, System.EventArgs e ) {
|
|
this.time++;
|
|
_agentManager.UpdatePositions();
|
|
this._assetManager.DoWork( time );
|
|
}
|
|
}
|
|
public class Logon
|
|
{
|
|
public string First = "Test";
|
|
public string Last = "User";
|
|
public LLUUID Agent;
|
|
public LLUUID Session;
|
|
public LLUUID InventoryFolder;
|
|
public LLUUID BaseFolder;
|
|
public Logon()
|
|
{
|
|
|
|
}
|
|
}
|
|
}
|