In‐Game Code Script Examples - lordachoo/adventureland GitHub Wiki

Welcome to the adventureland wiki!

Just using this as my personal script/snippet/space

Script Sets By Class

Merchant

Merchant Example Script

Warrior

Nothin Yet

Paladin

Nothin Yet

Rogue

Nothin Yet

Mage

Mage Example Script

Priest

Priest Example Script

Ranger

Ranger Example Script

Snippets

  • This is examples of how to do certain things

Moving , automating moving character

// Get the map name you're in / want to move to
show_json(character.map)
// Show all map info
show_json(G.maps)
smart_move("woffice") to move to Wizards Crib since that is what show_json(character.map) returns 

# More advanced, coords within map
smart_move({ x: XXX , y: YYY, map: 'main'})

Send Mail

send_mail("charName","SUBJECT HERE","Yo! This is a message",true)
// true sends ITEM IN ID0 (FIRST SLOT)!
// FALSE SENDS NO ITEM

Sending Messages / Triggering Other Characters

setInterval(function bring_me_potions(){
    for(type_id in potion_types)
    {
       let type = potion_types[type_id];
       let num_potions = num_items(type);
      if(num_potions < min_potions)
       {
            send_cm('CharName',{
                message: 'bringpotions',
                x: character.x,
                y: character.y,
                map: character.map
            });
        }
    }
},1000);

function on_cm(name, data) {
    if(name == "Character1" || name == "Character2" || name == "Character3" && data.message === "whateverYouSetHere") {
            //whatever you want to happen on reading the above message
    }
}

Combat

Assist a player (target a target players target)

target = get_player("LordAjew");
assistTarget = get_nearest_monster({id: target.target});
change_target(assistTarget);

Check Mob Target

let target=get_targeted_monster();
    if(!target){
        target=get_nearest_monster({type: 'bat'});
        target
    }
    if (target.target !== 'CharName')
        use_skill('taunt', target)

Push Items (by id) / Gold

for (let i = 0; i < 10; i++) { send_item("LordAchoo", i); }
// Or w/ quantity
for (let i = 0; i < 10; i++) { send_item("LordAchoo", i, 0); }
// Better code .. 
for (let i = 0; i < 10; i++) {
  let item = character.items[i];
  if (item) send_item("merchantsName", i, item.q ?? 1)
}

# Gold
send_gold("CharacterName", 100000)

// Use Skill

use_skill(skillName);

use_skill(name, target_or_name=null, extra_arg=null)

	if(!is_on_cooldown("partyheal") && character.mp > 400)
	{
		set_message("Party Heal!");
		use_skill("partyheal");
	}

Upgrade/Compounds

upgrade(inventory_index, scroll_index, offering_index=null)
upgrade(2, 3)  // inventory.id - 0 based, last one is the 'upgrade scroll' item id 

compound(inventory_index1, index2, index3, scroll_index, offering_index=null)
compound(2, 3, 4, 5) // these are inventory.id (starts with 0) - last one is the "compound scroll" 

Attack blacklist

const TARGET_BLACKLIST = [ "Jr." ]

		target=get_nearest_monster();
		if (target && !TARGET_BLACKLIST.includes(target.name)) {
			change_target(target);
		}

Server Actions

Change Servers

change_server(region, name)
change_server('EU', 'I')  // Change to Europas I
change_server('US', 'PVP')  // Change to Americas PVP

Scripts (Specific Tasks, Bots, Etc)

  • Meant for use in game (Vanilla)

Buy/Upgrade Item in mainmap

REF: From Earthiverse

const ITEM_TO_BUY_AND_UPGRADE = "helmet"
const NUM_TO_KEEP = 4
const NUM_TO_BUY = 5 // If this is less than NUM_TO_KEEP, we won't buy anything.
const LEVEL_TO_UPGRADE_TO = 8

