Skip to content

Commit 196ad01

Browse files
authored
Merge pull request #18 from XanatosX/develop
Release 0.3.0
2 parents 63d8397 + e3d748e commit 196ad01

File tree

10 files changed

+140
-20
lines changed

10 files changed

+140
-20
lines changed

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,12 @@ I do know there is a addon like this already in development, check it out at the
1313

1414
To install the addon download the source files and put the "addons" folder on a root level to your project. After that enable the plugin via the Godot plugin menu.
1515

16-
Checkout this part of the [Godot documentation][installing-and-enable-plugin]
16+
Checkout this part of the [Godot documentation][installing-and-enable-plugin].
17+
18+
> :warning: If you install the plugin and it is not active it is possible that godot will throw errors that the identifier "Console" cannot be found. To fix this issues you just need to activate the plugin, this error is a result of an dependency to that global instance, which is not present after install throwing an error on Godot automatic code check.
19+
20+
![Installation error](https://i.imgur.com/5HuV62g.png)
21+
*Error listed because Console is not loaded just yet, this is normal*
1722

1823
## Quickstart
1924

addons/gameconsole/builtin/command_help.gd

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
extends CommandTemplate
22

3+
var list_command_executer: Interaction
4+
var enter_man_command: Interaction
5+
6+
func _init():
7+
list_command_executer = Interaction.new()
8+
list_command_executer.from_raw("execute", "list_commands")
9+
10+
enter_man_command = Interaction.new()
11+
enter_man_command.from_raw("enter", "man")
12+
313
func create_command() -> Command:
414
var command = Command.new("help", _get_help, [], "Get help for this console")
515
return command
@@ -13,10 +23,10 @@ func _get_help() -> String:
1323
var return_data = "[center][b]%s[/b] by %s[/center]\n" % [addon_name, author_name] \
1424
+ "[center]%s[/center]\n" % version \
1525
+ _get_description() \
16-
+ "[center][url={\"type\": \"execute\", \"command\": \"list_commands\"}]List commands[/url][/center]"
26+
+ "[center][url=%s]List commands[/url][/center]" % list_command_executer.get_as_string()
1727
return return_data
1828

1929
func _get_description() -> String:
2030
return "[center]This addon does allow you to run built in or custom commands for your game.\n" \
21-
+ " If you need help run the [url={\"type\": \"enter\", \"command\": \"man\"}]man[/url] command followed by the command you need help with.\n" \
31+
+ " If you need help run the [url=%s]man[/url] command followed by the command you need help with.\n" % enter_man_command.get_as_string() \
2232
+ " Also if text is underlined you might be able to click it, test the \"[u]List Commands[/u]\" below [/center]\n\n"

addons/gameconsole/console/command/command.gd

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ var examples: PackedStringArray
1010
var is_hidden: bool = false
1111
var built_in: bool = false
1212

13+
var self_man_link: Interaction
14+
var self_enter_link: Interaction
15+
var self_example_links := {}
16+
1317
func _init(command_name: String,
1418
functionality: Callable,
1519
in_arguments : PackedStringArray = [],
@@ -23,6 +27,16 @@ func _init(command_name: String,
2327
short_description = command_description
2428
description = long_description
2529
examples = command_examples
30+
self_man_link = Interaction.new()
31+
self_enter_link = Interaction.new()
32+
33+
self_man_link.from_raw("man", command)
34+
self_enter_link.from_raw("enter", command)
35+
36+
for example in examples:
37+
var example_link = Interaction.new()
38+
example_link.from_raw("enter", example)
39+
self_example_links[example] = example_link
2640

2741
func get_command_name() -> String :
2842
return command
@@ -34,7 +48,7 @@ func execute(arguments: Array) -> String:
3448
return data
3549

3650
func get_self_listed():
37-
var url_part = "[url={\"type\": \"man\", \"command\": \"%s\"}]" % command
51+
var url_part = "[url=%s]" % self_man_link.get_as_string()
3852
var return_data = "- %s%s %s[/url]" % [url_part, get_command_name(), get_arguments()]
3953
if short_description != "":
4054
return_data += " => %s" % short_description
@@ -55,7 +69,7 @@ func as_stripped() -> StrippedCommand:
5569
return return_data
5670

5771
func get_man_page() -> String:
58-
var command_url = "[url={\"type\": \"enter\", \"command\": \"%s\"}]" % command
72+
var command_url = "[url=%s]" % self_enter_link.get_as_string()
5973
var return_text = "%s[b]%s[/b][/url]\n\n" % [command_url, command]
6074
var description_to_show = description
6175
if description_to_show == "":
@@ -68,7 +82,8 @@ func get_man_page() -> String:
6882
if examples.size() > 0:
6983
return_text += "\n[i][b]Examples[/b][/i]\n"
7084
for example in examples:
71-
var example_url = "[url={\"type\": \"enter\", \"command\": \"%s\"}]" % example
85+
var link = self_example_links[example] as Interaction
86+
var example_url = "[url=%s]" % link.get_as_string()
7287
return_text += "- %s%s[/url]\n" % [example_url, example]
7388

7489
return return_text

addons/gameconsole/console/console.gd

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ signal console_output(text: String)
77
signal is_current_command_valid(confirmed: bool)
88
signal copy_command_to_input(command: String)
99

10+
signal unknown_interaction_request(interaction: Interaction)
11+
1012
@onready var console_template: PackedScene = preload("res://addons/gameconsole/console/console/default_console_template.tscn")
1113
var config_file = "res://addons/gameconsole/plugin.cfg"
1214
var _plugin_config: ConfigFile = null
@@ -232,11 +234,15 @@ func get_specific_command(command_name: String) -> Command:
232234
return null
233235
return _console_commands[command_name]
234236

235-
func url_requested(data: Dictionary):
236-
match data.type:
237+
func url_requested(interaction: Interaction):
238+
match interaction.get_type():
239+
"UNKNOWN":
240+
search_and_execute_command("man list_commands")
237241
"man":
238-
search_and_execute_command("man %s" % data.command)
242+
search_and_execute_command("man %s" % interaction.get_data())
239243
"enter":
240-
copy_command_to_input.emit(data.command)
244+
copy_command_to_input.emit(interaction.get_data())
241245
"execute":
242-
search_and_execute_command(data.command)
246+
search_and_execute_command(interaction.get_data())
247+
_:
248+
unknown_interaction_request.emit(interaction)

addons/gameconsole/console/console/console_output.gd

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ var _stored_text: String = ""
44

55
func _ready():
66
bbcode_enabled = true
7+
meta_clicked.connect(_scroll_down)
78

89
func append_bbcode_text(text: String):
910
append_text(text)
@@ -14,4 +15,7 @@ func get_stored_text() -> String:
1415

1516
func clear_stored_text():
1617
_stored_text = ""
17-
clear()
18+
clear()
19+
20+
func _scroll_down(_data):
21+
scroll_to_line(get_line_count() - 1)

addons/gameconsole/console/console/console_template.gd

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ signal output_append(text: String)
55
signal store_content(text: String)
66
signal confirm_command(text: String)
77
signal is_command_valid(confirmed: bool)
8-
signal url_meta_requested(data: Dictionary)
8+
signal url_meta_requested(interaction: Interaction)
99
signal set_input(command: String)
1010
signal clear_output()
1111
signal clear_input()
@@ -78,4 +78,6 @@ func url_requested(data):
7878
Console.print_as_error("url data was not correctly parsed")
7979
return
8080
var dictionary = json_parser.get_data()
81-
url_meta_requested.emit(dictionary)
81+
var interaction = Interaction.new()
82+
interaction.from_dictionary(dictionary)
83+
url_meta_requested.emit(interaction)
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
class_name Interaction extends Resource
2+
3+
var _type: String
4+
var _data: String
5+
var _additional_data: Dictionary
6+
7+
var _json_data: String
8+
9+
## Parse an existing dictionary into an interaction object
10+
func from_dictionary(data: Dictionary):
11+
_type = data.get_or_add("type", "UNKNOWN")
12+
_data = data.get_or_add("data", "not_found")
13+
_additional_data = data.get_or_add("additional", {})
14+
15+
## Fill the information from raw information
16+
func from_raw(type: String, data: String, additional_data: Dictionary = {}):
17+
_type = type
18+
_data = data
19+
_additional_data = additional_data
20+
21+
## Get the type of the current interaction
22+
func get_type() -> String:
23+
return _type
24+
25+
## Get the stored data for the current interaction
26+
func get_data() -> String:
27+
return _data
28+
29+
func get_additional_data() -> Dictionary:
30+
return _additional_data
31+
32+
func get_as_string() -> String:
33+
if _json_data:
34+
return _json_data
35+
var result = {
36+
"type": _type,
37+
"data": _data,
38+
}
39+
if !_additional_data.is_empty():
40+
result.additional = _additional_data
41+
42+
var _json_data = JSON.stringify(result)
43+
return _json_data

addons/gameconsole/plugin.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
name="Game Console"
44
description="Addon to add a console to the game, allowing you to register and run commands."
55
author="Xanatos"
6-
version="0.2.0"
6+
version="0.3.0"
77
script="gameconsole.gd"

example/console_example.gd

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ var counter: int = 0
1414
# Called when the node enters the scene tree for the first time.
1515
func _ready() -> void:
1616
_register_commands()
17+
Console.unknown_interaction_request.connect(_handle_unknown_interaction)
1718
if always_use_custom_console:
1819
Console.set_custom_command_template(custom_console_template)
1920

@@ -71,11 +72,31 @@ func _spawn_entity(pos_x: String, pos_y: String, ttl: String) -> String:
7172
var real_y = int(pos_y)
7273
var real_ttl = float(ttl)
7374

74-
var target_position = Vector2(real_x, real_y)
75-
var new_node = EntityExample.new(target_position, real_ttl)
76-
add_child(new_node)
75+
_trigger_spawn_entity(real_x, real_y, real_ttl)
76+
77+
var custom_interaction = Interaction.new()
78+
var custom_edit = Interaction.new()
79+
80+
# The second parameter would be some identifier to find entity to spawn
81+
custom_interaction.from_raw("spawn_entity", "entity_example", {
82+
"x": real_x,
83+
"y": real_y,
84+
"ttl": real_ttl
85+
})
7786

78-
return "Spawn entity at (%s/%s) with a ttl or %s" % [real_x, real_y, real_ttl]
87+
custom_edit.from_raw("enter", "spawn_entity %s %s %s" % [pos_x, pos_y, ttl])
88+
89+
return "Spawn entity at (%s/%s) with a ttl of %s [url=%s]retrigger[/url] or [url=%s]edit[/url]" % [real_x,
90+
real_y,
91+
real_ttl,
92+
custom_interaction.get_as_string(),
93+
custom_edit.get_as_string()
94+
]
95+
96+
func _trigger_spawn_entity(x: int, y: int, ttl: float):
97+
var target_position = Vector2(x, y)
98+
var new_node = EntityExample.new(target_position, ttl)
99+
add_child(new_node)
79100

80101
func _reload() -> String:
81102
get_tree().reload_current_scene()
@@ -107,6 +128,18 @@ func _open_default_console():
107128
Console.hide_console()
108129
Console.show_console()
109130

131+
func _handle_unknown_interaction(interaction: Interaction):
132+
match interaction.get_type():
133+
"spawn_entity":
134+
## In theory this would be the entity we want to spawn, this is added just for demo purpose
135+
var _entity_name = interaction.get_data()
136+
var x = interaction.get_additional_data().get_or_add("x", 0)
137+
var y = interaction.get_additional_data().get_or_add("y", 0)
138+
var ttl = interaction.get_additional_data().get_or_add("ttl", 0)
139+
140+
_trigger_spawn_entity(x, y, ttl)
141+
142+
110143
func _unregister_commands():
111144
# Should be done if scene gets unloaded to prevent broken commands
112145
Console.remove_command("count_up")

example/custom_console_template.tscn

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,11 @@ command_input = NodePath("../VBoxContainer/ConsoleInput")
6666
[connection signal="clear_output" from="." to="PanelContainer/MarginContainer/VBoxContainer/ConsoleOutput" method="clear_stored_text"]
6767
[connection signal="is_command_valid" from="." to="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/ConsoleInput" method="is_command_valid"]
6868
[connection signal="output_append" from="." to="PanelContainer/MarginContainer/VBoxContainer/ConsoleOutput" method="append_bbcode_text"]
69+
[connection signal="set_input" from="." to="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/ConsoleInput" method="autocomplete_accepted"]
70+
[connection signal="meta_clicked" from="PanelContainer/MarginContainer/VBoxContainer/ConsoleOutput" to="." method="url_requested"]
6971
[connection signal="autocomplete_accepted" from="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/ConsoleAutocomplete" to="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/ConsoleInput" method="autocomplete_accepted"]
70-
[connection signal="text_changed" from="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/ConsoleInput" to="." method="check_if_is_valid_command"]
7172
[connection signal="text_changed" from="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/ConsoleInput" to="." method="autocomplete_requested"]
73+
[connection signal="text_changed" from="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/ConsoleInput" to="." method="check_if_is_valid_command"]
7274
[connection signal="text_changed" from="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/ConsoleInput" to="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/ConsoleAutocomplete" method="text_updated"]
7375
[connection signal="text_submitted" from="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/ConsoleInput" to="." method="request_command"]
7476
[connection signal="request_command" from="PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/ConsoleSendButton" to="." method="request_command"]

0 commit comments

Comments
 (0)