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
{
( 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
( 328 208 48 ) ( 329 208 48 ) ( 328 207 48 ) Manual/Black [ 0 -1 0 0 ] [ -1 0 0 -8 ] 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
( 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
( 328 208 32 ) ( 328 207 32 ) ( 328 208 33 ) Walls/Wall0 [ 0 1 0 0 ] [ 0 0 -1 0 ] 0 -1 1
}
// 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 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
( 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
}
// brush 105
@ -3370,7 +3370,7 @@
// entity 137
{
"classname" "actor_terminal"
"origin" "168 396 28"
"origin" "168 396 30"
"timeline" "computer1"
}
// entity 138
@ -3865,27 +3865,63 @@
"classname" "actor_keypad"
"origin" "348 692 36"
"key" "BLUE_KEY"
"target" "door_secret_1"
"target" "forcefield_1"
}
// entity 216
{
"classname" "actor_door_1"
"origin" "304 732 32"
"targetname" "door_secret_1"
}
// entity 217
{
"classname" "actor_forcefield_1"
"origin" "344 720 32"
"targetname" "forcefield_1"
"startenabled" "1"
}
// entity 218
// entity 217
{
"classname" "actor_chest_1"
"origin" "264 712 24"
}
// entity 218
{
"classname" "actor_furniture_computertower"
"origin" "170 396 26"
}
// 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"
"_tb_type" "_tb_layer"
"_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
}
}
// entity 220
// entity 224
{
"classname" "actor_table"
"origin" "48 -164 60"
"_tb_layer" "37"
}
// entity 221
// entity 225
{
"classname" "actor_terminal_big"
"origin" "8 -140 68"
"_tb_layer" "37"
}
// entity 222
// entity 226
{
"classname" "actor_terminal_big"
"origin" "8 -164 68"
"_tb_layer" "37"
}
// entity 223
// entity 227
{
"classname" "actor_mainframe"
"origin" "8 -184 68"
"_tb_layer" "37"
}
// entity 224
// entity 228
{
"classname" "actor_mainframe"
"origin" "8 -200 68"
"_tb_layer" "37"
}
// entity 225
// entity 229
{
"classname" "actor_terminal"
"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"]
[sub_resource type="BoxShape3D" id="BoxShape3D_7axon"]
@ -18,6 +19,8 @@ size = Vector2(2, 2)
[node name="Forcefield" type="AnimatableBody3D" groups=["Solid"]]
collision_layer = 16
collision_mask = 0
script = ExtResource("1_4cotp")
TargetName = &""
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
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
meta_properties = {
"size": AABB(-8, -8, -8, 8, 8, 8),
"studio": "\"3D\\MapModels/actor_capacitor_mini.glb\""
"studio": "\"3D/MapModels/actor_capacitor_mini.glb\""
}
node_class = ""
name_property = ""

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -25,6 +25,7 @@ class_properties = {}
class_property_descriptions = {}
auto_apply_to_matching_node_properties = false
meta_properties = {
"model": "\"3D/MapModels/actor_keypad.glb\"",
"size": AABB(-4, -4, -4, 4, 4, 4)
}
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"
type="CompressedTexture2D"
uid="uid://bvybqletsvqgk"
path.s3tc="res://.godot/imported/BlueKeycard_Small.png-b925d0e80a2eaa9ef7fe1ee182ce6c65.s3tc.ctex"
path="res://.godot/imported/BlueKeycard_Small.png-b925d0e80a2eaa9ef7fe1ee182ce6c65.ctex"
metadata={
"imported_formats": ["s3tc_bptc"],
"vram_texture": true
"vram_texture": false
}
[deps]
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]
compress/mode=2
compress/mode=3
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1

View file

@ -15,13 +15,13 @@ dest_files=["res://.godot/imported/GrayKeycard_Small.png-78c37a83db89e8ab4ee0abe
[params]
compress/mode=0
compress/mode=3
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@ -31,4 +31,4 @@ 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
detect_3d/compress_to=0

View file

@ -15,13 +15,13 @@ dest_files=["res://.godot/imported/GreenKeycard_Small.png-a8d591427ed9e736d5a900
[params]
compress/mode=0
compress/mode=3
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@ -31,4 +31,4 @@ 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
detect_3d/compress_to=0

View file

@ -15,13 +15,13 @@ dest_files=["res://.godot/imported/RedKeycard_Small.png-11803ebfee263388f1f5d2bd
[params]
compress/mode=0
compress/mode=3
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@ -31,4 +31,4 @@ 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
detect_3d/compress_to=0

View file

@ -15,13 +15,13 @@ dest_files=["res://.godot/imported/YellowKeycard_Small.png-070bc4c2d61c321670798
[params]
compress/mode=0
compress/mode=3
compress/high_quality=false
compress/lossy_quality=0.7
compress/hdr_compression=1
compress/normal_map=0
compress/channel_pack=0
mipmaps/generate=false
mipmaps/generate=true
mipmaps/limit=-1
roughness/mode=0
roughness/src_normal=""
@ -31,4 +31,4 @@ 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
detect_3d/compress_to=0