protected void Initialize(IPEndPoint serverEndpoint)
        {
            m_groupId = MySandboxGame.ConfigDedicated.GroupID;

            ServerStarted = false;

            HostName = "Dedicated server";

            SyncLayer.RegisterMessageImmediate <ConnectedClientDataMsg>(this.OnConnectedClient, MyMessagePermissions.ToServer | MyMessagePermissions.FromServer);
            SyncLayer.RegisterMessageImmediate <AllMembersDataMsg>(OnAllMembersData, MyMessagePermissions.ToServer | MyMessagePermissions.FromServer);

            m_membersCollection = new MemberCollection(m_members);
            SetMemberLimit(MaxPlayers);

            SteamSDK.Peer2Peer.SessionRequest   += Peer2Peer_SessionRequest;
            SteamSDK.Peer2Peer.ConnectionFailed += Peer2Peer_ConnectionFailed;
            ClientLeft += MyDedicatedServer_ClientLeft;

            SteamSDK.SteamServerAPI.Instance.GameServer.ServersConnected           += GameServer_ServersConnected;
            SteamSDK.SteamServerAPI.Instance.GameServer.ServersConnectFailure      += GameServer_ServersConnectFailure;
            SteamSDK.SteamServerAPI.Instance.GameServer.ServersDisconnected        += GameServer_ServersDisconnected;
            SteamSDK.SteamServerAPI.Instance.GameServer.PolicyResponse             += GameServer_PolicyResponse;
            SteamSDK.SteamServerAPI.Instance.GameServer.ValidateAuthTicketResponse += GameServer_ValidateAuthTicketResponse;
            SteamSDK.SteamServerAPI.Instance.GameServer.UserGroupStatus            += GameServer_UserGroupStatus;

            ServerStartResult startResult = SteamSDK.SteamServerAPI.Instance.GameServer.Start(
                serverEndpoint,
                (ushort)MySandboxGame.ConfigDedicated.SteamPort,
                SteamSDK.ServerMode.eServerModeAuthenticationAndSecure,
                MyFinalBuildConstants.APP_VERSION.ToString(),
                MyFakes.DEDICATED_SERVER_USE_SOCKET_SHARE);

            switch (startResult)
            {
            case ServerStartResult.PortAlreadyUsed:
                ServerInitError = "Error starting Steam dedicated server: Server port " + (ushort)MySandboxGame.ConfigDedicated.ServerPort + " already in use";
                MyLog.Default.WriteLineAndConsole(ServerInitError);
                break;

            case ServerStartResult.UnknownError:
                ServerInitError = "Error starting Steam dedicated server";
                MyLog.Default.WriteLineAndConsole(ServerInitError);
                break;
            }

            if (startResult != ServerStartResult.OK)
            {
                return;
            }

            // This has to be exact name of app like this to show in Server Browser
            SteamSDK.SteamServerAPI.Instance.GameServer.SetModDir(MyPerGameSettings.SteamGameServerGameDir);

            SteamSDK.SteamServerAPI.Instance.GameServer.ProductName     = MyPerGameSettings.SteamGameServerProductName;
            SteamSDK.SteamServerAPI.Instance.GameServer.GameDescription = MyPerGameSettings.SteamGameServerDescription;
            SteamSDK.SteamServerAPI.Instance.GameServer.SetDedicated(true);

            string serverName = MySandboxGame.ConfigDedicated.ServerName;

            if (String.IsNullOrWhiteSpace(serverName))
            {
                serverName = "Unnamed server";
            }

            SteamSDK.SteamServerAPI.Instance.GameServer.SetServerName(serverName);
            SteamSDK.SteamServerAPI.Instance.GameServer.LogOnAnonymous();


            SteamSDK.SteamServerAPI.Instance.GameServer.EnableHeartbeats(true);

            if (m_groupId != 0 && SteamServerAPI.Instance.GetAccountType(m_groupId) != AccountType.Clan)
            {
                MyLog.Default.WriteLineAndConsole("Specified group ID is invalid: " + m_groupId);
            }

            UInt32 ip = 0;
            UInt64 id = 0;

            int timeout = 100;

            while (ip == 0 && timeout > 0)
            {
                SteamSDK.SteamServerAPI.Instance.GameServer.RunCallbacks();

                Thread.Sleep(100);
                timeout--;

                ip = SteamSDK.SteamServerAPI.Instance.GameServer.GetPublicIP();
                id = SteamSDK.SteamServerAPI.Instance.GameServer.GetSteamID();
            }

            MySandboxGame.Services.SteamService.UserId = id;

            if (ip == 0)
            {
                MyLog.Default.WriteLineAndConsole("Error: No IP assigned.");
                return;
            }

            var ipAddress = IPAddressExtensions.FromIPv4NetworkOrder(ip);

            ServerId = MySteam.Server.GetSteamID();
            m_members.Add(ServerId);
            m_memberData.Add(ServerId, new MyConnectedClientData()
            {
                Name = "Server", IsAdmin = true
            });

            SyncLayer.RegisterClientEvents(this);

            MyLog.Default.WriteLineAndConsole("Server successfully started");
            MyLog.Default.WriteLineAndConsole("Product name: " + SteamSDK.SteamServerAPI.Instance.GameServer.ProductName);
            MyLog.Default.WriteLineAndConsole("Desc: " + SteamSDK.SteamServerAPI.Instance.GameServer.GameDescription);
            MyLog.Default.WriteLineAndConsole("Public IP: " + ipAddress.ToString());
            MyLog.Default.WriteLineAndConsole("Steam ID: " + id.ToString());

            ServerStarted = true;
        }
