秉承着只要一种游戏能开社区服就有种想要搭建一下其服务器的想法,然后我最近就开了一个CSGO的社区服务器来玩。于是就有了这篇文章来介绍一下搭建的过程。

0.准备工作

准备一个云服务器

首先需要去购买一个云服务器来运行CSGO的服务端,这里推荐2H2G以上的配置最佳。一般开一个十人竞技服还是没有任何问题的。

开放服务器对应的安全组

服务器是需要公网IP地址的,然后进入服务器把27015端口的安全组开放,用于玩家连接游戏。

1.下载并运行SteamCMD

下载SteamCMD

首先我们需要下载并安装SteamCMD,这就相当于我们电脑上的Steam,只不过没有了图形化的界面变成了命令行。

Windows系统下载地址: https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip

Centos则可以通过yum来安装,指令: yum install steamcmd

运行SteamCMD

Windows系统可以直接解压压缩包,然后打开steamcmd.exe就可以使用了。

Centos的话就直接切换到对应目录然后输入steamcmd就可以了。

2.通过SteamCMD下载CSGO社区服务器

匿名登陆SteamCMD

打开SteamCMD以后我们首先需要登录到Steam才能下载对应的服务端

在命令行输入login anonymous或者login <你的Steam用户名>来进行用户登录,成功以后的效果如下图

通过SteamCMD下载社区服务器

登陆完以后输入app_update 740 validate进行下载并校验CSGO社区服务器,下载完以后在当前目录下的steamapps\common\Counter-Strike Global Offensive Beta - Dedicated Server\会出现CSGO社区服务器的文件。

其中srcds.exe便是服务器的启动文件,我们以后开启服务器都需要启动它。

3.配置并运行CSGO社区服务器

获取服务器登录令牌

不设置登陆令牌的话可能会出现找不到服务器的现象

登录Steam游戏服务器帐户管理页面,在最底下找到下图的申请令牌的表单:

  • 注:申请令牌需要你的账户满足以下帐户需求:

  • 您的 Steam 帐户目前不能处于社区封禁或锁定状态。

  • 您的 Steam 帐户不能受限

  • 您的 Steam 帐户必须拥有一个合格的注册手机

  • 您的 Steam 帐户必须拥有所创建游戏服务器对应的游戏。

  • 您的 Steam 帐户可以创建 1000 个游戏服务器帐户。

在基础游戏的App ID处填写730(也就是CSGO的ID),然后备忘录那里则填写你能够分辨出来的文本,知道这个是用作哪个服务器的。

创建以后在上面的列表中你可以获取到相应的登陆令牌,在等下的步骤中我们将会用到,所以可以记录下来。

创建并配置server.cfg文件

进入到游戏目录下的csgo/cfg目录,然后在这个文件夹中创建一个文本文档,文件名设置为server.cfg(注意文件后缀)

然后用Notepad++等文本编辑器打开这个文件(没有的话记事本也可以将就下),把文章末尾附录的server.cfg的代码复制到里面修改并保存。

  • 这里写一些重要的参数需要你修改的

  • 首先是sv_setsteamaccount "XXXXXXXXX",这里的XXXXXXXXX就是你需要填写上面申请的Steam登陆令牌的地方。

  • 然后在系统参数中的hostname便是你服务器的名字,双引号里面改成你想要的名字就行了。

  • 下方的rcon_password,便是你设置的服务器远程控制台密码,请不要随便透露给别人

  • 然后的sv_password则是别人想要连接你的服务器需要输入的密码,留空则表示没有密码

  • 然后这个文件最下面有一个sv_tags的参数,这个就是你服务器的标签,设置了以后可以方便的在社区浏览器中筛选出你的服务器

配置服务器motd(可选)

在我们进入其他社区服务器游戏,然后按下Tab键的时候,我们可以发现左下角有一个服务器网站(如图)。

而这个网址的修改我们是可以在csgo目录下的motd.txt中输入我们的网址就可以让玩家访问我们服务器的网页。

开启服务器