async function buyAndUpgradeLoop() {
    try {
        /** Buy items if we need */
        let numItems = 0
        for (let i = 0; i < character.isize; i++) {
            const item = character.items[i]
            if (!item) continue // No item in this slot
            if (item.name !== ITEM_TO_BUY_AND_UPGRADE) continue // Not the item we're looking for
            numItems += 1
        }
        if (numItems < NUM_TO_BUY) {
            await buy(ITEM_TO_BUY_AND_UPGRADE)
            buyAndUpgradeLoop()
            return
        }
        if (numItems <= NUM_TO_KEEP) return // No more to upgrade

        /** Find the lowest level item, we'll upgrade that one */
        let lowestLevel = Number.MAX_SAFE_INTEGER
        let lowestLevelPosition
        for (let i = 0; i < character.isize; i++) {
            const item = character.items[i]
            if (!item) continue // No item in this slot

            if (item.name == ITEM_TO_BUY_AND_UPGRADE) {
                // This is an item we want to upgrade!
                if (item.level < lowestLevel) {
                    lowestLevel = item.level
                    lowestLevelPosition = i
                }
            }
        }

        /** Don't upgrade if it's already the level we want, or there's no items to upgrade */
        if (lowestLevel < LEVEL_TO_UPGRADE_TO) {
            /** Find the scroll that corresponds with the grade of the item */
            const grade = item_grade(character.items[lowestLevelPosition])
            const scroll = `scroll${grade}`

            /** Buy a scroll if we don't have one */
            let scrollPosition = locate_item(scroll)
            if (scrollPosition == -1) scrollPosition = (await buy(scroll)).num

            /** Speed up the upgrade if we can */
            if (can_use("massproduction")) use_skill("massproduction")

            /** Upgrade! */
            await upgrade(lowestLevelPosition, scrollPosition)
        }
    } catch (e) {
        console.error(e)
    }
    buyAndUpgradeLoop()
}
buyAndUpgradeLoop()

// Move to a spot where we can buy scrolls and equipment, and upgrade.
smart_move({ map: "main", x: -225, y: -125 })

Scripts UI Elements

REF: https://github.com/Crowns3bc/AdventureLand/tree/main/Gui

Whole UI Combined Section -- EXP Counter, Crowns Damage Meter Vertical, Gold/Hour Meters

/////////////////////////////////////////////
/*
* UI ELEMENTS (CROWN)
*/

var startTime = new Date();
var sumGold = 0;
var largestGoldDrop = 0;
setInterval(function() {
	update_goldmeter();
}, 400);

function init_goldmeter() {
  let $ = parent.$;
  let brc = $('#bottomrightcorner');
  brc.find('#goldtimer').remove();
  let xpt_container = $('<div id="goldtimer"></div>').css({
    fontSize: '25px',
    color: 'white',
    textAlign: 'center',
    display: 'table',
    overflow: 'hidden',
    marginBottom: '-5px',
	width: "100%"
  });
  //vertical centering in css is fun
  let xptimer = $('<div id="goldtimercontent"></div>')
    .css({
      display: 'table-cell',
      verticalAlign: 'middle'
    })
    .html("")
    .appendTo(xpt_container);
  brc.children().first().after(xpt_container);
}

function updateGoldTimerList(){
	let $ = parent.$;
	var gold = getGold();
	var goldString = "<div>" + gold.toLocaleString('en') + " Gold/Hr" + "</div>"; 
	goldString += "<div>" + largestGoldDrop.toLocaleString('en') + " Largest Gold Drop</div>";
	$('#' + "goldtimercontent").html(goldString).css({
    background: 'black',
	backgroundColor: 'rgba(0, 0, 0, 0.7)', // Add a background color
    border: 'solid gray',
    borderWidth: '5px 5px',
    height: '50px',
    lineHeight: '25px',
    fontSize: '25px',
    color: '#FFD700',
    textAlign: 'center',
  });
}

function update_goldmeter() {
	updateGoldTimerList();
}

init_goldmeter();

function getGold(){
	var elapsed = new Date() - startTime;
	var goldPerSecond = parseFloat(Math.round((sumGold/(elapsed/1000)) * 100) / 100);
	return parseInt(goldPerSecond * 60 * 60);
}

function trackLargestGoldDrop(gold) {
  if (gold > largestGoldDrop) {
    largestGoldDrop = gold;
  }
}

//Clean out any pre-existing listeners
if (parent.prev_handlersgoldmeter) {
    for (let [event, handler] of parent.prev_handlersgoldmeter) {
      parent.socket.removeListener(event, handler);
    }
}
parent.prev_handlersgoldmeter = [];

