(原) 学习传奇游戏复刻记录

原创文章,请后转载,并注明出处。

跟着网友教程,使用Godot复刻传奇游戏。

Github
我个人自动克隆的项目,每4小时自动一次。
他的官方网址
B站课程更新中

为了简单(懒),并没有按教程一步步搭建环境,毕竟那不是重点,利用现在有的PVE开一个Ubuntu即可,何况各端都可以导出Win程序。
为了更简单(更懒),尽可以减少每次Github新代码后的修改,于是:

  1. 端口映射
sudo iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 7000

在Ubuntu下执行此命令进行端口映射。因为Golang开发的server使用了7000端口,而Godot客户端访问的是https,即443端口。

  1. 修改golang的server代码
    在server/framework/interface/interface.go的Init()函数中,修改为如下:
	var HttpServer = &http.Server{
		Addr:           fmt.Sprintf(":%d", Config.Get.Service.HttpPort),
		Handler:        routers,
		ReadTimeout:    Config.Get.Service.ReadTimeout,
		WriteTimeout:   Config.Get.Service.WriteTimeout,
		MaxHeaderBytes: 1 << 20,
	}

	go func() {
                // 其实就改了这里,判断是否使用https
		if true {
			if err := HttpServer.ListenAndServeTLS("./server.pem", "./server.key"); err != nil {
			}
		} else {
			if err := HttpServer.ListenAndServe(); err != nil {
			}
		}
	}()

	log.Println("[game]", color.Green.Text("server..."))

让golang自己实现https,并不需要nginx。
把作者/tools/centos/etc/nginx/ssl目录下的域名证书放到server目录下,改名为代码中的两个文件。

  1. 修改本机hosts,例如我现在用的Win
    C:\Windows\System32\drivers\etc\hosts 添加类似
192.168.1.42                  game.makeryang.com

这里的IP是我Ubuntu的IP

这样,就不用每次都修改godot里面的代码,而只需要修改golang服务端代码。
相信以后作者会把这些代码抽离出来,通过配置文件来完成。这样我也就只需要一次性的修改配置即可。

如果你更懒一点,在win下go run吧,把hosts文件中的IP改为127.0.0.1,即自己。端口映射也别做了,直接改配置代码中的7000为443。
而godot的网络连接,将godot导出为无头模式(专用服务器),直接运行即可。

也就完成了在Win运行三端:golang服务端 / godot服务端 / godot客户端
至于数据库mysql,win下面也可以一键绿色运行。

每次github更新,只需要修改golang服务端代码(如上),其它按作者的走。


2024.3.14

作者最近更新较慢,当前添加了1/3个登陆界面。
我在此增加了一点点效果。

	# 显示Logo
	logo.self_modulate = Color(0,0,0,0)
	logo.scale = Vector2(15.0,15.0)
	logo.pivot_offset = logo.size/2												# 轴心设置
	var tween = create_tween()
	tween.set_parallel()
	tween.tween_property(logo,"self_modulate",Color(1,1,1,1),0.6)
	tween.tween_property(logo,"scale",Vector2(1.0,1.0),0.3)
	#await tween.finished
	await get_tree().create_timer(1.0).timeout
	
	# 显示右上角Logo
	logo.visible = false
	$RightLogo.visible = true
	
	# 载入背景声音及登陆框
	bg_music.play()	
	login.modulate = Color(0,0,0,0)
	login.visible = true 
	create_tween().tween_property(login,"modulate",Color(1,1,1,1),0.2)

通过shader增加了一个扫光效果

shader_type canvas_item;

uniform sampler2D light_vector;
uniform float width = 0.08;

void fragment() {
	vec4 color = texture(TEXTURE,UV);
	if(color.a !=0.0){
		float v = texture(light_vector,UV).r;
		float diff = v - cos(TIME);
		if(abs(diff)<width){
			color = vec4(0.3,0.3,0.0,0.3) * (1.0 - abs(diff)/width) + color;
		}
	}
	COLOR = color;
}

考虑到负载,可以将服务功能拆分:

  1. 网页服务
  2. 下载服务
  3. 游戏服务(6.登入登出等常规服务 + 7.游戏内数据同步服务)
  4. 聊天服务
  5. API服务

可以在game_server_data表中添加相关字段,定义各个服务的IP及端口。

中期可以将1.2.5合并到一起,6.4合并到一起,7单独为主力服务。
也可以将1.4.5.6合并,2采用分流到其它地方,7依然单独。

考虑网吧使用场景,减少下载服务器压力,将本地开通下载服务,A机下载完后,同局域网内主机将向A机请求下载。即A机作为服务器。

相关文章