StreamOverlay/ChatAvatars/CatSlimes/chat_avatar.gd

94 lines
2.8 KiB
GDScript3
Raw Normal View History

2026-02-23 18:38:03 -06:00
@tool
extends CharacterBody2D
class_name CatSlimeAvatar
@export var skin: SpriteFrames:
set(value):
skin = value
if visual:
visual.sprite_frames = skin
@export var avatar_name: String = "Twitch User":
set(value):
avatar_name = value
if display_name:
display_name.text = value
_resize_collision()
@onready var visual: AnimatedSprite2D = %Visual
@onready var display_name: Label = %DisplayName
@onready var state_machine: StateMachine = %StateMachine
@onready var overlap: Area2D = %Overlap
@onready var overlap_collision: CollisionShape2D = %OverlapCollision
var is_gravity_disabled: bool = false
var _overlapping: Array[Node] = []
var _hide_tween: Tween
var _show_tween: Tween
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
visual.animation_changed.connect(_handle_animation_changed)
overlap.area_entered.connect(_handle_overlap_entered)
overlap.area_exited.connect(_handle_overlap_exited)
visual.sprite_frames = skin
display_name.text = avatar_name
_resize_collision()
func _handle_animation_changed() -> void:
if visual.animation == &"sleep":
visual.offset = Vector2(16,-16)
else:
visual.offset = Vector2.ZERO
func _handle_overlap_entered(node: Node) -> void:
_overlapping.append(node)
func _handle_overlap_exited(node: Node) -> void:
_overlapping.erase(node)
func _process(_delta: float) -> void:
if _overlapping.size() > 0: # Overlapping
if _hide_tween: return # Tween in progress
if display_name.modulate.a == 0.0: return # Display name is already hidden.
if _show_tween: # Show Tween is running, stop it, and clear it out.
_show_tween.kill()
_show_tween = null
_hide_tween = create_tween()
_hide_tween.tween_property(display_name, "modulate:a", 0.0, 0.5)
_hide_tween.tween_callback(func(): _hide_tween = null)
else: # Not Overlapping
if _show_tween: return # Tween in progress
if display_name.modulate.a == 1.0: return # Display name is shown.
if _hide_tween: # Hide Tween is running, stop it, and clear it out.
_hide_tween.kill()
_hide_tween = null
_show_tween = create_tween()
_show_tween.tween_property(display_name, "modulate:a", 1.0, 0.5)
_show_tween.tween_callback(func(): _show_tween = null)
pass
func _physics_process(delta: float) -> void:
if Engine.is_editor_hint():
return
if is_gravity_disabled:
velocity.y = 0
else:
velocity.y += get_gravity().y * delta
move_and_slide()
if state_machine.current_state.name.to_lower() != "born":
if velocity.length() > 0 and visual.animation != &"walk":
visual.play(&"walk")
elif velocity.length() == 0 and visual.animation != &"idle":
visual.play(&"idle")
visual.flip_h = velocity.x < 0
func _resize_collision() -> void:
await get_tree().process_frame
var lsize = display_name.size
overlap_collision.shape.size.x = lsize.x