function register_goldmeterhandler(event, handler) {
    parent.prev_handlersgoldmeter.push([event, handler]);
    parent.socket.on(event, handler);
};

function goldMeterGameResponseHandler(event){
	if(event.response == "gold_received"){
		var gold = event.gold;
		sumGold += gold;
		trackLargestGoldDrop(gold);
	}
}

function goldMeterGameLogHandler(event){
	if(event.color == "gold"){
		var gold = parseInt(event.message.replace(" gold", "").replace(",", ""));
		sumGold += gold;
		trackLargestGoldDrop(gold);
	}
}

register_goldmeterhandler("game_log", goldMeterGameLogHandler);
register_goldmeterhandler("game_response", goldMeterGameResponseHandler);

////////////////////////////////////////////////////////////////////

// Initialize the DPS meter
function initDPSMeter(minref) {
    let $ = parent.$;
    let brc = $('#bottomrightcorner');

    // Remove any existing DPS meter
    brc.find('#dpsmeter').remove();

    // Create a container for the DPS meter with styling
    let dpsmeter_container = $('<div id="dpsmeter"></div>').css({
        fontSize: '20px',
        color: 'white',
        textAlign: 'center',
        display: 'table',
        overflow: 'hidden',
        marginBottom: '-3px',
        width: '100%',
        backgroundColor: 'rgba(0, 0, 0, 0.5)', // Add a background color
    });

    // Create a div for vertical centering in CSS
    let xptimer = $('<div id="dpsmetercontent"></div>')
        .css({
            display: 'table-cell',
            verticalAlign: 'middle',
            backgroundColor: 'rgba(0, 0, 0, 0.5)', // Add a background color
            padding: '5px', // Add padding for better visibility
            border: '5px solid grey', // Add a border for better visibility
        })
        .html("")
        .appendTo(dpsmeter_container);

    // Insert the DPS meter container after the first child of bottomrightcorner
    brc.children().first().after(dpsmeter_container);
}

// Initialize your variables
var damage = 0;
var burnDamage = 0;
var blastDamage = 0;
var baseDamage = 0;
var baseHeal = 0;
var METER_START = performance.now(); // Record the start time for DPS calculation

// Damage tracking object for party members
var partyDamageSums = {};

// Function to format DPS with commas for better readability
function getFormattedDPS(dps) {
    try {
        return dps.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
    } catch (error) {
        console.error('An error occurred while formatting DPS:', error);
        return 'N/A';
    }
}

// Register the hit event handler
parent.socket.on("hit", function (data) {
    try {
        if (data.hid) {
            // Update DPS data for the character and party members
            let targetId = data.hid;

            // Check if the target is in the party
            if (parent.party_list && Array.isArray(parent.party_list) && parent.party_list.includes(targetId)) {
                let entry = partyDamageSums[targetId] || {
                    startTime: performance.now(),
                    sumDamage: 0,
                    sumHeal: 0,
                    sumBurnDamage: 0,
                    sumBlastDamage: 0,
                    sumBaseDamage: 0,
                };

                if (targetId == character.id) {
                    // Update the character's damage values
                    entry.sumDamage += data.damage || 0;
                    entry.sumHeal += data.heal || 0;

                    if (data.source == "burn") {
                        entry.sumBurnDamage += data.damage;
                    } else if (data.splash) {
                        entry.sumBlastDamage += data.damage;
                    } else {
                        entry.sumBaseDamage += data.damage || 0;
                    }
                } else {
                    // Update party member's damage values
                    entry.sumDamage += data.damage || 0;
                    entry.sumHeal += data.heal || 0;

                    if (data.source == "burn") {
                        entry.sumBurnDamage += data.damage;
                    } else if (data.splash) {
                        entry.sumBlastDamage += data.damage;
                    } else {
                        entry.sumBaseDamage += data.damage || 0;
                    }
                }

                partyDamageSums[targetId] = entry;
            }
        }
    } catch (error) {
        console.error('An error occurred in the hit event handler:', error);
    }
});