在经过了上面一系列的配置之后终于来到了我们开启服务器的步骤。

首先正常情况下你双击srcds.exe可能会发现没有反应,这个时候我们就需要在启动的时候加上相应的参数(如游戏模式、服务器tick、游戏地图等)

下面我会介绍几种我认为比较方便的启动方式:

Ⅰ.利用cmd来启动服务器(Centos适用)

首先我们需要在命令行中进入刚刚下载的csgo社区服务器的游戏目录:

(Windows可以用资源管理器打开对应的界面后在那个界面的地址栏输入cmd可以直接开启此目录的命令行)

然后输入srcds.exe -game csgo -console -usercon +game_type 0 +game_mode 1 +mapgroup mg_active +map de_dust2 -tickrate 128就可以开启一个128tick的沙二的竞技服务器(这些参数的解释我会放到文章末尾的附录解释)

Ⅱ.利用快捷方式来启动服务器(限Windows)

首先我们要找到文件目录中的srcds.exe然后对其右键->创建快捷方式->右键快捷方式->属性,然后在属性中找到目标,然后在目标原有文本双引号的后面和刚刚一样添加参数(例如: "XXXX/srcds.exe" -game csgo -console -usercon +game_type 0 +game_mode 1 +mapgroup mg_active +map de_dust2 -tickrate 128 , 参数解释见文末附录),这样设置以后,我们以后启动服务器就只需要点击这个快捷方式就行了

Ⅲ.利用批处理文件

我们在srcds.exe的同级目录中新建一个文本文件,文件名和后缀可以修改为start.bat,然后编辑这个文件,在里面写上下面的内容:

@echo off
srcds.exe -game csgo -console -usercon +game_type 0 +game_mode 1 +mapgroup mg_active +map de_dust2 -tickrate 128

然后保存我们也可以很方便的开启服务器。

成功开启服务器的标志

当你在命令行中看见类似这样的输出以后,那就表明你的服务器已经开启了,我们可以去游戏中连接服务器了

进入服务器

进入服务器一共有两种办法来加入:

Ⅰ.利用开发者控制台

CSGO的开发者控制台中有一个指令是可以直接连接到我们的服务器的

进入游戏按~键打开开发者控制台(没反应可以去看下设置里面有没有开启)

然后在控制台中输入connect <你的服务器IP>,回车,然后你就会加入到你开启的服务器了。

Ⅱ.利用社区浏览器

在CSGO的国际服中,我们开启的服务器(需要填写服务器令牌)是可以在社区管理器中搜到的,游戏选择类型的下拉菜单的最下面有一个社区浏览器的选项。在里面通过筛选和寻找服务器名字和标签,我们可以直接找出并连接服务器。

4.利用远程密码管理你的服务器

设置rcon密码

在控制台使用rcon指令可以让你以管理员的身份来执行你所需要输入的指令,解决了权限不够的问题。

首先我们需要在上方步骤的server.cfg中配置rcon密码。

rcon_password "<你要设置的密码>"

使用rcon密码

然后我们就可以进入游戏,然后在连接完服务器后在控制台利用rcon_password <你设置的rcon密码>来设置你的rcon密码。

设置完密码以后,我们就可以利用rcon <你所需要执行的指令>来远程以管理员的身份执行命令。

5.为你的服务器安装插件

众所周知,CSGO原版所提供的功能非常局限。此时我们就需要利用一些服务器的插件来丰富我们的服务器。而我们要安装插件就离不开 “MetaMod”和“SourceMod”这两个模组了。

MetaMod和SourceMod模组的安装

首先我们进入SourceModMetaMod的下载页面下载对应的压缩包,然后解压后会得到一个addonscfg文件夹,把这两个文件夹拖入我们服务器目录下的csgo文件夹内覆盖即可完成对应的安装。

给自己添加SourceMod的管理员权限

首先我们需要进入游戏,然后在控制台输入status命令,此时我们可以在最底下找到一个STEAM_X:X:XXXXXX的文本,这个就是我们所需要知道的我们的steamid。

