Mappable switches

This commit is contained in:
Marco 2025-06-18 12:18:45 +02:00
commit 1454e55629
6 changed files with 165 additions and 7 deletions

Binary file not shown.

View file

@ -2030,6 +2030,10 @@ shape = SubResource("ConvexPolygonShape3D_p8h87")
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 26, 1.125, 23.5)
TargetName = &"actor_elevator_test"
[node name="entity_115_actor_controlpad" parent="FuncGodotMap" instance=ExtResource("35_c4mw0")]
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 22.25, 1.75, 26.25)
TargetGroup = "actor_elevator_test"
[node name="Props" type="Node3D" parent="."]
[node name="Mainframe3d" parent="Props" instance=ExtResource("16_u5cc4")]

View file

@ -1511,6 +1511,7 @@
// entity 1
{
"classname" "wall_grille"
"targetname" "actor_elevator_test"
// brush 0
{
( 348 168 16 ) ( 348 168 17 ) ( 348 167 16 ) special/clip [ 0 -1 0 -24 ] [ 0 0 1 -16 ] 180 1 -1
@ -1524,6 +1525,7 @@
// entity 2
{
"classname" "wall_grille"
"targetname" "actor_elevator_test"
// brush 0
{
( 348 184 16 ) ( 348 184 17 ) ( 348 183 16 ) special/clip [ 0 -1 0 -8 ] [ 0 0 1 -16 ] 180 1 -1
@ -1966,570 +1968,681 @@
{
"classname" "light_omni"
"origin" "248 456 40"
"targetname" "actor_elevator_test"
}
// entity 28
{
"classname" "light_spot"
"origin" "136 408 40"
"targetname" "actor_elevator_test"
}
// entity 29
{
"classname" "light_omni"
"origin" "312 232 40"
"targetname" "actor_elevator_test"
}
// entity 30
{
"classname" "light_omni"
"origin" "408 280 40"
"targetname" "actor_elevator_test"
}
// entity 31
{
"classname" "light_omni"
"origin" "408 168 40"
"targetname" "actor_elevator_test"
}
// entity 32
{
"classname" "light_omni"
"origin" "504 184 40"
"targetname" "actor_elevator_test"
}
// entity 33
{
"classname" "light_omni"
"origin" "376 104 40"
"targetname" "actor_elevator_test"
}
// entity 34
{
"classname" "light_omni"
"origin" "488 264 40"
"targetname" "actor_elevator_test"
}
// entity 35
{
"classname" "light_omni"
"origin" "488 328 40"
"targetname" "actor_elevator_test"
}
// entity 36
{
"classname" "light_omni"
"origin" "488 408 40"
"targetname" "actor_elevator_test"
}
// entity 37
{
"classname" "actor_barrel_1"
"origin" "184 504 24"
"targetname" "actor_elevator_test"
}
// entity 38
{
"classname" "actor_barrel_1"
"origin" "184 520 24"
"targetname" "actor_elevator_test"
}
// entity 39
{
"classname" "actor_barrel_1"
"origin" "184 536 24"
"targetname" "actor_elevator_test"
}
// entity 40
{
"classname" "actor_barrel_1"
"origin" "264 360 24"
"targetname" "actor_elevator_test"
}
// entity 41
{
"classname" "actor_tank"
"origin" "280 544 24"
"targetname" "actor_elevator_test"
}
// entity 42
{
"classname" "actor_box_wood"
"origin" "332 360 20"
"targetname" "actor_elevator_test"
}
// entity 43
{
"classname" "actor_box_wood"
"origin" "284 360 20"
"angle" "90"
"targetname" "actor_elevator_test"
}
// entity 44
{
"classname" "actor_tube_straight"
"origin" "248 552 24"
"targetname" "actor_elevator_test"
}
// entity 45
{
"classname" "actor_tube_straight"
"origin" "248 536 24"
"targetname" "actor_elevator_test"
}
// entity 46
{
"classname" "actor_tube_straight"
"origin" "248 520 24"
"targetname" "actor_elevator_test"
}
// entity 47
{
"classname" "actor_tube_straight"
"origin" "248 504 24"
"targetname" "actor_elevator_test"
}
// entity 48
{
"classname" "actor_tube_junction"
"origin" "248 488 24"
"angle" "90"
"targetname" "actor_elevator_test"
}
// entity 49
{
"classname" "actor_tube_straight"
"origin" "216 504 24"
"targetname" "actor_elevator_test"
}
// entity 50
{
"classname" "actor_tube_straight"
"origin" "216 520 24"
"targetname" "actor_elevator_test"
}
// entity 51
{
"classname" "actor_tube_straight"
"origin" "216 536 24"
"targetname" "actor_elevator_test"
}
// entity 52
{
"classname" "actor_tube_straight"
"origin" "216 552 24"
"targetname" "actor_elevator_test"
}
// entity 53
{
"classname" "actor_tube_straight"
"origin" "232 488 24"
"angle" "270"
"targetname" "actor_elevator_test"
}
// entity 54
{
"classname" "actor_tube_straight"
"origin" "216 360 24"
"targetname" "actor_elevator_test"
}
// entity 55
{
"classname" "actor_tube_straight"
"origin" "216 376 24"
"targetname" "actor_elevator_test"
}
// entity 56
{
"classname" "actor_tube_straight"
"origin" "216 392 24"
"targetname" "actor_elevator_test"
}
// entity 57
{
"classname" "actor_tube_straight"
"origin" "216 408 24"
"targetname" "actor_elevator_test"
}
// entity 58
{
"classname" "actor_tube_straight"
"origin" "216 424 24"
"targetname" "actor_elevator_test"
}
// entity 59
{
"classname" "actor_tube_straight"
"origin" "232 440 24"
"angle" "270"
"targetname" "actor_elevator_test"
}
// entity 60
{
"classname" "actor_tube_junction"
"origin" "280 488 24"
"angle" "180"
"targetname" "actor_elevator_test"
}
// entity 61
{
"classname" "actor_tube_straight"
"origin" "280 472 24"
"targetname" "actor_elevator_test"
}
// entity 62
{
"classname" "actor_tube_straight"
"origin" "280 456 24"
"targetname" "actor_elevator_test"
}
// entity 63
{
"classname" "actor_tube_straight"
"origin" "280 440 24"
"targetname" "actor_elevator_test"
}
// entity 64
{
"classname" "actor_tube_straight"
"origin" "264 488 24"
"angle" "270"
"targetname" "actor_elevator_test"
}
// entity 65
{
"classname" "actor_box_red"
"origin" "376 472 20"
"targetname" "actor_elevator_test"
}
// entity 66
{
"classname" "actor_box_red"
"origin" "376 488 20"
"targetname" "actor_elevator_test"
}
// entity 67
{
"classname" "actor_box_red"
"origin" "376 472 28"
"targetname" "actor_elevator_test"
}
// entity 68
{
"classname" "actor_box_red"
"origin" "376 488 28"
"targetname" "actor_elevator_test"
}
// entity 69
{
"classname" "actor_box_red"
"origin" "376 456 20"
"targetname" "actor_elevator_test"
}
// entity 70
{
"classname" "actor_box_red"
"origin" "328 440 20"
"targetname" "actor_elevator_test"
}
// entity 71
{
"classname" "actor_box_red"
"origin" "328 456 20"
"targetname" "actor_elevator_test"
}
// entity 72
{
"classname" "actor_box_red"
"origin" "328 488 20"
"targetname" "actor_elevator_test"
}
// entity 73
{
"classname" "actor_box_red"
"origin" "344 456 20"
"targetname" "actor_elevator_test"
}
// entity 74
{
"classname" "actor_box_red"
"origin" "344 440 20"
"targetname" "actor_elevator_test"
}
// entity 75
{
"classname" "actor_box_red"
"origin" "360 440 20"
"targetname" "actor_elevator_test"
}
// entity 76
{
"classname" "actor_box_red"
"origin" "360 456 20"
"targetname" "actor_elevator_test"
}
// entity 77
{
"classname" "actor_box_red"
"origin" "376 440 20"
"targetname" "actor_elevator_test"
}
// entity 78
{
"classname" "actor_box_red"
"origin" "392 448 20"
"angle" "45"
"targetname" "actor_elevator_test"
}
// entity 79
{
"classname" "actor_box_blue"
"origin" "360 488 20"
"targetname" "actor_elevator_test"
}
// entity 80
{
"classname" "actor_box_blue"
"origin" "360 488 28"
"targetname" "actor_elevator_test"
}
// entity 81
{
"classname" "actor_box_blue"
"origin" "360 456 28"
"targetname" "actor_elevator_test"
}
// entity 82
{
"classname" "actor_box_blue"
"origin" "344 440 28"
"targetname" "actor_elevator_test"
}
// entity 83
{
"classname" "actor_box_blue"
"origin" "136 456 20"
"targetname" "actor_elevator_test"
}
// entity 84
{
"classname" "actor_box_wood"
"origin" "268 192 20"
"targetname" "actor_elevator_test"
}
// entity 85
{
"classname" "actor_box_wood"
"origin" "276 192 20"
"targetname" "actor_elevator_test"
}
// entity 86
{
"classname" "actor_box_wood"
"origin" "268 208 20"
"targetname" "actor_elevator_test"
}
// entity 87
{
"classname" "actor_box_wood"
"origin" "268 192 28"
"targetname" "actor_elevator_test"
}
// entity 88
{
"classname" "actor_box_wood"
"origin" "268 272 20"
"targetname" "actor_elevator_test"
}
// entity 89
{
"classname" "actor_box_wood"
"origin" "276 272 20"
"targetname" "actor_elevator_test"
}
// entity 90
{
"classname" "actor_box_wood"
"origin" "268 256 20"
"targetname" "actor_elevator_test"
}
// entity 91
{
"classname" "actor_box_wood"
"origin" "268 272 28"
"targetname" "actor_elevator_test"
}
// entity 92
{
"classname" "actor_box_wood"
"origin" "356 272 20"
"targetname" "actor_elevator_test"
}
// entity 93
{
"classname" "actor_box_wood"
"origin" "356 184 20"
"targetname" "actor_elevator_test"
}
// entity 94
{
"classname" "actor_box_wood"
"origin" "356 272 28"
"targetname" "actor_elevator_test"
}
// entity 95
{
"classname" "actor_box_wood"
"origin" "356 184 28"
"targetname" "actor_elevator_test"
}
// entity 96
{
"classname" "actor_box_wood"
"origin" "364 184 20"
"targetname" "actor_elevator_test"
}
// entity 97
{
"classname" "actor_box_wood"
"origin" "364 272 20"
"targetname" "actor_elevator_test"
}
// entity 98
{
"classname" "actor_table"
"origin" "272 232 20"
"targetname" "actor_elevator_test"
}
// entity 99
{
"classname" "actor_box_blue"
"origin" "336 192 20"
"targetname" "actor_elevator_test"
}
// entity 100
{
"classname" "actor_box_red"
"origin" "336 192 28"
"targetname" "actor_elevator_test"
}
// entity 101
{
"classname" "actor_box_blue"
"origin" "336 272 20"
"targetname" "actor_elevator_test"
}
// entity 102
{
"classname" "actor_box_blue"
"origin" "336 272 28"
"targetname" "actor_elevator_test"
}
// entity 103
{
"classname" "actor_barrel_1"
"origin" "248 360 24"
"targetname" "actor_elevator_test"
}
// entity 104
{
"classname" "actor_barrel_1"
"origin" "232 360 24"
"targetname" "actor_elevator_test"
}
// entity 105
{
"classname" "actor_barrel_1"
"origin" "232 360 32"
"targetname" "actor_elevator_test"
}
// entity 106
{
"classname" "actor_tank"
"origin" "432 544 24"
"targetname" "actor_elevator_test"
}
// entity 107
{
"classname" "actor_ac_unit"
"origin" "440 416 24"
"targetname" "actor_elevator_test"
}
// entity 108
{
"classname" "actor_ac_unit"
"origin" "440 360 24"
"angle" "270"
"targetname" "actor_elevator_test"
}
// entity 109
{
"classname" "actor_ac_unit"
"origin" "168 552 24"
"angle" "180"
"targetname" "actor_elevator_test"
}
// entity 110
{
"classname" "actor_terminal"
"origin" "272 232 28"
"targetname" "actor_elevator_test"
}
// entity 111
{
"classname" "actor_ac_unit"
"origin" "304 188 24"
"angle" "270"
"targetname" "actor_elevator_test"
}
// entity 112
{
"classname" "actor_tube_corner"
"origin" "216 488 24"
"angle" "270"
"targetname" "actor_elevator_test"
}
// entity 113
{
"classname" "actor_tube_corner"
"origin" "216 440 24"
"angle" "180"
"targetname" "actor_elevator_test"
}
// entity 114
{
"classname" "actor_box_green"
"origin" "328 472 20"
"targetname" "actor_elevator_test"
}
// entity 115
{
"classname" "actor_box_green"
"origin" "344 472 20"
"targetname" "actor_elevator_test"
}
// entity 116
{
"classname" "actor_box_yellow"
"origin" "344 488 20"
"targetname" "actor_elevator_test"
}
// entity 117
{
"classname" "actor_box_green"
"origin" "328 488 28"
"targetname" "actor_elevator_test"
}
// entity 118
{
"classname" "actor_box_yellow"
"origin" "328 440 28"
"targetname" "actor_elevator_test"
}
// entity 119
{
"classname" "actor_box_yellow"
"origin" "360 472 20"
"targetname" "actor_elevator_test"
}
// entity 120
{
"classname" "actor_capacitor"
"origin" "528 136 28"
"targetname" "actor_elevator_test"
}
// entity 121
{
"classname" "actor_capacitor"
"origin" "496 136 28"
"targetname" "actor_elevator_test"
}
// entity 122
{
"classname" "actor_box_green"
"origin" "248 712 20"
"targetname" "actor_elevator_test"
}
// entity 123
{
"classname" "actor_box_wood"
"origin" "244 792 28"
"targetname" "actor_elevator_test"
}
// entity 124
{
"classname" "actor_box_wood"
"origin" "244 792 20"
"targetname" "actor_elevator_test"
}
// entity 125
{
"classname" "actor_table"
"origin" "248 732 20"
"targetname" "actor_elevator_test"
}
// entity 126
{
"classname" "actor_box_green"
"origin" "280 792 20"
"targetname" "actor_elevator_test"
}
// entity 127
{
"classname" "actor_box_red"
"origin" "296 784 20"
"targetname" "actor_elevator_test"
}
// entity 128
{
"classname" "actor_box_blue"
"origin" "312 760 20"
"targetname" "actor_elevator_test"
}
// entity 129
{
"classname" "actor_box_yellow"
"origin" "320 792 20"
"targetname" "actor_elevator_test"
}
// entity 130
{
"classname" "actor_box_blue"
"origin" "248 712 28"
"targetname" "actor_elevator_test"
}
// entity 131
{
"classname" "actor_box_wood"
"origin" "244 776 20"
"targetname" "actor_elevator_test"
}
// entity 132
{
"classname" "actor_box_wood"
"origin" "252 792 20"
"targetname" "actor_elevator_test"
}
// entity 133
{
"classname" "actor_box_wood"
"origin" "308 792 20"
"targetname" "actor_elevator_test"
}
// entity 134
{
"classname" "actor_ac_unit"
"origin" "284 708 24"
"angle" "270"
"targetname" "actor_elevator_test"
}
// entity 135
{
"classname" "actor_vendingmachine"
"origin" "248 760 28"
"targetname" "actor_elevator_test"
}
// entity 136
{
"classname" "actor_vendingmachine"
"origin" "280 744 28"
"angle" "270"
"targetname" "actor_elevator_test"
}
// entity 137
{
"classname" "trigger_area"
"target" "actor_elevator_test"
"targetname" ""
// brush 0
{
( 360 352 16 ) ( 360 353 16 ) ( 360 352 17 ) special/clip [ 0 -1 0 0 ] [ 0 0 -1 0 ] 0 1 1
@ -2546,3 +2659,10 @@
"origin" "376 416 18"
"targetname" "actor_elevator_test"
}
// entity 139
{
"classname" "actor_controlpad"
"origin" "420 356 28"
"targetname" ""
"target" "actor_elevator_test"
}

View file

@ -1,7 +1,8 @@
[gd_resource type="Resource" script_class="FuncGodotFGDModelPointClass" load_steps=4 format=3 uid="uid://ceio7tm5eopbb"]
[gd_resource type="Resource" script_class="FuncGodotFGDModelPointClass" load_steps=5 format=3 uid="uid://ceio7tm5eopbb"]
[ext_resource type="Resource" uid="uid://5bc1qysixhmh" path="res://3D/TrenchBroom/EntityDefinitions/base/actor_base.tres" id="1_5ms1a"]
[ext_resource type="PackedScene" uid="uid://du6hlcoq0iip4" path="res://3D/Scenes/Props/control_pad_3d.tscn" id="2_5ms1a"]
[ext_resource type="Resource" uid="uid://kerywjgft7vh" path="res://3D/TrenchBroom/EntityDefinitions/base/target_base.tres" id="2_65tcb"]
[ext_resource type="Script" uid="uid://dkmyelig23ub5" path="res://addons/func_godot/src/fgd/func_godot_fgd_model_point_class.gd" id="3_y02cg"]
[resource]
@ -14,15 +15,15 @@ generate_gd_ignore_file = false
scene_file = ExtResource("2_5ms1a")
apply_rotation_on_map_build = true
apply_scale_on_map_build = false
classname = "actor_vendingmachine"
description = "Vending Machine"
classname = "actor_controlpad"
description = "Control Pad"
func_godot_internal = false
base_classes = Array[Resource]([ExtResource("1_5ms1a")])
base_classes = Array[Resource]([ExtResource("1_5ms1a"), ExtResource("2_65tcb")])
class_properties = {}
class_property_descriptions = {}
auto_apply_to_matching_node_properties = false
meta_properties = {
"size": AABB(-8, -8, -12, 8, 8, 12),
"size": AABB(-4, -4, -4, 4, 4, 4),
"studio": "\"3D/MapModels/actor_vendingmachine.glb\""
}
node_class = ""

View file

@ -1,4 +1,4 @@
[gd_resource type="Resource" script_class="FuncGodotFGDFile" load_steps=20 format=3 uid="uid://b700sa4be6dfa"]
[gd_resource type="Resource" script_class="FuncGodotFGDFile" load_steps=21 format=3 uid="uid://b700sa4be6dfa"]
[ext_resource type="Resource" uid="uid://ia1t5p4mhom3" path="res://3D/TrenchBroom/EntityDefinitions/point/lights/light_omni.tres" id="1_7vcj1"]
[ext_resource type="Script" uid="uid://cknmd0lgmorx2" path="res://addons/func_godot/src/fgd/func_godot_fgd_file.gd" id="1_lykim"]
@ -19,6 +19,7 @@
[ext_resource type="Resource" uid="uid://41wnjh6ftght" path="res://3D/TrenchBroom/EntityDefinitions/point/actors/actor_box_green.tres" id="16_7h4of"]
[ext_resource type="Resource" uid="uid://dj72os2jpdl4l" path="res://3D/TrenchBroom/EntityDefinitions/point/actors/actor_box_yellow.tres" id="17_m3sbm"]
[ext_resource type="Resource" uid="uid://bmfarpfcbbfa5" path="res://3D/TrenchBroom/EntityDefinitions/point/actors/Actor_VendingMachine.tres" id="18_m3sbm"]
[ext_resource type="Resource" uid="uid://ceio7tm5eopbb" path="res://3D/TrenchBroom/EntityDefinitions/point/actors/actor_controlpad.tres" id="19_hvhb8"]
[resource]
script = ExtResource("1_lykim")
@ -26,5 +27,5 @@ export_file = false
target_map_editor = 1
fgd_name = "FuncGodot"
base_fgd_files = Array[Resource]([])
entity_definitions = Array[Resource]([ExtResource("1_7vcj1"), ExtResource("2_u7uvb"), ExtResource("3_u7uvb"), ExtResource("4_1nmxk"), ExtResource("5_ljb2x"), ExtResource("6_seuvu"), ExtResource("7_fmwex"), ExtResource("8_c8m8m"), ExtResource("9_14sjf"), ExtResource("10_xik3w"), ExtResource("11_dgiqm"), ExtResource("12_1teik"), ExtResource("13_f0hti"), ExtResource("14_6ld6e"), ExtResource("15_g8j5j"), ExtResource("16_7h4of"), ExtResource("17_m3sbm"), ExtResource("18_m3sbm")])
entity_definitions = Array[Resource]([ExtResource("1_7vcj1"), ExtResource("2_u7uvb"), ExtResource("3_u7uvb"), ExtResource("4_1nmxk"), ExtResource("5_ljb2x"), ExtResource("6_seuvu"), ExtResource("7_fmwex"), ExtResource("8_c8m8m"), ExtResource("9_14sjf"), ExtResource("10_xik3w"), ExtResource("11_dgiqm"), ExtResource("12_1teik"), ExtResource("13_f0hti"), ExtResource("14_6ld6e"), ExtResource("15_g8j5j"), ExtResource("16_7h4of"), ExtResource("17_m3sbm"), ExtResource("18_m3sbm"), ExtResource("19_hvhb8")])
metadata/_custom_type_script = "uid://cknmd0lgmorx2"

View file

@ -4,8 +4,10 @@ using Godot.Collections;
namespace Cirno.Scripts.Interactables;
[Tool]
public partial class Switch3D : Interactable3D
{
[Export] public string TargetGroup { get; private set; }
[Export] public Node Target { get; set; }
[Export] public Array<Node> Targets { get; private set; } = [];
[Export] public ActivationType ActivationType { get; set; } = ActivationType.Toggle;
@ -19,9 +21,18 @@ public partial class Switch3D : Interactable3D
public override void _Ready()
{
if (Engine.IsEditorHint()) return;
_activationSound = GetNodeOrNull<AudioStreamPlayer>(_activationSoundName);
}
public void _func_godot_apply_properties(Dictionary<string, string> props)
{
TargetGroup = props["target"];
//TargetFunc = props["targetfunc"];
//TargetName = props["targetname"];
}
public override bool Activate(ActivationType activationType = ActivationType.Toggle)
{
var activationTypeToUse = activationType is ActivationType.Use ? ActivationType : activationType;
@ -34,6 +45,11 @@ public partial class Switch3D : Interactable3D
// Compatibility for old single system
bool success = ActivateTarget(Target, activationTypeToUse);
if (!string.IsNullOrWhiteSpace(TargetGroup))
{
UseTargets(this, TargetGroup);
}
return Targets.Aggregate(success, (current, target) => ActivateTarget(target, activationTypeToUse) | success);
}
@ -43,4 +59,20 @@ public partial class Switch3D : Interactable3D
activable?.Activate(activationType);
return true;
}
private void UseTargets(Node activator, string target)
{
GD.Print($"Trying to use targets called: {target}");
var targetList = GetTree().GetNodesInGroup(target);
foreach (var t in targetList)
{
//string f;
GD.Print($"Trying to use {t.Name}");
if (t is IActivable activable)
{
GD.Print($"Activating {t.Name}");
activable.Toggle();
}
}
}
}