您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Animate custom flair using a spritesheet
当前为
// ==UserScript== // @name Custom Flair Animator // @version 1 // @description Animate custom flair using a spritesheet // @include https://*.koalabeast.com/game // @include https://*.koalabeast.com/game?* // @author Bambi // @grant none // @namespace https://greasyfork.org/users/1089343 // ==/UserScript== console.log('START: ' + GM_info.script.name + ' (v' + GM_info.script.version + ' by ' + GM_info.script.author + ')'); tagpro.ready(function () { const flairSpritesheetURL = 'https://i.imgur.com/tnVHI5u.png'; // Replace with your spritesheet URL. const flairFrameWidth = 16; // Width of each frame in pixels. const flairFrameHeight = 16; // Height of each frame in pixels. const flairFramesPerSecond = 16; // Desired frames per second. const gridRows = 6; // Number of rows in the grid. const gridCols = 6; // Number of columns in the grid. const totalFrames = 36; // Total number of frames in your spritesheet. let currentFrame = 0; let lastUpdateTime = 0; const flairContainer = new PIXI.Container(); const flairSprite = new PIXI.Sprite(); flairContainer.addChild(flairSprite); flairContainer.scale.set(1.0); // Adjust the scale as needed. const flairTexture = PIXI.Texture.from(flairSpritesheetURL); function animateFlair() { const currentTime = Date.now(); if (currentTime - lastUpdateTime >= 1000 / flairFramesPerSecond) { currentFrame = (currentFrame + 1) % totalFrames; const frameX = (currentFrame % gridCols) * flairFrameWidth; const frameY = Math.floor(currentFrame / gridCols) * flairFrameHeight; flairSprite.texture = new PIXI.Texture(flairTexture.baseTexture, new PIXI.Rectangle(frameX, frameY, flairFrameWidth, flairFrameHeight)); lastUpdateTime = currentTime; } requestAnimationFrame(animateFlair); } function changeFlair() { const player = tagpro.players[tagpro.playerId]; if (player.id === tagpro.playerId && !player.newFlair) { if (player.sprites.flair) { player.sprites.info.removeChild(player.sprites.flair); player.sprites.flair.destroy(); player.sprites.flair = null; } if (!player.sprites.flair) { player.sprites.flair = flairContainer; player.sprites.flair.anchor = new PIXI.Point(0.5, 0.5); player.sprites.flair.position = new PIXI.Point(15, -17); // (20, -9) is normal player.sprites.info.addChild(player.sprites.flair); player.flair = player.sprites.flair.flairName = 'shinyaxe'; } player.newFlair = true; } } function waitForPlayer() { return new Promise(resolve => { let clearable; clearable = setInterval(function () { if (tagpro && !tagpro.spectator && tagpro.players && tagpro.playerId && tagpro.players[tagpro.playerId] && tagpro.players[tagpro.playerId].hasOwnProperty('flair') && tagpro.players[tagpro.playerId].sprites) { clearInterval(clearable); resolve(); } }, 100); }); } waitForPlayer().then(() => { changeFlair(); animateFlair(); }); });