Page 1 of 1

Monster Contract

Posted: Mon May 06, 2024 12:18 am
by dragon slayer
To add this script just go into your jse_fileassociations.scp and add this line
50103=custom/monstercontract.js

right after 15007=server/house/houseAddonUse.js

then go in-game ad do 'add item giantcontract or undeadcontract.

have fun

function onUseChecked(pUser, iUsed)
{
    var socket = pUser.socket;
    socket.tempObj = iUsed;
    if (pUser.visible == 1 || pUser.visible == 2)
    {
        pUser.visible = 0;
    }
    if (socket && iUsed && iUsed.isItem)
    {
        //Check to see if it's locked down
        if (iUsed.movable == 2 || iUsed.movable == 3)
        {
            socket.SysMessage(GetDictionaryEntry(774, socket.language)); // That is locked down and you cannot use it
            return false;
        }

        var itemOwner = GetPackOwner(iUsed, 0);
        if (itemOwner == null || itemOwner.serial != pUser.serial)
        {
            pUser.SysMessage("The Monster Contract needs to be in your pack");
            return false;
        }
        else
        {
            MonsterContractGump(pUser, iUsed);
        }
    }
}

function InitIDs()
{
    var ids = {
        giants: [0x0002, 0x0012, 0x0001, 0x0054, 0x0087, 0x0036, 0x0035, 0x0037, 0x004b, 0x004c],
        undead: [0x0003, 0x004f, 0x0018, 0x001a, 0x0032, 0x0038, 0x0093, 0x0094, 0x009a, 0x009b, 0x0099]
    };
    return ids;
}

function onCreateDFN(objMade, objType)
{
    if (objType == 0)
    {
        var npcids = InitIDs();
        var giants = npcids.giants;
        var undead = npcids.undead;
        //var giants = [0x0002, 0x0012, 0x0001, 0x0054, 0x0087, 0x0036, 0x0035, 0x0037, 0x004b, 0x004c];
        //var undead = [0x0003, 0x004f, 0x0018, 0x001a, 0x0032, 0x0038, 0x0093, 0x0094, 0x009a, 0x009b, 0x0099];
        var ids = null;

        if (objMade.GetTag("type") == 500)
        {
            var typeid = [1, 2, 1, 2];
            var randomType = Math.floor(Math.random() * typeid.length);
            var rType = typeid[randomType];

            objMade.SetTag("type", parseInt(rType));

            switch (objMade.GetTag("type"))
            {
                case 1: ids = giants; break;
                case 2: ids = undead; break;
            }
            // Generate a random index to select a random ID from the array
            var randomIndex = Math.floor(Math.random() * ids.length);
            var randomId = ids[randomIndex].toString(16);

            // Set the random ID and amount as tags on objMade
            objMade.SetTag("npcid", randomId);
        }
        else
        {
            switch (objMade.GetTag("type"))
            {
                case 1: ids = giants; break;
                case 2: ids = undead; break;
            }
            // Generate a random index to select a random ID from the array
            var randomIndex = Math.floor(Math.random() * ids.length);
            var randomId = ids[randomIndex].toString(16);

            // Set the random ID and amount as tags on objMade
            objMade.SetTag("npcid", randomId);
        }

        // Generate a random amount value between 10 and 50
        var randomAmount = Math.floor(Math.random() * (50 - 10 + 1)) + 10;

        // Define gold ranges based on the number of NPCs to kill
        // Adjust these ranges as desired
        var goldRanges = [
            { minNPCs: 10, maxNPCs: 20, baseGold: 250 },
            { minNPCs: 21, maxNPCs: 30, baseGold: 500 },
            { minNPCs: 31, maxNPCs: 50, baseGold: 1000 }
        ];

        // Find the appropriate gold reward based on the number of NPCs to kill
        var goldToGive = 0;
        for (var i = 0; i < goldRanges.length; i++)
        {
            if (randomAmount >= goldRanges[i].minNPCs && randomAmount <= goldRanges[i].maxNPCs)
            {
                // Calculate the multiplier based on the random amount
                var multiplier = (randomAmount - goldRanges[i].minNPCs + 1) / (goldRanges[i].maxNPCs - goldRanges[i].minNPCs + 1);
                // Apply the multiplier to the base gold
                goldToGive = Math.ceil(goldRanges[i].baseGold * multiplier);
                break;
            }
        }

        objMade.SetTag("amounttokill", randomAmount);
        objMade.SetTag("Gold", goldToGive);
        objMade.SetTag("init", true);
    }
}

