New Loot Manager Plugin for EQ Emu

Third party software discussion goes here.
User avatar
moguay
Posts: 170

New Loot Manager Plugin for EQ Emu

Post#1 » Sat Feb 15, 2025 9:23 pm

https://www.youtube.com/watch?v=F7dBh8NEJN8

## Overview
Introducing the new loot management plugin for EverQuest EMU, designed to streamline loot distribution and item management for raid groups.

## Features

### Loot and Item Storage Engine
- Analysis and storage engine for loot and item tables.
- Compatible with local or SQL databases for flexible data management.

### Item Management User Interface (UI)
- Automated loot distribution for efficient and fair allocation.
- Advanced item search functionality to quickly locate specific items.
- Detailed loot statistics for tracking and analysis.

### Corpse Loot User Interface (UI)
- Manages loot distribution based on items already owned by raid players.
- Synchronized through the database for accurate and up-to-date information.
- Enables remote loot management for streamlined and centralized control.

And many more feats.

User avatar
kumiescaragne
Posts: 61

Re: New Loot Manager Plugin for EQ Emu

Post#2 » Sat Feb 15, 2025 10:06 pm

works with 2 teams from separate players (guismo team and mine)

the database can check item needed even from offline players.

Bootzey
Posts: 96

Re: New Loot Manager Plugin for EQ Emu

Post#3 » Mon Feb 17, 2025 6:42 pm

Where is this plugin?

User avatar
moguay
Posts: 170

Re: New Loot Manager Plugin for EQ Emu

Post#4 » Sat Feb 22, 2025 2:44 pm

Bootzey wrote:Where is this plugin?


These plugins are still in development—consider this a preview version. I’m currently finalizing the implementation of local database management with SQLite, allowing it to function without a dedicated server.

It’s important for potential users to understand that these plugins provide a management system, but interaction and remote control of the bots require some skill in macro coding. To facilitate this, I will share my inc loot file, which relies on SQLite or SQL through two other plugins: mq2sqlite.dll and mq2mysql.dll, enabling access to loot tables.

As of now, I haven’t been able to integrate these features directly due to certain technical limitations in some MQ2 plugin APIs. Additionally, bot automation remains much more flexible via macro code, allowing for customization based on individual needs.

A bit more coding, a few liters of coffee, and it'll be (almost) magic! ☕✨

"P.S.: If anyone is motivated to test and code their own macro part, feel free to send me a PM on Discord: guizmo007 (Guizmo#6576)!"

Image
Image

User avatar
moguay
Posts: 170

Re: New Loot Manager Plugin for EQ Emu

Post#5 » Thu Feb 27, 2025 9:13 am

New feature preview, once again,
I wanted to test a new feature, both for the technical challenge and to see how far I could take it: capturing 3MB of data, managing an inventory table with all characters, and making the most of that information.

The idea? A dedicated tab with a clear and interactive inventory view. Instant search, precise filters, and detailed tracking of acquired quantities—whether overall or per character. All without getting lost in spreadsheets, magelo or juggling ten Windows pop-ups.

In short, smooth inventory management, no hassle.

Image

User avatar
moguay
Posts: 170

Re: New Loot Manager Plugin for EQ Emu

Post#6 » Wed Mar 12, 2025 9:47 pm

These past two days have been dedicated to intensive work on optimizing the table algorithms.
Additionally, a switch has been implemented to toggle between viewing quantity and focus effects.
Can also show forged items on each char and standard not forged (Base item / Inventory item, the 2 last col).

can help to replace the /say #myfocus command, and show on all char in one UI

I start slowly to implement a corpse looting directly in Cpp, Atm i have specified item loot, aoe corpse check.
What will require more work for me is integrating the auto-loot system with a configured item management, and that will involve doing some really not fun tasks.

Image

For fun, I created a scoring system and item comparison based on each character's gear.

It works like this: if you loot an item, it calculates how much your gear improves, as well as what spells or focus effects you gain or lose.

It's entirely feasible to implement, but I won’t be doing it since I have no use for it—and for other reasons as well.

Image

The SQL query version for those who want to get inspiration from the algorithm :

Code: Select all

