OWOP Brush Tool

Brush Tool

// ==UserScript==
// @name        OWOP Brush Tool
// @version     1.0
// @namespace    none
// @author      jau
// @description Brush Tool
// @include     https://ourworldofpixels.com/*
// @run-at      document-end
// @grant       none
// ==/UserScript==

var mindr = 1;
var maxdr = 10000;
var brDiameter = 2;

OWOP.tool.addToolObject(new OWOP.tool.class('Brush', OWOP.cursors.brush, OWOP.fx.player.RECT_SELECT_ALIGNED(brDiameter), false, function (tool) {
    tool.brDiameter = 2; //Declaring variable for brush diameter.
    var lastX, lastY;
    document.addEventListener("keydown", rainbowToggle, false);

  var rainbowPressed = null;
  function rainbowToggle(e) {
    /* tab key pressed to toggle rainbow mode */
    if (e.keyCode == 9) {
      rainbowPressed = !rainbowPressed;
    }
  }
    tool.setEvent('mousedown mousemove', function (mouse, event) {

    var usedButtons = 3; /* Left and right mouse buttons are always used... */
    var color = mouse.buttons === 2 ? [255, 255, 255] : OWOP.player.selectedColor; /* White color if right clicking */
    switch (OWOP.mouse.buttons) {
        case 1:
        case 2:
            if (!lastX || !lastY) {
                lastX = OWOP.mouse.tileX;
                lastY = OWOP.mouse.tileY;
            }
            (0, OWOP.util.line)(lastX, lastY, OWOP.mouse.tileX, OWOP.mouse.tileY, 1, function (x, y) {
                var pixel = OWOP.world.getPixel(x, y);
                var R = Math.floor(tool.brDiameter / 2);
                if (pixel !== null) {
                    if (!rainbowPressed && mouse.buttons == 1) {
                    for(var ix = 0; ix < tool.brDiameter;  ix++) {
                      for(var iy = 0; iy < tool.brDiameter; iy++) {
                        OWOP.world.setPixel(x + ix - R, y + iy - R, color);
                      }
                    }
                    } else if (rainbowPressed && mouse.buttons == 1) {
                      for(var ix = 0; ix < tool.brDiameter;  ix++) {
                        for(var iy = 0; iy < tool.brDiameter; iy++) {
                          OWOP.world.setPixel(x + ix - R, y + iy - R, [(Math.random()*255)|0, (Math.random()*255)|0, (Math.random()*255)|0]);
                        }
                      }
                    } else if (mouse.buttons == 2) {
                      for(var ix = 0; ix < tool.brDiameter;  ix++) {
                        for(var iy = 0; iy < tool.brDiameter; iy++) {
                          OWOP.world.setPixel(x + ix - R, y + iy - R, [255,255,255]);
                        }
                      }
                    }
            }});
            lastX = OWOP.mouse.tileX;
            lastY = OWOP.mouse.tileY;
            break;
        case 4:
            if (event.ctrlKey) {
                usedButtons |= 4;
                var color = OWOP.world.getPixel(mouse.tileX, mouse.tileY);
                if (color) {
                    OWOP.player.selectedColor = color;
                }
            }
            break;
            }
            return usedButtons;
        });
    tool.setEvent('mouseup', function (mouse) {
    lastX = null;
    lastY = null;
    });
    tool.setFxRenderer(function (fx, ctx, time) { //BAN THONCC
        var x = fx.extra.player.x;
        var y = fx.extra.player.y;
        var diameter = tool.brDiameter
        var fxx = (Math.floor(x / 16) - Math.floor(diameter / 2) - OWOP.camera.x) * OWOP.camera.zoom;
        var fxy = (Math.floor(y / 16) - Math.floor(diameter / 2) - OWOP.camera.y) * OWOP.camera.zoom;
        ctx.globalAlpha = 0.8;
        ctx.strokeStyle = fx.extra.player.htmlRgb;
        ctx.strokeRect(fxx, fxy, OWOP.camera.zoom * diameter, OWOP.camera.zoom * diameter);
        return 1; /* Rendering finished (won't change on next frame) */
    });



}));
var brDiamWinn = OWOP.windowSys.addWindow(new OWOP.windowSys.class.window('Brush diameter.', {}, function(win) {
      win.container.title = ' ';
      win.container.style.height = '16px';
      win.container.style.overflow = 'hidden';

      var brDiamElmm = OWOP.util.mkHTML('span', { innerHTML: OWOP.tool.allTools.brush.brDiameter });
      win.addObj(brDiamElmm);
      var Rbarr = OWOP.util.mkHTML('input', {
          type: 'range', style: '-moz-appearance:none;-webkit-appearance:none;appearance:none;height:6px;outline:none;float:right;',
          min: mindr, max: maxdr,
          value: OWOP.tool.allTools.brush.brDiameter,
          oninput: function() {
              OWOP.tool.allTools.brush.brDiameter = this.value;
              brDiamElmm.innerHTML = this.value;
          }, ondblclick:function() {
              this.value = 1;
              this.onchange();
          }
      });
      win.addObj(Rbarr);
    }).move(800, 32));