function Init(iUsed)
{
    var npcids = InitIDs();
    var giants = npcids.giants;
    var undead = npcids.undead;
    //var giants = [0x0002, 0x0012, 0x0001, 0x0054, 0x0087, 0x0036, 0x0035, 0x0037, 0x004b, 0x004c];
    //var undead = [0x0003, 0x004f, 0x0018, 0x001a, 0x0032, 0x0038, 0x0093, 0x0094, 0x009a, 0x009b, 0x0099];

    //var ids = null;
    switch (iUsed.GetTag("type"))
    {
        case 1: //ids = giants; break;
            var randomIndex = Math.floor(Math.random() * giants.length);
            var randomId = giants[randomIndex].toString(16);break

        case 2: //ids = undead; break;
            var randomIndex = Math.floor(Math.random() * undead.length);
            var randomId = undead[randomIndex].toString(16); break
    }
    // Generate a random index to select a random ID from the array
    //var randomIndex = Math.floor(Math.random() * ids.length);
    //var randomId = ids[randomIndex].toString(16);

    // Set the random ID and amount as tags on objMade
    iUsed.SetTag("npcid", randomId);

    // Generate a random amount value between 10 and 50
    var randomAmount = Math.floor(Math.random() * (50 - 10 + 1)) + 10;

    // Define gold ranges based on the number of NPCs to kill
    // Adjust these ranges as desired
    var goldRanges = [
        { minNPCs: 10, maxNPCs: 20, baseGold: 250 },
        { minNPCs: 21, maxNPCs: 30, baseGold: 500 },
        { minNPCs: 31, maxNPCs: 50, baseGold: 1000 }
    ];

    // Find the appropriate gold reward based on the number of NPCs to kill
    var goldToGive = 0;
    for (var i = 0; i < goldRanges.length; i++) {
        if (randomAmount >= goldRanges[i].minNPCs && randomAmount <= goldRanges[i].maxNPCs) {
            // Calculate the multiplier based on the random amount
            var multiplier = (randomAmount - goldRanges[i].minNPCs + 1) / (goldRanges[i].maxNPCs - goldRanges[i].minNPCs + 1);
            // Apply the multiplier to the base gold
            goldToGive = Math.ceil(goldRanges[i].baseGold * multiplier);
            break;
        }
    }

    objMade.SetTag("amounttokill", randomAmount);
    objMade.SetTag("Gold", goldToGive)
    iUsed.SetTag("init", true);
}

function MonsterContractGump(pUser, iUsed)
{
    if (!iUsed.GetTag("init"))
    {
        Init(iUsed);
    }
    else
    {
        var socket = pUser.socket;
        var myContract = new Gump;
        var NPCID = iUsed.GetTag("npcid");
        var parsedNPCID = parseInt(NPCID, 16); // Parse NPCID as a hexadecimal value
        var Amount = iUsed.GetTag("amounttokill");
        var Amountkilled = iUsed.GetTag("amounttokilled");
        var goldamount = iUsed.GetTag("Gold");

        var name = ""
        switch (parsedNPCID)
        {
            case 0x0002:
            case 0x0012: name = "Ettin"; iUsed.SetTag("ettin", 1); break;
            case 0x0001: name = "Ogre"; iUsed.SetTag("ogre", 1); break;
            case 0x0054: name = "Ogre lord"; iUsed.SetTag("ogrelord", 1); break;
            case 0x0087: name = "Arctic Ogre Lord"; iUsed.SetTag("arcticogrelord", 1); break;
            case 0x0036:
            case 0x0035: name = "Troll"; iUsed.SetTag("troll", 1); break;
            case 0x0037: name = "Frost Troll"; iUsed.SetTag("frosttroll", 1); break;
            case 0x004b: name = "Cyclopean Warrior"; iUsed.SetTag("cyclops", 1); break;
            case 0x004c: name = "Titan"; iUsed.SetTag("titan", 1); break;
            case 0x0003: name = "Zombie"; iUsed.SetTag("zombie", 1); break;
            case 0x004f: name = "Ancient lich"; iUsed.SetTag("ancientlich", 1); break;
            case 0x004f: name = "Lich Lord"; iUsed.SetTag("lichlord", 1); break;
            case 0x0018: name = "Lich"; iUsed.SetTag("lich", 1); break;
            case 0x001a: name = "Spectre"; iUsed.SetTag("spectre", 1); break;
            case 0x001a: name = "Wraith"; iUsed.SetTag("wraith", 1); break;
            case 0x001a: name = "Shade"; iUsed.SetTag("shade", 1); break;
            case 0x0032: name = "Skeleton"; iUsed.SetTag("skeleton", 1); break;
            case 0x0038: name = "Bone Axeman"; iUsed.SetTag("boneaxeman", 1); break;
            case 0x0093: name = "Bone Knight"; iUsed.SetTag("boneknight", 1); break;
            case 0x0093: name = "Skeletal Knight"; iUsed.SetTag("skeletalknight", 1); break;
            case 0x0094: name = "Bone Magi"; iUsed.SetTag("bonemage", 1); break;
            case 0x0094: name = "Skeletal Mage"; iUsed.SetTag("skeletalmage", 1); break;
            case 0x009a: name = "Mummy"; iUsed.SetTag("mummy", 1); break;
            case 0x009b: name = "Rotting Corpse"; iUsed.SetTag("rottingcorpse", 1); break;
            case 0x0099: name = "Ghoul"; iUsed.SetTag("ghoul", 1); break;
            default: name = "ettin"; iUsed.SetTag("ettin", 1); break;
        }
        myContract.AddBackground(0, 0, 300, 170, 5170);
        myContract.AddText(40, 40, 1153, "Contract For: " + name.toString());
        myContract.AddText(40, 60, 1153, "Amount Needed: " + Amount);
        myContract.AddText(40, 80, 1153, "Quantity Killed: " + Amountkilled);
        myContract.AddText(40, 100, 1153, "Reward: " + goldamount);
        if (Amountkilled != Amount)
        {
            myContract.AddButton(90, 120, 2061, 2062, 1, 0, 1);
            myContract.AddText(104, 118, 0, "Corpse");
        }
        else
        {
            myContract.AddButton(90, 120, 2061, 2062, 1, 0, 2);
            myContract.AddText(104, 118, 0, "Reward");
        }
        myContract.Send(pUser);
        myContract.Free();
    }
}

