1
0
Fork 0

Initial commit

main
copygirl 2 weeks ago
commit 534e7ba44a
  1. 5
      README.md
  2. 50
      Resources/Sprites/copyPat_SpriteFrames.tres
  3. BIN
      Resources/Sprites/frame0000.png
  4. 35
      Resources/Sprites/frame0000.png.import
  5. BIN
      Resources/Sprites/frame0001.png
  6. 35
      Resources/Sprites/frame0001.png.import
  7. BIN
      Resources/Sprites/frame0002.png
  8. 35
      Resources/Sprites/frame0002.png.import
  9. BIN
      Resources/Sprites/frame0003.png
  10. 35
      Resources/Sprites/frame0003.png.import
  11. BIN
      Resources/Sprites/frame0004.png
  12. 35
      Resources/Sprites/frame0004.png.import
  13. BIN
      Resources/Sprites/frame0005.png
  14. 35
      Resources/Sprites/frame0005.png.import
  15. BIN
      Resources/Sprites/frame0006.png
  16. 35
      Resources/Sprites/frame0006.png.import
  17. BIN
      Resources/Sprites/frame0007.png
  18. 35
      Resources/Sprites/frame0007.png.import
  19. BIN
      Resources/Sprites/frame0008.png
  20. 35
      Resources/Sprites/frame0008.png.import
  21. BIN
      Resources/Sprites/frame0009.png
  22. 35
      Resources/Sprites/frame0009.png.import
  23. 16
      Resources/copyPat_AnimatedSprite3D.gd
  24. 8
      Resources/copyPat_BoneAttachment.gd
  25. 21
      Resources/copyPat_BoneAttachment.tscn
  26. BIN
      Resources/copyPat_Headpat.mp3
  27. 19
      Resources/copyPat_Headpat.mp3.import
  28. 23
      copyPat.gd
  29. 8
      copyPat.tscn

@ -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

@ -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
}]

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.4 KiB

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.0 KiB

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

@ -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

@ -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)

@ -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()

@ -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

Binary file not shown.

@ -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

@ -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 })

@ -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")
Loading…
Cancel
Save