force fields

This commit is contained in:
Marco 2025-06-26 08:32:13 +02:00
commit 22936c4678
19 changed files with 854 additions and 682 deletions

File diff suppressed because one or more lines are too long

View file

@ -512,10 +512,10 @@
// brush 56 // brush 56
{ {
( 320 336 16 ) ( 320 336 17 ) ( 320 335 16 ) Walls/Wall0 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 -1 1 ( 320 336 16 ) ( 320 336 17 ) ( 320 335 16 ) Walls/Wall0 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 -1 1
( 312 288 16 ) ( 312 288 17 ) ( 313 288 16 ) Walls/Wall0 [ 1 0 0 -8 ] [ 0 0 -1 0 ] 0 1 1 ( 312 288 16 ) ( 312 288 17 ) ( 313 288 16 ) Walls/Wall0 [ 1 0 0 8 ] [ 0 0 -1 0 ] 0 1 1
( 312 336 16 ) ( 312 335 16 ) ( 313 336 16 ) Walls/Wall0 [ 0 -1 0 0 ] [ -1 0 0 -8 ] 270 1 1 ( 312 336 16 ) ( 312 335 16 ) ( 313 336 16 ) Walls/Wall0 [ 0 -1 0 0 ] [ -1 0 0 -8 ] 270 1 1
( 328 208 48 ) ( 329 208 48 ) ( 328 207 48 ) Manual/Black [ 0 -1 0 0 ] [ -1 0 0 -8 ] 270 1 1 ( 328 208 48 ) ( 329 208 48 ) ( 328 207 48 ) Manual/Black [ 0 -1 0 0 ] [ -1 0 0 0 ] 270 1 1
( 312 336 16 ) ( 313 336 16 ) ( 312 336 17 ) Walls/Wall0 [ 1 0 0 -8 ] [ 0 0 -1 0 ] 0 1 1 ( 312 336 16 ) ( 313 336 16 ) ( 312 336 17 ) Walls/Wall0 [ 1 0 0 8 ] [ 0 0 -1 0 ] 0 1 1
( 328 208 32 ) ( 328 207 32 ) ( 328 208 33 ) Walls/Wall0 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 -1 1 ( 328 208 32 ) ( 328 207 32 ) ( 328 208 33 ) Walls/Wall0 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 -1 1
} }
// brush 57 // brush 57
@ -947,7 +947,7 @@
( 248 176 16 ) ( 248 176 17 ) ( 249 176 16 ) Walls/Wall0 [ 1 0 0 8 ] [ 0 0 -1 0 ] 270 1 1 ( 248 176 16 ) ( 248 176 17 ) ( 249 176 16 ) Walls/Wall0 [ 1 0 0 8 ] [ 0 0 -1 0 ] 270 1 1
( 248 312 16 ) ( 248 311 16 ) ( 249 312 16 ) Walls/Wall0 [ 0 -1 0 -8 ] [ -1 0 0 -8 ] 0 1 1 ( 248 312 16 ) ( 248 311 16 ) ( 249 312 16 ) Walls/Wall0 [ 0 -1 0 -8 ] [ -1 0 0 -8 ] 0 1 1
( 264 184 48 ) ( 265 184 48 ) ( 264 183 48 ) Manual/Black [ 0 -1 0 -8 ] [ -1 0 0 -8 ] 180 1 1 ( 264 184 48 ) ( 265 184 48 ) ( 264 183 48 ) Manual/Black [ 0 -1 0 -8 ] [ -1 0 0 -8 ] 180 1 1
( 248 224 16 ) ( 249 224 16 ) ( 248 224 17 ) Walls/Wall0 [ 1 0 0 8 ] [ 0 0 -1 0 ] 90 1 1 ( 248 192 16 ) ( 249 192 16 ) ( 248 192 17 ) Walls/Wall0 [ 1 0 0 8 ] [ 0 0 -1 0 ] 180 1 1
( 264 184 32 ) ( 264 183 32 ) ( 264 184 33 ) Walls/Wall0 [ 0 1 0 -8 ] [ 0 0 -1 0 ] 270 -1 1 ( 264 184 32 ) ( 264 183 32 ) ( 264 184 33 ) Walls/Wall0 [ 0 1 0 -8 ] [ 0 0 -1 0 ] 270 -1 1
} }
// brush 105 // brush 105
@ -3370,7 +3370,7 @@
// entity 137 // entity 137
{ {
"classname" "actor_terminal" "classname" "actor_terminal"
"origin" "168 396 28" "origin" "168 396 30"
"timeline" "computer1" "timeline" "computer1"
} }
// entity 138 // entity 138
@ -3865,27 +3865,63 @@
"classname" "actor_keypad" "classname" "actor_keypad"
"origin" "348 692 36" "origin" "348 692 36"
"key" "BLUE_KEY" "key" "BLUE_KEY"
"target" "door_secret_1" "target" "forcefield_1"
} }
// entity 216 // entity 216
{ {
"classname" "actor_door_1"
"origin" "304 732 32"
"targetname" "door_secret_1"
}
// entity 217
{
"classname" "actor_forcefield_1" "classname" "actor_forcefield_1"
"origin" "344 720 32" "origin" "344 720 32"
"targetname" "forcefield_1" "targetname" "forcefield_1"
"startenabled" "1"
} }
// entity 218 // entity 217
{ {
"classname" "actor_chest_1" "classname" "actor_chest_1"
"origin" "264 712 24" "origin" "264 712 24"
} }
// entity 218
{
"classname" "actor_furniture_computertower"
"origin" "170 396 26"
}
// entity 219 // entity 219
{ {
"classname" "actor_furniture_computertower"
"origin" "274 241 19"
"angles" "0 0 90"
}
// entity 220
{
"classname" "func_group"
"_tb_type" "_tb_group"
"_tb_name" "Wall_Panel_Blue"
"_tb_id" "38"
"_tb_linked_group_id" "{ad70deec-5095-4407-afc9-0f7b57c61fe5}"
"_tb_transformation" "-1.8369701987210297e-16 1 0 104.00000000000006 -1 -1.8369701987210297e-16 0 400.0000000000001 0 0 1 0 0 0 0 1"
// brush 0
{
( 256 400 32 ) ( 256 400 33 ) ( 256 399 32 ) Manual/Black [ -1.8369701987210297e-16 -1 0 0 ] [ 0 0 -1 0 ] 90 1 1
( 136 192 32 ) ( 135 192 32 ) ( 136 192 33 ) special/clip [ -1 1.8369701987210297e-16 0 -16 ] [ 0 0 1 -16 ] 270 0.5 -1
( 264 416 16 ) ( 263 416 16 ) ( 264 415 16 ) special/clip [ -1 1.8369701987210297e-16 0 8 ] [ 1.8369701987210297e-16 1 0 0 ] 90 1 1
( 136 400 48 ) ( 136 399 48 ) ( 135 400 48 ) Manual/Black [ -1 1.8369701987210297e-16 0 0 ] [ 1.8369701987210297e-16 1 0 0 ] 90 1 1
( 264 224 16 ) ( 264 224 17 ) ( 263 224 16 ) special/clip [ -1 1.8369701987210297e-16 0 -16 ] [ 0 0 1 -16 ] 90 0.5 -1
( 264 416 16 ) ( 264 415 16 ) ( 264 416 17 ) Manual/Blue_Panel_Wall [ -1.8369701987210297e-16 -1 0 0 ] [ 0 0 -1 -16 ] 270 1 1
}
}
// entity 221
{
"classname" "actor_door_1"
"origin" "348 232 32"
"targetname" "door_secret_2"
}
// entity 222
{
"classname" "actor_controlpad"
"origin" "352 212 28"
"target" "door_secret_2"
}
// entity 223
{
"classname" "func_group" "classname" "func_group"
"_tb_type" "_tb_layer" "_tb_type" "_tb_layer"
"_tb_name" "Computer Room" "_tb_name" "Computer Room"
@ -3964,37 +4000,37 @@
( 104 -200 60 ) ( 104 -200 61 ) ( 104 -199 60 ) Manual/Blue_Panel_Wall [ 0 1 0 -16 ] [ 0 0 -1 24 ] 0 1 1 ( 104 -200 60 ) ( 104 -200 61 ) ( 104 -199 60 ) Manual/Blue_Panel_Wall [ 0 1 0 -16 ] [ 0 0 -1 24 ] 0 1 1
} }
} }
// entity 220 // entity 224
{ {
"classname" "actor_table" "classname" "actor_table"
"origin" "48 -164 60" "origin" "48 -164 60"
"_tb_layer" "37" "_tb_layer" "37"
} }
// entity 221 // entity 225
{ {
"classname" "actor_terminal_big" "classname" "actor_terminal_big"
"origin" "8 -140 68" "origin" "8 -140 68"
"_tb_layer" "37" "_tb_layer" "37"
} }
// entity 222 // entity 226
{ {
"classname" "actor_terminal_big" "classname" "actor_terminal_big"
"origin" "8 -164 68" "origin" "8 -164 68"
"_tb_layer" "37" "_tb_layer" "37"
} }
// entity 223 // entity 227
{ {
"classname" "actor_mainframe" "classname" "actor_mainframe"
"origin" "8 -184 68" "origin" "8 -184 68"
"_tb_layer" "37" "_tb_layer" "37"
} }
// entity 224 // entity 228
{ {
"classname" "actor_mainframe" "classname" "actor_mainframe"
"origin" "8 -200 68" "origin" "8 -200 68"
"_tb_layer" "37" "_tb_layer" "37"
} }
// entity 225 // entity 229
{ {
"classname" "actor_terminal" "classname" "actor_terminal"
"origin" "48 -168 68" "origin" "48 -168 68"

View file

@ -1,5 +1,6 @@
[gd_scene load_steps=5 format=3 uid="uid://dioiq4nb7kiet"] [gd_scene load_steps=6 format=3 uid="uid://dioiq4nb7kiet"]
[ext_resource type="Script" uid="uid://buneqosduiwkm" path="res://Scripts/Actors/3D/ForceField3D.cs" id="1_4cotp"]
[ext_resource type="Texture2D" uid="uid://6p28earvo6m2" path="res://textures/Manual/Forcefield/ForceField1.png" id="1_xl5wo"] [ext_resource type="Texture2D" uid="uid://6p28earvo6m2" path="res://textures/Manual/Forcefield/ForceField1.png" id="1_xl5wo"]
[sub_resource type="BoxShape3D" id="BoxShape3D_7axon"] [sub_resource type="BoxShape3D" id="BoxShape3D_7axon"]
@ -18,6 +19,8 @@ size = Vector2(2, 2)
[node name="Forcefield" type="AnimatableBody3D" groups=["Solid"]] [node name="Forcefield" type="AnimatableBody3D" groups=["Solid"]]
collision_layer = 16 collision_layer = 16
collision_mask = 0 collision_mask = 0
script = ExtResource("1_4cotp")
TargetName = &""
[node name="CollisionShape3D" type="CollisionShape3D" parent="."] [node name="CollisionShape3D" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.00500488, 0.00234985, -0.00524902) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.00500488, 0.00234985, -0.00524902)

View file

@ -24,7 +24,7 @@ class_property_descriptions = {}
auto_apply_to_matching_node_properties = false auto_apply_to_matching_node_properties = false
meta_properties = { meta_properties = {
"size": AABB(-8, -8, -8, 8, 8, 8), "size": AABB(-8, -8, -8, 8, 8, 8),
"studio": "\"3D\\MapModels/actor_capacitor_mini.glb\"" "studio": "\"3D/MapModels/actor_capacitor_mini.glb\""
} }
node_class = "" node_class = ""
name_property = "" name_property = ""

View file

@ -20,8 +20,12 @@ classname = "actor_forcefield_1"
description = "Forcefield Type 1" description = "Forcefield Type 1"
func_godot_internal = false func_godot_internal = false
base_classes = Array[Resource]([ExtResource("1_wufju"), ExtResource("2_6wd32")]) base_classes = Array[Resource]([ExtResource("1_wufju"), ExtResource("2_6wd32")])
class_properties = {} class_properties = {
class_property_descriptions = {} "startenabled": false
}
class_property_descriptions = {
"startenabled": "Whether to start enabled or not"
}
auto_apply_to_matching_node_properties = false auto_apply_to_matching_node_properties = false
meta_properties = { meta_properties = {
"model": "\"3D/MapModels/actor_forcefield_1.glb\"", "model": "\"3D/MapModels/actor_forcefield_1.glb\"",

View file

@ -23,6 +23,7 @@ class_properties = {}
class_property_descriptions = {} class_property_descriptions = {}
auto_apply_to_matching_node_properties = false auto_apply_to_matching_node_properties = false
meta_properties = { meta_properties = {
"model": "\"3D/MapModels/actor_furniture_box.glb\"",
"size": AABB(-2, -2, -2, 2, 2, 2) "size": AABB(-2, -2, -2, 2, 2, 2)
} }
node_class = "" node_class = ""

View file

@ -23,6 +23,7 @@ class_properties = {}
class_property_descriptions = {} class_property_descriptions = {}
auto_apply_to_matching_node_properties = false auto_apply_to_matching_node_properties = false
meta_properties = { meta_properties = {
"model": "\"3D/MapModels/actor_furniture_can.glb\"",
"size": AABB(-2, -2, -2, 2, 2, 2) "size": AABB(-2, -2, -2, 2, 2, 2)
} }
node_class = "" node_class = ""

View file

@ -23,6 +23,7 @@ class_properties = {}
class_property_descriptions = {} class_property_descriptions = {}
auto_apply_to_matching_node_properties = false auto_apply_to_matching_node_properties = false
meta_properties = { meta_properties = {
"model": "\"3D/MapModels/actor_furniture_shelf.glb\"",
"size": AABB(-4, -8, -1, 4, 8, 1) "size": AABB(-4, -8, -1, 4, 8, 1)
} }
node_class = "" node_class = ""

View file

@ -24,7 +24,7 @@ class_property_descriptions = {}
auto_apply_to_matching_node_properties = false auto_apply_to_matching_node_properties = false
meta_properties = { meta_properties = {
"size": AABB(-32, -16, -16, 32, 16, 16), "size": AABB(-32, -16, -16, 32, 16, 16),
"studio": "\"3D\\MapModels/actor_tank_large.glb\"" "studio": "\"3D/MapModels/actor_tank_large.glb\""
} }
node_class = "" node_class = ""
name_property = "" name_property = ""

View file

@ -23,7 +23,7 @@ class_properties = {}
class_property_descriptions = {} class_property_descriptions = {}
auto_apply_to_matching_node_properties = false auto_apply_to_matching_node_properties = false
meta_properties = { meta_properties = {
"model": "\"3D\\MapModels/actor_chest_1.glb\"", "model": "\"3D/MapModels/actor_chest_1.glb\"",
"size": AABB(-8, -8, -8, 8, 8, 8) "size": AABB(-8, -8, -8, 8, 8, 8)
} }
node_class = "" node_class = ""

View file

@ -25,6 +25,7 @@ class_properties = {}
class_property_descriptions = {} class_property_descriptions = {}
auto_apply_to_matching_node_properties = false auto_apply_to_matching_node_properties = false
meta_properties = { meta_properties = {
"model": "\"3D/MapModels/actor_keypad.glb\"",
"size": AABB(-4, -4, -4, 4, 4, 4) "size": AABB(-4, -4, -4, 4, 4, 4)
} }
node_class = "" node_class = ""

View file

@ -0,0 +1,113 @@
using System;
using Godot;
using Godot.Collections;
namespace Cirno.Scripts.Actors._3D;
[Tool]
public partial class ForceField3D : AnimatableBody3D, IActivable
{
[Export] public StringName TargetName { get; set; }
[Export] public bool StartActive { get; set; }
[Signal]
public delegate void EnabledEventHandler();
[Signal]
public delegate void DisabledEventHandler();
private bool _enabled = false;
private CollisionShape3D _collisionShape;
public bool Activate(ActivationType activationType = ActivationType.Toggle)
{
if (Engine.IsEditorHint()) return false;
switch (activationType)
{
case ActivationType.Toggle:
case ActivationType.Use:
if (_enabled)
{
Disable();
}
else
{
Enable();
}
break;
case ActivationType.Enable:
case ActivationType.Close:
Enable();
break;
case ActivationType.Disable:
case ActivationType.Open:
Disable();
break;
case ActivationType.Destroy:
return false;
break;
default:
return false;
}
return true;
}
public void Toggle()
{
this.Activate();
}
public void _func_godot_apply_properties(Dictionary props)
{
TargetName = (string)props["targetname"];
StartActive = (bool)props["startenabled"];
}
public override void _Ready()
{
if (Engine.IsEditorHint()) return;
if (!string.IsNullOrWhiteSpace(TargetName))
{
this.AddToGroup(TargetName);
}
_collisionShape = GetNode<CollisionShape3D>("CollisionShape3D");
if (StartActive)
{
Enable();
}
else
{
Disable();
}
}
public void Enable()
{
_enabled = true;
EmitSignalEnabled();
CallDeferred(MethodName.ToggleCollisionDeferred, true);
Show();
}
public void Disable()
{
_enabled = false;
EmitSignalDisabled();
CallDeferred(MethodName.ToggleCollisionDeferred, false);
Hide();
}
private void ToggleCollisionDeferred(bool enable)
{
_collisionShape.Disabled = !enable;
}
}

View file

@ -0,0 +1 @@
uid://buneqosduiwkm

View file

@ -3,20 +3,19 @@
importer="texture" importer="texture"
type="CompressedTexture2D" type="CompressedTexture2D"
uid="uid://bvybqletsvqgk" uid="uid://bvybqletsvqgk"
path.s3tc="res://.godot/imported/BlueKeycard_Small.png-b925d0e80a2eaa9ef7fe1ee182ce6c65.s3tc.ctex" path="res://.godot/imported/BlueKeycard_Small.png-b925d0e80a2eaa9ef7fe1ee182ce6c65.ctex"
metadata={ metadata={
"imported_formats": ["s3tc_bptc"], "vram_texture": false
"vram_texture": true
} }
[deps] [deps]
source_file="res://Sprites/Items/BlueKeycard_Small.png" source_file="res://Sprites/Items/BlueKeycard_Small.png"
dest_files=["res://.godot/imported/BlueKeycard_Small.png-b925d0e80a2eaa9ef7fe1ee182ce6c65.s3tc.ctex"] dest_files=["res://.godot/imported/BlueKeycard_Small.png-b925d0e80a2eaa9ef7fe1ee182ce6c65.ctex"]
[params] [params]
compress/mode=2 compress/mode=3
compress/high_quality=false compress/high_quality=false
compress/lossy_quality=0.7 compress/lossy_quality=0.7
compress/hdr_compression=1 compress/hdr_compression=1

View file

@ -15,13 +15,13 @@ dest_files=["res://.godot/imported/GrayKeycard_Small.png-78c37a83db89e8ab4ee0abe
[params] [params]
compress/mode=0 compress/mode=3
compress/high_quality=false compress/high_quality=false
compress/lossy_quality=0.7 compress/lossy_quality=0.7
compress/hdr_compression=1 compress/hdr_compression=1
compress/normal_map=0 compress/normal_map=0
compress/channel_pack=0 compress/channel_pack=0
mipmaps/generate=false mipmaps/generate=true
mipmaps/limit=-1 mipmaps/limit=-1
roughness/mode=0 roughness/mode=0
roughness/src_normal="" roughness/src_normal=""
@ -31,4 +31,4 @@ process/normal_map_invert_y=false
process/hdr_as_srgb=false process/hdr_as_srgb=false
process/hdr_clamp_exposure=false process/hdr_clamp_exposure=false
process/size_limit=0 process/size_limit=0
detect_3d/compress_to=1 detect_3d/compress_to=0

View file

@ -15,13 +15,13 @@ dest_files=["res://.godot/imported/GreenKeycard_Small.png-a8d591427ed9e736d5a900
[params] [params]
compress/mode=0 compress/mode=3
compress/high_quality=false compress/high_quality=false
compress/lossy_quality=0.7 compress/lossy_quality=0.7
compress/hdr_compression=1 compress/hdr_compression=1
compress/normal_map=0 compress/normal_map=0
compress/channel_pack=0 compress/channel_pack=0
mipmaps/generate=false mipmaps/generate=true
mipmaps/limit=-1 mipmaps/limit=-1
roughness/mode=0 roughness/mode=0
roughness/src_normal="" roughness/src_normal=""
@ -31,4 +31,4 @@ process/normal_map_invert_y=false
process/hdr_as_srgb=false process/hdr_as_srgb=false
process/hdr_clamp_exposure=false process/hdr_clamp_exposure=false
process/size_limit=0 process/size_limit=0
detect_3d/compress_to=1 detect_3d/compress_to=0

View file

@ -15,13 +15,13 @@ dest_files=["res://.godot/imported/RedKeycard_Small.png-11803ebfee263388f1f5d2bd
[params] [params]
compress/mode=0 compress/mode=3
compress/high_quality=false compress/high_quality=false
compress/lossy_quality=0.7 compress/lossy_quality=0.7
compress/hdr_compression=1 compress/hdr_compression=1
compress/normal_map=0 compress/normal_map=0
compress/channel_pack=0 compress/channel_pack=0
mipmaps/generate=false mipmaps/generate=true
mipmaps/limit=-1 mipmaps/limit=-1
roughness/mode=0 roughness/mode=0
roughness/src_normal="" roughness/src_normal=""
@ -31,4 +31,4 @@ process/normal_map_invert_y=false
process/hdr_as_srgb=false process/hdr_as_srgb=false
process/hdr_clamp_exposure=false process/hdr_clamp_exposure=false
process/size_limit=0 process/size_limit=0
detect_3d/compress_to=1 detect_3d/compress_to=0

View file

@ -15,13 +15,13 @@ dest_files=["res://.godot/imported/YellowKeycard_Small.png-070bc4c2d61c321670798
[params] [params]
compress/mode=0 compress/mode=3
compress/high_quality=false compress/high_quality=false
compress/lossy_quality=0.7 compress/lossy_quality=0.7
compress/hdr_compression=1 compress/hdr_compression=1
compress/normal_map=0 compress/normal_map=0
compress/channel_pack=0 compress/channel_pack=0
mipmaps/generate=false mipmaps/generate=true
mipmaps/limit=-1 mipmaps/limit=-1
roughness/mode=0 roughness/mode=0
roughness/src_normal="" roughness/src_normal=""
@ -31,4 +31,4 @@ process/normal_map_invert_y=false
process/hdr_as_srgb=false process/hdr_as_srgb=false
process/hdr_clamp_exposure=false process/hdr_clamp_exposure=false
process/size_limit=0 process/size_limit=0
detect_3d/compress_to=1 detect_3d/compress_to=0