Compare commits
21 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| cc7cb90041 | |||
| 7a787a36d6 | |||
| bfa1f251dd | |||
| 673368a200 | |||
| c1108e96d7 | |||
| 15cb80d045 | |||
| 1d298b3080 | |||
| 42ff38f39b | |||
| dafb0c96cc | |||
| ef454e9502 | |||
| cc70fb361b | |||
| 7bf19868e7 | |||
| d1f83525b1 | |||
| 4bcbda9690 | |||
| e51ef5a517 | |||
| 50de6abb5d | |||
| 95616f61fc | |||
| b15a4fef95 | |||
| 14d29d68bb | |||
| 9d612682ec | |||
| 9bfe37af62 |
@@ -83,6 +83,8 @@ jobs:
|
||||
|
||||
Export:
|
||||
runs-on: godot
|
||||
env:
|
||||
RUNNER_TOOL_CACHE: /toolcache # Runner Tool Cache
|
||||
needs:
|
||||
- BumpTag
|
||||
|
||||
|
||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -19,6 +19,7 @@
|
||||
|
||||
*.suo
|
||||
*.user
|
||||
*.csproj.old*
|
||||
_ReSharper.*
|
||||
*.DotSettings.user
|
||||
bin
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
<Project Sdk="Godot.NET.Sdk/4.6.0">
|
||||
<Project Sdk="Godot.NET.Sdk/4.6.2">
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net9.0</TargetFramework>
|
||||
<EnableDynamicLoading>true</EnableDynamicLoading>
|
||||
@@ -126,6 +126,7 @@
|
||||
<ItemGroup>
|
||||
<Folder Include="addons\" />
|
||||
<Folder Include="tests\" />
|
||||
<Folder Include="tools\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="RustyOptions" Version="0.10.1" />
|
||||
|
||||
2
Movement tests.sln.DotSettings
Normal file
2
Movement tests.sln.DotSettings
Normal file
@@ -0,0 +1,2 @@
|
||||
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
|
||||
<s:Boolean x:Key="/Default/CodeEditing/SuppressNullableWarningFix/Enabled/@EntryValue">False</s:Boolean></wpf:ResourceDictionary>
|
||||
@@ -1,7 +1,7 @@
|
||||
[gd_resource type="Resource" load_steps=2 format=3 uid="uid://8j4xg16o3qnl"]
|
||||
[gd_resource type="Resource" format=3 uid="uid://8j4xg16o3qnl"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://bq4vlbfx00hea" path="res://addons/forge/core/ForgeData.cs" id="1_x0pne"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_x0pne")
|
||||
RegisteredTags = Array[String](["effect.fire", "effect.wet", "cue.floating.text", "cue.vfx.fire", "cue.vfx.wet", "cue.vfx.regen", "cooldown.enemy.attack", "set_by_caller.damage", "event.damage", "cooldown", "cooldown.skill.projectile", "cooldown.skill.shield", "cooldown.skill.dash", "movement.block", "immunity.damage", "effect.mana_shield", "cue.vfx.shield", "event.damage.taken", "event.damage.dealt", "event", "set_by_caller", "trait.flammable", "trait.healable", "trait.damageable", "trait.wettable", "cue.vfx.reflect", "cue.vfx", "cooldown.skill", "cooldown.skill.reflect"])
|
||||
RegisteredTags = Array[String](["character.player", "character.enemy", "weapon", "status.stunned", "status.burning", "status.frozen", "abilities.weapon.land", "abilities.weapon.flying", "abilities.weapon.left", "events.combat.damage", "events.combat.hit", "events.weapon.flyingTick", "events.weapon.startedFlying", "events.weapon.stoppedFlying", "events.weapon.handToFlying", "events.weapon.flyingToHand", "events.weapon.plantedToHand", "events.weapon.plantedToFlying", "events.weapon.planted", "cooldown.empoweredAction", "cooldown.empoweredSwordThrow", "cues.resources.mana", "events.player.empowered_action_used", "character.player.mana", "character.player.mana.regen", "character.player.mana.regen.inhibited"])
|
||||
|
||||
33
addons/rider-plugin/CONTRIBUTING.md
Normal file
33
addons/rider-plugin/CONTRIBUTING.md
Normal file
@@ -0,0 +1,33 @@
|
||||
# Contribution
|
||||
|
||||
Hello, thanks for taking time and helping out with the addon!
|
||||
|
||||
Most contributions require you to agree to a Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us the rights to use your contribution. Please sign the CLA before sending the PR: https://www.jetbrains.com/agreements/cla/.
|
||||
|
||||
#### Local setup
|
||||
|
||||
Open the `godot-editor-plugin/CMakeLists.txt` in Rider 2026.1+, select `rider-gdextension` target in the run configuration selector.
|
||||
There are some more fixes coming in 2026.2, which will allow working on gdscript and cpp files within the same workspace.
|
||||
|
||||
#### Signing the binaries
|
||||
|
||||
Plugin binaries need to be signed to comply with modern operating system security requirements. Unsigned dynamic libraries may fail to load or trigger security warnings:
|
||||
|
||||
- **macOS**: Requires code signing (and often notarization) for `.dylib` files. Unsigned libraries may simply fail to load.
|
||||
- **Windows**: SmartScreen may block unsigned binaries, and corporate environments often enforce signed code only.
|
||||
- **Linux**: Generally allows unsigned `.so` files, but some sandboxed environments (Flatpak, Snap) impose restrictions.
|
||||
|
||||
**How signing is implemented:**
|
||||
|
||||
1. **TeamCity Configuration**: [ijplatform_master_Net_Deploy_Plugins_Public_Godot](https://buildserver.labs.intellij.net/buildConfiguration/ijplatform_master_Net_Deploy_Plugins_Public_Godot) (internal JetBrains link)
|
||||
- Note: The automatic trigger on new tags is currently not working, so manual triggering is required.
|
||||
|
||||
2. **Release Process**:
|
||||
- First, use your GitHub Action to prepare a **pre-release** with a tag
|
||||
- Manually trigger the TeamCity configuration on the necessary branch/tag
|
||||
- The configuration will download assets, sign them, and upload them back (removing the pre-release flag)
|
||||
- The pre-release flag is required at the start; otherwise, the signing configuration will skip the release (protection against double signing)
|
||||
|
||||
3. **Signing existing releases**:
|
||||
- You can run signing on already existing old releases/tags
|
||||
- Mark them as pre-release first, then run the configuration on the necessary tag
|
||||
21
addons/rider-plugin/LICENCE
Normal file
21
addons/rider-plugin/LICENCE
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2025 JetBrains
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
51
addons/rider-plugin/README.md
Normal file
51
addons/rider-plugin/README.md
Normal file
@@ -0,0 +1,51 @@
|
||||
# JetBrains Rider Integration – Godot addon
|
||||
|
||||
This addon currently provides two features:
|
||||
1. Finds all Rider installations in the system and provides a selector on the `Text Editor` -> `External` tab in the settings to select one.
|
||||
2. Provides the "Use Rider" toggle in the Godot toolbar and, when enabled, applies a set of editor settings recommended for working with JetBrains Rider. The goal is to make it trivial to switch between Rider‑optimized settings and stock Godot settings with a single click.
|
||||
|
||||
## Quick start
|
||||
|
||||
Requirements:
|
||||
- Godot 4.2.2+
|
||||
|
||||
Install:
|
||||
1. Inside the Godot editor, it can be installed from the AssetLib view or [downloaded](https://godotengine.org/asset-library/asset/4576)
|
||||
2. [Optional] Change the initial value of `active` in the plugin.cfg
|
||||
3. [Optional] Change the initial values in the presets.json file.
|
||||
4. Enable "JetBrains Rider External Editor" plugin in the Project → Project Settings… → Plugins tab.
|
||||
|
||||
Use:
|
||||
- A toolbar toggle named "Use Rider" will appear. Click it to turn the preset On/Off.
|
||||
|
||||
Screenshot:
|
||||

|
||||
|
||||
## What the toggle changes
|
||||
|
||||
The preset values live in `presets.json`.
|
||||
|
||||
When ON:
|
||||
- Write the values from the "on" preset into the Editor Settings.
|
||||
|
||||
When OFF:
|
||||
- Write the values from the "off" preset into the Editor Settings.
|
||||
|
||||
Note: The plugin does not currently auto‑set Rider’s executable path or flags. See Plans below.
|
||||
|
||||
## Setting Rider to be the external editor
|
||||
|
||||
The plugin automatically detects installed Rider versions on your system and provides a convenient dropdown menu to
|
||||
select which installation to use as your external editor.
|
||||
|
||||
- The plugin scans common installation locations for Rider on Windows, macOS, and Linux.
|
||||
- Detected installations appear in the "Select Rider" dropdown in the toolbar.
|
||||
- When you select a Rider installation, the plugin automatically updates the `dotnet/editor/external_editor_path` editor
|
||||
setting.
|
||||
|
||||
## License
|
||||
See `addons/rider-plugin/LICENCE`.
|
||||
|
||||
## Acknowledgements
|
||||
Created by JetBrains to streamline using Rider with Godot.
|
||||
Initial idea https://github.com/sszigeti/toggle_external_editor
|
||||
144
addons/rider-plugin/icons/icon.svg
Normal file
144
addons/rider-plugin/icons/icon.svg
Normal file
@@ -0,0 +1,144 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 25.4.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
|
||||
<svg
|
||||
version="1.0"
|
||||
id="katman_1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
viewBox="0 0 512 512"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="JetBrains Rider Icon.svg"
|
||||
width="512"
|
||||
height="512"
|
||||
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||
id="defs43" /><sodipodi:namedview
|
||||
id="namedview41"
|
||||
pagecolor="#505050"
|
||||
bordercolor="#ffffff"
|
||||
borderopacity="1"
|
||||
inkscape:pageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="1"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.0980553"
|
||||
inkscape:cx="256.36233"
|
||||
inkscape:cy="212.19333"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1027"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="22"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="katman_1" />
|
||||
<style
|
||||
type="text/css"
|
||||
id="style2">
|
||||
.st0{fill:url(#SVGID_1_);}
|
||||
.st1{fill:url(#SVGID_00000130622934180993703410000017420799098261276343_);}
|
||||
.st2{fill:url(#SVGID_00000060739771362873723200000017991140373209755022_);}
|
||||
.st3{fill:#FFFFFF;}
|
||||
</style>
|
||||
<symbol
|
||||
id="rider"
|
||||
viewBox="-35 -35 70 70">
|
||||
<linearGradient
|
||||
id="SVGID_1_"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="30.4897"
|
||||
y1="5.1188998"
|
||||
x2="-23.4683"
|
||||
y2="-25.8451">
|
||||
<stop
|
||||
offset="0"
|
||||
style="stop-color:#DD1265"
|
||||
id="stop4" />
|
||||
<stop
|
||||
offset="0.483"
|
||||
style="stop-color:#DD1265"
|
||||
id="stop6" />
|
||||
<stop
|
||||
offset="0.942"
|
||||
style="stop-color:#FDB60D"
|
||||
id="stop8" />
|
||||
</linearGradient>
|
||||
<path
|
||||
class="st0"
|
||||
d="M 35,-7.7 -14.1,-35 18.8,13.9 25.5,9.5 Z"
|
||||
id="path11" />
|
||||
|
||||
<linearGradient
|
||||
id="SVGID_00000169517474296634577950000016895268102491994795_"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="-1.5839"
|
||||
y1="-28.888"
|
||||
x2="19.805099"
|
||||
y2="30.174999">
|
||||
<stop
|
||||
offset="0.139"
|
||||
style="stop-color:#087CFA"
|
||||
id="stop13" />
|
||||
<stop
|
||||
offset="0.476"
|
||||
style="stop-color:#DD1265"
|
||||
id="stop15" />
|
||||
<stop
|
||||
offset="0.958"
|
||||
style="stop-color:#087CFA"
|
||||
id="stop17" />
|
||||
</linearGradient>
|
||||
<path
|
||||
style="fill:url(#SVGID_00000169517474296634577950000016895268102491994795_)"
|
||||
d="M 15.5,-18.9 9.3,-33.9 -4.3,-20.5 1.2,28.1 14.4,35 35,23 Z"
|
||||
id="path20" />
|
||||
|
||||
<linearGradient
|
||||
id="SVGID_00000135668350575375336630000014638141720088491653_"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="-17.5865"
|
||||
y1="-27.071199"
|
||||
x2="-1.7875"
|
||||
y2="29.073799">
|
||||
<stop
|
||||
offset="0.278"
|
||||
style="stop-color:#DD1265"
|
||||
id="stop22" />
|
||||
<stop
|
||||
offset="0.968"
|
||||
style="stop-color:#FDB60D"
|
||||
id="stop24" />
|
||||
</linearGradient>
|
||||
<path
|
||||
style="fill:url(#SVGID_00000135668350575375336630000014638141720088491653_)"
|
||||
d="m -14.1,-35 -20.9,14.1 7.8,48.1 20.1,7.7 26,-21 z"
|
||||
id="path27" />
|
||||
<path
|
||||
d="M 21,-21 H -21 V 21 H 21 Z"
|
||||
id="path29" />
|
||||
<path
|
||||
class="st3"
|
||||
d="m -0.6,13.6 h -15.8 v 2.7 h 15.8 z"
|
||||
id="path31" />
|
||||
<path
|
||||
class="st3"
|
||||
d="m 0.5,-15.8 h 6.2 c 5,0 8.4,3.4 8.4,7.7 0,4.4 -3.4,7.9 -8.4,7.9 L 0.5,0 Z m 3.5,3.2 v 9.5 h 2.7 c 2.8,0 4.8,-1.9 4.8,-4.6 0,-2.8 -1.9,-4.7 -4.8,-4.7 z"
|
||||
id="path33" />
|
||||
<path
|
||||
class="st3"
|
||||
d="m -15.7,-15.8 h 7.2 c 2,0 3.5,0.6 4.6,1.6 0.9,0.9 1.3,2.1 1.3,3.6 v 0.1 c 0,1.3 -0.3,2.3 -0.9,3.1 -0.6,0.8 -1.4,1.4 -2.4,1.8 L -2,0 h -4.1 l -3.3,-4.8 h -2.9 V 0 h -3.5 z m 7,7.7 c 0.8,0 1.5,-0.2 2,-0.6 0.5,-0.4 0.7,-1 0.7,-1.6 v -0.1 c 0,-0.8 -0.2,-1.3 -0.7,-1.7 -0.5,-0.3 -1.1,-0.6 -2,-0.6 h -3.4 v 4.5 h 3.4 z"
|
||||
id="path35" />
|
||||
</symbol>
|
||||
<use
|
||||
xlink:href="#rider"
|
||||
width="70"
|
||||
height="70"
|
||||
x="-35"
|
||||
y="-35"
|
||||
transform="matrix(7.0682519,0,0,7.2481031,256,256)"
|
||||
style="overflow:visible"
|
||||
id="use38" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.9 KiB |
43
addons/rider-plugin/icons/icon.svg.import
Normal file
43
addons/rider-plugin/icons/icon.svg.import
Normal file
@@ -0,0 +1,43 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://wrdrj6wednn8"
|
||||
path="res://.godot/imported/icon.svg-45c914cff7482ba9564963fe65b548e4.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/rider-plugin/icons/icon.svg"
|
||||
dest_files=["res://.godot/imported/icon.svg-45c914cff7482ba9564963fe65b548e4.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
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/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
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
|
||||
svg/scale=1.0
|
||||
editor/scale_with_editor_scale=false
|
||||
editor/convert_colors_with_editor_theme=false
|
||||
12
addons/rider-plugin/plugin.cfg
Normal file
12
addons/rider-plugin/plugin.cfg
Normal file
@@ -0,0 +1,12 @@
|
||||
[plugin]
|
||||
|
||||
name="JetBrains Rider External Editor"
|
||||
description="Provides a toolbar toggle, to switch a set of settings on and off. Default set of settings helps to enable/disable the following settings recommended by the Rider documentation https://www.jetbrains.com/help/rider/Godot.html#optimize-godot-editor-for-rider"
|
||||
author="JetBrains"
|
||||
version="1.0.0"
|
||||
script="rider-plugin.gd"
|
||||
|
||||
[presets]
|
||||
|
||||
active="on"
|
||||
presets="presets.json"
|
||||
15
addons/rider-plugin/presets.json
Normal file
15
addons/rider-plugin/presets.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"on": {
|
||||
"text_editor/external/use_external_editor": true,
|
||||
"interface/editor/import_resources_when_unfocused": true,
|
||||
"interface/editor/save_on_focus_loss": true,
|
||||
"text_editor/behavior/files/auto_reload_scripts_on_external_change": true,
|
||||
"run/window_placement/game_embed_mode": -1
|
||||
},
|
||||
"off": {
|
||||
"text_editor/external/use_external_editor": false,
|
||||
"interface/editor/import_resources_when_unfocused": false,
|
||||
"interface/editor/save_on_focus_loss": false,
|
||||
"text_editor/behavior/files/auto_reload_scripts_on_external_change": false
|
||||
}
|
||||
}
|
||||
66
addons/rider-plugin/rider-plugin.gd
Normal file
66
addons/rider-plugin/rider-plugin.gd
Normal file
@@ -0,0 +1,66 @@
|
||||
@tool
|
||||
extends EditorPlugin
|
||||
|
||||
var editor_settings: EditorSettings
|
||||
var checkbutton: CheckButton
|
||||
var _preset_applier: PresetApplier
|
||||
var _settings_service: EditorSettingsService
|
||||
var _locator_service: RiderLocatorService
|
||||
var _plugin_cfg_path: String
|
||||
var _presets_json_path: String
|
||||
|
||||
func _enter_tree() -> void:
|
||||
editor_settings = EditorInterface.get_editor_settings()
|
||||
var script_path := (get_script() as Script).resource_path
|
||||
var plugin_dir := script_path.get_base_dir()
|
||||
_plugin_cfg_path = plugin_dir + "/plugin.cfg"
|
||||
var cfg := ConfigFile.new()
|
||||
var err := cfg.load(_plugin_cfg_path)
|
||||
if err != OK:
|
||||
push_warning("Failed to load plugin.cfg: %s" % [err])
|
||||
return
|
||||
var active_str := str(cfg.get_value("presets", "active", "on"))
|
||||
var is_active := active_str == "on"
|
||||
var presets_rel_path := str(cfg.get_value("presets", "presets", "presets.json"))
|
||||
_presets_json_path = plugin_dir + "/" + presets_rel_path
|
||||
|
||||
# Build UI
|
||||
checkbutton = CheckButton.new()
|
||||
checkbutton.text = "Use Rider"
|
||||
checkbutton.tooltip_text = "Shortcut for setting recommended settings"
|
||||
checkbutton.button_pressed = is_active
|
||||
checkbutton.pressed.connect(_on_checkbutton_pressed)
|
||||
add_control_to_container(EditorPlugin.CONTAINER_TOOLBAR, checkbutton)
|
||||
|
||||
# Initialize services and panel
|
||||
_settings_service = EditorSettingsService.new()
|
||||
_locator_service = RiderLocatorService.new()
|
||||
_preset_applier = PresetApplier.new(_presets_json_path)
|
||||
|
||||
_locator_service.add_selector_in_editor_interface(_settings_service)
|
||||
|
||||
# Ensure settings reflect current state on startup
|
||||
_preset_applier.apply_preset(editor_settings, is_active)
|
||||
|
||||
func _on_checkbutton_pressed() -> void:
|
||||
var cfg := ConfigFile.new()
|
||||
if cfg.load(_plugin_cfg_path) != OK:
|
||||
push_warning("Failed to load plugin.cfg to update state")
|
||||
return
|
||||
var is_active := checkbutton.button_pressed
|
||||
var key := _preset_applier.get_preset_key(is_active)
|
||||
cfg.set_value("presets", "active", key)
|
||||
var save_err := cfg.save(_plugin_cfg_path)
|
||||
if save_err != OK:
|
||||
push_warning("Failed to save plugin.cfg: %s" % [save_err])
|
||||
# Apply selected preset to editor settings
|
||||
_preset_applier.apply_preset(editor_settings, is_active)
|
||||
|
||||
func _exit_tree() -> void:
|
||||
if checkbutton != null:
|
||||
remove_control_from_container(EditorPlugin.CONTAINER_TOOLBAR, checkbutton)
|
||||
checkbutton.queue_free()
|
||||
|
||||
var args = OS.get_cmdline_args()
|
||||
if "--rider-addon-tests" in args:
|
||||
print("==== rider-addon-tests finished ====")
|
||||
1
addons/rider-plugin/rider-plugin.gd.uid
Normal file
1
addons/rider-plugin/rider-plugin.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://c1x58xm2w1n20
|
||||
BIN
addons/rider-plugin/screenshots/Toolbar.png
(Stored with Git LFS)
Normal file
BIN
addons/rider-plugin/screenshots/Toolbar.png
(Stored with Git LFS)
Normal file
Binary file not shown.
40
addons/rider-plugin/screenshots/Toolbar.png.import
Normal file
40
addons/rider-plugin/screenshots/Toolbar.png.import
Normal file
@@ -0,0 +1,40 @@
|
||||
[remap]
|
||||
|
||||
importer="texture"
|
||||
type="CompressedTexture2D"
|
||||
uid="uid://cypcl8lffxy6r"
|
||||
path="res://.godot/imported/Toolbar.png-a521e2493bd3c08a829245b3129bb58f.ctex"
|
||||
metadata={
|
||||
"vram_texture": false
|
||||
}
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://addons/rider-plugin/screenshots/Toolbar.png"
|
||||
dest_files=["res://.godot/imported/Toolbar.png-a521e2493bd3c08a829245b3129bb58f.ctex"]
|
||||
|
||||
[params]
|
||||
|
||||
compress/mode=0
|
||||
compress/high_quality=false
|
||||
compress/lossy_quality=0.7
|
||||
compress/uastc_level=0
|
||||
compress/rdo_quality_loss=0.0
|
||||
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/channel_remap/red=0
|
||||
process/channel_remap/green=1
|
||||
process/channel_remap/blue=2
|
||||
process/channel_remap/alpha=3
|
||||
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
|
||||
23
addons/rider-plugin/scripts/json_utils.gd
Normal file
23
addons/rider-plugin/scripts/json_utils.gd
Normal file
@@ -0,0 +1,23 @@
|
||||
@tool
|
||||
## Simple JSON helpers for editor/runtime use.
|
||||
## Keeps file and JSON parsing concerns out of feature code.
|
||||
class_name JsonUtils
|
||||
|
||||
static func load_from_file(path: String) -> Variant:
|
||||
# Returns parsed JSON value (Dictionary/Array/etc.) or null on error.
|
||||
var file := FileAccess.open(path, FileAccess.READ)
|
||||
if file == null:
|
||||
push_warning("JsonUtils: Failed to open file: %s" % path)
|
||||
return null
|
||||
var text := file.get_as_text()
|
||||
file.close()
|
||||
var data: Variant = JSON.parse_string(text)
|
||||
if data == null:
|
||||
push_warning("JsonUtils: Invalid JSON in file: %s" % path)
|
||||
return null
|
||||
return data
|
||||
|
||||
static func load_dict_from_file(path: String) -> Dictionary:
|
||||
# Returns Dictionary or empty {} on error.
|
||||
var data := load_from_file(path) as Dictionary
|
||||
return data
|
||||
1
addons/rider-plugin/scripts/json_utils.gd.uid
Normal file
1
addons/rider-plugin/scripts/json_utils.gd.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bci4kmk7h4j6a
|
||||
112
addons/rider-plugin/scripts/locator/rider_locator_service.gd
Normal file
112
addons/rider-plugin/scripts/locator/rider_locator_service.gd
Normal file
@@ -0,0 +1,112 @@
|
||||
@tool
|
||||
extends RefCounted
|
||||
class_name RiderLocatorService
|
||||
|
||||
var _installations_found: Array = []
|
||||
var _thread: Thread = null
|
||||
|
||||
func get_installations() -> Array:
|
||||
var result: Array = RiderLocator.new().get_installations() # from the gdextension
|
||||
return result
|
||||
|
||||
# todo
|
||||
func fix_external_editor_if_supplied_in_commandline(_settings_service: EditorSettingsService, editor_settings: EditorSettings) -> bool:
|
||||
# When Godot is started from Rider (or vice versa), we may receive the Rider path
|
||||
# via command-line so we can keep Godot's external editor setting in sync.
|
||||
# Supported form (only this one):
|
||||
# --my_rider_path="/absolute/path/to/rider with possible spaces"
|
||||
var args : Array = OS.get_cmdline_args()
|
||||
var provided_rider_path := ""
|
||||
for a_raw in args:
|
||||
var a: String = str(a_raw)
|
||||
if a.begins_with("--my_rider_path="):
|
||||
provided_rider_path = a.substr("--my_rider_path=".length())
|
||||
break
|
||||
|
||||
if provided_rider_path.is_empty():
|
||||
return false
|
||||
|
||||
provided_rider_path = trim_quotes(provided_rider_path)
|
||||
|
||||
# Validate existence (file or dir)
|
||||
var looks_existing := FileAccess.file_exists(provided_rider_path) || DirAccess.dir_exists_absolute(provided_rider_path)
|
||||
if looks_existing:
|
||||
_settings_service.set_external_editor_path(editor_settings, provided_rider_path)
|
||||
print("Rider path provided via CLI (my_rider_path): ", provided_rider_path)
|
||||
return true
|
||||
else:
|
||||
push_warning("my_rider_path was provided but does not exist: %s" % [provided_rider_path])
|
||||
return false
|
||||
|
||||
func trim_quotes(s: String) -> String:
|
||||
if s.begins_with('"') and s.ends_with('"') and s.length() >= 2:
|
||||
return s.substr(1, s.length() - 2)
|
||||
return s
|
||||
|
||||
|
||||
func add_selector_in_editor_interface(_settings_service: EditorSettingsService):
|
||||
_update_selector(_installations_found)
|
||||
|
||||
if _installations_found.is_empty() and _thread == null:
|
||||
_thread = Thread.new()
|
||||
_thread.start(_load_installations)
|
||||
|
||||
func _load_installations() -> void:
|
||||
var array: Array = get_installations()
|
||||
call_deferred("_on_installations_loaded", array)
|
||||
|
||||
func _on_installations_loaded(array: Array):
|
||||
_installations_found = array
|
||||
if _thread:
|
||||
_thread.wait_to_finish()
|
||||
_thread = null
|
||||
_update_selector(_installations_found)
|
||||
|
||||
func _notification(what: int) -> void:
|
||||
if what == NOTIFICATION_PREDELETE and _thread != null:
|
||||
_thread.wait_to_finish()
|
||||
|
||||
func _update_selector(array: Array):
|
||||
var name := "text_editor/external/editor"
|
||||
var settings := EditorInterface.get_editor_settings()
|
||||
|
||||
if !(settings.has_setting(name)):
|
||||
settings.set(name, 0)
|
||||
|
||||
var installations: Array = ["Custom"]
|
||||
for element in array:
|
||||
var display_name: String = element.get("display", "")
|
||||
# Replace special characters that break PROPERTY_HINT_ENUM format
|
||||
# Comma is the enum delimiter, colon is used for explicit value assignment
|
||||
display_name = display_name.replace(",", " •").replace(":", " -")
|
||||
installations.append(display_name)
|
||||
var options :String = ",".join(installations)
|
||||
|
||||
settings.add_property_info({
|
||||
"name": name,
|
||||
"type":TYPE_INT,
|
||||
"hint":PROPERTY_HINT_ENUM,
|
||||
"hint_string": options
|
||||
})
|
||||
|
||||
# Connect to settings changes to update external editor path when selection changes
|
||||
if not settings.settings_changed.is_connected(_on_selection_changed):
|
||||
settings.settings_changed.connect(_on_selection_changed.bind())
|
||||
|
||||
func _on_selection_changed() -> void:
|
||||
var name := "text_editor/external/editor"
|
||||
var settings := EditorInterface.get_editor_settings()
|
||||
var selected_index: int = settings.get_setting(name)
|
||||
|
||||
# Index 0 is "Custom", so user manages the path manually
|
||||
if selected_index == 0:
|
||||
return
|
||||
|
||||
# Map to actual installation (offset by 1 because of "Custom" at index 0)
|
||||
var installation_index := selected_index - 1
|
||||
var installations_array = _installations_found
|
||||
if installation_index >= 0 and installation_index < installations_array.size():
|
||||
var installation = installations_array[installation_index]
|
||||
var new_path: String = installation.get("path", "")
|
||||
if not new_path.is_empty():
|
||||
EditorSettingsService.new().set_external_editor_path(settings, new_path)
|
||||
@@ -0,0 +1 @@
|
||||
uid://cfsu1rbg0ypem
|
||||
35
addons/rider-plugin/scripts/presets/preset_applier.gd
Normal file
35
addons/rider-plugin/scripts/presets/preset_applier.gd
Normal file
@@ -0,0 +1,35 @@
|
||||
@tool
|
||||
extends RefCounted
|
||||
class_name PresetApplier
|
||||
|
||||
var presets_path: String
|
||||
|
||||
func _init(p_path: String) -> void:
|
||||
presets_path = p_path
|
||||
|
||||
func get_preset_key(is_active: bool) -> String:
|
||||
return "on" if is_active else "off"
|
||||
|
||||
func apply_preset(editor_settings: EditorSettings, is_active: bool) -> void:
|
||||
var data: Dictionary = JsonUtils.load_dict_from_file(presets_path)
|
||||
if data.is_empty():
|
||||
push_warning("Failed to load presets: %s" % presets_path)
|
||||
return
|
||||
|
||||
var new_preset_key := get_preset_key(is_active)
|
||||
var previous_preset_key := get_preset_key(not is_active)
|
||||
|
||||
if not data.has(new_preset_key):
|
||||
push_warning("Preset '%s' not found in presets.json" % new_preset_key)
|
||||
return
|
||||
|
||||
var new_preset := data[new_preset_key] as Dictionary
|
||||
# Reset keys from previous preset that are missing in the new preset
|
||||
if data.has(previous_preset_key):
|
||||
var previous_preset := data[previous_preset_key] as Dictionary
|
||||
for key in previous_preset:
|
||||
if not new_preset.has(key):
|
||||
editor_settings.set_setting(str(key), editor_settings.property_get_revert(str(key)))
|
||||
# Apply the new preset
|
||||
for key in new_preset:
|
||||
editor_settings.set_setting(str(key), new_preset[key])
|
||||
@@ -0,0 +1 @@
|
||||
uid://bjiaycxso8h8u
|
||||
@@ -0,0 +1,17 @@
|
||||
@tool
|
||||
extends RefCounted
|
||||
class_name EditorSettingsService
|
||||
|
||||
func set_external_editor_path(editor_settings: EditorSettings, path: String) -> void:
|
||||
editor_settings.set_setting("text_editor/external/exec_path", path)
|
||||
|
||||
func has_valid_external_editor_path(editor_settings: EditorSettings) -> bool:
|
||||
var has_setting: bool = editor_settings.has_setting("text_editor/external/exec_path")
|
||||
if not has_setting:
|
||||
return false
|
||||
var path : String = editor_settings.get_setting("text_editor/external/exec_path")
|
||||
var exists := not path.is_empty() && (FileAccess.file_exists(path) || DirAccess.dir_exists_absolute(path))
|
||||
return exists
|
||||
|
||||
func set_use_external_editor(editor_settings: EditorSettings, enabled: bool) -> void:
|
||||
editor_settings.set_setting("text_editor/external/use_external_editor", enabled)
|
||||
@@ -0,0 +1 @@
|
||||
uid://bdiu78ot0rrkc
|
||||
42
forge/abilities/ForgeEffectApplicationBehavior.cs
Normal file
42
forge/abilities/ForgeEffectApplicationBehavior.cs
Normal file
@@ -0,0 +1,42 @@
|
||||
using Gamesmiths.Forge.Abilities;
|
||||
using Gamesmiths.Forge.Core;
|
||||
using Gamesmiths.Forge.Effects;
|
||||
using Gamesmiths.Forge.Godot.Resources;
|
||||
using Gamesmiths.Forge.Godot.Resources.Abilities;
|
||||
using Godot;
|
||||
|
||||
namespace Movementtests.forge.abilities;
|
||||
|
||||
|
||||
public class EffectApplicationBehavior(EffectData effectData) : IAbilityBehavior
|
||||
{
|
||||
private ActiveEffectHandle? _effectHandle;
|
||||
public void OnStarted(AbilityBehaviorContext context)
|
||||
{
|
||||
GD.Print("This is applying the periodic effect to the flying weapon");
|
||||
_effectHandle = context.Owner.EffectsManager.ApplyEffect(new Effect(effectData, new EffectOwnership(context.Owner, context.Owner)));
|
||||
context.AbilityHandle.CommitAbility();
|
||||
}
|
||||
|
||||
public void OnEnded(AbilityBehaviorContext context)
|
||||
{
|
||||
GD.Print("This is removing the periodic effect from the flying weapon");
|
||||
if (_effectHandle is not null)
|
||||
context.Owner.EffectsManager.RemoveEffect(_effectHandle);
|
||||
context.InstanceHandle.End();
|
||||
}
|
||||
}
|
||||
|
||||
[Tool]
|
||||
[GlobalClass]
|
||||
public partial class ForgeEffectApplicationBehavior : ForgeAbilityBehavior
|
||||
{
|
||||
[Export] public ForgeEffectData? EffectData { get; set; }
|
||||
|
||||
public override IAbilityBehavior GetBehavior()
|
||||
{
|
||||
if (EffectData == null)
|
||||
throw new System.ArgumentException("EffectData is null");
|
||||
return new EffectApplicationBehavior(EffectData.GetEffectData());
|
||||
}
|
||||
}
|
||||
1
forge/abilities/ForgeEffectApplicationBehavior.cs.uid
Normal file
1
forge/abilities/ForgeEffectApplicationBehavior.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://cl5hudinl1rex
|
||||
59
forge/abilities/ForgeExplodingSwordBehavior.cs
Normal file
59
forge/abilities/ForgeExplodingSwordBehavior.cs
Normal file
@@ -0,0 +1,59 @@
|
||||
using Gamesmiths.Forge.Abilities;
|
||||
using Gamesmiths.Forge.Core;
|
||||
using Gamesmiths.Forge.Godot.Nodes;
|
||||
using Gamesmiths.Forge.Godot.Resources.Abilities;
|
||||
using Godot;
|
||||
|
||||
namespace Movementtests.forge.abilities;
|
||||
|
||||
public class ExplodingSwordBehavior(PackedScene explosion) : IAbilityBehavior
|
||||
{
|
||||
public void OnStarted(AbilityBehaviorContext context)
|
||||
{
|
||||
if (context.Owner is not Node3D owner)
|
||||
{
|
||||
context.InstanceHandle.End();
|
||||
return;
|
||||
}
|
||||
|
||||
if (explosion.Instantiate() is not Explosion explosion1)
|
||||
{
|
||||
GD.Print("Cannot instantiate");
|
||||
context.InstanceHandle.End();
|
||||
return;
|
||||
}
|
||||
if (!owner.IsInsideTree())
|
||||
{
|
||||
GD.Print("Not inside tree");
|
||||
context.InstanceHandle.End();
|
||||
return;
|
||||
}
|
||||
|
||||
GD.Print("EXPLOSION");
|
||||
|
||||
explosion1.Radius = 6f;
|
||||
|
||||
owner.GetTree().GetRoot().CallDeferred(Node.MethodName.AddChild, explosion1);
|
||||
explosion1.CallDeferred(Node3D.MethodName.SetGlobalPosition, owner.GlobalPosition);
|
||||
|
||||
context.AbilityHandle.CommitAbility();
|
||||
context.InstanceHandle.End();
|
||||
}
|
||||
|
||||
public void OnEnded(AbilityBehaviorContext context)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
[Tool]
|
||||
[GlobalClass]
|
||||
public partial class ForgeExplodingSwordBehavior : ForgeAbilityBehavior
|
||||
{
|
||||
[Export] public PackedScene? Explosion { get; set; }
|
||||
public override IAbilityBehavior GetBehavior()
|
||||
{
|
||||
if (Explosion == null)
|
||||
throw new System.ArgumentException("Explosion is null");
|
||||
return new ExplodingSwordBehavior(Explosion);
|
||||
}
|
||||
}
|
||||
1
forge/abilities/ForgeExplodingSwordBehavior.cs.uid
Normal file
1
forge/abilities/ForgeExplodingSwordBehavior.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://bnee6amtc2bhj
|
||||
23
forge/abilities/ForgeInstantEndBehavior.cs
Normal file
23
forge/abilities/ForgeInstantEndBehavior.cs
Normal file
@@ -0,0 +1,23 @@
|
||||
using Gamesmiths.Forge.Abilities;
|
||||
using Gamesmiths.Forge.Godot.Resources.Abilities;
|
||||
using Godot;
|
||||
|
||||
namespace Movementtests.forge.abilities;
|
||||
|
||||
public class InstantEndBehavior : IAbilityBehavior
|
||||
{
|
||||
public void OnStarted(AbilityBehaviorContext context)
|
||||
{
|
||||
context.AbilityHandle.CommitAbility();
|
||||
context.InstanceHandle.End();
|
||||
}
|
||||
|
||||
public void OnEnded(AbilityBehaviorContext context) {}
|
||||
}
|
||||
|
||||
[Tool]
|
||||
[GlobalClass]
|
||||
public partial class ForgeInstantEndBehavior : ForgeAbilityBehavior
|
||||
{
|
||||
public override IAbilityBehavior GetBehavior() => new InstantEndBehavior();
|
||||
}
|
||||
1
forge/abilities/ForgeInstantEndBehavior.cs.uid
Normal file
1
forge/abilities/ForgeInstantEndBehavior.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://c7s5v7ii4nujg
|
||||
48
forge/calculators/ForgeRaiseEventTagExecution.cs
Normal file
48
forge/calculators/ForgeRaiseEventTagExecution.cs
Normal file
@@ -0,0 +1,48 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Gamesmiths.Forge.Attributes;
|
||||
using Gamesmiths.Forge.Core;
|
||||
using Gamesmiths.Forge.Effects;
|
||||
using Gamesmiths.Forge.Effects.Calculator;
|
||||
using Gamesmiths.Forge.Effects.Magnitudes;
|
||||
using Gamesmiths.Forge.Effects.Modifiers;
|
||||
using Gamesmiths.Forge.Events;
|
||||
using Gamesmiths.Forge.Godot.Resources;
|
||||
using Gamesmiths.Forge.Godot.Resources.Calculators;
|
||||
using Gamesmiths.Forge.Tags;
|
||||
using Godot;
|
||||
using Movementtests.systems;
|
||||
|
||||
namespace Movementtests.tools.calculators;
|
||||
|
||||
|
||||
public class FlyingWeaponExecution(TagContainer eventTags) : CustomExecution
|
||||
{
|
||||
public override ModifierEvaluatedData[] EvaluateExecution(Effect effect, IForgeEntity target, EffectEvaluatedData? effectEvaluatedData)
|
||||
{
|
||||
GD.Print("Custom execution executed");
|
||||
var owner = effect.Ownership.Owner;
|
||||
if (owner == null) return [];
|
||||
|
||||
owner.Events.Raise(new EventData
|
||||
{
|
||||
EventTags = eventTags,
|
||||
Source = owner,
|
||||
EventMagnitude = 12f
|
||||
});
|
||||
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
[GlobalClass]
|
||||
public partial class ForgeRaiseEventTagExecution : ForgeCustomExecution
|
||||
{
|
||||
[Export] ForgeTagContainer EventTags { get; set; } = new();
|
||||
|
||||
public override CustomExecution GetExecutionClass()
|
||||
{
|
||||
return new FlyingWeaponExecution(EventTags.GetTagContainer());
|
||||
}
|
||||
}
|
||||
1
forge/calculators/ForgeRaiseEventTagExecution.cs.uid
Normal file
1
forge/calculators/ForgeRaiseEventTagExecution.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://br7ut4lbau66w
|
||||
7
forge/forge_data.tres
Normal file
7
forge/forge_data.tres
Normal file
@@ -0,0 +1,7 @@
|
||||
[gd_resource type="Resource" format=3 uid="uid://dugyoyn4fda3s"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://bq4vlbfx00hea" path="res://addons/forge/core/ForgeData.cs" id="1_l686n"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_l686n")
|
||||
RegisteredTags = Array[String](["effect.fire", "effect.wet", "cue.floating.text", "cue.vfx.fire", "cue.vfx.wet", "cue.vfx.regen", "cooldown.enemy.attack", "set_by_caller.damage", "event.damage", "cooldown", "cooldown.skill.projectile", "cooldown.skill.shield", "cooldown.skill.dash", "movement.block", "immunity.damage", "effect.mana_shield", "cue.vfx.shield", "event", "event.player.empowered_action_used", "event.damage.taken", "event.damage.dealt", "set_by_caller", "trait.flammable", "trait.healable", "trait.damageable", "trait.wettable", "cue.vfx.reflect", "cue.vfx", "cooldown.skill", "cooldown.skill.reflect"])
|
||||
12
interfaces/IAbilityBase.cs
Normal file
12
interfaces/IAbilityBase.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
using Gamesmiths.Forge.Abilities;
|
||||
using Gamesmiths.Forge.Effects;
|
||||
using Gamesmiths.Forge.Tags;
|
||||
using Godot;
|
||||
|
||||
namespace Movementtests.interfaces;
|
||||
|
||||
public interface IAbilityBase<TCreation, TPayload>
|
||||
{
|
||||
AbilityData Ability(TCreation creationData, TagContainer? tags);
|
||||
IAbilityBehavior<TPayload> Behavior(TCreation creationData);
|
||||
}
|
||||
1
interfaces/IAbilityBase.cs.uid
Normal file
1
interfaces/IAbilityBase.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://de881c2xsbutk
|
||||
@@ -15,8 +15,8 @@
|
||||
[ext_resource type="PackedScene" uid="uid://qup00a7x2sji" path="res://scenes/fixed_dash_target/fixed_dashthrough_target.tscn" id="13_iq67o"]
|
||||
[ext_resource type="PackedScene" uid="uid://b8aet6m4m2i83" path="res://scenes/tuto_trigger/TutoTrigger.tscn" id="14_lthgu"]
|
||||
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_jk7w8"]
|
||||
size = Vector3(6.75, 8.25, 7.25)
|
||||
[sub_resource type="BoxShape3D" id="BoxShape3D_lthgu"]
|
||||
size = Vector3(7.5, 3.75, 10.25)
|
||||
|
||||
[node name="Main" unique_id=955321579 instance=ExtResource("1_k7f42")]
|
||||
|
||||
@@ -105,13 +105,12 @@ transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 27, 13.5, -9)
|
||||
[node name="FixedDashthroughTarget3" parent="Targets" index="9" unique_id=1106453232 instance=ExtResource("13_iq67o")]
|
||||
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 43, 6, -8.5)
|
||||
|
||||
[node name="Player" parent="." index="14" unique_id=1309399929]
|
||||
transform = Transform3D(0.99999994, 0, 0, 0, 1, 0, 0, 0, 0.99999994, 3, 0, 0)
|
||||
|
||||
[node name="TutoTrigger10" parent="." index="18" unique_id=840713937 instance=ExtResource("14_lthgu")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.75, 0, 3)
|
||||
[node name="TutoTrigger5" parent="." index="14" unique_id=840713937 instance=ExtResource("14_lthgu")]
|
||||
tuto_text = "Try to survive!"
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="TutoTrigger10" index="1" unique_id=2145030859]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.875, 1.125, -4.625)
|
||||
shape = SubResource("BoxShape3D_jk7w8")
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="TutoTrigger5" index="1" unique_id=1820790391]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 4, 0.625, -1.875)
|
||||
shape = SubResource("BoxShape3D_lthgu")
|
||||
|
||||
[node name="Player" parent="." index="15" unique_id=1309399929]
|
||||
transform = Transform3D(0.99999994, 0, 0, 0, 1, 0, 0, 0, 0.99999994, 3, 0, 0)
|
||||
|
||||
@@ -30,7 +30,6 @@ Shaker="*uid://c7flmumgr5w3u"
|
||||
CsgToolkitAutoload="*uid://w8ad8q4lneis"
|
||||
"Forge Bootstrap"="*uid://ba8fquhtwu5mu"
|
||||
GlobalHelpers="*uid://dqcm83o8e66a2"
|
||||
ForgeManager="*uid://c75tpswl62eew"
|
||||
|
||||
[display]
|
||||
|
||||
@@ -47,7 +46,7 @@ movie_writer/movie_file="D:/Godot/Projects/movement-tests/communication/movie.av
|
||||
|
||||
[editor_plugins]
|
||||
|
||||
enabled=PackedStringArray("res://addons/csg_toolkit/plugin.cfg", "res://addons/forge/plugin.cfg", "res://addons/gdUnit4/plugin.cfg", "res://addons/godot_state_charts/plugin.cfg", "res://addons/guide/plugin.cfg", "res://addons/maaacks_game_template/plugin.cfg", "res://addons/shaker/plugin.cfg")
|
||||
enabled=PackedStringArray("res://addons/csg_toolkit/plugin.cfg", "res://addons/forge/plugin.cfg", "res://addons/gdUnit4/plugin.cfg", "res://addons/godot_state_charts/plugin.cfg", "res://addons/guide/plugin.cfg", "res://addons/maaacks_game_template/plugin.cfg", "res://addons/rider-plugin/plugin.cfg", "res://addons/shaker/plugin.cfg")
|
||||
|
||||
[gui]
|
||||
|
||||
|
||||
@@ -3,14 +3,10 @@ using System;
|
||||
using Movementtests.interfaces;
|
||||
|
||||
[GlobalClass, Icon("res://assets/ui/IconGodotNode/white/icon_heart.png")]
|
||||
public partial class RHealth : Resource
|
||||
public partial class RHealth(float startingHealth) : Resource
|
||||
{
|
||||
[Export]
|
||||
public float StartingHealth { get; set;}
|
||||
public float StartingHealth { get; set;} = startingHealth;
|
||||
|
||||
public RHealth() : this(100.0f) {}
|
||||
public RHealth(float startingHealth)
|
||||
{
|
||||
StartingHealth = startingHealth;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,16 @@
|
||||
using System;
|
||||
using Gamesmiths.Forge.Core;
|
||||
using Gamesmiths.Forge.Effects;
|
||||
using Gamesmiths.Forge.Events;
|
||||
using Gamesmiths.Forge.Godot.Core;
|
||||
using Gamesmiths.Forge.Godot.Nodes;
|
||||
using Gamesmiths.Forge.Tags;
|
||||
using Godot;
|
||||
using Movementtests.interfaces;
|
||||
using Movementtests.scenes.enemies;
|
||||
using Movementtests.scenes.player_controller.scripts;
|
||||
using Movementtests.systems;
|
||||
using Movementtests.tools;
|
||||
|
||||
[GlobalClass, Icon("res://assets/ui/IconGodotNode/node_3D/icon_beetle.png")]
|
||||
public partial class Enemy : CharacterBody3D,
|
||||
@@ -13,7 +22,8 @@ public partial class Enemy : CharacterBody3D,
|
||||
ISpawnable,
|
||||
IKnockbackable,
|
||||
ITargetable,
|
||||
IStunnable
|
||||
IStunnable,
|
||||
IForgeEntity
|
||||
{
|
||||
// Signals and events
|
||||
public event Action<IDamageable, DamageRecord> DamageTaken = null!;
|
||||
@@ -55,10 +65,38 @@ public partial class Enemy : CharacterBody3D,
|
||||
set => CHealth.CurrentHealth = value;
|
||||
}
|
||||
|
||||
// Perfectly forward the IForgeEntity interface to the ForgeEntity component
|
||||
public EntityAttributes Attributes
|
||||
{
|
||||
get => _forgeEntity.Attributes;
|
||||
set => _forgeEntity.Attributes = value;
|
||||
}
|
||||
public EntityTags Tags
|
||||
{
|
||||
get => _forgeEntity.Tags;
|
||||
set => _forgeEntity.Tags = value;
|
||||
}
|
||||
public EffectsManager EffectsManager
|
||||
{
|
||||
get => _forgeEntity.EffectsManager;
|
||||
set => _forgeEntity.EffectsManager = value;
|
||||
}
|
||||
public EntityAbilities Abilities
|
||||
{
|
||||
get => _forgeEntity.Abilities;
|
||||
set => _forgeEntity.Abilities = value;
|
||||
}
|
||||
public EventManager Events
|
||||
{
|
||||
get => _forgeEntity.Events;
|
||||
set => _forgeEntity.Events = value;
|
||||
}
|
||||
|
||||
// Private stuff
|
||||
private Area3D _damageBox = null!;
|
||||
internal Node3D _target = null!;
|
||||
private Healthbar _healthbar = null!;
|
||||
private ForgeEntity _forgeEntity;
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
@@ -70,6 +108,7 @@ public partial class Enemy : CharacterBody3D,
|
||||
{
|
||||
_damageBox = GetNode<Area3D>("DamageBox");
|
||||
_target = GetNode<Node3D>("CTarget");
|
||||
_forgeEntity = GetNode<ForgeEntity>("ForgeEntity");
|
||||
|
||||
CDamageable = (GetNode<Node>("CDamageable") as IDamageable)!;
|
||||
CMovement = (GetNode<Node>("CMovement") as IMoveable)!;
|
||||
|
||||
16
scenes/enemies/EnemyAttributeSet.cs
Normal file
16
scenes/enemies/EnemyAttributeSet.cs
Normal file
@@ -0,0 +1,16 @@
|
||||
using Gamesmiths.Forge.Attributes;
|
||||
namespace Movementtests.scenes.enemies;
|
||||
|
||||
public class EnemyAttributeSet : AttributeSet
|
||||
{
|
||||
public EntityAttribute Health { get; }
|
||||
public EntityAttribute Strength { get; }
|
||||
public EntityAttribute Speed { get; }
|
||||
|
||||
public EnemyAttributeSet()
|
||||
{
|
||||
Health = InitializeAttribute(nameof(Health), 100, 0, 150);
|
||||
Strength = InitializeAttribute(nameof(Strength), 10, 0, 99);
|
||||
Speed = InitializeAttribute(nameof(Speed), 5, 0, 10);
|
||||
}
|
||||
}
|
||||
1
scenes/enemies/EnemyAttributeSet.cs.uid
Normal file
1
scenes/enemies/EnemyAttributeSet.cs.uid
Normal file
@@ -0,0 +1 @@
|
||||
uid://nqxdkkg3l7go
|
||||
@@ -6,14 +6,34 @@
|
||||
[ext_resource type="Resource" uid="uid://dgo65k2ceqfvy" path="res://scenes/enemies/flying_enemy/flying_enemy_damage.tres" id="2_on7rt"]
|
||||
[ext_resource type="Resource" uid="uid://bwqjaom4k7rc3" path="res://scenes/enemies/flying_enemy/flying_enemy_movement.tres" id="4_dejyg"]
|
||||
[ext_resource type="Script" uid="uid://bjwrpv3jpsc1e" path="res://scenes/components/health/CHealth.cs" id="4_ys4jv"]
|
||||
[ext_resource type="Script" uid="uid://8uj04dfe8oql" path="res://addons/forge/nodes/ForgeEntity.cs" id="6_wxisp"]
|
||||
[ext_resource type="Script" uid="uid://cxihb42t2mfqi" path="res://addons/forge/nodes/ForgeAttributeSet.cs" id="7_2digf"]
|
||||
[ext_resource type="PackedScene" uid="uid://dmw5ibwrb483f" path="res://scenes/components/movement/CFlyingMovement.tscn" id="7_vaeds"]
|
||||
[ext_resource type="PackedScene" uid="uid://bwx2um43k0ou4" path="res://scenes/components/health/CHealthbar.tscn" id="7_ykkxn"]
|
||||
[ext_resource type="Script" uid="uid://ccovd5i0wr3kk" path="res://addons/forge/editor/attributes/AttributeValues.cs" id="8_46wn3"]
|
||||
[ext_resource type="Script" uid="uid://dtpxijlnb2c5" path="res://scenes/components/movement/RMovement.cs" id="8_on7rt"]
|
||||
[ext_resource type="Script" uid="uid://b0u23nkpaimyc" path="res://scenes/components/damage/CDamageable.cs" id="8_uotso"]
|
||||
[ext_resource type="PackedScene" uid="uid://bctpe34ddamg5" path="res://scenes/components/knockback/CKnockback.tscn" id="10_dejyg"]
|
||||
[ext_resource type="Resource" uid="uid://dt7a1io5o0b8s" path="res://scenes/enemies/flying_enemy/flying_enemy_knockback.tres" id="11_mpa2u"]
|
||||
|
||||
[sub_resource type="ViewportTexture" id="ViewportTexture_ykkxn"]
|
||||
[sub_resource type="Resource" id="Resource_oj1ws"]
|
||||
script = ExtResource("8_46wn3")
|
||||
Default = 50
|
||||
Max = 100
|
||||
|
||||
[sub_resource type="Resource" id="Resource_yk4hc"]
|
||||
script = ExtResource("8_46wn3")
|
||||
Default = 1
|
||||
Min = 1
|
||||
Max = 100
|
||||
|
||||
[sub_resource type="Resource" id="Resource_wxisp"]
|
||||
script = ExtResource("8_46wn3")
|
||||
Default = 2
|
||||
Min = 1
|
||||
Max = 100
|
||||
|
||||
[sub_resource type="ViewportTexture" id="ViewportTexture_hf6k8"]
|
||||
viewport_path = NodePath("SubViewport")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_jnv07"]
|
||||
@@ -62,6 +82,20 @@ RDamage = ExtResource("2_on7rt")
|
||||
RKnockback = ExtResource("11_mpa2u")
|
||||
RMovement = ExtResource("4_dejyg")
|
||||
|
||||
[node name="ForgeEntity" type="Node" parent="." unique_id=622209781]
|
||||
script = ExtResource("6_wxisp")
|
||||
metadata/_custom_type_script = "uid://8uj04dfe8oql"
|
||||
|
||||
[node name="ForgeAttributeSet" type="Node" parent="ForgeEntity" unique_id=1840910245]
|
||||
script = ExtResource("7_2digf")
|
||||
AttributeSetClass = "EnemyAttributeSet"
|
||||
InitialAttributeValues = Dictionary[String, ExtResource("8_46wn3")]({
|
||||
"Health": SubResource("Resource_oj1ws"),
|
||||
"Speed": SubResource("Resource_wxisp"),
|
||||
"Strength": SubResource("Resource_yk4hc")
|
||||
})
|
||||
metadata/_custom_type_script = "uid://cxihb42t2mfqi"
|
||||
|
||||
[node name="CHealth" type="Node" parent="." unique_id=1717035166]
|
||||
script = ExtResource("4_ys4jv")
|
||||
RHealth = ExtResource("2_ma2bq")
|
||||
@@ -69,7 +103,7 @@ metadata/_custom_type_script = "uid://bjwrpv3jpsc1e"
|
||||
|
||||
[node name="CHealthBar" parent="." unique_id=1635725931 instance=ExtResource("7_ykkxn")]
|
||||
transform = Transform3D(0.3, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.70000005, 0)
|
||||
texture = SubResource("ViewportTexture_ykkxn")
|
||||
texture = SubResource("ViewportTexture_hf6k8")
|
||||
|
||||
[node name="CDamageable" type="Node" parent="." unique_id=1785297232]
|
||||
script = ExtResource("8_uotso")
|
||||
|
||||
@@ -6,14 +6,34 @@
|
||||
[ext_resource type="Script" uid="uid://b6y3ugfydvch0" path="res://scenes/components/damage/RDamageModifier.cs" id="2_r3cnf"]
|
||||
[ext_resource type="Resource" uid="uid://bohbojc68j7y1" path="res://scenes/enemies/grounded_enemy/grounded_enemy_health.tres" id="2_w4lm8"]
|
||||
[ext_resource type="Resource" uid="uid://bqq6uukbdfysr" path="res://scenes/enemies/grounded_enemy/grounded_enemy_movement.tres" id="4_na24f"]
|
||||
[ext_resource type="Script" uid="uid://8uj04dfe8oql" path="res://addons/forge/nodes/ForgeEntity.cs" id="6_x50ya"]
|
||||
[ext_resource type="Script" uid="uid://cxihb42t2mfqi" path="res://addons/forge/nodes/ForgeAttributeSet.cs" id="6_yk4hc"]
|
||||
[ext_resource type="Script" uid="uid://b0u23nkpaimyc" path="res://scenes/components/damage/CDamageable.cs" id="7_1tw73"]
|
||||
[ext_resource type="PackedScene" uid="uid://bwx2um43k0ou4" path="res://scenes/components/health/CHealthbar.tscn" id="7_18xwy"]
|
||||
[ext_resource type="PackedScene" uid="uid://dbr7ioio158ew" path="res://scenes/components/movement/CGroundedMovement.tscn" id="7_qyswd"]
|
||||
[ext_resource type="Script" uid="uid://ccovd5i0wr3kk" path="res://addons/forge/editor/attributes/AttributeValues.cs" id="7_x50ya"]
|
||||
[ext_resource type="Script" uid="uid://dtpxijlnb2c5" path="res://scenes/components/movement/RMovement.cs" id="8_6d4gl"]
|
||||
[ext_resource type="PackedScene" uid="uid://bctpe34ddamg5" path="res://scenes/components/knockback/CKnockback.tscn" id="10_jqqi6"]
|
||||
[ext_resource type="Resource" uid="uid://cektf6waf4s04" path="res://scenes/enemies/grounded_enemy/grounded_enemy_knockback.tres" id="11_8k3xb"]
|
||||
|
||||
[sub_resource type="ViewportTexture" id="ViewportTexture_18xwy"]
|
||||
[sub_resource type="Resource" id="Resource_f22p3"]
|
||||
script = ExtResource("7_x50ya")
|
||||
Default = 100
|
||||
Max = 100
|
||||
|
||||
[sub_resource type="Resource" id="Resource_yk4hc"]
|
||||
script = ExtResource("7_x50ya")
|
||||
Default = 1
|
||||
Min = 1
|
||||
Max = 100
|
||||
|
||||
[sub_resource type="Resource" id="Resource_x50ya"]
|
||||
script = ExtResource("7_x50ya")
|
||||
Default = 1
|
||||
Min = 1
|
||||
Max = 100
|
||||
|
||||
[sub_resource type="ViewportTexture" id="ViewportTexture_0mf3g"]
|
||||
viewport_path = NodePath("SubViewport")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_qj0ob"]
|
||||
@@ -62,6 +82,20 @@ RDamage = ExtResource("2_bn56u")
|
||||
RKnockback = ExtResource("11_8k3xb")
|
||||
RMovement = ExtResource("4_na24f")
|
||||
|
||||
[node name="ForgeEntity" type="Node" parent="." unique_id=432521027]
|
||||
script = ExtResource("6_x50ya")
|
||||
metadata/_custom_type_script = "uid://8uj04dfe8oql"
|
||||
|
||||
[node name="ForgeAttributeSet" type="Node" parent="ForgeEntity" unique_id=804252284]
|
||||
script = ExtResource("6_yk4hc")
|
||||
AttributeSetClass = "EnemyAttributeSet"
|
||||
InitialAttributeValues = Dictionary[String, ExtResource("7_x50ya")]({
|
||||
"Health": SubResource("Resource_f22p3"),
|
||||
"Speed": SubResource("Resource_x50ya"),
|
||||
"Strength": SubResource("Resource_yk4hc")
|
||||
})
|
||||
metadata/_custom_type_script = "uid://cxihb42t2mfqi"
|
||||
|
||||
[node name="CHealth" type="Node" parent="." unique_id=188153645]
|
||||
script = ExtResource("2_gsmti")
|
||||
RHealth = ExtResource("2_w4lm8")
|
||||
@@ -69,7 +103,7 @@ metadata/_custom_type_script = "uid://bjwrpv3jpsc1e"
|
||||
|
||||
[node name="CHealthBar" parent="." unique_id=1278247727 instance=ExtResource("7_18xwy")]
|
||||
transform = Transform3D(0.4, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.2, 0)
|
||||
texture = SubResource("ViewportTexture_18xwy")
|
||||
texture = SubResource("ViewportTexture_0mf3g")
|
||||
|
||||
[node name="CDamageable" type="Node" parent="." unique_id=1601518000]
|
||||
script = ExtResource("7_1tw73")
|
||||
|
||||
@@ -9,12 +9,14 @@
|
||||
[ext_resource type="Script" uid="uid://baiapod3csndf" path="res://scenes/components/health/RHealth.cs" id="4_abfq8"]
|
||||
[ext_resource type="Resource" uid="uid://bjyd801wvverk" path="res://scenes/player_controller/resources/player_health.tres" id="4_m8gvy"]
|
||||
[ext_resource type="Resource" uid="uid://cpdaw41ah5gic" path="res://inputs/base_mode/rotate_y.tres" id="4_rxwoh"]
|
||||
[ext_resource type="Resource" uid="uid://dh437cuxgjv6b" path="res://scenes/player_controller/resources/forge/mana_regeneration.tres" id="5_2rkt1"]
|
||||
[ext_resource type="Resource" uid="uid://ccrb5xsnphc8" path="res://inputs/base_mode/rotate_floorplane.tres" id="5_4u7i3"]
|
||||
[ext_resource type="PackedScene" uid="uid://hpsg4fqwrx1u" path="res://scenes/components/damage/CDamageable.tscn" id="5_jb43f"]
|
||||
[ext_resource type="Resource" uid="uid://f3vs6l4m623s" path="res://inputs/base_mode/move_left.tres" id="5_q14ux"]
|
||||
[ext_resource type="PackedScene" uid="uid://duju3atqgltkg" path="res://scenes/explosion/explosion.tscn" id="5_ue7xq"]
|
||||
[ext_resource type="Resource" uid="uid://dyru7mxo121w6" path="res://scenes/player_controller/resources/player_normal_damage_mod.tres" id="6_cmijs"]
|
||||
[ext_resource type="Resource" uid="uid://t612lts1wi1s" path="res://inputs/base_mode/move_right.tres" id="6_q7bng"]
|
||||
[ext_resource type="Resource" uid="uid://cffil4tic3ysg" path="res://scenes/player_controller/resources/forge/inhibit_mana_regen_temporarily.tres" id="6_u8yay"]
|
||||
[ext_resource type="Script" uid="uid://cwbvxlfvmocc1" path="res://scenes/player_controller/scripts/StairsSystem.cs" id="7_bmt5a"]
|
||||
[ext_resource type="Resource" uid="uid://brswsknpgwal2" path="res://inputs/base_mode/move_front.tres" id="7_m8gvy"]
|
||||
[ext_resource type="PackedScene" uid="uid://bctpe34ddamg5" path="res://scenes/components/knockback/CKnockback.tscn" id="7_x835q"]
|
||||
@@ -25,9 +27,13 @@
|
||||
[ext_resource type="PackedScene" uid="uid://wq1okogkhc5l" path="res://scenes/player_controller/components/mantle/mantle_system.tscn" id="8_qu4wy"]
|
||||
[ext_resource type="AudioStream" uid="uid://clfggn87oeg1s" path="res://scenes/player_controller/audio/InteractiveSFX.tres" id="9_jb43f"]
|
||||
[ext_resource type="Resource" uid="uid://bebstkm608wxx" path="res://inputs/base_mode/aim_pressed.tres" id="9_nob5r"]
|
||||
[ext_resource type="Resource" uid="uid://dccuj66egxfwh" path="res://scenes/player_controller/resources/forge/empowered_action.tres" id="10_2rkt1"]
|
||||
[ext_resource type="Resource" uid="uid://bdit2jy5gbpts" path="res://inputs/base_mode/jump.tres" id="10_4u7i3"]
|
||||
[ext_resource type="Script" uid="uid://cxihb42t2mfqi" path="res://addons/forge/nodes/ForgeAttributeSet.cs" id="10_pw5r7"]
|
||||
[ext_resource type="Script" uid="uid://ccovd5i0wr3kk" path="res://addons/forge/editor/attributes/AttributeValues.cs" id="11_2rkt1"]
|
||||
[ext_resource type="Resource" uid="uid://b5gx3q8nvu72e" path="res://inputs/base_mode/hit.tres" id="11_cresl"]
|
||||
[ext_resource type="PackedScene" uid="uid://0ysqmqphq6mq" path="res://scenes/player_controller/components/head/head_system.tscn" id="11_rxwoh"]
|
||||
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="11_u8yay"]
|
||||
[ext_resource type="Resource" uid="uid://d2r0ur8k3cuu3" path="res://inputs/base_mode/dash.tres" id="12_34snm"]
|
||||
[ext_resource type="Resource" uid="uid://55b0dsvioj08" path="res://inputs/base_mode/jump_pressed.tres" id="13_nob5r"]
|
||||
[ext_resource type="Shape3D" uid="uid://keseacdcooot" path="res://scenes/player_controller/resources/PlayerShape.tres" id="13_r7i3q"]
|
||||
@@ -53,6 +59,11 @@
|
||||
[ext_resource type="Texture2D" uid="uid://c40orhfdgsim" path="res://assets/ui/IconGodotNode/white/icon_circle.png" id="45_u8rdp"]
|
||||
[ext_resource type="PackedScene" uid="uid://cyw8p0p6a78tl" path="res://scenes/ui/healthbar/healthbar.tscn" id="47_76kmc"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_5gbhg"]
|
||||
script = ExtResource("11_u8yay")
|
||||
Tag = "events.player.empowered_action_used"
|
||||
metadata/_custom_type_script = "uid://dpakv7agvir6y"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_cb2lu"]
|
||||
script = ExtResource("2_x835q")
|
||||
DamageDealt = 10.0
|
||||
@@ -68,6 +79,28 @@ script = ExtResource("4_abfq8")
|
||||
StartingHealth = 10.0
|
||||
metadata/_custom_type_script = "uid://baiapod3csndf"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_u8yay"]
|
||||
script = ExtResource("11_2rkt1")
|
||||
Default = 100
|
||||
Max = 100
|
||||
|
||||
[sub_resource type="Resource" id="Resource_uqalc"]
|
||||
script = ExtResource("11_2rkt1")
|
||||
Default = 100
|
||||
Max = 100
|
||||
|
||||
[sub_resource type="Resource" id="Resource_cn5a8"]
|
||||
script = ExtResource("11_2rkt1")
|
||||
Default = 1
|
||||
Min = 1
|
||||
Max = 100
|
||||
|
||||
[sub_resource type="Resource" id="Resource_b0xmb"]
|
||||
script = ExtResource("11_2rkt1")
|
||||
Default = 1
|
||||
Min = 1
|
||||
Max = 100
|
||||
|
||||
[sub_resource type="CapsuleMesh" id="CapsuleMesh_xc2g5"]
|
||||
height = 1.7
|
||||
|
||||
@@ -109,9 +142,16 @@ radius = 1.5
|
||||
[sub_resource type="CanvasItemMaterial" id="CanvasItemMaterial_2q0ik"]
|
||||
blend_mode = 1
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_n24vh"]
|
||||
bg_color = Color(0.15869555, 0.64034444, 0.906125, 1)
|
||||
|
||||
[node name="Player" type="CharacterBody3D" unique_id=709076448]
|
||||
collision_mask = 272
|
||||
script = ExtResource("1_poq2x")
|
||||
EmpoweredActionUsed = SubResource("Resource_5gbhg")
|
||||
EmpoweredActionAbility = ExtResource("10_2rkt1")
|
||||
DefaultPermanentEffects = [ExtResource("5_2rkt1")]
|
||||
EmpoweredActionEffects = [ExtResource("6_u8yay")]
|
||||
AimAssistStrength = 0.3
|
||||
AimAssistReductionWhenCloseToTarget = 0.1
|
||||
AimAssistReductionStartDistance = 8.0
|
||||
@@ -163,6 +203,17 @@ MinimumWallRunHorizontalSpeed = 8.0
|
||||
WallRunAltitudeLossSpeed = 8.0
|
||||
WallRunSpeedThreshold = 1.0
|
||||
|
||||
[node name="PlayerAttributeSet" type="Node" parent="." unique_id=421846088]
|
||||
script = ExtResource("10_pw5r7")
|
||||
AttributeSetClass = "PlayerAttributeSet"
|
||||
InitialAttributeValues = Dictionary[String, ExtResource("11_2rkt1")]({
|
||||
"Health": SubResource("Resource_u8yay"),
|
||||
"Mana": SubResource("Resource_uqalc"),
|
||||
"Speed": SubResource("Resource_cn5a8"),
|
||||
"Strength": SubResource("Resource_b0xmb")
|
||||
})
|
||||
metadata/_custom_type_script = "uid://cxihb42t2mfqi"
|
||||
|
||||
[node name="CHealth" parent="." unique_id=1244478698 instance=ExtResource("3_q7bng")]
|
||||
RHealth = ExtResource("4_m8gvy")
|
||||
|
||||
@@ -223,12 +274,10 @@ debug_color = Color(0, 0.6, 0.701961, 0.341176)
|
||||
|
||||
[node name="HeadSystem" parent="." unique_id=1203743757 instance=ExtResource("11_rxwoh")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.6, 0)
|
||||
LookSensitivity = 0.16
|
||||
CameraInclineAcceleration = 20.0
|
||||
GroundedCameraIncline = 3.0
|
||||
SlidingJitterAmplitude = 0.2
|
||||
WeaponSway = 8.0
|
||||
WeaponLookRotation = 10.0
|
||||
WeaponAdjustmentSpeed = 1.0
|
||||
|
||||
[node name="MantleSystem" parent="HeadSystem" unique_id=98905505 instance=ExtResource("8_qu4wy")]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -1.6, 0)
|
||||
@@ -551,6 +600,22 @@ offset_bottom = -71.99939
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 0
|
||||
|
||||
[node name="Manabar" parent="UI" unique_id=1713862004 instance=ExtResource("47_76kmc")]
|
||||
unique_name_in_owner = true
|
||||
layout_mode = 1
|
||||
anchors_preset = 7
|
||||
anchor_left = 0.5
|
||||
anchor_top = 1.0
|
||||
anchor_right = 0.5
|
||||
anchor_bottom = 1.0
|
||||
offset_left = -859.0
|
||||
offset_top = -84.0
|
||||
offset_right = -347.0
|
||||
offset_bottom = -72.0
|
||||
grow_horizontal = 2
|
||||
grow_vertical = 0
|
||||
BarStyle = SubResource("StyleBoxFlat_n24vh")
|
||||
|
||||
[node name="StateChart" type="Node" parent="." unique_id=1675830632]
|
||||
script = ExtResource("25_wv70j")
|
||||
metadata/_custom_type_script = "uid://couw105c3bde4"
|
||||
|
||||
@@ -1,13 +1,19 @@
|
||||
using Godot;
|
||||
using System;
|
||||
using Gamesmiths.Forge.Core;
|
||||
using Gamesmiths.Forge.Cues;
|
||||
using Gamesmiths.Forge.Godot.Core;
|
||||
using Gamesmiths.Forge.Tags;
|
||||
using Movementtests.interfaces;
|
||||
using Movementtests.tools;
|
||||
|
||||
[GlobalClass, Icon("res://assets/ui/IconGodotNode/control/icon_text_panel.png")]
|
||||
public partial class PlayerUi : Control
|
||||
public partial class PlayerUi : Control, ICueHandler
|
||||
{
|
||||
internal TextureRect[] _dashIcons = new TextureRect[3];
|
||||
private TextureRect _enemyTarget;
|
||||
private Healthbar _healthbar;
|
||||
internal TextureRect[] DashIcons = new TextureRect[3];
|
||||
private TextureRect _enemyTarget = null!;
|
||||
private Healthbar _healthbar = null!;
|
||||
private Healthbar _manabar = null!;
|
||||
|
||||
public enum TargetState
|
||||
{
|
||||
@@ -25,17 +31,23 @@ public partial class PlayerUi : Control
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
_dashIcons[0] = GetNode<TextureRect>("%Dash1");
|
||||
_dashIcons[1] = GetNode<TextureRect>("%Dash2");
|
||||
_dashIcons[2] = GetNode<TextureRect>("%Dash3");
|
||||
DashIcons[0] = GetNode<TextureRect>("%Dash1");
|
||||
DashIcons[1] = GetNode<TextureRect>("%Dash2");
|
||||
DashIcons[2] = GetNode<TextureRect>("%Dash3");
|
||||
|
||||
_enemyTarget = GetNode<TextureRect>("%EnemyTarget");
|
||||
_healthbar = GetNode<Healthbar>("%Healthbar");
|
||||
_manabar = GetNode<Healthbar>("%Manabar");
|
||||
|
||||
var tagsManager = ForgeManagers.Instance.TagsManager;
|
||||
var cuesManager = ForgeManagers.Instance.CuesManager;
|
||||
cuesManager.RegisterCue(Tag.RequestTag(tagsManager, "cues.resources.mana"), this);
|
||||
}
|
||||
|
||||
public void Initialize(float initialHealth)
|
||||
public void Initialize(float initialHealth, float initialMana)
|
||||
{
|
||||
_healthbar.Initialize(initialHealth);
|
||||
_manabar.Initialize(initialMana);
|
||||
}
|
||||
|
||||
public void SetEnemyTargetProperties(TargetProperties targetProperties)
|
||||
@@ -59,7 +71,7 @@ public partial class PlayerUi : Control
|
||||
public void SetNumberOfDashesLeft(int numberOfDashes)
|
||||
{
|
||||
int index = 1;
|
||||
foreach (var dashIcon in _dashIcons)
|
||||
foreach (var dashIcon in DashIcons)
|
||||
{
|
||||
dashIcon.SetVisible(index <= numberOfDashes);
|
||||
index++;
|
||||
@@ -70,4 +82,29 @@ public partial class PlayerUi : Control
|
||||
{
|
||||
_healthbar.CurrentHealth = healthChanged.CurrentHealth;
|
||||
}
|
||||
|
||||
public void OnManaChanged(float newValue)
|
||||
{
|
||||
_manabar.CurrentHealth = newValue;
|
||||
}
|
||||
|
||||
public void OnExecute(IForgeEntity? target, CueParameters? parameters)
|
||||
{
|
||||
if (target == null || !parameters.HasValue || !IsInstanceValid(_manabar)) return;
|
||||
|
||||
float magnitude = parameters.Value.Magnitude;
|
||||
_manabar.CurrentHealth += magnitude;
|
||||
}
|
||||
|
||||
public void OnApply(IForgeEntity? target, CueParameters? parameters)
|
||||
{
|
||||
}
|
||||
|
||||
public void OnRemove(IForgeEntity? target, bool interrupted)
|
||||
{
|
||||
}
|
||||
|
||||
public void OnUpdate(IForgeEntity? target, CueParameters? parameters)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,12 +39,12 @@ public partial class HeadSystem : Node3D
|
||||
float BobbingMultiplier,
|
||||
float FovMultiplier);
|
||||
|
||||
internal Camera3D _camera;
|
||||
internal Marker3D _cameraAnchor;
|
||||
internal AnimationPlayer _animationPlayer;
|
||||
internal AnimationTree _animationTree;
|
||||
internal Camera3D Camera = null!;
|
||||
internal Node3D CameraAnchor = null!;
|
||||
internal AnimationPlayer AnimationPlayer = null!;
|
||||
internal AnimationTree AnimationTree = null!;
|
||||
|
||||
[Export(PropertyHint.Range, "0,10,0.1,or_greater")]
|
||||
[Export(PropertyHint.Range, "0,1,0.01,or_greater")]
|
||||
public float LookSensitivity { get; set; } = 1f;
|
||||
|
||||
[ExportGroup("Camera incline")]
|
||||
@@ -84,43 +84,40 @@ public partial class HeadSystem : Node3D
|
||||
public float FovMaxedOutSpeed { get; set; } = 20f;
|
||||
|
||||
[ExportGroup("First Person rig")]
|
||||
internal Node3D _fpRig;
|
||||
internal Node3D _rightHandedWeapon;
|
||||
internal Node3D _leftHandedWeapon;
|
||||
internal Node3D _fpDisplacedRig;
|
||||
internal Vector3 _fpDisplacedRigInitialRotation;
|
||||
[Export(PropertyHint.Range, "0,10,0.1,or_greater")]
|
||||
public float WeaponSway { get; set; } = 5f;
|
||||
[Export(PropertyHint.Range, "0,10,0.1,or_greater")]
|
||||
public float WeaponLookRotation { get; set; } = 1f;
|
||||
internal Node3D FpRig = null!;
|
||||
internal Node3D RightHandedWeapon = null!;
|
||||
internal Vector3 RightHandedWeaponInitialRotation = Vector3.Zero;
|
||||
internal Node3D LeftHandedWeapon = null!;
|
||||
internal Vector3 LeftHandedWeaponInitialRotation = Vector3.Zero;
|
||||
[Export(PropertyHint.Range, "0,20,1,or_greater")]
|
||||
public float WeaponSway { get; set; } = 15f;
|
||||
[Export(PropertyHint.Range, "0,200,1,or_greater")]
|
||||
public float WeaponMoveRotation { get; set; } = 80f;
|
||||
[Export(PropertyHint.Range, "0,20,0.1,or_greater")]
|
||||
public float WeaponAdjustmentSpeed { get; set; } = 10f;
|
||||
[Export(PropertyHint.Range, "0,10,0.1,or_greater")]
|
||||
public float DisplacedWeaponSway { get; set; } = 5f;
|
||||
[Export(PropertyHint.Range, "0,10,0.1,or_greater")]
|
||||
public float DisplacedWeaponLookRotation { get; set; } = 1f;
|
||||
[Export(PropertyHint.Range, "0,1,0.01,or_greater")]
|
||||
[Export(PropertyHint.Range, "0,20,1,or_greater")]
|
||||
public float WeaponAdjustmentSpeed { get; set; } = 1f;
|
||||
[Export(PropertyHint.Range, "0,2,0.01,or_greater")]
|
||||
public float DisplacedWeaponSway { get; set; } = 0.8f;
|
||||
[Export(PropertyHint.Range, "0,0.5,0.01,or_greater")]
|
||||
public float DisplacedWeaponMoveRotation { get; set; } = 0.1f;
|
||||
[Export(PropertyHint.Range, "0,20,0.1,or_greater")]
|
||||
public float DisplacedWeaponAdjustmentSpeed { get; set; } = 10f;
|
||||
[Export(PropertyHint.Range, "0,20,1,or_greater")]
|
||||
public float DisplacedWeaponAdjustmentSpeed { get; set; } = 12f;
|
||||
|
||||
public void Init()
|
||||
{
|
||||
_isPlayingForcingAnim = false;
|
||||
IsPlayingForcingAnim = false;
|
||||
|
||||
Input.SetMouseMode(Input.MouseModeEnum.Captured);
|
||||
_camera = GetNode<Camera3D>("CameraSmooth/Camera3D");
|
||||
_cameraAnchor = GetNode<Marker3D>("CameraAnchor");
|
||||
_animationPlayer = GetNode<AnimationPlayer>("AnimationPlayer");
|
||||
_animationTree = GetNode<AnimationTree>("AnimationTree");
|
||||
Camera = GetNode<Camera3D>("CameraSmooth/Camera3D");
|
||||
CameraAnchor = GetNode<Node3D>("CameraSmooth/CameraAnchor");
|
||||
//_cameraAnchor = GetNode<Camera3D>("CameraSmooth/Camera3D");
|
||||
AnimationPlayer = GetNode<AnimationPlayer>("AnimationPlayer");
|
||||
AnimationTree = GetNode<AnimationTree>("AnimationTree");
|
||||
|
||||
_fpRig = GetNode<Node3D>("FPRig");
|
||||
_rightHandedWeapon = GetNode<Node3D>("FPRig/Sword");
|
||||
_leftHandedWeapon = GetNode<Node3D>("FPRig/Parry");
|
||||
_fpDisplacedRig = GetNode<Node3D>("FPRig/Sword");
|
||||
_fpDisplacedRigInitialRotation = _fpDisplacedRig.Rotation;
|
||||
FpRig = GetNode<Node3D>("FPRig");
|
||||
RightHandedWeapon = GetNode<Node3D>("FPRig/Sword/SwordMesh");
|
||||
RightHandedWeaponInitialRotation = RightHandedWeapon.Rotation;
|
||||
LeftHandedWeapon = GetNode<Node3D>("FPRig/Parry/ParryMesh");
|
||||
LeftHandedWeaponInitialRotation = LeftHandedWeapon.Rotation;
|
||||
|
||||
_slidingNoise.NoiseType = FastNoiseLite.NoiseTypeEnum.Perlin;
|
||||
_slidingNoise.SetFrequency(SlidingJitterFrequency);
|
||||
@@ -128,34 +125,34 @@ public partial class HeadSystem : Node3D
|
||||
|
||||
public void SetWeaponsVisible(bool swordVisible, bool parryVisible)
|
||||
{
|
||||
_rightHandedWeapon.Visible = swordVisible;
|
||||
_leftHandedWeapon.Visible = parryVisible;
|
||||
RightHandedWeapon.Visible = swordVisible;
|
||||
LeftHandedWeapon.Visible = parryVisible;
|
||||
}
|
||||
|
||||
public void OnMantle()
|
||||
{
|
||||
_animationTree.Set("parameters/OnMantle/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
|
||||
AnimationTree.Set("parameters/OnMantle/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
|
||||
}
|
||||
public void OnJumpStarted()
|
||||
{
|
||||
_animationTree.Set("parameters/OnJumpStart/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
|
||||
AnimationTree.Set("parameters/OnJumpStart/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
|
||||
}
|
||||
public void OnJumpEnded()
|
||||
{
|
||||
_animationTree.Set("parameters/OnJumpEnd/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
|
||||
AnimationTree.Set("parameters/OnJumpEnd/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
|
||||
}
|
||||
public void OnHit()
|
||||
{
|
||||
_animationTree.Set("parameters/OnHit/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
|
||||
AnimationTree.Set("parameters/OnHit/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
|
||||
}
|
||||
public void OnParry()
|
||||
{
|
||||
_animationTree.Set("parameters/OnParry/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
|
||||
AnimationTree.Set("parameters/OnParry/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
|
||||
}
|
||||
public void OnStartDeathAnimation()
|
||||
{
|
||||
_isPlayingForcingAnim = true;
|
||||
_animationTree.Set("parameters/OnDie/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
|
||||
IsPlayingForcingAnim = true;
|
||||
AnimationTree.Set("parameters/OnDie/request", (int) AnimationNodeOneShot.OneShotRequest.Fire);
|
||||
}
|
||||
|
||||
public void OnDeathAnimationFinished()
|
||||
@@ -190,8 +187,8 @@ public partial class HeadSystem : Node3D
|
||||
EmitSignalHitboxDeactivated();
|
||||
}
|
||||
|
||||
internal bool _footstepEmitted;
|
||||
internal bool _isPlayingForcingAnim;
|
||||
internal bool FootstepEmitted;
|
||||
internal bool IsPlayingForcingAnim;
|
||||
|
||||
public void ResetHeadBobbing()
|
||||
{
|
||||
@@ -200,10 +197,10 @@ public partial class HeadSystem : Node3D
|
||||
|
||||
public void LookAround(CameraParameters inputs)
|
||||
{
|
||||
if (_isPlayingForcingAnim)
|
||||
if (IsPlayingForcingAnim)
|
||||
{
|
||||
_camera.Position = Vector3.Zero;
|
||||
_camera.Rotation = Vector3.Zero;
|
||||
Camera.Position = Vector3.Zero;
|
||||
Camera.Rotation = Vector3.Zero;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -223,7 +220,7 @@ public partial class HeadSystem : Node3D
|
||||
RotateY(angleForHorizontalRotation);
|
||||
|
||||
// Vertical movement of head
|
||||
Vector3 currentCameraRotation = _cameraAnchor.Rotation;
|
||||
Vector3 currentCameraRotation = CameraAnchor.Rotation;
|
||||
currentCameraRotation.X += Convert.ToSingle(lookDir.Y * LookSensitivity * sensitivitMultiplier);
|
||||
currentCameraRotation.X = Mathf.Clamp(currentCameraRotation.X, Mathf.DegToRad(-90f), Mathf.DegToRad(90f));
|
||||
|
||||
@@ -242,18 +239,18 @@ public partial class HeadSystem : Node3D
|
||||
cameraIncline = Mathf.DegToRad(GroundedCameraIncline * cameraInclineFactor * -1.0f);
|
||||
}
|
||||
currentCameraRotation.Z = (float) Mathf.Lerp(currentCameraRotation.Z, cameraIncline, delta * CameraInclineAcceleration);
|
||||
_cameraAnchor.Rotation = currentCameraRotation;
|
||||
CameraAnchor.Rotation = currentCameraRotation;
|
||||
|
||||
if (withCameraJitter)
|
||||
{
|
||||
_cameraAnchor.Position = Vector3.Down*SlidingCameraHeightOffset;
|
||||
CameraAnchor.Position = Vector3.Down*SlidingCameraHeightOffset;
|
||||
float noise1D = _slidingNoise.GetNoise1D(Time.GetTicksMsec());
|
||||
float noiseAmplitude = SlidingJitterAmplitude*Mathf.Clamp(playerVelocity.Length(), 0f, 1f);
|
||||
_cameraAnchor.Position += Vector3.Up*noise1D*noiseAmplitude;
|
||||
CameraAnchor.Position += Vector3.Up*noise1D*noiseAmplitude;
|
||||
}
|
||||
else
|
||||
{
|
||||
_cameraAnchor.Position = Vector3.Zero;
|
||||
CameraAnchor.Position = Vector3.Zero;
|
||||
}
|
||||
|
||||
Vector3 newPositionForCamera = Vector3.Zero;
|
||||
@@ -268,76 +265,79 @@ public partial class HeadSystem : Node3D
|
||||
newPositionForCamera.Y = Mathf.Sin(_bobbingAccumulator * BobbingFrequency) * BobbingAmplitude * bobbingMultiplier;
|
||||
newPositionForCamera.X = Mathf.Cos(_bobbingAccumulator * BobbingFrequency / 2.0f) * BobbingAmplitude * bobbingMultiplier;
|
||||
|
||||
if (newPositionForCamera.Y < -0.07 && !_footstepEmitted) Footstep();
|
||||
if (newPositionForCamera.Y > 0) _footstepEmitted = false;
|
||||
if (newPositionForCamera.Y < -0.07 * bobbingMultiplier && !FootstepEmitted) Footstep();
|
||||
if (newPositionForCamera.Y > 0) FootstepEmitted = false;
|
||||
|
||||
// Offset bobbing for weapon rig
|
||||
newPositionForRig.Y = Mathf.Cos(_bobbingAccumulator * BobbingFrequency) * BobbingAmplitude * bobbingMultiplier * 0.2f;
|
||||
newPositionForRig.X = Mathf.Sin(_bobbingAccumulator * BobbingFrequency / 2.0f) * BobbingAmplitude * bobbingMultiplier * 0.2f;
|
||||
}
|
||||
_cameraAnchor.Position += newPositionForCamera;
|
||||
|
||||
_camera.GlobalTransform = _cameraAnchor.GetGlobalTransformInterpolated();
|
||||
CameraAnchor.Position += newPositionForCamera;
|
||||
Camera.GlobalTransform = CameraAnchor.GetGlobalTransformInterpolated();
|
||||
|
||||
// First person rig adjustments
|
||||
_fpRig.GlobalTransform = _cameraAnchor.GetGlobalTransformInterpolated();
|
||||
FpRig.GlobalTransform = Camera.GlobalTransform;
|
||||
// Apply bobbing
|
||||
_fpRig.Position += newPositionForRig;
|
||||
FpRig.Position += newPositionForRig;
|
||||
|
||||
// Rotate the whole rig based on movement input
|
||||
var newRigRotation = _fpRig.Rotation;
|
||||
var camTilt = Mathf.Lerp(_fpRig.Rotation.Z, cameraIncline*WeaponMoveRotation, delta*WeaponAdjustmentSpeed);
|
||||
var newRigRotation = FpRig.Rotation;
|
||||
var camTilt = Mathf.Lerp(FpRig.Rotation.Z, CameraAnchor.Rotation.Z*WeaponMoveRotation, delta * WeaponAdjustmentSpeed);
|
||||
newRigRotation.Z = (float) camTilt;
|
||||
|
||||
// Rotate the whole rig based on camera rotation input
|
||||
newRigRotation.X = Mathf.Lerp(newRigRotation.X, -lookDir.Y*WeaponSway, (float) delta*WeaponAdjustmentSpeed);
|
||||
newRigRotation.Y = Mathf.Lerp(newRigRotation.Y, -lookDir.X*WeaponSway, (float) delta*WeaponAdjustmentSpeed);
|
||||
newRigRotation.X = Mathf.Lerp(newRigRotation.X, -lookDir.Y*WeaponSway, (float) delta * WeaponAdjustmentSpeed);
|
||||
newRigRotation.Y = Mathf.Lerp(newRigRotation.Y, -lookDir.X*WeaponSway, (float) delta * WeaponAdjustmentSpeed);
|
||||
|
||||
// Apply
|
||||
_fpRig.Rotation = newRigRotation;
|
||||
FpRig.Rotation = newRigRotation;
|
||||
|
||||
// Compute displaced rig adjustments, starting with movement input
|
||||
var newDisplacedRigRotation = _fpDisplacedRig.Rotation;
|
||||
|
||||
var howMuchForward = ComputeHowMuchInputForward(playerInput);
|
||||
var howMuchSideways = ComputeHowMuchInputSideways(playerInput);
|
||||
var displacedCamTiltForward = Mathf.Lerp(newDisplacedRigRotation.Z,
|
||||
_fpDisplacedRigInitialRotation.Z + howMuchForward*DisplacedWeaponMoveRotation,
|
||||
delta*DisplacedWeaponAdjustmentSpeed);
|
||||
var displacedCamTiltSide = Mathf.Lerp(newDisplacedRigRotation.X,
|
||||
_fpDisplacedRigInitialRotation.X - howMuchSideways*DisplacedWeaponMoveRotation,
|
||||
delta*DisplacedWeaponAdjustmentSpeed);
|
||||
|
||||
newDisplacedRigRotation.X = (float) displacedCamTiltSide;
|
||||
newDisplacedRigRotation.Z = (float) displacedCamTiltForward;
|
||||
|
||||
var displacedSwayY = Mathf.Lerp(newDisplacedRigRotation.Y,
|
||||
_fpDisplacedRigInitialRotation.Y - lookDir.X*DisplacedWeaponSway,
|
||||
delta*DisplacedWeaponAdjustmentSpeed);
|
||||
newDisplacedRigRotation.Y = (float) displacedSwayY;
|
||||
|
||||
// Apply
|
||||
_fpDisplacedRig.Rotation = newDisplacedRigRotation;
|
||||
// Compute sword meshes procedural adjustments
|
||||
RightHandedWeapon.Rotation = ComputeRotationForFpMesh(RightHandedWeapon, RightHandedWeaponInitialRotation, playerInput, lookDir, (float) delta);
|
||||
LeftHandedWeapon.Rotation = ComputeRotationForFpMesh(LeftHandedWeapon, LeftHandedWeaponInitialRotation, playerInput, lookDir, (float) delta);
|
||||
|
||||
// Camera adjustments
|
||||
float velocityClamped = Mathf.Clamp(playerVelocity.Length(), 0.5f, FovMaxedOutSpeed);
|
||||
float targetFov = BaseFov + FovChangeFactor * velocityClamped * fovMultiplier;
|
||||
_camera.Fov = Mathf.Lerp(_camera.Fov, targetFov, (float) delta * FovChangeSpeed);
|
||||
Camera.Fov = Mathf.Lerp(Camera.Fov, targetFov, (float) delta * FovChangeSpeed);
|
||||
}
|
||||
|
||||
public Vector3 ComputeRotationForFpMesh(Node3D mesh, Vector3 initialRotation, Vector3 playerInput, Vector2 lookDir, float delta)
|
||||
{
|
||||
var newMeshRotation = mesh.Rotation;
|
||||
var howMuchForward = ComputeHowMuchInputForward(playerInput);
|
||||
var howMuchSideways = ComputeHowMuchInputSideways(playerInput);
|
||||
var displacedCamTiltForward = Mathf.Lerp(newMeshRotation.Z,
|
||||
initialRotation.Z + howMuchForward*DisplacedWeaponMoveRotation,
|
||||
delta * DisplacedWeaponAdjustmentSpeed);
|
||||
var displacedCamTiltSide = Mathf.Lerp(newMeshRotation.X,
|
||||
initialRotation.X - howMuchSideways*DisplacedWeaponMoveRotation,
|
||||
delta * DisplacedWeaponAdjustmentSpeed);
|
||||
|
||||
newMeshRotation.X = displacedCamTiltSide;
|
||||
newMeshRotation.Z = displacedCamTiltForward;
|
||||
|
||||
var displacedSwayY = Mathf.Lerp(newMeshRotation.Y,
|
||||
initialRotation.Y - lookDir.X*DisplacedWeaponSway,
|
||||
delta * DisplacedWeaponAdjustmentSpeed);
|
||||
newMeshRotation.Y = displacedSwayY;
|
||||
|
||||
return newMeshRotation;
|
||||
}
|
||||
|
||||
public void Footstep()
|
||||
{
|
||||
_footstepEmitted = true;
|
||||
FootstepEmitted = true;
|
||||
EmitSignalStepFoot();
|
||||
}
|
||||
|
||||
public void HideWeapon()
|
||||
{
|
||||
_rightHandedWeapon.Visible = false;
|
||||
RightHandedWeapon.Visible = false;
|
||||
}
|
||||
public void ShowWeapon()
|
||||
{
|
||||
_rightHandedWeapon.Visible = true;
|
||||
RightHandedWeapon.Visible = true;
|
||||
}
|
||||
|
||||
public float ComputeCameraInclineFactor(Vector3 direction)
|
||||
@@ -368,15 +368,15 @@ public partial class HeadSystem : Node3D
|
||||
|
||||
public Vector3 GetGlobalForwardVector()
|
||||
{
|
||||
return _camera.GlobalBasis.Z;
|
||||
return Camera.GlobalBasis.Z;
|
||||
}
|
||||
|
||||
public Vector3 GetGlobalLookRotation()
|
||||
{
|
||||
return new Vector3(
|
||||
_camera.Rotation.X,
|
||||
Camera.Rotation.X,
|
||||
Rotation.Y,
|
||||
_camera.Rotation.Z);
|
||||
Camera.Rotation.Z);
|
||||
}
|
||||
|
||||
public void SetHeight(float height)
|
||||
|
||||
@@ -654,9 +654,6 @@ _data = {
|
||||
|
||||
[node name="HeadSystem" type="Node3D" unique_id=2067407038]
|
||||
script = ExtResource("1_8abgy")
|
||||
WeaponMoveRotation = 20.0
|
||||
DisplacedWeaponSway = 1.0
|
||||
DisplacedWeaponAdjustmentSpeed = 8.0
|
||||
|
||||
[node name="FPRig" type="Node3D" parent="." unique_id=922968399]
|
||||
transform = Transform3D(0.9999998, 0, 0, 0, 1.0000002, 0, 0, 0, 1.0000002, 0, 0, 0)
|
||||
@@ -678,6 +675,9 @@ mesh = ExtResource("3_1ay6d")
|
||||
[node name="CameraSmooth" type="Node3D" parent="." unique_id=2072010960]
|
||||
transform = Transform3D(0.9999998, -0.00011616429, 0, 0.00011616431, 0.99999964, 0, 0, 0, 0.99999976, 0, 0, 0)
|
||||
|
||||
[node name="CameraAnchor" type="Marker3D" parent="CameraSmooth" unique_id=1554357312]
|
||||
transform = Transform3D(1.0000002, 0.00011616435, 0, -0.000116164374, 1.0000004, 0, 0, 0, 1.0000002, 0, 0, 0)
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="CameraSmooth" unique_id=544372058]
|
||||
transform = Transform3D(1, 0, 0, 0, 1.0000002, 0, 0, 0, 1.0000001, 0, 0, 0)
|
||||
current = true
|
||||
@@ -702,8 +702,6 @@ fade_out = 0.5547845
|
||||
shakerPreset = SubResource("Resource_se3kf")
|
||||
metadata/_custom_type_script = "uid://dnlxsrumw6ygp"
|
||||
|
||||
[node name="CameraAnchor" type="Marker3D" parent="." unique_id=1554357312]
|
||||
|
||||
[node name="AnimationPlayer" type="AnimationPlayer" parent="." unique_id=1831491746]
|
||||
root_node = NodePath("../CameraSmooth/Camera3D")
|
||||
libraries/ = SubResource("AnimationLibrary_0hyrq")
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
using Gamesmiths.Forge.Attributes;
|
||||
|
||||
namespace Movementtests.scenes.player_controller.components.weapon;
|
||||
|
||||
public class WeaponAttributeSet : AttributeSet
|
||||
{
|
||||
public EntityAttribute Level { get; }
|
||||
|
||||
public WeaponAttributeSet()
|
||||
{
|
||||
Level = InitializeAttribute(nameof(Level), 1, 1, 10);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
uid://mvc3bv0p021
|
||||
@@ -1,13 +1,35 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Gamesmiths.Forge.Abilities;
|
||||
using Gamesmiths.Forge.Attributes;
|
||||
using Gamesmiths.Forge.Core;
|
||||
using Gamesmiths.Forge.Effects;
|
||||
using Gamesmiths.Forge.Effects.Calculator;
|
||||
using Gamesmiths.Forge.Effects.Components;
|
||||
using Gamesmiths.Forge.Effects.Duration;
|
||||
using Gamesmiths.Forge.Effects.Magnitudes;
|
||||
using Gamesmiths.Forge.Effects.Periodic;
|
||||
using Gamesmiths.Forge.Events;
|
||||
using Gamesmiths.Forge.Godot.Core;
|
||||
using Gamesmiths.Forge.Godot.Nodes;
|
||||
using Gamesmiths.Forge.Godot.Resources;
|
||||
using Gamesmiths.Forge.Godot.Resources.Abilities;
|
||||
using Gamesmiths.Forge.Tags;
|
||||
using Godot;
|
||||
using GodotStateCharts;
|
||||
using Movementtests.addons.godot_state_charts.csharp;
|
||||
using Movementtests.forge.abilities;
|
||||
using Movementtests.interfaces;
|
||||
using Movementtests.scenes.player_controller.components.weapon;
|
||||
using Movementtests.systems.damage;
|
||||
using Movementtests.tools;
|
||||
using Movementtests.tools.calculators;
|
||||
|
||||
namespace Movementtests.systems;
|
||||
|
||||
|
||||
[GlobalClass, Icon("res://assets/ui/IconGodotNode/node_3D/icon_sword.png")]
|
||||
public partial class WeaponSystem : RigidBody3D, IDamageDealer
|
||||
public partial class WeaponSystem : RigidBody3D, IDamageDealer, IForgeEntity
|
||||
{
|
||||
[Signal]
|
||||
public delegate void WeaponThrownEventHandler();
|
||||
@@ -15,6 +37,11 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer
|
||||
[Signal]
|
||||
public delegate void WeaponRetrievedEventHandler();
|
||||
|
||||
[Export]
|
||||
public ForgeTagContainer BaseTags { get; set; } = new();
|
||||
[Export] public ForgeAbilityData[] WeaponAbilities { get; set; } = Array.Empty<ForgeAbilityData>();
|
||||
[Export] public ForgeAbilityData FlyingTickAbility { get; set; } = new();
|
||||
|
||||
[Export]
|
||||
public RDamage RDamage { get; set; }
|
||||
[Export(PropertyHint.Range, "0,100,1,or_greater")]
|
||||
@@ -22,11 +49,24 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer
|
||||
[Export(PropertyHint.Range, "0,0.2,0.01,or_greater")]
|
||||
public float StraightThrowDuration { get; set; } = 0.1f;
|
||||
|
||||
public EntityAttributes Attributes { get; set; } = null!;
|
||||
public EntityTags Tags { get; set; } = null!;
|
||||
public EffectsManager EffectsManager { get; set; } = null!;
|
||||
public EntityAbilities Abilities { get; set; } = null!;
|
||||
public EventManager Events { get; set; } = null!;
|
||||
|
||||
private StateChart _weaponState = null!;
|
||||
public StateChartState InHandState = null!;
|
||||
public StateChartState FlyingState = null!;
|
||||
public StateChartState PlantedState = null!;
|
||||
private Transition _handToFlying = null!;
|
||||
private Transition _flyingToHand = null!;
|
||||
private Transition _plantedToHand = null!;
|
||||
private Transition _plantedToFlying = null!;
|
||||
private Transition _toPlanted = null!;
|
||||
|
||||
private ShapeCast3D _dashCast3D = null!;
|
||||
public Timer WeaponFlyingTick = null!;
|
||||
|
||||
private Transform3D _startTransform;
|
||||
private Vector3 _startMeshRotation;
|
||||
@@ -40,17 +80,41 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer
|
||||
public StandardMaterial3D WeaponLocationIndicatorMaterial { get; set; } = null!;
|
||||
public MeshInstance3D WeaponMesh { get; set; } = null!;
|
||||
|
||||
public Tag WeaponFlyingTickEventTag;
|
||||
public Tag WeaponStartedFlyingEventTag;
|
||||
public Tag WeaponStoppedFlyingEventTag;
|
||||
public Tag WeaponHandToFlyingEventTag;
|
||||
public Tag WeaponFlyingToHandEventTag;
|
||||
public Tag WeaponPlantedToHandEventTag;
|
||||
public Tag WeaponPlantedToFlyingEventTag;
|
||||
public Tag WeaponPlantedEventTag;
|
||||
|
||||
public Tag WeaponInHandStatusTag;
|
||||
public Tag WeaponFlyingStatusTag;
|
||||
public Tag WeaponPlantedStatusTag;
|
||||
|
||||
public Tag WeaponFlyingAbilityTag;
|
||||
|
||||
private AbilityHandle? _weaponFlyingAbility;
|
||||
|
||||
public void Init()
|
||||
{
|
||||
_weaponState = StateChart.Of(GetNode("StateChart"));
|
||||
InHandState = StateChartState.Of(GetNode("StateChart/Root/InHand"));
|
||||
FlyingState = StateChartState.Of(GetNode("StateChart/Root/Flying"));
|
||||
PlantedState = StateChartState.Of(GetNode("StateChart/Root/Planted"));
|
||||
_handToFlying = Transition.Of(GetNode("StateChart/Root/InHand/ToFlying"));
|
||||
_flyingToHand = Transition.Of(GetNode("StateChart/Root/Flying/ToHand"));
|
||||
_plantedToHand = Transition.Of(GetNode("StateChart/Root/Planted/ToHand"));
|
||||
_plantedToFlying = Transition.Of(GetNode("StateChart/Root/Planted/ToFlying"));
|
||||
_toPlanted = Transition.Of(GetNode("StateChart/Root/ToPlanted"));
|
||||
|
||||
WeaponLocationIndicator = GetNode<MeshInstance3D>("WeaponLocationIndicator");
|
||||
WeaponLocationIndicator.Visible = false;
|
||||
WeaponLocationIndicatorMaterial = (WeaponLocationIndicator.GetActiveMaterial(0) as StandardMaterial3D)!;
|
||||
|
||||
WeaponFlyingTick = GetNode<Timer>("WeaponFlyingTick");
|
||||
|
||||
WeaponMesh = GetNode<MeshInstance3D>("Weapon");
|
||||
_startMeshRotation = WeaponMesh.Rotation;
|
||||
|
||||
@@ -58,10 +122,143 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer
|
||||
Freeze = true;
|
||||
Visible = false;
|
||||
|
||||
// Forge
|
||||
var tagsManager = ForgeManagers.Instance.TagsManager;
|
||||
var cuesManager = ForgeManagers.Instance.CuesManager;
|
||||
|
||||
WeaponFlyingTickEventTag = Tag.RequestTag(tagsManager, "events.weapon.flyingTick");
|
||||
WeaponStartedFlyingEventTag = Tag.RequestTag(tagsManager, "events.weapon.startedFlying");
|
||||
WeaponStoppedFlyingEventTag = Tag.RequestTag(tagsManager, "events.weapon.stoppedFlying");
|
||||
WeaponHandToFlyingEventTag = Tag.RequestTag(tagsManager, "events.weapon.handToFlying");
|
||||
WeaponFlyingToHandEventTag = Tag.RequestTag(tagsManager, "events.weapon.flyingToHand");
|
||||
WeaponPlantedToHandEventTag = Tag.RequestTag(tagsManager, "events.weapon.plantedToHand");
|
||||
WeaponPlantedToFlyingEventTag = Tag.RequestTag(tagsManager, "events.weapon.plantedToFlying");
|
||||
WeaponPlantedEventTag = Tag.RequestTag(tagsManager, "events.weapon.planted");
|
||||
|
||||
// WeaponInHandStatusTag = Tag.RequestTag(tagsManager, "status.weapon.inHand");
|
||||
// WeaponFlyingStatusTag = Tag.RequestTag(tagsManager, "status.weapon.flying");
|
||||
// WeaponPlantedStatusTag = Tag.RequestTag(tagsManager, "status.weapon.planted");
|
||||
|
||||
WeaponFlyingAbilityTag = Tag.RequestTag(tagsManager,"abilities.weapon.flying");
|
||||
|
||||
List<AttributeSet> attributeSetList = [];
|
||||
foreach (Node node in GetChildren())
|
||||
{
|
||||
if (node is ForgeAttributeSet attributeSetNode)
|
||||
{
|
||||
AttributeSet? attributeSet = attributeSetNode.GetAttributeSet();
|
||||
|
||||
if (attributeSet is not null)
|
||||
{
|
||||
attributeSetList.Add(attributeSet);
|
||||
}
|
||||
}
|
||||
}
|
||||
Attributes = new EntityAttributes([.. attributeSetList]);
|
||||
|
||||
Tags = new(BaseTags.GetTagContainer());
|
||||
EffectsManager = new EffectsManager(this, cuesManager);
|
||||
Abilities = new(this);
|
||||
Events = new();
|
||||
|
||||
// TODO: Waiting on bug resolve
|
||||
// _weaponFlyingAbility = Abilities.GrantAbilityPermanently(FlyingTickAbility.GetAbilityData(), 1, LevelComparison.None, this);
|
||||
|
||||
foreach (var ability in WeaponAbilities)
|
||||
{
|
||||
var leftGrantAbilityConfig = new GrantAbilityConfig(
|
||||
ability.GetAbilityData(),
|
||||
ScalableLevel: new ScalableInt(1),
|
||||
RemovalPolicy: AbilityDeactivationPolicy.CancelImmediately,
|
||||
InhibitionPolicy: AbilityDeactivationPolicy.CancelImmediately,
|
||||
TryActivateOnGrant: false,
|
||||
TryActivateOnEnable: false,
|
||||
LevelOverridePolicy: LevelComparison.Higher);
|
||||
|
||||
var leftGrantComponent = new GrantAbilityEffectComponent([leftGrantAbilityConfig]);
|
||||
var leftGrantEffect = new EffectData(
|
||||
"Grant Weapon Ability",
|
||||
new DurationData(DurationType.Infinite),
|
||||
effectComponents: [leftGrantComponent]);
|
||||
EffectsManager.ApplyEffect(new Effect(leftGrantEffect, new EffectOwnership(this, this)));
|
||||
}
|
||||
|
||||
BodyEntered += OnThrownWeaponReachesGround;
|
||||
|
||||
InHandState.StateExited += WeaponLeft;
|
||||
InHandState.StateEntered += WeaponBack;
|
||||
|
||||
_handToFlying.Taken += () =>
|
||||
{
|
||||
Events.Raise(new EventData
|
||||
{
|
||||
EventTags = WeaponHandToFlyingEventTag.GetSingleTagContainer()!,
|
||||
Source = this
|
||||
});
|
||||
Events.Raise(new EventData
|
||||
{
|
||||
EventTags = WeaponStartedFlyingEventTag.GetSingleTagContainer()!,
|
||||
Source = this
|
||||
});
|
||||
};
|
||||
|
||||
_flyingToHand.Taken += () =>
|
||||
{
|
||||
Events.Raise(new EventData
|
||||
{
|
||||
EventTags = WeaponFlyingToHandEventTag.GetSingleTagContainer()!,
|
||||
Source = this
|
||||
});
|
||||
Events.Raise(new EventData
|
||||
{
|
||||
EventTags = WeaponStoppedFlyingEventTag.GetSingleTagContainer()!,
|
||||
Source = this
|
||||
});
|
||||
};
|
||||
|
||||
_plantedToHand.Taken += () =>
|
||||
{
|
||||
Events.Raise(new EventData
|
||||
{
|
||||
EventTags = WeaponPlantedToHandEventTag.GetSingleTagContainer()!,
|
||||
Source = this
|
||||
});
|
||||
};
|
||||
|
||||
_plantedToFlying.Taken += () =>
|
||||
{
|
||||
Events.Raise(new EventData
|
||||
{
|
||||
EventTags = WeaponPlantedToFlyingEventTag.GetSingleTagContainer()!,
|
||||
Source = this
|
||||
});
|
||||
Events.Raise(new EventData
|
||||
{
|
||||
EventTags = WeaponStartedFlyingEventTag.GetSingleTagContainer()!,
|
||||
Source = this
|
||||
});
|
||||
};
|
||||
|
||||
_toPlanted.Taken += () =>
|
||||
{
|
||||
Events.Raise(new EventData
|
||||
{
|
||||
EventTags = WeaponPlantedEventTag.GetSingleTagContainer()!,
|
||||
Source = this,
|
||||
Target = _plantedEntity
|
||||
});
|
||||
Events.Raise(new EventData
|
||||
{
|
||||
EventTags = WeaponStoppedFlyingEventTag.GetSingleTagContainer()!,
|
||||
Source = this
|
||||
});
|
||||
};
|
||||
|
||||
Events.Subscribe(WeaponStoppedFlyingEventTag, data =>
|
||||
{
|
||||
// TODO: Waiting on bug resolve
|
||||
// _weaponFlyingAbility.Cancel();
|
||||
});
|
||||
}
|
||||
|
||||
public void WeaponLeft()
|
||||
@@ -90,14 +287,11 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer
|
||||
{
|
||||
_weaponState.SendEvent("throw");
|
||||
|
||||
// WeaponLocationIndicatorMaterial.StencilColor = new Color(1f, 1f, 1f);
|
||||
|
||||
_throwDirection = (end - GlobalPosition).Normalized();
|
||||
PlantLocation = collisionLocation;
|
||||
PlantNormal = collisionNormal;
|
||||
LookAt(end);
|
||||
|
||||
|
||||
var tween = GetTree().CreateTween();
|
||||
tween.TweenProperty(this, "global_position", end, StraightThrowDuration);
|
||||
if (hasHit)
|
||||
@@ -109,11 +303,15 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer
|
||||
tween.Finished += ThrowWeaponOnCurve;
|
||||
}
|
||||
|
||||
private IForgeEntity? _plantedEntity;
|
||||
public void PlantInEnemy(Node3D enemy)
|
||||
{
|
||||
GetTree().GetRoot().CallDeferred(Node.MethodName.RemoveChild, this);
|
||||
enemy.CallDeferred(Node.MethodName.AddChild, this);
|
||||
|
||||
if (enemy is IForgeEntity victim) _plantedEntity = victim;
|
||||
else _plantedEntity = null;
|
||||
|
||||
if (enemy is IDamageable damageable)
|
||||
{
|
||||
damageable.TakeDamage(new DamageRecord(GlobalPosition, RDamage));
|
||||
@@ -123,6 +321,7 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer
|
||||
public void RethrowWeapon()
|
||||
{
|
||||
_weaponState.SendEvent("throw");
|
||||
|
||||
_throwDirection = Vector3.Up;
|
||||
ThrowWeaponOnCurve();
|
||||
}
|
||||
@@ -135,16 +334,15 @@ public partial class WeaponSystem : RigidBody3D, IDamageDealer
|
||||
|
||||
public void PlantWeaponInWall()
|
||||
{
|
||||
_weaponState.SendEvent("plant");
|
||||
|
||||
Freeze = true;
|
||||
WeaponMesh.Rotation = _startMeshRotation;
|
||||
|
||||
// WeaponLocationIndicatorMaterial.StencilColor = new Color(1f, 0.2f, 0.2f);
|
||||
if (PlantObject is Node3D node)
|
||||
{
|
||||
PlantInEnemy(node);
|
||||
}
|
||||
|
||||
_weaponState.SendEvent("plant");
|
||||
|
||||
CallDeferred(Node3D.MethodName.SetGlobalPosition, PlantLocation);
|
||||
CallDeferred(Node3D.MethodName.LookAt, GlobalTransform.Origin + PlantNormal, Vector3.Up, true);
|
||||
}
|
||||
|
||||
@@ -2,8 +2,13 @@
|
||||
|
||||
[ext_resource type="Script" uid="uid://iii3wfto4t5b" path="res://scenes/player_controller/components/weapon/WeaponSystem.cs" id="1_csqwk"]
|
||||
[ext_resource type="Script" uid="uid://jitubgv6judn" path="res://scenes/components/damage/RDamage.cs" id="2_m0v1h"]
|
||||
[ext_resource type="Resource" uid="uid://cu0685gspk2fk" path="res://scenes/player_controller/resources/forge/exploding_sword_weapon_land.tres" id="2_pgbtr"]
|
||||
[ext_resource type="Script" uid="uid://cxihb42t2mfqi" path="res://addons/forge/nodes/ForgeAttributeSet.cs" id="3_3xjpi"]
|
||||
[ext_resource type="Script" uid="uid://couw105c3bde4" path="res://addons/godot_state_charts/state_chart.gd" id="3_5owyf"]
|
||||
[ext_resource type="Resource" uid="uid://busdbvfi3jiic" path="res://scenes/player_controller/resources/forge/exploding_sword_weapon_left.tres" id="3_7bruw"]
|
||||
[ext_resource type="ArrayMesh" uid="uid://cho5fixitrbds" path="res://assets/meshes/swords/resources/sword23.tres" id="3_svc06"]
|
||||
[ext_resource type="Resource" uid="uid://btnnpqann3ktp" path="res://scenes/player_controller/resources/forge/weapon_flying_tick_ability.tres" id="4_7bruw"]
|
||||
[ext_resource type="Script" uid="uid://ccovd5i0wr3kk" path="res://addons/forge/editor/attributes/AttributeValues.cs" id="4_q6xv7"]
|
||||
[ext_resource type="Script" uid="uid://jk2jm1g6q853" path="res://addons/godot_state_charts/compound_state.gd" id="4_svc06"]
|
||||
[ext_resource type="Script" uid="uid://cytafq8i1y8qm" path="res://addons/godot_state_charts/atomic_state.gd" id="5_m0v1h"]
|
||||
[ext_resource type="Script" uid="uid://cf1nsco3w0mf6" path="res://addons/godot_state_charts/transition.gd" id="6_jpdh0"]
|
||||
@@ -13,6 +18,12 @@ script = ExtResource("2_m0v1h")
|
||||
DamageDealt = 2.0
|
||||
metadata/_custom_type_script = "uid://jitubgv6judn"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_pgbtr"]
|
||||
script = ExtResource("4_q6xv7")
|
||||
Default = 1
|
||||
Min = 1
|
||||
Max = 100
|
||||
|
||||
[sub_resource type="CylinderShape3D" id="CylinderShape3D_avini"]
|
||||
height = 1.0
|
||||
radius = 0.1
|
||||
@@ -48,8 +59,21 @@ continuous_cd = true
|
||||
contact_monitor = true
|
||||
max_contacts_reported = 1
|
||||
script = ExtResource("1_csqwk")
|
||||
WeaponAbilities = [ExtResource("2_pgbtr"), ExtResource("3_7bruw")]
|
||||
FlyingTickAbility = ExtResource("4_7bruw")
|
||||
RDamage = SubResource("Resource_jpdh0")
|
||||
|
||||
[node name="WeaponAttributeSet" type="Node" parent="." unique_id=14845649]
|
||||
script = ExtResource("3_3xjpi")
|
||||
AttributeSetClass = "WeaponAttributeSet"
|
||||
InitialAttributeValues = Dictionary[String, ExtResource("4_q6xv7")]({
|
||||
"Level": SubResource("Resource_pgbtr")
|
||||
})
|
||||
metadata/_custom_type_script = "uid://cxihb42t2mfqi"
|
||||
|
||||
[node name="WeaponFlyingTick" type="Timer" parent="." unique_id=656309486]
|
||||
wait_time = 0.2
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="." unique_id=884463982]
|
||||
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0)
|
||||
shape = SubResource("CylinderShape3D_avini")
|
||||
|
||||
143
scenes/player_controller/resources/forge/empowered_action.tres
Normal file
143
scenes/player_controller/resources/forge/empowered_action.tres
Normal file
@@ -0,0 +1,143 @@
|
||||
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://dccuj66egxfwh"]
|
||||
|
||||
[ext_resource type="Resource" uid="uid://crgwob8t8yysq" path="res://scenes/player_controller/resources/forge/instant_end_behavior.tres" id="1_x7d0c"]
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="2_prg0a"]
|
||||
[ext_resource type="Script" uid="uid://dngf30hxy5go4" path="res://addons/forge/resources/components/ModifierTags.cs" id="3_k72m0"]
|
||||
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="4_5fdax"]
|
||||
[ext_resource type="Script" uid="uid://2gm1hdhi8u08" path="res://addons/forge/resources/magnitudes/ForgeModifierMagnitude.cs" id="5_5qmmj"]
|
||||
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="6_yi0bg"]
|
||||
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="7_0rp6y"]
|
||||
[ext_resource type="Resource" uid="uid://dn7b8frkoxpxr" path="res://scenes/player_controller/resources/forge/player_mana_changed_cue.tres" id="8_0olwd"]
|
||||
[ext_resource type="Script" uid="uid://bdfcavbjyhxxa" path="res://addons/forge/resources/ForgeModifier.cs" id="9_wluo0"]
|
||||
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="10_2sq4o"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_h116a"]
|
||||
script = ExtResource("2_prg0a")
|
||||
ContainerTags = Array[String](["cooldown.empoweredaction"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_mgrka"]
|
||||
script = ExtResource("3_k72m0")
|
||||
TagsToAdd = SubResource("Resource_h116a")
|
||||
metadata/_custom_type_script = "uid://dngf30hxy5go4"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_ekcln"]
|
||||
script = ExtResource("4_5fdax")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_odwcb"]
|
||||
script = ExtResource("4_5fdax")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_psy6a"]
|
||||
script = ExtResource("4_5fdax")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_j4bwy"]
|
||||
script = ExtResource("4_5fdax")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_s60jg"]
|
||||
script = ExtResource("4_5fdax")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_wdif6"]
|
||||
script = ExtResource("4_5fdax")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_inx6r"]
|
||||
script = ExtResource("4_5fdax")
|
||||
BaseValue = 0.5
|
||||
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_4jm88"]
|
||||
script = ExtResource("5_5qmmj")
|
||||
ScalableFloat = SubResource("Resource_inx6r")
|
||||
Coefficient = SubResource("Resource_j4bwy")
|
||||
PreMultiplyAdditiveValue = SubResource("Resource_wdif6")
|
||||
PostMultiplyAdditiveValue = SubResource("Resource_s60jg")
|
||||
CalculatorCoefficient = SubResource("Resource_ekcln")
|
||||
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_psy6a")
|
||||
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_odwcb")
|
||||
metadata/_custom_type_script = "uid://2gm1hdhi8u08"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_lmnuh"]
|
||||
script = ExtResource("6_yi0bg")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_xp6fe"]
|
||||
script = ExtResource("6_yi0bg")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_egh2b"]
|
||||
script = ExtResource("7_0rp6y")
|
||||
Name = "Empowered Action Cooldown"
|
||||
Modifiers = []
|
||||
Components = Array[Object]([SubResource("Resource_mgrka")])
|
||||
Executions = []
|
||||
DurationType = 2
|
||||
Duration = SubResource("Resource_4jm88")
|
||||
StackLimit = SubResource("Resource_xp6fe")
|
||||
InitialStack = SubResource("Resource_lmnuh")
|
||||
Cues = []
|
||||
metadata/_custom_type_script = "uid://b83hf13nj37k3"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_8dsdw"]
|
||||
script = ExtResource("6_yi0bg")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_clulf"]
|
||||
script = ExtResource("4_5fdax")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_4kkx2"]
|
||||
script = ExtResource("4_5fdax")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_5vdhj"]
|
||||
script = ExtResource("4_5fdax")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_nx5he"]
|
||||
script = ExtResource("4_5fdax")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_st5kh"]
|
||||
script = ExtResource("4_5fdax")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_wl5ql"]
|
||||
script = ExtResource("4_5fdax")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_uv4a1"]
|
||||
script = ExtResource("4_5fdax")
|
||||
BaseValue = -30.0
|
||||
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_dhni4"]
|
||||
script = ExtResource("9_wluo0")
|
||||
Attribute = "PlayerAttributeSet.Mana"
|
||||
ScalableFloat = SubResource("Resource_uv4a1")
|
||||
Coefficient = SubResource("Resource_nx5he")
|
||||
PreMultiplyAdditiveValue = SubResource("Resource_wl5ql")
|
||||
PostMultiplyAdditiveValue = SubResource("Resource_st5kh")
|
||||
CalculatorCoefficient = SubResource("Resource_clulf")
|
||||
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_5vdhj")
|
||||
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_4kkx2")
|
||||
metadata/_custom_type_script = "uid://bdfcavbjyhxxa"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_w5rmc"]
|
||||
script = ExtResource("6_yi0bg")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_mtef8"]
|
||||
script = ExtResource("7_0rp6y")
|
||||
Name = "Empowered Action Cost"
|
||||
Modifiers = Array[Object]([SubResource("Resource_dhni4")])
|
||||
Components = []
|
||||
Executions = []
|
||||
StackLimit = SubResource("Resource_w5rmc")
|
||||
InitialStack = SubResource("Resource_8dsdw")
|
||||
Cues = Array[Object]([ExtResource("8_0olwd")])
|
||||
metadata/_custom_type_script = "uid://b83hf13nj37k3"
|
||||
|
||||
[resource]
|
||||
script = ExtResource("10_2sq4o")
|
||||
Name = "Empowered Action"
|
||||
CooldownEffects = [SubResource("Resource_egh2b")]
|
||||
CostEffect = SubResource("Resource_mtef8")
|
||||
AbilityBehavior = ExtResource("1_x7d0c")
|
||||
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"
|
||||
@@ -0,0 +1,8 @@
|
||||
[gd_resource type="Resource" script_class="ForgeExplodingSwordBehavior" format=3 uid="uid://ifeavnlps7hy"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://duju3atqgltkg" path="res://scenes/explosion/explosion.tscn" id="1_mnals"]
|
||||
[ext_resource type="Script" uid="uid://bnee6amtc2bhj" path="res://forge/abilities/ForgeExplodingSwordBehavior.cs" id="1_ot53g"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_ot53g")
|
||||
Explosion = ExtResource("1_mnals")
|
||||
@@ -0,0 +1,26 @@
|
||||
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://bl0mng4kl1xy8"]
|
||||
|
||||
[ext_resource type="Resource" uid="uid://ifeavnlps7hy" path="res://scenes/player_controller/resources/forge/exploding_sword.tres" id="1_postf"]
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="2_km5rh"]
|
||||
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="3_spdwn"]
|
||||
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="4_cm86c"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_ixeut"]
|
||||
script = ExtResource("2_km5rh")
|
||||
ContainerTags = Array[String](["abilities.weapon.land"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_6c3kr"]
|
||||
script = ExtResource("3_spdwn")
|
||||
Tag = "events.weapon.flyingtick"
|
||||
metadata/_custom_type_script = "uid://dpakv7agvir6y"
|
||||
|
||||
[resource]
|
||||
script = ExtResource("4_cm86c")
|
||||
Name = "Exploding Sword on Weapon Flight"
|
||||
CooldownEffects = []
|
||||
AbilityBehavior = ExtResource("1_postf")
|
||||
TriggerSource = 1
|
||||
TriggerTag = SubResource("Resource_6c3kr")
|
||||
AbilityTags = SubResource("Resource_ixeut")
|
||||
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"
|
||||
@@ -0,0 +1,26 @@
|
||||
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://cu0685gspk2fk"]
|
||||
|
||||
[ext_resource type="Resource" uid="uid://ifeavnlps7hy" path="res://scenes/player_controller/resources/forge/exploding_sword.tres" id="1_l4v7e"]
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="2_6c3kr"]
|
||||
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="2_l4v7e"]
|
||||
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="3_ixeut"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_ixeut"]
|
||||
script = ExtResource("2_6c3kr")
|
||||
ContainerTags = Array[String](["abilities.weapon.land"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_6c3kr"]
|
||||
script = ExtResource("2_l4v7e")
|
||||
Tag = "events.weapon.stoppedflying"
|
||||
metadata/_custom_type_script = "uid://dpakv7agvir6y"
|
||||
|
||||
[resource]
|
||||
script = ExtResource("3_ixeut")
|
||||
Name = "Exploding Sword on Weapon Land"
|
||||
CooldownEffects = []
|
||||
AbilityBehavior = ExtResource("1_l4v7e")
|
||||
TriggerSource = 1
|
||||
TriggerTag = SubResource("Resource_6c3kr")
|
||||
AbilityTags = SubResource("Resource_ixeut")
|
||||
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"
|
||||
@@ -0,0 +1,26 @@
|
||||
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://busdbvfi3jiic"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="1_85dnt"]
|
||||
[ext_resource type="Resource" uid="uid://ifeavnlps7hy" path="res://scenes/player_controller/resources/forge/exploding_sword.tres" id="1_m0rkb"]
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="2_u5iw7"]
|
||||
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="3_u5iw7"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_cjh4j"]
|
||||
script = ExtResource("2_u5iw7")
|
||||
ContainerTags = Array[String](["abilities.weapon.left"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_mtsda"]
|
||||
script = ExtResource("3_u5iw7")
|
||||
Tag = "events.weapon.startedflying"
|
||||
metadata/_custom_type_script = "uid://dpakv7agvir6y"
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_85dnt")
|
||||
Name = "Exploding Sword on Weapon Left"
|
||||
CooldownEffects = []
|
||||
AbilityBehavior = ExtResource("1_m0rkb")
|
||||
TriggerSource = 1
|
||||
TriggerTag = SubResource("Resource_mtsda")
|
||||
AbilityTags = SubResource("Resource_cjh4j")
|
||||
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"
|
||||
@@ -0,0 +1,75 @@
|
||||
[gd_resource type="Resource" script_class="ForgeEffectData" format=3 uid="uid://cffil4tic3ysg"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_bi1d8"]
|
||||
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="1_qae83"]
|
||||
[ext_resource type="Script" uid="uid://dngf30hxy5go4" path="res://addons/forge/resources/components/ModifierTags.cs" id="1_scapu"]
|
||||
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="2_scapu"]
|
||||
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="3_fp8ou"]
|
||||
[ext_resource type="Script" uid="uid://2gm1hdhi8u08" path="res://addons/forge/resources/magnitudes/ForgeModifierMagnitude.cs" id="4_xxxse"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_gi65x"]
|
||||
script = ExtResource("1_bi1d8")
|
||||
ContainerTags = Array[String](["character.player.mana.regen.inhibited"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_bi1d8"]
|
||||
script = ExtResource("1_scapu")
|
||||
TagsToAdd = SubResource("Resource_gi65x")
|
||||
metadata/_custom_type_script = "uid://dngf30hxy5go4"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_pqllu"]
|
||||
script = ExtResource("3_fp8ou")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_1inmd"]
|
||||
script = ExtResource("3_fp8ou")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_cv55m"]
|
||||
script = ExtResource("3_fp8ou")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_68n87"]
|
||||
script = ExtResource("3_fp8ou")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_og1rv"]
|
||||
script = ExtResource("3_fp8ou")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_cqegr"]
|
||||
script = ExtResource("3_fp8ou")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_mbpss"]
|
||||
script = ExtResource("3_fp8ou")
|
||||
BaseValue = 1.0
|
||||
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_exi3e"]
|
||||
script = ExtResource("4_xxxse")
|
||||
ScalableFloat = SubResource("Resource_mbpss")
|
||||
Coefficient = SubResource("Resource_68n87")
|
||||
PreMultiplyAdditiveValue = SubResource("Resource_cqegr")
|
||||
PostMultiplyAdditiveValue = SubResource("Resource_og1rv")
|
||||
CalculatorCoefficient = SubResource("Resource_pqllu")
|
||||
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_cv55m")
|
||||
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_1inmd")
|
||||
metadata/_custom_type_script = "uid://2gm1hdhi8u08"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_1go02"]
|
||||
script = ExtResource("1_qae83")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_ijayu"]
|
||||
script = ExtResource("1_qae83")
|
||||
BaseValue = 1
|
||||
|
||||
[resource]
|
||||
script = ExtResource("2_scapu")
|
||||
Name = "Inhibit Player Mana Regen Temp"
|
||||
Modifiers = []
|
||||
Components = Array[Object]([SubResource("Resource_bi1d8")])
|
||||
Executions = []
|
||||
DurationType = 2
|
||||
Duration = SubResource("Resource_exi3e")
|
||||
StackLimit = SubResource("Resource_ijayu")
|
||||
InitialStack = SubResource("Resource_1go02")
|
||||
Cues = []
|
||||
metadata/_custom_type_script = "uid://b83hf13nj37k3"
|
||||
@@ -0,0 +1,7 @@
|
||||
[gd_resource type="Resource" script_class="ForgeInstantEndBehavior" format=3 uid="uid://crgwob8t8yysq"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://c7s5v7ii4nujg" path="res://forge/abilities/ForgeInstantEndBehavior.cs" id="1_hly5b"]
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_hly5b")
|
||||
metadata/_custom_type_script = "uid://c7s5v7ii4nujg"
|
||||
@@ -0,0 +1,83 @@
|
||||
[gd_resource type="Resource" script_class="ForgeEffectData" format=3 uid="uid://dh437cuxgjv6b"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="1_mlifq"]
|
||||
[ext_resource type="Resource" uid="uid://dn7b8frkoxpxr" path="res://scenes/player_controller/resources/forge/player_mana_changed_cue.tres" id="1_nsr3v"]
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_q8tml"]
|
||||
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="2_5tp50"]
|
||||
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="2_pm3n3"]
|
||||
[ext_resource type="Script" uid="uid://b0eq12mjqfage" path="res://addons/forge/resources/components/TargetTagRequirements.cs" id="2_xbgy2"]
|
||||
[ext_resource type="Script" uid="uid://bdfcavbjyhxxa" path="res://addons/forge/resources/ForgeModifier.cs" id="3_nsr3v"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_5yygy"]
|
||||
script = ExtResource("1_q8tml")
|
||||
ContainerTags = Array[String](["character.player.mana.regen.inhibited"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_ncjx6"]
|
||||
script = ExtResource("2_xbgy2")
|
||||
OngoingIgnoredTags = SubResource("Resource_5yygy")
|
||||
metadata/_custom_type_script = "uid://b0eq12mjqfage"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_pm3n3"]
|
||||
script = ExtResource("1_mlifq")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_q8tml"]
|
||||
script = ExtResource("2_pm3n3")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_xbgy2"]
|
||||
script = ExtResource("2_pm3n3")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_rhldn"]
|
||||
script = ExtResource("2_pm3n3")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_p6h8c"]
|
||||
script = ExtResource("2_pm3n3")
|
||||
BaseValue = 1.0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_yqxv4"]
|
||||
script = ExtResource("2_pm3n3")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_b6opn"]
|
||||
script = ExtResource("2_pm3n3")
|
||||
|
||||
[sub_resource type="Resource" id="Resource_5frso"]
|
||||
script = ExtResource("2_pm3n3")
|
||||
BaseValue = 2.0
|
||||
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_okenf"]
|
||||
script = ExtResource("3_nsr3v")
|
||||
Attribute = "PlayerAttributeSet.Mana"
|
||||
ScalableFloat = SubResource("Resource_5frso")
|
||||
Coefficient = SubResource("Resource_p6h8c")
|
||||
PreMultiplyAdditiveValue = SubResource("Resource_b6opn")
|
||||
PostMultiplyAdditiveValue = SubResource("Resource_yqxv4")
|
||||
CalculatorCoefficient = SubResource("Resource_q8tml")
|
||||
CalculatorPreMultiplyAdditiveValue = SubResource("Resource_rhldn")
|
||||
CalculatorPostMultiplyAdditiveValue = SubResource("Resource_xbgy2")
|
||||
metadata/_custom_type_script = "uid://bdfcavbjyhxxa"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_w35mq"]
|
||||
script = ExtResource("2_pm3n3")
|
||||
BaseValue = 0.1
|
||||
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_nsr3v"]
|
||||
script = ExtResource("1_mlifq")
|
||||
BaseValue = 1
|
||||
|
||||
[resource]
|
||||
script = ExtResource("2_5tp50")
|
||||
Name = "Mana Regeneration"
|
||||
Modifiers = Array[Object]([SubResource("Resource_okenf")])
|
||||
Components = [SubResource("Resource_ncjx6")]
|
||||
Executions = []
|
||||
DurationType = 1
|
||||
HasPeriodicApplication = true
|
||||
Period = SubResource("Resource_w35mq")
|
||||
StackLimit = SubResource("Resource_nsr3v")
|
||||
InitialStack = SubResource("Resource_pm3n3")
|
||||
Cues = Array[Object]([ExtResource("1_nsr3v")])
|
||||
metadata/_custom_type_script = "uid://b83hf13nj37k3"
|
||||
@@ -0,0 +1,17 @@
|
||||
[gd_resource type="Resource" script_class="ForgeCue" format=3 uid="uid://dn7b8frkoxpxr"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_lbula"]
|
||||
[ext_resource type="Script" uid="uid://cmrsxccn0ei4j" path="res://addons/forge/resources/ForgeCue.cs" id="2_jijlk"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_4mhqs"]
|
||||
script = ExtResource("1_lbula")
|
||||
ContainerTags = Array[String](["cues.resources.mana"])
|
||||
metadata/_custom_type_script = "uid://cw525n4mjqgw0"
|
||||
|
||||
[resource]
|
||||
script = ExtResource("2_jijlk")
|
||||
CueKeys = SubResource("Resource_4mhqs")
|
||||
MaxValue = 100
|
||||
MagnitudeType = 2
|
||||
MagnitudeAttribute = "PlayerAttributeSet.Mana"
|
||||
metadata/_custom_type_script = "uid://cmrsxccn0ei4j"
|
||||
@@ -0,0 +1,12 @@
|
||||
[gd_resource type="Resource" script_class="ForgeRaiseEventTagExecution" format=3 uid="uid://oe2suroa1klj"]
|
||||
|
||||
[ext_resource type="Script" uid="uid://cw525n4mjqgw0" path="res://addons/forge/resources/ForgeTagContainer.cs" id="1_iqjlm"]
|
||||
[ext_resource type="Script" path="res://forge/calculators/ForgeRaiseEventTagExecution.cs" id="2_am2ak"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_sxbq4"]
|
||||
script = ExtResource("1_iqjlm")
|
||||
ContainerTags = Array[String](["events.weapon.flyingtick"])
|
||||
|
||||
[resource]
|
||||
script = ExtResource("2_am2ak")
|
||||
metadata/_custom_type_script = "uid://br7ut4lbau66w"
|
||||
@@ -0,0 +1,55 @@
|
||||
[gd_resource type="Resource" script_class="ForgeAbilityData" format=3 uid="uid://btnnpqann3ktp"]
|
||||
|
||||
[ext_resource type="Resource" uid="uid://oe2suroa1klj" path="res://scenes/player_controller/resources/forge/raise_flying_tick_event.tres" id="1_pdt6v"]
|
||||
[ext_resource type="Script" uid="uid://dhxfbxh54pyxp" path="res://addons/forge/resources/abilities/ForgeAbilityData.cs" id="1_vh0wp"]
|
||||
[ext_resource type="Script" uid="uid://1hgogislo1l6" path="res://addons/forge/resources/magnitudes/ForgeScalableInt.cs" id="2_xkoyb"]
|
||||
[ext_resource type="Script" uid="uid://cn3b4ya15fg7e" path="res://addons/forge/resources/magnitudes/ForgeScalableFloat.cs" id="3_j2gem"]
|
||||
[ext_resource type="Script" uid="uid://b83hf13nj37k3" path="res://addons/forge/resources/ForgeEffectData.cs" id="4_e2sm2"]
|
||||
[ext_resource type="Script" uid="uid://cl5hudinl1rex" path="res://forge/abilities/ForgeEffectApplicationBehavior.cs" id="5_trglf"]
|
||||
[ext_resource type="Script" uid="uid://dpakv7agvir6y" path="res://addons/forge/resources/ForgeTag.cs" id="6_napws"]
|
||||
|
||||
[sub_resource type="Resource" id="Resource_dgkld"]
|
||||
script = ExtResource("2_xkoyb")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_1ften"]
|
||||
script = ExtResource("3_j2gem")
|
||||
BaseValue = 0.2
|
||||
metadata/_custom_type_script = "uid://cn3b4ya15fg7e"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_l278c"]
|
||||
script = ExtResource("2_xkoyb")
|
||||
BaseValue = 1
|
||||
|
||||
[sub_resource type="Resource" id="Resource_esyoj"]
|
||||
script = ExtResource("4_e2sm2")
|
||||
Modifiers = []
|
||||
Components = []
|
||||
Executions = Array[Object]([ExtResource("1_pdt6v")])
|
||||
DurationType = 1
|
||||
HasPeriodicApplication = true
|
||||
Period = SubResource("Resource_1ften")
|
||||
ExecuteOnApplication = true
|
||||
StackLimit = SubResource("Resource_l278c")
|
||||
InitialStack = SubResource("Resource_dgkld")
|
||||
Cues = []
|
||||
metadata/_custom_type_script = "uid://b83hf13nj37k3"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_0xegy"]
|
||||
script = ExtResource("5_trglf")
|
||||
EffectData = SubResource("Resource_esyoj")
|
||||
metadata/_custom_type_script = "uid://cl5hudinl1rex"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_4aw8y"]
|
||||
script = ExtResource("6_napws")
|
||||
Tag = "events.weapon.startedflying"
|
||||
metadata/_custom_type_script = "uid://dpakv7agvir6y"
|
||||
|
||||
[resource]
|
||||
script = ExtResource("1_vh0wp")
|
||||
Name = "Weapon Flying Tick"
|
||||
CooldownEffects = []
|
||||
AbilityBehavior = SubResource("Resource_0xegy")
|
||||
TriggerSource = 1
|
||||
TriggerTag = SubResource("Resource_4aw8y")
|
||||
metadata/_custom_type_script = "uid://dhxfbxh54pyxp"
|
||||
@@ -11,7 +11,6 @@ public class PlayerAttributeSet : AttributeSet
|
||||
|
||||
public PlayerAttributeSet()
|
||||
{
|
||||
// Initialize the attributes with the current, min and max values.
|
||||
Health = InitializeAttribute(nameof(Health), 100, 0, 150);
|
||||
Mana = InitializeAttribute(nameof(Mana), 100, 0, 100);
|
||||
Strength = InitializeAttribute(nameof(Strength), 10, 0, 99);
|
||||
|
||||
@@ -1,19 +1,37 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using Gamesmiths.Forge.Abilities;
|
||||
using Gamesmiths.Forge.Attributes;
|
||||
using Gamesmiths.Forge.Core;
|
||||
using Gamesmiths.Forge.Effects;
|
||||
using Gamesmiths.Forge.Effects.Calculator;
|
||||
using Gamesmiths.Forge.Effects.Components;
|
||||
using Gamesmiths.Forge.Effects.Duration;
|
||||
using Gamesmiths.Forge.Effects.Magnitudes;
|
||||
using Gamesmiths.Forge.Effects.Modifiers;
|
||||
using Gamesmiths.Forge.Effects.Periodic;
|
||||
using Gamesmiths.Forge.Events;
|
||||
using Gamesmiths.Forge.Godot.Core;
|
||||
using Gamesmiths.Forge.Godot.Nodes;
|
||||
using Gamesmiths.Forge.Godot.Resources;
|
||||
using Gamesmiths.Forge.Godot.Resources.Abilities;
|
||||
using Gamesmiths.Forge.Tags;
|
||||
|
||||
using Godot;
|
||||
using GodotStateCharts;
|
||||
|
||||
using Movementtests.addons.godot_state_charts.csharp;
|
||||
using Movementtests.interfaces;
|
||||
using Movementtests.systems;
|
||||
using Movementtests.player_controller.Scripts;
|
||||
using Movementtests.scenes.player_controller.scripts;
|
||||
using Movementtests.tools;
|
||||
using Movementtests.forge.abilities;
|
||||
using Movementtests.tools.calculators;
|
||||
using RustyOptions;
|
||||
|
||||
public record struct EmpoweredActionPayload;
|
||||
|
||||
[GlobalClass, Icon("res://assets/ui/IconGodotNode/node_3D/icon_character.png")]
|
||||
public partial class PlayerController : CharacterBody3D,
|
||||
IDamageable,
|
||||
@@ -92,6 +110,26 @@ public partial class PlayerController : CharacterBody3D,
|
||||
[Export] public bool HasSword { get; set; } = true;
|
||||
[Export] public bool HasParry { get; set; } = true;
|
||||
|
||||
// Forge stuff
|
||||
[ExportCategory("Forge")]
|
||||
[ExportGroup("General")]
|
||||
[Export]
|
||||
public ForgeTagContainer BaseTags { get; set; } = new();
|
||||
[Export] public ForgeTag EmpoweredActionUsed;
|
||||
|
||||
[ExportGroup("Abilities")]
|
||||
[ExportSubgroup("Common and defaults")]
|
||||
[Export] public ForgeAbilityData EmpoweredActionAbility = null!;
|
||||
[Export] public ForgeAbilityData[] DefaultPermanentAbilities = [];
|
||||
[ExportSubgroup("WeaponThrow")]
|
||||
[Export] public ForgeAbilityData[] AbilityLoadout = [];
|
||||
|
||||
[ExportGroup("Effects")]
|
||||
[ExportSubgroup("Common and defaults")]
|
||||
[Export] public ForgeEffectData[] DefaultPermanentEffects = [];
|
||||
[ExportSubgroup("Applied on Empowered Action used")]
|
||||
[Export] public ForgeEffectData[] EmpoweredActionEffects = [];
|
||||
|
||||
// Combat stuff
|
||||
[ExportCategory("Combat")]
|
||||
[ExportGroup("General")]
|
||||
@@ -399,6 +437,8 @@ public partial class PlayerController : CharacterBody3D,
|
||||
private RayCast3D _aimAssisRayCast = null!;
|
||||
private Camera3D _camera = null!;
|
||||
|
||||
private AbilityHandle? _empoweredActionHandle;
|
||||
|
||||
public override void _Ready()
|
||||
{
|
||||
LoadSettings();
|
||||
@@ -415,25 +455,56 @@ public partial class PlayerController : CharacterBody3D,
|
||||
_aimAssisRayCast.TargetPosition = _aimAssisRayCast.TargetPosition.Normalized() * (TargetingDistance*1.5f);
|
||||
|
||||
// Forge stuff
|
||||
var forgeManager = GetTree().Root.GetNode<ForgeManager>("ForgeManager")!;
|
||||
var baseTags = new TagContainer(
|
||||
forgeManager.TagsManager,
|
||||
[
|
||||
Tag.RequestTag(forgeManager.TagsManager, "character.player"),
|
||||
Tag.RequestTag(forgeManager.TagsManager, "class.warrior")
|
||||
]);
|
||||
var tagsManager = ForgeManagers.Instance.TagsManager;
|
||||
var cuesManager = ForgeManagers.Instance.CuesManager;
|
||||
|
||||
Attributes = new EntityAttributes(new PlayerAttributeSet());
|
||||
Tags = new EntityTags(baseTags);
|
||||
EffectsManager = new EffectsManager(this, forgeManager.CuesManager);
|
||||
List<AttributeSet> attributeSetList = [];
|
||||
foreach (Node node in GetChildren())
|
||||
{
|
||||
if (node is ForgeAttributeSet attributeSetNode)
|
||||
{
|
||||
AttributeSet? attributeSet = attributeSetNode.GetAttributeSet();
|
||||
|
||||
if (attributeSet is not null)
|
||||
{
|
||||
attributeSetList.Add(attributeSet);
|
||||
}
|
||||
}
|
||||
}
|
||||
Attributes = new EntityAttributes([.. attributeSetList]);
|
||||
Tags = new(BaseTags.GetTagContainer());
|
||||
EffectsManager = new EffectsManager(this, cuesManager);
|
||||
Abilities = new(this);
|
||||
Events = new();
|
||||
|
||||
var health = Attributes["PlayerAttributeSet.Health"].CurrentValue; // 100
|
||||
var mana = Attributes["PlayerAttributeSet.Mana"].CurrentValue; // 100
|
||||
var strength = Attributes["PlayerAttributeSet.Strength"].CurrentValue; // 10
|
||||
var speed = Attributes["PlayerAttributeSet.Speed"].CurrentValue; // 5
|
||||
GD.Print(health, mana, strength, speed);
|
||||
_empoweredActionHandle = Abilities.GrantAbilityPermanently(
|
||||
EmpoweredActionAbility.GetAbilityData(),
|
||||
abilityLevel: 1,
|
||||
levelOverridePolicy: LevelComparison.None,
|
||||
sourceEntity: this);
|
||||
foreach (var ability in DefaultPermanentAbilities)
|
||||
{
|
||||
Abilities.GrantAbilityPermanently(
|
||||
ability.GetAbilityData(),
|
||||
abilityLevel: 1,
|
||||
levelOverridePolicy: LevelComparison.None,
|
||||
sourceEntity: this);
|
||||
}
|
||||
|
||||
// Apply all default effects
|
||||
foreach (var effect in DefaultPermanentEffects)
|
||||
{
|
||||
EffectsManager.ApplyEffect(new Effect(effect.GetEffectData(), new EffectOwnership(this, this)));
|
||||
}
|
||||
|
||||
// Subscribe default empowered actions effects to the Empowered Action Used event
|
||||
foreach (var effect in EmpoweredActionEffects)
|
||||
{
|
||||
Events.Subscribe<EmpoweredActionPayload>(EmpoweredActionUsed.GetTag(), data =>
|
||||
{
|
||||
EffectsManager.ApplyEffect(new Effect(effect.GetEffectData(), new EffectOwnership(this, this)));
|
||||
});
|
||||
}
|
||||
|
||||
// DashIndicator = GetNode<TextureRect>("%DashIndicator");
|
||||
PowerCooldownIndicator = GetNode<ColorRect>("%DashCooldownIndicator");
|
||||
@@ -499,7 +570,7 @@ public partial class PlayerController : CharacterBody3D,
|
||||
}
|
||||
if (RKnockback != null) CKnockback!.RKnockback = RKnockback;
|
||||
|
||||
PlayerUi.Initialize(CHealth.CurrentHealth);
|
||||
PlayerUi.Initialize(CHealth.CurrentHealth, Attributes["PlayerAttributeSet.Mana"].BaseValue);
|
||||
CDamageable.DamageTaken += (damageable, record) => ReduceHealth(damageable, record);
|
||||
CDamageable.DamageTaken += (_, record) => RegisterKnockback(new KnockbackRecord(record));
|
||||
CHealth.HealthChanged += PlayerUi.OnHealthChanged;
|
||||
@@ -674,8 +745,55 @@ public partial class PlayerController : CharacterBody3D,
|
||||
_parryStandard.StateEntered += OnStandardParryStarted;
|
||||
_parryDash.StateEntered += OnDashParryStarted;
|
||||
|
||||
// Testing out kill
|
||||
// GetTree().CreateTimer(2).Timeout += () => Kill(this);
|
||||
foreach (var weaponLandAbility in AbilityLoadout)
|
||||
{
|
||||
var leftGrantAbilityConfig = new GrantAbilityConfig(
|
||||
weaponLandAbility.GetAbilityData(),
|
||||
ScalableLevel: new ScalableInt(1),
|
||||
RemovalPolicy: AbilityDeactivationPolicy.CancelImmediately,
|
||||
InhibitionPolicy: AbilityDeactivationPolicy.CancelImmediately,
|
||||
TryActivateOnGrant: false,
|
||||
TryActivateOnEnable: false,
|
||||
LevelOverridePolicy: LevelComparison.Higher);
|
||||
|
||||
var leftGrantComponent = new GrantAbilityEffectComponent([leftGrantAbilityConfig]);
|
||||
var leftGrantEffect = new EffectData(
|
||||
"Grant Weapon Left Ability",
|
||||
new DurationData(DurationType.Infinite),
|
||||
effectComponents: [leftGrantComponent]);
|
||||
EffectsManager.ApplyEffect(new Effect(leftGrantEffect, new EffectOwnership(this, this)));
|
||||
}
|
||||
// GetTree().CreateTimer(5).Timeout += () => WeaponSystem.GrantNewAbilityForWeaponFly(weaponLandAbility);
|
||||
// Forge events
|
||||
var weaponLeftToken = WeaponSystem.Events.Subscribe(WeaponSystem.WeaponStartedFlyingEventTag, OnWeaponLeft);
|
||||
var weaponLandedToken = WeaponSystem.Events.Subscribe(WeaponSystem.WeaponStoppedFlyingEventTag, OnWeaponLanded);
|
||||
}
|
||||
|
||||
public void OnWeaponLeft(EventData data)
|
||||
{
|
||||
var target = data.Target;
|
||||
|
||||
var tagsManager = ForgeManagers.Instance.TagsManager;
|
||||
var weaponLeftTag = Tag.RequestTag(tagsManager, "abilities.weapon.left").GetSingleTagContainer();
|
||||
if (weaponLeftTag == null) return;
|
||||
Abilities.TryActivateAbilitiesByTag(weaponLeftTag, target, out var landedFailures);
|
||||
}
|
||||
|
||||
public void OnWeaponLanded(EventData data)
|
||||
{
|
||||
var source = data.Source;
|
||||
var target = data.Target;
|
||||
var magnitude = data.EventMagnitude;
|
||||
var weaponLandPayload = data.Payload;
|
||||
|
||||
var tagsManager = ForgeManagers.Instance.TagsManager;
|
||||
|
||||
var weaponLandTag = Tag.RequestTag(tagsManager, "abilities.weapon.land").GetSingleTagContainer();
|
||||
if (weaponLandTag == null) return;
|
||||
var anyActivated = Abilities.TryActivateAbilitiesByTag(
|
||||
weaponLandTag,
|
||||
target,
|
||||
out var failures);
|
||||
}
|
||||
|
||||
///////////////////////////
|
||||
@@ -735,7 +853,7 @@ public partial class PlayerController : CharacterBody3D,
|
||||
{
|
||||
RHealth.StartingHealth = newHealthValue;
|
||||
CHealth!.CurrentHealth = newHealthValue;
|
||||
PlayerUi.Initialize(CHealth.CurrentHealth);
|
||||
PlayerUi.Initialize(CHealth.CurrentHealth, Attributes["PlayerAttributeSet.Mana"].BaseValue);
|
||||
}
|
||||
public void SetPlayerDamageOverride(float newDamageValue)
|
||||
{
|
||||
@@ -1913,14 +2031,64 @@ public partial class PlayerController : CharacterBody3D,
|
||||
|
||||
public bool CanPerformEmpoweredAction()
|
||||
{
|
||||
if(_empoweredActionHandle == null) return false;
|
||||
var cooldowns = _empoweredActionHandle.GetCooldownData();
|
||||
foreach (var cd in cooldowns)
|
||||
{
|
||||
//GD.Print($"Cooldown remaining: {cd.RemainingTime}");
|
||||
}
|
||||
var costs = _empoweredActionHandle.GetCostData();
|
||||
foreach (var cost in costs)
|
||||
{
|
||||
// Assuming you want to check Mana costs
|
||||
if (cost.Attribute == "PlayerAttributeSet.Mana")
|
||||
{
|
||||
//GD.Print($"Mana Cost: {cost.Cost}");
|
||||
}
|
||||
}
|
||||
|
||||
var canActivate = _empoweredActionHandle.CanActivate(out var failures);
|
||||
if (!canActivate)
|
||||
{
|
||||
GD.PrintErr($"Cannot activate empowered action: {failures}");
|
||||
if (failures.HasFlag(AbilityActivationFailures.Cooldown)) GD.PrintErr("In Cooldown");
|
||||
if (failures.HasFlag(AbilityActivationFailures.InsufficientResources)) GD.PrintErr("Not Enough Mana");
|
||||
}
|
||||
return canActivate;
|
||||
return EmpoweredActionsLeft > 0 && TutorialDone;
|
||||
}
|
||||
public void PerformEmpoweredAction()
|
||||
{
|
||||
if(_empoweredActionHandle == null) return;
|
||||
|
||||
var canActivate = _empoweredActionHandle.Activate(out var failures);
|
||||
if (!canActivate)
|
||||
{
|
||||
GD.PrintErr($"Cannot activate empowered action: {failures}");
|
||||
if (failures.HasFlag(AbilityActivationFailures.Cooldown)) GD.PrintErr("In Cooldown");
|
||||
if (failures.HasFlag(AbilityActivationFailures.InsufficientResources)) GD.PrintErr("Not Enough Mana");
|
||||
}
|
||||
else
|
||||
{
|
||||
GD.Print($"Remaining mana: {Attributes["PlayerAttributeSet.Mana"].CurrentValue}");
|
||||
}
|
||||
|
||||
// Inhibit Mana Regeneration for a while after using an empowered action
|
||||
// TODO: Use Forge events instead of relying on direct referencing
|
||||
// _manaRegenEffectHandle!.SetInhibit(true);
|
||||
// GetTree().CreateTimer(EmpoweredAction.ManaRegenPause).Timeout += () => {_manaRegenEffectHandle!.SetInhibit(false);};
|
||||
|
||||
_isWallJumpAvailable = true;
|
||||
_canDashAirborne = true;
|
||||
EmpoweredActionsLeft--;
|
||||
_playerState.SendEvent(EmpoweredActionsLeft <= 0 ? "expired" : "power_used");
|
||||
|
||||
Events.Raise(new EventData<EmpoweredActionPayload>
|
||||
{
|
||||
EventTags = EmpoweredActionUsed.GetTag().GetSingleTagContainer()!,
|
||||
Source = this,
|
||||
Payload = new EmpoweredActionPayload()
|
||||
});
|
||||
}
|
||||
|
||||
///////////////////////////
|
||||
@@ -2223,14 +2391,10 @@ public partial class PlayerController : CharacterBody3D,
|
||||
_spaceState = GetWorld3D().DirectSpaceState;
|
||||
|
||||
if (_currentInputBufferFrames > 0) _currentInputBufferFrames -= 1;
|
||||
|
||||
// Limit maximum speed
|
||||
if (Velocity.Length() > AbsoluteMaxSpeed)
|
||||
Velocity = Velocity.Normalized() * AbsoluteMaxSpeed;
|
||||
|
||||
// Manage head and camera movement
|
||||
LookAround(delta);
|
||||
|
||||
// Manage general movement
|
||||
Velocity += ComputeKnockback();
|
||||
MoveSlideAndHandleStairs((float) delta);
|
||||
@@ -2238,19 +2402,20 @@ public partial class PlayerController : CharacterBody3D,
|
||||
// Manage gameplay systems
|
||||
MantleSystem.ProcessMantle(_grounded.Active);
|
||||
HandleEnemyTargeting();
|
||||
}
|
||||
|
||||
// Manage dash target and tutorial specific stuff
|
||||
// if (WeaponSystem.InHandState.Active && !_aiming.Active && TutorialDone)
|
||||
// {
|
||||
// DashIndicatorMesh.Visible = false;
|
||||
// }
|
||||
// if (!WeaponSystem.InHandState.Active && TutorialDone)
|
||||
// {
|
||||
// DashIndicatorMesh.Visible = true;
|
||||
//
|
||||
// DashIndicatorMeshCylinder.Height = WeaponSystem.GlobalPosition.DistanceTo(GlobalPosition) * 2;
|
||||
// DashIndicatorNode.LookAt(WeaponSystem.GlobalPosition);
|
||||
// }
|
||||
// private float _oldMana = 100;
|
||||
public override void _Process(double delta)
|
||||
{
|
||||
// Manage head and camera movement
|
||||
LookAround(delta);
|
||||
|
||||
EffectsManager.UpdateEffects(delta);
|
||||
// TODO: change for actual Cue
|
||||
// var currentMana = Attributes["PlayerAttributeSet.Mana"].CurrentValue;
|
||||
// if (Mathf.Abs(currentMana - _oldMana) > Mathf.Epsilon)
|
||||
// PlayerUi.OnManaChanged(currentMana);
|
||||
// _oldMana = currentMana;
|
||||
}
|
||||
|
||||
///////////////////////////
|
||||
|
||||
@@ -4,8 +4,10 @@ using System;
|
||||
[GlobalClass, Icon("res://assets/ui/IconGodotNode/control/icon_heart.png")]
|
||||
public partial class Healthbar : ProgressBar
|
||||
{
|
||||
private Timer _damageCatchUpTimer;
|
||||
private ProgressBar _damagedHealth;
|
||||
private Timer _damageCatchUpTimer = null!;
|
||||
private ProgressBar _damagedHealth = null!;
|
||||
|
||||
[Export] public StyleBox? BarStyle;
|
||||
|
||||
private float _currentHealth;
|
||||
public float CurrentHealth
|
||||
@@ -21,6 +23,9 @@ public partial class Healthbar : ProgressBar
|
||||
|
||||
_damageCatchUpTimer.Timeout += OnDamageCatchUp;
|
||||
Visible = false;
|
||||
|
||||
if (BarStyle != null)
|
||||
AddThemeStyleboxOverride("fill", BarStyle);
|
||||
}
|
||||
|
||||
public void Initialize(float initialHealth)
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
[sub_resource type="StyleBoxEmpty" id="StyleBoxEmpty_0sgot"]
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_0k5hr"]
|
||||
bg_color = Color(0.698864, 0.047356047, 0, 1)
|
||||
bg_color = Color(0.69803923, 0.047058824, 0, 1)
|
||||
|
||||
[sub_resource type="StyleBoxFlat" id="StyleBoxFlat_0sgot"]
|
||||
bg_color = Color(0.14767182, 0.14767182, 0.14767176, 1)
|
||||
|
||||
@@ -14,17 +14,20 @@ public class HeadSystemUnitTest
|
||||
public void SetupTest()
|
||||
{
|
||||
_head = new HeadSystem();
|
||||
_head._camera = new Camera3D();
|
||||
_head.AddChild(_head._camera);
|
||||
_head.Camera = new Camera3D();
|
||||
_head.AddChild(_head.Camera);
|
||||
|
||||
_head._cameraAnchor = new Marker3D();
|
||||
_head.AddChild(_head._cameraAnchor);
|
||||
// _head._cameraAnchor = new Marker3D();
|
||||
_head.AddChild(_head.CameraAnchor);
|
||||
|
||||
_head._fpRig = new Node3D();
|
||||
_head.AddChild(_head._fpRig);
|
||||
|
||||
_head._fpDisplacedRig = new Node3D();
|
||||
_head.AddChild(_head._fpDisplacedRig);
|
||||
_head.FpRig = new Node3D();
|
||||
_head.AddChild(_head.FpRig);
|
||||
_head.CameraAnchor = new Node3D();
|
||||
_head.AddChild(_head.CameraAnchor);
|
||||
_head.RightHandedWeapon = new Node3D();
|
||||
_head.AddChild(_head.RightHandedWeapon);
|
||||
_head.LeftHandedWeapon = new Node3D();
|
||||
_head.AddChild(_head.LeftHandedWeapon);
|
||||
}
|
||||
|
||||
[AfterTest]
|
||||
|
||||
@@ -99,7 +99,7 @@ public class PlayerControllerUnitTest
|
||||
{
|
||||
var mockUi = new PlayerUi();
|
||||
var dashIcons = new TextureRect[3] { new TextureRect(), new TextureRect(), new TextureRect() };
|
||||
mockUi._dashIcons = dashIcons;
|
||||
mockUi.DashIcons = dashIcons;
|
||||
|
||||
_player.PlayerUi = mockUi;
|
||||
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
using Gamesmiths.Forge.Cues;
|
||||
using Gamesmiths.Forge.Tags;
|
||||
using Godot;
|
||||
|
||||
namespace Movementtests.tools;
|
||||
|
||||
public partial class ForgeManager : Node
|
||||
{
|
||||
public CuesManager CuesManager { get; private set; } = new CuesManager();
|
||||
public TagsManager TagsManager { get; private set; } = new TagsManager(
|
||||
[
|
||||
"character.player",
|
||||
"class.warrior",
|
||||
"status.stunned",
|
||||
"status.burning",
|
||||
"status.enraged",
|
||||
"status.immune.fire",
|
||||
"cues.damage.fire",
|
||||
"events.combat.damage",
|
||||
"events.combat.hit",
|
||||
"cooldown.fireball"
|
||||
]);
|
||||
|
||||
public ForgeManager()
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
uid://c75tpswl62eew
|
||||
Reference in New Issue
Block a user