Exemplo n.º 2
0
        protected void Initialize(IPEndPoint serverEndpoint)
        {
            this.m_groupId     = MySandboxGame.ConfigDedicated.GroupID;
            this.ServerStarted = false;
            this.HostName      = "Dedicated server";
            this.SetMemberLimit(this.MaxPlayers);
            MyGameService.Peer2Peer.SessionRequest   += new Action <ulong>(this.Peer2Peer_SessionRequest);
            MyGameService.Peer2Peer.ConnectionFailed += new Action <ulong, string>(this.Peer2Peer_ConnectionFailed);
            base.ClientLeft += new Action <ulong, MyChatMemberStateChangeEnum>(this.MyDedicatedServer_ClientLeft);
            MyGameService.GameServer.PlatformConnected          += new Action(this.GameServer_ServersConnected);
            MyGameService.GameServer.PlatformConnectionFailed   += new Action <string>(this.GameServer_ServersConnectFailure);
            MyGameService.GameServer.PlatformDisconnected       += new Action <string>(this.GameServer_ServersDisconnected);
            MyGameService.GameServer.PolicyResponse             += new Action <sbyte>(this.GameServer_PolicyResponse);
            MyGameService.GameServer.ValidateAuthTicketResponse += new Action <ulong, JoinResult, ulong>(this.GameServer_ValidateAuthTicketResponse);
            MyGameService.GameServer.UserGroupStatusResponse    += new Action <ulong, ulong, bool, bool>(this.GameServer_UserGroupStatus);
            string serverName = MySandboxGame.ConfigDedicated.ServerName;

            if (string.IsNullOrWhiteSpace(serverName))
            {
                serverName = "Unnamed server";
            }
            MyGameService.GameServer.SetServerName(serverName);
            MyGameService.Peer2Peer.SetServer(true);
            if (MyGameService.GameServer.Start(serverEndpoint, (ushort)MySandboxGame.ConfigDedicated.SteamPort, MyFinalBuildConstants.APP_VERSION.ToString()))
            {
                MyGameService.GameServer.SetModDir(MyPerGameSettings.SteamGameServerGameDir);
                MyGameService.GameServer.ProductName     = MyPerGameSettings.SteamGameServerProductName;
                MyGameService.GameServer.GameDescription = MyPerGameSettings.SteamGameServerDescription;
                MyGameService.GameServer.SetDedicated(true);
                if (!string.IsNullOrEmpty(MySandboxGame.ConfigDedicated.ServerPasswordHash) && !string.IsNullOrEmpty(MySandboxGame.ConfigDedicated.ServerPasswordSalt))
                {
                    MyGameService.GameServer.SetPasswordProtected(true);
                    this.IsPasswordProtected = true;
                }
                MyGameService.GameServer.LogOnAnonymous();
                MyGameService.GameServer.EnableHeartbeats(true);
                if ((this.m_groupId != 0) && (MyGameService.GetServerAccountType(this.m_groupId) != MyGameServiceAccountType.Clan))
                {
                    MyLog.Default.WriteLineAndConsole("Specified group ID is invalid: " + this.m_groupId);
                }
                uint  ip       = 0;
                ulong serverId = 0UL;
                int   num3     = 100;
                while ((ip == 0) && (num3 > 0))
                {
                    MyGameService.GameServer.Update();
                    Thread.Sleep(100);
                    num3--;
                    ip       = MyGameService.GameServer.GetPublicIP();
                    serverId = MyGameService.GameServer.ServerId;
                }
                MyGameService.UserId = serverId;
                if (ip == 0)
                {
                    MyLog.Default.WriteLineAndConsole("Error: No IP assigned.");
                }
                else
                {
                    IPAddress address = IPAddressExtensions.FromIPv4NetworkOrder(ip);
                    base.ServerId = MyGameService.GameServer.ServerId;
                    base.ReplicationLayer.SetLocalEndpoint(new EndpointId(MyGameService.GameServer.ServerId));
                    this.m_members.Add(base.ServerId);
                    MyMultiplayerBase.MyConnectedClientData data = new MyMultiplayerBase.MyConnectedClientData {
                        Name    = MyTexts.GetString(MySpaceTexts.ChatBotName),
                        IsAdmin = true
                    };
                    this.MemberDataAdd(base.ServerId, data);
                    base.SyncLayer.RegisterClientEvents(this);
                    MyLog.Default.WriteLineAndConsole("Server successfully started");
                    MyLog.Default.WriteLineAndConsole("Product name: " + MyGameService.GameServer.ProductName);
                    MyLog.Default.WriteLineAndConsole("Desc: " + MyGameService.GameServer.GameDescription);
                    MyLog.Default.WriteLineAndConsole("Public IP: " + address.ToString());
                    MyLog.Default.WriteLineAndConsole("Steam ID: " + serverId.ToString());
                    this.ServerStarted = true;
                }
            }
        }