DF Ammo Boxer

Calculate ammo box price for you

您需要先安裝使用者腳本管理器擴展,如 TampermonkeyGreasemonkeyViolentmonkey 之後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyViolentmonkey 後才能安裝該腳本。

您需要先安裝使用者腳本管理器擴充功能,如 TampermonkeyUserscripts 後才能安裝該腳本。

你需要先安裝一款使用者腳本管理器擴展,比如 Tampermonkey,才能安裝此腳本

您需要先安裝使用者腳本管理器擴充功能後才能安裝該腳本。

(我已經安裝了使用者腳本管理器,讓我安裝!)

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展,比如 Stylus,才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

你需要先安裝一款使用者樣式管理器擴展後才能安裝此樣式

(我已經安裝了使用者樣式管理器,讓我安裝!)

// ==UserScript==
// @name         DF Ammo Boxer
// @namespace    http://tampermonkey.net/
// @version      1.2
// @description  Calculate ammo box price for you
// @author       IYNH
// @match        https://fairview.deadfrontier.com/onlinezombiemmo/index.php?page=35
// @require      https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js
// @require      https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/jquery-ui.min.js
// @resource     IMPORTED_CSS https://ajax.googleapis.com/ajax/libs/jqueryui/1.12.1/themes/smoothness/jquery-ui.css
// @grant        GM_getResourceText
// @grant        GM_addStyle
// @grant        GM_setValue
// @grant        GM_getValue
// ==/UserScript==

