This commit is contained in:
MakerYang
2024-08-06 18:30:21 +08:00
parent f363be1fc8
commit a902dd3de7
1870 changed files with 496402 additions and 6524 deletions

View 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

View 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()

View 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"]

View 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"]

View 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)

View 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()

View 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

View 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)