-- This query recommends "Tier 9" items to characters based on class compatibility, stat contributions, and spell uniqueness.
-- It uses class-specific weights for stats, applies diminishing returns to certain stats, and prioritizes items with new spells.

WITH ClassWeights AS (
    -- CTE defining class-specific weights for various attributes (e.g., AC, HP, Mana, Strength, etc.)
    -- Each row represents a class (1 to 16) with weights indicating the importance of each attribute for that class.
    SELECT 1 AS charClass, -- Warrior
           8 AS w_AC, 5 AS w_HP, 0 AS w_MANA, 5 AS w_STR, 1 AS w_INT, 1 AS w_WIS, 3 AS w_AGI,
           3 AS w_DEX, 4 AS w_STA, 1 AS w_CHA, 4 AS w_ATK, 7 AS w_BaseDmg, 0 AS w_SpellDmg,
           0 AS w_HealAmnt, 3 AS w_Magic, 3 AS w_Fire, 3 AS w_Cold, 3 AS w_Disease, 3 AS w_Poison,
           3 AS w_Corruption, 2 AS w_HPRegen, 0 AS w_ManaRegen, 3 AS w_Endurance,
           2 AS w_EnduranceRegen, 4 AS w_Haste, 3 AS w_Accuracy, 5 AS w_Avoidance,
           6 AS w_Shielding, 2 AS w_StunResist, 3 AS w_DoTShielding, 2 AS w_Luck,
           4 AS w_SpellShield, 2 AS w_StrikeThrough, 1 AS w_Clairvoyance
    UNION ALL
    SELECT 2, 7, 4, 3, 4, 1, 4, 2, 2, 3, 3, 3, 5, 2, 5, 3, 3, 3, 3, 3, 3, 2, 3, 2, 1, 3, 2, 3, 5, 2, 3, 2, 4, 2, 2
    UNION ALL
    SELECT 3, 7, 4, 4, 4, 4, 1, 2, 2, 3, 2, 3, 5, 5, 2, 3, 3, 3, 3, 3, 3, 2, 3, 2, 1, 3, 2, 3, 5, 2, 3, 2, 4, 2, 2
    UNION ALL
    SELECT 4, 4, 3, 0, 5, 1, 1, 5, 7, 3, 1, 5, 7, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 4, 3, 6, 5, 4, 3, 1, 2, 3, 2, 5, 1
    UNION ALL
    SELECT 5, 4, 3, 0, 5, 1, 1, 6, 5, 3, 1, 5, 7, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 4, 3, 6, 4, 4, 3, 1, 2, 3, 2, 5, 1
    UNION ALL
    SELECT 6, 4, 3, 8, 1, 1, 8, 1, 1, 3, 2, 0, 0, 0, 10, 3, 3, 3, 3, 3, 3, 1, 5, 0, 0, 0, 1, 1, 2, 1, 1, 2, 4, 0, 2
    UNION ALL
    SELECT 7, 4, 3, 0, 6, 1, 1, 4, 5, 3, 1, 5, 8, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 4, 3, 7, 4, 2, 3, 1, 2, 3, 2, 5, 1
    UNION ALL
    SELECT 8, 4, 3, 3, 4, 1, 4, 4, 6, 3, 2, 5, 7, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 5, 4, 2, 3, 1, 2, 3, 2, 4, 1
    UNION ALL
    SELECT 9, 4, 3, 5, 4, 1, 1, 4, 5, 3, 8, 4, 5, 3, 2, 3, 3, 3, 3, 3, 3, 2, 3, 3, 2, 5, 3, 2, 3, 1, 2, 3, 3, 4, 1
    UNION ALL
    SELECT 10, 4, 3, 4, 5, 1, 4, 3, 4, 3, 2, 4, 6, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 3, 2, 4, 3, 2, 3, 1, 2, 3, 2, 4, 1
    UNION ALL
    SELECT 11, 2, 3, 7, 1, 8, 1, 1, 1, 2, 1, 0, 0, 10, 0, 3, 3, 3, 3, 3, 3, 1, 5, 0, 0, 0, 1, 1, 2, 1, 1, 3, 4, 0, 2
    UNION ALL
    SELECT 12, 2, 3, 7, 1, 8, 1, 1, 1, 2, 1, 0, 0, 8, 0, 3, 3, 3, 3, 3, 3, 1, 5, 0, 0, 0, 1, 1, 2, 1, 1, 3, 4, 0, 2
    UNION ALL
    SELECT 13, 2, 3, 7, 1, 8, 1, 1, 1, 2, 1, 0, 0, 8, 2, 3, 3, 3, 3, 3, 3, 1, 5, 0, 0, 0, 1, 1, 2, 1, 1, 3, 4, 0, 2
    UNION ALL
    SELECT 14, 2, 3, 7, 1, 8, 1, 1, 1, 2, 5, 0, 0, 6, 0, 3, 3, 3, 3, 3, 3, 1, 5, 0, 0, 0, 1, 1, 2, 1, 1, 3, 4, 0, 2
    UNION ALL
    SELECT 15, 3, 3, 7, 1, 1, 8, 1, 1, 3, 2, 1, 2, 5, 8, 3, 3, 3, 3, 3, 3, 1, 4, 1, 1, 1, 1, 1, 2, 1, 1, 2, 3, 0, 2
    UNION ALL
    SELECT 16, 3, 3, 7, 1, 1, 8, 1, 1, 3, 2, 1, 2, 4, 8, 3, 3, 3, 3, 3, 3, 1, 4, 1, 1, 1, 1, 1, 2, 1, 1, 2, 3, 0, 2
),
CharacterSpells AS (
    -- CTE to collect all spells each character has from their equipped items
    -- Combines spells from up to six spell slots per item (SpellData_0 to SpellData_5)
    SELECT DISTINCT all_spells.CharacterName, all_spells.SpellID
    FROM (
        SELECT inv.CharacterName, inv_i.SpellData_0_SpellID AS SpellID
        FROM lootbot_inventory inv
        JOIN items inv_i ON inv.ItemId = inv_i.ItemNumber
        WHERE inv_i.SpellData_0_SpellID IS NOT NULL
        UNION ALL
        SELECT inv.CharacterName, inv_i.SpellData_1_SpellID AS SpellID
        FROM lootbot_inventory inv
        JOIN items inv_i ON inv.ItemId = inv_i.ItemNumber
        WHERE inv_i.SpellData_1_SpellID IS NOT NULL
        UNION ALL
        SELECT inv.CharacterName, inv_i.SpellData_2_SpellID AS SpellID
        FROM lootbot_inventory inv
        JOIN items inv_i ON inv.ItemId = inv_i.ItemNumber
        WHERE inv_i.SpellData_2_SpellID IS NOT NULL
        UNION ALL
        SELECT inv.CharacterName, inv_i.SpellData_3_SpellID AS SpellID
        FROM lootbot_inventory inv
        JOIN items inv_i ON inv.ItemId = inv_i.ItemNumber
        WHERE inv_i.SpellData_3_SpellID IS NOT NULL
        UNION ALL
        SELECT inv.CharacterName, inv_i.SpellData_4_SpellID AS SpellID
        FROM lootbot_inventory inv
        JOIN items inv_i ON inv.ItemId = inv_i.ItemNumber
        WHERE inv_i.SpellData_4_SpellID IS NOT NULL
        UNION ALL
        SELECT inv.CharacterName, inv_i.SpellData_5_SpellID AS SpellID
        FROM lootbot_inventory inv
        JOIN items inv_i ON inv.ItemId = inv_i.ItemNumber
        WHERE inv_i.SpellData_5_SpellID IS NOT NULL
    ) AS all_spells
),
FilteredItems AS (
    -- CTE to evaluate items for each character, scoring based on stats and spells, and filtering out equipped items
    SELECT
        i.id AS item_id,
        i.Name AS item_name,
        c.charName AS character_name,
        c.charClass AS character_class,
        (i.Classes & (1 << (c.charClass - 1))) AS class_compatible, -- Bitwise check for class compatibility
        -- Calculate AC contribution with diminishing returns above 1000
        CASE WHEN COALESCE(i.AC + i.HeroicSvMagic * 2, 0) > 1000
             THEN 1000 + ((i.AC + i.HeroicSvMagic * 2 - 1000) * 0.5)
             ELSE COALESCE(i.AC + i.HeroicSvMagic * 2, 0)
        END AS ac_contrib,
        -- Calculate Haste contribution with diminishing returns above 50
        CASE WHEN COALESCE(i.Haste, 0) > 50
             THEN 50 + ((i.Haste - 50) * 0.3)
             ELSE COALESCE(i.Haste, 0)
        END AS haste_contrib,
        -- Calculate final score by multiplying total_score with slot_multiplier
        (COALESCE(
            CASE
                WHEN (i.Classes & (1 << (c.charClass - 1))) > 0
                     AND (i.AC IS NOT NULL OR i.HP IS NOT NULL OR i.Mana IS NOT NULL OR i.STR IS NOT NULL
                          OR i.INT IS NOT NULL OR i.WIS IS NOT NULL OR i.AGI IS NOT NULL OR i.DEX IS NOT NULL
                          OR i.STA IS NOT NULL OR i.CHA IS NOT NULL OR i.Attack IS NOT NULL OR i.Damage IS NOT NULL
                          OR i.SpellDamage IS NOT NULL OR i.HealAmount IS NOT NULL OR i.SvMagic IS NOT NULL
                          OR i.SvFire IS NOT NULL OR i.SvCold IS NOT NULL OR i.SvDisease IS NOT NULL
                          OR i.SvPoison IS NOT NULL OR i.SvCorruption IS NOT NULL OR i.HPRegen IS NOT NULL
                          OR i.ManaRegen IS NOT NULL OR i.Endurance IS NOT NULL OR i.EnduranceRegen IS NOT NULL
                          OR i.Haste IS NOT NULL OR i.Accuracy IS NOT NULL OR i.Avoidance IS NOT NULL
                          OR i.Shielding IS NOT NULL OR i.StunResist IS NOT NULL OR i.DoTShielding IS NOT NULL
                          OR i.SpellShield IS NOT NULL OR i.StrikeThrough IS NOT NULL OR i.Clairvoyance IS NOT NULL
                          OR i.SpellData_0_SpellID IS NOT NULL)
                THEN (
                    (cw.w_AC * CASE WHEN COALESCE(i.AC + i.HeroicSvMagic * 2, 0) > 1000
                                   THEN 1000 + ((i.AC + i.HeroicSvMagic * 2 - 1000) * 0.5)
                                   ELSE COALESCE(i.AC + i.HeroicSvMagic * 2, 0) END) +
                    (cw.w_HP * COALESCE(i.HP + i.HeroicSTA * 2, 0)) +
                    (cw.w_MANA * COALESCE(i.Mana + i.HeroicINT * 2 + i.HeroicWIS * 2, 0)) +
                    (cw.w_STR * COALESCE(i.STR + i.HeroicSTR * 2, 0)) +
                    (cw.w_INT * COALESCE(i.INT + i.HeroicINT * 2, 0)) +
                    (cw.w_WIS * COALESCE(i.WIS + i.HeroicWIS * 2, 0)) +
                    (cw.w_AGI * COALESCE(i.AGI + i.HeroicAGI * 2, 0)) +
                    (cw.w_DEX * COALESCE(i.DEX + i.HeroicDEX * 2, 0)) +
                    (cw.w_STA * COALESCE(i.STA + i.HeroicSTA * 2, 0)) +
                    (cw.w_CHA * COALESCE(i.CHA + i.HeroicCHA * 2, 0)) +
                    (cw.w_ATK * COALESCE(i.Attack, 0)) +
                    (cw.w_BaseDmg * COALESCE(i.Damage, 0)) +
                    (cw.w_SpellDmg * COALESCE(i.SpellDamage, 0)) +
                    (cw.w_HealAmnt * COALESCE(i.HealAmount, 0)) +
                    (cw.w_Magic * COALESCE(i.SvMagic + i.HeroicSvMagic, 0)) +
                    (cw.w_Fire * COALESCE(i.SvFire + i.HeroicSvFire, 0)) +
                    (cw.w_Cold * COALESCE(i.SvCold + i.HeroicSvCold, 0)) +
                    (cw.w_Disease * COALESCE(i.SvDisease + i.HeroicSvDisease, 0)) +
                    (cw.w_Poison * COALESCE(i.SvPoison + i.HeroicSvPoison, 0)) +
                    (cw.w_Corruption * COALESCE(i.SvCorruption + i.HeroicSvCorruption, 0)) +
                    (cw.w_HPRegen * COALESCE(i.HPRegen, 0)) +
                    (cw.w_ManaRegen * COALESCE(i.ManaRegen, 0)) +
                    (cw.w_Endurance * COALESCE(i.Endurance, 0)) +
                    (cw.w_EnduranceRegen * COALESCE(i.EnduranceRegen, 0)) +
                    (cw.w_Haste * CASE WHEN COALESCE(i.Haste, 0) > 50
                                      THEN 50 + ((i.Haste - 50) * 0.3)
                                      ELSE COALESCE(i.Haste, 0) END) +
                    (cw.w_Accuracy * COALESCE(i.Accuracy, 0)) +
                    (cw.w_Avoidance * COALESCE(i.Avoidance, 0)) +
                    (cw.w_Shielding * COALESCE(i.Shielding, 0)) +
                    (cw.w_StunResist * COALESCE(i.StunResist, 0)) +
                    (cw.w_DoTShielding * COALESCE(i.DoTShielding, 0)) +
                    (cw.w_SpellShield * COALESCE(i.SpellShield, 0)) +
                    (cw.w_StrikeThrough * COALESCE(i.StrikeThrough, 0)) +
                    (cw.w_Clairvoyance * COALESCE(i.Clairvoyance, 0)) +
                    (1 * COALESCE(CASE WHEN i.SpellData_0_EffectType = 0 THEN (i.SpellData_0_SpellID * i.SpellData_0_ProcRate / 100 * 10) ELSE 0 END, 0))
                )
                ELSE 0
            END, 0) *
            COALESCE(
                CASE
                    WHEN c.charClass IN (1, 3, 4, 5, 7, 8, 9, 15) AND i.EquipSlots & 1 THEN 1.5
                    WHEN c.charClass IN (1, 2, 3) AND i.Type = 10 THEN 1.2
                    ELSE 1.0
                END, 1.0)) AS final_score,
        -- Count how many spells the character already has from the item
        (
            (CASE WHEN i.SpellData_0_SpellID IS NOT NULL AND EXISTS (SELECT 1 FROM CharacterSpells cs WHERE cs.CharacterName = c.charName AND cs.SpellID = i.SpellData_0_SpellID) THEN 1 ELSE 0 END) +
            (CASE WHEN i.SpellData_1_SpellID IS NOT NULL AND EXISTS (SELECT 1 FROM CharacterSpells cs WHERE cs.CharacterName = c.charName AND cs.SpellID = i.SpellData_1_SpellID) THEN 1 ELSE 0 END) +
            (CASE WHEN i.SpellData_2_SpellID IS NOT NULL AND EXISTS (SELECT 1 FROM CharacterSpells cs WHERE cs.CharacterName = c.charName AND cs.SpellID = i.SpellData_2_SpellID) THEN 1 ELSE 0 END) +
            (CASE WHEN i.SpellData_3_SpellID IS NOT NULL AND EXISTS (SELECT 1 FROM CharacterSpells cs WHERE cs.CharacterName = c.charName AND cs.SpellID = i.SpellData_3_SpellID) THEN 1 ELSE 0 END) +
            (CASE WHEN i.SpellData_4_SpellID IS NOT NULL AND EXISTS (SELECT 1 FROM CharacterSpells cs WHERE cs.CharacterName = c.charName AND cs.SpellID = i.SpellData_4_SpellID) THEN 1 ELSE 0 END) +
            (CASE WHEN i.SpellData_5_SpellID IS NOT NULL AND EXISTS (SELECT 1 FROM CharacterSpells cs WHERE cs.CharacterName = c.charName AND cs.SpellID = i.SpellData_5_SpellID) THEN 1 ELSE 0 END)
        ) AS effect_have,
        -- Count how many new spells the item provides
        (
            (CASE WHEN i.SpellData_0_SpellID IS NOT NULL AND NOT EXISTS (SELECT 1 FROM CharacterSpells cs WHERE cs.CharacterName = c.charName AND cs.SpellID = i.SpellData_0_SpellID) THEN 1 ELSE 0 END) +
            (CASE WHEN i.SpellData_1_SpellID IS NOT NULL AND NOT EXISTS (SELECT 1 FROM CharacterSpells cs WHERE cs.CharacterName = c.charName AND cs.SpellID = i.SpellData_1_SpellID) THEN 1 ELSE 0 END) +
            (CASE WHEN i.SpellData_2_SpellID IS NOT NULL AND NOT EXISTS (SELECT 1 FROM CharacterSpells cs WHERE cs.CharacterName = c.charName AND cs.SpellID = i.SpellData_2_SpellID) THEN 1 ELSE 0 END) +
            (CASE WHEN i.SpellData_3_SpellID IS NOT NULL AND NOT EXISTS (SELECT 1 FROM CharacterSpells cs WHERE cs.CharacterName = c.charName AND cs.SpellID = i.SpellData_3_SpellID) THEN 1 ELSE 0 END) +
            (CASE WHEN i.SpellData_4_SpellID IS NOT NULL AND NOT EXISTS (SELECT 1 FROM CharacterSpells cs WHERE cs.CharacterName = c.charName AND cs.SpellID = i.SpellData_4_SpellID) THEN 1 ELSE 0 END) +
            (CASE WHEN i.SpellData_5_SpellID IS NOT NULL AND NOT EXISTS (SELECT 1 FROM CharacterSpells cs WHERE cs.CharacterName = c.charName AND cs.SpellID = i.SpellData_5_SpellID) THEN 1 ELSE 0 END)
        ) AS effect_not_have,
        -- List the names of new spells
        CONCAT_WS('; ',
            CASE
                WHEN i.SpellData_0_SpellID IS NOT NULL
                AND i.SpellData_0_SpellName IS NOT NULL
                AND NOT EXISTS (
                    SELECT 1
                    FROM CharacterSpells cs
                    WHERE cs.CharacterName = c.charName
                    AND cs.SpellID = i.SpellData_0_SpellID
                )
                THEN i.SpellData_0_SpellName
                ELSE NULL
            END,
            CASE
                WHEN i.SpellData_1_SpellID IS NOT NULL
                AND i.SpellData_1_SpellName IS NOT NULL
                AND NOT EXISTS (
                    SELECT 1
                    FROM CharacterSpells cs
                    WHERE cs.CharacterName = c.charName
                    AND cs.SpellID = i.SpellData_1_SpellID
                )
                THEN i.SpellData_1_SpellName
                ELSE NULL
            END,
            CASE
                WHEN i.SpellData_2_SpellID IS NOT NULL
                AND i.SpellData_2_SpellName IS NOT NULL
                AND NOT EXISTS (
                    SELECT 1
                    FROM CharacterSpells cs
                    WHERE cs.CharacterName = c.charName
                    AND cs.SpellID = i.SpellData_2_SpellID
                )
                THEN i.SpellData_2_SpellName
                ELSE NULL
            END,
            CASE
                WHEN i.SpellData_3_SpellID IS NOT NULL
                AND i.SpellData_3_SpellName IS NOT NULL
                AND NOT EXISTS (
                    SELECT 1
                    FROM CharacterSpells cs
                    WHERE cs.CharacterName = c.charName
                    AND cs.SpellID = i.SpellData_3_SpellID
                )
                THEN i.SpellData_3_SpellName
                ELSE NULL
            END,
            CASE
                WHEN i.SpellData_4_SpellID IS NOT NULL
                AND i.SpellData_4_SpellName IS NOT NULL
                AND NOT EXISTS (
                    SELECT 1
                    FROM CharacterSpells cs
                    WHERE cs.CharacterName = c.charName
                    AND cs.SpellID = i.SpellData_4_SpellID
                )
                THEN i.SpellData_4_SpellName
                ELSE NULL
            END,
            CASE
                WHEN i.SpellData_5_SpellID IS NOT NULL
                AND i.SpellData_5_SpellName IS NOT NULL
                AND NOT EXISTS (
                    SELECT 1
                    FROM CharacterSpells cs
                    WHERE cs.CharacterName = c.charName
                    AND cs.SpellID = i.SpellData_5_SpellID
                )
                THEN i.SpellData_5_SpellName
                ELSE NULL
            END
        ) AS effect_not_have_name_list
    FROM
        (SELECT * FROM items WHERE EquipSlots > 0) i -- Only consider equippable items
    CROSS JOIN
        lootmgr_characters c
    LEFT JOIN
        ClassWeights cw ON c.charClass = cw.charClass -- Pair each item with each character
    LEFT JOIN
        lootbot_inventory inv ON inv.ItemId = i.ItemNumber AND inv.CharacterName = c.charName -- Check if item is already equipped
    WHERE
        (i.Classes & (1 << (c.charClass - 1))) > 0 -- Item is usable by the character's clas
        AND inv.ItemId IS NULL -- Item is not already equipped by the character
)
-- Main query to select and filter the results
SELECT item_id, item_name, character_name, final_score, effect_have, effect_not_have, effect_not_have_name_list
FROM FilteredItems
WHERE effect_not_have > 0 -- Only include items that provide at least one new spell
   AND item_name LIKE '%Tier 9%' -- Only include "Tier 9" items