(function() {

    var finalValue = 9999;
    var cbPerBoxValue = GM_getValue('cbPerBoxValue');
    if(typeof cbPerBoxValue !== "boolean") {
        cbPerBoxValue = false;
    }

    var pricePerBox = GM_getValue('pricePerBox');
    if(!pricePerBox) {
        pricePerBox = {};
    }
    var pricePerBullet = GM_getValue('pricePerBullet');
    if(!pricePerBullet) {
        pricePerBullet = {};
    }

    'use strict';

    // CSS stuff
    const my_css = GM_getResourceText("IMPORTED_CSS");
    GM_addStyle(my_css);
    GM_addStyle(`.ammo-boxer-input {
                 width: 63px;
                 color: #ffff00
               }`);
    GM_addStyle(`.ammo-boxer-label, .ammo-boxer-label-2 {
                 color: black
                }`);

    // Main UI
    $("body").append ( `
    <div id="ammoBoxerDraggable" style="position: absolute; top: 300px; right: 0px; width: 220px;">
      <input type="checkbox" id="cbPerBox" value="cbPerBox">
      <label for="cbPerBox">Use Cost per Standard Box</label><br/>
      <input type="checkbox" id="cbAutoFill" value="cbAutoFill" checked>
      <label for="cbAutoFill">Auto Fill Price</label>
      <div id="ammoBoxerTabs">
         <ul>
           <li><a href="#tabs-1Handgun">Handgun</a></li>
           <li><a href="#tabs-2Rifle">Rifle</a></li>
           <li><a href="#tabs-3Shotgun">Shotgun</a></li>
           <li><a href="#tabs-4Explosive">Explosive</a></li>
           <li><a href="#tabs-5Gas">Fuel</a></li>
         </ul>
         <div id="tabs-1Handgun" style="padding: 1px">
           <table>
             <tr>
               <td class="ammo-boxer-label" style="width: 50px;">.32</td>
               <td><input id="input32ammo" class="ammo-boxer-input" type="number" min="0" max="999999999" />
               <td class="ammo-boxer-label-2">per bullet</td>
             </tr>
             <tr>
               <td class="ammo-boxer-label">9mm</td>
               <td><input id="input35ammo" class="ammo-boxer-input" type="number" min="0" max="999999999" />
               <td class="ammo-boxer-label-2">per bullet</td>
             </tr>
             <tr>
               <td class="ammo-boxer-label">.357</td>
               <td><input id="input357ammo" class="ammo-boxer-input" type="number" min="0" max="999999999" />
               <td class="ammo-boxer-label-2">per bullet</td>
             </tr>
             <tr>
               <td class="ammo-boxer-label">.38</td>
               <td><input id="input38ammo" class="ammo-boxer-input" type="number" min="0" max="999999999" />
               <td class="ammo-boxer-label-2">per bullet</td>
             </tr>
             <tr>
               <td class="ammo-boxer-label">.40</td>
               <td><input id="input40ammo" class="ammo-boxer-input" type="number" min="0" max="999999999" />
               <td class="ammo-boxer-label-2">per bullet</td>
             </tr>
             <tr>
               <td class="ammo-boxer-label">.45</td>
               <td><input id="input45ammo" class="ammo-boxer-input" type="number" min="0" max="999999999" />
               <td class="ammo-boxer-label-2">per bullet</td>
             </tr>
             <tr>
               <td class="ammo-boxer-label">.50</td>
               <td><input id="input50ammo" class="ammo-boxer-input" type="number" min="0" max="999999999" />
               <td class="ammo-boxer-label-2">per bullet</td>
             </tr>
             <tr>
               <td class="ammo-boxer-label">.55</td>
               <td><input id="input55ammo" class="ammo-boxer-input" type="number" min="0" max="999999999" />
               <td class="ammo-boxer-label-2">per bullet</td>
             </tr>
           </table>
         </div>
         <div id="tabs-2Rifle" style="padding: 1px">
           <table>
             <tr>
               <td class="ammo-boxer-label" style="width: 50px;">5.5mm</td>
               <td><input id="input55rifleammo" class="ammo-boxer-input" type="number" min="0" max="999999999" />
               <td class="ammo-boxer-label-2">per bullet</td>
             </tr>
             <tr>
               <td class="ammo-boxer-label">7.5mm</td>
               <td><input id="input75rifleammo" class="ammo-boxer-input" type="number" min="0" max="999999999" />
               <td class="ammo-boxer-label-2">per bullet</td>
             </tr>
             <tr>
               <td class="ammo-boxer-label">9mm</td>
               <td><input id="input9rifleammo" class="ammo-boxer-input" type="number" min="0" max="999999999" />
               <td class="ammo-boxer-label-2">per bullet</td>
             </tr>
             <tr>
               <td class="ammo-boxer-label">12.7mm</td>
               <td><input id="input127rifleammo" class="ammo-boxer-input" type="number" min="0" max="999999999" />
               <td class="ammo-boxer-label-2">per bullet</td>
             </tr>
             <tr>
               <td class="ammo-boxer-label">14mm</td>
               <td><input id="input14rifleammo" class="ammo-boxer-input" type="number" min="0" max="999999999" />
               <td class="ammo-boxer-label-2">per bullet</td>
             </tr>
           </table>
         </div>
         <div id="tabs-3Shotgun" style="padding: 1px">
           <table>
             <tr>
               <td class="ammo-boxer-label" style="width: 50px;">20 G</td>
               <td><input id="input20gaugeammo" class="ammo-boxer-input" type="number" min="0" max="999999999" />
               <td class="ammo-boxer-label-2">per bullet</td>
             </tr>
             <tr>
               <td class="ammo-boxer-label">16 G</td>
               <td><input id="input16gaugeammo" class="ammo-boxer-input" type="number" min="0" max="999999999" />
               <td class="ammo-boxer-label-2">per bullet</td>
             </tr>
             <tr>
               <td class="ammo-boxer-label">12 G</td>
               <td><input id="input12gaugeammo" class="ammo-boxer-input" type="number" min="0" max="999999999" />
               <td class="ammo-boxer-label-2">per bullet</td>
             </tr>
             <tr>
               <td class="ammo-boxer-label">10 G</td>
               <td><input id="input10gaugeammo" class="ammo-boxer-input" type="number" min="0" max="999999999" />
               <td class="ammo-boxer-label-2">per bullet</td>
             </tr>
           </table>
         </div>
         <div id="tabs-4Explosive" style="padding: 1px">
           <table>
             <tr>
               <td class="ammo-boxer-label" style="width: 50px;">Light</td>
               <td><input id="inputgrenadeammo" class="ammo-boxer-input" type="number" min="0" max="999999999" />
               <td class="ammo-boxer-label-2">per bullet</td>
             </tr>
             <tr>
               <td class="ammo-boxer-label">Heavy</td>
               <td><input id="inputheavygrenadeammo" class="ammo-boxer-input" type="number" min="0" max="999999999" />
               <td class="ammo-boxer-label-2">per bullet</td>
             </tr>
           </table>
         </div>
         <div id="tabs-5Gas" style="padding: 1px">
           <table>
             <tr>
               <td class="ammo-boxer-label" style="width: 50px;">Gasoline</td>
               <td><input id="inputfuelammo" class="ammo-boxer-input" type="number" min="0" max="999999999" />
               <td class="ammo-boxer-label-2">per bullet</td>
             </tr>
           </table>
         </div>
      </div>
    </div>
    <script type="javascript">

    </script>`);

    $("#ammoBoxerDraggable").draggable();
    $("#ammoBoxerTabs").tabs();
    $("#cbPerBox").attr("checked", cbPerBoxValue);
    loadAmmo(cbPerBoxValue);

    // Load ammo type
    function loadAmmo(perBox) {
        let priceSource;
        if(perBox) {
            //load value per box
            priceSource = pricePerBox;
            $("#tabs-1Handgun td.ammo-boxer-label-2").html("per 1600");
            $("#tabs-2Rifle td.ammo-boxer-label-2").html("per 1200");
            $("#tabs-3Shotgun td.ammo-boxer-label-2").html("per 800");
            $("#tabs-4Explosive td.ammo-boxer-label-2").html("per 400");
            $("#tabs-5Gas td.ammo-boxer-label-2").html("per 4546");
        } else {
            //load value per bullet
            priceSource = pricePerBullet;
            $("td.ammo-boxer-label-2").html("per bullet");
        }
        $("input.ammo-boxer-input").each(function() {
            var inputValue = priceSource[$(this).attr("id")];
            inputValue = inputValue ? inputValue : "";
            $(this).val(inputValue);
        });
    }

    // Change input type with cbPerBox
    $("#cbPerBox").change(function() {
        cbPerBoxValue = $("#cbPerBox").prop("checked");
        GM_setValue("cbPerBoxValue", cbPerBoxValue);
        loadAmmo(cbPerBoxValue);
    });

    // Save ammo value
    $("input.ammo-boxer-input").keyup(function(e) {
        var inputId = e.target.id;
        var inputValue = e.target.value;
        if(inputValue && !isNaN(inputValue)) {
            if(cbPerBoxValue) {
                //Save value per box
                pricePerBox[inputId] = inputValue;
                GM_setValue("pricePerBox", pricePerBox);
            } else {
                //Save value per bullet
                pricePerBullet[inputId] = inputValue;
                GM_setValue("pricePerBullet", pricePerBullet);
            }
        }
    });

    // Display recommended price on infobox display
    var infoBox2 = $("#infoBox");
    function calculateRecommendedPrice(itemSource) {
        var boxType = itemSource.getAttribute("data-type");
        var boxQuantity = itemSource.getAttribute("data-quantity");
        if(cbPerBoxValue) {
            //Save value per box
            let maxQuantity;
            switch (boxType) {
                case "32ammo":
                case "35ammo":
                case "357ammo":
                case "38ammo":
                case "40ammo":
                case "45ammo":
                case "50ammo":
                case "55ammo":
                    maxQuantity = 1600;
                    break;
                case "55rifleammo":
                case "75rifleammo":
                case "9rifleammo":
                case "127rifleammo":
                case "14rifleammo":
                    maxQuantity = 1200;
                    break;
                case "20gaugeammo":
                case "16gaugeammo":
                case "12gaugeammo":
                case "10gaugeammo":
                    maxQuantity = 800;
                    break;
                case "grenadeammo":
                case "heavygrenadeammo":
                    maxQuantity = 400;
                    break;
                case "fuelammo":
                    maxQuantity = 4546;
                    break;
                default:
                    maxQuantity = 1000;
                    break;
            }
            var boxValue = pricePerBox["input".concat(boxType)];
            boxValue = boxValue ? boxValue : 0;
            return Math.round(boxValue / maxQuantity * boxQuantity);
        } else {
            //Save value per bullet
            var bulletValue = pricePerBullet["input".concat(boxType)];
            return Math.round(bulletValue * boxQuantity);
        }
    }

    function displayRecommendedPrice() {
        if(infoBox2.css('visibility') === 'visible' && $("#infoBox div.ammoBoxerTooltip").length == 0 && curInfoItem && curInfoItem.getAttribute("data-itemtype") === "ammo") {
            finalValue = calculateRecommendedPrice(curInfoItem);
            infoBox2.append(`<div class="itemData ammoBoxerTooltip" style="color: yellow;">Calculated Price: $` + finalValue + `</div>`);
        }
    }

    $("#inventoryholder").on("mousemove", function(){
        displayRecommendedPrice();
    });

    // Auto insert price
    var promptObserver = new MutationObserver(function(mutationList) {
       mutationList.forEach(function(mutation) {
           if( $("#cbAutoFill").prop("checked") && mutation.oldValue == "display: none;" && document.querySelector('input.moneyField') != null && curInfoItem && curInfoItem.getAttribute("data-itemtype") === "ammo") {
               $("input.moneyField").val(finalValue);
               $("input.moneyField").trigger("input");
           }
       });
    });

    var target = document.querySelector('#prompt');
    promptObserver.observe(target, {
        attributeFilter: ["style"],
        attributeOldValue: true
    });
})();