然后进入到\csgo\addons\sourcemod\configs\admins_simple.ini文件,在文件末尾加上"<你的Steam id>" "99:z"就可以为你设置最高的管理员权限。

此时如果服务器是开着的话可以使用sm_reloadadmins命令来加载你的管理员配置。

至此你的管理员权限也配置完毕了,你只需要在控制台输入sm_admin指令来测试你的管理员有没有设置成功就行了。

为你的服务器安装其他插件

对于其他插件的安装也只需要像上面的模组安装一样,覆盖文件即可,这里就不多阐述。

对于插件,我们可以去SM官方的插件发布页找。

6.附录

附录一:游戏启动参数介绍

-game csgo //表示游戏为csgo
-console   //表示启用控制台
-usercon   //使用远程密码
+game_type +game_mode //两者组合选择游戏对应的模式
//例如:00 休闲、01竞技、02 2v2搭档、03 5v5混战、10 军械竞赛、11 军械竞赛爆破模式、12 军械竞赛死亡竞赛模式等等
+mapgroup  //选择游戏的地图组,例如:mg_active
+map       //游戏地图
-tickrate 64/128 //游戏服务器对应的tick(不了解可以百度区别)
-insecure  //添加此参数会关闭VAC验证

附录二:server.cfg

// CSGO服务器登录令牌,注意替换XXXXXXXXXXX
sv_setsteamaccount "XXXXXXXXXXX"

// 系统参数
hostname "CSGO server"                            // 服务器名称将显示在服务器浏览器中。
rcon_password ""                                  // CS:GO远程控制台密码,修改为自己定义的密码
sv_password ""                                    // 服务器连接密码,在连接服务器时输入,不要密码可以留空


// 服务器参数
mp_friendlyfire "0"                         // 队友伤害 1=启用,0=禁用
//ff_damage_reduction_grenade "0"           // 减少手榴弹对队友造成的伤害。
//ff_damage_reduction_bullets "0"           // 减少射击时对队友造成的伤害。
//ff_damage_reduction_other "0"             // 减少非子弹/手榴弹对队友造成的伤害
mp_autoteambalance "0"                      // 自动平衡团队
mp_autokick "0"                             // 踢挂机或故意击杀队友的玩家。
mp_tkpunish "0"                             // 启用故意击杀队友惩罚。
sv_alltalk "1"                              // 玩家可以听到所有其他玩家的语音通信,不受团队限制
sv_deadtalk "0"                             // 死亡玩家可以对活着的玩家说话(语音、文本)。
sv_full_alltalk "1"                         // 任何玩家(包括观战玩家)都可以与任何其他玩家通话
sv_pausable "0"                             // 将服务器设置为可暂停。如果设为1,任何人都可以暂停。
mp_limitteams "0"                           // 最大数量团队可能失衡。0已关闭。
sv_voiceenable "1"                          // 已启用并禁用语音聊天。默认值:1,启用。
sv_allow_lobby_connect_only "0"             // 如果设置为1,则只允许配对游戏,不允许直接连接。
sv_allow_wait_command "1"                   // 是否允许连接到此服务器的客户端上的等待命令
sv_cheats "0"                               // 允许服务器使用外挂
sv_alternateticks "0"                       // 如果设置为1,则服务器仅模拟偶数记号上的实体。
sv_downloadurl ""                           // 客户端可以下载丢失文件的网站
sv_forcepreload "0"                         // 强制服务器端预加载。
sv_friction "4"                             // 世界摩擦。默认值4
sv_pure "0"                                 // 0关闭,1使用白名单,2强制默认。
sv_consistency "0"                          // 0关闭并允许外观,1打开并强制默认值。
//sv_pure_kick_clients "1"                  // 如果设置为1,服务器将使用不匹配的文件来踢客户端。
//sv_pure_trace "0"                         // 如果设置为1,则每当客户端验证文件的CRC时,服务器都会打印一条消息。


