@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