ORDER BY item_id, character_name; -- Order by item ID and character name

User avatar
moguay
Posts: 170

Re: New Loot Manager Plugin for EQ Emu

Post#7 » Thu Mar 20, 2025 5:12 pm

This is the first tests of the new autoloot plugin in development for MQ2 Emu, he uses the manager for its configuration aspect.
This demonstration showcases mass autoloot on a single character. The system operates based on several rules: ignore, destroy, keep, balanced distribution, quest item (according to the required quantity), and armor item.
Can be executed on many char on same time.
Single item loot is also implemented via the manager UI.

https://youtu.be/XriK8OARtw4
https://youtu.be/caYcFdddZu4

Bootzey
Posts: 96

Re: New Loot Manager Plugin for EQ Emu

Post#8 » Thu Mar 20, 2025 9:15 pm

Outstanding!!!!

User avatar
moguay
Posts: 170

Re: New Loot Manager Plugin for EQ Emu

Post#9 » Tue Apr 22, 2025 9:54 pm

I’ve added a new feature that, while mainly designed for my own dev needs, allowed me to refactor a chunk of the code to make it cleaner and more efficient. Here’s the rundown of the key changes:

- Merged the "body" and "UI" plugins: now we’ve got centralized, streamlined management of database transactions.

- Implemented a connection pool: a major boost for performance and scalability, even when the server’s getting slammed.