// 游戏参数
mp_freezetime "6"                           // 回合开始时,让玩家保持静止的时间是多少秒
mp_afterroundmoney "0"                      // 每轮后向每位玩家支付的金额
mp_playercashawards "1"                     // 玩家可以通过执行游戏中的动作来赚钱
mp_teamcashawards "1"                       // 团队可以通过执行游戏中的动作来赚钱
mp_maxrounds "30"                           // 每张地图的最大回合数
mp_timelimit "0"                            // 整个地图需要多少分钟
mp_roundtime "2"                            // 每轮需要多少分钟。
mp_freezetime"5"                            // 当回合开始时,需要多少秒让玩家保持静止
mp_buytime "45"                             // 回合开始后玩家可以购买物品的秒数。
mp_forcecamera "1"                          // 设置为1,仅供团队观看。
mp_defuser_allocation "2"                   // 如何在开始或结束时将defuser分配给CT:0=无,1=随机,2=所有人
mp_death_drop_defuser "1"                   // 玩家死亡时丢弃装备
mp_death_drop_grenade "2"                   // 玩家死亡时丢弃哪个手榴弹:0=无,1=最佳,2=当前或最佳
mp_death_drop_gun "1"                       // 玩家死亡时丢弃哪支枪:0=无,1=最佳,2=当前或最佳
mp_buytime "45"                             // 回合开始后玩家可以购买物品的秒数。
mp_c4timer "45"                             // 从C4待命到爆炸有多长时间
mp_do_warmup_period "1"                     // 是否在比赛开始时进行热身。
mp_force_pick_time "15"                     // 玩家在自动组队之前在组队屏幕上进行选择的时间量
mp_halftime_duration "15"                   // 中场休息持续的秒数
mp_join_grace_time "15                      // 回合开始后允许玩家加入游戏的秒数
mp_match_end_restart "1"                    // 在比赛结束时,执行重新启动,而不是加载新地图
mp_maxrounds "30"                           // 每张地图的最大回合数
mp_playercashawards "1"                     // 玩家可以通过执行游戏中的动作来赚钱
mp_playerid "0"                             // 控制玩家在状态栏中看到的信息:0所有名称;1玩家名称;2没有名称
mp_playerid_delay "0"                       // 状态栏中显示信息的延迟秒数
mp_playerid_hold "0"                        // 秒数以保持在状态栏中显示旧信息
mp_restartgame "0"                          // 如果非零,游戏将在指定的秒数内重新启动
mp_round_restart_delay "7"                  // 获胜后重新开始回合前的延迟秒数
mp_roundtime "3"                            // 每轮需要多少分钟。
mp_warmuptime "25"                          // 如果为真,则在每场比赛开始时会有一个热身期/回合,以便连接。
mp_win_panel_display_time "5"               // 显示比赛/半场之间win panel的时间量


// 电脑玩家参数
bot_difficulty 5                           // 定义机器人加入游戏的技能。值为:0=简单,1=正常,2=困难,3=专家。
bot_chatter "off"                          // 控制机器人说话的方式。允许值:“off”、“radio”、“minimal”或“normal”
bot_join_after_player 1                    // 如果非零,则bot将等待玩家加入后再进入游戏。
bot_quota 10                               // 决定游戏中的机器人总数。
bot_quota_mode "fill"                      // 确定配额的类型。允许值:“normal”、“fill”和“match”


// 日志参数

//log on                                    // 是否开启日志记录
sv_log_onefile "0"                          // 只将服务器信息记录到一个文件中。
sv_logbans "0"                              // Log服务器日志中的服务器禁止。
sv_logecho "1"                              // 将日志信息回显到控制台。
sv_logfile "1"                              // Log日志文件中的服务器信息。
sv_logflush "0"                             // 每次写入时将日志文件刷新到磁盘(慢)。
sv_logsdir "0"                              // game目录中存储服务器日志的文件夹。


// 服务器网络参数
sv_maxcmdrate "200"                         // 服务器cmd最大带宽使用量
sv_maxrate "128000"                         // 服务器最大带宽使用量,默认值非常小,因此会造成choke值异常,此处建议改为128000
sv_mincmdrate "10"                          // 服务器cmd最小带宽使用量
sv_minrate "80000"                          // 服务器最小带宽使用量,与上面同理,此处建议改为80000


