MultiHack KillSwitch [WORKING 2023]

Take Over MooMoo.io

Pada tanggal 24 November 2023. Lihat %(latest_version_link).

You will need to install an extension such as Tampermonkey, Greasemonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install an extension such as Tampermonkey or Violentmonkey to install this script.

You will need to install an extension such as Tampermonkey or Userscripts to install this script.

You will need to install an extension such as Tampermonkey to install this script.

You will need to install a user script manager extension to install this script.

(I already have a user script manager, let me install it!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

You will need to install a user style manager extension to install this style.

(I already have a user style manager, let me install it!)

// ==UserScript==
// @name         MultiHack KillSwitch [WORKING 2023]
// @namespace    Take Over MooMoo
// @version      0.3
// @description  Take Over MooMoo.io
// @match        *://moomoo.io/*
// @match        *://*.moomoo.io/*
// @author       Logixx
// @require      https://greasyfork.org/scripts/423602-msgpack/code/msgpack.js
// @require      https://unpkg.com/[email protected]/lib/guify.min.js
// @require      https://update.greasyfork.org/scripts/480301/1283571/CowJS.js
// @grant        none
// @license      https://greasyfork.org/en/users/1222651-logixx
// @icon         https://moomoo.io/img/favicon.png?v=1
// @run-at       document-start
// ==/UserScript==
(function () {
  'use strict'


  // Variables
  var gearcounter = 1;
  var gear = false;
  var Allplayers = [];
  var players = [];
  var items = [];
  var weapons = [];
  var inGame = false;
  var tmpHealth = 100;
  var sTime = 0;
  var sCount = 0;
  var msgpack = window.msgpack;
  var scale = 45;
  var placeOffset = 5;
  var ws;
  var EnemyAngle1 = 0;
  var lastWeaponRangeMultChange = null
  var Boughtscuba = false;
  var BoughtscubaEle;
  var prevHatID = 0;
  var prevTailID = 0;
  var boughtItems = false;
  var boughtItems2 = false;
  var monkeyTail = false;
  var boostHat = false;
  var snowGear = false;
  var PLAYER_SPEED = .0016;
  var i = 0;

  const { Cow, CowUtils } = window

  var x1 = 0;
  var y1 = 0;

  function saveSettings(HACK, data) {
      console.log(
        'save: ' + HACK.toLowerCase().toString() + ' ' + data.toString()
      )
      localStorage.setItem(
        HACK.toLowerCase().toString(),
        data.toString()
      )
    }

  var settings = {

      ping: { e: localStorage.getItem('ping') || false },
      showsid: {e: localStorage.getItem('showsid') || false },
      percents: { e: localStorage.getItem('percents') || false },
      tracers: { e: localStorage.getItem('tracers') || false },
      hp: { e: localStorage.getItem('hp') || false },
      circles_hp: { e: localStorage.getItem('circles_hp') || false },
      inweaponrange: { e: Number(localStorage.getItem('inwprange')) || false },
      whereurlooking: { e: Number(localStorage.getItem('whereurlooking')) || false },
      healthbars: {e: Number(localStorage.getItem('healthbars')) || false },
      hitcounter: { e: Number(localStorage.getItem('hitcounter')) || false },
      hpcolor: 'red',
      weaponrange: { e: Number(localStorage.getItem('weaponrange')) || 1 },
      enabledhacks: { e: localStorage.getItem('enabledhacks') || false },
      coloredstructures: { e: localStorage.getItem('coloredstructures') || false },

      tripleautomill: { e: localStorage.getItem('tripleautomill') || false, k: localStorage.getItem('tripleautomillk') || 'KeyM', d: true, n: 'Triple AutoMill' },
      autoboost: { e: localStorage.getItem('autoboost') || false, k: localStorage.getItem('autoboostk') || 'KeyB', d: true, n: 'AutoBoost' },
      autoboostspikes: { e: localStorage.getItem('autoboostspikes') || false, k: localStorage.getItem('autoboostspikesk') ||'KeyS', d: true, n: 'AutoBoost + Spikes' },
      autotrap: { e: localStorage.getItem('autotrap') || false, k: localStorage.getItem('autotrapk') || 'KeyT', d: true, n: 'AutoTrap' },
      autoheal: { e: localStorage.getItem('autoheal') || false, k: localStorage.getItem('autohealk') || 'KeyH', s: Number(localStorage.getItem('autoheals')) || 10, d: true, n: 'AutoHeal'},
      autoscuba: { e: localStorage.getItem('autoscuba') || false, k: localStorage.getItem('autoscubak') || 'KeyS', d: false },
      autobreak: { e: localStorage.getItem('autobreak') || false, k: localStorage.getItem('autobreakk') || 'KeyD', d: true, n: 'AutoBreak' },
      autospeed_hat_acc: { e: localStorage.getItem('autospeed_hat_acc') || false, k: localStorage.getItem('autospeed_hat_acck') || 'KeyA', d: true, n: 'AutoSpeed + Hat + Acc' },
      toggleoffspeed_hit_and_on: { e: localStorage.getItem('toggleoffspeed_hit_and_on') || false, k: localStorage.getItem('toggleoffspeed_hit_and_onk') || 'KeyL', d: false },
      antibow: { e: localStorage.getItem('antibow') || false, k: localStorage.getItem('antibowk') || 'KeyQ', d: true, n: 'AntiBow' },
      insta_kill: { e: localStorage.getItem('insta_kill') || false, k: localStorage.getItem('insta_killk') || 'KeyE', d: true, n: 'Insta Kill' },
      biomegear: { e: localStorage.getItem('biomegear') || true },

      autojoin: { e: localStorage.getItem('autojoin') || false, n: Number(localStorage.getItem('autojoinn')) || 0 },
      autocreate: { e: localStorage.getItem('autocreate') || false, n: localStorage.getItem('autocreaten') || 'Killers' },
      autoleave: {e: localStorage.getItem('autoleave') || false },
      autokick: {e: localStorage.getItem('autokick') || false, n: localStorage.getItem('autokickn') || '' },
  };

  const inventory = {
      primary: null,
      secondary: null,
      food: null,
      wall: null,
      spike: null,
      mill: null,
      mine: null,
      boostPad: null,
      trap: null,
      turret: null,
      spawnpad: null
    };

  const myPlayer = {
      food: null,
      wood: null,
      stone: null,
      points: null,
      kills: null,
      sid: null,
      x: null,
      y: null,
      dir: null,
      buildIndex: null,
      weaponIndex: null,
      weaponVariant: null,
      team: null,
      isLeader: null,
      skinIndex: null,
      tailIndex: null,
      iconIndex: null,
      CAMX: 0,
      CAMY: 0,
    };

  //GUI

  const gui = new guify({
      title: 'MultiHack',
      align: 'right',
      width: 600,
      opacity: 0.8,
      barMode: 'none',
      theme: {
        colors: {
          panelBackground: 'rgb(0,0,0)',
          componentBackground: 'rgb(10,10,25)',
          componentForeground: 'red',
          textPrimary: 'red',
          textSecondary: 'red',
          textHover: 'rgb(0,0,0)',
        },
        font: {
          fontSize: '20px',
          fontFamily: 'Hammersmith',
        },
      },
    })

    const folders = [
      'Visuals',
      'Misc',
      'Keybinds',
      'Team',
    ];

    const visuals = [
      'Ping',
      'ShowSID',
      'Percents',
      'Tracers',
      'Hp',
      'EnabledHacks',
      'ColoredStructures',
      'HealthBars',
      'Circles_Hp',
      'InWeaponRange',
      'WhereURLooking',
      'HitCounter',
      'WeaponRange',
    ];

    const misc = [
      'TripleAutoMill',
      'AutoBoost',
      'AutoBoostSpikes',
      'AutoTrap',
      'AutoHeal',
      'AutoScuba',
      'AutoBreak',
      'AutoSpeed_Hat_Acc',
      'ToggleOffSpeed_Hit_And_On',
      'AntiBow',
      'Insta_Kill',
      'BiomeGear',
    ];

    const team = [
      'AutoJoin',
      'ID To Join:',
      'AutoCreate',
      'Name To Create:',
      'AutoLeave',
      'AutoKick',
      'Persons ID To Kick:',
    ];

    for (let key in settings) {
      if (localStorage.getItem(key.toLowerCase() === undefined)) {
        localStorage.setItem(key.toLowerCase(), 'false')
      }
      if (localStorage.getItem(key.toLowerCase()) === 'false') {
        settings[key].e = false
      } else
      if (localStorage.getItem(key.toLowerCase()) === 'true') {
        settings[key].e = true
      }
    }

    for(let j0 = 0; j0 < folders.length; j0++) {
      gui.Register({
          type: 'folder',
          label: folders[j0],
          open: !1
        });
    };

    for (let j1 = 0; j1 < visuals.length; j1++) {
      if (visuals[j1].toLowerCase() === 'weaponrange') {
        gui.Register({
          type: 'range',
          label: visuals[j1],
          folder: folders[0],
          object: settings[visuals[j1].toLowerCase()],
          property: 'e',
          step: 1,
          min: 1,
          max: 5,
          onChange: (data) => {
            saveSettings(visuals[j1].toLowerCase(), data);
        }
        });
      } else {
      gui.Register({
        type: 'checkbox',
        label: visuals[j1],
        folder: folders[0],
        object: settings[visuals[j1].toLowerCase()],
        property: 'e',
        onChange: (data) => {
          saveSettings(visuals[j1].toLowerCase(), data);
      }
      });
     };
    };
    for (let j2 = 0; j2 < misc.length; j2++) {
      gui.Register({
        type: 'checkbox',
        label: misc[j2],
        folder: folders[1],
        object: settings[misc[j2].toLowerCase()],
        property: 'e',
        onChange: (data) => {
          saveSettings(misc[j2].toLowerCase(), data);
      }
      });
    };

    const script = {
      setKeybind: function (selection, save) {
        selection.k = 'Press Any Key'
        document.addEventListener('keydown', function set_key(e) {
          if (e.key === 'Escape') {
            selection.k = 'NONE'
            localStorage.setItem(save, selection.k)
            document.removeEventListener('keydown', set_key)
          } else {
            selection.k = e.code
            localStorage.setItem(save, selection.k)
            document.removeEventListener('keydown', set_key)
          }
        })
      },
    };

    gui.Register({
      type: 'button',
      label: 'AUTUTU',
      folder: folders[3],
      action: () => {
        testerWeap()
      }
    });

    gui.Register({
      type: 'button',
      label: team[0],
      folder: folders[3],
      action: () => {
        joinTeam(settings.autojoin.n)
      }
    });
    gui.Register({
      type: 'text',
      label: team[1],
      folder: folders[3],
      object: settings.autojoin,
      property: 'n',
      onChange: (data) => {
        saveSettings('autojoinn', data);
      }
    });
    gui.Register({
      type: 'button',
      label: team[2],
      folder: folders[3],
      action: () => {
        createTeam(settings.autocreate.n)
      }
    });
    gui.Register({
      type: 'text',
      label: team[3],
      folder: folders[3],
      object: settings.autocreate,
      property: 'n',
      onChange: (data) => {
        saveSettings('autocreaten', data);
      }
    });
    gui.Register({ // e
      type: 'button',
      label: team[4],
      folder: folders[3],
      action: () => {
        leaveTeam()
      }
    });
    gui.Register({ // e
      type: 'button',
      label: team[5],
      folder: folders[3],
      action: () => {
        kickTeam(settings.autokick.n)
      }
    });
    gui.Register({
      type: 'text',
      label: team[6],
      folder: folders[3],
      object: settings.autokick,
      property: 'n',
      onChange: (data) => {
        saveSettings('autokickn', data);
      }
    });

    gui.Register({
      type: 'button',
      label: 'Set '+misc[0]+' Key',
      folder: folders[2],
      action: () => {
          script.setKeybind(settings.tripleautomill, 'tripleautomillk')
      }
    });
    gui.Register({
      type: 'display',
      label: misc[0]+' Key:',
      folder: folders[2],
      object: settings[misc[0].toLowerCase()],
      property: 'k',
    });
    //AutoBoost
    gui.Register({
      type: 'button',
      label: 'Set '+misc[1]+' Key',
      folder: folders[2],
      action: () => {
          script.setKeybind(settings.autoboost, 'autoboostk')
      }
    });
    gui.Register({
      type: 'display',
      label: misc[1]+' Key:',
      folder: folders[2],
      object: settings[misc[1].toLowerCase()],
      property: 'k',
    });
    //AutoBoostSpikes
    gui.Register({
      type: 'button',
      label: 'Set '+misc[2]+' Key',
      folder: folders[2],
      action: () => {
          script.setKeybind(settings.autoboostspikes, 'autoboostspikesk')
      }
    });
    gui.Register({
      type: 'display',
      label: misc[2]+' Key:',
      folder: folders[2],
      object: settings[misc[2].toLowerCase()],
      property: 'k',
    });
     //AutoTrap
     gui.Register({
      type: 'button',
      label: 'Set '+misc[3]+' Key',
      folder: folders[2],
      action: () => {
          script.setKeybind(settings.autotrap, 'autotrapk')
      }
      });
    gui.Register({
        type: 'display',
        label: misc[3]+' Key:',
        folder: folders[2],
        object: settings[misc[3].toLowerCase()],
        property: 'k',
        });
      //AutoHeal
    gui.Register({
      type: 'button',
      label: 'Set '+misc[4]+' Key',
      folder: folders[2],
      action: () => {
          script.setKeybind(settings.autoheal, 'autohealk')
      }
    });
    gui.Register({
      type: 'display',
      label: misc[4]+' Key:',
      folder: folders[2],
      object: settings[misc[4].toLowerCase()],
      property: 'k',
    });
    gui.Register({
      type: 'range',
      label: misc[4]+ ' Speed:',
      folder: folders[2],
      min: 1,
      max: 1000,
      step: 1,
      object: settings[misc[4].toLowerCase()],
      property: 's',
      onChange() {
          saveSettings('autoheals', settings.autoheal.s)
      }
    });
    //AutoScuba
    gui.Register({
       type: 'button',
       label: 'Set '+misc[5]+' Key',
       folder: folders[2],
       action: () => {
           script.setKeybind(settings.autoscuba, 'autoscubak')
       }
     });
     gui.Register({
       type: 'display',
       label: misc[5]+' Key:',
       folder: folders[2],
       object: settings[misc[5].toLowerCase()],
       property: 'k',
     });
   //AutoBreak
   gui.Register({
      type: 'button',
      label: 'Set '+misc[6]+' Key',
      folder: folders[2],
      action: () => {
          script.setKeybind(settings.autobreak, 'autobreakk')
      }
    });
    gui.Register({
      type: 'display',
      label: misc[6]+' Key:',
      folder: folders[2],
      object: settings[misc[6].toLowerCase()],
      property: 'k',
    });
   //AutoSpeed_Hat_Acc
   gui.Register({
      type: 'button',
      label: 'Set '+misc[7]+' Key',
      folder: folders[2],
      action: () => {
          script.setKeybind(settings.autospeed_hat_acc, 'autospeed_hat_acck')
      }
    });
    gui.Register({
      type: 'display',
      label: misc[7]+' Key:',
      folder: folders[2],
      object: settings[misc[7].toLowerCase()],
      property: 'k',
    });
   //ToggleOffSpeed_Hit_And_On
   gui.Register({
      type: 'button',
      label: 'Set '+misc[8]+' Key',
      folder: folders[2],
      action: () => {
          script.setKeybind(settings.toggleoffspeed_hit_and_on, 'toggleoffspeed_hit_and_onk')
      }
    });
    gui.Register({
      type: 'display',
      label: misc[8]+' Key:',
      folder: folders[2],
      object: settings[misc[8].toLowerCase()],
      property: 'k',
    });
   //AntiBow
   gui.Register({
      type: 'button',
      label: 'Set '+misc[9]+' Key',
      folder: folders[2],
      action: () => {
          script.setKeybind(settings.antibow, 'antibowk')
      }
    });
    gui.Register({
      type: 'display',
      label: misc[9]+' Key:',
      folder: folders[2],
      object: settings[misc[9].toLowerCase()],
      property: 'k',
    });
   //Insta_Kill
   gui.Register({
      type: 'button',
      label: 'Set '+misc[10]+' Key',
      folder: folders[2],
      action: () => {
          script.setKeybind(settings.insta_kill, 'insta_killk')
      }
    });
    gui.Register({
      type: 'display',
      label: misc[10]+' Key:',
      folder: folders[2],
      object: settings[misc[10].toLowerCase()],
      property: 'k',
    });

  const join = message => Array.isArray(message) ? [...message] : [...message];

  // WebSocket setup
  ws = new Promise(function (resolve) {
    let {
      send
    } = WebSocket.prototype;
    WebSocket.prototype.send = function (...x) {
      send.apply(this, x);
      this.send = send;
      this.io = function (...datas) {
        const [packet, ...data] = datas;
        this.send(new Uint8Array(Array.from(msgpack.encode([packet, data]))));
      };

      document.addEventListener("keydown", event => {
          if ('Key'+event.key.toLocaleUpperCase() === settings.autoboost.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
            settings.autoboost.e = true;
          };
          if ('Key'+event.key.toLocaleUpperCase() === settings.autoboostspikes.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
            settings.autoboostspikes.e = true;
          };
          if ('Key'+event.key.toLocaleUpperCase() === settings.autotrap.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
            settings.autotrap.e = true;
          };
          if ('Key'+event.key.toLocaleUpperCase() === settings.insta_kill.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
            settings.insta_kill.e = true;
          };
          if ('Key'+event.key.toLocaleUpperCase() === settings.autospeed_hat_acc.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
            settings.autospeed_hat_acc.e = true;
          };
      });

      document.addEventListener("keyup", event => {
          if ('Key'+event.key.toLocaleUpperCase() === settings.autoboost.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
            settings.autoboost.e = false;
          };
          if ('Key'+event.key.toLocaleUpperCase() === settings.autoboostspikes.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
            settings.autoboostspikes.e = false;
          };
          if ('Key'+event.key.toLocaleUpperCase() === settings.autotrap.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
            settings.autotrap.e = false;
          };
          if ('Key'+event.key.toLocaleUpperCase() === settings.insta_kill.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
            settings.insta_kill.e = false;
          };
          if ('Key'+event.key.toLocaleUpperCase() === settings.autospeed_hat_acc.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
            settings.autospeed_hat_acc.e = false;
          };
      });

      document.addEventListener("keydown", event => {
          if ('Key'+event.key.toLocaleUpperCase() === settings.tripleautomill.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
            settings.tripleautomill.e = !settings.tripleautomill.e;
          };
          if ('Key'+event.key.toLocaleUpperCase() === settings.autoheal.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
              settings.autoheal.e = !settings.autoheal.e;
            };
          if ('Key'+event.key.toLocaleUpperCase() === settings.autobreak.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
            settings.autobreak.e = !settings.autobreak.e;
          };
          if ('Key'+event.key.toLocaleUpperCase() === settings.antibow.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
            settings.antibow.e = !settings.antibow.e;
          };
          if ('Key'+event.key.toLocaleUpperCase() === settings.toggleoffspeed_hit_and_on.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
            settings.toggleoffspeed_hit_and_on.e = !settings.toggleoffspeed_hit_and_on.e;
          };
          if ('Key'+event.key.toLocaleUpperCase() === settings.autoscuba.k && document.activeElement.id.toLowerCase() !== 'chatbox') {
            settings.autoscuba.e = !settings.autoscuba.e;
          };
        });

      this.addEventListener("message", function (e) {
        const [packet, data] = msgpack.decode(new Uint8Array(e.data));
        let sid = data[0];
        let health = data[1];

        var tmpData = msgpack.decode(new Uint8Array(e.data));
        var ms = e;


        let addEventListener = {
          setupGame: "C",
          updateHealth: "O",
          killPlayer: "P",
          updateItems: "V"
          };

              switch (packet) {
                case addEventListener.setupGame:
                  inGame = true;
                  items = [0, 3, 6, 10];
                  weapons = [0];
                  break;
                case addEventListener.updateHealth:
                  if (sid === myPlayer.sid) {
                    if (inGame) {
                      if (health < 100 && health > 0 && settings.autoheal.e) {
                        setTimeout(function () {
                          chat('AutoHealing...')
                          place(inventory.food);
                        }, Number(settings.autoheal.s));
                      }
                    }
                    if (tmpHealth - health < 0) {
                      if (sTime) {
                        let timeHit = Date.now() - sTime;
                        sTime = 0;
                        sCount = timeHit <= 120 ? sCount + 1 : Math.max(0, sCount - 2);
                      }
                    } else {
                      sTime = Date.now();
                    }
                    tmpHealth = health;
                  }
                  break;
                case addEventListener.killPlayer:
                  inGame = false;
                  tmpHealth = 200;
                  break;
                case addEventListener.updateItems:
                  if (sid) {
                    if (health) {
                      weapons = sid;
                    } else {
                      items = sid;
                    }
                  }
                  break;
                };

        if ((ms = undefined) || (tmpData = (ms = tmpData.length > 1 ? [tmpData[0], ...join(tmpData[1])] : tmpData)[0]) || ms) {
          if ("C" == tmpData && null === myPlayer.sid && (myPlayer.sid = ms[1]) || "a" == tmpData) {
            for (tmpData = 0; tmpData < ms[1].length / 13; tmpData++) {

              var data2 = ms[1].slice(13 * tmpData, 13 * (tmpData + 1));
              if (data2[0] == myPlayer.sid) {
                  Object.assign(myPlayer, {
                    food: document.getElementById("foodDisplay").innerText,
                    wood: document.getElementById("woodDisplay").innerText,
                    stone: document.getElementById("stoneDisplay").innerText,
                    points: document.getElementById("scoreDisplay").innerText,
                    kills: document.getElementById("killCounter").innerText,
                    sid: data2[0],
                    x: data2[1],
                    y: data2[2],
                    dir: data2[3],
                    buildIndex: data2[4],
                    weaponIndex: data2[5],
                    weaponVariant: data2[6],
                    team: data2[7],
                    isLeader: data2[8],
                    skinIndex: data2[9],
                    tailIndex: data2[10],
                    iconIndex: data2[11]
                  });
                } else {
                const existingAllPlayerIndex = Allplayers.findIndex(Allplayers => Allplayers.sid === data2[0]);
                const existingPlayerIndex = players.findIndex(players => players.sid === data2[0]);

                if (existingPlayerIndex !== -1) {
                // Update existing player information
                players[existingPlayerIndex] = {
                  sid: data2[0],
                  x: data2[1],
                  y: data2[2],
                  dir: data2[3],
                  buildIndex: data2[4],
                  weaponIndex: data2[5],
                  weaponVariant: data2[6],
                  team: data2[7],
                  isLeader: data2[8],
                  skinIndex: data2[9],
                  tailIndex: data2[10],
                  iconIndex: data2[11]
                };
              } else {
                players.push({
                  sid: data2[0],
                  x: data2[1],
                  y: data2[2],
                  dir: data2[3],
                  buildIndex: data2[4],
                  weaponIndex: data2[5],
                  weaponVariant: data2[6],
                  team: data2[7],
                  isLeader: data2[8],
                  skinIndex: data2[9],
                  tailIndex: data2[10],
                  iconIndex: data2[11]
              });
              }

                if (existingAllPlayerIndex !== -1) {
                    // Update existing player information
                    Allplayers[existingAllPlayerIndex] = {
                        sid: data2[0],
                        x: data2[1],
                        y: data2[2],
                        dir: data2[3],
                        buildIndex: data2[4],
                        weaponIndex: data2[5],
                        weaponVariant: data2[6],
                        team: data2[7],
                        isLeader: data2[8],
                        skinIndex: data2[9],
                        tailIndex: data2[10],
                        iconIndex: data2[11]
                    };
                } else {
                    // Add a new player entry to the players array
                    Allplayers.push({
                        sid: data2[0],
                        x: data2[1],
                        y: data2[2],
                        dir: data2[3],
                        buildIndex: data2[4],
                        weaponIndex: data2[5],
                        weaponVariant: data2[6],
                        team: data2[7],
                        isLeader: data2[8],
                        skinIndex: data2[9],
                        tailIndex: data2[10],
                        iconIndex: data2[11]
                    });
                }
            };

                if (myPlayer.skinIndex < 1 || !myPlayer.tailIndex < 1) {
                  PLAYER_SPEED = .0016;
                } else {
                  PLAYER_SPEED = (.0016 * (myPlayer.skinIndex ? (myPlayer.skinIndex === 56 ? (1.1) : myPlayer.skinIndex === 12 ? (1.16) : 1 ) : 1 ) * (myPlayer.tailIndex ? (myPlayer.tailIndex === 11 ? (1.35) : (myPlayer.tailIndex === 19 ? (1.1) : 1 ) ) : 1 ));
                };

                // LOGIC AUTO MILL :D

                if (y1 !== myPlayer.y || x1 !== myPlayer.x) {
                  if (Math.atan2(y1 - myPlayer.y, x1 - myPlayer.x) < (scale + placeOffset) * 2) {

                    const millCost = {
                      wood: (inventory.mill === 10 ? 50 : (inventory.mill === 11 ? 60 : (inventory.mill === 12 ? 100 : 50))),
                      stone: (inventory.mill === 10 ? 10 : (inventory.mill === 11 ? 20 : (inventory.mill === 12 ? 50 : 10))),
                    };

                    if (settings.tripleautomill.e && myPlayer.wood >= millCost.wood && myPlayer.stone >= millCost.stone && inGame) {
                      let angle = Math.atan2(y1 - myPlayer.y, x1 - myPlayer.x);
                      setTimeout(function () {
                      chat('TripleMill...')
                      place(inventory.mill, angle + Math.PI / 2.5);
                      place(inventory.mill, angle);
                      place(inventory.mill, angle - Math.PI / 2.5);
                      }, PLAYER_SPEED);
                    };
                // AUTO BOOST PAD :D

                const boostCost = {
                  wood: 5,
                  stone: 20,
                };

                if (settings.autoboost.e && myPlayer.wood >= boostCost.wood && myPlayer.stone >= boostCost.stone && inGame) {
                  let angle = Math.atan2(y1 - myPlayer.y, x1 - myPlayer.x);
                  setTimeout(function () {
                  chat('Boosting...')
                  place(inventory.boostPad, angle + Math.PI);
                  }, PLAYER_SPEED);
                };

                // AUTO BOOST SPIKES :D

                const spikeCost = {
                  wood: (inventory.spike === 6 ? 20 : (inventory.spike === 7 ? 30 : (inventory.spike === 8 ? 35 : (inventory.spike === 9 ? 30 : 20)))),
                      stone: (inventory.spike === 6 ? 5 : (inventory.spike === 7 ? 10 : (inventory.spike === 8 ? 15 : (inventory.spike === 9 ? 20 : 5)))),
                }

                if (settings.autoboostspikes.e && myPlayer.wood >= boostCost.wood+spikeCost.wood && myPlayer.stone >= boostCost.stone+spikeCost.stone && inGame) {
                  let angle = Math.atan2(y1 - myPlayer.y, x1 - myPlayer.x);
                  chat('Boosting + Spikes...')
                  place(inventory.spike, angle + Math.PI / 2);
                  place(inventory.boostPad, angle + Math.PI);
                  place(inventory.spike, angle - Math.PI / 2);
                };

                // AUTO TRAP :D

                const trapCost = {
                  wood: 30,
                      stone: 30,
                }

                if (settings.autotrap.e && myPlayer.wood >= trapCost.wood && myPlayer.stone >= trapCost.stone && inGame) {
                  setTimeout(function () {
                    chat('AutoTraping...')
                      let angle = Math.atan2(y1 - myPlayer.y, x1 - myPlayer.x);
                        place(inventory.trap, angle + Math.PI / 2.5);
                        place(inventory.trap, angle + Math.PI);
                        place(inventory.trap, angle - Math.PI / 2.5);
                  }, PLAYER_SPEED);
                };

                   // AUTO SCUBA :D

                   if (Boughtscuba === true) {} else {
                     BoughtscubaEle = document.getElementById('storeDisplay21');
                   };

                   if (Boughtscuba !== true && Number(myPlayer.points) >= 2500 && settings.autoscuba.e) { console.log(`BUY ${myPlayer.points}`); storeBuy(31); storeEquip(31); Boughtscuba = true; BoughtscubaEle = true; };
                   if (BoughtscubaEle !== true && BoughtscubaEle !== null) {
                   if (BoughtscubaEle.innerText.includes('Equip') && Boughtscuba !== false) { Boughtscuba = true; BoughtscubaEle = true; };
                   };

                   var inWater = false;

                   var inSnow = false;

                   if (Number(myPlayer.y) >= ((14400 / 2) - 375) && Number(myPlayer.y) <= ((14400 / 2) + 375)) {
                     inWater = true;
                   };

                   const snowY = window.config.snowBiomeTop

                   if(myPlayer.y <= snowY) {
                    inSnow = true;
                  };

                   if (settings.autospeed_hat_acc.e || inWater || inSnow) {
                      if (!snowGear && Number(myPlayer.points) >= 600) {
                        storeBuy(15);
                        snowGear = true;
                      };

                      if (inSnow && snowGear && inGame && settings.biomegear.e) {
                        storeEquip(15);
                      };
                    if (inWater && settings.autoscuba.e && inGame && Boughtscuba) {
                      storeEquip(31);
                    };
                    if (!boughtItems && settings.autospeed_hat_acc.e && Number(myPlayer.points) >= 6000) {
                      storeBuy(12, 0);
                      boughtItems = true;
                    } else
                    if (!boughtItems2 && settings.autospeed_hat_acc.e && Number(myPlayer.points) >= 2000) {
                      storeBuy(11, 1);
                      boughtItems2 = true;
                    };
                    if (settings.autospeed_hat_acc.e && inGame && boughtItems && boughtItems2) {
                      chat('Speed...')
                      if (boughtItems && !boostHat && monkeyTail) {
                        storeEquip(12, 0);
                        boostHat = true;
                       } else
                       if (boughtItems2 && !monkeyTail) {
                        storeEquip(11, 1);
                        monkeyTail = true;
                       };
                    }
                    } else {
                      if (!settings.autospeed_hat_acc.e && inGame) {
                        if (monkeyTail && boughtItems2 && !boostHat) {
                          storeEquip(prevTailID, 1);
                          monkeyTail = false;
                         } else
                         if (boostHat && boughtItems) {
                          storeEquip(prevHatID, 0);
                          boostHat = false;
                         };
                       };
                    if (prevHatID !== Number(myPlayer.skinIndex) && myPlayer.skinIndex !== 31 && myPlayer.skinIndex !== 12 && myPlayer.skinIndex !== 15) {
                      prevHatID = Number(myPlayer.skinIndex);
                    };
                    if (prevTailID !== Number(myPlayer.tailIndex) && myPlayer.tailIndex !== 11) {
                      prevTailID = Number(myPlayer.tailIndex);
                    };
                    i === 0 ? (
                      storeEquip(prevHatID, i),
                      i = 1
                    ) : (
                      storeEquip(prevTailID, i),
                      i = 0
                    );
                      };

                      x1 = myPlayer.x;
                      y1 = myPlayer.y;
                    };
                  };
                };
              };
            cacheItems();
          };
      });
      resolve(this);
    };
  });

  // Functions
  const sendPacket = function (...datas) {
    const [type, ...data] = datas;
    var binary = msgpack.encode([type, data]);
    ws.then(function (wsInstance) {
      wsInstance.send(new Uint8Array(Array.from(binary)));
    });
  };

  function findPlayerBySID(sid) {
    for (var i = 0; i < Allplayers.length; i++) {
        if (Allplayers[i].sid == sid) {
            return Allplayers[i];
        }
    } return null;
};

function objectAlly(sid) {
  var tmpObj = findPlayerBySID(sid);

  if (myPlayer.sid == sid) {
      return true
  } else if (!tmpObj) {
    return false;
  } else if (tmpObj.team) {
      return tmpObj.team === myPlayer.team ? true : false
  } else {
      return false
  };
};

  function isAlly(sid){

    var tmpObj = findPlayerBySID(sid)
    if (!tmpObj){
        return false
    }
    if (myPlayer.sid == sid){
        return true
    }else if (tmpObj.team){
        return tmpObj.team === myPlayer.team ? true : false
    } else {
        return
    }
};

  const emit = (event, a, b, c, m, r) => ws.then(function (wsInstance){wsInstance.send(Uint8Array.from([...msgpack.encode([event, [a, b, c, m, r]])]))});

  //BUYEQUIP

  const buyEquip = (id) => {
    window.storeBuy(id)
    setTimeout(() => {
      window.storeEquip(id)
    }, 15);
  }

  //TEAM
  const leaveTeam = () => {
    sendPacket("N")
  };

  const kickTeam = (id) => {
    sendPacket("Q", Number(id))
  }

  const createTeam = (name) => {
    sendPacket("L", name.toString().charAt(0).toUpperCase()+name.toString().slice(1));
  }

  const joinTeam = (id) => {
    sendPacket("b", Number(id));
  };

  // PLACE
  const place = (thing, angle) => {
      emit("G", thing, false);
      emit("d", 1, angle);
      emit("d", 0, angle);
      emit("G", myPlayer.weaponIndex, true);
    };

  // SELECT WEAPON
  const selectWeapon = function (index) {
    if (inGame) {
      console.log(weapons[index])
      emit("G", weapons[index], true);
    }
  };

  // HIT
  const hit = function (ang) {
    if (inGame) {
      emit("d", 1, ang);
      emit("d", 0, ang);
    }
  };
  // CHAT
  const chat = function (e) {
    if (inGame) {
      sendPacket("S", 1);
      sendPacket("K", 1);
    }
  };

  const cacheItems = () => {
      for (let c = 0; c < 9; c++) {
        var _document$getElementB;
        if (((_document$getElementB = document.getElementById(`actionBarItem${c}`)) === null || _document$getElementB === void 0 ? void 0 : _document$getElementB.offsetParent) !== null) {
          inventory.primary = c;
        }
      }
      for (let s = 9; s < 16; s++) {
        var _document$getElementB2;
        if (((_document$getElementB2 = document.getElementById(`actionBarItem${s}`)) === null || _document$getElementB2 === void 0 ? void 0 : _document$getElementB2.offsetParent) !== null) {
          inventory.secondary = s;
        }
      }
      for (let P = 16; P < 19; P++) {
        var _document$getElementB3;
        if (((_document$getElementB3 = document.getElementById(`actionBarItem${P}`)) === null || _document$getElementB3 === void 0 ? void 0 : _document$getElementB3.offsetParent) !== null) {
          inventory.food = P - 16;
        }
      }
      for (let f = 19; f < 22; f++) {
        var _document$getElementB4;
        if (((_document$getElementB4 = document.getElementById(`actionBarItem${f}`)) === null || _document$getElementB4 === void 0 ? void 0 : _document$getElementB4.offsetParent) !== null) {
          inventory.wall = f - 16;
        }
      }
      for (let _ = 22; _ < 26; _++) {
        var _document$getElementB5;
        if (((_document$getElementB5 = document.getElementById(`actionBarItem${_}`)) === null || _document$getElementB5 === void 0 ? void 0 : _document$getElementB5.offsetParent) !== null) {
          inventory.spike = _ - 16;
        }
      }
      for (let u = 26; u < 29; u++) {
        var _document$getElementB6;
        if (((_document$getElementB6 = document.getElementById(`actionBarItem${u}`)) === null || _document$getElementB6 === void 0 ? void 0 : _document$getElementB6.offsetParent) !== null) {
          inventory.mill = u - 16;
        }
      }
      for (let I = 29; I < 31; I++) {
        var _document$getElementB7;
        if (((_document$getElementB7 = document.getElementById(`actionBarItem${I}`)) === null || _document$getElementB7 === void 0 ? void 0 : _document$getElementB7.offsetParent) !== null) {
          inventory.mine = I - 16;
        }
      }
      for (let p = 31; p < 33; p++) {
        var _document$getElementB8;
        if (((_document$getElementB8 = document.getElementById(`actionBarItem${p}`)) === null || _document$getElementB8 === void 0 ? void 0 : _document$getElementB8.offsetParent) !== null) {
          inventory.boostPad = p - 16;
        }
      }
      for (let x = 31; x < 33; x++) {
        var _document$getElementB9;
        if (((_document$getElementB9 = document.getElementById(`actionBarItem${x}`)) === null || _document$getElementB9 === void 0 ? void 0 : _document$getElementB9.offsetParent) !== null) {
          inventory.trap = x - 16;
        }
      }
      for (let g = 29; g < 31; g++) {
        var _document$getElementB10;
        if (((_document$getElementB10 = document.getElementById(`actionBarItem${g}`)) === null || _document$getElementB10 === void 0 ? void 0 : _document$getElementB10.offsetParent) !== null && g !== 36) {
          inventory.turret = g - 16;
        }
      }
      inventory.spawnpad = 36;
    };

    window.addEventListener('DOMContentLoaded', () => {

      var connecting = document.getElementById('loadingText');
      var diedMsg = document.getElementById('diedText');
      var gameLogo = document.getElementById('gameName');

      connecting.textContent = 'Switching On KillSwitch';
      diedMsg.textContent = 'You Died, Go MOD!';
      gameLogo.textContent = 'KillSwitch';
      gameLogo.style.color = 'black';

      lastWeaponRangeMultChange = Date.now()
      resetPlayers()
    });

    function resetPlayers() {
      players = [];
      setTimeout(() => {
        resetPlayers()
      }, 1000);
    };

    function drawCircleBar(color, width, scale, endAngle) {
      const { context } = Cow.renderer

      context.strokeStyle = color
      context.lineWidth = width
      context.lineCap = "round"
      context.beginPath()
      context.arc(0, 0, scale, 0, endAngle)
      context.stroke()
      context.closePath()
  };

  function drawCircle(x, y, color, radius, lineWidth) {
    const ctx = document.getElementById('gameCanvas').getContext('2d');
    ctx.beginPath();
    ctx.arc(x, y, radius, 0, 2 * Math.PI);
    ctx.strokeStyle = color;
    ctx.lineWidth = lineWidth
    ctx.stroke();
  };

  function weaponRanges(weaponID) {
    switch (weaponID) {
        case 0:
          return 65;
        break;
        case 1:
          return 70;
        break;
        case 2:
          return 75;
        break;
        case 3:
          return 110;
        break;
        case 4:
          return 118;
        break;
        case 5:
          return 142;
        break;
        case 6:
          return 110;
        break;
        case 7:
          return 65;
        break;
        case 8:
          return 70;
        break;
        case 9:
          return 200;
        break;
        case 10:
          return 75;
        break;
        case 11:
          return 0;
        break;
        case 12:
          return 200;
        break;
        case 13:
          return 200;
        break;
        case 14:
          return 0;
        break;
        case 15:
          return 200;
        break;

      default:
        return 0;
        break;
    };
  };

    Cow.addRender("building-health-bars", () => {
      if (!Cow.player?.alive) return
      
      if (settings.insta_kill.e && inGame) {
        // console.log('kiddos')
        // if (!gear && Number(myPlayer.points) >= 50000) {
        //   console.log('buying', gearcounter)
        //   gearcounter === 1 ? (
        // storeBuy(53), gearcounter++) : gearcounter === 2 ? (
        // storeBuy(20), gearcounter++) : gearcounter === 3 ? (
        // storeBuy(7), gearcounter++) : gearcounter === 4 ? (
        // storeBuy(55), gearcounter++) : ( gear = true, gearcounter = 1);
        // };
        // if (gear) {
        for (let i = 0; i < players.length; i++) {
          buyEquip(53) // turret
          var nearestEnemyAngle = Math.atan2(players[i].y - myPlayer.y, players[i].x - myPlayer.x);
          const weaponRangePrimary = weaponRanges(inventory.primary);
          const weaponRangeSecondary = weaponRanges(inventory.secondary);
          console.log(weaponRangeSecondary, weaponRangePrimary, nearestEnemyAngle)
          if (nearestEnemyAngle > weaponRangePrimary) return
          if (weaponRangeSecondary === 200) {
            console.log('selecting')
            selectWeapon(1); // select secondary
            setTimeout(() => {
            buyEquip(7); // bull helmet
            hit(nearestEnemyAngle); // fire
            setTimeout(() => {
            buyEquip(20); // samurai
            setTimeout(() => {
              if (inventory.primary !== 8) {
                buyEquip(55); // bloddthirster
                selectWeapon(0); // select primary
                setTimeout(() => {
                nearestEnemyAngle = Math.atan2(players[i].y - myPlayer.y, players[i].x - myPlayer.x);
                hit(nearestEnemyAngle); // hit the enemy
                hit(nearestEnemyAngle); // hit the enemy
                setTimeout(() => {
                  selectWeapon(0)
                  storeEquip(0)
                  }, 20);
                }, 20);
              } else {
                chat('Sh1t Stick');
                buyEquip(53); // turret
                setTimeout(() => {
                nearestEnemyAngle = Math.atan2(players[i].y - myPlayer.y, players[i].x - myPlayer.x);
                place(inventory.spike, nearestEnemyAngle - Math.PI / 2);
                place(inventory.spike, nearestEnemyAngle + Math.PI);
                place(inventory.spike, nearestEnemyAngle + Math.PI / 2);
                setTimeout(() => {
                  selectWeapon(0)
                  storeEquip(0)
                    }, 20);
                  }, 20);
                };
              }, 20);
            }, 20);
          }, 20);
          } else {
            if (inventory.primary !== 8) {
              buyEquip(55); // bloddthirster
              selectWeapon(0); // select primary
              hit(nearestEnemyAngle); // hit the enemy
              hit(nearestEnemyAngle); // hit the enemy
            } else {
              chat('Sh1t Stick');
              buyEquip(53); // turret
              place(inventory.spike, nearestEnemyAngle - Math.PI / 2);
              place(inventory.spike, nearestEnemyAngle + Math.PI);
              place(inventory.spike, nearestEnemyAngle + Math.PI / 2);
              };
            };
          // };
        };
      };

      Object.assign(myPlayer, {
        CAMX: Cow.player.renderX,
        CAMY: Cow.player.renderY,
      });

      const { context } = Cow.renderer
      const weaponRange = (Cow.player.weapon.range + Cow.player.scale / 2) * parseFloat(settings.weaponrange.e)

      if ((Date.now() - lastWeaponRangeMultChange) <= 1500) {
          const color = settings.coloredstructures.e?objectAlly(object.owner.sid) ? 'lime':'red':'blue';

          context.save()
          context.fillStyle = color
          context.strokeStyle = color
          context.globalAlpha = .3
          context.lineWidth = 4

          context.translate(Cow.player.renderX, Cow.player.renderY)
          context.beginPath()
          context.arc(0, 0, weaponRange, 0, Math.PI * 2)
          context.fill()
          context.globalAlpha = .7
          context.stroke()
          context.closePath()
          context.restore()
      } else {
          lastWeaponRangeMultChange = null
      };

      if (settings.enabledhacks.e) {
        (function () {
          const ctx = document.getElementById('gameCanvas').getContext('2d');
          let _ = 100;
          let __ = 60;
          for (let hack in settings) {
            if (settings[hack].e && settings[hack].d) {
              if (settings[hack].n === 'Triple AutoMill') __ = 75;
              if (settings[hack].n === 'AutoBoost + Spikes') __ = 100;
              if (settings[hack].n === 'AutoSpeed + Hat + Acc') __ = 125;
              ctx.save();
              ctx.beginPath();
              ctx.lineWidth = 7;
              ctx.fillStyle = 'red';
              ctx.strokeStyle = 'black';
              ctx.font = '22px Hammersmith, sans-serif';
              ctx.strokeText(
                settings[hack].n,
                __,
                _
              );
              ctx.fillText(
                settings[hack].n,
                __,
                _
              );
              ctx.restore();
              _ += 30;
            };
          };
        })();
      };

      if (settings.showsid.e && inGame) {
        (function () {
          const ctx = document.getElementById('gameCanvas').getContext('2d');

          ctx.save();
          ctx.beginPath();
          ctx.lineWidth = 7;
          ctx.fillStyle = 'lime';
          ctx.strokeStyle = 'black';
          ctx.font = '22px Hammersmith, sans-serif';
          ctx.strokeText(myPlayer.sid, Cow.player.renderX, Cow.player.renderY);
          ctx.fillText(myPlayer.sid, Cow.player.renderX, Cow.player.renderY);
          ctx.restore();

          for (let t = 0; t < players.length; t++) {

            const offsetX = window.config.maxScreenWidth/2-Cow.player.renderX;
            const offsetY = window.config.maxScreenHeight/2-Cow.player.renderY;

            const endX = Math.round(window.config.maxScreenWidth/2 - myPlayer.x + players[t].x - offsetX*2);
            const endY = Math.round(window.config.maxScreenHeight/2 - myPlayer.y + players[t].y - offsetY*2);

            ctx.save();
            ctx.beginPath();
            ctx.lineWidth = 7;
            ctx.fillStyle = isAlly(players[t].sid) ? 'lime' : 'red';
            ctx.strokeStyle = 'black';
            ctx.font = '22px Hammersmith, sans-serif';
            ctx.strokeText(players[t].sid, endX, endY);
            ctx.fillText(players[t].sid, endX, endY);
            ctx.restore();

          }
        })();
      };

      if (settings.tracers.e && inGame) {
        (function () {
          const ctx = document.getElementById('gameCanvas').getContext('2d');

          for (let t = 0; t < players.length; t++) {
            ctx.save();
            ctx.beginPath();
            ctx.lineWidth = 3;
            ctx.moveTo(Cow.player.renderX, Cow.player.renderY);

            const offsetX = window.config.maxScreenWidth/2-Cow.player.renderX
            const offsetY = window.config.maxScreenHeight/2-Cow.player.renderY

            const endX = Math.round(window.config.maxScreenWidth/2 - myPlayer.x + players[t].x - offsetX*2);
            const endY = Math.round(window.config.maxScreenHeight/2 - myPlayer.y + players[t].y - offsetY*2);

            ctx.lineWidth = 5
            ctx.lineTo(endX, endY);
            ctx.strokeStyle = isAlly(players[t].sid) ? 'lime' : 'red';
            ctx.stroke();

            drawCircle(endX, endY, isAlly(players[t].sid) ? 'lime' : 'red', 45, 5);

            ctx.restore();
          }
        })();
      };

      if (settings.ping.e) {
        const ping = document.getElementById('pingDisplay');
        ping.style.display = 'block';
        ping.style.fontSize = '22px';
      } else {
        const ping = document.getElementById('pingDisplay');
        ping.style.display = 'none';
      };

      if (settings.hp.e && inGame) {
          const ctx = document.getElementById('gameCanvas').getContext('2d');
          ctx.save();
          ctx.beginPath();
          ctx.lineWidth = 7;
          ctx.fillStyle = 'lime';
          ctx.strokeStyle = 'black';
          ctx.font = '22px Hammersmith, sans-serif';
          ctx.strokeText(Math.round(tmpHealth*2)+'hp',Cow.player.renderX,Cow.player.renderY+100);
          ctx.fillText(Math.round(tmpHealth*2)+'hp',Cow.player.renderX,Cow.player.renderY+100);
          ctx.restore();
      };

      if (settings.percents.e && inGame) {
        const ctx = document.getElementById('gameCanvas').getContext('2d');
        ctx.save();
        ctx.beginPath();
        ctx.lineWidth = 7;
        ctx.fillStyle = 'lime';
        ctx.strokeStyle = 'black';
        ctx.font = '22px Hammersmith, sans-serif';
        ctx.strokeText(Math.round(tmpHealth)+'%',Cow.player.renderX,Cow.player.renderY+125);
        ctx.fillText(Math.round(tmpHealth)+'%',Cow.player.renderX,Cow.player.renderY+125);
        ctx.restore();
    };

      Cow.objectsManager.eachVisible((object) => {
          if (!object.isItem) return

          const distance = CowUtils.getDistance(Cow.player, object) - object.scale
          const angle = CowUtils.getDirection(object, Cow.player)

          if (object.name === 'pit trap') {
            if (distance < 50 && object.owner.sid !== myPlayer.sid && !(objectAlly(object.owner.sid))) {
              if (settings.autobreak.e && inGame) {
                setTimeout(function () {
                    chat('AutoBreaking...')
                    var index = 0;
                    let angle = Math.atan2(object.y - myPlayer.y, object.x - myPlayer.x);
                    if (inventory.primary === 8 && inventory.secondary !== 10) {
                      chat("KillSwitch MOD can't help you.");
                    };
                    index = inventory.secondary === 10 ? 1 : 0;
                    selectWeapon(index);
                    hit(angle);
                    selectWeapon(0);
                }, PLAYER_SPEED);
              };
            };
          };

          if (settings.antibow.e && inGame) {
            for (let t = 0; t < players.length; t++) {
            let nearestEnemyAngle = Math.atan2(players[t].y - myPlayer.y, players[t].x - myPlayer.x);
            let nearestEnemyAngleOpp = Math.atan2(myPlayer.y - players[t].y, myPlayer.x - players[t].x);
            // console.log(nearestEnemyAngleOpp, players[t].dir, nearestEnemyAngleOpp===players[t].dir?true:false)
            if (nearestEnemyAngle &&
              (players[t].weaponIndex === 9 || players[t].weaponIndex === 12 || players[t].weaponIndex === 13 || players[t].weaponIndex === 15)
               && EnemyAngle1 !== nearestEnemyAngle && nearestEnemyAngleOpp >= players[t].dir - .25 && nearestEnemyAngleOpp <= players[t].dir + .25) {
                chat('AntiBow...')
                place(inventory.mill, nearestEnemyAngle);
                selectWeapon(0);
                EnemyAngle1 = nearestEnemyAngle;
              };
            };
          };

          if (settings.inweaponrange.e && distance > weaponRange) return
          if (settings.whereurlooking.e && CowUtils.getAngleDist(angle, Cow.player.lookAngle) > Cow.config.gatherAngle) return

          if (settings.hitcounter.e) {
              const damage = Cow.player.weapon.dmg * Cow.items.variants[Cow.player.weaponVariant].val
              const damageAmount = damage * (Cow.player.weapon.sDmg || 1) * (Cow.player.skin?.id === 40 ? 3.3 : 1)
              const hits = Math.ceil(object.health / damageAmount)
              const offsetY = settings.circles_hp.e ? 2 : 22

              context.save()
              context.font = `18px Hammersmith, sans-serif`
              context.fillStyle = "#fff"
              context.textBaseline = "middle"
              context.textAlign = "center"
              context.lineWidth = 8
              context.lineJoin = "round"

              context.translate(object.renderX, object.renderY)
              context.strokeText(hits, 0, offsetY)
              context.fillText(hits, 0, offsetY)
              context.restore()
          };

          if (settings.circles_hp.e) {
              const endAngle = ((object.health / object.maxHealth) * 360) * (Math.PI / 180)
              const width = 14
              const scale = 22

              context.save()
              context.translate(object.renderX, object.renderY)
              context.rotate(object.dir ?? object.dir2)
              drawCircleBar("#3d3f42", width, scale, endAngle)
              drawCircleBar(settings.coloredstructures.e?objectAlly(object.owner.sid) ? 'lime':'red':'blue', width / 2.5, scale, endAngle)
              context.restore()

              return
          };

          if (settings.healthbars.e || settings.circles_hp.e) {

          const { healthBarWidth, healthBarPad } = window.config
          const width = healthBarWidth / 2 - healthBarPad / 2
          const height = 17
          const radius = 8

          context.save()
          context.translate(object.renderX, object.renderY)

          context.fillStyle = "#3d3f42"
          context.roundRect(-width - healthBarPad, -height / 2, 2 * width + 2 * healthBarPad, height, radius)
          context.fill()

          context.fillStyle = settings.coloredstructures.e?objectAlly(object.owner.sid) ? 'lime':'red':'blue'
          context.roundRect(-width, -height / 2 + healthBarPad, 2 * width * (object.health / object.maxHealth), height - 2 * healthBarPad, radius - 1)
          context.fill()
          context.restore()
          };
      });
  });
})();