function onGumpPress(pSock, pButton, gumpData)
{
    var pUser = pSock.currentChar;
    var iUsed = pSock.tempObj;
    var goldamount = iUsed.GetTag("Gold");

    switch (pButton)
    {
        case 1:
            pUser.CustomTarget(0);
            pUser.SysMessage("Target the Corpse of Monster you killed to collect bounty");
            break;
        case 2:
            CreateDFNItem(pSock, pUser, "0x0eed", goldamount, "ITEM", true);
        iUsed.Delete();
        break;
    }
}

function onCallback0(socket, myTarget)
{
    var iUsed = socket.tempObj;
    var pUser = socket.currentChar;
    var Amountkilled = iUsed.GetTag("amounttokilled");

    if (socket.GetWord(1) || !ValidateObject(myTarget))
    {
        // No valid dynamic item was targeted
        socket.SysMessage(GetDictionaryEntry(749, socket.language)); // That is not a corpse!
        return;
    }
    else
    {  
        var amount = 0;
        var sectionID = myTarget.sectionID.toLowerCase(); // Convert to lowercase for case-insensitive matching

        switch (sectionID)
        {
            case "ettin":
            case "ogre":
            case "ogrelord":
            case "arcticogrelord":
            case "troll":
            case "frosttroll":
            case "cyclops":
            case "titan":
            case "zombie":
            case "lich":
            case "ancientlich":
            case "lichlord":
            case "spectre":
            case "wraith":
            case "shade":
            case "skeleton":
            case "boneaxeman":
            case "boneknight":
            case "skeletalknight":
            case "bonemage":
            case "skeletalmage":
            case "mummy":
            case "rottingcorpse":
            case "ghoul":
                if (iUsed.GetTag(sectionID) == 1 && myTarget.GetTag("bounty") == 0)
                {
                    amount = 1;
                    myTarget.SetTag("bounty", 1);
                    socket.SysMessage("You claimed the bounty on this corpse.");
                    break;
                }
                else
                {
                    socket.SysMessage("This corpses has already been claimed.");
                }
                break;
        }

        iUsed.SetTag("amounttokilled", Amountkilled + amount);
        MonsterContractGump(pUser, iUsed);

    }
}

function onTooltip(contract, pSocket)
{
    var tooltipText = "";
    switch (contract.GetTag("type"))
    {
        case 1: tooltipText = ("Bounty for Giants"); break;
        case 2: tooltipText = ("Bounty for Undead"); break;
        default: tooltipText = ("none"); break;
    }
    return tooltipText;
}
[monstercontract]
{
NAME=Monster Contract
ID=0x14F0
VALUE=1500 700
RESTOCK=5
GOOD=9
SCRIPT=50103
custominttag=type 500
}

[giantcontract]
{
get=monstercontract
custominttag=type 1
}

[undeadcontract]
{
get=monstercontract
custominttag=type 2
}