// ==UserScript== // @name TagPro ProSplats // @version 1.0.1 // @description Animated directional splats // @include http://tagpro-*.koalabeast.com:* // @include http://tangent.jukejuice.com:* // @include http://*.newcompte.fr:* // @author Browncoat // ==/UserScript== tagpro.ready(function () { // ---------- USER OPTIONS ---------- var particlesPerSplat = 50; // Number of splat particles per splat. Cool kids use 1000 var spread = 1; // Determines the size of the area a splat will cover var particleScale = 1; // Size of an individual splat particle var splatLifetime = 60; // Time in seconds before a splat is removed. Set to 0 for infinite lifetime var fadeTime = 10; // Time in seconds before a splat fades out before being removed var redTeamColor = 0xFF0000; // Color of the red team splats. Default = 0xFF0000 White = 0xFFFFFF. Borgen's seaweed green = 0x17A98C var blueTeamColor = 0x0000FF; // Color of the blue team splats. Default = 0x0000FF Black = 0x000000. Borgen's seaweed blue = 0x3A6B9B // ---------- END USER OPTIONS ---------- var splats = []; var splatsLayer; tagpro.renderer.addSplat = function (x, y, team, showDeath) { // don't draw default splat }; var updatePlayer = tagpro.renderer.updatePlayer; tagpro.renderer.updatePlayer = function (player) { updatePlayer(player); if (player.deadLastFrame == undefined) { player.deadLastFrame = player.dead; } if (!player.deadLastFrame && player.dead) { createSplat(player); } player.deadLastFrame = player.dead; if (!player.dead) { player.lastAliveXSpeed = player.lx; player.lastAliveYSpeed = player.ly; } }; function createSplat(player) { var x = player.x + 20; var y = player.y + 20; var xSpeed = player.lastAliveXSpeed; var ySpeed = player.lastAliveYSpeed; log(xSpeed + ", " + ySpeed); var color = player.team == 1 ? redTeamColor : blueTeamColor; var splat = new PIXI.DisplayObjectContainer(); splat.time = splatLifetime; for (var i = 0; i < particlesPerSplat; i++) { var particle = new Particle(x, y, xSpeed, ySpeed, color); splat.addChild(particle.sprite); } splats.push(splat); if (splatsLayer == null) { splatsLayer = new PIXI.DisplayObjectContainer(); tagpro.renderer.gameContainer.addChildAt(splatsLayer, tagpro.renderer.gameContainer.getChildIndex(tagpro.renderer.layers.midground) + 1); log("Splats layer created"); } splatsLayer.addChild(splat); } if (splatLifetime > 0) { function tick() { for (var i = 0; i < splats.length; i++) { var splat = splats[i]; if (--splat.time == 0) { fadeOut(splat); } } } setInterval(tick, 1000); } function fadeOut(splat) { var f = function () { splat.alpha -= 16 / (fadeTime * 1000); if (splat.alpha <= 0) { splatsLayer.removeChild(splat); splats.splice(splats.indexOf(splat), 1); log("splat removed"); } else { setTimeout(f, 16); } }; f(); } function log(message) { console.log("[PROSPLATS] " + message); } // Particle class var Particle = function (baseX, baseY, baseXSpeed, baseYSpeed, color) { // pick random position within a ball var x = baseX + Math.random() * 40 - 20; var y = baseY + Math.random() * 40 - 20; // angle determined by position this.angle = -Math.atan2(x - baseX, y - baseY); // speed determined by baseSpeed var baseComponent = spread * dotProduct(x - baseX, y - baseY, baseXSpeed, baseYSpeed); var speed = Math.random() * 5 + 5; var minSpeed = 1; if (speed + baseComponent < minSpeed) { baseComponent = minSpeed - speed; } speed += baseComponent; var this_ = this; this.color = color; this.sprite = createSprite(); this.airTime = 2; this.inAir = true; this.xSpeed = -Math.sin(this.angle) * speed; this.ySpeed = Math.cos(this.angle) * speed; this.sprite.position.x = x; this.sprite.position.y = y; function createSprite() { var sprite = new PIXI.Graphics(); sprite.lineStyle(0); sprite.beginFill(color, 0.5); sprite.drawEllipse(0, 0, 4 * particleScale, 8 * particleScale); sprite.endFill(); sprite.rotation = this_.angle; sprite.scale.x = Math.random() * 0.9 + 0.1; sprite.scale.y = sprite.scale.x; return sprite; } function update() { if (this_.inAir) { this_.airTime--; if (this_.airTime <= 0) { this_.inAir = false; } this_.sprite.position.x += this_.xSpeed; this_.sprite.position.y += this_.ySpeed; setTimeout(update, 16); } } setTimeout(update, 16); }; function dotProduct(x1, y1, x2, y2) { return (x1 * x2) + (y1 * y2); } });