83 lines
3.3 KiB
GDScript
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
|