/* Copyright (c) 2007 Michael Wright * Copyright (c) , * 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 nor the * names of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ using System; using System.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 { /// /// Description of MainForm. /// 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 ); } public Server server; public Logon _login; private AgentManager Agent_Manager; private PrimManager Prim_Manager; private TextureManager Texture_Manager; private AssetManager Asset_Manager; private GridManager Grid_Manager; private LoginManager Login_Manager; //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 ); Agent_Manager = new AgentManager( this.server ); Prim_Manager = new PrimManager( this.server ); Texture_Manager = new TextureManager( this.server ); Asset_Manager = new AssetManager( this.server ); Prim_Manager.Agent_Manager = Agent_Manager; Agent_Manager.Prim_Manager = Prim_Manager; Grid_Manager=new GridManager(this.server,Agent_Manager); if(Globals.Instance.LoginSever) { Console.WriteLine("Starting login Server"); Login_Manager = new LoginManager(_login); // startup Login_Manager.Startup(); // login server } timer1.Enabled = true; timer1.Interval = 200; timer1.Elapsed +=new ElapsedEventHandler( this.Timer1Tick ); } public void MainCallback( Packet pack, User_Agent_info User_info ) { //System.Console.WriteLine(pack.Type); if( ( pack.Type != PacketType.StartPingCheck ) && ( pack.Type != PacketType.AgentUpdate ) ) { // System.Console.WriteLine(pack.Type); //this.richTextBox1.Text=this.richTextBox1.Text+"\n "+pack.Type; } if( pack.Type == PacketType.AgentSetAppearance ) { // System.Console.WriteLine(pack); //this.richTextBox1.Text=this.richTextBox1.Text+"\n "+pack.Type; } if(pack.Type== PacketType.MapBlockRequest) { //int MinX, MinY, MaxX, MaxY; MapBlockRequestPacket MapRequest=(MapBlockRequestPacket)pack; this.Grid_Manager.RequestMapBlock(User_info,MapRequest.PositionData.MinX,MapRequest.PositionData.MinY,MapRequest.PositionData.MaxX,MapRequest.PositionData.MaxY); } if(pack.Type== PacketType.CloseCircuit) { this.Agent_Manager.RemoveAgent(User_info); } if(pack.Type== PacketType.MapLayerRequest) { this.Grid_Manager.RequestMapLayer(User_info); } if((pack.Type== PacketType.TeleportRequest ) ||(pack.Type== PacketType.TeleportLocationRequest)) { TeleportLocationRequestPacket Request=(TeleportLocationRequestPacket)pack; this.Grid_Manager.RequestTeleport(User_info,Request); } if( pack.Type == PacketType.TransferRequest ) { TransferRequestPacket tran = (TransferRequestPacket)pack; LLUUID id = new LLUUID( tran.TransferInfo.Params, 0 ); if( ( id == new LLUUID( "66c41e39-38f9-f75a-024e-585989bfab73" ) ) || ( id == new LLUUID( "e0ee49b5a4184df8d3c9a65361fe7f49" ) ) ) { Asset_Manager.AddRequest( User_info, id, tran ); } } if( ( pack.Type == PacketType.StartPingCheck ) ) { //reply to pingcheck libsecondlife.Packets.StartPingCheckPacket startp = (libsecondlife.Packets.StartPingCheckPacket)pack; libsecondlife.Packets.CompletePingCheckPacket endping = new CompletePingCheckPacket(); endping.PingID.PingID = startp.PingID.PingID; server.SendPacket( endping, true, User_info ); } if( pack.Type == PacketType.CompleteAgentMovement ) { // new client Agent_Manager.AgentJoin( User_info ); } if( pack.Type == PacketType.RequestImage ) { RequestImagePacket image_req = (RequestImagePacket)pack; for( int i = 0; i < image_req.RequestImage.Length; i++ ) { this.Texture_Manager.AddRequest( User_info, image_req.RequestImage[ i ].Image ); } } if( pack.Type == PacketType.RegionHandshakeReply ) { //recieved regionhandshake so can now start sending info Agent_Manager.SendInitialData( User_info ); //this.setuptemplates("objectupate164.dat",User_info,false); } if( pack.Type == PacketType.ObjectAdd ) { ObjectAddPacket ad = (ObjectAddPacket)pack; Prim_Manager.CreatePrim( User_info, ad.ObjectData.RayEnd, ad ); //this.send_prim(User_info,ad.ObjectData.RayEnd, ad); } if( pack.Type == PacketType.ObjectPosition ) { //System.Console.WriteLine(pack.ToString()); } if( pack.Type == PacketType.MultipleObjectUpdate ) { //System.Console.WriteLine(pack.ToString()); MultipleObjectUpdatePacket mupd = (MultipleObjectUpdatePacket)pack; for( int i = 0; i < mupd.ObjectData.Length; i++ ) { if( mupd.ObjectData[ i ].Type == 9 ) //change position { libsecondlife.LLVector3 pos = new LLVector3( mupd.ObjectData[ i ].Data, 0 ); // libsecondlife.LLQuaternion rot=new LLQuaternion(mupd.ObjectData[i].Data,12,true); Prim_Manager.UpdatePrimPosition( User_info, pos, mupd.ObjectData[ i ].ObjectLocalID ,false ,libsecondlife.LLQuaternion.Identity); //should update stored position of the prim } else if( mupd.ObjectData[ i ].Type == 10 ) { //System.Console.WriteLine(mupd.ObjectData[ i ].Type); //System.Console.WriteLine(mupd); libsecondlife.LLVector3 pos = new LLVector3(100,100,22); libsecondlife.LLQuaternion rot=new LLQuaternion(mupd.ObjectData[i].Data,0,true); Prim_Manager.UpdatePrimPosition( User_info, pos, mupd.ObjectData[ i ].ObjectLocalID ,true ,rot); } } } if( pack.Type == PacketType.AgentWearablesRequest ) { Agent_Manager.SendIntialAvatarAppearance( User_info ); } if( pack.Type == PacketType.AgentUpdate ) { AgentUpdatePacket ag = (AgentUpdatePacket)pack; uint mask = ag.AgentData.ControlFlags & ( 1 ); AvatarData m_av = Agent_Manager.GetAgent( User_info.AgentID ); if( m_av != null ) { if( m_av.Started ) { if( mask == ( 1 ) ) { if( !m_av.Walk ) { //start walking Agent_Manager.SendMoveCommand( User_info, false, m_av.Position.X, m_av.Position.Y, m_av.Position.Z, 0, ag.AgentData.BodyRotation ); Axiom.MathLib.Vector3 v3 = new Axiom.MathLib.Vector3( 1, 0, 0 ); Axiom.MathLib.Quaternion q = new Axiom.MathLib.Quaternion( ag.AgentData.BodyRotation.W, ag.AgentData.BodyRotation.X, ag.AgentData.BodyRotation.Y, ag.AgentData.BodyRotation.Z ); Axiom.MathLib.Vector3 direc = q * v3; direc.Normalize(); direc = direc * ( ( 0.03f ) * 128f ); m_av.Velocity.X = direc.x; m_av.Velocity.Y = direc.y; m_av.Velocity.Z = direc.z; m_av.Walk = true; } } else { if( m_av.Walk ) { //walking but key not pressed so need to stop Agent_Manager.SendMoveCommand( User_info, true, m_av.Position.X, m_av.Position.Y, m_av.Position.Z, 0, ag.AgentData.BodyRotation ); m_av.Walk = false; m_av.Velocity.X = 0; m_av.Velocity.Y = 0; m_av.Velocity.Z = 0; } } } } } 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 { Agent_Manager.SendChatMessage( User_info, line ); } } } } public void NewUserCallback( User_Agent_info UserInfo ) { Console.WriteLine( "new user - {0} - has joined [session {1}]", UserInfo.AgentID.ToString(), UserInfo.SessionID.ToString() +"curcuit used"+UserInfo.circuitCode); string first,last; lock(_login) { first=_login.first; last=_login.last; //should get agentid and sessionid so they can be checked. } Agent_Manager.NewAgent( UserInfo ,first,last); //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++; Agent_Manager.UpdatePositions(); Texture_Manager.DoWork( time ); } } public class Logon { public string first="Test"; public string last="User"; public LLUUID Agent; public LLUUID Session; public Logon() { } } }