Push
This commit is contained in:
BIN
addons/fabimakesgames.embed_game/assets/icon.aseprite
Normal file
BIN
addons/fabimakesgames.embed_game/assets/icon.aseprite
Normal file
Binary file not shown.
BIN
addons/fabimakesgames.embed_game/assets/icon.png
Normal file
BIN
addons/fabimakesgames.embed_game/assets/icon.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 154 B |
34
addons/fabimakesgames.embed_game/assets/icon.png.import
Normal file
34
addons/fabimakesgames.embed_game/assets/icon.png.import
Normal file
@@ -0,0 +1,34 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://crd2bngqon872"
|
||||
path="res://.godot/imported/icon.png-b7032f7af70248c068afb9d98de50ab4.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/fabimakesgames.embed_game/assets/icon.png"
|
||||
dest_files=["res://.godot/imported/icon.png-b7032f7af70248c068afb9d98de50ab4.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/hdr_compression=1
|
||||
compress/normal_map=0
|
||||
compress/channel_pack=0
|
||||
mipmaps/generate=false
|
||||
mipmaps/limit=-1
|
||||
roughness/mode=0
|
||||
roughness/src_normal=""
|
||||
process/fix_alpha_border=true
|
||||
process/premult_alpha=false
|
||||
process/normal_map_invert_y=false
|
||||
process/hdr_as_srgb=false
|
||||
process/hdr_clamp_exposure=false
|
||||
process/size_limit=0
|
||||
detect_3d/compress_to=1
|
||||
@@ -0,0 +1,9 @@
|
||||
[gd_resource type="Shortcut" load_steps=2 format=3 uid="uid://dvlydk5ftl206"]
|
||||
|
||||
[sub_resource type="InputEventKey" id="InputEventKey_myaxp"]
|
||||
device = -1
|
||||
ctrl_pressed = true
|
||||
keycode = 4194336
|
||||
|
||||
[resource]
|
||||
events = [SubResource("InputEventKey_myaxp")]
|
||||
6
addons/fabimakesgames.embed_game/embed_button.tscn
Normal file
6
addons/fabimakesgames.embed_game/embed_button.tscn
Normal file
@@ -0,0 +1,6 @@
|
||||
[gd_scene format=3 uid="uid://bb4xl1j6cf78w"]
|
||||
|
||||
[node name="EmbedButton" type="CheckButton"]
|
||||
offset_right = 44.0
|
||||
offset_bottom = 24.0
|
||||
theme_type_variation = &"MainScreenButton"
|
||||
232
addons/fabimakesgames.embed_game/embed_game.gd
Normal file
232
addons/fabimakesgames.embed_game/embed_game.gd
Normal file
@@ -0,0 +1,232 @@
|
||||
@tool
|
||||
extends EditorPlugin
|
||||
|
||||
const debug: bool = false
|
||||
var debugger: EditorDebugger
|
||||
var sesh: EditorDebuggerSession
|
||||
var last_main_screen_rect: Rect2i
|
||||
var plugin_control: PanelContainer
|
||||
var hbox: HBoxContainer
|
||||
var activate_button: Button
|
||||
var top_bar_button: Button
|
||||
var last_main_screen_not_embed: String
|
||||
var is_playing_scene: bool
|
||||
var was_playing_scene: bool
|
||||
var embed_game:= EmbedGame.new()
|
||||
var cached_game_handle: int = 0
|
||||
|
||||
|
||||
func _enter_tree():
|
||||
add_autoload_singleton("EmbedGameAutoload","res://addons/fabimakesgames.embed_game/embed_game_autoload.gd")
|
||||
|
||||
## add checkbutton and reparent 'embed' button
|
||||
_add_control_elements()
|
||||
|
||||
## CONNECT SIGNALS
|
||||
debugger = EditorDebugger.new()
|
||||
debugger.new_session.connect(register_debugger_session)
|
||||
debugger._on_return_focus.connect(self._on_return_focus)
|
||||
debugger._on_handle_transmitted.connect(self._on_handle_received)
|
||||
add_debugger_plugin(debugger)
|
||||
|
||||
##connect main screen size to game window
|
||||
var main_screen := EditorInterface.get_editor_main_screen()
|
||||
main_screen_changed.connect(_on_main_screen_changed)
|
||||
|
||||
#initialize vars
|
||||
was_playing_scene = EditorInterface.get_playing_scene() != ""
|
||||
is_playing_scene = EditorInterface.get_playing_scene() != ""
|
||||
|
||||
if not ProjectSettings.has_setting("embed_game/padding"):
|
||||
ProjectSettings.set_setting("embed_game/padding", int(0))
|
||||
ProjectSettings.set_initial_value("embed_game/padding", int(0))
|
||||
ProjectSettings.save()
|
||||
func _exit_tree():
|
||||
hbox.queue_free()
|
||||
remove_debugger_plugin(debugger)
|
||||
remove_autoload_singleton("EmbedGameAutoload")
|
||||
|
||||
|
||||
func _build():
|
||||
cached_game_handle = 0 ## make sure the game handle will be gotten anew
|
||||
if activate_button.button_pressed:
|
||||
top_bar_button.visible = true
|
||||
EditorInterface.set_main_screen_editor("Embed")
|
||||
return true
|
||||
|
||||
func _on_activate_button_toggled(flag: bool):
|
||||
self.queue_save_layout() ## saves setting
|
||||
#if not is_playing_scene: return
|
||||
if flag:
|
||||
embed_window()
|
||||
if is_playing_scene:
|
||||
top_bar_button.visible = true
|
||||
EditorInterface.set_main_screen_editor("Embed")
|
||||
|
||||
else:
|
||||
unembed_window()
|
||||
EditorInterface.set_main_screen_editor(last_main_screen_not_embed)
|
||||
plugin_control.visible = false
|
||||
top_bar_button.visible = false
|
||||
|
||||
|
||||
## from project instance
|
||||
func _on_handle_received(data: Array) -> void:
|
||||
cached_game_handle = data[0]
|
||||
if activate_button.button_pressed:
|
||||
embed_window()
|
||||
|
||||
func _get_window_layout(configuration: ConfigFile) -> void:
|
||||
configuration.set_value("embed_window", "is_enabled", activate_button.button_pressed)
|
||||
|
||||
func _set_window_layout(configuration: ConfigFile) -> void:
|
||||
activate_button.button_pressed = configuration.get_value("embed_window","is_enabled", false)
|
||||
|
||||
func _add_control_elements():
|
||||
var top_buttons:= get_top_buttons()
|
||||
for i in top_buttons:
|
||||
if i.text == "Embed":
|
||||
top_bar_button = i
|
||||
hbox = HBoxContainer.new()
|
||||
hbox.name = "Embed"
|
||||
last_main_screen_not_embed = top_buttons[0].name ## so it's never an empty string
|
||||
top_bar_button.get_parent().add_child(hbox)
|
||||
top_bar_button.reparent(hbox)
|
||||
top_bar_button.shortcut = load("res://addons/fabimakesgames.embed_game/config/embed_shortcut.tres")
|
||||
top_bar_button.visible = false
|
||||
activate_button = preload("res://addons/fabimakesgames.embed_game/embed_button.tscn").instantiate()
|
||||
activate_button.toggled.connect(_on_activate_button_toggled)
|
||||
hbox.add_child(activate_button,true)
|
||||
|
||||
## add empty panel
|
||||
plugin_control = PanelContainer.new()
|
||||
EditorInterface.get_editor_main_screen().add_child(plugin_control)
|
||||
plugin_control.hide()
|
||||
|
||||
|
||||
|
||||
func _process(delta: float) -> void:
|
||||
if not activate_button.button_pressed: return
|
||||
|
||||
## UPDATE PLACEMENT WHEN MOVING EDITOR WINDOW ONLY
|
||||
_update_screen_rect_if_required()
|
||||
|
||||
## removes embed view on quitting the play mode
|
||||
is_playing_scene = EditorInterface.get_playing_scene() != ""
|
||||
|
||||
if not is_playing_scene:
|
||||
cached_game_handle = 0 ## reset game handle e.g. no running instance.
|
||||
|
||||
if was_playing_scene and not is_playing_scene:
|
||||
top_bar_button.visible = false
|
||||
EditorInterface.set_main_screen_editor(last_main_screen_not_embed)
|
||||
was_playing_scene = is_playing_scene
|
||||
|
||||
func _on_return_focus(data):
|
||||
var keycode: int = data[0]
|
||||
var f_key_number = keycode - 4194332
|
||||
var top_buttons:= get_top_buttons()
|
||||
if f_key_number < top_buttons.size():
|
||||
if f_key_number == 4: ## is KEY_F5
|
||||
EditorInterface.set_main_screen_editor("Embed")
|
||||
else:
|
||||
var desired_tab: String = top_buttons[f_key_number].name
|
||||
EditorInterface.set_main_screen_editor(desired_tab)
|
||||
|
||||
#region Window Management
|
||||
|
||||
func _update_screen_rect_if_required() -> void:
|
||||
var main_screen := EditorInterface.get_editor_main_screen()
|
||||
var main_screen_rect:= Rect2i(
|
||||
main_screen.global_position + Vector2.ONE * _get_padding() / 2,
|
||||
main_screen.size - Vector2.ONE * _get_padding()
|
||||
)
|
||||
if main_screen_rect != last_main_screen_rect:
|
||||
embed_game.set_window_rect(cached_game_handle, main_screen_rect)
|
||||
last_main_screen_rect = main_screen_rect
|
||||
|
||||
func _force_update_window_rect() -> void:
|
||||
var main_screen := EditorInterface.get_editor_main_screen()
|
||||
var main_screen_rect:= Rect2i(
|
||||
main_screen.global_position,
|
||||
main_screen.size
|
||||
)
|
||||
embed_game.set_window_rect(cached_game_handle, main_screen_rect)
|
||||
last_main_screen_rect = main_screen_rect
|
||||
|
||||
func get_handle_editor() -> int:
|
||||
var window := self.get_window().get_window_id()
|
||||
return DisplayServer.window_get_native_handle(DisplayServer.WINDOW_HANDLE, window)
|
||||
|
||||
func _get_padding() -> int:
|
||||
return ProjectSettings.get_setting("embed_game/padding", 2)
|
||||
|
||||
func embed_window() -> void:
|
||||
embed_game.show_window(cached_game_handle, false) ## takes longer but looks nicer
|
||||
embed_game.store_window_style(cached_game_handle)
|
||||
embed_game.set_window_borderless(cached_game_handle)
|
||||
embed_game.make_child(get_handle_editor(), cached_game_handle)
|
||||
_force_update_window_rect()
|
||||
embed_game.show_window(cached_game_handle, true)
|
||||
|
||||
|
||||
func unembed_window() -> void:
|
||||
embed_game.show_window(cached_game_handle, false)
|
||||
embed_game.unmake_child(cached_game_handle) ##revert window style must come before unmake child, else window moves downwards
|
||||
embed_game.revert_window_style(cached_game_handle)
|
||||
embed_game.show_window(cached_game_handle, true)
|
||||
|
||||
func _on_main_screen_changed(screen_name: String) -> void:
|
||||
if screen_name != "Embed":
|
||||
last_main_screen_not_embed = screen_name
|
||||
if activate_button.button_pressed:
|
||||
embed_game.show_window(cached_game_handle,false)
|
||||
else:
|
||||
embed_game.show_window(cached_game_handle,true)
|
||||
|
||||
|
||||
#region Helper Functions
|
||||
func get_top_buttons() -> Array[Node]:
|
||||
var cont := Control.new()
|
||||
add_control_to_container(CustomControlContainer.CONTAINER_TOOLBAR, cont)
|
||||
var btns := cont.get_parent().get_child(2).get_children()
|
||||
remove_control_from_container(CustomControlContainer.CONTAINER_TOOLBAR, cont)
|
||||
return btns
|
||||
#endregion
|
||||
|
||||
|
||||
#region Editor Plugin specific functions
|
||||
func _has_main_screen():
|
||||
return true
|
||||
func _get_plugin_name():
|
||||
return "Embed"
|
||||
func _make_visible(visible):
|
||||
plugin_control.visible = visible
|
||||
func _get_plugin_icon():
|
||||
return preload("res://addons/fabimakesgames.embed_game/assets/icon.png")
|
||||
|
||||
|
||||
#region Debugger Setup
|
||||
class EditorDebugger extends EditorDebuggerPlugin:
|
||||
signal new_session(session:EditorDebuggerSession)
|
||||
signal _on_return_focus(session: EditorDebuggerSession)
|
||||
signal _on_handle_transmitted(session: EditorDebuggerSession)
|
||||
|
||||
func _has_capture(prefix):
|
||||
if prefix == "return_focus": return true
|
||||
if prefix == "transmit_handle": return true
|
||||
return true
|
||||
|
||||
func _capture(message, data, session_id):
|
||||
if message == "return_focus:":
|
||||
_on_return_focus.emit(data)
|
||||
return true
|
||||
if message == "transmit_handle:":
|
||||
_on_handle_transmitted.emit(data)
|
||||
return true
|
||||
func _setup_session(session_id):
|
||||
new_session.emit(get_session(session_id))
|
||||
|
||||
func register_debugger_session(dbgs: EditorDebuggerSession):
|
||||
sesh = dbgs
|
||||
#endregion
|
||||
14
addons/fabimakesgames.embed_game/embed_game_autoload.gd
Normal file
14
addons/fabimakesgames.embed_game/embed_game_autoload.gd
Normal file
@@ -0,0 +1,14 @@
|
||||
extends Node
|
||||
|
||||
func _ready() -> void:
|
||||
if !OS.has_feature("editor"): ## remove plugin autoloads in exported builds
|
||||
queue_free()
|
||||
|
||||
EngineDebugger.send_message("transmit_handle:",[DisplayServer.window_get_native_handle(DisplayServer.WINDOW_HANDLE, self.get_window().get_window_id())])
|
||||
|
||||
func _input(event: InputEvent) -> void:
|
||||
if event is InputEventKey:
|
||||
if event.ctrl_pressed and event.pressed:
|
||||
if event.keycode >= KEY_F1 and event.keycode <= KEY_F9:
|
||||
EngineDebugger.send_message("return_focus:", [event.keycode])
|
||||
|
||||
7
addons/fabimakesgames.embed_game/plugin.cfg
Normal file
7
addons/fabimakesgames.embed_game/plugin.cfg
Normal file
@@ -0,0 +1,7 @@
|
||||
[plugin]
|
||||
|
||||
name="fabimakesgames.EmbedGame"
|
||||
description="Embeds the game window in the Editor"
|
||||
author="fabimakesgames/fabimakesgames"
|
||||
version="1.0"
|
||||
script="embed_game.gd"
|
||||
@@ -19,6 +19,7 @@ boot_splash/show_image=false
|
||||
|
||||
DialogueManager="*res://addons/dialogue_manager/dialogue_manager.gd"
|
||||
DialogueController="*res://src/game/DialogueController.cs"
|
||||
EmbedGameAutoload="*res://addons/fabimakesgames.embed_game/embed_game_autoload.gd"
|
||||
|
||||
[dialogue_manager]
|
||||
|
||||
@@ -37,7 +38,7 @@ project/assembly_name="GameJamDungeon"
|
||||
|
||||
[editor_plugins]
|
||||
|
||||
enabled=PackedStringArray("res://addons/SimpleDungeons/plugin.cfg", "res://addons/dialogue_manager/plugin.cfg")
|
||||
enabled=PackedStringArray("res://addons/SimpleDungeons/plugin.cfg", "res://addons/dialogue_manager/plugin.cfg", "res://addons/fabimakesgames.embed_game/plugin.cfg")
|
||||
|
||||
[file_customization]
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@ namespace GameJamDungeon
|
||||
AppLogic.Set(AppRepo);
|
||||
Menu.NewGame += OnNewGame;
|
||||
Menu.Quit += OnQuit;
|
||||
Input.MouseMode = Input.MouseModeEnum.Captured;
|
||||
Input.MouseMode = Input.MouseModeEnum.Visible;
|
||||
this.Provide();
|
||||
}
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
stretch = true
|
||||
|
||||
[node name="GameWindow" type="SubViewport" parent="SubViewportContainer"]
|
||||
unique_name_in_owner = true
|
||||
|
||||
@@ -26,12 +26,15 @@ shader_parameter/enable_recolor = false
|
||||
|
||||
[sub_resource type="Resource" id="Resource_qjdoa"]
|
||||
script = ExtResource("7_1lafu")
|
||||
Damage = 0
|
||||
ThrowableItemTags = []
|
||||
Name = "Test Item"
|
||||
Description = ""
|
||||
Texture = ExtResource("6_3qv3u")
|
||||
SpawnRate = 0.5
|
||||
ThrowSpeed = 12.0
|
||||
HealHPAmount = 0
|
||||
HealVTAmount = 0
|
||||
ThrowDamage = 5
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_qkug6"]
|
||||
size = Vector3(0.371643, 0.289612, 0.286743)
|
||||
@@ -51,6 +54,7 @@ anchor_right = 1.0
|
||||
anchor_bottom = 1.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 2
|
||||
stretch = true
|
||||
|
||||
[node name="SubViewport" type="SubViewport" parent="SubViewportContainer"]
|
||||
transparent_bg = true
|
||||
|
||||
@@ -400,6 +400,7 @@ public partial class InventoryMenu : Control, IInventoryMenu
|
||||
else if (currentItem is IUsableItem usableItem)
|
||||
{
|
||||
usableItem.Use();
|
||||
GameRepo.PlayerData.Inventory.Remove(usableItem);
|
||||
if (_currentIndex >= ItemSlots.Length - 1)
|
||||
_currentIndex--;
|
||||
if (_currentIndex <= 0)
|
||||
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1385,19 +1385,19 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 8.46669, -1.76808, 9.35347)
|
||||
unique_name_in_owner = true
|
||||
|
||||
[node name="EnemySpawn1" type="Marker3D" parent="EnemySpawnPoints"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.21313, -0.746347, -7.94688)
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -7.21313, -1.98058, -7.94688)
|
||||
|
||||
[node name="EnemySpawn2" type="Marker3D" parent="EnemySpawnPoints"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.27566, -1.12848, -7.94688)
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.27566, -2.36271, -7.94688)
|
||||
|
||||
[node name="EnemySpawn3" type="Marker3D" parent="EnemySpawnPoints"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.27566, -0.662478, 5.40586)
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 5.27566, -1.89671, 5.40586)
|
||||
|
||||
[node name="EnemySpawn4" type="Marker3D" parent="EnemySpawnPoints"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.5927, -0.720595, 5.40586)
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 12.5927, -1.95482, 5.40586)
|
||||
|
||||
[node name="EnemySpawn5" type="Marker3D" parent="EnemySpawnPoints"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.73702, -0.882075, 5.40586)
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.73702, -2.1163, 5.40586)
|
||||
|
||||
[node name="ItemDatabase" parent="." instance=ExtResource("18_mnyg7")]
|
||||
unique_name_in_owner = true
|
||||
@@ -1423,7 +1423,7 @@ shape = SubResource("BoxShape3D_acrk2")
|
||||
|
||||
[node name="Minimap" type="MeshInstance3D" parent="Minimap Manager"]
|
||||
unique_name_in_owner = true
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.301735, -2.00828, 0)
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.301735, -2.09192, 0)
|
||||
visible = false
|
||||
layers = 2
|
||||
mesh = SubResource("PlaneMesh_24fob")
|
||||
|
||||
@@ -375,7 +375,7 @@ shape = SubResource("BoxShape3D_hs4wf")
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.00341564, 1.40507, 0.645068)
|
||||
cull_mask = 1048573
|
||||
cull_mask = 1048569
|
||||
fov = 45.0
|
||||
near = 0.001
|
||||
|
||||
|
||||
Reference in New Issue
Block a user