2024-08-05 22:35:50 +02:00
## freeftf
## Copyright (C) 2024 Patrick_Pluto
2024-08-02 22:38:08 +02:00
##
2024-08-05 22:35:50 +02:00
## This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
2024-08-02 22:38:08 +02:00
##
2024-08-05 22:35:50 +02:00
## This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
2024-08-02 22:38:08 +02:00
##
2024-08-05 22:35:50 +02:00
## You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.
2024-08-02 22:38:08 +02:00
2024-08-02 20:13:42 +02:00
extends Node
const DEFAULT_SERVER_IP = " 127.0.0.1 "
const PORT = 36969
const MAX_CONNECTIONS = 16
var players = { }
var players_numbered = [ ]
var label
var map
var character = preload ( " res://objects/player.tscn " )
2024-08-04 13:41:19 +02:00
var is_server = false
2024-08-05 22:35:50 +02:00
var first_joined = true
var game_master = " debug "
var host_announced = false
var map_name = " mansion "
2024-08-02 20:13:42 +02:00
2024-08-03 22:24:08 +02:00
func reset ( ) :
players = { }
players_numbered = [ ]
label = null
map = null
2024-08-04 13:41:19 +02:00
is_server = false
2024-08-03 22:24:08 +02:00
character = preload ( " res://objects/player.tscn " )
if multiplayer != null :
multiplayer . multiplayer_peer = null
2024-08-02 20:13:42 +02:00
func join_game ( ip ) :
var peer = ENetMultiplayerPeer . new ( )
var error = peer . create_client ( ip , PORT )
if error :
return error
multiplayer . multiplayer_peer = peer
func create_game ( ) :
var peer = ENetMultiplayerPeer . new ( )
var error = peer . create_server ( PORT , MAX_CONNECTIONS )
if error :
return error
multiplayer . multiplayer_peer = peer
2024-08-05 22:35:50 +02:00
func _process ( delta ) :
if multiplayer . is_server ( ) :
make_host . rpc ( game_master )
@ rpc ( " authority " , " call_remote " , " reliable " )
func make_host ( id ) :
first_joined = false
game_master = id
if str ( multiplayer . get_unique_id ( ) ) == str ( game_master ) :
is_server = true
else :
is_server = false
2024-08-04 13:41:19 +02:00
2024-08-05 22:35:50 +02:00
@ rpc ( " any_peer " , " call_remote " , " reliable " )
func sync_playerlist ( text , host ) :
if ! multiplayer . is_server ( ) and ( multiplayer . get_remote_sender_id ( ) == game_master or multiplayer . get_remote_sender_id ( ) == 0 ) :
get_tree ( ) . root . get_node ( " create/player_list/list " ) . text = text
2024-08-02 20:13:42 +02:00
2024-08-04 13:41:19 +02:00
@ rpc ( " any_peer " , " call_local " , " reliable " )
2024-08-05 22:35:50 +02:00
func send_playerinfo ( player_name , id ) :
if ! multiplayer . is_server ( ) :
if is_server :
var done = 0
players [ id ] = player_name
label = get_tree ( ) . root . get_node ( " create/player_list/list " )
label . text = " "
for w in players :
if done == 1 :
label . text = str ( label . text + " \n " + players [ w ] )
else :
label . text = players [ w ]
done = 1
else :
if first_joined :
first_joined = false
game_master = id
is_server = true
2024-08-02 22:30:30 +02:00
2024-08-02 20:13:42 +02:00
2024-08-05 22:35:50 +02:00
@ rpc ( " any_peer " , " call_local " , " reliable " )
2024-08-02 20:13:42 +02:00
func start_game ( server_players ) :
2024-08-05 22:35:50 +02:00
if ! multiplayer . is_server ( ) and ( multiplayer . get_remote_sender_id ( ) == game_master or multiplayer . get_remote_sender_id ( ) == 0 ) :
players = server_players
players_numbered = players . keys ( )
var success = get_tree ( ) . change_scene_to_file ( " res://maps/ " + map_name + " .tscn " )
while ! get_tree ( ) . root . has_node ( " ./ " + map_name + " / " ) :
await get_tree ( ) . create_timer ( 0.001 ) . timeout
map = get_tree ( ) . root . get_node ( " ./ " + map_name + " / " )
var i = 0
for w in players :
var player = character . instantiate ( )
player . name = " player " + str ( i )
i += 1
player . position . z = - i * 2.5
player . position . y = 1
map . add_child ( player )
if Server . is_server :
var random = randi ( ) % Server . players . size ( )
sync_beast . rpc ( random )
Game . apply_settings ( )
2024-08-02 20:13:42 +02:00
@ rpc ( " any_peer " , " call_remote " , " unreliable " )
func sync_player ( node_name , position , rotation ) :
2024-08-05 22:35:50 +02:00
if ! multiplayer . is_server ( ) :
var current_character = get_tree ( ) . root . get_node ( " ./ " + map_name + " / " + node_name )
current_character . position = position
current_character . rotation = rotation
2024-08-02 22:30:30 +02:00
2024-08-05 22:35:50 +02:00
@ rpc ( " any_peer " , " call_local " , " reliable " )
2024-08-02 22:30:30 +02:00
func sync_computers ( node_name , current ) :
2024-08-05 22:35:50 +02:00
if ! multiplayer . is_server ( ) and ( multiplayer . get_remote_sender_id ( ) == game_master or multiplayer . get_remote_sender_id ( ) == 0 ) :
var current_character = get_tree ( ) . root . get_node ( " ./ " + map_name + " /computers/ " + node_name )
current_character . current = current
2024-08-03 16:10:14 +02:00
2024-08-05 22:35:50 +02:00
@ rpc ( " any_peer " , " call_local " , " reliable " )
2024-08-03 16:10:14 +02:00
func sync_beast ( player ) :
2024-08-05 22:35:50 +02:00
if ! multiplayer . is_server ( ) and ( multiplayer . get_remote_sender_id ( ) == game_master or multiplayer . get_remote_sender_id ( ) == 0 ) :
while ! get_tree ( ) . root . has_node ( " ./ " + map_name + " /player " + str ( player ) ) :
await get_tree ( ) . create_timer ( 0.001 ) . timeout
var current_character = get_tree ( ) . root . get_node ( " ./ " + map_name + " /player " + str ( player ) )
current_character . beast_init ( )
2024-08-03 16:10:14 +02:00
@ rpc ( " any_peer " , " call_local " , " reliable " )
func player_hit ( target , beast ) :
2024-08-05 22:35:50 +02:00
if ! multiplayer . is_server ( ) :
target = get_tree ( ) . root . get_node ( " ./ " + map_name + " / " + target )
beast = get_tree ( ) . root . get_node ( " ./ " + map_name + " / " + beast )
if ! target . is_frozen :
target . captured ( beast )
beast . got_one ( target )
2024-08-03 16:10:14 +02:00