コード例 #1
0
        public static void Init(AppId appid, SteamServerInit init)
        {
            uint num = 0;

            if (init.SteamPort == 0)
            {
                init = init.WithRandomSteamPort();
            }
            if (init.IpAddress != null)
            {
                num = init.IpAddress.IpToInt32();
            }
            Environment.SetEnvironmentVariable("SteamAppId", appid.ToString());
            Environment.SetEnvironmentVariable("SteamGameId", appid.ToString());
            int num1 = (init.Secure ? 3 : 2);

            if (!SteamInternal.GameServer_Init(num, init.SteamPort, init.GamePort, init.QueryPort, num1, init.VersionString))
            {
                throw new Exception(String.Format("InitGameServer returned false ({0},{1},{2},{3},{4},\"{5}\")", new Object[] { num, init.SteamPort, init.GamePort, init.QueryPort, num1, init.VersionString }));
            }
            SteamServer.initialized         = true;
            SteamServer.AutomaticHeartbeats = true;
            SteamServer.MaxPlayers          = 32;
            SteamServer.BotCount            = 0;
            SteamServer.Product             = String.Format("{0}", appid.Value);
            SteamServer.ModDir          = init.ModDir;
            SteamServer.GameDescription = init.GameDescription;
            SteamServer.Passworded      = false;
            SteamServer.DedicatedServer = init.DedicatedServer;
            SteamServer.InstallEvents();
            SteamServer.RunCallbacksAsync();
        }
コード例 #2
0
 public virtual void InitUserless()
 {
     this.Self = SteamInternal.FindOrCreateUserInterface(0, this.InterfaceName);
     if (this.Self == IntPtr.Zero)
     {
         throw new Exception(String.Concat("Couldn't find interface ", this.InterfaceName));
     }
     this.VTable = Marshal.ReadIntPtr(this.Self, 0);
     if (this.Self == IntPtr.Zero)
     {
         throw new Exception(String.Concat("Invalid VTable for ", this.InterfaceName));
     }
     this.InitInternals();
 }
コード例 #3
0
        /// <summary>
        /// Initialize the steam server.
        /// If asyncCallbacks is false you need to call RunCallbacks manually every frame.
        /// </summary>
        public static void Init(AppId appid, SteamServerInit init, bool asyncCallbacks = true)
        {
            uint ipaddress = 0;             // Any Port

            if (init.SteamPort == 0)
            {
                init = init.WithRandomSteamPort();
            }

            if (init.IpAddress != null)
            {
                ipaddress = Utility.IpToInt32(init.IpAddress);
            }

            System.Environment.SetEnvironmentVariable("SteamAppId", appid.ToString());
            System.Environment.SetEnvironmentVariable("SteamGameId", appid.ToString());
            var secure = (int)(init.Secure ? 3 : 2);

            //
            // Get other interfaces
            //
            if (!SteamInternal.GameServer_Init(ipaddress, init.SteamPort, init.GamePort, init.QueryPort, secure, init.VersionString))
            {
                throw new System.Exception($"InitGameServer returned false ({ipaddress},{init.SteamPort},{init.GamePort},{init.QueryPort},{secure},\"{init.VersionString}\")");
            }

            initialized = true;

            //
            // Initial settings
            //
            AutomaticHeartbeats = true;
            MaxPlayers          = 32;
            BotCount            = 0;
            Product             = $"{appid.Value}";
            ModDir          = init.ModDir;
            GameDescription = init.GameDescription;
            Passworded      = false;
            DedicatedServer = init.DedicatedServer;

            InstallEvents();

            if (asyncCallbacks)
            {
                RunCallbacksAsync();
            }
        }
コード例 #4
0
        public virtual void InitUserless()
        {
            Self = SteamInternal.FindOrCreateUserInterface(0, InterfaceName);

            if (Self == IntPtr.Zero)
            {
                throw new System.Exception($"Couldn't find interface {InterfaceName}");
            }

            VTable = Marshal.ReadIntPtr(Self, 0);
            if (Self == IntPtr.Zero)
            {
                throw new System.Exception($"Invalid VTable for {InterfaceName}");
            }

            InitInternals();
        }
コード例 #5
0
        public void InitServer()
        {
            HSteamUser hSteamUser = SteamGameServer.GetHSteamUser();

            this.Self = SteamInternal.FindOrCreateGameServerInterface(hSteamUser, this.InterfaceName);
            if (this.Self == IntPtr.Zero)
            {
                throw new Exception(String.Concat("Couldn't find server interface ", this.InterfaceName));
            }
            this.VTable = Marshal.ReadIntPtr(this.Self, 0);
            if (this.Self == IntPtr.Zero)
            {
                throw new Exception(String.Concat("Invalid VTable for server ", this.InterfaceName));
            }
            this.InitInternals();
            SteamServer.WatchInterface(this);
        }
