您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Adds particles when walking
- // ==UserScript==
- // @name Movement particles
- // @namespace -
- // @version 0.1.2
- // @description Adds particles when walking
- // @author Devil D. Nudo#7346
- // @match *://*.moomoo.io/*
- // @match *://moomoo.io/*
- // @icon https://www.google.com/s2/favicons?sz=64&domain=moomoo.io
- // @run-at document-start
- // @grant none
- // ==/UserScript==
- (function() {
- function particles() {
- function getRandom(min, max) {
- return Math.floor(Math.random() * (max - min)) + min
- }
- function getRandomRGBA(alpha) {
- const r = Math.round(255 * Math.random())
- const g = Math.round(255 * Math.random())
- const b = Math.round(255 * Math.random())
- const a = alpha ?? 1
- return `rgba(${r}, ${g}, ${b}, ${a})`
- }
- let lastX = 0
- let lastY = 0
- class Vector {
- constructor(x = 0, y = 0) {
- this.x = x
- this.y = y
- }
- static random2D(angle, length = 1) {
- return new Vector(length * Math.cos(angle), length * Math.sin(angle))
- }
- get magnitude() {
- return Math.sqrt(this.x ** 2 + this.y ** 2)
- }
- setMag(length) {
- return this.normalize().mult(length)
- }
- add(x, y) {
- const vector = new Vector(x, y)
- this.x += vector.x
- this.y += vector.y
- return this
- }
- sub(vector) {
- this.x -= vector.x
- this.y -= vector.y
- return this
- }
- mult(scalar) {
- this.x *= scalar
- this.y *= scalar
- return this
- }
- div(divisor) {
- this.x /= divisor
- this.y /= divisor
- return this
- }
- normalize() {
- const mag = this.magnitude
- if (mag > 0) {
- this.div(mag)
- }
- return this
- }
- }
- class Physics {
- constructor(x, y, mass = 5, time = 0.9) {
- this.mass = mass
- this.time = time
- this.position = new Vector(x, y)
- this.velocity = new Vector()
- this.acceleration = new Vector()
- this.force = new Vector()
- }
- updatePhysics() {
- this.force.div(this.mass)
- this.acceleration.add(this.force.x, this.force.y)
- this.acceleration.mult(this.time)
- this.velocity.add(this.acceleration.x, this.acceleration.y)
- this.velocity.mult(this.time)
- this.position.add(this.velocity.x, this.velocity.y)
- }
- }
- class Particle extends Physics {
- constructor({ id, scale, color }, context, xOffset, yOffset, myPlayer) {
- super(myPlayer.x, myPlayer.y)
- this.id = id
- this.maxScale = scale
- this.color = color
- this.context = context
- this.xOffset = xOffset
- this.yOffset = yOffset
- this.scale = 0
- this.alpha = 0
- this.maxAlpha = 1
- this.liveTime = getRandom(350, 600)
- this.liveDate = Date.now()
- let mag = getRandom(1, 10)
- const speed = Math.hypot(lastY - myPlayer.y, lastX - myPlayer.x)
- const direction = Math.atan2(lastY - myPlayer.y, lastX - myPlayer.x)
- const point = new Physics(myPlayer.x, myPlayer.y)
- point.velocity.add(speed * Math.cos(direction), speed * Math.sin(direction))
- point.updatePhysics()
- this.moveDir = Math.atan2(point.position.y - myPlayer.y, point.position.x - myPlayer.x)
- if (speed <= 0.15) {
- mag = 0
- this.moveDir = 0
- }
- this.velocity = Vector.random2D((this.moveDir - Math.PI / 6) + Math.random() * Math.PI * .35).setMag(mag)
- lastX = myPlayer.x
- lastY = myPlayer.y
- }
- get liveTimer() {
- return Date.now() - this.liveDate
- }
- render() {
- this.context.save()
- this.context.fillStyle = this.color
- this.context.globalAlpha = this.alpha
- this.context.beginPath()
- this.context.arc(this.position.x - this.xOffset, this.position.y - this.yOffset, this.scale, 0, 2 * Math.PI)
- this.context.fill()
- this.context.restore()
- }
- update() {
- this.updatePhysics()
- this.scale = (this.liveTimer / this.liveTime) * this.maxScale
- this.alpha = (this.liveTimer / this.liveTime) * this.maxAlpha
- this.render()
- if (this.liveTimer >= this.liveTime) {
- _particles.remove(this.id)
- }
- }
- }
- class Particles {
- constructor() {
- this.particles = {}
- }
- get list() {
- return Object.values(this.particles)
- }
- create(be, f, d, R) {
- const id = Date.now() / 111
- this.particles[id] = new Particle({
- id: id,
- scale: getRandom(5, 12),
- color: getRandomRGBA()
- }, be, f, d, R)
- }
- remove(id) {
- delete this.particles[id]
- }
- update(be, f, d, R) {
- this.create(be, f, d, R)
- let i = this.list.length
- while (i--) {
- this.list[i].update()
- }
- }
- }
- return new Particles()
- }
- function applyRegex(code) {
- code = code.replace(/\,._blank.\)\}/, `,"_blank")};\n${particles.toString()};\n const _particles = particles();\n`)
- const { index } = code.match(/\.drawImage\(\w+\.skull\,/)
- const contextVariable = code.slice(index - 2, index)
- code = code.replace(/\_\.health\>\d/, `;_particles.update(${contextVariable}, f, d, R);_.health>0`)
- return code
- }
- async function loadScript(script) {
- const response = await fetch(script.src)
- let code = await response.text()
- code = applyRegex(code)
- eval(code)
- }
- const observer = new MutationObserver(function(mutations) {
- for (const mutation of mutations) {
- for (const node of mutation.addedNodes) {
- if (node.tagName === "SCRIPT" && /bundle\.js$/.test(node.src)) {
- observer.disconnect()
- loadScript(node)
- node.remove()
- }
- }
- }
- })
- observer.observe(document, {
- childList: true,
- subtree: true
- })
- })()
QingJ © 2025
镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址