- My favorite feature: corpses table synchronization across all raid characters.

This last one is a game-changer for me! It lets me grab loot from a body even if another player or character has already opened or looted it. Basically, I no longer need to interact with a body locally if someone else has handled it remotely—whether it’s for opening (initialization) or item drop (refresh). It’s a glorious leap forward, but it’s still a beast to tame: debugging, testing, and polishing are ongoing.

« And when it crashes? Oh, baby, it’s like I’ve been chucked into a canyon, both legs shattered, yet I’m still trying to nail a legendary moonwalk to crawl my way out! »

Image

User avatar
moguay
Posts: 170

Re: New Loot Manager Plugin for EQ Emu

Post#10 » Sat Jun 14, 2025 10:51 am

New Features in Development: Optimize Your Gear and Bot Management!

I'm excited to unveil two upcoming features currently in development, designed to enhance your gameplay experience! These improvements provide greater visibility and control, whether you're managing your bots or organizing your inventory.

1. Item Score Comparison Across All Bots
This feature will allow you to compare item scores across all your bots.
Item scores are calculated based on the item's stats, weighted according to a class-specific scoring system.
This gives you a clear overview of which bot is best equipped for its role and helps you make smarter loot and gear transfer decisions.

2. Stat Comparison for Items in Your Personal Inventory
Inspired by the native feature on Live servers, this introduces detailed stat comparison between items in your own inventory.
You’ll be able to instantly identify upgrades or downgrades when evaluating your gear.
For now, this feature is limited to your own character, but it lays the groundwork for broader functionality.

> Special thanks to Enine for his valuable input and guidance on this system!

I’m still investigating several advanced aspects, such as:
Handling missing stats not present on compared items
Dealing with equipment slots
Required skills
Item effects and focus enhancements

Image

Image
Image

Return to “Third party software”

Who is online

Users browsing this forum: No registered users and 0 guests

cron