コード例 #6
0
        public virtual void InitServer()
        {
            var user = SteamGameServer.GetHSteamUser();

            Self = SteamInternal.FindOrCreateGameServerInterface(user, InterfaceName);

            if (Self == IntPtr.Zero)
            {
                throw new System.Exception($"Couldn't find server interface {InterfaceName}");
            }

            VTable = Marshal.ReadIntPtr(Self, 0);
            if (Self == IntPtr.Zero)
            {
                throw new System.Exception($"Invalid VTable for server {InterfaceName}");
            }

            InitInternals();
        }
コード例 #7
0
        public void InitClient()
        {
            var user = SteamAPI.GetHSteamUser();

            Self = SteamInternal.FindOrCreateUserInterface(user, InterfaceName);

            if (Self == IntPtr.Zero)
            {
                throw new System.Exception($"Couldn't find interface {InterfaceName}");
            }

            VTable = Marshal.ReadIntPtr(Self, 0);
            if (Self == IntPtr.Zero)
            {
                throw new System.Exception($"Invalid VTable for {InterfaceName}");
            }

            InitInternals();
            SteamClient.WatchInterface(this);
        }
コード例 #8
0
        public static void Init(AppId appid, SteamServerInit init)
        {
            uint ipaddress = 0;             // Any Port

            if (init.SteamPort == 0)
            {
                init = init.WithRandomSteamPort();
            }

            if (init.IpAddress != null)
            {
                ipaddress = Utility.IpToInt32(init.IpAddress);
            }

            //
            // Get other interfaces
            //
            if (!SteamInternal.GameServer_Init(ipaddress, init.SteamPort, init.GamePort, init.QueryPort, (int)(init.Secure ? 3 : 2), init.VersionString))
            {
                throw new System.Exception("InitGameServer returned false");
            }

            initialized = true;

            //
            // Initial settings
            //
            Internal.EnableHeartbeats(true);
            MaxPlayers      = 32;
            BotCount        = 0;
            Product         = $"{appid.Value}";
            ModDir          = init.ModDir;
            GameDescription = init.GameDescription;
            Passworded      = false;
            DedicatedServer = true;

            InstallEvents();

            RunCallbacksAsync();
        }
コード例 #9
0
        public void InitClient()
        {
            //
            // There's an issue for us using FindOrCreateUserInterface on Rust.
            // We have a different appid for our staging branch, but we use Rust's
            // appid so we can still test with the live data/setup. The issue is
            // if we run the staging branch and get interfaces using FindOrCreate
            // then some callbacks don't work. I assume this is because these interfaces
            // have already been initialized using the old appid pipe, but since I
            // can't see inside Steam this is just a gut feeling. Either way using
            // CreateInterface doesn't seem to have caused any fires, so we'll just use that.
            //

            //
            // var pipe = SteamAPI.GetHSteamPipe();
            //

            Self = SteamInternal.CreateInterface(InterfaceName);

            if (Self == IntPtr.Zero)
            {
                var user = SteamAPI.GetHSteamUser();
                Self = SteamInternal.FindOrCreateUserInterface(user, InterfaceName);
            }

            if (Self == IntPtr.Zero)
            {
                throw new System.Exception($"Couldn't find interface {InterfaceName}");
            }

            VTable = Marshal.ReadIntPtr(Self, 0);
            if (Self == IntPtr.Zero)
            {
                throw new System.Exception($"Invalid VTable for {InterfaceName}");
            }

            InitInternals();
            SteamClient.WatchInterface(this);
        }
コード例 #10
0
        public SteamInterface(bool server = false)
        {
            //
            // If teh client isn't initialized but the server is,
            // try to open this interface in server mode
            //
            if (!SteamClient.IsValid && SteamServer.IsValid)
            {
                server = true;
            }

            var hUser = server ?
                        SteamGameServer.GetHSteamUser() :
                        SteamAPI.GetHSteamUser();

            if (hUser == 0)
            {
                throw new System.Exception("Steamworks is uninitialized");
            }

            Self = server ?
                   SteamInternal.FindOrCreateGameServerInterface(hUser, InterfaceName) :
                   SteamInternal.FindOrCreateUserInterface(hUser, InterfaceName);

            if (Self == IntPtr.Zero)
            {
                throw new System.Exception($"Couldn't find interface {InterfaceName} (server:{server})");
            }


            VTable = Marshal.ReadIntPtr(Self, 0);
            if (Self == IntPtr.Zero)
            {
                throw new System.Exception($"Invalid VTable for {InterfaceName}");
            }

            InitInternals();
        }
