StreamOverlay/ChatAvatars/CatSlimes/cat_world.gd
2026-02-23 18:38:03 -06:00

83 lines
3.3 KiB
GDScript

@tool
extends Node2D
static var ChatAvatarScene: PackedScene = load("res://ChatAvatars/CatSlimes/chat_avatar.tscn")
var _log: TwitchLogger = TwitchLogger.new("CatWorldAvatars")
@onready var chat_avatar_commands: Node = %ChatAvatarCommands
@onready var avatars: Node2D = %Avatars
@onready var floor_point: StaticBody2D = %Floor
@onready var wall_left: StaticBody2D = %WallLeft
@onready var wall_right: StaticBody2D = %WallRight
var floor_level: float = 0.0 :
set(value):
floor_level = value
_handle_resize_event()
static var AvatarSkins: Dictionary[String, SpriteFrames] = {
"blue": load("res://ChatAvatars/CatSlimes/SpriteFrames/baby_blue.tres"),
"black": load("res://ChatAvatars/CatSlimes/SpriteFrames/black.tres"),
"brown": load("res://ChatAvatars/CatSlimes/SpriteFrames/brown.tres"),
"demonic": load("res://ChatAvatars/CatSlimes/SpriteFrames/demonic.tres"),
"rainbow": load("res://ChatAvatars/CatSlimes/SpriteFrames/rainbow.tres"),
"white": load("res://ChatAvatars/CatSlimes/SpriteFrames/white.tres"),
}
var _chatters: Dictionary[String, AvatarInfo] = {}
func _ready() -> void:
if Engine.is_editor_hint(): return
while not Globals.twitcher:
await get_tree().process_frame
ChatManager.first_chat.connect(_handle_first_chat)
Globals.twitcher.add_command("avatar", _handle_command_avatar, 1, 1)
get_viewport().get_window().size_changed.connect(_handle_resize_event)
func _handle_resize_event() -> void:
var rect := get_viewport_rect()
for avatar: Node2D in avatars.get_children():
avatar.position.y = rect.size.y if floor_level == 0.0 else floor_level
floor_point.position.y = rect.size.y if floor_level == 0.0 else floor_level
wall_right.position.x = rect.size.x
func _handle_first_chat(user: TwitchUser, chatter: Chatter, _msg: TwitchChatMessage) -> void:
if _chatters.has(user.id): return
_log.d("New First Chatter: %s(%s)" % [user.display_name, user.id] )
var slime: CatSlimeAvatar = ChatAvatarScene.instantiate()
slime.name = user.id
slime.avatar_name = user.display_name
if chatter.extra_data.has("cat_world_avatar"):
_log.d("Chatter has Skin: %s" % [chatter.extra_data.cat_world_avatar])
slime.skin = AvatarSkins[chatter.extra_data.cat_world_avatar]
else:
var skin: String = AvatarSkins.keys().pick_random()
_log.d("Random Skin: %s" % [skin])
slime.skin = AvatarSkins[skin]
slime.position = Vector2(randf_range(32, 1120), 301)
var ai: AvatarInfo = AvatarInfo.new()
ai.user = user
ai.chatter = chatter
ai.slime = slime
_chatters[user.id] = ai
avatars.add_child(slime)
func _handle_command_avatar(_from_username: String, info: TwitchCommandInfo, args: PackedStringArray) -> void:
var msg: TwitchChatMessage = info.original_message
var uid: String = msg.chatter_user_id
if not _chatters.has(uid):
Globals.twitcher.reply_message("No avatar found!", msg.message_id)
return
var ai: AvatarInfo = _chatters[uid]
if args[0].to_lower() in AvatarSkins.keys():
ai.chatter.extra_data["cat_world_avatar"] = args[0].to_lower()
ai.chatter.save()
ai.slime.skin = AvatarSkins[args[0].to_lower()]
Globals.twitcher.reply_message("Changed avatar skin to %s" % args[0].to_lower(), msg.message_id)
else:
Globals.twitcher.reply_message("Unknown skin '%s', valid options are: %s" % [args[0].to_lower(), ", ".join(AvatarSkins.keys())], msg.message_id)
class AvatarInfo:
var user: TwitchUser
var chatter: Chatter
var slime: CatSlimeAvatar