// Update the DPS meter display
// Update the DPS meter display
function updateDPSMeterUI() {
    try {
        // Calculate elapsed time since DPS meter start
        let ELAPSED = performance.now() - METER_START;

        // Calculate DPS for different damage types
        let dps = Math.floor((damage * 1000) / ELAPSED);
        let burnDps = Math.floor((burnDamage * 1000) / ELAPSED);
        let blastDps = Math.floor((blastDamage * 1000) / ELAPSED);
        let baseDps = Math.floor((baseDamage * 1000) / ELAPSED);
        let hps = Math.floor((baseHeal * 1000) / ELAPSED);

        let $ = parent.$;
        let dpsDisplay = $('#dpsmetercontent');

        // Check if the DPS display element exists
        if (dpsDisplay.length === 0) {
            console.warn('DPS display element not found.');
            return;
        }

        let listString = '<div>Crowns Damage Meter</div>';
        listString += '<table border="1" style="width:100%">';

        // Header row start with damage types horizontally
        listString += '<tr><th></th>';
        for (const type of ["Base", "Blast", "Burn", "HPS", "DPS"]) {
            listString += `<th>${type}</th>`;
        }
        listString += '</tr>';

        // Rows for each player with character names vertically
        for (let id in partyDamageSums) {
            const player = get_player(id);
            if (player) {
                listString += '<tr>';
                listString += `<td>${player.name}</td>`;
                
                for (const type of ["Base", "Blast", "Burn", "HPS", "DPS"]) {
                    const entry = partyDamageSums[id];
                    const value = getTypeValue(type, entry);
                    listString += `<td>${getFormattedDPS(value)}</td>`;
                }

                listString += '</tr>';
            }
        }

        // Add a row for Total DPS with colspan
        listString += '<tr><td>Total DPS</td>';
        for (const type of ["Base", "Blast", "Burn", "HPS", "DPS"]) {
            let typeTotalDPS = 0;

            for (let id in partyDamageSums) {
                const entry = partyDamageSums[id];
                const value = getTypeValue(type, entry);
                typeTotalDPS += value;
            }

            if (type === "DPS") {
                listString += `<td colspan="${Object.keys(partyDamageSums).length}">${getFormattedDPS(typeTotalDPS)}</td>`;
            } else {
                listString += `<td>${getFormattedDPS(typeTotalDPS)}</td>`;
            }
        }
        listString += '</tr>';

        listString += '</table>'; // Table end

        // Update the existing content instead of creating new content
        dpsDisplay.html(listString);
    } catch (error) {
        console.error('An error occurred while updating the DPS meter UI:', error);
    }
}

// Function to get the value for a specific damage type
function getTypeValue(type, entry) {
    switch (type) {
        case "DPS":
            return calculateDPSForPartyMember(entry);
        case "Burn":
            return entry ? Math.floor((entry.sumBurnDamage * 1000) / (performance.now() - entry.startTime)) : 0;
        case "Blast":
            return entry ? Math.floor((entry.sumBlastDamage * 1000) / (performance.now() - entry.startTime)) : 0;
        case "Base":
            return entry ? Math.floor((entry.sumBaseDamage * 1000) / (performance.now() - entry.startTime)) : 0;
        case "HPS":
            return entry ? Math.floor((entry.sumHeal * 1000) / (performance.now() - entry.startTime)) : 0;
        default:
            return 0;
    }
}

// Calculate DPS for a specific party member
function calculateDPSForPartyMember(entry) {
    try {
        const elapsedTime = performance.now() - (entry && entry.startTime || performance.now());
        const totalDamage = entry && entry.sumDamage || 0;
        return Math.floor((totalDamage * 1000) / elapsedTime);
    } catch (error) {
        console.error('An error occurred while calculating DPS for a party member:', error);
        return 0;
    }
}

// Initialize the DPS meter
initDPSMeter();

// Function to be called at regular intervals for updating the DPS meter UI
function updateDPSMeterInterval() {
    try {
        // Update the DPS meter UI
        updateDPSMeterUI();
    } catch (error) {
        console.error('An error occurred while updating the DPS meter at the interval:', error);
    }
}

// Start updating the DPS meter UI at regular intervals
setInterval(updateDPSMeterInterval, 250);

//////////////////////////////////////////////////////

setInterval(function () {
  update_xptimer();
}, 1000 / 4);

var minute_refresh;

