75 lines
2.4 KiB
GDScript
75 lines
2.4 KiB
GDScript
extends Node
|
|
|
|
var ConsoleService
|
|
var NetworkService
|
|
|
|
func _ready():
|
|
NetworkService = $"/root/NetworkService"
|
|
ConsoleService = $"/root/ConsoleService"
|
|
NetworkService.connect("on_client_connected", self, "on_client_connected")
|
|
NetworkService.connect("on_server_connected", self, "on_server_connected")
|
|
NetworkService.connect("on_server_disconnected", self, "on_server_disconnected")
|
|
|
|
func on_client_connected(id: int):
|
|
if NetworkService.NETWORK_MODE == 'server':
|
|
var server_mods = get_local_mods()
|
|
rpc_id(id, "compute_needed_mods", server_mods)
|
|
|
|
func get_local_mods():
|
|
var md5_hashes = []
|
|
for mod_desc in ModService.mod_arr:
|
|
if not mod_desc.md5: continue
|
|
md5_hashes.push_back(mod_desc.md5)
|
|
return md5_hashes
|
|
|
|
remote func send_mods_to_client(id: int, needed_mods: Array):
|
|
var ModService = $"/root/ModService"
|
|
for mod_desc in ModService.mod_arr:
|
|
if not needed_mods.has(mod_desc.md5):
|
|
continue
|
|
if mod_desc.type != 'zip':
|
|
continue
|
|
var mod_file = File.new()
|
|
mod_file.open(mod_desc.path, 1)
|
|
var file_length = mod_file.get_len()
|
|
var bytes = mod_file.get_buffer(file_length)
|
|
ConsoleService.log("Sending mod "+mod_desc.name+" with size: "+String(bytes.size()/1000000)+"MB")
|
|
rpc_id(id, "receive_mod", mod_desc.name, bytes)
|
|
|
|
remote func compute_needed_mods(server_mods: Array):
|
|
var needed_mods_md5 = server_mods
|
|
var dir = Directory.new()
|
|
var err = dir.make_dir_recursive('user://servers/'+NetworkService.server_hash+'/mods')
|
|
var mod_dir_exists = dir.open('user://servers/'+NetworkService.server_hash+'/mods')
|
|
dir.list_dir_begin()
|
|
|
|
while true:
|
|
var file = dir.get_next()
|
|
var basename = file.get_basename()
|
|
if file == "":
|
|
break
|
|
if file.ends_with(".zip") and server_mods.has(basename):
|
|
needed_mods_md5.erase(basename)
|
|
|
|
dir.list_dir_end()
|
|
|
|
rpc_id(1, 'send_mods_to_client', get_tree().get_network_unique_id(), needed_mods_md5)
|
|
|
|
remote func receive_mod(name: String, bytes: PoolByteArray):
|
|
ConsoleService.log("Receiving mod "+name+" with size: "+String(bytes.size()/1000000)+"MB")
|
|
var file_path = 'user://servers/'+NetworkService.server_hash+'/mods/'+name+'.zip'
|
|
var dir_path = file_path.get_base_dir()
|
|
var mod_file = File.new()
|
|
var dir = Directory.new()
|
|
var err = dir.make_dir_recursive(dir_path)
|
|
mod_file.open(file_path, 2)
|
|
mod_file.store_buffer(bytes)
|
|
mod_file.close()
|
|
dir.rename(file_path, dir_path+'/'+mod_file.get_md5(file_path)+'.zip')
|
|
|
|
func on_server_connected():
|
|
pass
|
|
|
|
func on_server_disconnected():
|
|
pass
|