211 lines
7.0 KiB
GDScript

extends Node
signal pausing()
@onready var mainMenu = $CanvasLayer/MainMenu
@onready var baseMenu = $CanvasLayer/MainMenu/MarginContainer/VBoxContainer/BaseMenu
@onready var hostMenu = $CanvasLayer/MainMenu/MarginContainer/VBoxContainer/Hosting
@onready var joinMenu = $CanvasLayer/MainMenu/MarginContainer/VBoxContainer/Joining
@onready var pauseMenu = $CanvasLayer/PauseMenu
@onready var optionMenu = $CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu
@onready var addressEntry = $CanvasLayer/MainMenu/MarginContainer/VBoxContainer/Joining/AddressEntry
@onready var username = $CanvasLayer/MainMenu/MarginContainer/VBoxContainer/BaseMenu/Username
@onready var hud = $CanvasLayer/HUD
@onready var healthbar = $CanvasLayer/HUD/HealthBar
@onready var upnpEnabled = $CanvasLayer/MainMenu/MarginContainer/VBoxContainer/Hosting/upnpCheck
const SAVE_FILE: String = "user://options.res"
const Player = preload("res://Prefabs/player.tscn")
const PORT = 25565
var enet_peer = ENetMultiplayerPeer.new()
var paused: bool = false
var ingame: bool = false
var chimkin
var local_peer_id
@export var settings: Dictionary
@export var spawnpoint: Vector3 = Vector3(0, 6.376, 0)
func _unhandled_input(event):
#if (not is_multiplayer_authority()): return
if ingame and Input.is_action_just_pressed("quit"):
pause()
func _ready():
loadSave()
func _on_join_pressed():
baseMenu.hide()
joinMenu.show()
func _on_back_pressed_2(): #For join menu
joinMenu.hide()
baseMenu.show()
func _on_host_pressed():
baseMenu.hide()
hostMenu.show()
func _on_back_pressed_1(): #For host menu
hostMenu.hide()
baseMenu.show()
func _on_host_button_pressed():
hostMenu.hide()
mainMenu.hide()
hud.show()
ingame = true
enet_peer.create_server(PORT)
multiplayer.multiplayer_peer = enet_peer
multiplayer.peer_connected.connect(addPlayer)
multiplayer.peer_disconnected.connect(removePlayer)
addPlayer(multiplayer.get_unique_id())
if upnpEnabled.button_pressed:
upnpSetup()
func _on_join_button_pressed():
if addressEntry.text == "": return
joinMenu.hide()
mainMenu.hide()
hud.show()
ingame = true
enet_peer.create_client(addressEntry.text, PORT)
multiplayer.multiplayer_peer = enet_peer
func addPlayer(peer_id):
var player = Player.instantiate()
player.name = str(peer_id)
player.position = spawnpoint
add_child(player)
if player.is_multiplayer_authority():
player.healthChanged.connect(updateHealthBar)
local_peer_id = peer_id
func removePlayer(peer_id):
var player = get_node_or_null(str(peer_id))
if player:
player.queue_free()
func updateHealthBar(health):
healthbar.value = health
func _on_multiplayer_spawner_spawned(node):
if node.is_multiplayer_authority():
node.healthChanged.connect(updateHealthBar)
chimkin = node
func upnpSetup():
var upnp = UPNP.new()
var discoverResult = upnp.discover()
assert(discoverResult == UPNP.UPNP_RESULT_SUCCESS, "UPNP Discover Failed! Error %s" % discoverResult)
assert(upnp.get_gateway() and upnp.get_gateway().is_valid_gateway(), "UPNP Invalid Gateway!")
var mapResult = upnp.add_port_mapping(PORT)
assert(mapResult == UPNP.UPNP_RESULT_SUCCESS, "UPNP Port Mapping Failed! Error %s" % mapResult)
print("Success! Join Address: %s" % upnp.query_external_address())
func pause():
if paused:
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
pauseMenu.hide()
mainMenu.hide()
else:
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
mainMenu.show()
pauseMenu.show()
paused = not paused
pausing.emit()
func _on_cancel_pressed():
optionMenu.hide()
baseMenu.show()
updateOptions()
func playerDisconnect(peer_id):
mainMenu.show()
enet_peer.disconnect_peer(peer_id, true)
func quit():
get_tree().quit()
func _on_main_menu_pressed():
var player = get_node_or_null(str(local_peer_id))
enet_peer.close()
func save():
var save_game = FileAccess.open(SAVE_FILE, FileAccess.WRITE)
save_game.store_line(JSON.stringify(settings))
save_game.close()
func loadSave():
if not FileAccess.file_exists(SAVE_FILE):
initSave()
var save_game = FileAccess.open(SAVE_FILE, FileAccess.WRITE)
save_game.store_line(JSON.stringify(settings))
save_game.close()
else:
var save_game = FileAccess.open(SAVE_FILE, FileAccess.READ)
var json = JSON.new()
json.parse(save_game.get_line())
settings = json.get_data()
save_game.close()
if settings["vsync"]:
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED)
else:
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_ENABLED)
updateOptions()
func updateOptions():
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/FOV").value = settings["fov"]
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/Sensitivity").value = settings["sensitivity"]
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/MasterVolume").value = settings["master_volume"]
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/MusicVolume").value = settings["music_volume"]
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/SoundFXVolume").value = settings["soundFX_volume"]
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/VSyncBox").button_pressed = settings["vsync"]
func initSave():
settings = {"fov": 75,
"sensitivity": 50,
"master_volume": 70,
"music_volume": 70,
"soundFX_volume": 70,
"vsync": true}
updateOptions()
func _on_apply_pressed():
settings = {
"fov": get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/FOV").value,
"sensitivity": get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/Sensitivity").value,
"master_volume": get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/MasterVolume").value,
"music_volume": get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/MusicVolume").value,
"soundFX_volume": get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/SoundFXVolume").value,
"vsync": get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/VSyncBox").button_pressed
}
save()
if settings["vsync"]:
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_DISABLED)
else:
DisplayServer.window_set_vsync_mode(DisplayServer.VSYNC_ENABLED)
baseMenu.show()
optionMenu.hide()
func _on_options_pressed():
optionMenu.show()
baseMenu.hide()
func _on_fov_value_changed(value):
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/FOVNum").text = str(value)
func _on_sensitivity_value_changed(value):
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/SensitivityNum").text = str(value)
func _on_master_volume_value_changed(value):
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/MasterVolumeValue").text = str(value)
func _on_music_volume_value_changed(value):
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/MusicVolumeNum").text = str(value)
func _on_sound_fx_volume_value_changed(value):
get_node("CanvasLayer/MainMenu/MarginContainer/VBoxContainer/OptionMenu/SoundFXVolumeValue").text = str(value)