コード例 #11
0
        /// <summary>
        /// Initialize the steam server.
        /// If <paramref name="asyncCallbacks"/> is <see langword="false"/> you need to call <see cref="RunCallbacks"/> manually every frame.
        /// </summary>
        public static void Init(AppId appid, SteamServerInit init, bool asyncCallbacks = true)
        {
            if (IsValid)
            {
                throw new System.Exception("Calling SteamServer.Init but is already initialized");
            }

            uint ipaddress = 0;             // Any Port

            if (init.IpAddress != null)
            {
                ipaddress = Utility.IpToInt32(init.IpAddress);
            }

            System.Environment.SetEnvironmentVariable("SteamAppId", appid.ToString());
            System.Environment.SetEnvironmentVariable("SteamGameId", appid.ToString());
            var secure = (int)(init.Secure ? 3 : 2);

            //
            // Get other interfaces
            //
            if (!SteamInternal.GameServer_Init(ipaddress, 0, init.GamePort, init.QueryPort, secure, init.VersionString))
            {
                throw new System.Exception($"InitGameServer returned false ({ipaddress},{0},{init.GamePort},{init.QueryPort},{secure},\"{init.VersionString}\")");
            }

            //
            // Dispatch is responsible for pumping the
            // event loop.
            //
            Dispatch.Init();
            Dispatch.ServerPipe = SteamGameServer.GetHSteamPipe();

            AddInterface <SteamServer>();
            AddInterface <SteamUtils>();
            AddInterface <SteamNetworking>();
            AddInterface <SteamServerStats>();
            //AddInterface<ISteamHTTP>();
            AddInterface <SteamInventory>();
            AddInterface <SteamUGC>();
            AddInterface <SteamApps>();

            AddInterface <SteamNetworkingUtils>();
            AddInterface <SteamNetworkingSockets>();

            //
            // Initial settings
            //
            AdvertiseServer = true;
            MaxPlayers      = 32;
            BotCount        = 0;
            Product         = $"{appid.Value}";
            ModDir          = init.ModDir;
            GameDescription = init.GameDescription;
            Passworded      = false;
            DedicatedServer = init.DedicatedServer;

            if (asyncCallbacks)
            {
                //
                // This will keep looping in the background every 16 ms
                // until we shut down.
                //
                Dispatch.LoopServerAsync();
            }
        }
コード例 #12
0
        /// <summary>
        /// Initialize the steam server.
        /// If asyncCallbacks is false you need to call RunCallbacks manually every frame.
        /// </summary>
        public static void Init(AppId appid, SteamServerInit init, bool asyncCallbacks = true)
        {
            uint ipaddress = 0;             // Any Port

            if (init.SteamPort == 0)
            {
                init = init.WithRandomSteamPort();
            }

            if (init.IpAddress != null)
            {
                ipaddress = Utility.IpToInt32(init.IpAddress);
            }

            System.Environment.SetEnvironmentVariable("SteamAppId", appid.ToString());
            System.Environment.SetEnvironmentVariable("SteamGameId", appid.ToString());
            var secure = (int)(init.Secure ? 3 : 2);

            //
            // Get other interfaces
            //
            if (!SteamInternal.GameServer_Init(ipaddress, init.SteamPort, init.GamePort, init.QueryPort, secure, init.VersionString))
            {
                throw new System.Exception($"InitGameServer returned false ({ipaddress},{init.SteamPort},{init.GamePort},{init.QueryPort},{secure},\"{init.VersionString}\")");
            }

            //
            // Dispatch is responsible for pumping the
            // event loop.
            //
            Dispatch.Init();
            Dispatch.ServerPipe = SteamGameServer.GetHSteamPipe();
            Console.WriteLine($"Dispatch.ServerPipe = {Dispatch.ServerPipe.Value}");

            AddInterface <SteamServer>();
            AddInterface <SteamNetworkingUtils>();
            AddInterface <SteamNetworkingSockets>();

            //
            // Initial settings
            //
            AutomaticHeartbeats = true;
            MaxPlayers          = 32;
            BotCount            = 0;
            Product             = $"{appid.Value}";
            ModDir          = init.ModDir;
            GameDescription = init.GameDescription;
            Passworded      = false;
            DedicatedServer = init.DedicatedServer;

            InstallEvents();

            if (asyncCallbacks)
            {
                //
                // This will keep looping in the background every 16 ms
                // until we shut down.
                //
                Dispatch.LoopServerAsync();
            }
        }