// 人物跳跃移动参数
sv_accelerate "5.5"                         // 人物移动速度,默认值为10,快到恶心,此处建议修改为5.5
sv_friction "4"                             // 世界摩擦。默认值4
sv_staminajumpcost ".1"                     // 跳跃的体魄惩罚。默认值.1
sv_staminalandcost ".1"                     // 着陆的耐力惩罚。默认值.1
sv_staminamax "80"                          // 最大体魄惩罚。默认值80
sv_staminarecoveryrate "50"                 // 体力恢复的速率(单位/秒)。默认值50

// 金钱参数
mp_startmoney "400"                         // 每位玩家重置时获得的金钱数量。
mp_maxmoney "16000"                         // 玩家账户中允许的最大金钱数量。                                
cash_team_terrorist_win_bomb "2200"         // 爆破模式获胜获得金钱数量。
cash_team_elimination_hostage_map "2200"    // 玩家消灭所有人质时的收入。
cash_team_elimination_bomb_map "2200"       // 炸弹爆炸后团队将赢得多少金钱。
cash_team_win_by_time_running_out "2200"    // 时间结束时团队将赢得多少金钱。
cash_team_win_by_defusing_bomb "2200"       // 拆除炸弹后团队将赢得多少金钱。
cash_team_win_by_hostage_rescue "2200"      // 当所有人质获救后,团队将赢得多少金钱。
cash_team_loser_bonus "2000"                // 玩家失败时玩家将赢得多少金钱。
cash_team_loser_bonus_consecutive_rounds "500" // 当玩家连续失败时,玩家将赢得多少金钱。
cash_team_rescued_hostage "100"             // 当团队解救人质时,团队将赢得多少。
cash_team_hostage_alive        "0"          // 当人质还活着时,团队将赢得多少金钱
cash_team_planted_bomb_but_defused "200"    // 当团队放置了炸弹并被拆除时,团队将赢得多少
cash_team_hostage_interaction "50"          // 当人质获救时,团队将赢得多少金钱
cash_player_killed_teammate "-3300"         // 当队友被杀时,玩家将损失多少
cash_player_killed_enemy_default "200"      // 玩家在杀死敌人时会赢多少钱
cash_player_killed_enemy_factor "0.5"       // 玩家在杀敌时会赢多少钱
cash_player_bomb_planted "200"              // 放置炸弹后玩家将赢得多少。
cash_player_bomb_defused "200"              // 炸弹解除后玩家将赢得多少钱
cash_player_rescued_hostage "200"           // 解救人质时玩家会赢多少钱
cash_player_interact_with_hostage "0"       // 玩家在与人质互动时会赢多少钱
cash_player_damage_hostage "-30"            // 玩家在伤害人质时会损失多少
cash_player_killed_hostage "-1000"          // 当人质被杀时,玩家将释放多少钱


// 投票参数
sv_allow_votes "1"                          // 打开和关闭服务器投票。
sv_vote_allow_spectators "0"                // 允许观众投票
sv_vote_command_delay "2"                   // 票通过后多长时间,直到动作发生
sv_vote_creation_time "120"                 // 某人可以单独进行投票的频率。
sv_vote_failure_timer "300"                 // 失败的投票在这么长时间内不能重新提交
sv_vote_quorum_ratio "0"                    // 为解决某个问题而需要投票的玩家的最小比率。
sv_vote_timer_duration "15"                 // 允许对一个问题进行投票的时间



sv_lan "0"                                 // 应始终设置此选项,以便您知道它未打开
sv_region "255"                            // 服务器所在区域注册参数,255=全球,0=美国东部,1=美国西部,2=南美洲,3=欧洲,4=亚洲,5=澳洲,6=中东,7=非洲
sv_tags ""                          // Server标签。用于在客户端浏览服务器时向其提供额外信息