Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 0 additions & 64 deletions demo/addons/libmaszyna/developer_console.gd

This file was deleted.

25 changes: 24 additions & 1 deletion demo/addons/libmaszyna/libmaszyna.gd
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,31 @@
extends EditorPlugin

func _enter_tree():
add_autoload_singleton("Console", "res://addons/libmaszyna/console.gd")
add_autoload_singleton("PlayerSystem", "res://addons/libmaszyna/player/player_system.gd")
add_autoload_singleton("MultiPlayerManager", "res://addons/libmaszyna/player/multiplayer_manager.gd")
add_autoload_singleton("Console", "res://addons/libmaszyna/utility/console.gd")
add_custom_project_setting("maszyna/game/multiplayer/host", "127.0.0.1", TYPE_STRING)
add_custom_project_setting("maszyna/game/multiplayer/port", 9797, TYPE_INT)


func _exit_tree():
remove_autoload_singleton("Console")
remove_autoload_singleton("MultiPlayerManager")
remove_autoload_singleton("PlayerSystem")



func add_custom_project_setting(name: String, default_value, type: int, hint: int = PROPERTY_HINT_NONE, hint_string: String = "") -> void:

if ProjectSettings.has_setting(name): return

var setting_info: Dictionary = {
"name": name,
"type": type,
"hint": hint,
"hint_string": hint_string
}

ProjectSettings.set_setting(name, default_value)
ProjectSettings.add_property_info(setting_info)
ProjectSettings.set_initial_value(name, default_value)
17 changes: 17 additions & 0 deletions demo/addons/libmaszyna/player/multiplayer_manager.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
extends Node

func host_game(ip, port) -> int:
var peer = ENetMultiplayerPeer.new()
peer.set_bind_ip(ip)
var err = peer.create_server(port, 32)
if err == OK:
multiplayer.multiplayer_peer = peer
return err


func connect_game(ip, port) -> int:
var peer = ENetMultiplayerPeer.new()
var err = peer.create_client(ip, port)
if err == OK:
multiplayer.multiplayer_peer = peer
return err
9 changes: 9 additions & 0 deletions demo/addons/libmaszyna/player/player_info.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
extends Resource
class_name PlayerInfo

enum PlayerType { PLAYER_TYPE_LOCAL, PLAYER_TYPE_REMOTE }

@export var peer_id:int
@export var name:String
@export var type:PlayerType
@export var train_id:String
152 changes: 152 additions & 0 deletions demo/addons/libmaszyna/player/player_system.gd
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
extends Node
#class_name PlayerSystem

var _players = {}
var _trains_occupied = {} # train_id to peer_id map

var nick:String = ""
var occupied_train: String = ""


signal error_received(error: String)
signal kicked_off_train(peer_id: int, train_id: String)

func _ready():
multiplayer.peer_connected.connect(_on_peer_connected)
multiplayer.peer_disconnected.connect(_on_peer_disconnected)
multiplayer.connected_to_server.connect(_on_connected_to_server)
multiplayer.server_disconnected.connect(_on_server_disconnected)



func _error(msg):
error_received.emit(msg)

func _on_connected_to_server():
LogSystem.info("Connected to server successfully")

func _on_server_disconnected():
LogSystem.info("Disconnected from server")

func _on_peer_connected(peer_id: int):
LogSystem.info("Peer connected: %d" % peer_id)
register_player.rpc(peer_id)
set_player_name.rpc(peer_id, nick)
if occupied_train:
enter_train.rpc(peer_id, occupied_train)


func _on_peer_disconnected(peer_id: int):
unregister_player.rpc(peer_id)
LogSystem.info("Peer disconnected: %d" % peer_id)

func _require_registered_player(peer_id):
if not _players.has(peer_id):
_error("Player not registered: %s" % peer_id)
false
else:
return true

func _require_train_occupied_by_player(peer_id, train_id):
if _require_registered_player(peer_id):
if not train_id in _trains_occupied:
_error("Train is not occupied: %s" % train_id)
return false
if not _trains_occupied.has(train_id):
_error("Train is not occupied: %s" % train_id)
return false
return true
else:
return false


func recevie_error(message):
error_received.emit(message)


@rpc("any_peer", "call_local")
func register_player(peer_id:int, name:String = "", type=PlayerInfo.PlayerType.PLAYER_TYPE_LOCAL):
if _players.has(peer_id):
_error("Player already registered: %s" % peer_id)
return

var p = PlayerInfo.new()
p.name = name if not name.is_empty() else "Player %d" % peer_id
p.type = type
p.peer_id = peer_id

_players[peer_id] = p


@rpc("any_peer", "call_local")
func unregister_player(peer_id:int):
if _require_registered_player(peer_id):
_players.erase(peer_id)


func get_all_players():
return _players.values()


func get_my_peer_id():
return multiplayer.get_unique_id()


func set_player_name(peer_id:int, nick: String):
if not nick.is_empty() and _require_registered_player(peer_id):
receive_player_name.rpc(peer_id, nick)

@rpc("any_peer", "call_local")
func receive_player_name(peer_id:int, nick: String):
_players[peer_id].name = nick
LogSystem.warning("Player %d changed nick to %s" % [peer_id, nick])

func get_player_name(peer_id:int):
if _require_registered_player(peer_id):
return _players[peer_id].name

@rpc("any_peer", "call_local")
func enter_train(peer_id:int, train_id:String):
if _require_registered_player(peer_id):
if _trains_occupied.has(train_id):
_error("Train is already occupied: %s" % train_id)
if multiplayer.get_remote_sender_id() == 1:
#kicked_off_train.emit(peer_id, train_id)
kick_off_from_train.rpc(peer_id, train_id)
#handle_train_occupy_conflict.rpc_id(peer_id, train_id, _trains_occupied[train_id])
return
_trains_occupied[train_id] = peer_id
_players[peer_id].train_id = train_id


@rpc("any_peer", "call_local")
func exit_train(peer_id:int, train_id:String):
if _require_train_occupied_by_player(peer_id, train_id):
if _trains_occupied[train_id] == peer_id:
_trains_occupied.erase(train_id)
_players[peer_id].train_id = ""
else:
_error("Train is occupied by someone else")


@rpc("any_peer", "call_local")
func kick_off_from_train(peer_id:int, train_id:String):
kicked_off_train.emit(peer_id, train_id)

@rpc("any_peer","call_remote")
func handle_train_occupy_conflict(train_id:String, actual_peer_id:int):
print("HERE")
_trains_occupied[train_id] = actual_peer_id
kicked_off_train.emit(multiplayer.get_remote_sender_id(), train_id)


func send_train_command(peer_id:int, train_id:String, command: String, p1 = null, p2 = null):
if _require_train_occupied_by_player(peer_id, train_id):
TrainSystem.send_command(train_id, command, p1, p2)

func send_message(message: String):
receive_message.rpc(multiplayer.get_unique_id(), message)

@rpc("any_peer", "call_remote")
func receive_message(peer_id:int, message: String):
LogSystem.info("%s: %s" % [get_player_name(peer_id), message])
Loading