/* 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 Second_server { /// /// Description of MainForm. /// public partial class Controller : Server_callback { [STAThread] public static void Main( string[] args ) { Controller c = new Controller(); while( true ) // fuckin' a System.Threading.Thread.Sleep( 1000 ); } public Server server; private Agent_Manager agent_man; private Prim_manager prim_man; private Texture_manager texture_man; private Asset_manager asset_man; private Login_manager login_man; //built in login server private ulong time; //ticks private Timer timer1 = new Timer(); public Controller() { server = new Server( this ); agent_man = new Agent_Manager( this.server ); prim_man = new Prim_manager( this.server ); texture_man = new Texture_manager( this.server ); asset_man = new Asset_manager( this.server ); prim_man.agent_man = agent_man; agent_man.prim_man = prim_man; login_man = new Login_manager(); // startup login_man.startup(); // login server timer1.Enabled = true; timer1.Interval = 200; timer1.Elapsed +=new ElapsedEventHandler( this.Timer1Tick ); } public void main_callback( Packet pack, User_Agent_info User_info ) { 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.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" ) ) ) { //System.Console.WriteLine(pack); //System.Console.WriteLine(tran.TransferInfo.TransferID); asset_man.add_request( User_info, id, tran ); //this.richTextBox1.Text=this.richTextBox1.Text+"\n "+pack.Type; } } 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_man.Agent_join( User_info ); } if( pack.Type == PacketType.RequestImage ) { RequestImagePacket image_req = (RequestImagePacket)pack; for( int i = 0; i < image_req.RequestImage.Length; i++ ) { this.texture_man.add_request( User_info, image_req.RequestImage[ i ].Image ); } } if( pack.Type == PacketType.RegionHandshakeReply ) { //recieved regionhandshake so can now start sending info agent_man.send_intial_data( User_info ); //this.setuptemplates("objectupate164.dat",User_info,false); } if( pack.Type == PacketType.ObjectAdd ) { ObjectAddPacket ad = (ObjectAddPacket)pack; prim_man.create_prim( 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 ); prim_man.update_prim_position( User_info, pos.X, pos.Y, pos.Z, mupd.ObjectData[ i ].ObjectLocalID ); //should update stored position of the prim } } } if( pack.Type == PacketType.AgentWearablesRequest ) { agent_man.send_intial_avatar_apper( User_info ); } if( pack.Type == PacketType.AgentUpdate ) { AgentUpdatePacket ag = (AgentUpdatePacket)pack; uint mask = ag.AgentData.ControlFlags & ( 1 ); Avatar_data m_av = agent_man.Get_Agent( User_info.AgentID ); if( m_av != null ) { if( m_av.started ) { if( mask == ( 1 ) ) { if( !m_av.walk ) { //start walking agent_man.send_move_command( User_info, false, m_av.pos.X, m_av.pos.Y, m_av.pos.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.vel.X = direc.x; m_av.vel.Y = direc.y; m_av.vel.Z = direc.z; m_av.walk = true; } } else { if( m_av.walk ) { //walking but key not pressed so need to stop agent_man.send_move_command( User_info, true, m_av.pos.X, m_av.pos.Y, m_av.pos.Z, 0, ag.AgentData.BodyRotation ); m_av.walk = false; m_av.vel.X = 0; m_av.vel.Y = 0; m_av.vel.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_man.send_chat_message( User_info, line ); } } } } public void new_user( User_Agent_info User_info ) { Console.WriteLine( "new user - {0} - has joined [session {1}]", User_info.AgentID.ToString(), User_info.SessionID.ToString() ); agent_man.New_Agent( User_info ); } public void error( string text ) { Console.WriteLine( "error report: {0}", text ); } void Timer1Tick( object sender, System.EventArgs e ) { this.time++; agent_man.tick(); texture_man.Do_work( time ); } } }