function init_xptimer(minref) {
  minute_refresh = minref || 1;
  parent.add_log(minute_refresh.toString() + ' min until tracker refresh!', 0x00FFFF);
  let $ = parent.$;
  let brc = $('#bottomrightcorner');
  brc.find('#xptimer').remove();
  let xpt_container = $('<div id="xptimer"></div>').css({
    background: 'black',
    border: 'solid gray',
    borderWidth: '5px 5px',
    width: '320px',
    height: '66px',
    fontSize: '25px',
    color: '#00FF00',
    textAlign: 'center',
    display: 'table',
    overflow: 'hidden',
    marginBottom: '-5px',
    backgroundColor: 'rgba(0, 0, 0, 0.7)',
  });
  let xptimer = $('<div id="xptimercontent"></div>')
    .css({
      display: 'table-cell',
      verticalAlign: 'middle'
    })
    .html('Estimated time until level up:<br><span id="xpcounter" style="font-size: 30px !important; line-height: 25px">Loading...</span><br><span id="xprate">(Kill something!)</span>')
    .appendTo(xpt_container);
  brc.children().first().after(xpt_container);
}

var last_minutes_checked = new Date();
var last_xp_checked_minutes = character.xp;
var last_xp_checked_kill = character.xp;
let xpRateType = 'second'; // Default to XP/s

function toggleXPDisplay() {
  if (xpRateType === 'second') {
    xpRateType = 'minute';
  } else if (xpRateType === 'minute') {
    xpRateType = 'hour';
  } else {
    xpRateType = 'second';
  }
  update_xptimer(); // Update the display when toggling
}

function update_xptimer() {
  if (character.xp == last_xp_checked_kill) return;
  let $ = parent.$;
  let now = new Date();
  let time = Math.round((now.getTime() - last_minutes_checked.getTime()) / 1000);
  if (time < 1) return;
  let xp_rate = Math.round((character.xp - last_xp_checked_minutes) / time);

  let xp_per_hour = Math.round(xp_rate * 3600);
  let xp_per_minute = Math.round(xp_rate * 60);

  if (time > 60 * minute_refresh) {
    last_minutes_checked = new Date();
    last_xp_checked_minutes = character.xp;
  }
  last_xp_checked_kill = character.xp;
  let xp_missing = parent.G.levels[character.level] - character.xp;
  let seconds = Math.round(xp_missing / xp_rate);
  let minutes = Math.round(seconds / 60);
  let hours = Math.round(minutes / 60);
  let days = Math.floor(hours / 24);

  let remainingHours = hours % 24;
  let remainingMinutes = minutes % 60;

  let counter = `${days}d ${remainingHours}h ${remainingMinutes}min`;
  $('#xpcounter').css('color', '#87CEEB').text(counter); // Sky Blue color for the time until level up

  let xpRateDisplay = $('#xpRateDisplay');
  xpRateDisplay.empty(); // Clear previous values

  let xpButton = $('<div class="gamebutton clickable"></div>')
    .css({
      'font-size': '20px', // Adjusted font size
      'width': '30px', // Adjusted width
      'height': '5px', // Adjusted height
      'line-height': '5px', // Adjusted line height
      'background': 'none',
      'color': xpRateType === 'second' ? '#00FF00' : xpRateType === 'minute' ? '#FFA500' : '#FF0000',
      'margin-right': '50px',
      'borderWidth': '3px', // Adjusted border size
    })
    .text(`XP/${xpRateType.charAt(0).toUpperCase()}`)
    .on('click', toggleXPDisplay);

  let xprateContainer = $('<div class="xprate-container"></div>')
    .css({
      'display': 'flex',
      'align-items': 'center'
    });

  xprateContainer.append(xpButton);
  xprateContainer.append('<br>');
  xprateContainer.append(`<span id="xpRateDisplay">${xpRateType === 'second' ? ncomma(xp_rate) + ' XP/s' : xpRateType === 'minute' ? ncomma(xp_per_minute) + ' XP/min' : ncomma(xp_per_hour) + ' XP/h'}</span>`);

  $('#xprate').empty().append(xprateContainer);
}

function ncomma(x) {
  return x.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}

init_xptimer(5);

////////////////////////////////////////////
⚠️ **GitHub.com Fallback** ⚠️