commit 534e7ba44a22db8cb3808b25e43d51d49dae974d Author: copygirl Date: Sat Oct 5 09:04:09 2024 +0200 Initial commit diff --git a/README.md b/README.md new file mode 100644 index 0000000..2aff2b3 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +This is a personalized mod for [SnekStudio] based on its existing headpat mod, with trigger and assets modified. Instead of being triggered by a Twitch redeem, this mod triggers on chat message contents, such that typing for example "copyPat" (a BTTV emote in my channel) will trigger the headpat animation. There also is an additional sound effect that plays. + +May be considered public domain, however .gif and .mp3 are of unknown origin. + +[SnekStudio]: https://github.com/ExpiredPopsicle/SnekStudio diff --git a/Resources/Sprites/copyPat_SpriteFrames.tres b/Resources/Sprites/copyPat_SpriteFrames.tres new file mode 100644 index 0000000..2cffa74 --- /dev/null +++ b/Resources/Sprites/copyPat_SpriteFrames.tres @@ -0,0 +1,50 @@ +[gd_resource type="SpriteFrames" load_steps=11 format=3 uid="uid://dku03qom1ggul"] + +[ext_resource type="Texture2D" uid="uid://c0q4k8pg67x0t" path="res://Mods/copyPat/Resources/Sprites/frame0000.png" id="1_6yg0t"] +[ext_resource type="Texture2D" uid="uid://cg2qsgsfjytbo" path="res://Mods/copyPat/Resources/Sprites/frame0001.png" id="2_hok6u"] +[ext_resource type="Texture2D" uid="uid://rlt4xf6i2lwq" path="res://Mods/copyPat/Resources/Sprites/frame0002.png" id="3_56chl"] +[ext_resource type="Texture2D" uid="uid://cnj3ytdbosr22" path="res://Mods/copyPat/Resources/Sprites/frame0003.png" id="4_xs5by"] +[ext_resource type="Texture2D" uid="uid://dpilq5sol1qaa" path="res://Mods/copyPat/Resources/Sprites/frame0004.png" id="5_gqc3p"] +[ext_resource type="Texture2D" uid="uid://bib1jji1dxnre" path="res://Mods/copyPat/Resources/Sprites/frame0005.png" id="6_vrbg2"] +[ext_resource type="Texture2D" uid="uid://ddleraq15mf45" path="res://Mods/copyPat/Resources/Sprites/frame0006.png" id="7_s0f6e"] +[ext_resource type="Texture2D" uid="uid://inbtpiu0dei2" path="res://Mods/copyPat/Resources/Sprites/frame0007.png" id="8_jo2n1"] +[ext_resource type="Texture2D" uid="uid://bn4q1e3jwi8f4" path="res://Mods/copyPat/Resources/Sprites/frame0008.png" id="9_ecn1r"] +[ext_resource type="Texture2D" uid="uid://bb0g2obo0qc5o" path="res://Mods/copyPat/Resources/Sprites/frame0009.png" id="10_gb6v1"] + +[resource] +animations = [{ +"frames": [{ +"duration": 1.0, +"texture": ExtResource("1_6yg0t") +}, { +"duration": 1.0, +"texture": ExtResource("2_hok6u") +}, { +"duration": 1.0, +"texture": ExtResource("3_56chl") +}, { +"duration": 1.0, +"texture": ExtResource("4_xs5by") +}, { +"duration": 1.0, +"texture": ExtResource("5_gqc3p") +}, { +"duration": 1.0, +"texture": ExtResource("6_vrbg2") +}, { +"duration": 1.0, +"texture": ExtResource("7_s0f6e") +}, { +"duration": 1.0, +"texture": ExtResource("8_jo2n1") +}, { +"duration": 1.0, +"texture": ExtResource("9_ecn1r") +}, { +"duration": 1.0, +"texture": ExtResource("10_gb6v1") +}], +"loop": true, +"name": &"default", +"speed": 30.0 +}] diff --git a/Resources/Sprites/frame0000.png b/Resources/Sprites/frame0000.png new file mode 100644 index 0000000..ba3c522 Binary files /dev/null and b/Resources/Sprites/frame0000.png differ diff --git a/Resources/Sprites/frame0000.png.import b/Resources/Sprites/frame0000.png.import new file mode 100644 index 0000000..aaab61a --- /dev/null +++ b/Resources/Sprites/frame0000.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://c0q4k8pg67x0t" +path.s3tc="res://.godot/imported/frame0000.png-541d8bc778e6cbbdc8e432fb4896d23f.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Mods/copyPat/Resources/Sprites/frame0000.png" +dest_files=["res://.godot/imported/frame0000.png-541d8bc778e6cbbdc8e432fb4896d23f.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +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=0 diff --git a/Resources/Sprites/frame0001.png b/Resources/Sprites/frame0001.png new file mode 100644 index 0000000..9fb6460 Binary files /dev/null and b/Resources/Sprites/frame0001.png differ diff --git a/Resources/Sprites/frame0001.png.import b/Resources/Sprites/frame0001.png.import new file mode 100644 index 0000000..a211825 --- /dev/null +++ b/Resources/Sprites/frame0001.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cg2qsgsfjytbo" +path.s3tc="res://.godot/imported/frame0001.png-98b6d91eb7e60e7ea9da2190c5a1444f.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Mods/copyPat/Resources/Sprites/frame0001.png" +dest_files=["res://.godot/imported/frame0001.png-98b6d91eb7e60e7ea9da2190c5a1444f.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +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 diff --git a/Resources/Sprites/frame0002.png b/Resources/Sprites/frame0002.png new file mode 100644 index 0000000..7b960af Binary files /dev/null and b/Resources/Sprites/frame0002.png differ diff --git a/Resources/Sprites/frame0002.png.import b/Resources/Sprites/frame0002.png.import new file mode 100644 index 0000000..b8a9e57 --- /dev/null +++ b/Resources/Sprites/frame0002.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://rlt4xf6i2lwq" +path.s3tc="res://.godot/imported/frame0002.png-eebe31c149513c211724df17e6d00ba8.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Mods/copyPat/Resources/Sprites/frame0002.png" +dest_files=["res://.godot/imported/frame0002.png-eebe31c149513c211724df17e6d00ba8.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +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 diff --git a/Resources/Sprites/frame0003.png b/Resources/Sprites/frame0003.png new file mode 100644 index 0000000..b0a2f01 Binary files /dev/null and b/Resources/Sprites/frame0003.png differ diff --git a/Resources/Sprites/frame0003.png.import b/Resources/Sprites/frame0003.png.import new file mode 100644 index 0000000..135616f --- /dev/null +++ b/Resources/Sprites/frame0003.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://cnj3ytdbosr22" +path.s3tc="res://.godot/imported/frame0003.png-3ea029b60cd63160ac773c549e33c00c.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Mods/copyPat/Resources/Sprites/frame0003.png" +dest_files=["res://.godot/imported/frame0003.png-3ea029b60cd63160ac773c549e33c00c.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +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 diff --git a/Resources/Sprites/frame0004.png b/Resources/Sprites/frame0004.png new file mode 100644 index 0000000..a3d6573 Binary files /dev/null and b/Resources/Sprites/frame0004.png differ diff --git a/Resources/Sprites/frame0004.png.import b/Resources/Sprites/frame0004.png.import new file mode 100644 index 0000000..3d3ea84 --- /dev/null +++ b/Resources/Sprites/frame0004.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://dpilq5sol1qaa" +path.s3tc="res://.godot/imported/frame0004.png-7819cbb3e99a8826fe515742b3d67886.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Mods/copyPat/Resources/Sprites/frame0004.png" +dest_files=["res://.godot/imported/frame0004.png-7819cbb3e99a8826fe515742b3d67886.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +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 diff --git a/Resources/Sprites/frame0005.png b/Resources/Sprites/frame0005.png new file mode 100644 index 0000000..23417de Binary files /dev/null and b/Resources/Sprites/frame0005.png differ diff --git a/Resources/Sprites/frame0005.png.import b/Resources/Sprites/frame0005.png.import new file mode 100644 index 0000000..be59a97 --- /dev/null +++ b/Resources/Sprites/frame0005.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bib1jji1dxnre" +path.s3tc="res://.godot/imported/frame0005.png-c1aab9bb59dd0f9c6ef9ffc7f3432728.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Mods/copyPat/Resources/Sprites/frame0005.png" +dest_files=["res://.godot/imported/frame0005.png-c1aab9bb59dd0f9c6ef9ffc7f3432728.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +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 diff --git a/Resources/Sprites/frame0006.png b/Resources/Sprites/frame0006.png new file mode 100644 index 0000000..596446a Binary files /dev/null and b/Resources/Sprites/frame0006.png differ diff --git a/Resources/Sprites/frame0006.png.import b/Resources/Sprites/frame0006.png.import new file mode 100644 index 0000000..afbf43e --- /dev/null +++ b/Resources/Sprites/frame0006.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ddleraq15mf45" +path.s3tc="res://.godot/imported/frame0006.png-1153f7b9849d779827eef7a5e37f6a7d.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Mods/copyPat/Resources/Sprites/frame0006.png" +dest_files=["res://.godot/imported/frame0006.png-1153f7b9849d779827eef7a5e37f6a7d.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +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 diff --git a/Resources/Sprites/frame0007.png b/Resources/Sprites/frame0007.png new file mode 100644 index 0000000..3dd078d Binary files /dev/null and b/Resources/Sprites/frame0007.png differ diff --git a/Resources/Sprites/frame0007.png.import b/Resources/Sprites/frame0007.png.import new file mode 100644 index 0000000..251e434 --- /dev/null +++ b/Resources/Sprites/frame0007.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://inbtpiu0dei2" +path.s3tc="res://.godot/imported/frame0007.png-ff4cac87646ef5b186ab232475f2e046.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Mods/copyPat/Resources/Sprites/frame0007.png" +dest_files=["res://.godot/imported/frame0007.png-ff4cac87646ef5b186ab232475f2e046.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +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 diff --git a/Resources/Sprites/frame0008.png b/Resources/Sprites/frame0008.png new file mode 100644 index 0000000..bcd7307 Binary files /dev/null and b/Resources/Sprites/frame0008.png differ diff --git a/Resources/Sprites/frame0008.png.import b/Resources/Sprites/frame0008.png.import new file mode 100644 index 0000000..ea28131 --- /dev/null +++ b/Resources/Sprites/frame0008.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bn4q1e3jwi8f4" +path.s3tc="res://.godot/imported/frame0008.png-772a67101bbace68d40c4dfd5eeeca61.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Mods/copyPat/Resources/Sprites/frame0008.png" +dest_files=["res://.godot/imported/frame0008.png-772a67101bbace68d40c4dfd5eeeca61.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +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 diff --git a/Resources/Sprites/frame0009.png b/Resources/Sprites/frame0009.png new file mode 100644 index 0000000..8f55873 Binary files /dev/null and b/Resources/Sprites/frame0009.png differ diff --git a/Resources/Sprites/frame0009.png.import b/Resources/Sprites/frame0009.png.import new file mode 100644 index 0000000..3fede2e --- /dev/null +++ b/Resources/Sprites/frame0009.png.import @@ -0,0 +1,35 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bb0g2obo0qc5o" +path.s3tc="res://.godot/imported/frame0009.png-b6fdfcfb97cdc3ede3a515d3b2a45bcc.s3tc.ctex" +metadata={ +"imported_formats": ["s3tc_bptc"], +"vram_texture": true +} + +[deps] + +source_file="res://Mods/copyPat/Resources/Sprites/frame0009.png" +dest_files=["res://.godot/imported/frame0009.png-b6fdfcfb97cdc3ede3a515d3b2a45bcc.s3tc.ctex"] + +[params] + +compress/mode=2 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=true +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +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 diff --git a/Resources/copyPat_AnimatedSprite3D.gd b/Resources/copyPat_AnimatedSprite3D.gd new file mode 100644 index 0000000..b583469 --- /dev/null +++ b/Resources/copyPat_AnimatedSprite3D.gd @@ -0,0 +1,16 @@ +extends AnimatedSprite3D + +# Because billboard sprites don't support rotation of any sort, this +# "simulates" that by using `look_at` to point it towards the camera. + +# Uses the initial rotation's Z value for the rotation value. +# Also rotates 180° because otherwise the sprite appears mirrored? + +@onready var rotation_z := self.rotation.z + +func _process(_delta: float) -> void: + var camera := get_viewport().get_camera_3d() + var look_pos := camera.global_position + look_at(look_pos, camera.global_transform.basis.y) + rotate_object_local(Vector3.FORWARD, rotation_z) + rotate_object_local(Vector3.UP, TAU / 2) diff --git a/Resources/copyPat_BoneAttachment.gd b/Resources/copyPat_BoneAttachment.gd new file mode 100644 index 0000000..435dbd5 --- /dev/null +++ b/Resources/copyPat_BoneAttachment.gd @@ -0,0 +1,8 @@ +extends BoneAttachment3D + +@export var lifetime: float = 12.0 + +func _physics_process(delta: float) -> void: + lifetime -= delta + if lifetime < 0.0: + queue_free() diff --git a/Resources/copyPat_BoneAttachment.tscn b/Resources/copyPat_BoneAttachment.tscn new file mode 100644 index 0000000..af16633 --- /dev/null +++ b/Resources/copyPat_BoneAttachment.tscn @@ -0,0 +1,21 @@ +[gd_scene load_steps=5 format=3 uid="uid://cmprobebh47m7"] + +[ext_resource type="Script" path="res://Mods/copyPat/Resources/copyPat_BoneAttachment.gd" id="1_evgje"] +[ext_resource type="SpriteFrames" uid="uid://dku03qom1ggul" path="res://Mods/copyPat/Resources/Sprites/copyPat_SpriteFrames.tres" id="2_n2lfi"] +[ext_resource type="Script" path="res://Mods/copyPat/Resources/copyPat_AnimatedSprite3D.gd" id="3_1iqud"] +[ext_resource type="AudioStream" uid="uid://bixbrsr7na817" path="res://Mods/copyPat/Resources/copyPat_Headpat.mp3" id="4_npsvc"] + +[node name="copyPat_BoneAttachment" type="BoneAttachment3D"] +bone_name = "Head" +script = ExtResource("1_evgje") + +[node name="copyPat_AnimatedSprite3D" type="AnimatedSprite3D" parent="."] +transform = Transform3D(0.0433013, 0.025, 0, -0.025, 0.0433013, 0, 0, 0, 0.05, 0, 0.2, 0.06) +no_depth_test = true +sprite_frames = ExtResource("2_n2lfi") +autoplay = "default" +script = ExtResource("3_1iqud") + +[node name="copyPat_Headpat" type="AudioStreamPlayer" parent="."] +stream = ExtResource("4_npsvc") +autoplay = true diff --git a/Resources/copyPat_Headpat.mp3 b/Resources/copyPat_Headpat.mp3 new file mode 100644 index 0000000..090746d Binary files /dev/null and b/Resources/copyPat_Headpat.mp3 differ diff --git a/Resources/copyPat_Headpat.mp3.import b/Resources/copyPat_Headpat.mp3.import new file mode 100644 index 0000000..61f10cb --- /dev/null +++ b/Resources/copyPat_Headpat.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://bixbrsr7na817" +path="res://.godot/imported/copyPat_Headpat.mp3-015b4e5951782abb0d51b8a66f298319.mp3str" + +[deps] + +source_file="res://Mods/copyPat/Resources/copyPat_Headpat.mp3" +dest_files=["res://.godot/imported/copyPat_Headpat.mp3-015b4e5951782abb0d51b8a66f298319.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/copyPat.gd b/copyPat.gd new file mode 100644 index 0000000..e520e18 --- /dev/null +++ b/copyPat.gd @@ -0,0 +1,23 @@ +extends Mod_Base + +@export var headpats_scene: PackedScene +@export var triggers: Array[String] = ["copyPat", "pats copygirl"] +@export var countdown: float = 12.0 + +func handle_channel_chat_message(_cheerer_username: String, _cheerer_display_name: String, message: String, _bits_count: int) -> void: + for trigger in triggers: + if message.contains(trigger): + var skel = get_skeleton() + if not skel: return + + var node = skel.get_node("copyPat_BoneAttachment"); + if not node: + node = headpats_scene.instantiate() + skel.add_child(node) + add_autodelete_object(node) + + node.lifetime = countdown + +func _ready() -> void: + add_tracked_setting("triggers", "Trigger phrases", { }) + add_tracked_setting("countdown", "Seconds active", { "min": 0.0, "max": 3600.0 }) diff --git a/copyPat.tscn b/copyPat.tscn new file mode 100644 index 0000000..c721d2c --- /dev/null +++ b/copyPat.tscn @@ -0,0 +1,8 @@ +[gd_scene load_steps=3 format=3 uid="uid://nxxal0nb67su"] + +[ext_resource type="Script" path="res://Mods/copyPat/copyPat.gd" id="1_4ta2j"] +[ext_resource type="PackedScene" uid="uid://cmprobebh47m7" path="res://Mods/copyPat/Resources/copyPat_BoneAttachment.tscn" id="2_r7vj1"] + +[node name="copyPat" type="Node"] +script = ExtResource("1_4ta2j") +headpats_scene = ExtResource("2_r7vj1")