Dismiss Notice
Wynncraft, the Minecraft MMORPG. Play it now on your Minecraft client at (IP): play.wynncraft.com. No mods required! Click here for more info...

Guide XP Bonus Gear (2022) + Script

Discussion in 'Wynncraft' started by LtNifty, Oct 3, 2022.

Thread Status:
Not open for further replies.
  1. LtNifty

    LtNifty Well-Known Adventurer HERO

    Messages:
    21
    Likes Received:
    18
    Trophy Points:
    48
    Minecraft:
    Hello all,

    I was looking for an updated XP bonus gear guide that was up-to-date and I couldn't find one so I decided to just make a script that could hopefully be used in the future.

    It was designed to eventually automatically generate a .xlsx file (Excel/Google Sheets), but I kinda ran out of steam on the project so I just decided to release what I have currently. I might come back in the future and tweak it but currently I just dumps all the data into the terminal.

    Some notable considerations...
    - If an item has the same bonus as the previous max xp bonus, it stays in the list. It only removes items whose max xp bonus is explicitly less than.
    - This does not account for set bonuses. I'm fairly certain full cosmic is still incredibly good (perhaps even better then some of these items together) but I did not make any calculations for set bonuses.
    - This gives the max possible xp bonus per item. Although a more useful metric might be average xp bonus, the code currently does not do that (feel free to fork my repo and implement that yourself though, I might add it myself down the line)

    The repo can be found here for those interested, and the code can also be found in the spoiler below.
    Code:
    import os
    from bs4 import BeautifulSoup
    
    class Item:
        def __init__(self, name, rarity, lvlReq, statName, stat, statUnit, guaranteed, tradeable, link):
            self.name = name
            self.rarity = rarity
            self.lvlReq = lvlReq
            self.statName = statName
            self.stat = stat
            self.statUnit = statUnit
            self.tradeable = tradeable
            self.guaranteed = guaranteed
            self.link = link
        
        def toString(self):
            return "(" + self.name + " : " + self.rarity + ") Level Req: " + str(self.lvlReq) + ", " + self.statName + ": " + str(self.stat) + str(self.statUnit) + "\n\tTradeable? " + str(self.tradeable) + ", Guaranteed? " + str(self.guaranteed)
        
    categories = ["Helmet", "Chestplate", "Leggings", "Boots", "Dagger", "Wand", "Bow", "Spear", "Relik", "Ring", "Bracelet", "Necklace"]
    statToSortBy = "XP Bonus"
    
    for category in categories:
        print("<===== " + category + " =====>")
        # Makes a curl call to the wynndata page and saves the output to a temporary text file
        os.system("curl \"https://www.wynndata.tk/items/\" -X POST --data-raw \"search=&name=&category=type-" + category + "&tier=any&profession=any&min=1&max=130&order1=level&order2=xpBonus&order3=null&order4=null\" --output temp.txt")
        items = []
    
        soup = BeautifulSoup(open('temp.txt', 'r', errors='ignore').read(), 'html.parser')
        for div in soup.findAll(class_=['itembox macrocategory-items']):
            # Check if an item is still obtainable
            if div.find(class_='dropTypeIcon').find('img').attrs['src'] in {'/assets/images/dropType/discontinued.png', '/assets/images/dropType/unobtainable.png'}:
                continue
            
            # Finds the name of the item entry
            name = div.find('p').text
            
            # Finds the rarity of the item
            rarity = div.find(class_='header').find('p')['class'][1]
            
            # If the category is a weapon, we need to skip over the first checkmark entry
            # because that entry indicates the class the weapon is locked to instead of the
            # minimum combat level
            if category in {"Dagger", "Wand", "Bow", "Spear", "Relik"}:
                lvlReq = int(''.join(c for c in div.findAll(class_='emoji emoji-checkmark')[1].text if c.isdigit()))
            else:
                lvlReq = int(''.join(c for c in div.find(class_='emoji emoji-checkmark').text if c.isdigit()))
            
            # Grabs the stat name we are looking for
            statName = statToSortBy
            
            # Finds that stat of the item entry
            stat = 0
            statUnit = ''
            guaranteed = True
            offset = 0
            for statEntry in div.find('tbody').findAll('tr'):
                # Checks if the item has min/max columns or just a value column
                if div.find('thead').findAll('th')[1].text != "Value":
                    offset = 1
                    guaranteed = False
                
                # Breaks down each stat into it's min/name/max or name/value values
                values = statEntry.findAll('td')
                
                # If the name value of the stat is the stat we are looking for,
                # grab the stat as an integer and stop looping
                if values[0 + offset].text == statToSortBy:
                    stat = int(''.join(c for c in values[1 + offset].text if c.isdigit() or c == '-'))
                    statUnit = str(''.join(c for c in values[1 + offset].text if not c.isdigit() and not c == '-'))
                    break
            
            # Determines if the item is tradeable or not
            tradeable = True
            if not div.find(class_='restrictions') is None:
                tradeable = False
                
            # Grabs the link to the item's page
            link = "https://www.wynndata.tk" + div.find(class_='more-details').find('a')['href']
            
            # Use the data we found to add an Item to the list   
            items.append(Item(name, rarity, lvlReq, statToSortBy, stat, statUnit, guaranteed, tradeable, link))
    
        items.reverse()
        currItemMax = items[0]
        i = 1
        while i < len(items):
            if items[i].stat >= currItemMax.stat:
                if items[i].stat > currItemMax.stat and items[i].lvlReq == currItemMax.lvlReq:
                    items.remove(currItemMax)
                    currItemMax = items[i - 1]
                else:
                    currItemMax = items[i]
                    i += 1
            else:
                items.remove(items[i])
    
        for item in items:
            print(item.toString())
    
            

    Here is what the script generated...
    (Tosach : Unique) Level Req: 1, XP Bonus: 3%
    (The Queen's Tiara : Rare) Level Req: 5, XP Bonus: 5%
    (Skin Cap : Unique) Level Req: 7, XP Bonus: 7%
    (Heliophilia : Legendary) Level Req: 8, XP Bonus: 16%
    (Sound of Silence : Unique) Level Req: 23, XP Bonus: 20%
    (Faded : Unique) Level Req: 39, XP Bonus: 20%
    (Aeolus : Unique) Level Req: 41, XP Bonus: 20%
    (Venison : Legendary) Level Req: 54, XP Bonus: 20%
    (Illuminite : Rare) Level Req: 55, XP Bonus: 20%
    (Blueberry : Unique) Level Req: 58, XP Bonus: 21%
    (Upgraded Orc Mask : Unique) Level Req: 64, XP Bonus: 26%
    (Clearsight Spectacles : Legendary) Level Req: 71, XP Bonus: 26%
    (Penance : Unique) Level Req: 75, XP Bonus: 26%
    (Gale's Sight : Legendary) Level Req: 80, XP Bonus: 39%
    (The King's Robe : Rare) Level Req: 3, XP Bonus: 10%
    (Blessed Wrappings : Legendary) Level Req: 5, XP Bonus: 13%
    (Arakadicus' Body : Legendary) Level Req: 21, XP Bonus: 13%
    (Obolus : Legendary) Level Req: 25, XP Bonus: 13%
    (Detlas' Skin : Unique) Level Req: 29, XP Bonus: 20%
    (Santa's Coat : Rare) Level Req: 32, XP Bonus: 20%
    (Geis : Rare) Level Req: 54, XP Bonus: 33%
    (The Jingling Jester : Fabled) Level Req: 69, XP Bonus: 33%
    (Papyrus : Rare) Level Req: 77, XP Bonus: 39%
    (Funnel : Unique) Level Req: 7, XP Bonus: 7%
    (Waist Apron : Rare) Level Req: 7, XP Bonus: 7%
    (Opulenity : Legendary) Level Req: 11, XP Bonus: 13%
    (Villager Pants : Set) Level Req: 24, XP Bonus: 13%
    (Dilation : Legendary) Level Req: 31, XP Bonus: 15%
    (Chained Pixels : Legendary) Level Req: 38, XP Bonus: 21%
    (Bridge of the Divide : Legendary) Level Req: 51, XP Bonus: 26%
    (Greaves of Honor : Rare) Level Req: 58, XP Bonus: 39%
    (Trench Scourer : Rare) Level Req: 94, XP Bonus: 40%
    (Sargasso : Rare) Level Req: 2, XP Bonus: 5%
    (Bright Boots : Unique) Level Req: 5, XP Bonus: 8%
    (Audacity : Legendary) Level Req: 9, XP Bonus: 13%
    (Ado Saki : Rare) Level Req: 20, XP Bonus: 16%
    (Adigard's Snowshoes : Rare) Level Req: 30, XP Bonus: 16%
    (Oxford : Unique) Level Req: 35, XP Bonus: 16%
    (Galloping Spurs : Fabled) Level Req: 40, XP Bonus: 20%
    (Seven-League Boots : Legendary) Level Req: 44, XP Bonus: 20%
    (Durum's Journey : Rare) Level Req: 48, XP Bonus: 20%
    (Bad Wolf : Legendary) Level Req: 60, XP Bonus: 42%
    (Pin : Rare) Level Req: 6, XP Bonus: 9%
    (Iron Knuckle : Legendary) Level Req: 15, XP Bonus: 10%
    (Someone Else's Knife : Rare) Level Req: 19, XP Bonus: 13%
    (Abolition : Legendary) Level Req: 32, XP Bonus: 22%
    (Influence : Legendary) Level Req: 38, XP Bonus: 25%
    (Alizarin : Legendary) Level Req: 89, XP Bonus: 30%
    (Wybel Tooth Dagger : Rare) Level Req: 90, XP Bonus: 39%
    (Quartzite Wand : Unique) Level Req: 1, XP Bonus: 5%
    (Paradise : Rare) Level Req: 2, XP Bonus: 7%
    (Detlas' Stick : Unique) Level Req: 7, XP Bonus: 8%
    (Clock Stick : Unique) Level Req: 9, XP Bonus: 10%
    (Reticence : Legendary) Level Req: 18, XP Bonus: 20%
    (Tempo Ticker : Legendary) Level Req: 35, XP Bonus: 20%
    (Clunderthap : Rare) Level Req: 39, XP Bonus: 20%
    (Sage : Legendary) Level Req: 47, XP Bonus: 42%
    (Refined Bow : Unique) Level Req: 1, XP Bonus: 5%
    (Tormenter : Unique) Level Req: 6, XP Bonus: 7%
    (Breeze : Unique) Level Req: 7, XP Bonus: 7%
    (Nemract's Bow : Unique) Level Req: 7, XP Bonus: 7%
    (Crackshot : Legendary) Level Req: 11, XP Bonus: 20%
    (Tempo Trebuchet : Legendary) Level Req: 35, XP Bonus: 20%
    (Tourmaline Lyre : Unique) Level Req: 41, XP Bonus: 20%
    (Crafted Gem : Unique) Level Req: 44, XP Bonus: 20%
    (Air Relic Bow : Rare) Level Req: 50, XP Bonus: 20%
    (Fire Relic Bow : Rare) Level Req: 50, XP Bonus: 20%
    (Earth Relic Bow : Rare) Level Req: 50, XP Bonus: 20%
    (Relic Bow : Rare) Level Req: 50, XP Bonus: 20%
    (Thunder Relic Bow : Rare) Level Req: 50, XP Bonus: 20%
    (Water Relic Bow : Rare) Level Req: 50, XP Bonus: 20%
    (Joyous : Unique) Level Req: 55, XP Bonus: 33%
    (Wybel Fluff Bow : Rare) Level Req: 90, XP Bonus: 39%
    (Maltic's Old Spear : Legendary) Level Req: 7, XP Bonus: 13%
    (Clash Hook : Legendary) Level Req: 13, XP Bonus: 13%
    (Cross : Unique) Level Req: 28, XP Bonus: 13%
    (Tempo Trident : Legendary) Level Req: 35, XP Bonus: 20%
    (Hillich : Rare) Level Req: 45, XP Bonus: 20%
    (Absorption : Unique) Level Req: 57, XP Bonus: 20%
    (Demon Seeker : Rare) Level Req: 59, XP Bonus: 26%
    (Broken Cross : Unique) Level Req: 62, XP Bonus: 26%
    (Gungnir : Rare) Level Req: 76, XP Bonus: 33%
    (Wybel Horn Spear : Rare) Level Req: 90, XP Bonus: 39%
    (Bumblebee : Unique) Level Req: 2, XP Bonus: 8%
    (The Out : Unique) Level Req: 5, XP Bonus: 8%
    (Spiritual Siphoner : Unique) Level Req: 10, XP Bonus: 8%
    (Stress : Rare) Level Req: 14, XP Bonus: 39%
    (Wybel Carved Relik : Rare) Level Req: 90, XP Bonus: 39%
    (Rarity : Legendary) Level Req: 1, XP Bonus: 16%
    (Secret : Unique) Level Req: 1, XP Bonus: 7%
    (Laen's Curiosity : Rare) Level Req: 25, XP Bonus: 10%
    (Union : Rare) Level Req: 39, XP Bonus: 10%
    (Binding Brace : Legendary) Level Req: 50, XP Bonus: 13%
    (Dragon's Eye Bracelet : Fabled) Level Req: 60, XP Bonus: 13%
    (Homeorhesis : Fabled) Level Req: 60, XP Bonus: 13%
    (Rayshyroth's Knowledge : Rare) Level Req: 66, XP Bonus: 16%
    (Double Vision : Fabled) Level Req: 79, XP Bonus: 22%
    (Knucklebones : Legendary) Level Req: 99, XP Bonus: 33%
    (Swift : Rare) Level Req: 4, XP Bonus: 4%
    (Seedling : Unique) Level Req: 5, XP Bonus: 4%
    (Beauty : Unique) Level Req: 6, XP Bonus: 5%
    (Travel Charm : Unique) Level Req: 10, XP Bonus: 7%
    (Witherhead's Talisman : Legendary) Level Req: 12, XP Bonus: 8%
    (Dark Diadem : Rare) Level Req: 24, XP Bonus: 8%
    (Durum's Serenity : Legendary) Level Req: 25, XP Bonus: 13%
    (Constrict Collar : Rare) Level Req: 45, XP Bonus: 20%
    (Hexed Amulet : Legendary) Level Req: 51, XP Bonus: 21%
    (Altum Spatium : Legendary) Level Req: 80, XP Bonus: 25%
     
  2. Endistic

    Endistic Acolyte Enjoyer HERO

    Messages:
    725
    Likes Received:
    1,301
    Trophy Points:
    146
    Guild:
    Minecraft:
    checked it out, this is pretty cool
    ig the xp meta is still relatyively similar but has had quite a few changes
     
    LtNifty likes this.
Thread Status:
Not open for further replies.