new
This commit is contained in:
194
engine/scripts/base/account/account.gd
Normal file
194
engine/scripts/base/account/account.gd
Normal file
@@ -0,0 +1,194 @@
|
||||
#*****************************************************************************
|
||||
# @author MakerYang
|
||||
# @site mir2.makeryang.com
|
||||
#*****************************************************************************
|
||||
|
||||
extends Node
|
||||
|
||||
# 数据结构
|
||||
var data = {
|
||||
"account": {
|
||||
"token": "",
|
||||
"area_token": "",
|
||||
"player": {}
|
||||
}
|
||||
}
|
||||
|
||||
# 获取用户Token
|
||||
func get_token() -> String:
|
||||
return data["account"]["token"]
|
||||
|
||||
# 更新并返回用户Token
|
||||
func update_token(token: String) -> String:
|
||||
data["account"]["token"] = token
|
||||
return data["account"]["token"]
|
||||
|
||||
# 获取用户服务区Token
|
||||
func get_area_token() -> String:
|
||||
return data["account"]["area_token"]
|
||||
|
||||
# 更新并返回用户Token
|
||||
func update_area_token(token: String) -> String:
|
||||
data["account"]["area_token"] = token
|
||||
return data["account"]["area_token"]
|
||||
|
||||
# 获取用户玩家角色信息
|
||||
func get_player() -> Dictionary:
|
||||
return data["account"]["player"]
|
||||
|
||||
# 更新并返回用户玩家角色信息
|
||||
func update_player(player: Dictionary) -> Dictionary:
|
||||
data["account"]["player"] = player
|
||||
return data["account"]["player"]
|
||||
|
||||
# 获取用户玩家角色Token信息
|
||||
func get_player_token() -> String:
|
||||
return data["account"]["player"]["token"]
|
||||
|
||||
# 获取玩家昵称数据
|
||||
func get_player_nickname(player: Dictionary) -> String:
|
||||
return player["player_nickname"]
|
||||
|
||||
# 获取玩家性别数据
|
||||
func get_player_gender(player: Dictionary) -> String:
|
||||
return player["player_gender"]
|
||||
|
||||
# 获取玩家余额数据
|
||||
func get_player_balance(player: Dictionary) -> String:
|
||||
return player["player_balance"]
|
||||
|
||||
# 获取玩家积分数据
|
||||
func get_player_integral(player: Dictionary) -> String:
|
||||
return player["player_integral"]
|
||||
|
||||
# 获取玩家等级数据
|
||||
func get_player_level(player: Dictionary) -> int:
|
||||
return player["player_asset_level"]
|
||||
|
||||
# 获取玩家角度
|
||||
func get_player_angle(player: Dictionary) -> int:
|
||||
return player["player_angle"]
|
||||
|
||||
# 更新并返回玩家角度
|
||||
func update_player_angle(player: Dictionary, angle: int) -> int:
|
||||
player["player_angle"] = angle
|
||||
return player["player_angle"]
|
||||
|
||||
# 获取玩家生命值数据
|
||||
func get_player_life(player: Dictionary) -> int:
|
||||
return player["player_asset_life"]
|
||||
|
||||
# 获取玩家生命值百分比数据
|
||||
func get_player_life_percentage(player: Dictionary) -> float:
|
||||
return (float(player["player_asset_life"]) / float(player["player_asset_life_max"])) * 100
|
||||
|
||||
# 获取玩家生命值格式化数据
|
||||
func get_player_life_format(player: Dictionary) -> String:
|
||||
return str(player["player_asset_life"]) + "/" + str(player["player_asset_life_max"])
|
||||
|
||||
# 获取玩家魔法值数据
|
||||
func get_player_magic(player: Dictionary) -> int:
|
||||
return player["player_asset_magic"]
|
||||
|
||||
# 获取玩家魔法值百分比数据
|
||||
func get_player_magic_percentage(player: Dictionary) -> float:
|
||||
return (float(player["player_asset_magic"]) / float(player["player_asset_magic_max"])) * 100
|
||||
|
||||
# 获取玩家魔法值格式化数据
|
||||
func get_player_magic_format(player: Dictionary) -> String:
|
||||
return str(player["player_asset_magic"]) + "/" + str(player["player_asset_magic_max"])
|
||||
|
||||
# 获取玩家负重数据
|
||||
func get_player_weight(player: Dictionary) -> int:
|
||||
return player["player_asset_weight"]
|
||||
|
||||
# 获取玩家负重百分比数据
|
||||
func get_player_weight_percentage(player: Dictionary) -> float:
|
||||
return (float(player["player_asset_weight"]) / float(player["player_asset_weight_max"])) * 100
|
||||
|
||||
# 获取玩家负重格式化数据
|
||||
func get_player_weight_format(player: Dictionary) -> String:
|
||||
return str(player["player_asset_weight"]) + "/" + str(player["player_asset_weight_max"])
|
||||
|
||||
# 获取玩家经验值数据
|
||||
func get_player_experience(player: Dictionary) -> int:
|
||||
return player["player_asset_experience"]
|
||||
|
||||
# 获取玩家经验值百分比数据
|
||||
func get_player_experience_percentage(player: Dictionary) -> float:
|
||||
return (float(player["player_asset_experience"]) / float(player["player_asset_experience_max"])) * 100
|
||||
|
||||
# 获取玩家经验值格式化数据
|
||||
func get_player_experience_format(player: Dictionary) -> String:
|
||||
return str(player["player_asset_experience"]) + "/" + str(player["player_asset_experience_max"])
|
||||
|
||||
# 获取玩家生命值与职业格式化数据
|
||||
func get_player_life_career_format(player: Dictionary) -> String:
|
||||
var career_level = ""
|
||||
if player["player_career"] == "warrior":
|
||||
career_level = "/Z" + str(player["player_asset_level"])
|
||||
if player["player_career"] == "mage":
|
||||
career_level = "/M" + str(player["player_asset_level"])
|
||||
if player["player_career"] == "taoist":
|
||||
career_level = "/T" + str(player["player_asset_level"])
|
||||
return str(player["player_asset_life"]) + "/" + str(player["player_asset_life_max"]) + career_level
|
||||
|
||||
# 获取玩家地图编号数据
|
||||
func get_player_map_id(player: Dictionary) -> String:
|
||||
return player["player_map"]
|
||||
|
||||
# 获取玩家地图名称数据
|
||||
func get_player_map_name(player: Dictionary) -> String:
|
||||
return player["player_map_name"]
|
||||
|
||||
# 获取玩家地图资源路径数据
|
||||
func get_player_map_path(player: Dictionary) -> String:
|
||||
return Global.get_map_root_path() + player["player_map"] + "/" + player["player_map"] + ".tscn"
|
||||
|
||||
# 获取玩家服饰在原编号数据
|
||||
func get_player_clothe_id(player: Dictionary) -> String:
|
||||
return player["player_body_clothe"]
|
||||
|
||||
# 获取玩家服饰资源路径数据
|
||||
func get_player_clothe_path(player: Dictionary) -> String:
|
||||
return Global.get_clothe_root_path() + player["player_body_clothe"] + "/" + player["player_gender"] + ".tscn"
|
||||
|
||||
# 获取玩家服饰资源数据
|
||||
func loader_player_clothe_resource(player: Dictionary) -> AnimatedSprite2D:
|
||||
var clothe_path = get_player_clothe_path(player)
|
||||
var clothe_loader = load(clothe_path).instantiate()
|
||||
clothe_loader.name = "Clothe"
|
||||
clothe_loader.speed_scale = Global.get_resource_speed_scale()
|
||||
return clothe_loader
|
||||
|
||||
# 获取玩家武器资源编号数据
|
||||
func get_player_weapon_id(player: Dictionary) -> String:
|
||||
return player["player_body_weapon"]
|
||||
|
||||
# 获取玩家武器资源路径数据
|
||||
func get_player_weapon_path(player: Dictionary) -> String:
|
||||
return Global.get_weapon_root_path() + player["player_body_weapon"] + "/" + player["player_gender"] + ".tscn"
|
||||
|
||||
# 获取玩家武器资源数据
|
||||
func loader_player_weapon_resource(player: Dictionary) -> AnimatedSprite2D:
|
||||
var weapon_path = get_player_weapon_path(player)
|
||||
var weapon_loader = load(weapon_path).instantiate()
|
||||
weapon_loader.name = "Weapon"
|
||||
weapon_loader.speed_scale = Global.get_resource_speed_scale()
|
||||
return weapon_loader
|
||||
|
||||
# 获取玩家翅膀资源编号数据
|
||||
func get_player_wing_id(player: Dictionary) -> String:
|
||||
return player["player_body_wing"]
|
||||
|
||||
# 获取玩家翅膀资源路径数据
|
||||
func get_player_wing_path(player: Dictionary) -> String:
|
||||
return Global.get_wing_root_path() + player["player_body_wing"] + "/" + player["player_gender"] + ".tscn"
|
||||
|
||||
# 获取玩家翅膀资源数据
|
||||
func loader_player_wing_resource(player: Dictionary) -> AnimatedSprite2D:
|
||||
var wing_path = get_player_wing_path(player)
|
||||
var wing_loader = load(wing_path).instantiate()
|
||||
wing_loader.name = "Wing"
|
||||
wing_loader.speed_scale = Global.get_resource_speed_scale()
|
||||
return wing_loader
|
||||
42
engine/scripts/base/client/client.gd
Normal file
42
engine/scripts/base/client/client.gd
Normal file
@@ -0,0 +1,42 @@
|
||||
#*****************************************************************************
|
||||
# @author MakerYang
|
||||
# @site mir2.makeryang.com
|
||||
#*****************************************************************************
|
||||
|
||||
extends Node
|
||||
|
||||
# 自定义数据
|
||||
var client_peer:ENetMultiplayerPeer
|
||||
|
||||
# 数据结构
|
||||
var data = {
|
||||
"client_id": 0
|
||||
}
|
||||
|
||||
# 创建客户端并返回客户端状态数据
|
||||
func create_client() -> int:
|
||||
client_peer = ENetMultiplayerPeer.new()
|
||||
var error = client_peer.create_client(Global.get_server_address(), Global.get_server_port())
|
||||
if error == OK:
|
||||
multiplayer.multiplayer_peer = client_peer
|
||||
multiplayer.server_disconnected.connect(_on_server_disconnected)
|
||||
update_client_id(multiplayer.get_unique_id())
|
||||
return error
|
||||
|
||||
# 获取客户端ID数据
|
||||
func get_client_id() -> int:
|
||||
return data["client_id"]
|
||||
|
||||
# 更新客户端ID数据
|
||||
func update_client_id(client_id: int) -> void:
|
||||
data["client_id"] = client_id
|
||||
|
||||
# 与服务器断开连接时回调函数
|
||||
func _on_server_disconnected() -> void:
|
||||
print("[client:server:disconnected]")
|
||||
client_peer.close()
|
||||
|
||||
# 关闭客户端
|
||||
func on_close() -> void:
|
||||
print("[client:close]")
|
||||
client_peer.close()
|
||||
48
engine/scripts/base/event/event.gd
Normal file
48
engine/scripts/base/event/event.gd
Normal file
@@ -0,0 +1,48 @@
|
||||
#*****************************************************************************
|
||||
# @author MakerYang
|
||||
# @site mir2.makeryang.com
|
||||
#*****************************************************************************
|
||||
|
||||
extends Control
|
||||
|
||||
# 数据结构
|
||||
var data = {
|
||||
"key": "",
|
||||
"mouse": "",
|
||||
"skill": false
|
||||
}
|
||||
|
||||
func _input(event) -> void:
|
||||
# 获取窗口的边界
|
||||
var viewport_rect = get_viewport_rect()
|
||||
# 获取鼠标的位置
|
||||
var viewport_mouse_position = get_viewport().get_mouse_position()
|
||||
# 如果鼠标在窗口区域内
|
||||
if viewport_rect.has_point(viewport_mouse_position):
|
||||
if event is InputEventKey:
|
||||
if event.pressed:
|
||||
if event.as_text_keycode() in ["F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8"]:
|
||||
data["skill"] = true
|
||||
data["key"] = event.as_text_keycode()
|
||||
else:
|
||||
data["key"] = ""
|
||||
data["skill"] = false
|
||||
if event is InputEventMouseButton:
|
||||
if event.button_index == 1 and event.pressed:
|
||||
data["mouse"] = "left"
|
||||
elif event.button_index == 2 and event.pressed:
|
||||
data["mouse"] = "right"
|
||||
else:
|
||||
data["mouse"] = ""
|
||||
|
||||
# 获取KEY值
|
||||
func get_key() -> String:
|
||||
return data["key"]
|
||||
|
||||
# 获取鼠标按键值
|
||||
func get_mouse() -> String:
|
||||
return data["mouse"]
|
||||
|
||||
# 是否为技能KEY值
|
||||
func is_skill() -> bool:
|
||||
return data["skill"]
|
||||
127
engine/scripts/base/global.gd
Normal file
127
engine/scripts/base/global.gd
Normal file
@@ -0,0 +1,127 @@
|
||||
#*****************************************************************************
|
||||
# @author MakerYang
|
||||
# @site mir2.makeryang.com
|
||||
#*****************************************************************************
|
||||
|
||||
extends Node
|
||||
|
||||
# 数据结构
|
||||
var data = {
|
||||
"version": ProjectSettings.get_setting("application/config/version"),
|
||||
"mode": "",
|
||||
"environment": "development", # 可选择:production 或 development
|
||||
"config": {
|
||||
"resource": {
|
||||
"speed_scale": 8
|
||||
},
|
||||
"tilemap":{
|
||||
"grid_size": Vector2(48, 32)
|
||||
}
|
||||
},
|
||||
"path": {
|
||||
"map": "res://scenes/world/maps/",
|
||||
"clothe": "res://scenes/world/player/clothes/",
|
||||
"weapon": "res://scenes/world/player/weapons/",
|
||||
"wing": "res://scenes/world/player/wings/"
|
||||
},
|
||||
"server": {
|
||||
"port": 7200,
|
||||
"address": "api.mir2.geekros.com",
|
||||
"socket": {
|
||||
"port": 7100,
|
||||
"address": "localhost"
|
||||
},
|
||||
"area": [],
|
||||
"role": []
|
||||
}
|
||||
}
|
||||
|
||||
func _ready() -> void:
|
||||
# 限制窗口最小尺寸
|
||||
DisplayServer.window_set_min_size(Vector2(1280, 720))
|
||||
# 服务器模式检测
|
||||
if OS.has_feature("dedicated_server"):
|
||||
print("[mode]:server")
|
||||
data["mode"] = "server"
|
||||
var error = Socket.on_connect_socket()
|
||||
if error == OK:
|
||||
print("[connect:socket]", "success")
|
||||
error = Server.create_server()
|
||||
if error == OK:
|
||||
print("[server:create]", "success")
|
||||
else:
|
||||
printerr("[server:create]", "error")
|
||||
else:
|
||||
printerr("[connect:socket]", "error")
|
||||
else:
|
||||
print("[mode]:client")
|
||||
data["mode"] = "client"
|
||||
|
||||
# 获取版本信息
|
||||
func get_version() -> String:
|
||||
return data["version"]
|
||||
|
||||
# 是否为服务器模式
|
||||
func is_server() -> bool:
|
||||
var server = false
|
||||
if data["mode"] == "server":
|
||||
server = true
|
||||
return server
|
||||
|
||||
# 获取服务器地址
|
||||
func get_server_address() -> String:
|
||||
return data["server"]["address"]
|
||||
|
||||
# 获取服务器端口
|
||||
func get_server_port() -> int:
|
||||
return data["server"]["port"]
|
||||
|
||||
# 获取服务器socket地址
|
||||
func get_server_socket_address() -> String:
|
||||
return data["server"]["socket"]["address"]
|
||||
|
||||
# 获取服务器socket端口
|
||||
func get_server_socket_port() -> int:
|
||||
return data["server"]["socket"]["port"]
|
||||
|
||||
# 获取游戏服务区
|
||||
func get_server_area() -> Array:
|
||||
return data["server"]["area"]
|
||||
|
||||
# 更新并返回游戏服务区
|
||||
func update_server_area(area: Array) -> Array:
|
||||
data["server"]["area"] = area
|
||||
return data["server"]["area"]
|
||||
|
||||
# 获取游戏人物角色
|
||||
func get_server_role() -> Array:
|
||||
return data["server"]["role"]
|
||||
|
||||
# 更新并返回游戏人物角色
|
||||
func update_server_role(role: Array) -> Array:
|
||||
data["server"]["role"] = role
|
||||
return data["server"]["role"]
|
||||
|
||||
# 获取地图资源根路径
|
||||
func get_map_root_path() -> String:
|
||||
return data["path"]["map"]
|
||||
|
||||
# 获取服饰资源根路径
|
||||
func get_clothe_root_path() -> String:
|
||||
return data["path"]["clothe"]
|
||||
|
||||
# 获取武器资源根路径
|
||||
func get_weapon_root_path() -> String:
|
||||
return data["path"]["weapon"]
|
||||
|
||||
# 获取翅膀资源根路径
|
||||
func get_wing_root_path() -> String:
|
||||
return data["path"]["wing"]
|
||||
|
||||
# 获取资源动画速度帧
|
||||
func get_resource_speed_scale() -> int:
|
||||
return data["config"]["resource"]["speed_scale"]
|
||||
|
||||
# 获取TileMap网格尺寸
|
||||
func get_map_grid_size() -> Vector2:
|
||||
return data["config"]["tilemap"]["grid_size"]
|
||||
43
engine/scripts/base/package/request.gd
Normal file
43
engine/scripts/base/package/request.gd
Normal file
@@ -0,0 +1,43 @@
|
||||
#*****************************************************************************
|
||||
# @author MakerYang
|
||||
# @site mir2.makeryang.com
|
||||
#*****************************************************************************
|
||||
|
||||
extends Node
|
||||
|
||||
# 数据结构
|
||||
var data = {
|
||||
"request": HTTPRequest.new(),
|
||||
"callback": null,
|
||||
"headers": [
|
||||
"Content-Type: application/json",
|
||||
"Accept-Fetch-Id: godot",
|
||||
"Accept-Fetch-Referer: makeryang.com",
|
||||
"Accept-Fetch-Visitor:",
|
||||
"Accept-Fetch-Auth:"
|
||||
]
|
||||
}
|
||||
|
||||
# 请求服务器接口
|
||||
func on_server(path: String, method: int, parameter, callback) -> void:
|
||||
if !data["request"].is_inside_tree():
|
||||
add_child(data["request"])
|
||||
var parameter_json = JSON.stringify(parameter)
|
||||
data["headers"][3] = "Accept-Fetch-Auth: " + Account.get_token()
|
||||
if data["callback"] and data["request"].is_connected("request_completed", data["callback"]):
|
||||
data["request"].request_completed.disconnect(data["callback"])
|
||||
data["request"].request_completed.connect(callback)
|
||||
data["callback"] = callback
|
||||
data["request"].request("https://" + Global.get_server_address() + path, data["headers"], method, parameter_json)
|
||||
|
||||
# 请求服务器接口
|
||||
func on_internal(path: String, method: int, parameter, callback) -> void:
|
||||
if !data["request"].is_inside_tree():
|
||||
add_child(data["request"])
|
||||
var parameter_json = JSON.stringify(parameter)
|
||||
data["headers"][3] = "Accept-Fetch-Auth: " + Account.get_token()
|
||||
if data["callback"] and data["request"].is_connected("request_completed", data["callback"]):
|
||||
data["request"].request_completed.disconnect(data["callback"])
|
||||
data["request"].request_completed.connect(callback)
|
||||
data["callback"] = callback
|
||||
data["request"].request("http://" + Global.get_server_socket_address() + ":" + str(Global.get_server_socket_port()) + path, data["headers"], method, parameter_json)
|
||||
27
engine/scripts/base/package/socket.gd
Normal file
27
engine/scripts/base/package/socket.gd
Normal file
@@ -0,0 +1,27 @@
|
||||
#*****************************************************************************
|
||||
# @author MakerYang
|
||||
# @site mir2.makeryang.com
|
||||
#*****************************************************************************
|
||||
|
||||
extends Node
|
||||
|
||||
# 自定义数据
|
||||
var socket_peer:WebSocketPeer
|
||||
|
||||
# 数据结构
|
||||
var data = {
|
||||
"status": false
|
||||
}
|
||||
|
||||
func on_connect_socket() -> int:
|
||||
socket_peer = WebSocketPeer.new()
|
||||
var error = socket_peer.connect_to_url("ws://%s:%d/internal/message/index" % [Global.get_server_socket_address(), Global.get_server_socket_port()])
|
||||
if error != OK:
|
||||
data["status"] = false
|
||||
else:
|
||||
data["status"] = true
|
||||
return error
|
||||
|
||||
func _process(_delta) -> void:
|
||||
if data["status"]:
|
||||
socket_peer.poll()
|
||||
91
engine/scripts/base/server/server.gd
Normal file
91
engine/scripts/base/server/server.gd
Normal file
@@ -0,0 +1,91 @@
|
||||
#*****************************************************************************
|
||||
# @author MakerYang
|
||||
# @site mir2.makeryang.com
|
||||
#*****************************************************************************
|
||||
|
||||
extends Node
|
||||
|
||||
# 数据结构
|
||||
var data = {
|
||||
"players": {}
|
||||
}
|
||||
|
||||
# 自定义数据
|
||||
var server_peer:ENetMultiplayerPeer
|
||||
|
||||
# 预加载资源
|
||||
@onready var player_scenes: PackedScene = preload("res://scenes/world/player/player.tscn")
|
||||
|
||||
# 创建服务器并返回服务器状态
|
||||
func create_server() -> int:
|
||||
server_peer = ENetMultiplayerPeer.new()
|
||||
var error = server_peer.create_server(Global.get_server_port())
|
||||
if error == OK:
|
||||
multiplayer.multiplayer_peer = server_peer
|
||||
multiplayer.peer_connected.connect(_on_peer_connected)
|
||||
multiplayer.peer_disconnected.connect(_on_peer_disconnected)
|
||||
return error
|
||||
|
||||
# 客户端连接服务器时回调函数
|
||||
func _on_peer_connected(client_id: int) -> void:
|
||||
if multiplayer.is_server():
|
||||
print("[server:client:connected]", "当前:" + str(multiplayer.get_unique_id()), "-->", "目标:" + str(client_id))
|
||||
# 通知当前连接客户端同步所有玩家数据
|
||||
rpc_id(client_id, "sync_players_data", client_id, JSON.stringify(data["players"]))
|
||||
|
||||
# 客户端断开服务器时回调函数
|
||||
func _on_peer_disconnected(client_id: int) -> void:
|
||||
if data["players"][str(client_id)] and multiplayer.is_server():
|
||||
print("[server:client:disconnected]", "当前:" + str(multiplayer.get_unique_id()), "-->", "目标:" + str(client_id))
|
||||
var internal_url = "/internal/player/update/client/id?token=" + data["players"][str(client_id)]["token"] + "&client_id=" + str(0)
|
||||
Request.on_internal(internal_url, HTTPClient.METHOD_GET, {}, func(_result, code, _headers, body):
|
||||
if code == 200:
|
||||
var response = JSON.parse_string(body.get_string_from_utf8())
|
||||
if response.code != 0:
|
||||
printerr("[server:client:disconnected:update:client:id]", JSON.stringify(response))
|
||||
return
|
||||
print("[server:client:disconnected:update:client:id]", JSON.stringify(response))
|
||||
var players_node = get_parent().get_node("World").get_node("Main").get_node(data["players"][str(client_id)]["player_map"]).get_node("Players")
|
||||
if players_node.has_node(str(client_id)):
|
||||
var player_node = players_node.get_node(str(client_id))
|
||||
player_node.queue_free()
|
||||
data["players"].erase(str(client_id))
|
||||
print("[server:client:disconnected:remove]", str(client_id))
|
||||
rpc("on_remove_player", client_id)
|
||||
else:
|
||||
printerr("[server:request:ping]", "error")
|
||||
)
|
||||
|
||||
@rpc("any_peer", "call_remote")
|
||||
func on_add_player(client_id: int, player_data: String) -> void:
|
||||
if multiplayer.is_server():
|
||||
print("[server:add:player] ", "当前:" + str(multiplayer.get_unique_id()), "-->", "目标:" + str(client_id))
|
||||
var player_json = JSON.parse_string(player_data)
|
||||
data["players"][str(client_id)] = player_json
|
||||
rpc("sync_player_data", client_id, player_data)
|
||||
var players_node: Node2D = get_parent().get_node("World").get_node("Main").get_node(player_json["player_map"]).get_node("Players")
|
||||
var player_node:Player = player_scenes.instantiate()
|
||||
player_node.name = str(client_id)
|
||||
players_node.add_child(player_node)
|
||||
|
||||
@rpc("any_peer", "call_remote")
|
||||
func on_remove_player(client_id: int) -> void:
|
||||
if !multiplayer.is_server():
|
||||
print("[client:disconnected:remove]", "当前:" + str(multiplayer.get_unique_id()), "-->", "目标:" + str(client_id))
|
||||
data["players"].erase(str(client_id))
|
||||
|
||||
@rpc("any_peer", "call_remote")
|
||||
# 客户端同步玩家数据
|
||||
func sync_player_data(client_id: int, player_data: String) -> void:
|
||||
if !multiplayer.is_server():
|
||||
print("[client:sync:player] ", "当前:" + str(multiplayer.get_unique_id()), "-->", "目标:" + str(client_id))
|
||||
var player_json = JSON.parse_string(player_data)
|
||||
data["players"][str(client_id)] = player_json
|
||||
|
||||
@rpc("any_peer", "call_remote")
|
||||
# 客户端同步所有玩家数据
|
||||
func sync_players_data(client_id: int, players_data: String) -> void:
|
||||
if !multiplayer.is_server():
|
||||
print("[client:sync:players] ", "当前:" + str(multiplayer.get_unique_id()), "-->", "目标:" + str(client_id))
|
||||
var player_json = JSON.parse_string(players_data)
|
||||
data["players"] = player_json
|
||||
57
engine/scripts/base/utils/utils.gd
Normal file
57
engine/scripts/base/utils/utils.gd
Normal file
@@ -0,0 +1,57 @@
|
||||
#*****************************************************************************
|
||||
# @author MakerYang
|
||||
# @site mir2.makeryang.com
|
||||
#*****************************************************************************
|
||||
|
||||
extends Node
|
||||
|
||||
# 验证邮箱格式
|
||||
func check_mail_format(mail:String) -> bool:
|
||||
var check:bool = true
|
||||
var regex = RegEx.new()
|
||||
regex.compile("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}$")
|
||||
if !regex.search(mail):
|
||||
check = false
|
||||
return check
|
||||
|
||||
# 获取当前时间
|
||||
func get_current_time() -> String:
|
||||
var current_time = Time.get_time_dict_from_system()
|
||||
var hour = current_time.hour
|
||||
var minute = current_time.minute
|
||||
var second = current_time.second
|
||||
if hour < 10:
|
||||
hour = "0" + str(hour)
|
||||
if minute < 10:
|
||||
minute = "0" + str(minute)
|
||||
if second < 10:
|
||||
second = "0" + str(second)
|
||||
return str(hour) + ":" + str(minute) + ":" + str(second)
|
||||
|
||||
# 获取当前时间[小时]
|
||||
func get_current_hour() -> int:
|
||||
var current_time = Time.get_time_dict_from_system()
|
||||
return current_time.hour
|
||||
|
||||
# 根据当前时间显示不同的图片
|
||||
func get_current_time_image() -> Resource:
|
||||
var current_time = Time.get_time_dict_from_system()
|
||||
var hour = current_time.hour
|
||||
var image_path = ""
|
||||
if hour >= 6 and hour < 12:
|
||||
image_path = "res://assets/interface/footer_middle/left/time/001.png"
|
||||
elif hour >= 12 and hour < 20:
|
||||
image_path = "res://assets/interface/footer_middle/left/time/002.png"
|
||||
elif hour >= 20 and hour < 24:
|
||||
image_path = "res://assets/interface/footer_middle/left/time/003.png"
|
||||
else:
|
||||
image_path = "res://assets/interface/footer_middle/left/time/004.png"
|
||||
return load(image_path)
|
||||
|
||||
# TileMap坐标转换为World坐标
|
||||
func convert_map_to_world(map_id: String, position_data: Vector2) -> Vector2:
|
||||
return get_parent().get_node("World").get_node("Main").get_node(map_id).get_node("Ground").map_to_local(position_data)
|
||||
|
||||
# World坐标转换为TileMap坐标
|
||||
func convert_world_to_map(map_id: String, position_data: Vector2) -> Vector2:
|
||||
return get_parent().get_node("World").get_node("Main").get_node(map_id).get_node("Ground").local_to_map(position_data)
|
||||
Reference in New Issue
Block a user