# touhou-bullet-rain-server **Repository Path**: half_tree/touhou-bullet-rain-server ## Basic Information - **Project Name**: touhou-bullet-rain-server - **Description**: Touhou Bullet Rain ~ 东方枪林弹雨是一款高速弹幕PVP/PVE混合休闲游戏(我也不知道算不算休闲,也许吧),该仓库保存游戏的服务端,玩家需要通过客户端链接运行了服务端的主机,才能进行单机或联机的游戏。 若要获取游戏客户端,请移步下面的仓库:https://gitee.com/half_tree/touhou-bullet-rain-client - **Primary Language**: Unknown - **License**: GPL-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-11-21 - **Last Updated**: 2024-12-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Touhou Bullet Rain ~ 东方枪林弹雨 游戏服务端 ## 这是什么? **Touhou Bullet Rain ~ 东方枪林弹雨**是一款高速弹幕PVP/PVE混合休闲游戏(我也不知道算不算休闲,也许吧),该仓库保存游戏的服务端,玩家需要通过客户端链接运行了服务端的主机,才能进行单机或联机的游戏。 若要获取游戏客户端,请移步下面的仓库:https://gitee.com/half_tree/touhou-bullet-rain-client 接下来的内容将会为各位介绍如何部署服务端到你的本机上。 ## 构建方案 ### 使用CMake构建 - 编译器 请使用**MinGW 8.0.1 Posix**版本作为C++编译器,其他版本的编译器不一定支持。 - CMake 请使用高于3.10版本的CMake,推荐版本为3.31。 在程序主文件夹中运行 ```sh cmake -S . -B ./build -G "MinGW Makefiles" ``` 此后,在构建文件夹中运行 ```sh cmake --build . ``` 构建完成后,你需要将`libhv.dll`与`libjsoncpp.dll`拷贝到构建目录下,并将项目根目录下的`server_properties.json`也拷贝到根目录。 ### 直接下载二进制版本 如果不想折腾CMake,在本仓库的Release页面下载即可,即开即用,但是Release版本仅仅支持Windows系统,如果你希望在其它系统下运行,你应当自行构建。 ## 部署过程 ### 视频教程 请见:https://www.bilibili.com/video/BV1f8qWYcEVx/?vd_source=b101593d20983860cd3e333b3a1f5eeb ### 修改server_properties.json改变服务端设置 ```json { "ip":"127.0.0.1", "port":9961, "maxPlayer":4, "latencyLevel":1, "serverName":"Test Server Title", "serverInfo":["Test Server Description.", "This is the second line.", "Can you see this line?"], "mapWidth":1200.0, "mapHeight":1200.0, "roundTime":300.0, "autoStart":true, "autoStartTime":40.0, "autoStartMinPlayerCount":1, "itemDropPercentage":0.6, "youkaiDeployGap":15.0, "playerKnockDownScore":1500, "youkaiKnockDownScore":35, "damageScoreRatio":1.0, "youkaiMissPenalize":1000 } ``` 上述属性的含义如下,它们是可以由你定制和修改的: |属性名|类型|含义| |---|---|---| |ip|string|服务端监听的IP地址| |port|int|服务器监听的端口| |maxPlayer|int|~~服务器的最大玩家数~~(属性弃用)| |latencyLevel|int|~~服务器延迟等级~~(属性弃用)| |serverName|string|服务器名(用于显示给玩家)| |serverInfo|string[]|服务器描述(用于显示给玩家,每一行一个元素)| |mapWidth|float|地图宽度| |mapHeight|float|地图高度| |roundTime|float|每回合进行时间| |autoStart|bool|游戏是否在玩家数满足条件时自动开始| |autoStartTime|float|游戏自动开始前的等待时间| |autoStartMinPlayerCount|int|要让游戏自动开始的最小玩家数| |itemDropPercentage|float|击倒NPC后道具掉落概率| |youkaiDeployGap|float|NPC单位刷新的时间间隔| |playerKnockDownScore|int|玩家击倒其他玩家得分| |youkaiKnockDownScore|int|玩家击倒NPC得分| |damageScoreRatio|int|玩家造成伤害转化为得分的乘值| |youkaiMissPenalize|int|玩家被妖怪击杀扣除的分数| 接下来,针对一些常见的部署场景,给出一些示例: ### 部署在本地 想要进行单人游戏的话,需要把服务器部署在本地,对`server_properties.json`作以下设置: ```json { "ip":"127.0.0.1", "port":9961, } ``` 然后对于你的游戏客户端,做出相同的设置: ```json { "playerName":"half_tree", "connectIP":"127.0.0.1", "connectPort":9961, } ``` 在启动本机的服务端后,再启动客户端,就可以使得客户端接入本地服务端了。 ### 部署在局域网 想要和局域网的其他玩家游戏的话,需要将服务器部署在局域网: 在命令行输入以下命令 ```sh ipconfig ``` 观察你的WLAN无线局域网的IPv4地址 ``` IPv4 地址 . . . . . . . . . . . . : xxx.xxx.x.xxx ``` 将该地址复制到服务端和客户端的`ip`属性,再启动服务端,观察到 ``` Starting server on xxx.xxx.x.xxx Server active. Listening on port 9961 Type "help" for more help. ``` 即为成功,和你在同一个局域网下的其它玩家此时也可以通过链接该IP加入游戏。 ### 部署在公网 你也可以把服务器部署在公网,你需要一台具有公网IP的服务器。 在远程服务器命令行输入以下命令 ```sh ipconfig ``` 观察远程服务器的WLAN无线局域网的IPv4地址 ``` IPv4 地址 . . . . . . . . . . . . : xxx.xxx.x.xxx ``` 将该地址复制到服务端和客户端的`ip`属性,再启动服务端,观察到服务器成功启动为成功。 接下来,更改客户端的`connectIP`字段为服务器的公网IP地址,即可通过客户端链接远程服务端。 请注意,你可能需要更改服务器安全组规则,主要是允许服务器在`port`指定的端口上的入方向规则允许TCP链接。 ## 服务器命令 打开服务端,你应当看到以下界面: ``` Starting server on xxx.x.xx.xxx Server active. Listening on port xxxx Type "help" for more help. ``` 若除上述文字外没有其他提示,说明服务端建立大致成功,接下来,玩家的加入、断线和对局信息都会在该服务端上显现,你还可以执行一些其他命令来获取对局信息和改变对局状态:输入`help`指令,以下提示就会出现。 ``` List Targets -> ls Game Option -> game Boardcast -> boardcast Kick Player -> kick Stop Server -> stop Copyleft/right related -> copyright | license 999 -> cirno ``` - `ls`命令可以列出对局中的一些信息,例如`ls player`可以显示所有玩家的具体信息; - `game`命令可以指定一些对局相关的命令,例如`game start`可以开始一局游戏; - `boardcast`命令可以向所有客户端广播信息,例如`boardcast Hello World!`可以在所有客户端的侧边栏上添加一行`Hello World!`信息; - `kick`命令可以踢出玩家,需要跟上玩家的UUID信息; - `stop`命令可以停止服务端; - `copyright`和`license`可以查看本程序的著作权和开源协议信息; - `cirno`可以让你变聪明(也许)。 ## 官方服务器 作为开发者,我搭建了一个公网服务器供各位玩家联网游玩,具体请见本游戏的客户端文档。 ## 引用与感谢 本游戏引用了其它开发者的项目,在此全部列出: - libhv(BSD 3-Clause License) 地址:https://gitee.com/libhv/libhv/ 本服务端将`libhv`作为网络库,以此进行联机部分的相关开发; - jsoncpp(MIT License) 地址:https://github.com/open-source-parsers/jsoncpp 该程序中,json是服务端和客户端交互内容的主要形式,引用`jsoncpp`主要是为了序列化和反序列化交互信息。 - crossguid(MIT License) 地址:https://github.com/graeme-hill/crossguid `crossguid`是一个轻量级跨平台Guid生成库,本程序引用之来给每个对局中的实体生成uuid。 上述三者在本程序中的主要引用方式是静态库/动态库文件,感谢这些开发者的项目提供的支持。 此外,参与本游戏测试/提供数据的其它玩家还有: - Hikiaw - Nijica - ashiyuan - Nowa - Otto(不是本人) - just-smile - mmdchi - UNF-unfair - two-phase 非常感谢,要是没有各位的测试的话,这个破游戏根本不可能实现。 另外,感谢我的家人,我的老师,我的同学,还有很多支持了我的人。 ## 问题反馈 本项目最初开发其实是为了完成我的大一程序设计大作业,大作业工期比较短,所以该项目的代码可读性和规范性可能不是很好,同时本项目可能也存在一些问题,还望各位玩家在发现问题后可以向我反馈,我会尽量解决的。 通过本仓库的Issue栏目即可反馈问题。