diff --git a/.clang-format b/.clang-format index 2e0a78842d6..de45e1b2e7a 100644 --- a/.clang-format +++ b/.clang-format @@ -24,12 +24,13 @@ AlwaysBreakBeforeMultilineStrings: false AlwaysBreakTemplateDeclarations: MultiLine BinPackArguments: true BinPackParameters: true +BreakBeforeBraces: Custom BraceWrapping: AfterCaseLabel: false AfterClass: false AfterControlStatement: false AfterEnum: false - AfterFunction: true + AfterFunction: false AfterNamespace: false AfterObjCDeclaration: false AfterStruct: false @@ -42,7 +43,6 @@ BraceWrapping: SplitEmptyRecord: true SplitEmptyNamespace: true BreakBeforeBinaryOperators: All -BreakBeforeBraces: Attach BreakBeforeInheritanceComma: false BreakInheritanceList: BeforeColon BreakBeforeTernaryOperators: true diff --git a/.github/workflows/analysis-sonarcloud.yml b/.github/workflows/analysis-sonarcloud.yml index 1b75d085097..d742af72625 100644 --- a/.github/workflows/analysis-sonarcloud.yml +++ b/.github/workflows/analysis-sonarcloud.yml @@ -2,9 +2,8 @@ name: Analysis - SonarCloud on: - pull_request: - types: [opened, synchronize, reopened, ready_for_review] - branches-ignore: + push: + branches: - main paths: - "src/**" @@ -22,14 +21,6 @@ jobs: steps: - uses: actions/checkout@v3 - if: ${{ github.event_name == 'pull_request' || github.event_name == 'pull_request_target' }} - with: - fetch-depth: 0 - ref: ${{github.event.pull_request.head.ref}} - repository: ${{github.event.pull_request.head.repo.full_name}} - - - uses: actions/checkout@v3 - if: ${{ github.event_name == 'push' }} with: fetch-depth: 0 @@ -75,20 +66,7 @@ jobs: mkdir -p build cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_BUILD_TYPE=Debug -DCMAKE_TOOLCHAIN_FILE="$VCPKG_ROOT/scripts/buildsystems/vcpkg.cmake" -DOPTIONS_ENABLE_CCACHE=ON -DSPEED_UP_BUILD_UNITY=OFF -S . -B build - - name: Run PR sonar-scanner - if: ${{ github.event_name == 'pull_request' || github.event_name == 'pull_request_target' }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - run: | - sonar-scanner \ - --define sonar.cfamily.compile-commands=build/compile_commands.json \ - --define sonar.pullrequest.key=${{ github.event.pull_request.number }} \ - --define sonar.pullrequest.branch=${{ github.event.pull_request.head.ref }} \ - --define sonar.pullrequest.base=${{ github.event.pull_request.base_ref }} - - name: Run sonar-scanner - if: ${{ github.event_name == 'push' }} env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} diff --git a/.github/workflows/build-windows-solution.yml b/.github/workflows/build-windows-solution.yml index 4b2f5fb306c..f662fa91607 100644 --- a/.github/workflows/build-windows-solution.yml +++ b/.github/workflows/build-windows-solution.yml @@ -53,10 +53,14 @@ jobs: - name: Install vcpkg run: | + $vcpkgJson = Get-Content .\vcpkg.json -Raw | ConvertFrom-Json + $vcpkgCommitId = $vcpkgJson.'builtin-baseline'.Trim() + Write-Host "vcpkg commit ID: $vcpkgCommitId" git clone https://github.com/Microsoft/vcpkg.git cd vcpkg - ./bootstrap-vcpkg.bat - ./vcpkg integrate install + git checkout $vcpkgCommitId + .\bootstrap-vcpkg.bat + .\vcpkg integrate install - name: Print useful paths run: | diff --git a/.gitignore b/.gitignore index aae56bd35a9..d233ae17409 100644 --- a/.gitignore +++ b/.gitignore @@ -372,12 +372,15 @@ config.lua config_canary.lua client_assertions.txt .env +otservbr.otbm +canary.otbm +otservbr-custom.otbm + # Extensions *.ini *.otb *.exe *.manifest -*.otbm *.rar *-house.xml *-monster.xml diff --git a/README.md b/README.md index fd632b2c067..119850ea7ea 100644 --- a/README.md +++ b/README.md @@ -98,14 +98,6 @@ other open-source initiatives. JetBrains -## Project supported by [TNT Cloud](https://tntcloudbr.com.br/) - -Thanks for supporting our open-source project with your game cloud hosting services. - - - TNT Cloud - Game Hosting - - ### Partners [![Supported by OTServ Brasil](https://raw.githubusercontent.com/otbr/otserv-brasil/main/otbr.png)](https://forums.otserv.com.br) diff --git a/config.lua.dist b/config.lua.dist index e5188d15b65..a5bb3d73ca5 100644 --- a/config.lua.dist +++ b/config.lua.dist @@ -224,9 +224,6 @@ tibiadromeConcoctionTickType = "online" -- "online" | "experience" onlyPremiumAccount = false -- Customs --- NOTE: weatherRain = true, activates weather raining effects --- NOTE: thunderEffect = true, activates thunder effects --- NOTE: allConsoleLog = true, show all message logs -- NOTE: stashMoving = true, stow an container inside your stash -- NOTE: depotChest, the non-stackable items will be moved to the selected depot chest(I - XVIII). -- NOTE: autoBank = true, the dropped coins from monsters will be automatically deposited to your bank account. @@ -239,9 +236,9 @@ onlyPremiumAccount = false -- NOTE: teleportPlayerToVocationRoom will enable oressa to teleport player to his/her room vocation -- NOTE: toggleReceiveReward = true, will enable players to choose one of reward exercise weapon by command !reward -- NOTE: randomMonsterSpawn = true, will enable monsters from the same spawn to be randomized between them, thus making a variable hunt -weatherRain = false -thunderEffect = false -allConsoleLog = false +-- NOTE: enablePlayerPutItemInAmmoSlot = true, will enable players to put any items on ammo slot, more used in custom shopping system +-- NOTE: startStreakLevel will make a reward streak level for new players who never logged in +-- NOTE: if showLootsInBestiary is true, will cause all loots to be shown in the bestiary even if the player has not reached the required number of kills stashMoving = false depotChest = 4 autoLoot = false @@ -257,6 +254,9 @@ toggleReceiveReward = false randomMonsterSpawn = false lootPouchMaxLimit = 2000 storeInboxMaxLimit = 2000 +enablePlayerPutItemInAmmoSlot = false +startStreakLevel = 0 +showLootsInBestiary = false -- Teleport summon -- Set to true will never remove the summon @@ -281,9 +281,11 @@ maxAllowedOnADummy = 1 -- Save interval per time -- NOTE: toggleSaveInterval: true = enable the save interval, false = disable the save interval +-- NOTE: toggleSaveAsync = true, will enable save async (experimental), not recommended for use in production -- NOTE: saveIntervalType: "minute", "second" or "hour" -- NOTE: toggleSaveIntervalCleanMap: true = enable the clean map, false = disable the clean map -- NOTE: saveIntervalTime: time based on what was set in "saveIntervalType" +toggleSaveAsync = false toggleSaveInterval = true saveIntervalType = "hour" toggleSaveIntervalCleanMap = true @@ -419,11 +421,18 @@ multiplierSpeedOnFist = 5 maxSpeedOnFist = 500 disableLegacyRaids = false disableMonsterArmor = false -combatChainDelay = 50 minElementalResistance = -200 maxElementalResistance = 200 maxDamageReflection = 200 +-- Chain system +toggleChainSystem = true +combatChainDelay = 50 +combatChainTargets = 5 +combatChainSkillFormulaAxe = 0.9 +combatChainSkillFormulaClub = 0.7 +combatChainSkillFormulaSword = 1.1 + -- Global server Save -- NOTE: globalServerSaveNotifyDuration in minutes globalServerSaveNotifyMessage = true diff --git a/data-canary/monster/demons/fury.lua b/data-canary/monster/demons/fury.lua index 7c1946d7991..cdaad15cf8f 100644 --- a/data-canary/monster/demons/fury.lua +++ b/data-canary/monster/demons/fury.lua @@ -7,9 +7,9 @@ monster.outfit = { lookType = 149, lookHead = 94, lookBody = 77, - lookLegs = 96, - lookFeet = 0, - lookAddons = 3, + lookLegs = 78, + lookFeet = 79, + lookAddons = 1, lookMount = 0, } @@ -23,8 +23,8 @@ monster.Bestiary = { CharmsPoints = 50, Stars = 4, Occurrence = 0, - Locations = "Pits of Inferno (Apocalypse's Throne Room), The Inquisition Quest \z - (The Shadow Nexus, Battlefield), Vengoth, Fury Dungeon, Oramond Fury Dungeon, The Extension Site.", + Locations = "Pits of Inferno (Apocalypse's Throne Room), The Inquisition Quest (The Shadow Nexus, Battlefield), \z + Vengoth, Fury Dungeon, Oramond Fury Dungeon, The Extension Site, Grounds of Destruction and Halls of Ascension.", } monster.health = 4100 @@ -50,7 +50,7 @@ monster.flags = { convinceable = false, pushable = false, rewardBoss = false, - illusionable = true, + illusionable = false, canPushItems = true, canPushCreatures = true, staticAttackChance = 70, @@ -59,9 +59,8 @@ monster.flags = { healthHidden = false, isBlockable = false, canWalkOnEnergy = false, - canWalkOnFire = false, + canWalkOnFire = true, canWalkOnPoison = false, - pet = false, } monster.light = { @@ -80,40 +79,41 @@ monster.voices = { monster.loot = { { id = 3007, chance = 410 }, -- crystal ring - { id = 3031, chance = 30000, maxCount = 100 }, -- gold coin - { id = 3031, chance = 30000, maxCount = 100 }, -- gold coin - { id = 3031, chance = 38000, maxCount = 69 }, -- gold coin - { id = 3035, chance = 2800, maxCount = 4 }, -- platinum coin - { id = 3065, chance = 20000 }, -- terra rod - { id = 3364, chance = 130 }, -- golden legs - { id = 3554, chance = 790 }, -- steel boots - { id = 5021, chance = 1500, maxCount = 4 }, -- orichalcum pearl - { id = 5911, chance = 4000 }, -- red piece of cloth - { id = 5944, chance = 21500 }, -- soul orb - { id = 5944, chance = 50 }, -- soul orb + { name = "gold coin", chance = 30000, maxCount = 100 }, + { name = "gold coin", chance = 30000, maxCount = 100 }, + { name = "gold coin", chance = 38000, maxCount = 69 }, + { name = "platinum coin", chance = 2800, maxCount = 4 }, + { name = "terra rod", chance = 20000 }, + { name = "golden legs", chance = 130 }, + { name = "steel boots", chance = 790 }, + { name = "orichalcum pearl", chance = 1500, maxCount = 4 }, + { name = "red piece of cloth", chance = 4000 }, + { name = "soul orb", chance = 21500 }, + { name = "soul orb", chance = 50 }, { id = 6300, chance = 60 }, -- death ring - { id = 6499, chance = 22500 }, -- demonic essence - { id = 6558, chance = 35000, maxCount = 3 }, -- concentrated demonic blood - { id = 7404, chance = 660 }, -- assassin dagger - { id = 7456, chance = 2000 }, -- noble axe - { id = 239, chance = 10500 }, -- great health potion - { id = 8016, chance = 29280, maxCount = 4 }, -- jalapeno pepper + { name = "demonic essence", chance = 22500 }, + { name = "flask of demonic blood", chance = 35000, maxCount = 3 }, + { name = "assassin dagger", chance = 660 }, + { name = "noble axe", chance = 2000 }, + { name = "great health potion", chance = 10500 }, + { name = "jalapeno pepper", chance = 29280, maxCount = 4 }, } monster.attacks = { { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -510 }, { name = "combat", interval = 2000, chance = 10, type = COMBAT_FIREDAMAGE, minDamage = -200, maxDamage = -300, length = 8, spread = 3, effect = CONST_ME_EXPLOSIONAREA, target = false }, - { name = "combat", interval = 2000, chance = 5, type = COMBAT_DEATHDAMAGE, minDamage = -120, maxDamage = -700, length = 8, spread = 3, target = false }, - { name = "combat", interval = 2000, chance = 10, type = COMBAT_DEATHDAMAGE, minDamage = -120, maxDamage = -300, radius = 4, target = false }, - -- {name ="fury skill reducer", interval = 2000, chance = 5, target = false}, + { name = "combat", interval = 2000, chance = 5, type = COMBAT_DEATHDAMAGE, minDamage = -120, maxDamage = -700, length = 8, spread = 3, effect = CONST_ME_DRAWBLOOD, target = false }, + { name = "combat", interval = 2000, chance = 10, type = COMBAT_DEATHDAMAGE, minDamage = -120, maxDamage = -300, radius = 4, effect = CONST_ME_DRAWBLOOD, target = false }, + { name = "fury skill reducer", interval = 2000, chance = 5, target = false }, { name = "combat", interval = 2000, chance = 10, type = COMBAT_LIFEDRAIN, minDamage = -120, maxDamage = -300, radius = 3, effect = CONST_ME_HITAREA, target = false }, { name = "combat", interval = 2000, chance = 10, type = COMBAT_DEATHDAMAGE, minDamage = -125, maxDamage = -250, range = 7, shootEffect = CONST_ANI_SUDDENDEATH, effect = CONST_ME_SMALLCLOUDS, target = false }, - { name = "speed", interval = 2000, chance = 15, speedChange = -100, range = 7, shootEffect = CONST_ANI_SUDDENDEATH, effect = CONST_ME_SMALLCLOUDS, target = false, duration = 30000 }, + { name = "speed", interval = 2000, chance = 15, speedChange = -800, range = 7, shootEffect = CONST_ANI_SUDDENDEATH, effect = CONST_ME_SMALLCLOUDS, target = false, duration = 30000 }, } monster.defenses = { defense = 20, - armor = 20, + armor = 35, + mitigation = 1.32, { name = "speed", interval = 2000, chance = 15, speedChange = 800, effect = CONST_ME_MAGIC_RED, target = false, duration = 5000 }, } diff --git a/data-canary/monster/familiars/sorcerer_familiar.lua b/data-canary/monster/familiars/sorcerer_familiar.lua index d153a83af28..31d61dfbf28 100644 --- a/data-canary/monster/familiars/sorcerer_familiar.lua +++ b/data-canary/monster/familiars/sorcerer_familiar.lua @@ -66,8 +66,8 @@ monster.voices = { monster.loot = {} monster.attacks = { - { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -200 }, - { name = "combat", interval = 2000, chance = 25, type = COMBAT_LIFEDRAIN, minDamage = -90, maxDamage = -150, length = 2, spread = 0, target = false }, + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -280 }, + { name = "combat", interval = 2000, chance = 25, type = COMBAT_LIFEDRAIN, minDamage = -90, maxDamage = -150, length = 2, spread = 0, effect = CONST_ME_MAGIC_RED, target = false }, { name = "combat", interval = 2000, chance = 25, type = COMBAT_ENERGYDAMAGE, minDamage = -190, maxDamage = -210, length = 2, spread = 0, effect = CONST_ME_ENERGYHIT, target = false }, { name = "summon challenge", interval = 2000, chance = 40, target = false }, } diff --git a/data-canary/monster/magicals/frazzlemaw.lua b/data-canary/monster/magicals/frazzlemaw.lua index 366a39a1eab..4a87dce1e52 100644 --- a/data-canary/monster/magicals/frazzlemaw.lua +++ b/data-canary/monster/magicals/frazzlemaw.lua @@ -63,7 +63,6 @@ monster.flags = { canWalkOnEnergy = true, canWalkOnFire = true, canWalkOnPoison = true, - pet = false, } monster.light = { @@ -74,49 +73,49 @@ monster.light = { monster.voices = { interval = 5000, chance = 10, - { text = "Mwaaaahnducate youuuuuu *gurgle*, mwaaah!", yell = false }, { text = "Mwaaahgod! Overmwaaaaah! *gurgle*", yell = false }, - { text = "MMMWAHMWAHMWAHMWAAAAH!", yell = false }, + { text = "Mwaaaahnducate youuuuuu *gurgle*, mwaaah!", yell = false }, + { text = "MMMWAHMWAHMWAHMWAAAAH!", yell = true }, { text = "Mmmwhamwhamwhah, mwaaah!", yell = false }, } monster.loot = { - { id = 3031, chance = 100000, maxCount = 100 }, -- gold coin - { id = 3035, chance = 100000, maxCount = 7 }, -- platinum coin - { id = 3104, chance = 9500 }, -- banana skin - { id = 3110, chance = 10400 }, -- piece of iron - { id = 3111, chance = 10000 }, -- fishbone + { name = "gold coin", chance = 100000, maxCount = 100 }, + { name = "platinum coin", chance = 100000, maxCount = 7 }, + { name = "banana skin", chance = 9500 }, + { name = "piece of iron", chance = 10400 }, + { name = "fishbone", chance = 10000 }, { id = 3114, chance = 12680 }, -- skull { id = 3115, chance = 10000 }, -- bone { id = 3116, chance = 5500 }, -- big bone - { id = 3265, chance = 3200 }, -- two handed sword + { name = "two handed sword", chance = 3200 }, { id = 3578, chance = 6750, maxCount = 3 }, -- fish - { id = 3582, chance = 6000, maxCount = 2 }, -- ham - { id = 5880, chance = 3000 }, -- iron ore - { id = 5895, chance = 4700 }, -- fish fin - { id = 5925, chance = 5000 }, -- hardened bone + { name = "ham", chance = 6000, maxCount = 2 }, + { name = "iron ore", chance = 3000 }, + { name = "fish fin", chance = 4700 }, + { name = "hardened bone", chance = 5000 }, { id = 5951, chance = 10800 }, -- fish tail - { id = 7404, chance = 1000 }, -- assassin dagger - { id = 7407, chance = 2240 }, -- haunted blade - { id = 7418, chance = 1100 }, -- nightmare blade - { id = 238, chance = 15000, maxCount = 3 }, -- great mana potion - { id = 239, chance = 15000, maxCount = 2 }, -- great health potion - { id = 9058, chance = 2300 }, -- gold ingot - { id = 10389, chance = 1460 }, -- sai - { id = 16120, chance = 3000 }, -- violet crystal shard - { id = 16123, chance = 16000 }, -- brown crystal splinter - { id = 16126, chance = 7600 }, -- red crystal fragment + { name = "assassin dagger", chance = 1000 }, + { name = "haunted blade", chance = 2240 }, + { name = "nightmare blade", chance = 1100 }, + { name = "great mana potion", chance = 15000, maxCount = 3 }, + { name = "great health potion", chance = 15000, maxCount = 2 }, + { name = "gold ingot", chance = 2300 }, + { name = "sai", chance = 1460 }, + { name = "violet crystal shard", chance = 3000 }, + { name = "brown crystal splinter", chance = 16000 }, + { name = "red crystal fragment", chance = 7600 }, { id = 16279, chance = 10000 }, -- crystal rubbish - { id = 20062, chance = 450 }, -- cluster of solace - { id = 20198, chance = 18760 }, -- frazzle tongue - { id = 20199, chance = 16000 }, -- frazzle skin + { name = "cluster of solace", chance = 4450 }, + { name = "frazzle tongue", chance = 18760 }, + { name = "frazzle skin", chance = 16000 }, } monster.attacks = { { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -400 }, -- bleed - { name = "condition", type = CONDITION_BLEEDING, interval = 2000, chance = 10, minDamage = -300, maxDamage = -400, radius = 3, target = false }, - { name = "combat", interval = 2000, chance = 10, type = COMBAT_PHYSICALDAMAGE, minDamage = 0, maxDamage = -700, length = 5, spread = 3, effect = CONST_ME_EXPLOSIONAREA, target = false }, + { name = "condition", type = CONDITION_BLEEDING, interval = 2000, chance = 10, minDamage = -300, maxDamage = -400, radius = 3, effect = CONST_ME_DRAWBLOOD, target = false }, + { name = "combat", interval = 2000, chance = 10, type = COMBAT_LIFEDRAIN, minDamage = 0, maxDamage = -700, length = 5, spread = 0, effect = CONST_ME_EXPLOSIONAREA, target = false }, { name = "combat", interval = 2000, chance = 15, type = COMBAT_PHYSICALDAMAGE, minDamage = 0, maxDamage = -400, radius = 2, shootEffect = CONST_ANI_LARGEROCK, effect = CONST_ME_STONES, target = true }, { name = "speed", interval = 2000, chance = 15, speedChange = -600, radius = 5, effect = CONST_ME_MAGIC_RED, target = false, duration = 15000 }, { name = "combat", interval = 2000, chance = 10, type = COMBAT_MANADRAIN, minDamage = -80, maxDamage = -150, radius = 4, effect = CONST_ME_MAGIC_RED, target = false }, @@ -124,12 +123,13 @@ monster.attacks = { monster.defenses = { defense = 30, - armor = 30, + armor = 74, + mitigation = 2.31, { name = "combat", interval = 2000, chance = 15, type = COMBAT_HEALING, minDamage = 250, maxDamage = 425, effect = CONST_ME_HITBYPOISON, target = false }, } monster.elements = { - { type = COMBAT_PHYSICALDAMAGE, percent = 10 }, + { type = COMBAT_PHYSICALDAMAGE, percent = 5 }, { type = COMBAT_ENERGYDAMAGE, percent = 15 }, { type = COMBAT_EARTHDAMAGE, percent = 20 }, { type = COMBAT_FIREDAMAGE, percent = 10 }, @@ -137,8 +137,8 @@ monster.elements = { { type = COMBAT_MANADRAIN, percent = 0 }, { type = COMBAT_DROWNDAMAGE, percent = 0 }, { type = COMBAT_ICEDAMAGE, percent = 5 }, - { type = COMBAT_HOLYDAMAGE, percent = -10 }, - { type = COMBAT_DEATHDAMAGE, percent = 15 }, + { type = COMBAT_HOLYDAMAGE, percent = -5 }, + { type = COMBAT_DEATHDAMAGE, percent = 10 }, } monster.immunities = { diff --git a/data-canary/scripts/actions/door/custom_door.lua b/data-canary/scripts/actions/door/custom_door.lua deleted file mode 100644 index 9fb649113a1..00000000000 --- a/data-canary/scripts/actions/door/custom_door.lua +++ /dev/null @@ -1,38 +0,0 @@ -local doorIds = {} -for index, value in ipairs(CustomDoorTable) do - if not table.contains(doorIds, value.openDoor) then - table.insert(doorIds, value.openDoor) - end - - if not table.contains(doorIds, value.closedDoor) then - table.insert(doorIds, value.closedDoor) - end -end - -local customDoor = Action() - -function customDoor.onUse(player, item, fromPosition, target, toPosition, isHotkey) - if Creature.checkCreatureInsideDoor(player, toPosition) then - return true - end - - for index, value in ipairs(CustomDoorTable) do - if value.closedDoor == item.itemid then - item:transform(value.openDoor) - return true - end - end - for index, value in ipairs(CustomDoorTable) do - if value.openDoor == item.itemid then - item:transform(value.closedDoor) - return true - end - end - return true -end - -for index, value in ipairs(doorIds) do - customDoor:id(value) -end - -customDoor:register() diff --git a/data-canary/scripts/actions/door/key_door.lua b/data-canary/scripts/actions/door/key_door.lua deleted file mode 100644 index 2eb8c7eb18a..00000000000 --- a/data-canary/scripts/actions/door/key_door.lua +++ /dev/null @@ -1,80 +0,0 @@ -local doorId = {} -local keyLockedDoor = {} -local keyUnlockedDoor = {} - -for index, value in ipairs(KeyDoorTable) do - if not table.contains(doorId, value.closedDoor) then - table.insert(doorId, value.closedDoor) - end - if not table.contains(doorId, value.lockedDoor) then - table.insert(doorId, value.lockedDoor) - end - if not table.contains(doorId, value.openDoor) then - table.insert(doorId, value.openDoor) - end - if not table.contains(keyLockedDoor, value.lockedDoor) then - table.insert(keyLockedDoor, value.lockedDoor) - end - if not table.contains(keyUnlockedDoor, value.closedDoor) then - table.insert(keyUnlockedDoor, value.closedDoor) - end -end - -for index, value in pairs(keysID) do - if not table.contains(doorId, value) then - table.insert(doorId, value) - end -end - -local keyDoor = Action() - -function keyDoor.onUse(player, item, fromPosition, target, toPosition, isHotkey) - -- It is locked msg - if table.contains(keyLockedDoor, item.itemid) or (table.contains(keyUnlockedDoor, item.itemid) and table.contains({ 1001, 101 }, item.actionid)) then - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "It is locked.") - return true - end - - -- onUse unlocked key door - for index, value in ipairs(KeyDoorTable) do - if value.closedDoor == item.itemid then - item:transform(value.openDoor) - return true - end - end - for index, value in ipairs(KeyDoorTable) do - if value.openDoor == item.itemid then - if Creature.checkCreatureInsideDoor(player, toPosition) then - return false - end - item:transform(value.closedDoor) - return true - end - end - - -- Key use on door (locked key door) - if target.actionid > 0 then - for index, value in ipairs(KeyDoorTable) do - if item.actionid ~= target.actionid and value.lockedDoor == target.itemid then - player:sendCancelMessage("The key does not match.") - return true - end - if item.actionid == target.actionid then - if value.lockedDoor == target.itemid then - target:transform(value.openDoor) - return true - elseif table.contains({ value.openDoor, value.closedDoor }, target.itemid) then - target:transform(value.lockedDoor) - return true - end - end - end - end - return player:sendCancelMessage(RETURNVALUE_CANNOTUSETHISOBJECT) -end - -for key, value in pairs(doorId) do - keyDoor:id(value) -end - -keyDoor:register() diff --git a/data-canary/scripts/actions/door/level_door.lua b/data-canary/scripts/actions/door/level_door.lua deleted file mode 100644 index 64d73d5c19b..00000000000 --- a/data-canary/scripts/actions/door/level_door.lua +++ /dev/null @@ -1,39 +0,0 @@ -local doorIds = {} - -for index, value in ipairs(LevelDoorTable) do - if not table.contains(doorIds, value.openDoor) then - table.insert(doorIds, value.openDoor) - end - - if not table.contains(doorIds, value.closedDoor) then - table.insert(doorIds, value.closedDoor) - end -end - -local levelDoor = Action() - -function levelDoor.onUse(player, item, fromPosition, target, toPosition, isHotkey) - for index, value in ipairs(LevelDoorTable) do - if value.closedDoor == item.itemid then - if item.actionid > 0 and player:getLevel() >= item.actionid - 1000 then - item:transform(value.openDoor) - player:teleportTo(toPosition, true) - return true - else - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Only the worthy may pass.") - return true - end - end - end - - if Creature.checkCreatureInsideDoor(player, toPosition) then - return true - end - return true -end - -for index, value in ipairs(doorIds) do - levelDoor:id(value) -end - -levelDoor:register() diff --git a/data-canary/scripts/actions/door/quest_door.lua b/data-canary/scripts/actions/door/quest_door.lua deleted file mode 100644 index a2f1e669424..00000000000 --- a/data-canary/scripts/actions/door/quest_door.lua +++ /dev/null @@ -1,39 +0,0 @@ -local doorIds = {} - -for index, value in ipairs(QuestDoorTable) do - if not table.contains(doorIds, value.openDoor) then - table.insert(doorIds, value.openDoor) - end - - if not table.contains(doorIds, value.closedDoor) then - table.insert(doorIds, value.closedDoor) - end -end - -local questDoor = Action() - -function questDoor.onUse(player, item, fromPosition, target, toPosition, isHotkey) - for index, value in ipairs(QuestDoorTable) do - if value.closedDoor == item.itemid then - if item.actionid > 0 and player:getStorageValue(item.actionid) ~= -1 then - item:transform(value.openDoor) - player:teleportTo(toPosition, true) - return true - else - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "The door seems to be sealed against unwanted intruders.") - return true - end - end - end - - if Creature.checkCreatureInsideDoor(player, toPosition) then - return true - end - return true -end - -for index, value in ipairs(doorIds) do - questDoor:id(value) -end - -questDoor:register() diff --git a/data-canary/scripts/actions/imbuement_shrine.lua b/data-canary/scripts/actions/objects/imbuement_shrine.lua similarity index 100% rename from data-canary/scripts/actions/imbuement_shrine.lua rename to data-canary/scripts/actions/objects/imbuement_shrine.lua diff --git a/data-canary/scripts/actions/worldboard.lua b/data-canary/scripts/actions/objects/world_board.lua similarity index 100% rename from data-canary/scripts/actions/worldboard.lua rename to data-canary/scripts/actions/objects/world_board.lua diff --git a/data-canary/scripts/actions/other/carpets.lua b/data-canary/scripts/actions/other/carpets.lua deleted file mode 100644 index aaa90026a22..00000000000 --- a/data-canary/scripts/actions/other/carpets.lua +++ /dev/null @@ -1,88 +0,0 @@ -local carpetItems = { - [22737] = 22736, - [22736] = 22737, -- Rift carpet - [23537] = 23536, - [23536] = 23537, -- Void carpet - [23431] = 23453, - [23453] = 23431, -- Yalaharian carpet - [23432] = 23454, - [23454] = 23432, -- White fur carpet - [23433] = 23455, - [23455] = 23433, -- Bamboo mat carpet - [23715] = 23707, - [23707] = 23715, -- Crimson carpet - [23710] = 23716, - [23716] = 23710, -- Azure carpet - [23711] = 23717, - [23717] = 23711, -- Emerald carpet - [23712] = 23718, - [23718] = 23712, -- Light parquet carpet - [23713] = 23719, - [23719] = 23713, -- Dark parquet carpet - [23714] = 23720, - [23720] = 23714, -- Marble floor - [24416] = 24424, - [24424] = 24416, -- Flowery carpet - [24417] = 24425, - [24425] = 24417, -- Colourful Carpet - [24418] = 24426, - [24426] = 24418, -- Striped carpet - [24419] = 24427, - [24427] = 24419, -- Fur carpet - [24420] = 24428, - [24428] = 24420, -- Diamond carpet - [24421] = 24429, - [24429] = 24421, -- Patterned carpet - [24422] = 24430, - [24430] = 24422, -- Night sky carpet - [24423] = 24431, - [24431] = 24423, -- Star carpet - [26114] = 26115, - [26115] = 26114, -- Verdant carpet - [26116] = 26117, - [26117] = 26116, -- Shaggy carpet - [26118] = 26119, - [26119] = 26118, -- Mystic carpet - [26120] = 26121, - [26121] = 26120, -- Stone tile - [26123] = 26122, - [26122] = 26123, -- Wooden plank - [26151] = 26150, - [26150] = 26151, -- Wheat carpet - [26152] = 26153, - [26153] = 26152, -- Crested carpet - [26154] = 26155, - [26155] = 26154, -- Decorated carpet -} - -local carpets = Action() - -function carpets.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local carpet = carpetItems[item.itemid] - if not carpet then - return false - end - local tile = Tile(item:getPosition()) - local carpetStack = 0 - for _, carpetId in pairs(carpetItems) do - carpetStack = carpetStack + tile:getItemCountById(carpetId) - end - if fromPosition.x == CONTAINER_POSITION then - player:sendTextMessage(MESSAGE_FAILURE, "Put the item on the floor first.") - return true - elseif not tile or not tile:getHouse() then - player:sendTextMessage(MESSAGE_FAILURE, "You may use this only inside a house.") - return true - elseif carpetStack > 1 then - player:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) - return true - end - item:transform(carpet) - return true -end - -for index, value in pairs(carpetItems) do - carpets:id(index) -end - -carpets:register() diff --git a/data-canary/scripts/actions/other/cask_kegs.lua b/data-canary/scripts/actions/other/cask_kegs.lua deleted file mode 100644 index f437840e3fa..00000000000 --- a/data-canary/scripts/actions/other/cask_kegs.lua +++ /dev/null @@ -1,69 +0,0 @@ -local targetIdList = { - --health potions casks - [25879] = { itemId = 285, transform = 266 }, -- Health Potion -- - [25880] = { itemId = 283, transform = 236 }, -- Strong Health -- - [25881] = { itemId = 284, transform = 239 }, -- Great Health -- - [25882] = { itemId = 284, transform = 7643 }, -- Ultimate Health -- - [25883] = { itemId = 284, transform = 23375 }, -- Supreme Health -- - --mana potions casks - [25889] = { itemId = 285, transform = 268 }, -- Mana Potion -- - [25890] = { itemId = 283, transform = 237 }, -- Strong Mana -- - [25891] = { itemId = 284, transform = 238 }, -- Great Mana -- - [25892] = { itemId = 284, transform = 23373 }, -- Ultimate Mana -- - --spirit potions caks - [25899] = { itemId = 284, transform = 7642 }, -- Great Spirit -- - [25900] = { itemId = 284, transform = 23374 }, --Ultimate Spirit -- - - --health potions kegs - [25903] = { itemId = 285, transform = 266 }, -- Health Potion -- - [25904] = { itemId = 283, transform = 236 }, -- Strong Health -- - [25905] = { itemId = 284, transform = 239 }, -- Great Health -- - [25906] = { itemId = 284, transform = 7643 }, -- Ultimate Health -- - [25907] = { itemId = 284, transform = 23375 }, -- Supreme Health -- - - --mana potion kegs - [25908] = { itemId = 285, transform = 268 }, -- Mana Potion -- - [25909] = { itemId = 283, transform = 237 }, -- Strong Mana -- - [25910] = { itemId = 284, transform = 238 }, -- Great Mana -- - [25911] = { itemId = 284, transform = 23373 }, -- Ultimate Mana -- - - --spirit potions kegs - [25913] = { itemId = 284, transform = 7642 }, -- Great Spirit -- - [25914] = { itemId = 284, transform = 23374 }, --Ultimate Spirit -- -} - -local flasks = Action() - -function flasks.onUse(player, item, fromPosition, target, toPosition, isHotkey) - if not target or not target:getItem() then - return false - end - - local charges = target:getCharges() - local itemCount = item:getCount() - if itemCount > charges then - itemCount = charges - end - - local targetId = targetIdList[target:getId()] - if targetId and item:getId() == targetId.itemId and charges > 0 then - local potMath = item:getCount() - itemCount - local parent = item:getParent() - if not (parent:isContainer() and parent:addItem(item:getId(), potMath)) then - player:addItem(item:getId(), potMath, true) - end - - item:transform(targetId.transform, itemCount) - charges = charges - itemCount - target:transform(target:getId(), charges) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, string.format("Remaining %s charges.", charges)) - if charges == 0 then - target:remove() - end - return true - end - return false -end - -flasks:id(283, 284, 285) -flasks:register() diff --git a/data-canary/scripts/actions/other/change_gold.lua b/data-canary/scripts/actions/other/change_gold.lua deleted file mode 100644 index dc44b081d3a..00000000000 --- a/data-canary/scripts/actions/other/change_gold.lua +++ /dev/null @@ -1,27 +0,0 @@ -local goldCoins = { - [3031] = { changeTo = 3035 }, - [3035] = { changeBack = 3031, changeTo = 3043 }, - [3043] = { changeBack = 3035 }, -} - -local changeGold = Action() - -function changeGold.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local coin = goldCoins[item:getId()] - if coin.changeTo and item.type == 100 then - item:remove() - player:addItem(coin.changeTo, 1) - elseif coin.changeBack then - item:remove(1) - player:addItem(coin.changeBack, 100) - else - return false - end - return true -end - -for index, value in pairs(goldCoins) do - changeGold:id(index) -end - -changeGold:register() diff --git a/data-canary/scripts/actions/other/costume_bag.lua b/data-canary/scripts/actions/other/costume_bag.lua deleted file mode 100644 index e67b8817c3d..00000000000 --- a/data-canary/scripts/actions/other/costume_bag.lua +++ /dev/null @@ -1,45 +0,0 @@ -local setting = { - -- Common - [653] = { - "orc warrior", - "pirate cutthroat", - "dworc voodoomaster", - "dwarf guard", - "minotaur mage", - }, - -- Uncommon - [654] = { - "quara hydromancer", - "diabolic imp", - "banshee", - "frost giant", - "lich", - }, - -- Deluxe - [655] = { - "serpent spawn", - "demon", - "juggernaut", - "behemoth", - "ashmunrah", - }, -} - -local costumeBag = Action() - -function costumeBag.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local creatures = setting[item.itemid] - if not creatures then - return true - end - player:setMonsterOutfit(creatures[math.random(#creatures)], 5 * 60 * 10 * 1000) - item:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) - item:remove() - return true -end - -for index, value in pairs(setting) do - costumeBag:id(index) -end - -costumeBag:register() diff --git a/data-canary/scripts/actions/other/die.lua b/data-canary/scripts/actions/other/die.lua deleted file mode 100644 index e7bc7316e9a..00000000000 --- a/data-canary/scripts/actions/other/die.lua +++ /dev/null @@ -1,23 +0,0 @@ -local die = Action() - -function die.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local position = item:getPosition() - local value = math.random(1, 6) - local isInGhostMode = player:isInGhostMode() - - position:sendMagicEffect(CONST_ME_CRAPS, isInGhostMode and player) - - local spectators = Game.getSpectators(position, false, true, 3, 3) - for _, spectator in ipairs(spectators) do - player:say(player:getName() .. " rolled a " .. value .. ".", TALKTYPE_MONSTER_SAY, isInGhostMode, spectator, position) - end - - item:transform(5791 + value) - return true -end - -for items = 5792, 5797 do - die:id(items) -end - -die:register() diff --git a/data-canary/scripts/actions/other/exercise_training.lua b/data-canary/scripts/actions/other/exercise_training.lua deleted file mode 100644 index 82d13962100..00000000000 --- a/data-canary/scripts/actions/other/exercise_training.lua +++ /dev/null @@ -1,66 +0,0 @@ -local exerciseTraining = Action() - -function exerciseTraining.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local playerId = player:getId() - local targetId = target:getId() - - if target:isItem() and (table.contains(HouseDummies, targetId) or table.contains(FreeDummies, targetId)) then - if _G.OnExerciseTraining[playerId] then - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "This exercise dummy can only be used after a 30 second cooldown.") - LeaveTraining(playerId) - return true - end - - local playerPos = player:getPosition() - if not ExerciseWeaponsTable[item.itemid].allowFarUse and (playerPos:getDistance(target:getPosition()) > 1) then - player:sendTextMessage(MESSAGE_FAILURE, "Get closer to the dummy.") - return true - end - - if not playerPos:isProtectionZoneTile() then - player:sendTextMessage(MESSAGE_FAILURE, "You need to be in a protection zone.") - return true - end - - local targetPos = target:getPosition() - - if table.contains(HouseDummies, targetId) then - local playersOnDummy = 0 - for _, playerTraining in pairs(_G.OnExerciseTraining) do - if playerTraining.dummyPos == targetPos then - playersOnDummy = playersOnDummy + 1 - end - - if playersOnDummy == MaxAllowedOnADummy then - player:sendTextMessage(MESSAGE_FAILURE, "That exercise dummy is busy.") - return true - end - end - end - - local hasExhaustion = player:kv():get("training-exhaustion") or 0 - if hasExhaustion > os.time() then - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "This exercise dummy can only be used after a 30 second cooldown.") - return true - end - - _G.OnExerciseTraining[playerId] = {} - if not _G.OnExerciseTraining[playerId].event then - _G.OnExerciseTraining[playerId].event = addEvent(ExerciseEvent, 0, playerId, targetPos, item.itemid, targetId) - _G.OnExerciseTraining[playerId].dummyPos = targetPos - player:setTraining(true) - player:kv():set("training-exhaustion", os.time() + 30) - end - return true - end - return false -end - -for weaponId, weapon in pairs(ExerciseWeaponsTable) do - exerciseTraining:id(weaponId) - if weapon.allowFarUse then - exerciseTraining:allowFarUse(true) - end -end - -exerciseTraining:register() diff --git a/data-canary/scripts/actions/other/fireworks_rocket.lua b/data-canary/scripts/actions/other/fireworks_rocket.lua deleted file mode 100644 index a9bd16393e8..00000000000 --- a/data-canary/scripts/actions/other/fireworks_rocket.lua +++ /dev/null @@ -1,18 +0,0 @@ -local fireworksRocket = Action() - -function fireworksRocket.onUse(player, item, fromPosition, target, toPosition, isHotkey) - if fromPosition.x ~= CONTAINER_POSITION then - fromPosition:sendMagicEffect(math.random(CONST_ME_FIREWORK_YELLOW, CONST_ME_FIREWORK_BLUE)) - else - local position = player:getPosition() - position:sendMagicEffect(CONST_ME_HITBYFIRE) - position:sendMagicEffect(CONST_ME_EXPLOSIONAREA) - player:say("Ouch! Rather place it on the ground next time.", TALKTYPE_MONSTER_SAY) - player:addHealth(-10) - end - item:remove() - return true -end - -fireworksRocket:id(6576) -fireworksRocket:register() diff --git a/data-canary/scripts/actions/other/food.lua b/data-canary/scripts/actions/other/food.lua deleted file mode 100644 index fcf05eefd52..00000000000 --- a/data-canary/scripts/actions/other/food.lua +++ /dev/null @@ -1,132 +0,0 @@ -local setting = { - --[itemid] = {foodvalue, saytext} - [169] = { 9, "Urgh." }, -- scarab cheese - [836] = { 4, "Crunch." }, -- walnut - [841] = { 4, "Crunch." }, -- peanut - [901] = { 60, "Munch." }, -- marlin - [3250] = { 5, "Crunch." }, -- carrot - [3577] = { 15, "Munch." }, -- meat - [3578] = { 12, "Munch." }, -- fish - [3579] = { 10, "Mmmm." }, -- salmon - [3580] = { 17, "Munch." }, -- northern pike - [3581] = { 4, "Gulp." }, -- shrimp - [3582] = { 30, "Chomp." }, -- ham - [3583] = { 60, "Chomp." }, -- dragon ham - [3584] = { 5, "Yum." }, -- pear - [3585] = { 6, "Yum." }, -- red apple - [3586] = { 13, "Yum." }, -- orange - [3587] = { 8, "Yum." }, -- banana - [3588] = { 1, "Yum." }, -- blueberry - [3589] = { 18, "Slurp." }, -- coconut - [3590] = { 1, "Yum." }, -- cherry - [3591] = { 2, "Yum." }, -- strawberry - [3592] = { 9, "Yum." }, -- grapes - [3593] = { 20, "Yum." }, -- melon - [3594] = { 17, "Munch." }, -- pumpkin - [3595] = { 5, "Crunch." }, -- carrot - [3596] = { 6, "Munch." }, -- tomato - [3597] = { 9, "Crunch." }, -- corncob - [3598] = { 2, "Crunch." }, -- cookie - [3599] = { 2, "Munch." }, -- candy cane - [3600] = { 10, "Crunch." }, -- bread - [3601] = { 3, "Crunch." }, -- roll - [3602] = { 8, "Crunch." }, -- brown bread - [3606] = { 6, "Gulp." }, -- egg - [3607] = { 9, "Smack." }, -- cheese - [3723] = { 9, "Munch." }, -- white mushroom - [3724] = { 4, "Munch." }, -- red mushroom - [3725] = { 22, "Munch." }, -- brown mushroom - [3726] = { 30, "Munch." }, -- orange mushroom - [3727] = { 9, "Munch." }, -- wood mushroom - [3728] = { 6, "Munch." }, -- dark mushroom - [3729] = { 12, "Munch." }, -- some mushrooms - [3730] = { 3, "Munch." }, -- some mushrooms - [3731] = { 36, "Munch." }, -- fire mushroom - [3732] = { 5, "Munch." }, -- green mushroom - [5096] = { 4, "Yum." }, -- mango - [6125] = { 8, "Gulp." }, -- tortoise egg - [6277] = { 10, "Mmmm." }, -- cake - [6278] = { 15, "Mmmm." }, -- decorated cake - [6392] = { 12, "Mmmm." }, -- valentine's cake - [6393] = { 15, "Mmmm." }, -- cream cake - [6500] = { 20, "Mmmm." }, -- gingerbread man - [6541] = { 6, "Gulp." }, -- coloured egg (yellow) - [6542] = { 6, "Gulp." }, -- coloured egg (red) - [6543] = { 6, "Gulp." }, -- coloured egg (blue) - [6544] = { 6, "Gulp." }, -- coloured egg (green) - [6545] = { 6, "Gulp." }, -- coloured egg (purple) - [6569] = { 1, "Mmmm." }, -- candy - [6574] = { 5, "Mmmm." }, -- bar of chocolate - [7158] = { 15, "Munch." }, -- rainbow trout - [7159] = { 13, "Munch." }, -- green perch - [7372] = { 2, "Yum." }, -- ice cream cone (crispy chocolate chips) - [7373] = { 2, "Yum." }, -- ice cream cone (velvet vanilla) - [7374] = { 2, "Yum." }, -- ice cream cone (sweet strawberry) - [7375] = { 2, "Yum." }, -- ice cream cone (chilly cherry) - [7376] = { 2, "Yum." }, -- ice cream cone (mellow melon) - [7377] = { 2, "Yum." }, -- ice cream cone (blue-barian) - [8010] = { 10, "Gulp." }, -- potato - [8011] = { 5, "Yum." }, -- plum - [8012] = { 1, "Yum." }, -- raspberry - [8013] = { 1, "Urgh." }, -- lemon - [8014] = { 7, "Munch." }, -- cucumber - [8015] = { 5, "Crunch." }, -- onion - [8016] = { 1, "Gulp." }, -- jalapeño pepper - [8017] = { 5, "Munch." }, -- beetroot - [8018] = { 11, "Yum." }, -- chocolate cake - [8019] = { 7, "Slurp." }, -- yummy gummy worm - [8197] = { 5, "Crunch." }, -- bulb of garlic - [9083] = { 0, "Slurp." }, -- banana chocolate shake - [9537] = { 0, "Your head begins to feel better." }, -- headache pill - [10329] = { 15, "Yum." }, -- rice ball - [10453] = { 3, "Urgh." }, -- terramite eggs - [10219] = { 10, "Mmmm." }, -- crocodile steak - [11459] = { 20, "Yum." }, -- pineapple - [11460] = { 10, "Munch." }, -- aubergine - [11461] = { 8, "Crunch." }, -- broccoli - [11462] = { 9, "Crunch." }, -- cauliflower - [11681] = { 55, "Gulp." }, -- ectoplasmic sushi - [11682] = { 18, "Yum." }, -- dragonfruit - [11683] = { 2, "Munch." }, -- peas - [12310] = { 20, "Crunch." }, -- haunch of boar - [13992] = { 55, "Munch." }, -- sandfish - [14084] = { 14, "Urgh." }, -- larvae - [14085] = { 15, "Munch." }, -- deepling filet - [14681] = { 60, "Mmmm." }, -- anniversary cake - [16103] = { 33, "Munch." }, -- mushroom pie - [17457] = { 10, "Urgh." }, -- insectoid eggs - [17820] = { 15, "Smack." }, -- soft cheese - [17821] = { 12, "Smack." }, -- rat cheese - [22185] = { 12, "Yum." }, -- prickly pear - [22187] = { 60, "Chomp." }, -- roasted meat - [23535] = { 30, "Mmmm." }, -- energy bar - [23545] = { 18, "Mmmm." }, -- energy drink -} - -local food = Action() - -function food.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local itemFood = setting[item.itemid] - if not itemFood then - return false - end - - local condition = player:getCondition(CONDITION_REGENERATION, CONDITIONID_DEFAULT) - if condition and math.floor(condition:getTicks() / 1000 + (itemFood[1] * 12)) >= 1200 then - player:sendTextMessage(MESSAGE_FAILURE, "You are full.") - return true - end - - player:feed(itemFood[1] * 12) - player:say(itemFood[2], TALKTYPE_MONSTER_SAY) - item:remove(1) - player:updateSupplyTracker(item) - player:getPosition():sendSingleSoundEffect(SOUND_EFFECT_TYPE_ACTION_EAT, player:isInGhostMode() and nil or player) - return true -end - -for index, value in pairs(setting) do - food:id(index) -end - -food:register() diff --git a/data-canary/scripts/actions/other/potions.lua b/data-canary/scripts/actions/other/potions.lua deleted file mode 100644 index ced11a35518..00000000000 --- a/data-canary/scripts/actions/other/potions.lua +++ /dev/null @@ -1,216 +0,0 @@ -local berserk = Condition(CONDITION_ATTRIBUTES) -berserk:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) -berserk:setParameter(CONDITION_PARAM_SUBID, AttrSubId_JeanPierreMelee) -berserk:setParameter(CONDITION_PARAM_SKILL_MELEE, 5) -berserk:setParameter(CONDITION_PARAM_SKILL_SHIELD, -10) -berserk:setParameter(CONDITION_PARAM_BUFF_SPELL, true) - -local mastermind = Condition(CONDITION_ATTRIBUTES) -mastermind:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) -mastermind:setParameter(CONDITION_PARAM_SUBID, AttrSubId_JeanPierreMagic) -mastermind:setParameter(CONDITION_PARAM_STAT_MAGICPOINTS, 3) -mastermind:setParameter(CONDITION_PARAM_BUFF_SPELL, true) - -local bullseye = Condition(CONDITION_ATTRIBUTES) -bullseye:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) -bullseye:setParameter(CONDITION_PARAM_SUBID, AttrSubId_JeanPierreDistance) -bullseye:setParameter(CONDITION_PARAM_SKILL_DISTANCE, 5) -bullseye:setParameter(CONDITION_PARAM_SKILL_SHIELD, -10) -bullseye:setParameter(CONDITION_PARAM_BUFF_SPELL, true) - -local setting = { - [236] = { - health = { 250, 350 }, - vocations = { - VOCATION.BASE_ID.KNIGHT, - VOCATION.BASE_ID.PALADIN, - }, - level = 50, - flask = 283, - description = "Only knights and paladins of level 50 or above may drink this fluid.", - }, - [237] = { - mana = { 115, 185 }, - vocations = { - VOCATION.BASE_ID.SORCERER, - VOCATION.BASE_ID.DRUID, - VOCATION.BASE_ID.PALADIN, - }, - level = 50, - flask = 283, - description = "Only sorcerers, druids and paladins of level 50 or above may drink this fluid.", - }, - [238] = { - mana = { 150, 250 }, - vocations = { - VOCATION.BASE_ID.SORCERER, - VOCATION.BASE_ID.DRUID, - }, - level = 80, - flask = 284, - description = "Only druids and sorcerers of level 80 or above may drink this fluid.", - }, - [239] = { - health = { 425, 575 }, - vocations = { - VOCATION.BASE_ID.KNIGHT, - }, - level = 80, - flask = 284, - description = "Only knights of level 80 or above may drink this fluid.", - }, - [266] = { - health = { 125, 175 }, - flask = 285, - }, - [268] = { - mana = { 75, 125 }, - flask = 285, - }, - [6558] = { - transform = { - id = { 236, 237 }, - }, - effect = CONST_ME_DRAWBLOOD, - }, - [7439] = { - condition = berserk, - vocations = { - VOCATION.BASE_ID.KNIGHT, - }, - effect = CONST_ME_MAGIC_RED, - description = "Only knights may drink this potion.", - text = "You feel stronger.", - }, - [7440] = { - condition = mastermind, - vocations = { - VOCATION.BASE_ID.SORCERER, - VOCATION.BASE_ID.DRUID, - }, - effect = CONST_ME_MAGIC_BLUE, - description = "Only sorcerers and druids may drink this potion.", - text = "You feel smarter.", - }, - [7443] = { - condition = bullseye, - vocations = { - VOCATION.BASE_ID.PALADIN, - }, - effect = CONST_ME_MAGIC_GREEN, - description = "Only paladins may drink this potion.", - text = "You feel more accurate.", - }, - [7642] = { - health = { 250, 350 }, - mana = { 100, 200 }, - vocations = { - VOCATION.BASE_ID.PALADIN, - }, - level = 80, - flask = 284, - description = "Only paladins of level 80 or above may drink this fluid.", - }, - [7643] = { - health = { 650, 850 }, - vocations = { - VOCATION.BASE_ID.KNIGHT, - }, - level = 130, - flask = 284, - description = "Only knights of level 130 or above may drink this fluid.", - }, - [7644] = { - antidote = true, - flask = 285, - }, - [7876] = { - health = { 60, 90 }, - flask = 285, - }, - [23373] = { - mana = { 425, 575 }, - vocations = { - VOCATION.BASE_ID.SORCERER, - VOCATION.BASE_ID.DRUID, - }, - level = 130, - flask = 284, - description = "Only druids and sorcerers of level 130 or above may drink this fluid.", - }, - [23374] = { - health = { 420, 580 }, - mana = { 250, 350 }, - vocations = { - VOCATION.BASE_ID.PALADIN, - }, - level = 130, - flask = 284, - description = "Only paladins of level 130 or above may drink this fluid.", - }, - [23375] = { - health = { 875, 1125 }, - vocations = { - VOCATION.BASE_ID.KNIGHT, - }, - level = 200, - flask = 284, - description = "Only knights of level 200 or above may drink this fluid.", - }, -} - -local potions = Action() - -function potions.onUse(player, item, fromPosition, target, toPosition, isHotkey) - if not target or type(target) == "userdata" and not target:isPlayer() then - return false - end - - local potion = setting[item:getId()] - if potion.level and player:getLevel() < potion.level or potion.vocations and not table.contains(potion.vocations, player:getVocation():getBaseId()) then - player:say(potion.description, TALKTYPE_MONSTER_SAY) - return true - end - - if potion.condition then - player:addCondition(potion.condition) - player:say(potion.text, TALKTYPE_MONSTER_SAY) - player:getPosition():sendMagicEffect(potion.effect) - elseif potion.transform then - item:transform(potion.transform[math.random(#potion.transform)]) - item:getPosition():sendMagicEffect(potion.effect) - return true - else - if potion.health then - doTargetCombatHealth(player, target, COMBAT_HEALING, potion.health[1], potion.health[2]) - end - - if potion.mana then - doTargetCombatMana(0, target, potion.mana[1], potion.mana[2]) - end - - if potion.antidote then - target:removeCondition(CONDITION_POISON) - end - - player:addItem(potion.flask) - target:say("Aaaah...", TALKTYPE_MONSTER_SAY) - target:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) - end - - player:getPosition():sendSingleSoundEffect(SOUND_EFFECT_TYPE_ITEM_USE_POTION, player:isInGhostMode() and nil or player) - - if not configManager.getBoolean(configKeys.REMOVE_POTION_CHARGES) then - return true - end - - player:updateSupplyTracker(item) - item:remove(1) - return true -end - -for index, value in pairs(setting) do - potions:id(index) -end - -potions:register() diff --git a/data-canary/scripts/actions/other/scroll_of_ascension.lua b/data-canary/scripts/actions/other/scroll_of_ascension.lua deleted file mode 100644 index 6a598484591..00000000000 --- a/data-canary/scripts/actions/other/scroll_of_ascension.lua +++ /dev/null @@ -1,17 +0,0 @@ -local scrollOfAscencion = Action() - -function scrollOfAscencion.onUse(player, item, fromPosition, target, toPosition, isHotkey) - if math.random(10) > 1 then - player:setMonsterOutfit("Demon", 30 * 10 * 1000) - else - player:setMonsterOutfit("Ferumbras", 30 * 10 * 1000) - end - item:transform(22772) - item:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) - item:decay() - player:say("Magical sparks whirl around the scroll as you read it and then your appearance is changing.", TALKTYPE_MONSTER_SAY) - return true -end - -scrollOfAscencion:id(22771) -scrollOfAscencion:register() diff --git a/data-canary/scripts/actions/other/spellbook.lua b/data-canary/scripts/actions/other/spellbook.lua deleted file mode 100644 index 600f60a02e9..00000000000 --- a/data-canary/scripts/actions/other/spellbook.lua +++ /dev/null @@ -1,38 +0,0 @@ -local spellbook = Action() - -function spellbook.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local text = {} - local spells = {} - for _, spell in ipairs(player:getInstantSpells()) do - if spell.level ~= 0 then - if spell.manapercent > 0 then - spell.mana = spell.manapercent .. "%" - end - spells[#spells + 1] = spell - end - end - - table.sort(spells, function(a, b) - return a.level < b.level - end) - - local prevLevel = -1 - for i, spell in ipairs(spells) do - if prevLevel ~= spell.level then - if i == 1 then - text[#text == nil and 1 or #text + 1] = "Spells for Level " - else - text[#text + 1] = "\nSpells for Level " - end - text[#text + 1] = spell.level .. "\n" - prevLevel = spell.level - end - text[#text + 1] = spell.words .. " - " .. spell.name .. " : " .. spell.mana .. "\n" - end - - player:showTextDialog(item:getId(), table.concat(text)) - return true -end - -spellbook:id(3059, 6120, 8900, 8901, 8902, 8903, 8904, 8918, 14769, 16107, 20088, 20089, 20090, 21400) -spellbook:register() diff --git a/data-canary/scripts/actions/tools/magic_gold_converter.lua b/data-canary/scripts/actions/tools/magic_gold_converter.lua deleted file mode 100644 index 4ee89455451..00000000000 --- a/data-canary/scripts/actions/tools/magic_gold_converter.lua +++ /dev/null @@ -1,79 +0,0 @@ -local data = { - converterIds = { - [28525] = 28526, - [28526] = 28525, - }, - coins = { - [ITEM_GOLD_COIN] = ITEM_PLATINUM_COIN, - [ITEM_PLATINUM_COIN] = ITEM_CRYSTAL_COIN, - }, -} - -local function findItem(self, cylinder, converterItem) - if cylinder == 0 then - cylinder = self:getSlotItem(CONST_SLOT_BACKPACK) - findItem(self, self:getStoreInbox(), converterItem) - end - - if cylinder and cylinder:isContainer() then - for i = 0, cylinder:getSize() - 1 do - local item = cylinder:getItem(i) - if item:isContainer() then - if findItem(self, Container(item.uid), converterItem) then - -- Breaks the recursion from going into the next items in this cylinder - return true - end - else - for fromid, toid in pairs(data.coins) do - if item:getId() == fromid and item:getCount() == 100 then - item:remove() - if not cylinder:addItem(toid, 1) then - player:addItem(toid, 1) - end - - converterItem:setAttribute(ITEM_ATTRIBUTE_CHARGES, converterItem:getAttribute(ITEM_ATTRIBUTE_CHARGES) - 1) - return true - end - end - end - end - -- End of items in this cylinder, returning to parent cylinder or finishing iteration - return false - end -end - -local function startConversion(playerId, itemId) - local player = Player(playerId) - if player ~= nil then - local converting = addEvent(startConversion, 300, playerId, itemId) - local item = player:getItemById(itemId, true) - if player:getItemCount(itemId) >= 1 then - if item:hasAttribute(ITEM_ATTRIBUTE_CHARGES) then - local charges_n = item:getAttribute(ITEM_ATTRIBUTE_CHARGES) - if charges_n >= 1 then - if player:getItemCount(ITEM_GOLD_COIN) >= 100 or player:getItemCount(ITEM_PLATINUM_COIN) >= 100 then - findItem(player, 0, item) - end - else - item:remove(1) - stopEvent(converting) - end - end - else - stopEvent(converting) - end - end - return true -end - -local magicGoldConverter = Action() - -function magicGoldConverter.onUse(player, item, fromPosition, target, toPosition, isHotkey) - item:transform(data.converterIds[item.itemId]) - item:decay() - startConversion(player:getId(), 28526) - return true -end - -magicGoldConverter:id(28525, 28526) -magicGoldConverter:register() diff --git a/data-canary/scripts/actions/tools/rust_remover.lua b/data-canary/scripts/actions/tools/rust_remover.lua deleted file mode 100644 index 1f44a1fb715..00000000000 --- a/data-canary/scripts/actions/tools/rust_remover.lua +++ /dev/null @@ -1,128 +0,0 @@ -local config = { - [8894] = { -- Rusty Armor (Common) - [1] = { id = 3358, chance = 6994 }, -- Chain Armor - [2] = { id = 3377, chance = 3952 }, -- Scale Armor - [3] = { id = 3359, chance = 1502 }, -- Brass Armor - [4] = { id = 3357, chance = 197 }, -- Plate Armor - }, - [8895] = { -- Rusty Armor (Semi-rare) - [1] = { id = 3358, chance = 6437 }, -- Scale Armor - [2] = { id = 3358, chance = 4606 }, -- Chain Armor - [3] = { id = 3359, chance = 3029 }, -- Brass Armor - [4] = { id = 3357, chance = 1559 }, -- Plate Armor - [5] = { id = 3370, chance = 595 }, -- Knight Armor - [6] = { id = 8063, chance = 283 }, -- Paladin Armor - [7] = { id = 3381, chance = 49 }, -- Crown Armor - }, - [8896] = { -- Rusty Armor (Rare) - [1] = { id = 3359, chance = 6681 }, -- Brass Armor - [2] = { id = 3357, chance = 3767 }, -- Plate Armor - [3] = { id = 3370, chance = 1832 }, -- Knight Armor - [4] = { id = 3381, chance = 177 }, -- Crown Armor - [5] = { id = 8063, chance = 31 }, -- Paladin Armor - [6] = { id = 3360, chance = 10 }, -- Golden Armor - }, - [8897] = { -- Rusty Legs (Common) - [1] = { id = 3558, chance = 6949 }, -- Chain Legs - [2] = { id = 3362, chance = 3692 }, -- Studded Legs - [3] = { id = 3372, chance = 1307 }, -- Brass Legs - [4] = { id = 3557, chance = 133 }, -- Plate Legs - }, - [8898] = { -- Rusty Legs (Semi-Rare) - [1] = { id = 3362, chance = 5962 }, -- Studded Legs - [2] = { id = 3558, chance = 4037 }, -- Chain Legs - [3] = { id = 3372, chance = 2174 }, -- Brass Legs - [4] = { id = 3557, chance = 1242 }, -- Plate Legs - [5] = { id = 3371, chance = 186 }, -- Knight Legs - }, - [8899] = { -- Rusty Legs (Rare) - [1] = { id = 3372, chance = 6500 }, -- Brass Legs - [2] = { id = 3557, chance = 3800 }, -- Plate Legs - [3] = { id = 3371, chance = 200 }, -- Knight Legs - [4] = { id = 3382, chance = 52 }, -- Crown Legs - [5] = { id = 3364, chance = 30 }, -- Golden Legs - }, - [8900] = { -- Heavily Rusted Shield - }, - [8901] = { -- Rusted Shield - }, - [8902] = { -- Slightly Rusted Shield - [1] = { id = 3410, chance = 3137 }, -- Plate Shield - [2] = { id = 3432, chance = 2887 }, -- Ancient Shield - [3] = { id = 7460, chance = 929 }, -- Norse Shield - [4] = { id = 3419, chance = 23 }, -- Crown Shield - [5] = { id = 3434, chance = 10 }, -- Vampire Shield - }, - [8903] = { -- Heavily Rusted Boots - }, - [8904] = { -- Rusted Boots - }, - [8905] = { -- Slightly Rusted Boots - }, - [8906] = { -- Heavily Rusted Helmet - }, - [8907] = { -- Rusted Helmet - [1] = { id = 3354, chance = 2200 }, -- Brass Helmet - [2] = { id = 3376, chance = 1870 }, -- Studded Helmet - [3] = { id = 3353, chance = 1490 }, -- Iron Helmet - [4] = { id = 3351, chance = 1010 }, -- Steel Helmet - [5] = { id = 3385, chance = 190 }, -- Crown Helmet - [6] = { id = 3391, chance = 10 }, -- Crusader Helmet - }, - [8908] = { -- Slightly Rusted Helmet - [1] = { id = 3353, chance = 3156 }, -- Iron Helmet - [2] = { id = 3351, chance = 2976 }, -- Steel Helmet - [3] = { id = 3385, chance = 963 }, -- Crown Helmet - [4] = { id = 3391, chance = 210 }, -- Crusader Helmet - [5] = { id = 3392, chance = 7 }, -- Royal Helmet - }, -} - -local rustRemover = Action() - -function rustRemover.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local targetItem = config[target.itemid] - if not targetItem then - return true - end - - local randomChance = math.random(10000) - local index = false - - if targetItem[1].chance >= randomChance then -- implying first item in the table index always has the highest chance. - while not index do - randomIndex = math.random(#targetItem) - if targetItem[randomIndex].chance >= randomChance then - index = randomIndex - end - end - end - - if not index then - if table.contains({ 8894, 8895, 8896 }, target.itemid) then - msg = "The armor was already damaged so badly that it broke when you tried to clean it." - end - if table.contains({ 8897, 8898, 8899 }, target.itemid) then - msg = "The legs were already damaged so badly that they broke when you tried to clean them." - end - if table.contains({ 8900, 8901, 8902 }, target.itemid) then - msg = "The shield was already damaged so badly that it broke when you tried to clean it." - end - if table.contains({ 8903, 8904, 8905 }, target.itemid) then - msg = "The boots were already damaged so badly that they broke when you tried to clean them." - end - if table.contains({ 8906, 8907, 8908 }, target.itemid) then - msg = "The helmet was already damaged so badly that it broke when you tried to clean it." - end - player:say(msg, TALKTYPE_MONSTER_SAY) - target:getPosition():sendMagicEffect(CONST_ME_BLOCKHIT) - target:remove() - else - target:transform(targetItem[index].id) - target:getPosition():sendMagicEffect(CONST_ME_MAGIC_GREEN) - end - return item:remove(1) -end - -rustRemover:id(9016) -rustRemover:register() diff --git a/data-canary/scripts/actions/tools/toolgear.lua b/data-canary/scripts/actions/tools/toolgear.lua deleted file mode 100644 index c7dacca1968..00000000000 --- a/data-canary/scripts/actions/tools/toolgear.lua +++ /dev/null @@ -1,23 +0,0 @@ -local toolgear = Action() - -function toolgear.onUse(player, item, fromPosition, target, toPosition, isHotkey) - if math.random(100) > 5 then - return ActionsLib.useRope(player, item, fromPosition, target, toPosition, isHotkey) - or ActionsLib.useShovel(player, item, fromPosition, target, toPosition, isHotkey) - or ActionsLib.usePick(player, item, fromPosition, target, toPosition, isHotkey) - or ActionsLib.useMachete(player, item, fromPosition, target, toPosition, isHotkey) - or ActionsLib.useCrowbar(player, item, fromPosition, target, toPosition, isHotkey) - or ActionsLib.useSpoon(player, item, fromPosition, target, toPosition, isHotkey) - or ActionsLib.useScythe(player, item, fromPosition, target, toPosition, isHotkey) - or ActionsLib.useSickle(player, item, fromPosition, target, toPosition, isHotkey) - or ActionsLib.useKitchenKnife(player, item, fromPosition, target, toPosition, isHotkey) - else - player:say("Oh no! Your tool is jammed and can't be used for a minute.", TALKTYPE_MONSTER_SAY) - item:transform(item.itemid + 1) - item:decay() - end - return true -end - -toolgear:id(9594, 9596, 9598) -toolgear:register() diff --git a/data-canary/scripts/bestiary/charms.lua b/data-canary/scripts/bestiary/charms.lua deleted file mode 100644 index b6263e05572..00000000000 --- a/data-canary/scripts/bestiary/charms.lua +++ /dev/null @@ -1,285 +0,0 @@ -local charms = { - -- Wound charm - [1] = { - name = "Wound", - description = "Triggers on a creature with a certain chance and deals 5% \z - of its initial hit points as physical damage once.", - type = CHARM_OFFENSIVE, - damageType = COMBAT_PHYSICALDAMAGE, - percent = 5, - chance = 10, - messageCancel = "You wounded the monster.", - messageServerLog = "[Wound charm]", - effect = CONST_ME_HITAREA, - points = 600, - sounds = { - castSound = SOUND_EFFECT_TYPE_SPELL_BRUTAL_STRIKE, - }, - }, - -- Enflame charm - [2] = { - name = "Enflame", - description = "Triggers on a creature with a certain chance and deals 5% \z - of its initial hit points as fire damage once.", - type = CHARM_OFFENSIVE, - damageType = COMBAT_FIREDAMAGE, - percent = 5, - chance = 10, - messageCancel = "You enflamed the monster.", - messageServerLog = "[Enflame charm]", - effect = CONST_ME_HITBYFIRE, - points = 1000, - sounds = { - castSound = SOUND_EFFECT_TYPE_SPELL_FLAME_STRIKE, - }, - }, - -- Poison charm - [3] = { - name = "Poison", - description = "Triggers on a creature with a certain chance and deals 5% \z - of its initial hit points as earth damage once.", - type = CHARM_OFFENSIVE, - damageType = COMBAT_EARTHDAMAGE, - percent = 5, - chance = 10, - messageCancel = "You poisoned the monster.", - messageServerLog = "[Poison charm]", - effect = CONST_ME_GREEN_RINGS, - points = 600, - sounds = { - castSound = SOUND_EFFECT_TYPE_SPELL_TERRA_STRIKE, - }, - }, - -- Freeze charm - [4] = { - name = "Freeze", - description = "Triggers on a creature with a certain chance and deals 5% \z - of its initial hit points as ice damage once.", - type = CHARM_OFFENSIVE, - damageType = COMBAT_ICEDAMAGE, - percent = 5, - chance = 10, - messageCancel = "You frozen the monster.", - messageServerLog = "[Freeze charm]", - effect = CONST_ME_ICEATTACK, - points = 800, - sounds = { - castSound = SOUND_EFFECT_TYPE_SPELL_ICE_STRIKE, - }, - }, - --Zap charm - [5] = { - name = "Zap", - description = "Triggers on a creature with a certain chance and deals 5% \z - of its initial hit points as energy damage once.", - type = CHARM_OFFENSIVE, - damageType = COMBAT_ENERGYDAMAGE, - percent = 5, - chance = 10, - messageCancel = "You eletrocuted the monster.", - messageServerLog = "[Zap charm]", - effect = CONST_ME_ENERGYHIT, - points = 800, - sounds = { - castSound = SOUND_EFFECT_TYPE_SPELL_ENERGY_STRIKE, - }, - }, - --Curse charm - [6] = { - name = "Curse", - description = "Triggers on a creature with a certain chance and deals 5% \z - of its initial hit points as death damage once.", - type = CHARM_OFFENSIVE, - damageType = COMBAT_DEATHDAMAGE, - percent = 5, - chance = 10, - messageCancel = "You curse the monster.", - messageServerLog = "[Curse charm]", - effect = CONST_ME_SMALLCLOUDS, - points = 900, - sounds = { - castSound = SOUND_EFFECT_TYPE_SPELL_DEATH_STRIKE, - }, - }, - -- Cripple charm - [7] = { - name = "Cripple", - description = "Cripples the creature with a certain chance and paralyzes it for 10 seconds.", - type = CHARM_OFFENSIVE, - chance = 10, - messageCancel = "You cripple the monster.", - points = 500, - }, - -- Parry charm - [8] = { - name = "Parry", - description = "Any damage taken is reflected to the aggressor with a certain chance.", - type = CHARM_DEFENSIVE, - damageType = COMBAT_PHYSICALDAMAGE, - chance = 10, - messageCancel = "You parry the attack.", - messageServerLog = "[Parry charm]", - effect = CONST_ME_EXPLOSIONAREA, - points = 1000, - }, - -- Dodge charm - [9] = { - name = "Dodge", - description = "Dodges an attack with a certain chance without taking any damage at all.", - type = CHARM_DEFENSIVE, - chance = 10, - messageCancel = "You dodge the attack.", - effect = CONST_ME_POFF, - points = 600, - }, - -- Adrenaline burst charm - [10] = { - name = "Adrenaline Burst", - description = "Bursts of adrenaline enhance your reflexes with a certain chance \z - after you get hit and let you move faster for 10 seconds.", - type = CHARM_DEFENSIVE, - chance = 10, - messageCancel = "Your movements where bursted.", - points = 500, - }, - -- Numb charm - [11] = { - name = "Numb", - description = "Numbs the creature with a certain chance after its attack and paralyzes the creature for 10 seconds.", - type = CHARM_DEFENSIVE, - chance = 10, - messageCancel = "You numb the monster.", - points = 500, - }, - -- Cleanse charm - [12] = { - name = "Cleanse", - description = "Cleanses you from within with a certain chance after you get hit and \z - removes one random active negative status effect and temporarily makes you immune against it.", - type = CHARM_DEFENSIVE, - chance = 10, - messageCancel = "You purified the attack.", - points = 700, - }, - -- Bless charm - [13] = { - name = "Bless", - description = "Blesses you and reduces skill and xp loss by 10% when killed by the chosen creature.", - type = CHARM_PASSIVE, - percent = 10, - chance = 100, - points = 800, - sounds = { - castSound = SOUND_EFFECT_TYPE_SPELL_BRUTAL_STRIKE, - }, - }, - -- Scavenge charm - [14] = { - name = "Scavenge", - description = "Enhances your chances to successfully skin/dust a skinnable/dustable creature.", - type = CHARM_PASSIVE, - percent = 25, - points = 800, - sounds = { - castSound = SOUND_EFFECT_TYPE_SPELL_BRUTAL_STRIKE, - }, - }, - -- Gut charm - [15] = { - name = "Gut", - description = "Gutting the creature yields 20% more creature products.", - type = CHARM_PASSIVE, - percent = 20, - chance = 100, - points = 800, - }, - -- Low blow charm - [16] = { - name = "Low Blow", - description = "Adds 8% critical hit chance to attacks with critical hit weapons.", - type = CHARM_PASSIVE, - percent = 8, - chance = 100, - points = 2000, - sounds = { - castSound = SOUND_EFFECT_TYPE_SPELL_BRUTAL_STRIKE, - }, - }, - -- Divine wrath charm - [17] = { - name = "Divine Wrath", - description = "Triggers on a creature with a certain chance and deals 5% \z - of its initial hit points as holy damage once.", - type = CHARM_OFFENSIVE, - damageType = COMBAT_HOLYDAMAGE, - percent = 5, - chance = 10, - messageCancel = "You divine the monster.", - messageServerLog = "[Divine charm]", - effect = CONST_ME_HOLYDAMAGE, - points = 1500, - sounds = { - castSound = SOUND_EFFECT_TYPE_SPELL_HOLY_FLASH, - }, - }, - -- Vampiric embrace charm - [18] = { - name = "Vampiric Embrace", - description = "Adds 4% Life Leech to attacks if wearing equipment that provides life leech.", - type = CHARM_PASSIVE, - percent = 4, - chance = 100, - points = 1500, - }, - -- Void's call charm - [19] = { - name = "Void's Call", - description = "Adds 2% Mana Leech to attacks if wearing equipment that provides mana leech.", - type = CHARM_PASSIVE, - percent = 2, - chance = 100, - points = 1500, - }, -} - -for charmId, chamsTable in ipairs(charms) do - local charm = Game.createBestiaryCharm(charmId - 1) - local charmConfig = {} - - if chamsTable.name then - charmConfig.name = chamsTable.name - end - if chamsTable.description then - charmConfig.description = chamsTable.description - end - if chamsTable.sounds then - charmConfig.sounds = chamsTable.sounds - end - if chamsTable.type then - charmConfig.type = chamsTable.type - end - if chamsTable.damageType then - charmConfig.damageType = chamsTable.damageType - end - if chamsTable.percent then - charmConfig.percent = chamsTable.percent - end - if chamsTable.chance then - charmConfig.chance = chamsTable.chance - end - if chamsTable.messageCancel then - charmConfig.messageCancel = chamsTable.messageCancel - end - if chamsTable.messageServerLog then - charmConfig.messageServerLog = chamsTable.messageServerLog - end - if chamsTable.effect then - charmConfig.effect = chamsTable.effect - end - if chamsTable.points then - charmConfig.points = chamsTable.points - end - - -- Create charm and egister charmConfig table - charm:register(charmConfig) -end diff --git a/data-canary/scripts/creaturescripts/advance_save.lua b/data-canary/scripts/creaturescripts/advance_save.lua deleted file mode 100644 index 8bd6fd2fd06..00000000000 --- a/data-canary/scripts/creaturescripts/advance_save.lua +++ /dev/null @@ -1,32 +0,0 @@ -local config = { - heal = true, - save = true, - effect = false, -} - -local advanceSave = CreatureEvent("AdvanceSave") - -function advanceSave.onAdvance(player, skill, oldLevel, newLevel) - if skill ~= SKILL_LEVEL or newLevel <= oldLevel then - return true - end - - if config.effect then - player:getPosition():sendMagicEffect(math.random(CONST_ME_FIREWORK_YELLOW, CONST_ME_FIREWORK_BLUE)) - player:say("LEVEL UP!", TALKTYPE_MONSTER_SAY) - end - - if config.heal then - player:addHealth(player:getMaxHealth()) - end - - if config.save then - player:save() - end - - player:getFinalLowLevelBonus() - - return true -end - -advanceSave:register() diff --git a/data-canary/scripts/creaturescripts/login.lua b/data-canary/scripts/creaturescripts/login.lua deleted file mode 100644 index ed0bd894034..00000000000 --- a/data-canary/scripts/creaturescripts/login.lua +++ /dev/null @@ -1,129 +0,0 @@ -local login = CreatureEvent("PlayerLogin") - -function login.onLogin(player) - local loginStr = "Welcome to " .. configManager.getString(configKeys.SERVER_NAME) .. "!" - if player:getLastLoginSaved() <= 0 then - loginStr = loginStr .. " Please choose your outfit." - player:sendOutfitWindow() - else - if loginStr ~= "" then - player:sendTextMessage(MESSAGE_LOGIN, loginStr) - end - - player:sendTextMessage(MESSAGE_LOGIN, string.format("Your last visit in " .. SERVER_NAME .. ": %s.", os.date("%d. %b %Y %X", player:getLastLoginSaved()))) - end - - -- Stamina - _G.NextUseStaminaTime[player.uid] = 0 - - -- Promotion - local vocation = player:getVocation() - local promotion = vocation:getPromotion() - if player:isPremium() then - local hasPromotion = player:kv():get("promoted") - if not player:isPromoted() and hasPromotion then - player:setVocation(promotion) - end - elseif player:isPromoted() then - player:setVocation(vocation:getDemotion()) - end - - -- Events - player:registerEvent("PlayerDeath") - player:registerEvent("DropLoot") - player:registerEvent("BossParticipation") - - if _G.OnExerciseTraining[player:getId()] then -- onLogin & onLogout - stopEvent(_G.OnExerciseTraining[player:getId()].event) - _G.OnExerciseTraining[player:getId()] = nil - player:setTraining(false) - end - - -- Boosted creature - player:sendTextMessage(MESSAGE_BOOSTED_CREATURE, "Today's boosted creature: " .. Game.getBoostedCreature() .. " \ - Boosted creatures yield more experience points, carry more loot than usual and respawn at a faster rate.") - - -- Boosted boss - player:sendTextMessage(MESSAGE_BOOSTED_CREATURE, "Today's boosted boss: " .. Game.getBoostedBoss() .. " \ - Boosted bosses contain more loot and count more kills for your Bosstiary.") - - if SCHEDULE_EXP_RATE ~= 100 then - if SCHEDULE_EXP_RATE > 100 then - player:sendTextMessage( - MESSAGE_BOOSTED_CREATURE, - "Exp Rate Event! Monsters yield more experience points than usual \ - Happy Hunting!" - ) - else - player:sendTextMessage(MESSAGE_BOOSTED_CREATURE, "Exp Rate Decreased! Monsters yield less experience points than usual.") - end - end - - if SCHEDULE_SPAWN_RATE ~= 100 then - if SCHEDULE_SPAWN_RATE > 100 then - player:sendTextMessage( - MESSAGE_BOOSTED_CREATURE, - "Spawn Rate Event! Monsters respawn at a faster rate \ - Happy Hunting!" - ) - else - player:sendTextMessage(MESSAGE_BOOSTED_CREATURE, "Spawn Rate Decreased! Monsters respawn at a slower rate.") - end - end - - if SCHEDULE_LOOT_RATE ~= 100 then - if SCHEDULE_LOOT_RATE > 100 then - player:sendTextMessage( - MESSAGE_BOOSTED_CREATURE, - "Loot Rate Event! Monsters carry more loot than usual \ - Happy Hunting!" - ) - else - player:sendTextMessage(MESSAGE_BOOSTED_CREATURE, "Loot Rate Decreased! Monsters carry less loot than usual.") - end - end - - if SCHEDULE_SKILL_RATE ~= 100 then - if SCHEDULE_SKILL_RATE > 100 then - player:sendTextMessage( - MESSAGE_BOOSTED_CREATURE, - "Skill Rate Event! Your skills progresses at a higher rate \ - Happy Hunting!" - ) - else - player:sendTextMessage(MESSAGE_BOOSTED_CREATURE, "Skill Rate Decreased! Your skills progresses at a lower rate.") - end - end - - local playerId = player:getId() - - -- Stamina - _G.NextUseStaminaTime[playerId] = 1 - - -- EXP Stamina - _G.NextUseXpStamina[playerId] = 1 - - -- Set Client XP Gain Rate -- - if configManager.getBoolean(configKeys.XP_DISPLAY_MODE) then - local baseRate = player:getFinalBaseRateExperience() - baseRate = baseRate * 100 - if configManager.getBoolean(configKeys.VIP_SYSTEM_ENABLED) then - local vipBonusExp = configManager.getNumber(configKeys.VIP_BONUS_EXP) - if vipBonusExp > 0 and player:isVip() then - vipBonusExp = (vipBonusExp > 100 and 100) or vipBonusExp - baseRate = baseRate * (1 + (vipBonusExp / 100)) - player:sendTextMessage(MESSAGE_BOOSTED_CREATURE, "Normal base xp is: " .. baseRate .. "%, because you are VIP, bonus of " .. vipBonusExp .. "%") - end - end - player:setBaseXpGain(baseRate) - end - - local staminaBonus = player:getFinalBonusStamina() - player:setStaminaXpBoost(staminaBonus * 100) - - player:getFinalLowLevelBonus() - - return true -end - -login:register() diff --git a/data-canary/scripts/creaturescripts/logout.lua b/data-canary/scripts/creaturescripts/logout.lua deleted file mode 100644 index 598a55878d2..00000000000 --- a/data-canary/scripts/creaturescripts/logout.lua +++ /dev/null @@ -1,17 +0,0 @@ -local logout = CreatureEvent("PlayerLogout") - -function logout.onLogout(player) - local playerId = player:getId() - if _G.NextUseStaminaTime[playerId] then - _G.NextUseStaminaTime[playerId] = nil - end - - if _G.OnExerciseTraining[playerId] then - stopEvent(_G.OnExerciseTraining[playerId].event) - _G.OnExerciseTraining[playerId] = nil - player:setTraining(false) - end - return true -end - -logout:register() diff --git a/data-canary/scripts/creaturescripts/modal_window_helper.lua b/data-canary/scripts/creaturescripts/modal_window_helper.lua deleted file mode 100644 index d2651af1e69..00000000000 --- a/data-canary/scripts/creaturescripts/modal_window_helper.lua +++ /dev/null @@ -1,35 +0,0 @@ -local creatureEvent = CreatureEvent("modalWindowHelper") - -function creatureEvent.onModalWindow(player, modalWindowId, buttonId, choiceId) - local playerId = player:getId() - local modalWindows = ModalWindows[playerId] - if not modalWindows then - return true - end - - local modalWindow = modalWindows[modalWindowId] - if not modalWindow then - return true - end - - local button = modalWindow.buttons[buttonId] or {} - local choice = modalWindow.choices[choiceId] or {} - if button.callback then - button.callback(player, button, choice) - elseif choice.callback then - choice.callback(player, button, choice) - elseif modalWindow.defaultCallback then - modalWindow.defaultCallback(player, button, choice) - end - - modalWindow.using = modalWindow.using - 1 - if modalWindow.using == 0 then - modalWindows[modalWindowId] = nil - if not next(modalWindows) then - ModalWindows[playerId] = nil - end - end - return true -end - -creatureEvent:register() diff --git a/data-canary/scripts/creaturescripts/regenerate_stamina.lua b/data-canary/scripts/creaturescripts/regenerate_stamina.lua deleted file mode 100644 index cc112ce6958..00000000000 --- a/data-canary/scripts/creaturescripts/regenerate_stamina.lua +++ /dev/null @@ -1,31 +0,0 @@ -local regenerateStamina = CreatureEvent("Regenerate Stamina") - -function regenerateStamina.onLogin(player) - if not configManager.getBoolean(configKeys.STAMINA_SYSTEM) then - return true - end - - local lastLogout = player:getLastLogout() - local offlineTime = lastLogout ~= 0 and math.min(os.time() - lastLogout, 86400 * 21) or 0 - offlineTime = offlineTime - 600 - - if offlineTime < 180 then - return true - end - - local staminaMinutes = player:getStamina() - local maxNormalStaminaRegen = 2400 - math.min(2400, staminaMinutes) - - local regainStaminaMinutes = offlineTime / 180 - if regainStaminaMinutes > maxNormalStaminaRegen then - local happyHourStaminaRegen = (offlineTime - (maxNormalStaminaRegen * 180)) / 600 - staminaMinutes = math.min(2520, math.max(2400, staminaMinutes) + happyHourStaminaRegen) - else - staminaMinutes = staminaMinutes + regainStaminaMinutes - end - - player:setStamina(staminaMinutes) - return true -end - -regenerateStamina:register() diff --git a/data-canary/scripts/globalevents/save_interval.lua b/data-canary/scripts/globalevents/save_interval.lua deleted file mode 100644 index 3e1c16326e4..00000000000 --- a/data-canary/scripts/globalevents/save_interval.lua +++ /dev/null @@ -1,40 +0,0 @@ -local function serverSave(interval) - if configManager.getBoolean(configKeys.TOGGLE_SAVE_INTERVAL_CLEAN_MAP) then - cleanMap() - end - - saveServer() - local message = "Server save complete. Next save in %d %ss!" - local messageSingle = "Server save complete. Next save in %d %s!" - Webhook.sendMessage("Server save", message, WEBHOOK_COLOR_WARNING) - if SAVE_INTERVAL_CONFIG_TIME > 1 then - Game.broadcastMessage(string.format(message, SAVE_INTERVAL_CONFIG_TIME, SAVE_INTERVAL_TYPE), MESSAGE_GAME_HIGHLIGHT) - logger.info(string.format(message, SAVE_INTERVAL_CONFIG_TIME, SAVE_INTERVAL_TYPE)) - else - Game.broadcastMessage(string.format(messageSingle, SAVE_INTERVAL_CONFIG_TIME, SAVE_INTERVAL_TYPE), MESSAGE_GAME_HIGHLIGHT) - logger.info(string.format(messageSingle, SAVE_INTERVAL_CONFIG_TIME, SAVE_INTERVAL_TYPE)) - end -end - -local save = GlobalEvent("save") - -function save.onTime(interval) - local remainingTime = 60 * 1000 - if configManager.getBoolean(configKeys.TOGGLE_SAVE_INTERVAL) then - local message = "The server will save all accounts within " .. (remainingTime / 1000) .. " seconds. \z - You might lag or freeze for 5 seconds, please find a safe place." - Game.broadcastMessage(message, MESSAGE_GAME_HIGHLIGHT) - logger.info(string.format(message, SAVE_INTERVAL_CONFIG_TIME, SAVE_INTERVAL_TYPE)) - addEvent(serverSave, remainingTime, interval) - return true - end - return not configManager.getBoolean(configKeys.TOGGLE_SAVE_INTERVAL) -end - -if SAVE_INTERVAL_TIME ~= 0 then - save:interval(SAVE_INTERVAL_CONFIG_TIME * SAVE_INTERVAL_TIME) -else - return logger.error("[save.onTime] - Save interval type '{}' is not valid, use 'second', 'minute' or 'hour'", SAVE_INTERVAL_TYPE) -end - -save:register() diff --git a/data-canary/scripts/item_classification/item_tiers.lua b/data-canary/scripts/item_classification/item_tiers.lua deleted file mode 100644 index 2eb0d08bb23..00000000000 --- a/data-canary/scripts/item_classification/item_tiers.lua +++ /dev/null @@ -1,111 +0,0 @@ -local itemTierClassifications = { - -- Upgrade classification 1 - [1] = { - -- Update tier 0 - [1] = { - regular = 25000, - core = 1, - }, - }, - -- Upgrade classification 2 - [2] = { - -- Update tier 0 - [1] = { - regular = 750000, - core = 1, - }, - -- Update tier 1 - [2] = { - regular = 5000000, - core = 1, - }, - }, - -- Upgrade classification 3 - [3] = { - [1] = { - regular = 4000000, - core = 1, - }, - [2] = { - regular = 10000000, - core = 1, - }, - [3] = { - regular = 20000000, - core = 2, - }, - }, - -- Upgrade classification 4 - [4] = { - [1] = { - regular = 8000000, - core = 1, - convergence = { fusion = { price = 55000000 }, transfer = { price = 65000000 } }, - }, - [2] = { - regular = 20000000, - core = 2, - convergence = { fusion = { price = 110000000 }, transfer = { price = 165000000 } }, - }, - [3] = { - regular = 40000000, - core = 5, - convergence = { fusion = { price = 170000000 }, transfer = { price = 375000000 } }, - }, - [4] = { - regular = 65000000, - core = 10, - convergence = { fusion = { price = 300000000 }, transfer = { price = 800000000 } }, - }, - [5] = { - regular = 100000000, - core = 15, - convergence = { fusion = { price = 875000000 }, transfer = { price = 2000000000 } }, - }, - [6] = { - regular = 250000000, - core = 25, - convergence = { fusion = { price = 2350000000 }, transfer = { price = 5250000000 } }, - }, - [7] = { - regular = 750000000, - core = 35, - convergence = { fusion = { price = 6950000000 }, transfer = { price = 14500000000 } }, - }, - [8] = { - regular = 2500000000, - core = 50, - convergence = { fusion = { price = 21250000000 }, transfer = { price = 42500000000 } }, - }, - [9] = { - regular = 8000000000, - core = 60, - convergence = { fusion = { price = 50000000000 }, transfer = { price = 100000000000 } }, - }, - [10] = { - regular = 15000000000, - core = 85, - convergence = { fusion = { price = 125000000000 }, transfer = { price = 300000000000 } }, - }, - }, -} - --- Item tier with gold price for uprading it -for classificationId, classificationTable in ipairs(itemTierClassifications) do - local itemClassification = Game.createItemClassification(classificationId) - local classification = {} - - -- Registers table for register_item_tier.lua interface - classification.Upgrades = {} - for tierId, tierTable in ipairs(classificationTable) do - table.insert(classification.Upgrades, { - TierId = tierId, - Core = tierTable.core, - RegularPrice = tierTable.regular, - ConvergenceFustionPrice = tierTable.convergence and tierTable.convergence.fusion.price or 0, - ConvergenceTransferPrice = tierTable.convergence and tierTable.convergence.transfer.price or 0, - }) - end - -- Create item classification and register classification table - itemClassification:register(classification) -end diff --git a/data-canary/scripts/movements/noxious_Claw.lua b/data-canary/scripts/movements/noxious_Claw.lua deleted file mode 100644 index fc97ebcb4ba..00000000000 --- a/data-canary/scripts/movements/noxious_Claw.lua +++ /dev/null @@ -1,17 +0,0 @@ -local claw = MoveEvent() -claw:type("equip") - -function claw.onEquip(player, item, slot, isCheck) - if isCheck then - return true - end - - doTargetCombatHealth(0, player, COMBAT_PHYSICALDAMAGE, -200, -200, CONST_ME_DRAWBLOOD) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, (math.boolean_random() and "It tightens around your wrist as you take it on." or "Ouch! The serpent claw stabbed you.")) - item:transform(9392) - return true -end - -claw:id(9393) -claw:level(100) -claw:register() diff --git a/data-canary/scripts/movements/snow.lua b/data-canary/scripts/movements/snow.lua deleted file mode 100644 index 26f2ce81390..00000000000 --- a/data-canary/scripts/movements/snow.lua +++ /dev/null @@ -1,19 +0,0 @@ -local snow = MoveEvent() -snow:type("stepout") - -function snow.onStepOut(creature, item, position, fromPosition) - if creature:isPlayer() and creature:isInGhostMode() then - return true - end - - if item.itemid == 799 then - item:transform(6594) - else - item:transform(item.itemid + 15) - end - item:decay() - return true -end - -snow:id(799, 6580, 6581, 6582, 6583, 6584, 6585, 6586, 6587, 6588, 6589, 6590, 6591, 6592, 6593) -snow:register() diff --git a/data-canary/scripts/movements/swimming.lua b/data-canary/scripts/movements/swimming.lua deleted file mode 100644 index 494a4433a21..00000000000 --- a/data-canary/scripts/movements/swimming.lua +++ /dev/null @@ -1,33 +0,0 @@ -local condition = Condition(CONDITION_OUTFIT) -condition:setOutfit({ lookType = 267 }) -condition:setTicks(-1) - -local swimming = MoveEvent() -swimming:type("stepin") - -function swimming.onStepIn(creature, item, position, fromPosition) - if not creature:isPlayer() then - return false - end - - creature:addCondition(condition) - return true -end - -swimming:id(629, 630, 631, 632, 633, 634, 4809, 4810, 4811, 4812, 4813, 4814) -swimming:register() - -local swimming = MoveEvent() -swimming:type("stepout") - -function swimming.onStepOut(creature, item, position, fromPosition) - if not creature:isPlayer() then - return false - end - - creature:removeCondition(CONDITION_OUTFIT) - return true -end - -swimming:id(629, 630, 631, 632, 633, 634, 4809, 4810, 4811, 4812, 4813, 4814) -swimming:register() diff --git a/data-canary/scripts/movements/unscripted_movements.lua b/data-canary/scripts/movements/unscripted_movements.lua deleted file mode 100644 index 1d080a031ed..00000000000 --- a/data-canary/scripts/movements/unscripted_movements.lua +++ /dev/null @@ -1,18485 +0,0 @@ -local items = { - { - -- mutant bone kilt - itemid = 40595, - type = "equip", - slot = "legs", - level = 300, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- mutant bone kilt - itemid = 40595, - type = "deequip", - slot = "legs", - level = 300, - }, - { - -- alchemist's notepad - itemid = 40594, - type = "equip", - slot = "shield", - level = 250, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- alchemist's notepad - itemid = 40594, - type = "deequip", - slot = "shield", - level = 250, - }, - { - -- mutant bone boots - itemid = 40593, - type = "equip", - slot = "feet", - level = 250, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- mutant bone boots - itemid = 40593, - type = "deequip", - slot = "feet", - level = 250, - }, - { - -- alchemist's boots - itemid = 40592, - type = "equip", - slot = "feet", - level = 250, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- alchemist's boots - itemid = 40592, - type = "deequip", - slot = "feet", - level = 250, - }, - { - -- mutated skin armor - itemid = 40591, - type = "equip", - slot = "armor", - level = 270, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- mutated skin armor - itemid = 40591, - type = "deequip", - slot = "armor", - level = 270, - }, - { - -- Mutated Skin Legs - itemid = 40590, - type = "equip", - slot = "legs", - level = 270, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- Mutated Skin Legs - itemid = 40590, - type = "deequip", - slot = "legs", - level = 270, - }, - { - -- Stitched Mutant Hide Legs - itemid = 40589, - type = "equip", - slot = "legs", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- Stitched Mutant Hide Legs - itemid = 40589, - type = "deequip", - slot = "legs", - level = 270, - }, - { - -- Antler-Horn Helmet - itemid = 40588, - type = "equip", - slot = "head", - level = 250, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- Antler-Horn Helmet - itemid = 40588, - type = "deequip", - slot = "head", - level = 250, - }, - { - -- 25 years backpack - itemid = 39693, - type = "equip", - slot = "backpack", - }, - { - -- 25 years backpack - itemid = 39693, - type = "deequip", - slot = "backpack", - }, - { - -- turtle amulet - itemid = 39235, - type = "equip", - slot = "necklace", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- enchanted turtle amulet - itemid = 39235, - type = "deequip", - slot = "necklace", - }, - { - -- enchanted turtle amulet - itemid = 39234, - type = "equip", - slot = "necklace", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- enchanted turtle amulet - itemid = 39234, - type = "deequip", - slot = "necklace", - }, - { - -- enchanted turtle amulet - itemid = 39233, - type = "equip", - slot = "necklace", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- enchanted turtle amulet - itemid = 39233, - type = "deequip", - slot = "necklace", - }, - { - -- arboreal ring - itemid = 39188, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- arboreal ring - itemid = 39188, - type = "deequip", - slot = "ring", - }, - { - -- charged arboreal ring - itemid = 39187, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- charged arboreal ring - itemid = 39187, - type = "deequip", - slot = "ring", - }, - { - -- charged arboreal ring - itemid = 39186, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- charged arboreal ring - itemid = 39186, - type = "deequip", - slot = "ring", - }, - { - -- arcanomancer sigil - itemid = 39185, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- arcanomancer sigil - itemid = 39185, - type = "deequip", - slot = "ring", - }, - { - -- charged arcanomancer ring - itemid = 39184, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- charged arcanomancer ring - itemid = 39184, - type = "deequip", - slot = "ring", - }, - { - -- charged arcanomancer sigil - itemid = 39183, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- charged arcanomancer sigil - itemid = 39183, - type = "deequip", - slot = "ring", - }, - { - -- alicorn ring - itemid = 39182, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- charged alicorn ring - itemid = 39182, - type = "deequip", - slot = "ring", - }, - { - -- charged alicorn ring - itemid = 39181, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- charged alicorn ring - itemid = 39181, - type = "deequip", - slot = "ring", - }, - { - -- charged alicorn ring - itemid = 39180, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- charged alicorn ring - itemid = 39180, - type = "deequip", - slot = "ring", - }, - { - -- spiritthorn ring - itemid = 39179, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- spiritthorn ring - itemid = 39179, - type = "deequip", - slot = "ring", - }, - { - -- charged spiritthorn ring - itemid = 39178, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- charged spiritthorn ring - itemid = 39178, - type = "deequip", - slot = "ring", - }, - { - -- charged spiritthorn ring - itemid = 39177, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- charged spiritthorn ring - itemid = 39177, - type = "deequip", - slot = "ring", - }, - { - -- midnight sarong - itemid = 39167, - type = "equip", - slot = "legs", - level = 250, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- midnight sarong - itemid = 39167, - type = "deequip", - slot = "legs", - }, - { - -- dawnfire pantaloons - itemid = 39166, - type = "equip", - slot = "legs", - level = 300, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- dawnfire pantaloons - itemid = 39166, - type = "deequip", - slot = "legs", - }, - { - -- midnight tunic - itemid = 39165, - type = "equip", - slot = "armor", - level = 300, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- midnight tunic - itemid = 39165, - type = "deequip", - slot = "armor", - }, - { - -- dawnfire sherwani - itemid = 39164, - type = "equip", - slot = "armor", - level = 270, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- dawnfire sherwani - itemid = 39164, - type = "deequip", - slot = "armor", - }, - { - -- naga rod - itemid = 39163, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- naga rod - itemid = 39163, - type = "deequip", - slot = "hand", - }, - { - -- naga wand - itemid = 39162, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- naga wand - itemid = 39162, - type = "deequip", - slot = "hand", - }, - { - -- feverbloom boots - itemid = 39161, - type = "equip", - slot = "feet", - level = 270, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- feverbloom boots - itemid = 39161, - type = "deequip", - slot = "feet", - }, - { - -- naga quiver - itemid = 39160, - type = "equip", - slot = "right-hand", - level = 250, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- naga quiver - itemid = 39160, - type = "deequip", - slot = "right-hand", - }, - { - -- naga crossbow - itemid = 39159, - type = "equip", - slot = "hand", - level = 300, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- naga crossbow - itemid = 39159, - type = "deequip", - slot = "hand", - }, - { - -- frostflower boots - itemid = 39158, - type = "equip", - slot = "feet", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- frostflower boots - itemid = 39158, - type = "deequip", - slot = "feet", - }, - { - -- naga club - itemid = 39157, - type = "equip", - slot = "hand", - level = 300, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- naga club - itemid = 39157, - type = "deequip", - slot = "hand", - }, - { - -- naga axe - itemid = 39156, - type = "equip", - slot = "hand", - level = 300, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- naga axe - itemid = 39156, - type = "deequip", - slot = "hand", - }, - { - -- naga sword - itemid = 39155, - type = "equip", - slot = "hand", - level = 300, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- naga sword - itemid = 39155, - type = "deequip", - slot = "hand", - }, - { - -- arboreal tome - itemid = 39154, - type = "equip", - slot = "shield", - level = 400, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- arboreal tome - itemid = 39154, - type = "deequip", - slot = "shield", - }, - { - -- arboreal crown - itemid = 39153, - type = "equip", - slot = "head", - level = 400, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- arboreal crown - itemid = 39153, - type = "deequip", - slot = "head", - }, - { - -- arcanomancer folio - itemid = 39152, - type = "equip", - slot = "shield", - level = 400, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- arcanomancer folio - itemid = 39152, - type = "deequip", - slot = "shield", - }, - { - -- arcanomancer regalia - itemid = 39151, - type = "equip", - slot = "head", - level = 400, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- arcanomancer regalia - itemid = 39151, - type = "deequip", - slot = "head", - }, - { - -- alicorn quiver - itemid = 39150, - type = "equip", - slot = "right-hand", - level = 400, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- alicorn quiver - itemid = 39150, - type = "deequip", - slot = "right-hand", - }, - { - -- alicorn headguard - itemid = 39149, - type = "equip", - slot = "head", - level = 400, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- alicorn headguard - itemid = 39149, - type = "deequip", - slot = "head", - }, - { - -- spiritthorn helmet - itemid = 39148, - type = "equip", - slot = "head", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- spiritthorn helmet - itemid = 39148, - type = "deequip", - slot = "head", - }, - { - -- spiritthorn armor - itemid = 39147, - type = "equip", - slot = "armor", - level = 400, - vocation = { - { "Knight", true, true }, - { "Elite Knight" }, - }, - }, - { - -- spiritthorn armor - itemid = 39147, - type = "deequip", - slot = "armor", - }, - { - -- changing backpack - itemid = 37536, - type = "equip", - slot = "backpack", - }, - { - -- changing backpack - itemid = 37536, - type = "deequip", - slot = "backpack", - }, - { - -- lilypad backpack - itemid = 37554, - type = "equip", - slot = "backpack", - }, - { - -- lilypad backpack - itemid = 37554, - type = "deequip", - slot = "backpack", - }, - { - -- gilded eldritch rod - itemid = 36675, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- gilded eldritch rod - itemid = 36675, - type = "deequip", - slot = "hand", - level = 250, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- eldritch rod - itemid = 36674, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- eldritch rod - itemid = 36674, - type = "deequip", - slot = "hand", - level = 250, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- eldritch tome - itemid = 36673, - type = "equip", - slot = "shield", - level = 300, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- eldritch tome - itemid = 36673, - type = "deequip", - slot = "shield", - level = 300, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- eldritch folio - itemid = 36672, - type = "equip", - slot = "shield", - level = 300, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- eldritch folio - itemid = 36672, - type = "deequip", - slot = "shield", - level = 300, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- eldritch hood - itemid = 36671, - type = "equip", - slot = "head", - level = 250, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- eldritch hood - itemid = 36671, - type = "deequip", - slot = "head", - level = 250, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- eldritch cowl - itemid = 36670, - type = "equip", - slot = "head", - level = 250, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- eldritch cowl - itemid = 36670, - type = "deequip", - slot = "head", - level = 250, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- gilded eldritch wand - itemid = 36669, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- gilded eldritch wand - itemid = 36669, - type = "deequip", - slot = "hand", - level = 250, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- eldritch wand - itemid = 36668, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- eldritch wand - itemid = 36668, - type = "deequip", - slot = "hand", - level = 250, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- eldritch breeches - itemid = 36667, - type = "equip", - slot = "legs", - level = 250, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- eldritch breeches - itemid = 36667, - type = "deequip", - slot = "legs", - level = 250, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- eldritch quiver - itemid = 36666, - type = "equip", - slot = "right-hand", - level = 250, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- eldritch quiver - itemid = 36666, - type = "deequip", - slot = "right-hand", - level = 250, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- gilded eldritch bow - itemid = 36665, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- gilded eldritch bow - itemid = 36665, - type = "deequip", - slot = "hand", - level = 250, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- eldritch bow - itemid = 36664, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- eldritch bow - itemid = 36664, - type = "deequip", - slot = "hand", - level = 250, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- eldritch cuirass - itemid = 36663, - type = "equip", - slot = "armor", - level = 250, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch cuirass - itemid = 36663, - type = "deequip", - slot = "armor", - level = 250, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- gilded eldritch greataxe - itemid = 36662, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- gilded eldritch greataxe - itemid = 36662, - type = "deequip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch greataxe - itemid = 36661, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch greataxe - itemid = 36661, - type = "deequip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- gilded eldritch warmace - itemid = 36660, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- gilded eldritch warmace - itemid = 36660, - type = "deequip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch warmace - itemid = 36659, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch warmace - itemid = 36659, - type = "deequip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- gilded eldritch claymore - itemid = 36658, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- gilded eldritch claymore - itemid = 36658, - type = "deequip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch claymore - itemid = 36657, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch claymore - itemid = 36657, - type = "deequip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch shield - itemid = 36656, - type = "equip", - slot = "shield", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch shield - itemid = 36656, - type = "deequip", - slot = "shield", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- spectral bolt (no decay) - itemid = 35902, - type = "equip", - slot = "ammo", - }, - { - -- spectral bolt (no decay) - itemid = 35902, - type = "deequip", - slot = "ammo", - }, - { - -- red quiver - itemid = 35849, - type = "equip", - slot = "right-hand", - vocation = { - { "None", true }, - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- red quiver - itemid = 35849, - type = "deequip", - slot = "right-hand", - vocation = { - { "None", true }, - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- blue quiver - itemid = 35848, - type = "equip", - slot = "right-hand", - vocation = { - { "None", true }, - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- blue quiver - itemid = 35848, - type = "deequip", - slot = "right-hand", - vocation = { - { "None", true }, - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- quiver - itemid = 35562, - type = "equip", - slot = "right-hand", - vocation = { - { "None", true }, - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- quiver - itemid = 35562, - type = "deequip", - slot = "right-hand", - vocation = { - { "None", true }, - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- jungle quiver - itemid = 35524, - type = "equip", - slot = "right-hand", - level = 150, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- jungle quiver - itemid = 35524, - type = "deequip", - slot = "right-hand", - level = 150, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- exotic amulet - itemid = 35523, - type = "equip", - slot = "necklace", - level = 180, - }, - { - -- exotic amulet - itemid = 35523, - type = "deequip", - slot = "necklace", - }, - { - -- jungle wand - itemid = 35522, - type = "equip", - slot = "hand", - level = 150, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- jungle wand - itemid = 35522, - type = "deequip", - slot = "hand", - }, - { - -- jungle rod - itemid = 35521, - type = "equip", - slot = "hand", - level = 150, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- jungle rod - itemid = 35521, - type = "deequip", - slot = "hand", - }, - { - -- make-do boots - itemid = 35520, - type = "equip", - slot = "feet", - level = 150, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- make-do boots - itemid = 35520, - type = "deequip", - slot = "feet", - }, - { - -- makeshift boots - itemid = 35519, - type = "equip", - slot = "feet", - level = 150, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- makeshift boots - itemid = 35519, - type = "deequip", - slot = "feet", - }, - { - -- jungle bow - itemid = 35518, - type = "equip", - slot = "hand", - level = 150, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- jungle bow - itemid = 35518, - type = "deequip", - slot = "hand", - }, - { - -- bast legs - itemid = 35517, - type = "equip", - slot = "legs", - level = 150, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- bast legs - itemid = 35517, - type = "deequip", - slot = "legs", - }, - { - -- exotic legs - itemid = 35516, - type = "equip", - slot = "legs", - level = 130, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- exotic legs - itemid = 35516, - type = "deequip", - slot = "legs", - }, - { - -- throwing axe - itemid = 35515, - type = "equip", - slot = "hand", - level = 150, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- throwing axe - itemid = 35515, - type = "deequip", - slot = "hand", - }, - { - -- jungle flail - itemid = 35514, - type = "equip", - slot = "hand", - level = 150, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- jungle flail - itemid = 35514, - type = "deequip", - slot = "hand", - }, - { - -- lion hammer - itemid = 34254, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- lion hammer - itemid = 34254, - type = "deequip", - slot = "hand", - }, - { - -- lion axe - itemid = 34253, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- lion axe - itemid = 34253, - type = "deequip", - slot = "hand", - }, - { - -- lion amulet - itemid = 34158, - type = "equip", - slot = "necklace", - level = 150, - }, - { - -- lion amulet - itemid = 34158, - type = "deequip", - slot = "necklace", - level = 150, - }, - { - -- lion plate - itemid = 34157, - type = "deequip", - slot = "armor", - level = 270, - }, - { - -- lion plate - itemid = 34157, - type = "equip", - slot = "armor", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- lion spangenhelm - itemid = 34156, - type = "deequip", - slot = "head", - }, - { - -- lion spangenhelm - itemid = 34156, - type = "equip", - slot = "head", - level = 230, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- lion longsword - itemid = 34155, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- lion longsword - itemid = 34155, - type = "deequip", - slot = "hand", - }, - { - -- lion spellbook - itemid = 34153, - type = "deequip", - slot = "shield", - }, - { - -- lion spellbook - itemid = 34153, - type = "equip", - slot = "shield", - level = 220, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- lion wand - itemid = 34152, - type = "equip", - slot = "hand", - level = 220, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- lion wand - itemid = 34152, - type = "deequip", - slot = "hand", - }, - { - -- lion rod - itemid = 34151, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- lion rod - itemid = 34151, - type = "deequip", - slot = "hand", - }, - { - -- lion longbow - itemid = 34150, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- lion longbow - itemid = 34150, - type = "deequip", - slot = "hand", - }, - { - -- soulbastion shield - itemid = 34099, - type = "deequip", - slot = "shield", - }, - { - -- soulbastion shield - itemid = 34099, - type = "equip", - slot = "shield", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- pair of soulstalkers - itemid = 34098, - type = "deequip", - slot = "feet", - }, - { - -- pair of soulstalkers - itemid = 34098, - type = "equip", - slot = "feet", - level = 400, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- pair of soulwalkers - itemid = 34097, - type = "deequip", - slot = "feet", - }, - { - -- pair of soulwalkers - itemid = 34097, - type = "equip", - slot = "feet", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- soulshroud armor - itemid = 34096, - type = "deequip", - slot = "armor", - }, - { - -- soulshroud armor - itemid = 34096, - type = "equip", - slot = "armor", - level = 400, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- soulmantel armor - itemid = 34095, - type = "deequip", - slot = "armor", - }, - { - -- soulmantel armor - itemid = 34095, - type = "equip", - slot = "armor", - level = 400, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- soulshell armor - itemid = 34094, - type = "deequip", - slot = "armor", - level = 400, - }, - { - -- soulshell armor - itemid = 34094, - type = "equip", - slot = "armor", - level = 400, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- soulstrider legs - itemid = 34093, - type = "deequip", - slot = "legs", - level = 400, - }, - { - -- soulstrider legs - itemid = 34093, - type = "equip", - slot = "legs", - level = 400, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- soulshanks legs - itemid = 34092, - type = "deequip", - slot = "legs", - level = 400, - }, - { - -- soulshanks legs - itemid = 34092, - type = "equip", - slot = "legs", - level = 400, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- soulhexer - itemid = 34091, - type = "deequip", - slot = "hand", - }, - { - -- soulhexer - itemid = 34091, - type = "equip", - slot = "hand", - level = 400, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- soultainter - itemid = 34090, - type = "deequip", - slot = "hand", - }, - { - -- soultainter - itemid = 34090, - type = "equip", - slot = "hand", - level = 400, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- soulpiercer - itemid = 34089, - type = "deequip", - slot = "hand", - }, - { - -- soulpiercer - itemid = 34089, - type = "equip", - slot = "hand", - level = 400, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- soulbleeder - itemid = 34088, - type = "deequip", - slot = "hand", - }, - { - -- soulbleeder - itemid = 34088, - type = "equip", - slot = "hand", - level = 400, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- soulmaimer - itemid = 34087, - type = "deequip", - slot = "hand", - }, - { - -- soulmaimer - itemid = 34087, - type = "equip", - slot = "hand", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- soulcrusher - itemid = 34086, - type = "deequip", - slot = "hand", - }, - { - -- soulcrusher - itemid = 34086, - type = "equip", - slot = "hand", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- souleater - itemid = 34085, - type = "deequip", - slot = "hand", - }, - { - -- souleater - itemid = 34085, - type = "equip", - slot = "hand", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- soulbiter - itemid = 34084, - type = "deequip", - slot = "hand", - }, - { - -- soulbiter - itemid = 34084, - type = "equip", - slot = "hand", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- soulshredder - itemid = 34083, - type = "deequip", - slot = "hand", - }, - { - -- soulshredder - itemid = 34083, - type = "equip", - slot = "hand", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- soulcutter - itemid = 34082, - type = "deequip", - slot = "hand", - }, - { - -- soulcutter - itemid = 34082, - type = "equip", - slot = "hand", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- lion ring - itemid = 34080, - type = "deequip", - slot = "ring", - level = 270, - }, - { - -- lion ring - itemid = 34080, - type = "equip", - slot = "ring", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- Lit Torch (Sparkling) - itemid = 34016, - type = "equip", - slot = "ammo", - }, - { - -- Lit Torch (Sparkling) - itemid = 34016, - type = "deequip", - slot = "ammo", - }, - { - -- pair of old bracers - itemid = 32705, - type = "equip", - slot = "armor", - }, - { - -- pair of old bracers - itemid = 32705, - type = "deequip", - slot = "armor", - }, - { - -- ring of souls - itemid = 32636, - type = "equip", - slot = "ring", - level = 200, - }, - { - -- ring of souls - itemid = 32636, - type = "deequip", - slot = "ring", - level = 200, - }, - { - -- ring of souls - itemid = 32635, - type = "equip", - slot = "ring", - level = 200, - }, - { - -- ring of souls - itemid = 32635, - type = "deequip", - slot = "ring", - level = 200, - }, - { - -- spooky hood - itemid = 32630, - type = "equip", - slot = "head", - }, - { - -- spooky hood - itemid = 32630, - type = "deequip", - slot = "head", - }, - { - -- ghost chestplate - itemid = 32628, - type = "equip", - slot = "armor", - level = 230, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- ghost chestplate - itemid = 32628, - type = "deequip", - slot = "armor", - level = 230, - }, - { - -- ring of souls - itemid = 32621, - type = "equip", - slot = "ring", - level = 200, - }, - { - -- ring of souls - itemid = 32621, - type = "deequip", - slot = "ring", - level = 200, - }, - { - -- ghost backpack - itemid = 32620, - type = "equip", - slot = "backpack", - }, - { - -- ghost backpack - itemid = 32620, - type = "deequip", - slot = "backpack", - }, - { - -- pair of nightmare boots - itemid = 32619, - type = "equip", - slot = "feet", - level = 140, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- pair of nightmare boots - itemid = 32619, - type = "deequip", - slot = "feet", - level = 140, - }, - { - -- soulful legs - itemid = 32618, - type = "equip", - slot = "legs", - level = 180, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- soulful legs - itemid = 32618, - type = "deequip", - slot = "legs", - level = 180, - }, - { - -- fabulous legs - itemid = 32617, - type = "equip", - slot = "legs", - level = 225, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- fabulous legs - itemid = 32617, - type = "deequip", - slot = "legs", - level = 225, - }, - { - -- phantasmal axe - itemid = 32616, - type = "equip", - slot = "hand", - }, - { - -- phantasmal axe - itemid = 32616, - type = "deequip", - slot = "hand", - }, - { - -- burial shroud - itemid = 32585, - type = "equip", - slot = "armor", - }, - { - -- burial shroud - itemid = 32585, - type = "deequip", - slot = "armor", - }, - { - -- meat hammer - itemid = 32093, - type = "equip", - slot = "hand", - }, - { - -- meat hammer - itemid = 32093, - type = "deequip", - slot = "hand", - }, - { - -- note about two souls - itemid = 31676, - type = "equip", - slot = "necklace", - }, - { - -- note about two souls - itemid = 31676, - type = "deequip", - slot = "necklace", - }, - { - -- the cobra amulet - itemid = 31631, - type = "equip", - slot = "necklace", - level = 250, - }, - { - -- the cobra amulet - itemid = 31631, - type = "deequip", - slot = "necklace", - level = 250, - }, - { - -- winged backpack - itemid = 31625, - type = "equip", - slot = "backpack", - }, - { - -- winged backpack - itemid = 31625, - type = "deequip", - slot = "backpack", - }, - { - -- blister ring - itemid = 31621, - type = "equip", - slot = "ring", - level = 220, - }, - { - -- blister ring - itemid = 31621, - type = "deequip", - slot = "ring", - level = 220, - }, - { - -- winged boots - itemid = 31617, - type = "equip", - slot = "feet", - level = 220, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- winged boots - itemid = 31617, - type = "deequip", - slot = "feet", - level = 220, - }, - { - -- blister ring - itemid = 31616, - type = "equip", - slot = "ring", - level = 220, - }, - { - -- blister ring - itemid = 31616, - type = "deequip", - slot = "ring", - level = 220, - }, - { - -- tagralt blade - itemid = 31614, - type = "equip", - slot = "hand", - }, - { - -- tagralt blade - itemid = 31614, - type = "deequip", - slot = "hand", - }, - { - -- toga mortis - itemid = 31583, - type = "equip", - slot = "armor", - level = 220, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- toga mortis - itemid = 31583, - type = "deequip", - slot = "armor", - level = 220, - }, - { - -- galea mortis - itemid = 31582, - type = "equip", - slot = "head", - level = 220, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- galea mortis - itemid = 31582, - type = "deequip", - slot = "head", - level = 220, - }, - { - -- bow of cataclysm - itemid = 31581, - type = "equip", - slot = "hand", - }, - { - -- bow of cataclysm - itemid = 31581, - type = "deequip", - slot = "hand", - }, - { - -- mortal mace - itemid = 31580, - type = "equip", - slot = "hand", - }, - { - -- mortal mace - itemid = 31580, - type = "deequip", - slot = "hand", - }, - { - -- embrace of nature - itemid = 31579, - type = "equip", - slot = "armor", - level = 220, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- embrace of nature - itemid = 31579, - type = "deequip", - slot = "armor", - level = 220, - }, - { - -- bear skin - itemid = 31578, - type = "equip", - slot = "armor", - level = 230, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- bear skin - itemid = 31578, - type = "deequip", - slot = "armor", - level = 230, - }, - { - -- terra helmet - itemid = 31577, - type = "equip", - slot = "head", - level = 230, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- terra helmet - itemid = 31577, - type = "deequip", - slot = "head", - level = 230, - }, - { - -- blister ring - itemid = 31557, - type = "equip", - slot = "ring", - level = 220, - }, - { - -- blister ring - itemid = 31557, - type = "deequip", - slot = "ring", - level = 220, - }, - { - -- rainbow amulet - itemid = 31556, - type = "equip", - slot = "necklace", - level = 220, - }, - { - -- rainbow amulet - itemid = 31556, - type = "deequip", - slot = "necklace", - level = 220, - }, - { - -- sphinx tiara - itemid = 31438, - type = "equip", - slot = "head", - }, - { - -- sphinx tiara - itemid = 31438, - type = "deequip", - slot = "head", - }, - { - -- gryphon mask - itemid = 31433, - type = "equip", - slot = "head", - }, - { - -- gryphon mask - itemid = 31433, - type = "deequip", - slot = "head", - }, - { - -- symbol of sun and sea - itemid = 31431, - type = "equip", - slot = "ring", - }, - { - -- symbol of sun and sea - itemid = 31431, - type = "deequip", - slot = "ring", - }, - { - -- silver mask - itemid = 31370, - type = "equip", - slot = "head", - }, - { - -- silver mask - itemid = 31370, - type = "deequip", - slot = "head", - }, - { - -- ring of secret thoughts - itemid = 31306, - type = "equip", - slot = "ring", - }, - { - -- ring of secret thoughts - itemid = 31306, - type = "deequip", - slot = "ring", - }, - { - -- jade amulet - itemid = 31268, - type = "equip", - slot = "necklace", - }, - { - -- jade amulet - itemid = 31268, - type = "deequip", - slot = "necklace", - }, - { - -- ring of secret thoughts - itemid = 31263, - type = "equip", - slot = "ring", - }, - { - -- ring of secret thoughts - itemid = 31263, - type = "deequip", - slot = "ring", - }, - { - -- amulet of theurgy - itemid = 30403, - type = "equip", - slot = "necklace", - level = 220, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- amulet of theurgy - itemid = 30403, - type = "deequip", - slot = "necklace", - level = 220, - }, - { - -- enchanted theurgic amulet - itemid = 30402, - type = "equip", - slot = "necklace", - level = 220, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- enchanted theurgic amulet - itemid = 30402, - type = "deequip", - slot = "necklace", - level = 220, - }, - { - -- amulet of theurgy - itemid = 30401, - type = "equip", - slot = "necklace", - level = 220, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- amulet of theurgy - itemid = 30401, - type = "deequip", - slot = "necklace", - level = 220, - }, - { - -- cobra rod - itemid = 30400, - type = "equip", - slot = "hand", - level = 220, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- cobra rod - itemid = 30400, - type = "deequip", - slot = "hand", - level = 220, - }, - { - -- cobra wand - itemid = 30399, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- cobra wand - itemid = 30399, - type = "deequip", - slot = "hand", - level = 270, - }, - { - -- cobra sword - itemid = 30398, - type = "equip", - slot = "hand", - }, - { - -- cobra sword - itemid = 30398, - type = "deequip", - slot = "hand", - }, - { - -- cobra hood - itemid = 30397, - type = "equip", - slot = "head", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- cobra hood - itemid = 30397, - type = "deequip", - slot = "head", - level = 270, - }, - { - -- cobra axe - itemid = 30396, - type = "equip", - slot = "hand", - }, - { - -- cobra axe - itemid = 30396, - type = "deequip", - slot = "hand", - }, - { - -- cobra club - itemid = 30395, - type = "equip", - slot = "hand", - }, - { - -- cobra club - itemid = 30395, - type = "deequip", - slot = "hand", - }, - { - -- cobra boots - itemid = 30394, - type = "equip", - slot = "feet", - level = 220, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- cobra boots - itemid = 30394, - type = "deequip", - slot = "feet", - level = 220, - }, - { - -- cobra crossbow - itemid = 30393, - type = "equip", - slot = "hand", - }, - { - -- cobra crossbow - itemid = 30393, - type = "deequip", - slot = "hand", - }, - { - -- rainbow necklace - itemid = 30323, - type = "equip", - slot = "necklace", - level = 220, - }, - { - -- rainbow necklace - itemid = 30323, - type = "deequip", - slot = "necklace", - level = 220, - }, - { - -- ice hatchet - itemid = 30283, - type = "equip", - slot = "hand", - }, - { - -- ice hatchet - itemid = 30283, - type = "deequip", - slot = "hand", - }, - { - -- frozen claw - itemid = 30279, - type = "equip", - slot = "ring", - }, - { - -- frozen claw - itemid = 30279, - type = "deequip", - slot = "ring", - }, - { - -- the crown of the percht queen - itemid = 30276, - type = "equip", - slot = "head", - }, - { - -- the crown of the percht queen - itemid = 30276, - type = "deequip", - slot = "head", - }, - { - -- the crown of the percht queen - itemid = 30275, - type = "equip", - slot = "head", - }, - { - -- the crown of the percht queen - itemid = 30275, - type = "deequip", - slot = "head", - }, - { - -- festive backpack - itemid = 30197, - type = "equip", - slot = "backpack", - }, - { - -- festive backpack - itemid = 30197, - type = "deequip", - slot = "backpack", - }, - { - -- yetislippers - itemid = 30196, - type = "equip", - slot = "feet", - }, - { - -- yetislippers - itemid = 30196, - type = "deequip", - slot = "feet", - }, - { - -- pendulet - itemid = 30345, - type = "equip", - slot = "necklace", - level = 180, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- pendulet - itemid = 30345, - type = "deequip", - slot = "necklace", - level = 180, - }, - { - -- enchanted pendulet - itemid = 30344, - type = "equip", - slot = "necklace", - level = 180, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- enchanted pendulet - itemid = 30344, - type = "deequip", - slot = "necklace", - level = 180, - }, - { - -- sleep shawl - itemid = 30343, - type = "equip", - slot = "necklace", - level = 180, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- sleep shawl - itemid = 30343, - type = "deequip", - slot = "necklace", - level = 180, - }, - { - -- enchanted sleep shawl - itemid = 30342, - type = "equip", - slot = "necklace", - level = 180, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- enchanted sleep shawl - itemid = 30342, - type = "deequip", - slot = "necklace", - level = 180, - }, - { - -- shield of endless search - itemid = 30181, - type = "equip", - slot = "shield", - }, - { - -- shield of endless search - itemid = 30181, - type = "deequip", - slot = "shield", - }, - { - -- spirit guide - itemid = 29431, - type = "equip", - slot = "shield", - level = 180, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spirit guide - itemid = 29431, - type = "deequip", - slot = "shield", - level = 180, - }, - { - -- ectoplasmic shield - itemid = 29430, - type = "equip", - slot = "shield", - level = 180, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- ectoplasmic shield - itemid = 29430, - type = "deequip", - slot = "shield", - level = 180, - }, - { - -- dark whispers - itemid = 29427, - type = "equip", - slot = "head", - level = 180, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- dark whispers - itemid = 29427, - type = "deequip", - slot = "head", - level = 180, - }, - { - -- brain in a jar - itemid = 29426, - type = "equip", - slot = "shield", - level = 180, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- brain in a jar - itemid = 29426, - type = "deequip", - slot = "shield", - level = 180, - }, - { - -- energized limb - itemid = 29425, - type = "equip", - slot = "hand", - level = 180, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- energized limb - itemid = 29425, - type = "deequip", - slot = "hand", - level = 180, - }, - { - -- pair of dreamwalkers - itemid = 29424, - type = "equip", - slot = "feet", - level = 180, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- pair of dreamwalkers - itemid = 29424, - type = "deequip", - slot = "feet", - level = 180, - }, - { - -- dream shroud - itemid = 29423, - type = "equip", - slot = "armor", - level = 180, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- dream shroud - itemid = 29423, - type = "deequip", - slot = "armor", - level = 180, - }, - { - -- winterblade - itemid = 29422, - type = "equip", - slot = "hand", - }, - { - -- winterblade - itemid = 29422, - type = "deequip", - slot = "hand", - }, - { - -- summerblade - itemid = 29421, - type = "equip", - slot = "hand", - }, - { - -- summerblade - itemid = 29421, - type = "deequip", - slot = "hand", - }, - { - -- shoulder plate - itemid = 29420, - type = "equip", - slot = "shield", - level = 180, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- shoulder plate - itemid = 29420, - type = "deequip", - slot = "shield", - level = 180, - }, - { - -- resizer - itemid = 29419, - type = "equip", - slot = "hand", - }, - { - -- resizer - itemid = 29419, - type = "deequip", - slot = "hand", - }, - { - -- living armor - itemid = 29418, - type = "equip", - slot = "armor", - level = 180, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- living armor - itemid = 29418, - type = "deequip", - slot = "armor", - level = 180, - }, - { - -- living vine bow - itemid = 29417, - type = "equip", - slot = "hand", - }, - { - -- living vine bow - itemid = 29417, - type = "deequip", - slot = "hand", - }, - { - -- golden axe - itemid = 29286, - type = "equip", - slot = "hand", - }, - { - -- golden axe - itemid = 29286, - type = "deequip", - slot = "hand", - }, - { - -- book backpack - itemid = 28571, - type = "equip", - slot = "backpack", - }, - { - -- book backpack - itemid = 28571, - type = "deequip", - slot = "backpack", - }, - { - -- wand of destruction test - itemid = 28479, - type = "equip", - slot = "hand", - }, - { - -- wand of destruction test - itemid = 28479, - type = "deequip", - slot = "hand", - }, - { - -- umbral master bow test - itemid = 28478, - type = "equip", - slot = "hand", - }, - { - -- umbral master bow test - itemid = 28478, - type = "deequip", - slot = "hand", - }, - { - -- ornate testtplate - itemid = 28475, - type = "equip", - slot = "armor", - }, - { - -- ornate testtplate - itemid = 28475, - type = "deequip", - slot = "armor", - }, - { - -- sorcerer test weapon - itemid = 28466, - type = "equip", - slot = "hand", - }, - { - -- sorcerer test weapon - itemid = 28466, - type = "deequip", - slot = "hand", - }, - { - -- bow of destruction test - itemid = 28465, - type = "equip", - slot = "hand", - }, - { - -- bow of destruction test - itemid = 28465, - type = "deequip", - slot = "hand", - }, - { - -- test weapon for knights - itemid = 28464, - type = "equip", - slot = "hand", - }, - { - -- test weapon for knights - itemid = 28464, - type = "deequip", - slot = "hand", - }, - { - -- sulphurous demonbone - itemid = 28832, - type = "equip", - slot = "hand", - }, - { - -- sulphurous demonbone - itemid = 28832, - type = "deequip", - slot = "hand", - }, - { - -- unliving demonbone - itemid = 28831, - type = "equip", - slot = "hand", - }, - { - -- unliving demonbone - itemid = 28831, - type = "deequip", - slot = "hand", - }, - { - -- energized demonbone - itemid = 28830, - type = "equip", - slot = "hand", - }, - { - -- energized demonbone - itemid = 28830, - type = "deequip", - slot = "hand", - }, - { - -- rotten demonbone - itemid = 28829, - type = "equip", - slot = "hand", - }, - { - -- rotten demonbone - itemid = 28829, - type = "deequip", - slot = "hand", - }, - { - -- deepling fork - itemid = 28826, - type = "equip", - slot = "hand", - level = 230, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- deepling fork - itemid = 28826, - type = "deequip", - slot = "hand", - level = 230, - }, - { - -- deepling ceremonial dagger - itemid = 28825, - type = "equip", - slot = "hand", - level = 180, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- deepling ceremonial dagger - itemid = 28825, - type = "deequip", - slot = "hand", - level = 180, - }, - { - -- falcon mace - itemid = 28725, - type = "equip", - slot = "hand", - }, - { - -- falcon mace - itemid = 28725, - type = "deequip", - slot = "hand", - }, - { - -- falcon battleaxe - itemid = 28724, - type = "equip", - slot = "hand", - }, - { - -- falcon battleaxe - itemid = 28724, - type = "deequip", - slot = "hand", - }, - { - -- falcon longsword - itemid = 28723, - type = "equip", - slot = "hand", - }, - { - -- falcon longsword - itemid = 28723, - type = "deequip", - slot = "hand", - }, - { - -- falcon escutcheon - itemid = 28722, - type = "equip", - slot = "shield", - level = 300, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- falcon escutcheon - itemid = 28722, - type = "deequip", - slot = "shield", - level = 300, - }, - { - -- falcon shield - itemid = 28721, - type = "equip", - slot = "shield", - level = 300, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- falcon shield - itemid = 28721, - type = "deequip", - slot = "shield", - level = 300, - }, - { - -- falcon greaves - itemid = 28720, - type = "equip", - slot = "legs", - level = 300, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- falcon greaves - itemid = 28720, - type = "deequip", - slot = "legs", - level = 300, - }, - { - -- falcon plate - itemid = 28719, - type = "equip", - slot = "armor", - level = 300, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- falcon plate - itemid = 28719, - type = "deequip", - slot = "armor", - level = 300, - }, - { - -- falcon bow - itemid = 28718, - type = "equip", - slot = "hand", - }, - { - -- falcon bow - itemid = 28718, - type = "deequip", - slot = "hand", - }, - { - -- falcon wand - itemid = 28717, - type = "equip", - slot = "hand", - level = 300, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- falcon wand - itemid = 28717, - type = "deequip", - slot = "hand", - level = 300, - }, - { - -- falcon rod - itemid = 28716, - type = "equip", - slot = "hand", - level = 300, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- falcon rod - itemid = 28716, - type = "deequip", - slot = "hand", - level = 300, - }, - { - -- falcon coif - itemid = 28715, - type = "equip", - slot = "head", - level = 300, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- falcon coif - itemid = 28715, - type = "deequip", - slot = "head", - level = 300, - }, - { - -- falcon circlet - itemid = 28714, - type = "equip", - slot = "head", - level = 300, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- falcon circlet - itemid = 28714, - type = "deequip", - slot = "head", - level = 300, - }, - { - -- silver chimes - itemid = 12126, - type = "equip", - slot = "shield", - }, - { - -- silver chimes - itemid = 12126, - type = "deequip", - slot = "shield", - }, - { - -- suspicious device - itemid = 27653, - type = "equip", - slot = "necklace", - }, - { - -- suspicious device - itemid = 27653, - type = "deequip", - slot = "necklace", - }, - { - -- gnome sword - itemid = 27651, - type = "equip", - slot = "hand", - }, - { - -- gnome sword - itemid = 27651, - type = "deequip", - slot = "hand", - }, - { - -- gnome shield - itemid = 27650, - type = "equip", - slot = "shield", - level = 200, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Royal Paladin" }, - { "Elite Knight" }, - }, - }, - { - -- gnome shield - itemid = 27650, - type = "deequip", - slot = "shield", - level = 200, - }, - { - -- gnome legs - itemid = 27649, - type = "equip", - slot = "legs", - level = 200, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- gnome legs - itemid = 27649, - type = "deequip", - slot = "legs", - level = 200, - }, - { - -- gnome armor - itemid = 27648, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- gnome armor - itemid = 27648, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- gnome helmet - itemid = 27647, - type = "equip", - slot = "head", - level = 200, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- gnome helmet - itemid = 27647, - type = "deequip", - slot = "head", - level = 200, - }, - { - -- foxtail amulet - itemid = 27565, - type = "equip", - slot = "necklace", - level = 100, - }, - { - -- foxtail amulet - itemid = 27565, - type = "deequip", - slot = "necklace", - level = 100, - }, - { - -- mallet handle - itemid = 27525, - type = "equip", - slot = "hand", - }, - { - -- mallet handle - itemid = 27525, - type = "deequip", - slot = "hand", - }, - { - -- strange mallet - itemid = 27523, - type = "equip", - slot = "hand", - }, - { - -- strange mallet - itemid = 27523, - type = "deequip", - slot = "hand", - }, - { - -- blue spectacles - itemid = 27522, - type = "equip", - slot = "head", - }, - { - -- blue spectacles - itemid = 27522, - type = "deequip", - slot = "head", - }, - { - -- rod of destruction - itemid = 27458, - type = "equip", - slot = "hand", - level = 200, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- rod of destruction - itemid = 27458, - type = "deequip", - slot = "hand", - level = 200, - }, - { - -- wand of destruction - itemid = 27457, - type = "equip", - slot = "hand", - level = 200, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of destruction - itemid = 27457, - type = "deequip", - slot = "hand", - level = 200, - }, - { - -- crossbow of destruction - itemid = 27456, - type = "equip", - slot = "hand", - }, - { - -- crossbow of destruction - itemid = 27456, - type = "deequip", - slot = "hand", - }, - { - -- bow of destruction - itemid = 27455, - type = "equip", - slot = "hand", - }, - { - -- bow of destruction - itemid = 27455, - type = "deequip", - slot = "hand", - }, - { - -- hammer of destruction - itemid = 27454, - type = "equip", - slot = "hand", - }, - { - -- hammer of destruction - itemid = 27454, - type = "deequip", - slot = "hand", - }, - { - -- mace of destruction - itemid = 27453, - type = "equip", - slot = "hand", - }, - { - -- mace of destruction - itemid = 27453, - type = "deequip", - slot = "hand", - }, - { - -- chopper of destruction - itemid = 27452, - type = "equip", - slot = "hand", - }, - { - -- chopper of destruction - itemid = 27452, - type = "deequip", - slot = "hand", - }, - { - -- axe of destruction - itemid = 27451, - type = "equip", - slot = "hand", - }, - { - -- axe of destruction - itemid = 27451, - type = "deequip", - slot = "hand", - }, - { - -- slayer of destruction - itemid = 27450, - type = "equip", - slot = "hand", - }, - { - -- slayer of destruction - itemid = 27450, - type = "deequip", - slot = "hand", - }, - { - -- blade of destruction - itemid = 27449, - type = "equip", - slot = "hand", - }, - { - -- blade of destruction - itemid = 27449, - type = "deequip", - slot = "hand", - }, - { - -- Journal Shield - itemid = 26947, - type = "equip", - slot = "shield", - }, - { - -- Journal Shield - itemid = 26947, - type = "deequip", - slot = "shield", - }, - { - -- reflecting crown - itemid = 26190, - type = "equip", - slot = "head", - }, - { - -- reflecting crown - itemid = 26190, - type = "deequip", - slot = "head", - }, - { - -- incandescent crown - itemid = 26189, - type = "equip", - slot = "head", - }, - { - -- incandescent crown - itemid = 26189, - type = "deequip", - slot = "head", - }, - { - -- iron crown - itemid = 26188, - type = "equip", - slot = "head", - }, - { - -- iron crown - itemid = 26188, - type = "deequip", - slot = "head", - }, - { - -- leaf crown - itemid = 26187, - type = "equip", - slot = "head", - }, - { - -- leaf crown - itemid = 26187, - type = "deequip", - slot = "head", - }, - { - -- ornate carving hammer - itemid = 26061, - type = "equip", - slot = "hand", - }, - { - -- ornate carving hammer - itemid = 26061, - type = "deequip", - slot = "hand", - }, - { - -- valuable carving hammer - itemid = 26060, - type = "equip", - slot = "hand", - }, - { - -- valuable carving hammer - itemid = 26060, - type = "deequip", - slot = "hand", - }, - { - -- plain carving hammer - itemid = 26059, - type = "equip", - slot = "hand", - }, - { - -- plain carving hammer - itemid = 26059, - type = "deequip", - slot = "hand", - }, - { - -- ornate carving mace - itemid = 26058, - type = "equip", - slot = "hand", - }, - { - -- ornate carving mace - itemid = 26058, - type = "deequip", - slot = "hand", - }, - { - -- valuable carving mace - itemid = 26057, - type = "equip", - slot = "hand", - }, - { - -- valuable carving mace - itemid = 26057, - type = "deequip", - slot = "hand", - }, - { - -- plain carving mace - itemid = 26056, - type = "equip", - slot = "hand", - }, - { - -- plain carving mace - itemid = 26056, - type = "deequip", - slot = "hand", - }, - { - -- ornate carving chopper - itemid = 26055, - type = "equip", - slot = "hand", - }, - { - -- ornate carving chopper - itemid = 26055, - type = "deequip", - slot = "hand", - }, - { - -- valuable carving chopper - itemid = 26054, - type = "equip", - slot = "hand", - }, - { - -- valuable carving chopper - itemid = 26054, - type = "deequip", - slot = "hand", - }, - { - -- plain carving chopper - itemid = 26053, - type = "equip", - slot = "hand", - }, - { - -- plain carving chopper - itemid = 26053, - type = "deequip", - slot = "hand", - }, - { - -- ornate carving axe - itemid = 26052, - type = "equip", - slot = "hand", - }, - { - -- ornate carving axe - itemid = 26052, - type = "deequip", - slot = "hand", - }, - { - -- valuable carving axe - itemid = 26051, - type = "equip", - slot = "hand", - }, - { - -- valuable carving axe - itemid = 26051, - type = "deequip", - slot = "hand", - }, - { - -- plain carving axe - itemid = 26050, - type = "equip", - slot = "hand", - }, - { - -- plain carving axe - itemid = 26050, - type = "deequip", - slot = "hand", - }, - { - -- ornate carving slayer - itemid = 26049, - type = "equip", - slot = "hand", - }, - { - -- ornate carving slayer - itemid = 26049, - type = "deequip", - slot = "hand", - }, - { - -- valuable carving slayer - itemid = 26048, - type = "equip", - slot = "hand", - }, - { - -- valuable carving slayer - itemid = 26048, - type = "deequip", - slot = "hand", - }, - { - -- plain carving slayer - itemid = 26047, - type = "equip", - slot = "hand", - }, - { - -- plain carving slayer - itemid = 26047, - type = "deequip", - slot = "hand", - }, - { - -- ornate carving blade - itemid = 26046, - type = "equip", - slot = "hand", - }, - { - -- ornate carving blade - itemid = 26046, - type = "deequip", - slot = "hand", - }, - { - -- valuable carving blade - itemid = 26045, - type = "equip", - slot = "hand", - }, - { - -- valuable carving blade - itemid = 26045, - type = "deequip", - slot = "hand", - }, - { - -- plain carving blade - itemid = 26044, - type = "equip", - slot = "hand", - }, - { - -- plain carving blade - itemid = 26044, - type = "deequip", - slot = "hand", - }, - { - -- ornate remedy hammer - itemid = 26031, - type = "equip", - slot = "hand", - }, - { - -- ornate remedy hammer - itemid = 26031, - type = "deequip", - slot = "hand", - }, - { - -- valuable remedy hammer - itemid = 26030, - type = "equip", - slot = "hand", - }, - { - -- valuable remedy hammer - itemid = 26030, - type = "deequip", - slot = "hand", - }, - { - -- plain remedy hammer - itemid = 26029, - type = "equip", - slot = "hand", - }, - { - -- plain remedy hammer - itemid = 26029, - type = "deequip", - slot = "hand", - }, - { - -- ornate remedy mace - itemid = 26028, - type = "equip", - slot = "hand", - }, - { - -- ornate remedy mace - itemid = 26028, - type = "deequip", - slot = "hand", - }, - { - -- valuable remedy mace - itemid = 26027, - type = "equip", - slot = "hand", - }, - { - -- valuable remedy mace - itemid = 26027, - type = "deequip", - slot = "hand", - }, - { - -- plain remedy mace - itemid = 26026, - type = "equip", - slot = "hand", - }, - { - -- plain remedy mace - itemid = 26026, - type = "deequip", - slot = "hand", - }, - { - -- ornate remedy chopper - itemid = 26025, - type = "equip", - slot = "hand", - }, - { - -- ornate remedy chopper - itemid = 26025, - type = "deequip", - slot = "hand", - }, - { - -- valuable remedy chopper - itemid = 26024, - type = "equip", - slot = "hand", - }, - { - -- valuable remedy chopper - itemid = 26024, - type = "deequip", - slot = "hand", - }, - { - -- plain remedy chopper - itemid = 26023, - type = "equip", - slot = "hand", - }, - { - -- plain remedy chopper - itemid = 26023, - type = "deequip", - slot = "hand", - }, - { - -- ornate remedy axe - itemid = 26022, - type = "equip", - slot = "hand", - }, - { - -- ornate remedy axe - itemid = 26022, - type = "deequip", - slot = "hand", - }, - { - -- valuable remedy axe - itemid = 26021, - type = "equip", - slot = "hand", - }, - { - -- valuable remedy axe - itemid = 26021, - type = "deequip", - slot = "hand", - }, - { - -- plain remedy axe - itemid = 26020, - type = "equip", - slot = "hand", - }, - { - -- plain remedy axe - itemid = 26020, - type = "deequip", - slot = "hand", - }, - { - -- ornate remedy slayer - itemid = 26019, - type = "equip", - slot = "hand", - }, - { - -- ornate remedy slayer - itemid = 26019, - type = "deequip", - slot = "hand", - }, - { - -- valuable remedy slayer - itemid = 26018, - type = "equip", - slot = "hand", - }, - { - -- valuable remedy slayer - itemid = 26018, - type = "deequip", - slot = "hand", - }, - { - -- plain remedy slayer - itemid = 26017, - type = "equip", - slot = "hand", - }, - { - -- plain remedy slayer - itemid = 26017, - type = "deequip", - slot = "hand", - }, - { - -- ornate remedy blade - itemid = 26016, - type = "equip", - slot = "hand", - }, - { - -- ornate remedy blade - itemid = 26016, - type = "deequip", - slot = "hand", - }, - { - -- valuable remedy blade - itemid = 26015, - type = "equip", - slot = "hand", - }, - { - -- valuable remedy blade - itemid = 26015, - type = "deequip", - slot = "hand", - }, - { - -- plain remedy blade - itemid = 26014, - type = "equip", - slot = "hand", - }, - { - -- plain remedy blade - itemid = 26014, - type = "deequip", - slot = "hand", - }, - { - -- ornate mayhem hammer - itemid = 26000, - type = "equip", - slot = "hand", - }, - { - -- ornate mayhem hammer - itemid = 26000, - type = "deequip", - slot = "hand", - }, - { - -- valuable mayhem hammer - itemid = 25999, - type = "equip", - slot = "hand", - }, - { - -- valuable mayhem hammer - itemid = 25999, - type = "deequip", - slot = "hand", - }, - { - -- plain mayhem hammer - itemid = 25998, - type = "equip", - slot = "hand", - }, - { - -- plain mayhem hammer - itemid = 25998, - type = "deequip", - slot = "hand", - }, - { - -- ornate mayhem mace - itemid = 25997, - type = "equip", - slot = "hand", - }, - { - -- ornate mayhem mace - itemid = 25997, - type = "deequip", - slot = "hand", - }, - { - -- valuable mayhem mace - itemid = 25996, - type = "equip", - slot = "hand", - }, - { - -- valuable mayhem mace - itemid = 25996, - type = "deequip", - slot = "hand", - }, - { - -- plain mayhem mace - itemid = 25995, - type = "equip", - slot = "hand", - }, - { - -- plain mayhem mace - itemid = 25995, - type = "deequip", - slot = "hand", - }, - { - -- ornate mayhem chopper - itemid = 25994, - type = "equip", - slot = "hand", - }, - { - -- ornate mayhem chopper - itemid = 25994, - type = "deequip", - slot = "hand", - }, - { - -- valuable mayhem chopper - itemid = 25993, - type = "equip", - slot = "hand", - }, - { - -- valuable mayhem chopper - itemid = 25993, - type = "deequip", - slot = "hand", - }, - { - -- plain mayhem chopper - itemid = 25992, - type = "equip", - slot = "hand", - }, - { - -- plain mayhem chopper - itemid = 25992, - type = "deequip", - slot = "hand", - }, - { - -- ornate mayhem axe - itemid = 25991, - type = "equip", - slot = "hand", - }, - { - -- ornate mayhem axe - itemid = 25991, - type = "deequip", - slot = "hand", - }, - { - -- valuable mayhem axe - itemid = 25990, - type = "equip", - slot = "hand", - }, - { - -- valuable mayhem axe - itemid = 25990, - type = "deequip", - slot = "hand", - }, - { - -- plain mayhem axe - itemid = 25989, - type = "equip", - slot = "hand", - }, - { - -- plain mayhem axe - itemid = 25989, - type = "deequip", - slot = "hand", - }, - { - -- ornate mayhem slayer - itemid = 25988, - type = "equip", - slot = "hand", - }, - { - -- ornate mayhem slayer - itemid = 25988, - type = "deequip", - slot = "hand", - }, - { - -- valuable mayhem slayer - itemid = 25987, - type = "equip", - slot = "hand", - }, - { - -- valuable mayhem slayer - itemid = 25987, - type = "deequip", - slot = "hand", - }, - { - -- plain mayhem slayer - itemid = 25986, - type = "equip", - slot = "hand", - }, - { - -- plain mayhem slayer - itemid = 25986, - type = "deequip", - slot = "hand", - }, - { - -- ornate mayhem blade - itemid = 25985, - type = "equip", - slot = "hand", - }, - { - -- ornate mayhem blade - itemid = 25985, - type = "deequip", - slot = "hand", - }, - { - -- valuable mayhem blade - itemid = 25984, - type = "equip", - slot = "hand", - }, - { - -- valuable mayhem blade - itemid = 25984, - type = "deequip", - slot = "hand", - }, - { - -- plain mayhem blade - itemid = 25983, - type = "equip", - slot = "hand", - }, - { - -- plain mayhem blade - itemid = 25983, - type = "deequip", - slot = "hand", - }, - { - -- mathmaster shield (souvenir) - itemid = 25982, - type = "equip", - slot = "shield", - }, - { - -- mathmaster shield (souvenir) - itemid = 25982, - type = "deequip", - slot = "shield", - }, - { - -- energy war hammer replica - itemid = 25974, - type = "equip", - slot = "hand", - }, - { - -- energy war hammer replica - itemid = 25974, - type = "deequip", - slot = "hand", - }, - { - -- energy orcish maul replica - itemid = 25973, - type = "equip", - slot = "hand", - }, - { - -- energy orcish maul replica - itemid = 25973, - type = "deequip", - slot = "hand", - }, - { - -- energy basher replica - itemid = 25972, - type = "equip", - slot = "hand", - }, - { - -- energy basher replica - itemid = 25972, - type = "deequip", - slot = "hand", - }, - { - -- energy crystal mace replica - itemid = 25971, - type = "equip", - slot = "hand", - }, - { - -- energy crystal mace replica - itemid = 25971, - type = "deequip", - slot = "hand", - }, - { - -- energy clerical mace replica - itemid = 25970, - type = "equip", - slot = "hand", - }, - { - -- energy clerical mace replica - itemid = 25970, - type = "deequip", - slot = "hand", - }, - { - -- energy war axe replica - itemid = 25969, - type = "equip", - slot = "hand", - }, - { - -- energy war axe replica - itemid = 25969, - type = "deequip", - slot = "hand", - }, - { - -- energy headchopper replica - itemid = 25968, - type = "equip", - slot = "hand", - }, - { - -- energy headchopper replica - itemid = 25968, - type = "deequip", - slot = "hand", - }, - { - -- energy heroic axe replica - itemid = 25967, - type = "equip", - slot = "hand", - }, - { - -- energy heroic axe replica - itemid = 25967, - type = "deequip", - slot = "hand", - }, - { - -- energy knight axe replica - itemid = 25966, - type = "equip", - slot = "hand", - }, - { - -- energy knight axe replica - itemid = 25966, - type = "deequip", - slot = "hand", - }, - { - -- energy barbarian axe replica - itemid = 25965, - type = "equip", - slot = "hand", - }, - { - -- energy barbarian axe replica - itemid = 25965, - type = "deequip", - slot = "hand", - }, - { - -- energy dragon slayer replica - itemid = 25964, - type = "equip", - slot = "hand", - }, - { - -- energy dragon slayer replica - itemid = 25964, - type = "deequip", - slot = "hand", - }, - { - -- energy blacksteel replica - itemid = 25963, - type = "equip", - slot = "hand", - }, - { - -- energy blacksteel replica - itemid = 25963, - type = "deequip", - slot = "hand", - }, - { - -- energy mystic blade replica - itemid = 25962, - type = "equip", - slot = "hand", - }, - { - -- energy mystic blade replica - itemid = 25962, - type = "deequip", - slot = "hand", - }, - { - -- energy relic sword replica - itemid = 25961, - type = "equip", - slot = "hand", - }, - { - -- energy relic sword replica - itemid = 25961, - type = "deequip", - slot = "hand", - }, - { - -- energy spike sword replica - itemid = 25960, - type = "equip", - slot = "hand", - }, - { - -- energy spike sword replica - itemid = 25960, - type = "deequip", - slot = "hand", - }, - { - -- earth war hammer replica - itemid = 25959, - type = "equip", - slot = "hand", - }, - { - -- earth war hammer replica - itemid = 25959, - type = "deequip", - slot = "hand", - }, - { - -- earth orcish maul replica - itemid = 25958, - type = "equip", - slot = "hand", - }, - { - -- earth orcish maul replica - itemid = 25958, - type = "deequip", - slot = "hand", - }, - { - -- earth basher replica - itemid = 25957, - type = "equip", - slot = "hand", - }, - { - -- earth basher replica - itemid = 25957, - type = "deequip", - slot = "hand", - }, - { - -- earth crystal mace replica - itemid = 25956, - type = "equip", - slot = "hand", - }, - { - -- earth crystal mace replica - itemid = 25956, - type = "deequip", - slot = "hand", - }, - { - -- earth clerical mace replica - itemid = 25955, - type = "equip", - slot = "hand", - }, - { - -- earth clerical mace replica - itemid = 25955, - type = "deequip", - slot = "hand", - }, - { - -- earth war axe replica - itemid = 25954, - type = "equip", - slot = "hand", - }, - { - -- earth war axe replica - itemid = 25954, - type = "deequip", - slot = "hand", - }, - { - -- earth headchopper replica - itemid = 25953, - type = "equip", - slot = "hand", - }, - { - -- earth headchopper replica - itemid = 25953, - type = "deequip", - slot = "hand", - }, - { - -- earth heroic axe replica - itemid = 25952, - type = "equip", - slot = "hand", - }, - { - -- earth heroic axe replica - itemid = 25952, - type = "deequip", - slot = "hand", - }, - { - -- earth knight axe replica - itemid = 25951, - type = "equip", - slot = "hand", - }, - { - -- earth knight axe replica - itemid = 25951, - type = "deequip", - slot = "hand", - }, - { - -- earth barbarian axe replica - itemid = 25950, - type = "equip", - slot = "hand", - }, - { - -- earth barbarian axe replica - itemid = 25950, - type = "deequip", - slot = "hand", - }, - { - -- earth dragon slayer replica - itemid = 25949, - type = "equip", - slot = "hand", - }, - { - -- earth dragon slayer replica - itemid = 25949, - type = "deequip", - slot = "hand", - }, - { - -- earth blacksteel replica - itemid = 25948, - type = "equip", - slot = "hand", - }, - { - -- earth blacksteel replica - itemid = 25948, - type = "deequip", - slot = "hand", - }, - { - -- earth mystic blade replica - itemid = 25947, - type = "equip", - slot = "hand", - }, - { - -- earth mystic blade replica - itemid = 25947, - type = "deequip", - slot = "hand", - }, - { - -- earth relic sword replica - itemid = 25946, - type = "equip", - slot = "hand", - }, - { - -- earth relic sword replica - itemid = 25946, - type = "deequip", - slot = "hand", - }, - { - -- earth spike sword replica - itemid = 25945, - type = "equip", - slot = "hand", - }, - { - -- earth spike sword replica - itemid = 25945, - type = "deequip", - slot = "hand", - }, - { - -- icy war hammer replica - itemid = 25944, - type = "equip", - slot = "hand", - }, - { - -- icy war hammer replica - itemid = 25944, - type = "deequip", - slot = "hand", - }, - { - -- icy orcish maul replica - itemid = 25943, - type = "equip", - slot = "hand", - }, - { - -- icy orcish maul replica - itemid = 25943, - type = "deequip", - slot = "hand", - }, - { - -- icy basher replica - itemid = 25942, - type = "equip", - slot = "hand", - }, - { - -- icy basher replica - itemid = 25942, - type = "deequip", - slot = "hand", - }, - { - -- icy crystal mace replica - itemid = 25941, - type = "equip", - slot = "hand", - }, - { - -- icy crystal mace replica - itemid = 25941, - type = "deequip", - slot = "hand", - }, - { - -- icy clerical mace replica - itemid = 25940, - type = "equip", - slot = "hand", - }, - { - -- icy clerical mace replica - itemid = 25940, - type = "deequip", - slot = "hand", - }, - { - -- icy war axe replica - itemid = 25939, - type = "equip", - slot = "hand", - }, - { - -- icy war axe replica - itemid = 25939, - type = "deequip", - slot = "hand", - }, - { - -- icy headchopper replica - itemid = 25938, - type = "equip", - slot = "hand", - }, - { - -- icy headchopper replica - itemid = 25938, - type = "deequip", - slot = "hand", - }, - { - -- icy heroic axe replica - itemid = 25937, - type = "equip", - slot = "hand", - }, - { - -- icy heroic axe replica - itemid = 25937, - type = "deequip", - slot = "hand", - }, - { - -- icy knight axe replica - itemid = 25936, - type = "equip", - slot = "hand", - }, - { - -- icy knight axe replica - itemid = 25936, - type = "deequip", - slot = "hand", - }, - { - -- icy barbarian axe replica - itemid = 25935, - type = "equip", - slot = "hand", - }, - { - -- icy barbarian axe replica - itemid = 25935, - type = "deequip", - slot = "hand", - }, - { - -- icy dragon slayer replica - itemid = 25934, - type = "equip", - slot = "hand", - }, - { - -- icy dragon slayer replica - itemid = 25934, - type = "deequip", - slot = "hand", - }, - { - -- icy blacksteel replica - itemid = 25933, - type = "equip", - slot = "hand", - }, - { - -- icy blacksteel replica - itemid = 25933, - type = "deequip", - slot = "hand", - }, - { - -- icy mystic blade replica - itemid = 25932, - type = "equip", - slot = "hand", - }, - { - -- icy mystic blade replica - itemid = 25932, - type = "deequip", - slot = "hand", - }, - { - -- icy relic sword replica - itemid = 25931, - type = "equip", - slot = "hand", - }, - { - -- icy relic sword replica - itemid = 25931, - type = "deequip", - slot = "hand", - }, - { - -- icy spike sword replica - itemid = 25930, - type = "equip", - slot = "hand", - }, - { - -- icy spike sword replica - itemid = 25930, - type = "deequip", - slot = "hand", - }, - { - -- fiery war hammer replica - itemid = 25929, - type = "equip", - slot = "hand", - }, - { - -- fiery war hammer replica - itemid = 25929, - type = "deequip", - slot = "hand", - }, - { - -- fiery orcish maul replica - itemid = 25928, - type = "equip", - slot = "hand", - }, - { - -- fiery orcish maul replica - itemid = 25928, - type = "deequip", - slot = "hand", - }, - { - -- fiery basher replica - itemid = 25927, - type = "equip", - slot = "hand", - }, - { - -- fiery basher replica - itemid = 25927, - type = "deequip", - slot = "hand", - }, - { - -- fiery crystal mace replica - itemid = 25926, - type = "equip", - slot = "hand", - }, - { - -- fiery crystal mace replica - itemid = 25926, - type = "deequip", - slot = "hand", - }, - { - -- fiery clerical mace replica - itemid = 25925, - type = "equip", - slot = "hand", - }, - { - -- fiery clerical mace replica - itemid = 25925, - type = "deequip", - slot = "hand", - }, - { - -- fiery war axe replica - itemid = 25924, - type = "equip", - slot = "hand", - }, - { - -- fiery war axe replica - itemid = 25924, - type = "deequip", - slot = "hand", - }, - { - -- fiery headchopper replica - itemid = 25923, - type = "equip", - slot = "hand", - }, - { - -- fiery headchopper replica - itemid = 25923, - type = "deequip", - slot = "hand", - }, - { - -- fiery heroic axe replica - itemid = 25922, - type = "equip", - slot = "hand", - }, - { - -- fiery heroic axe replica - itemid = 25922, - type = "deequip", - slot = "hand", - }, - { - -- fiery knight axe replica - itemid = 25921, - type = "equip", - slot = "hand", - }, - { - -- fiery knight axe replica - itemid = 25921, - type = "deequip", - slot = "hand", - }, - { - -- fiery barbarian axe replica - itemid = 25920, - type = "equip", - slot = "hand", - }, - { - -- fiery barbarian axe replica - itemid = 25920, - type = "deequip", - slot = "hand", - }, - { - -- fiery dragon slayer replica - itemid = 25919, - type = "equip", - slot = "hand", - }, - { - -- fiery dragon slayer replica - itemid = 25919, - type = "deequip", - slot = "hand", - }, - { - -- fiery blacksteel replica - itemid = 25918, - type = "equip", - slot = "hand", - }, - { - -- fiery blacksteel replica - itemid = 25918, - type = "deequip", - slot = "hand", - }, - { - -- fiery mystic blade replica - itemid = 25917, - type = "equip", - slot = "hand", - }, - { - -- fiery mystic blade replica - itemid = 25917, - type = "deequip", - slot = "hand", - }, - { - -- fiery relic sword replica - itemid = 25916, - type = "equip", - slot = "hand", - }, - { - -- fiery relic sword replica - itemid = 25916, - type = "deequip", - slot = "hand", - }, - { - -- fiery spike sword replica - itemid = 25915, - type = "equip", - slot = "hand", - }, - { - -- fiery spike sword replica - itemid = 25915, - type = "deequip", - slot = "hand", - }, - { - -- blossom bag - itemid = 25780, - type = "equip", - slot = "backpack", - }, - { - -- blossom bag - itemid = 25780, - type = "deequip", - slot = "backpack", - }, - { - -- swan feather cloak - itemid = 25779, - type = "equip", - slot = "armor", - level = 60, - }, - { - -- swan feather cloak - itemid = 25779, - type = "deequip", - slot = "armor", - level = 60, - }, - { - -- wand of darkness - itemid = 25760, - type = "equip", - slot = "hand", - level = 41, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of darkness - itemid = 25760, - type = "deequip", - slot = "hand", - level = 41, - }, - { - -- royal star - itemid = 25759, - type = "equip", - slot = "hand", - }, - { - -- royal star - itemid = 25759, - type = "deequip", - slot = "hand", - }, - { - -- spectral bolt - itemid = 25758, - type = "equip", - slot = "ammo", - }, - { - -- spectral bolt - itemid = 25758, - type = "deequip", - slot = "ammo", - }, - { - -- leaf star - itemid = 25735, - type = "equip", - slot = "hand", - }, - { - -- leaf star - itemid = 25735, - type = "deequip", - slot = "hand", - }, - { - -- dream blossom staff - itemid = 25700, - type = "equip", - slot = "hand", - level = 80, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- dream blossom staff - itemid = 25700, - type = "deequip", - slot = "hand", - level = 80, - }, - { - -- wooden spellbook - itemid = 25699, - type = "equip", - slot = "shield", - level = 80, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- wooden spellbook - itemid = 25699, - type = "deequip", - slot = "shield", - level = 80, - }, - { - -- butterfly ring - itemid = 25698, - type = "equip", - slot = "ring", - level = 50, - }, - { - -- butterfly ring - itemid = 25698, - type = "deequip", - slot = "ring", - level = 50, - }, - { - -- glowing rubbish amulet - itemid = 25297, - type = "equip", - slot = "necklace", - }, - { - -- glowing rubbish amulet - itemid = 25297, - type = "deequip", - slot = "necklace", - }, - { - -- rubbish amulet - itemid = 25296, - type = "equip", - slot = "necklace", - }, - { - -- rubbish amulet - itemid = 25296, - type = "deequip", - slot = "necklace", - }, - { - -- porcelain mask - itemid = 25088, - type = "equip", - slot = "head", - }, - { - -- porcelain mask - itemid = 25088, - type = "deequip", - slot = "head", - }, - { - -- filthy bunnyslippers - itemid = 24409, - type = "equip", - slot = "feet", - }, - { - -- filthy bunnyslippers - itemid = 24409, - type = "deequip", - slot = "feet", - }, - { - -- rusty winged helmet - itemid = 24405, - type = "equip", - slot = "head", - }, - { - -- rusty winged helmet - itemid = 24405, - type = "deequip", - slot = "head", - }, - { - -- tatty Dragon scale legs - itemid = 24404, - type = "equip", - slot = "legs", - }, - { - -- tatty Dragon scale legs - itemid = 24404, - type = "deequip", - slot = "legs", - }, - { - -- chocolatey dragon scale legs - itemid = 24402, - type = "equip", - slot = "legs", - }, - { - -- chocolatey dragon scale legs - itemid = 24402, - type = "deequip", - slot = "legs", - }, - { - -- Ferumbras' Candy Hat - itemid = 24397, - type = "equip", - slot = "head", - }, - { - -- Ferumbras' Candy Hat - itemid = 24397, - type = "deequip", - slot = "head", - }, - { - -- birthday backpack - itemid = 24395, - type = "equip", - slot = "backpack", - }, - { - -- birthday backpack - itemid = 24395, - type = "deequip", - slot = "backpack", - }, - { - -- pillow backpack - itemid = 24393, - type = "equip", - slot = "backpack", - }, - { - -- pillow backpack - itemid = 24393, - type = "deequip", - slot = "backpack", - }, - { - -- collar of red plasma - itemid = 23544, - type = "equip", - slot = "necklace", - level = 150, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- collar of red plasma - itemid = 23544, - type = "deequip", - slot = "necklace", - level = 150, - }, - { - -- collar of green plasma - itemid = 23543, - type = "equip", - slot = "necklace", - level = 150, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- collar of green plasma - itemid = 23543, - type = "deequip", - slot = "necklace", - level = 150, - }, - { - -- collar of blue plasma - itemid = 23542, - type = "equip", - slot = "necklace", - level = 150, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- collar of blue plasma - itemid = 23542, - type = "deequip", - slot = "necklace", - level = 150, - }, - { - -- ring of red plasma - itemid = 23534, - type = "equip", - slot = "ring", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- ring of red plasma - itemid = 23534, - type = "deequip", - slot = "ring", - level = 100, - }, - { - -- ring of red plasma - itemid = 23533, - type = "equip", - slot = "ring", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- ring of red plasma - itemid = 23533, - type = "deequip", - slot = "ring", - level = 100, - }, - { - -- ring of green plasma - itemid = 23532, - type = "equip", - slot = "ring", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- ring of green plasma - itemid = 23532, - type = "deequip", - slot = "ring", - level = 100, - }, - { - -- ring of green plasma - itemid = 23531, - type = "equip", - slot = "ring", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- ring of green plasma - itemid = 23531, - type = "deequip", - slot = "ring", - level = 100, - }, - { - -- ring of blue plasma - itemid = 23530, - type = "equip", - slot = "ring", - level = 100, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- ring of blue plasma - itemid = 23530, - type = "deequip", - slot = "ring", - level = 100, - }, - { - -- ring of blue plasma - itemid = 23529, - type = "equip", - slot = "ring", - level = 100, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- ring of blue plasma - itemid = 23529, - type = "deequip", - slot = "ring", - level = 100, - }, - { - -- collar of red plasma - itemid = 23528, - type = "equip", - slot = "necklace", - level = 150, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- collar of red plasma - itemid = 23528, - type = "deequip", - slot = "necklace", - level = 150, - }, - { - -- collar of green plasma - itemid = 23527, - type = "equip", - slot = "necklace", - level = 150, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- collar of green plasma - itemid = 23527, - type = "deequip", - slot = "necklace", - level = 150, - }, - { - -- collar of blue plasma - itemid = 23526, - type = "equip", - slot = "necklace", - level = 150, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- collar of blue plasma - itemid = 23526, - type = "deequip", - slot = "necklace", - level = 150, - }, - { - -- energetic backpack - itemid = 23525, - type = "equip", - slot = "backpack", - }, - { - -- energetic backpack - itemid = 23525, - type = "deequip", - slot = "backpack", - }, - { - -- void boots - itemid = 23477, - type = "equip", - slot = "feet", - level = 150, - }, - { - -- void boots - itemid = 23477, - type = "deequip", - slot = "feet", - level = 150, - }, - { - -- void boots - itemid = 23476, - type = "equip", - slot = "feet", - level = 150, - }, - { - -- void boots - itemid = 23476, - type = "deequip", - slot = "feet", - level = 150, - }, - { - -- tiara of power - itemid = 23475, - type = "equip", - slot = "head", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- tiara of power - itemid = 23475, - type = "deequip", - slot = "head", - level = 100, - }, - { - -- tiara of power - itemid = 23474, - type = "equip", - slot = "head", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- tiara of power - itemid = 23474, - type = "deequip", - slot = "head", - level = 100, - }, - { - -- rod of carving - itemid = 23339, - type = "equip", - slot = "hand", - level = 100, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- rod of carving - itemid = 23339, - type = "deequip", - slot = "hand", - level = 100, - }, - { - -- wand of carving - itemid = 23335, - type = "equip", - slot = "hand", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of carving - itemid = 23335, - type = "deequip", - slot = "hand", - level = 100, - }, - { - -- crossbow of carving - itemid = 23331, - type = "equip", - slot = "hand", - }, - { - -- crossbow of carving - itemid = 23331, - type = "deequip", - slot = "hand", - }, - { - -- bow of carving - itemid = 23327, - type = "equip", - slot = "hand", - }, - { - -- bow of carving - itemid = 23327, - type = "deequip", - slot = "hand", - }, - { - -- hammer of carving - itemid = 23323, - type = "equip", - slot = "hand", - }, - { - -- hammer of carving - itemid = 23323, - type = "deequip", - slot = "hand", - }, - { - -- mace of carving - itemid = 23319, - type = "equip", - slot = "hand", - }, - { - -- mace of carving - itemid = 23319, - type = "deequip", - slot = "hand", - }, - { - -- chopper of carving - itemid = 23315, - type = "equip", - slot = "hand", - }, - { - -- chopper of carving - itemid = 23315, - type = "deequip", - slot = "hand", - }, - { - -- axe of carving - itemid = 23311, - type = "equip", - slot = "hand", - }, - { - -- axe of carving - itemid = 23311, - type = "deequip", - slot = "hand", - }, - { - -- slayer of carving - itemid = 23307, - type = "equip", - slot = "hand", - }, - { - -- slayer of carving - itemid = 23307, - type = "deequip", - slot = "hand", - }, - { - -- blade of carving - itemid = 23303, - type = "equip", - slot = "hand", - }, - { - -- blade of carving - itemid = 23303, - type = "deequip", - slot = "hand", - }, - { - -- rod of remedy - itemid = 23299, - type = "equip", - slot = "hand", - level = 100, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- rod of remedy - itemid = 23299, - type = "deequip", - slot = "hand", - level = 100, - }, - { - -- wand of remedy - itemid = 23295, - type = "equip", - slot = "hand", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of remedy - itemid = 23295, - type = "deequip", - slot = "hand", - level = 100, - }, - { - -- crossbow of remedy - itemid = 23291, - type = "equip", - slot = "hand", - }, - { - -- crossbow of remedy - itemid = 23291, - type = "deequip", - slot = "hand", - }, - { - -- bow of remedy - itemid = 23287, - type = "equip", - slot = "hand", - }, - { - -- bow of remedy - itemid = 23287, - type = "deequip", - slot = "hand", - }, - { - -- mace of remedy - itemid = 23279, - type = "equip", - slot = "hand", - }, - { - -- mace of remedy - itemid = 23279, - type = "deequip", - slot = "hand", - }, - { - -- chopper of remedy - itemid = 23275, - type = "equip", - slot = "hand", - }, - { - -- chopper of remedy - itemid = 23275, - type = "deequip", - slot = "hand", - }, - { - -- axe of remedy - itemid = 23271, - type = "equip", - slot = "hand", - }, - { - -- axe of remedy - itemid = 23271, - type = "deequip", - slot = "hand", - }, - { - -- slayer of remedy - itemid = 23267, - type = "equip", - slot = "hand", - }, - { - -- slayer of remedy - itemid = 23267, - type = "deequip", - slot = "hand", - }, - { - -- blade of remedy - itemid = 23263, - type = "equip", - slot = "hand", - }, - { - -- blade of remedy - itemid = 23263, - type = "deequip", - slot = "hand", - }, - { - -- rod of mayhem - itemid = 23232, - type = "equip", - slot = "hand", - level = 100, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- rod of mayhem - itemid = 23232, - type = "deequip", - slot = "hand", - level = 100, - }, - { - -- wand of mayhem - itemid = 23231, - type = "equip", - slot = "hand", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of mayhem - itemid = 23231, - type = "deequip", - slot = "hand", - level = 100, - }, - { - -- crossbow of mayhem - itemid = 23230, - type = "equip", - slot = "hand", - }, - { - -- crossbow of mayhem - itemid = 23230, - type = "deequip", - slot = "hand", - }, - { - -- bow of mayhem - itemid = 23229, - type = "equip", - slot = "hand", - }, - { - -- bow of mayhem - itemid = 23229, - type = "deequip", - slot = "hand", - }, - { - -- hammer of mayhem - itemid = 23228, - type = "equip", - slot = "hand", - }, - { - -- hammer of mayhem - itemid = 23228, - type = "deequip", - slot = "hand", - }, - { - -- mace of mayhem - itemid = 23227, - type = "equip", - slot = "hand", - }, - { - -- mace of mayhem - itemid = 23227, - type = "deequip", - slot = "hand", - }, - { - -- chopper of mayhem - itemid = 23226, - type = "equip", - slot = "hand", - }, - { - -- chopper of mayhem - itemid = 23226, - type = "deequip", - slot = "hand", - }, - { - -- axe of mayhem - itemid = 23225, - type = "equip", - slot = "hand", - }, - { - -- axe of mayhem - itemid = 23225, - type = "deequip", - slot = "hand", - }, - { - -- slayer of mayhem - itemid = 23224, - type = "equip", - slot = "hand", - }, - { - -- slayer of mayhem - itemid = 23224, - type = "deequip", - slot = "hand", - }, - { - -- blade of mayhem - itemid = 23223, - type = "equip", - slot = "hand", - }, - { - -- blade of mayhem - itemid = 23223, - type = "deequip", - slot = "hand", - }, - { - -- shield of destiny - itemid = 22890, - type = "equip", - slot = "shield", - }, - { - -- shield of destiny - itemid = 22890, - type = "deequip", - slot = "shield", - }, - { - -- shield of destiny - itemid = 22889, - type = "equip", - slot = "shield", - }, - { - -- shield of destiny - itemid = 22889, - type = "deequip", - slot = "shield", - }, - { - -- rift crossbow - itemid = 22867, - type = "equip", - slot = "hand", - }, - { - -- rift crossbow - itemid = 22867, - type = "deequip", - slot = "hand", - }, - { - -- rift bow - itemid = 22866, - type = "equip", - slot = "hand", - }, - { - -- rift bow - itemid = 22866, - type = "deequip", - slot = "hand", - }, - { - -- boots of homecoming - itemid = 22774, - type = "equip", - slot = "feet", - level = 100, - }, - { - -- boots of homecoming - itemid = 22774, - type = "deequip", - slot = "feet", - level = 100, - }, - { - -- boots of homecoming - itemid = 22773, - type = "equip", - slot = "feet", - level = 100, - }, - { - -- boots of homecoming - itemid = 22773, - type = "deequip", - slot = "feet", - level = 100, - }, - { - -- ferumbras' amulet - itemid = 22768, - type = "equip", - slot = "necklace", - level = 100, - }, - { - -- ferumbras' amulet - itemid = 22768, - type = "deequip", - slot = "necklace", - level = 100, - }, - { - -- ferumbras' amulet - itemid = 22767, - type = "equip", - slot = "necklace", - level = 100, - }, - { - -- ferumbras' amulet - itemid = 22767, - type = "deequip", - slot = "necklace", - level = 100, - }, - { - -- ferumbras' staff (enchanted) - itemid = 22766, - type = "equip", - slot = "hand", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- ferumbras' staff (enchanted) - itemid = 22766, - type = "deequip", - slot = "hand", - level = 100, - }, - { - -- ferumbras' staff (failed) - itemid = 22765, - type = "equip", - slot = "hand", - level = 65, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- ferumbras' staff (failed) - itemid = 22765, - type = "deequip", - slot = "hand", - level = 65, - }, - { - -- Ferumbras' staff - itemid = 22764, - type = "equip", - slot = "hand", - }, - { - -- Ferumbras' staff - itemid = 22764, - type = "deequip", - slot = "hand", - }, - { - -- maimer - itemid = 22762, - type = "equip", - slot = "hand", - }, - { - -- maimer - itemid = 22762, - type = "deequip", - slot = "hand", - }, - { - -- Impaler of the igniter - itemid = 22760, - type = "equip", - slot = "hand", - }, - { - -- Impaler of the igniter - itemid = 22760, - type = "deequip", - slot = "hand", - }, - { - -- plague bite - itemid = 22759, - type = "equip", - slot = "hand", - }, - { - -- plague bite - itemid = 22759, - type = "deequip", - slot = "hand", - }, - { - -- death gaze - itemid = 22758, - type = "equip", - slot = "shield", - level = 200, - }, - { - -- death gaze - itemid = 22758, - type = "deequip", - slot = "shield", - level = 200, - }, - { - -- shroud of despair - itemid = 22757, - type = "equip", - slot = "head", - level = 150, - }, - { - -- shroud of despair - itemid = 22757, - type = "deequip", - slot = "head", - level = 150, - }, - { - -- treader of torment - itemid = 22756, - type = "equip", - slot = "feet", - }, - { - -- treader of torment - itemid = 22756, - type = "deequip", - slot = "feet", - }, - { - -- book of lies - itemid = 22755, - type = "equip", - slot = "shield", - level = 150, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- book of lies - itemid = 22755, - type = "deequip", - slot = "shield", - level = 150, - }, - { - -- visage of the end days - itemid = 22754, - type = "equip", - slot = "head", - }, - { - -- visage of the end days - itemid = 22754, - type = "deequip", - slot = "head", - }, - { - -- ancient amulet - itemid = 22746, - type = "equip", - slot = "necklace", - }, - { - -- ancient amulet - itemid = 22746, - type = "deequip", - slot = "necklace", - }, - { - -- rift lance - itemid = 22727, - type = "equip", - slot = "hand", - }, - { - -- rift lance - itemid = 22727, - type = "deequip", - slot = "hand", - }, - { - -- rift shield - itemid = 22726, - type = "equip", - slot = "shield", - }, - { - -- rift shield - itemid = 22726, - type = "deequip", - slot = "shield", - }, - { - -- rattling gourd - itemid = 22651, - type = "equip", - slot = "shield", - }, - { - -- rattling gourd - itemid = 22651, - type = "deequip", - slot = "shield", - }, - { - -- gourd - itemid = 22650, - type = "equip", - slot = "shield", - }, - { - -- gourd - itemid = 22650, - type = "deequip", - slot = "shield", - }, - { - -- frostmind raiment - itemid = 22537, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- frostmind raiment - itemid = 22537, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- thundermind raiment - itemid = 22536, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- thundermind raiment - itemid = 22536, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- earthmind raiment - itemid = 22535, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- earthmind raiment - itemid = 22535, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- firemind raiment - itemid = 22534, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- firemind raiment - itemid = 22534, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- frostsoul tabard - itemid = 22533, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- frostsoul tabard - itemid = 22533, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- thundersoul tabard - itemid = 22532, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- thundersoul tabard - itemid = 22532, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- earthsoul tabard - itemid = 22531, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- earthsoul tabard - itemid = 22531, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- firesoul tabard - itemid = 22530, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- firesoul tabard - itemid = 22530, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- frostheart platemail - itemid = 22529, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- frostheart platemail - itemid = 22529, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- frostheart hauberk - itemid = 22528, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- frostheart hauberk - itemid = 22528, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- frostheart cuirass - itemid = 22527, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- frostheart cuirass - itemid = 22527, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- thunderheart platemail - itemid = 22526, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- thunderheart platemail - itemid = 22526, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- thunderheart hauberk - itemid = 22525, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- thunderheart hauberk - itemid = 22525, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- thunderheart cuirass - itemid = 22524, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- thunderheart cuirass - itemid = 22524, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- earthheart platemail - itemid = 22523, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- earthheart platemail - itemid = 22523, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- earthheart hauberk - itemid = 22522, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- earthheart hauberk - itemid = 22522, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- earthheart cuirass - itemid = 22521, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- earthheart cuirass - itemid = 22521, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- fireheart platemail - itemid = 22520, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fireheart platemail - itemid = 22520, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- fireheart hauberk - itemid = 22519, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fireheart hauberk - itemid = 22519, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- fireheart cuirass - itemid = 22518, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fireheart cuirass - itemid = 22518, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- onyx pendant - itemid = 22195, - type = "equip", - slot = "necklace", - level = 60, - }, - { - -- onyx pendant - itemid = 22195, - type = "deequip", - slot = "necklace", - level = 60, - }, - { - -- shamanic mask - itemid = 22192, - type = "equip", - slot = "head", - }, - { - -- shamanic mask - itemid = 22192, - type = "deequip", - slot = "head", - }, - { - -- painted gourd rattle - itemid = 22190, - type = "equip", - slot = "shield", - }, - { - -- painted gourd rattle - itemid = 22190, - type = "deequip", - slot = "shield", - }, - { - -- ogre sceptra - itemid = 22183, - type = "equip", - slot = "hand", - level = 37, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- ogre sceptra - itemid = 22183, - type = "deequip", - slot = "hand", - level = 37, - }, - { - -- ogre choppa - itemid = 22172, - type = "equip", - slot = "hand", - }, - { - -- ogre choppa - itemid = 22172, - type = "deequip", - slot = "hand", - }, - { - -- ogre klubba - itemid = 22171, - type = "equip", - slot = "hand", - }, - { - -- ogre klubba - itemid = 22171, - type = "deequip", - slot = "hand", - }, - { - -- house silversun's signet ring - itemid = 22170, - type = "equip", - slot = "ring", - }, - { - -- house silversun's signet ring - itemid = 22170, - type = "deequip", - slot = "ring", - }, - { - -- dark wizard's crown - itemid = 22154, - type = "equip", - slot = "head", - }, - { - -- dark wizard's crown - itemid = 22154, - type = "deequip", - slot = "head", - }, - { - -- dark wizard's crown - itemid = 22153, - type = "equip", - slot = "head", - }, - { - -- dark wizard's crown - itemid = 22153, - type = "deequip", - slot = "head", - }, - { - -- enchanted werewolf amulet - itemid = 22134, - type = "equip", - slot = "necklace", - }, - { - -- enchanted werewolf amulet - itemid = 22134, - type = "deequip", - slot = "necklace", - }, - { - -- enchanted werewolf helmet - itemid = 22130, - type = "equip", - slot = "head", - level = 100, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- enchanted werewolf helmet - itemid = 22130, - type = "deequip", - slot = "head", - level = 100, - }, - { - -- enchanted werewolf helmet - itemid = 22129, - type = "equip", - slot = "head", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- enchanted werewolf helmet - itemid = 22129, - type = "deequip", - slot = "head", - level = 100, - }, - { - -- enchanted werewolf helmet - itemid = 22128, - type = "equip", - slot = "head", - level = 100, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- enchanted werewolf helmet - itemid = 22128, - type = "deequip", - slot = "head", - level = 100, - }, - { - -- enchanted werewolf helmet - itemid = 22127, - type = "equip", - slot = "head", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- enchanted werewolf helmet - itemid = 22127, - type = "deequip", - slot = "head", - level = 100, - }, - { - -- wereboar loincloth - itemid = 22087, - type = "equip", - slot = "legs", - }, - { - -- wereboar loincloth - itemid = 22087, - type = "deequip", - slot = "legs", - }, - { - -- badger boots - itemid = 22086, - type = "equip", - slot = "feet", - level = 60, - }, - { - -- badger boots - itemid = 22086, - type = "deequip", - slot = "feet", - level = 60, - }, - { - -- fur armor - itemid = 22085, - type = "equip", - slot = "armor", - level = 50, - }, - { - -- fur armor - itemid = 22085, - type = "deequip", - slot = "armor", - level = 50, - }, - { - -- wolf backpack - itemid = 22084, - type = "equip", - slot = "backpack", - }, - { - -- wolf backpack - itemid = 22084, - type = "deequip", - slot = "backpack", - }, - { - -- werewolf helmet - itemid = 22062, - type = "equip", - slot = "head", - level = 100, - }, - { - -- werewolf helmet - itemid = 22062, - type = "deequip", - slot = "head", - level = 100, - }, - { - -- werewolf amulet - itemid = 22060, - type = "equip", - slot = "necklace", - }, - { - -- werewolf amulet - itemid = 22060, - type = "deequip", - slot = "necklace", - }, - { - -- oriental shoes - itemid = 21981, - type = "equip", - slot = "feet", - level = 80, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- oriental shoes - itemid = 21981, - type = "deequip", - slot = "feet", - level = 80, - }, - { - -- sweetheart ring - itemid = 21955, - type = "equip", - slot = "ring", - }, - { - -- sweetheart ring - itemid = 21955, - type = "deequip", - slot = "ring", - }, - { - -- crest of the deep seas - itemid = 21892, - type = "equip", - slot = "head", - level = 80, - }, - { - -- crest of the deep seas - itemid = 21892, - type = "deequip", - slot = "head", - level = 80, - }, - { - -- brandon's wedding ring - itemid = 21745, - type = "equip", - slot = "ring", - }, - { - -- brandon's wedding ring - itemid = 21745, - type = "deequip", - slot = "ring", - }, - { - -- simple arrow - itemid = 21470, - type = "equip", - slot = "ammo", - }, - { - -- simple arrow - itemid = 21470, - type = "deequip", - slot = "ammo", - }, - { - -- war backpack - itemid = 21445, - type = "equip", - slot = "backpack", - }, - { - -- war backpack - itemid = 21445, - type = "deequip", - slot = "backpack", - }, - { - -- the Lion's Heart - itemid = 21439, - type = "equip", - slot = "necklace", - }, - { - -- the Lion's Heart - itemid = 21439, - type = "deequip", - slot = "necklace", - }, - { - -- shopping bag - itemid = 21411, - type = "equip", - slot = "backpack", - }, - { - -- shopping bag - itemid = 21411, - type = "deequip", - slot = "backpack", - }, - { - -- broken wooden shield - itemid = 21401, - type = "equip", - slot = "shield", - }, - { - -- broken wooden shield - itemid = 21401, - type = "deequip", - slot = "shield", - }, - { - -- spellbook of the novice - itemid = 21400, - type = "equip", - slot = "shield", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellbook of the novice - itemid = 21400, - type = "deequip", - slot = "shield", - }, - { - -- the chiller - itemid = 21350, - type = "equip", - slot = "hand", - level = 1, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- the chiller - itemid = 21350, - type = "deequip", - slot = "hand", - level = 1, - }, - { - -- the scorcher - itemid = 21348, - type = "equip", - slot = "hand", - level = 1, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- the scorcher - itemid = 21348, - type = "deequip", - slot = "hand", - level = 1, - }, - { - -- glooth backpack - itemid = 21295, - type = "equip", - slot = "backpack", - }, - { - -- glooth backpack - itemid = 21295, - type = "deequip", - slot = "backpack", - }, - { - -- feedbag - itemid = 21292, - type = "equip", - slot = "backpack", - }, - { - -- feedbag - itemid = 21292, - type = "deequip", - slot = "backpack", - }, - { - -- one hit wonder - itemid = 21219, - type = "equip", - slot = "hand", - }, - { - -- one hit wonder - itemid = 21219, - type = "deequip", - slot = "hand", - }, - { - -- glooth amulet - itemid = 21183, - type = "equip", - slot = "necklace", - level = 75, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- glooth amulet - itemid = 21183, - type = "deequip", - slot = "necklace", - level = 75, - }, - { - -- glooth axe - itemid = 21180, - type = "equip", - slot = "hand", - }, - { - -- glooth axe - itemid = 21180, - type = "deequip", - slot = "hand", - }, - { - -- glooth blade - itemid = 21179, - type = "equip", - slot = "hand", - }, - { - -- glooth blade - itemid = 21179, - type = "deequip", - slot = "hand", - }, - { - -- glooth club - itemid = 21178, - type = "equip", - slot = "hand", - }, - { - -- glooth club - itemid = 21178, - type = "deequip", - slot = "hand", - }, - { - -- cowtana - itemid = 21177, - type = "equip", - slot = "hand", - }, - { - -- cowtana - itemid = 21177, - type = "deequip", - slot = "hand", - }, - { - -- execowtioner axe - itemid = 21176, - type = "equip", - slot = "hand", - }, - { - -- execowtioner axe - itemid = 21176, - type = "deequip", - slot = "hand", - }, - { - -- mino shield - itemid = 21175, - type = "equip", - slot = "shield", - }, - { - -- mino shield - itemid = 21175, - type = "deequip", - slot = "shield", - }, - { - -- mino lance - itemid = 21174, - type = "equip", - slot = "hand", - }, - { - -- mino lance - itemid = 21174, - type = "deequip", - slot = "hand", - }, - { - -- moohtant cudgel - itemid = 21173, - type = "equip", - slot = "hand", - }, - { - -- moohtant cudgel - itemid = 21173, - type = "deequip", - slot = "hand", - }, - { - -- glooth whip - itemid = 21172, - type = "equip", - slot = "hand", - }, - { - -- glooth whip - itemid = 21172, - type = "deequip", - slot = "hand", - }, - { - -- metal bat - itemid = 21171, - type = "equip", - slot = "hand", - }, - { - -- metal bat - itemid = 21171, - type = "deequip", - slot = "hand", - }, - { - -- gearwheel chain - itemid = 21170, - type = "equip", - slot = "necklace", - level = 75, - }, - { - -- gearwheel chain - itemid = 21170, - type = "deequip", - slot = "necklace", - level = 75, - }, - { - -- metal spats - itemid = 21169, - type = "equip", - slot = "feet", - level = 50, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- metal spats - itemid = 21169, - type = "deequip", - slot = "feet", - level = 50, - }, - { - -- alloy legs - itemid = 21168, - type = "equip", - slot = "legs", - level = 60, - }, - { - -- alloy legs - itemid = 21168, - type = "deequip", - slot = "legs", - level = 60, - }, - { - -- heat core - itemid = 21167, - type = "equip", - slot = "armor", - }, - { - -- heat core - itemid = 21167, - type = "deequip", - slot = "armor", - }, - { - -- mooh'tah plate - itemid = 21166, - type = "equip", - slot = "armor", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- mooh'tah plate - itemid = 21166, - type = "deequip", - slot = "armor", - }, - { - -- rubber cap - itemid = 21165, - type = "equip", - slot = "head", - level = 70, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- rubber cap - itemid = 21165, - type = "deequip", - slot = "head", - level = 70, - }, - { - -- glooth cape - itemid = 21164, - type = "equip", - slot = "armor", - level = 40, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- glooth cape - itemid = 21164, - type = "deequip", - slot = "armor", - level = 40, - }, - { - -- glooth spear - itemid = 21158, - type = "equip", - slot = "hand", - }, - { - -- glooth spear - itemid = 21158, - type = "deequip", - slot = "hand", - }, - { - -- cake backpack - itemid = 20347, - type = "equip", - slot = "backpack", - }, - { - -- cake backpack - itemid = 20347, - type = "deequip", - slot = "backpack", - }, - { - -- unstable ring of ending - itemid = 20209, - type = "equip", - slot = "ring", - }, - { - -- unstable ring of ending - itemid = 20209, - type = "deequip", - slot = "ring", - }, - { - -- broken visor - itemid = 20184, - type = "equip", - slot = "head", - }, - { - -- broken visor - itemid = 20184, - type = "deequip", - slot = "head", - }, - { - -- ring of ending - itemid = 20182, - type = "equip", - slot = "ring", - level = 200, - }, - { - -- ring of ending - itemid = 20182, - type = "deequip", - slot = "ring", - level = 200, - }, - { - -- eerie song book - itemid = 20140, - type = "equip", - slot = "shield", - }, - { - -- eerie song book - itemid = 20140, - type = "deequip", - slot = "shield", - }, - { - -- umbral master spellbook - itemid = 20090, - type = "equip", - slot = "shield", - level = 250, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- umbral master spellbook - itemid = 20090, - type = "deequip", - slot = "shield", - level = 250, - }, - { - -- umbral spellbook - itemid = 20089, - type = "equip", - slot = "shield", - level = 150, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- umbral spellbook - itemid = 20089, - type = "deequip", - slot = "shield", - level = 150, - }, - { - -- crude umbral spellbook - itemid = 20088, - type = "equip", - slot = "shield", - level = 75, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- crude umbral spellbook - itemid = 20088, - type = "deequip", - slot = "shield", - level = 75, - }, - { - -- umbral master crossbow - itemid = 20087, - type = "equip", - slot = "hand", - }, - { - -- umbral master crossbow - itemid = 20087, - type = "deequip", - slot = "hand", - }, - { - -- umbral crossbow - itemid = 20086, - type = "equip", - slot = "hand", - }, - { - -- umbral crossbow - itemid = 20086, - type = "deequip", - slot = "hand", - }, - { - -- crude umbral crossbow - itemid = 20085, - type = "equip", - slot = "hand", - }, - { - -- crude umbral crossbow - itemid = 20085, - type = "deequip", - slot = "hand", - }, - { - -- umbral master bow - itemid = 20084, - type = "equip", - slot = "hand", - }, - { - -- umbral master bow - itemid = 20084, - type = "deequip", - slot = "hand", - }, - { - -- umbral bow - itemid = 20083, - type = "equip", - slot = "hand", - }, - { - -- umbral bow - itemid = 20083, - type = "deequip", - slot = "hand", - }, - { - -- crude umbral bow - itemid = 20082, - type = "equip", - slot = "hand", - }, - { - -- crude umbral bow - itemid = 20082, - type = "deequip", - slot = "hand", - }, - { - -- umbral master hammer - itemid = 20081, - type = "equip", - slot = "hand", - }, - { - -- umbral master hammer - itemid = 20081, - type = "deequip", - slot = "hand", - }, - { - -- umbral hammer - itemid = 20080, - type = "equip", - slot = "hand", - }, - { - -- umbral hammer - itemid = 20080, - type = "deequip", - slot = "hand", - }, - { - -- crude umbral hammer - itemid = 20079, - type = "equip", - slot = "hand", - }, - { - -- crude umbral hammer - itemid = 20079, - type = "deequip", - slot = "hand", - }, - { - -- umbral master mace - itemid = 20078, - type = "equip", - slot = "hand", - }, - { - -- umbral master mace - itemid = 20078, - type = "deequip", - slot = "hand", - }, - { - -- umbral mace - itemid = 20077, - type = "equip", - slot = "hand", - }, - { - -- umbral mace - itemid = 20077, - type = "deequip", - slot = "hand", - }, - { - -- crude umbral mace - itemid = 20076, - type = "equip", - slot = "hand", - }, - { - -- crude umbral mace - itemid = 20076, - type = "deequip", - slot = "hand", - }, - { - -- umbral master chopper - itemid = 20075, - type = "equip", - slot = "hand", - }, - { - -- umbral master chopper - itemid = 20075, - type = "deequip", - slot = "hand", - }, - { - -- umbral chopper - itemid = 20074, - type = "equip", - slot = "hand", - }, - { - -- umbral chopper - itemid = 20074, - type = "deequip", - slot = "hand", - }, - { - -- guardian halberd - itemid = 20073, - type = "equip", - slot = "hand", - }, - { - -- guardian halberd - itemid = 20073, - type = "deequip", - slot = "hand", - }, - { - -- umbral master axe - itemid = 20072, - type = "equip", - slot = "hand", - }, - { - -- umbral master axe - itemid = 20072, - type = "deequip", - slot = "hand", - }, - { - -- umbral axe - itemid = 20071, - type = "equip", - slot = "hand", - }, - { - -- umbral axe - itemid = 20071, - type = "deequip", - slot = "hand", - }, - { - -- crude umbral axe - itemid = 20070, - type = "equip", - slot = "hand", - }, - { - -- crude umbral axe - itemid = 20070, - type = "deequip", - slot = "hand", - }, - { - -- umbral master slayer - itemid = 20069, - type = "equip", - slot = "hand", - }, - { - -- umbral master slayer - itemid = 20069, - type = "deequip", - slot = "hand", - }, - { - -- umbral slayer - itemid = 20068, - type = "equip", - slot = "hand", - }, - { - -- umbral slayer - itemid = 20068, - type = "deequip", - slot = "hand", - }, - { - -- crude umbral slayer - itemid = 20067, - type = "equip", - slot = "hand", - }, - { - -- crude umbral slayer - itemid = 20067, - type = "deequip", - slot = "hand", - }, - { - -- umbral masterblade - itemid = 20066, - type = "equip", - slot = "hand", - }, - { - -- umbral masterblade - itemid = 20066, - type = "deequip", - slot = "hand", - }, - { - -- umbral blade - itemid = 20065, - type = "equip", - slot = "hand", - }, - { - -- umbral blade - itemid = 20065, - type = "deequip", - slot = "hand", - }, - { - -- crude umbral blade - itemid = 20064, - type = "equip", - slot = "hand", - }, - { - -- crude umbral blade - itemid = 20064, - type = "deequip", - slot = "hand", - }, - { - -- strange good night songs - itemid = 20050, - type = "equip", - slot = "shield", - }, - { - -- strange good night songs - itemid = 20050, - type = "deequip", - slot = "shield", - }, - { - -- furious frock - itemid = 19391, - type = "equip", - slot = "armor", - level = 130, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- furious frock - itemid = 19391, - type = "deequip", - slot = "armor", - level = 130, - }, - { - -- vampire silk slippers - itemid = 19374, - type = "equip", - slot = "feet", - }, - { - -- vampire silk slippers - itemid = 19374, - type = "deequip", - slot = "feet", - }, - { - -- haunted mirror piece - itemid = 19373, - type = "equip", - slot = "shield", - }, - { - -- haunted mirror piece - itemid = 19373, - type = "deequip", - slot = "shield", - }, - { - -- goo shell - itemid = 19372, - type = "equip", - slot = "armor", - }, - { - -- goo shell - itemid = 19372, - type = "deequip", - slot = "armor", - }, - { - -- icy culottes - itemid = 19366, - type = "equip", - slot = "legs", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- icy culottes - itemid = 19366, - type = "deequip", - slot = "legs", - }, - { - -- runic ice shield - itemid = 19363, - type = "equip", - slot = "shield", - }, - { - -- runic ice shield - itemid = 19363, - type = "deequip", - slot = "shield", - }, - { - -- icicle bow - itemid = 19362, - type = "equip", - slot = "hand", - }, - { - -- icicle bow - itemid = 19362, - type = "deequip", - slot = "hand", - }, - { - -- horn - itemid = 19359, - type = "equip", - slot = "ring", - }, - { - -- horn - itemid = 19359, - type = "deequip", - slot = "ring", - }, - { - -- albino plate - itemid = 19358, - type = "equip", - slot = "armor", - }, - { - -- albino plate - itemid = 19358, - type = "deequip", - slot = "armor", - }, - { - -- shrunken head necklace - itemid = 19357, - type = "equip", - slot = "necklace", - level = 150, - }, - { - -- shrunken head necklace - itemid = 19357, - type = "deequip", - slot = "necklace", - level = 150, - }, - { - -- triple bolt crossbow - itemid = 19356, - type = "equip", - slot = "hand", - }, - { - -- triple bolt crossbow - itemid = 19356, - type = "deequip", - slot = "hand", - }, - { - -- pannier backpack - itemid = 19159, - type = "equip", - slot = "backpack", - }, - { - -- pannier backpack - itemid = 19159, - type = "deequip", - slot = "backpack", - }, - { - -- friendship amulet - itemid = 19153, - type = "equip", - slot = "necklace", - }, - { - -- friendship amulet - itemid = 19153, - type = "deequip", - slot = "necklace", - }, - { - -- vampire's signet ring - itemid = 18935, - type = "equip", - slot = "ring", - }, - { - -- vampire's signet ring - itemid = 18935, - type = "deequip", - slot = "ring", - }, - { - -- spiky club - itemid = 17859, - type = "equip", - slot = "hand", - }, - { - -- spiky club - itemid = 17859, - type = "deequip", - slot = "hand", - }, - { - -- helmet of the lost - itemid = 17852, - type = "equip", - slot = "head", - }, - { - -- helmet of the lost - itemid = 17852, - type = "deequip", - slot = "head", - }, - { - -- leather harness - itemid = 17846, - type = "equip", - slot = "armor", - }, - { - -- leather harness - itemid = 17846, - type = "deequip", - slot = "armor", - }, - { - -- buckle - itemid = 17829, - type = "equip", - slot = "armor", - }, - { - -- buckle - itemid = 17829, - type = "deequip", - slot = "armor", - }, - { - -- pair of iron fists - itemid = 17828, - type = "equip", - slot = "hand", - }, - { - -- pair of iron fists - itemid = 17828, - type = "deequip", - slot = "hand", - }, - { - -- swampling club - itemid = 17824, - type = "equip", - slot = "hand", - }, - { - -- swampling club - itemid = 17824, - type = "deequip", - slot = "hand", - }, - { - -- life preserver - itemid = 17813, - type = "equip", - slot = "hand", - }, - { - -- life preserver - itemid = 17813, - type = "deequip", - slot = "hand", - }, - { - -- ratana - itemid = 17812, - type = "equip", - slot = "hand", - }, - { - -- ratana - itemid = 17812, - type = "deequip", - slot = "hand", - }, - { - -- spike shield - itemid = 17810, - type = "equip", - slot = "shield", - }, - { - -- spike shield - itemid = 17810, - type = "deequip", - slot = "shield", - }, - { - -- sorc and druid staff - itemid = 17111, - type = "equip", - slot = "hand", - level = 1, - vocation = { - { "None", true }, - }, - }, - { - -- sorc and druid staff - itemid = 17111, - type = "deequip", - slot = "hand", - level = 1, - }, - { - -- mean paladin spear - itemid = 17110, - type = "equip", - slot = "hand", - }, - { - -- mean paladin spear - itemid = 17110, - type = "deequip", - slot = "hand", - }, - { - -- mean knight sword - itemid = 17109, - type = "equip", - slot = "hand", - }, - { - -- mean knight sword - itemid = 17109, - type = "deequip", - slot = "hand", - }, - { - -- prismatic ring - itemid = 16264, - type = "equip", - slot = "ring", - level = 120, - }, - { - -- prismatic ring - itemid = 16264, - type = "deequip", - slot = "ring", - level = 120, - }, - { - -- shiny blade - itemid = 16175, - type = "equip", - slot = "hand", - }, - { - -- shiny blade - itemid = 16175, - type = "deequip", - slot = "hand", - }, - { - -- mycological bow - itemid = 16164, - type = "equip", - slot = "hand", - }, - { - -- mycological bow - itemid = 16164, - type = "deequip", - slot = "hand", - }, - { - -- crystal crossbow - itemid = 16163, - type = "equip", - slot = "hand", - }, - { - -- crystal crossbow - itemid = 16163, - type = "deequip", - slot = "hand", - }, - { - -- mycological mace - itemid = 16162, - type = "equip", - slot = "hand", - }, - { - -- mycological mace - itemid = 16162, - type = "deequip", - slot = "hand", - }, - { - -- crystalline axe - itemid = 16161, - type = "equip", - slot = "hand", - }, - { - -- crystalline axe - itemid = 16161, - type = "deequip", - slot = "hand", - }, - { - -- crystalline sword - itemid = 16160, - type = "equip", - slot = "hand", - }, - { - -- crystalline sword - itemid = 16160, - type = "deequip", - slot = "hand", - }, - { - -- envenomed arrow - itemid = 16143, - type = "equip", - slot = "ammo", - }, - { - -- envenomed arrow - itemid = 16143, - type = "deequip", - slot = "ammo", - }, - { - -- drill bolt - itemid = 16142, - type = "equip", - slot = "ammo", - }, - { - -- drill bolt - itemid = 16142, - type = "deequip", - slot = "ammo", - }, - { - -- prismatic bolt - itemid = 16141, - type = "equip", - slot = "ammo", - }, - { - -- prismatic bolt - itemid = 16141, - type = "deequip", - slot = "ammo", - }, - { - -- glacial rod - itemid = 16118, - type = "equip", - slot = "hand", - level = 65, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- glacial rod - itemid = 16118, - type = "deequip", - slot = "hand", - level = 65, - }, - { - -- muck rod - itemid = 16117, - type = "equip", - slot = "hand", - level = 65, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- muck rod - itemid = 16117, - type = "deequip", - slot = "hand", - level = 65, - }, - { - -- prismatic shield - itemid = 16116, - type = "equip", - slot = "shield", - level = 150, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- prismatic shield - itemid = 16116, - type = "deequip", - slot = "shield", - level = 150, - }, - { - -- wand of everblazing - itemid = 16115, - type = "equip", - slot = "hand", - level = 65, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of everblazing - itemid = 16115, - type = "deequip", - slot = "hand", - level = 65, - }, - { - -- prismatic ring - itemid = 16114, - type = "equip", - slot = "ring", - level = 120, - }, - { - -- prismatic ring - itemid = 16114, - type = "deequip", - slot = "ring", - level = 120, - }, - { - -- prismatic necklace - itemid = 16113, - type = "equip", - slot = "necklace", - level = 150, - }, - { - -- prismatic necklace - itemid = 16113, - type = "deequip", - slot = "necklace", - level = 150, - }, - { - -- prismatic boots - itemid = 16112, - type = "equip", - slot = "feet", - level = 150, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- prismatic boots - itemid = 16112, - type = "deequip", - slot = "feet", - level = 150, - }, - { - -- prismatic legs - itemid = 16111, - type = "equip", - slot = "legs", - level = 150, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- prismatic legs - itemid = 16111, - type = "deequip", - slot = "legs", - level = 150, - }, - { - -- prismatic armor - itemid = 16110, - type = "equip", - slot = "armor", - level = 120, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- prismatic armor - itemid = 16110, - type = "deequip", - slot = "armor", - level = 120, - }, - { - -- prismatic helmet - itemid = 16109, - type = "equip", - slot = "head", - level = 150, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- prismatic helmet - itemid = 16109, - type = "deequip", - slot = "head", - level = 150, - }, - { - -- gill necklace - itemid = 16108, - type = "equip", - slot = "necklace", - level = 150, - }, - { - -- gill necklace - itemid = 16108, - type = "deequip", - slot = "necklace", - level = 150, - }, - { - -- spellbook of vigilance - itemid = 16107, - type = "equip", - slot = "shield", - level = 130, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellbook of vigilance - itemid = 16107, - type = "deequip", - slot = "shield", - level = 130, - }, - { - -- gill legs - itemid = 16106, - type = "equip", - slot = "legs", - level = 150, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- gill legs - itemid = 16106, - type = "deequip", - slot = "legs", - level = 150, - }, - { - -- gill coat - itemid = 16105, - type = "equip", - slot = "armor", - level = 150, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- gill coat - itemid = 16105, - type = "deequip", - slot = "armor", - level = 150, - }, - { - -- gill gugel - itemid = 16104, - type = "equip", - slot = "head", - level = 150, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- gill gugel - itemid = 16104, - type = "deequip", - slot = "head", - level = 150, - }, - { - -- crystal backpack - itemid = 16100, - type = "equip", - slot = "backpack", - }, - { - -- crystal backpack - itemid = 16100, - type = "deequip", - slot = "backpack", - }, - { - -- mushroom backpack - itemid = 16099, - type = "equip", - slot = "backpack", - }, - { - -- mushroom backpack - itemid = 16099, - type = "deequip", - slot = "backpack", - }, - { - -- wand of defiance - itemid = 16096, - type = "equip", - slot = "hand", - level = 65, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of defiance - itemid = 16096, - type = "deequip", - slot = "hand", - level = 65, - }, - { - -- crystalline arrow - itemid = 15793, - type = "equip", - slot = "ammo", - }, - { - -- crystalline arrow - itemid = 15793, - type = "deequip", - slot = "ammo", - }, - { - -- crystal bolt - itemid = 15792, - type = "equip", - slot = "ammo", - }, - { - -- crystal bolt - itemid = 15792, - type = "deequip", - slot = "ammo", - }, - { - -- spellbook of ancient arcana - itemid = 14769, - type = "equip", - slot = "shield", - level = 150, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellbook of ancient arcana - itemid = 14769, - type = "deequip", - slot = "shield", - level = 150, - }, - { - -- thorn spitter - itemid = 14768, - type = "equip", - slot = "hand", - }, - { - -- thorn spitter - itemid = 14768, - type = "deequip", - slot = "hand", - }, - { - -- mathmaster shield - itemid = 14761, - type = "equip", - slot = "shield", - }, - { - -- mathmaster shield - itemid = 14761, - type = "deequip", - slot = "shield", - }, - { - -- mathmaster shield - itemid = 14760, - type = "equip", - slot = "shield", - }, - { - -- mathmaster shield - itemid = 14760, - type = "deequip", - slot = "shield", - }, - { - -- anniversary backpack - itemid = 14674, - type = "equip", - slot = "backpack", - }, - { - -- anniversary backpack - itemid = 14674, - type = "deequip", - slot = "backpack", - }, - { - -- vortex bolt - itemid = 14252, - type = "equip", - slot = "ammo", - }, - { - -- vortex bolt - itemid = 14252, - type = "deequip", - slot = "ammo", - }, - { - -- tarsal arrow - itemid = 14251, - type = "equip", - slot = "ammo", - }, - { - -- tarsal arrow - itemid = 14251, - type = "deequip", - slot = "ammo", - }, - { - -- deepling squelcher - itemid = 14250, - type = "equip", - slot = "hand", - }, - { - -- deepling squelcher - itemid = 14250, - type = "deequip", - slot = "hand", - }, - { - -- buggy backpack - itemid = 14249, - type = "equip", - slot = "backpack", - }, - { - -- buggy backpack - itemid = 14249, - type = "deequip", - slot = "backpack", - }, - { - -- deepling backpack - itemid = 14248, - type = "equip", - slot = "backpack", - }, - { - -- deepling backpack - itemid = 14248, - type = "deequip", - slot = "backpack", - }, - { - -- ornate crossbow - itemid = 14247, - type = "equip", - slot = "hand", - }, - { - -- ornate crossbow - itemid = 14247, - type = "deequip", - slot = "hand", - }, - { - -- hive bow - itemid = 14246, - type = "equip", - slot = "hand", - }, - { - -- hive bow - itemid = 14246, - type = "deequip", - slot = "hand", - }, - { - -- hive scythe - itemid = 14089, - type = "equip", - slot = "hand", - }, - { - -- hive scythe - itemid = 14089, - type = "deequip", - slot = "hand", - }, - { - -- carapace shield - itemid = 14088, - type = "equip", - slot = "shield", - }, - { - -- carapace shield - itemid = 14088, - type = "deequip", - slot = "shield", - }, - { - -- grasshopper legs - itemid = 14087, - type = "equip", - slot = "legs", - level = 75, - }, - { - -- grasshopper legs - itemid = 14087, - type = "deequip", - slot = "legs", - level = 75, - }, - { - -- calopteryx cape - itemid = 14086, - type = "equip", - slot = "armor", - level = 80, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- calopteryx cape - itemid = 14086, - type = "deequip", - slot = "armor", - level = 80, - }, - { - -- guardian axe - itemid = 14043, - type = "equip", - slot = "hand", - }, - { - -- guardian axe - itemid = 14043, - type = "deequip", - slot = "hand", - }, - { - -- warrior's shield - itemid = 14042, - type = "equip", - slot = "shield", - }, - { - -- warrior's shield - itemid = 14042, - type = "deequip", - slot = "shield", - }, - { - -- warrior's axe - itemid = 14040, - type = "equip", - slot = "hand", - }, - { - -- warrior's axe - itemid = 14040, - type = "deequip", - slot = "hand", - }, - { - -- ornate mace - itemid = 14001, - type = "equip", - slot = "hand", - }, - { - -- ornate mace - itemid = 14001, - type = "deequip", - slot = "hand", - }, - { - -- ornate shield - itemid = 14000, - type = "equip", - slot = "shield", - level = 130, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- ornate shield - itemid = 14000, - type = "deequip", - slot = "shield", - level = 130, - }, - { - -- ornate legs - itemid = 13999, - type = "equip", - slot = "legs", - level = 185, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- ornate legs - itemid = 13999, - type = "deequip", - slot = "legs", - level = 185, - }, - { - -- depth scutum - itemid = 13998, - type = "equip", - slot = "shield", - level = 120, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- depth scutum - itemid = 13998, - type = "deequip", - slot = "shield", - level = 120, - }, - { - -- depth calcei - itemid = 13997, - type = "equip", - slot = "feet", - level = 150, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- depth calcei - itemid = 13997, - type = "deequip", - slot = "feet", - level = 150, - }, - { - -- depth ocrea - itemid = 13996, - type = "equip", - slot = "legs", - level = 130, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- depth ocrea - itemid = 13996, - type = "deequip", - slot = "legs", - level = 130, - }, - { - -- depth galea - itemid = 13995, - type = "equip", - slot = "head", - level = 150, - }, - { - -- depth galea - itemid = 13995, - type = "deequip", - slot = "head", - level = 150, - }, - { - -- depth lorica - itemid = 13994, - type = "equip", - slot = "armor", - level = 150, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- depth lorica - itemid = 13994, - type = "deequip", - slot = "armor", - level = 150, - }, - { - -- ornate chestplate - itemid = 13993, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- ornate chestplate - itemid = 13993, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- deepling axe - itemid = 13991, - type = "equip", - slot = "hand", - }, - { - -- deepling axe - itemid = 13991, - type = "deequip", - slot = "hand", - }, - { - -- necklace of the deep - itemid = 13990, - type = "equip", - slot = "necklace", - level = 120, - }, - { - -- necklace of the deep - itemid = 13990, - type = "deequip", - slot = "necklace", - level = 120, - }, - { - -- deepling staff - itemid = 13987, - type = "equip", - slot = "hand", - }, - { - -- deepling staff - itemid = 13987, - type = "deequip", - slot = "hand", - }, - { - -- the Epic Wisdom - itemid = 12810, - type = "equip", - slot = "head", - }, - { - -- the Epic Wisdom - itemid = 12810, - type = "deequip", - slot = "head", - }, - { - -- the Epic Wisdom - itemid = 12809, - type = "equip", - slot = "head", - }, - { - -- the Epic Wisdom - itemid = 12809, - type = "deequip", - slot = "head", - }, - { - -- shimmer wand - itemid = 12741, - type = "equip", - slot = "hand", - level = 40, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- shimmer wand - itemid = 12741, - type = "deequip", - slot = "hand", - level = 40, - }, - { - -- broken ring of ending - itemid = 12737, - type = "equip", - slot = "ring", - }, - { - -- broken ring of ending - itemid = 12737, - type = "deequip", - slot = "ring", - }, - { - -- shimmer bow - itemid = 12733, - type = "equip", - slot = "hand", - }, - { - -- shimmer bow - itemid = 12733, - type = "deequip", - slot = "hand", - }, - { - -- shimmer rod - itemid = 12732, - type = "equip", - slot = "hand", - level = 40, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- shimmer rod - itemid = 12732, - type = "deequip", - slot = "hand", - level = 40, - }, - { - -- shimmer sword - itemid = 12731, - type = "equip", - slot = "hand", - }, - { - -- shimmer sword - itemid = 12731, - type = "deequip", - slot = "hand", - }, - { - -- heavy trident - itemid = 12683, - type = "equip", - slot = "hand", - }, - { - -- heavy trident - itemid = 12683, - type = "deequip", - slot = "hand", - }, - { - -- wooden sword - itemid = 12673, - type = "equip", - slot = "hand", - }, - { - -- wooden sword - itemid = 12673, - type = "deequip", - slot = "hand", - }, - { - -- star ring - itemid = 12670, - type = "equip", - slot = "ring", - vocation = { - { "None", true }, - }, - }, - { - -- star ring - itemid = 12670, - type = "deequip", - slot = "ring", - vocation = { - { "None", true }, - }, - }, - { - -- star ring - itemid = 12669, - type = "equip", - slot = "ring", - vocation = { - { "None", true }, - }, - }, - { - -- star ring - itemid = 12669, - type = "deequip", - slot = "ring", - vocation = { - { "None", true }, - }, - }, - { - -- wand of dimensions - itemid = 12603, - type = "equip", - slot = "hand", - level = 37, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of dimensions - itemid = 12603, - type = "deequip", - slot = "hand", - level = 37, - }, - { - -- mage's cap - itemid = 12599, - type = "equip", - slot = "head", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- mage's cap - itemid = 12599, - type = "deequip", - slot = "head", - }, - { - -- fish tail (equipped) - itemid = 11543, - type = "equip", - slot = "feet", - }, - { - -- fish tail (equipped) - itemid = 11543, - type = "deequip", - slot = "feet", - }, - { - -- golden hyena pendant - itemid = 12543, - type = "equip", - slot = "necklace", - }, - { - -- golden hyena pendant - itemid = 12543, - type = "deequip", - slot = "necklace", - }, - { - -- golden scorpion pendant - itemid = 12542, - type = "equip", - slot = "necklace", - }, - { - -- golden scorpion pendant - itemid = 12542, - type = "deequip", - slot = "necklace", - }, - { - -- old cape - itemid = 11701, - type = "equip", - slot = "armor", - }, - { - -- old cape - itemid = 11701, - type = "deequip", - slot = "armor", - }, - { - -- sedge hat - itemid = 11700, - type = "equip", - slot = "head", - }, - { - -- sedge hat - itemid = 11700, - type = "deequip", - slot = "head", - }, - { - -- loot bag - itemid = 11698, - type = "equip", - slot = "backpack", - }, - { - -- loot bag - itemid = 11698, - type = "deequip", - slot = "backpack", - }, - { - -- blade of corruption - itemid = 11693, - type = "equip", - slot = "hand", - }, - { - -- blade of corruption - itemid = 11693, - type = "deequip", - slot = "hand", - }, - { - -- snake god's sceptre - itemid = 11692, - type = "equip", - slot = "hand", - }, - { - -- snake god's sceptre - itemid = 11692, - type = "deequip", - slot = "hand", - }, - { - -- snake god's wristguard - itemid = 11691, - type = "equip", - slot = "shield", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- snake god's wristguard - itemid = 11691, - type = "deequip", - slot = "shield", - level = 100, - }, - { - -- draken boots - itemid = 4033, - type = "equip", - slot = "feet", - level = 80, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- draken boots - itemid = 4033, - type = "deequip", - slot = "feet", - level = 80, - }, - { - -- elite draken helmet - itemid = 11689, - type = "equip", - slot = "head", - level = 100, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- elite draken helmet - itemid = 11689, - type = "deequip", - slot = "head", - level = 100, - }, - { - -- shield of corruption - itemid = 11688, - type = "equip", - slot = "shield", - level = 80, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- shield of corruption - itemid = 11688, - type = "deequip", - slot = "shield", - level = 80, - }, - { - -- royal scale robe - itemid = 11687, - type = "equip", - slot = "armor", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- royal scale robe - itemid = 11687, - type = "deequip", - slot = "armor", - level = 100, - }, - { - -- royal draken mail - itemid = 11686, - type = "equip", - slot = "armor", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- royal draken mail - itemid = 11686, - type = "deequip", - slot = "armor", - level = 100, - }, - { - -- cobra crown - itemid = 11674, - type = "equip", - slot = "head", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- cobra crown - itemid = 11674, - type = "deequip", - slot = "head", - }, - { - -- twiceslicer - itemid = 11657, - type = "equip", - slot = "hand", - }, - { - -- twiceslicer - itemid = 11657, - type = "deequip", - slot = "hand", - }, - { - -- elite draken mail - itemid = 11651, - type = "equip", - slot = "armor", - level = 100, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- elite draken mail - itemid = 11651, - type = "deequip", - slot = "armor", - level = 100, - }, - { - -- fish tail (unequipped) - itemid = 11542, - type = "equip", - slot = "feet", - }, - { - -- fish tail (unequipped) - itemid = 11542, - type = "deequip", - slot = "feet", - }, - { - -- ornamented brooch - itemid = 11468, - type = "equip", - slot = "necklace", - }, - { - -- ornamented brooch - itemid = 11468, - type = "deequip", - slot = "necklace", - }, - { - -- lucky clover amulet - itemid = 10476, - type = "equip", - slot = "necklace", - }, - { - -- lucky clover amulet - itemid = 10476, - type = "deequip", - slot = "necklace", - }, - { - -- beetle necklace - itemid = 10457, - type = "equip", - slot = "necklace", - }, - { - -- beetle necklace - itemid = 10457, - type = "deequip", - slot = "necklace", - }, - { - -- jade hat - itemid = 10451, - type = "equip", - slot = "head", - level = 60, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- jade hat - itemid = 10451, - type = "deequip", - slot = "head", - level = 60, - }, - { - -- Zaoan robe - itemid = 10439, - type = "equip", - slot = "armor", - level = 60, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- Zaoan robe - itemid = 10439, - type = "deequip", - slot = "armor", - level = 60, - }, - { - -- spellweaver's robe - itemid = 10438, - type = "equip", - slot = "armor", - level = 60, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellweaver's robe - itemid = 10438, - type = "deequip", - slot = "armor", - level = 60, - }, - { - -- wailing widow's necklace - itemid = 10412, - type = "equip", - slot = "necklace", - }, - { - -- wailing widow's necklace - itemid = 10412, - type = "deequip", - slot = "necklace", - }, - { - -- Zaoan halberd - itemid = 10406, - type = "equip", - slot = "hand", - }, - { - -- Zaoan halberd - itemid = 10406, - type = "deequip", - slot = "hand", - }, - { - -- twin hooks - itemid = 10392, - type = "equip", - slot = "hand", - }, - { - -- twin hooks - itemid = 10392, - type = "deequip", - slot = "hand", - }, - { - -- drachaku - itemid = 10391, - type = "equip", - slot = "hand", - }, - { - -- drachaku - itemid = 10391, - type = "deequip", - slot = "hand", - }, - { - -- Zaoan sword - itemid = 10390, - type = "equip", - slot = "hand", - }, - { - -- Zaoan sword - itemid = 10390, - type = "deequip", - slot = "hand", - }, - { - -- sai - itemid = 10389, - type = "equip", - slot = "hand", - }, - { - -- sai - itemid = 10389, - type = "deequip", - slot = "hand", - }, - { - -- drakinata - itemid = 10388, - type = "equip", - slot = "hand", - }, - { - -- drakinata - itemid = 10388, - type = "deequip", - slot = "hand", - }, - { - -- Zaoan legs - itemid = 10387, - type = "equip", - slot = "legs", - }, - { - -- Zaoan legs - itemid = 10387, - type = "deequip", - slot = "legs", - }, - { - -- zaoan shoes - itemid = 10386, - type = "equip", - slot = "feet", - }, - { - -- zaoan shoes - itemid = 10386, - type = "deequip", - slot = "feet", - }, - { - -- Zaoan helmet - itemid = 10385, - type = "equip", - slot = "head", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- Zaoan helmet - itemid = 10385, - type = "deequip", - slot = "head", - }, - { - -- Zaoan armor - itemid = 10384, - type = "equip", - slot = "armor", - level = 50, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- Zaoan armor - itemid = 10384, - type = "deequip", - slot = "armor", - level = 50, - }, - { - -- santa backpack - itemid = 10346, - type = "equip", - slot = "backpack", - }, - { - -- santa backpack - itemid = 10346, - type = "deequip", - slot = "backpack", - }, - { - -- minotaur backpack - itemid = 10327, - type = "equip", - slot = "backpack", - }, - { - -- minotaur backpack - itemid = 10327, - type = "deequip", - slot = "backpack", - }, - { - -- dragon backpack - itemid = 10326, - type = "equip", - slot = "backpack", - }, - { - -- dragon backpack - itemid = 10326, - type = "deequip", - slot = "backpack", - }, - { - -- expedition bag - itemid = 10325, - type = "equip", - slot = "backpack", - }, - { - -- expedition bag - itemid = 10325, - type = "deequip", - slot = "backpack", - }, - { - -- expedition backpack - itemid = 10324, - type = "equip", - slot = "backpack", - }, - { - -- expedition backpack - itemid = 10324, - type = "deequip", - slot = "backpack", - }, - { - -- guardian boots - itemid = 10323, - type = "equip", - slot = "feet", - level = 70, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- guardian boots - itemid = 10323, - type = "deequip", - slot = "feet", - level = 70, - }, - { - -- heart backpack - itemid = 10202, - type = "equip", - slot = "backpack", - }, - { - -- heart backpack - itemid = 10202, - type = "deequip", - slot = "backpack", - }, - { - -- dragon scale boots - itemid = 10201, - type = "equip", - slot = "feet", - level = 70, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- dragon scale boots - itemid = 10201, - type = "deequip", - slot = "feet", - level = 70, - }, - { - -- crystal boots - itemid = 10200, - type = "equip", - slot = "feet", - level = 70, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- crystal boots - itemid = 10200, - type = "deequip", - slot = "feet", - level = 70, - }, - { - -- witch hat - itemid = 9653, - type = "equip", - slot = "head", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- witch hat - itemid = 9653, - type = "deequip", - slot = "head", - }, - { - -- crown backpack - itemid = 9605, - type = "equip", - slot = "backpack", - }, - { - -- crown backpack - itemid = 9605, - type = "deequip", - slot = "backpack", - }, - { - -- moon backpack - itemid = 9604, - type = "equip", - slot = "backpack", - }, - { - -- moon backpack - itemid = 9604, - type = "deequip", - slot = "backpack", - }, - { - -- orange bag - itemid = 9603, - type = "equip", - slot = "backpack", - }, - { - -- orange bag - itemid = 9603, - type = "deequip", - slot = "backpack", - }, - { - -- orange backpack - itemid = 9602, - type = "equip", - slot = "backpack", - }, - { - -- orange backpack - itemid = 9602, - type = "deequip", - slot = "backpack", - }, - { - -- demon backpack - itemid = 9601, - type = "equip", - slot = "backpack", - }, - { - -- demon backpack - itemid = 9601, - type = "deequip", - slot = "backpack", - }, - { - -- broken wedding ring - itemid = 9593, - type = "equip", - slot = "ring", - }, - { - -- broken wedding ring - itemid = 9593, - type = "deequip", - slot = "ring", - }, - { - -- engraved wedding ring - itemid = 9585, - type = "equip", - slot = "ring", - }, - { - -- engraved wedding ring - itemid = 9585, - type = "deequip", - slot = "ring", - }, - { - -- the shield Nevermourn - itemid = 9447, - type = "equip", - slot = "shield", - }, - { - -- the shield Nevermourn - itemid = 9447, - type = "deequip", - slot = "shield", - }, - { - -- the rain coat - itemid = 9446, - type = "equip", - slot = "armor", - }, - { - -- the rain coat - itemid = 9446, - type = "deequip", - slot = "armor", - }, - { - -- the shield Nevermourn - itemid = 9401, - type = "equip", - slot = "shield", - }, - { - -- the shield Nevermourn - itemid = 9401, - type = "deequip", - slot = "shield", - }, - { - -- the rain coat - itemid = 9400, - type = "equip", - slot = "armor", - }, - { - -- the rain coat - itemid = 9400, - type = "deequip", - slot = "armor", - }, - { - -- mighty helm of green sparks - itemid = 9399, - type = "equip", - slot = "head", - }, - { - -- mighty helm of green sparks - itemid = 9399, - type = "deequip", - slot = "head", - }, - { - -- incredible mumpiz slayer - itemid = 9396, - type = "equip", - slot = "hand", - }, - { - -- incredible mumpiz slayer - itemid = 9396, - type = "deequip", - slot = "hand", - }, - { - -- claw of 'The Noxious Spawn' - itemid = 9394, - type = "equip", - slot = "ring", - level = 100, - }, - { - -- claw of 'The Noxious Spawn' - itemid = 9394, - type = "deequip", - slot = "ring", - level = 100, - }, - { - -- claw of 'The Noxious Spawn' - itemid = 9392, - type = "equip", - slot = "ring", - level = 100, - }, - { - -- claw of 'The Noxious Spawn' - itemid = 9392, - type = "deequip", - slot = "ring", - level = 100, - }, - { - -- poet's fencing quill - itemid = 9387, - type = "equip", - slot = "hand", - }, - { - -- poet's fencing quill - itemid = 9387, - type = "deequip", - slot = "hand", - }, - { - -- farmer's avenger - itemid = 9386, - type = "equip", - slot = "hand", - }, - { - -- farmer's avenger - itemid = 9386, - type = "deequip", - slot = "hand", - }, - { - -- club of the fury - itemid = 9385, - type = "equip", - slot = "hand", - }, - { - -- club of the fury - itemid = 9385, - type = "deequip", - slot = "hand", - }, - { - -- scythe of the reaper - itemid = 9384, - type = "equip", - slot = "hand", - }, - { - -- scythe of the reaper - itemid = 9384, - type = "deequip", - slot = "hand", - }, - { - -- trousers of the ancients - itemid = 9383, - type = "equip", - slot = "legs", - }, - { - -- trousers of the ancients - itemid = 9383, - type = "deequip", - slot = "legs", - }, - { - -- helmet of nature - itemid = 9382, - type = "equip", - slot = "head", - }, - { - -- helmet of nature - itemid = 9382, - type = "deequip", - slot = "head", - }, - { - -- helmet of ultimate terror - itemid = 9381, - type = "equip", - slot = "head", - }, - { - -- helmet of ultimate terror - itemid = 9381, - type = "deequip", - slot = "head", - }, - { - -- shield of care - itemid = 9380, - type = "equip", - slot = "shield", - }, - { - -- shield of care - itemid = 9380, - type = "deequip", - slot = "shield", - }, - { - -- heavy metal t-shirt - itemid = 9379, - type = "equip", - slot = "armor", - }, - { - -- heavy metal t-shirt - itemid = 9379, - type = "deequip", - slot = "armor", - }, - { - -- musician's bow - itemid = 9378, - type = "equip", - slot = "hand", - }, - { - -- musician's bow - itemid = 9378, - type = "deequip", - slot = "hand", - }, - { - -- shield of the white knight - itemid = 3537, - type = "equip", - slot = "shield", - }, - { - -- shield of the white knight - itemid = 3537, - type = "deequip", - slot = "shield", - }, - { - -- stale bread of ancientness - itemid = 9376, - type = "equip", - slot = "hand", - }, - { - -- stale bread of ancientness - itemid = 9376, - type = "deequip", - slot = "hand", - }, - { - -- pointed rabbitslayer - itemid = 9375, - type = "equip", - slot = "hand", - }, - { - -- pointed rabbitslayer - itemid = 9375, - type = "deequip", - slot = "hand", - }, - { - -- odd hat - itemid = 9374, - type = "equip", - slot = "head", - }, - { - -- odd hat - itemid = 9374, - type = "deequip", - slot = "head", - }, - { - -- glutton's mace - itemid = 9373, - type = "equip", - slot = "hand", - }, - { - -- glutton's mace - itemid = 9373, - type = "deequip", - slot = "hand", - }, - { - -- meat shield - itemid = 9372, - type = "equip", - slot = "shield", - }, - { - -- meat shield - itemid = 9372, - type = "deequip", - slot = "shield", - }, - { - -- shockwave amulet - itemid = 9304, - type = "equip", - slot = "necklace", - level = 80, - }, - { - -- shockwave amulet - itemid = 9304, - type = "deequip", - slot = "necklace", - level = 80, - }, - { - -- leviathan's amulet - itemid = 9303, - type = "equip", - slot = "necklace", - level = 80, - }, - { - -- leviathan's amulet - itemid = 9303, - type = "deequip", - slot = "necklace", - level = 80, - }, - { - -- sacred tree amulet - itemid = 9302, - type = "equip", - slot = "necklace", - level = 80, - }, - { - -- sacred tree amulet - itemid = 9302, - type = "deequip", - slot = "necklace", - level = 80, - }, - { - -- bonfire amulet - itemid = 9301, - type = "equip", - slot = "necklace", - level = 80, - }, - { - -- bonfire amulet - itemid = 9301, - type = "deequip", - slot = "necklace", - level = 80, - }, - { - -- laurel wreath - itemid = 9221, - type = "equip", - slot = "head", - }, - { - -- laurel wreath - itemid = 9221, - type = "deequip", - slot = "head", - }, - { - -- bronze medal - itemid = 9217, - type = "equip", - slot = "necklace", - }, - { - -- bronze medal - itemid = 9217, - type = "deequip", - slot = "necklace", - }, - { - -- silver medal - itemid = 9216, - type = "equip", - slot = "necklace", - }, - { - -- silver medal - itemid = 9216, - type = "deequip", - slot = "necklace", - }, - { - -- gold medal - itemid = 9215, - type = "equip", - slot = "necklace", - }, - { - -- gold medal - itemid = 9215, - type = "deequip", - slot = "necklace", - }, - { - -- grey bag - itemid = 9151, - type = "equip", - slot = "backpack", - }, - { - -- grey bag - itemid = 9151, - type = "deequip", - slot = "backpack", - }, - { - -- batwing hat - itemid = 9103, - type = "equip", - slot = "head", - level = 50, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- batwing hat - itemid = 9103, - type = "deequip", - slot = "head", - level = 50, - }, - { - -- pair firewalker boots - itemid = 9019, - type = "equip", - slot = "feet", - level = 130, - }, - { - -- pair firewalker boots - itemid = 9019, - type = "deequip", - slot = "feet", - level = 130, - }, - { - -- firewalker boots - itemid = 9018, - type = "equip", - slot = "feet", - level = 130, - }, - { - -- firewalker boots - itemid = 9018, - type = "deequip", - slot = "feet", - level = 130, - }, - { - -- coconut shoes - itemid = 9017, - type = "equip", - slot = "feet", - }, - { - -- coconut shoes - itemid = 9017, - type = "deequip", - slot = "feet", - }, - { - -- flower dress - itemid = 9015, - type = "equip", - slot = "armor", - }, - { - -- flower dress - itemid = 9015, - type = "deequip", - slot = "armor", - }, - { - -- leaf legs - itemid = 9014, - type = "equip", - slot = "legs", - }, - { - -- leaf legs - itemid = 9014, - type = "deequip", - slot = "legs", - }, - { - -- flower wreath - itemid = 9013, - type = "equip", - slot = "head", - }, - { - -- flower wreath - itemid = 9013, - type = "deequip", - slot = "head", - }, - { - -- yalahari mask - itemid = 8864, - type = "equip", - slot = "head", - level = 80, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- yalahari mask - itemid = 8864, - type = "deequip", - slot = "head", - level = 80, - }, - { - -- yalahari leg piece - itemid = 8863, - type = "equip", - slot = "legs", - level = 80, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- yalahari leg piece - itemid = 8863, - type = "deequip", - slot = "legs", - level = 80, - }, - { - -- yalahari armor - itemid = 8862, - type = "equip", - slot = "armor", - level = 80, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- yalahari armor - itemid = 8862, - type = "deequip", - slot = "armor", - level = 80, - }, - { - -- brocade bag - itemid = 8861, - type = "equip", - slot = "backpack", - }, - { - -- brocade bag - itemid = 8861, - type = "deequip", - slot = "backpack", - }, - { - -- brocade backpack - itemid = 8860, - type = "equip", - slot = "backpack", - }, - { - -- brocade backpack - itemid = 8860, - type = "deequip", - slot = "backpack", - }, - { - -- golden bag - itemid = 655, - type = "equip", - slot = "backpack", - }, - { - -- golden bag - itemid = 655, - type = "deequip", - slot = "backpack", - }, - { - -- purple bag - itemid = 653, - type = "equip", - slot = "backpack", - }, - { - -- purple bag - itemid = 653, - type = "deequip", - slot = "backpack", - }, - { - -- the calamity - itemid = 8104, - type = "equip", - slot = "hand", - }, - { - -- the calamity - itemid = 8104, - type = "deequip", - slot = "hand", - }, - { - -- the epiphany - itemid = 8103, - type = "equip", - slot = "hand", - }, - { - -- the epiphany - itemid = 8103, - type = "deequip", - slot = "hand", - }, - { - -- emerald sword - itemid = 8102, - type = "equip", - slot = "hand", - }, - { - -- emerald sword - itemid = 8102, - type = "deequip", - slot = "hand", - }, - { - -- the stomper - itemid = 8101, - type = "equip", - slot = "hand", - }, - { - -- the stomper - itemid = 8101, - type = "deequip", - slot = "hand", - }, - { - -- obsidian truncheon - itemid = 8100, - type = "equip", - slot = "hand", - }, - { - -- obsidian truncheon - itemid = 8100, - type = "deequip", - slot = "hand", - }, - { - -- dark trinity mace - itemid = 8099, - type = "equip", - slot = "hand", - }, - { - -- dark trinity mace - itemid = 8099, - type = "deequip", - slot = "hand", - }, - { - -- demonwing axe - itemid = 8098, - type = "equip", - slot = "hand", - }, - { - -- demonwing axe - itemid = 8098, - type = "deequip", - slot = "hand", - }, - { - -- solar axe - itemid = 8097, - type = "equip", - slot = "hand", - }, - { - -- solar axe - itemid = 8097, - type = "deequip", - slot = "hand", - }, - { - -- hellforged axe - itemid = 8096, - type = "equip", - slot = "hand", - }, - { - -- hellforged axe - itemid = 8096, - type = "deequip", - slot = "hand", - }, - { - -- ranger legs - itemid = 8095, - type = "equip", - slot = "legs", - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- ranger legs - itemid = 8095, - type = "deequip", - slot = "legs", - }, - { - -- wand of voodoo - itemid = 8094, - type = "equip", - slot = "hand", - level = 42, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of voodoo - itemid = 8094, - type = "deequip", - slot = "hand", - level = 42, - }, - { - -- wand of draconia - itemid = 8093, - type = "equip", - slot = "hand", - level = 22, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of draconia - itemid = 8093, - type = "deequip", - slot = "hand", - level = 22, - }, - { - -- wand of starmstorm - itemid = 8092, - type = "equip", - slot = "hand", - level = 37, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of starmstorm - itemid = 8092, - type = "deequip", - slot = "hand", - level = 37, - }, - { - -- spellbook of dark mysteries - itemid = 8090, - type = "equip", - slot = "shield", - level = 80, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellbook of dark mysteries - itemid = 8090, - type = "deequip", - slot = "shield", - level = 80, - }, - { - -- springsprout rod - itemid = 8084, - type = "equip", - slot = "hand", - level = 37, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- springsprout rod - itemid = 8084, - type = "deequip", - slot = "hand", - level = 37, - }, - { - -- northwind rod - itemid = 8083, - type = "equip", - slot = "hand", - level = 22, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- northwind rod - itemid = 8083, - type = "deequip", - slot = "hand", - level = 22, - }, - { - -- underworld rod - itemid = 8082, - type = "equip", - slot = "hand", - level = 42, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- underworld rod - itemid = 8082, - type = "deequip", - slot = "hand", - level = 42, - }, - { - -- terran rainbow shield - itemid = 8081, - type = "equip", - slot = "shield", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- terran rainbow shield - itemid = 8081, - type = "deequip", - slot = "shield", - level = 100, - }, - { - -- sparking rainbow shield - itemid = 8080, - type = "equip", - slot = "shield", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sparking rainbow shield - itemid = 8080, - type = "deequip", - slot = "shield", - level = 100, - }, - { - -- icy rainbow shield - itemid = 8079, - type = "equip", - slot = "shield", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- icy rainbow shield - itemid = 8079, - type = "deequip", - slot = "shield", - level = 100, - }, - { - -- fiery rainbow shield - itemid = 8078, - type = "equip", - slot = "shield", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fiery rainbow shield - itemid = 8078, - type = "deequip", - slot = "shield", - level = 100, - }, - { - -- rainbow shield - itemid = 8077, - type = "equip", - slot = "shield", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- rainbow shield - itemid = 8077, - type = "deequip", - slot = "shield", - level = 100, - }, - { - -- spellscroll of prophecies - itemid = 8076, - type = "equip", - slot = "shield", - level = 70, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellscroll of prophecies - itemid = 8076, - type = "deequip", - slot = "shield", - level = 70, - }, - { - -- spellbook of lost souls - itemid = 8075, - type = "equip", - slot = "shield", - level = 60, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellbook of lost souls - itemid = 8075, - type = "deequip", - slot = "shield", - level = 60, - }, - { - -- spellbook of mind control - itemid = 8074, - type = "equip", - slot = "shield", - level = 50, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellbook of mind control - itemid = 8074, - type = "deequip", - slot = "shield", - level = 50, - }, - { - -- spellbook of warding - itemid = 8073, - type = "equip", - slot = "shield", - level = 40, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellbook of warding - itemid = 8073, - type = "deequip", - slot = "shield", - level = 40, - }, - { - -- spellbook of enlightenment - itemid = 8072, - type = "equip", - slot = "shield", - level = 30, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellbook of enlightenment - itemid = 8072, - type = "deequip", - slot = "shield", - level = 30, - }, - { - -- ethno coat - itemid = 8064, - type = "equip", - slot = "armor", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- ethno coat - itemid = 8064, - type = "deequip", - slot = "armor", - }, - { - -- paladin armor - itemid = 8063, - type = "equip", - slot = "armor", - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- paladin armor - itemid = 8063, - type = "deequip", - slot = "armor", - }, - { - -- robe of the underworld - itemid = 8062, - type = "equip", - slot = "armor", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- robe of the underworld - itemid = 8062, - type = "deequip", - slot = "armor", - level = 100, - }, - { - -- skullcracker armor - itemid = 8061, - type = "equip", - slot = "armor", - level = 85, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- skullcracker armor - itemid = 8061, - type = "deequip", - slot = "armor", - level = 85, - }, - { - -- master archer's armor - itemid = 8060, - type = "equip", - slot = "armor", - level = 100, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- master archer's armor - itemid = 8060, - type = "deequip", - slot = "armor", - level = 100, - }, - { - -- frozen plate - itemid = 8059, - type = "equip", - slot = "armor", - level = 75, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- frozen plate - itemid = 8059, - type = "deequip", - slot = "armor", - level = 75, - }, - { - -- molten plate - itemid = 8058, - type = "equip", - slot = "armor", - level = 75, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- molten plate - itemid = 8058, - type = "deequip", - slot = "armor", - level = 75, - }, - { - -- divine plate - itemid = 8057, - type = "equip", - slot = "armor", - level = 75, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- divine plate - itemid = 8057, - type = "deequip", - slot = "armor", - level = 75, - }, - { - -- oceanborn leviathan armor - itemid = 8056, - type = "equip", - slot = "armor", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- oceanborn leviathan armor - itemid = 8056, - type = "deequip", - slot = "armor", - level = 100, - }, - { - -- windborn colossus armor - itemid = 8055, - type = "equip", - slot = "armor", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- windborn colossus armor - itemid = 8055, - type = "deequip", - slot = "armor", - level = 100, - }, - { - -- earthborn titan armor - itemid = 8054, - type = "equip", - slot = "armor", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- earthborn titan armor - itemid = 8054, - type = "deequip", - slot = "armor", - level = 100, - }, - { - -- fireborn giant armor - itemid = 8053, - type = "equip", - slot = "armor", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fireborn giant armor - itemid = 8053, - type = "deequip", - slot = "armor", - level = 100, - }, - { - -- swamplair armor - itemid = 8052, - type = "equip", - slot = "armor", - level = 60, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- swamplair armor - itemid = 8052, - type = "deequip", - slot = "armor", - level = 60, - }, - { - -- voltage armor - itemid = 8051, - type = "equip", - slot = "armor", - level = 60, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- voltage armor - itemid = 8051, - type = "deequip", - slot = "armor", - level = 60, - }, - { - -- crystalline armor - itemid = 8050, - type = "equip", - slot = "armor", - level = 60, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- crystalline armor - itemid = 8050, - type = "deequip", - slot = "armor", - level = 60, - }, - { - -- lavos armor - itemid = 8049, - type = "equip", - slot = "armor", - level = 60, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- lavos armor - itemid = 8049, - type = "deequip", - slot = "armor", - level = 60, - }, - { - -- girl's dress - itemid = 8048, - type = "equip", - slot = "armor", - }, - { - -- girl's dress - itemid = 8048, - type = "deequip", - slot = "armor", - }, - { - -- tunic - itemid = 8047, - type = "equip", - slot = "armor", - }, - { - -- tunic - itemid = 8047, - type = "deequip", - slot = "armor", - }, - { - -- summer dress - itemid = 8046, - type = "equip", - slot = "armor", - }, - { - -- summer dress - itemid = 8046, - type = "deequip", - slot = "armor", - }, - { - -- hibiscus dress - itemid = 8045, - type = "equip", - slot = "armor", - }, - { - -- hibiscus dress - itemid = 8045, - type = "deequip", - slot = "armor", - }, - { - -- belted cape - itemid = 8044, - type = "equip", - slot = "armor", - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- belted cape - itemid = 8044, - type = "deequip", - slot = "armor", - }, - { - -- focus cape - itemid = 8043, - type = "equip", - slot = "armor", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- focus cape - itemid = 8043, - type = "deequip", - slot = "armor", - }, - { - -- spirit cloak - itemid = 8042, - type = "equip", - slot = "armor", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spirit cloak - itemid = 8042, - type = "deequip", - slot = "armor", - }, - { - -- greenwood coat - itemid = 8041, - type = "equip", - slot = "armor", - level = 75, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- greenwood coat - itemid = 8041, - type = "deequip", - slot = "armor", - level = 75, - }, - { - -- velvet mantle - itemid = 8040, - type = "equip", - slot = "armor", - level = 75, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- velvet mantle - itemid = 8040, - type = "deequip", - slot = "armor", - level = 75, - }, - { - -- dragon robe - itemid = 8039, - type = "equip", - slot = "armor", - level = 75, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- dragon robe - itemid = 8039, - type = "deequip", - slot = "armor", - level = 75, - }, - { - -- robe of the ice queen - itemid = 8038, - type = "equip", - slot = "armor", - level = 75, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- robe of the ice queen - itemid = 8038, - type = "deequip", - slot = "armor", - level = 75, - }, - { - -- dark lord's cape - itemid = 8037, - type = "equip", - slot = "armor", - level = 65, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- dark lord's cape - itemid = 8037, - type = "deequip", - slot = "armor", - level = 65, - }, - { - -- elethriel's elemental bow - itemid = 8030, - type = "equip", - slot = "hand", - }, - { - -- elethriel's elemental bow - itemid = 8030, - type = "deequip", - slot = "hand", - }, - { - -- silkweaver bow - itemid = 8029, - type = "equip", - slot = "hand", - }, - { - -- silkweaver bow - itemid = 8029, - type = "deequip", - slot = "hand", - }, - { - -- yol's bow - itemid = 8028, - type = "equip", - slot = "hand", - }, - { - -- yol's bow - itemid = 8028, - type = "deequip", - slot = "hand", - }, - { - -- composite hornbow - itemid = 8027, - type = "equip", - slot = "hand", - }, - { - -- composite hornbow - itemid = 8027, - type = "deequip", - slot = "hand", - }, - { - -- warsinger bow - itemid = 8026, - type = "equip", - slot = "hand", - }, - { - -- warsinger bow - itemid = 8026, - type = "deequip", - slot = "hand", - }, - { - -- ironworker - itemid = 8025, - type = "equip", - slot = "hand", - }, - { - -- ironworker - itemid = 8025, - type = "deequip", - slot = "hand", - }, - { - -- devileye - itemid = 8024, - type = "equip", - slot = "hand", - }, - { - -- devileye - itemid = 8024, - type = "deequip", - slot = "hand", - }, - { - -- royal crossbow - itemid = 8023, - type = "equip", - slot = "hand", - }, - { - -- royal crossbow - itemid = 8023, - type = "deequip", - slot = "hand", - }, - { - -- chain bolter - itemid = 8022, - type = "equip", - slot = "hand", - }, - { - -- chain bolter - itemid = 8022, - type = "deequip", - slot = "hand", - }, - { - -- modified crossbow - itemid = 8021, - type = "equip", - slot = "hand", - }, - { - -- modified crossbow - itemid = 8021, - type = "deequip", - slot = "hand", - }, - { - -- witchhunter's coat - itemid = 7993, - type = "equip", - slot = "armor", - level = 50, - }, - { - -- witchhunter's coat - itemid = 7993, - type = "deequip", - slot = "armor", - level = 50, - }, - { - -- mage hat - itemid = 7992, - type = "equip", - slot = "head", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- mage hat - itemid = 7992, - type = "deequip", - slot = "head", - }, - { - -- magician's robe - itemid = 7991, - type = "equip", - slot = "armor", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- magician's robe - itemid = 7991, - type = "deequip", - slot = "armor", - }, - { - -- jagged sword - itemid = 7774, - type = "equip", - slot = "hand", - }, - { - -- jagged sword - itemid = 7774, - type = "deequip", - slot = "hand", - }, - { - -- steel axe - itemid = 7773, - type = "equip", - slot = "hand", - }, - { - -- steel axe - itemid = 7773, - type = "deequip", - slot = "hand", - }, - { - -- Jerom's family necklace - itemid = 7754, - type = "equip", - slot = "necklace", - }, - { - -- Jerom's family necklace - itemid = 7754, - type = "deequip", - slot = "necklace", - }, - { - -- Koshei's ancient amulet - itemid = 7532, - type = "equip", - slot = "necklace", - }, - { - -- Koshei's ancient amulet - itemid = 7532, - type = "deequip", - slot = "necklace", - }, - { - -- crimson sword - itemid = 860, - type = "equip", - slot = "hand", - }, - { - -- crimson sword - itemid = 860, - type = "deequip", - slot = "hand", - }, - { - -- shapeshifter ring - itemid = 908, - type = "equip", - slot = "ring", - }, - { - -- shapeshifter ring - itemid = 908, - type = "deequip", - slot = "ring", - }, - { - -- shapeshifter ring - itemid = 907, - type = "equip", - slot = "ring", - }, - { - -- shapeshifter ring - itemid = 904, - type = "deequip", - slot = "ring", - }, - { - -- jester hat - itemid = 894, - type = "equip", - slot = "head", - }, - { - -- jester hat - itemid = 894, - type = "deequip", - slot = "head", - }, - { - -- terra hood - itemid = 830, - type = "equip", - slot = "head", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- terra hood - itemid = 830, - type = "deequip", - slot = "head", - }, - { - -- glacier mask - itemid = 829, - type = "equip", - slot = "head", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- glacier mask - itemid = 829, - type = "deequip", - slot = "head", - }, - { - -- lightning headband - itemid = 828, - type = "equip", - slot = "head", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- lightning headband - itemid = 828, - type = "deequip", - slot = "head", - }, - { - -- magma monocle - itemid = 827, - type = "equip", - slot = "head", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- magma monocle - itemid = 827, - type = "deequip", - slot = "head", - }, - { - -- magma coat - itemid = 826, - type = "equip", - slot = "armor", - level = 50, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- magma coat - itemid = 826, - type = "deequip", - slot = "armor", - level = 50, - }, - { - -- lightning robe - itemid = 825, - type = "equip", - slot = "armor", - level = 50, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- lightning robe - itemid = 825, - type = "deequip", - slot = "armor", - level = 50, - }, - { - -- glacier robe - itemid = 824, - type = "equip", - slot = "armor", - level = 50, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- glacier robe - itemid = 824, - type = "deequip", - slot = "armor", - level = 50, - }, - { - -- glacier kilt - itemid = 823, - type = "equip", - slot = "legs", - level = 40, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- glacier kilt - itemid = 823, - type = "deequip", - slot = "legs", - level = 40, - }, - { - -- lightning legs - itemid = 822, - type = "equip", - slot = "legs", - level = 40, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- lightning legs - itemid = 822, - type = "deequip", - slot = "legs", - level = 40, - }, - { - -- magma legs - itemid = 821, - type = "equip", - slot = "legs", - level = 40, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- magma legs - itemid = 821, - type = "deequip", - slot = "legs", - level = 40, - }, - { - -- lightning boots - itemid = 820, - type = "equip", - slot = "feet", - level = 35, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- lightning boots - itemid = 820, - type = "deequip", - slot = "feet", - level = 35, - }, - { - -- glacier shoes - itemid = 819, - type = "equip", - slot = "feet", - level = 35, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- glacier shoes - itemid = 819, - type = "deequip", - slot = "feet", - level = 35, - }, - { - -- magma boots - itemid = 818, - type = "equip", - slot = "feet", - level = 35, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- magma boots - itemid = 818, - type = "deequip", - slot = "feet", - level = 35, - }, - { - -- magma amulet - itemid = 817, - type = "equip", - slot = "necklace", - level = 60, - }, - { - -- magma amulet - itemid = 817, - type = "deequip", - slot = "necklace", - level = 60, - }, - { - -- lightning pendant - itemid = 816, - type = "equip", - slot = "necklace", - level = 60, - }, - { - -- lightning pendant - itemid = 816, - type = "deequip", - slot = "necklace", - level = 60, - }, - { - -- glacier amulet - itemid = 815, - type = "equip", - slot = "necklace", - level = 60, - }, - { - -- glacier amulet - itemid = 815, - type = "deequip", - slot = "necklace", - level = 60, - }, - { - -- terra amulet - itemid = 814, - type = "equip", - slot = "necklace", - level = 60, - }, - { - -- terra amulet - itemid = 814, - type = "deequip", - slot = "necklace", - level = 60, - }, - { - -- terra boots - itemid = 813, - type = "equip", - slot = "feet", - level = 35, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- terra boots - itemid = 813, - type = "deequip", - slot = "feet", - level = 35, - }, - { - -- terra legs - itemid = 812, - type = "equip", - slot = "legs", - level = 40, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- terra legs - itemid = 812, - type = "deequip", - slot = "legs", - level = 40, - }, - { - -- terra mantle - itemid = 811, - type = "equip", - slot = "armor", - level = 50, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- terra mantle - itemid = 811, - type = "deequip", - slot = "armor", - level = 50, - }, - { - -- energy war hammer - itemid = 810, - type = "equip", - slot = "hand", - }, - { - -- energy war hammer - itemid = 810, - type = "deequip", - slot = "hand", - }, - { - -- energy orcish maul - itemid = 809, - type = "equip", - slot = "hand", - }, - { - -- energy orcish maul - itemid = 809, - type = "deequip", - slot = "hand", - }, - { - -- energy cranial basher - itemid = 808, - type = "equip", - slot = "hand", - }, - { - -- energy cranial basher - itemid = 808, - type = "deequip", - slot = "hand", - }, - { - -- energy crystal mace - itemid = 807, - type = "equip", - slot = "hand", - }, - { - -- energy crystal mace - itemid = 807, - type = "deequip", - slot = "hand", - }, - { - -- energy clerical mace - itemid = 806, - type = "equip", - slot = "hand", - }, - { - -- energy clerical mace - itemid = 806, - type = "deequip", - slot = "hand", - }, - { - -- energy war axe - itemid = 805, - type = "equip", - slot = "hand", - }, - { - -- energy war axe - itemid = 805, - type = "deequip", - slot = "hand", - }, - { - -- energy headchopper - itemid = 804, - type = "equip", - slot = "hand", - }, - { - -- energy headchopper - itemid = 804, - type = "deequip", - slot = "hand", - }, - { - -- energy heroic axe - itemid = 803, - type = "equip", - slot = "hand", - }, - { - -- energy heroic axe - itemid = 803, - type = "deequip", - slot = "hand", - }, - { - -- energy knight axe - itemid = 802, - type = "equip", - slot = "hand", - }, - { - -- energy knight axe - itemid = 802, - type = "deequip", - slot = "hand", - }, - { - -- energy barbarian axe - itemid = 801, - type = "equip", - slot = "hand", - }, - { - -- energy barbarian axe - itemid = 801, - type = "deequip", - slot = "hand", - }, - { - -- energy dragon slayer - itemid = 798, - type = "equip", - slot = "hand", - }, - { - -- energy dragon slayer - itemid = 798, - type = "deequip", - slot = "hand", - }, - { - -- energy blacksteel sword - itemid = 797, - type = "equip", - slot = "hand", - }, - { - -- energy blacksteel sword - itemid = 797, - type = "deequip", - slot = "hand", - }, - { - -- energy mystic blade - itemid = 796, - type = "equip", - slot = "hand", - }, - { - -- energy mystic blade - itemid = 796, - type = "deequip", - slot = "hand", - }, - { - -- energy relic sword - itemid = 795, - type = "equip", - slot = "hand", - }, - { - -- energy relic sword - itemid = 795, - type = "deequip", - slot = "hand", - }, - { - -- energy spike sword - itemid = 794, - type = "equip", - slot = "hand", - }, - { - -- energy spike sword - itemid = 794, - type = "deequip", - slot = "hand", - }, - { - -- earth war hammer - itemid = 793, - type = "equip", - slot = "hand", - }, - { - -- earth war hammer - itemid = 793, - type = "deequip", - slot = "hand", - }, - { - -- earth orcish maul - itemid = 792, - type = "equip", - slot = "hand", - }, - { - -- earth orcish maul - itemid = 792, - type = "deequip", - slot = "hand", - }, - { - -- earth cranial basher - itemid = 791, - type = "equip", - slot = "hand", - }, - { - -- earth cranial basher - itemid = 791, - type = "deequip", - slot = "hand", - }, - { - -- earth crystal mace - itemid = 790, - type = "equip", - slot = "hand", - }, - { - -- earth crystal mace - itemid = 790, - type = "deequip", - slot = "hand", - }, - { - -- earth clerical mace - itemid = 789, - type = "equip", - slot = "hand", - }, - { - -- earth clerical mace - itemid = 789, - type = "deequip", - slot = "hand", - }, - { - -- earth war axe - itemid = 788, - type = "equip", - slot = "hand", - }, - { - -- earth war axe - itemid = 788, - type = "deequip", - slot = "hand", - }, - { - -- earth headchopper - itemid = 787, - type = "equip", - slot = "hand", - }, - { - -- earth headchopper - itemid = 787, - type = "deequip", - slot = "hand", - }, - { - -- earth heroic axe - itemid = 786, - type = "equip", - slot = "hand", - }, - { - -- earth heroic axe - itemid = 786, - type = "deequip", - slot = "hand", - }, - { - -- earth knight axe - itemid = 785, - type = "equip", - slot = "hand", - }, - { - -- earth knight axe - itemid = 785, - type = "deequip", - slot = "hand", - }, - { - -- earth barbarian axe - itemid = 784, - type = "equip", - slot = "hand", - }, - { - -- earth barbarian axe - itemid = 784, - type = "deequip", - slot = "hand", - }, - { - -- earth dragon slayer - itemid = 783, - type = "equip", - slot = "hand", - }, - { - -- earth dragon slayer - itemid = 783, - type = "deequip", - slot = "hand", - }, - { - -- earth blacksteel sword - itemid = 782, - type = "equip", - slot = "hand", - }, - { - -- earth blacksteel sword - itemid = 782, - type = "deequip", - slot = "hand", - }, - { - -- earth mystic blade - itemid = 781, - type = "equip", - slot = "hand", - }, - { - -- earth mystic blade - itemid = 781, - type = "deequip", - slot = "hand", - }, - { - -- earth relic sword - itemid = 780, - type = "equip", - slot = "hand", - }, - { - -- earth relic sword - itemid = 780, - type = "deequip", - slot = "hand", - }, - { - -- earth spike sword - itemid = 779, - type = "equip", - slot = "hand", - }, - { - -- earth spike sword - itemid = 779, - type = "deequip", - slot = "hand", - }, - { - -- earth arrow - itemid = 774, - type = "equip", - slot = "ammo", - }, - { - -- earth arrow - itemid = 774, - type = "deequip", - slot = "ammo", - }, - { - -- flaming arrow - itemid = 763, - type = "equip", - slot = "ammo", - }, - { - -- flaming arrow - itemid = 763, - type = "deequip", - slot = "ammo", - }, - { - -- shiver arrow - itemid = 762, - type = "equip", - slot = "ammo", - }, - { - -- shiver arrow - itemid = 762, - type = "deequip", - slot = "ammo", - }, - { - -- flash arrow - itemid = 761, - type = "equip", - slot = "ammo", - }, - { - -- flash arrow - itemid = 761, - type = "deequip", - slot = "ammo", - }, - { - -- icy war hammer - itemid = 693, - type = "equip", - slot = "hand", - }, - { - -- icy war hammer - itemid = 693, - type = "deequip", - slot = "hand", - }, - { - -- icy orcish maul - itemid = 692, - type = "equip", - slot = "hand", - }, - { - -- icy orcish maul - itemid = 692, - type = "deequip", - slot = "hand", - }, - { - -- icy cranial basher - itemid = 691, - type = "equip", - slot = "hand", - }, - { - -- icy cranial basher - itemid = 691, - type = "deequip", - slot = "hand", - }, - { - -- icy crystal mace - itemid = 690, - type = "equip", - slot = "hand", - }, - { - -- icy crystal mace - itemid = 690, - type = "deequip", - slot = "hand", - }, - { - -- icy clerical mace - itemid = 689, - type = "equip", - slot = "hand", - }, - { - -- icy clerical mace - itemid = 689, - type = "deequip", - slot = "hand", - }, - { - -- icy war axe - itemid = 688, - type = "equip", - slot = "hand", - }, - { - -- icy war axe - itemid = 688, - type = "deequip", - slot = "hand", - }, - { - -- icy headchopper - itemid = 687, - type = "equip", - slot = "hand", - }, - { - -- icy headchopper - itemid = 687, - type = "deequip", - slot = "hand", - }, - { - -- icy heroic axe - itemid = 686, - type = "equip", - slot = "hand", - }, - { - -- icy heroic axe - itemid = 686, - type = "deequip", - slot = "hand", - }, - { - -- icy knight axe - itemid = 685, - type = "equip", - slot = "hand", - }, - { - -- icy knight axe - itemid = 685, - type = "deequip", - slot = "hand", - }, - { - -- icy barbarian axe - itemid = 684, - type = "equip", - slot = "hand", - }, - { - -- icy barbarian axe - itemid = 684, - type = "deequip", - slot = "hand", - }, - { - -- icy dragon slayer - itemid = 683, - type = "equip", - slot = "hand", - }, - { - -- icy dragon slayer - itemid = 683, - type = "deequip", - slot = "hand", - }, - { - -- icy blacksteel sword - itemid = 682, - type = "equip", - slot = "hand", - }, - { - -- icy blacksteel sword - itemid = 682, - type = "deequip", - slot = "hand", - }, - { - -- icy mystic blade - itemid = 681, - type = "equip", - slot = "hand", - }, - { - -- icy mystic blade - itemid = 681, - type = "deequip", - slot = "hand", - }, - { - -- icy relic sword - itemid = 680, - type = "equip", - slot = "hand", - }, - { - -- icy relic sword - itemid = 680, - type = "deequip", - slot = "hand", - }, - { - -- icy spike sword - itemid = 679, - type = "equip", - slot = "hand", - }, - { - -- icy spike sword - itemid = 679, - type = "deequip", - slot = "hand", - }, - { - -- fiery war hammer - itemid = 674, - type = "equip", - slot = "hand", - }, - { - -- fiery war hammer - itemid = 674, - type = "deequip", - slot = "hand", - }, - { - -- fiery orcish maul - itemid = 673, - type = "equip", - slot = "hand", - }, - { - -- fiery orcish maul - itemid = 673, - type = "deequip", - slot = "hand", - }, - { - -- fiery cranial basher - itemid = 672, - type = "equip", - slot = "hand", - }, - { - -- fiery cranial basher - itemid = 672, - type = "deequip", - slot = "hand", - }, - { - -- fiery crystal mace - itemid = 671, - type = "equip", - slot = "hand", - }, - { - -- fiery crystal mace - itemid = 671, - type = "deequip", - slot = "hand", - }, - { - -- fiery clerical mace - itemid = 670, - type = "equip", - slot = "hand", - }, - { - -- fiery clerical mace - itemid = 670, - type = "deequip", - slot = "hand", - }, - { - -- fiery war axe - itemid = 669, - type = "equip", - slot = "hand", - }, - { - -- fiery war axe - itemid = 669, - type = "deequip", - slot = "hand", - }, - { - -- fiery headchopper - itemid = 668, - type = "equip", - slot = "hand", - }, - { - -- fiery headchopper - itemid = 668, - type = "deequip", - slot = "hand", - }, - { - -- fiery heroic axe - itemid = 667, - type = "equip", - slot = "hand", - }, - { - -- fiery heroic axe - itemid = 667, - type = "deequip", - slot = "hand", - }, - { - -- fiery knight axe - itemid = 666, - type = "equip", - slot = "hand", - }, - { - -- fiery knight axe - itemid = 666, - type = "deequip", - slot = "hand", - }, - { - -- fiery barbarian axe - itemid = 665, - type = "equip", - slot = "hand", - }, - { - -- fiery barbarian axe - itemid = 665, - type = "deequip", - slot = "hand", - }, - { - -- fiery dragon slayer - itemid = 664, - type = "equip", - slot = "hand", - }, - { - -- fiery dragon slayer - itemid = 664, - type = "deequip", - slot = "hand", - }, - { - -- fiery blacksteel sword - itemid = 663, - type = "equip", - slot = "hand", - }, - { - -- fiery blacksteel sword - itemid = 663, - type = "deequip", - slot = "hand", - }, - { - -- fiery mystic blade - itemid = 662, - type = "equip", - slot = "hand", - }, - { - -- fiery mystic blade - itemid = 662, - type = "deequip", - slot = "hand", - }, - { - -- fiery relic sword - itemid = 661, - type = "equip", - slot = "hand", - }, - { - -- fiery relic sword - itemid = 661, - type = "deequip", - slot = "hand", - }, - { - -- fiery spike sword - itemid = 660, - type = "equip", - slot = "hand", - }, - { - -- fiery spike sword - itemid = 660, - type = "deequip", - slot = "hand", - }, - { - -- blue legs - itemid = 645, - type = "equip", - slot = "legs", - }, - { - -- blue legs - itemid = 645, - type = "deequip", - slot = "legs", - }, - { - -- suspicious signet ring - itemid = 406, - type = "equip", - slot = "ring", - }, - { - -- suspicious signet ring - itemid = 406, - type = "deequip", - slot = "ring", - }, - { - -- family signet ring - itemid = 349, - type = "equip", - slot = "ring", - }, - { - -- family signet ring - itemid = 349, - type = "deequip", - slot = "ring", - }, - { - -- mining helmet - itemid = 139, - type = "equip", - slot = "head", - }, - { - -- mining helmet - itemid = 139, - type = "deequip", - slot = "head", - }, - { - -- mammoth fur shorts - itemid = 7464, - type = "equip", - slot = "legs", - }, - { - -- mammoth fur shorts - itemid = 7464, - type = "deequip", - slot = "legs", - }, - { - -- mammoth fur cape - itemid = 7463, - type = "equip", - slot = "armor", - }, - { - -- mammoth fur cape - itemid = 7463, - type = "deequip", - slot = "armor", - }, - { - -- ragnir helmet - itemid = 7462, - type = "equip", - slot = "head", - }, - { - -- ragnir helmet - itemid = 7462, - type = "deequip", - slot = "head", - }, - { - -- krimhorn helmet - itemid = 7461, - type = "equip", - slot = "head", - }, - { - -- krimhorn helmet - itemid = 7461, - type = "deequip", - slot = "head", - }, - { - -- norse shield - itemid = 7460, - type = "equip", - slot = "shield", - }, - { - -- norse shield - itemid = 7460, - type = "deequip", - slot = "shield", - }, - { - -- pair of earmuffs - itemid = 7459, - type = "equip", - slot = "head", - }, - { - -- pair of earmuffs - itemid = 7459, - type = "deequip", - slot = "head", - }, - { - -- fur cap - itemid = 7458, - type = "equip", - slot = "head", - }, - { - -- fur cap - itemid = 7458, - type = "deequip", - slot = "head", - }, - { - -- fur boots - itemid = 7457, - type = "equip", - slot = "feet", - }, - { - -- fur boots - itemid = 7457, - type = "deequip", - slot = "feet", - }, - { - -- noble axe - itemid = 7456, - type = "equip", - slot = "hand", - }, - { - -- noble axe - itemid = 7456, - type = "deequip", - slot = "hand", - }, - { - -- mythril axe - itemid = 7455, - type = "equip", - slot = "hand", - }, - { - -- mythril axe - itemid = 7455, - type = "deequip", - slot = "hand", - }, - { - -- glorious axe - itemid = 7454, - type = "equip", - slot = "hand", - }, - { - -- glorious axe - itemid = 7454, - type = "deequip", - slot = "hand", - }, - { - -- executioner - itemid = 7453, - type = "equip", - slot = "hand", - }, - { - -- executioner - itemid = 7453, - type = "deequip", - slot = "hand", - }, - { - -- spiked squelcher - itemid = 7452, - type = "equip", - slot = "hand", - }, - { - -- spiked squelcher - itemid = 7452, - type = "deequip", - slot = "hand", - }, - { - -- shadow sceptre - itemid = 7451, - type = "equip", - slot = "hand", - }, - { - -- shadow sceptre - itemid = 7451, - type = "deequip", - slot = "hand", - }, - { - -- hammer of prophecy - itemid = 7450, - type = "equip", - slot = "hand", - }, - { - -- hammer of prophecy - itemid = 7450, - type = "deequip", - slot = "hand", - }, - { - -- crystal sword - itemid = 7449, - type = "equip", - slot = "hand", - }, - { - -- crystal sword - itemid = 7449, - type = "deequip", - slot = "hand", - }, - { - -- elvish bow - itemid = 7438, - type = "equip", - slot = "hand", - }, - { - -- elvish bow - itemid = 7438, - type = "deequip", - slot = "hand", - }, - { - -- sapphire hammer - itemid = 7437, - type = "equip", - slot = "hand", - }, - { - -- sapphire hammer - itemid = 7437, - type = "deequip", - slot = "hand", - }, - { - -- angelic axe - itemid = 7436, - type = "equip", - slot = "hand", - }, - { - -- angelic axe - itemid = 7436, - type = "deequip", - slot = "hand", - }, - { - -- impaler - itemid = 7435, - type = "equip", - slot = "hand", - }, - { - -- impaler - itemid = 7435, - type = "deequip", - slot = "hand", - }, - { - -- royal axe - itemid = 7434, - type = "equip", - slot = "hand", - }, - { - -- royal axe - itemid = 7434, - type = "deequip", - slot = "hand", - }, - { - -- ravenwing - itemid = 7433, - type = "equip", - slot = "hand", - }, - { - -- ravenwing - itemid = 7433, - type = "deequip", - slot = "hand", - }, - { - -- furry club - itemid = 7432, - type = "equip", - slot = "hand", - }, - { - -- furry club - itemid = 7432, - type = "deequip", - slot = "hand", - }, - { - -- demonbone - itemid = 7431, - type = "equip", - slot = "hand", - }, - { - -- demonbone - itemid = 7431, - type = "deequip", - slot = "hand", - }, - { - -- dragonbone staff - itemid = 7430, - type = "equip", - slot = "hand", - }, - { - -- dragonbone staff - itemid = 7430, - type = "deequip", - slot = "hand", - }, - { - -- blessed sceptre - itemid = 7429, - type = "equip", - slot = "hand", - }, - { - -- blessed sceptre - itemid = 7429, - type = "deequip", - slot = "hand", - }, - { - -- bonebreaker - itemid = 7428, - type = "equip", - slot = "hand", - }, - { - -- bonebreaker - itemid = 7428, - type = "deequip", - slot = "hand", - }, - { - -- chaos mace - itemid = 7427, - type = "equip", - slot = "hand", - }, - { - -- chaos mace - itemid = 7427, - type = "deequip", - slot = "hand", - }, - { - -- amber staff - itemid = 7426, - type = "equip", - slot = "hand", - }, - { - -- amber staff - itemid = 7426, - type = "deequip", - slot = "hand", - }, - { - -- taurus mace - itemid = 7425, - type = "equip", - slot = "hand", - }, - { - -- taurus mace - itemid = 7425, - type = "deequip", - slot = "hand", - }, - { - -- lunar staff - itemid = 7424, - type = "equip", - slot = "hand", - }, - { - -- lunar staff - itemid = 7424, - type = "deequip", - slot = "hand", - }, - { - -- skullcrusher - itemid = 7423, - type = "equip", - slot = "hand", - }, - { - -- skullcrusher - itemid = 7423, - type = "deequip", - slot = "hand", - }, - { - -- jade hammer - itemid = 7422, - type = "equip", - slot = "hand", - }, - { - -- jade hammer - itemid = 7422, - type = "deequip", - slot = "hand", - }, - { - -- onyx flail - itemid = 7421, - type = "equip", - slot = "hand", - }, - { - -- onyx flail - itemid = 7421, - type = "deequip", - slot = "hand", - }, - { - -- reaper's axe - itemid = 7420, - type = "equip", - slot = "hand", - }, - { - -- reaper's axe - itemid = 7420, - type = "deequip", - slot = "hand", - }, - { - -- dreaded cleaver - itemid = 7419, - type = "equip", - slot = "hand", - }, - { - -- dreaded cleaver - itemid = 7419, - type = "deequip", - slot = "hand", - }, - { - -- nightmare blade - itemid = 7418, - type = "equip", - slot = "hand", - }, - { - -- nightmare blade - itemid = 7418, - type = "deequip", - slot = "hand", - }, - { - -- runed sword - itemid = 7417, - type = "equip", - slot = "hand", - }, - { - -- runed sword - itemid = 7417, - type = "deequip", - slot = "hand", - }, - { - -- bloody edge - itemid = 7416, - type = "equip", - slot = "hand", - }, - { - -- bloody edge - itemid = 7416, - type = "deequip", - slot = "hand", - }, - { - -- cranial basher - itemid = 7415, - type = "equip", - slot = "hand", - }, - { - -- cranial basher - itemid = 7415, - type = "deequip", - slot = "hand", - }, - { - -- abyss hammer - itemid = 7414, - type = "equip", - slot = "hand", - }, - { - -- abyss hammer - itemid = 7414, - type = "deequip", - slot = "hand", - }, - { - -- titan axe - itemid = 7413, - type = "equip", - slot = "hand", - }, - { - -- titan axe - itemid = 7413, - type = "deequip", - slot = "hand", - }, - { - -- butcher's axe - itemid = 7412, - type = "equip", - slot = "hand", - }, - { - -- butcher's axe - itemid = 7412, - type = "deequip", - slot = "hand", - }, - { - -- ornamented axe - itemid = 7411, - type = "equip", - slot = "hand", - }, - { - -- ornamented axe - itemid = 7411, - type = "deequip", - slot = "hand", - }, - { - -- queen's sceptre - itemid = 7410, - type = "equip", - slot = "hand", - }, - { - -- queen's sceptre - itemid = 7410, - type = "deequip", - slot = "hand", - }, - { - -- northern star - itemid = 7409, - type = "equip", - slot = "hand", - }, - { - -- northern star - itemid = 7409, - type = "deequip", - slot = "hand", - }, - { - -- wyvern fang - itemid = 7408, - type = "equip", - slot = "hand", - }, - { - -- wyvern fang - itemid = 7408, - type = "deequip", - slot = "hand", - }, - { - -- haunted blade - itemid = 7407, - type = "equip", - slot = "hand", - }, - { - -- haunted blade - itemid = 7407, - type = "deequip", - slot = "hand", - }, - { - -- blacksteel sword - itemid = 7406, - type = "equip", - slot = "hand", - }, - { - -- blacksteel sword - itemid = 7406, - type = "deequip", - slot = "hand", - }, - { - -- havoc blade - itemid = 7405, - type = "equip", - slot = "hand", - }, - { - -- havoc blade - itemid = 7405, - type = "deequip", - slot = "hand", - }, - { - -- assassin dagger - itemid = 7404, - type = "equip", - slot = "hand", - }, - { - -- assassin dagger - itemid = 7404, - type = "deequip", - slot = "hand", - }, - { - -- berserker - itemid = 7403, - type = "equip", - slot = "hand", - }, - { - -- berserker - itemid = 7403, - type = "deequip", - slot = "hand", - }, - { - -- dragon slayer - itemid = 7402, - type = "equip", - slot = "hand", - }, - { - -- dragon slayer - itemid = 7402, - type = "deequip", - slot = "hand", - }, - { - -- orcish maul - itemid = 7392, - type = "equip", - slot = "hand", - }, - { - -- orcish maul - itemid = 7392, - type = "deequip", - slot = "hand", - }, - { - -- thaian sword - itemid = 7391, - type = "equip", - slot = "hand", - }, - { - -- thaian sword - itemid = 7391, - type = "deequip", - slot = "hand", - }, - { - -- the justice seeker - itemid = 7390, - type = "equip", - slot = "hand", - }, - { - -- the justice seeker - itemid = 7390, - type = "deequip", - slot = "hand", - }, - { - -- heroic axe - itemid = 7389, - type = "equip", - slot = "hand", - }, - { - -- heroic axe - itemid = 7389, - type = "deequip", - slot = "hand", - }, - { - -- vile axe - itemid = 7388, - type = "equip", - slot = "hand", - }, - { - -- vile axe - itemid = 7388, - type = "deequip", - slot = "hand", - }, - { - -- diamond sceptre - itemid = 7387, - type = "equip", - slot = "hand", - }, - { - -- diamond sceptre - itemid = 7387, - type = "deequip", - slot = "hand", - }, - { - -- mercenary sword - itemid = 7386, - type = "equip", - slot = "hand", - }, - { - -- mercenary sword - itemid = 7386, - type = "deequip", - slot = "hand", - }, - { - -- crimson sword - itemid = 7385, - type = "equip", - slot = "hand", - }, - { - -- crimson sword - itemid = 7385, - type = "deequip", - slot = "hand", - }, - { - -- mystic blade - itemid = 7384, - type = "equip", - slot = "hand", - }, - { - -- mystic blade - itemid = 7384, - type = "deequip", - slot = "hand", - }, - { - -- relic sword - itemid = 7383, - type = "equip", - slot = "hand", - }, - { - -- relic sword - itemid = 7383, - type = "deequip", - slot = "hand", - }, - { - -- demonrage sword - itemid = 7382, - type = "equip", - slot = "hand", - }, - { - -- demonrage sword - itemid = 7382, - type = "deequip", - slot = "hand", - }, - { - -- mammoth whopper - itemid = 7381, - type = "equip", - slot = "hand", - }, - { - -- mammoth whopper - itemid = 7381, - type = "deequip", - slot = "hand", - }, - { - -- headchopper - itemid = 7380, - type = "equip", - slot = "hand", - }, - { - -- headchopper - itemid = 7380, - type = "deequip", - slot = "hand", - }, - { - -- brutetamer's staff - itemid = 7379, - type = "equip", - slot = "hand", - }, - { - -- brutetamer's staff - itemid = 7379, - type = "deequip", - slot = "hand", - }, - { - -- royal spear - itemid = 7378, - type = "equip", - slot = "hand", - }, - { - -- royal spear - itemid = 7378, - type = "deequip", - slot = "hand", - }, - { - -- assassin star - itemid = 7368, - type = "equip", - slot = "hand", - }, - { - -- assassin star - itemid = 7368, - type = "deequip", - slot = "hand", - }, - { - -- enchanted spear - itemid = 7367, - type = "equip", - slot = "hand", - }, - { - -- enchanted spear - itemid = 7367, - type = "deequip", - slot = "hand", - }, - { - -- onyx arrow - itemid = 7365, - type = "equip", - slot = "ammo", - }, - { - -- onyx arrow - itemid = 7365, - type = "deequip", - slot = "ammo", - }, - { - -- sniper arrow - itemid = 7364, - type = "equip", - slot = "ammo", - }, - { - -- sniper arrow - itemid = 7364, - type = "deequip", - slot = "ammo", - }, - { - -- piercing bolt - itemid = 7363, - type = "equip", - slot = "ammo", - }, - { - -- piercing bolt - itemid = 7363, - type = "deequip", - slot = "ammo", - }, - { - -- flame of life - itemid = 7360, - type = "additem", - }, - { - -- flame of life - itemid = 7359, - type = "stepin", - }, - { - -- fur bag - itemid = 7343, - type = "equip", - slot = "backpack", - }, - { - -- fur bag - itemid = 7343, - type = "deequip", - slot = "backpack", - }, - { - -- fur backpack - itemid = 7342, - type = "equip", - slot = "backpack", - }, - { - -- fur backpack - itemid = 7342, - type = "deequip", - slot = "backpack", - }, - { - -- party hat - itemid = 6578, - type = "equip", - slot = "head", - }, - { - -- party hat - itemid = 6578, - type = "deequip", - slot = "head", - }, - { - -- ruthless axe - itemid = 6553, - type = "equip", - slot = "hand", - }, - { - -- ruthless axe - itemid = 6553, - type = "deequip", - slot = "hand", - }, - { - -- santa hat - itemid = 6531, - type = "equip", - slot = "head", - }, - { - -- santa hat - itemid = 6531, - type = "deequip", - slot = "head", - }, - { - -- infernal bolt - itemid = 6528, - type = "equip", - slot = "ammo", - }, - { - -- infernal bolt - itemid = 6528, - type = "deequip", - slot = "ammo", - }, - { - -- the avenger - itemid = 6527, - type = "equip", - slot = "hand", - }, - { - -- the avenger - itemid = 6527, - type = "deequip", - slot = "hand", - }, - { - -- necromancer shield - itemid = 6432, - type = "equip", - slot = "shield", - }, - { - -- necromancer shield - itemid = 6432, - type = "deequip", - slot = "shield", - }, - { - -- nightmare shield - itemid = 6390, - type = "equip", - slot = "shield", - }, - { - -- nightmare shield - itemid = 6390, - type = "deequip", - slot = "shield", - }, - { - -- death ring - itemid = 6300, - type = "equip", - slot = "ring", - }, - { - -- death ring - itemid = 6300, - type = "deequip", - slot = "ring", - }, - { - -- death ring - itemid = 6299, - type = "equip", - slot = "ring", - }, - { - -- death ring - itemid = 6299, - type = "deequip", - slot = "ring", - }, - { - -- pair of soft boots - itemid = 6529, - type = "equip", - slot = "feet", - level = 10, - }, - { - -- pair of soft boots - itemid = 6529, - type = "deequip", - slot = "feet", - level = 10, - }, - { - -- tortoise shield - itemid = 6131, - type = "equip", - slot = "shield", - }, - { - -- tortoise shield - itemid = 6131, - type = "deequip", - slot = "shield", - }, - { - -- Dragha's spellbook - itemid = 6120, - type = "equip", - slot = "shield", - }, - { - -- Dragha's spellbook - itemid = 6120, - type = "deequip", - slot = "shield", - }, - { - -- Ron the Ripper's sabre - itemid = 6101, - type = "equip", - slot = "hand", - }, - { - -- Ron the Ripper's sabre - itemid = 6101, - type = "deequip", - slot = "hand", - }, - { - -- pirate hat - itemid = 6096, - type = "equip", - slot = "head", - }, - { - -- pirate hat - itemid = 6096, - type = "deequip", - slot = "head", - }, - { - -- pirate shirt - itemid = 6095, - type = "equip", - slot = "armor", - }, - { - -- pirate shirt - itemid = 6095, - type = "deequip", - slot = "armor", - }, - { - -- beach bag - itemid = 5950, - type = "equip", - slot = "backpack", - }, - { - -- beach bag - itemid = 5950, - type = "deequip", - slot = "backpack", - }, - { - -- beach backpack - itemid = 5949, - type = "equip", - slot = "backpack", - }, - { - -- beach backpack - itemid = 5949, - type = "deequip", - slot = "backpack", - }, - { - -- pirate bag - itemid = 5927, - type = "equip", - slot = "backpack", - }, - { - -- pirate bag - itemid = 5927, - type = "deequip", - slot = "backpack", - }, - { - -- pirate backpack - itemid = 5926, - type = "equip", - slot = "backpack", - }, - { - -- pirate backpack - itemid = 5926, - type = "deequip", - slot = "backpack", - }, - { - -- pirate knee breeches - itemid = 5918, - type = "equip", - slot = "legs", - }, - { - -- pirate knee breeches - itemid = 5918, - type = "deequip", - slot = "legs", - }, - { - -- bandana - itemid = 5917, - type = "equip", - slot = "head", - }, - { - -- bandana - itemid = 5917, - type = "deequip", - slot = "head", - }, - { - -- Ferumbras' hat - itemid = 5903, - type = "equip", - slot = "head", - }, - { - -- Ferumbras' hat - itemid = 5903, - type = "deequip", - slot = "head", - }, - { - -- arbalest - itemid = 5803, - type = "equip", - slot = "hand", - }, - { - -- arbalest - itemid = 5803, - type = "deequip", - slot = "hand", - }, - { - -- jewelled backpack - itemid = 5801, - type = "equip", - slot = "backpack", - }, - { - -- jewelled backpack - itemid = 5801, - type = "deequip", - slot = "backpack", - }, - { - -- skull helmet - itemid = 5741, - type = "equip", - slot = "head", - }, - { - -- skull helmet - itemid = 5741, - type = "deequip", - slot = "head", - }, - { - -- pirate boots - itemid = 5461, - type = "equip", - slot = "feet", - }, - { - -- pirate boots - itemid = 5461, - type = "deequip", - slot = "feet", - }, - { - -- helmet of the deep - itemid = 5460, - type = "equip", - slot = "head", - }, - { - -- helmet of the deep - itemid = 5460, - type = "deequip", - slot = "head", - }, - { - -- spectral dress - itemid = 4836, - type = "equip", - slot = "armor", - }, - { - -- spectral dress - itemid = 4836, - type = "deequip", - slot = "armor", - }, - { - -- bast skirt - itemid = 3560, - type = "equip", - slot = "legs", - }, - { - -- bast skirt - itemid = 3560, - type = "deequip", - slot = "legs", - }, - { - -- crocodile boots - itemid = 3556, - type = "equip", - slot = "feet", - }, - { - -- crocodile boots - itemid = 3556, - type = "deequip", - slot = "feet", - }, - { - -- salamander shield - itemid = 3445, - type = "equip", - slot = "shield", - }, - { - -- salamander shield - itemid = 3445, - type = "deequip", - slot = "shield", - }, - { - -- sentinel shield - itemid = 3444, - type = "equip", - slot = "shield", - }, - { - -- sentinel shield - itemid = 3444, - type = "deequip", - slot = "shield", - }, - { - -- tusk shield - itemid = 3443, - type = "equip", - slot = "shield", - }, - { - -- tusk shield - itemid = 3443, - type = "deequip", - slot = "shield", - }, - { - -- bonelord helmet - itemid = 3408, - type = "equip", - slot = "head", - }, - { - -- bonelord helmet - itemid = 3408, - type = "deequip", - slot = "head", - }, - { - -- charmer's tiara - itemid = 3407, - type = "equip", - slot = "head", - }, - { - -- charmer's tiara - itemid = 3407, - type = "deequip", - slot = "head", - }, - { - -- feather headdress - itemid = 3406, - type = "equip", - slot = "head", - }, - { - -- feather headdress - itemid = 3406, - type = "deequip", - slot = "head", - }, - { - -- horseman helmet - itemid = 3405, - type = "equip", - slot = "head", - }, - { - -- horseman helmet - itemid = 3405, - type = "deequip", - slot = "head", - }, - { - -- leopard armor - itemid = 3404, - type = "equip", - slot = "armor", - }, - { - -- leopard armor - itemid = 3404, - type = "deequip", - slot = "armor", - }, - { - -- tribal mask - itemid = 3403, - type = "equip", - slot = "head", - }, - { - -- tribal mask - itemid = 3403, - type = "deequip", - slot = "head", - }, - { - -- banana staff - itemid = 3348, - type = "equip", - slot = "hand", - }, - { - -- banana staff - itemid = 3348, - type = "deequip", - slot = "hand", - }, - { - -- hunting spear - itemid = 3347, - type = "equip", - slot = "hand", - }, - { - -- hunting spear - itemid = 3347, - type = "deequip", - slot = "hand", - }, - { - -- ripper lance - itemid = 3346, - type = "equip", - slot = "hand", - }, - { - -- ripper lance - itemid = 3346, - type = "deequip", - slot = "hand", - }, - { - -- templar scytheblade - itemid = 3345, - type = "equip", - slot = "hand", - }, - { - -- templar scytheblade - itemid = 3345, - type = "deequip", - slot = "hand", - }, - { - -- beastslayer axe - itemid = 3344, - type = "equip", - slot = "hand", - }, - { - -- beastslayer axe - itemid = 3344, - type = "deequip", - slot = "hand", - }, - { - -- lich staff - itemid = 3343, - type = "equip", - slot = "hand", - }, - { - -- lich staff - itemid = 3343, - type = "deequip", - slot = "hand", - }, - { - -- old and used backpack - itemid = 3244, - type = "equip", - slot = "backpack", - }, - { - -- old and used backpack - itemid = 3244, - type = "deequip", - slot = "backpack", - }, - { - -- camouflage backpack - itemid = 2872, - type = "equip", - slot = "backpack", - }, - { - -- camouflage backpack - itemid = 2872, - type = "deequip", - slot = "backpack", - }, - { - -- camouflage bag - itemid = 2864, - type = "equip", - slot = "backpack", - }, - { - -- camouflage bag - itemid = 2864, - type = "deequip", - slot = "backpack", - }, - { - -- post officer's hat - itemid = 3576, - type = "equip", - slot = "head", - }, - { - -- post officer's hat - itemid = 3576, - type = "deequip", - slot = "head", - }, - { - -- wood cape - itemid = 3575, - type = "equip", - slot = "head", - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- wood cape - itemid = 3575, - type = "deequip", - slot = "head", - }, - { - -- mystic turban - itemid = 3574, - type = "equip", - slot = "head", - }, - { - -- mystic turban - itemid = 3574, - type = "deequip", - slot = "head", - }, - { - -- magician hat - itemid = 3573, - type = "equip", - slot = "head", - }, - { - -- magician hat - itemid = 3573, - type = "deequip", - slot = "head", - }, - { - -- scarf - itemid = 3572, - type = "equip", - slot = "necklace", - }, - { - -- scarf - itemid = 3572, - type = "deequip", - slot = "necklace", - }, - { - -- ranger's cloak - itemid = 3571, - type = "equip", - slot = "armor", - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- ranger's cloak - itemid = 3571, - type = "deequip", - slot = "armor", - }, - { - -- ball gown - itemid = 3570, - type = "equip", - slot = "armor", - }, - { - -- ball gown - itemid = 3570, - type = "deequip", - slot = "armor", - }, - { - -- white dress - itemid = 3569, - type = "equip", - slot = "armor", - }, - { - -- white dress - itemid = 3569, - type = "deequip", - slot = "armor", - }, - { - -- simple dress - itemid = 3568, - type = "equip", - slot = "armor", - }, - { - -- simple dress - itemid = 3568, - type = "deequip", - slot = "armor", - }, - { - -- blue robe - itemid = 3567, - type = "equip", - slot = "armor", - }, - { - -- blue robe - itemid = 3567, - type = "deequip", - slot = "armor", - }, - { - -- red robe - itemid = 3566, - type = "equip", - slot = "armor", - }, - { - -- red robe - itemid = 3566, - type = "deequip", - slot = "armor", - }, - { - -- cape - itemid = 3565, - type = "equip", - slot = "armor", - }, - { - -- cape - itemid = 3565, - type = "deequip", - slot = "armor", - }, - { - -- red tunic - itemid = 3564, - type = "equip", - slot = "armor", - }, - { - -- red tunic - itemid = 3564, - type = "deequip", - slot = "armor", - }, - { - -- green tunic - itemid = 3563, - type = "equip", - slot = "armor", - }, - { - -- green tunic - itemid = 3563, - type = "deequip", - slot = "armor", - }, - { - -- coat - itemid = 3562, - type = "equip", - slot = "armor", - }, - { - -- coat - itemid = 3562, - type = "deequip", - slot = "armor", - }, - { - -- jacket - itemid = 3561, - type = "equip", - slot = "armor", - }, - { - -- jacket - itemid = 3561, - type = "deequip", - slot = "armor", - }, - { - -- leather legs - itemid = 3559, - type = "equip", - slot = "legs", - }, - { - -- leather legs - itemid = 3559, - type = "deequip", - slot = "legs", - }, - { - -- chain legs - itemid = 3558, - type = "equip", - slot = "legs", - }, - { - -- chain legs - itemid = 3558, - type = "deequip", - slot = "legs", - }, - { - -- plate legs - itemid = 3557, - type = "equip", - slot = "legs", - }, - { - -- plate legs - itemid = 3557, - type = "deequip", - slot = "legs", - }, - { - -- golden boots - itemid = 3555, - type = "equip", - slot = "feet", - }, - { - -- golden boots - itemid = 3555, - type = "deequip", - slot = "feet", - }, - { - -- steel boots - itemid = 3554, - type = "equip", - slot = "feet", - }, - { - -- steel boots - itemid = 3554, - type = "deequip", - slot = "feet", - }, - { - -- bunnyslippers - itemid = 3553, - type = "equip", - slot = "feet", - }, - { - -- bunnyslippers - itemid = 3553, - type = "deequip", - slot = "feet", - }, - { - -- leather boots - itemid = 3552, - type = "equip", - slot = "feet", - }, - { - -- leather boots - itemid = 3552, - type = "deequip", - slot = "feet", - }, - { - -- sandals - itemid = 3551, - type = "equip", - slot = "feet", - }, - { - -- sandals - itemid = 3551, - type = "deequip", - slot = "feet", - }, - { - -- patched boots - itemid = 3550, - type = "equip", - slot = "feet", - }, - { - -- patched boots - itemid = 3550, - type = "deequip", - slot = "feet", - }, - { - -- pair of soft boots - itemid = 3549, - type = "equip", - slot = "feet", - level = 10, - }, - { - -- pair of soft boots - itemid = 3549, - type = "deequip", - slot = "feet", - level = 10, - }, - { - -- scythe - itemid = 3453, - type = "equip", - slot = "hand", - }, - { - -- scythe - itemid = 3453, - type = "deequip", - slot = "hand", - }, - { - -- power bolt - itemid = 3450, - type = "equip", - slot = "ammo", - }, - { - -- power bolt - itemid = 3450, - type = "deequip", - slot = "ammo", - }, - { - -- arrow - itemid = 3447, - type = "equip", - slot = "ammo", - }, - { - -- arrow - itemid = 3447, - type = "deequip", - slot = "ammo", - }, - { - -- bolt - itemid = 3446, - type = "equip", - slot = "ammo", - }, - { - -- bolt - itemid = 3446, - type = "deequip", - slot = "ammo", - }, - { - -- tempest shield - itemid = 3442, - type = "equip", - slot = "shield", - }, - { - -- tempest shield - itemid = 3442, - type = "deequip", - slot = "shield", - }, - { - -- bone shield - itemid = 3441, - type = "equip", - slot = "shield", - }, - { - -- bone shield - itemid = 3441, - type = "deequip", - slot = "shield", - }, - { - -- scarab shield - itemid = 3440, - type = "equip", - slot = "shield", - }, - { - -- scarab shield - itemid = 3440, - type = "deequip", - slot = "shield", - }, - { - -- phoenix shield - itemid = 3439, - type = "equip", - slot = "shield", - }, - { - -- phoenix shield - itemid = 3439, - type = "deequip", - slot = "shield", - }, - { - -- eagle shield - itemid = 3438, - type = "equip", - slot = "shield", - }, - { - -- eagle shield - itemid = 3438, - type = "deequip", - slot = "shield", - }, - { - -- amazon shield - itemid = 3437, - type = "equip", - slot = "shield", - }, - { - -- amazon shield - itemid = 3437, - type = "deequip", - slot = "shield", - }, - { - -- medusa shield - itemid = 3436, - type = "equip", - slot = "shield", - }, - { - -- medusa shield - itemid = 3436, - type = "deequip", - slot = "shield", - }, - { - -- castle shield - itemid = 3435, - type = "equip", - slot = "shield", - }, - { - -- castle shield - itemid = 3435, - type = "deequip", - slot = "shield", - }, - { - -- vampire shield - itemid = 3434, - type = "equip", - slot = "shield", - }, - { - -- vampire shield - itemid = 3434, - type = "deequip", - slot = "shield", - }, - { - -- griffin shield - itemid = 3433, - type = "equip", - slot = "shield", - }, - { - -- griffin shield - itemid = 3433, - type = "deequip", - slot = "shield", - }, - { - -- ancient shield - itemid = 3432, - type = "equip", - slot = "shield", - }, - { - -- ancient shield - itemid = 3432, - type = "deequip", - slot = "shield", - }, - { - -- viking shield - itemid = 3431, - type = "equip", - slot = "shield", - }, - { - -- viking shield - itemid = 3431, - type = "deequip", - slot = "shield", - }, - { - -- copper shield - itemid = 3430, - type = "equip", - slot = "shield", - }, - { - -- copper shield - itemid = 3430, - type = "deequip", - slot = "shield", - }, - { - -- black shield - itemid = 3429, - type = "equip", - slot = "shield", - }, - { - -- black shield - itemid = 3429, - type = "deequip", - slot = "shield", - }, - { - -- tower shield - itemid = 3428, - type = "equip", - slot = "shield", - }, - { - -- tower shield - itemid = 3428, - type = "deequip", - slot = "shield", - }, - { - -- rose shield - itemid = 3427, - type = "equip", - slot = "shield", - }, - { - -- rose shield - itemid = 3427, - type = "deequip", - slot = "shield", - }, - { - -- studded shield - itemid = 3426, - type = "equip", - slot = "shield", - }, - { - -- studded shield - itemid = 3426, - type = "deequip", - slot = "shield", - }, - { - -- dwarven shield - itemid = 3425, - type = "equip", - slot = "shield", - }, - { - -- dwarven shield - itemid = 3425, - type = "deequip", - slot = "shield", - }, - { - -- ornamented shield - itemid = 3424, - type = "equip", - slot = "shield", - }, - { - -- ornamented shield - itemid = 3424, - type = "deequip", - slot = "shield", - }, - { - -- blessed shield - itemid = 3423, - type = "equip", - slot = "shield", - }, - { - -- blessed shield - itemid = 3423, - type = "deequip", - slot = "shield", - }, - { - -- great shield - itemid = 3422, - type = "equip", - slot = "shield", - }, - { - -- great shield - itemid = 3422, - type = "deequip", - slot = "shield", - }, - { - -- dark shield - itemid = 3421, - type = "equip", - slot = "shield", - }, - { - -- dark shield - itemid = 3421, - type = "deequip", - slot = "shield", - }, - { - -- demon shield - itemid = 3420, - type = "equip", - slot = "shield", - }, - { - -- demon shield - itemid = 3420, - type = "deequip", - slot = "shield", - }, - { - -- crown shield - itemid = 3419, - type = "equip", - slot = "shield", - }, - { - -- crown shield - itemid = 3419, - type = "deequip", - slot = "shield", - }, - { - -- bonelord shield - itemid = 3418, - type = "equip", - slot = "shield", - }, - { - -- bonelord shield - itemid = 3418, - type = "deequip", - slot = "shield", - }, - { - -- shield of honour - itemid = 3417, - type = "equip", - slot = "shield", - }, - { - -- shield of honour - itemid = 3417, - type = "deequip", - slot = "shield", - }, - { - -- dragon shield - itemid = 3416, - type = "equip", - slot = "shield", - }, - { - -- dragon shield - itemid = 3416, - type = "deequip", - slot = "shield", - }, - { - -- guardian shield - itemid = 3415, - type = "equip", - slot = "shield", - }, - { - -- guardian shield - itemid = 3415, - type = "deequip", - slot = "shield", - }, - { - -- mastermind shield - itemid = 3414, - type = "equip", - slot = "shield", - }, - { - -- mastermind shield - itemid = 3414, - type = "deequip", - slot = "shield", - }, - { - -- battle shield - itemid = 3413, - type = "equip", - slot = "shield", - }, - { - -- battle shield - itemid = 3413, - type = "deequip", - slot = "shield", - }, - { - -- wooden shield - itemid = 3412, - type = "equip", - slot = "shield", - }, - { - -- wooden shield - itemid = 3412, - type = "deequip", - slot = "shield", - }, - { - -- brass shield - itemid = 3411, - type = "equip", - slot = "shield", - }, - { - -- brass shield - itemid = 3411, - type = "deequip", - slot = "shield", - }, - { - -- plate shield - itemid = 3410, - type = "equip", - slot = "shield", - }, - { - -- plate shield - itemid = 3410, - type = "deequip", - slot = "shield", - }, - { - -- steel shield - itemid = 3409, - type = "equip", - slot = "shield", - }, - { - -- steel shield - itemid = 3409, - type = "deequip", - slot = "shield", - }, - { - -- native armor - itemid = 3402, - type = "equip", - slot = "armor", - }, - { - -- native armor - itemid = 3402, - type = "deequip", - slot = "armor", - }, - { - -- elven legs - itemid = 3401, - type = "equip", - slot = "legs", - }, - { - -- elven legs - itemid = 3401, - type = "deequip", - slot = "legs", - }, - { - -- dragon scale helmet - itemid = 3400, - type = "equip", - slot = "head", - }, - { - -- dragon scale helmet - itemid = 3400, - type = "deequip", - slot = "head", - }, - { - -- elven mail - itemid = 3399, - type = "equip", - slot = "armor", - }, - { - -- elven mail - itemid = 3399, - type = "deequip", - slot = "armor", - }, - { - -- dwarven legs - itemid = 3398, - type = "equip", - slot = "legs", - }, - { - -- dwarven legs - itemid = 3398, - type = "deequip", - slot = "legs", - }, - { - -- dwarven armor - itemid = 3397, - type = "equip", - slot = "armor", - }, - { - -- dwarven armor - itemid = 3397, - type = "deequip", - slot = "armor", - }, - { - -- dwarven helmet - itemid = 3396, - type = "equip", - slot = "head", - }, - { - -- dwarven helmet - itemid = 3396, - type = "deequip", - slot = "head", - }, - { - -- ceremonial mask - itemid = 3395, - type = "equip", - slot = "head", - }, - { - -- ceremonial mask - itemid = 3395, - type = "deequip", - slot = "head", - }, - { - -- amazon armor - itemid = 3394, - type = "equip", - slot = "armor", - level = 60, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- amazon armor - itemid = 3394, - type = "deequip", - slot = "armor", - level = 60, - }, - { - -- amazon helmet - itemid = 3393, - type = "equip", - slot = "head", - }, - { - -- amazon helmet - itemid = 3393, - type = "deequip", - slot = "head", - }, - { - -- royal helmet - itemid = 3392, - type = "equip", - slot = "head", - }, - { - -- royal helmet - itemid = 3392, - type = "deequip", - slot = "head", - }, - { - -- crusader helmet - itemid = 3391, - type = "equip", - slot = "head", - }, - { - -- crusader helmet - itemid = 3391, - type = "deequip", - slot = "head", - }, - { - -- horned helmet - itemid = 3390, - type = "equip", - slot = "head", - }, - { - -- horned helmet - itemid = 3390, - type = "deequip", - slot = "head", - }, - { - -- demon legs - itemid = 3389, - type = "equip", - slot = "legs", - }, - { - -- demon legs - itemid = 3389, - type = "deequip", - slot = "legs", - }, - { - -- demon armor - itemid = 3388, - type = "equip", - slot = "armor", - }, - { - -- demon armor - itemid = 3388, - type = "deequip", - slot = "armor", - }, - { - -- demon helmet - itemid = 3387, - type = "equip", - slot = "head", - }, - { - -- demon helmet - itemid = 3387, - type = "deequip", - slot = "head", - }, - { - -- dragon scale mail - itemid = 3386, - type = "equip", - slot = "armor", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- dragon scale mail - itemid = 3386, - type = "deequip", - slot = "armor", - }, - { - -- crown helmet - itemid = 3385, - type = "equip", - slot = "head", - }, - { - -- crown helmet - itemid = 3385, - type = "deequip", - slot = "head", - }, - { - -- dark helmet - itemid = 3384, - type = "equip", - slot = "head", - }, - { - -- dark helmet - itemid = 3384, - type = "deequip", - slot = "head", - }, - { - -- dark armor - itemid = 3383, - type = "equip", - slot = "armor", - }, - { - -- dark armor - itemid = 3383, - type = "deequip", - slot = "armor", - }, - { - -- crown legs - itemid = 3382, - type = "equip", - slot = "legs", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- crown legs - itemid = 3382, - type = "deequip", - slot = "legs", - }, - { - -- crown armor - itemid = 3381, - type = "equip", - slot = "armor", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- crown armor - itemid = 3381, - type = "deequip", - slot = "armor", - }, - { - -- noble armor - itemid = 3380, - type = "equip", - slot = "armor", - }, - { - -- noble armor - itemid = 3380, - type = "deequip", - slot = "armor", - }, - { - -- doublet - itemid = 3379, - type = "equip", - slot = "armor", - }, - { - -- doublet - itemid = 3379, - type = "deequip", - slot = "armor", - }, - { - -- studded armor - itemid = 3378, - type = "equip", - slot = "armor", - }, - { - -- studded armor - itemid = 3378, - type = "deequip", - slot = "armor", - }, - { - -- scale armor - itemid = 3377, - type = "equip", - slot = "armor", - }, - { - -- scale armor - itemid = 3377, - type = "deequip", - slot = "armor", - }, - { - -- studded helmet - itemid = 3376, - type = "equip", - slot = "head", - }, - { - -- studded helmet - itemid = 3376, - type = "deequip", - slot = "head", - }, - { - -- soldier helmet - itemid = 3375, - type = "equip", - slot = "head", - }, - { - -- soldier helmet - itemid = 3375, - type = "deequip", - slot = "head", - }, - { - -- legion helmet - itemid = 3374, - type = "equip", - slot = "head", - }, - { - -- legion helmet - itemid = 3374, - type = "deequip", - slot = "head", - }, - { - -- strange helmet - itemid = 3373, - type = "equip", - slot = "head", - }, - { - -- strange helmet - itemid = 3373, - type = "deequip", - slot = "head", - }, - { - -- brass legs - itemid = 3372, - type = "equip", - slot = "legs", - }, - { - -- brass legs - itemid = 3372, - type = "deequip", - slot = "legs", - }, - { - -- knight legs - itemid = 3371, - type = "equip", - slot = "legs", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- knight legs - itemid = 3371, - type = "deequip", - slot = "legs", - }, - { - -- knight armor - itemid = 3370, - type = "equip", - slot = "armor", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- knight armor - itemid = 3370, - type = "deequip", - slot = "armor", - }, - { - -- warrior helmet - itemid = 3369, - type = "equip", - slot = "head", - }, - { - -- warrior helmet - itemid = 3369, - type = "deequip", - slot = "head", - }, - { - -- winged helmet - itemid = 3368, - type = "equip", - slot = "head", - }, - { - -- winged helmet - itemid = 3368, - type = "deequip", - slot = "head", - }, - { - -- viking helmet - itemid = 3367, - type = "equip", - slot = "head", - }, - { - -- viking helmet - itemid = 3367, - type = "deequip", - slot = "head", - }, - { - -- magic plate armor - itemid = 3366, - type = "equip", - slot = "armor", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- magic plate armor - itemid = 3366, - type = "deequip", - slot = "armor", - }, - { - -- golden helmet - itemid = 3365, - type = "equip", - slot = "head", - }, - { - -- golden helmet - itemid = 3365, - type = "deequip", - slot = "head", - }, - { - -- golden legs - itemid = 3364, - type = "equip", - slot = "legs", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- golden legs - itemid = 3364, - type = "deequip", - slot = "legs", - }, - { - -- dragon scale legs - itemid = 3363, - type = "equip", - slot = "legs", - }, - { - -- dragon scale legs - itemid = 3363, - type = "deequip", - slot = "legs", - }, - { - -- studded legs - itemid = 3362, - type = "equip", - slot = "legs", - }, - { - -- studded legs - itemid = 3362, - type = "deequip", - slot = "legs", - }, - { - -- leather armor - itemid = 3361, - type = "equip", - slot = "armor", - }, - { - -- leather armor - itemid = 3361, - type = "deequip", - slot = "armor", - }, - { - -- golden armor - itemid = 3360, - type = "equip", - slot = "armor", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- golden armor - itemid = 3360, - type = "deequip", - slot = "armor", - }, - { - -- brass armor - itemid = 3359, - type = "equip", - slot = "armor", - }, - { - -- brass armor - itemid = 3359, - type = "deequip", - slot = "armor", - }, - { - -- chain armor - itemid = 3358, - type = "equip", - slot = "armor", - }, - { - -- chain armor - itemid = 3358, - type = "deequip", - slot = "armor", - }, - { - -- plate armor - itemid = 3357, - type = "equip", - slot = "armor", - }, - { - -- plate armor - itemid = 3357, - type = "deequip", - slot = "armor", - }, - { - -- devil helmet - itemid = 3356, - type = "equip", - slot = "head", - }, - { - -- devil helmet - itemid = 3356, - type = "deequip", - slot = "head", - }, - { - -- leather helmet - itemid = 3355, - type = "equip", - slot = "head", - }, - { - -- leather helmet - itemid = 3355, - type = "deequip", - slot = "head", - }, - { - -- brass helmet - itemid = 3354, - type = "equip", - slot = "head", - }, - { - -- brass helmet - itemid = 3354, - type = "deequip", - slot = "head", - }, - { - -- iron helmet - itemid = 3353, - type = "equip", - slot = "head", - }, - { - -- iron helmet - itemid = 3353, - type = "deequip", - slot = "head", - }, - { - -- chain helmet - itemid = 3352, - type = "equip", - slot = "head", - }, - { - -- chain helmet - itemid = 3352, - type = "deequip", - slot = "head", - }, - { - -- steel helmet - itemid = 3351, - type = "equip", - slot = "head", - }, - { - -- steel helmet - itemid = 3351, - type = "deequip", - slot = "head", - }, - { - -- bow - itemid = 3350, - type = "equip", - slot = "hand", - }, - { - -- bow - itemid = 3350, - type = "deequip", - slot = "hand", - }, - { - -- crossbow - itemid = 3349, - type = "equip", - slot = "hand", - }, - { - -- crossbow - itemid = 3349, - type = "deequip", - slot = "hand", - }, - { - -- war axe - itemid = 3342, - type = "equip", - slot = "hand", - }, - { - -- war axe - itemid = 3342, - type = "deequip", - slot = "hand", - }, - { - -- arcane staff - itemid = 3341, - type = "equip", - slot = "hand", - }, - { - -- arcane staff - itemid = 3341, - type = "deequip", - slot = "hand", - }, - { - -- heavy mace - itemid = 3340, - type = "equip", - slot = "hand", - }, - { - -- heavy mace - itemid = 3340, - type = "deequip", - slot = "hand", - }, - { - -- djinn blade - itemid = 3339, - type = "equip", - slot = "hand", - }, - { - -- djinn blade - itemid = 3339, - type = "deequip", - slot = "hand", - }, - { - -- bone sword - itemid = 3338, - type = "equip", - slot = "hand", - }, - { - -- bone sword - itemid = 3338, - type = "deequip", - slot = "hand", - }, - { - -- bone club - itemid = 3337, - type = "equip", - slot = "hand", - }, - { - -- bone club - itemid = 3337, - type = "deequip", - slot = "hand", - }, - { - -- studded club - itemid = 3336, - type = "equip", - slot = "hand", - }, - { - -- studded club - itemid = 3336, - type = "deequip", - slot = "hand", - }, - { - -- twin axe - itemid = 3335, - type = "equip", - slot = "hand", - }, - { - -- twin axe - itemid = 3335, - type = "deequip", - slot = "hand", - }, - { - -- pharaoh sword - itemid = 3334, - type = "equip", - slot = "hand", - }, - { - -- pharaoh sword - itemid = 3334, - type = "deequip", - slot = "hand", - }, - { - -- crystal mace - itemid = 3333, - type = "equip", - slot = "hand", - }, - { - -- crystal mace - itemid = 3333, - type = "deequip", - slot = "hand", - }, - { - -- hammer of wrath - itemid = 3332, - type = "equip", - slot = "hand", - }, - { - -- hammer of wrath - itemid = 3332, - type = "deequip", - slot = "hand", - }, - { - -- ravager's axe - itemid = 3331, - type = "equip", - slot = "hand", - }, - { - -- ravager's axe - itemid = 3331, - type = "deequip", - slot = "hand", - }, - { - -- heavy machete - itemid = 3330, - type = "equip", - slot = "hand", - }, - { - -- heavy machete - itemid = 3330, - type = "deequip", - slot = "hand", - }, - { - -- daramian axe - itemid = 3329, - type = "equip", - slot = "hand", - }, - { - -- daramian axe - itemid = 3329, - type = "deequip", - slot = "hand", - }, - { - -- daramian waraxe - itemid = 3328, - type = "equip", - slot = "hand", - }, - { - -- daramian waraxe - itemid = 3328, - type = "deequip", - slot = "hand", - }, - { - -- daramian mace - itemid = 3327, - type = "equip", - slot = "hand", - }, - { - -- daramian mace - itemid = 3327, - type = "deequip", - slot = "hand", - }, - { - -- epee - itemid = 3326, - type = "equip", - slot = "hand", - }, - { - -- epee - itemid = 3326, - type = "deequip", - slot = "hand", - }, - { - -- light mace - itemid = 3325, - type = "equip", - slot = "hand", - }, - { - -- light mace - itemid = 3325, - type = "deequip", - slot = "hand", - }, - { - -- skull staff - itemid = 3324, - type = "equip", - slot = "hand", - }, - { - -- skull staff - itemid = 3324, - type = "deequip", - slot = "hand", - }, - { - -- dwarven axe - itemid = 3323, - type = "equip", - slot = "hand", - }, - { - -- dwarven axe - itemid = 3323, - type = "deequip", - slot = "hand", - }, - { - -- dragon hammer - itemid = 3322, - type = "equip", - slot = "hand", - }, - { - -- dragon hammer - itemid = 3322, - type = "deequip", - slot = "hand", - }, - { - -- enchanted staff - itemid = 3321, - type = "equip", - slot = "hand", - }, - { - -- enchanted staff - itemid = 3321, - type = "deequip", - slot = "hand", - }, - { - -- fire axe - itemid = 3320, - type = "equip", - slot = "hand", - }, - { - -- fire axe - itemid = 3320, - type = "deequip", - slot = "hand", - }, - { - -- stonecutter axe - itemid = 3319, - type = "equip", - slot = "hand", - }, - { - -- stonecutter axe - itemid = 3319, - type = "deequip", - slot = "hand", - }, - { - -- knight axe - itemid = 3318, - type = "equip", - slot = "hand", - }, - { - -- knight axe - itemid = 3318, - type = "deequip", - slot = "hand", - }, - { - -- barbarian axe - itemid = 3317, - type = "equip", - slot = "hand", - }, - { - -- barbarian axe - itemid = 3317, - type = "deequip", - slot = "hand", - }, - { - -- orcish axe - itemid = 3316, - type = "equip", - slot = "hand", - }, - { - -- orcish axe - itemid = 3316, - type = "deequip", - slot = "hand", - }, - { - -- guardian halberd - itemid = 3315, - type = "equip", - slot = "hand", - }, - { - -- guardian halberd - itemid = 3315, - type = "deequip", - slot = "hand", - }, - { - -- naginata - itemid = 3314, - type = "equip", - slot = "hand", - }, - { - -- naginata - itemid = 3314, - type = "deequip", - slot = "hand", - }, - { - -- obsidian lance - itemid = 3313, - type = "equip", - slot = "hand", - }, - { - -- obsidian lance - itemid = 3313, - type = "deequip", - slot = "hand", - }, - { - -- silver mace - itemid = 3312, - type = "equip", - slot = "hand", - }, - { - -- silver mace - itemid = 3312, - type = "deequip", - slot = "hand", - }, - { - -- clerical mace - itemid = 3311, - type = "equip", - slot = "hand", - }, - { - -- clerical mace - itemid = 3311, - type = "deequip", - slot = "hand", - }, - { - -- iron hammer - itemid = 3310, - type = "equip", - slot = "hand", - }, - { - -- iron hammer - itemid = 3310, - type = "deequip", - slot = "hand", - }, - { - -- thunder hammer - itemid = 3309, - type = "equip", - slot = "hand", - }, - { - -- thunder hammer - itemid = 3309, - type = "deequip", - slot = "hand", - }, - { - -- machete - itemid = 3308, - type = "equip", - slot = "hand", - }, - { - -- machete - itemid = 3308, - type = "deequip", - slot = "hand", - }, - { - -- scimitar - itemid = 3307, - type = "equip", - slot = "hand", - }, - { - -- scimitar - itemid = 3307, - type = "deequip", - slot = "hand", - }, - { - -- golden sickle - itemid = 3306, - type = "equip", - slot = "hand", - }, - { - -- golden sickle - itemid = 3306, - type = "deequip", - slot = "hand", - }, - { - -- battle hammer - itemid = 3305, - type = "equip", - slot = "hand", - }, - { - -- battle hammer - itemid = 3305, - type = "deequip", - slot = "hand", - }, - { - -- crowbar - itemid = 3304, - type = "equip", - slot = "hand", - }, - { - -- crowbar - itemid = 3304, - type = "deequip", - slot = "hand", - }, - { - -- great axe - itemid = 3303, - type = "equip", - slot = "hand", - }, - { - -- great axe - itemid = 3303, - type = "deequip", - slot = "hand", - }, - { - -- dragon lance - itemid = 3302, - type = "equip", - slot = "hand", - }, - { - -- dragon lance - itemid = 3302, - type = "deequip", - slot = "hand", - }, - { - -- broadsword - itemid = 3301, - type = "equip", - slot = "hand", - }, - { - -- broadsword - itemid = 3301, - type = "deequip", - slot = "hand", - }, - { - -- katana - itemid = 3300, - type = "equip", - slot = "hand", - }, - { - -- katana - itemid = 3300, - type = "deequip", - slot = "hand", - }, - { - -- poison dagger - itemid = 3299, - type = "equip", - slot = "hand", - }, - { - -- poison dagger - itemid = 3299, - type = "deequip", - slot = "hand", - }, - { - -- throwing knife - itemid = 3298, - type = "equip", - slot = "hand", - }, - { - -- throwing knife - itemid = 3298, - type = "deequip", - slot = "hand", - }, - { - -- serpent sword - itemid = 3297, - type = "equip", - slot = "hand", - }, - { - -- serpent sword - itemid = 3297, - type = "deequip", - slot = "hand", - }, - { - -- warlord sword - itemid = 3296, - type = "equip", - slot = "hand", - }, - { - -- warlord sword - itemid = 3296, - type = "deequip", - slot = "hand", - }, - { - -- bright sword - itemid = 3295, - type = "equip", - slot = "hand", - }, - { - -- bright sword - itemid = 3295, - type = "deequip", - slot = "hand", - }, - { - -- short sword - itemid = 3294, - type = "equip", - slot = "hand", - }, - { - -- short sword - itemid = 3294, - type = "deequip", - slot = "hand", - }, - { - -- sickle - itemid = 3293, - type = "equip", - slot = "hand", - }, - { - -- sickle - itemid = 3293, - type = "deequip", - slot = "hand", - }, - { - -- combat knife - itemid = 3292, - type = "equip", - slot = "hand", - }, - { - -- combat knife - itemid = 3292, - type = "deequip", - slot = "hand", - }, - { - -- knife - itemid = 3291, - type = "equip", - slot = "hand", - }, - { - -- knife - itemid = 3291, - type = "deequip", - slot = "hand", - }, - { - -- silver dagger - itemid = 3290, - type = "equip", - slot = "hand", - }, - { - -- silver dagger - itemid = 3290, - type = "deequip", - slot = "hand", - }, - { - -- staff - itemid = 3289, - type = "equip", - slot = "hand", - }, - { - -- staff - itemid = 3289, - type = "deequip", - slot = "hand", - }, - { - -- magic sword - itemid = 3288, - type = "equip", - slot = "hand", - }, - { - -- magic sword - itemid = 3288, - type = "deequip", - slot = "hand", - }, - { - -- throwing star - itemid = 3287, - type = "equip", - slot = "hand", - }, - { - -- throwing star - itemid = 3287, - type = "deequip", - slot = "hand", - }, - { - -- mace - itemid = 3286, - type = "equip", - slot = "hand", - }, - { - -- mace - itemid = 3286, - type = "deequip", - slot = "hand", - }, - { - -- longsword - itemid = 3285, - type = "equip", - slot = "hand", - }, - { - -- longsword - itemid = 3285, - type = "deequip", - slot = "hand", - }, - { - -- ice rapier - itemid = 3284, - type = "equip", - slot = "hand", - }, - { - -- ice rapier - itemid = 3284, - type = "deequip", - slot = "hand", - }, - { - -- carlin sword - itemid = 3283, - type = "equip", - slot = "hand", - }, - { - -- carlin sword - itemid = 3283, - type = "deequip", - slot = "hand", - }, - { - -- morning star - itemid = 3282, - type = "equip", - slot = "hand", - }, - { - -- morning star - itemid = 3282, - type = "deequip", - slot = "hand", - }, - { - -- giant sword - itemid = 3281, - type = "equip", - slot = "hand", - }, - { - -- giant sword - itemid = 3281, - type = "deequip", - slot = "hand", - }, - { - -- fire sword - itemid = 3280, - type = "equip", - slot = "hand", - }, - { - -- fire sword - itemid = 3280, - type = "deequip", - slot = "hand", - }, - { - -- war hammer - itemid = 3279, - type = "equip", - slot = "hand", - }, - { - -- war hammer - itemid = 3279, - type = "deequip", - slot = "hand", - }, - { - -- magic longsword - itemid = 3278, - type = "equip", - slot = "hand", - }, - { - -- magic longsword - itemid = 3278, - type = "deequip", - slot = "hand", - }, - { - -- spear - itemid = 3277, - type = "equip", - slot = "hand", - }, - { - -- spear - itemid = 3277, - type = "deequip", - slot = "hand", - }, - { - -- hatchet - itemid = 3276, - type = "equip", - slot = "hand", - }, - { - -- hatchet - itemid = 3276, - type = "deequip", - slot = "hand", - }, - { - -- double axe - itemid = 3275, - type = "equip", - slot = "hand", - }, - { - -- double axe - itemid = 3275, - type = "deequip", - slot = "hand", - }, - { - -- axe - itemid = 3274, - type = "equip", - slot = "hand", - }, - { - -- axe - itemid = 3274, - type = "deequip", - slot = "hand", - }, - { - -- sabre - itemid = 3273, - type = "equip", - slot = "hand", - }, - { - -- sabre - itemid = 3273, - type = "deequip", - slot = "hand", - }, - { - -- rapier - itemid = 3272, - type = "equip", - slot = "hand", - }, - { - -- rapier - itemid = 3272, - type = "deequip", - slot = "hand", - }, - { - -- spike sword - itemid = 3271, - type = "equip", - slot = "hand", - }, - { - -- spike sword - itemid = 3271, - type = "deequip", - slot = "hand", - }, - { - -- club - itemid = 3270, - type = "equip", - slot = "hand", - }, - { - -- club - itemid = 3270, - type = "deequip", - slot = "hand", - }, - { - -- halberd - itemid = 3269, - type = "equip", - slot = "hand", - }, - { - -- halberd - itemid = 3269, - type = "deequip", - slot = "hand", - }, - { - -- hand axe - itemid = 3268, - type = "equip", - slot = "hand", - }, - { - -- hand axe - itemid = 3268, - type = "deequip", - slot = "hand", - }, - { - -- dagger - itemid = 3267, - type = "equip", - slot = "hand", - }, - { - -- dagger - itemid = 3267, - type = "deequip", - slot = "hand", - }, - { - -- battle axe - itemid = 3266, - type = "equip", - slot = "hand", - }, - { - -- battle axe - itemid = 3266, - type = "deequip", - slot = "hand", - }, - { - -- two handed sword - itemid = 3265, - type = "equip", - slot = "hand", - }, - { - -- two handed sword - itemid = 3265, - type = "deequip", - slot = "hand", - }, - { - -- sword - itemid = 3264, - type = "equip", - slot = "hand", - }, - { - -- sword - itemid = 3264, - type = "deequip", - slot = "hand", - }, - { - -- backpack of holding - itemid = 3253, - type = "equip", - slot = "backpack", - }, - { - -- backpack of holding - itemid = 3253, - type = "deequip", - slot = "backpack", - }, - { - -- boots of waterwalking - itemid = 3246, - type = "equip", - slot = "feet", - }, - { - -- boots of waterwalking - itemid = 3246, - type = "deequip", - slot = "feet", - }, - { - -- ring of wishes - itemid = 3245, - type = "equip", - slot = "ring", - }, - { - -- ring of wishes - itemid = 3245, - type = "deequip", - slot = "ring", - }, - { - -- helmet of the ancients - itemid = 3230, - type = "equip", - slot = "head", - }, - { - -- helmet of the ancients - itemid = 3230, - type = "deequip", - slot = "head", - }, - { - -- helmet of the ancients - itemid = 3229, - type = "equip", - slot = "head", - }, - { - -- helmet of the ancients - itemid = 3229, - type = "deequip", - slot = "head", - }, - { - -- damaged helmet - itemid = 3226, - type = "equip", - slot = "head", - }, - { - -- damaged helmet - itemid = 3226, - type = "deequip", - slot = "head", - }, - { - -- hat of the mad - itemid = 3210, - type = "equip", - slot = "head", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- hat of the mad - itemid = 3210, - type = "deequip", - slot = "head", - }, - { - -- giant smithhammer - itemid = 12510, - type = "equip", - slot = "hand", - }, - { - -- giant smithhammer - itemid = 12510, - type = "deequip", - slot = "hand", - }, - { - -- paw amulet - itemid = 3102, - type = "equip", - slot = "necklace", - }, - { - -- paw amulet - itemid = 3102, - type = "deequip", - slot = "necklace", - }, - { - -- ring of healing - itemid = 3100, - type = "equip", - slot = "ring", - }, - { - -- ring of healing - itemid = 3100, - type = "deequip", - slot = "ring", - }, - { - -- dwarven ring - itemid = 3099, - type = "equip", - slot = "ring", - }, - { - -- dwarven ring - itemid = 3099, - type = "deequip", - slot = "ring", - }, - { - -- ring of healing - itemid = 3098, - type = "equip", - slot = "ring", - }, - { - -- ring of healing - itemid = 3098, - type = "deequip", - slot = "ring", - }, - { - -- dwarven ring - itemid = 3097, - type = "equip", - slot = "ring", - }, - { - -- dwarven ring - itemid = 3097, - type = "deequip", - slot = "ring", - }, - { - -- club ring - itemid = 3096, - type = "equip", - slot = "ring", - }, - { - -- club ring - itemid = 3096, - type = "deequip", - slot = "ring", - }, - { - -- axe ring - itemid = 3095, - type = "equip", - slot = "ring", - }, - { - -- axe ring - itemid = 3095, - type = "deequip", - slot = "ring", - }, - { - -- sword ring - itemid = 3094, - type = "equip", - slot = "ring", - }, - { - -- sword ring - itemid = 3094, - type = "deequip", - slot = "ring", - }, - { - -- club ring - itemid = 3093, - type = "equip", - slot = "ring", - }, - { - -- club ring - itemid = 3093, - type = "deequip", - slot = "ring", - }, - { - -- axe ring - itemid = 3092, - type = "equip", - slot = "ring", - }, - { - -- axe ring - itemid = 3092, - type = "deequip", - slot = "ring", - }, - { - -- sword ring - itemid = 3091, - type = "equip", - slot = "ring", - }, - { - -- sword ring - itemid = 3091, - type = "deequip", - slot = "ring", - }, - { - -- time ring - itemid = 3090, - type = "equip", - slot = "ring", - }, - { - -- time ring - itemid = 3090, - type = "deequip", - slot = "ring", - }, - { - -- life ring - itemid = 3089, - type = "equip", - slot = "ring", - }, - { - -- life ring - itemid = 3089, - type = "deequip", - slot = "ring", - }, - { - -- energy ring - itemid = 3088, - type = "equip", - slot = "ring", - }, - { - -- energy ring - itemid = 3088, - type = "deequip", - slot = "ring", - }, - { - -- power ring - itemid = 3087, - type = "equip", - slot = "ring", - }, - { - -- power ring - itemid = 3087, - type = "deequip", - slot = "ring", - }, - { - -- stealth ring - itemid = 3086, - type = "equip", - slot = "ring", - }, - { - -- stealth ring - itemid = 3086, - type = "deequip", - slot = "ring", - }, - { - -- dragon necklace - itemid = 3085, - type = "equip", - slot = "necklace", - }, - { - -- dragon necklace - itemid = 3085, - type = "deequip", - slot = "necklace", - }, - { - -- protection amulet - itemid = 3084, - type = "equip", - slot = "necklace", - }, - { - -- protection amulet - itemid = 3084, - type = "deequip", - slot = "necklace", - }, - { - -- garlic necklace - itemid = 3083, - type = "equip", - slot = "necklace", - }, - { - -- garlic necklace - itemid = 3083, - type = "deequip", - slot = "necklace", - }, - { - -- elven amulet - itemid = 3082, - type = "equip", - slot = "necklace", - }, - { - -- elven amulet - itemid = 3082, - type = "deequip", - slot = "necklace", - }, - { - -- stone skin amulet - itemid = 3081, - type = "equip", - slot = "necklace", - }, - { - -- stone skin amulet - itemid = 3081, - type = "deequip", - slot = "necklace", - }, - { - -- amulet of life - itemid = 3080, - type = "equip", - slot = "necklace", - }, - { - -- amulet of life - itemid = 3080, - type = "deequip", - slot = "necklace", - }, - { - -- boots of haste - itemid = 3079, - type = "equip", - slot = "feet", - }, - { - -- boots of haste - itemid = 3079, - type = "deequip", - slot = "feet", - }, - { - -- wand of dragonbreath - itemid = 3075, - type = "equip", - slot = "hand", - level = 13, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of dragonbreath - itemid = 3075, - type = "deequip", - slot = "hand", - level = 13, - }, - { - -- wand of vortex - itemid = 3074, - type = "equip", - slot = "hand", - level = 6, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of vortex - itemid = 3074, - type = "deequip", - slot = "hand", - level = 6, - }, - { - -- wand of cosmic energy - itemid = 3073, - type = "equip", - slot = "hand", - level = 26, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of cosmic energy - itemid = 3073, - type = "deequip", - slot = "hand", - level = 26, - }, - { - -- wand of decay - itemid = 3072, - type = "equip", - slot = "hand", - level = 19, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of decay - itemid = 3072, - type = "deequip", - slot = "hand", - level = 19, - }, - { - -- wand of inferno - itemid = 3071, - type = "equip", - slot = "hand", - level = 33, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of inferno - itemid = 3071, - type = "deequip", - slot = "hand", - level = 33, - }, - { - -- moonlight rod - itemid = 3070, - type = "equip", - slot = "hand", - level = 13, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- moonlight rod - itemid = 3070, - type = "deequip", - slot = "hand", - level = 13, - }, - { - -- necrotic rod - itemid = 3069, - type = "equip", - slot = "hand", - level = 19, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- necrotic rod - itemid = 3069, - type = "deequip", - slot = "hand", - level = 19, - }, - { - -- hailstorm rod - itemid = 3067, - type = "equip", - slot = "hand", - level = 33, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- hailstorm rod - itemid = 3067, - type = "deequip", - slot = "hand", - level = 33, - }, - { - -- snakebit rod - itemid = 3066, - type = "equip", - slot = "hand", - level = 6, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- snakebit rod - itemid = 3066, - type = "deequip", - slot = "hand", - level = 6, - }, - { - -- terra rod - itemid = 3065, - type = "equip", - slot = "hand", - level = 26, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- terra rod - itemid = 3065, - type = "deequip", - slot = "hand", - level = 26, - }, - { - -- gold ring - itemid = 3063, - type = "equip", - slot = "ring", - }, - { - -- gold ring - itemid = 3063, - type = "deequip", - slot = "ring", - }, - { - -- spellbook - itemid = 3059, - type = "equip", - slot = "shield", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellbook - itemid = 3059, - type = "deequip", - slot = "shield", - }, - { - -- amulet of loss - itemid = 3057, - type = "equip", - slot = "necklace", - }, - { - -- amulet of loss - itemid = 3057, - type = "deequip", - slot = "necklace", - }, - { - -- bronze amulet - itemid = 3056, - type = "equip", - slot = "necklace", - }, - { - -- bronze amulet - itemid = 3056, - type = "deequip", - slot = "necklace", - }, - { - -- platinum amulet - itemid = 3055, - type = "equip", - slot = "necklace", - }, - { - -- platinum amulet - itemid = 3055, - type = "deequip", - slot = "necklace", - }, - { - -- silver amulet - itemid = 3054, - type = "equip", - slot = "necklace", - }, - { - -- silver amulet - itemid = 3054, - type = "deequip", - slot = "necklace", - }, - { - -- time ring - itemid = 3053, - type = "equip", - slot = "ring", - }, - { - -- time ring - itemid = 3053, - type = "deequip", - slot = "ring", - }, - { - -- life ring - itemid = 3052, - type = "equip", - slot = "ring", - }, - { - -- life ring - itemid = 3052, - type = "deequip", - slot = "ring", - }, - { - -- energy ring - itemid = 3051, - type = "equip", - slot = "ring", - }, - { - -- energy ring - itemid = 3051, - type = "deequip", - slot = "ring", - }, - { - -- power ring - itemid = 3050, - type = "equip", - slot = "ring", - }, - { - -- power ring - itemid = 3050, - type = "deequip", - slot = "ring", - }, - { - -- stealth ring - itemid = 3049, - type = "equip", - slot = "ring", - }, - { - -- stealth ring - itemid = 3049, - type = "deequip", - slot = "ring", - }, - { - -- might ring - itemid = 3048, - type = "equip", - slot = "ring", - }, - { - -- might ring - itemid = 3048, - type = "deequip", - slot = "ring", - }, - { - -- strange talisman - itemid = 3045, - type = "equip", - slot = "necklace", - }, - { - -- strange talisman - itemid = 3045, - type = "deequip", - slot = "necklace", - }, - { - -- ancient amulet - itemid = 3025, - type = "equip", - slot = "necklace", - }, - { - -- ancient amulet - itemid = 3025, - type = "deequip", - slot = "necklace", - }, - { - -- ancient tiara - itemid = 3022, - type = "equip", - slot = "head", - }, - { - -- ancient tiara - itemid = 3022, - type = "deequip", - slot = "head", - }, - { - -- sapphire amulet - itemid = 3021, - type = "equip", - slot = "necklace", - }, - { - -- sapphire amulet - itemid = 3021, - type = "deequip", - slot = "necklace", - }, - { - -- demonbone amulet - itemid = 3019, - type = "equip", - slot = "necklace", - }, - { - -- demonbone amulet - itemid = 3019, - type = "deequip", - slot = "necklace", - }, - { - -- scarab amulet - itemid = 3018, - type = "equip", - slot = "necklace", - }, - { - -- scarab amulet - itemid = 3018, - type = "deequip", - slot = "necklace", - }, - { - -- ruby necklace - itemid = 3016, - type = "equip", - slot = "necklace", - }, - { - -- ruby necklace - itemid = 3016, - type = "deequip", - slot = "necklace", - }, - { - -- silver necklace - itemid = 3015, - type = "equip", - slot = "necklace", - }, - { - -- silver necklace - itemid = 3015, - type = "deequip", - slot = "necklace", - }, - { - -- star amulet - itemid = 3014, - type = "equip", - slot = "necklace", - }, - { - -- star amulet - itemid = 3014, - type = "deequip", - slot = "necklace", - }, - { - -- golden amulet - itemid = 3013, - type = "equip", - slot = "necklace", - }, - { - -- golden amulet - itemid = 3013, - type = "deequip", - slot = "necklace", - }, - { - -- wolf tooth chain - itemid = 3012, - type = "equip", - slot = "necklace", - }, - { - -- wolf tooth chain - itemid = 3012, - type = "deequip", - slot = "necklace", - }, - { - -- crown - itemid = 3011, - type = "equip", - slot = "head", - }, - { - -- crown - itemid = 3011, - type = "deequip", - slot = "head", - }, - { - -- bronze necklace - itemid = 3009, - type = "equip", - slot = "necklace", - }, - { - -- bronze necklace - itemid = 3009, - type = "deequip", - slot = "necklace", - }, - { - -- crystal necklace - itemid = 3008, - type = "equip", - slot = "necklace", - }, - { - -- crystal necklace - itemid = 3008, - type = "deequip", - slot = "necklace", - }, - { - -- crystal ring - itemid = 3007, - type = "equip", - slot = "ring", - }, - { - -- crystal ring - itemid = 3007, - type = "deequip", - slot = "ring", - }, - { - -- ring of the sky - itemid = 3006, - type = "equip", - slot = "ring", - }, - { - -- ring of the sky - itemid = 3006, - type = "deequip", - slot = "ring", - }, - { - -- wedding ring - itemid = 3004, - type = "equip", - slot = "ring", - }, - { - -- wedding ring - itemid = 3004, - type = "deequip", - slot = "ring", - }, - { - -- snowball - itemid = 2992, - type = "equip", - slot = "hand", - }, - { - -- snowball - itemid = 2992, - type = "deequip", - slot = "hand", - }, - { - -- golden backpack - itemid = 2871, - type = "equip", - slot = "backpack", - }, - { - -- golden backpack - itemid = 2871, - type = "deequip", - slot = "backpack", - }, - { - -- grey backpack - itemid = 2870, - type = "equip", - slot = "backpack", - }, - { - -- grey backpack - itemid = 2870, - type = "deequip", - slot = "backpack", - }, - { - -- blue backpack - itemid = 2869, - type = "equip", - slot = "backpack", - }, - { - -- blue backpack - itemid = 2869, - type = "deequip", - slot = "backpack", - }, - { - -- purple backpack - itemid = 2868, - type = "equip", - slot = "backpack", - }, - { - -- purple backpack - itemid = 2868, - type = "deequip", - slot = "backpack", - }, - { - -- red backpack - itemid = 2867, - type = "equip", - slot = "backpack", - }, - { - -- red backpack - itemid = 2867, - type = "deequip", - slot = "backpack", - }, - { - -- yellow backpack - itemid = 2866, - type = "equip", - slot = "backpack", - }, - { - -- yellow backpack - itemid = 2866, - type = "deequip", - slot = "backpack", - }, - { - -- green backpack - itemid = 2865, - type = "equip", - slot = "backpack", - }, - { - -- green backpack - itemid = 2865, - type = "deequip", - slot = "backpack", - }, - { - -- golden bag - itemid = 2863, - type = "equip", - slot = "backpack", - }, - { - -- golden bag - itemid = 2863, - type = "deequip", - slot = "backpack", - }, - { - -- grey bag - itemid = 2862, - type = "equip", - slot = "backpack", - }, - { - -- grey bag - itemid = 2862, - type = "deequip", - slot = "backpack", - }, - { - -- blue bag - itemid = 2861, - type = "equip", - slot = "backpack", - }, - { - -- blue bag - itemid = 2861, - type = "deequip", - slot = "backpack", - }, - { - -- purple bag - itemid = 2860, - type = "equip", - slot = "backpack", - }, - { - -- purple bag - itemid = 2860, - type = "deequip", - slot = "backpack", - }, - { - -- red bag - itemid = 2859, - type = "equip", - slot = "backpack", - }, - { - -- red bag - itemid = 2859, - type = "deequip", - slot = "backpack", - }, - { - -- yellow bag - itemid = 2858, - type = "equip", - slot = "backpack", - }, - { - -- yellow bag - itemid = 2858, - type = "deequip", - slot = "backpack", - }, - { - -- green bag - itemid = 2857, - type = "equip", - slot = "backpack", - }, - { - -- green bag - itemid = 2857, - type = "deequip", - slot = "backpack", - }, - { - -- backpack - itemid = 2854, - type = "equip", - slot = "backpack", - }, - { - -- backpack - itemid = 2854, - type = "deequip", - slot = "backpack", - }, - { - -- bag - itemid = 2853, - type = "equip", - slot = "backpack", - }, - { - -- bag - itemid = 2853, - type = "deequip", - slot = "backpack", - }, - { - -- searing fire - itemid = 2138, - type = "stepin", - }, - { - -- searing fire - itemid = 2138, - type = "additem", - }, - { - -- searing fire - itemid = 2137, - type = "stepin", - }, - { - -- searing fire - itemid = 2137, - type = "additem", - }, - { - -- smoke - itemid = 2136, - type = "stepin", - }, - { - -- smoke - itemid = 2136, - type = "additem", - }, - { - -- energy field - itemid = 2135, - type = "stepin", - }, - { - -- energy field - itemid = 2135, - type = "additem", - }, - { - -- poison gas - itemid = 2134, - type = "stepin", - }, - { - -- poison gas - itemid = 2134, - type = "additem", - }, - { - -- fire field - itemid = 2133, - type = "stepin", - }, - { - -- fire field - itemid = 2133, - type = "additem", - }, - { - -- fire field - itemid = 2132, - type = "stepin", - }, - { - -- fire field - itemid = 2132, - type = "additem", - }, - { - -- fire field - itemid = 21465, - type = "stepin", - }, - { - -- fire field - itemid = 21465, - type = "additem", - }, - { - -- rush wood - itemid = 2130, - type = "stepin", - }, - { - -- rush wood - itemid = 2130, - type = "additem", - }, - { - -- magic wall - itemid = 2129, - type = "stepin", - }, - { - -- magic wall - itemid = 2129, - type = "additem", - }, - { - -- magic wall - itemid = 2128, - type = "stepin", - }, - { - -- magic wall - itemid = 2128, - type = "additem", - }, - { - -- poison field - itemid = 2121, - type = "stepin", - }, - { - -- poison field - itemid = 2121, - type = "additem", - }, - { - -- energy field - itemid = 2126, - type = "stepin", - }, - { - -- energy field - itemid = 2126, - type = "additem", - }, - { - -- fire field - itemid = 2125, - type = "stepin", - }, - { - -- fire field - itemid = 2125, - type = "additem", - }, - { - -- fire field - itemid = 2124, - type = "stepin", - }, - { - -- fire field - itemid = 2124, - type = "additem", - }, - { - -- fire field - itemid = 2123, - type = "stepin", - }, - { - -- fire field - itemid = 2123, - type = "additem", - }, - { - -- energy field - itemid = 2122, - type = "stepin", - }, - { - -- energy field - itemid = 2122, - type = "additem", - }, - { - -- poison field - itemid = 105, - type = "stepin", - }, - { - -- poison field - itemid = 105, - type = "additem", - }, - { - -- fire field - itemid = 2120, - type = "stepin", - }, - { - -- fire field - itemid = 2120, - type = "additem", - }, - { - -- fire field - itemid = 2119, - type = "stepin", - }, - { - -- fire field - itemid = 2119, - type = "additem", - }, - { - -- fire field - itemid = 2118, - type = "stepin", - }, - { - -- fire field - itemid = 2118, - type = "additem", - }, - { - -- campfire - itemid = 2000, - type = "stepin", - }, - { - -- campfire - itemid = 2000, - type = "additem", - }, - { - -- campfire - itemid = 1999, - type = "stepin", - }, - { - -- campfire - itemid = 1999, - type = "additem", - }, - { - -- campfire - itemid = 1998, - type = "stepin", - }, - { - -- campfire - itemid = 1998, - type = "additem", - }, - { - -- small stone - itemid = 1781, - type = "equip", - slot = "hand", - }, - { - -- small stone - itemid = 1781, - type = "deequip", - slot = "hand", - }, -} - -for _, i in ipairs(items) do - local movement = MoveEvent() - movement:id(i.itemid) - - if i.type then - movement:type(i.type) - end - if i.slot then - movement:slot(i.slot) - end - if i.level then - movement:level(i.level) - end - if i.vocation then - for _, v in ipairs(i.vocation) do - movement:vocation(v[1], v[2] or false, v[3] or false) - end - end - movement:register() -end diff --git a/data-canary/scripts/reward_chest/reward_chest.lua b/data-canary/scripts/reward_chest/reward_chest.lua deleted file mode 100644 index d7724ca0b32..00000000000 --- a/data-canary/scripts/reward_chest/reward_chest.lua +++ /dev/null @@ -1,8 +0,0 @@ -local chest = Action() - -function chest.onUse(player, item, fromPosition, target, toPosition, isHotkey) end - --- Create reward chest in the Montag temple -chest:position({ x = 5003, y = 4996, z = 7 }, 19250) - -chest:register() diff --git a/data-canary/scripts/runes/convince_creature.lua b/data-canary/scripts/runes/convince_creature.lua deleted file mode 100644 index 5de2c59543c..00000000000 --- a/data-canary/scripts/runes/convince_creature.lua +++ /dev/null @@ -1,54 +0,0 @@ -local rune = Spell("rune") - -function rune.onCastSpell(creature, variant, isHotkey) - local target = Creature(variant:getNumber()) - if not target or not target:isMonster() then - creature:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) - creature:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end - - local monsterType = target:getType() - if not creature:hasFlag(PlayerFlag_CanConvinceAll) then - if not monsterType:isConvinceable() or creature:getMaster() then - creature:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) - creature:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end - - if #creature:getSummons() >= 2 then - creature:sendCancelMessage("You cannot control more creatures.") - creature:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end - end - - local manaCost = target:getType():getManaCost() - if creature:getMana() < manaCost and not creature:hasFlag(PlayerFlag_HasInfiniteMana) then - creature:sendCancelMessage(RETURNVALUE_NOTENOUGHMANA) - creature:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end - - creature:addMana(-manaCost) - creature:addManaSpent(manaCost) - creature:setSummon(target) - creature:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) - return true -end - -rune:id(12) -rune:group("support") -rune:name("convince creature rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_CONVINCE_CREATURE_RUNE) -rune:runeId(3177) -rune:allowFarUse(true) -rune:charges(1) -rune:level(16) -rune:magicLevel(5) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:needTarget(true) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-canary/scripts/runes/magic_wall.lua b/data-canary/scripts/runes/magic_wall.lua deleted file mode 100644 index 75f9757c686..00000000000 --- a/data-canary/scripts/runes/magic_wall.lua +++ /dev/null @@ -1,34 +0,0 @@ -function onCreateMagicWall(creature, tile) - local magicWall - if Game.getWorldType() == WORLD_TYPE_NO_PVP then - magicWall = ITEM_MAGICWALL_SAFE - else - magicWall = ITEM_MAGICWALL - end - local item = Game.createItem(magicWall, 1, tile) - item:setDuration(16, 24) -end - -local combat = Combat() -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) -combat:setCallback(CALLBACK_PARAM_TARGETTILE, "onCreateMagicWall") - -local spell = Spell("rune") -function spell.onCastSpell(creature, variant, isHotkey) - return combat:execute(creature, variant) -end - -spell:id(86) -spell:name("Magic Wall Rune") -spell:group("attack") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_MAGIC_WALL_RUNE) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(32) -spell:magicLevel(9) -spell:runeId(3180) -spell:charges(3) -spell:isBlocking(true, true) -spell:allowFarUse(true) -spell:register() diff --git a/data-canary/scripts/runes/wild_growth.lua b/data-canary/scripts/runes/wild_growth.lua deleted file mode 100644 index 708af4b0bc5..00000000000 --- a/data-canary/scripts/runes/wild_growth.lua +++ /dev/null @@ -1,35 +0,0 @@ -function onCreateWildGrowth(creature, tile) - local wildGrowth - if Game.getWorldType() == WORLD_TYPE_NO_PVP then - wildGrowth = ITEM_WILDGROWTH_SAFE - else - wildGrowth = ITEM_WILDGROWTH - end - local item = Game.createItem(wildGrowth, 1, tile) - item:setDuration(30, 60) -end - -local combat = Combat() -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) -combat:setCallback(CALLBACK_PARAM_TARGETTILE, "onCreateWildGrowth") - -local spell = Spell("rune") -function spell.onCastSpell(creature, variant, isHotkey) - return combat:execute(creature, variant) -end - -spell:id(94) -spell:name("Wild Growth Rune") -spell:group("attack") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_WILD_GROWTH_RUNE) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(27) -spell:magicLevel(8) -spell:runeId(3156) -spell:charges(2) -spell:isBlocking(true, true) -spell:allowFarUse(true) -spell:vocation("druid;true", "elder druid;true") -spell:register() diff --git a/data-canary/scripts/spells/attack/energy_beam.lua b/data-canary/scripts/spells/attack/energy_beam.lua deleted file mode 100644 index 04eadbda5fc..00000000000 --- a/data-canary/scripts/spells/attack/energy_beam.lua +++ /dev/null @@ -1,34 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ENERGYHIT) -combat:setArea(createCombatArea(AREA_BEAM5, AREADIAGONAL_BEAM5)) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 1.8) + 11 - local max = (level / 5) + (maglevel * 3) + 19 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(22) -spell:name("Energy Beam") -spell:words("exevo vis lux") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_ENERGY_BEAM) -spell:level(23) -spell:mana(40) -spell:isPremium(false) -spell:needDirection(true) -spell:blockWalls(true) -spell:cooldown(4 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-canary/scripts/spells/attack/energy_wave.lua b/data-canary/scripts/spells/attack/energy_wave.lua deleted file mode 100644 index 3ffc30f5b18..00000000000 --- a/data-canary/scripts/spells/attack/energy_wave.lua +++ /dev/null @@ -1,33 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) -combat:setArea(createCombatArea(AREA_SQUAREWAVE5, AREADIAGONAL_SQUAREWAVE5)) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 4.5) - local max = (level / 5) + (maglevel * 9) - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(13) -spell:name("Energy Wave") -spell:words("exevo vis hur") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_ENERGY_WAVE) -spell:level(38) -spell:mana(170) -spell:needDirection(true) -spell:cooldown(8 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-canary/scripts/spells/attack/great_energy_beam.lua b/data-canary/scripts/spells/attack/great_energy_beam.lua deleted file mode 100644 index aae0b8aa41c..00000000000 --- a/data-canary/scripts/spells/attack/great_energy_beam.lua +++ /dev/null @@ -1,34 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) -combat:setArea(createCombatArea(AREA_BEAM8)) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 4) - local max = (level / 5) + (maglevel * 7) - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(23) -spell:name("Great Energy Beam") -spell:words("exevo gran vis lux") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_GREAT_ENERGY_BEAM) -spell:level(29) -spell:mana(110) -spell:isPremium(false) -spell:needDirection(true) -spell:blockWalls(true) -spell:cooldown(6 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-canary/scripts/spells/attack/ignite.lua b/data-canary/scripts/spells/attack/ignite.lua deleted file mode 100644 index 85e582e93d1..00000000000 --- a/data-canary/scripts/spells/attack/ignite.lua +++ /dev/null @@ -1,33 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) - -local condition = Condition(CONDITION_FIRE) -condition:setParameter(CONDITION_PARAM_DELAYED, 1) -condition:addDamage(25, 3000, -45) - -combat:addCondition(condition) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(138) -spell:name("Ignite") -spell:words("utori flam") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_IGNITE) -spell:level(26) -spell:mana(30) -spell:isAggressive(true) -spell:range(3) -spell:needTarget(true) -spell:blockWalls(true) -spell:cooldown(30 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-canary/scripts/spells/familiar/druid_familiar.lua b/data-canary/scripts/spells/familiar/druid_familiar.lua deleted file mode 100644 index b6053825789..00000000000 --- a/data-canary/scripts/spells/familiar/druid_familiar.lua +++ /dev/null @@ -1,20 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(player, variant) - player:CreateFamiliarSpell() - return true -end - -spell:group("support") -spell:id(197) -spell:name("Druid familiar") -spell:words("utevo gran res dru") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_SUMMON_DRUID_FAMILIAR) -spell:level(200) -spell:mana(3000) -spell:cooldown(configManager.getNumber(configKeys.FAMILIAR_TIME) * 60 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:isAggressive(false) -spell:vocation("druid;true", "elder druid;true") -spell:register() diff --git a/data-canary/scripts/spells/familiar/knight_familiar.lua b/data-canary/scripts/spells/familiar/knight_familiar.lua deleted file mode 100644 index 22e3ea9c036..00000000000 --- a/data-canary/scripts/spells/familiar/knight_familiar.lua +++ /dev/null @@ -1,20 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(player, variant) - player:CreateFamiliarSpell() - return true -end - -spell:group("support") -spell:id(194) -spell:name("Knight familiar") -spell:words("utevo gran res eq") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_SUMMON_KNIGHT_FAMILIAR) -spell:level(200) -spell:mana(1000) -spell:cooldown(configManager.getNumber(configKeys.FAMILIAR_TIME) * 60 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:isAggressive(false) -spell:vocation("knight;true", "elite knight;true") -spell:register() diff --git a/data-canary/scripts/spells/familiar/paladin_familiar.lua b/data-canary/scripts/spells/familiar/paladin_familiar.lua deleted file mode 100644 index e1d7eccf0f8..00000000000 --- a/data-canary/scripts/spells/familiar/paladin_familiar.lua +++ /dev/null @@ -1,20 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(player, variant) - player:CreateFamiliarSpell() - return true -end - -spell:group("support") -spell:id(195) -spell:name("Paladin familiar") -spell:words("utevo gran res sac") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_SUMMON_PALADIN_FAMILIAR) -spell:level(200) -spell:mana(2000) -spell:cooldown(configManager.getNumber(configKeys.FAMILIAR_TIME) * 60 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:isAggressive(false) -spell:vocation("paladin;true", "royal paladin;true") -spell:register() diff --git a/data-canary/scripts/spells/familiar/sorcerer_familiar.lua b/data-canary/scripts/spells/familiar/sorcerer_familiar.lua deleted file mode 100644 index 8b64efa4b40..00000000000 --- a/data-canary/scripts/spells/familiar/sorcerer_familiar.lua +++ /dev/null @@ -1,20 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(player, variant) - player:CreateFamiliarSpell() - return true -end - -spell:group("support") -spell:id(196) -spell:name("Sorcerer familiar") -spell:words("utevo gran res ven") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_SUMMON_SORCERER_FAMILIAR) -spell:level(200) -spell:mana(3000) -spell:cooldown(configManager.getNumber(configKeys.FAMILIAR_TIME) * 60 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:isAggressive(false) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-canary/scripts/spells/healing/mass_healing.lua b/data-canary/scripts/spells/healing/mass_healing.lua deleted file mode 100644 index 3e329dff4c0..00000000000 --- a/data-canary/scripts/spells/healing/mass_healing.lua +++ /dev/null @@ -1,45 +0,0 @@ -function onTargetCreature(creature, target) - local player = creature:getPlayer() - local min = ((player:getLevel() / 5) + (player:getMagicLevel() * 5.7) + 26) - local max = ((player:getLevel() / 5) + (player:getMagicLevel() * 10.43) + 62) - - local bosses = { "leiden", "ravennous hunger", "dorokoll the mystic", "eshtaba the conjurer", "eliz the unyielding", "mezlon the defiler", "malkhar deathbringer", "containment crystal" } - local master = target:getMaster() - if target:isMonster() and not master or master and master:isMonster() then - if not table.contains(bosses, target:getName():lower()) then - return true - end - end - - doTargetCombatHealth(0, target, COMBAT_HEALING, min, max, CONST_ME_NONE) - return true -end - -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, 0) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) -combat:setArea(createCombatArea(AREA_CIRCLE3X3)) -combat:setCallback(CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:name("Mass Healing") -spell:words("exura gran mas res") -spell:group("healing") -spell:vocation("druid;true", "elder druid;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_MASS_HEALING) -spell:id(82) -spell:cooldown(2 * 1000) -spell:groupCooldown(1 * 1000) -spell:level(36) -spell:mana(150) -spell:isAggressive(false) -spell:isPremium(true) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-canary/scripts/spells/house/kick.lua b/data-canary/scripts/spells/house/kick.lua deleted file mode 100644 index 0fb047413b1..00000000000 --- a/data-canary/scripts/spells/house/kick.lua +++ /dev/null @@ -1,28 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(player, variant) - local targetPlayer = Player(variant:getString()) or player - local guest = targetPlayer:getTile():getHouse() - local owner = player:getTile():getHouse() - if targetPlayer ~= player then - if not owner:canEditAccessList(GUEST_LIST, player) then - player:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) - player:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end - end - - if not owner or not guest or not guest:kickPlayer(player, targetPlayer) then - player:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) - player:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end - return true -end - -spell:name("House Kick") -spell:words("alana sio") -spell:hasParams(true) -spell:hasPlayerNameParam(true) -spell:isAggressive(false) -spell:register() diff --git a/data-canary/scripts/spells/party/enchant_party.lua b/data-canary/scripts/spells/party/enchant_party.lua deleted file mode 100644 index fdc4a06e04f..00000000000 --- a/data-canary/scripts/spells/party/enchant_party.lua +++ /dev/null @@ -1,85 +0,0 @@ -local combat = Combat() -combat:setArea(createCombatArea(AREA_CIRCLE5X5)) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, 0) - -local condition = Condition(CONDITION_ATTRIBUTES) -condition:setParameter(CONDITION_PARAM_SUBID, 3) -condition:setParameter(CONDITION_PARAM_BUFF_SPELL, 1) -condition:setParameter(CONDITION_PARAM_TICKS, 2 * 60 * 1000) -condition:setParameter(CONDITION_PARAM_STAT_MAGICPOINTS, 1) - -local baseMana = 120 - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var, isHotkey) - local position = creature:getPosition() - - local party = creature:getParty() - if not party then - creature:sendCancelMessage("No party members in range.") - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - local membersList = party:getMembers() - membersList[#membersList + 1] = party:getLeader() - if membersList == nil or type(membersList) ~= "table" or #membersList <= 1 then - creature:sendCancelMessage("No party members in range.") - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - local affectedList = {} - for _, targetPlayer in ipairs(membersList) do - if targetPlayer:getPosition():getDistance(position) <= 36 then - affectedList[#affectedList + 1] = targetPlayer - end - end - - local tmp = #affectedList - if tmp <= 1 then - creature:sendCancelMessage("No party members in range.") - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - local mana = math.ceil((0.9 ^ (tmp - 1) * baseMana) * tmp) - if creature:getMana() < mana then - creature:sendCancelMessage(RETURNVALUE_NOTENOUGHMANA) - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - if not combat:execute(creature, var) then - creature:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - creature:addMana(-(mana - baseMana), FALSE) - creature:addManaSpent((mana - baseMana)) - - for _, targetPlayer in ipairs(affectedList) do - targetPlayer:addCondition(condition) - end - - return true -end - -spell:name("Enchant Party") -spell:words("utori mas sio") -spell:group("support") -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_ENCHANT_PARTY) -spell:id(129) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(32) -spell:mana(120) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-canary/scripts/spells/party/train_party.lua b/data-canary/scripts/spells/party/train_party.lua deleted file mode 100644 index 0a3a71a8252..00000000000 --- a/data-canary/scripts/spells/party/train_party.lua +++ /dev/null @@ -1,86 +0,0 @@ -local combat = Combat() -combat:setArea(createCombatArea(AREA_CIRCLE5X5)) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, 0) - -local condition = Condition(CONDITION_ATTRIBUTES) -condition:setParameter(CONDITION_PARAM_SUBID, 1) -condition:setParameter(CONDITION_PARAM_BUFF_SPELL, 1) -condition:setParameter(CONDITION_PARAM_TICKS, 2 * 60 * 1000) -condition:setParameter(CONDITION_PARAM_SKILL_MELEE, 3) -condition:setParameter(CONDITION_PARAM_SKILL_DISTANCE, 3) - -local baseMana = 60 - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - local position = creature:getPosition() - - local party = creature:getParty() - if not party then - creature:sendCancelMessage("No party members in range.") - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - local membersList = party:getMembers() - membersList[#membersList + 1] = party:getLeader() - if membersList == nil or type(membersList) ~= "table" or #membersList <= 1 then - creature:sendCancelMessage("No party members in range.") - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - local affectedList = {} - for _, targetPlayer in ipairs(membersList) do - if targetPlayer:getPosition():getDistance(position) <= 36 then - affectedList[#affectedList + 1] = targetPlayer - end - end - - local tmp = #affectedList - if tmp <= 1 then - creature:sendCancelMessage("No party members in range.") - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - local mana = math.ceil((0.9 ^ (tmp - 1) * baseMana) * tmp) - if creature:getMana() < mana then - creature:sendCancelMessage(RETURNVALUE_NOTENOUGHMANA) - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - if not combat:execute(creature, var) then - creature:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - creature:addMana(-(mana - baseMana), FALSE) - creature:addManaSpent((mana - baseMana)) - - for _, targetPlayer in ipairs(affectedList) do - targetPlayer:addCondition(condition) - end - - return true -end - -spell:name("Train Party") -spell:words("utito mas sio") -spell:group("support") -spell:vocation("knight;true", "elite knight;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_TRAIN_PARTY) -spell:id(126) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(32) -spell:mana(60) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-canary/scripts/spells/support/blood_rage.lua b/data-canary/scripts/spells/support/blood_rage.lua deleted file mode 100644 index 4cdc15d9e85..00000000000 --- a/data-canary/scripts/spells/support/blood_rage.lua +++ /dev/null @@ -1,37 +0,0 @@ -local condition = Condition(CONDITION_ATTRIBUTES) -condition:setParameter(CONDITION_PARAM_SUBID, 5) -condition:setParameter(CONDITION_PARAM_TICKS, 10000) -condition:setParameter(CONDITION_PARAM_SKILL_MELEEPERCENT, 135) -condition:setParameter(CONDITION_PARAM_BUFF_DAMAGERECEIVED, 115) -condition:setParameter(CONDITION_PARAM_DISABLE_DEFENSE, true) -condition:setParameter(CONDITION_PARAM_BUFF_SPELL, true) - -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_GREEN) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, 0) -combat:addCondition(condition) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - if creature:getCondition(CONDITION_ATTRIBUTES, CONDITIONID_COMBAT, 5) then - creature:removeCondition(CONDITION_ATTRIBUTES, CONDITIONID_COMBAT, 5) - end - return combat:execute(creature, var) -end - -spell:name("Blood Rage") -spell:words("utito tempo") -spell:group("support", "focus") -spell:vocation("knight;true", "elite knight;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_BLOOD_RAGE) -spell:id(133) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000, 2 * 1000) -spell:level(60) -spell:mana(290) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-canary/scripts/spells/support/charge.lua b/data-canary/scripts/spells/support/charge.lua deleted file mode 100644 index 38ccdbb9e9a..00000000000 --- a/data-canary/scripts/spells/support/charge.lua +++ /dev/null @@ -1,45 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_GREEN) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -local condition = Condition(CONDITION_HASTE) -condition:setParameter(CONDITION_PARAM_TICKS, 5000) -condition:setFormula(1.9, 40, 1.9, 40) -combat:addCondition(condition) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - local summons = creature:getSummons() - if summons and type(summons) == "table" and #summons > 0 then - for i = 1, #summons do - local summon = summons[i] - local summon_t = summon:getType() - if summon_t and summon_t:familiar() then - local deltaSpeed = math.max(creature:getBaseSpeed() - summon:getBaseSpeed(), 0) - local FamiliarSpeed = ((summon:getBaseSpeed() + deltaSpeed) * 0.9) - 72 - local FamiliarHaste = Condition(CONDITION_HASTE) - FamiliarHaste:setParam(CONDITION_PARAM_TICKS, 5000) - FamiliarHaste:setParam(CONDITION_PARAM_SPEED, FamiliarSpeed) - summon:addCondition(FamiliarHaste) - end - end - end - return combat:execute(creature, variant) -end - -spell:name("Charge") -spell:words("utani tempo hur") -spell:group("support") -spell:vocation("knight;true", "elite knight;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_CHARGE) -spell:id(131) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(25) -spell:mana(100) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-canary/scripts/spells/support/chivalrous_challenge.lua b/data-canary/scripts/spells/support/chivalrous_challenge.lua deleted file mode 100644 index 7ab5ac68956..00000000000 --- a/data-canary/scripts/spells/support/chivalrous_challenge.lua +++ /dev/null @@ -1,106 +0,0 @@ -local function getDiagonalDistance(pos1, pos2) - local dstX = math.abs(pos1.x - pos2.x) - local dstY = math.abs(pos1.y - pos2.y) - if dstX > dstY then - return 14 * dstY + 10 * (dstX - dstY) - else - return 14 * dstX + 10 * (dstY - dstX) - end -end -local function chain(player) - local creatures = Game.getSpectators(player:getPosition(), false, false, 9, 9, 6, 6) - local totalChain = 0 - local monsters = {} - local meleeMonsters = {} - for _, creature in pairs(creatures) do - if creature:isMonster() then - if creature:getType():isRewardBoss() then - return -1 - elseif creature:getMaster() == nil and creature:getType():getTargetDistance() > 1 then - table.insert(monsters, creature) - end - end - end - - local counter = 1 - local tempSize = #monsters - if tempSize < 3 and #meleeMonsters > 0 then - for i = tempSize, 3 do - if meleeMonsters[counter] ~= nil then - table.insert(monsters, meleeMonsters[counter]) - counter = counter + 1 - end - end - end - - local lastChain = player - local lastChainPosition = player:getPosition() - local closestMonster, closestMonsterIndex, closestMonsterPosition - local path, tempPosition, updateLastChain - while totalChain < 3 and #monsters > 0 do - closestMonster = nil - for index, monster in pairs(monsters) do - tempPosition = monster:getPosition() - if not closestMonster or getDiagonalDistance(lastChain:getPosition(), tempPosition) < getDiagonalDistance(lastChain:getPosition(), closestMonsterPosition) then - closestMonster = monster - closestMonsterIndex = index - closestMonsterPosition = tempPosition - doChallengeCreature(player, monster, 12000) - end - end - table.remove(monsters, closestMonsterIndex) - updateLastChain = false - if lastChainPosition:getDistance(closestMonsterPosition) == 1 then - updateLastChain = true - else - path = lastChainPosition:getPathTo(closestMonsterPosition, 0, 1, true, true, 9) - if path and #path > 0 then - for i = 1, #path do - lastChainPosition:getNextPosition(path[i], 1) - lastChainPosition:sendMagicEffect(CONST_ME_CHIVALRIOUS_CHALLENGE) - end - updateLastChain = true - end - end - if updateLastChain then - closestMonsterPosition:sendMagicEffect(CONST_ME_CHIVALRIOUS_CHALLENGE) - closestMonster:changeTargetDistance(1) - lastChain = closestMonster - lastChainPosition = closestMonsterPosition - totalChain = totalChain + 1 - end - end - return totalChain -end - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - local total = chain(creature) - if total > 0 then - return true - elseif total == -1 then - creature:sendCancelMessage("You can't use this spell if there's a boss.") - creature:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - else - creature:sendCancelMessage("There are no ranged monsters.") - creature:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end -end - -spell:group("support") -spell:id(237) -spell:name("Chivalrous Challenge") -spell:words("exeta amp res") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_CHIVALROUS_CHALLENGE) -spell:level(150) -spell:mana(80) -spell:isAggressive(false) -spell:isPremium(true) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:vocation("knight;true", "elite knight;true") -spell:needLearn(false) -spell:register() diff --git a/data-canary/scripts/spells/support/divine_dazzle.lua b/data-canary/scripts/spells/support/divine_dazzle.lua deleted file mode 100644 index b7cfdba3078..00000000000 --- a/data-canary/scripts/spells/support/divine_dazzle.lua +++ /dev/null @@ -1,92 +0,0 @@ -local function getDiagonalDistance(pos1, pos2) - local dstX = math.abs(pos1.x - pos2.x) - local dstY = math.abs(pos1.y - pos2.y) - if dstX > dstY then - return 14 * dstY + 10 * (dstX - dstY) - else - return 14 * dstX + 10 * (dstY - dstX) - end -end -local function chain(player) - local creatures = Game.getSpectators(player:getPosition(), false, false, 6, 6, 6, 6) - local totalChain = 0 - local monsters = {} - for _, creature in pairs(creatures) do - if creature:isMonster() then - if creature:getType():isRewardBoss() then - return -1 - elseif creature:getMaster() == nil and creature:getType():getTargetDistance() > 1 then - table.insert(monsters, creature) - end - end - end - local lastChain = player - local lastChainPosition = player:getPosition() - local closestMonster, closestMonsterIndex, closestMonsterPosition - local path, tempPosition, updateLastChain - while totalChain < 3 and #monsters > 0 do - closestMonster = nil - for index, monster in pairs(monsters) do - tempPosition = monster:getPosition() - if not closestMonster or getDiagonalDistance(lastChain:getPosition(), tempPosition) < getDiagonalDistance(lastChain:getPosition(), closestMonsterPosition) then - closestMonster = monster - closestMonsterIndex = index - closestMonsterPosition = tempPosition - end - end - table.remove(monsters, closestMonsterIndex) - updateLastChain = false - if lastChainPosition:getDistance(closestMonsterPosition) == 1 then - updateLastChain = true - else - path = lastChainPosition:getPathTo(closestMonsterPosition, 0, 1, true, true, 9) - if path and #path > 0 then - for i = 1, #path do - lastChainPosition:getNextPosition(path[i], 1) - lastChainPosition:sendMagicEffect(CONST_ME_DIVINE_DAZZLE) - end - updateLastChain = true - end - end - if updateLastChain then - closestMonsterPosition:sendMagicEffect(CONST_ME_DIVINE_DAZZLE) - closestMonster:changeTargetDistance(1) - lastChain = closestMonster - lastChainPosition = closestMonsterPosition - totalChain = totalChain + 1 - end - end - return totalChain -end - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - local total = chain(creature) - if total > 0 then - return true - elseif total == -1 then - creature:sendCancelMessage("You can't use this spell if there's a boss.") - creature:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - else - creature:sendCancelMessage("There are no ranged monsters.") - creature:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end -end - -spell:group("support") -spell:id(238) -spell:name("Divine Dazzle") -spell:words("exana amp res") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_DIVINE_DAZZLE) -spell:level(250) -spell:mana(80) -spell:isAggressive(false) -spell:isPremium(true) -spell:cooldown(16 * 1000) -spell:groupCooldown(2 * 1000) -spell:vocation("paladin;true", "royal paladin;true") -spell:needLearn(false) -spell:register() diff --git a/data-canary/scripts/spells/support/expose_weakness.lua b/data-canary/scripts/spells/support/expose_weakness.lua deleted file mode 100644 index 15bea21c918..00000000000 --- a/data-canary/scripts/spells/support/expose_weakness.lua +++ /dev/null @@ -1,46 +0,0 @@ -local condition = Condition(CONDITION_ATTRIBUTES) -condition:setParameter(CONDITION_PARAM_TICKS, 16000) -condition:setParameter(CONDITION_PARAM_BUFF_DAMAGERECEIVED, 105) - -function onTargetCreature(creature, target) - local player = creature:getPlayer() - - if target:isPlayer() then - return false - end - if target:getMaster() then - return true - end - - target:addCondition(condition) - return true -end - -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA) -combat:setArea(createCombatArea(AREA_CIRCLE3X3)) -combat:setCallback(CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var, isHotkey) - local target = creature:getTarget() - if target then - var = Variant(target) - end - return combat:execute(creature, var) -end - -spell:group("support", "crippling") -spell:id(243) -spell:name("Expose Weakness") -spell:words("exori moe") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_EXPOSE_WEAKNESS) -spell:level(275) -spell:mana(400) -spell:isSelfTarget(true) -spell:cooldown(12 * 1000) -spell:groupCooldown(2 * 1000, 12 * 1000) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:needLearn(false) -spell:register() diff --git a/data-canary/scripts/spells/support/find_fiend.lua b/data-canary/scripts/spells/support/find_fiend.lua deleted file mode 100644 index 859d964a78c..00000000000 --- a/data-canary/scripts/spells/support/find_fiend.lua +++ /dev/null @@ -1,120 +0,0 @@ -local LEVEL_LOWER = 1 -local LEVEL_SAME = 2 -local LEVEL_HIGHER = 3 - -local DISTANCE_BESIDE = 1 -local DISTANCE_CLOSE = 2 -local DISTANCE_FAR = 3 -local DISTANCE_VERYFAR = 4 - -local directions = { - [DIRECTION_NORTH] = "north", - [DIRECTION_SOUTH] = "south", - [DIRECTION_EAST] = "east", - [DIRECTION_WEST] = "west", - [DIRECTION_NORTHEAST] = "north-east", - [DIRECTION_NORTHWEST] = "north-west", - [DIRECTION_SOUTHEAST] = "south-east", - [DIRECTION_SOUTHWEST] = "south-west", -} - -local messages = { - [DISTANCE_BESIDE] = { - [LEVEL_LOWER] = "is below you", - [LEVEL_SAME] = "is standing next to you", - [LEVEL_HIGHER] = "is above you", - }, - [DISTANCE_CLOSE] = { - [LEVEL_LOWER] = "is on a lower level to the", - [LEVEL_SAME] = "is to the", - [LEVEL_HIGHER] = "is on a higher level to the", - }, - [DISTANCE_FAR] = "is far to the", - [DISTANCE_VERYFAR] = "is very far to the", -} - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - local targetId = ForgeMonster:pickClosestFiendish(creature) - if not targetId then - creature:sendCancelMessage("No creatures around") - creature:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end - local target = Creature(targetId) - if not target then - creature:sendCancelMessage("No creatures around") - creature:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end - - local targetPosition = target:getPosition() - local creaturePosition = creature:getPosition() - local positionDifference = { - x = creaturePosition.x - targetPosition.x, - y = creaturePosition.y - targetPosition.y, - z = creaturePosition.z - targetPosition.z, - } - - local maxPositionDifference, direction = math.max(math.abs(positionDifference.x), math.abs(positionDifference.y)) - if maxPositionDifference >= 5 then - local positionTangent = positionDifference.x ~= 0 and positionDifference.y / positionDifference.x or 10 - if math.abs(positionTangent) < 0.4142 then - direction = positionDifference.x > 0 and DIRECTION_WEST or DIRECTION_EAST - elseif math.abs(positionTangent) < 2.4142 then - direction = positionTangent > 0 and (positionDifference.y > 0 and DIRECTION_NORTHWEST or DIRECTION_SOUTHEAST) or positionDifference.x > 0 and DIRECTION_SOUTHWEST or DIRECTION_NORTHEAST - else - direction = positionDifference.y > 0 and DIRECTION_NORTH or DIRECTION_SOUTH - end - end - - local level = positionDifference.z > 0 and LEVEL_HIGHER or positionDifference.z < 0 and LEVEL_LOWER or LEVEL_SAME - local distance = maxPositionDifference < 5 and DISTANCE_BESIDE or maxPositionDifference < 101 and DISTANCE_CLOSE or maxPositionDifference < 275 and DISTANCE_FAR or DISTANCE_VERYFAR - local message = messages[distance][level] or messages[distance] - if distance ~= DISTANCE_BESIDE then - message = message .. " " .. directions[direction] - end - - local type = target:getType() - local stringLevel = "Unknown" - if type then - local bestiaryKillsAmount = type:BestiarytoKill() - if bestiaryKillsAmount >= 5 and bestiaryKillsAmount <= 25 then - stringLevel = "Harmless" - elseif bestiaryKillsAmount <= 250 then - stringLevel = "Trivial" - elseif bestiaryKillsAmount <= 500 then - stringLevel = "Easy" - elseif bestiaryKillsAmount <= 1000 then - stringLevel = "Medium" - elseif bestiaryKillsAmount <= 2500 then - stringLevel = "Hard" - elseif bestiaryKillsAmount <= 5000 then - stringLevel = "Challenging" - end - end - - message = string.format("The monster " .. message .. '. Be prepared to find a creature of difficulty level "' .. stringLevel .. '".') - local timeLeft = math.floor((target:getTimeToChangeFiendish() - os.time()) / 60) - if timeLeft <= 15 then - message = string.format(message .. " " .. ForgeMonster:getTimeLeftToChangeMonster(target)) - end - - creature:sendTextMessage(MESSAGE_LOOK, message) - creaturePosition:sendMagicEffect(CONST_ME_MAGIC_BLUE) - return true -end - -spell:name("Find Fiend") -spell:words("exiva moe res") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "knight;true", "elite knight;true", "paladin;true", "royal paladin;true", "sorcerer;true", "master sorcerer;true") -spell:id(20) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(25) -spell:mana(20) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-canary/scripts/spells/support/haste.lua b/data-canary/scripts/spells/support/haste.lua deleted file mode 100644 index 5c3f58eca36..00000000000 --- a/data-canary/scripts/spells/support/haste.lua +++ /dev/null @@ -1,45 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_GREEN) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -local condition = Condition(CONDITION_HASTE) -condition:setParameter(CONDITION_PARAM_TICKS, 33000) -condition:setFormula(1.3, 40, 1.3, 40) -combat:addCondition(condition) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - local summons = creature:getSummons() - if summons and type(summons) == "table" and #summons > 0 then - for i = 1, #summons do - local summon = summons[i] - local summon_t = summon:getType() - if summon_t and summon_t:familiar() then - local deltaSpeed = math.max(creature:getBaseSpeed() - summon:getBaseSpeed(), 0) - local FamiliarSpeed = ((summon:getBaseSpeed() + deltaSpeed) * 0.3) - 24 - local FamiliarHaste = Condition(CONDITION_HASTE) - FamiliarHaste:setParam(CONDITION_PARAM_TICKS, 33000) - FamiliarHaste:setParam(CONDITION_PARAM_SPEED, FamiliarSpeed) - summon:addCondition(FamiliarHaste) - end - end - end - return combat:execute(creature, variant) -end - -spell:name("Haste") -spell:words("utani hur") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "knight;true", "elite knight;true", "paladin;true", "royal paladin;true", "sorcerer;true", "master sorcerer;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_HASTE) -spell:id(6) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(14) -spell:mana(60) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-canary/scripts/spells/support/magic_shield.lua b/data-canary/scripts/spells/support/magic_shield.lua deleted file mode 100644 index 2af58489732..00000000000 --- a/data-canary/scripts/spells/support/magic_shield.lua +++ /dev/null @@ -1,31 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, 0) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - local condition = Condition(CONDITION_MANASHIELD) - condition:setParameter(CONDITION_PARAM_TICKS, 180000) - local player = creature:getPlayer() - if player then - condition:setParameter(CONDITION_PARAM_MANASHIELD, math.min(player:getMaxMana(), 300 + 7.6 * player:getLevel() + 7 * player:getMagicLevel())) - end - creature:addCondition(condition) - return combat:execute(creature, var) -end - -spell:name("Magic Shield") -spell:words("utamo vita") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_MAGIC_SHIELD) -spell:id(44) -spell:cooldown(14 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(14) -spell:mana(50) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-canary/scripts/spells/support/protector.lua b/data-canary/scripts/spells/support/protector.lua deleted file mode 100644 index cc4417c5ba1..00000000000 --- a/data-canary/scripts/spells/support/protector.lua +++ /dev/null @@ -1,37 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_GREEN) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -local skill = Condition(CONDITION_ATTRIBUTES) -skill:setParameter(CONDITION_PARAM_SUBID, 5) -skill:setParameter(CONDITION_PARAM_TICKS, 13000) -skill:setParameter(CONDITION_PARAM_SKILL_SHIELDPERCENT, 220) -skill:setParameter(CONDITION_PARAM_BUFF_DAMAGEDEALT, 65) -skill:setParameter(CONDITION_PARAM_BUFF_DAMAGERECEIVED, 85) -skill:setParameter(CONDITION_PARAM_BUFF_SPELL, true) -combat:addCondition(skill) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - if creature:getCondition(CONDITION_ATTRIBUTES, CONDITIONID_COMBAT, 5) then - creature:removeCondition(CONDITION_ATTRIBUTES, CONDITIONID_COMBAT, 5) - end - return combat:execute(creature, variant) -end - -spell:name("Protector") -spell:words("utamo tempo") -spell:group("support", "focus") -spell:vocation("knight;true", "elite knight;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_PROTECTOR) -spell:id(132) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000, 2 * 1000) -spell:level(55) -spell:mana(200) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-canary/scripts/spells/support/sap_strength.lua b/data-canary/scripts/spells/support/sap_strength.lua deleted file mode 100644 index 40143ba8b0f..00000000000 --- a/data-canary/scripts/spells/support/sap_strength.lua +++ /dev/null @@ -1,46 +0,0 @@ -local condition = Condition(CONDITION_ATTRIBUTES) -condition:setParameter(CONDITION_PARAM_TICKS, 16000) -condition:setParameter(CONDITION_PARAM_BUFF_DAMAGEDEALT, 90) - -function onTargetCreature(creature, target) - local player = creature:getPlayer() - - if target:isPlayer() then - return false - end - if target:getMaster() then - return true - end - - target:addCondition(condition) - return true -end - -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA) -combat:setArea(createCombatArea(AREA_CIRCLE3X3)) -combat:setCallback(CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var, isHotkey) - local target = creature:getTarget() - if target then - var = Variant(target) - end - return combat:execute(creature, var) -end - -spell:group("support", "crippling") -spell:id(244) -spell:name("Sap Strength") -spell:words("exori kor") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_SAP_STRENGTH) -spell:level(275) -spell:mana(300) -spell:isSelfTarget(true) -spell:cooldown(12 * 1000) -spell:groupCooldown(2 * 1000, 12 * 1000) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:needLearn(false) -spell:register() diff --git a/data-canary/scripts/spells/support/sharpshooter.lua b/data-canary/scripts/spells/support/sharpshooter.lua deleted file mode 100644 index 595c1e6db80..00000000000 --- a/data-canary/scripts/spells/support/sharpshooter.lua +++ /dev/null @@ -1,48 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_GREEN) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -local skill = Condition(CONDITION_ATTRIBUTES) -skill:setParameter(CONDITION_PARAM_SUBID, 6) -skill:setParameter(CONDITION_PARAM_TICKS, 10000) -skill:setParameter(CONDITION_PARAM_SKILL_DISTANCEPERCENT, 140) -skill:setParameter(CONDITION_PARAM_DISABLE_DEFENSE, true) -skill:setParameter(CONDITION_PARAM_BUFF_SPELL, true) -combat:addCondition(skill) - -local speed = Condition(CONDITION_HASTE) -speed:setParameter(CONDITION_PARAM_TICKS, 10000) -speed:setFormula(0.7, 0, 0.7, 0) -combat:addCondition(speed) - -local exhaustHealGroup = Condition(CONDITION_SPELLGROUPCOOLDOWN) -exhaustHealGroup:setParameter(CONDITION_PARAM_SUBID, 2) -exhaustHealGroup:setParameter(CONDITION_PARAM_TICKS, 10000) -combat:addCondition(exhaustHealGroup) - -local exhaustSupportGroup = Condition(CONDITION_SPELLGROUPCOOLDOWN) -exhaustSupportGroup:setParameter(CONDITION_PARAM_SUBID, 3) -exhaustSupportGroup:setParameter(CONDITION_PARAM_TICKS, 10000) -combat:addCondition(exhaustSupportGroup) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Sharpshooter") -spell:words("utito tempo san") -spell:group("support", "healing") -spell:vocation("paladin;true", "royal paladin;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_SHARPSHOOTER) -spell:id(135) -spell:cooldown(2 * 1000) -spell:groupCooldown(10 * 1000, 10 * 1000) -spell:level(60) -spell:mana(450) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(false) -spell:needLearn(false) -spell:register() diff --git a/data-canary/scripts/spells/support/strong_haste.lua b/data-canary/scripts/spells/support/strong_haste.lua deleted file mode 100644 index 3837edf804b..00000000000 --- a/data-canary/scripts/spells/support/strong_haste.lua +++ /dev/null @@ -1,45 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_GREEN) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, 0) - -local condition = Condition(CONDITION_HASTE) -condition:setParameter(CONDITION_PARAM_TICKS, 21000) -condition:setFormula(1.7, 40, 1.7, 40) -combat:addCondition(condition) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - local summons = creature:getSummons() - if summons and type(summons) == "table" and #summons > 0 then - for i = 1, #summons do - local summon = summons[i] - local summon_t = summon:getType() - if summon_t and summon_t:familiar() then - local deltaSpeed = math.max(creature:getBaseSpeed() - summon:getBaseSpeed(), 0) - local FamiliarSpeed = ((summon:getBaseSpeed() + deltaSpeed) * 0.7) - 56 - local FamiliarHaste = Condition(CONDITION_HASTE) - FamiliarHaste:setParam(CONDITION_PARAM_TICKS, 22000) - FamiliarHaste:setParam(CONDITION_PARAM_SPEED, FamiliarSpeed) - summon:addCondition(FamiliarHaste) - end - end - end - return combat:execute(creature, var) -end - -spell:name("Strong Haste") -spell:words("utani gran hur") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_STRONG_HASTE) -spell:id(39) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(20) -spell:mana(100) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-canary/scripts/spells/support/swift_foot.lua b/data-canary/scripts/spells/support/swift_foot.lua deleted file mode 100644 index 249494f38ca..00000000000 --- a/data-canary/scripts/spells/support/swift_foot.lua +++ /dev/null @@ -1,58 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_GREEN) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, 0) - -local exhaust = Condition(CONDITION_EXHAUST_COMBAT) -exhaust:setParameter(CONDITION_PARAM_TICKS, 10000) -combat:addCondition(exhaust) - -local condition = Condition(CONDITION_HASTE) -condition:setParameter(CONDITION_PARAM_TICKS, 10000) -condition:setFormula(1.8, 72, 1.8, 72) -combat:addCondition(condition) - -local exhaustAttackGroup = Condition(CONDITION_SPELLGROUPCOOLDOWN) -exhaustAttackGroup:setParameter(CONDITION_PARAM_SUBID, 1) -exhaustAttackGroup:setParameter(CONDITION_PARAM_TICKS, 10000) -combat:addCondition(exhaustAttackGroup) - -local disable = Condition(CONDITION_PACIFIED) -disable:setParameter(CONDITION_PARAM_TICKS, 10000) -combat:addCondition(disable) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - local summons = creature:getSummons() - if summons and type(summons) == "table" and #summons > 0 then - for i = 1, #summons do - local summon = summons[i] - local summon_t = summon:getType() - if summon_t and summon_t:familiar() then - local deltaSpeed = math.max(creature:getBaseSpeed() - summon:getBaseSpeed(), 0) - local FamiliarSpeed = ((summon:getBaseSpeed() + deltaSpeed) * 0.8) - 72 - local FamiliarHaste = Condition(CONDITION_HASTE) - setConditionParam(FamiliarHaste, CONDITION_PARAM_TICKS, 10000) - setConditionParam(FamiliarHaste, CONDITION_PARAM_SPEED, FamiliarSpeed) - summon:addCondition(FamiliarHaste) - end - end - end - return combat:execute(creature, var) -end - -spell:name("Swift Foot") -spell:words("utamo tempo san") -spell:group("support") -spell:vocation("paladin;true", "royal paladin;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_SWIFT_FOOT) -spell:id(134) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(55) -spell:mana(400) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-canary/scripts/weapons/unscripted_weapons.lua b/data-canary/scripts/weapons/unscripted_weapons.lua deleted file mode 100644 index 5f56e9c7a06..00000000000 --- a/data-canary/scripts/weapons/unscripted_weapons.lua +++ /dev/null @@ -1,5141 +0,0 @@ -local weapons = { - { - -- naga rod - itemId = 39163, - type = WEAPON_WAND, - wandType = "ice", - level = 250, - mana = 22, - damage = { 90, 110 }, - unproperly = true, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- naga wand - itemId = 39162, - type = WEAPON_WAND, - wandType = "energy", - level = 250, - mana = 21, - damage = { 90, 120 }, - unproperly = true, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- naga crossbow - itemId = 39159, - type = WEAPON_DISTANCE, - level = 300, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- naga club - itemId = 39157, - type = WEAPON_CLUB, - level = 300, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- naga axe - itemId = 39156, - type = WEAPON_AXE, - level = 300, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- naga sword - itemId = 39155, - type = WEAPON_SWORD, - level = 300, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- gilded eldritch rod - itemId = 36675, - type = WEAPON_WAND, - level = 250, - unproperly = true, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- eldritch rod - itemId = 36674, - type = WEAPON_WAND, - level = 250, - unproperly = true, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- gilded eldritch wand - itemId = 36669, - type = WEAPON_WAND, - level = 250, - unproperly = true, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- eldritch wand - itemId = 36668, - type = WEAPON_WAND, - level = 250, - unproperly = true, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- gilded eldritch bow - itemId = 36665, - type = WEAPON_DISTANCE, - level = 250, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- eldritch bow - itemId = 36664, - type = WEAPON_DISTANCE, - level = 250, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- gilded eldritch greataxe - itemId = 36662, - type = WEAPON_AXE, - level = 270, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch greataxe - itemId = 36661, - type = WEAPON_AXE, - level = 270, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- gilded eldritch warmace - itemId = 36660, - type = WEAPON_CLUB, - level = 270, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch warmace - itemId = 36659, - type = WEAPON_CLUB, - level = 270, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- gilded eldritch claymore - itemId = 36658, - type = WEAPON_SWORD, - level = 270, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch claymore - itemId = 36657, - type = WEAPON_SWORD, - level = 270, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- spectral bolt (no decay) - itemId = 35902, - type = WEAPON_AMMO, - level = 150, - unproperly = true, - action = "removecount", - }, - { - -- jungle wand - itemId = 35522, - type = WEAPON_WAND, - wandType = "earth", - level = 150, - mana = 19, - damage = { 80, 100 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- jungle rod - itemId = 35521, - type = WEAPON_WAND, - wandType = "ice", - level = 150, - mana = 19, - damage = { 80, 100 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- jungle bow - itemId = 35518, - type = WEAPON_DISTANCE, - level = 150, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- throwing axe - itemId = 35515, - type = WEAPON_AXE, - level = 150, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- jungle flail - itemId = 35514, - type = WEAPON_CLUB, - level = 150, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- lion longsword - itemId = 34155, - type = WEAPON_SWORD, - level = 270, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- lion hammer - itemId = 34254, - type = WEAPON_CLUB, - level = 270, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- lion axe - itemId = 34253, - type = WEAPON_AXE, - level = 270, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- lion wand - itemId = 34152, - type = WEAPON_WAND, - wandType = "ice", - level = 220, - mana = 21, - damage = { 89, 109 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- lion rod - itemId = 34151, - type = WEAPON_WAND, - wandType = "ice", - level = 270, - mana = 20, - damage = { 85, 105 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- lion longbow - itemId = 34150, - type = WEAPON_DISTANCE, - level = 270, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- soulhexer rod - itemId = 34091, - type = WEAPON_WAND, - wandType = "ice", - level = 400, - mana = 21, - damage = { 98, 118 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- soultainter wand - itemId = 34090, - type = WEAPON_WAND, - wandType = "death", - level = 400, - mana = 21, - damage = { 100, 120 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- soulpiercer crossbow - itemId = 34089, - type = WEAPON_DISTANCE, - level = 400, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- soulbleeder bow - itemId = 34088, - type = WEAPON_DISTANCE, - level = 400, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- soulmaimer club - itemId = 34087, - type = WEAPON_CLUB, - level = 400, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- soulcrusher club - itemId = 34086, - type = WEAPON_CLUB, - level = 400, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- souleater axe - itemId = 34085, - type = WEAPON_AXE, - level = 400, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- soulbiter axe - itemId = 34084, - type = WEAPON_AXE, - level = 400, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- soulshredder sword - itemId = 34083, - type = WEAPON_SWORD, - level = 400, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- soulcutter sword - itemId = 34082, - type = WEAPON_SWORD, - level = 400, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- phantasmal axe - itemid = 32616, - type = WEAPON_AXE, - level = 180, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- meat hammer - itemid = 32093, - type = WEAPON_CLUB, - }, - { - -- tagralt blade - itemid = 31614, - type = WEAPON_SWORD, - level = 250, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- bow of cataclysm - itemid = 31581, - type = WEAPON_DISTANCE, - level = 250, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- mortal mace - itemid = 31580, - type = WEAPON_CLUB, - level = 220, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- cobra rod - itemid = 30400, - type = WEAPON_WAND, - wandType = "earth", - level = 220, - mana = 21, - damage = { 70, 110 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- cobra wand - itemid = 30399, - type = WEAPON_WAND, - wandType = "energy", - level = 270, - mana = 22, - damage = { 94, 100 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- cobra sword - itemid = 30398, - type = WEAPON_SWORD, - level = 220, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- cobra axe - itemid = 30396, - type = WEAPON_AXE, - level = 220, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- cobra club - itemid = 30395, - type = WEAPON_CLUB, - level = 220, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- cobra crossbow - itemid = 30393, - type = WEAPON_DISTANCE, - level = 220, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- ice hatchet - itemid = 30283, - type = WEAPON_AXE, - }, - { - -- energized limb - itemid = 29425, - type = WEAPON_WAND, - wandType = "fire", - level = 180, - mana = 24, - damage = { 88, 108 }, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- winterblade - itemid = 29422, - type = WEAPON_SWORD, - level = 200, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- summerblade - itemid = 29421, - type = WEAPON_SWORD, - level = 200, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- resizer - itemid = 29419, - type = WEAPON_CLUB, - level = 230, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- living vine bow - itemid = 29417, - type = WEAPON_DISTANCE, - level = 220, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- golden axe - itemid = 29286, - type = WEAPON_AXE, - }, - { - -- wand of destruction test - itemid = 28479, - type = WEAPON_WAND, - }, - { - -- umbral master bow test - itemid = 28478, - type = WEAPON_DISTANCE, - }, - { - -- sorcerer test weapon - itemid = 28466, - type = WEAPON_WAND, - }, - { - -- bow of destruction test - itemid = 28465, - type = WEAPON_DISTANCE, - }, - { - -- test weapon for knights - itemid = 28464, - type = WEAPON_SWORD, - }, - { - -- sulphurous demonbone - itemid = 28832, - type = WEAPON_CLUB, - level = 80, - unproperly = true, - }, - { - -- unliving demonbone - itemid = 28831, - type = WEAPON_CLUB, - level = 80, - unproperly = true, - }, - { - -- energized demonbone - itemid = 28830, - type = WEAPON_CLUB, - level = 80, - unproperly = true, - }, - { - -- rotten demonbone - itemid = 28829, - type = WEAPON_CLUB, - level = 80, - unproperly = true, - }, - { - -- deepling fork - itemid = 28826, - type = WEAPON_WAND, - wandType = "ice", - level = 230, - mana = 23, - damage = { 80, 120 }, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- deepling ceremonial dagger - itemid = 28825, - type = WEAPON_WAND, - wandType = "ice", - level = 180, - mana = 23, - damage = { 86, 98 }, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- falcon mace - itemid = 28725, - type = WEAPON_CLUB, - level = 300, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- falcon battleaxe - itemid = 28724, - type = WEAPON_AXE, - level = 300, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- falcon longsword - itemid = 28723, - type = WEAPON_SWORD, - level = 300, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- falcon bow - itemid = 28718, - type = WEAPON_DISTANCE, - level = 300, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- falcon wand - itemid = 28717, - type = WEAPON_WAND, - wandType = "energy", - level = 300, - mana = 21, - damage = { 86, 102 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- falcon rod - itemid = 28716, - type = WEAPON_WAND, - wandType = "earth", - level = 300, - mana = 20, - damage = { 87, 101 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- gnome sword - itemid = 27651, - type = WEAPON_SWORD, - level = 250, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- mallet handle - itemid = 27525, - type = WEAPON_CLUB, - }, - { - -- strange mallet - itemid = 27523, - type = WEAPON_CLUB, - }, - { - -- rod of destruction - itemid = 27458, - type = WEAPON_WAND, - wandType = "ice", - level = 200, - mana = 20, - damage = { 80, 110 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- wand of destruction - itemid = 27457, - type = WEAPON_WAND, - wandType = "energy", - level = 200, - mana = 20, - damage = { 80, 110 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- crossbow of destruction - itemid = 27456, - type = WEAPON_DISTANCE, - level = 200, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- bow of destruction - itemid = 27455, - type = WEAPON_DISTANCE, - level = 200, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- hammer of destruction - itemid = 27454, - type = WEAPON_CLUB, - level = 200, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- mace of destruction - itemid = 27453, - type = WEAPON_CLUB, - level = 200, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- chopper of destruction - itemid = 27452, - type = WEAPON_AXE, - level = 200, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- axe of destruction - itemid = 27451, - type = WEAPON_AXE, - level = 200, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- slayer of destruction - itemid = 27450, - type = WEAPON_SWORD, - level = 200, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- blade of destruction - itemid = 27449, - type = WEAPON_SWORD, - level = 200, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- ornate carving hammer - itemid = 26061, - type = WEAPON_CLUB, - }, - { - -- valuable carving hammer - itemid = 26060, - type = WEAPON_CLUB, - }, - { - -- plain carving hammer - itemid = 26059, - type = WEAPON_CLUB, - }, - { - -- ornate carving mace - itemid = 26058, - type = WEAPON_CLUB, - }, - { - -- valuable carving mace - itemid = 26057, - type = WEAPON_CLUB, - }, - { - -- plain carving mace - itemid = 26056, - type = WEAPON_CLUB, - }, - { - -- ornate carving chopper - itemid = 26055, - type = WEAPON_AXE, - }, - { - -- valuable carving chopper - itemid = 26054, - type = WEAPON_AXE, - }, - { - -- plain carving chopper - itemid = 26053, - type = WEAPON_AXE, - }, - { - -- ornate carving axe - itemid = 26052, - type = WEAPON_AXE, - }, - { - -- valuable carving axe - itemid = 26051, - type = WEAPON_AXE, - }, - { - -- plain carving axe - itemid = 26050, - type = WEAPON_AXE, - }, - { - -- ornate carving slayer - itemid = 26049, - type = WEAPON_SWORD, - }, - { - -- valuable carving slayer - itemid = 26048, - type = WEAPON_SWORD, - }, - { - -- plain carving slayer - itemid = 26047, - type = WEAPON_SWORD, - }, - { - -- ornate carving blade - itemid = 26046, - type = WEAPON_SWORD, - }, - { - -- valuable carving blade - itemid = 26045, - type = WEAPON_SWORD, - }, - { - -- plain carving blade - itemid = 26044, - type = WEAPON_SWORD, - }, - { - -- ornate remedy hammer - itemid = 26031, - type = WEAPON_CLUB, - }, - { - -- valuable remedy hammer - itemid = 26030, - type = WEAPON_CLUB, - }, - { - -- plain remedy hammer - itemid = 26029, - type = WEAPON_CLUB, - }, - { - -- ornate remedy mace - itemid = 26028, - type = WEAPON_CLUB, - }, - { - -- valuable remedy mace - itemid = 26027, - type = WEAPON_CLUB, - }, - { - -- plain remedy mace - itemid = 26026, - type = WEAPON_CLUB, - }, - { - -- ornate remedy chopper - itemid = 26025, - type = WEAPON_AXE, - }, - { - -- valuable remedy chopper - itemid = 26024, - type = WEAPON_AXE, - }, - { - -- plain remedy chopper - itemid = 26023, - type = WEAPON_AXE, - }, - { - -- ornate remedy axe - itemid = 26022, - type = WEAPON_AXE, - }, - { - -- valuable remedy axe - itemid = 26021, - type = WEAPON_AXE, - }, - { - -- plain remedy axe - itemid = 26020, - type = WEAPON_AXE, - }, - { - -- ornate remedy slayer - itemid = 26019, - type = WEAPON_SWORD, - }, - { - -- valuable remedy slayer - itemid = 26018, - type = WEAPON_SWORD, - }, - { - -- plain remedy slayer - itemid = 26017, - type = WEAPON_SWORD, - }, - { - -- ornate remedy blade - itemid = 26016, - type = WEAPON_SWORD, - }, - { - -- valuable remedy blade - itemid = 26015, - type = WEAPON_SWORD, - }, - { - -- plain remedy blade - itemid = 26014, - type = WEAPON_SWORD, - }, - { - -- ornate mayhem hammer - itemid = 26000, - type = WEAPON_CLUB, - }, - { - -- valuable mayhem hammer - itemid = 25999, - type = WEAPON_CLUB, - }, - { - -- plain mayhem hammer - itemid = 25998, - type = WEAPON_CLUB, - }, - { - -- ornate mayhem mace - itemid = 25997, - type = WEAPON_CLUB, - }, - { - -- valuable mayhem mace - itemid = 25996, - type = WEAPON_CLUB, - }, - { - -- plain mayhem mace - itemid = 25995, - type = WEAPON_CLUB, - }, - { - -- ornate mayhem chopper - itemid = 25994, - type = WEAPON_AXE, - }, - { - -- valuable mayhem chopper - itemid = 25993, - type = WEAPON_AXE, - }, - { - -- plain mayhem chopper - itemid = 25992, - type = WEAPON_AXE, - }, - { - -- ornate mayhem axe - itemid = 25991, - type = WEAPON_AXE, - }, - { - -- valuable mayhem axe - itemid = 25990, - type = WEAPON_AXE, - }, - { - -- plain mayhem axe - itemid = 25989, - type = WEAPON_AXE, - }, - { - -- ornate mayhem slayer - itemid = 25988, - type = WEAPON_SWORD, - }, - { - -- valuable mayhem slayer - itemid = 25987, - type = WEAPON_SWORD, - }, - { - -- plain mayhem slayer - itemid = 25986, - type = WEAPON_SWORD, - }, - { - -- ornate mayhem blade - itemid = 25985, - type = WEAPON_SWORD, - }, - { - -- valuable mayhem blade - itemid = 25984, - type = WEAPON_SWORD, - }, - { - -- plain mayhem blade - itemid = 25983, - type = WEAPON_SWORD, - }, - { - -- energy war hammer replica - itemid = 25974, - type = WEAPON_CLUB, - }, - { - -- energy orcish maul replica - itemid = 25973, - type = WEAPON_CLUB, - }, - { - -- energy basher replica - itemid = 25972, - type = WEAPON_CLUB, - }, - { - -- energy crystal mace replica - itemid = 25971, - type = WEAPON_CLUB, - }, - { - -- energy clerical mace replica - itemid = 25970, - type = WEAPON_CLUB, - }, - { - -- energy war axe replica - itemid = 25969, - type = WEAPON_AXE, - }, - { - -- energy headchopper replica - itemid = 25968, - type = WEAPON_AXE, - }, - { - -- energy heroic axe replica - itemid = 25967, - type = WEAPON_AXE, - }, - { - -- energy knight axe replica - itemid = 25966, - type = WEAPON_AXE, - }, - { - -- energy barbarian axe replica - itemid = 25965, - type = WEAPON_AXE, - }, - { - -- energy dragon slayer replica - itemid = 25964, - type = WEAPON_SWORD, - }, - { - -- energy blacksteel replica - itemid = 25963, - type = WEAPON_SWORD, - }, - { - -- energy mystic blade replica - itemid = 25962, - type = WEAPON_SWORD, - }, - { - -- energy relic sword replica - itemid = 25961, - type = WEAPON_SWORD, - }, - { - -- energy spike sword replica - itemid = 25960, - type = WEAPON_SWORD, - }, - { - -- earth war hammer replica - itemid = 25959, - type = WEAPON_CLUB, - }, - { - -- earth orcish maul replica - itemid = 25958, - type = WEAPON_CLUB, - }, - { - -- earth basher replica - itemid = 25957, - type = WEAPON_CLUB, - }, - { - -- earth crystal mace replica - itemid = 25956, - type = WEAPON_CLUB, - }, - { - -- earth clerical mace replica - itemid = 25955, - type = WEAPON_CLUB, - }, - { - -- earth war axe replica - itemid = 25954, - type = WEAPON_AXE, - }, - { - -- earth headchopper replica - itemid = 25953, - type = WEAPON_AXE, - }, - { - -- earth heroic axe replica - itemid = 25952, - type = WEAPON_AXE, - }, - { - -- earth knight axe replica - itemid = 25951, - type = WEAPON_AXE, - }, - { - -- earth barbarian axe replica - itemid = 25950, - type = WEAPON_AXE, - }, - { - -- earth dragon slayer replica - itemid = 25949, - type = WEAPON_SWORD, - }, - { - -- earth blacksteel replica - itemid = 25948, - type = WEAPON_SWORD, - }, - { - -- earth mystic blade replica - itemid = 25947, - type = WEAPON_SWORD, - }, - { - -- earth relic sword replica - itemid = 25946, - type = WEAPON_SWORD, - }, - { - -- earth spike sword replica - itemid = 25945, - type = WEAPON_SWORD, - }, - { - -- icy war hammer replica - itemid = 25944, - type = WEAPON_CLUB, - }, - { - -- icy orcish maul replica - itemid = 25943, - type = WEAPON_CLUB, - }, - { - -- icy basher replica - itemid = 25942, - type = WEAPON_CLUB, - }, - { - -- icy crystal mace replica - itemid = 25941, - type = WEAPON_CLUB, - }, - { - -- icy clerical mace replica - itemid = 25940, - type = WEAPON_CLUB, - }, - { - -- icy war axe replica - itemid = 25939, - type = WEAPON_AXE, - }, - { - -- icy headchopper replica - itemid = 25938, - type = WEAPON_AXE, - }, - { - -- icy heroic axe replica - itemid = 25937, - type = WEAPON_AXE, - }, - { - -- icy knight axe replica - itemid = 25936, - type = WEAPON_AXE, - }, - { - -- icy barbarian axe replica - itemid = 25935, - type = WEAPON_AXE, - }, - { - -- icy dragon slayer replica - itemid = 25934, - type = WEAPON_SWORD, - }, - { - -- icy blacksteel replica - itemid = 25933, - type = WEAPON_SWORD, - }, - { - -- icy mystic blade replica - itemid = 25932, - type = WEAPON_SWORD, - }, - { - -- icy relic sword replica - itemid = 25931, - type = WEAPON_SWORD, - }, - { - -- icy spike sword replica - itemid = 25930, - type = WEAPON_SWORD, - }, - { - -- fiery war hammer replica - itemid = 25929, - type = WEAPON_CLUB, - }, - { - -- fiery orcish maul replica - itemid = 25928, - type = WEAPON_CLUB, - }, - { - -- fiery basher replica - itemid = 25927, - type = WEAPON_CLUB, - }, - { - -- fiery crystal mace replica - itemid = 25926, - type = WEAPON_CLUB, - }, - { - -- fiery clerical mace replica - itemid = 25925, - type = WEAPON_CLUB, - }, - { - -- fiery war axe replica - itemid = 25924, - type = WEAPON_AXE, - }, - { - -- fiery headchopper replica - itemid = 25923, - type = WEAPON_AXE, - }, - { - -- fiery heroic axe replica - itemid = 25922, - type = WEAPON_AXE, - }, - { - -- fiery knight axe replica - itemid = 25921, - type = WEAPON_AXE, - }, - { - -- fiery barbarian axe replica - itemid = 25920, - type = WEAPON_AXE, - }, - { - -- fiery dragon slayer replica - itemid = 25919, - type = WEAPON_SWORD, - }, - { - -- fiery blacksteel replica - itemid = 25918, - type = WEAPON_SWORD, - }, - { - -- fiery mystic blade replica - itemid = 25917, - type = WEAPON_SWORD, - }, - { - -- fiery relic sword replica - itemid = 25916, - type = WEAPON_SWORD, - }, - { - -- fiery spike sword replica - itemid = 25915, - type = WEAPON_SWORD, - }, - { - -- wand of darkness - itemid = 25760, - type = WEAPON_WAND, - wandType = "death", - level = 41, - mana = 15, - damage = { 80, 100 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- royal star - itemid = 25759, - type = WEAPON_DISTANCE, - level = 120, - unproperly = true, - breakchance = 30, - }, - { - -- spectral bolt - itemid = 25758, - type = WEAPON_AMMO, - level = 150, - unproperly = true, - action = "removecount", - }, - { - -- leaf star - itemid = 25735, - type = WEAPON_DISTANCE, - level = 60, - unproperly = true, - breakchance = 40, - }, - { - -- dream blossom staff - itemid = 25700, - type = WEAPON_WAND, - wandType = "energy", - level = 80, - mana = 18, - damage = { 63, 77 }, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- rod of carving - itemid = 23339, - type = WEAPON_WAND, - wandType = "ice", - level = 100, - mana = 18, - damage = { 70, 105 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- wand of carving - itemid = 23335, - type = WEAPON_WAND, - wandType = "energy", - level = 100, - mana = 18, - damage = { 70, 105 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- crossbow of carving - itemid = 23331, - type = WEAPON_DISTANCE, - level = 100, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- bow of carving - itemid = 23327, - type = WEAPON_DISTANCE, - level = 100, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- hammer of carving - itemid = 23323, - type = WEAPON_CLUB, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- mace of carving - itemid = 23319, - type = WEAPON_CLUB, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- chopper of carving - itemid = 23315, - type = WEAPON_AXE, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- axe of carving - itemid = 23311, - type = WEAPON_AXE, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- slayer of carving - itemid = 23307, - type = WEAPON_SWORD, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- blade of carving - itemid = 23303, - type = WEAPON_SWORD, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- rod of remedy - itemid = 23299, - type = WEAPON_WAND, - wandType = "ice", - level = 100, - mana = 18, - damage = { 70, 105 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- wand of remedy - itemid = 23295, - type = WEAPON_WAND, - wandType = "energy", - level = 100, - mana = 18, - damage = { 70, 105 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- crossbow of remedy - itemid = 23291, - type = WEAPON_DISTANCE, - level = 100, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- bow of remedy - itemid = 23287, - type = WEAPON_DISTANCE, - level = 100, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- hammer of remedy - itemid = 23283, - type = WEAPON_CLUB, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- mace of remedy - itemid = 23279, - type = WEAPON_CLUB, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- chopper of remedy - itemid = 23275, - type = WEAPON_AXE, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- axe of remedy - itemid = 23271, - type = WEAPON_AXE, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- slayer of remedy - itemid = 23267, - type = WEAPON_SWORD, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- blade of remedy - itemid = 23263, - type = WEAPON_SWORD, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- rod of mayhem - itemid = 23232, - type = WEAPON_WAND, - wandType = "ice", - level = 100, - mana = 18, - damage = { 70, 105 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- wand of mayhem - itemid = 23231, - type = WEAPON_WAND, - wandType = "energy", - level = 100, - mana = 18, - damage = { 70, 105 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- crossbow of mayhem - itemid = 23230, - type = WEAPON_DISTANCE, - level = 100, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- bow of mayhem - itemid = 23229, - type = WEAPON_DISTANCE, - level = 100, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- hammer of mayhem - itemid = 23228, - type = WEAPON_CLUB, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- mace of mayhem - itemid = 23227, - type = WEAPON_CLUB, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- chopper of mayhem - itemid = 23226, - type = WEAPON_AXE, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- axe of mayhem - itemid = 23225, - type = WEAPON_AXE, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- slayer of mayhem - itemid = 23224, - type = WEAPON_SWORD, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- blade of mayhem - itemid = 23223, - type = WEAPON_SWORD, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- rift crossbow - itemid = 22867, - type = WEAPON_DISTANCE, - level = 120, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- rift bow - itemid = 22866, - type = WEAPON_DISTANCE, - level = 120, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- ferumbras' staff (enchanted) - itemid = 22766, - type = WEAPON_WAND, - wandType = "energy", - level = 100, - mana = 19, - damage = { 80, 110 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- ferumbras' staff (failed) - itemid = 22765, - type = WEAPON_WAND, - wandType = "energy", - level = 65, - mana = 17, - damage = { 65, 95 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- Ferumbras' staff - itemid = 22764, - type = WEAPON_CLUB, - level = 100, - unproperly = true, - }, - { - -- maimer - itemid = 22762, - type = WEAPON_CLUB, - level = 150, - unproperly = true, - }, - { - -- Impaler of the igniter - itemid = 22760, - type = WEAPON_SWORD, - level = 150, - unproperly = true, - }, - { - -- plague bite - itemid = 22759, - type = WEAPON_AXE, - level = 150, - unproperly = true, - }, - { - -- rift lance - itemid = 22727, - type = WEAPON_AXE, - level = 70, - unproperly = true, - }, - { - -- ogre sceptra - itemid = 22183, - type = WEAPON_WAND, - wandType = "earth", - level = 37, - mana = 13, - damage = { 56, 74 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- ogre choppa - itemid = 22172, - type = WEAPON_AXE, - level = 25, - unproperly = true, - }, - { - -- ogre klubba - itemid = 22171, - type = WEAPON_AXE, - level = 50, - unproperly = true, - }, - { - -- simple arrow - itemid = 21470, - type = WEAPON_AMMO, - action = "removecount", - }, - { - -- the chiller - itemid = 21350, - type = WEAPON_WAND, - wandType = "ice", - level = 1, - mana = 1, - damage = { 4, 8 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- the scorcher - itemid = 21348, - type = WEAPON_WAND, - wandType = "fire", - level = 1, - mana = 1, - damage = { 4, 8 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- one hit wonder - itemid = 21219, - type = WEAPON_CLUB, - level = 70, - unproperly = true, - }, - { - -- glooth axe - itemid = 21180, - type = WEAPON_AXE, - level = 75, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- glooth blade - itemid = 21179, - type = WEAPON_SWORD, - level = 75, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- glooth club - itemid = 21178, - type = WEAPON_CLUB, - level = 75, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- cowtana - itemid = 21177, - type = WEAPON_SWORD, - level = 25, - unproperly = true, - }, - { - -- execowtioner axe - itemid = 21176, - type = WEAPON_AXE, - level = 55, - unproperly = true, - }, - { - -- mino lance - itemid = 21174, - type = WEAPON_AXE, - level = 45, - unproperly = true, - }, - { - -- moohtant cudgel - itemid = 21173, - type = WEAPON_CLUB, - level = 60, - unproperly = true, - }, - { - -- glooth whip - itemid = 21172, - type = WEAPON_CLUB, - level = 25, - unproperly = true, - }, - { - -- metal bat - itemid = 21171, - type = WEAPON_CLUB, - level = 55, - unproperly = true, - }, - { - -- glooth spear - itemid = 21158, - type = WEAPON_DISTANCE, - level = 60, - unproperly = true, - breakchance = 2, - }, - { - -- umbral master crossbow - itemid = 20087, - type = WEAPON_DISTANCE, - level = 250, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- umbral crossbow - itemid = 20086, - type = WEAPON_DISTANCE, - level = 120, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- crude umbral crossbow - itemid = 20085, - type = WEAPON_DISTANCE, - level = 75, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- umbral master bow - itemid = 20084, - type = WEAPON_DISTANCE, - level = 250, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- umbral bow - itemid = 20083, - type = WEAPON_DISTANCE, - level = 120, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- crude umbral bow - itemid = 20082, - type = WEAPON_DISTANCE, - level = 75, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- umbral master hammer - itemid = 20081, - type = WEAPON_CLUB, - level = 250, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral hammer - itemid = 20080, - type = WEAPON_CLUB, - level = 120, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crude umbral hammer - itemid = 20079, - type = WEAPON_CLUB, - level = 75, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral master mace - itemid = 20078, - type = WEAPON_CLUB, - level = 250, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral mace - itemid = 20077, - type = WEAPON_CLUB, - level = 120, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crude umbral mace - itemid = 20076, - type = WEAPON_CLUB, - level = 75, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral master chopper - itemid = 20075, - type = WEAPON_AXE, - level = 250, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral chopper - itemid = 20074, - type = WEAPON_AXE, - level = 120, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- guardian halberd - itemid = 20073, - type = WEAPON_AXE, - level = 75, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral master axe - itemid = 20072, - type = WEAPON_AXE, - level = 250, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral axe - itemid = 20071, - type = WEAPON_AXE, - level = 120, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crude umbral axe - itemid = 20070, - type = WEAPON_AXE, - level = 75, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral master slayer - itemid = 20069, - type = WEAPON_SWORD, - level = 250, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral slayer - itemid = 20068, - type = WEAPON_SWORD, - level = 120, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crude umbral slayer - itemid = 20067, - type = WEAPON_SWORD, - level = 75, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral masterblade - itemid = 20066, - type = WEAPON_SWORD, - level = 250, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral blade - itemid = 20065, - type = WEAPON_SWORD, - level = 120, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crude umbral blade - itemid = 20064, - type = WEAPON_SWORD, - level = 75, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- icicle bow - itemid = 19362, - type = WEAPON_DISTANCE, - unproperly = true, - }, - { - -- triple bolt crossbow - itemid = 19356, - type = WEAPON_DISTANCE, - level = 70, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- spiky club - itemid = 17859, - type = WEAPON_CLUB, - level = 20, - unproperly = true, - }, - { - -- pair of iron fists - itemid = 17828, - type = WEAPON_CLUB, - level = 50, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- swampling club - itemid = 17824, - type = WEAPON_CLUB, - }, - { - -- life preserver - itemid = 17813, - type = WEAPON_CLUB, - level = 15, - unproperly = true, - }, - { - -- ratana - itemid = 17812, - type = WEAPON_SWORD, - level = 15, - unproperly = true, - }, - { - -- sorc and druid staff - itemid = 17111, - type = WEAPON_WAND, - wandType = "energy", - level = 1, - mana = 2, - damage = { 8, 18 }, - vocation = { - { "None", true }, - }, - }, - { - -- mean paladin spear - itemid = 17110, - type = WEAPON_DISTANCE, - breakchance = 3, - vocation = { - { "None", true }, - }, - }, - { - -- mean knight sword - itemid = 17109, - type = WEAPON_SWORD, - unproperly = true, - vocation = { - { "None", true }, - }, - }, - { - -- shiny blade - itemid = 16175, - type = WEAPON_SWORD, - level = 120, - unproperly = true, - }, - { - -- mycological bow - itemid = 16164, - type = WEAPON_DISTANCE, - level = 105, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- crystal crossbow - itemid = 16163, - type = WEAPON_DISTANCE, - level = 90, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- mycological mace - itemid = 16162, - type = WEAPON_CLUB, - level = 120, - unproperly = true, - }, - { - -- crystalline axe - itemid = 16161, - type = WEAPON_AXE, - level = 120, - unproperly = true, - }, - { - -- crystalline sword - itemid = 16160, - type = WEAPON_SWORD, - level = 62, - unproperly = true, - }, - { - -- envenomed arrow - itemid = 16143, - type = WEAPON_AMMO, - level = 70, - unproperly = true, - action = "removecount", - }, - { - -- drill bolt - itemid = 16142, - type = WEAPON_AMMO, - level = 70, - unproperly = true, - action = "removecount", - }, - { - -- prismatic bolt - itemid = 16141, - type = WEAPON_AMMO, - level = 90, - unproperly = true, - action = "removecount", - }, - { - -- glacial rod - itemid = 16118, - type = WEAPON_WAND, - wandType = "ice", - level = 65, - mana = 17, - damage = { 75, 95 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- muck rod - itemid = 16117, - type = WEAPON_WAND, - wandType = "earth", - level = 65, - mana = 17, - damage = { 75, 95 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- wand of everblazing - itemid = 16115, - type = WEAPON_WAND, - wandType = "fire", - level = 65, - mana = 17, - damage = { 75, 95 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of defiance - itemid = 16096, - type = WEAPON_WAND, - wandType = "energy", - level = 65, - mana = 17, - damage = { 75, 95 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- crystalline arrow - itemid = 15793, - type = WEAPON_AMMO, - level = 90, - unproperly = true, - action = "removecount", - }, - { - -- crystal bolt - itemid = 15792, - type = WEAPON_AMMO, - action = "removecount", - }, - { - -- thorn spitter - itemid = 14768, - type = WEAPON_DISTANCE, - level = 150, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- vortex bolt - itemid = 14252, - type = WEAPON_AMMO, - level = 40, - unproperly = true, - action = "removecount", - }, - { - -- tarsal arrow - itemid = 14251, - type = WEAPON_AMMO, - level = 30, - unproperly = true, - action = "removecount", - }, - { - -- deepling squelcher - itemid = 14250, - type = WEAPON_CLUB, - level = 48, - unproperly = true, - }, - { - -- ornate crossbow - itemid = 14247, - type = WEAPON_DISTANCE, - level = 50, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- hive bow - itemid = 14246, - type = WEAPON_DISTANCE, - level = 85, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- hive scythe - itemid = 14089, - type = WEAPON_AXE, - level = 70, - unproperly = true, - }, - { - -- guardian axe - itemid = 14043, - type = WEAPON_AXE, - level = 50, - unproperly = true, - }, - { - -- warrior's axe - itemid = 14040, - type = WEAPON_AXE, - level = 40, - unproperly = true, - }, - { - -- ornate mace - itemid = 14001, - type = WEAPON_CLUB, - level = 90, - unproperly = true, - }, - { - -- deepling axe - itemid = 13991, - type = WEAPON_AXE, - level = 80, - unproperly = true, - }, - { - -- deepling staff - itemid = 13987, - type = WEAPON_CLUB, - level = 38, - unproperly = true, - }, - { - -- shimmer wand - itemid = 12741, - type = WEAPON_WAND, - wandType = "energy", - level = 40, - mana = 13, - damage = { 56, 74 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- shimmer bow - itemid = 12733, - type = WEAPON_DISTANCE, - level = 40, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- shimmer rod - itemid = 12732, - type = WEAPON_WAND, - wandType = "ice", - level = 40, - mana = 13, - damage = { 56, 74 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- shimmer sword - itemid = 12731, - type = WEAPON_SWORD, - level = 40, - unproperly = true, - }, - { - -- heavy trident - itemid = 12683, - type = WEAPON_AXE, - level = 25, - unproperly = true, - }, - { - -- wooden sword - itemid = 12673, - type = WEAPON_SWORD, - }, - { - -- wand of dimensions - itemid = 12603, - type = WEAPON_WAND, - wandType = "death", - level = 37, - mana = 9, - damage = { 44, 62 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- blade of corruption - itemid = 11693, - type = WEAPON_SWORD, - level = 82, - unproperly = true, - }, - { - -- snake god's sceptre - itemid = 11692, - type = WEAPON_CLUB, - level = 82, - unproperly = true, - }, - { - -- twiceslicer - itemid = 11657, - type = WEAPON_SWORD, - level = 58, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- Zaoan halberd - itemid = 10406, - type = WEAPON_AXE, - level = 25, - unproperly = true, - }, - { - -- twin hooks - itemid = 10392, - type = WEAPON_SWORD, - level = 20, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- drachaku - itemid = 10391, - type = WEAPON_CLUB, - level = 55, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- Zaoan sword - itemid = 10390, - type = WEAPON_SWORD, - level = 55, - unproperly = true, - }, - { - -- sai - itemid = 10389, - type = WEAPON_SWORD, - level = 50, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- drakinata - itemid = 10388, - type = WEAPON_AXE, - level = 60, - unproperly = true, - }, - { - -- incredible mumpiz slayer - itemid = 9396, - type = WEAPON_SWORD, - }, - { - -- poet's fencing quill - itemid = 9387, - type = WEAPON_SWORD, - }, - { - -- farmer's avenger - itemid = 9386, - type = WEAPON_AXE, - }, - { - -- club of the fury - itemid = 9385, - type = WEAPON_CLUB, - }, - { - -- scythe of the reaper - itemid = 9384, - type = WEAPON_AXE, - }, - { - -- musician's bow - itemid = 9378, - type = WEAPON_DISTANCE, - }, - { - -- stale bread of ancientness - itemid = 9376, - type = WEAPON_CLUB, - }, - { - -- pointed rabbitslayer - itemid = 9375, - type = WEAPON_SWORD, - }, - { - -- glutton's mace - itemid = 9373, - type = WEAPON_CLUB, - }, - { - -- the calamity - itemid = 8104, - type = WEAPON_SWORD, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- the epiphany - itemid = 8103, - type = WEAPON_SWORD, - level = 120, - unproperly = true, - }, - { - -- emerald sword - itemid = 8102, - type = WEAPON_SWORD, - level = 100, - unproperly = true, - }, - { - -- the stomper - itemid = 8101, - type = WEAPON_CLUB, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- obsidian truncheon - itemid = 8100, - type = WEAPON_CLUB, - level = 100, - unproperly = true, - }, - { - -- dark trinity mace - itemid = 8099, - type = WEAPON_CLUB, - level = 120, - unproperly = true, - }, - { - -- demonwing axe - itemid = 8098, - type = WEAPON_AXE, - level = 120, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- solar axe - itemid = 8097, - type = WEAPON_AXE, - level = 130, - unproperly = true, - }, - { - -- hellforged axe - itemid = 8096, - type = WEAPON_AXE, - level = 110, - unproperly = true, - }, - { - -- wand of voodoo - itemid = 8094, - type = WEAPON_WAND, - wandType = "death", - level = 42, - mana = 13, - damage = { 56, 74 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of draconia - itemid = 8093, - type = WEAPON_WAND, - wandType = "fire", - level = 22, - mana = 5, - damage = { 23, 37 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of starmstorm - itemid = 8092, - type = WEAPON_WAND, - wandType = "energy", - level = 37, - mana = 13, - damage = { 56, 74 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- springsprout rod - itemid = 8084, - type = WEAPON_WAND, - wandType = "earth", - level = 37, - mana = 13, - damage = { 56, 74 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- northwind rod - itemid = 8083, - type = WEAPON_WAND, - wandType = "ice", - level = 22, - mana = 5, - damage = { 23, 37 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- underworld rod - itemid = 8082, - type = WEAPON_WAND, - wandType = "death", - level = 42, - mana = 13, - damage = { 56, 74 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- elethriel's elemental bow - itemid = 8030, - type = WEAPON_DISTANCE, - level = 70, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- silkweaver bow - itemid = 8029, - type = WEAPON_DISTANCE, - level = 40, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- yol's bow - itemid = 8028, - type = WEAPON_DISTANCE, - level = 60, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- composite hornbow - itemid = 8027, - type = WEAPON_DISTANCE, - level = 50, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- warsinger bow - itemid = 8026, - type = WEAPON_DISTANCE, - level = 80, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- ironworker - itemid = 8025, - type = WEAPON_DISTANCE, - level = 80, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- devileye - itemid = 8024, - type = WEAPON_DISTANCE, - level = 100, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- royal crossbow - itemid = 8023, - type = WEAPON_DISTANCE, - level = 130, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- chain bolter - itemid = 8022, - type = WEAPON_DISTANCE, - level = 60, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- modified crossbow - itemid = 8021, - type = WEAPON_DISTANCE, - level = 45, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- jagged sword - itemid = 7774, - type = WEAPON_SWORD, - }, - { - -- steel axe - itemid = 7773, - type = WEAPON_AXE, - }, - { - -- crimson sword - itemid = 860, - type = WEAPON_SWORD, - }, - { - -- energy war hammer - itemid = 810, - type = WEAPON_CLUB, - level = 50, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- energy orcish maul - itemid = 809, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - action = "removecharge", - }, - { - -- energy cranial basher - itemid = 808, - type = WEAPON_CLUB, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- energy crystal mace - itemid = 807, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - action = "removecharge", - }, - { - -- energy clerical mace - itemid = 806, - type = WEAPON_CLUB, - level = 20, - unproperly = true, - action = "removecharge", - }, - { - -- energy war axe - itemid = 805, - type = WEAPON_AXE, - level = 65, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- energy headchopper - itemid = 804, - type = WEAPON_AXE, - level = 35, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- energy heroic axe - itemid = 803, - type = WEAPON_AXE, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- energy knight axe - itemid = 802, - type = WEAPON_AXE, - level = 25, - unproperly = true, - action = "removecharge", - }, - { - -- energy barbarian axe - itemid = 801, - type = WEAPON_AXE, - level = 20, - unproperly = true, - action = "removecharge", - }, - { - -- energy dragon slayer - itemid = 798, - type = WEAPON_SWORD, - level = 45, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- energy blacksteel sword - itemid = 797, - type = WEAPON_SWORD, - level = 35, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- energy mystic blade - itemid = 796, - type = WEAPON_SWORD, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- energy relic sword - itemid = 795, - type = WEAPON_SWORD, - level = 50, - unproperly = true, - action = "removecharge", - }, - { - -- energy spike sword - itemid = 794, - type = WEAPON_SWORD, - action = "removecharge", - }, - { - -- earth war hammer - itemid = 793, - type = WEAPON_CLUB, - level = 50, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- earth orcish maul - itemid = 792, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - action = "removecharge", - }, - { - -- earth cranial basher - itemid = 791, - type = WEAPON_CLUB, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- earth crystal mace - itemid = 790, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - action = "removecharge", - }, - { - -- earth clerical mace - itemid = 789, - type = WEAPON_CLUB, - level = 20, - unproperly = true, - action = "removecharge", - }, - { - -- earth war axe - itemid = 788, - type = WEAPON_AXE, - level = 65, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- earth headchopper - itemid = 787, - type = WEAPON_AXE, - level = 35, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- earth heroic axe - itemid = 786, - type = WEAPON_AXE, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- earth knight axe - itemid = 785, - type = WEAPON_AXE, - level = 25, - unproperly = true, - action = "removecharge", - }, - { - -- earth barbarian axe - itemid = 784, - type = WEAPON_AXE, - level = 20, - unproperly = true, - action = "removecharge", - }, - { - -- earth dragon slayer - itemid = 783, - type = WEAPON_SWORD, - level = 45, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- earth blacksteel sword - itemid = 782, - type = WEAPON_SWORD, - level = 35, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- earth mystic blade - itemid = 781, - type = WEAPON_SWORD, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- earth relic sword - itemid = 780, - type = WEAPON_SWORD, - level = 50, - unproperly = true, - action = "removecharge", - }, - { - -- earth spike sword - itemid = 779, - type = WEAPON_SWORD, - action = "removecharge", - }, - { - -- earth arrow - itemid = 774, - type = WEAPON_AMMO, - level = 20, - unproperly = true, - action = "removecount", - }, - { - -- flaming arrow - itemid = 763, - type = WEAPON_AMMO, - level = 20, - unproperly = true, - action = "removecount", - }, - { - -- shiver arrow - itemid = 762, - type = WEAPON_AMMO, - level = 20, - unproperly = true, - action = "removecount", - }, - { - -- flash arrow - itemid = 761, - type = WEAPON_AMMO, - level = 20, - unproperly = true, - action = "removecount", - }, - { - -- icy war hammer - itemid = 693, - type = WEAPON_CLUB, - level = 50, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- icy orcish maul - itemid = 692, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - action = "removecharge", - }, - { - -- icy cranial basher - itemid = 691, - type = WEAPON_CLUB, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- icy crystal mace - itemid = 690, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - action = "removecharge", - }, - { - -- icy clerical mace - itemid = 689, - type = WEAPON_CLUB, - level = 20, - unproperly = true, - action = "removecharge", - }, - { - -- icy war axe - itemid = 688, - type = WEAPON_AXE, - level = 65, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- icy headchopper - itemid = 687, - type = WEAPON_AXE, - level = 35, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- icy heroic axe - itemid = 686, - type = WEAPON_AXE, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- icy knight axe - itemid = 685, - type = WEAPON_AXE, - level = 25, - unproperly = true, - action = "removecharge", - }, - { - -- icy barbarian axe - itemid = 684, - type = WEAPON_AXE, - level = 20, - unproperly = true, - action = "removecharge", - }, - { - -- icy dragon slayer - itemid = 683, - type = WEAPON_SWORD, - level = 45, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- icy blacksteel sword - itemid = 682, - type = WEAPON_SWORD, - level = 35, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- icy mystic blade - itemid = 681, - type = WEAPON_SWORD, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- icy relic sword - itemid = 680, - type = WEAPON_SWORD, - level = 50, - unproperly = true, - action = "removecharge", - }, - { - -- icy spike sword - itemid = 679, - type = WEAPON_SWORD, - action = "removecharge", - }, - { - -- fiery war hammer - itemid = 674, - type = WEAPON_CLUB, - level = 50, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fiery orcish maul - itemid = 673, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - action = "removecharge", - }, - { - -- fiery cranial basher - itemid = 672, - type = WEAPON_CLUB, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- fiery crystal mace - itemid = 671, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - action = "removecharge", - }, - { - -- fiery clerical mace - itemid = 670, - type = WEAPON_CLUB, - level = 20, - unproperly = true, - action = "removecharge", - }, - { - -- fiery war axe - itemid = 669, - type = WEAPON_AXE, - level = 65, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fiery headchopper - itemid = 668, - type = WEAPON_AXE, - level = 35, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fiery heroic axe - itemid = 667, - type = WEAPON_AXE, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- fiery knight axe - itemid = 666, - type = WEAPON_AXE, - level = 25, - unproperly = true, - action = "removecharge", - }, - { - -- fiery barbarian axe - itemid = 665, - type = WEAPON_AXE, - level = 20, - unproperly = true, - action = "removecharge", - }, - { - -- fiery dragon slayer - itemid = 664, - type = WEAPON_SWORD, - level = 45, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fiery blacksteel sword - itemid = 663, - type = WEAPON_SWORD, - level = 35, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fiery mystic blade - itemid = 662, - type = WEAPON_SWORD, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- fiery relic sword - itemid = 661, - type = WEAPON_SWORD, - level = 50, - unproperly = true, - action = "removecharge", - }, - { - -- fiery spike sword - itemid = 660, - type = WEAPON_SWORD, - action = "removecharge", - }, - { - -- noble axe - itemid = 7456, - type = WEAPON_AXE, - level = 35, - unproperly = true, - }, - { - -- mythril axe - itemid = 7455, - type = WEAPON_AXE, - level = 80, - unproperly = true, - }, - { - -- glorious axe - itemid = 7454, - type = WEAPON_AXE, - level = 30, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- executioner - itemid = 7453, - type = WEAPON_AXE, - level = 85, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- spiked squelcher - itemid = 7452, - type = WEAPON_CLUB, - level = 30, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- shadow sceptre - itemid = 7451, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - }, - { - -- hammer of prophecy - itemid = 7450, - type = WEAPON_CLUB, - level = 120, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crystal sword - itemid = 7449, - type = WEAPON_SWORD, - level = 25, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- elvish bow - itemid = 7438, - type = WEAPON_DISTANCE, - }, - { - -- sapphire hammer - itemid = 7437, - type = WEAPON_CLUB, - level = 30, - unproperly = true, - }, - { - -- angelic axe - itemid = 7436, - type = WEAPON_AXE, - level = 45, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- impaler - itemid = 7435, - type = WEAPON_AXE, - level = 85, - unproperly = true, - }, - { - -- royal axe - itemid = 7434, - type = WEAPON_AXE, - level = 75, - unproperly = true, - }, - { - -- ravenwing - itemid = 7433, - type = WEAPON_AXE, - level = 65, - unproperly = true, - }, - { - -- furry club - itemid = 7432, - type = WEAPON_CLUB, - level = 20, - unproperly = true, - }, - { - -- demonbone - itemid = 7431, - type = WEAPON_CLUB, - level = 80, - unproperly = true, - }, - { - -- dragonbone staff - itemid = 7430, - type = WEAPON_CLUB, - level = 30, - unproperly = true, - }, - { - -- blessed sceptre - itemid = 7429, - type = WEAPON_CLUB, - level = 75, - unproperly = true, - }, - { - -- bonebreaker - itemid = 7428, - type = WEAPON_CLUB, - level = 55, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- chaos mace - itemid = 7427, - type = WEAPON_CLUB, - level = 45, - unproperly = true, - }, - { - -- amber staff - itemid = 7426, - type = WEAPON_CLUB, - level = 40, - unproperly = true, - }, - { - -- taurus mace - itemid = 7425, - type = WEAPON_CLUB, - level = 20, - unproperly = true, - }, - { - -- lunar staff - itemid = 7424, - type = WEAPON_CLUB, - level = 30, - unproperly = true, - }, - { - -- skullcrusher - itemid = 7423, - type = WEAPON_CLUB, - level = 85, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- jade hammer - itemid = 7422, - type = WEAPON_CLUB, - level = 70, - unproperly = true, - }, - { - -- onyx flail - itemid = 7421, - type = WEAPON_CLUB, - level = 65, - unproperly = true, - }, - { - -- reaper's axe - itemid = 7420, - type = WEAPON_AXE, - level = 70, - unproperly = true, - }, - { - -- dreaded cleaver - itemid = 7419, - type = WEAPON_AXE, - level = 40, - unproperly = true, - }, - { - -- nightmare blade - itemid = 7418, - type = WEAPON_SWORD, - level = 70, - unproperly = true, - }, - { - -- runed sword - itemid = 7417, - type = WEAPON_SWORD, - level = 65, - unproperly = true, - }, - { - -- bloody edge - itemid = 7416, - type = WEAPON_SWORD, - level = 55, - unproperly = true, - }, - { - -- cranial basher - itemid = 7415, - type = WEAPON_CLUB, - level = 60, - unproperly = true, - }, - { - -- abyss hammer - itemid = 7414, - type = WEAPON_CLUB, - level = 60, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- titan axe - itemid = 7413, - type = WEAPON_AXE, - level = 40, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- butcher's axe - itemid = 7412, - type = WEAPON_AXE, - level = 45, - unproperly = true, - }, - { - -- ornamented axe - itemid = 7411, - type = WEAPON_AXE, - level = 50, - unproperly = true, - }, - { - -- queen's sceptre - itemid = 7410, - type = WEAPON_CLUB, - level = 55, - unproperly = true, - }, - { - -- northern star - itemid = 7409, - type = WEAPON_CLUB, - level = 50, - unproperly = true, - }, - { - -- wyvern fang - itemid = 7408, - type = WEAPON_SWORD, - level = 25, - unproperly = true, - }, - { - -- haunted blade - itemid = 7407, - type = WEAPON_SWORD, - level = 30, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- blacksteel sword - itemid = 7406, - type = WEAPON_SWORD, - level = 35, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- havoc blade - itemid = 7405, - type = WEAPON_SWORD, - level = 70, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- assassin dagger - itemid = 7404, - type = WEAPON_SWORD, - level = 40, - unproperly = true, - }, - { - -- berserker - itemid = 7403, - type = WEAPON_SWORD, - level = 65, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- dragon slayer - itemid = 7402, - type = WEAPON_SWORD, - level = 45, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- orcish maul - itemid = 7392, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - }, - { - -- thaian sword - itemid = 7391, - type = WEAPON_SWORD, - level = 50, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- the justice seeker - itemid = 7390, - type = WEAPON_SWORD, - level = 75, - unproperly = true, - }, - { - -- heroic axe - itemid = 7389, - type = WEAPON_AXE, - level = 60, - unproperly = true, - }, - { - -- vile axe - itemid = 7388, - type = WEAPON_AXE, - level = 55, - unproperly = true, - }, - { - -- diamond sceptre - itemid = 7387, - type = WEAPON_CLUB, - level = 25, - unproperly = true, - }, - { - -- mercenary sword - itemid = 7386, - type = WEAPON_SWORD, - level = 40, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crimson sword - itemid = 7385, - type = WEAPON_SWORD, - level = 20, - unproperly = true, - }, - { - -- mystic blade - itemid = 7384, - type = WEAPON_SWORD, - level = 60, - unproperly = true, - }, - { - -- relic sword - itemid = 7383, - type = WEAPON_SWORD, - level = 50, - unproperly = true, - }, - { - -- demonrage sword - itemid = 7382, - type = WEAPON_SWORD, - level = 60, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- mammoth whopper - itemid = 7381, - type = WEAPON_CLUB, - level = 20, - unproperly = true, - }, - { - -- headchopper - itemid = 7380, - type = WEAPON_AXE, - level = 35, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- brutetamer's staff - itemid = 7379, - type = WEAPON_CLUB, - level = 25, - unproperly = true, - }, - { - -- royal spear - itemid = 7378, - type = WEAPON_DISTANCE, - level = 25, - unproperly = true, - breakchance = 3, - }, - { - -- assassin star - itemid = 7368, - type = WEAPON_DISTANCE, - level = 80, - unproperly = true, - breakchance = 33, - }, - { - -- enchanted spear - itemid = 7367, - type = WEAPON_DISTANCE, - level = 42, - unproperly = true, - breakchance = 1, - }, - { - -- onyx arrow - itemid = 7365, - type = WEAPON_AMMO, - level = 40, - unproperly = true, - action = "removecount", - }, - { - -- sniper arrow - itemid = 7364, - type = WEAPON_AMMO, - level = 20, - unproperly = true, - action = "removecount", - }, - { - -- piercing bolt - itemid = 7363, - type = WEAPON_AMMO, - level = 30, - unproperly = true, - action = "removecount", - }, - { - -- ruthless axe - itemid = 6553, - type = WEAPON_AXE, - level = 75, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- infernal bolt - itemid = 6528, - type = WEAPON_AMMO, - level = 110, - unproperly = true, - action = "removecount", - }, - { - -- the avenger - itemid = 6527, - type = WEAPON_SWORD, - level = 75, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- Ron the Ripper's sabre - itemid = 6101, - type = WEAPON_SWORD, - }, - { - -- arbalest - itemid = 5803, - type = WEAPON_DISTANCE, - level = 75, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- banana staff - itemid = 3348, - type = WEAPON_CLUB, - }, - { - -- hunting spear - itemid = 3347, - type = WEAPON_DISTANCE, - level = 20, - unproperly = true, - breakchance = 6, - }, - { - -- ripper lance - itemid = 3346, - type = WEAPON_AXE, - }, - { - -- templar scytheblade - itemid = 3345, - type = WEAPON_SWORD, - }, - { - -- beastslayer axe - itemid = 3344, - type = WEAPON_AXE, - level = 30, - unproperly = true, - }, - { - -- lich staff - itemid = 3343, - type = WEAPON_CLUB, - level = 40, - unproperly = true, - }, - { - -- scythe - itemid = 3453, - type = WEAPON_CLUB, - }, - { - -- power bolt - itemid = 3450, - type = WEAPON_AMMO, - level = 55, - unproperly = true, - action = "removecount", - }, - { - -- arrow - itemid = 3447, - type = WEAPON_AMMO, - action = "removecount", - }, - { - -- bolt - itemid = 3446, - type = WEAPON_AMMO, - action = "removecount", - }, - { - -- bow - itemid = 3350, - type = WEAPON_DISTANCE, - }, - { - -- crossbow - itemid = 3349, - type = WEAPON_DISTANCE, - }, - { - -- war axe - itemid = 3342, - type = WEAPON_AXE, - level = 65, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- arcane staff - itemid = 3341, - type = WEAPON_CLUB, - level = 75, - unproperly = true, - }, - { - -- heavy mace - itemid = 3340, - type = WEAPON_CLUB, - level = 70, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- djinn blade - itemid = 3339, - type = WEAPON_SWORD, - level = 35, - unproperly = true, - }, - { - -- bone sword - itemid = 3338, - type = WEAPON_SWORD, - }, - { - -- bone club - itemid = 3337, - type = WEAPON_CLUB, - }, - { - -- studded club - itemid = 3336, - type = WEAPON_CLUB, - }, - { - -- twin axe - itemid = 3335, - type = WEAPON_AXE, - level = 50, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- pharaoh sword - itemid = 3334, - type = WEAPON_SWORD, - level = 45, - unproperly = true, - }, - { - -- crystal mace - itemid = 3333, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - }, - { - -- hammer of wrath - itemid = 3332, - type = WEAPON_CLUB, - level = 65, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- ravager's axe - itemid = 3331, - type = WEAPON_AXE, - level = 70, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- heavy machete - itemid = 3330, - type = WEAPON_SWORD, - }, - { - -- daramian axe - itemid = 3329, - type = WEAPON_AXE, - }, - { - -- daramian waraxe - itemid = 3328, - type = WEAPON_AXE, - level = 25, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- daramian mace - itemid = 3327, - type = WEAPON_CLUB, - }, - { - -- epee - itemid = 3326, - type = WEAPON_SWORD, - level = 30, - unproperly = true, - }, - { - -- light mace - itemid = 3325, - type = WEAPON_CLUB, - }, - { - -- skull staff - itemid = 3324, - type = WEAPON_CLUB, - level = 30, - unproperly = true, - }, - { - -- dwarven axe - itemid = 3323, - type = WEAPON_AXE, - level = 20, - unproperly = true, - }, - { - -- dragon hammer - itemid = 3322, - type = WEAPON_CLUB, - level = 25, - unproperly = true, - }, - { - -- enchanted staff - itemid = 3321, - type = WEAPON_CLUB, - }, - { - -- fire axe - itemid = 3320, - type = WEAPON_AXE, - level = 35, - unproperly = true, - }, - { - -- stonecutter axe - itemid = 3319, - type = WEAPON_AXE, - level = 90, - unproperly = true, - }, - { - -- knight axe - itemid = 3318, - type = WEAPON_AXE, - level = 25, - unproperly = true, - }, - { - -- barbarian axe - itemid = 3317, - type = WEAPON_AXE, - level = 20, - unproperly = true, - }, - { - -- orcish axe - itemid = 3316, - type = WEAPON_AXE, - }, - { - -- guardian halberd - itemid = 3315, - type = WEAPON_AXE, - level = 55, - unproperly = true, - }, - { - -- naginata - itemid = 3314, - type = WEAPON_AXE, - level = 25, - unproperly = true, - }, - { - -- obsidian lance - itemid = 3313, - type = WEAPON_AXE, - level = 20, - unproperly = true, - }, - { - -- silver mace - itemid = 3312, - type = WEAPON_CLUB, - level = 45, - unproperly = true, - }, - { - -- clerical mace - itemid = 3311, - type = WEAPON_CLUB, - level = 20, - unproperly = true, - }, - { - -- iron hammer - itemid = 3310, - type = WEAPON_CLUB, - }, - { - -- thunder hammer - itemid = 3309, - type = WEAPON_CLUB, - level = 85, - unproperly = true, - }, - { - -- machete - itemid = 3308, - type = WEAPON_SWORD, - }, - { - -- scimitar - itemid = 3307, - type = WEAPON_SWORD, - }, - { - -- golden sickle - itemid = 3306, - type = WEAPON_AXE, - }, - { - -- battle hammer - itemid = 3305, - type = WEAPON_CLUB, - }, - { - -- crowbar - itemid = 3304, - type = WEAPON_CLUB, - }, - { - -- great axe - itemid = 3303, - type = WEAPON_AXE, - level = 95, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- dragon lance - itemid = 3302, - type = WEAPON_AXE, - level = 60, - unproperly = true, - }, - { - -- broadsword - itemid = 3301, - type = WEAPON_SWORD, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- katana - itemid = 3300, - type = WEAPON_SWORD, - }, - { - -- poison dagger - itemid = 3299, - type = WEAPON_SWORD, - }, - { - -- throwing knife - itemid = 3298, - type = WEAPON_DISTANCE, - breakchance = 7, - }, - { - -- serpent sword - itemid = 3297, - type = WEAPON_SWORD, - }, - { - -- warlord sword - itemid = 3296, - type = WEAPON_SWORD, - level = 120, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- bright sword - itemid = 3295, - type = WEAPON_SWORD, - level = 30, - unproperly = true, - }, - { - -- short sword - itemid = 3294, - type = WEAPON_SWORD, - }, - { - -- sickle - itemid = 3293, - type = WEAPON_AXE, - }, - { - -- combat knife - itemid = 3292, - type = WEAPON_SWORD, - }, - { - -- knife - itemid = 3291, - type = WEAPON_SWORD, - }, - { - -- silver dagger - itemid = 3290, - type = WEAPON_SWORD, - }, - { - -- staff - itemid = 3289, - type = WEAPON_CLUB, - }, - { - -- magic sword - itemid = 3288, - type = WEAPON_SWORD, - level = 80, - unproperly = true, - }, - { - -- throwing star - itemid = 3287, - type = WEAPON_DISTANCE, - breakchance = 10, - }, - { - -- mace - itemid = 3286, - type = WEAPON_CLUB, - }, - { - -- longsword - itemid = 3285, - type = WEAPON_SWORD, - }, - { - -- ice rapier - itemid = 3284, - type = WEAPON_SWORD, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- carlin sword - itemid = 3283, - type = WEAPON_SWORD, - }, - { - -- morning star - itemid = 3282, - type = WEAPON_CLUB, - }, - { - -- giant sword - itemid = 3281, - type = WEAPON_SWORD, - level = 55, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fire sword - itemid = 3280, - type = WEAPON_SWORD, - level = 30, - unproperly = true, - }, - { - -- war hammer - itemid = 3279, - type = WEAPON_CLUB, - level = 50, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- magic longsword - itemid = 3278, - type = WEAPON_SWORD, - level = 140, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- spear - itemid = 3277, - type = WEAPON_DISTANCE, - breakchance = 3, - }, - { - -- hatchet - itemid = 3276, - type = WEAPON_AXE, - }, - { - -- double axe - itemid = 3275, - type = WEAPON_AXE, - level = 25, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- axe - itemid = 3274, - type = WEAPON_AXE, - }, - { - -- sabre - itemid = 3273, - type = WEAPON_SWORD, - }, - { - -- rapier - itemid = 3272, - type = WEAPON_SWORD, - }, - { - -- spike sword - itemid = 3271, - type = WEAPON_SWORD, - }, - { - -- club - itemid = 3270, - type = WEAPON_CLUB, - }, - { - -- halberd - itemid = 3269, - type = WEAPON_AXE, - level = 25, - unproperly = true, - }, - { - -- hand axe - itemid = 3268, - type = WEAPON_AXE, - }, - { - -- dagger - itemid = 3267, - type = WEAPON_SWORD, - }, - { - -- battle axe - itemid = 3266, - type = WEAPON_AXE, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- two handed sword - itemid = 3265, - type = WEAPON_SWORD, - level = 20, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sword - itemid = 3264, - type = WEAPON_SWORD, - }, - { - -- giant smithhammer - itemid = 12510, - type = WEAPON_CLUB, - }, - { - -- wand of dragonbreath - itemid = 3075, - type = WEAPON_WAND, - wandType = "fire", - level = 13, - mana = 3, - damage = { 13, 25 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of vortex - itemid = 3074, - type = WEAPON_WAND, - wandType = "energy", - level = 6, - mana = 1, - damage = { 8, 18 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of cosmic energy - itemid = 3073, - type = WEAPON_WAND, - wandType = "energy", - level = 26, - mana = 8, - damage = { 37, 53 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of decay - itemid = 3072, - type = WEAPON_WAND, - wandType = "death", - level = 19, - mana = 5, - damage = { 23, 37 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of inferno - itemid = 3071, - type = WEAPON_WAND, - wandType = "fire", - level = 33, - mana = 8, - damage = { 56, 74 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- moonlight rod - itemid = 3070, - type = WEAPON_WAND, - wandType = "ice", - level = 13, - mana = 3, - damage = { 13, 25 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- necrotic rod - itemid = 3069, - type = WEAPON_WAND, - wandType = "death", - level = 19, - mana = 5, - damage = { 23, 37 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- hailstorm rod - itemid = 3067, - type = WEAPON_WAND, - wandType = "ice", - level = 33, - mana = 13, - damage = { 56, 74 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- snakebit rod - itemid = 3066, - type = WEAPON_WAND, - wandType = "earth", - level = 6, - mana = 2, - damage = { 8, 18 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- terra rod - itemid = 3065, - type = WEAPON_WAND, - wandType = "earth", - level = 26, - mana = 8, - damage = { 37, 53 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- snowball - itemid = 2992, - type = WEAPON_DISTANCE, - action = "removecount", - }, - { - -- small stone - itemid = 1781, - type = WEAPON_DISTANCE, - breakchance = 3, - }, -} - -for _, w in ipairs(weapons) do - local weapon = Weapon(w.type) - weapon:id(w.itemid) - - if w.action then - weapon:action(w.action) - end - if w.breakchance then - weapon:breakChance(w.breakchance) - end - if w.level then - weapon:level(w.level) - end - if w.mana then - weapon:mana(w.mana) - end - if w.unproperly then - weapon:wieldUnproperly(w.unproperly) - end - if w.damage then - weapon:damage(w.damage[1], w.damage[2]) - end - if w.wandType then - weapon:element(w.wandType) - end - if w.vocation then - for _, v in ipairs(w.vocation) do - weapon:vocation(v[1], v[2] or false, v[3] or false) - end - end - - weapon:register() -end diff --git a/data-otservbr-global/lib/core/storages.lua b/data-otservbr-global/lib/core/storages.lua index e67b5331c4c..69f1d7f7948 100644 --- a/data-otservbr-global/lib/core/storages.lua +++ b/data-otservbr-global/lib/core/storages.lua @@ -103,7 +103,7 @@ Storage = { Factions = 30024, -- unused TrainerRoom = 30027, -- unused NpcSpawn = 30028, - ExerciseDummyExhaust = 30029, + -- unused ExerciseDummyExhaust = 30029, SamsOldBackpack = 30030, SamsOldBackpackDoor = 30031, StrawberryCupcake = 30032, @@ -131,7 +131,6 @@ Storage = { -- Reserved in Global.Storage.FamiliarSummonEvent60 = 30055 ChayenneKeyTime = 30056, FreeQuests = 30057, - PremiumAccount = 30058, BattleAxeQuest = 30059, ShrineEntrance = 30060, PlayerWeaponReward = 30061, @@ -818,11 +817,6 @@ Storage = { -- Until all outfit quests are completed DefaultStart = 50960, Ref = 50961, - Afflicted = { - Outfit = 50962, - AddonPlagueMask = 50963, - AddonPlagueBell = 50964, - }, Citizen = { -- Mission storages for temporary questlog entries MissionHat = 50966, @@ -2111,12 +2105,15 @@ Storage = { JumpTimer = 41841, }, VampireHunter = {}, + TheMutatedPumpkin = { + Skinned = 41860, + }, }, U8_4 = { -- update 8.4 - Reserved Storages 41901 - 42145 BloodBrothers = { QuestLine = 41901, Mission01 = 41902, - GarlicBread = 41903, + -- unused GarlicBread = 41903, Mission02 = 41904, Cookies = { Serafin = 41905, @@ -2415,7 +2412,6 @@ Storage = { TheColoursOfMagic = {}, }, U9_1 = { --update 9.1 - Reserved Storages 43351 - 43550 - AfflictedOutfits = {}, AwashWorldChange = {}, DemonWarsWorldChange = {}, ElementalistOutfits = {}, @@ -2921,7 +2917,6 @@ Storage = { }, VipSystem = { - IsVip = 150001, OnlineCoinsGain = 150002, OnlineTokensGain = 150003, }, @@ -3073,11 +3068,18 @@ GlobalStorage = { AftershockStage = 60176, RuptureResonanceStage = 60177, RuptureResonanceActive = 60178, - EradicatorWeak = 60178, - EradicatorReleaseT = 60179, - OutburstStage = 60180, - OutburstHealth = 60181, - OutburstChargingKilled = 60182, + EradicatorWeak = 60179, + EradicatorReleaseT = 60180, + OutburstStage = 60181, + OutburstHealth = 60182, + OutburstChargingKilled = 60183, + }, + WorldBoard = { + NightmareIsle = { + AnkrahmunNorth = 60191, + DarashiaNorth = 60192, + DarashiaWest = 60193, + }, }, FuryGates = 65000, Yakchal = 65001, @@ -3085,15 +3087,14 @@ GlobalStorage = { NaginataStone = 65003, ExpBoost = 65004, SwordOfFury = 65005, + GloothFairyTimer = 65006, LionsRockFields = 65007, TheMummysCurse = 65008, OberonEventTime = 65009, PrinceDrazzakEventTime = 65010, ScarlettEtzelEventTime = 65011, - CobraBastionFlask = 65012, Inquisition = 65013, Yasir = 65014, - NightmareIsle = 65015, IceCrack = 65016, UglyMonster = 65017, KeysUpdate = 40000, -- Reserved storage from 40000 - 40000 diff --git a/data-otservbr-global/lib/others/vip_system.lua b/data-otservbr-global/lib/others/vip_system.lua index ca2aa3559f8..5a393157c8c 100644 --- a/data-otservbr-global/lib/others/vip_system.lua +++ b/data-otservbr-global/lib/others/vip_system.lua @@ -3,7 +3,7 @@ local config = { activationMessageType = MESSAGE_EVENT_ADVANCE, expirationMessage = "Your VIP days ran out.", - expirationMessageType = MESSAGE_STATUS_WARNING, + expirationMessageType = MESSAGE_ADMINISTRATOR, outfits = {}, mounts = {}, @@ -31,7 +31,7 @@ function Player.onRemoveVip(self) self:setOutfit(playerOutfit) end - self:setStorageValue(Storage.VipSystem.IsVip, 0) + self:kv():scoped("account"):remove("vip-system") end function Player.onAddVip(self, days, silent) @@ -47,7 +47,7 @@ function Player.onAddVip(self, days, silent) self:addMount(mount) end - self:setStorageValue(Storage.VipSystem.IsVip, 1) + self:kv():scoped("account"):set("vip-system", true) end function CheckPremiumAndPrint(player, msgType) diff --git a/data-otservbr-global/migrations/41.lua b/data-otservbr-global/migrations/41.lua index 179ac18b574..15eb1d88e99 100644 --- a/data-otservbr-global/migrations/41.lua +++ b/data-otservbr-global/migrations/41.lua @@ -3,8 +3,8 @@ function onUpdateDatabase() db.query([[ ALTER TABLE `players` - MODIFY `xpboost_stamina` smallint(5) UNSIGNED DEFAULT NULL, - MODIFY `xpboost_value` tinyint(4) UNSIGNED DEFAULT NULL + MODIFY `xpboost_stamina` smallint(5) UNSIGNED DEFAULT NULL, + MODIFY `xpboost_value` tinyint(4) UNSIGNED DEFAULT NULL ]]) return true diff --git a/data-otservbr-global/migrations/43.lua b/data-otservbr-global/migrations/43.lua index 86a6d8ffec1..1464703c96e 100644 --- a/data-otservbr-global/migrations/43.lua +++ b/data-otservbr-global/migrations/43.lua @@ -1,3 +1,12 @@ function onUpdateDatabase() - return false -- true = There are others migrations file | false = this is the last migration file + logger.info("Updating database to version 43 (feat frags_limit, payment and duration_days in guild wars)") + + db.query([[ + ALTER TABLE `guild_wars` + ADD `frags_limit` smallint(4) UNSIGNED NOT NULL DEFAULT '0', + ADD `payment` bigint(13) UNSIGNED NOT NULL DEFAULT '0', + ADD `duration_days` tinyint(3) UNSIGNED NOT NULL DEFAULT '0' + ]]) + + return true end diff --git a/data-otservbr-global/migrations/44.lua b/data-otservbr-global/migrations/44.lua new file mode 100644 index 00000000000..86a6d8ffec1 --- /dev/null +++ b/data-otservbr-global/migrations/44.lua @@ -0,0 +1,3 @@ +function onUpdateDatabase() + return false -- true = There are others migrations file | false = this is the last migration file +end diff --git a/data-otservbr-global/monster/bosses/elvira_hammerthrust.lua b/data-otservbr-global/monster/bosses/elvira_hammerthrust.lua new file mode 100644 index 00000000000..72d497ae312 --- /dev/null +++ b/data-otservbr-global/monster/bosses/elvira_hammerthrust.lua @@ -0,0 +1,109 @@ +local mType = Game.createMonsterType("Elvira Hammerthrust") +local monster = {} + +monster.description = "Elvira Hammerthrust" +monster.experience = 165 +monster.outfit = { + lookType = 70, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.bosstiary = { + bossRaceId = 766, + bossRace = RARITY_NEMESIS, +} + +monster.health = 245 +monster.maxHealth = 245 +monster.race = "blood" +monster.corpse = 6013 +monster.speed = 103 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 10, +} + +monster.strategiesTarget = { + nearest = 70, + damage = 20, + random = 10, +} + +monster.flags = { + summonable = false, + attackable = true, + hostile = true, + convinceable = false, + pushable = false, + rewardBoss = false, + illusionable = true, + canPushItems = true, + canPushCreatures = true, + staticAttackChance = 90, + targetDistance = 1, + runHealth = 0, + healthHidden = false, + isBlockable = false, + canWalkOnEnergy = false, + canWalkOnFire = false, + canWalkOnPoison = false, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "Didn't think a dwarf girl could be so pretty and strong at the same time, did you?", yell = false }, + { text = "Hail no one except for me!", yell = false }, + { text = "You won't get this bag, I worked hard for this!", yell = false }, + { text = "Keep your hands off!", yell = false }, + { text = "How did you find us?!", yell = false }, +} + +monster.loot = { + { name = "bag with stolen gold", chance = 100000 }, + { name = "platinum coin", chance = 75000, maxCount = 100 }, +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -140 }, +} + +monster.defenses = { + defense = 30, + armor = 15, + mitigation = 1.02, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 20 }, + { type = COMBAT_ENERGYDAMAGE, percent = 0 }, + { type = COMBAT_EARTHDAMAGE, percent = 20 }, + { type = COMBAT_FIREDAMAGE, percent = -5 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = 0 }, + { type = COMBAT_HOLYDAMAGE, percent = 0 }, + { type = COMBAT_DEATHDAMAGE, percent = -5 }, +} + +monster.immunities = { + { type = "paralyze", condition = false }, + { type = "outfit", condition = false }, + { type = "invisible", condition = true }, + { type = "bleed", condition = false }, +} + +mType:register(monster) diff --git a/data-otservbr-global/monster/bosses/jesse_the_wicked.lua b/data-otservbr-global/monster/bosses/jesse_the_wicked.lua index e4052189eaf..2d5091241d5 100644 --- a/data-otservbr-global/monster/bosses/jesse_the_wicked.lua +++ b/data-otservbr-global/monster/bosses/jesse_the_wicked.lua @@ -43,7 +43,7 @@ monster.flags = { hostile = true, convinceable = false, pushable = false, - rewardBoss = true, + rewardBoss = false, illusionable = false, canPushItems = true, canPushCreatures = false, @@ -107,18 +107,4 @@ monster.immunities = { { type = "bleed", condition = false }, } -mType.onThink = function(monster, interval) end - -mType.onAppear = function(monster, creature) - if monster:getType():isRewardBoss() then - monster:setReward(true) - end -end - -mType.onDisappear = function(monster, creature) end - -mType.onMove = function(monster, creature, fromPosition, toPosition) end - -mType.onSay = function(monster, creature, type, message) end - mType:register(monster) diff --git a/data-otservbr-global/monster/bosses/mornenion.lua b/data-otservbr-global/monster/bosses/mornenion.lua new file mode 100644 index 00000000000..3cc1167b3f6 --- /dev/null +++ b/data-otservbr-global/monster/bosses/mornenion.lua @@ -0,0 +1,108 @@ +local mType = Game.createMonsterType("Mornenion") +local monster = {} + +monster.description = "Mornenion" +monster.experience = 115 +monster.outfit = { + lookType = 64, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.bosstiary = { + bossRaceId = 765, + bossRace = RARITY_NEMESIS, +} + +monster.health = 190 +monster.maxHealth = 190 +monster.race = "blood" +monster.corpse = 6012 +monster.speed = 110 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 10, +} + +monster.strategiesTarget = { + nearest = 100, +} + +monster.flags = { + summonable = false, + attackable = true, + hostile = true, + convinceable = false, + pushable = false, + rewardBoss = false, + illusionable = false, + canPushItems = true, + canPushCreatures = false, + staticAttackChance = 90, + targetDistance = 4, + runHealth = 0, + healthHidden = false, + isBlockable = false, + canWalkOnEnergy = true, + canWalkOnFire = true, + canWalkOnPoison = true, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "Come on, you don't really need this. Just let me go.", yell = false }, + { text = "Let us leave safely and maybe we'll give you a few coins.", yell = false }, + { text = "That cowardish dwarven bank keeper ran when he saw the three of us.", yell = false }, + { text = "You humans have enough to spare. We live in poverty.", yell = false }, +} + +monster.loot = { + { name = "bag with stolen gold", chance = 100000 }, + { name = "platinum coin", chance = 75000, maxCount = 100 }, +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -30 }, + { name = "combat", interval = 2000, chance = 15, type = COMBAT_PHYSICALDAMAGE, minDamage = 0, maxDamage = -80, range = 7, shootEffect = CONST_ANI_ARROW, target = false }, +} + +monster.defenses = { + defense = 10, + armor = 7, + mitigation = 0.46, + { name = "combat", interval = 5000, chance = 7, type = COMBAT_HEALING, minDamage = 25, maxDamage = 35, effect = CONST_ME_MAGIC_BLUE, target = false }, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 0 }, + { type = COMBAT_ENERGYDAMAGE, percent = 0 }, + { type = COMBAT_EARTHDAMAGE, percent = 0 }, + { type = COMBAT_FIREDAMAGE, percent = 0 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = 0 }, + { type = COMBAT_HOLYDAMAGE, percent = 0 }, + { type = COMBAT_DEATHDAMAGE, percent = 0 }, +} + +monster.immunities = { + { type = "paralyze", condition = false }, + { type = "outfit", condition = false }, + { type = "invisible", condition = true }, + { type = "bleed", condition = false }, +} + +mType:register(monster) diff --git a/data-otservbr-global/monster/bosses/robby_the_reckless.lua b/data-otservbr-global/monster/bosses/robby_the_reckless.lua index 0eb6fd3d4c3..bc1053c1f2c 100644 --- a/data-otservbr-global/monster/bosses/robby_the_reckless.lua +++ b/data-otservbr-global/monster/bosses/robby_the_reckless.lua @@ -43,7 +43,7 @@ monster.flags = { hostile = true, convinceable = false, pushable = false, - rewardBoss = true, + rewardBoss = false, illusionable = false, canPushItems = true, canPushCreatures = false, @@ -106,18 +106,4 @@ monster.immunities = { { type = "bleed", condition = false }, } -mType.onThink = function(monster, interval) end - -mType.onAppear = function(monster, creature) - if monster:getType():isRewardBoss() then - monster:setReward(true) - end -end - -mType.onDisappear = function(monster, creature) end - -mType.onMove = function(monster, creature, fromPosition, toPosition) end - -mType.onSay = function(monster, creature, type, message) end - mType:register(monster) diff --git a/data-otservbr-global/monster/quests/ferumbras_ascendant/bosses/mazoran.lua b/data-otservbr-global/monster/quests/ferumbras_ascendant/bosses/mazoran.lua index 1a25d435223..9bc02481292 100644 --- a/data-otservbr-global/monster/quests/ferumbras_ascendant/bosses/mazoran.lua +++ b/data-otservbr-global/monster/quests/ferumbras_ascendant/bosses/mazoran.lua @@ -47,7 +47,7 @@ monster.flags = { hostile = true, convinceable = false, pushable = false, - rewardBoss = true, + rewardBoss = false, illusionable = false, canPushItems = true, canPushCreatures = true, diff --git a/data-otservbr-global/monster/quests/the_inquisition/annihilon.lua b/data-otservbr-global/monster/quests/the_inquisition/annihilon.lua index 26013b74ece..ab090635985 100644 --- a/data-otservbr-global/monster/quests/the_inquisition/annihilon.lua +++ b/data-otservbr-global/monster/quests/the_inquisition/annihilon.lua @@ -47,7 +47,7 @@ monster.flags = { hostile = true, convinceable = false, pushable = false, - rewardBoss = true, + rewardBoss = false, illusionable = false, canPushItems = true, canPushCreatures = true, diff --git a/data-otservbr-global/monster/quests/the_inquisition/golgordan.lua b/data-otservbr-global/monster/quests/the_inquisition/golgordan.lua index 59a74148ed6..0b1f03bbb04 100644 --- a/data-otservbr-global/monster/quests/the_inquisition/golgordan.lua +++ b/data-otservbr-global/monster/quests/the_inquisition/golgordan.lua @@ -47,7 +47,7 @@ monster.flags = { hostile = true, convinceable = false, pushable = false, - rewardBoss = true, + rewardBoss = false, illusionable = false, canPushItems = true, canPushCreatures = true, diff --git a/data-otservbr-global/monster/quests/the_inquisition/hellgorak.lua b/data-otservbr-global/monster/quests/the_inquisition/hellgorak.lua index 79209cb8560..000f46156f5 100644 --- a/data-otservbr-global/monster/quests/the_inquisition/hellgorak.lua +++ b/data-otservbr-global/monster/quests/the_inquisition/hellgorak.lua @@ -47,7 +47,7 @@ monster.flags = { hostile = true, convinceable = false, pushable = false, - rewardBoss = true, + rewardBoss = false, illusionable = false, canPushItems = true, canPushCreatures = true, diff --git a/data-otservbr-global/monster/quests/the_inquisition/madareth.lua b/data-otservbr-global/monster/quests/the_inquisition/madareth.lua index 66caf4329f5..91201479504 100644 --- a/data-otservbr-global/monster/quests/the_inquisition/madareth.lua +++ b/data-otservbr-global/monster/quests/the_inquisition/madareth.lua @@ -47,7 +47,7 @@ monster.flags = { hostile = true, convinceable = false, pushable = false, - rewardBoss = true, + rewardBoss = false, illusionable = false, canPushItems = true, canPushCreatures = true, diff --git a/data-otservbr-global/monster/quests/the_inquisition/the_count.lua b/data-otservbr-global/monster/quests/the_inquisition/the_count.lua index 61433ce02b8..48951c81379 100644 --- a/data-otservbr-global/monster/quests/the_inquisition/the_count.lua +++ b/data-otservbr-global/monster/quests/the_inquisition/the_count.lua @@ -38,7 +38,7 @@ monster.flags = { hostile = true, convinceable = false, pushable = false, - rewardBoss = true, + rewardBoss = false, illusionable = false, canPushItems = true, canPushCreatures = true, diff --git a/data-otservbr-global/monster/quests/the_inquisition/ungreez.lua b/data-otservbr-global/monster/quests/the_inquisition/ungreez.lua index f2308c8c9a3..ee7a79647d5 100644 --- a/data-otservbr-global/monster/quests/the_inquisition/ungreez.lua +++ b/data-otservbr-global/monster/quests/the_inquisition/ungreez.lua @@ -42,7 +42,7 @@ monster.flags = { hostile = true, convinceable = false, pushable = false, - rewardBoss = true, + rewardBoss = false, illusionable = false, canPushItems = true, canPushCreatures = true, diff --git a/data-otservbr-global/monster/quests/the_inquisition/zugurosh.lua b/data-otservbr-global/monster/quests/the_inquisition/zugurosh.lua index fedf47e5fe1..990d93c1324 100644 --- a/data-otservbr-global/monster/quests/the_inquisition/zugurosh.lua +++ b/data-otservbr-global/monster/quests/the_inquisition/zugurosh.lua @@ -47,7 +47,7 @@ monster.flags = { hostile = true, convinceable = false, pushable = false, - rewardBoss = true, + rewardBoss = false, illusionable = false, canPushItems = true, canPushCreatures = true, diff --git a/data-otservbr-global/monster/quests/the_secret_library/bosses/grand_master_oberon_functions.lua b/data-otservbr-global/monster/quests/the_secret_library/bosses/grand_master_oberon_functions.lua index 86714879320..af9c6f0218a 100644 --- a/data-otservbr-global/monster/quests/the_secret_library/bosses/grand_master_oberon_functions.lua +++ b/data-otservbr-global/monster/quests/the_secret_library/bosses/grand_master_oberon_functions.lua @@ -24,7 +24,7 @@ GrandMasterOberonResponses = { [6] = { msg = "Excuse me but I still do not get the message!", msg2 = oberonOthersMessages[2] }, [7] = { msg = "Dare strike up a Minnesang and you will receive your last accolade!", msg2 = oberonOthersMessages[1] }, [8] = { msg = "Then why are we fighting alone right now?", msg2 = oberonOthersMessages[2] }, - [9] = { msg = "SEHWO ASIMO, TOLIDO ESD", msg2 = oberonOthersMessages[2] }, + [9] = { msg = "SEHWO ASIMO, TOLIDO ESD!", msg2 = oberonOthersMessages[2] }, } GrandMasterOberonConfig = { diff --git a/data-otservbr-global/npc/a_fluffy_squirrel.lua b/data-otservbr-global/npc/a_fluffy_squirrel.lua index 22f3b17aa67..d246e0e5579 100644 --- a/data-otservbr-global/npc/a_fluffy_squirrel.lua +++ b/data-otservbr-global/npc/a_fluffy_squirrel.lua @@ -34,7 +34,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/ahmet.lua b/data-otservbr-global/npc/ahmet.lua index 5e2574bd870..3cb712f088e 100644 --- a/data-otservbr-global/npc/ahmet.lua +++ b/data-otservbr-global/npc/ahmet.lua @@ -61,7 +61,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/al_dee.lua b/data-otservbr-global/npc/al_dee.lua index 19b9b40aa32..5ecaf2ceee7 100644 --- a/data-otservbr-global/npc/al_dee.lua +++ b/data-otservbr-global/npc/al_dee.lua @@ -49,7 +49,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/alaistar.lua b/data-otservbr-global/npc/alaistar.lua index 07bf107650e..e893975b24b 100644 --- a/data-otservbr-global/npc/alaistar.lua +++ b/data-otservbr-global/npc/alaistar.lua @@ -73,7 +73,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/albinius.lua b/data-otservbr-global/npc/albinius.lua index 6ca0b84020d..ca04c785848 100644 --- a/data-otservbr-global/npc/albinius.lua +++ b/data-otservbr-global/npc/albinius.lua @@ -32,7 +32,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/aldo.lua b/data-otservbr-global/npc/aldo.lua index d04c54a4104..6206a448980 100644 --- a/data-otservbr-global/npc/aldo.lua +++ b/data-otservbr-global/npc/aldo.lua @@ -48,7 +48,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/alesar.lua b/data-otservbr-global/npc/alesar.lua index 365c116843d..ca38fe37ac1 100644 --- a/data-otservbr-global/npc/alesar.lua +++ b/data-otservbr-global/npc/alesar.lua @@ -53,7 +53,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/alexander.lua b/data-otservbr-global/npc/alexander.lua index 522a43da1d1..78f51e486c8 100644 --- a/data-otservbr-global/npc/alexander.lua +++ b/data-otservbr-global/npc/alexander.lua @@ -162,7 +162,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/alissa.lua b/data-otservbr-global/npc/alissa.lua index bd4eec50cf2..467c34b0118 100644 --- a/data-otservbr-global/npc/alissa.lua +++ b/data-otservbr-global/npc/alissa.lua @@ -77,7 +77,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/allen.lua b/data-otservbr-global/npc/allen.lua index a0e4bebe246..2421f752d87 100644 --- a/data-otservbr-global/npc/allen.lua +++ b/data-otservbr-global/npc/allen.lua @@ -87,7 +87,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/altar.lua b/data-otservbr-global/npc/altar.lua new file mode 100644 index 00000000000..057c1cb2c1a --- /dev/null +++ b/data-otservbr-global/npc/altar.lua @@ -0,0 +1,90 @@ +local internalNpcName = "Altar" +local npcType = Game.createNpcType(internalNpcName) +local npcConfig = {} + +npcConfig.name = internalNpcName +npcConfig.description = internalNpcName + +npcConfig.health = 100 +npcConfig.maxHealth = npcConfig.health +npcConfig.walkInterval = 0 +npcConfig.walkRadius = 0 + +npcConfig.outfit = { + lookTypeEx = 43845, +} + +npcConfig.flags = { + floorchange = false, +} + +local keywordHandler = KeywordHandler:new() +local npcHandler = NpcHandler:new(keywordHandler) + +npcType.onThink = function(npc, interval) + npcHandler:onThink(npc, interval) +end + +npcType.onAppear = function(npc, creature) + npcHandler:onAppear(npc, creature) +end + +npcType.onDisappear = function(npc, creature) + npcHandler:onDisappear(npc, creature) +end + +npcType.onMove = function(npc, creature, fromPosition, toPosition) + npcHandler:onMove(npc, creature, fromPosition, toPosition) +end + +npcType.onSay = function(npc, creature, type, message) + npcHandler:onSay(npc, creature, type, message) +end + +local function creatureSayCallback(npc, creature, type, message) + local player = Player(creature) + local playerId = player:getId() + + if not npcHandler:checkInteraction(npc, creature) then + return false + end + + message = message:lower() + if MsgContains(message, "kneel") then + npcHandler:say("Prepare your offer and cling to the sanctitity of this place.", npc, creature) + npcHandler:setTopic(playerId, 1) + elseif MsgContains(message, "offer") and npcHandler:getTopic(playerId) == 1 then + npcHandler:say("Five tainted hearts and five darklight hearts drowned in a worldly wealth of 50000000 gold pieces for the righteous. Are you prepared?", npc, creature) + npcHandler:setTopic(playerId, 2) + elseif MsgContains(message, "yes") and npcHandler:getTopic(playerId) == 2 then + npcHandler:setTopic(playerId, 0) + if player:getItemCount(43855) < 5 or player:getItemCount(43854) < 5 then + npcHandler:say("Sorry, you don't have all items.", npc, creature) + return true + end + + if not player:removeMoneyBank(50000000) then + npcHandler:say("Sorry, you don't have enough gold.", npc, creature) + return true + end + + if player:removeItem(43855, 5) and player:removeItem(43854, 5) then + player:addItem(BAG_YOU_COVET, 1) + npcHandler:say("Your sacrifice has been accepted, mortal. Embrace your reward!", npc, creature) + end + elseif MsgContains(message, "no") and npcHandler:getTopic(playerId) == 1 then + npcHandler:setTopic(playerId, 0) + npcHandler:say("Ok then not.", npc, creature) + end + + return true +end + +npcHandler:setMessage(MESSAGE_GREET, "Kneel before the all-devouring power of blooded decay.") +npcHandler:setMessage(MESSAGE_WALKAWAY, "Bye.") +npcHandler:setMessage(MESSAGE_FAREWELL, "Bye, |PLAYERNAME|.") + +npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) +npcHandler:addModule(FocusModule:new(), npcConfig.name, true, true, true) + +npcType:register(npcConfig) diff --git a/data-otservbr-global/npc/amra.lua b/data-otservbr-global/npc/amra.lua index 4493c46d544..cd88a462dad 100644 --- a/data-otservbr-global/npc/amra.lua +++ b/data-otservbr-global/npc/amra.lua @@ -63,7 +63,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/andrew_lyze.lua b/data-otservbr-global/npc/andrew_lyze.lua index 4bd6d3336ab..82b1f9a61ce 100644 --- a/data-otservbr-global/npc/andrew_lyze.lua +++ b/data-otservbr-global/npc/andrew_lyze.lua @@ -32,7 +32,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/anerui.lua b/data-otservbr-global/npc/anerui.lua index 5e046ad9c98..0b6382a2b6a 100644 --- a/data-otservbr-global/npc/anerui.lua +++ b/data-otservbr-global/npc/anerui.lua @@ -83,7 +83,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/angus.lua b/data-otservbr-global/npc/angus.lua index 14760035dfd..3f8d80f6b4c 100644 --- a/data-otservbr-global/npc/angus.lua +++ b/data-otservbr-global/npc/angus.lua @@ -678,7 +678,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/archery.lua b/data-otservbr-global/npc/archery.lua index 434695f56c9..fc5d37524f4 100644 --- a/data-otservbr-global/npc/archery.lua +++ b/data-otservbr-global/npc/archery.lua @@ -105,7 +105,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/archery_rook.lua b/data-otservbr-global/npc/archery_rook.lua index 192a389ca72..ddebed46042 100644 --- a/data-otservbr-global/npc/archery_rook.lua +++ b/data-otservbr-global/npc/archery_rook.lua @@ -75,7 +75,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/ariella.lua b/data-otservbr-global/npc/ariella.lua index f0935ea539a..35ff38f6621 100644 --- a/data-otservbr-global/npc/ariella.lua +++ b/data-otservbr-global/npc/ariella.lua @@ -197,7 +197,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/arito.lua b/data-otservbr-global/npc/arito.lua index 679783f3462..a885cc91e20 100644 --- a/data-otservbr-global/npc/arito.lua +++ b/data-otservbr-global/npc/arito.lua @@ -113,7 +113,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/arkulius.lua b/data-otservbr-global/npc/arkulius.lua index ca9d3f6cf9c..64abb564d17 100644 --- a/data-otservbr-global/npc/arkulius.lua +++ b/data-otservbr-global/npc/arkulius.lua @@ -203,7 +203,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/armenius.lua b/data-otservbr-global/npc/armenius.lua index 9216c33cc3a..045a53af2c8 100644 --- a/data-otservbr-global/npc/armenius.lua +++ b/data-otservbr-global/npc/armenius.lua @@ -108,7 +108,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/asima.lua b/data-otservbr-global/npc/asima.lua index 329683e1e34..645689c42d4 100644 --- a/data-otservbr-global/npc/asima.lua +++ b/data-otservbr-global/npc/asima.lua @@ -156,7 +156,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/asnarus.lua b/data-otservbr-global/npc/asnarus.lua index 97dfb7cdc79..a733d90834b 100644 --- a/data-otservbr-global/npc/asnarus.lua +++ b/data-otservbr-global/npc/asnarus.lua @@ -126,7 +126,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/asphota.lua b/data-otservbr-global/npc/asphota.lua index 29e6d9e5d3d..13e9b83f6c4 100644 --- a/data-otservbr-global/npc/asphota.lua +++ b/data-otservbr-global/npc/asphota.lua @@ -81,7 +81,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/atrad.lua b/data-otservbr-global/npc/atrad.lua index d28cba32024..2c07cf9725a 100644 --- a/data-otservbr-global/npc/atrad.lua +++ b/data-otservbr-global/npc/atrad.lua @@ -110,7 +110,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/auron.lua b/data-otservbr-global/npc/auron.lua index 76ffe1a4809..8b0b84538c5 100644 --- a/data-otservbr-global/npc/auron.lua +++ b/data-otservbr-global/npc/auron.lua @@ -58,7 +58,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/azil.lua b/data-otservbr-global/npc/azil.lua index 84ae099295a..b58c2ae2b6f 100644 --- a/data-otservbr-global/npc/azil.lua +++ b/data-otservbr-global/npc/azil.lua @@ -94,7 +94,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/baltim.lua b/data-otservbr-global/npc/baltim.lua index 296d9febf01..d0b472f6bd2 100644 --- a/data-otservbr-global/npc/baltim.lua +++ b/data-otservbr-global/npc/baltim.lua @@ -142,7 +142,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/bashira.lua b/data-otservbr-global/npc/bashira.lua index 9171e2e373c..cad33258c39 100644 --- a/data-otservbr-global/npc/bashira.lua +++ b/data-otservbr-global/npc/bashira.lua @@ -104,7 +104,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/battlemart.lua b/data-otservbr-global/npc/battlemart.lua index b4b99993411..4cc010da066 100644 --- a/data-otservbr-global/npc/battlemart.lua +++ b/data-otservbr-global/npc/battlemart.lua @@ -223,7 +223,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/baxter.lua b/data-otservbr-global/npc/baxter.lua index 1f7cd756e32..beb1dcdb237 100644 --- a/data-otservbr-global/npc/baxter.lua +++ b/data-otservbr-global/npc/baxter.lua @@ -81,7 +81,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/beatrice.lua b/data-otservbr-global/npc/beatrice.lua index 50c4ccfb9cc..89fe93286dc 100644 --- a/data-otservbr-global/npc/beatrice.lua +++ b/data-otservbr-global/npc/beatrice.lua @@ -124,7 +124,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/benjamin.lua b/data-otservbr-global/npc/benjamin.lua index 9b26653fcf3..ce3858886dc 100644 --- a/data-otservbr-global/npc/benjamin.lua +++ b/data-otservbr-global/npc/benjamin.lua @@ -99,7 +99,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/berenice.lua b/data-otservbr-global/npc/berenice.lua index 34a2b527022..d1889c032cd 100644 --- a/data-otservbr-global/npc/berenice.lua +++ b/data-otservbr-global/npc/berenice.lua @@ -124,7 +124,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/bertha.lua b/data-otservbr-global/npc/bertha.lua index a4d27b9ef4f..339b91aae7e 100644 --- a/data-otservbr-global/npc/bertha.lua +++ b/data-otservbr-global/npc/bertha.lua @@ -139,7 +139,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/bezil.lua b/data-otservbr-global/npc/bezil.lua index 0c828a73823..8a28bd473e5 100644 --- a/data-otservbr-global/npc/bezil.lua +++ b/data-otservbr-global/npc/bezil.lua @@ -87,7 +87,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/billy.lua b/data-otservbr-global/npc/billy.lua index d5912aa378a..fac70690f0f 100644 --- a/data-otservbr-global/npc/billy.lua +++ b/data-otservbr-global/npc/billy.lua @@ -165,7 +165,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/black_bert.lua b/data-otservbr-global/npc/black_bert.lua index c68c5f43bc5..dc3f8420cb0 100644 --- a/data-otservbr-global/npc/black_bert.lua +++ b/data-otservbr-global/npc/black_bert.lua @@ -161,7 +161,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/bolfona.lua b/data-otservbr-global/npc/bolfona.lua index 0354da3a13c..84028bfd03b 100644 --- a/data-otservbr-global/npc/bolfona.lua +++ b/data-otservbr-global/npc/bolfona.lua @@ -110,7 +110,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/bonifacius.lua b/data-otservbr-global/npc/bonifacius.lua index f54a50b3f79..cdd6b3666dc 100644 --- a/data-otservbr-global/npc/bonifacius.lua +++ b/data-otservbr-global/npc/bonifacius.lua @@ -67,7 +67,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/boozer.lua b/data-otservbr-global/npc/boozer.lua index 78b5ba3eb62..ad959f07722 100644 --- a/data-otservbr-global/npc/boozer.lua +++ b/data-otservbr-global/npc/boozer.lua @@ -103,7 +103,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/borkas.lua b/data-otservbr-global/npc/borkas.lua index 3a859f42dd3..df6da78c581 100644 --- a/data-otservbr-global/npc/borkas.lua +++ b/data-otservbr-global/npc/borkas.lua @@ -72,7 +72,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/brasith.lua b/data-otservbr-global/npc/brasith.lua index 68f9b69e935..b2939eb081b 100644 --- a/data-otservbr-global/npc/brasith.lua +++ b/data-otservbr-global/npc/brasith.lua @@ -84,7 +84,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/brengus.lua b/data-otservbr-global/npc/brengus.lua index 724a54a330d..75657c858d6 100644 --- a/data-otservbr-global/npc/brengus.lua +++ b/data-otservbr-global/npc/brengus.lua @@ -172,7 +172,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/briasol.lua b/data-otservbr-global/npc/briasol.lua index 8b0d23061b9..6905011fee9 100644 --- a/data-otservbr-global/npc/briasol.lua +++ b/data-otservbr-global/npc/briasol.lua @@ -171,7 +171,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/buddel.lua b/data-otservbr-global/npc/buddel.lua index c07ab7a7052..051e79a2299 100644 --- a/data-otservbr-global/npc/buddel.lua +++ b/data-otservbr-global/npc/buddel.lua @@ -144,7 +144,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/buddel_helheim.lua b/data-otservbr-global/npc/buddel_helheim.lua index 12f03103128..b38470616aa 100644 --- a/data-otservbr-global/npc/buddel_helheim.lua +++ b/data-otservbr-global/npc/buddel_helheim.lua @@ -139,7 +139,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/buddel_okolnir.lua b/data-otservbr-global/npc/buddel_okolnir.lua index 354117079e1..387009f9df1 100644 --- a/data-otservbr-global/npc/buddel_okolnir.lua +++ b/data-otservbr-global/npc/buddel_okolnir.lua @@ -143,7 +143,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/buddel_raider_camp.lua b/data-otservbr-global/npc/buddel_raider_camp.lua index 2198c012827..2c6d9781296 100644 --- a/data-otservbr-global/npc/buddel_raider_camp.lua +++ b/data-otservbr-global/npc/buddel_raider_camp.lua @@ -144,7 +144,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/buddel_tyrsung.lua b/data-otservbr-global/npc/buddel_tyrsung.lua index c86f1bac3fa..541739f2f53 100644 --- a/data-otservbr-global/npc/buddel_tyrsung.lua +++ b/data-otservbr-global/npc/buddel_tyrsung.lua @@ -144,7 +144,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/cael.lua b/data-otservbr-global/npc/cael.lua index d713653b014..f377cdae411 100644 --- a/data-otservbr-global/npc/cael.lua +++ b/data-otservbr-global/npc/cael.lua @@ -40,7 +40,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/canary.lua b/data-otservbr-global/npc/canary.lua index c4bfb5c3e8b..3c6cdf3063e 100644 --- a/data-otservbr-global/npc/canary.lua +++ b/data-otservbr-global/npc/canary.lua @@ -44,7 +44,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/captain_haba_open_sea.lua b/data-otservbr-global/npc/captain_haba_open_sea.lua index 5516c8077b6..140ca090393 100644 --- a/data-otservbr-global/npc/captain_haba_open_sea.lua +++ b/data-otservbr-global/npc/captain_haba_open_sea.lua @@ -187,7 +187,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/captain_max.lua b/data-otservbr-global/npc/captain_max.lua index 85a0af120bb..34eb7693cc2 100644 --- a/data-otservbr-global/npc/captain_max.lua +++ b/data-otservbr-global/npc/captain_max.lua @@ -96,7 +96,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/captain_max_calassa.lua b/data-otservbr-global/npc/captain_max_calassa.lua index de57a2f1a14..79f9404a4fc 100644 --- a/data-otservbr-global/npc/captain_max_calassa.lua +++ b/data-otservbr-global/npc/captain_max_calassa.lua @@ -80,7 +80,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/carina.lua b/data-otservbr-global/npc/carina.lua index 65d6ffa217c..d5373f30356 100644 --- a/data-otservbr-global/npc/carina.lua +++ b/data-otservbr-global/npc/carina.lua @@ -110,7 +110,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/carlos.lua b/data-otservbr-global/npc/carlos.lua index 709ad1791a6..df70b6ddb59 100644 --- a/data-otservbr-global/npc/carlos.lua +++ b/data-otservbr-global/npc/carlos.lua @@ -44,7 +44,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/cedrik.lua b/data-otservbr-global/npc/cedrik.lua index e6b5d1be4f8..04778320b96 100644 --- a/data-otservbr-global/npc/cedrik.lua +++ b/data-otservbr-global/npc/cedrik.lua @@ -262,7 +262,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/chantalle.lua b/data-otservbr-global/npc/chantalle.lua index 1b80f81b8aa..2615f6557da 100644 --- a/data-otservbr-global/npc/chantalle.lua +++ b/data-otservbr-global/npc/chantalle.lua @@ -162,7 +162,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/chartan.lua b/data-otservbr-global/npc/chartan.lua index b1e94d5f6b6..8be69fc06da 100644 --- a/data-otservbr-global/npc/chartan.lua +++ b/data-otservbr-global/npc/chartan.lua @@ -154,7 +154,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/chemar.lua b/data-otservbr-global/npc/chemar.lua index 4ad7684b79e..4f00675f823 100644 --- a/data-otservbr-global/npc/chemar.lua +++ b/data-otservbr-global/npc/chemar.lua @@ -102,7 +102,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/chephan.lua b/data-otservbr-global/npc/chephan.lua index 1288e496661..4321e2118d1 100644 --- a/data-otservbr-global/npc/chephan.lua +++ b/data-otservbr-global/npc/chephan.lua @@ -76,7 +76,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/chondur.lua b/data-otservbr-global/npc/chondur.lua index af711b4b897..c0a1a000d22 100644 --- a/data-otservbr-global/npc/chondur.lua +++ b/data-otservbr-global/npc/chondur.lua @@ -403,7 +403,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/christine.lua b/data-otservbr-global/npc/christine.lua index ba759ba8bc6..7763fc52288 100644 --- a/data-otservbr-global/npc/christine.lua +++ b/data-otservbr-global/npc/christine.lua @@ -80,7 +80,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/chrystal.lua b/data-otservbr-global/npc/chrystal.lua index 588008b4a7a..54c70da0e81 100644 --- a/data-otservbr-global/npc/chrystal.lua +++ b/data-otservbr-global/npc/chrystal.lua @@ -92,7 +92,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/chuckles.lua b/data-otservbr-global/npc/chuckles.lua index cc53b0c9340..51fb3f2add6 100644 --- a/data-otservbr-global/npc/chuckles.lua +++ b/data-otservbr-global/npc/chuckles.lua @@ -126,7 +126,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/cledwyn.lua b/data-otservbr-global/npc/cledwyn.lua index a45968f5978..6e9efd9f76c 100644 --- a/data-otservbr-global/npc/cledwyn.lua +++ b/data-otservbr-global/npc/cledwyn.lua @@ -55,7 +55,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/clyde.lua b/data-otservbr-global/npc/clyde.lua index bbbc0b286d3..fcaf9ea011a 100644 --- a/data-otservbr-global/npc/clyde.lua +++ b/data-otservbr-global/npc/clyde.lua @@ -71,7 +71,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/coltrayne.lua b/data-otservbr-global/npc/coltrayne.lua index 252a322cb07..92655a94ed5 100644 --- a/data-otservbr-global/npc/coltrayne.lua +++ b/data-otservbr-global/npc/coltrayne.lua @@ -166,7 +166,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/cornelia.lua b/data-otservbr-global/npc/cornelia.lua index 7735527ee1e..c78b3482e78 100644 --- a/data-otservbr-global/npc/cornelia.lua +++ b/data-otservbr-global/npc/cornelia.lua @@ -136,7 +136,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/cranky_lizard_crone.lua b/data-otservbr-global/npc/cranky_lizard_crone.lua index 6d71f873f54..94261410724 100644 --- a/data-otservbr-global/npc/cranky_lizard_crone.lua +++ b/data-otservbr-global/npc/cranky_lizard_crone.lua @@ -48,16 +48,20 @@ local already = "It seems you already have this addon, don't you try to mock me --WAYFARER START -- function WayfarerFirst(npc, creature, message, keywords, parameters, node) - if isPremium(creature) then - local addon = getPlayerStorageValue(creature, Storage.WayfarerOutfit) - if addon == -1 then - if getPlayerItemCount(creature, 11701) >= 1 then - if doPlayerRemoveItem(creature, 11701, 1) then + local player = Player(creature) + if not player then + return + end + + if player:isPremium() then + if player:getStorageValue(Storage.WayfarerOutfit) < 1 then + if player:getItemCount(11701) > 0 then + if player:removeItem(11701, 1) then npcHandler:say(newaddon, npc, creature) - doSendMagicEffect(getCreaturePosition(creature), 13) - doPlayerAddOutfit(creature, 366, 1) - doPlayerAddOutfit(creature, 367, 1) - setPlayerStorageValue(creature, Storage.WayfarerOutfit, 1) + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) + player:addOutfitAddon(366, 1) + player:addOutfitAddon(367, 1) + player:setStorageValue(Storage.WayfarerOutfit, 1) end else npcHandler:say(noItems, npc, creature) @@ -69,15 +73,20 @@ function WayfarerFirst(npc, creature, message, keywords, parameters, node) end function WayfarerSecond(npc, creature, message, keywords, parameters, node) - if isPremium(creature) then - if getPlayerStorageValue(creature, Storage.WayfarerOutfit + 1) == -1 then - if getPlayerItemCount(creature, 11700) >= 1 then - if doPlayerRemoveItem(creature, 11700, 1) then + local player = Player(creature) + if not player then + return + end + + if player:isPremium() then + if player:getStorageValue(Storage.WayfarerOutfit + 1) < 1 then + if player:getItemCount(11700) > 0 then + if player:removeItem(11700, 1) then npcHandler:say(newaddon, npc, creature) - doSendMagicEffect(getCreaturePosition(creature), 13) - doPlayerAddOutfit(creature, 366, 2) - doPlayerAddOutfit(creature, 367, 2) - setPlayerStorageValue(creature, Storage.WayfarerOutfit + 1, 1) + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) + player:addOutfitAddon(366, 2) + player:addOutfitAddon(367, 2) + player:setStorageValue(Storage.WayfarerOutfit + 1, 1) end else npcHandler:say(noItems, npc, creature) diff --git a/data-otservbr-global/npc/cruleo.lua b/data-otservbr-global/npc/cruleo.lua index ee83ce41a37..219c66c2f94 100644 --- a/data-otservbr-global/npc/cruleo.lua +++ b/data-otservbr-global/npc/cruleo.lua @@ -68,7 +68,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/dane.lua b/data-otservbr-global/npc/dane.lua index 2722cea8f40..c2e3c612414 100644 --- a/data-otservbr-global/npc/dane.lua +++ b/data-otservbr-global/npc/dane.lua @@ -74,7 +74,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/dankwart.lua b/data-otservbr-global/npc/dankwart.lua index 2f11b2edc66..dfc7bc2802d 100644 --- a/data-otservbr-global/npc/dankwart.lua +++ b/data-otservbr-global/npc/dankwart.lua @@ -66,7 +66,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/dario.lua b/data-otservbr-global/npc/dario.lua index 4a0368b4c88..c679fb6e28c 100644 --- a/data-otservbr-global/npc/dario.lua +++ b/data-otservbr-global/npc/dario.lua @@ -100,7 +100,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/digger.lua b/data-otservbr-global/npc/digger.lua index e666267a498..863595cbc32 100644 --- a/data-otservbr-global/npc/digger.lua +++ b/data-otservbr-global/npc/digger.lua @@ -72,7 +72,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/dixi.lua b/data-otservbr-global/npc/dixi.lua index a792b172e46..241644914b9 100644 --- a/data-otservbr-global/npc/dixi.lua +++ b/data-otservbr-global/npc/dixi.lua @@ -176,7 +176,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/donald_mcronald.lua b/data-otservbr-global/npc/donald_mcronald.lua index 6a51bd09875..fa482ed4608 100644 --- a/data-otservbr-global/npc/donald_mcronald.lua +++ b/data-otservbr-global/npc/donald_mcronald.lua @@ -67,7 +67,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/dorbin.lua b/data-otservbr-global/npc/dorbin.lua index c325f169d05..60a381d6a35 100644 --- a/data-otservbr-global/npc/dorbin.lua +++ b/data-otservbr-global/npc/dorbin.lua @@ -157,7 +157,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/dorian.lua b/data-otservbr-global/npc/dorian.lua index 864bd955bb6..bdf1b61a8d0 100644 --- a/data-otservbr-global/npc/dorian.lua +++ b/data-otservbr-global/npc/dorian.lua @@ -240,7 +240,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/dove.lua b/data-otservbr-global/npc/dove.lua index 6785c0b8d4a..2dadf044189 100644 --- a/data-otservbr-global/npc/dove.lua +++ b/data-otservbr-global/npc/dove.lua @@ -96,7 +96,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/duncan.lua b/data-otservbr-global/npc/duncan.lua index 3b9f623fdbc..2bc4df38712 100644 --- a/data-otservbr-global/npc/duncan.lua +++ b/data-otservbr-global/npc/duncan.lua @@ -220,7 +220,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/eddy.lua b/data-otservbr-global/npc/eddy.lua index fc785d409dc..e54bb0ca0cb 100644 --- a/data-otservbr-global/npc/eddy.lua +++ b/data-otservbr-global/npc/eddy.lua @@ -164,7 +164,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/edmund.lua b/data-otservbr-global/npc/edmund.lua index 687721458ef..d8635297949 100644 --- a/data-otservbr-global/npc/edmund.lua +++ b/data-otservbr-global/npc/edmund.lua @@ -126,7 +126,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/edoch.lua b/data-otservbr-global/npc/edoch.lua index a832052f5fa..754652ba507 100644 --- a/data-otservbr-global/npc/edoch.lua +++ b/data-otservbr-global/npc/edoch.lua @@ -86,7 +86,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/edvard.lua b/data-otservbr-global/npc/edvard.lua index 6f3684bfe1b..912171fc988 100644 --- a/data-otservbr-global/npc/edvard.lua +++ b/data-otservbr-global/npc/edvard.lua @@ -166,7 +166,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/elane.lua b/data-otservbr-global/npc/elane.lua index 02003b2d914..e84f211fe2c 100644 --- a/data-otservbr-global/npc/elane.lua +++ b/data-otservbr-global/npc/elane.lua @@ -255,7 +255,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/eliyas.lua b/data-otservbr-global/npc/eliyas.lua index de799a95b1c..b25823acf0c 100644 --- a/data-otservbr-global/npc/eliyas.lua +++ b/data-otservbr-global/npc/eliyas.lua @@ -157,7 +157,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/elvith.lua b/data-otservbr-global/npc/elvith.lua index 4e7b1d52b29..ea704df1b20 100644 --- a/data-otservbr-global/npc/elvith.lua +++ b/data-otservbr-global/npc/elvith.lua @@ -123,7 +123,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/eremo.lua b/data-otservbr-global/npc/eremo.lua index dfa4f1f28f2..c61996e5318 100644 --- a/data-otservbr-global/npc/eremo.lua +++ b/data-otservbr-global/npc/eremo.lua @@ -239,7 +239,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/eruaran.lua b/data-otservbr-global/npc/eruaran.lua index 51c5f17d4e0..541d5bd409c 100644 --- a/data-otservbr-global/npc/eruaran.lua +++ b/data-otservbr-global/npc/eruaran.lua @@ -150,15 +150,20 @@ local ACTION = { -- dream START -- local function dreamFirst(npc, creature, message, keywords, parameters, node) - if isPremium(creature) then - if getPlayerStorageValue(creature, storage + 1) == -1 then - if getPlayerItemCount(creature, 20276) >= 1 then - if doPlayerRemoveItem(creature, 20276, 1) then - npcHandler:say(newAddon, npc, creature) - doSendMagicEffect(getCreaturePosition(creature), 13) - doPlayerAddOutfit(creature, 577, 1) - doPlayerAddOutfit(creature, 578, 1) - setPlayerStorageValue(creature, storage + 1, 1) + local player = Player(creature) + if not player then + return + end + + if player:isPremium() then + if player:getStorageValue(storage + 1) < 1 then + if player:getItemCount(20276) > 0 then + if player:removeItem(20276, 1) then + npcHandler:say(newaddon, npc, creature) + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) + player:addOutfitAddon(577, 1) + player:addOutfitAddon(577, 1) + player:setStorageValue(storage + 1, 1) end else npcHandler:say(noItems, npc, creature) @@ -170,15 +175,20 @@ local function dreamFirst(npc, creature, message, keywords, parameters, node) end local function dreamSecond(npc, creature, message, keywords, parameters, node) - if isPremium(creature) then - if getPlayerStorageValue(creature, storage) == -1 then - if getPlayerItemCount(creature, 20275) >= 1 then - if doPlayerRemoveItem(creature, 20275, 1) then - npcHandler:say(newAddon, npc, creature) - doSendMagicEffect(getCreaturePosition(creature), 13) - doPlayerAddOutfit(creature, 577, 2) - doPlayerAddOutfit(creature, 578, 2) - setPlayerStorageValue(creature, storage, 1) + local player = Player(creature) + if not player then + return + end + + if player:isPremium() then + if player:getStorageValue(storage) < 1 then + if player:getItemCount(20275) > 0 then + if player:removeItem(20275, 1) then + npcHandler:say(newaddon, npc, creature) + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) + player:addOutfitAddon(577, 2) + player:addOutfitAddon(577, 2) + player:setStorageValue(storage, 1) end else npcHandler:say(noItems, npc, creature) @@ -192,7 +202,9 @@ end local function greetCallback(npc, creature) local player = Player(creature) - local playerId = player:getId() + if not player then + return true + end if player:getStorageValue(Storage.EruaranGreeting) > 0 then npcHandler:setMessage(MESSAGE_GREET, "Ashari Lillithy, so we meet {again}! What brings you here this time, general {information}, {transform}, {improve}, {create}, {outfit}, or {talk}?") @@ -204,13 +216,17 @@ local function greetCallback(npc, creature) end local function creatureSayCallback(npc, creature, type, message) - local player = Player(creature) - local playerId = player:getId() - if not npcHandler:checkInteraction(npc, creature) then return false end + local player = Player(creature) + if not player then + return true + end + + local playerId = player:getId() + if MsgContains(message, "create") then npcHandler:say("You can try to create {sword}s, {axe}s, {club}s, {bow}s, {crossbow}s and {spellbook}s.", npc, creature) npcHandler:setTopic(playerId, 1) diff --git a/data-otservbr-global/npc/esrik.lua b/data-otservbr-global/npc/esrik.lua index 4d15e139c75..5890ff5843c 100644 --- a/data-otservbr-global/npc/esrik.lua +++ b/data-otservbr-global/npc/esrik.lua @@ -164,7 +164,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/evan.lua b/data-otservbr-global/npc/evan.lua index 6b25dab205d..85d12fd0d0c 100644 --- a/data-otservbr-global/npc/evan.lua +++ b/data-otservbr-global/npc/evan.lua @@ -61,7 +61,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/ezean.lua b/data-otservbr-global/npc/ezean.lua index 7f2a7dccb29..c6bcdcbabf6 100644 --- a/data-otservbr-global/npc/ezean.lua +++ b/data-otservbr-global/npc/ezean.lua @@ -62,7 +62,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/fadil.lua b/data-otservbr-global/npc/fadil.lua index 06c3cc5dd4d..3c641d0d7df 100644 --- a/data-otservbr-global/npc/fadil.lua +++ b/data-otservbr-global/npc/fadil.lua @@ -87,7 +87,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/faloriel.lua b/data-otservbr-global/npc/faloriel.lua index fd8a1856bdb..7d259c72ea3 100644 --- a/data-otservbr-global/npc/faloriel.lua +++ b/data-otservbr-global/npc/faloriel.lua @@ -113,7 +113,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/fayla.lua b/data-otservbr-global/npc/fayla.lua index d172d95b8c3..948f8ed6cc2 100644 --- a/data-otservbr-global/npc/fayla.lua +++ b/data-otservbr-global/npc/fayla.lua @@ -66,7 +66,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/feizuhl.lua b/data-otservbr-global/npc/feizuhl.lua index 29a08d038bb..5e8307a7bc0 100644 --- a/data-otservbr-global/npc/feizuhl.lua +++ b/data-otservbr-global/npc/feizuhl.lua @@ -164,7 +164,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/fenech.lua b/data-otservbr-global/npc/fenech.lua index 792f6a26614..7152c0ef9c5 100644 --- a/data-otservbr-global/npc/fenech.lua +++ b/data-otservbr-global/npc/fenech.lua @@ -168,7 +168,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/fiona.lua b/data-otservbr-global/npc/fiona.lua index 006a4f50fb7..50e082004a6 100644 --- a/data-otservbr-global/npc/fiona.lua +++ b/data-otservbr-global/npc/fiona.lua @@ -153,7 +153,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/flint.lua b/data-otservbr-global/npc/flint.lua index 854359b064b..0b50a00df1f 100644 --- a/data-otservbr-global/npc/flint.lua +++ b/data-otservbr-global/npc/flint.lua @@ -157,7 +157,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/florentine.lua b/data-otservbr-global/npc/florentine.lua index 9f898a0f1d7..0a5d7b421c2 100644 --- a/data-otservbr-global/npc/florentine.lua +++ b/data-otservbr-global/npc/florentine.lua @@ -74,7 +74,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/frans.lua b/data-otservbr-global/npc/frans.lua index a606f3137ba..8761a7d89d6 100644 --- a/data-otservbr-global/npc/frans.lua +++ b/data-otservbr-global/npc/frans.lua @@ -129,7 +129,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/frederik.lua b/data-otservbr-global/npc/frederik.lua index c95baed2a4a..9b33ccf9684 100644 --- a/data-otservbr-global/npc/frederik.lua +++ b/data-otservbr-global/npc/frederik.lua @@ -153,7 +153,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/frodo.lua b/data-otservbr-global/npc/frodo.lua index e92d9418e1e..d139f461cac 100644 --- a/data-otservbr-global/npc/frodo.lua +++ b/data-otservbr-global/npc/frodo.lua @@ -122,7 +122,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/fyodor.lua b/data-otservbr-global/npc/fyodor.lua index 13a980b0995..1dda09a4d65 100644 --- a/data-otservbr-global/npc/fyodor.lua +++ b/data-otservbr-global/npc/fyodor.lua @@ -63,7 +63,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/gail.lua b/data-otservbr-global/npc/gail.lua index aa65e5f5592..80a9b54b3e5 100644 --- a/data-otservbr-global/npc/gail.lua +++ b/data-otservbr-global/npc/gail.lua @@ -167,7 +167,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/galuna.lua b/data-otservbr-global/npc/galuna.lua index 0defc491aee..491d76d3135 100644 --- a/data-otservbr-global/npc/galuna.lua +++ b/data-otservbr-global/npc/galuna.lua @@ -78,7 +78,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/gamel.lua b/data-otservbr-global/npc/gamel.lua index 921e186c2c8..96e9cb0540d 100644 --- a/data-otservbr-global/npc/gamel.lua +++ b/data-otservbr-global/npc/gamel.lua @@ -166,7 +166,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/gamon.lua b/data-otservbr-global/npc/gamon.lua index d86ec3d3fd7..e858f43eb30 100644 --- a/data-otservbr-global/npc/gamon.lua +++ b/data-otservbr-global/npc/gamon.lua @@ -180,7 +180,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/ghorza.lua b/data-otservbr-global/npc/ghorza.lua index d085363c4e6..17f752e7435 100644 --- a/data-otservbr-global/npc/ghorza.lua +++ b/data-otservbr-global/npc/ghorza.lua @@ -150,7 +150,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/giri.lua b/data-otservbr-global/npc/giri.lua index 8a243b22f85..194706a2a02 100644 --- a/data-otservbr-global/npc/giri.lua +++ b/data-otservbr-global/npc/giri.lua @@ -128,7 +128,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/gladys.lua b/data-otservbr-global/npc/gladys.lua index 06a49dc7aad..d9911e3f55b 100644 --- a/data-otservbr-global/npc/gladys.lua +++ b/data-otservbr-global/npc/gladys.lua @@ -90,7 +90,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/gnomailion.lua b/data-otservbr-global/npc/gnomailion.lua index 709330e0dbd..004000b9895 100644 --- a/data-otservbr-global/npc/gnomailion.lua +++ b/data-otservbr-global/npc/gnomailion.lua @@ -63,7 +63,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/gnomally.lua b/data-otservbr-global/npc/gnomally.lua index 07680193ed2..47b965fe0b0 100644 --- a/data-otservbr-global/npc/gnomally.lua +++ b/data-otservbr-global/npc/gnomally.lua @@ -37,7 +37,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/gnomegica.lua b/data-otservbr-global/npc/gnomegica.lua index 9e61340a24f..0805ca33ace 100644 --- a/data-otservbr-global/npc/gnomegica.lua +++ b/data-otservbr-global/npc/gnomegica.lua @@ -149,7 +149,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/gnomejam.lua b/data-otservbr-global/npc/gnomejam.lua index fafcc745cfb..a4eabd359a4 100644 --- a/data-otservbr-global/npc/gnomejam.lua +++ b/data-otservbr-global/npc/gnomejam.lua @@ -64,7 +64,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/gnomerrow.lua b/data-otservbr-global/npc/gnomerrow.lua index 15c2679fb20..6195495adec 100644 --- a/data-otservbr-global/npc/gnomerrow.lua +++ b/data-otservbr-global/npc/gnomerrow.lua @@ -68,7 +68,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/gnomette.lua b/data-otservbr-global/npc/gnomette.lua index c805f0a7e68..9254a8f5ff4 100644 --- a/data-otservbr-global/npc/gnomette.lua +++ b/data-otservbr-global/npc/gnomette.lua @@ -60,7 +60,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/gnomfurry.lua b/data-otservbr-global/npc/gnomfurry.lua index f7b0076461c..7fd6eb5eb2c 100644 --- a/data-otservbr-global/npc/gnomfurry.lua +++ b/data-otservbr-global/npc/gnomfurry.lua @@ -71,7 +71,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/gnomincia.lua b/data-otservbr-global/npc/gnomincia.lua index 6c4bb022622..cde112fc646 100644 --- a/data-otservbr-global/npc/gnomincia.lua +++ b/data-otservbr-global/npc/gnomincia.lua @@ -61,7 +61,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/gnomission.lua b/data-otservbr-global/npc/gnomission.lua index 06544edc59a..3a35ecc117d 100644 --- a/data-otservbr-global/npc/gnomission.lua +++ b/data-otservbr-global/npc/gnomission.lua @@ -235,7 +235,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/gnomux.lua b/data-otservbr-global/npc/gnomux.lua index 68c90e47016..454bee2af1e 100644 --- a/data-otservbr-global/npc/gnomux.lua +++ b/data-otservbr-global/npc/gnomux.lua @@ -38,7 +38,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/gorn.lua b/data-otservbr-global/npc/gorn.lua index e87b4b200f5..0d875652da9 100644 --- a/data-otservbr-global/npc/gorn.lua +++ b/data-otservbr-global/npc/gorn.lua @@ -161,7 +161,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/gree_dee.lua b/data-otservbr-global/npc/gree_dee.lua index b4e6cbf44ba..9415ef79105 100644 --- a/data-otservbr-global/npc/gree_dee.lua +++ b/data-otservbr-global/npc/gree_dee.lua @@ -91,7 +91,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/grizzly_adams.lua b/data-otservbr-global/npc/grizzly_adams.lua index 6c08a297cc5..b51e8ddf2ce 100644 --- a/data-otservbr-global/npc/grizzly_adams.lua +++ b/data-otservbr-global/npc/grizzly_adams.lua @@ -96,7 +96,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/h.l..lua b/data-otservbr-global/npc/h.l..lua index 2f55f2bcc20..c698a572e1f 100644 --- a/data-otservbr-global/npc/h.l..lua +++ b/data-otservbr-global/npc/h.l..lua @@ -184,7 +184,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/haani.lua b/data-otservbr-global/npc/haani.lua index 0f6a79e4629..064b2ffe69e 100644 --- a/data-otservbr-global/npc/haani.lua +++ b/data-otservbr-global/npc/haani.lua @@ -163,7 +163,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/habdel.lua b/data-otservbr-global/npc/habdel.lua index 978ea279000..d9371bb7c6a 100644 --- a/data-otservbr-global/npc/habdel.lua +++ b/data-otservbr-global/npc/habdel.lua @@ -169,7 +169,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/hairycles.lua b/data-otservbr-global/npc/hairycles.lua index 5f0d8af6bd7..7ffcb21433d 100644 --- a/data-otservbr-global/npc/hairycles.lua +++ b/data-otservbr-global/npc/hairycles.lua @@ -514,7 +514,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/halif.lua b/data-otservbr-global/npc/halif.lua index d3d49696307..e2e55484d37 100644 --- a/data-otservbr-global/npc/halif.lua +++ b/data-otservbr-global/npc/halif.lua @@ -89,7 +89,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/hamish.lua b/data-otservbr-global/npc/hamish.lua index 9d9029b556f..b00d21393a6 100644 --- a/data-otservbr-global/npc/hamish.lua +++ b/data-otservbr-global/npc/hamish.lua @@ -214,7 +214,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/hanna.lua b/data-otservbr-global/npc/hanna.lua index 02f89d87631..7fca4c908aa 100644 --- a/data-otservbr-global/npc/hanna.lua +++ b/data-otservbr-global/npc/hanna.lua @@ -204,7 +204,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/hardek.lua b/data-otservbr-global/npc/hardek.lua index 72e035c5c2d..27f5ddc23a0 100644 --- a/data-otservbr-global/npc/hardek.lua +++ b/data-otservbr-global/npc/hardek.lua @@ -149,7 +149,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/harog.lua b/data-otservbr-global/npc/harog.lua index d5943de3805..421356ec62e 100644 --- a/data-otservbr-global/npc/harog.lua +++ b/data-otservbr-global/npc/harog.lua @@ -33,7 +33,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/haroun.lua b/data-otservbr-global/npc/haroun.lua index 18e0aae2936..33a4e1c2c72 100644 --- a/data-otservbr-global/npc/haroun.lua +++ b/data-otservbr-global/npc/haroun.lua @@ -142,7 +142,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/hawkhurst.lua b/data-otservbr-global/npc/hawkhurst.lua index c94b7bf0c39..cac78d2e8c1 100644 --- a/data-otservbr-global/npc/hawkhurst.lua +++ b/data-otservbr-global/npc/hawkhurst.lua @@ -23,6 +23,12 @@ npcConfig.flags = { floorchange = false, } +npcConfig.voices = { + interval = 15000, + chance = 50, + { text = "There's a storm brewing." }, +} + local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) @@ -52,7 +58,7 @@ end -- Travel local travelKeyword = keywordHandler:addKeyword({ "passage" }, StdModule.say, { npcHandler = npcHandler, text = "Ye' want a passage to the blasted isle, right? {Yes} or {no}?" }) -travelKeyword:addChildKeyword({ "yes" }, StdModule.travel, { npcHandler = npcHandler, premium = false, cost = 400, destination = Position(33710, 32602, 6) }) +travelKeyword:addChildKeyword({ "yes" }, StdModule.travel, { npcHandler = npcHandler, premium = false, cost = 400, text = "All Hand Hoy!", destination = Position(33710, 32602, 6) }) travelKeyword:addChildKeyword({ "no" }, StdModule.say, { npcHandler = npcHandler, text = "We would like to serve you some time.", reset = true }) npcHandler:setMessage(MESSAGE_GREET, "Ahoy, matey! Lookin' for a {passage}, eh.") diff --git a/data-otservbr-global/npc/hawkhurst_ingol.lua b/data-otservbr-global/npc/hawkhurst_ingol.lua index 4f67ceafb51..155edef40c8 100644 --- a/data-otservbr-global/npc/hawkhurst_ingol.lua +++ b/data-otservbr-global/npc/hawkhurst_ingol.lua @@ -23,6 +23,12 @@ npcConfig.flags = { floorchange = false, } +npcConfig.voices = { + interval = 15000, + chance = 50, + { text = "There's a storm brewing." }, +} + local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) @@ -52,7 +58,7 @@ end -- Travel local travelKeyword = keywordHandler:addKeyword({ "passage" }, StdModule.say, { npcHandler = npcHandler, text = "Ye' want a passage back to cormaya? {Yes} or {no}." }) -travelKeyword:addChildKeyword({ "yes" }, StdModule.travel, { npcHandler = npcHandler, premium = false, cost = 400, destination = Position(33356, 31983, 7) }) +travelKeyword:addChildKeyword({ "yes" }, StdModule.travel, { npcHandler = npcHandler, premium = false, cost = 400, text = "All Hand Hoy!", destination = Position(33356, 31983, 7) }) travelKeyword:addChildKeyword({ "no" }, StdModule.say, { npcHandler = npcHandler, text = "We would like to serve you some time.", reset = true }) npcHandler:setMessage(MESSAGE_GREET, "Ahoy, matey! Lookin' for a {passage}, eh.") diff --git a/data-otservbr-global/npc/henricus.lua b/data-otservbr-global/npc/henricus.lua index bbbb0fd1b69..d6d7beda8f4 100644 --- a/data-otservbr-global/npc/henricus.lua +++ b/data-otservbr-global/npc/henricus.lua @@ -379,7 +379,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/herbert.lua b/data-otservbr-global/npc/herbert.lua index ff9d6dcc8b2..c8ccbd337c3 100644 --- a/data-otservbr-global/npc/herbert.lua +++ b/data-otservbr-global/npc/herbert.lua @@ -94,7 +94,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/hireling.lua b/data-otservbr-global/npc/hireling.lua index b2259069214..145d846bd7e 100644 --- a/data-otservbr-global/npc/hireling.lua +++ b/data-otservbr-global/npc/hireling.lua @@ -366,7 +366,7 @@ function createHirelingType(HirelingName) end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/hofech.lua b/data-otservbr-global/npc/hofech.lua index 724a5ed5715..558e78018f3 100644 --- a/data-otservbr-global/npc/hofech.lua +++ b/data-otservbr-global/npc/hofech.lua @@ -125,7 +125,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/hyacinth.lua b/data-otservbr-global/npc/hyacinth.lua index 6c551964071..cbf37f8e9c6 100644 --- a/data-otservbr-global/npc/hyacinth.lua +++ b/data-otservbr-global/npc/hyacinth.lua @@ -236,7 +236,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/imalas.lua b/data-otservbr-global/npc/imalas.lua index e5c1bc8862a..67aaefe93bc 100644 --- a/data-otservbr-global/npc/imalas.lua +++ b/data-otservbr-global/npc/imalas.lua @@ -76,7 +76,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/imbuement_assistant.lua b/data-otservbr-global/npc/imbuement_assistant.lua index 38cf813408e..4db7b665fe5 100644 --- a/data-otservbr-global/npc/imbuement_assistant.lua +++ b/data-otservbr-global/npc/imbuement_assistant.lua @@ -441,7 +441,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/inkaef.lua b/data-otservbr-global/npc/inkaef.lua index 645bba3bb5e..cd4eda5bfff 100644 --- a/data-otservbr-global/npc/inkaef.lua +++ b/data-otservbr-global/npc/inkaef.lua @@ -174,7 +174,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/irea.lua b/data-otservbr-global/npc/irea.lua index a9965210983..2e74ed85737 100644 --- a/data-otservbr-global/npc/irea.lua +++ b/data-otservbr-global/npc/irea.lua @@ -70,7 +70,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/iriana.lua b/data-otservbr-global/npc/iriana.lua index 5fffba86fa9..a0300c247a7 100644 --- a/data-otservbr-global/npc/iriana.lua +++ b/data-otservbr-global/npc/iriana.lua @@ -63,7 +63,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/irmana.lua b/data-otservbr-global/npc/irmana.lua index 6edfdf0d2e3..e106ef0a10c 100644 --- a/data-otservbr-global/npc/irmana.lua +++ b/data-otservbr-global/npc/irmana.lua @@ -221,7 +221,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/ishina.lua b/data-otservbr-global/npc/ishina.lua index 455aed2dda2..1fd61200c15 100644 --- a/data-otservbr-global/npc/ishina.lua +++ b/data-otservbr-global/npc/ishina.lua @@ -197,7 +197,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/isika.lua b/data-otservbr-global/npc/isika.lua index 33b7091ce6b..45f0bc43ed5 100644 --- a/data-otservbr-global/npc/isika.lua +++ b/data-otservbr-global/npc/isika.lua @@ -84,7 +84,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/iwan.lua b/data-otservbr-global/npc/iwan.lua index 31f593c7cb0..2cc24843318 100644 --- a/data-otservbr-global/npc/iwan.lua +++ b/data-otservbr-global/npc/iwan.lua @@ -136,7 +136,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/iwar.lua b/data-otservbr-global/npc/iwar.lua index 70a2a66f16e..d30d368bf5a 100644 --- a/data-otservbr-global/npc/iwar.lua +++ b/data-otservbr-global/npc/iwar.lua @@ -201,7 +201,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/jack_springer.lua b/data-otservbr-global/npc/jack_springer.lua index 938071cb630..73cd671a47d 100644 --- a/data-otservbr-global/npc/jack_springer.lua +++ b/data-otservbr-global/npc/jack_springer.lua @@ -111,7 +111,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/jakahr.lua b/data-otservbr-global/npc/jakahr.lua index 80706f5e9f4..bf8be59ad4e 100644 --- a/data-otservbr-global/npc/jakahr.lua +++ b/data-otservbr-global/npc/jakahr.lua @@ -67,7 +67,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/james.lua b/data-otservbr-global/npc/james.lua index 8c2f55c8200..478ca316432 100644 --- a/data-otservbr-global/npc/james.lua +++ b/data-otservbr-global/npc/james.lua @@ -65,7 +65,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/janz.lua b/data-otservbr-global/npc/janz.lua index 906e5235f1b..f0cf97fde09 100644 --- a/data-otservbr-global/npc/janz.lua +++ b/data-otservbr-global/npc/janz.lua @@ -156,7 +156,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/jessica.lua b/data-otservbr-global/npc/jessica.lua index 32cd5ac34fd..37ac18ed54a 100644 --- a/data-otservbr-global/npc/jessica.lua +++ b/data-otservbr-global/npc/jessica.lua @@ -161,7 +161,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/jezzara.lua b/data-otservbr-global/npc/jezzara.lua index 137dbbe03b3..78b803f69e5 100644 --- a/data-otservbr-global/npc/jezzara.lua +++ b/data-otservbr-global/npc/jezzara.lua @@ -85,7 +85,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/john.lua b/data-otservbr-global/npc/john.lua index 498ded60b3e..19c6818b8b3 100644 --- a/data-otservbr-global/npc/john.lua +++ b/data-otservbr-global/npc/john.lua @@ -70,7 +70,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/john_bounac.lua b/data-otservbr-global/npc/john_bounac.lua index 7cc4c1d4a6e..1f528abffe6 100644 --- a/data-otservbr-global/npc/john_bounac.lua +++ b/data-otservbr-global/npc/john_bounac.lua @@ -66,7 +66,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/julian.lua b/data-otservbr-global/npc/julian.lua index 628f4711a1e..9ce2ab0dc9b 100644 --- a/data-otservbr-global/npc/julian.lua +++ b/data-otservbr-global/npc/julian.lua @@ -66,7 +66,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/julius.lua b/data-otservbr-global/npc/julius.lua index df9c58cd905..47e8e123760 100644 --- a/data-otservbr-global/npc/julius.lua +++ b/data-otservbr-global/npc/julius.lua @@ -83,7 +83,6 @@ local function creatureSayCallback(npc, creature, type, message) end elseif player:getStorageValue(BloodBrothers.Mission01) == 3 then npcHandler:say("Let me check - yes indeed, there's garlic in it. Now eat one, in front of my eyes. Right now! Say '{aaah}' when you've chewed it all down so that I can see you're not hiding it!", npc, creature) - player:setStorageValue(BloodBrothers.GarlicBread, 0) npcHandler:setTopic(playerId, 4) elseif player:getStorageValue(BloodBrothers.Mission01) == 4 and player:getStorageValue(BloodBrothers.Mission02) < 0 then npcHandler:say("So, are you ready for your first real task?", npc, creature) @@ -164,7 +163,7 @@ local function creatureSayCallback(npc, creature, type, message) end end elseif MsgContains(message, "aaah") then - if npcHandler:getTopic(playerId) == 4 and player:getStorageValue(BloodBrothers.GarlicBread) == 1 then + if npcHandler:getTopic(playerId) == 4 and player:removeItem(8194, 1) then npcHandler:say("Very well. I think I can trust you now. Sorry that I had to put you through this embarassing procedure, but I'm sure you understand. So, are you ready for your first real task?", npc, creature) player:setStorageValue(BloodBrothers.Mission01, 4) npcHandler:setTopic(playerId, 5) @@ -262,7 +261,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/karl.lua b/data-otservbr-global/npc/karl.lua index 9af696aa25d..92d6ca95128 100644 --- a/data-otservbr-global/npc/karl.lua +++ b/data-otservbr-global/npc/karl.lua @@ -109,7 +109,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/khanna.lua b/data-otservbr-global/npc/khanna.lua index f3537057b10..02fcee7b6d5 100644 --- a/data-otservbr-global/npc/khanna.lua +++ b/data-otservbr-global/npc/khanna.lua @@ -178,7 +178,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/king_tibianus.lua b/data-otservbr-global/npc/king_tibianus.lua index d4d0b54ece1..de47e45acca 100644 --- a/data-otservbr-global/npc/king_tibianus.lua +++ b/data-otservbr-global/npc/king_tibianus.lua @@ -455,7 +455,5 @@ npcHandler:setMessage(MESSAGE_WALKAWAY, "How rude!") npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:setCallback(CALLBACK_GREET, greetCallback) -npcHandler:addModule(FocusModule:new(), npcConfig.name, true, true, true) - -- npcType registering the npcConfig table npcType:register(npcConfig) diff --git a/data-otservbr-global/npc/kroox.lua b/data-otservbr-global/npc/kroox.lua index 3d0d43436bf..020153a27bf 100644 --- a/data-otservbr-global/npc/kroox.lua +++ b/data-otservbr-global/npc/kroox.lua @@ -128,7 +128,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/lailene.lua b/data-otservbr-global/npc/lailene.lua index 682dec37683..4542da2ee84 100644 --- a/data-otservbr-global/npc/lailene.lua +++ b/data-otservbr-global/npc/lailene.lua @@ -74,7 +74,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/larek.lua b/data-otservbr-global/npc/larek.lua index 84d872134ac..910e0b403db 100644 --- a/data-otservbr-global/npc/larek.lua +++ b/data-otservbr-global/npc/larek.lua @@ -74,7 +74,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/larry.lua b/data-otservbr-global/npc/larry.lua index 35638152be3..25e973c0736 100644 --- a/data-otservbr-global/npc/larry.lua +++ b/data-otservbr-global/npc/larry.lua @@ -31,7 +31,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/lector.lua b/data-otservbr-global/npc/lector.lua index 32eb151687a..98c41a9d72e 100644 --- a/data-otservbr-global/npc/lector.lua +++ b/data-otservbr-global/npc/lector.lua @@ -67,7 +67,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/lee_delle.lua b/data-otservbr-global/npc/lee_delle.lua index 4a6fbaa77e1..f53e4649c88 100644 --- a/data-otservbr-global/npc/lee_delle.lua +++ b/data-otservbr-global/npc/lee_delle.lua @@ -207,7 +207,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/legola.lua b/data-otservbr-global/npc/legola.lua index 12eb92b0127..ca2eafc3ac1 100644 --- a/data-otservbr-global/npc/legola.lua +++ b/data-otservbr-global/npc/legola.lua @@ -122,7 +122,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/liane.lua b/data-otservbr-global/npc/liane.lua index aed7ccdfb54..b483de917ae 100644 --- a/data-otservbr-global/npc/liane.lua +++ b/data-otservbr-global/npc/liane.lua @@ -109,7 +109,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/lily.lua b/data-otservbr-global/npc/lily.lua index 5304c9c6eb6..fad82e1db11 100644 --- a/data-otservbr-global/npc/lily.lua +++ b/data-otservbr-global/npc/lily.lua @@ -303,7 +303,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/livielle.lua b/data-otservbr-global/npc/livielle.lua index 701647971f4..1741ce407ca 100644 --- a/data-otservbr-global/npc/livielle.lua +++ b/data-otservbr-global/npc/livielle.lua @@ -77,7 +77,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/lubo.lua b/data-otservbr-global/npc/lubo.lua index 21a737d35d0..97aea1169da 100644 --- a/data-otservbr-global/npc/lubo.lua +++ b/data-otservbr-global/npc/lubo.lua @@ -193,7 +193,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/luna.lua b/data-otservbr-global/npc/luna.lua index 26811dd739e..fe55cce5775 100644 --- a/data-otservbr-global/npc/luna.lua +++ b/data-otservbr-global/npc/luna.lua @@ -102,7 +102,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/lurik.lua b/data-otservbr-global/npc/lurik.lua index d0a5f1210eb..b9ea973f6ed 100644 --- a/data-otservbr-global/npc/lurik.lua +++ b/data-otservbr-global/npc/lurik.lua @@ -162,7 +162,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/lyonel.lua b/data-otservbr-global/npc/lyonel.lua index 4ea35ec2454..1111d8711b2 100644 --- a/data-otservbr-global/npc/lyonel.lua +++ b/data-otservbr-global/npc/lyonel.lua @@ -65,7 +65,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/malunga.lua b/data-otservbr-global/npc/malunga.lua index 3164eb44c0b..721743b73ce 100644 --- a/data-otservbr-global/npc/malunga.lua +++ b/data-otservbr-global/npc/malunga.lua @@ -139,7 +139,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/maria.lua b/data-otservbr-global/npc/maria.lua index 841513dd48e..7c63e11ac02 100644 --- a/data-otservbr-global/npc/maria.lua +++ b/data-otservbr-global/npc/maria.lua @@ -72,7 +72,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/maro.lua b/data-otservbr-global/npc/maro.lua index 80730a55a0c..7ba549262f7 100644 --- a/data-otservbr-global/npc/maro.lua +++ b/data-otservbr-global/npc/maro.lua @@ -90,7 +90,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/maryza.lua b/data-otservbr-global/npc/maryza.lua index 0e5eddebaf9..44901801fc4 100644 --- a/data-otservbr-global/npc/maryza.lua +++ b/data-otservbr-global/npc/maryza.lua @@ -105,7 +105,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/maun.lua b/data-otservbr-global/npc/maun.lua index 63a84550378..9e57ca6b862 100644 --- a/data-otservbr-global/npc/maun.lua +++ b/data-otservbr-global/npc/maun.lua @@ -134,7 +134,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/mehkesh.lua b/data-otservbr-global/npc/mehkesh.lua index 53fe483d739..509b4cd8080 100644 --- a/data-otservbr-global/npc/mehkesh.lua +++ b/data-otservbr-global/npc/mehkesh.lua @@ -86,7 +86,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/melfar.lua b/data-otservbr-global/npc/melfar.lua index 3a9fad93f84..5decb928643 100644 --- a/data-otservbr-global/npc/melfar.lua +++ b/data-otservbr-global/npc/melfar.lua @@ -32,7 +32,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/memech.lua b/data-otservbr-global/npc/memech.lua index 325cb316460..f7b3f9f9498 100644 --- a/data-otservbr-global/npc/memech.lua +++ b/data-otservbr-global/npc/memech.lua @@ -148,7 +148,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/messenger_of_santa.lua b/data-otservbr-global/npc/messenger_of_santa.lua index 89cb7645b67..e61b89218b5 100644 --- a/data-otservbr-global/npc/messenger_of_santa.lua +++ b/data-otservbr-global/npc/messenger_of_santa.lua @@ -68,7 +68,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/mirabell.lua b/data-otservbr-global/npc/mirabell.lua index ced81dd798c..5bb5070245a 100644 --- a/data-otservbr-global/npc/mirabell.lua +++ b/data-otservbr-global/npc/mirabell.lua @@ -141,7 +141,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/miraia.lua b/data-otservbr-global/npc/miraia.lua index e8a22ca1abb..00101154766 100644 --- a/data-otservbr-global/npc/miraia.lua +++ b/data-otservbr-global/npc/miraia.lua @@ -212,7 +212,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/mordecai.lua b/data-otservbr-global/npc/mordecai.lua index 00e744a9ebd..60063a423ba 100644 --- a/data-otservbr-global/npc/mordecai.lua +++ b/data-otservbr-global/npc/mordecai.lua @@ -159,7 +159,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/morpel.lua b/data-otservbr-global/npc/morpel.lua index 293ff0a9452..3f58c58ae93 100644 --- a/data-otservbr-global/npc/morpel.lua +++ b/data-otservbr-global/npc/morpel.lua @@ -139,7 +139,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/mortimer.lua b/data-otservbr-global/npc/mortimer.lua index 8ff80fa1a18..79c8d734640 100644 --- a/data-otservbr-global/npc/mortimer.lua +++ b/data-otservbr-global/npc/mortimer.lua @@ -688,7 +688,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/mugluf.lua b/data-otservbr-global/npc/mugluf.lua index b24e1679cfa..3fe25c7fd79 100644 --- a/data-otservbr-global/npc/mugluf.lua +++ b/data-otservbr-global/npc/mugluf.lua @@ -64,7 +64,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/mugruu.lua b/data-otservbr-global/npc/mugruu.lua index d724b37b6c8..7bf2e2efd08 100644 --- a/data-otservbr-global/npc/mugruu.lua +++ b/data-otservbr-global/npc/mugruu.lua @@ -85,7 +85,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/nah_bob.lua b/data-otservbr-global/npc/nah_bob.lua index 6342c75baab..e63fffef7ba 100644 --- a/data-otservbr-global/npc/nah_bob.lua +++ b/data-otservbr-global/npc/nah_bob.lua @@ -141,7 +141,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/nelliem.lua b/data-otservbr-global/npc/nelliem.lua index 5cc550db23f..fb5816563fe 100644 --- a/data-otservbr-global/npc/nelliem.lua +++ b/data-otservbr-global/npc/nelliem.lua @@ -76,7 +76,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/nelly.lua b/data-otservbr-global/npc/nelly.lua index 88dff5dfbc6..8c3b123c47a 100644 --- a/data-otservbr-global/npc/nelly.lua +++ b/data-otservbr-global/npc/nelly.lua @@ -165,7 +165,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/nezil.lua b/data-otservbr-global/npc/nezil.lua index 58ea1cda4c8..5bb7cd4f5fb 100644 --- a/data-otservbr-global/npc/nezil.lua +++ b/data-otservbr-global/npc/nezil.lua @@ -87,7 +87,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/nicholas.lua b/data-otservbr-global/npc/nicholas.lua index d252e16be2f..bb8c45a9fa2 100644 --- a/data-otservbr-global/npc/nicholas.lua +++ b/data-otservbr-global/npc/nicholas.lua @@ -157,7 +157,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/nienna.lua b/data-otservbr-global/npc/nienna.lua index 6fa94f613bb..ab70992e7e2 100644 --- a/data-otservbr-global/npc/nienna.lua +++ b/data-otservbr-global/npc/nienna.lua @@ -82,7 +82,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/ninos.lua b/data-otservbr-global/npc/ninos.lua index 43faf66ad8d..d55c55939d8 100644 --- a/data-otservbr-global/npc/ninos.lua +++ b/data-otservbr-global/npc/ninos.lua @@ -98,7 +98,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/nipuna.lua b/data-otservbr-global/npc/nipuna.lua index 32623777ff7..aa9d74cec52 100644 --- a/data-otservbr-global/npc/nipuna.lua +++ b/data-otservbr-global/npc/nipuna.lua @@ -169,7 +169,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/norbert.lua b/data-otservbr-global/npc/norbert.lua index 37a869b24f0..cd2fb6327c4 100644 --- a/data-otservbr-global/npc/norbert.lua +++ b/data-otservbr-global/npc/norbert.lua @@ -66,7 +66,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/norma.lua b/data-otservbr-global/npc/norma.lua index aa5c3d5a6c7..9842a07ebee 100644 --- a/data-otservbr-global/npc/norma.lua +++ b/data-otservbr-global/npc/norma.lua @@ -214,7 +214,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/nydala.lua b/data-otservbr-global/npc/nydala.lua index 1ef6b0f11bd..b7db88f0baa 100644 --- a/data-otservbr-global/npc/nydala.lua +++ b/data-otservbr-global/npc/nydala.lua @@ -163,7 +163,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/obi.lua b/data-otservbr-global/npc/obi.lua index 3eac0802b4a..d63995619da 100644 --- a/data-otservbr-global/npc/obi.lua +++ b/data-otservbr-global/npc/obi.lua @@ -156,7 +156,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/odemara.lua b/data-otservbr-global/npc/odemara.lua index 8ab4e84152f..bcfe94bf8eb 100644 --- a/data-otservbr-global/npc/odemara.lua +++ b/data-otservbr-global/npc/odemara.lua @@ -133,7 +133,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/oiriz.lua b/data-otservbr-global/npc/oiriz.lua index 38a49116949..3a5d3a6b411 100644 --- a/data-otservbr-global/npc/oiriz.lua +++ b/data-otservbr-global/npc/oiriz.lua @@ -126,7 +126,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/oldrak.lua b/data-otservbr-global/npc/oldrak.lua index b1f39216c7e..ff5860fa322 100644 --- a/data-otservbr-global/npc/oldrak.lua +++ b/data-otservbr-global/npc/oldrak.lua @@ -32,7 +32,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/olrik.lua b/data-otservbr-global/npc/olrik.lua index bcf6418e418..42886e71318 100644 --- a/data-otservbr-global/npc/olrik.lua +++ b/data-otservbr-global/npc/olrik.lua @@ -100,7 +100,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/omur.lua b/data-otservbr-global/npc/omur.lua index 54f2db38f35..8d869c2eca0 100644 --- a/data-otservbr-global/npc/omur.lua +++ b/data-otservbr-global/npc/omur.lua @@ -68,7 +68,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/orockle.lua b/data-otservbr-global/npc/orockle.lua index 2d9e70a4549..373a86e2ad2 100644 --- a/data-otservbr-global/npc/orockle.lua +++ b/data-otservbr-global/npc/orockle.lua @@ -88,7 +88,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/peggy.lua b/data-otservbr-global/npc/peggy.lua index 7a0abcff7b5..6c67820332a 100644 --- a/data-otservbr-global/npc/peggy.lua +++ b/data-otservbr-global/npc/peggy.lua @@ -156,7 +156,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/pemaret.lua b/data-otservbr-global/npc/pemaret.lua index 3282088d4fa..ab8ea5ecc62 100644 --- a/data-otservbr-global/npc/pemaret.lua +++ b/data-otservbr-global/npc/pemaret.lua @@ -120,7 +120,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/penny.lua b/data-otservbr-global/npc/penny.lua index 28296a2f62a..cc20d497bf5 100644 --- a/data-otservbr-global/npc/penny.lua +++ b/data-otservbr-global/npc/penny.lua @@ -80,7 +80,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/perac.lua b/data-otservbr-global/npc/perac.lua index cad20a281a8..1cc368953de 100644 --- a/data-otservbr-global/npc/perac.lua +++ b/data-otservbr-global/npc/perac.lua @@ -68,7 +68,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/perod.lua b/data-otservbr-global/npc/perod.lua index 46361f1e82a..b0bc5e7a57d 100644 --- a/data-otservbr-global/npc/perod.lua +++ b/data-otservbr-global/npc/perod.lua @@ -159,7 +159,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/pompan.lua b/data-otservbr-global/npc/pompan.lua index 78c25921fca..19fed2f7ed0 100644 --- a/data-otservbr-global/npc/pompan.lua +++ b/data-otservbr-global/npc/pompan.lua @@ -89,7 +89,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/pugwah.lua b/data-otservbr-global/npc/pugwah.lua index 56f497944d8..9e9007a7667 100644 --- a/data-otservbr-global/npc/pugwah.lua +++ b/data-otservbr-global/npc/pugwah.lua @@ -68,7 +68,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/queen_eloise.lua b/data-otservbr-global/npc/queen_eloise.lua index dc72a95ba6c..a9397061a56 100644 --- a/data-otservbr-global/npc/queen_eloise.lua +++ b/data-otservbr-global/npc/queen_eloise.lua @@ -251,7 +251,5 @@ npcHandler:setMessage(MESSAGE_WALKAWAY, "Farewell, |PLAYERNAME|!") npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:setCallback(CALLBACK_GREET, greetCallback) -npcHandler:addModule(FocusModule:new(), npcConfig.name, true, true, true) - -- npcType registering the npcConfig table npcType:register(npcConfig) diff --git a/data-otservbr-global/npc/quero.lua b/data-otservbr-global/npc/quero.lua index 5c62aef7f8e..7932b8c065f 100644 --- a/data-otservbr-global/npc/quero.lua +++ b/data-otservbr-global/npc/quero.lua @@ -64,7 +64,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/rabaz.lua b/data-otservbr-global/npc/rabaz.lua index 83bb3254597..3e47da6a5ca 100644 --- a/data-otservbr-global/npc/rabaz.lua +++ b/data-otservbr-global/npc/rabaz.lua @@ -194,7 +194,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/rachel.lua b/data-otservbr-global/npc/rachel.lua index 2153bb201ac..3206c99864a 100644 --- a/data-otservbr-global/npc/rachel.lua +++ b/data-otservbr-global/npc/rachel.lua @@ -177,7 +177,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/rafzan.lua b/data-otservbr-global/npc/rafzan.lua index 17718965a06..9ab44019f04 100644 --- a/data-otservbr-global/npc/rafzan.lua +++ b/data-otservbr-global/npc/rafzan.lua @@ -96,7 +96,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/ramina.lua b/data-otservbr-global/npc/ramina.lua index 1e9d7f06335..b115ca4b6f9 100644 --- a/data-otservbr-global/npc/ramina.lua +++ b/data-otservbr-global/npc/ramina.lua @@ -73,7 +73,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/rashid.lua b/data-otservbr-global/npc/rashid.lua index 0fbea6a6774..7c719f0c655 100644 --- a/data-otservbr-global/npc/rashid.lua +++ b/data-otservbr-global/npc/rashid.lua @@ -439,7 +439,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/rashid_custom.lua b/data-otservbr-global/npc/rashid_custom.lua index c68e5aeec36..421427ee795 100644 --- a/data-otservbr-global/npc/rashid_custom.lua +++ b/data-otservbr-global/npc/rashid_custom.lua @@ -441,7 +441,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/ray.lua b/data-otservbr-global/npc/ray.lua index 020c72c791f..aaae5d40c25 100644 --- a/data-otservbr-global/npc/ray.lua +++ b/data-otservbr-global/npc/ray.lua @@ -63,7 +63,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/red_lilly.lua b/data-otservbr-global/npc/red_lilly.lua index 6db25328893..eb91a4aa813 100644 --- a/data-otservbr-global/npc/red_lilly.lua +++ b/data-otservbr-global/npc/red_lilly.lua @@ -142,7 +142,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/redward.lua b/data-otservbr-global/npc/redward.lua index bf717bdbd03..78fb1c749fb 100644 --- a/data-otservbr-global/npc/redward.lua +++ b/data-otservbr-global/npc/redward.lua @@ -63,7 +63,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/richard.lua b/data-otservbr-global/npc/richard.lua index ff8c056b6c0..d38b6c93b0b 100644 --- a/data-otservbr-global/npc/richard.lua +++ b/data-otservbr-global/npc/richard.lua @@ -49,7 +49,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/robert.lua b/data-otservbr-global/npc/robert.lua index ff1bb19e977..794d1bcb122 100644 --- a/data-otservbr-global/npc/robert.lua +++ b/data-otservbr-global/npc/robert.lua @@ -164,7 +164,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/rock_in_a_hard_place.lua b/data-otservbr-global/npc/rock_in_a_hard_place.lua index 1a9fa25a8d5..64ee5e08174 100644 --- a/data-otservbr-global/npc/rock_in_a_hard_place.lua +++ b/data-otservbr-global/npc/rock_in_a_hard_place.lua @@ -315,7 +315,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/rodney.lua b/data-otservbr-global/npc/rodney.lua index cf2e5e839d8..9adc859e493 100644 --- a/data-otservbr-global/npc/rodney.lua +++ b/data-otservbr-global/npc/rodney.lua @@ -67,7 +67,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/romella.lua b/data-otservbr-global/npc/romella.lua index 07fe1e6a51a..50caf76084e 100644 --- a/data-otservbr-global/npc/romella.lua +++ b/data-otservbr-global/npc/romella.lua @@ -128,7 +128,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/romir.lua b/data-otservbr-global/npc/romir.lua index 70bcb0e8da0..11ea038d266 100644 --- a/data-otservbr-global/npc/romir.lua +++ b/data-otservbr-global/npc/romir.lua @@ -157,7 +157,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/rose.lua b/data-otservbr-global/npc/rose.lua index 5ecc72eb7af..d8be4f8c59e 100644 --- a/data-otservbr-global/npc/rose.lua +++ b/data-otservbr-global/npc/rose.lua @@ -98,7 +98,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/rowenna.lua b/data-otservbr-global/npc/rowenna.lua index b71dc418e6f..1286e52c5ff 100644 --- a/data-otservbr-global/npc/rowenna.lua +++ b/data-otservbr-global/npc/rowenna.lua @@ -113,7 +113,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/rudolph.lua b/data-otservbr-global/npc/rudolph.lua index ee94289686e..ffbe381ddb2 100644 --- a/data-otservbr-global/npc/rudolph.lua +++ b/data-otservbr-global/npc/rudolph.lua @@ -74,7 +74,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/runtel_blackspark.lua b/data-otservbr-global/npc/runtel_blackspark.lua index 2ea8e6d3418..0722946c735 100644 --- a/data-otservbr-global/npc/runtel_blackspark.lua +++ b/data-otservbr-global/npc/runtel_blackspark.lua @@ -105,7 +105,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/sam.lua b/data-otservbr-global/npc/sam.lua index 6090a353615..cd3a517c147 100644 --- a/data-otservbr-global/npc/sam.lua +++ b/data-otservbr-global/npc/sam.lua @@ -244,7 +244,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/sandra.lua b/data-otservbr-global/npc/sandra.lua index 71d1eeb4774..69bc18a17b7 100644 --- a/data-otservbr-global/npc/sandra.lua +++ b/data-otservbr-global/npc/sandra.lua @@ -67,7 +67,7 @@ local function creatureSayCallback(npc, creature, type, message) if table.contains({ "vial", "ticket", "bonus", "deposit" }, message) then if player:getStorageValue(Storage.OutfitQuest.MageSummoner.AddonBelt) < 1 then - npcHandler:say("You have " .. player:getStorageValue(38412) .. " credits. We have a special offer right now for depositing vials. Are you interested in hearing it?", npc, creature) + npcHandler:say("We have a special offer right now for depositing vials. Are you interested in hearing it?", npc, creature) npcHandler:setTopic(playerId, 1) elseif player:getStorageValue(Storage.OutfitQuest.MageSummoner.AddonBelt) >= 1 then npcHandler:say("Would you like to get a lottery ticket instead of the deposit for your vials?", npc, creature) @@ -119,14 +119,8 @@ local function creatureSayCallback(npc, creature, type, message) player:setStorageValue(Storage.OutfitQuest.DefaultStart, 1) --this for default start of Outfit and Addon Quests npcHandler:setTopic(playerId, 0) elseif npcHandler:getTopic(playerId) == 3 then - if player:getStorageValue(38412) >= 100 or player:removeItem(283, 100) or player:removeItem(284, 100) or player:removeItem(285, 100) then - npcHandler:say( - "Alright, thank you very much! Here is your lottery ticket, good luck. \ - Would you like to deposit more vials that way?", - npc, - creature - ) - player:setStorageValue(38412, player:getStorageValue(38412) - 100) + if player:removeItem(283, 100) or player:removeItem(284, 100) or player:removeItem(285, 100) then + npcHandler:say("Alright, thank you very much! Here is your lottery ticket, good luck. Would you like to deposit more vials that way?", npc, creature) player:addItem(5957, 1) npcHandler:setTopic(playerId, 0) else @@ -209,7 +203,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/sarina.lua b/data-otservbr-global/npc/sarina.lua index 6a6efece896..3429b5f6d35 100644 --- a/data-otservbr-global/npc/sarina.lua +++ b/data-otservbr-global/npc/sarina.lua @@ -126,7 +126,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/satsu.lua b/data-otservbr-global/npc/satsu.lua index 74ca8023e76..d925e5b5d37 100644 --- a/data-otservbr-global/npc/satsu.lua +++ b/data-otservbr-global/npc/satsu.lua @@ -70,7 +70,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/scott.lua b/data-otservbr-global/npc/scott.lua index 90ae0c772b2..8068ae2f6dd 100644 --- a/data-otservbr-global/npc/scott.lua +++ b/data-otservbr-global/npc/scott.lua @@ -69,7 +69,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/serafin.lua b/data-otservbr-global/npc/serafin.lua index 3f4a763106b..fe6a57ca249 100644 --- a/data-otservbr-global/npc/serafin.lua +++ b/data-otservbr-global/npc/serafin.lua @@ -102,7 +102,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/sessek.lua b/data-otservbr-global/npc/sessek.lua index 546c267515d..ee7f56a2536 100644 --- a/data-otservbr-global/npc/sessek.lua +++ b/data-otservbr-global/npc/sessek.lua @@ -67,7 +67,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/shanar.lua b/data-otservbr-global/npc/shanar.lua index 6f95d387fe9..157a27000ac 100644 --- a/data-otservbr-global/npc/shanar.lua +++ b/data-otservbr-global/npc/shanar.lua @@ -123,7 +123,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/sherry_mcronald.lua b/data-otservbr-global/npc/sherry_mcronald.lua index fd5e36647ec..58afd1977e9 100644 --- a/data-otservbr-global/npc/sherry_mcronald.lua +++ b/data-otservbr-global/npc/sherry_mcronald.lua @@ -75,7 +75,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/shiantis.lua b/data-otservbr-global/npc/shiantis.lua index ac3290a6fed..08493c2cf2e 100644 --- a/data-otservbr-global/npc/shiantis.lua +++ b/data-otservbr-global/npc/shiantis.lua @@ -151,7 +151,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/shiriel.lua b/data-otservbr-global/npc/shiriel.lua index 4c6408e7874..546bb26447b 100644 --- a/data-otservbr-global/npc/shiriel.lua +++ b/data-otservbr-global/npc/shiriel.lua @@ -150,7 +150,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/siflind.lua b/data-otservbr-global/npc/siflind.lua index 959d916f99a..5ac37322855 100644 --- a/data-otservbr-global/npc/siflind.lua +++ b/data-otservbr-global/npc/siflind.lua @@ -283,7 +283,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/sigurd.lua b/data-otservbr-global/npc/sigurd.lua index 0ac9eaea26a..cca63a33e3e 100644 --- a/data-otservbr-global/npc/sigurd.lua +++ b/data-otservbr-global/npc/sigurd.lua @@ -147,7 +147,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/silas.lua b/data-otservbr-global/npc/silas.lua index 3dd4ffba22c..87271b1c8f3 100644 --- a/data-otservbr-global/npc/silas.lua +++ b/data-otservbr-global/npc/silas.lua @@ -85,7 +85,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/simon_the_beggar.lua b/data-otservbr-global/npc/simon_the_beggar.lua index 3cc14f697e2..84cf524075b 100644 --- a/data-otservbr-global/npc/simon_the_beggar.lua +++ b/data-otservbr-global/npc/simon_the_beggar.lua @@ -32,7 +32,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/snake_eye.lua b/data-otservbr-global/npc/snake_eye.lua index 557dea0334b..4eade5af763 100644 --- a/data-otservbr-global/npc/snake_eye.lua +++ b/data-otservbr-global/npc/snake_eye.lua @@ -89,7 +89,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/soilance.lua b/data-otservbr-global/npc/soilance.lua index c4a717e39db..4474f979744 100644 --- a/data-otservbr-global/npc/soilance.lua +++ b/data-otservbr-global/npc/soilance.lua @@ -62,7 +62,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/squeekquek.lua b/data-otservbr-global/npc/squeekquek.lua index 1d0a5e6d675..5f6217f538b 100644 --- a/data-otservbr-global/npc/squeekquek.lua +++ b/data-otservbr-global/npc/squeekquek.lua @@ -37,7 +37,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/stan.lua b/data-otservbr-global/npc/stan.lua index fa6f6bf87b4..4769e9c0080 100644 --- a/data-otservbr-global/npc/stan.lua +++ b/data-otservbr-global/npc/stan.lua @@ -63,7 +63,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/sundara.lua b/data-otservbr-global/npc/sundara.lua index a4b973e0db8..c1364240fa9 100644 --- a/data-otservbr-global/npc/sundara.lua +++ b/data-otservbr-global/npc/sundara.lua @@ -173,7 +173,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/swolt.lua b/data-otservbr-global/npc/swolt.lua index ebe8cada59d..5d8a7b48830 100644 --- a/data-otservbr-global/npc/swolt.lua +++ b/data-otservbr-global/npc/swolt.lua @@ -93,7 +93,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/taegen.lua b/data-otservbr-global/npc/taegen.lua index 3d055a52243..5df29712232 100644 --- a/data-otservbr-global/npc/taegen.lua +++ b/data-otservbr-global/npc/taegen.lua @@ -92,7 +92,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/talila.lua b/data-otservbr-global/npc/talila.lua index eff8f9b5c54..c3d374ee1fb 100644 --- a/data-otservbr-global/npc/talila.lua +++ b/data-otservbr-global/npc/talila.lua @@ -216,7 +216,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/talphion.lua b/data-otservbr-global/npc/talphion.lua index c9e6e28a9c4..9a7ec7ae7e6 100644 --- a/data-otservbr-global/npc/talphion.lua +++ b/data-otservbr-global/npc/talphion.lua @@ -94,7 +94,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/tamoril.lua b/data-otservbr-global/npc/tamoril.lua index c0dc87bbb85..654355d9be5 100644 --- a/data-otservbr-global/npc/tamoril.lua +++ b/data-otservbr-global/npc/tamoril.lua @@ -113,7 +113,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/tanaro.lua b/data-otservbr-global/npc/tanaro.lua index 0f843a24d83..bf43db15d79 100644 --- a/data-otservbr-global/npc/tanaro.lua +++ b/data-otservbr-global/npc/tanaro.lua @@ -74,7 +74,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/tandros.lua b/data-otservbr-global/npc/tandros.lua index 204a32e10b8..e25ba65f2a3 100644 --- a/data-otservbr-global/npc/tandros.lua +++ b/data-otservbr-global/npc/tandros.lua @@ -160,7 +160,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/tarun.lua b/data-otservbr-global/npc/tarun.lua index 6c153469ead..31f56602f81 100644 --- a/data-otservbr-global/npc/tarun.lua +++ b/data-otservbr-global/npc/tarun.lua @@ -85,7 +85,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/telas.lua b/data-otservbr-global/npc/telas.lua index 235d0d22c44..6c0690fc5c8 100644 --- a/data-otservbr-global/npc/telas.lua +++ b/data-otservbr-global/npc/telas.lua @@ -137,7 +137,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/tesha.lua b/data-otservbr-global/npc/tesha.lua index 59575877193..95e31f97cb7 100644 --- a/data-otservbr-global/npc/tesha.lua +++ b/data-otservbr-global/npc/tesha.lua @@ -148,7 +148,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/testserver_assistant.lua b/data-otservbr-global/npc/testserver_assistant.lua index 0962c3e9850..05814590bdd 100644 --- a/data-otservbr-global/npc/testserver_assistant.lua +++ b/data-otservbr-global/npc/testserver_assistant.lua @@ -86,7 +86,7 @@ local function creatureSayCallback(npc, creature, type, message) local missingBlessAmt = #missingBless + (hasToF and 0 or 1) if missingBlessAmt == 0 then - player:sendTextMessage(MESSAGE_EVENT_DEFAULT, "You are already blessed.") + player:sendTextMessage(MESSAGE_STATUS, "You are already blessed.") player:getPosition():sendMagicEffect(CONST_ME_POFF) return false end @@ -95,7 +95,7 @@ local function creatureSayCallback(npc, creature, type, message) player:addBlessing(v.id, 1) end npcHandler:say("You have been blessed by all gods, |PLAYERNAME|.", npc, creature) - player:sendTextMessage(MESSAGE_EVENT_DEFAULT, "You received the remaining " .. missingBlessAmt .. " blesses.") + player:sendTextMessage(MESSAGE_STATUS, "You received the remaining " .. missingBlessAmt .. " blesses.") player:getPosition():sendMagicEffect(CONST_ME_HOLYAREA) end diff --git a/data-otservbr-global/npc/tezila.lua b/data-otservbr-global/npc/tezila.lua index ada79994ccc..dab92c807f5 100644 --- a/data-otservbr-global/npc/tezila.lua +++ b/data-otservbr-global/npc/tezila.lua @@ -125,7 +125,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/the_librarian.lua b/data-otservbr-global/npc/the_librarian.lua index 8837ad5451c..45b786342de 100644 --- a/data-otservbr-global/npc/the_librarian.lua +++ b/data-otservbr-global/npc/the_librarian.lua @@ -109,7 +109,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/the_lootmonger.lua b/data-otservbr-global/npc/the_lootmonger.lua index cee60e6850f..e0c2b03da32 100644 --- a/data-otservbr-global/npc/the_lootmonger.lua +++ b/data-otservbr-global/npc/the_lootmonger.lua @@ -79,7 +79,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/thomas.lua b/data-otservbr-global/npc/thomas.lua index f56305ee22a..ed20c24b02e 100644 --- a/data-otservbr-global/npc/thomas.lua +++ b/data-otservbr-global/npc/thomas.lua @@ -75,7 +75,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/timur.lua b/data-otservbr-global/npc/timur.lua index 9780e9d9c7f..f2a23509601 100644 --- a/data-otservbr-global/npc/timur.lua +++ b/data-otservbr-global/npc/timur.lua @@ -100,7 +100,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/tired_tree.lua b/data-otservbr-global/npc/tired_tree.lua index 0ac8d3e240c..99627b4cdb0 100644 --- a/data-otservbr-global/npc/tired_tree.lua +++ b/data-otservbr-global/npc/tired_tree.lua @@ -11,12 +11,7 @@ npcConfig.walkInterval = 2000 npcConfig.walkRadius = 2 npcConfig.outfit = { - lookType = 0, - lookHead = 0, - lookBody = 0, - lookLegs = 0, - lookFeet = 0, - lookAddons = 0, + lookTypeEx = 25405, } npcConfig.flags = { diff --git a/data-otservbr-global/npc/todd.lua b/data-otservbr-global/npc/todd.lua index b6038a0c5f4..25c8cb98813 100644 --- a/data-otservbr-global/npc/todd.lua +++ b/data-otservbr-global/npc/todd.lua @@ -97,7 +97,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/tokel.lua b/data-otservbr-global/npc/tokel.lua index 1c8978a0326..b70ce6ba5f7 100644 --- a/data-otservbr-global/npc/tokel.lua +++ b/data-otservbr-global/npc/tokel.lua @@ -64,7 +64,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/tom.lua b/data-otservbr-global/npc/tom.lua index 680b6cc98af..c278a728d77 100644 --- a/data-otservbr-global/npc/tom.lua +++ b/data-otservbr-global/npc/tom.lua @@ -290,7 +290,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/tonar.lua b/data-otservbr-global/npc/tonar.lua new file mode 100644 index 00000000000..e13595e411f --- /dev/null +++ b/data-otservbr-global/npc/tonar.lua @@ -0,0 +1,77 @@ +local internalNpcName = "Tonar" +local npcType = Game.createNpcType(internalNpcName) +local npcConfig = {} + +npcConfig.name = internalNpcName +npcConfig.description = internalNpcName + +npcConfig.health = 100 +npcConfig.maxHealth = npcConfig.health +npcConfig.walkInterval = 2000 +npcConfig.walkRadius = 2 + +npcConfig.outfit = { + lookType = 146, + lookHead = 0, + lookBody = 66, + lookLegs = 124, + lookFeet = 0, + lookAddons = 2, +} + +npcConfig.flags = { + floorchange = false, +} + +npcConfig.voices = { + interval = 15000, + chance = 50, + { text = "What a beautiful day for a little boat trip." }, +} + +local keywordHandler = KeywordHandler:new() +local npcHandler = NpcHandler:new(keywordHandler) + +npcType.onThink = function(npc, interval) + npcHandler:onThink(npc, interval) +end + +npcType.onAppear = function(npc, creature) + npcHandler:onAppear(npc, creature) +end + +npcType.onDisappear = function(npc, creature) + npcHandler:onDisappear(npc, creature) +end + +npcType.onMove = function(npc, creature, fromPosition, toPosition) + npcHandler:onMove(npc, creature, fromPosition, toPosition) +end + +npcType.onSay = function(npc, creature, type, message) + npcHandler:onSay(npc, creature, type, message) +end + +npcType.onCloseChannel = function(npc, creature) + npcHandler:onCloseChannel(npc, creature) +end + +-- Travel +local function addTravelKeyword(keyword, text, cost, destination, action, condition) + if condition then + keywordHandler:addKeyword({ keyword }, StdModule.say, { npcHandler = npcHandler, text = "You are not ready yet." }, condition) + end + + local travelKeyword = keywordHandler:addKeyword({ keyword }, StdModule.say, { npcHandler = npcHandler, text = text, cost = cost, discount = "postman" }) + travelKeyword:addChildKeyword({ "yes" }, StdModule.travel, { npcHandler = npcHandler, premium = false, text = "Alright, off we go!", cost = cost, discount = "postman", destination = destination }, nil, action) + travelKeyword:addChildKeyword({ "no" }, StdModule.say, { npcHandler = npcHandler, text = "We would like to serve you some time.", reset = true }) +end + +addTravelKeyword("passage", "A passage to Oskayaat? Shall we cast off?", 0, Position(33070, 32916, 7)) + +npcHandler:setMessage(MESSAGE_GREET, "Welcome, Sir.") + +npcHandler:addModule(FocusModule:new(), npcConfig.name, true, true, true) + +-- npcType registering the npcConfig table +npcType:register(npcConfig) diff --git a/data-otservbr-global/npc/tonar_oskayaat.lua b/data-otservbr-global/npc/tonar_oskayaat.lua new file mode 100644 index 00000000000..50073bb5818 --- /dev/null +++ b/data-otservbr-global/npc/tonar_oskayaat.lua @@ -0,0 +1,77 @@ +local internalNpcName = "Tonar" +local npcType = Game.createNpcType("Tonar Oskayaat") +local npcConfig = {} + +npcConfig.name = internalNpcName +npcConfig.description = internalNpcName + +npcConfig.health = 100 +npcConfig.maxHealth = npcConfig.health +npcConfig.walkInterval = 2000 +npcConfig.walkRadius = 2 + +npcConfig.outfit = { + lookType = 146, + lookHead = 0, + lookBody = 66, + lookLegs = 124, + lookFeet = 0, + lookAddons = 2, +} + +npcConfig.flags = { + floorchange = false, +} + +npcConfig.voices = { + interval = 15000, + chance = 50, + { text = "I don't feel safe here ... I hope we can return to Ankrahmun soon." }, +} + +local keywordHandler = KeywordHandler:new() +local npcHandler = NpcHandler:new(keywordHandler) + +npcType.onThink = function(npc, interval) + npcHandler:onThink(npc, interval) +end + +npcType.onAppear = function(npc, creature) + npcHandler:onAppear(npc, creature) +end + +npcType.onDisappear = function(npc, creature) + npcHandler:onDisappear(npc, creature) +end + +npcType.onMove = function(npc, creature, fromPosition, toPosition) + npcHandler:onMove(npc, creature, fromPosition, toPosition) +end + +npcType.onSay = function(npc, creature, type, message) + npcHandler:onSay(npc, creature, type, message) +end + +npcType.onCloseChannel = function(npc, creature) + npcHandler:onCloseChannel(npc, creature) +end + +-- Travel +local function addTravelKeyword(keyword, text, cost, destination, action, condition) + if condition then + keywordHandler:addKeyword({ keyword }, StdModule.say, { npcHandler = npcHandler, text = "You are not ready yet." }, condition) + end + + local travelKeyword = keywordHandler:addKeyword({ keyword }, StdModule.say, { npcHandler = npcHandler, text = text, cost = cost, discount = "postman" }) + travelKeyword:addChildKeyword({ "yes" }, StdModule.travel, { npcHandler = npcHandler, premium = false, text = "Alright, off we go!", cost = cost, discount = "postman", destination = destination }, nil, action) + travelKeyword:addChildKeyword({ "no" }, StdModule.say, { npcHandler = npcHandler, text = "We would like to serve you some time.", reset = true }) +end + +addTravelKeyword("passage", "A passage to Ankrahmun? Shall we cast off?", 0, Position(33182, 32883, 7)) + +npcHandler:setMessage(MESSAGE_GREET, "Welcome back, Sir.") + +npcHandler:addModule(FocusModule:new(), npcConfig.name, true, true, true) + +-- npcType registering the npcConfig table +npcType:register(npcConfig) diff --git a/data-otservbr-global/npc/topsy.lua b/data-otservbr-global/npc/topsy.lua index 751d1595c4b..395fd23cbeb 100644 --- a/data-otservbr-global/npc/topsy.lua +++ b/data-otservbr-global/npc/topsy.lua @@ -183,7 +183,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/tothdral.lua b/data-otservbr-global/npc/tothdral.lua index b5833cdc405..494115a1caf 100644 --- a/data-otservbr-global/npc/tothdral.lua +++ b/data-otservbr-global/npc/tothdral.lua @@ -69,7 +69,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/towncryer.lua b/data-otservbr-global/npc/towncryer.lua index 6e17b94b420..3e6a93ad973 100644 --- a/data-otservbr-global/npc/towncryer.lua +++ b/data-otservbr-global/npc/towncryer.lua @@ -32,22 +32,15 @@ npcConfig.voices = { } local worldChanges = { - { - storage = GlobalStorage.FuryGates, - text = "Hear ye! Hear ye! A fiery gate has opened, threatening a city! Guard the people frightened, their death would be a pity!", - }, - { - storage = GlobalStorage.Yasir, - text = "Hear ye! Hear ye! What a lucky and beautiful day! Visit Carlin, Ankrahmun, or Liberty Bay. Yasir, the oriental trader might be there. Gather your creature products, for this chance is rare.", - }, - { - storage = GlobalStorage.NightmareIsle, - text = "Hear me! Hear me! A river is flooding, south of the outlaw base. Explore a new isle, an unknown place. Don't be afraid, but ready your blade.", - }, + { text = "In Ankrahmun's desert, a storm has revealed the entry to a nightmare that can't be sealed. Horrible creatures there spell instant death to all young adventurers who dare take a breath!", storage = GlobalStorage.WorldBoard.NightmareIsle.AnkrahmunNorth }, + { text = "Near Darashia's coast, a storm has revealed the entry to a nightmare that can't be sealed. Horrible creatures there spell instant death to all young adventurers who dare take a breath!", storage = GlobalStorage.WorldBoard.NightmareIsle.DarashiaNorth }, + { text = "Near Drefia's mountains, a storm has revealed the entry to a nightmare that can't be sealed. Horrible creatures there spell instant death to all young adventurers who dare take a breath!", storage = GlobalStorage.WorldBoard.NightmareIsle.DarashiaWest }, + { text = "Hear ye! Hear ye! What a lucky and beautiful day! Visit Carlin, Ankrahmun, or Liberty Bay. Yasir, the oriental trader might be there. Gather your creature products, for this chance is rare.", storage = GlobalStorage.Yasir }, + { text = "Hear ye! Hear ye! A fiery gate has opened, threatening a city! Guard the people frightened, their death would be a pity!", storage = GlobalStorage.FuryGates }, } for i = 1, #worldChanges do - if getGlobalStorageValue(worldChanges[i].storage) > 0 then + if Game.getStorageValue(worldChanges[i].storage) > 0 then table.insert(npcConfig.voices, { text = worldChanges[i].text }) end end diff --git a/data-otservbr-global/npc/turvy.lua b/data-otservbr-global/npc/turvy.lua index 52d203391f9..b579efb9c75 100644 --- a/data-otservbr-global/npc/turvy.lua +++ b/data-otservbr-global/npc/turvy.lua @@ -148,7 +148,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/ukea.lua b/data-otservbr-global/npc/ukea.lua index 95e5f9f5cee..33ec0ef7a1b 100644 --- a/data-otservbr-global/npc/ukea.lua +++ b/data-otservbr-global/npc/ukea.lua @@ -161,7 +161,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/ulrik.lua b/data-otservbr-global/npc/ulrik.lua index 240bee31206..8a7cb33f11a 100644 --- a/data-otservbr-global/npc/ulrik.lua +++ b/data-otservbr-global/npc/ulrik.lua @@ -131,7 +131,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/urkalio.lua b/data-otservbr-global/npc/urkalio.lua index bb0e79010b8..dbcbbc238b1 100644 --- a/data-otservbr-global/npc/urkalio.lua +++ b/data-otservbr-global/npc/urkalio.lua @@ -69,7 +69,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/ustan.lua b/data-otservbr-global/npc/ustan.lua index 237efa88c60..b7c037ae6e9 100644 --- a/data-otservbr-global/npc/ustan.lua +++ b/data-otservbr-global/npc/ustan.lua @@ -101,7 +101,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/uzgod.lua b/data-otservbr-global/npc/uzgod.lua index 31b2733437b..698ad8ea579 100644 --- a/data-otservbr-global/npc/uzgod.lua +++ b/data-otservbr-global/npc/uzgod.lua @@ -203,7 +203,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/valentina.lua b/data-otservbr-global/npc/valentina.lua index c6a2f228e53..006495432fa 100644 --- a/data-otservbr-global/npc/valentina.lua +++ b/data-otservbr-global/npc/valentina.lua @@ -45,7 +45,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/valindara.lua b/data-otservbr-global/npc/valindara.lua index dbb4ab04b7d..69655358dfe 100644 --- a/data-otservbr-global/npc/valindara.lua +++ b/data-otservbr-global/npc/valindara.lua @@ -221,7 +221,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/velvet.lua b/data-otservbr-global/npc/velvet.lua index f63137e9836..b8368a19349 100644 --- a/data-otservbr-global/npc/velvet.lua +++ b/data-otservbr-global/npc/velvet.lua @@ -83,7 +83,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/vera.lua b/data-otservbr-global/npc/vera.lua index 561058d7e17..609ab307d91 100644 --- a/data-otservbr-global/npc/vera.lua +++ b/data-otservbr-global/npc/vera.lua @@ -159,7 +159,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/victor.lua b/data-otservbr-global/npc/victor.lua index b2f6f2520f2..e0a57424abe 100644 --- a/data-otservbr-global/npc/victor.lua +++ b/data-otservbr-global/npc/victor.lua @@ -60,7 +60,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/vincent.lua b/data-otservbr-global/npc/vincent.lua index f05050af223..58f933670f7 100644 --- a/data-otservbr-global/npc/vincent.lua +++ b/data-otservbr-global/npc/vincent.lua @@ -86,7 +86,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/wally.lua b/data-otservbr-global/npc/wally.lua index a8a19422c90..6c86eee523d 100644 --- a/data-otservbr-global/npc/wally.lua +++ b/data-otservbr-global/npc/wally.lua @@ -63,7 +63,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/walter_jaeger.lua b/data-otservbr-global/npc/walter_jaeger.lua index ac2933a9224..6911d7ed323 100644 --- a/data-otservbr-global/npc/walter_jaeger.lua +++ b/data-otservbr-global/npc/walter_jaeger.lua @@ -291,7 +291,7 @@ local function processItemInboxPurchase(player, name, id) return true end else - player:sendTextMessage(MESSAGE_INFO_DESCR, "Please make sure you have free slots in your store inbox.") + player:sendTextMessage(MESSAGE_LOOK, "Please make sure you have free slots in your store inbox.") end return false diff --git a/data-otservbr-global/npc/willard.lua b/data-otservbr-global/npc/willard.lua index 6a420a5e396..f35d20ad231 100644 --- a/data-otservbr-global/npc/willard.lua +++ b/data-otservbr-global/npc/willard.lua @@ -207,7 +207,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/willie.lua b/data-otservbr-global/npc/willie.lua index df4436b67ab..d4936298ba9 100644 --- a/data-otservbr-global/npc/willie.lua +++ b/data-otservbr-global/npc/willie.lua @@ -38,7 +38,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/xed.lua b/data-otservbr-global/npc/xed.lua index 9630f0d3412..c1eded467e3 100644 --- a/data-otservbr-global/npc/xed.lua +++ b/data-otservbr-global/npc/xed.lua @@ -68,7 +68,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/xelvar.lua b/data-otservbr-global/npc/xelvar.lua index 9e524f3f6f5..9180dee6f3b 100644 --- a/data-otservbr-global/npc/xelvar.lua +++ b/data-otservbr-global/npc/xelvar.lua @@ -133,7 +133,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/xodet.lua b/data-otservbr-global/npc/xodet.lua index f519a5ca2a4..2d8832bd964 100644 --- a/data-otservbr-global/npc/xodet.lua +++ b/data-otservbr-global/npc/xodet.lua @@ -178,7 +178,7 @@ end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/yaman.lua b/data-otservbr-global/npc/yaman.lua index 951528e7e6e..3c66cd888e5 100644 --- a/data-otservbr-global/npc/yaman.lua +++ b/data-otservbr-global/npc/yaman.lua @@ -168,7 +168,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/yana.lua b/data-otservbr-global/npc/yana.lua index 9f811f5964f..d5d110d75f7 100644 --- a/data-otservbr-global/npc/yana.lua +++ b/data-otservbr-global/npc/yana.lua @@ -49,7 +49,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/yanni.lua b/data-otservbr-global/npc/yanni.lua index d08b29c753e..588e9483804 100644 --- a/data-otservbr-global/npc/yanni.lua +++ b/data-otservbr-global/npc/yanni.lua @@ -94,7 +94,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/yasir.lua b/data-otservbr-global/npc/yasir.lua index f68822dc38d..d576b611e53 100644 --- a/data-otservbr-global/npc/yasir.lua +++ b/data-otservbr-global/npc/yasir.lua @@ -653,7 +653,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/yoem.lua b/data-otservbr-global/npc/yoem.lua index 9c24d5a86d8..0d1725580a4 100644 --- a/data-otservbr-global/npc/yoem.lua +++ b/data-otservbr-global/npc/yoem.lua @@ -167,7 +167,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/yonan.lua b/data-otservbr-global/npc/yonan.lua index b499e110254..44dbb8dd83c 100644 --- a/data-otservbr-global/npc/yonan.lua +++ b/data-otservbr-global/npc/yonan.lua @@ -97,7 +97,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/yulas.lua b/data-otservbr-global/npc/yulas.lua index 118c81d1dc4..911c56b45cf 100644 --- a/data-otservbr-global/npc/yulas.lua +++ b/data-otservbr-global/npc/yulas.lua @@ -65,7 +65,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/zaidal.lua b/data-otservbr-global/npc/zaidal.lua index f12b2769ddc..ed119fed9db 100644 --- a/data-otservbr-global/npc/zaidal.lua +++ b/data-otservbr-global/npc/zaidal.lua @@ -69,7 +69,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/zethra.lua b/data-otservbr-global/npc/zethra.lua index 833ebc89be0..e3961fed94e 100644 --- a/data-otservbr-global/npc/zethra.lua +++ b/data-otservbr-global/npc/zethra.lua @@ -76,7 +76,7 @@ end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) diff --git a/data-otservbr-global/npc/zora.lua b/data-otservbr-global/npc/zora.lua index ff12d5c8102..f9b3a458d52 100644 --- a/data-otservbr-global/npc/zora.lua +++ b/data-otservbr-global/npc/zora.lua @@ -126,7 +126,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/npc/zuma_magehide.lua b/data-otservbr-global/npc/zuma_magehide.lua index 614d84c9bfe..3633331a0bf 100644 --- a/data-otservbr-global/npc/zuma_magehide.lua +++ b/data-otservbr-global/npc/zuma_magehide.lua @@ -79,7 +79,7 @@ npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBac end -- On sell npc shop message npcType.onSellItem = function(npc, player, itemId, subtype, amount, ignore, name, totalCost) - player:sendTextMessage(MESSAGE_INFO_DESCR, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) + player:sendTextMessage(MESSAGE_TRADE, string.format("Sold %ix %s for %i gold.", amount, name, totalCost)) end -- On check npc shop message (look item) npcType.onCheckItem = function(npc, player, clientId, subType) end diff --git a/data-otservbr-global/raids/darashia/tyrn.xml b/data-otservbr-global/raids/darashia/tyrn.xml deleted file mode 100644 index 21b39dda549..00000000000 --- a/data-otservbr-global/raids/darashia/tyrn.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/data-otservbr-global/raids/roshamuul/mawhawk.xml b/data-otservbr-global/raids/roshamuul/mawhawk.xml deleted file mode 100644 index db48081d57a..00000000000 --- a/data-otservbr-global/raids/roshamuul/mawhawk.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/data-otservbr-global/scripts/actions/addons/addons.lua b/data-otservbr-global/scripts/actions/addons/addons.lua deleted file mode 100644 index 0658ab69312..00000000000 --- a/data-otservbr-global/scripts/actions/addons/addons.lua +++ /dev/null @@ -1,73 +0,0 @@ -local config = { - -- soil guardian - [16252] = { female = 514, male = 516, effect = CONST_ME_GREEN_RINGS }, - [16253] = { female = 514, male = 516, addon = 1, effect = CONST_ME_GREEN_RINGS, achievement = "Funghitastic" }, - [16254] = { female = 514, male = 516, addon = 2, effect = CONST_ME_GREEN_RINGS, achievement = "Funghitastic" }, - -- crystal warlord - [16255] = { female = 513, male = 512, effect = CONST_ME_GIANTICE }, - [16256] = { female = 513, male = 512, addon = 1, effect = CONST_ME_GIANTICE, achievement = "Crystal Clear" }, - [16257] = { female = 513, male = 512, addon = 2, effect = CONST_ME_GIANTICE, achievement = "Crystal Clear" }, - -- makeshift warrior - [27655] = { female = 1043, male = 1042 }, - [27657] = { female = 1043, male = 1042, addon = 1, achievement = "Cobbled and Patched" }, - [27656] = { female = 1043, male = 1042, addon = 2, achievement = "Cobbled and Patched" }, - -- hand of the inquisition - [31738] = { female = 1244, male = 1243, addon = 1, effect = CONST_ME_HOLYAREA, achievement = "Inquisition's Arm" }, - [31737] = { female = 1244, male = 1243, addon = 2, effect = CONST_ME_HOLYAREA, achievement = "Inquisition's Arm" }, - -- poltergeist - [32630] = { female = 1271, male = 1270, addon = 1, effect = CONST_ME_BLUE_GHOST, achievement = "Mainstreet Nightmare" }, - [32631] = { female = 1271, male = 1270, addon = 2, effect = CONST_ME_BLUE_GHOST, achievement = "Mainstreet Nightmare" }, - -- rascoohan - [35595] = { female = 1372, male = 1371, addon = 1, achievement = "Honorary Rascoohan" }, - [35695] = { female = 1372, male = 1371, addon = 2, achievement = "Honorary Rascoohan" }, - -- fire-fighter - [39544] = { female = 1569, male = 1568, addon = 1, achievement = "Friendly Fire" }, - [39545] = { female = 1569, male = 1568, addon = 2, achievement = "Friendly Fire" }, -} - -local addons = Action() - -function addons.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local useItem = config[item.itemid] - if not useItem then - return true - end - - local looktype = player:getSex() == PLAYERSEX_FEMALE and useItem.female or useItem.male - - if useItem.addon then - if not player:isPremium() or not player:hasOutfit(looktype) or player:hasOutfit(looktype, useItem.addon) then - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You own no premium account, lack the base outfit or already own this outfit part.") - return true - end - - player:addOutfitAddon(useItem.female, useItem.addon) - player:addOutfitAddon(useItem.male, useItem.addon) - player:getPosition():sendMagicEffect(useItem.effect or CONST_ME_GIFT_WRAPS) - if player:hasOutfit(looktype, 3) then - if useItem.achievement then - player:addAchievement(useItem.achievement) - end - end - item:remove() - else - if not player:isPremium() or player:hasOutfit(looktype) then - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You own no premium account or already own this outfit part.") - return true - end - - player:addOutfit(useItem.female) - player:addOutfit(useItem.male) - player:getPosition():sendMagicEffect(CONST_ME_GIFT_WRAPS) - item:remove() - end - return true -end - -local ids = {} -for value in pairs(config) do - table.insert(ids, value) -end - -addons:id(unpack(ids)) -addons:register() diff --git a/data-otservbr-global/scripts/actions/addons/afflicted_outfit.lua b/data-otservbr-global/scripts/actions/addons/afflicted_outfit.lua deleted file mode 100644 index 179e981451e..00000000000 --- a/data-otservbr-global/scripts/actions/addons/afflicted_outfit.lua +++ /dev/null @@ -1,65 +0,0 @@ -local afflictedOutfit = Action() - -function afflictedOutfit.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local hasOutfit = player:getStorageValue(Storage.OutfitQuest.Afflicted.Outfit) == 1 - -- Plgue Mask - if item.itemid == 12786 then - if not hasOutfit then - return false - end - - if player:getStorageValue(Storage.OutfitQuest.Afflicted.AddonPlagueMask) == 1 then - return false - end - - player:addOutfitAddon(430, 2) - player:addOutfitAddon(431, 2) - player:getPosition():sendMagicEffect(CONST_ME_POFF) - player:setStorageValue(Storage.OutfitQuest.Afflicted.AddonPlagueMask, 1) - player:say("You gained a plague mask for your outfit.", TALKTYPE_MONSTER_SAY, false, player) - item:remove() - - -- Plague Bell - elseif item.itemid == 12787 then - if not hasOutfit then - return false - end - - if player:getStorageValue(Storage.OutfitQuest.Afflicted.AddonPlagueBell) == 1 then - return false - end - - player:addOutfitAddon(430, 1) - player:addOutfitAddon(431, 1) - player:getPosition():sendMagicEffect(CONST_ME_POFF) - player:setStorageValue(Storage.OutfitQuest.Afflicted.AddonPlagueBell, 1) - player:say("You gained a plague bell for your outfit.", TALKTYPE_MONSTER_SAY, false, player) - item:remove() - - -- Outfit - else - if hasOutfit then - return false - end - - for id = 12551, 12556 do - if player:getItemCount(id) < 1 then - return false - end - end - - for id = 12551, 12556 do - player:removeItem(id, 1) - end - - player:addOutfit(430) - player:addOutfit(431) - player:getPosition():sendMagicEffect(CONST_ME_POFF) - player:setStorageValue(Storage.OutfitQuest.Afflicted.Outfit, 1) - player:say("You have restored an outfit.", TALKTYPE_MONSTER_SAY, false, player) - end - return true -end - -afflictedOutfit:id(12551, 12552, 12553, 12554, 12555, 12556, 12786, 12787) -afflictedOutfit:register() diff --git a/data-otservbr-global/scripts/actions/arena_pvp/arena_10x10.lua b/data-otservbr-global/scripts/actions/arena_pvp/arena_10x10.lua index 0d8e650ddda..931b489ef63 100644 --- a/data-otservbr-global/scripts/actions/arena_pvp/arena_10x10.lua +++ b/data-otservbr-global/scripts/actions/arena_pvp/arena_10x10.lua @@ -21,7 +21,7 @@ local arena10x10 = Action() function arena10x10.onUse(player, item, fromPosition, target, toPosition, monster, isHotkey) if toPosition == Position(32240, 32179, 8) then if roomIsOccupied(setting.centerRoom, false, setting.range, setting.range) then - player:say("Please wait for the fighters come out of the arena.", TALKTYPE_ORANGE_1) + player:say("Please wait for the fighters come out of the arena.", TALKTYPE_MONSTER_SAY) return true end for i = 1, #playerPositions do @@ -30,10 +30,10 @@ function arena10x10.onUse(player, item, fromPosition, target, toPosition, monste creature:teleportTo(playerPositions[i].toPos) creature:getPosition():sendMagicEffect(CONST_ME_TELEPORT) elseif not creature then - player:say("You need 10 players for enter in the arena.", TALKTYPE_ORANGE_1) + player:say("You need 10 players for enter in the arena.", TALKTYPE_MONSTER_SAY) return true else - player:say("You need 10 players for enter in the arena.", TALKTYPE_ORANGE_1) + player:say("You need 10 players for enter in the arena.", TALKTYPE_MONSTER_SAY) return true end end diff --git a/data-otservbr-global/scripts/actions/arena_pvp/arena_2x2.lua b/data-otservbr-global/scripts/actions/arena_pvp/arena_2x2.lua index 18c88aa42a6..e920a7d584f 100644 --- a/data-otservbr-global/scripts/actions/arena_pvp/arena_2x2.lua +++ b/data-otservbr-global/scripts/actions/arena_pvp/arena_2x2.lua @@ -15,7 +15,7 @@ local arena2x2 = Action() function arena2x2.onUse(player, item, fromPosition, target, toPosition, monster, isHotkey) if toPosition == Position(32271, 32180, 8) then if roomIsOccupied(setting.centerRoom, false, setting.range, setting.range) then - player:say("Please wait for the fighters come out of the arena.", TALKTYPE_ORANGE_1) + player:say("Please wait for the fighters come out of the arena.", TALKTYPE_MONSTER_SAY) return true end for i = 1, #playerPositions do @@ -24,10 +24,10 @@ function arena2x2.onUse(player, item, fromPosition, target, toPosition, monster, creature:teleportTo(playerPositions[i].toPos) creature:getPosition():sendMagicEffect(CONST_ME_TELEPORT) elseif not creature then - player:say("You need 2 players for enter in the arena.", TALKTYPE_ORANGE_1) + player:say("You need 2 players for enter in the arena.", TALKTYPE_MONSTER_SAY) return true else - player:say("You need 2 players for enter in the arena.", TALKTYPE_ORANGE_1) + player:say("You need 2 players for enter in the arena.", TALKTYPE_MONSTER_SAY) return true end end diff --git a/data-otservbr-global/scripts/actions/quests/adventures_of_galthen/ahau_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/ahau.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/adventures_of_galthen/ahau_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/ahau.lua diff --git a/data-otservbr-global/scripts/actions/quests/heart_of_destruction/anomaly_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/anomaly.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/heart_of_destruction/anomaly_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/anomaly.lua diff --git a/data-otservbr-global/scripts/actions/bosses_levers/brokul.lua b/data-otservbr-global/scripts/actions/bosses_levers/brokul.lua new file mode 100644 index 00000000000..2cdded463af --- /dev/null +++ b/data-otservbr-global/scripts/actions/bosses_levers/brokul.lua @@ -0,0 +1,23 @@ +local config = { + boss = { + name = "Brokul", + position = Position(33483, 31434, 15), + }, + requiredLevel = 150, + playerPositions = { + { pos = Position(33522, 31465, 15), teleport = Position(33483, 31445, 15), effect = CONST_ME_TELEPORT }, + { pos = Position(33520, 31465, 15), teleport = Position(33483, 31445, 15), effect = CONST_ME_TELEPORT }, + { pos = Position(33521, 31465, 15), teleport = Position(33483, 31445, 15), effect = CONST_ME_TELEPORT }, + { pos = Position(33523, 31465, 15), teleport = Position(33483, 31445, 15), effect = CONST_ME_TELEPORT }, + { pos = Position(33524, 31465, 15), teleport = Position(33483, 31445, 15), effect = CONST_ME_TELEPORT }, + }, + specPos = { + from = Position(33469, 31430, 15), + to = Position(33497, 31453, 15), + }, + exit = Position(33522, 31468, 15), +} + +local lever = BossLever(config) +lever:aid(34000) +lever:register() diff --git a/data-otservbr-global/scripts/actions/quests/grave_danger/count_vlarkorth_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/count_vlarkorth.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/grave_danger/count_vlarkorth_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/count_vlarkorth.lua diff --git a/data-otservbr-global/scripts/actions/quests/forgotten_knowledge/dragonking_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/dragonking_zyrtarch.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/forgotten_knowledge/dragonking_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/dragonking_zyrtarch.lua diff --git a/data-otservbr-global/scripts/actions/quests/grave_danger/duke_krule_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/duke_krule.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/grave_danger/duke_krule_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/duke_krule.lua diff --git a/data-otservbr-global/scripts/actions/quests/grave_danger/earl_osam_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/earl_osam.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/grave_danger/earl_osam_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/earl_osam.lua diff --git a/data-otservbr-global/scripts/actions/quests/heart_of_destruction/eradicator_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/eradicator.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/heart_of_destruction/eradicator_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/eradicator.lua diff --git a/data-otservbr-global/scripts/actions/quests/the_dream_courts/lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/faceless_bane.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/the_dream_courts/lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/faceless_bane.lua diff --git a/data-otservbr-global/scripts/actions/quests/heart_of_destruction/quake_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/foreshock.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/heart_of_destruction/quake_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/foreshock.lua diff --git a/data-otservbr-global/scripts/actions/quests/secret_library/ghulosh_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/ghulosh.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/secret_library/ghulosh_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/ghulosh.lua diff --git a/data-otservbr-global/scripts/actions/quests/secret_library/gorzindel_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/gorzindel.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/secret_library/gorzindel_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/gorzindel.lua diff --git a/data-otservbr-global/scripts/actions/quests/soul_war/goshnar_cruelty_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/goshnar_cruelty.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/soul_war/goshnar_cruelty_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/goshnar_cruelty.lua diff --git a/data-otservbr-global/scripts/actions/quests/soul_war/goshnar_greed_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/goshnar_greed.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/soul_war/goshnar_greed_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/goshnar_greed.lua diff --git a/data-otservbr-global/scripts/actions/quests/soul_war/goshnar_hatred_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/goshnar_hatred.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/soul_war/goshnar_hatred_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/goshnar_hatred.lua diff --git a/data-otservbr-global/scripts/actions/quests/soul_war/goshnar_malice_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/goshnar_malice.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/soul_war/goshnar_malice_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/goshnar_malice.lua diff --git a/data-otservbr-global/scripts/actions/quests/soul_war/goshnar_megalomania_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/goshnar_megalomania.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/soul_war/goshnar_megalomania_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/goshnar_megalomania.lua diff --git a/data-otservbr-global/scripts/actions/quests/soul_war/goshnar_spite_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/goshnar_spite.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/soul_war/goshnar_spite_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/goshnar_spite.lua diff --git a/data-otservbr-global/scripts/actions/farmine/oberon_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/grand_,master_oberon.lua similarity index 100% rename from data-otservbr-global/scripts/actions/farmine/oberon_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/grand_,master_oberon.lua diff --git a/data-otservbr-global/scripts/actions/quests/grave_danger/king_zelos_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/king_zelos.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/grave_danger/king_zelos_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/king_zelos.lua diff --git a/data-otservbr-global/scripts/actions/quests/forgotten_knowledge/tenebris_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/lady_tenebris.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/forgotten_knowledge/tenebris_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/lady_tenebris.lua diff --git a/data-otservbr-global/scripts/actions/quests/forgotten_knowledge/lloyd_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/lloyd.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/forgotten_knowledge/lloyd_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/lloyd.lua diff --git a/data-otservbr-global/scripts/actions/quests/secret_library/lokathmor_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/lokathmor.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/secret_library/lokathmor_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/lokathmor.lua diff --git a/data-otservbr-global/scripts/actions/quests/grave_danger/lord_azaram_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/lord_azaram.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/grave_danger/lord_azaram_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/lord_azaram.lua diff --git a/data-otservbr-global/scripts/quests/primal_ordeal_quest/magma_bubble_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/magma_bubble.lua similarity index 100% rename from data-otservbr-global/scripts/quests/primal_ordeal_quest/magma_bubble_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/magma_bubble.lua diff --git a/data-otservbr-global/scripts/actions/quests/ferumbras_ascendant/mazoran_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/mazoran.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/ferumbras_ascendant/mazoran_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/mazoran.lua diff --git a/data-otservbr-global/scripts/actions/quests/secret_library/mazzinor_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/mazzinor.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/secret_library/mazzinor_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/mazzinor.lua diff --git a/data-otservbr-global/scripts/actions/quests/adventures_of_galthen/megasylvan_yselda_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/megasylvan_yselda.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/adventures_of_galthen/megasylvan_yselda_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/megasylvan_yselda.lua diff --git a/data-otservbr-global/scripts/actions/quests/forgotten_knowledge/horror_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/melting_frozen_horror.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/forgotten_knowledge/horror_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/melting_frozen_horror.lua diff --git a/data-otservbr-global/scripts/actions/quests/heart_of_destruction/outburst_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/outburst.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/heart_of_destruction/outburst_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/outburst.lua diff --git a/data-otservbr-global/scripts/actions/quests/ferumbras_ascendant/plagirath_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/plagirath.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/ferumbras_ascendant/plagirath_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/plagirath.lua diff --git a/data-otservbr-global/scripts/actions/quests/ferumbras_ascendant/ragiaz_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/ragiaz.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/ferumbras_ascendant/ragiaz_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/ragiaz.lua diff --git a/data-otservbr-global/scripts/actions/quests/a_pirates_tail/ratmiral_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/ratmiral_blackwhiskers.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/a_pirates_tail/ratmiral_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/ratmiral_blackwhiskers.lua diff --git a/data-otservbr-global/scripts/actions/quests/ferumbras_ascendant/razzagorn_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/razzagorn.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/ferumbras_ascendant/razzagorn_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/razzagorn.lua diff --git a/data-otservbr-global/scripts/actions/quests/heart_of_destruction/rupture_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/rupture.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/heart_of_destruction/rupture_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/rupture.lua diff --git a/data-otservbr-global/scripts/actions/quests/ferumbras_ascendant/shulgrax_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/shulgrax.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/ferumbras_ascendant/shulgrax_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/shulgrax.lua diff --git a/data-otservbr-global/scripts/actions/quests/grave_danger/baeloc_nictros_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/sir_baeloc_sir_nictros.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/grave_danger/baeloc_nictros_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/sir_baeloc_sir_nictros.lua diff --git a/data-otservbr-global/scripts/actions/quests/ferumbras_ascendant/tarbaz_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/tarbaz.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/ferumbras_ascendant/tarbaz_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/tarbaz.lua diff --git a/data-otservbr-global/scripts/actions/quests/a_pirates_tail/tentugly_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/tentuglys_head.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/a_pirates_tail/tentugly_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/tentuglys_head.lua diff --git a/data-otservbr-global/scripts/actions/quests/too_hot_to_handle/the_brainstealer_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/the_brainstealer.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/too_hot_to_handle/the_brainstealer_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/the_brainstealer.lua diff --git a/data-otservbr-global/scripts/actions/quests/feaster_of_souls/dread_maiden_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/the_dread_maiden.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/feaster_of_souls/dread_maiden_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/the_dread_maiden.lua diff --git a/data-otservbr-global/scripts/actions/quests/feaster_of_souls/fear_feaster_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/the_fear_feaster.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/feaster_of_souls/fear_feaster_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/the_fear_feaster.lua diff --git a/data-otservbr-global/scripts/actions/quests/forgotten_knowledge/last_lore_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/the_last_lore_keeper.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/forgotten_knowledge/last_lore_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/the_last_lore_keeper.lua diff --git a/data-otservbr-global/scripts/quests/cradle_of_monsters/the_monster_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/the_monster.lua similarity index 100% rename from data-otservbr-global/scripts/quests/cradle_of_monsters/the_monster_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/the_monster.lua diff --git a/data-otservbr-global/scripts/actions/quests/the_dream_courts/nightmare_beast_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/the_nightmare_beast.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/the_dream_courts/nightmare_beast_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/the_nightmare_beast.lua diff --git a/data-otservbr-global/scripts/actions/quests/feaster_of_souls/pale_worm_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/the_pale_worm.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/feaster_of_souls/pale_worm_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/the_pale_worm.lua diff --git a/data-otservbr-global/scripts/quests/primal_ordeal_quest/the_primal_manace_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/the_primal_manace.lua similarity index 100% rename from data-otservbr-global/scripts/quests/primal_ordeal_quest/the_primal_manace_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/the_primal_manace.lua diff --git a/data-otservbr-global/scripts/actions/quests/secret_library/scourge_of_oblivion_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/the_scourge_of_oblivion.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/secret_library/scourge_of_oblivion_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/the_scourge_of_oblivion.lua diff --git a/data-otservbr-global/scripts/actions/quests/forgotten_knowledge/thorn_knight_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/the_thorn_knight.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/forgotten_knowledge/thorn_knight_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/the_thorn_knight.lua diff --git a/data-otservbr-global/scripts/actions/quests/forgotten_knowledge/time_guardian_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/the_time_guardian.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/forgotten_knowledge/time_guardian_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/the_time_guardian.lua diff --git a/data-otservbr-global/scripts/actions/quests/feaster_of_souls/unwelcome_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/the_unwelcome.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/feaster_of_souls/unwelcome_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/the_unwelcome.lua diff --git a/data-otservbr-global/scripts/actions/quests/marapur/boss_lever_timira.lua b/data-otservbr-global/scripts/actions/bosses_levers/timira_the_many-headed.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/marapur/boss_lever_timira.lua rename to data-otservbr-global/scripts/actions/bosses_levers/timira_the_many-headed.lua diff --git a/data-otservbr-global/scripts/actions/bosses_levers/urmahlullu_the_immaculate.lua b/data-otservbr-global/scripts/actions/bosses_levers/urmahlullu_the_immaculate.lua new file mode 100644 index 00000000000..612363fecaf --- /dev/null +++ b/data-otservbr-global/scripts/actions/bosses_levers/urmahlullu_the_immaculate.lua @@ -0,0 +1,23 @@ +local config = { + boss = { + name = "Urmahlullu the Immaculate", + position = Position(33918, 31641, 8), + }, + requiredLevel = 100, + playerPositions = { + { pos = Position(33918, 31626, 8), teleport = Position(33918, 31657, 8), effect = CONST_ME_TELEPORT }, + { pos = Position(33919, 31626, 8), teleport = Position(33918, 31657, 8), effect = CONST_ME_TELEPORT }, + { pos = Position(33920, 31626, 8), teleport = Position(33918, 31657, 8), effect = CONST_ME_TELEPORT }, + { pos = Position(33921, 31626, 8), teleport = Position(33918, 31657, 8), effect = CONST_ME_TELEPORT }, + { pos = Position(33922, 31626, 8), teleport = Position(33918, 31657, 8), effect = CONST_ME_TELEPORT }, + }, + specPos = { + from = Position(33905, 31636, 8), + to = Position(33932, 31667, 8), + }, + exit = Position(33919, 31603, 8), +} + +local lever = BossLever(config) +lever:uid(9545) +lever:register() diff --git a/data-otservbr-global/scripts/actions/quests/ferumbras_ascendant/zamulosh_lever.lua b/data-otservbr-global/scripts/actions/bosses_levers/zamulosh.lua similarity index 100% rename from data-otservbr-global/scripts/actions/quests/ferumbras_ascendant/zamulosh_lever.lua rename to data-otservbr-global/scripts/actions/bosses_levers/zamulosh.lua diff --git a/data-otservbr-global/scripts/actions/mounts/haze_mount.lua b/data-otservbr-global/scripts/actions/mounts/haze_mount.lua deleted file mode 100644 index bd289b57df9..00000000000 --- a/data-otservbr-global/scripts/actions/mounts/haze_mount.lua +++ /dev/null @@ -1,25 +0,0 @@ -local config = { - [32629] = { mountId = 162, message = "You are now versed to ride the haze!" }, -} - -local hazemount = Action() - -function hazemount.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local mount = config[item.itemid] - - if not mount then - return true - end - - if not player:hasMount(mount.mountId) then - player:addMount(mount.mountId) - player:say(mount.message, TALKTYPE_MONSTER_SAY) - item:remove(1) - else - player:sendTextMessage(19, "You already have this mount") - end - return true -end - -hazemount:id(32629) -hazemount:register() diff --git a/data-otservbr-global/scripts/actions/mounts/music_box.lua b/data-otservbr-global/scripts/actions/mounts/music_box.lua deleted file mode 100644 index 07ff63c5f35..00000000000 --- a/data-otservbr-global/scripts/actions/mounts/music_box.lua +++ /dev/null @@ -1,43 +0,0 @@ -local config = { - ["dragonling"] = { mountId = 31, tameMessage = "The wild dragonling will accompany you as a friend from now on.", sound = "FI?", ACHIEV = "Dragon Mimicry" }, - ["draptor"] = { mountId = 6, tameMessage = "You have tamed the wild draptor.", sound = "Screeeeeeeeech", ACHIEV = "Scales and Tail" }, - ["enraged white deer"] = { mountId = 18, tameMessage = "You have tamed the deer.", sound = "bell", ACHIEV = "Friend of Elves" }, - ["ironblight"] = { mountId = 29, tameMessage = "You tamed the ironblight.", sound = "Plinngggg", ACHIEV = "Magnetised" }, - ["magma crawler"] = { mountId = 30, tameMessage = "The magma crawler will accompany you as a friend from now on.", sound = "ZzzZzzZzzzZz", ACHIEV = "Way to Hell" }, - ["midnight panther"] = { mountId = 5, tameMessage = "You have tamed the wild panther.", sound = "Purrrrrrr", ACHIEV = "Starless Night" }, - ["wailing widow"] = { mountId = 1, mountName = "widow queen", tameMessage = "You have tamed the wailing widow.", sound = "Sssssssss", ACHIEV = "Spin-Off" }, - ["wild horse"] = { mountId = 17, mountName = "war horse", tameMessage = "The horse eats the sugar oat and accepts you as its new master.", sound = "*snort*", ACHIEV = "Lucky Horseshoe" }, - ["panda"] = { mountId = 19, tameMessage = "You have tamed the panda.", sound = "Rrrrr...", ACHIEV = "Chequered Teddy" }, -} - -local musicBox = Action() - -function musicBox.onUse(player, item, fromPosition, target, toPosition, isHotkey) - if not target:isCreature() or not target:isMonster() or target:getMaster() then - return false - end - - local targetName = target:getName():lower() - local monsterConfig = config[targetName] - if not monsterConfig then - return true - end - - if player:hasMount(monsterConfig.mountId) then - player:say("You already tamed a " .. (monsterConfig.mountName or targetName) .. ".", TALKTYPE_MONSTER_SAY) - return true - end - - player:addAchievement("Natural Born Cowboy") - player:addAchievement(monsterConfig.ACHIEV) - player:addMount(monsterConfig.mountId) - player:say(monsterConfig.tameMessage, TALKTYPE_MONSTER_SAY) - toPosition:sendMagicEffect(CONST_ME_SOUND_RED) - target:say(monsterConfig.sound, TALKTYPE_MONSTER_SAY) - target:remove() - item:remove() - return true -end - -musicBox:id(16244) -musicBox:register() diff --git a/data-otservbr-global/scripts/actions/object/market.lua b/data-otservbr-global/scripts/actions/object/market.lua deleted file mode 100644 index e86b685e36e..00000000000 --- a/data-otservbr-global/scripts/actions/object/market.lua +++ /dev/null @@ -1,9 +0,0 @@ -local market = Action() - -function market.onUse(player, item, fromPosition, target, toPosition, isHotkey) - player:openMarket() - return true -end - -market:id(12903) -market:register() diff --git a/data-otservbr-global/scripts/actions/object/stash.lua b/data-otservbr-global/scripts/actions/object/stash.lua deleted file mode 100644 index 5426b9f560b..00000000000 --- a/data-otservbr-global/scripts/actions/object/stash.lua +++ /dev/null @@ -1,9 +0,0 @@ -local stash = Action() - -function stash.onUse(player, item, fromPosition, target, toPosition, isHotkey) - player:openStash() - return true -end - -stash:id(28750) -stash:register() diff --git a/data-otservbr-global/scripts/actions/other/cask_kegs.lua b/data-otservbr-global/scripts/actions/other/cask_kegs.lua deleted file mode 100644 index 872d30d613c..00000000000 --- a/data-otservbr-global/scripts/actions/other/cask_kegs.lua +++ /dev/null @@ -1,76 +0,0 @@ -local targetIdList = { - --health potions casks - [25879] = { itemId = 285, transform = 266, house = true }, -- Health Potion -- - [25880] = { itemId = 283, transform = 236, house = true }, -- Strong Health -- - [25881] = { itemId = 284, transform = 239, house = true }, -- Great Health -- - [25882] = { itemId = 284, transform = 7643, house = true }, -- Ultimate Health -- - [25883] = { itemId = 284, transform = 23375, house = true }, -- Supreme Health -- - --mana potions casks - [25889] = { itemId = 285, transform = 268, house = true }, -- Mana Potion -- - [25890] = { itemId = 283, transform = 237, house = true }, -- Strong Mana -- - [25891] = { itemId = 284, transform = 238, house = true }, -- Great Mana -- - [25892] = { itemId = 284, transform = 23373, house = true }, -- Ultimate Mana -- - --spirit potions caks - [25899] = { itemId = 284, transform = 7642, house = true }, -- Great Spirit -- - [25900] = { itemId = 284, transform = 23374, house = true }, --Ultimate Spirit -- - - --health potions kegs - [25903] = { itemId = 285, transform = 266 }, -- Health Potion -- - [25904] = { itemId = 283, transform = 236 }, -- Strong Health -- - [25905] = { itemId = 284, transform = 239 }, -- Great Health -- - [25906] = { itemId = 284, transform = 7643 }, -- Ultimate Health -- - [25907] = { itemId = 284, transform = 23375 }, -- Supreme Health -- - - --mana potion kegs - [25908] = { itemId = 285, transform = 268 }, -- Mana Potion -- - [25909] = { itemId = 283, transform = 237 }, -- Strong Mana -- - [25910] = { itemId = 284, transform = 238 }, -- Great Mana -- - [25911] = { itemId = 284, transform = 23373 }, -- Ultimate Mana -- - - --spirit potions kegs - [25913] = { itemId = 284, transform = 7642 }, -- Great Spirit -- - [25914] = { itemId = 284, transform = 23374 }, --Ultimate Spirit -- -} - -local flasks = Action() - -function flasks.onUse(player, item, fromPosition, target, toPosition, isHotkey) - if not target then - return false - end - - local charges = target:getCharges() - local itemCount = item:getCount() - local recharged = itemCount - - if recharged > charges then - recharged = charges - end - - local targetId = targetIdList[target:getId()] - if targetId and targetId.itemId == item:getId() and charges > 0 then - -- Check is cask item is in house - if targetId.house and not player:getTile():getHouse() then - return false - end - - charges = charges - recharged - target:transform(target:getId(), charges) - if charges == 0 then - toPosition:sendMagicEffect(CONST_ME_POFF) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, string.format("No more charges left. Your keg has run dry.", charges)) - else - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, string.format("Remaining %s charges.", charges)) - end - - player:addItem(targetId.transform, recharged) - if itemCount >= recharged then - item:transform(targetId.itemId, itemCount - recharged) - end - return true - end - return false -end - -flasks:id(283, 284, 285) -flasks:register() diff --git a/data-otservbr-global/scripts/actions/other/cobra_flask.lua b/data-otservbr-global/scripts/actions/other/cobra_flask.lua deleted file mode 100644 index 50b9c3dea08..00000000000 --- a/data-otservbr-global/scripts/actions/other/cobra_flask.lua +++ /dev/null @@ -1,19 +0,0 @@ -local cobraFlask = Action() - -function cobraFlask.onUse(player, item, fromPosition, target, toPosition, isHotkey) - if (item.itemid == 31297) and (target.itemid == 4188) then - item:transform(31296) - target:transform(4189) - target:decay() - return - elseif (item.itemid == 31296) and ((target.itemid == 31284) or (target.itemid == 31285) or (target.itemid == 31286) or (target.itemid == 31287)) then - doSendMagicEffect(target:getPosition(), CONST_ME_GREENSMOKE) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You carefully pour just a tiny, little, finely dosed... and there goes the whole content of the bottle. Stand back!") - item:transform(31297) - setGlobalStorageValue(GlobalStorage.CobraBastionFlask, os.time() + 1800) -- 30 minutes - end - return -end - -cobraFlask:id(31296, 31297) -cobraFlask:register() diff --git a/data-otservbr-global/scripts/actions/other/cup_cakes.lua b/data-otservbr-global/scripts/actions/other/cup_cakes.lua index 43225369e1f..a9d94dbaacd 100644 --- a/data-otservbr-global/scripts/actions/other/cup_cakes.lua +++ b/data-otservbr-global/scripts/actions/other/cup_cakes.lua @@ -38,7 +38,7 @@ function cupCakes.onUse(player, item, fromPos, itemEx, toPos) player:addCondition(lemon) player:sendTextMessage(MESSAGE_FAILURE, "You feel more focused.") end - player:say("Mmmm.", TALKTYPE_ORANGE_1) + player:say("Mmmm.", TALKTYPE_MONSTER_SAY) item:remove(1) player:setStorageValue(foundItem.ExhaustStor, os.time() + (foundItem.timestamp * 60)) else diff --git a/data-otservbr-global/scripts/actions/other/cup_of_molten_gold.lua b/data-otservbr-global/scripts/actions/other/cup_of_molten_gold.lua deleted file mode 100644 index 0ec6efdd7d8..00000000000 --- a/data-otservbr-global/scripts/actions/other/cup_of_molten_gold.lua +++ /dev/null @@ -1,23 +0,0 @@ -local items = { - [0] = { id = 3035, count = 3, chance = 100 }, - [1] = { id = 2881, count = 1, chance = 80 }, - [2] = { id = 12550, count = 1, chance = 25 }, -} - -local cupOfMoltenGold = Action() - -function cupOfMoltenGold.onUse(cid, item, fromPosition, itemEx, toPosition) - if itemEx.itemid == 3614 or itemEx.itemid == 19111 then - doRemoveItem(item.uid, 1) - for i = 0, #items do - if items[i].chance > math.random(1, 100) then - doPlayerAddItem(cid, items[i].id, items[i].count) - doSendMagicEffect(toPosition, CONST_ME_EXPLOSIONAREA) - end - end - end - return true -end - -cupOfMoltenGold:id(12804) -cupOfMoltenGold:register() diff --git a/data-otservbr-global/scripts/actions/other/daily_reward_shrine.lua b/data-otservbr-global/scripts/actions/other/daily_reward_shrine.lua deleted file mode 100644 index f2d12688d0f..00000000000 --- a/data-otservbr-global/scripts/actions/other/daily_reward_shrine.lua +++ /dev/null @@ -1,9 +0,0 @@ -local dailyRewardShrine = Action() - -function dailyRewardShrine.onUse(player, item, fromPosition, itemEx, toPosition) - DailyReward.loadDailyReward(player, 0) - return true -end - -dailyRewardShrine:id(25720, 25721, 25722, 25723, 25802, 25803) -dailyRewardShrine:register() diff --git a/data-otservbr-global/scripts/actions/other/dice.lua b/data-otservbr-global/scripts/actions/other/dice.lua deleted file mode 100644 index bd0c6c8f31a..00000000000 --- a/data-otservbr-global/scripts/actions/other/dice.lua +++ /dev/null @@ -1,18 +0,0 @@ -local dice = Action() - -function dice.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local dicePosition = item:getPosition() - local value = math.random(6) - local isInGhostMode = player:isInGhostMode() - - dicePosition:sendMagicEffect(CONST_ME_CRAPS, isInGhostMode and player) - local spectators = Game.getSpectators(dicePosition, false, true, 3, 3) - for i = 1, #spectators do - player:say(player:getName() .. " rolled a " .. value .. ".", TALKTYPE_MONSTER_SAY, isInGhostMode, spectators[i], dicePosition) - end - item:transform(5791 + value) - return true -end - -dice:id(5792, 5793, 5794, 5795, 5796, 5797) -dice:register() diff --git a/data-otservbr-global/scripts/actions/other/door_shive1.lua b/data-otservbr-global/scripts/actions/other/door_shive1.lua deleted file mode 100644 index 2e0baa7052b..00000000000 --- a/data-otservbr-global/scripts/actions/other/door_shive1.lua +++ /dev/null @@ -1,16 +0,0 @@ -local doorShive1 = Action() - -function doorShive1.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local position = player:getPosition() - if position.y == toPosition.y then - return false - end - - toPosition.y = position.y > toPosition.y and toPosition.y - 1 or toPosition.y + 1 - player:teleportTo(toPosition) - toPosition:sendMagicEffect(CONST_ME_TELEPORT) - return true -end - -doorShive1:id(13278, 13279, 13280, 13281, 13282, 13283) -doorShive1:register() diff --git a/data-otservbr-global/scripts/actions/other/door_shive2.lua b/data-otservbr-global/scripts/actions/other/door_shive2.lua deleted file mode 100644 index f1131295acc..00000000000 --- a/data-otservbr-global/scripts/actions/other/door_shive2.lua +++ /dev/null @@ -1,16 +0,0 @@ -local doorShive2 = Action() - -function doorShive2.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local position = player:getPosition() - if position.x == toPosition.x then - return false - end - - toPosition.x = position.x > toPosition.x and toPosition.x - 1 or toPosition.x + 1 - player:teleportTo(toPosition) - toPosition:sendMagicEffect(CONST_ME_TELEPORT) - return true -end - -doorShive2:id(13290, 13291, 13292, 13293, 13294) -doorShive2:register() diff --git a/data-otservbr-global/scripts/actions/other/exercise_training.lua b/data-otservbr-global/scripts/actions/other/exercise_training.lua deleted file mode 100644 index 616467aff56..00000000000 --- a/data-otservbr-global/scripts/actions/other/exercise_training.lua +++ /dev/null @@ -1,83 +0,0 @@ -local exerciseTraining = Action() - -local maxAllowedOnADummy = configManager.getNumber(configKeys.MAX_ALLOWED_ON_A_DUMMY) -local dummies = Game.getDummies() -local function isDummy(id) - return dummies[id] and dummies[id] > 0 -end - -local cooldown = 10 - -function exerciseTraining.onUse(player, item, fromPosition, target, toPosition, isHotkey) - if not target then - return - end - local playerId = player:getId() - local targetId = target:getId() - - if target:isItem() and isDummy(targetId) then - if _G.OnExerciseTraining[playerId] then - player:sendTextMessage(MESSAGE_FAILURE, "You are already training!") - return true - end - - local playerPos = player:getPosition() - if not ExerciseWeaponsTable[item.itemid].allowFarUse and (playerPos:getDistance(target:getPosition()) > 1) then - player:sendTextMessage(MESSAGE_FAILURE, "Get closer to the dummy.") - return true - end - - if not playerPos:isProtectionZoneTile() then - player:sendTextMessage(MESSAGE_FAILURE, "You need to be in a protection zone.") - return true - end - - local playerHouse = player:getTile():getHouse() - local targetPos = target:getPosition() - local targetHouse = Tile(targetPos):getHouse() - - if targetHouse and isDummy(targetId) then - if playerHouse ~= targetHouse then - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You must be inside the house to use this dummy.") - return true - end - local playersOnDummy = 0 - for _, playerTraining in pairs(_G.OnExerciseTraining) do - if playerTraining.dummyPos == targetPos then - playersOnDummy = playersOnDummy + 1 - end - - if playersOnDummy >= maxAllowedOnADummy then - player:sendTextMessage(MESSAGE_FAILURE, "That exercise dummy is busy.") - return true - end - end - end - - local hasExhaustion = player:kv():get("training-exhaustion") or 0 - if hasExhaustion > os.time() then - player:sendTextMessage(MESSAGE_FAILURE, "You are already training!") - return true - end - - _G.OnExerciseTraining[playerId] = {} - if not _G.OnExerciseTraining[playerId].event then - _G.OnExerciseTraining[playerId].event = addEvent(ExerciseEvent, 0, playerId, targetPos, item.itemid, targetId) - _G.OnExerciseTraining[playerId].dummyPos = targetPos - player:setTraining(true) - player:kv():set("training-exhaustion", os.time() + cooldown) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have started training on an exercise dummy.") - end - return true - end - return false -end - -for weaponId, weapon in pairs(ExerciseWeaponsTable) do - exerciseTraining:id(weaponId) - if weapon.allowFarUse then - exerciseTraining:allowFarUse(true) - end -end - -exerciseTraining:register() diff --git a/data-otservbr-global/scripts/actions/other/fishing.lua b/data-otservbr-global/scripts/actions/other/fishing.lua index f9e27ccb7cd..86a53075dd9 100644 --- a/data-otservbr-global/scripts/actions/other/fishing.lua +++ b/data-otservbr-global/scripts/actions/other/fishing.lua @@ -118,16 +118,20 @@ function fishing.onUse(player, item, fromPosition, target, toPosition, isHotkey) local rareChance = math.random(100) if rareChance == 1 then player:addItem(7158, 1) + player:addAchievementProgress("Exquisite Taste", 250) return true elseif rareChance <= 4 then player:addItem(3580, 1) + player:addAchievementProgress("Exquisite Taste", 250) return true elseif rareChance <= 10 then player:addItem(7159, 1) + player:addAchievementProgress("Exquisite Taste", 250) return true end end player:addItem(3578, 1) + player:addAchievementProgress("Here, Fishy Fishy!", 250) end return true end diff --git a/data-otservbr-global/scripts/actions/other/glooth_bag.lua b/data-otservbr-global/scripts/actions/other/glooth_bag.lua deleted file mode 100644 index 382aa5ad447..00000000000 --- a/data-otservbr-global/scripts/actions/other/glooth_bag.lua +++ /dev/null @@ -1,47 +0,0 @@ -local items = { - glooth_spears = 21158, - glooth_amulet = 21183, - glooth_club = 21178, - glooth_axe = 21180, - glooth_blade = 21179, - glooth_backpack = 21295, - glooth_sandwiches = 21143, - glooth_soup = 21144, - glooth_steaks = 21146, - control_unit = 21186, -} - -local gloothBag = Action() - -function gloothBag.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local rand = math.random(1, 100) - - if rand <= 15 then - player:addItem(items.glooth_spears, 2) - elseif rand >= 16 and rand <= 23 then - player:addItem(items.glooth_amulet, 1) - elseif rand >= 24 and rand <= 32 then - player:addItem(items.glooth_club, 1) - elseif rand >= 33 and rand <= 50 then - player:addItem(items.glooth_axe, 1) - elseif rand >= 51 and rand <= 64 then - player:addItem(items.glooth_blade, 1) - elseif rand >= 65 and rand <= 75 then - player:addItem(items.glooth_backpack, 1) - elseif rand >= 76 and rand <= 86 then - player:addItem(items.glooth_sandwiches, 10) - elseif rand >= 87 and rand <= 96 then - player:addItem(items.glooth_soup, 10) - elseif rand >= 97 and rand <= 99 then - player:addItem(items.control_unit, 1) - elseif rand == 100 then - player:addItem(items.glooth_steaks, 10) - end - - item:remove(1) - - return true -end - -gloothBag:id(21203) -gloothBag:register() diff --git a/data-otservbr-global/scripts/actions/other/gold_converter.lua b/data-otservbr-global/scripts/actions/other/gold_converter.lua deleted file mode 100644 index a26d7fa3e26..00000000000 --- a/data-otservbr-global/scripts/actions/other/gold_converter.lua +++ /dev/null @@ -1,37 +0,0 @@ -local config = { - [ITEM_GOLD_COIN] = { changeTo = ITEM_PLATINUM_COIN }, - [ITEM_PLATINUM_COIN] = { changeBack = ITEM_GOLD_COIN, changeTo = ITEM_CRYSTAL_COIN }, - [ITEM_CRYSTAL_COIN] = { changeBack = ITEM_PLATINUM_COIN }, -} - -local goldConverter = Action() - -function goldConverter.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local coin = config[target.itemid] - - if not coin then - return false - end - - local charges = item:getCharges() - if coin.changeTo and target.type == 100 then - target:remove() - player:addItem(coin.changeTo, 1) - item:transform(item:getId(), charges - 1) - elseif coin.changeBack then - target:transform(target.itemid, target.type - 1) - player:addItem(coin.changeBack, 100) - item:transform(item:getId(), charges - 1) - else - return false - end - - if charges == 0 then - item:remove() - end - - return true -end - -goldConverter:id(23722, 25719) -goldConverter:register() diff --git a/data-otservbr-global/scripts/actions/other/hireling_food.lua b/data-otservbr-global/scripts/actions/other/hireling_food.lua deleted file mode 100644 index a7734b9d310..00000000000 --- a/data-otservbr-global/scripts/actions/other/hireling_food.lua +++ /dev/null @@ -1,87 +0,0 @@ -local config = { - storage = 19042, --use empty storage - exhaust = 600, --Exhaust is in seconds 600 equals 10min -} - -local chilliConCarniphila = Condition(CONDITION_HASTE) -chilliConCarniphila:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) -chilliConCarniphila:setParameter(CONDITION_PARAM_SPEED, 80) - -local svargrondSalmonFilet = Condition(CONDITION_ATTRIBUTES) -svargrondSalmonFilet:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) -svargrondSalmonFilet:setParameter(CONDITION_PARAM_SKILL_FISHING, 30) - -local tropicalMarinatedTiger = Condition(CONDITION_ATTRIBUTES) -tropicalMarinatedTiger:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) -tropicalMarinatedTiger:setParameter(CONDITION_PARAM_STAT_MAGICPOINTS, 3) - -local delicatessenSalad = Condition(CONDITION_ATTRIBUTES) -delicatessenSalad:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) -delicatessenSalad:setParameter(CONDITION_PARAM_SKILL_MELEE, 3) - -local roastedWyvernWings = Condition(CONDITION_ATTRIBUTES) -roastedWyvernWings:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) -roastedWyvernWings:setParameter(CONDITION_PARAM_SKILL_SHIELD, 7) - -local carrotPie = Condition(CONDITION_ATTRIBUTES) -carrotPie:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) -carrotPie:setParameter(CONDITION_PARAM_SKILL_DISTANCE, 7) - -local hirelingFood = Action() - -function hirelingFood.onUse(player, item, frompos, item2, topos) - local cid = player:getId() - if player:getStorageValue(config.storage) <= os.time() then - if item.itemid == 29408 then - player:say("Chomp.", TALKTYPE_MONSTER_SAY) - Creature(cid):addCondition(roastedWyvernWings) - item:remove(1) - player:setStorageValue(config.storage, os.time() + config.exhaust) - elseif item.itemid == 29409 then - player:say("Yummm.", TALKTYPE_MONSTER_SAY) - Creature(cid):addCondition(carrotPie) - item:remove(1) - player:setStorageValue(config.storage, os.time() + config.exhaust) - elseif item.itemid == 29410 then - player:say("Munch.", TALKTYPE_MONSTER_SAY) - Creature(cid):addCondition(tropicalMarinatedTiger) - item:remove(1) - player:setStorageValue(config.storage, os.time() + config.exhaust) - elseif item.itemid == 29411 then - player:say("Munch.", TALKTYPE_MONSTER_SAY) - Creature(cid):addCondition(delicatessenSalad) - item:remove(1) - player:setStorageValue(config.storage, os.time() + config.exhaust) - elseif item.itemid == 29412 then - player:say("Yummm.", TALKTYPE_MONSTER_SAY) - Creature(cid):addCondition(chilliConCarniphila) - item:remove(1) - player:setStorageValue(config.storage, os.time() + config.exhaust) - elseif item.itemid == 29413 then - player:say("Mmmmm.", TALKTYPE_MONSTER_SAY) - Creature(cid):addCondition(svargrondSalmonFilet) - item:remove(1) - player:setStorageValue(config.storage, os.time() + config.exhaust) - elseif item.itemid == 29414 then - Creature(cid):addHealth(getCreatureMaxHealth(cid) * 0.3) - player:say("Munch.", TALKTYPE_MONSTER_SAY) - item:remove(1) - player:setStorageValue(config.storage, os.time() + config.exhaust) - elseif item.itemid == 29415 then - Creature(cid):addMana(Creature(cid):getMaxMana() * 0.3) - player:say("Chomp.", TALKTYPE_MONSTER_SAY) - item:remove(1) - player:setStorageValue(config.storage, os.time() + config.exhaust) - elseif item.itemid == 29416 then - player:say("Blurg.", TALKTYPE_MONSTER_SAY) - item:remove(1) - player:setStorageValue(config.storage, os.time() + config.exhaust) - end - else - player:sendCancelMessage("You're still too full to eat any gourmet dishes for a while.") - end - return true -end - -hirelingFood:id(29408, 29409, 29410, 29411, 29412, 29413, 29414, 29415, 29416) -hirelingFood:register() diff --git a/data-otservbr-global/scripts/actions/other/jean_pierre_food.lua b/data-otservbr-global/scripts/actions/other/jean_pierre_food.lua deleted file mode 100644 index 71627cfc61c..00000000000 --- a/data-otservbr-global/scripts/actions/other/jean_pierre_food.lua +++ /dev/null @@ -1,224 +0,0 @@ -local conditions = { - CONDITION_POISON, - CONDITION_FIRE, - CONDITION_ENERGY, - CONDITION_PARALYZE, - CONDITION_DRUNK, - CONDITION_DROWN, - CONDITION_FREEZING, - CONDITION_DAZZLED, - CONDITION_CURSED, - CONDITION_BLEEDING, -} -local condition_shield = Condition(CONDITION_ATTRIBUTES) -condition_shield:setParameter(CONDITION_PARAM_SUBID, AttrSubId_JeanPierreDefense) -condition_shield:setParameter(CONDITION_PARAM_BUFF_SPELL, 1) -condition_shield:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) -condition_shield:setParameter(CONDITION_PARAM_SKILL_SHIELD, 10) -condition_shield:setParameter(CONDITION_PARAM_FORCEUPDATE, true) -local condition_ml = Condition(CONDITION_ATTRIBUTES) -condition_ml:setParameter(CONDITION_PARAM_SUBID, AttrSubId_JeanPierreMagic) -condition_ml:setParameter(CONDITION_PARAM_BUFF_SPELL, 1) -condition_ml:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) -condition_ml:setParameter(CONDITION_PARAM_STAT_MAGICPOINTS, 5) -condition_ml:setParameter(CONDITION_PARAM_FORCEUPDATE, true) -local condition_melee = Condition(CONDITION_ATTRIBUTES) -condition_melee:setParameter(CONDITION_PARAM_SUBID, AttrSubId_JeanPierreMelee) -condition_melee:setParameter(CONDITION_PARAM_BUFF_SPELL, 1) -condition_melee:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) -condition_melee:setParameter(CONDITION_PARAM_SKILL_MELEE, 10) -condition_melee:setParameter(CONDITION_PARAM_FORCEUPDATE, true) -local condition_dist = Condition(CONDITION_ATTRIBUTES) -condition_dist:setParameter(CONDITION_PARAM_SUBID, AttrSubId_JeanPierreDistance) -condition_dist:setParameter(CONDITION_PARAM_BUFF_SPELL, 1) -condition_dist:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) -condition_dist:setParameter(CONDITION_PARAM_SKILL_DISTANCE, 10) -condition_dist:setParameter(CONDITION_PARAM_FORCEUPDATE, true) -local condition_f = Condition(CONDITION_ATTRIBUTES) -condition_f:setParameter(CONDITION_PARAM_SUBID, AttrSubId_JeanPierreFishing) -condition_f:setParameter(CONDITION_PARAM_BUFF_SPELL, 1) -condition_f:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) -condition_f:setParameter(CONDITION_PARAM_SKILL_FISHING, 50) -condition_f:setParameter(CONDITION_PARAM_FORCEUPDATE, true) -local condition_speed = Condition(CONDITION_HASTE) -condition_speed:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) -condition_speed:setParameter(CONDITION_PARAM_SPEED, 729) -local combat_i = Combat() -combat_i:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED) -combat_i:setParameter(COMBAT_PARAM_AGGRESSIVE, 0) -local condition_i = Condition(CONDITION_INVISIBLE) -condition_i:setParameter(CONDITION_PARAM_TICKS, 600000) -combat_i:addCondition(condition_i) -local itemIds = { [9079] = 0, [9080] = 1, [9081] = 2, [9082] = 3, [9083] = 4, [9084] = 5, [9085] = 6, [9086] = 7, [9087] = 8, [9088] = 9, [11584] = 10, [11586] = 11, [11587] = 12, [11588] = 13 } - -local jeanPierreFood = Action() - -function jeanPierreFood.onUse(player, item, frompos, item2, topos) - local cid = player:getId() - if player:getStorageValue(17110 + itemIds[item.itemid]) > os.time() then - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You need to wait before using it again.") - return true - end - player:setStorageValue(17110 + itemIds[item.itemid], os.time() + (15 * 60)) - - if item.itemid == 9079 then - item:remove(1) - Creature(cid):addHealth(getCreatureMaxHealth(cid) - getCreatureHealth(cid)) - player:say("Gulp.", TALKTYPE_MONSTER_SAY) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your health has been refilled.") - player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) - return true - elseif item.itemid == 9080 then - item:remove(1) - for i = 1, #conditions do - doRemoveCondition(cid, conditions[i]) - end - player:say("Chomp.", TALKTYPE_MONSTER_SAY) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You feel better body condition.") - player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) - return true - elseif item.itemid == 9081 then - item:remove(1) - Creature(cid):addCondition(condition_shield) - player:say("Chomp.", TALKTYPE_MONSTER_SAY) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You feel less vulnerable.") - player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) - return true - elseif item.itemid == 9082 then - item:remove(1) - Creature(cid):addCondition(condition_ml) - player:say("Chomp.", TALKTYPE_MONSTER_SAY) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You feel smarter.") - player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) - return true - elseif item.itemid == 9083 then - item:remove(1) - player:say("Slurp.", TALKTYPE_MONSTER_SAY) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You don't really know what this did to you, but suddenly you feel very happy.") - player:getPosition():sendMagicEffect(CONST_ME_HEARTS) - return true - elseif item.itemid == 9084 then - item:remove(1) - Creature(cid):addCondition(condition_melee) - player:say("Yum.", TALKTYPE_MONSTER_SAY) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You feel stronger.") - player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) - return true - elseif item.itemid == 9085 then - item:remove(1) - Creature(cid):addCondition(condition_speed) - player:say("Munch.", TALKTYPE_MONSTER_SAY) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your speed has been increased.") - player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) - return true - elseif item.itemid == 9086 then - item:remove(1) - Creature(cid):addMana(Creature(cid):getMaxMana() - Creature(cid):getMana()) - player:say("Chomp.", TALKTYPE_MONSTER_SAY) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your mana has been refilled.") - player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) - return true - elseif item.itemid == 9087 then - item:remove(1) - Creature(cid):addCondition(condition_dist) - player:say("Mmmm.", TALKTYPE_MONSTER_SAY) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You feel more focused.") - player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) - return true - elseif item.itemid == 9088 then - item:remove(1) - Creature(cid):addCondition(condition_f) - player:say("Smack.", TALKTYPE_MONSTER_SAY) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You felt fishing inspiration.") - player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) - return true - elseif item.itemid == 11584 then - item:remove(1) - player:setStorageValue(15287, os.time() + 86400) - player:say("Yum.", TALKTYPE_MONSTER_SAY) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Underwater walking speed increased.") - player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) - return true - elseif item.itemid == 11586 then - if math.random(1, 5) == 5 then - item:remove(1) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You take the last gulp from the large bowl. No leftovers!") - else - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You take a gulp from the large bowl, but there's still some blackjack in it.") - end - Creature(cid):addHealth(getCreatureMaxHealth(cid) - getCreatureHealth(cid)) - player:say("Gulp.", TALKTYPE_MONSTER_SAY) - player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) - return true - elseif item.itemid == 11587 then - item:remove(1) - local c = { condition_shield, condition_ml, condition_melee, condition_dist, condition_speed } - local r = math.random(1, 4) - if r == 1 then - Creature(cid):addCondition(c[math.random(1, #c)]) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You feel stronger, but you have no idea what was increased.") - elseif r == 2 then - doSetCreatureLight(cid, 15, 154, 60 * 60 * 1000) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You feel enlightened.") - elseif r == 3 then - Creature(cid):addCondition(condition_i) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You became invisible.") - elseif r == 4 then - Creature(cid):addHealth(getCreatureMaxHealth(cid) - getCreatureHealth(cid)) - Creature(cid):addMana(Creature(cid):getMaxMana() - Creature(cid):getMana()) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your vitality has been restored.") - end - player:say("Smack.", TALKTYPE_MONSTER_SAY) - player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) - return true - elseif item.itemid == 11588 then - local ring = getPlayerSlotItem(cid, CONST_SLOT_RING) - local r_t = { - [3095] = 3092, - [3096] = 3093, - [6300] = 6299, - [3099] = 3097, - [3088] = 3051, - [3089] = 3052, - [3048] = 3048, - [3087] = 3050, - [16264] = 16114, - [3100] = 3098, - [12670] = 12669, - [3086] = 3049, - [3094] = 3091, - [3090] = 3053, - } - if ring.itemid == 0 then - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "No ring equipped.") - player:getPosition():sendMagicEffect(CONST_ME_POFF) - return true - end - - if r_t[ring.itemid] ~= nil then - item:remove(1) - if ring.itemid == r_t[ring.itemid] then - r_m_am = 20 - else - r_m_am = 1 - end - - for i = 1, 10 do - doPlayerAddItem(cid, r_t[ring.itemid], r_m_am) - end - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your ring has been multiplied.") - player:say("Slurp!", TALKTYPE_MONSTER_SAY) - return true - else - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "This ring cannot be multiplied.") - player:getPosition():sendMagicEffect(CONST_ME_POFF) - return true - end - end -end - -for index, value in pairs(itemIds) do - jeanPierreFood:id(index) -end - -jeanPierreFood:register() diff --git a/data-otservbr-global/scripts/actions/other/magic_gold_converter.lua b/data-otservbr-global/scripts/actions/other/magic_gold_converter.lua deleted file mode 100644 index d5b9b9d9335..00000000000 --- a/data-otservbr-global/scripts/actions/other/magic_gold_converter.lua +++ /dev/null @@ -1,80 +0,0 @@ -local data = { - converterIds = { - [28525] = 28526, - [28526] = 28525, - }, - coins = { - [ITEM_GOLD_COIN] = ITEM_PLATINUM_COIN, - [ITEM_PLATINUM_COIN] = ITEM_CRYSTAL_COIN, - }, -} - -local function finditem(self, cylinder, conv) - if cylinder == 0 then - cylinder = self:getSlotItem(CONST_SLOT_BACKPACK) - finditem(self, self:getStoreInbox(), conv) - end - - if cylinder and cylinder:isContainer() then - for i = 0, cylinder:getSize() - 1 do - local item = cylinder:getItem(i) - if item:isContainer() then - if finditem(self, Container(item.uid), conv) then - -- Breaks the recursion from going into the next items in this cylinder - return true - end - else - for fromid, toid in pairs(data.coins) do - if item:getId() == fromid and item:getCount() == 100 then - item:remove() - if not (cylinder:addItem(toid, 1)) then - player:addItem(toid, 1) - end - - conv:setAttribute(ITEM_ATTRIBUTE_CHARGES, conv:getAttribute(ITEM_ATTRIBUTE_CHARGES) - 1) - - return true - end - end - end - end - -- End of items in this cylinder, returning to parent cylinder or finishing iteration - return false - end -end - -local function start_converter(pid, itemid) - local player = Player(pid) - if player ~= nil then - local item = player:getItemById(itemid, true) - if player:getItemCount(itemid) >= 1 then - if item:hasAttribute(ITEM_ATTRIBUTE_CHARGES) then - local charges_n = item:getAttribute(ITEM_ATTRIBUTE_CHARGES) - if charges_n >= 1 then - if player:getItemCount(ITEM_GOLD_COIN) >= 100 or player:getItemCount(ITEM_PLATINUM_COIN) >= 100 then - finditem(player, 0, item) - end - local converting = addEvent(start_converter, 300, pid, itemid) - else - item:remove(1) - stopEvent(converting) - end - end - else - stopEvent(converting) - end - end - return true -end - -local magicGoldConverter = Action() - -function magicGoldConverter.onUse(player, item, fromPosition, target, toPosition, isHotkey) - item:transform(data.converterIds[item.itemid]) - item:decay() - start_converter(player:getId(), 28526) - return true -end - -magicGoldConverter:id(28525, 28526) -magicGoldConverter:register() diff --git a/data-otservbr-global/scripts/actions/other/offline_training.lua b/data-otservbr-global/scripts/actions/other/offline_training.lua deleted file mode 100644 index d205feb6b2f..00000000000 --- a/data-otservbr-global/scripts/actions/other/offline_training.lua +++ /dev/null @@ -1,31 +0,0 @@ -local statues = { - [16198] = SKILL_SWORD, - [16199] = SKILL_AXE, - [16200] = SKILL_CLUB, - [16201] = SKILL_DISTANCE, - [16202] = SKILL_MAGLEVEL, -} - -local offlineTraining = Action() - -function offlineTraining.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local skill = statues[item:getId()] - if not player:isPremium() then - player:sendCancelMessage(RETURNVALUE_YOUNEEDPREMIUMACCOUNT) - return true - end - - if player:isPzLocked() then - return false - end - - player:setOfflineTrainingSkill(skill) - player:remove(false) - return true -end - -for index, value in pairs(statues) do - offlineTraining:id(index) -end - -offlineTraining:register() diff --git a/data-otservbr-global/scripts/actions/other/potions.lua b/data-otservbr-global/scripts/actions/other/potions.lua deleted file mode 100644 index 921eb551aeb..00000000000 --- a/data-otservbr-global/scripts/actions/other/potions.lua +++ /dev/null @@ -1,322 +0,0 @@ -local berserk = Condition(CONDITION_ATTRIBUTES) -berserk:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) -berserk:setParameter(CONDITION_PARAM_SUBID, AttrSubId_JeanPierreMelee) -berserk:setParameter(CONDITION_PARAM_SKILL_MELEE, 5) -berserk:setParameter(CONDITION_PARAM_SKILL_SHIELD, -10) -berserk:setParameter(CONDITION_PARAM_BUFF_SPELL, true) - -local mastermind = Condition(CONDITION_ATTRIBUTES) -mastermind:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) -mastermind:setParameter(CONDITION_PARAM_SUBID, AttrSubId_JeanPierreMagic) -mastermind:setParameter(CONDITION_PARAM_STAT_MAGICPOINTS, 3) -mastermind:setParameter(CONDITION_PARAM_BUFF_SPELL, true) - -local bullseye = Condition(CONDITION_ATTRIBUTES) -bullseye:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) -bullseye:setParameter(CONDITION_PARAM_SUBID, AttrSubId_JeanPierreDistance) -bullseye:setParameter(CONDITION_PARAM_SKILL_DISTANCE, 5) -bullseye:setParameter(CONDITION_PARAM_SKILL_SHIELD, -10) -bullseye:setParameter(CONDITION_PARAM_BUFF_SPELL, true) - -local antidote = Combat() -antidote:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING) -antidote:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -antidote:setParameter(COMBAT_PARAM_DISPEL, CONDITION_POISON) -antidote:setParameter(COMBAT_PARAM_AGGRESSIVE, false) -antidote:setParameter(COMBAT_PARAM_TARGETCASTERORTOPMOST, true) - -local exhaust = Condition(CONDITION_EXHAUST_HEAL) -exhaust:setParameter(CONDITION_PARAM_TICKS, (configManager.getNumber(configKeys.EX_ACTIONS_DELAY_INTERVAL) - 1000)) --- 1000 - 100 due to exact condition timing. -100 doesn't hurt us, and players don't have reminding ~50ms exhaustion. - -local function magicshield(player) - local condition = Condition(CONDITION_MANASHIELD) - condition:setParameter(CONDITION_PARAM_TICKS, 60000) - condition:setParameter(CONDITION_PARAM_MANASHIELD, math.min(player:getMaxMana(), 300 + 7.6 * player:getLevel() + 7 * player:getMagicLevel())) - player:addCondition(condition) -end - -local potions = { - [6558] = { - transform = { - id = { 236, 237 }, - }, - effect = CONST_ME_DRAWBLOOD, - }, - [7439] = { - vocations = { - VOCATION.BASE_ID.KNIGHT, - }, - condition = berserk, - effect = CONST_ME_MAGIC_RED, - description = "Only knights may drink this potion.", - text = "You feel stronger.", - }, - [7440] = { - vocations = { - VOCATION.BASE_ID.SORCERER, - VOCATION.BASE_ID.DRUID, - }, - condition = mastermind, - effect = CONST_ME_MAGIC_BLUE, - description = "Only sorcerers and druids may drink this potion.", - text = "You feel smarter.", - }, - [7443] = { - vocations = { - VOCATION.BASE_ID.PALADIN, - }, - condition = bullseye, - effect = CONST_ME_MAGIC_GREEN, - description = "Only paladins may drink this potion.", - text = "You feel more accurate.", - }, - [35563] = { - vocations = { - VOCATION.BASE_ID.SORCERER, - VOCATION.BASE_ID.DRUID, - }, - level = 14, - func = magicshield, - effect = CONST_ME_ENERGYAREA, - description = "Only sorcerers and druids of level 14 or above may drink this potion.", - }, - [236] = { - health = { - 250, - 350, - }, - vocations = { - VOCATION.BASE_ID.PALADIN, - VOCATION.BASE_ID.KNIGHT, - }, - level = 50, - flask = 283, - description = "Only knights and paladins of level 50 or above may drink this fluid.", - }, - [237] = { - mana = { - 115, - 185, - }, - level = 50, - flask = 283, - description = "Only players of level 50 or above may drink this fluid.", - }, - [238] = { - mana = { - 150, - 250, - }, - vocations = { - VOCATION.BASE_ID.SORCERER, - VOCATION.BASE_ID.DRUID, - VOCATION.BASE_ID.PALADIN, - }, - level = 80, - flask = 284, - description = "Only sorcerers, druids and paladins of level 80 or above may drink this fluid.", - }, - [239] = { - health = { - 425, - 575, - }, - vocations = { - VOCATION.BASE_ID.KNIGHT, - }, - level = 80, - flask = 284, - description = "Only knights of level 80 or above may drink this fluid.", - }, - [266] = { - health = { - 125, - 175, - }, - flask = 285, - }, - [268] = { - mana = { - 75, - 125, - }, - flask = 285, - }, - [7642] = { - health = { - 250, - 350, - }, - mana = { - 100, - 200, - }, - vocations = { - VOCATION.BASE_ID.PALADIN, - }, - level = 80, - flask = 284, - description = "Only paladins of level 80 or above may drink this fluid.", - }, - [7643] = { - health = { 650, 850 }, - vocations = { - VOCATION.BASE_ID.KNIGHT, - }, - level = 130, - flask = 284, - description = "Only knights of level 130 or above may drink this fluid.", - }, - [7644] = { - combat = antidote, - flask = 285, - }, - [7876] = { - health = { - 60, - 90, - }, - flask = 285, - }, - [23373] = { - mana = { - 425, - 575, - }, - vocations = { - VOCATION.BASE_ID.SORCERER, - VOCATION.BASE_ID.DRUID, - }, - level = 130, - flask = 284, - description = "Only druids and sorcerers of level 130 or above may drink this fluid.", - }, - [23374] = { - health = { - 420, - 580, - }, - mana = { - 250, - 350, - }, - vocations = { - VOCATION.BASE_ID.PALADIN, - }, - level = 130, - flask = 284, - description = "Only paladins of level 130 or above may drink this fluid.", - }, - [23375] = { - health = { - 875, - 1125, - }, - vocations = { - VOCATION.BASE_ID.KNIGHT, - }, - level = 200, - flask = 284, - description = "Only knights of level 200 or above may drink this fluid.", - }, -} - -local flaskPotion = Action() - -function flaskPotion.onUse(player, item, fromPosition, target, toPosition, isHotkey) - if not target or type(target) == "userdata" and not target:isPlayer() then - return false - end - - -- Delay potion - if not _G.PlayerDelayPotion[player:getId()] then - _G.PlayerDelayPotion[player:getId()] = 0 - end - if _G.PlayerDelayPotion[player:getId()] > systemTime() then - player:sendTextMessage(MESSAGE_FAILURE, Game.getReturnMessage(RETURNVALUE_YOUAREEXHAUSTED)) - return true - end - - local potion = potions[item:getId()] - if potion.level and player:getLevel() < potion.level or potion.vocations and not table.contains(potion.vocations, player:getVocation():getBaseId()) and not (player:getGroup():getId() >= GROUP_TYPE_GAMEMASTER) then - player:say(potion.description, MESSAGE_POTION) - return true - end - - if player:getCondition(CONDITION_EXHAUST_HEAL) then - player:sendTextMessage(MESSAGE_FAILURE, Game.getReturnMessage(RETURNVALUE_YOUAREEXHAUSTED)) - return true - end - - if potion.health or potion.mana or potion.combat then - if potion.health then - doTargetCombatHealth(player, target, COMBAT_HEALING, potion.health[1], potion.health[2], CONST_ME_MAGIC_BLUE) - end - - if potion.mana then - doTargetCombatMana(0, target, potion.mana[1], potion.mana[2], CONST_ME_MAGIC_BLUE) - end - - if potion.combat then - potion.combat:execute(target, Variant(target:getId())) - end - - if not potion.effect and target:getPosition() ~= nil then - target:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) - end - - player:addAchievementProgress("Potion Addict", 100000) - target:say("Aaaah...", MESSAGE_POTION) - local deactivatedFlasks = player:kv():get("talkaction.potions.flask") or false - if not deactivatedFlasks then - if fromPosition.x == CONTAINER_POSITION then - local container = Container(item:getParent().uid) - container:addItem(potion.flask, 1) - else - player:addItem(potion.flask, 1) - end - end - player:addCondition(exhaust) - player:setStorageValue(38412, player:getStorageValue(38412) + 1) - end - - player:getPosition():sendSingleSoundEffect(SOUND_EFFECT_TYPE_ITEM_USE_POTION, player:isInGhostMode() and nil or player) - -- Delay potion - _G.PlayerDelayPotion[player:getId()] = systemTime() + 500 - - if potion.func then - potion.func(player) - player:say("Aaaah...", MESSAGE_POTION) - player:getPosition():sendMagicEffect(potion.effect) - end - - if potion.condition then - player:addCondition(potion.condition) - player:say(potion.text, MESSAGE_POTION) - player:getPosition():sendMagicEffect(potion.effect) - end - - if potion.transform then - if item:getCount() >= 1 then - item:remove(1) - player:addItem(potion.transform.id[math.random(#potion.transform.id)], 1) - item:getPosition():sendMagicEffect(potion.effect) - return true - end - end - - if not configManager.getBoolean(configKeys.REMOVE_POTION_CHARGES) then - return true - end - - player:updateSupplyTracker(item) - item:remove(1) - return true -end - -for index, value in pairs(potions) do - flaskPotion:id(index) -end - -flaskPotion:register() diff --git a/data-otservbr-global/scripts/actions/other/string_of_mending.lua b/data-otservbr-global/scripts/actions/other/string_of_mending.lua index b66bd600d0e..7689c9b05df 100644 --- a/data-otservbr-global/scripts/actions/other/string_of_mending.lua +++ b/data-otservbr-global/scripts/actions/other/string_of_mending.lua @@ -1,46 +1,22 @@ ------------- --- Alternative to no-magic style. --- Description here ----- - ----- string of mending id "20208"----- -local ITEMS = { - [12737] = { -----Broken Ring Id "12737" Ring of ending "20182" - { "ring of ending", 50.50 }, ----- 1.97 es la probabilidad de crear el item - }, -} - local stringOfMending = Action() ----- onUse [opt] --- @param cid Player ID --- @param item Item ID --- @param fromPosition Current Position --- @param[opt] itemEx Item change --- @param[opt] toPosition Nem position -function stringOfMending.onUse(cid, item, fromPosition, itemEx, toPosition) - local cadena = ITEMS[itemEx.itemid] - if cadena == nil then +function stringOfMending.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if not target or target.itemid ~= 12737 then return false end - local iEx = Item(itemEx.uid) - local random, chance = math.random() * 100, 0 - - for i = 1, #cadena do - chance = chance + cadena[i][2] - if random <= chance then - iEx:transform(cadena[i][1]) - iEx:getPosition():sendMagicEffect(CONST_ME_MAGIC_GREEN) - Item(item.uid):remove(1) - return true - end + local random = math.random(100) + if random <= 50 then + target:transform(20182) -- ring of ending + target:getPosition():sendMagicEffect(CONST_ME_MAGIC_GREEN) + item:remove(1) + return true end - iEx:getPosition():sendMagicEffect(CONST_ME_BLOCKHIT) - Item(item.uid):remove(1) - iEx:remove() - doCreatureSay(cid, "50% chance, the item was broken.", TALKTYPE_ORANGE_1) + target:getPosition():sendMagicEffect(CONST_ME_BLOCKHIT) + item:remove(1) + target:remove() + player:say("50% chance, the item was broken.", TALKTYPE_MONSTER_SAY) return true end diff --git a/data-otservbr-global/scripts/actions/other/voodoo_doll.lua b/data-otservbr-global/scripts/actions/other/voodoo_doll.lua deleted file mode 100644 index 1b77081ee1c..00000000000 --- a/data-otservbr-global/scripts/actions/other/voodoo_doll.lua +++ /dev/null @@ -1,21 +0,0 @@ -local voodooDoll = Action() - -function voodooDoll.onUse(player, item, fromPosition, target, toPosition, isHotkey) - if target.itemid ~= 1 or target.type ~= THING_TYPE_PLAYER then - return false - end - - local text = "" - if math.random(100) <= 5 then - text = "You concentrate on your victim and hit the needle in the doll." - player:addAchievement("Dark Voodoo Priest") - toPosition:sendMagicEffect(CONST_ME_DRAWBLOOD, player) - else - text = "You concentrate on your victim, hit the needle in the doll.......but nothing happens." - end - player:say(text, TALKTYPE_MONSTER_SAY, false, player) - return true -end - -voodooDoll:id(3002) -voodooDoll:register() diff --git a/data-otservbr-global/scripts/actions/other/windows.lua b/data-otservbr-global/scripts/actions/other/windows.lua deleted file mode 100644 index dadafa26603..00000000000 --- a/data-otservbr-global/scripts/actions/other/windows.lua +++ /dev/null @@ -1,55 +0,0 @@ -local windowId = {} - -for index, value in ipairs(windowTable) do - if not table.contains(windowId, value.openWindow) then - table.insert(windowId, value.openWindow) - end - - if not table.contains(windowId, value.closedWindow) then - table.insert(windowId, value.closedWindow) - end -end - -local windows = Action() - -function windows.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local tile = Tile(fromPosition) - local house = tile and tile:getHouse() - if not house then - fromPosition.y = fromPosition.y - 1 - tile = Tile(fromPosition) - house = tile and tile:getHouse() - if not house then - fromPosition.y = fromPosition.y + 1 - fromPosition.x = fromPosition.x - 1 - tile = Tile(fromPosition) - house = tile and tile:getHouse() - end - end - - if house then - if Tile(fromPosition):getHouse() ~= house and player:getAccountType() < ACCOUNT_TYPE_GAMEMASTER then - return false - end - end - - for index, value in ipairs(windowTable) do - if value.closedWindow == item.itemid then - item:transform(value.openWindow) - return true - end - end - - for index, value in ipairs(windowTable) do - if value.openWindow == item.itemid then - item:transform(value.closedWindow) - end - end - return true -end - -for index, value in ipairs(windowId) do - windows:id(value) -end - -windows:register() diff --git a/data-otservbr-global/scripts/actions/worldboard.lua b/data-otservbr-global/scripts/actions/other/world_board.lua similarity index 51% rename from data-otservbr-global/scripts/actions/worldboard.lua rename to data-otservbr-global/scripts/actions/other/world_board.lua index 3d50c2fb350..c3ec43c7af5 100644 --- a/data-otservbr-global/scripts/actions/worldboard.lua +++ b/data-otservbr-global/scripts/actions/other/world_board.lua @@ -1,26 +1,35 @@ local worldBoard = Action() local communicates = { - -- Fury Gates [1] = { - globalStorage = 65000, + storageValue = GlobalStorage.FuryGates, communicate = "A fiery fury gate has opened near one of the major cities somewhere in Tibia.", }, - -- Yasir + [2] = { - globalStorage = 65014, + storageValue = GlobalStorage.Yasir, communicate = "Oriental ships sighted! A trader for exotic creature products may currently be visiting Carlin, Ankrahmun or Liberty Bay.", }, - -- Nightmare Isle + [3] = { - globalStorage = 65015, - communicate = "A sandstorm travels through Darama, leading to isles full of deadly creatures inside a nightmare. Avoid the river near Drefia/northernmost coast/Ankhramun tar pits!", + storageValue = GlobalStorage.WorldBoard.NightmareIsle.AnkrahmunNorth, + communicate = "A sandstorm travels through Darama, leading to isles full of deadly creatures inside a nightmare. Avoid the Ankhramun tar pits!.", + }, + + [4] = { + storageValue = GlobalStorage.WorldBoard.NightmareIsle.DarashiaNorth, + communicate = "A sandstorm travels through Darama, leading to isles full of deadly creatures inside a nightmare. Avoid the northernmost coast!", + }, + + [5] = { + storageValue = GlobalStorage.WorldBoard.NightmareIsle.DarashiaWest, + communicate = "A sandstorm travels through Darama, leading to isles full of deadly creatures inside a nightmare. Avoid the river near Drefia!", }, } function worldBoard.onUse(player, item, fromPosition, target, toPosition, isHotkey) for index, value in pairs(communicates) do - if getGlobalStorageValue(value.globalStorage) > 0 then + if Game.getStorageValue(value.storageValue) > 0 then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, value.communicate) end end diff --git a/data-otservbr-global/scripts/actions/quests/cults_of_tibia/bosses_levers.lua b/data-otservbr-global/scripts/actions/quests/cults_of_tibia/bosses_levers.lua index 7c974fb939b..61fb460fd72 100644 --- a/data-otservbr-global/scripts/actions/quests/cults_of_tibia/bosses_levers.lua +++ b/data-otservbr-global/scripts/actions/quests/cults_of_tibia/bosses_levers.lua @@ -193,7 +193,7 @@ function cultsOfTibiaLevers.onUse(player, item, fromPosition, itemEx, toPosition Game.createMonster("Wine Cask", Position(33162, 31945, 15)) local leiden = Game.createMonster("Leiden", Position(33162, 31950, 15)) leiden:setHealth(leiden:getHealth() / 2) - kickerPlayerRoomAfferMin(convertTable, frompos, topos, Position(33121, 31951, 15), "You were kicked for exceeding the time limit within the boss room.", "", 60, true, ittable, blockmonsters) + kickerPlayerRoomAfterMin(convertTable, frompos, topos, Position(33121, 31951, 15), "You were kicked for exceeding the time limit within the boss room.", "", 60, true, ittable, blockmonsters) end end if item:getActionId() == 5502 and item:getId() == 8912 then -- The False God @@ -241,7 +241,7 @@ function cultsOfTibiaLevers.onUse(player, item, fromPosition, itemEx, toPosition addEvent(transformMonster, 13 * 15000, 3, 3, "Sphere Of Wrath", {}, {}, 0) Game.createMonster("The False God", Position(33159, 31914, 15)) -- funçao - kickerPlayerRoomAfferMin(convertTable, frompos, topos, Position(33181, 31894, 15), "You were kicked for exceeding the time limit within the boss room.", "", 60, true, ittable, blockmonsters) + kickerPlayerRoomAfterMin(convertTable, frompos, topos, Position(33181, 31894, 15), "You were kicked for exceeding the time limit within the boss room.", "", 60, true, ittable, blockmonsters) end end @@ -285,7 +285,7 @@ function cultsOfTibiaLevers.onUse(player, item, fromPosition, itemEx, toPosition player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) end end - kickerPlayerRoomAfferMin(convertTable, frompos, topos, Position(33091, 31963, 15), "You were kicked for exceeding the time limit within the boss room.", "", 60, true, ittable, blockmonsters) + kickerPlayerRoomAfterMin(convertTable, frompos, topos, Position(33091, 31963, 15), "You were kicked for exceeding the time limit within the boss room.", "", 60, true, ittable, blockmonsters) Game.createMonster("Pillar of Summoning", Position(33093, 31919, 15)) Game.createMonster("Pillar of Death", Position(33098, 31915, 15)) Game.createMonster("Pillar of Protection", Position(33103, 31919, 15)) @@ -299,7 +299,7 @@ function cultsOfTibiaLevers.onUse(player, item, fromPosition, itemEx, toPosition end end - if item:getActionId() == 5503 then -- The Sinister Hermit + if item:getActionId() == 5503 then -- The Souldespoiler if player:getPosition() == Position(33127, 31892, 15) and item:getId() == 8912 then local teleport = 0 for i = 31892, 31896, 1 do @@ -333,13 +333,13 @@ function cultsOfTibiaLevers.onUse(player, item, fromPosition, itemEx, toPosition local newpos = Position(33127, i, 15) local nplayer = Tile(newpos):getTopCreature() if nplayer and nplayer:isPlayer() then - nplayer:setBossCooldown("The Sinister Hermit", os.time() + configManager.getNumber(configKeys.BOSS_DEFAULT_TIME_TO_FIGHT_AGAIN)) + nplayer:setBossCooldown("The Souldespoiler", os.time() + configManager.getNumber(configKeys.BOSS_DEFAULT_TIME_TO_FIGHT_AGAIN)) nplayer:teleportTo(Position(33130, 31919, 15), true) convertTable[#convertTable + 1] = nplayer:getId() player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) end end - kickerPlayerRoomAfferMin(convertTable, frompos, topos, Position(33109, 31887, 15), "You were kicked for exceeding the time limit within the boss room.", "", 60, true, ittable, blockmonsters) + kickerPlayerRoomAfterMin(convertTable, frompos, topos, Position(33109, 31887, 15), "You were kicked for exceeding the time limit within the boss room.", "", 60, true, ittable, blockmonsters) Game.createMonster("The Sinister Hermit Dirty", Position(33131, 31925, 15)) ativarGeyser() end @@ -429,7 +429,7 @@ function cultsOfTibiaLevers.onUse(player, item, fromPosition, itemEx, toPosition Game.createMonster("Containment Machine", Position(33133, 31864, 15)):registerEvent("MachineDeath") Game.createMonster("The Armored Voidborn", Position(33135, 31859, 15)):registerEvent("MachineDeath") - kickerPlayerRoomAfferMin(convertTable, frompos, topos, Position(33179, 31840, 15), "You were kicked for exceeding the time limit within the boss room.", "", 60, true, ittable, blockmonsters) + kickerPlayerRoomAfterMin(convertTable, frompos, topos, Position(33179, 31840, 15), "You were kicked for exceeding the time limit within the boss room.", "", 60, true, ittable, blockmonsters) end end if item:getActionId() == 5505 then -- Boss da areia @@ -485,7 +485,7 @@ function cultsOfTibiaLevers.onUse(player, item, fromPosition, itemEx, toPosition Game.createMonster("the sandking fake", Position(33099, 31858, 15)):registerEvent("SandkingThink") Game.setStorageValue("sandking", 1) - kickerPlayerRoomAfferMin(convertTable, frompos, topos, Position(33459, 32269, 10), "You were kicked for exceeding the time limit within the boss room.", "", 60, true, ittable, blockmonsters) + kickerPlayerRoomAfterMin(convertTable, frompos, topos, Position(33459, 32269, 10), "You were kicked for exceeding the time limit within the boss room.", "", 60, true, ittable, blockmonsters) end end @@ -531,7 +531,7 @@ function cultsOfTibiaLevers.onUse(player, item, fromPosition, itemEx, toPosition spawnDarkSoul(1, 30) spawnDarkSoul(2, 30) spawnStolenSoul(30) - kickerPlayerRoomAfferMin(convertTable, frompos, topos, Position(33072, 31867, 15), "You were kicked for exceeding the time limit within the boss room.", "", 60, true, ittable, blockmonsters) + kickerPlayerRoomAfterMin(convertTable, frompos, topos, Position(33072, 31867, 15), "You were kicked for exceeding the time limit within the boss room.", "", 60, true, ittable, blockmonsters) end end return true diff --git a/data-otservbr-global/scripts/actions/quests/dangerous_depth/using_crystals.lua b/data-otservbr-global/scripts/actions/quests/dangerous_depth/using_crystals.lua index 74a3db1ae17..84dc7e433fa 100644 --- a/data-otservbr-global/scripts/actions/quests/dangerous_depth/using_crystals.lua +++ b/data-otservbr-global/scripts/actions/quests/dangerous_depth/using_crystals.lua @@ -351,7 +351,7 @@ local function checarSala(qnt) for _, boss in pairs(spectators) do if boss:isMonster() then if boss:getName():lower() == "the count of the core" then - boss:say("The count absorbs he power of the beast and becomes stronger.", TALKTYPE_ORANGE_2) + boss:say("The count absorbs he power of the beast and becomes stronger.", TALKTYPE_MONSTER_YELL) boss:addHealth(math.random(0, 15000)) end end diff --git a/data-otservbr-global/scripts/actions/quests/explorer_society/botanist.lua b/data-otservbr-global/scripts/actions/quests/explorer_society/botanist.lua index 5f2d1e5ae1d..27298f5e7ba 100644 --- a/data-otservbr-global/scripts/actions/quests/explorer_society/botanist.lua +++ b/data-otservbr-global/scripts/actions/quests/explorer_society/botanist.lua @@ -20,10 +20,10 @@ function explorerSocietyBotanist.onUse(player, item, fromPosition, target, toPos toPosition:sendMagicEffect(CONST_ME_MAGIC_RED) item:transform(5937) player:setStorageValue(53051, 1) - player:say("You successfully took a sample of the rare griffinclaw flower.", TALKTYPE_ORANGE_1) + player:say("You successfully took a sample of the rare griffinclaw flower.", TALKTYPE_MONSTER_SAY) else toPosition:sendMagicEffect(CONST_ME_POFF) - player:say("You already took a sample of the rare griffinclaw flower.", TALKTYPE_ORANGE_1) + player:say("You already took a sample of the rare griffinclaw flower.", TALKTYPE_MONSTER_SAY) end end return true diff --git a/data-otservbr-global/scripts/actions/quests/ferumbras_ascendant/scroll_of_ascension.lua b/data-otservbr-global/scripts/actions/quests/ferumbras_ascendant/scroll_of_ascension.lua deleted file mode 100644 index 7eccfa18edb..00000000000 --- a/data-otservbr-global/scripts/actions/quests/ferumbras_ascendant/scroll_of_ascension.lua +++ /dev/null @@ -1,18 +0,0 @@ -local ferumbrasAscendantScroll = Action() -function ferumbrasAscendantScroll.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local outfit = { lookType = 35 } - if item.itemid == 22771 then - doSetCreatureOutfit(player, outfit, 30 * 1000) - item:transform(22772) - item:decay() - player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Magical sparks whirl around the scroll as you read and then your appearance is changing.") - return true - elseif item.itemid == 22772 then - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You are tired of the last scroll reading, rest your eyes for a moment.") - end - return true -end - -ferumbrasAscendantScroll:id(22771, 22772) -ferumbrasAscendantScroll:register() diff --git a/data-otservbr-global/scripts/actions/quests/gravedigger/bookcase.lua b/data-otservbr-global/scripts/actions/quests/gravedigger/bookcase.lua index 39117269fce..9d999259a8c 100644 --- a/data-otservbr-global/scripts/actions/quests/gravedigger/bookcase.lua +++ b/data-otservbr-global/scripts/actions/quests/gravedigger/bookcase.lua @@ -3,9 +3,9 @@ function gravediggerBook.onUse(player, item, fromPosition, itemEx, toPosition) if player:getStorageValue(Storage.GravediggerOfDrefia.Bookcase) < 1 then player:setStorageValue(Storage.GravediggerOfDrefia.Bookcase, 1) player:addItem(19158, 1) - player:say("You have found a crumpled paper.", TALKTYPE_ORANGE_1) + player:say("You have found a crumpled paper.", TALKTYPE_MONSTER_SAY) else - player:say("You've picked up here.", TALKTYPE_ORANGE_1) + player:say("You've picked up here.", TALKTYPE_MONSTER_SAY) return true end return true diff --git a/data-otservbr-global/scripts/actions/quests/heart_of_destruction/final_lever.lua b/data-otservbr-global/scripts/actions/quests/heart_of_destruction/final_lever.lua index fe1d83724f1..c2d74bbf885 100644 --- a/data-otservbr-global/scripts/actions/quests/heart_of_destruction/final_lever.lua +++ b/data-otservbr-global/scripts/actions/quests/heart_of_destruction/final_lever.lua @@ -69,9 +69,10 @@ local function changeArea() local creatures = tile:getCreatures() if creatures and #creatures > 0 then if theHungerKilled == false then - for _, c in pairs(creatures) do - if isMonster(c) then - c:teleportTo({ x = 32244, y = 31369, z = 14 }) + for _, creature in pairs(creatures) do + local monster = Monster(creature) + if monster then + monster:teleportTo({ x = 32244, y = 31369, z = 14 }) end end else @@ -97,9 +98,10 @@ local function changeArea() local creatures = tile:getCreatures() if creatures and #creatures > 0 then if theDestructionKilled == false then - for _, c in pairs(creatures) do - if isMonster(c) then - c:teleportTo({ x = 32271, y = 31313, z = 14 }) + for _, creature in pairs(creatures) do + local monster = Monster(creature) + if monster then + monster:teleportTo({ x = 32271, y = 31313, z = 14 }) end end else @@ -125,9 +127,10 @@ local function changeArea() local creatures = tile:getCreatures() if creatures and #creatures > 0 then if theRageKilled == false then - for _, c in pairs(creatures) do - if isMonster(c) then - c:teleportTo({ x = 32299, y = 31369, z = 14 }) + for _, creature in pairs(creatures) do + local monster = Monster(creature) + if monster then + monster:teleportTo({ x = 32299, y = 31369, z = 14 }) end end else diff --git a/data-otservbr-global/scripts/actions/quests/heart_of_destruction/sparkion_eggs.lua b/data-otservbr-global/scripts/actions/quests/heart_of_destruction/sparkion_eggs.lua deleted file mode 100644 index 2c8a1059069..00000000000 --- a/data-otservbr-global/scripts/actions/quests/heart_of_destruction/sparkion_eggs.lua +++ /dev/null @@ -1,30 +0,0 @@ -local config = { - [23538] = { mountId = 94, message = "You receive the permission to ride a sparkion" }, - [23684] = { mountId = 98, message = "You receive the permission to ride a neon sparkid" }, - [23685] = { mountId = 99, message = "You receive the permission to ride a vortexion" }, -} - -local heartDestructionEggs = Action() - -function heartDestructionEggs.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local mount = config[item.itemid] - - if not mount then - return true - end - - if not player:hasMount(mount.mountId) then - player:addMount(mount.mountId) - player:say(mount.message, TALKTYPE_MONSTER_SAY) - item:remove(1) - else - player:sendTextMessage(19, "You already have this mount") - end - return true -end - -for itemId, info in pairs(config) do - heartDestructionEggs:id(itemId) -end - -heartDestructionEggs:register() diff --git a/data-otservbr-global/scripts/actions/quests/heart_of_destruction/sparks_lever.lua b/data-otservbr-global/scripts/actions/quests/heart_of_destruction/sparks_lever.lua index 9a87b0eea72..8ef36379605 100644 --- a/data-otservbr-global/scripts/actions/quests/heart_of_destruction/sparks_lever.lua +++ b/data-otservbr-global/scripts/actions/quests/heart_of_destruction/sparks_lever.lua @@ -120,11 +120,11 @@ function renewSparks() if tile then local creatures = tile:getCreatures() if creatures and #creatures > 0 then - for _, c in pairs(creatures) do - local cPos = c:getPosition() - if isMonster(c) and c:getName() == "Unstable Spark" then - cPos:sendMagicEffect(3) - c:remove() + for _, creature in pairs(creatures) do + local monster = Monster(creature) + if monster and monster:getName() == "Unstable Spark" then + monster:getPosition():sendMagicEffect(3) + monster:remove() end end end diff --git a/data-otservbr-global/scripts/actions/quests/mysterious_ornate/mysterious_metal_egg.lua b/data-otservbr-global/scripts/actions/quests/mysterious_ornate/mysterious_metal_egg.lua index 3d3680aace3..cf26310169d 100644 --- a/data-otservbr-global/scripts/actions/quests/mysterious_ornate/mysterious_metal_egg.lua +++ b/data-otservbr-global/scripts/actions/quests/mysterious_ornate/mysterious_metal_egg.lua @@ -1,7 +1,7 @@ local mysterious = Action() -function mysterious.onUse(cid, item, fromPosition, itemEx, toPosition) - local p = { x = 33672, y = 31884, z = 5 } -- where to tp to 33672, 31884, 5 - doCreatureSay(cid, "This metal egg seems to be locked by a strange mechanism. The time for it to reveal its contents has not yet come.", TALKTYPE_ORANGE_1) + +function mysterious.onUse(player, item, fromPosition, target, toPosition, isHotkey) + player:say("This metal egg seems to be locked by a strange mechanism. The time for it to reveal its contents has not yet come.", TALKTYPE_MONSTER_SAY) end mysterious:id(19065, 22739) diff --git a/data-otservbr-global/scripts/actions/quests/oramond/glooth_fairy_lever.lua b/data-otservbr-global/scripts/actions/quests/oramond/glooth_fairy_lever.lua index 1f8ece85ae5..9a22fbd150e 100644 --- a/data-otservbr-global/scripts/actions/quests/oramond/glooth_fairy_lever.lua +++ b/data-otservbr-global/scripts/actions/quests/oramond/glooth_fairy_lever.lua @@ -1,69 +1,73 @@ -local function removeBosst(fromArea1, fromArea2, bossName) - for x = fromArea1.x, fromArea2.x do - for y = fromArea1.y, fromArea2.y do - for z = fromArea1.z, fromArea2.z do - if getTopCreature({ x = x, y = y, z = z, stackpos = 255 }).uid > 0 then - if isMonster(getTopCreature({ x = x, y = y, z = z, stackpos = 255 }).uid) then - if string.lower(getCreatureName(getTopCreature({ x = x, y = y, z = z, stackpos = 255 }).uid)) == bossName then - doRemoveCreature(getTopCreature({ x = x, y = y, z = z, stackpos = 255 }).uid) - end +local function clearMonstersAndTeleportPlayers() + local leverRoomFromPos = Position(33658, 31934, 9) + local leverRoomToPos = Position(33670, 31940, 9) + local bossRoomFromPos = Position(33678, 31922, 9) + local bossRoomToPos = Position(33699, 31943, 9) + local exitPos = Position(33657, 31943, 9) + local destinationPos = Position(33684, 31932, 9) + + for x = leverRoomFromPos.x, leverRoomToPos.x do + for y = leverRoomFromPos.y, leverRoomToPos.y do + for z = leverRoomFromPos.z, leverRoomToPos.z do + local currentTile = Tile(Position({ x = x, y = y, z = z })) + if currentTile then + local topCreature = currentTile:getTopCreature() + if topCreature and topCreature:isPlayer() then + topCreature:getPosition():sendMagicEffect(CONST_ME_TELEPORT) + topCreature:teleportTo(exitPos) + topCreature:getPosition():sendMagicEffect(CONST_ME_TELEPORT) end end end end end - return true -end -local function teleportAllPlayersFromAreat(fromArea1, fromArea2, toPos) - for x = fromArea1.x, fromArea2.x do - for y = fromArea1.y, fromArea2.y do - for z = fromArea1.z, fromArea2.z do - local tile = Tile(Position({ x = x, y = y, z = z })) - if tile then - local player = tile:getTopCreature() - if player and player:isPlayer() then - player:teleportTo(toPos) - player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) + for x = bossRoomFromPos.x, bossRoomToPos.x do + for y = bossRoomFromPos.y, bossRoomToPos.y do + for z = bossRoomFromPos.z, bossRoomToPos.z do + local currentTile = Tile(Position({ x = x, y = y, z = z })) + if currentTile then + local topCreature = currentTile:getTopCreature() + if topCreature and topCreature:isMonster() then + topCreature:remove() + end + end + end + end + end + + for x = bossRoomFromPos.x, bossRoomToPos.x do + for y = bossRoomFromPos.y, bossRoomToPos.y do + for z = bossRoomFromPos.z, bossRoomToPos.z do + local currentTile = Tile(Position({ x = x, y = y, z = z })) + if currentTile then + local topCreature = currentTile:getTopCreature() + if topCreature and topCreature:isPlayer() then + topCreature:getPosition():sendMagicEffect(CONST_ME_TELEPORT) + topCreature:teleportTo(destinationPos) + topCreature:getPosition():sendMagicEffect(CONST_ME_TELEPORT) end end end end end - return true -end -local function PrepareEnter() - removeBosst({ x = 33679, y = 31919, z = 9 }, { x = 33701, y = 31941, z = 9 }, "glooth fairy") - teleportAllPlayersFromAreat({ x = 33659, y = 31935, z = 9 }, { x = 33668, y = 31939, z = 9 }, { x = 33684, y = 31935, z = 9 }) - Game.createMonster("Glooth Fairy", { x = 33688, y = 31937, z = 9 }) + Game.createMonster("Glooth Fairy", Position(33688, 31937, 9), false, true) end -local oramondGloothLever = Action() -function oramondGloothLever.onUse(player, item, fromPosition, target, toPosition, isHotkey) - if item.itemid == 8913 then - if getGlobalStorageValue(15560) >= os.time() then - doPlayerSendTextMessage(player, 19, "You need to wait 15 minutes to use again.") - return true - end +local gloothFairyLever = Action() - local specs, spec = Game.getSpectators({ x = 33688, y = 31932, z = 9 }, false, false, 13, 13, 13, 13) - for i = 1, #specs do - spec = specs[i] - if spec:isPlayer() then - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "A team is already inside the quest room.") - return true - end - spec:remove() - end - setGlobalStorageValue(18081, os.time() + 15 * 60) - player:say("Everyone in this place will be teleported into Glooth Fairy's hideout in one minute. No way back!!!", TALKTYPE_MONSTER_SAY) - addEvent(PrepareEnter, 60 * 1000) +function gloothFairyLever.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if Game.getStorageValue(GlobalStorage.GloothFairyTimer) >= os.time() then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You need to wait 15 minutes to use again.") + return true end - item:transform(item.itemid == 8913 and 8914 or 8913) + player:say("Everyone in this place will be teleported into Glooth Fairy's hideout in one minute. No way back!!!", TALKTYPE_MONSTER_SAY) + Game.setStorageValue(GlobalStorage.GloothFairyTimer, os.time() + 15 * 60) + addEvent(clearMonstersAndTeleportPlayers, 60 * 1000) return true end -oramondGloothLever:uid(1020) -oramondGloothLever:register() +gloothFairyLever:uid(1020) +gloothFairyLever:register() diff --git a/data-otservbr-global/scripts/actions/quests/oramond/the_glooth_brothers_tasks/the_ancient_sewers.lua b/data-otservbr-global/scripts/actions/quests/oramond/the_glooth_brothers_tasks/the_ancient_sewers.lua index 977ab183391..1419a97a709 100644 --- a/data-otservbr-global/scripts/actions/quests/oramond/the_glooth_brothers_tasks/the_ancient_sewers.lua +++ b/data-otservbr-global/scripts/actions/quests/oramond/the_glooth_brothers_tasks/the_ancient_sewers.lua @@ -20,9 +20,9 @@ function theAncientSewers.onUse(player, item, fromPosition, target, toPosition, if gerator then local chance = math.random(1, 100) if (chance >= 1) and (chance < 50) then - player:say(" There This piece fixed.", TALKTYPE_ORANGE_1) + player:say(" There This piece fixed.", TALKTYPE_MONSTER_SAY) elseif (chance >= 50) and (chance < 100) then - player:say(" This should do it.", TALKTYPE_ORANGE_1) + player:say(" This should do it.", TALKTYPE_MONSTER_SAY) end item:transform(gerator.itemGerator) diff --git a/data-otservbr-global/scripts/actions/quests/rottin_wood_and_married_men/broken_wall.lua b/data-otservbr-global/scripts/actions/quests/rottin_wood_and_married_men/broken_wall.lua index dd4267a62a7..25569ea2d40 100644 --- a/data-otservbr-global/scripts/actions/quests/rottin_wood_and_married_men/broken_wall.lua +++ b/data-otservbr-global/scripts/actions/quests/rottin_wood_and_married_men/broken_wall.lua @@ -5,9 +5,9 @@ function rottinWoodBroken.onUse(player, item, fromPosition, itemEx, toPosition, player:setStorageValue(Storage.RottinWoodAndMaried.RottinStart, 6) player:teleportTo(position) position:sendMagicEffect(CONST_ME_TELEPORT) - player:say("There we go.", TALKTYPE_ORANGE_1) + player:say("There we go.", TALKTYPE_MONSTER_SAY) else - player:say("You already done this mission, go and talk with Rottin Wood to others missions.", TALKTYPE_ORANGE_1) + player:say("You already done this mission, go and talk with Rottin Wood to others missions.", TALKTYPE_MONSTER_SAY) return true end return true diff --git a/data-otservbr-global/scripts/actions/quests/rottin_wood_and_married_men/corpse.lua b/data-otservbr-global/scripts/actions/quests/rottin_wood_and_married_men/corpse.lua index b7763edf1fd..d6699dc7fd6 100644 --- a/data-otservbr-global/scripts/actions/quests/rottin_wood_and_married_men/corpse.lua +++ b/data-otservbr-global/scripts/actions/quests/rottin_wood_and_married_men/corpse.lua @@ -1,11 +1,13 @@ local rottinWoodCorpse = Action() -function rottinWoodCorpse.onUse(cid, item, fromPosition, itemEx, toPosition, isHotkey) + +function rottinWoodCorpse.onUse(player, item, fromPosition, target, toPosition, isHotkey) if item.itemid == 12189 then - if (getPlayerStorageValue(cid, Storage.RottinWoodAndMaried.Mission03) == 5) and getPlayerStorageValue(cid, Storage.RottinWoodAndMaried.Corpse) < 4 then - doCreatureSay(cid, "You take no more gold than you actually need and release the merchant who makes away the very second you remove the ropes.", TALKTYPE_ORANGE_1) - doPlayerAddItem(cid, 3031, 100) - doRemoveItem(item.uid, 1) - setPlayerStorageValue(cid, Storage.RottinWoodAndMaried.Corpse, getPlayerStorageValue(cid, Storage.RottinWoodAndMaried.Corpse) + 1) + local storageRottinWoodAndMariedCorpse = player:getStorageValue(Storage.RottinWoodAndMaried.Corpse) + if player:getStorageValue(Storage.RottinWoodAndMaried.Mission03) == 5 and storageRottinWoodAndMariedCorpse < 4 then + player:say("You take no more gold than you actually need and release the merchant who makes away the very second you remove the ropes.", TALKTYPE_MONSTER_SAY) + player:addItem(3031, 1) + player:setStorageValue(Storage.RottinWoodAndMaried.Corpse, storageRottinWoodAndMariedCorpse + 1) + item:remove(1) end end return true diff --git a/data-otservbr-global/scripts/actions/quests/rottin_wood_and_married_men/trap.lua b/data-otservbr-global/scripts/actions/quests/rottin_wood_and_married_men/trap.lua index 02e2ef47cb9..4d324bb7cd2 100644 --- a/data-otservbr-global/scripts/actions/quests/rottin_wood_and_married_men/trap.lua +++ b/data-otservbr-global/scripts/actions/quests/rottin_wood_and_married_men/trap.lua @@ -1,15 +1,17 @@ function removeMonster() doRemoveItem(getTileItemById({ x = 32662, y = 32190, z = 7 }, 2768).uid, 1) - doSendMagicEffect({ x = 32662, y = 32190, z = 7 }, 45) - TOP_LEFT_CORNER = { x = 32651, y = 32178, z = 7, stackpos = 253 } - BOTTOM_RIGHT_CORNER = { x = 32668, y = 32190, z = 7, stackpos = 253 } + Position(32662, 32190, 7):sendMagicEffect(CONST_ME_STONES) + local TOP_LEFT_CORNER = { x = 32651, y = 32178, z = 7 } + local BOTTOM_RIGHT_CORNER = { x = 32668, y = 32190, z = 7 } + for Py = TOP_LEFT_CORNER.y, BOTTOM_RIGHT_CORNER.y do for Px = TOP_LEFT_CORNER.x, BOTTOM_RIGHT_CORNER.x do - creature = getThingfromPos({ x = Px, y = Py, z = 7, stackpos = 253 }) - if isMonster(creature.uid) then - if getCreatureName(creature.uid) == "Travelling Merchant" then - --doRemoveCreature(creature.uid) - doSendMagicEffect({ x = Px, y = Py, z = 7 }, 45) + local tile = Tile(Position({ x = Px, y = Py, z = 7 })) + if tile then + local monster = tile:getTopCreature() + if monster and monster:isMonster() and monster:getName() == "Travelling Merchant" then + -- monster:remove() + monster:getPosition():sendMagicEffect(CONST_ME_STONES) --setPlayerStorageValue(cid, Storage.RottinWoodAndMaried.Trap, -1) end end @@ -19,8 +21,8 @@ function removeMonster() end function removeTrap() - TOP_LEFT_CORNER = { x = 32651, y = 32178, z = 7, stackpos = 253 } - BOTTOM_RIGHT_CORNER = { x = 32668, y = 32190, z = 7, stackpos = 253 } + local TOP_LEFT_CORNER = { x = 32651, y = 32178, z = 7, stackpos = 253 } + local BOTTOM_RIGHT_CORNER = { x = 32668, y = 32190, z = 7, stackpos = 253 } for Py = TOP_LEFT_CORNER.y, BOTTOM_RIGHT_CORNER.y do for Px = TOP_LEFT_CORNER.x, BOTTOM_RIGHT_CORNER.x do local trap = getTileItemById({ x = Px, y = Py, z = 7 }, 12187) @@ -38,17 +40,17 @@ function rottinWoodtrap.onUse(cid, item, fromPosition, itemEx, toPosition, isHot if item.itemid == 12186 then if itemEx.itemid == 10480 then if (getPlayerStorageValue(cid, Storage.RottinWoodAndMaried.Mission03) == 5) and getPlayerStorageValue(cid, Storage.RottinWoodAndMaried.Trap) < 3 then - doCreatureSay(cid, "You place the trap carefully on the ground. Between twigs and leaves it is almost invisible.", TALKTYPE_ORANGE_1) + doCreatureSay(cid, "You place the trap carefully on the ground. Between twigs and leaves it is almost invisible.", TALKTYPE_MONSTER_SAY) doRemoveItem(item.uid, 1) Game.createItem(12187, 1, toPosition) setPlayerStorageValue(cid, Storage.RottinWoodAndMaried.Trap, getPlayerStorageValue(cid, Storage.RottinWoodAndMaried.Trap) + 1) else if getPlayerStorageValue(cid, Storage.RottinWoodAndMaried.Trap) == 3 then - doCreatureSay(cid, "It looks like the merchants are about to arrive, better hide somewhere where you can see whats going on in the area.", TALKTYPE_ORANGE_1) + doCreatureSay(cid, "It looks like the merchants are about to arrive, better hide somewhere where you can see whats going on in the area.", TALKTYPE_MONSTER_SAY) doRemoveItem(item.uid, 1) Game.createItem(12187, 1, toPosition) doTeleportThing(cid, { x = 32660, y = 32193, z = 7 }) - doSendMagicEffect(getCreaturePosition(cid), 45) + Player(cid):getPosition():sendMagicEffect(CONST_ME_STONES) Game.createItem(2768, 1, { x = 32662, y = 32190, z = 7 }) -- small fir tree ----------------------- SUMMON MERCHANT ----------------------------- doSummonCreature("Travelling Merchant", { x = 32656, y = 32182, z = 7 }) diff --git a/data-otservbr-global/scripts/actions/quests/secret_library/brokul_lever.lua b/data-otservbr-global/scripts/actions/quests/secret_library/brokul_lever.lua deleted file mode 100644 index 2f56fcc086a..00000000000 --- a/data-otservbr-global/scripts/actions/quests/secret_library/brokul_lever.lua +++ /dev/null @@ -1,103 +0,0 @@ -bossConfig = { - [34000] = { -- ActionID - requiredLevel = 150, - minPlayersRequired = 1, - - boss = "Brokul", - bossGlobalStorage = 35000, - playerStorage = 36000, - teleportPosition = Position(33483, 31445, 15), - centerRoomPosition = Position(33483, 31439, 15), - northRange = 15, - eastRange = 15, - southRange = 15, - westRange = 15, - exit = Position(33522, 31468, 15), - bossPosition = Position(33483, 31434, 15), - time = 15, - - playerPositions = { - [1] = Position(33520, 31465, 15), - [2] = Position(33521, 31465, 15), - [3] = Position(33522, 31465, 15), - [4] = Position(33523, 31465, 15), - [5] = Position(33524, 31465, 15), - }, - }, -} - -local function resetBoss(bossConfig, bossId) - local monster = Monster(bossId) - if monster then - monster:remove() - end - local spectators = Game.getSpectators(bossConfig.centerRoomPosition, false, true, bossConfig.westRange, bossConfig.eastRange, bossConfig.northRange, bossConfig.southRange) - for i = 1, #spectators do - spectators[i]:teleportTo(bossConfig.exit) - end -end - -local secretBrokul = Action() -function secretBrokul.onUse(player, item, fromPosition, target, toPosition, isHotkey) - if item.itemid == 2773 then - local bossConfig = bossConfig[item:getActionId()] - if not bossConfig then - return false - end - - if getGlobalStorageValue(bossConfig.bossGlobalStorage) > 0 then - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "There is already a team inside. Please wait.") - return true - end - - local errorMsg - local rPlayers = {} - for index, ipos in pairs(bossConfig.playerPositions) do - local playerTile = Tile(ipos):getTopCreature() - if playerTile then - if playerTile:isPlayer() then - if playerTile:getLevel() >= bossConfig.requiredLevel then - if playerTile:getStorageValue(bossConfig.playerStorage) <= os.time() then - table.insert(rPlayers, playerTile:getId()) - else - errorMsg = "One or more players have already entered in the last 20 hours." - end - else - errorMsg = "All the players need to be level " .. bossConfig.requiredLevel .. " or higher." - end - end - end - end - - if #rPlayers >= bossConfig.minPlayersRequired then - for _, pid in pairs(rPlayers) do - local rplayer = Player(pid) - if rplayer:isPlayer() then - rplayer:sendTextMessage(MESSAGE_EVENT_ADVANCE, ("You have %o minutes before you get kicked out."):format(bossConfig.time)) - bossConfig.playerPositions[_]:sendMagicEffect(CONST_ME_POFF) - rplayer:teleportTo(bossConfig.teleportPosition) - rplayer:setStorageValue(bossConfig.playerStorage, os.time() + (configManager.getNumber(configKeys.BOSS_DEFAULT_TIME_TO_FIGHT_AGAIN))) - bossConfig.teleportPosition:sendMagicEffect(CONST_ME_ENERGYAREA) - rplayer:setDirection(DIRECTION_NORTH) - end - end - setGlobalStorageValue(bossConfig.bossGlobalStorage, 1) - addEvent(setGlobalStorageValue, bossConfig.time * 60 * 1000, bossConfig.bossGlobalStorage, 0) - local monster = Game.createMonster(bossConfig.boss, bossConfig.bossPosition) - addEvent(resetBoss, bossConfig.time * 60 * 1000, bossConfig, monster and monster.uid or 0) - else - if not errorMsg then - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, ("You need %u players."):format(bossConfig.minPlayersRequired)) - else - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, errorMsg) - end - return true - end - end - item:transform(item.itemid == 2773 and 2772 or 2773) - - return true -end - -secretBrokul:aid(34000) -secretBrokul:register() diff --git a/data-otservbr-global/scripts/actions/quests/the_hidden_city_of_beregar/ladder.lua b/data-otservbr-global/scripts/actions/quests/the_hidden_city_of_beregar/ladder.lua index ec2d00c1a09..5260bc4469a 100644 --- a/data-otservbr-global/scripts/actions/quests/the_hidden_city_of_beregar/ladder.lua +++ b/data-otservbr-global/scripts/actions/quests/the_hidden_city_of_beregar/ladder.lua @@ -5,7 +5,7 @@ function dwarvenLadder.onUse(player, item, fromPosition, itemEx, toPosition) player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) return true else - player:say("Zzz Dont working.", TALKTYPE_ORANGE_1) + player:say("Zzz Dont working.", TALKTYPE_MONSTER_SAY) return true end return false diff --git a/data-otservbr-global/scripts/actions/rookgaard/rapier_quest.lua b/data-otservbr-global/scripts/actions/rookgaard/rapier_quest.lua new file mode 100644 index 00000000000..20e6697d2f7 --- /dev/null +++ b/data-otservbr-global/scripts/actions/rookgaard/rapier_quest.lua @@ -0,0 +1,15 @@ +local rapierQuest = Action() + +function rapierQuest.onUse(player, item, fromPosition, target, toPosition, isHotkey) + local rewardId = 3272 + if not player:canGetReward(rewardId, "rapier") then + return true + end + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have found a rapier.") + player:addItem(rewardId, 1) + player:questKV("rapier"):set("completed", true) + return true +end + +rapierQuest:uid(14042) +rapierQuest:register() diff --git a/data-otservbr-global/scripts/actions/spellbook.lua b/data-otservbr-global/scripts/actions/spellbook.lua deleted file mode 100644 index 2e1328bcac4..00000000000 --- a/data-otservbr-global/scripts/actions/spellbook.lua +++ /dev/null @@ -1,58 +0,0 @@ -local spellbook = Action() - -function spellbook.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local text = "" - local tlvl = {} - local tml = {} - - for _, spell in ipairs(player:getInstantSpells()) do - if spell.level ~= 0 or spell.mlevel ~= 0 then - if spell.manapercent > 0 then - spell.mana = spell.manapercent .. "%" - end - if spell.level > 0 then - tlvl[#tlvl + 1] = spell - elseif spell.mlevel > 0 then - tml[#tml + 1] = spell - end - end - end - - table.sort(tlvl, function(a, b) - return a.level < b.level - end) - local prevLevel = -1 - for i, spell in ipairs(tlvl) do - local line = "" - if prevLevel ~= spell.level then - if i ~= 1 then - line = "\n" - end - line = line .. "Spells for Level " .. spell.level .. "\n" - prevLevel = spell.level - end - text = text .. line .. " " .. spell.words .. " - " .. spell.name .. " : " .. spell.mana .. "\n" - end - text = text .. "\n" - table.sort(tml, function(a, b) - return a.mlevel < b.mlevel - end) - local prevmLevel = -1 - for i, spell in ipairs(tml) do - local line = "" - if prevLevel ~= spell.mlevel then - if i ~= 1 then - line = "\n" - end - line = line .. "Spells for Magic Level " .. spell.mlevel .. "\n" - prevmLevel = spell.mlevel - end - text = text .. line .. " " .. spell.words .. " - " .. spell.name .. " : " .. spell.mana .. "\n" - end - - player:showTextDialog(item:getId(), text) - return true -end - -spellbook:id(3059, 6120, 8072, 8073, 8074, 8075, 8076, 8090, 11691, 14769, 16107, 20088, 21400, 22755, 25699, 29431, 20089, 20090, 34153) -spellbook:register() diff --git a/data-otservbr-global/scripts/actions/tools/noxious_claw.lua b/data-otservbr-global/scripts/actions/tools/noxious_claw.lua deleted file mode 100644 index b666ece019b..00000000000 --- a/data-otservbr-global/scripts/actions/tools/noxious_claw.lua +++ /dev/null @@ -1,15 +0,0 @@ -local noxiousClaw = Action() - -function noxiousClaw.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local player, useItem, depleteChance = player, item, 5 - if player:getCondition(CONDITION_POISON) then - player:removeCondition(CONDITION_POISON) - end - useItem:transform(9394) - useItem:decay() - player:getPosition():sendMagicEffect(CONST_ME_MAGIC_GREEN) - return true -end - -noxiousClaw:id(9392) -noxiousClaw:register() diff --git a/data-otservbr-global/scripts/actions/tools/rust_remover.lua b/data-otservbr-global/scripts/actions/tools/rust_remover.lua deleted file mode 100644 index 93e64a66292..00000000000 --- a/data-otservbr-global/scripts/actions/tools/rust_remover.lua +++ /dev/null @@ -1,110 +0,0 @@ -local CHAIN_ARMOR, SCALE_ARMOR, BRASS_ARMOR, PLATE_ARMOR, KNIGHT_ARMOR, PALADIN_ARMOR, CROWN_ARMOR, GOLDEN_ARMOR, DRAGON_SCALE_MAIL, MAGIC_PLATE_ARMOR = 3358, 3377, 3359, 3357, 3370, 8063, 3381, 3360, 3386, 3366 -local STUDDED_LEGS, CHAIN_LEGS, BRASS_LEGS, PLATE_LEGS, KNIGHT_LEGS, CROWN_LEGS, GOLDEN_LEGS = 3362, 3558, 3372, 3557, 3371, 3382, 3364 -local BRASS_HELMET, IRON_HELMET, STEEL_HELMET, CROWN_HELMET, CRUSADER_HELMET, ROYAL_HELMET = 3354, 3353, 3351, 3385, 3391, 3392 -local PLATE_SHIELD, ANCIENT_SHIELD, NORSE_SHIELD, CROWN_SHIELD, VAMPIRE_SHIELD = 3410, 3432, 7460, 3419, 3434 - -local config = { - [8894] = { -- common rusty armor - { { 1, 26764 } }, - { { 26765, 60000 }, CHAIN_ARMOR }, - { { 60001, 90000 }, SCALE_ARMOR }, - { { 90001, 97000 }, BRASS_ARMOR }, - { { 97001, 99000 }, PLATE_ARMOR }, - { { 99001, 100000 }, KNIGHT_ARMOR }, - }, - - [8906] = { -- semi-rare rusty helmet - { { 1, 35165 } }, - { { 35166, 57500 }, BRASS_HELMET }, - { { 57501, 70000 }, IRON_HELMET }, - { { 70001, 81000 }, STEEL_HELMET }, - { { 81001, 94000 }, CROWN_HELMET }, - { { 94001, 98500 }, CRUSADER_HELMET }, - { { 98501, 100000 }, ROYAL_HELMET }, - }, - - [8895] = { -- semi-rare rusty armor - { { 1, 35165 } }, - { { 35166, 57500 }, CHAIN_ARMOR }, - { { 57501, 70000 }, SCALE_ARMOR }, - { { 70001, 81000 }, BRASS_ARMOR }, - { { 81001, 90000 }, PLATE_ARMOR }, - { { 90001, 96500 }, KNIGHT_ARMOR }, - { { 96501, 99500 }, PALADIN_ARMOR }, - { { 99501, 100000 }, CROWN_ARMOR }, - }, - [8896] = { -- rare rusty armor - { { 1, 50000 } }, - { { 50001, 60000 }, CHAIN_ARMOR }, - { { 60001, 70000 }, SCALE_ARMOR }, - { { 70001, 80000 }, BRASS_ARMOR }, - { { 80001, 87500 }, PLATE_ARMOR }, - { { 87501, 93000 }, KNIGHT_ARMOR }, - { { 93001, 96000 }, PALADIN_ARMOR }, - { { 96000, 97000 }, CROWN_ARMOR }, - { { 96001, 98500 }, GOLDEN_ARMOR }, - { { 98501, 99500 }, DRAGON_SCALE_MAIL }, - { { 99501, 100000 }, MAGIC_PLATE_ARMOR }, - }, - [8897] = { -- common rusty legs - { { 1, 26764 } }, - { { 26765, 60000 }, STUDDED_LEGS }, - { { 60001, 85000 }, CHAIN_LEGS }, - { { 85001, 98000 }, BRASS_LEGS }, - { { 98001, 99500 }, PLATE_LEGS }, - { { 99501, 100000 }, KNIGHT_LEGS }, - }, - [8898] = { -- semi-rare rusty legs - { { 1, 35165 } }, - { { 35166, 60000 }, STUDDED_LEGS }, - { { 60001, 75000 }, CHAIN_LEGS }, - { { 75001, 87500 }, BRASS_LEGS }, - { { 87501, 95500 }, PLATE_LEGS }, - { { 95501, 98250 }, KNIGHT_LEGS }, - { { 98251, 99250 }, CROWN_LEGS }, - { { 99251, 100000 }, GOLDEN_LEGS }, - }, - [8899] = { -- rare rusty legs - { { 1, 50000 } }, - { { 50001, 75000 }, BRASS_LEGS }, - { { 75001, 90000 }, PLATE_LEGS }, - { { 90001, 97500 }, KNIGHT_LEGS }, - { { 97501, 99000 }, CROWN_LEGS }, - { { 99001, 100000 }, GOLDEN_LEGS }, - }, - [8902] = { -- slightly rusted shield - { { 1, 28070 } }, - { { 28071, 59440 }, PLATE_SHIELD }, - { { 59441, 88310 }, ANCIENT_SHIELD }, - { { 88311, 97601 }, NORSE_SHIELD }, - { { 97602, 99901 }, CROWN_SHIELD }, - { { 99902, 100000 }, VAMPIRE_SHIELD }, - }, -} - -local rustRemover = Action() - -function rustRemover.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local targetItem = config[target.itemid] - if not targetItem then - return true - end - - local chance = math.random(100000) - for i = 1, #targetItem do - if chance >= targetItem[i][1][1] and chance <= targetItem[i][1][2] then - if targetItem[i][2] then - target:transform(targetItem[i][2]) - toPosition:sendMagicEffect(CONST_ME_MAGIC_GREEN) - else - player:say((table.contains({ 8894, 8895, 8896 }, target.itemid) and "The item was already damaged so badly that it broke when you tried to clean it." or "The item were already damaged so badly that they broke when you tried to clean them."), TALKTYPE_MONSTER_SAY) - target:remove() - toPosition:sendMagicEffect(CONST_ME_BLOCKHIT) - end - return item:remove(1) - end - end -end - -rustRemover:id(9016) -rustRemover:register() diff --git a/data-otservbr-global/scripts/actions/tools/skinning.lua b/data-otservbr-global/scripts/actions/tools/skinning.lua index b87f9c92cca..f6785f91378 100644 --- a/data-otservbr-global/scripts/actions/tools/skinning.lua +++ b/data-otservbr-global/scripts/actions/tools/skinning.lua @@ -1,4 +1,3 @@ ----- if you want protected corpses (10 second protection after monster being killed) to be skinned/dusted, delete '--#' in the appropriate lines; be careful, it may cause abuses ---- local CREATURE_SKINNING_CHANCE = 25000 -- 25% probability local config = { [5908] = { @@ -70,10 +69,28 @@ local config = { [22742] = { value = CREATURE_SKINNING_CHANCE, newItem = 22186, after = 22744 }, -- after being killed -- The Mutated Pumpkin - [12816] = { { value = 5000, newItem = 123 }, { value = 10000, newItem = 653 }, { value = 20000, 6491 }, { value = 26764, newItem = 8032 }, { value = 45000, newItem = 3594 }, { value = 60000, newItem = 2977 }, { value = 90000, newItem = 8177, amount = 50 } }, + [12816] = { + { value = 5000, newItem = 8032 }, -- spiderwebs + { value = 5000, newItem = 8178 }, -- toy spider + { value = 5000, newItem = 6491 }, -- bat decoration + { value = 20000, newItem = 6525 }, -- skeleton decoration + { value = 90000, newItem = 8177, amount = 20 }, -- yummy gummy worm + { value = 10000, newItem = 6571 }, -- surprise bag (red) + { value = 10000, newItem = 6570 }, -- surprise bag (blue) + { value = 50000, newItem = 6574 }, -- bar of chocolate + { value = 60000, newItem = 2977 }, -- pumpkinhead + { value = 45000, newItem = 3594 }, -- pumpkin + { value = 90000, newItem = 3599, amount = 50 }, -- candy cane + { value = 90000, newItem = 6569, amount = 50 }, -- candy + { value = 2000, newItem = 6574, amount = 50 }, -- bar of chocolate + }, -- Marble - [10426] = { { value = 10000, newItem = 10429, desc = "This little figurine of Tibiasula was masterfully sculpted by |PLAYERNAME|." }, { value = 26764, newItem = 10428, desc = "This little figurine made by |PLAYERNAME| has some room for improvement." }, { value = 60000, newItem = 10427, desc = "This shoddy work was made by |PLAYERNAME|." } }, + [10426] = { + { value = 10000, newItem = 10429, desc = "This little figurine of Tibiasula was masterfully sculpted by |PLAYERNAME|." }, + { value = 26764, newItem = 10428, desc = "This little figurine made by |PLAYERNAME| has some room for improvement." }, + { value = 60000, newItem = 10427, desc = "This shoddy work was made by |PLAYERNAME|." }, + }, -- Ice Cube [7441] = { value = 22344, newItem = 7442 }, @@ -101,7 +118,15 @@ local config = { local skinning = Action() function skinning.onUse(player, item, fromPosition, target, toPosition, isHotkey) + local topItem = false local skin = config[item.itemid][target.itemid] + local tile = Tile(toPosition) + if tile then + topItem = tile:getTopDownItem() + if topItem then + skin = config[item.itemid][topItem.itemid] + end + end if item.itemid == 5908 then if target:getId() == CONST_FIREWORK_ITEMID_DISASSEMBLE then @@ -146,6 +171,22 @@ function skinning.onUse(player, item, fromPosition, target, toPosition, isHotkey end end + if target:getId() == 12816 then + if player:getStorageValue(Storage.Quest.U8_2.TheMutatedPumpkin.Skinned) > os.time() then + player:sendCancelMessage("You already used your knife on the corpse.") + return true + end + + player:setStorageValue(Storage.Quest.U8_2.TheMutatedPumpkin.Skinned, os.time() + 4 * 60 * 60) + player:say("Happy Halloween!", TALKTYPE_MONSTER_SAY) + player:getPosition():sendMagicEffect(CONST_ME_GIFT_WRAPS) + player:addAchievement("Mutated Presents") + local reward = math.random(1, #skin) + player:addItem(skin[reward].newItem, skin[reward].amount or 1) + effect = CONST_ME_HITAREA + return true + end + if not skin then player:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) return true @@ -167,11 +208,15 @@ function skinning.onUse(player, item, fromPosition, target, toPosition, isHotkey _skin = skin[i] if random <= _skin.value then if target.itemid == 10426 then - target:getPosition():sendMagicEffect(CONST_ME_ICEAREA) + target:getPosition():sendMagicEffect(CONST_ME_HITAREA) local gobletItem = player:addItem(_skin.newItem, _skin.amount or 1) if gobletItem then gobletItem:setDescription(_skin.desc:gsub("|PLAYERNAME|", player:getName())) end + if _skin.newItem == 10429 then + player:addAchievement("Marblelous") + player:addAchievementProgress("Marble Madness", 5) + end target:remove() added = true else @@ -182,11 +227,9 @@ function skinning.onUse(player, item, fromPosition, target, toPosition, isHotkey end end - if not added and target.itemid == 12816 then - effect = CONST_ME_POFF - transform = false - elseif not added and target.itemid == 10426 then - effect = CONST_ME_POFF + if not added and target.itemid == 10426 then + effect = CONST_ME_HITAREA + player:say("Your attempt at shaping that marble rock failed miserably.", TALKTYPE_MONSTER_SAY) transform = false target:remove() end @@ -194,11 +237,23 @@ function skinning.onUse(player, item, fromPosition, target, toPosition, isHotkey if isInArray({ 7441, 7442, 7444, 7445 }, target.itemid) then if skin.newItem == 7446 then player:addAchievement("Ice Sculptor") + player:addAchievementProgress("Cold as Ice", 10) end target:transform(skin.newItem, 1) effect = CONST_ME_HITAREA + return true else - player:addItem(skin.newItem, skin.amount or 1) + if table.contains({ 5906, 5905 }, skin.newItem) then + player:addAchievementProgress("Ashes to Dust", 500) + else + player:addAchievementProgress("Skin-Deep", 500) + end + local container = Container(item:getParent().uid) + if fromPosition.x == CONTAINER_POSITION and container:getEmptySlots() ~= 0 then + container:addItem(skin.newItem, skin.amount or 1) + else + player:addItem(skin.newItem, skin.amount or 1) + end end else if isInArray({ 7441, 7442, 7444, 7445 }, target.itemid) then @@ -206,17 +261,21 @@ function skinning.onUse(player, item, fromPosition, target, toPosition, isHotkey effect = CONST_ME_HITAREA target:remove() else - effect = CONST_ME_POFF + effect = CONST_ME_BLOCKHIT end end - -- SE BUGAR, PEGAR SCRIPT ANTIGO - toPosition:sendMagicEffect(effect) + if transform then - target:transform(skin.after or target:getType():getDecayId() or target.itemid + 1) + topItem:transform(skin.after or topItem:getType():getDecayId() or topItem.itemid + 1) else target:remove() end + if toPosition.x == CONTAINER_POSITION then + toPosition = player:getPosition() + end + toPosition:sendMagicEffect(effect) + return true end diff --git a/data-otservbr-global/scripts/actions/tools/toolgear.lua b/data-otservbr-global/scripts/actions/tools/toolgear.lua deleted file mode 100644 index 7afafd32bea..00000000000 --- a/data-otservbr-global/scripts/actions/tools/toolgear.lua +++ /dev/null @@ -1,15 +0,0 @@ -local toolGear = Action() - -function toolGear.onUse(player, item, fromPosition, target, toPosition, isHotkey) - return onUseRope(player, item, fromPosition, target, toPosition, isHotkey) - or onUseShovel(player, item, fromPosition, target, toPosition, isHotkey) - or onUsePick(player, item, fromPosition, target, toPosition, isHotkey) - or onUseMachete(player, item, fromPosition, target, toPosition, isHotkey) - or onUseCrowbar(player, item, fromPosition, target, toPosition, isHotkey) - or onUseSpoon(player, item, fromPosition, target, toPosition, isHotkey) - or onUseScythe(player, item, fromPosition, target, toPosition, isHotkey) - or onUseKitchenKnife(player, item, fromPosition, target, toPosition, isHotkey) -end - -toolGear:id(9594, 9596, 9598) -toolGear:register() diff --git a/data-otservbr-global/scripts/actions/worldchanges/the_mummys_curse/horestis_jars.lua b/data-otservbr-global/scripts/actions/worldchanges/the_mummys_curse/horestis_jars.lua index 31af13df3e1..d01ce876779 100644 --- a/data-otservbr-global/scripts/actions/worldchanges/the_mummys_curse/horestis_jars.lua +++ b/data-otservbr-global/scripts/actions/worldchanges/the_mummys_curse/horestis_jars.lua @@ -27,7 +27,7 @@ function horestisJars.onUse(cid, item, fromPosition, itemEx, toPosition) doTransformItem(item.uid, 12506) setGlobalStorageValue(GlobalStorage.TheMummysCurse, 1) else - player:say(failMessages[math.random(#failMessages)], TALKTYPE_ORANGE_1) + player:say(failMessages[math.random(#failMessages)], TALKTYPE_MONSTER_SAY) player:getPosition():sendMagicEffect(CONST_ME_POFF) setPlayerStorageValue(cid, Storage.TheMummysCurse.Time1, os.time() + exaustedSeconds * 1800) end @@ -43,7 +43,7 @@ function horestisJars.onUse(cid, item, fromPosition, itemEx, toPosition) doTransformItem(item.uid, 12506) setGlobalStorageValue(GlobalStorage.TheMummysCurse, 2) else - player:say(failMessages[math.random(#failMessages)], TALKTYPE_ORANGE_1) + player:say(failMessages[math.random(#failMessages)], TALKTYPE_MONSTER_SAY) player:getPosition():sendMagicEffect(CONST_ME_POFF) setPlayerStorageValue(cid, Storage.TheMummysCurse.Time2, os.time() + exaustedSeconds * 1800) end @@ -62,7 +62,7 @@ function horestisJars.onUse(cid, item, fromPosition, itemEx, toPosition) doTransformItem(item.uid, 12506) setGlobalStorageValue(GlobalStorage.TheMummysCurse, 3) else - player:say(failMessages[math.random(#failMessages)], TALKTYPE_ORANGE_1) + player:say(failMessages[math.random(#failMessages)], TALKTYPE_MONSTER_SAY) player:getPosition():sendMagicEffect(CONST_ME_POFF) setPlayerStorageValue(cid, Storage.TheMummysCurse.Time3, os.time() + exaustedSeconds * 1800) end @@ -81,7 +81,7 @@ function horestisJars.onUse(cid, item, fromPosition, itemEx, toPosition) doTransformItem(item.uid, 12506) setGlobalStorageValue(GlobalStorage.TheMummysCurse, 4) else - player:say(failMessages[math.random(#failMessages)], TALKTYPE_ORANGE_1) + player:say(failMessages[math.random(#failMessages)], TALKTYPE_MONSTER_SAY) player:getPosition():sendMagicEffect(CONST_ME_POFF) setPlayerStorageValue(cid, Storage.TheMummysCurse.Time4, os.time() + exaustedSeconds * 1800) end @@ -101,7 +101,7 @@ function horestisJars.onUse(cid, item, fromPosition, itemEx, toPosition) doRemoveItem(getTileItemById({ x = 32942, y = 32754, z = 12 }, 3514).uid, 1) doRemoveItem(getTileItemById({ x = 32943, y = 32754, z = 12 }, 3514).uid, 1) doRemoveItem(getTileItemById({ x = 32944, y = 32754, z = 12 }, 3514).uid, 1) - doCreatureSay(cid, "The horestis tomb was broken, the boss of the tomb will be reborn in 45 seconds. The barrier will be built from here 2 minutes.", TALKTYPE_ORANGE_1) + doCreatureSay(cid, "The horestis tomb was broken, the boss of the tomb will be reborn in 45 seconds. The barrier will be built from here 2 minutes.", TALKTYPE_MONSTER_SAY) Game.createMonster(bossName, bossPosition) addEvent(doSummonCreature, 45 * 1000, "Horestis", { x = 32942, y = 32765, z = 12 }) diff --git a/data-otservbr-global/scripts/creaturescripts/customs/freequests.lua b/data-otservbr-global/scripts/creaturescripts/customs/freequests.lua index e3db2db8c6a..ac8f4506c70 100644 --- a/data-otservbr-global/scripts/creaturescripts/customs/freequests.lua +++ b/data-otservbr-global/scripts/creaturescripts/customs/freequests.lua @@ -388,7 +388,7 @@ local function playerFreeQuestStart(playerId, index) for i = 1, 5 do index = index + 1 if not questTable[index] then - player:sendTextMessage(MESSAGE_INFO_DESCR, "Adding free quests completed.") + player:sendTextMessage(MESSAGE_LOOK, "Adding free quests completed.") player:setStorageValue(Storage.FreeQuests, stage) return end @@ -408,7 +408,7 @@ function freeQuests.onLogin(player) return true end - player:sendTextMessage(MESSAGE_INFO_DESCR, "Adding free acccess quests to your character.") + player:sendTextMessage(MESSAGE_LOOK, "Adding free acccess quests to your character.") addEvent(playerFreeQuestStart, 500, player:getId(), 0) player:addOutfit(251, 0) player:addOutfit(252, 0) diff --git a/data-otservbr-global/scripts/creaturescripts/customs/vip.lua b/data-otservbr-global/scripts/creaturescripts/customs/vip.lua index 4c6485c4c6c..0ae99c00f2d 100644 --- a/data-otservbr-global/scripts/creaturescripts/customs/vip.lua +++ b/data-otservbr-global/scripts/creaturescripts/customs/vip.lua @@ -2,7 +2,7 @@ local playerLogin = CreatureEvent("VipLogin") function playerLogin.onLogin(player) if configManager.getBoolean(configKeys.VIP_SYSTEM_ENABLED) then - local wasVip = player:getStorageValue(Storage.VipSystem.IsVip) == 1 + local wasVip = player:kv():scoped("account"):get("vip-system") or false if wasVip and not player:isVip() then player:onRemoveVip() end diff --git a/data-otservbr-global/scripts/creaturescripts/familiar/on_advance.lua b/data-otservbr-global/scripts/creaturescripts/familiar/on_advance.lua deleted file mode 100644 index 59ede1e0b12..00000000000 --- a/data-otservbr-global/scripts/creaturescripts/familiar/on_advance.lua +++ /dev/null @@ -1,16 +0,0 @@ -local familiarOnAdvance = CreatureEvent("FamiliarAdvance") - -function familiarOnAdvance.onAdvance(player, skill, oldLevel, newLevel) - local vocation = FAMILIAR_ID[player:getVocation():getBaseId()] - if vocation and newLevel >= 200 and isPremium(player) then - if player:getFamiliarLooktype() == 0 then - player:setFamiliarLooktype(vocation.id) - end - if not player:hasFamiliar(vocation.id) then - player:addFamiliar(vocation.id) - end - end - return true -end - -familiarOnAdvance:register() diff --git a/data-otservbr-global/scripts/creaturescripts/familiar/on_death.lua b/data-otservbr-global/scripts/creaturescripts/familiar/on_death.lua deleted file mode 100644 index 47d3ba81839..00000000000 --- a/data-otservbr-global/scripts/creaturescripts/familiar/on_death.lua +++ /dev/null @@ -1,21 +0,0 @@ -local familiarOnDeath = CreatureEvent("FamiliarDeath") - -function familiarOnDeath.onDeath(creature, corpse, lasthitkiller, mostdamagekiller, lasthitunjustified, mostdamageunjustified) - local player = creature:getMaster() - if not player then - return false - end - - local vocation = FAMILIAR_ID[player:getVocation():getBaseId()] - - if table.contains(vocation, creature:getName()) then - player:kv():set("familiar-summon-time", os.time()) - for sendMessage = 1, #FAMILIAR_TIMER do - stopEvent(player:getStorageValue(FAMILIAR_TIMER[sendMessage].storage)) - player:setStorageValue(FAMILIAR_TIMER[sendMessage].storage, -1) - end - end - return true -end - -familiarOnDeath:register() diff --git a/data-otservbr-global/scripts/creaturescripts/familiar/on_login.lua b/data-otservbr-global/scripts/creaturescripts/familiar/on_login.lua deleted file mode 100644 index e264040dbf9..00000000000 --- a/data-otservbr-global/scripts/creaturescripts/familiar/on_login.lua +++ /dev/null @@ -1,37 +0,0 @@ -local familiarOnLogin = CreatureEvent("FamiliarLogin") - -function familiarOnLogin.onLogin(player) - if not player then - return false - end - - local vocation = FAMILIAR_ID[player:getVocation():getBaseId()] - - local familiarName - local familiarSummonTime = player:kv():get("familiar-summon-time") or 0 - local familiarTimeLeft = familiarSummonTime - player:getLastLogout() - - if vocation then - if (not player:isPremium() and player:hasFamiliar(vocation.id)) or player:getLevel() < 200 then - player:removeFamiliar(vocation.id) - elseif player:isPremium() and player:getLevel() >= 200 then - if familiarTimeLeft > 0 then - familiarName = vocation.name - end - if player:getFamiliarLooktype() == 0 then - player:setFamiliarLooktype(vocation.id) - end - if not player:hasFamiliar(vocation.id) then - player:addFamiliar(vocation.id) - end - end - end - - if not familiarName then - return true - end - player:createFamiliar(familiarName, familiarTimeLeft) - return true -end - -familiarOnLogin:register() diff --git a/data-otservbr-global/scripts/creaturescripts/monster/gaz_haragoth_heal.lua b/data-otservbr-global/scripts/creaturescripts/monster/gaz_haragoth_heal.lua index 77dbbac6034..e0d446bb3bc 100644 --- a/data-otservbr-global/scripts/creaturescripts/monster/gaz_haragoth_heal.lua +++ b/data-otservbr-global/scripts/creaturescripts/monster/gaz_haragoth_heal.lua @@ -9,7 +9,7 @@ function gazHaragothHeal.onThink(creature) local hp = (creature:getHealth() / creature:getMaxHealth()) * 100 if hp < 12.5 and not creature:getCondition(CONDITION_REGENERATION, CONDITIONID_DEFAULT, 88888) then creature:addCondition(condition) - creature:say("Gaz'haragoth begins to draw on the nightmares to HEAL himself!", TALKTYPE_ORANGE_2) + creature:say("Gaz'haragoth begins to draw on the nightmares to HEAL himself!", TALKTYPE_MONSTER_YELL) addEvent(function(cid) local creature = Creature(cid) if not creature then @@ -17,7 +17,7 @@ function gazHaragothHeal.onThink(creature) end creature:addHealth(300000) creature:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) - creature:say("Gaz'haragoth HEALS himself!", TALKTYPE_ORANGE_2) + creature:say("Gaz'haragoth HEALS himself!", TALKTYPE_MONSTER_YELL) return true end, 7000, creature:getId()) end diff --git a/data-otservbr-global/scripts/creaturescripts/monster/greater_minion.lua b/data-otservbr-global/scripts/creaturescripts/monster/greater_minion.lua index 28d3397c356..e31249ee18a 100644 --- a/data-otservbr-global/scripts/creaturescripts/monster/greater_minion.lua +++ b/data-otservbr-global/scripts/creaturescripts/monster/greater_minion.lua @@ -8,7 +8,7 @@ function greaterMinion.onThink(creature) local pos = creature:getPosition() local creatureMaster = creature:getMaster() pos:sendMagicEffect(CONST_ME_MORTAREA) - local say = creatureMaster:say("The minion gains greater power!", TALKTYPE_ORANGE_2) + local say = creatureMaster:say("The minion gains greater power!", TALKTYPE_MONSTER_YELL) if not say then return end diff --git a/data-otservbr-global/scripts/creaturescripts/monster/omrafir_explode.lua b/data-otservbr-global/scripts/creaturescripts/monster/omrafir_explode.lua index 1804c3f086e..645a06216a4 100644 --- a/data-otservbr-global/scripts/creaturescripts/monster/omrafir_explode.lua +++ b/data-otservbr-global/scripts/creaturescripts/monster/omrafir_explode.lua @@ -9,7 +9,7 @@ function boom(cid) if not creature then return end - creature:say("OMRAFIR EXPLODES INTO FLAMES!", TALKTYPE_ORANGE_2) + creature:say("OMRAFIR EXPLODES INTO FLAMES!", TALKTYPE_MONSTER_YELL) Game.setStorageValue(112416, Game.getStorageValue(112416) + 1) creature:getPosition():sendMagicEffect(CONST_ME_FIREATTACK) for i = 1, 9 do @@ -32,7 +32,7 @@ function omrafirExplode.onThink(creature) addEvent(boom, 10, creature:getId()) addEvent(function(cid) local summon = Game.createMonster("Omrafir2", Position(33586, 32379, 12), false, true) - summon:say("OMRAFIR REFORMS HIMSELF WITH NEW STRENGTH!", TALKTYPE_ORANGE_2) + summon:say("OMRAFIR REFORMS HIMSELF WITH NEW STRENGTH!", TALKTYPE_MONSTER_YELL) end, 26764, creature:getId()) end return true diff --git a/data-otservbr-global/scripts/creaturescripts/monster/shargon_growth_check.lua b/data-otservbr-global/scripts/creaturescripts/monster/shargon_growth_check.lua index 41a748625da..32720486e52 100644 --- a/data-otservbr-global/scripts/creaturescripts/monster/shargon_growth_check.lua +++ b/data-otservbr-global/scripts/creaturescripts/monster/shargon_growth_check.lua @@ -5,7 +5,7 @@ function shargonGrowthCheck.onThink(creature) return true end if tilePos:getItemById(2129) or tilePos:getItemById(2130) then - creature:say("Your tricks are older then my minions! You wont trap me! Amuse yourself with my slaves as long was your traps are in place!", TALKTYPE_ORANGE_2) + creature:say("Your tricks are older then my minions! You wont trap me! Amuse yourself with my slaves as long was your traps are in place!", TALKTYPE_MONSTER_YELL) for i = 1, 20 do Game.createMonster("Death Reaper", { x = 176 + math.random(-6, 6), y = 386 + math.random(-6, 6), z = 7 }, false, true) creature:remove() diff --git a/data-otservbr-global/scripts/creaturescripts/monster/the_pale_count_kill.lua b/data-otservbr-global/scripts/creaturescripts/monster/the_pale_count_kill.lua index f484035f5e2..0fa9bf86515 100644 --- a/data-otservbr-global/scripts/creaturescripts/monster/the_pale_count_kill.lua +++ b/data-otservbr-global/scripts/creaturescripts/monster/the_pale_count_kill.lua @@ -2,7 +2,7 @@ local thePaleCountKill = CreatureEvent("ThePaleCountKill") function thePaleCountKill.onThink(creature) local hp = (creature:getHealth() / creature:getMaxHealth()) * 100 if hp < 75 then - creature:say("Dare to follow me to my Sanctuary below and you shall DIE!", TALKTYPE_ORANGE_1) + creature:say("Dare to follow me to my Sanctuary below and you shall DIE!", TALKTYPE_MONSTER_SAY) creature:remove() Game.createMonster("the pale count2", { x = 32972, y = 32419, z = 15 }) end diff --git a/data-otservbr-global/scripts/creaturescripts/monster/wyda.lua b/data-otservbr-global/scripts/creaturescripts/monster/wyda.lua deleted file mode 100644 index 27c9887eae8..00000000000 --- a/data-otservbr-global/scripts/creaturescripts/monster/wyda.lua +++ /dev/null @@ -1,6 +0,0 @@ -local wyda = CreatureEvent("Wyda") -function wyda.onDeath(creature, corpse, killer, mostDamage, unjustified, mostDamage_unjustified) - creature:say("It seems this was just an illusion.", TALKTYPE_ORANGE_1) -end - -wyda:register() diff --git a/data-otservbr-global/scripts/creaturescripts/others/advance_save.lua b/data-otservbr-global/scripts/creaturescripts/others/advance_save.lua deleted file mode 100644 index 8bd6fd2fd06..00000000000 --- a/data-otservbr-global/scripts/creaturescripts/others/advance_save.lua +++ /dev/null @@ -1,32 +0,0 @@ -local config = { - heal = true, - save = true, - effect = false, -} - -local advanceSave = CreatureEvent("AdvanceSave") - -function advanceSave.onAdvance(player, skill, oldLevel, newLevel) - if skill ~= SKILL_LEVEL or newLevel <= oldLevel then - return true - end - - if config.effect then - player:getPosition():sendMagicEffect(math.random(CONST_ME_FIREWORK_YELLOW, CONST_ME_FIREWORK_BLUE)) - player:say("LEVEL UP!", TALKTYPE_MONSTER_SAY) - end - - if config.heal then - player:addHealth(player:getMaxHealth()) - end - - if config.save then - player:save() - end - - player:getFinalLowLevelBonus() - - return true -end - -advanceSave:register() diff --git a/data-otservbr-global/scripts/creaturescripts/others/login.lua b/data-otservbr-global/scripts/creaturescripts/others/login.lua index 852e53c2a63..8457209e90a 100644 --- a/data-otservbr-global/scripts/creaturescripts/others/login.lua +++ b/data-otservbr-global/scripts/creaturescripts/others/login.lua @@ -1,66 +1,11 @@ -local function onMovementRemoveProtection(playerId, oldPos, time) - local player = Player(playerId) - if not player then - return true - end - - local playerPos = player:getPosition() - if (playerPos.x ~= oldPos.x or playerPos.y ~= oldPos.y or playerPos.z ~= oldPos.z) or player:getTarget() then - player:kv():remove("combat-protection") - return true - end - - addEvent(onMovementRemoveProtection, 1000, playerId, oldPos, time - 1) -end - -local function protectionZoneCheck(playerName) - doRemoveCreature(playerName) - return true -end - local playerLogin = CreatureEvent("PlayerLogin") function playerLogin.onLogin(player) - local items = { - { 3003, 1 }, - { 3457, 1 }, - } - if player:getLastLoginSaved() == 0 then - player:sendOutfitWindow() - local backpack = player:addItem(2854) - if backpack then - for i = 1, #items do - backpack:addItem(items[i][1], items[i][2]) - end - end - - db.query("UPDATE `players` SET `istutorial` = 0 where `id`=" .. player:getGuid()) - -- Open channels - if table.contains({ TOWNS_LIST.DAWNPORT, TOWNS_LIST.DAWNPORT_TUTORIAL }, player:getTown():getId()) then - player:openChannel(3) -- World chat - else - player:openChannel(3) -- World chat - player:openChannel(5) -- Advertsing main - end - else - player:sendTextMessage(MESSAGE_STATUS, SERVER_MOTD) - player:sendTextMessage(MESSAGE_LOGIN, string.format("Your last visit in " .. SERVER_NAME .. ": %s.", os.date("%d. %b %Y %X", player:getLastLoginSaved()))) - end - - -- Reset bosstiary time - local lastSaveServerTime = GetDailyRewardLastServerSave() - if lastSaveServerTime >= player:getLastLoginSaved() then - player:setRemoveBossTime(1) - end - - if isPremium(player) then - player:setStorageValue(Storage.PremiumAccount, 1) - end -- Premium Ends Teleport to Temple, change addon (citizen) houseless local defaultTown = "Thais" -- default town where player is teleported if his home town is in premium area local freeTowns = { "Ab'Dendriel", "Carlin", "Kazordoon", "Thais", "Venore", "Rookgaard", "Dawnport", "Dawnport Tutorial", "Island of Destiny" } -- towns in free account area - if isPremium(player) == false and table.contains(freeTowns, player:getTown():getName()) == false then + if not player:isPremium() and not table.contains(freeTowns, player:getTown():getName()) then local town = player:getTown() local sex = player:getSex() local home = getHouseByPlayerGUID(getPlayerGUID(player)) @@ -68,219 +13,29 @@ function playerLogin.onLogin(player) player:teleportTo(town:getTemplePosition()) player:setTown(town) player:sendTextMessage(MESSAGE_FAILURE, "Your premium time has expired.") - player:setStorageValue(Storage.PremiumAccount, 0) + if sex == 1 then player:setOutfit({ lookType = 128, lookFeet = 114, lookLegs = 134, lookHead = 114, lookAddons = 0 }) elseif sex == 0 then player:setOutfit({ lookType = 136, lookFeet = 114, lookLegs = 134, lookHead = 114, lookAddons = 0 }) end - if home ~= nil and not isPremium(player) then + + if home and not player:isPremium() then setHouseOwner(home, 0) player:sendTextMessage(MESSAGE_GAME_HIGHLIGHT, "You've lost your house because you are not premium anymore.") player:sendTextMessage(MESSAGE_GAME_HIGHLIGHT, "Your items from house are send to your inbox.") end end - -- End 'Premium Ends Teleport to Temple' - - -- Promotion - local vocation = player:getVocation() - local promotion = vocation:getPromotion() - if player:isPremium() then - local hasPromotion = player:kv():get("promoted") - if not player:isPromoted() and hasPromotion then - player:setVocation(promotion) - end - elseif player:isPromoted() then - player:setVocation(vocation:getDemotion()) - end - - -- Recruiter system - local resultId = db.storeQuery("SELECT `recruiter` from `accounts` where `id`=" .. getAccountNumberByPlayerName(getPlayerName(player))) - local recruiterStatus = Result.getNumber(resultId, "recruiter") - local sex = player:getSex() - if recruiterStatus >= 1 then - if sex == 1 then - local outfit = player:hasOutfit(746) - if outfit == false then - player:addOutfit(746) - end - else - local outfit = player:hasOutfit(745) - if outfit == false then - player:addOutfit(745) - end - end - end - if recruiterStatus >= 3 then - if sex == 1 then - local outfit = player:hasOutfit(746, 1) - if outfit == false then - player:addOutfitAddon(746, 1) - end - else - local outfit = player:hasOutfit(745, 1) - if outfit == false then - player:addOutfit(745, 1) - end - end - end - if recruiterStatus >= 10 then - if sex == 1 then - local outfit = player:hasOutfit(746, 2) - if outfit == false then - player:addOutfitAddon(746, 2) - end - else - local outfit = player:hasOutfit(745, 2) - if outfit == false then - player:addOutfit(745, 2) - end - end - end - -- End recruiter system - - local playerId = player:getId() - DailyReward.init(playerId) - - player:loadSpecialStorage() - - if player:getGroup():getId() >= GROUP_TYPE_GAMEMASTER then - player:setGhostMode(true) - end - - -- Boosted creature - player:sendTextMessage(MESSAGE_BOOSTED_CREATURE, "Today's boosted creature: " .. Game.getBoostedCreature() .. " \ - Boosted creatures yield more experience points, carry more loot than usual and respawn at a faster rate.") - - -- Boosted boss - player:sendTextMessage(MESSAGE_BOOSTED_CREATURE, "Today's boosted boss: " .. Game.getBoostedBoss() .. " \ - Boosted bosses contain more loot and count more kills for your Bosstiary.") - - if SCHEDULE_EXP_RATE ~= 100 then - if SCHEDULE_EXP_RATE > 100 then - player:sendTextMessage( - MESSAGE_BOOSTED_CREATURE, - "Exp Rate Event! Monsters yield more experience points than usual \ - Happy Hunting!" - ) - else - player:sendTextMessage(MESSAGE_BOOSTED_CREATURE, "Exp Rate Decreased! Monsters yield less experience points than usual.") - end - end - - if SCHEDULE_SPAWN_RATE ~= 100 then - if SCHEDULE_SPAWN_RATE > 100 then - player:sendTextMessage( - MESSAGE_BOOSTED_CREATURE, - "Spawn Rate Event! Monsters respawn at a faster rate \ - Happy Hunting!" - ) - else - player:sendTextMessage(MESSAGE_BOOSTED_CREATURE, "Spawn Rate Decreased! Monsters respawn at a slower rate.") - end - end - - if SCHEDULE_LOOT_RATE ~= 100 then - if SCHEDULE_LOOT_RATE > 100 then - player:sendTextMessage( - MESSAGE_BOOSTED_CREATURE, - "Loot Rate Event! Monsters carry more loot than usual \ - Happy Hunting!" - ) - else - player:sendTextMessage(MESSAGE_BOOSTED_CREATURE, "Loot Rate Decreased! Monsters carry less loot than usual.") - end - end - - if SCHEDULE_SKILL_RATE ~= 100 then - if SCHEDULE_SKILL_RATE > 100 then - player:sendTextMessage( - MESSAGE_BOOSTED_CREATURE, - "Skill Rate Event! Your skills progresses at a higher rate \ - Happy Hunting!" - ) - else - player:sendTextMessage(MESSAGE_BOOSTED_CREATURE, "Skill Rate Decreased! Your skills progresses at a lower rate.") - end - end - -- Loyalty system - player:initializeLoyaltySystem() - - -- Stamina - _G.NextUseStaminaTime[playerId] = 1 - - -- EXP Stamina - _G.NextUseXpStamina[playerId] = 1 - - -- Concoction Duration - _G.NextUseConcoctionTime[playerId] = 1 - - if player:getAccountType() == ACCOUNT_TYPE_TUTOR then - local msg = [[:: Tutor Rules - 1 *> 3 Warnings you lose the job. - 2 *> Without parallel conversations with players in Help, if the player starts offending, you simply mute it. - 3 *> Be educated with the players in Help and especially in the Private, try to help as much as possible. - 4 *> Always be on time, if you do not have a justification you will be removed from the staff. - 5 *> Help is only allowed to ask questions related to tibia. - 6 *> It is not allowed to divulge time up or to help in quest. - 7 *> You are not allowed to sell items in the Help. - 8 *> If the player encounters a bug, ask to go to the website to send a ticket and explain in detail. - 9 *> Always keep the Tutors Chat open. (required). - 10 *> You have finished your schedule, you have no tutor online, you communicate with some CM in-game - or ts and stay in the help until someone logs in, if you can. - 11 *> Always keep a good Portuguese in the Help, we want tutors who support, not that they speak a satanic ritual. - 12 *> If you see a tutor doing something that violates the rules, take a print and send it to your superiors. " - - Commands - - Mute Player: /mute nick, 90 (90 seconds) - Unmute Player: /unmute nick. - - Commands -]] - player:popupFYI(msg) - end - - -- Rewards - local rewards = #player:getRewardList() - if rewards > 0 then - player:sendTextMessage(MESSAGE_LOGIN, string.format("You have %d %s in your reward chest.", rewards, rewards > 1 and "rewards" or "reward")) - end - - -- Update player id - local stats = player:inBossFight() - if stats then - stats.playerId = player:getId() - end - - local isProtected = player:kv():get("combat-protection") or 0 - if isProtected < 1 then - player:kv():set("combat-protection", 1) - onMovementRemoveProtection(playerId, player:getPosition(), 10) - end - - -- Set Client XP Gain Rate -- - if configManager.getBoolean(configKeys.XP_DISPLAY_MODE) then - local baseRate = player:getFinalBaseRateExperience() - baseRate = baseRate * 100 - if configManager.getBoolean(configKeys.VIP_SYSTEM_ENABLED) then - local vipBonusExp = configManager.getNumber(configKeys.VIP_BONUS_EXP) - if vipBonusExp > 0 and player:isVip() then - vipBonusExp = (vipBonusExp > 100 and 100) or vipBonusExp - baseRate = baseRate * (1 + (vipBonusExp / 100)) - player:sendTextMessage(MESSAGE_BOOSTED_CREATURE, "Normal base xp is: " .. baseRate .. "%, because you are VIP, bonus of " .. vipBonusExp .. "%") - end + -- Open channels + if table.contains({ TOWNS_LIST.DAWNPORT, TOWNS_LIST.DAWNPORT_TUTORIAL }, player:getTown():getId()) then + player:openChannel(3) -- World chat + else + player:openChannel(3) -- World chat + player:openChannel(5) -- Advertsing main + if player:getGuild() then + player:openChannel(0x00) -- guild end - player:setBaseXpGain(baseRate) - end - - local staminaBonus = player:getFinalBonusStamina() - player:setStaminaXpBoost(staminaBonus * 100) - - player:getFinalLowLevelBonus() - - if _G.OnExerciseTraining[player:getId()] then - -- onLogin & onLogout - stopEvent(_G.OnExerciseTraining[player:getId()].event) - _G.OnExerciseTraining[player:getId()] = nil - player:setTraining(false) end return true end diff --git a/data-otservbr-global/scripts/creaturescripts/others/login_events.lua b/data-otservbr-global/scripts/creaturescripts/others/login_events.lua index de3b9cc4f0a..f88095e4756 100644 --- a/data-otservbr-global/scripts/creaturescripts/others/login_events.lua +++ b/data-otservbr-global/scripts/creaturescripts/others/login_events.lua @@ -2,9 +2,6 @@ local loginEvents = CreatureEvent("LoginEvents") function loginEvents.onLogin(player) local events = { "AdvanceSave", - "BossParticipation", - "DropLoot", - "PlayerDeath", "RookgaardAdvance", "FamiliarLogin", "FamiliarAdvance", diff --git a/data-otservbr-global/scripts/creaturescripts/others/offline_training.lua b/data-otservbr-global/scripts/creaturescripts/others/offline_training.lua deleted file mode 100644 index afe28e82134..00000000000 --- a/data-otservbr-global/scripts/creaturescripts/others/offline_training.lua +++ /dev/null @@ -1,76 +0,0 @@ -local offlineTraining = CreatureEvent("OfflineTraining") -function offlineTraining.onLogin(player) - local lastLogout = player:getLastLogout() - local offlineTime = lastLogout ~= 0 and math.min(os.time() - lastLogout, 86400 * 21) or 0 - local offlineTrainingSkill = player:getOfflineTrainingSkill() - if offlineTrainingSkill == SKILL_NONE then - player:addOfflineTrainingTime(offlineTime * 1000) - return true - end - - player:setOfflineTrainingSkill(SKILL_NONE) - - if offlineTime < 600 then - player:sendTextMessage(MESSAGE_OFFLINE_TRAINING, "You must be logged out for more than 10 minutes to start offline training.") - return true - end - - local trainingTime = math.max(0, math.min(offlineTime, math.min(43200, player:getOfflineTrainingTime() / 1000))) - player:removeOfflineTrainingTime(trainingTime * 1000) - - local remainder = offlineTime - trainingTime - if remainder > 0 then - player:addOfflineTrainingTime(remainder * 1000) - end - - if trainingTime < 60 then - return true - end - - local text = "During your absence you trained for" - local hours = math.floor(trainingTime / 3600) - if hours > 1 then - text = string.format("%s %d hours", text, hours) - elseif hours == 1 then - text = string.format("%s 1 hour", text) - end - - local minutes = math.floor((trainingTime % 3600) / 60) - if minutes ~= 0 then - if hours ~= 0 then - text = string.format("%s and", text) - end - - if minutes > 1 then - text = string.format("%s %d minutes", text, minutes) - else - text = string.format("%s 1 minute", text) - end - end - text = string.format("%s.", text) - player:sendTextMessage(MESSAGE_OFFLINE_TRAINING, text) - - local vocation = player:getVocation() - local promotion = vocation:getPromotion() - local topVocation = not promotion and vocation or promotion - - local updateSkill = false - if table.contains({ SKILL_CLUB, SKILL_SWORD, SKILL_AXE, SKILL_DISTANCE }, offlineTrainingSkill) then - local modifier = topVocation:getBaseAttackSpeed() / 1000 / configManager.getFloat(configKeys.RATE_OFFLINE_TRAINING_SPEED) - updateSkill = player:addOfflineTrainingTries(offlineTrainingSkill, (trainingTime / modifier) / (offlineTrainingSkill == SKILL_DISTANCE and 4 or 2)) - elseif offlineTrainingSkill == SKILL_MAGLEVEL then - local gainTicks = (topVocation:getManaGainTicks() / 1000) * 2 - if gainTicks == 0 then - gainTicks = 1 - end - - updateSkill = player:addOfflineTrainingTries(SKILL_MAGLEVEL, trainingTime * (vocation:getManaGainAmount() / gainTicks)) - end - - if updateSkill then - player:addOfflineTrainingTries(SKILL_SHIELD, trainingTime / 4) - end - return true -end - -offlineTraining:register() diff --git a/data-otservbr-global/scripts/creaturescripts/others/player_death.lua b/data-otservbr-global/scripts/creaturescripts/others/player_death.lua index 9e8bfbeca34..b848235ebae 100644 --- a/data-otservbr-global/scripts/creaturescripts/others/player_death.lua +++ b/data-otservbr-global/scripts/creaturescripts/others/player_death.lua @@ -84,24 +84,52 @@ function playerDeath.onDeath(player, corpse, killer, mostDamageKiller, unjustifi if byPlayer == 1 then local targetGuild = player:getGuild() - targetGuild = targetGuild and targetGuild:getId() or 0 - if targetGuild ~= 0 then + local targetGuildId = targetGuild and targetGuild:getId() or 0 + if targetGuildId ~= 0 then local killerGuild = killer:getGuild() - killerGuild = killerGuild and killerGuild:getId() or 0 - if killerGuild ~= 0 and targetGuild ~= killerGuild and isInWar(player:getId(), killer.uid) then + local killerGuildId = killerGuild and killerGuild:getId() or 0 + if killerGuildId ~= 0 and targetGuildId ~= killerGuildId and isInWar(player:getId(), killer:getId()) then local warId = false resultId = db.storeQuery("SELECT `id` FROM `guild_wars` WHERE `status` = 1 AND \z - ((`guild1` = " .. killerGuild .. " AND `guild2` = " .. targetGuild .. ") OR \z - (`guild1` = " .. targetGuild .. " AND `guild2` = " .. killerGuild .. "))") - if resultId ~= false then + ((`guild1` = " .. killerGuildId .. " AND `guild2` = " .. targetGuildId .. ") OR \z + (`guild1` = " .. targetGuildId .. " AND `guild2` = " .. killerGuildId .. "))") + if resultId then warId = Result.getNumber(resultId, "id") Result.free(resultId) end - if warId ~= false then + if warId then + local playerName = player:getName() db.asyncQuery("INSERT INTO `guildwar_kills` (`killer`, `target`, `killerguild`, `targetguild`, `time`, `warid`) \z - VALUES (" .. db.escapeString(killerName) .. ", " .. db.escapeString(player:getName()) .. ", " .. killerGuild .. ", \z - " .. targetGuild .. ", " .. os.time() .. ", " .. warId .. ")") + VALUES (" .. db.escapeString(killerName) .. ", " .. db.escapeString(playerName) .. ", " .. killerGuildId .. ", \z + " .. targetGuildId .. ", " .. os.time() .. ", " .. warId .. ")") + + resultId = db.storeQuery("SELECT `guild_wars`.`id`, `guild_wars`.`frags_limit`, (SELECT COUNT(1) FROM `guildwar_kills` \z + WHERE `guildwar_kills`.`warid` = `guild_wars`.`id` AND `guildwar_kills`.`killerguild` = `guild_wars`.`guild1`) AS guild1_kills, \z + (SELECT COUNT(1) FROM `guildwar_kills` WHERE `guildwar_kills`.`warid` = `guild_wars`.`id` AND `guildwar_kills`.`killerguild` = `guild_wars`.`guild2`) AS guild2_kills \z + FROM `guild_wars` WHERE (`guild1` = " .. killerGuildId .. " OR `guild2` = " .. killerGuildId .. ") AND `status` = 1 AND `id` = " .. warId) + + if resultId then + local guild1_kills = Result.getNumber(resultId, "guild1_kills") + local guild2_kills = Result.getNumber(resultId, "guild2_kills") + local frags_limit = Result.getNumber(resultId, "frags_limit") + Result.free(resultId) + + local members = killerGuild:getMembersOnline() + for i = 1, #members do + members[i]:sendChannelMessage(members[i], string.format("%s was killed by %s. The new score is: %s %d:%d %s (frags limit: %d)", playerName, killerName, targetGuild:getName(), guild1_kills, guild2_kills, killerGuild:getName(), frags_limit), TALKTYPE_CHANNEL_R1, CHANNEL_GUILD) + end + + local enemyMembers = targetGuild:getMembersOnline() + for i = 1, #enemyMembers do + enemyMembers[i]:sendChannelMessage(enemyMembers[i], string.format("%s was killed by %s. The new score is: %s %d:%d %s (frags limit: %d)", playerName, killerName, targetGuild:getName(), guild1_kills, guild2_kills, killerGuild:getName(), frags_limit), TALKTYPE_CHANNEL_R1, CHANNEL_GUILD) + end + + if guild1_kills >= frags_limit or guild2_kills >= frags_limit then + db.query("UPDATE `guild_wars` SET `status` = 4, `ended` = " .. os.time() .. " WHERE `status` = 1 AND `id` = " .. warId) + Game.broadcastMessage(string.format("%s has just won the war against %s.", killerGuild:getName(), targetGuild:getName())) + end + end end end end diff --git a/data-otservbr-global/scripts/creaturescripts/quests/cults_of_tibia/evaporate.lua b/data-otservbr-global/scripts/creaturescripts/quests/cults_of_tibia/evaporate.lua index bf92fe20f0f..95c4c2e37a6 100644 --- a/data-otservbr-global/scripts/creaturescripts/quests/cults_of_tibia/evaporate.lua +++ b/data-otservbr-global/scripts/creaturescripts/quests/cults_of_tibia/evaporate.lua @@ -37,7 +37,7 @@ function evaporate.onThink(creature) if not creature then return end - creature:say("The liquor spirit evaporates!", TALKTYPE_ORANGE_2) + creature:say("The liquor spirit evaporates!", TALKTYPE_MONSTER_YELL) local var = { type = 1, number = creature:getId() } combat:execute(creature, var) creature:remove(1) diff --git a/data-otservbr-global/scripts/creaturescripts/quests/cults_of_tibia/splash.lua b/data-otservbr-global/scripts/creaturescripts/quests/cults_of_tibia/splash.lua index 8630eb3ad92..17af493a144 100644 --- a/data-otservbr-global/scripts/creaturescripts/quests/cults_of_tibia/splash.lua +++ b/data-otservbr-global/scripts/creaturescripts/quests/cults_of_tibia/splash.lua @@ -8,7 +8,7 @@ function splash.onThink(creature) return end Game.createMonster("liquor spirit", monsterPos) - creature:say("SPLASH!", TALKTYPE_ORANGE_2) + creature:say("SPLASH!", TALKTYPE_MONSTER_YELL) creature:addHealth((creature:getMaxHealth()) - (creature:getHealth())) return true end, 100, creature:getId()) diff --git a/data-otservbr-global/scripts/creaturescripts/quests/dangerous_depths/snail_slime_kill.lua b/data-otservbr-global/scripts/creaturescripts/quests/dangerous_depths/snail_slime_kill.lua index 2134758a8e5..488480896a8 100644 --- a/data-otservbr-global/scripts/creaturescripts/quests/dangerous_depths/snail_slime_kill.lua +++ b/data-otservbr-global/scripts/creaturescripts/quests/dangerous_depths/snail_slime_kill.lua @@ -59,7 +59,7 @@ snailSlimeThink:register() local snailSlimeKill = CreatureEvent("SnailSlimeDeath") function snailSlimeKill.onDeath(creature) - creature:say("!!", TALKTYPE_ORANGE_2) + creature:say("!!", TALKTYPE_MONSTER_YELL) local var = { type = 1, number = creature:getId() } combat:execute(creature, var) return true diff --git a/data-otservbr-global/scripts/creaturescripts/quests/dark_trails/think_the_ravager_heal.lua b/data-otservbr-global/scripts/creaturescripts/quests/dark_trails/think_the_ravager_heal.lua index d397df7f6cd..4619973f05b 100644 --- a/data-otservbr-global/scripts/creaturescripts/quests/dark_trails/think_the_ravager_heal.lua +++ b/data-otservbr-global/scripts/creaturescripts/quests/dark_trails/think_the_ravager_heal.lua @@ -9,7 +9,7 @@ function theRavagerHeal.onThink(creature) return true end creature:addHealth(health) - creature:say("The Ravager is healed by the strange floor rune!", TALKTYPE_ORANGE_1) + creature:say("The Ravager is healed by the strange floor rune!", TALKTYPE_MONSTER_SAY) end return true end diff --git a/data-otservbr-global/scripts/creaturescripts/quests/heart_of_destruction/charged_anomaly_death.lua b/data-otservbr-global/scripts/creaturescripts/quests/heart_of_destruction/charged_anomaly_death.lua index b1eba8e4fc7..6d423ff6874 100644 --- a/data-otservbr-global/scripts/creaturescripts/quests/heart_of_destruction/charged_anomaly_death.lua +++ b/data-otservbr-global/scripts/creaturescripts/quests/heart_of_destruction/charged_anomaly_death.lua @@ -22,7 +22,7 @@ function chargedAnomalyDeath.onDeath(creature) return true end - local boss = Game.createMonster(config.bossName, bossPosition, false, true) + local boss = Game.createMonster(config.bossName, config.bossPosition, false, true) if boss then boss:addHealth(-healthRemove) end diff --git a/data-otservbr-global/scripts/creaturescripts/quests/heart_of_destruction/depolarized_death.lua b/data-otservbr-global/scripts/creaturescripts/quests/heart_of_destruction/depolarized_death.lua index 1b18872fedd..5713ea3d54c 100644 --- a/data-otservbr-global/scripts/creaturescripts/quests/heart_of_destruction/depolarized_death.lua +++ b/data-otservbr-global/scripts/creaturescripts/quests/heart_of_destruction/depolarized_death.lua @@ -9,10 +9,11 @@ local function setStorage() if tile then local creatures = tile:getCreatures() if creatures and #creatures > 0 then - for _, c in pairs(creatures) do - if isPlayer(c) then - if c:getStorageValue(14322) < 1 then - c:setStorageValue(14322, 1) -- Access to boss Anomaly + for _, creature in pairs(creatures) do + local player = Player(creature) + if player then + if player:getStorageValue(14322) < 1 then + player:setStorageValue(14322, 1) -- Access to boss Anomaly end end end diff --git a/data-otservbr-global/scripts/creaturescripts/quests/heart_of_destruction/heart_minion_death.lua b/data-otservbr-global/scripts/creaturescripts/quests/heart_of_destruction/heart_minion_death.lua index 6a8782fd431..0c5901d5861 100644 --- a/data-otservbr-global/scripts/creaturescripts/quests/heart_of_destruction/heart_minion_death.lua +++ b/data-otservbr-global/scripts/creaturescripts/quests/heart_of_destruction/heart_minion_death.lua @@ -8,7 +8,7 @@ function heartMinionDeath.onDeath(creature) rageSummon = rageSummon - 1 devourerSummon = devourerSummon - 1 elseif monster == "damage resonance" then - resonanceActive = false + Game.setStorageValue(GlobalStorage.HeartOfDestruction.RuptureResonanceActive, 0) elseif monster == "disruption" or monster == "charged disruption" or monster == "overcharged disruption" then destructionSummon = destructionSummon - 1 devourerSummon = devourerSummon - 1 diff --git a/data-otservbr-global/scripts/creaturescripts/quests/heart_of_destruction/rupture_resonance.lua b/data-otservbr-global/scripts/creaturescripts/quests/heart_of_destruction/rupture_resonance.lua index fbbbfefbf12..135ccd95d29 100644 --- a/data-otservbr-global/scripts/creaturescripts/quests/heart_of_destruction/rupture_resonance.lua +++ b/data-otservbr-global/scripts/creaturescripts/quests/heart_of_destruction/rupture_resonance.lua @@ -4,7 +4,7 @@ local function createSpawnWave(stage) Game.createMonster("Spark of Destruction", Position(32330, 31250, 14), false, true) Game.createMonster("Spark of Destruction", Position(32338, 31250, 14), false, true) Game.createMonster("Damage Resonance", Position(32332, 31250, 14), false, true) - Game.setStorageValue(GlobalStorage.HeartOfDestruction.RuptureResonanceStage, stage) + Game.setStorageValue(GlobalStorage.HeartOfDestruction.RuptureResonanceStage, stage + 1) Game.setStorageValue(GlobalStorage.HeartOfDestruction.RuptureResonanceActive, 1) end @@ -16,20 +16,20 @@ function ruptureResonance.onThink(creature) end local ruptureResonanceStage = Game.getStorageValue(GlobalStorage.HeartOfDestruction.RuptureResonanceStage) > 0 and Game.getStorageValue(GlobalStorage.HeartOfDestruction.RuptureResonanceStage) or 0 - local resonanceActive = Game.setStorageValue(GlobalStorage.HeartOfDestruction.RuptureResonanceActive) + local resonanceActive = Game.getStorageValue(GlobalStorage.HeartOfDestruction.RuptureResonanceActive) local thresholds = { - { limit = 80, stage = 0, wave = 1 }, - { limit = 60, stage = 1, wave = 2 }, - { limit = 40, stage = 2, wave = 3 }, - { limit = 25, stage = 3, wave = 4 }, - { limit = 10, stage = 4, wave = -1 }, + { limit = 80, stage = 0 }, + { limit = 60, stage = 1 }, + { limit = 40, stage = 2 }, + { limit = 25, stage = 3 }, + { limit = 10, stage = 4 }, } local hpPercent = (creature:getHealth() / creature:getMaxHealth()) * 100 for _, threshold in ipairs(thresholds) do if hpPercent <= threshold.limit and ruptureResonanceStage == threshold.stage and resonanceActive ~= 1 then - createSpawnWave(threshold.wave) + createSpawnWave(threshold.stage) break end end diff --git a/data-otservbr-global/scripts/creaturescripts/quests/raging_mage_tower/energized_raging_mage_kill.lua b/data-otservbr-global/scripts/creaturescripts/quests/raging_mage_tower/energized_raging_mage_kill.lua index d04b37bf6ee..e8210faafb0 100644 --- a/data-otservbr-global/scripts/creaturescripts/quests/raging_mage_tower/energized_raging_mage_kill.lua +++ b/data-otservbr-global/scripts/creaturescripts/quests/raging_mage_tower/energized_raging_mage_kill.lua @@ -7,7 +7,7 @@ function deathEvent.onDeath(creature) local monster = Game.createMonster("Raging Mage", creature:getPosition()) monster:setReward(true) - doCreatureSayWithRadius(creature, "GNAAAAAHRRRG!! WHAT? WHAT DID YOU DO TO ME!! I... I feel the energies crawling away... from me... DIE!!!", TALKTYPE_ORANGE_1, 35, 71) + doCreatureSayWithRadius(creature, "GNAAAAAHRRRG!! WHAT? WHAT DID YOU DO TO ME!! I... I feel the energies crawling away... from me... DIE!!!", TALKTYPE_MONSTER_SAY, 35, 71) setGlobalStorageValue(673003, 0) return true diff --git a/data-otservbr-global/scripts/creaturescripts/quests/raging_mage_tower/raging_mage_kill.lua b/data-otservbr-global/scripts/creaturescripts/quests/raging_mage_tower/raging_mage_kill.lua index a24f174f5e7..ec9bb848467 100644 --- a/data-otservbr-global/scripts/creaturescripts/quests/raging_mage_tower/raging_mage_kill.lua +++ b/data-otservbr-global/scripts/creaturescripts/quests/raging_mage_tower/raging_mage_kill.lua @@ -2,7 +2,7 @@ local deathEvent = CreatureEvent("RagingMageDeath") function deathEvent.onDeath(creature) broadcastMessage("The remains of the Raging Mage are scattered on the floor of his Tower. The dimensional portal quakes.", MESSAGE_EVENT_ADVANCE) - doCreatureSay(creature, "I WILL RETURN!! My death will just be a door to await my homecoming, my physical hull will be... my... argh...", TALKTYPE_ORANGE_1) + doCreatureSay(creature, "I WILL RETURN!! My death will just be a door to await my homecoming, my physical hull will be... my... argh...", TALKTYPE_MONSTER_SAY) addEvent(function() broadcastMessage("With a great bang the dimensional portal in Zao collapsed and with it the connection to the other dimension shattered.", MESSAGE_EVENT_ADVANCE) diff --git a/data-otservbr-global/scripts/exaltation_forge/exaltation_forge.lua b/data-otservbr-global/scripts/exaltation_forge/exaltation_forge.lua deleted file mode 100644 index fe3e1de952d..00000000000 --- a/data-otservbr-global/scripts/exaltation_forge/exaltation_forge.lua +++ /dev/null @@ -1,9 +0,0 @@ -local forge = Action() - -function forge.onUse(player, item, fromPosition, target, toPosition, isHotkey) - player:openForge() - return true -end - -forge:id(37122, 37128, 37129, 37131, 37132, 37133, 37153, 37157) -forge:register() diff --git a/data-otservbr-global/scripts/globalevents/game_migrations/20231128213358_move_hireling_data_to_kv.lua b/data-otservbr-global/scripts/game_migrations/20231128213358_move_hireling_data_to_kv.lua similarity index 100% rename from data-otservbr-global/scripts/globalevents/game_migrations/20231128213358_move_hireling_data_to_kv.lua rename to data-otservbr-global/scripts/game_migrations/20231128213358_move_hireling_data_to_kv.lua diff --git a/data-otservbr-global/scripts/game_migrations/20241708000535_move_achievement_to_kv.lua b/data-otservbr-global/scripts/game_migrations/20241708000535_move_achievement_to_kv.lua new file mode 100644 index 00000000000..5adbefbf9a8 --- /dev/null +++ b/data-otservbr-global/scripts/game_migrations/20241708000535_move_achievement_to_kv.lua @@ -0,0 +1,39 @@ +local achievementProgressStorage = 20000 +local achievementStorage = 30000 + +local function migrateAchievementProgress(player) + for id, achievement in pairs(ACHIEVEMENTS) do + local oldStorageKey = achievementProgressStorage + id + local progressNumber = player:getStorageValue(oldStorageKey) + if progressNumber > 0 then + local achievScopeName = tostring(achievement.name .. "-progress") + player:kv():scoped(achievScopeName, progressNumber) + player:setStorageValue(oldStorageKey, -1) + end + local oldAchievement = player:getStorageValue(achievementStorage + id) + if oldAchievement > 0 then + player:addAchievement(achievement.name) + player:setStorageValue(achievementStorage + id, -1) + end + end + local points = 0 + local list = player:getAchievements() + if #list > 0 then + for i = 1, #list do + local a = Game.getAchievementInfoById(list[i]) + if a.points > 0 then + points = points + a.points + end + end + end + + player:addAchievementPoints(points) +end + +local migration = Migration("20241708000535_move_achievement_to_kv") + +function migration:onExecute() + self:forEachPlayer(migrateAchievementProgress) +end + +migration:register() diff --git a/data-otservbr-global/scripts/game_migrations/20241708362079_move_vip_system_to_kv.lua b/data-otservbr-global/scripts/game_migrations/20241708362079_move_vip_system_to_kv.lua new file mode 100644 index 00000000000..8bce6971cd4 --- /dev/null +++ b/data-otservbr-global/scripts/game_migrations/20241708362079_move_vip_system_to_kv.lua @@ -0,0 +1,17 @@ +local isVipStorage = 150001 + +local function migrateIsVipSystem(player) + local isVipValue = player:getStorageValue(isVipStorage) + if isVipValue > 0 then + player:kv():scoped("account"):set("vip-system", true) + player:setStorageValue(isVipStorage, -1) + end +end + +local migration = Migration("20241708362079_move_vip_system_to_kv") + +function migration:onExecute() + self:forEachPlayer(migrateIsVipSystem) +end + +migration:register() diff --git a/data-otservbr-global/scripts/game_migrations/20241708485868_move_some_storages_to_kv.lua b/data-otservbr-global/scripts/game_migrations/20241708485868_move_some_storages_to_kv.lua new file mode 100644 index 00000000000..382df257de8 --- /dev/null +++ b/data-otservbr-global/scripts/game_migrations/20241708485868_move_some_storages_to_kv.lua @@ -0,0 +1,24 @@ +local oldAutolootStorage = 30063 +local flasksStorage = "talkaction.potions.flask" + +local function migrate(player) + local isAutoLoot = player:getStorageValue(oldAutolootStorage) + if isAutoLoot > 0 then + player:setFeature(Features.AutoLoot, 1) + player:setStorageValue(oldAutolootStorage, -1) + end + + local getOldFlasksStorage = player:getStorageValueByName(flasksStorage) + if getOldFlasksStorage > 0 then + player:kv():set("talkaction.potions.flask", true) + player:setStorageValueByName(flasksStorage, -1) + end +end + +local migration = Migration("20241708485868_move_some_storages_to_kv") + +function migration:onExecute() + self:forEachPlayer(migrate) +end + +migration:register() diff --git a/data-otservbr-global/scripts/globalevents/cobra_flask.lua b/data-otservbr-global/scripts/globalevents/cobra_flask.lua deleted file mode 100644 index b4121ae0b6d..00000000000 --- a/data-otservbr-global/scripts/globalevents/cobra_flask.lua +++ /dev/null @@ -1,14 +0,0 @@ -local position = Position(33395, 32666, 5) - -local cobraEmptyFlask = GlobalEvent("Cobraflask") - -function cobraEmptyFlask.onThink(interval) - local flask = Tile(position):getItemById(31297) - if not flask then - Game.createItem(31297, 1, position) - end - return true -end - -cobraEmptyFlask:interval(1000 * 60 * 60 * 8) -- 8 hours -cobraEmptyFlask:register() diff --git a/data-otservbr-global/scripts/globalevents/customs/rain.lua b/data-otservbr-global/scripts/globalevents/customs/rain.lua deleted file mode 100644 index f2520d880ee..00000000000 --- a/data-otservbr-global/scripts/globalevents/customs/rain.lua +++ /dev/null @@ -1,50 +0,0 @@ -if configManager.getBoolean(configKeys.WEATHER_RAIN) then - local weatherStartup = GlobalEvent("WeatherStartup") - - function weatherStartup.onStartup() - local rain = math.random(100) - if rain > 95 then - Game.setStorageValue("Weather", 1) - else - Game.setStorageValue("Weather", 0) - end - return true - end - - weatherStartup:register() - - local weather = GlobalEvent("Weather") - - function weather.onThink(interval, lastExecution) - local rain = math.random(100) - if rain > 95 then - Game.setStorageValue("Weather", 1) - else - Game.setStorageValue("Weather", 0) - end - return true - end - - weather:interval(200000) -- how often to randomize rain / weather - weather:register() - - local weatherRain = GlobalEvent("WeatherRain") - - function weatherRain.onThink(interval, lastExecution) - if Game.getStorageValue("Weather") == 1 then - local players = Game.getPlayers() - if #players == 0 then - return true - end - local player - for i = 1, #players do - player = players[i] - player:sendWeatherEffect(weatherConfig.groundEffect, weatherConfig.fallEffect, weatherConfig.thunderEffect) - end - end - return true - end - - weatherRain:interval(50) -- less rain = greater value - weatherRain:register() -end diff --git a/data-otservbr-global/scripts/globalevents/others/global_server_save.lua b/data-otservbr-global/scripts/globalevents/others/global_server_save.lua deleted file mode 100644 index 84303a356da..00000000000 --- a/data-otservbr-global/scripts/globalevents/others/global_server_save.lua +++ /dev/null @@ -1,47 +0,0 @@ -local function ServerSave() - if configManager.getBoolean(configKeys.GLOBAL_SERVER_SAVE_CLEAN_MAP) then - cleanMap() - end - if configManager.getBoolean(configKeys.GLOBAL_SERVER_SAVE_CLOSE) then - Game.setGameState(GAME_STATE_CLOSED, true) - end - if configManager.getBoolean(configKeys.GLOBAL_SERVER_SAVE_SHUTDOWN) then - Game.setGameState(GAME_STATE_SHUTDOWN, true) - end - -- Updating daily reward next server save. - UpdateDailyRewardGlobalStorage(DailyReward.storages.lastServerSave, os.time()) -end - -local function ServerSaveWarning(time) - -- minus one minutes - local remainingTime = tonumber(time) - 60000 - if configManager.getBoolean(configKeys.GLOBAL_SERVER_SAVE_NOTIFY_MESSAGE) then - local message = "Server is saving game in " .. (remainingTime / 60000) .. " minute(s). Please logout." - Webhook.sendMessage(":floppy_disk: " .. message, announcementChannels["serverAnnouncements"]) - Game.broadcastMessage(message, MESSAGE_GAME_HIGHLIGHT) - end - -- if greater than one minute, schedule another warning - -- else the next event will be the server save - if remainingTime > 60000 then - addEvent(ServerSaveWarning, 60000, remainingTime) - else - addEvent(ServerSave, 60000) - end -end - --- Function that is called by the global events when it reaches the time configured --- interval is the time between the event start and the the effective save, it will send an notify message every minute -local serverSaveEvent = GlobalEvent("serversave") -function serverSaveEvent.onTime(interval) - local remainingTime = configManager.getNumber(configKeys.GLOBAL_SERVER_SAVE_NOTIFY_DURATION) * 60000 - if configManager.getBoolean(configKeys.GLOBAL_SERVER_SAVE_NOTIFY_MESSAGE) then - local message = "Server is saving game in " .. (remainingTime / 60000) .. " minute(s). Please logout." - Webhook.sendMessage(":floppy_disk: " .. message, announcementChannels["serverAnnouncements"]) - Game.broadcastMessage(message, MESSAGE_GAME_HIGHLIGHT) - end - addEvent(ServerSaveWarning, 60000, remainingTime) -- Schedule next event in 1 minute(60000) - return not configManager.getBoolean(configKeys.GLOBAL_SERVER_SAVE_SHUTDOWN) -end - -serverSaveEvent:time(configManager.getString(configKeys.GLOBAL_SERVER_SAVE_TIME)) -serverSaveEvent:register() diff --git a/data-otservbr-global/scripts/globalevents/others/guild_war.lua b/data-otservbr-global/scripts/globalevents/others/guild_war.lua index f34828b1fa7..41238755494 100644 --- a/data-otservbr-global/scripts/globalevents/others/guild_war.lua +++ b/data-otservbr-global/scripts/globalevents/others/guild_war.lua @@ -1,9 +1,10 @@ local guildWar = GlobalEvent("guildwar") + function guildWar.onThink(interval) local time = os.time() - db.query("UPDATE `guild_wars` SET `status` = 4, `ended` = " .. time .. " WHERE `status` = 1 AND (`started` + 5 * 60 * 60) < " .. time) + db.query("UPDATE `guild_wars` SET `status` = 4, `ended` = " .. time .. " WHERE `status` = 1 AND `ended` != 0 AND `ended` < " .. time) return true end -guildWar:interval(100000) +guildWar:interval(60000) guildWar:register() diff --git a/data-otservbr-global/scripts/globalevents/others/online_record.lua b/data-otservbr-global/scripts/globalevents/others/online_record.lua deleted file mode 100644 index 9d7bb82e284..00000000000 --- a/data-otservbr-global/scripts/globalevents/others/online_record.lua +++ /dev/null @@ -1,7 +0,0 @@ -local playerrecord = GlobalEvent("playerrecord") -function playerrecord.onRecord(current, old) - addEvent(Game.broadcastMessage, 150, "New record: " .. current .. " players online.", MESSAGE_EVENT_ADVANCE) - return true -end - -playerrecord:register() diff --git a/data-otservbr-global/scripts/globalevents/others/raids_schedule.lua b/data-otservbr-global/scripts/globalevents/others/raids_schedule.lua new file mode 100644 index 00000000000..be6070d857a --- /dev/null +++ b/data-otservbr-global/scripts/globalevents/others/raids_schedule.lua @@ -0,0 +1,53 @@ +local raidSchedule = { + ["Tuesday"] = { + ["16:00"] = { raidName = "Midnight Panther" }, + }, + ["Wednesday"] = { + ["12:00"] = { raidName = "Draptor" }, + }, + ["Thursday"] = { + ["19:00"] = { raidName = "Undead Cavebear" }, + }, + ["Friday"] = { + ["06:00"] = { raidName = "Titanica" }, + }, + ["Saturday"] = { + ["20:00"] = { raidName = "Draptor" }, + }, + ["Sunday"] = { + ["15:00"] = { raidName = "Midnight Panther" }, + ["13:00"] = { raidName = "Orc Backpack" }, + }, + ["31/10"] = { + ["16:00"] = { raidName = "Halloween Hare" }, + }, +} + +local spawnRaidsEvent = GlobalEvent("SpawnRaidsEvent") + +function spawnRaidsEvent.onThink(interval, lastExecution, thinkInterval) + local currentDayOfWeek, currentDate = os.date("%A"), getRealDate() + local raidsToSpawn = {} + + if raidSchedule[currentDayOfWeek] then + raidsToSpawn[#raidsToSpawn + 1] = raidSchedule[currentDayOfWeek] + end + + if raidSchedule[currentDate] then + raidsToSpawn[#raidsToSpawn + 1] = raidSchedule[currentDate] + end + + if #raidsToSpawn > 0 then + for i = 1, #raidsToSpawn do + local currentRaidSchedule = raidsToSpawn[i][getRealTime()] + if currentRaidSchedule and not currentRaidSchedule.alreadyExecuted then + Game.startRaid(currentRaidSchedule.raidName) + currentRaidSchedule.alreadyExecuted = true + end + end + end + return true +end + +spawnRaidsEvent:interval(60000) +spawnRaidsEvent:register() diff --git a/data-otservbr-global/scripts/globalevents/others/spawns_npc_by_time.lua b/data-otservbr-global/scripts/globalevents/others/spawns_npc_by_time.lua deleted file mode 100644 index 060c4277be0..00000000000 --- a/data-otservbr-global/scripts/globalevents/others/spawns_npc_by_time.lua +++ /dev/null @@ -1,69 +0,0 @@ --- enum LightState_t --- LIGHT_STATE_DAY, --- LIGHT_STATE_NIGHT, --- LIGHT_STATE_SUNSET, --- LIGHT_STATE_SUNRISE, -local periods = { - [LIGHT_STATE_NIGHT] = "Night", - [LIGHT_STATE_DAY] = "Day", - [LIGHT_STATE_SUNRISE] = "Sunrise", - [LIGHT_STATE_SUNSET] = "Sunset", -} - -local spawns = { - -- spawnByType day / night - [1] = { -- spawn in night - name = "Ghostly Wolf", - spawn = LIGHT_STATE_SUNSET, - despawn = LIGHT_STATE_SUNRISE, - position = { x = 33332, y = 32052, z = 7 }, - }, - [2] = { -- spawn in night - name = "Talila", - spawn = LIGHT_STATE_SUNSET, - despawn = LIGHT_STATE_SUNRISE, - position = { x = 33504, y = 32222, z = 7 }, - }, - [3] = { -- spawn in day - name = "Valindara", - spawn = LIGHT_STATE_SUNRISE, - despawn = LIGHT_STATE_SUNSET, - position = { x = 33504, y = 32222, z = 7 }, - }, -} - -local spawnsByTime = GlobalEvent("spawnsByTime") -function spawnsByTime.onPeriodChange(period, light) - local time = getWorldTime() - - if configManager.getBoolean(configKeys.ALL_CONSOLE_LOG) then - logger.info("Starting {} Current light is {} and it's {} Tibian Time", periods[period], light, getFormattedWorldTime(time)) - end - for index, value in pairs(spawns) do - if value.spawn == period then - -- Adding - local spawn = Game.createNpc(value.name, value.position) - if spawn then - if configManager.getBoolean(configKeys.ALL_CONSOLE_LOG) then - logger.info("NPC {} added", value.name) - end - spawn:setMasterPos(value.position) - spawn:getPosition():sendMagicEffect(CONST_ME_TELEPORT) - end - elseif value.despawn == period then - -- Removing - local target = Npc(value.name) - if target then - if configManager.getBoolean(configKeys.ALL_CONSOLE_LOG) then - logger.info("NPC {} removed", value.name) - end - target:getPosition():sendMagicEffect(CONST_ME_TELEPORT) - target:remove() - end - end - end - - return true -end - -spawnsByTime:register() diff --git a/data-otservbr-global/scripts/globalevents/quests/secret_library_preceptor_lazare.lua b/data-otservbr-global/scripts/globalevents/quests/secret_library_preceptor_lazare.lua index a279aeeb804..4da496fb659 100644 --- a/data-otservbr-global/scripts/globalevents/quests/secret_library_preceptor_lazare.lua +++ b/data-otservbr-global/scripts/globalevents/quests/secret_library_preceptor_lazare.lua @@ -1,16 +1,14 @@ local config = { monsterName = "Preceptor Lazare", - bossPosition = Position(33373, 31348, 3), - centerPosition = Position(33373, 31348, 3), - rangeX = 50, - rangeY = 50, + bossPosition = Position(33374, 31338, 3), + range = 5, } -local preceptorLazare = GlobalEvent("preceptor lazare") +local preceptorLazare = GlobalEvent("PreceptorLazareRespawn") function preceptorLazare.onThink(interval, lastExecution) - checkBoss(config.centerPosition, config.rangeX, config.rangeY, config.monsterName, config.bossPosition) + checkBoss(config.bossPosition, config.range, config.range, config.monsterName, config.bossPosition) return true end -preceptorLazare:interval(15 * 60 * 1000) +preceptorLazare:interval(15 * 60 * 1000) -- 15 minutes preceptorLazare:register() diff --git a/data-otservbr-global/scripts/globalevents/spawn/grimvale_respawn.lua b/data-otservbr-global/scripts/globalevents/spawn/grimvale_respawn.lua deleted file mode 100644 index aff3f6e3fa0..00000000000 --- a/data-otservbr-global/scripts/globalevents/spawn/grimvale_respawn.lua +++ /dev/null @@ -1,59 +0,0 @@ -local config = { - position = { fromPosition = Position(33330, 31670, 7), toPosition = Position(33350, 31690, 7) }, -} -local spawnDay = 13 -local currentDay = os.date("%d") -local monsters = {} - -function Game.createRandom(position) - local tile = Tile(position) - if not tile or Tile(position):getItemById(486) then - return false - end - - local ground = tile:getGround() - if not ground or ground:hasProperty(CONST_PROP_BLOCKSOLID) or tile:getTopCreature() then - return false - end - local monsterName = monsters[math.random(#monsters)] - local monster = Game.createMonster(monsterName, position) - if monster then - monster:setSpawnPosition() - monster:remove() - end - return true -end - -local grimvaleRespawn = GlobalEvent("grimvale respawn") -function grimvaleRespawn.onStartup() - if spawnDay == tonumber(currentDay) then - table.insert(monsters, "wereboar") - table.insert(monsters, "werebadger") - for x = config.position.fromPosition.x, config.position.toPosition.x do - for y = config.position.fromPosition.y, config.position.toPosition.y do - if math.random(1000) >= 983 then - if Game.createRandom(Position(x, y, 7)) then - return - end - end - end - end - else - table.insert(monsters, "bandit") - table.insert(monsters, "badger") - table.insert(monsters, "blue butterfly") - table.insert(monsters, "yellow butterfly") - for x = config.position.fromPosition.x, config.position.toPosition.x do - for y = config.position.fromPosition.y, config.position.toPosition.y do - if math.random(1000) >= 983 then - if Game.createRandom(Position(x, y, 7)) then - return - end - end - end - end - end - return true -end - -grimvaleRespawn:register() diff --git a/data-otservbr-global/scripts/globalevents/spawn/mawhawk.lua b/data-otservbr-global/scripts/globalevents/spawn/mawhawk.lua deleted file mode 100644 index e34657d211c..00000000000 --- a/data-otservbr-global/scripts/globalevents/spawn/mawhawk.lua +++ /dev/null @@ -1,18 +0,0 @@ -local config = { - monsterName = "Mawhawk", - bossPosition = Position(33703, 32461, 7), - centerPosition = Position(33703, 32461, 7), - rangeX = 50, - rangeY = 50, -} - -local mawhawk = GlobalEvent("mawhawk") -function mawhawk.onThink(interval, lastExecution) - if not checkBoss(config.centerPosition, config.rangeX, config.rangeY, config.monsterName, config.bossPosition) then - addEvent(Game.broadcastMessage, 150, "Beware! Mawhawk!", MESSAGE_EVENT_ADVANCE) - end - return true -end - -mawhawk:interval(10 * 60 * 60 * 1000) -- spawns every 10 hours -mawhawk:register() diff --git a/data-otservbr-global/scripts/globalevents/spawn/raids.lua b/data-otservbr-global/scripts/globalevents/spawn/raids.lua deleted file mode 100644 index 83d065349dd..00000000000 --- a/data-otservbr-global/scripts/globalevents/spawn/raids.lua +++ /dev/null @@ -1,65 +0,0 @@ -local raids = { - --Terça-Feira - ["Tuesday"] = { - ["16:00"] = { raidName = "Midnight Panther" }, - }, - - --Quarta-Feira - ["Wednesday"] = { - ["12:00"] = { raidName = "Draptor" }, - }, - - --Quinta-Feira - ["Thursday"] = { - ["19:00"] = { raidName = "Undead Cavebear" }, - }, - - --Sexta-feira - ["Friday"] = { - ["06:00"] = { raidName = "Titanica" }, - }, - - --Sábado - ["Saturday"] = { - ["20:00"] = { raidName = "Draptor" }, - }, - - --Domingo - ["Sunday"] = { - ["15:00"] = { raidName = "Midnight Panther" }, - ["13:00"] = { raidName = "Orc Backpack" }, - }, - - -- By date (Day/Month) - ["31/10"] = { - ["16:00"] = { raidName = "Halloween Hare" }, - }, -} - -local spawnRaids = GlobalEvent("spawn raids") -function spawnRaids.onThink(interval, lastExecution, thinkInterval) - local day, date = os.date("%A"), getRealDate() - - local raidDays = {} - if raids[day] then - raidDays[#raidDays + 1] = raids[day] - end - if raids[date] then - raidDays[#raidDays + 1] = raids[date] - end - if #raidDays == 0 then - return true - end - - for i = 1, #raidDays do - local settings = raidDays[i][getRealTime()] - if settings and not settings.alreadyExecuted then - Game.startRaid(settings.raidName) - settings.alreadyExecuted = true - end - end - return true -end - -spawnRaids:interval(60000) -spawnRaids:register() diff --git a/data-otservbr-global/scripts/globalevents/spawn/thawing_dragon_lord.lua b/data-otservbr-global/scripts/globalevents/spawn/thawing_dragon_lord.lua deleted file mode 100644 index eecbd29022b..00000000000 --- a/data-otservbr-global/scripts/globalevents/spawn/thawing_dragon_lord.lua +++ /dev/null @@ -1,17 +0,0 @@ -local config = { - monsterName = "Thawing Dragon Lord", - bossPosition = Position(33361, 31316, 5), - centerPosition = Position(33361, 31316, 5), - rangeX = 50, - rangeY = 50, -} - -local thawingDragonLord = GlobalEvent("thawing dragon lord") - -function thawingDragonLord.onThink(interval, lastExecution) - checkBoss(config.centerPosition, config.rangeX, config.rangeY, config.monsterName, config.bossPosition) - return true -end - -thawingDragonLord:interval(900000) -thawingDragonLord:register() diff --git a/data-otservbr-global/scripts/globalevents/spawn/tyrn.lua b/data-otservbr-global/scripts/globalevents/spawn/tyrn.lua deleted file mode 100644 index 47e7756f2ba..00000000000 --- a/data-otservbr-global/scripts/globalevents/spawn/tyrn.lua +++ /dev/null @@ -1,18 +0,0 @@ -local config = { - monsterName = "Tyrn", - bossPosition = Position(33056, 32393, 14), - centerPosition = Position(33056, 32393, 14), - rangeX = 50, - rangeY = 50, -} - -local tyrn = GlobalEvent("tyrn") -function tyrn.onThink(interval, lastExecution) - if not checkBoss(config.centerPosition, config.rangeX, config.rangeY, config.monsterName, config.bossPosition) then - addEvent(Game.broadcastMessage, 150, "Beware of Tyrn!", MESSAGE_EVENT_ADVANCE) - end - return true -end - -tyrn:interval(9 * 60 * 60 * 1000) -- spawns every 9 hours -tyrn:register() diff --git a/data-otservbr-global/scripts/globalevents/vip/online_coins.lua b/data-otservbr-global/scripts/globalevents/vip/online_coins.lua index 6f47948fc69..f249752397d 100644 --- a/data-otservbr-global/scripts/globalevents/vip/online_coins.lua +++ b/data-otservbr-global/scripts/globalevents/vip/online_coins.lua @@ -44,7 +44,7 @@ function onlineCoinsEvent.onThink(interval) if coins >= config.awardOn then local coinsMath = math.floor(coins) player:addTibiaCoins(coinsMath, true) - player:sendTextMessage(MESSAGE_STATUS_SMALL, string.format("Congratulations %s!\z You have received %d %s for being online.", player:getName(), coinsMath, "tibia coins")) + player:sendTextMessage(MESSAGE_FAILURE, string.format("Congratulations %s!\z You have received %d %s for being online.", player:getName(), coinsMath, "tibia coins")) player:setStorageValue(config.storage, (coins - coinsMath) * 10000000) end end diff --git a/data-otservbr-global/scripts/globalevents/vip/online_tokens.lua b/data-otservbr-global/scripts/globalevents/vip/online_tokens.lua index 4cde5ae926d..656039dfe66 100644 --- a/data-otservbr-global/scripts/globalevents/vip/online_tokens.lua +++ b/data-otservbr-global/scripts/globalevents/vip/online_tokens.lua @@ -46,7 +46,7 @@ function onlineTokensEvent.onThink(interval) local tokensMath = math.floor(tokens) local item = player:addItem(config.tokenItemId, tokensMath) if item then - player:sendTextMessage(MESSAGE_STATUS_SMALL, string.format("Congratulations %s!\z You have received %d %s for being online.", player:getName(), tokensMath, "tokens")) + player:sendTextMessage(MESSAGE_FAILURE, string.format("Congratulations %s!\z You have received %d %s for being online.", player:getName(), tokensMath, "tokens")) end player:setStorageValue(config.storage, (tokens - tokensMath) * 10000000) end diff --git a/data-otservbr-global/scripts/globalevents/worldchanges/dream_courts_worldchange.lua b/data-otservbr-global/scripts/globalevents/worldchanges/dream_courts_worldchange.lua deleted file mode 100644 index 090887b9540..00000000000 --- a/data-otservbr-global/scripts/globalevents/worldchanges/dream_courts_worldchange.lua +++ /dev/null @@ -1,21 +0,0 @@ -local config = { - ["Monday"] = "Plagueroot", - ["Tuesday"] = "Malofur_Mangrinder", - ["Wednesday"] = "Maxxenius", - ["Thursday"] = "Alptramun", - ["Friday"] = "Izcandar_the_Banished", - ["Saturday"] = "Maxxenius", - ["Sunday"] = "Alptramun", -} -local spawnByDay = true - -local DreamCourts = GlobalEvent("DreamCourts") -function DreamCourts.onStartup() - if spawnByDay then - logger.info("[WorldChanges] Dream Courts loaded: {}.otbm", config[os.date("%A")]) - Game.loadMap("data-otservbr-global/world/world_changes/dream_courts_bosses/" .. config[os.date("%A")] .. ".otbm") - end - return true -end - -DreamCourts:register() diff --git a/data-otservbr-global/scripts/globalevents/worldchanges/fury_gates.lua b/data-otservbr-global/scripts/globalevents/worldchanges/fury_gates.lua deleted file mode 100644 index a50cc253016..00000000000 --- a/data-otservbr-global/scripts/globalevents/worldchanges/fury_gates.lua +++ /dev/null @@ -1,183 +0,0 @@ -local gates = { - -- Ab'dendriel - [1] = { - city = "Ab'dendriel", - mapName = "abdendriel", - exitPosition = Position(32680, 31720, 7), - }, - -- Ankrahmun - [2] = { - city = "Ankrahmun", - mapName = "ankrahmun", - exitPosition = Position(33269, 32841, 7), - }, - -- Carlin - [3] = { - city = "Carlin", - mapName = "carlin", - exitPosition = Position(32263, 31848, 7), - burntItems = { - { position = Position(32266, 31842, 7), itemId = 6217 }, - { position = Position(32258, 31843, 7), itemId = 6218 }, - { position = Position(32264, 31843, 7), itemId = 3917 }, - }, - }, - -- Darashia - [4] = { - city = "Darashia", - mapName = "darashia", - exitPosition = Position(33304, 32371, 7), - burntItems = { - { position = Position(33300, 32366, 7), itemId = 6217 }, - }, - }, - -- Edron - [5] = { - city = "Edron", - mapName = "edron", - exitPosition = Position(33221, 31923, 7), - }, - -- Kazordoon - [6] = { - city = "Kazordoon", - mapName = "kazordoon", - exitPosition = Position(32575, 31981, 7), - burntItems = { - { position = Position(32571, 31976, 7), itemId = 6218 }, - { position = Position(32573, 31977, 7), itemId = 6218 }, - { position = Position(32569, 31984, 7), itemId = 6217 }, - { position = Position(32572, 31984, 7), itemId = 6217 }, - { position = Position(32572, 31985, 7), itemId = 6218 }, - }, - }, - -- Liberty Bay - [7] = { - city = "Liberty Bay", - mapName = "libertybay", - exitPosition = Position(32348, 32693, 7), - }, - -- Port Hope - [8] = { - city = "Port Hope", - mapName = "porthope", - exitPosition = Position(32530, 32712, 7), - burntItems = { - { position = Position(32532, 32719, 7), itemId = 3696 }, - }, - }, - -- Thais - [9] = { - city = "Thais", - mapName = "thais", - exitPosition = Position(32265, 32164, 7), - burntItems = { - { position = Position(32269, 32157, 7), itemId = 6218 }, - { position = Position(32274, 32165, 7), itemId = 6218 }, - }, - }, - -- Venore - [10] = { - city = "Venore", - mapName = "venore", - exitPosition = Position(32834, 32082, 7), - burntItems = { - { position = Position(32836, 32079, 7), itemId = 6217 }, - { position = Position(32835, 32080, 7), itemId = 3693 }, - { position = Position(32837, 32080, 7), itemId = 6218 }, - { position = Position(32828, 32081, 7), itemId = 6217 }, - { position = Position(32836, 32081, 7), itemId = 3686 }, - { position = Position(32837, 32081, 7), itemId = 6217 }, - { position = Position(32827, 32082, 7), itemId = 6218 }, - { position = Position(32836, 32082, 7), itemId = 6218 }, - { position = Position(32834, 32084, 7), itemId = 3693 }, - { position = Position(32830, 32086, 7), itemId = 3694 }, - { position = Position(32836, 32086, 7), itemId = 3683 }, - { position = Position(32836, 32087, 7), itemId = 3686 }, - { position = Position(32838, 32087, 7), itemId = 3696 }, - { position = Position(32835, 32089, 7), itemId = 6217 }, - { position = Position(32836, 32091, 7), itemId = 3689 }, - }, - }, -} - -local function Furywebhook(message) -- New local function that runs on delay to send webhook message. - Webhook.sendMessage(":fire: " .. message, announcementChannels["serverAnnouncements"]) -end - --- FURY GATES MAP LOAD - -local furygates = GlobalEvent("furygates") - -function furygates.onStartup(interval) - local gateId = math.random(1, 10) - - -- Remove burnt items - if gates[gateId].burntItems then - local item - for i = 1, #gates[gateId].burntItems do - local tile = Tile(gates[gateId].burntItems[i].position) - if tile then - item = tile:getItemById(gates[gateId].burntItems[i].itemId) - end - if item then - item:remove() - end - end - end - - Game.loadMap(DATA_DIRECTORY .. "/world/world_changes/fury_gates/" .. gates[gateId].mapName .. ".otbm") - - setGlobalStorageValue(GlobalStorage.FuryGates, gateId) - - logger.info("Fury Gate will be active in {} today", gates[gateId].city) - local message = (string.format("Fury Gate will be active in %s today", gates[gateId].city)) -- Declaring the message to send to webhook. - addEvent(Furywebhook, 60000, message) -- Event with 1 minute delay to send webhook message after server starts. - - return true -end - -furygates:register() - --- FURY GATE TELEPORTS -local teleport = MoveEvent() - -function teleport.onStepIn(creature, item, position, fromPosition) - local player = creature:getPlayer() - if not player then - return true - end - - local gateId = Game.getStorageValue(GlobalStorage.FuryGates) - - if not gates[gateId] then - return true - end - - position:sendMagicEffect(CONST_ME_TELEPORT) - - -- Enter gates - if item.actionid == 9710 then - -- Check requirements - if not player:isPremium() or not player:isPromoted() or player:getLevel() < 60 then - player:say("Only Premium promoted players of level 60 or higher are able to enter this portal.", TALKTYPE_MONSTER_SAY, false, player, fromPosition) - player:teleportTo(fromPosition) - fromPosition:sendMagicEffect(CONST_ME_TELEPORT) - return true - end - - local destination = Position(33290, 31786, 13) - player:teleportTo(destination) - destination:sendMagicEffect(CONST_ME_TELEPORT) - -- Exit gate - elseif item.actionid == 9715 then - player:teleportTo(gates[gateId].exitPosition) - gates[gateId].exitPosition:sendMagicEffect(CONST_ME_TELEPORT) - end - - return true -end - -teleport:type("stepin") -teleport:aid(9710, 9715) - -teleport:register() diff --git a/data-otservbr-global/scripts/globalevents/worldchanges/nightmare_isle.lua b/data-otservbr-global/scripts/globalevents/worldchanges/nightmare_isle.lua deleted file mode 100644 index fb0d3b6f672..00000000000 --- a/data-otservbr-global/scripts/globalevents/worldchanges/nightmare_isle.lua +++ /dev/null @@ -1,36 +0,0 @@ -local config = { - -- ankrahmun - north - [1] = { - mapName = "ankrahmun-north", - displayName = "north of Ankrahmun", - }, - -- darashia - west - [2] = { - mapName = "darashia-west", - displayName = "west of Darashia", - }, - -- darashia - north - [3] = { - mapName = "darashia-north", - displayName = "north of Darashia", - }, -} - -local function Nightmarewebhook(message) -- New local function that runs on delay to send webhook message. - Webhook.sendMessage(":thought_balloon: " .. message, announcementChannels["serverAnnouncements"]) -end - -local NightmareIsle = GlobalEvent("NightmareIsle") -function NightmareIsle.onStartup(interval) - local select = config[math.random(#config)] - Game.loadMap(DATA_DIRECTORY .. "/world/world_changes/nightmare_isle/" .. select.mapName .. ".otbm") - logger.info("[WorldChanges] Nightmare Isle will be active {} today", select.displayName) - local message = string.format("Nightmare Isle will be active %s today", select.displayName) -- Declaring the message to send to webhook. - addEvent(Nightmarewebhook, 60000, message) -- Event with 1 minute delay to send webhook message after server starts. - - setGlobalStorageValue(GlobalStorage.NightmareIsle, 1) - - return true -end - -NightmareIsle:register() diff --git a/data-otservbr-global/scripts/globalevents/worldchanges/their_masters_voice.lua b/data-otservbr-global/scripts/globalevents/worldchanges/their_masters_voice.lua deleted file mode 100644 index 2061c254cf9..00000000000 --- a/data-otservbr-global/scripts/globalevents/worldchanges/their_masters_voice.lua +++ /dev/null @@ -1,31 +0,0 @@ -local theirmastersvoice = GlobalEvent("theirmastersvoice") -function theirmastersvoice.onStartup() - local eventEnabled = true - local eventChance = 20 - local function fillFungus(fromPosition, toPosition) - for x = fromPosition.x, toPosition.x do - for y = fromPosition.y, toPosition.y do - local position = Position(x, y, 9) - local tile = Tile(position) - if tile then - local item = tile:getItemById(12065) - if item then - local slimeChance = math.random(100) - if slimeChance <= 30 then - item:transform(math.random(12059, 12063)) - position:sendMagicEffect(CONST_ME_YELLOW_RINGS) - end - end - end - end - end - end - - if eventEnabled then - if math.random(100) <= eventChance then - fillFungus({ x = 33306, y = 31847 }, { x = 33369, y = 31919 }) - end - end -end - -theirmastersvoice:register() diff --git a/data-otservbr-global/scripts/modal_window/#example.lua b/data-otservbr-global/scripts/modal_window/#example.lua deleted file mode 100644 index 7d252a1433e..00000000000 --- a/data-otservbr-global/scripts/modal_window/#example.lua +++ /dev/null @@ -1,32 +0,0 @@ -local config = { - { name = "Hunts", position = Position(1054, 1040, 7) }, - { name = "Trainer", position = Position(1116, 1094, 7) }, - { name = "Temple", position = Position(32369, 32241, 7) }, -} - -local modalTeleport = TalkAction("!teleport") - -function modalTeleport.onSay(player, words, param) - local menu = ModalWindow({ - title = "Teleport Modal", - message = "Locations", - }) - - for i, info in pairs(config) do - menu:addChoice(string.format("%s", info.name), function(player, button, choice) - if button.name ~= "Select" then - return - end - - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You were teleported to " .. info.name) - player:teleportTo(info.position) - end) - end - - menu:addButton("Select") - menu:addButton("Close") - menu:sendToPlayer(player) - return false -end - -modalTeleport:register() diff --git a/data-otservbr-global/scripts/movements/equipment/unscripted_equipments.lua b/data-otservbr-global/scripts/movements/equipment/unscripted_equipments.lua deleted file mode 100644 index 83b78dce5bf..00000000000 --- a/data-otservbr-global/scripts/movements/equipment/unscripted_equipments.lua +++ /dev/null @@ -1,20059 +0,0 @@ -local items = { - { - -- sanguine galoshes - itemid = 43887, - type = "equip", - slot = "feet", - level = 500, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- sanguine galoshes - itemid = 43887, - type = "deequip", - slot = "feet", - level = 500, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- grand sanguine rod - itemid = 43886, - type = "equip", - slot = "hand", - level = 600, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- grand sanguine rod - itemid = 43886, - type = "deequip", - slot = "hand", - level = 600, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- sanguine rod - itemid = 43885, - type = "equip", - slot = "hand", - level = 600, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- sanguine rod - itemid = 43885, - type = "deequip", - slot = "hand", - level = 600, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- sanguine boots - itemid = 43884, - type = "equip", - slot = "feet", - level = 500, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- sanguine boots - itemid = 43884, - type = "deequip", - slot = "feet", - level = 500, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- grand sanguine coil - itemid = 43883, - type = "equip", - slot = "hand", - level = 600, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- grand sanguine coil - itemid = 43883, - type = "deequip", - slot = "hand", - level = 600, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- sanguine coil - itemid = 43882, - type = "equip", - slot = "hand", - level = 600, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- sanguine coil - itemid = 43882, - type = "deequip", - slot = "hand", - level = 600, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- sanguine Greaves - itemid = 43881, - type = "equip", - slot = "legs", - level = 500, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- sanguine Greaves - itemid = 43881, - type = "deequip", - slot = "legs", - level = 500, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- grand sanguine crossbow - itemid = 43880, - type = "equip", - slot = "hand", - level = 600, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- grand sanguine crossbow - itemid = 43880, - type = "deequip", - slot = "hand", - level = 600, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- sanguine crossbow - itemid = 43879, - type = "equip", - slot = "hand", - level = 600, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- sanguine crossbow - itemid = 43879, - type = "deequip", - slot = "hand", - level = 600, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- grand sanguine bow - itemid = 43878, - type = "equip", - slot = "hand", - level = 600, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- grand sanguine bow - itemid = 43878, - type = "deequip", - slot = "hand", - level = 600, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- sanguine bow - itemid = 43877, - type = "equip", - slot = "hand", - level = 600, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- sanguine bow - itemid = 43877, - type = "deequip", - slot = "hand", - level = 600, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- sanguine legs - itemid = 43876, - type = "equip", - slot = "legs", - level = 500, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sanguine legs - itemid = 43876, - type = "deequip", - slot = "legs", - level = 500, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- grand sanguine battleaxe - itemid = 43875, - type = "equip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- grand sanguine battleaxe - itemid = 43875, - type = "deequip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sanguine battleaxe - itemid = 43874, - type = "equip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sanguine battleaxe - itemid = 43874, - type = "deequip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- grand sanguine bludgeon - itemid = 43873, - type = "equip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- grand sanguine bludgeon - itemid = 43873, - type = "deequip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sanguine bludgeon - itemid = 43872, - type = "equip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sanguine bludgeon - itemid = 43872, - type = "deequip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- grand sanguine razor - itemid = 43871, - type = "equip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- grand sanguine razor - itemid = 43871, - type = "deequip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sanguine razor - itemid = 43870, - type = "equip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sanguine razor - itemid = 43870, - type = "deequip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- grand sanguine hatchet - itemid = 43869, - type = "equip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- grand sanguine hatchet - itemid = 43869, - type = "deequip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sanguine hatchet - itemid = 43868, - type = "equip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sanguine hatchet - itemid = 43868, - type = "deequip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- grand sanguine cudgel - itemid = 43867, - type = "equip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- grand sanguine cudgel - itemid = 43867, - type = "deequip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sanguine cudgel - itemid = 43866, - type = "equip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sanguine cudgel - itemid = 43866, - type = "deequip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- grand sanguine blade - itemid = 43865, - type = "equip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- grand sanguine blade - itemid = 43865, - type = "deequip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sanguine blade - itemid = 43864, - type = "equip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sanguine blade - itemid = 43864, - type = "deequip", - slot = "hand", - level = 600, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- mutant bone kilt - itemid = 40595, - type = "equip", - slot = "legs", - level = 300, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- mutant bone kilt - itemid = 40595, - type = "deequip", - slot = "legs", - level = 300, - }, - { - -- alchemist's notepad - itemid = 40594, - type = "equip", - slot = "shield", - level = 250, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- alchemist's notepad - itemid = 40594, - type = "deequip", - slot = "shield", - level = 250, - }, - { - -- mutant bone boots - itemid = 40593, - type = "equip", - slot = "feet", - level = 250, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- mutant bone boots - itemid = 40593, - type = "deequip", - slot = "feet", - level = 250, - }, - { - -- alchemist's boots - itemid = 40592, - type = "equip", - slot = "feet", - level = 250, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- alchemist's boots - itemid = 40592, - type = "deequip", - slot = "feet", - level = 250, - }, - { - -- mutated skin armor - itemid = 40591, - type = "equip", - slot = "armor", - level = 270, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- mutated skin armor - itemid = 40591, - type = "deequip", - slot = "armor", - level = 270, - }, - { - -- Mutated Skin Legs - itemid = 40590, - type = "equip", - slot = "legs", - level = 270, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- Mutated Skin Legs - itemid = 40590, - type = "deequip", - slot = "legs", - level = 270, - }, - { - -- Stitched Mutant Hide Legs - itemid = 40589, - type = "equip", - slot = "legs", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- Stitched Mutant Hide Legs - itemid = 40589, - type = "deequip", - slot = "legs", - level = 270, - }, - { - -- Antler-Horn Helmet - itemid = 40588, - type = "equip", - slot = "head", - level = 250, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- Antler-Horn Helmet - itemid = 40588, - type = "deequip", - slot = "head", - level = 250, - }, - { - -- broken iks cuirass - itemid = 40533, - type = "equip", - slot = "armor", - }, - { - -- broken iks cuirass - itemid = 40533, - type = "deequip", - slot = "armor", - }, - { - -- broken iks faulds - itemid = 40531, - type = "equip", - slot = "legs", - }, - { - -- broken iks faulds - itemid = 40531, - type = "deequip", - slot = "legs", - }, - { - -- broken iks sandals - itemid = 40534, - type = "equip", - slot = "feet", - }, - { - -- broken iks sandals - itemid = 40534, - type = "deequip", - slot = "feet", - }, - { - -- broken macuahuitl - itemid = 40530, - type = "equip", - slot = "hand", - }, - { - -- broken macuahuitl - itemid = 40530, - type = "deequip", - slot = "hand", - }, - { - -- 25 years backpack - itemid = 39693, - type = "equip", - slot = "backpack", - }, - { - -- 25 years backpack - itemid = 39693, - type = "deequip", - slot = "backpack", - }, - { - -- turtle amulet - itemid = 39235, - type = "equip", - slot = "necklace", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- turtle amulet - itemid = 39235, - type = "deequip", - slot = "necklace", - }, - { - -- enchanted turtle amulet - itemid = 39234, - type = "equip", - slot = "necklace", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- enchanted turtle amulet - itemid = 39234, - type = "deequip", - slot = "necklace", - }, - { - -- enchanted turtle amulet - itemid = 39233, - type = "equip", - slot = "necklace", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- enchanted turtle amulet - itemid = 39233, - type = "deequip", - slot = "necklace", - }, - { - -- arboreal ring - itemid = 39188, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- arboreal ring - itemid = 39188, - type = "deequip", - slot = "ring", - }, - { - -- charged arboreal ring - itemid = 39187, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- charged arboreal ring - itemid = 39187, - type = "deequip", - slot = "ring", - }, - { - -- charged arboreal ring - itemid = 39186, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- charged arboreal ring - itemid = 39186, - type = "deequip", - slot = "ring", - }, - { - -- arcanomancer sigil - itemid = 39185, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- arcanomancer sigil - itemid = 39185, - type = "deequip", - slot = "ring", - }, - { - -- charged arcanomancer sigil - itemid = 39184, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- charged arcanomancer sigil - itemid = 39184, - type = "deequip", - slot = "ring", - }, - { - -- charged arcanomancer sigil - itemid = 39183, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- charged arcanomancer sigil - itemid = 39183, - type = "deequip", - slot = "ring", - }, - { - -- alicorn ring - itemid = 39182, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- alicorn ring - itemid = 39182, - type = "deequip", - slot = "ring", - }, - { - -- charged alicorn ring - itemid = 39181, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- charged alicorn ring - itemid = 39181, - type = "deequip", - slot = "ring", - }, - { - -- charged alicorn ring - itemid = 39180, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- charged alicorn ring - itemid = 39180, - type = "deequip", - slot = "ring", - }, - { - -- spiritthorn ring - itemid = 39179, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- spiritthorn ring - itemid = 39179, - type = "deequip", - slot = "ring", - }, - { - -- charged spiritthorn ring - itemid = 39178, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- charged spiritthorn ring - itemid = 39178, - type = "deequip", - slot = "ring", - }, - { - -- charged spiritthorn ring - itemid = 39177, - type = "equip", - slot = "ring", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- charged spiritthorn ring - itemid = 39177, - type = "deequip", - slot = "ring", - }, - { - -- midnight sarong - itemid = 39167, - type = "equip", - slot = "legs", - level = 250, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- midnight sarong - itemid = 39167, - type = "deequip", - slot = "legs", - }, - { - -- dawnfire pantaloons - itemid = 39166, - type = "equip", - slot = "legs", - level = 300, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- dawnfire pantaloons - itemid = 39166, - type = "deequip", - slot = "legs", - }, - { - -- midnight tunic - itemid = 39165, - type = "equip", - slot = "armor", - level = 300, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- midnight tunic - itemid = 39165, - type = "deequip", - slot = "armor", - }, - { - -- dawnfire sherwani - itemid = 39164, - type = "equip", - slot = "armor", - level = 270, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- dawnfire sherwani - itemid = 39164, - type = "deequip", - slot = "armor", - }, - { - -- naga rod - itemid = 39163, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- naga rod - itemid = 39163, - type = "deequip", - slot = "hand", - }, - { - -- naga wand - itemid = 39162, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- naga wand - itemid = 39162, - type = "deequip", - slot = "hand", - }, - { - -- feverbloom boots - itemid = 39161, - type = "equip", - slot = "feet", - level = 270, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- feverbloom boots - itemid = 39161, - type = "deequip", - slot = "feet", - }, - { - -- naga quiver - itemid = 39160, - type = "equip", - slot = "right-hand", - level = 250, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- naga quiver - itemid = 39160, - type = "deequip", - slot = "right-hand", - }, - { - -- naga crossbow - itemid = 39159, - type = "equip", - slot = "hand", - level = 300, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- naga crossbow - itemid = 39159, - type = "deequip", - slot = "hand", - }, - { - -- frostflower boots - itemid = 39158, - type = "equip", - slot = "feet", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- frostflower boots - itemid = 39158, - type = "deequip", - slot = "feet", - }, - { - -- naga club - itemid = 39157, - type = "equip", - slot = "hand", - level = 300, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- naga club - itemid = 39157, - type = "deequip", - slot = "hand", - }, - { - -- naga axe - itemid = 39156, - type = "equip", - slot = "hand", - level = 300, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- naga axe - itemid = 39156, - type = "deequip", - slot = "hand", - }, - { - -- naga sword - itemid = 39155, - type = "equip", - slot = "hand", - level = 300, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- naga sword - itemid = 39155, - type = "deequip", - slot = "hand", - }, - { - -- arboreal tome - itemid = 39154, - type = "equip", - slot = "shield", - level = 400, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- arboreal tome - itemid = 39154, - type = "deequip", - slot = "shield", - }, - { - -- arboreal crown - itemid = 39153, - type = "equip", - slot = "head", - level = 400, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- arboreal crown - itemid = 39153, - type = "deequip", - slot = "head", - }, - { - -- arcanomancer folio - itemid = 39152, - type = "equip", - slot = "shield", - level = 400, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- arcanomancer folio - itemid = 39152, - type = "deequip", - slot = "shield", - }, - { - -- arcanomancer regalia - itemid = 39151, - type = "equip", - slot = "head", - level = 400, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- arcanomancer regalia - itemid = 39151, - type = "deequip", - slot = "head", - }, - { - -- alicorn quiver - itemid = 39150, - type = "equip", - slot = "right-hand", - level = 400, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- alicorn quiver - itemid = 39150, - type = "deequip", - slot = "right-hand", - }, - { - -- alicorn headguard - itemid = 39149, - type = "equip", - slot = "head", - level = 400, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- alicorn headguard - itemid = 39149, - type = "deequip", - slot = "head", - }, - { - -- spiritthorn helmet - itemid = 39148, - type = "equip", - slot = "head", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- spiritthorn helmet - itemid = 39148, - type = "deequip", - slot = "head", - }, - { - -- spiritthorn armor - itemid = 39147, - type = "equip", - slot = "armor", - level = 400, - vocation = { - { "Knight", true, true }, - { "Elite Knight" }, - }, - }, - { - -- spiritthorn armor - itemid = 39147, - type = "deequip", - slot = "armor", - }, - { - -- green demon slippers - itemid = 37610, - type = "equip", - slot = "feet", - }, - { - -- green demon slippers - itemid = 37610, - type = "deequip", - slot = "feet", - }, - { - -- Morshabaal's mask - itemid = 37611, - type = "equip", - slot = "shield", - level = 150, - }, - { - -- Morshabaal's mask - itemid = 37611, - type = "deequip", - slot = "shield", - level = 150, - }, - { - -- green demon helmet - itemid = 37609, - type = "equip", - slot = "head", - }, - { - -- green demon helmet - itemid = 37609, - type = "deequip", - slot = "head", - }, - { - -- green demon armor - itemid = 37608, - type = "equip", - slot = "armor", - }, - { - -- green demon armor - itemid = 37608, - type = "deequip", - slot = "armor", - }, - { - -- green demon legs - itemid = 37607, - type = "equip", - slot = "legs", - }, - { - -- green demon legs - itemid = 37607, - type = "deequip", - slot = "legs", - }, - { - -- changing backpack - itemid = 37536, - type = "equip", - slot = "backpack", - }, - { - -- changing backpack - itemid = 37536, - type = "deequip", - slot = "backpack", - }, - { - -- gilded eldritch rod - itemid = 36675, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- gilded eldritch rod - itemid = 36675, - type = "deequip", - slot = "hand", - level = 250, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- eldritch rod - itemid = 36674, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- eldritch rod - itemid = 36674, - type = "deequip", - slot = "hand", - level = 250, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- eldritch tome - itemid = 36673, - type = "equip", - slot = "shield", - level = 300, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- eldritch tome - itemid = 36673, - type = "deequip", - slot = "shield", - level = 300, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- eldritch folio - itemid = 36672, - type = "equip", - slot = "shield", - level = 300, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- eldritch folio - itemid = 36672, - type = "deequip", - slot = "shield", - level = 300, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- eldritch hood - itemid = 36671, - type = "equip", - slot = "head", - level = 250, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- eldritch hood - itemid = 36671, - type = "deequip", - slot = "head", - level = 250, - vocation = { - { "Druid", true, true }, - { "Elder Druid" }, - }, - }, - { - -- eldritch cowl - itemid = 36670, - type = "equip", - slot = "head", - level = 250, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- eldritch cowl - itemid = 36670, - type = "deequip", - slot = "head", - level = 250, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- gilded eldritch wand - itemid = 36669, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- gilded eldritch wand - itemid = 36669, - type = "deequip", - slot = "hand", - level = 250, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- eldritch wand - itemid = 36668, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- eldritch wand - itemid = 36668, - type = "deequip", - slot = "hand", - level = 250, - vocation = { - { "Sorcerer", true, true }, - { "Master Sorcerer" }, - }, - }, - { - -- eldritch breeches - itemid = 36667, - type = "equip", - slot = "legs", - level = 250, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- eldritch breeches - itemid = 36667, - type = "deequip", - slot = "legs", - level = 250, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- eldritch quiver - itemid = 36666, - type = "equip", - slot = "right-hand", - level = 250, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- eldritch quiver - itemid = 36666, - type = "deequip", - slot = "right-hand", - level = 250, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- gilded eldritch bow - itemid = 36665, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- gilded eldritch bow - itemid = 36665, - type = "deequip", - slot = "hand", - level = 250, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- eldritch bow - itemid = 36664, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- eldritch bow - itemid = 36664, - type = "deequip", - slot = "hand", - level = 250, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- eldritch cuirass - itemid = 36663, - type = "equip", - slot = "armor", - level = 250, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch cuirass - itemid = 36663, - type = "deequip", - slot = "armor", - level = 250, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- gilded eldritch greataxe - itemid = 36662, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- gilded eldritch greataxe - itemid = 36662, - type = "deequip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch greataxe - itemid = 36661, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch greataxe - itemid = 36661, - type = "deequip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- gilded eldritch warmace - itemid = 36660, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- gilded eldritch warmace - itemid = 36660, - type = "deequip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch warmace - itemid = 36659, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch warmace - itemid = 36659, - type = "deequip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- gilded eldritch claymore - itemid = 36658, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- gilded eldritch claymore - itemid = 36658, - type = "deequip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch claymore - itemid = 36657, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch claymore - itemid = 36657, - type = "deequip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch shield - itemid = 36656, - type = "equip", - slot = "shield", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch shield - itemid = 36656, - type = "deequip", - slot = "shield", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- spectral bolt (no decay) - itemid = 35902, - type = "equip", - slot = "ammo", - }, - { - -- spectral bolt (no decay) - itemid = 35902, - type = "deequip", - slot = "ammo", - }, - { - -- red quiver - itemid = 35849, - type = "equip", - slot = "right-hand", - vocation = { - { "None", true }, - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- red quiver - itemid = 35849, - type = "deequip", - slot = "right-hand", - vocation = { - { "None", true }, - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- blue quiver - itemid = 35848, - type = "equip", - slot = "right-hand", - vocation = { - { "None", true }, - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- blue quiver - itemid = 35848, - type = "deequip", - slot = "right-hand", - vocation = { - { "None", true }, - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- quiver - itemid = 35562, - type = "equip", - slot = "right-hand", - vocation = { - { "None", true }, - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- quiver - itemid = 35562, - type = "deequip", - slot = "right-hand", - vocation = { - { "None", true }, - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- jungle quiver - itemid = 35524, - type = "equip", - slot = "right-hand", - level = 150, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- jungle quiver - itemid = 35524, - type = "deequip", - slot = "right-hand", - level = 150, - vocation = { - { "Paladin", true, true }, - { "Royal Paladin" }, - }, - }, - { - -- exotic amulet - itemid = 35523, - type = "equip", - slot = "necklace", - level = 180, - }, - { - -- exotic amulet - itemid = 35523, - type = "deequip", - slot = "necklace", - }, - { - -- jungle wand - itemid = 35522, - type = "equip", - slot = "hand", - level = 150, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- jungle wand - itemid = 35522, - type = "deequip", - slot = "hand", - }, - { - -- jungle rod - itemid = 35521, - type = "equip", - slot = "hand", - level = 150, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- jungle rod - itemid = 35521, - type = "deequip", - slot = "hand", - }, - { - -- make-do boots - itemid = 35520, - type = "equip", - slot = "feet", - level = 150, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- make-do boots - itemid = 35520, - type = "deequip", - slot = "feet", - }, - { - -- makeshift boots - itemid = 35519, - type = "equip", - slot = "feet", - level = 150, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- makeshift boots - itemid = 35519, - type = "deequip", - slot = "feet", - }, - { - -- jungle bow - itemid = 35518, - type = "equip", - slot = "hand", - level = 150, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- jungle bow - itemid = 35518, - type = "deequip", - slot = "hand", - }, - { - -- bast legs - itemid = 35517, - type = "equip", - slot = "legs", - level = 150, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- bast legs - itemid = 35517, - type = "deequip", - slot = "legs", - }, - { - -- exotic legs - itemid = 35516, - type = "equip", - slot = "legs", - level = 130, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- exotic legs - itemid = 35516, - type = "deequip", - slot = "legs", - }, - { - -- throwing axe - itemid = 35515, - type = "equip", - slot = "hand", - level = 150, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- throwing axe - itemid = 35515, - type = "deequip", - slot = "hand", - }, - { - -- jungle flail - itemid = 35514, - type = "equip", - slot = "hand", - level = 150, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- jungle flail - itemid = 35514, - type = "deequip", - slot = "hand", - }, - { - -- lion hammer - itemid = 34254, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- lion hammer - itemid = 34254, - type = "deequip", - slot = "hand", - }, - { - -- lion axe - itemid = 34253, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- lion axe - itemid = 34253, - type = "deequip", - slot = "hand", - }, - { - -- lion amulet - itemid = 34158, - type = "equip", - slot = "necklace", - level = 230, - }, - { - -- lion amulet - itemid = 34158, - type = "deequip", - slot = "necklace", - level = 230, - }, - { - -- lion plate - itemid = 34157, - type = "deequip", - slot = "armor", - level = 270, - }, - { - -- lion plate - itemid = 34157, - type = "equip", - slot = "armor", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- lion spangenhelm - itemid = 34156, - type = "deequip", - slot = "head", - }, - { - -- lion spangenhelm - itemid = 34156, - type = "equip", - slot = "head", - level = 230, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- lion longsword - itemid = 34155, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- lion longsword - itemid = 34155, - type = "deequip", - slot = "hand", - }, - { - -- lion shield - itemid = 34154, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- lion shield - itemid = 34154, - type = "deequip", - slot = "hand", - }, - { - -- lion spellbook - itemid = 34153, - type = "deequip", - slot = "shield", - level = 220, - }, - { - -- lion spellbook - itemid = 34153, - type = "equip", - slot = "shield", - level = 220, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- lion wand - itemid = 34152, - type = "equip", - slot = "hand", - level = 220, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- lion wand - itemid = 34152, - type = "deequip", - slot = "hand", - }, - { - -- lion rod - itemid = 34151, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- lion rod - itemid = 34151, - type = "deequip", - slot = "hand", - }, - { - -- lion longbow - itemid = 34150, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- lion longbow - itemid = 34150, - type = "deequip", - slot = "hand", - }, - { - -- soulbastion shield - itemid = 34099, - type = "deequip", - slot = "shield", - }, - { - -- soulbastion shield - itemid = 34099, - type = "equip", - slot = "shield", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- pair of soulstalkers - itemid = 34098, - type = "deequip", - slot = "feet", - }, - { - -- pair of soulstalkers - itemid = 34098, - type = "equip", - slot = "feet", - level = 400, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- pair of soulwalkers - itemid = 34097, - type = "deequip", - slot = "feet", - }, - { - -- pair of soulwalkers - itemid = 34097, - type = "equip", - slot = "feet", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- soulshroud armor - itemid = 34096, - type = "deequip", - slot = "armor", - }, - { - -- soulshroud armor - itemid = 34096, - type = "equip", - slot = "armor", - level = 400, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- soulmantle - itemid = 34095, - type = "deequip", - slot = "armor", - }, - { - -- soulmantle - itemid = 34095, - type = "equip", - slot = "armor", - level = 400, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- soulshell armor - itemid = 34094, - type = "deequip", - slot = "armor", - level = 400, - }, - { - -- soulshell armor - itemid = 34094, - type = "equip", - slot = "armor", - level = 400, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- soulstrider legs - itemid = 34093, - type = "deequip", - slot = "legs", - level = 400, - }, - { - -- soulstrider legs - itemid = 34093, - type = "equip", - slot = "legs", - level = 400, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- soulshanks legs - itemid = 34092, - type = "deequip", - slot = "legs", - level = 400, - }, - { - -- soulshanks legs - itemid = 34092, - type = "equip", - slot = "legs", - level = 400, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- soulhexer - itemid = 34091, - type = "deequip", - slot = "hand", - }, - { - -- soulhexer - itemid = 34091, - type = "equip", - slot = "hand", - level = 400, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- soultainter - itemid = 34090, - type = "deequip", - slot = "hand", - }, - { - -- soultainter - itemid = 34090, - type = "equip", - slot = "hand", - level = 400, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- soulpiercer - itemid = 34089, - type = "deequip", - slot = "hand", - }, - { - -- soulpiercer - itemid = 34089, - type = "equip", - slot = "hand", - level = 400, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- soulbleeder - itemid = 34088, - type = "deequip", - slot = "hand", - }, - { - -- soulbleeder - itemid = 34088, - type = "equip", - slot = "hand", - level = 400, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- soulmaimer - itemid = 34087, - type = "deequip", - slot = "hand", - }, - { - -- soulmaimer - itemid = 34087, - type = "equip", - slot = "hand", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- soulcrusher - itemid = 34086, - type = "deequip", - slot = "hand", - }, - { - -- soulcrusher - itemid = 34086, - type = "equip", - slot = "hand", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- souleater - itemid = 34085, - type = "deequip", - slot = "hand", - }, - { - -- souleater - itemid = 34085, - type = "equip", - slot = "hand", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- soulbiter - itemid = 34084, - type = "deequip", - slot = "hand", - }, - { - -- soulbiter - itemid = 34084, - type = "equip", - slot = "hand", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- soulshredder - itemid = 34083, - type = "deequip", - slot = "hand", - }, - { - -- soulshredder - itemid = 34083, - type = "equip", - slot = "hand", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- soulcutter - itemid = 34082, - type = "deequip", - slot = "hand", - }, - { - -- soulcutter - itemid = 34082, - type = "equip", - slot = "hand", - level = 400, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- lion ring - itemid = 34080, - type = "deequip", - slot = "ring", - }, - { - -- lion ring - itemid = 34080, - type = "equip", - slot = "ring", - }, - { - -- Lit Torch (Sparkling) - itemid = 34016, - type = "equip", - slot = "ammo", - }, - { - -- Lit Torch (Sparkling) - itemid = 34016, - type = "deequip", - slot = "ammo", - }, - { - -- pair of old bracers - itemid = 32705, - type = "equip", - slot = "armor", - }, - { - -- pair of old bracers - itemid = 32705, - type = "deequip", - slot = "armor", - }, - { - -- ring of souls - itemid = 32636, - type = "equip", - slot = "ring", - level = 200, - }, - { - -- ring of souls - itemid = 32636, - type = "deequip", - slot = "ring", - level = 200, - }, - { - -- enchanted ring of souls - itemid = 32635, - type = "equip", - slot = "ring", - level = 200, - }, - { - -- enchanted ring of souls - itemid = 32635, - type = "deequip", - slot = "ring", - level = 200, - }, - { - -- spooky hood - itemid = 32630, - type = "equip", - slot = "head", - }, - { - -- spooky hood - itemid = 32630, - type = "deequip", - slot = "head", - }, - { - -- ghost chestplate - itemid = 32628, - type = "equip", - slot = "armor", - level = 230, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- ghost chestplate - itemid = 32628, - type = "deequip", - slot = "armor", - level = 230, - }, - { - -- enchanted ring of souls - itemid = 32621, - type = "equip", - slot = "ring", - level = 200, - }, - { - -- enchanted ring of souls - itemid = 32621, - type = "deequip", - slot = "ring", - level = 200, - }, - { - -- ghost backpack - itemid = 32620, - type = "equip", - slot = "backpack", - }, - { - -- ghost backpack - itemid = 32620, - type = "deequip", - slot = "backpack", - }, - { - -- pair of nightmare boots - itemid = 32619, - type = "equip", - slot = "feet", - level = 140, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- pair of nightmare boots - itemid = 32619, - type = "deequip", - slot = "feet", - level = 140, - }, - { - -- soulful legs - itemid = 32618, - type = "equip", - slot = "legs", - level = 180, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- soulful legs - itemid = 32618, - type = "deequip", - slot = "legs", - level = 180, - }, - { - -- fabulous legs - itemid = 32617, - type = "equip", - slot = "legs", - level = 225, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- fabulous legs - itemid = 32617, - type = "deequip", - slot = "legs", - level = 225, - }, - { - -- phantasmal axe - itemid = 32616, - type = "equip", - slot = "hand", - level = 180, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- phantasmal axe - itemid = 32616, - type = "deequip", - slot = "hand", - }, - { - -- burial shroud - itemid = 32585, - type = "equip", - slot = "armor", - }, - { - -- burial shroud - itemid = 32585, - type = "deequip", - slot = "armor", - }, - { - -- Traditional Gamsbart Hat - itemid = 32100, - type = "equip", - slot = "head", - }, - { - -- Traditional Gamsbart Hat - itemid = 32100, - type = "deequip", - slot = "head", - }, - { - -- traditional shirt - itemid = 32099, - type = "equip", - slot = "armor", - }, - { - -- traditional shirt - itemid = 32099, - type = "deequip", - slot = "armor", - }, - { - -- lederhosen - itemid = 32097, - type = "equip", - slot = "legs", - }, - { - -- lederhosen - itemid = 32097, - type = "deequip", - slot = "legs", - }, - { - -- traditional leather shoes - itemid = 32098, - type = "equip", - slot = "feet", - }, - { - -- traditional leather shoes - itemid = 32098, - type = "deequip", - slot = "feet", - }, - { - -- meat hammer - itemid = 32093, - type = "equip", - slot = "hand", - }, - { - -- meat hammer - itemid = 32093, - type = "deequip", - slot = "hand", - }, - { - -- note about two souls - itemid = 31676, - type = "equip", - slot = "necklace", - }, - { - -- note about two souls - itemid = 31676, - type = "deequip", - slot = "necklace", - }, - { - -- the cobra amulet - itemid = 31631, - type = "equip", - slot = "necklace", - level = 250, - }, - { - -- the cobra amulet - itemid = 31631, - type = "deequip", - slot = "necklace", - level = 250, - }, - { - -- winged backpack - itemid = 31625, - type = "equip", - slot = "backpack", - }, - { - -- winged backpack - itemid = 31625, - type = "deequip", - slot = "backpack", - }, - { - -- blister ring - itemid = 31621, - type = "equip", - slot = "ring", - level = 220, - }, - { - -- blister ring - itemid = 31621, - type = "deequip", - slot = "ring", - level = 220, - }, - { - -- winged boots - itemid = 31617, - type = "equip", - slot = "feet", - level = 220, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- winged boots - itemid = 31617, - type = "deequip", - slot = "feet", - level = 220, - }, - { - -- enchanted blister ring - itemid = 31616, - type = "equip", - slot = "ring", - level = 220, - }, - { - -- enchanted blister ring - itemid = 31616, - type = "deequip", - slot = "ring", - level = 220, - }, - { - -- tagralt blade - itemid = 31614, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- tagralt blade - itemid = 31614, - type = "deequip", - slot = "hand", - }, - { - -- toga mortis - itemid = 31583, - type = "equip", - slot = "armor", - level = 220, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- toga mortis - itemid = 31583, - type = "deequip", - slot = "armor", - level = 220, - }, - { - -- galea mortis - itemid = 31582, - type = "equip", - slot = "head", - level = 220, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- galea mortis - itemid = 31582, - type = "deequip", - slot = "head", - level = 220, - }, - { - -- bow of cataclysm - itemid = 31581, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- bow of cataclysm - itemid = 31581, - type = "deequip", - slot = "hand", - }, - { - -- mortal mace - itemid = 31580, - type = "equip", - slot = "hand", - level = 220, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- mortal mace - itemid = 31580, - type = "deequip", - slot = "hand", - }, - { - -- embrace of nature - itemid = 31579, - type = "equip", - slot = "armor", - level = 220, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- embrace of nature - itemid = 31579, - type = "deequip", - slot = "armor", - level = 220, - }, - { - -- bear skin - itemid = 31578, - type = "equip", - slot = "armor", - level = 230, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- bear skin - itemid = 31578, - type = "deequip", - slot = "armor", - level = 230, - }, - { - -- terra helmet - itemid = 31577, - type = "equip", - slot = "head", - level = 230, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- terra helmet - itemid = 31577, - type = "deequip", - slot = "head", - level = 230, - }, - { - -- enchanted blister ring - itemid = 31557, - type = "equip", - slot = "ring", - level = 220, - }, - { - -- enchanted blister ring - itemid = 31557, - type = "deequip", - slot = "ring", - level = 220, - }, - { - -- rainbow amulet - itemid = 31556, - type = "equip", - slot = "necklace", - level = 220, - }, - { - -- rainbow amulet - itemid = 31556, - type = "deequip", - slot = "necklace", - level = 220, - }, - { - -- sphinx tiara - itemid = 31438, - type = "equip", - slot = "head", - }, - { - -- sphinx tiara - itemid = 31438, - type = "deequip", - slot = "head", - }, - { - -- gryphon mask - itemid = 31433, - type = "equip", - slot = "head", - }, - { - -- gryphon mask - itemid = 31433, - type = "deequip", - slot = "head", - }, - { - -- symbol of sun and sea - itemid = 31431, - type = "equip", - slot = "ring", - }, - { - -- symbol of sun and sea - itemid = 31431, - type = "deequip", - slot = "ring", - }, - { - -- silver mask - itemid = 31370, - type = "equip", - slot = "head", - }, - { - -- silver mask - itemid = 31370, - type = "deequip", - slot = "head", - }, - { - -- ring of secret thoughts - itemid = 31306, - type = "equip", - slot = "ring", - }, - { - -- ring of secret thoughts - itemid = 31306, - type = "deequip", - slot = "ring", - }, - { - -- jade amulet - itemid = 31268, - type = "equip", - slot = "necklace", - }, - { - -- jade amulet - itemid = 31268, - type = "deequip", - slot = "necklace", - }, - { - -- ring of secret thoughts - itemid = 31263, - type = "equip", - slot = "ring", - }, - { - -- ring of secret thoughts - itemid = 31263, - type = "deequip", - slot = "ring", - }, - { - -- enchanted theurgic amulet - itemid = 30403, - type = "equip", - slot = "necklace", - level = 220, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- enchanted theurgic amulet - itemid = 30403, - type = "deequip", - slot = "necklace", - level = 220, - }, - { - -- enchanted theurgic amulet - itemid = 30402, - type = "equip", - slot = "necklace", - level = 220, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- enchanted theurgic amulet - itemid = 30402, - type = "deequip", - slot = "necklace", - level = 220, - }, - { - -- amulet of theurgy - itemid = 30401, - type = "equip", - slot = "necklace", - level = 220, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- amulet of theurgy - itemid = 30401, - type = "deequip", - slot = "necklace", - level = 220, - }, - { - -- cobra rod - itemid = 30400, - type = "equip", - slot = "hand", - level = 220, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- cobra rod - itemid = 30400, - type = "deequip", - slot = "hand", - level = 220, - }, - { - -- cobra wand - itemid = 30399, - type = "equip", - slot = "hand", - level = 270, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- cobra wand - itemid = 30399, - type = "deequip", - slot = "hand", - level = 270, - }, - { - -- cobra sword - itemid = 30398, - type = "equip", - slot = "hand", - level = 220, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- cobra sword - itemid = 30398, - type = "deequip", - slot = "hand", - level = 220, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- cobra hood - itemid = 30397, - type = "equip", - slot = "head", - level = 270, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- cobra hood - itemid = 30397, - type = "deequip", - slot = "head", - level = 270, - }, - { - -- cobra axe - itemid = 30396, - type = "equip", - slot = "hand", - level = 220, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- cobra axe - itemid = 30396, - type = "deequip", - slot = "hand", - }, - { - -- cobra club - itemid = 30395, - type = "equip", - slot = "hand", - level = 220, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- cobra club - itemid = 30395, - type = "deequip", - slot = "hand", - }, - { - -- cobra boots - itemid = 30394, - type = "equip", - slot = "feet", - level = 220, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- cobra boots - itemid = 30394, - type = "deequip", - slot = "feet", - level = 220, - }, - { - -- cobra crossbow - itemid = 30393, - type = "equip", - slot = "hand", - level = 220, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- cobra crossbow - itemid = 30393, - type = "deequip", - slot = "hand", - }, - { - -- rainbow necklace - itemid = 30323, - type = "equip", - slot = "necklace", - level = 220, - }, - { - -- rainbow necklace - itemid = 30323, - type = "deequip", - slot = "necklace", - level = 220, - }, - { - -- ice hatchet - itemid = 30283, - type = "equip", - slot = "hand", - }, - { - -- ice hatchet - itemid = 30283, - type = "deequip", - slot = "hand", - }, - { - -- frozen claw - itemid = 30279, - type = "equip", - slot = "ring", - }, - { - -- frozen claw - itemid = 30279, - type = "deequip", - slot = "ring", - }, - { - -- the crown of the percht queen - itemid = 30276, - type = "equip", - slot = "head", - }, - { - -- the crown of the percht queen - itemid = 30276, - type = "deequip", - slot = "head", - }, - { - -- the crown of the percht queen - itemid = 30275, - type = "equip", - slot = "head", - }, - { - -- the crown of the percht queen - itemid = 30275, - type = "deequip", - slot = "head", - }, - { - -- festive backpack - itemid = 30197, - type = "equip", - slot = "backpack", - }, - { - -- festive backpack - itemid = 30197, - type = "deequip", - slot = "backpack", - }, - { - -- yetislippers - itemid = 30196, - type = "equip", - slot = "feet", - }, - { - -- yetislippers - itemid = 30196, - type = "deequip", - slot = "feet", - }, - { - -- enchanted pendulet - itemid = 30345, - type = "equip", - slot = "necklace", - level = 180, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- enchanted pendulet - itemid = 30345, - type = "deequip", - slot = "necklace", - level = 180, - }, - { - -- enchanted pendulet - itemid = 30344, - type = "equip", - slot = "necklace", - level = 180, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- enchanted pendulet - itemid = 30344, - type = "deequip", - slot = "necklace", - level = 180, - }, - { - -- enchanted sleep shawl - itemid = 30343, - type = "equip", - slot = "necklace", - level = 180, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- enchanted sleep shawl - itemid = 30343, - type = "deequip", - slot = "necklace", - level = 180, - }, - { - -- enchanted sleep shawl - itemid = 30342, - type = "equip", - slot = "necklace", - level = 180, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- enchanted sleep shawl - itemid = 30342, - type = "deequip", - slot = "necklace", - level = 180, - }, - { - -- shield of endless search - itemid = 30181, - type = "equip", - slot = "shield", - }, - { - -- shield of endless search - itemid = 30181, - type = "deequip", - slot = "shield", - }, - { - -- spirit guide - itemid = 29431, - type = "equip", - slot = "shield", - level = 180, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spirit guide - itemid = 29431, - type = "deequip", - slot = "shield", - level = 180, - }, - { - -- ectoplasmic shield - itemid = 29430, - type = "equip", - slot = "shield", - level = 180, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- ectoplasmic shield - itemid = 29430, - type = "deequip", - slot = "shield", - level = 180, - }, - { - -- pendulet - itemid = 29429, - type = "equip", - slot = "necklace", - level = 180, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- pendulet - itemid = 29429, - type = "deequip", - slot = "necklace", - level = 180, - }, - { - -- sleep shawl - itemid = 29428, - type = "equip", - slot = "necklace", - level = 180, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- sleep shawl - itemid = 29428, - type = "deequip", - slot = "necklace", - level = 180, - }, - { - -- dark whispers - itemid = 29427, - type = "equip", - slot = "head", - level = 180, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- dark whispers - itemid = 29427, - type = "deequip", - slot = "head", - level = 180, - }, - { - -- brain in a jar - itemid = 29426, - type = "equip", - slot = "shield", - level = 180, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- brain in a jar - itemid = 29426, - type = "deequip", - slot = "shield", - level = 180, - }, - { - -- energized limb - itemid = 29425, - type = "equip", - slot = "hand", - level = 180, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- energized limb - itemid = 29425, - type = "deequip", - slot = "hand", - level = 180, - }, - { - -- pair of dreamwalkers - itemid = 29424, - type = "equip", - slot = "feet", - level = 180, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- pair of dreamwalkers - itemid = 29424, - type = "deequip", - slot = "feet", - level = 180, - }, - { - -- dream shroud - itemid = 29423, - type = "equip", - slot = "armor", - level = 180, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- dream shroud - itemid = 29423, - type = "deequip", - slot = "armor", - level = 180, - }, - { - -- winterblade - itemid = 29422, - type = "equip", - slot = "hand", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- winterblade - itemid = 29422, - type = "deequip", - slot = "hand", - }, - { - -- summerblade - itemid = 29421, - type = "equip", - slot = "hand", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- summerblade - itemid = 29421, - type = "deequip", - slot = "hand", - }, - { - -- shoulder plate - itemid = 29420, - type = "equip", - slot = "shield", - level = 180, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- shoulder plate - itemid = 29420, - type = "deequip", - slot = "shield", - level = 180, - }, - { - -- resizer - itemid = 29419, - type = "equip", - slot = "hand", - level = 230, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- resizer - itemid = 29419, - type = "deequip", - slot = "hand", - }, - { - -- living armor - itemid = 29418, - type = "equip", - slot = "armor", - level = 180, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- living armor - itemid = 29418, - type = "deequip", - slot = "armor", - level = 180, - }, - { - -- living vine bow - itemid = 29417, - type = "equip", - slot = "hand", - level = 220, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- living vine bow - itemid = 29417, - type = "deequip", - slot = "hand", - level = 220, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- golden axe - itemid = 29286, - type = "equip", - slot = "hand", - }, - { - -- golden axe - itemid = 29286, - type = "deequip", - slot = "hand", - }, - { - -- book backpack - itemid = 28571, - type = "equip", - slot = "backpack", - }, - { - -- book backpack - itemid = 28571, - type = "deequip", - slot = "backpack", - }, - { - -- wand of destruction test - itemid = 28479, - type = "equip", - slot = "hand", - }, - { - -- wand of destruction test - itemid = 28479, - type = "deequip", - slot = "hand", - }, - { - -- umbral master bow test - itemid = 28478, - type = "equip", - slot = "hand", - }, - { - -- umbral master bow test - itemid = 28478, - type = "deequip", - slot = "hand", - }, - { - -- ornate testtplate - itemid = 28475, - type = "equip", - slot = "armor", - }, - { - -- ornate testtplate - itemid = 28475, - type = "deequip", - slot = "armor", - }, - { - -- sorcerer test weapon - itemid = 28466, - type = "equip", - slot = "hand", - }, - { - -- sorcerer test weapon - itemid = 28466, - type = "deequip", - slot = "hand", - }, - { - -- bow of destruction test - itemid = 28465, - type = "equip", - slot = "hand", - }, - { - -- bow of destruction test - itemid = 28465, - type = "deequip", - slot = "hand", - }, - { - -- test weapon for knights - itemid = 28464, - type = "equip", - slot = "hand", - }, - { - -- test weapon for knights - itemid = 28464, - type = "deequip", - slot = "hand", - }, - { - -- sulphurous demonbone - itemid = 28832, - type = "equip", - slot = "hand", - level = 80, - }, - { - -- sulphurous demonbone - itemid = 28832, - type = "deequip", - slot = "hand", - }, - { - -- unliving demonbone - itemid = 28831, - type = "equip", - slot = "hand", - level = 80, - }, - { - -- unliving demonbone - itemid = 28831, - type = "deequip", - slot = "hand", - }, - { - -- energized demonbone - itemid = 28830, - type = "equip", - slot = "hand", - level = 80, - }, - { - -- energized demonbone - itemid = 28830, - type = "deequip", - slot = "hand", - }, - { - -- rotten demonbone - itemid = 28829, - type = "equip", - slot = "hand", - level = 80, - }, - { - -- rotten demonbone - itemid = 28829, - type = "deequip", - slot = "hand", - }, - { - -- deepling fork - itemid = 28826, - type = "equip", - slot = "hand", - level = 230, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- deepling fork - itemid = 28826, - type = "deequip", - slot = "hand", - level = 230, - }, - { - -- deepling ceremonial dagger - itemid = 28825, - type = "equip", - slot = "hand", - level = 180, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- deepling ceremonial dagger - itemid = 28825, - type = "deequip", - slot = "hand", - level = 180, - }, - { - -- falcon mace - itemid = 28725, - type = "equip", - slot = "hand", - level = 300, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- falcon mace - itemid = 28725, - type = "deequip", - slot = "hand", - }, - { - -- falcon battleaxe - itemid = 28724, - type = "equip", - slot = "hand", - level = 300, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- falcon battleaxe - itemid = 28724, - type = "deequip", - slot = "hand", - }, - { - -- falcon longsword - itemid = 28723, - type = "equip", - slot = "hand", - level = 300, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- falcon longsword - itemid = 28723, - type = "deequip", - slot = "hand", - }, - { - -- falcon escutcheon - itemid = 28722, - type = "equip", - slot = "shield", - level = 300, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- falcon escutcheon - itemid = 28722, - type = "deequip", - slot = "shield", - level = 300, - }, - { - -- falcon shield - itemid = 28721, - type = "equip", - slot = "shield", - level = 300, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- falcon shield - itemid = 28721, - type = "deequip", - slot = "shield", - level = 300, - }, - { - -- falcon greaves - itemid = 28720, - type = "equip", - slot = "legs", - level = 300, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- falcon greaves - itemid = 28720, - type = "deequip", - slot = "legs", - level = 300, - }, - { - -- falcon plate - itemid = 28719, - type = "equip", - slot = "armor", - level = 300, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- falcon plate - itemid = 28719, - type = "deequip", - slot = "armor", - level = 300, - }, - { - -- falcon bow - itemid = 28718, - type = "equip", - slot = "hand", - level = 300, - vocation = { - { "paladin", true }, - { "royal paladin" }, - }, - }, - { - -- falcon bow - itemid = 28718, - type = "deequip", - slot = "hand", - level = 300, - }, - { - -- falcon wand - itemid = 28717, - type = "equip", - slot = "hand", - level = 300, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- falcon wand - itemid = 28717, - type = "deequip", - slot = "hand", - level = 300, - }, - { - -- falcon rod - itemid = 28716, - type = "equip", - slot = "hand", - level = 300, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- falcon rod - itemid = 28716, - type = "deequip", - slot = "hand", - level = 300, - }, - { - -- falcon coif - itemid = 28715, - type = "equip", - slot = "head", - level = 300, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- falcon coif - itemid = 28715, - type = "deequip", - slot = "head", - level = 300, - }, - { - -- falcon circlet - itemid = 28714, - type = "equip", - slot = "head", - level = 300, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- falcon circlet - itemid = 28714, - type = "deequip", - slot = "head", - level = 300, - }, - { - -- silver chimes - itemid = 12126, - type = "equip", - slot = "shield", - }, - { - -- silver chimes - itemid = 12126, - type = "deequip", - slot = "shield", - }, - { - -- suspicious device - itemid = 27653, - type = "equip", - slot = "necklace", - }, - { - -- suspicious device - itemid = 27653, - type = "deequip", - slot = "necklace", - }, - { - -- gnome sword - itemid = 27651, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- gnome sword - itemid = 27651, - type = "deequip", - slot = "hand", - }, - { - -- gnome shield - itemid = 27650, - type = "equip", - slot = "shield", - level = 200, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Royal Paladin" }, - { "Elite Knight" }, - }, - }, - { - -- gnome shield - itemid = 27650, - type = "deequip", - slot = "shield", - level = 200, - }, - { - -- gnome legs - itemid = 27649, - type = "equip", - slot = "legs", - level = 200, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- gnome legs - itemid = 27649, - type = "deequip", - slot = "legs", - level = 200, - }, - { - -- gnome armor - itemid = 27648, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- gnome armor - itemid = 27648, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- gnome helmet - itemid = 27647, - type = "equip", - slot = "head", - level = 200, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- gnome helmet - itemid = 27647, - type = "deequip", - slot = "head", - level = 200, - }, - { - -- foxtail amulet - itemid = 27565, - type = "equip", - slot = "necklace", - level = 100, - }, - { - -- foxtail amulet - itemid = 27565, - type = "deequip", - slot = "necklace", - level = 100, - }, - { - -- mallet handle - itemid = 27525, - type = "equip", - slot = "hand", - }, - { - -- mallet handle - itemid = 27525, - type = "deequip", - slot = "hand", - }, - { - -- strange mallet - itemid = 27523, - type = "equip", - slot = "hand", - }, - { - -- strange mallet - itemid = 27523, - type = "deequip", - slot = "hand", - }, - { - -- blue spectacles - itemid = 27522, - type = "equip", - slot = "head", - }, - { - -- blue spectacles - itemid = 27522, - type = "deequip", - slot = "head", - }, - { - -- rod of destruction - itemid = 27458, - type = "equip", - slot = "hand", - level = 200, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- rod of destruction - itemid = 27458, - type = "deequip", - slot = "hand", - level = 200, - }, - { - -- wand of destruction - itemid = 27457, - type = "equip", - slot = "hand", - level = 200, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of destruction - itemid = 27457, - type = "deequip", - slot = "hand", - level = 200, - }, - { - -- crossbow of destruction - itemid = 27456, - type = "equip", - slot = "hand", - level = 200, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- crossbow of destruction - itemid = 27456, - type = "deequip", - slot = "hand", - }, - { - -- bow of destruction - itemid = 27455, - type = "equip", - slot = "hand", - level = 200, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- bow of destruction - itemid = 27455, - type = "deequip", - slot = "hand", - }, - { - -- hammer of destruction - itemid = 27454, - type = "equip", - slot = "hand", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- hammer of destruction - itemid = 27454, - type = "deequip", - slot = "hand", - }, - { - -- mace of destruction - itemid = 27453, - type = "equip", - slot = "hand", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- mace of destruction - itemid = 27453, - type = "deequip", - slot = "hand", - }, - { - -- chopper of destruction - itemid = 27452, - type = "equip", - slot = "hand", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- chopper of destruction - itemid = 27452, - type = "deequip", - slot = "hand", - }, - { - -- axe of destruction - itemid = 27451, - type = "equip", - slot = "hand", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- axe of destruction - itemid = 27451, - type = "deequip", - slot = "hand", - }, - { - -- slayer of destruction - itemid = 27450, - type = "equip", - slot = "hand", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- slayer of destruction - itemid = 27450, - type = "deequip", - slot = "hand", - }, - { - -- blade of destruction - itemid = 27449, - type = "equip", - slot = "hand", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- blade of destruction - itemid = 27449, - type = "deequip", - slot = "hand", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- Journal Shield - itemid = 26947, - type = "equip", - slot = "shield", - }, - { - -- Journal Shield - itemid = 26947, - type = "deequip", - slot = "shield", - }, - { - -- reflecting crown - itemid = 26190, - type = "equip", - slot = "head", - }, - { - -- reflecting crown - itemid = 26190, - type = "deequip", - slot = "head", - }, - { - -- incandescent crown - itemid = 26189, - type = "equip", - slot = "head", - }, - { - -- incandescent crown - itemid = 26189, - type = "deequip", - slot = "head", - }, - { - -- iron crown - itemid = 26188, - type = "equip", - slot = "head", - }, - { - -- iron crown - itemid = 26188, - type = "deequip", - slot = "head", - }, - { - -- leaf crown - itemid = 26187, - type = "equip", - slot = "head", - }, - { - -- leaf crown - itemid = 26187, - type = "deequip", - slot = "head", - }, - { - -- ornate carving hammer - itemid = 26061, - type = "equip", - slot = "hand", - }, - { - -- ornate carving hammer - itemid = 26061, - type = "deequip", - slot = "hand", - }, - { - -- valuable carving hammer - itemid = 26060, - type = "equip", - slot = "hand", - }, - { - -- valuable carving hammer - itemid = 26060, - type = "deequip", - slot = "hand", - }, - { - -- plain carving hammer - itemid = 26059, - type = "equip", - slot = "hand", - }, - { - -- plain carving hammer - itemid = 26059, - type = "deequip", - slot = "hand", - }, - { - -- ornate carving mace - itemid = 26058, - type = "equip", - slot = "hand", - }, - { - -- ornate carving mace - itemid = 26058, - type = "deequip", - slot = "hand", - }, - { - -- valuable carving mace - itemid = 26057, - type = "equip", - slot = "hand", - }, - { - -- valuable carving mace - itemid = 26057, - type = "deequip", - slot = "hand", - }, - { - -- plain carving mace - itemid = 26056, - type = "equip", - slot = "hand", - }, - { - -- plain carving mace - itemid = 26056, - type = "deequip", - slot = "hand", - }, - { - -- ornate carving chopper - itemid = 26055, - type = "equip", - slot = "hand", - }, - { - -- ornate carving chopper - itemid = 26055, - type = "deequip", - slot = "hand", - }, - { - -- valuable carving chopper - itemid = 26054, - type = "equip", - slot = "hand", - }, - { - -- valuable carving chopper - itemid = 26054, - type = "deequip", - slot = "hand", - }, - { - -- plain carving chopper - itemid = 26053, - type = "equip", - slot = "hand", - }, - { - -- plain carving chopper - itemid = 26053, - type = "deequip", - slot = "hand", - }, - { - -- ornate carving axe - itemid = 26052, - type = "equip", - slot = "hand", - }, - { - -- ornate carving axe - itemid = 26052, - type = "deequip", - slot = "hand", - }, - { - -- valuable carving axe - itemid = 26051, - type = "equip", - slot = "hand", - }, - { - -- valuable carving axe - itemid = 26051, - type = "deequip", - slot = "hand", - }, - { - -- plain carving axe - itemid = 26050, - type = "equip", - slot = "hand", - }, - { - -- plain carving axe - itemid = 26050, - type = "deequip", - slot = "hand", - }, - { - -- ornate carving slayer - itemid = 26049, - type = "equip", - slot = "hand", - }, - { - -- ornate carving slayer - itemid = 26049, - type = "deequip", - slot = "hand", - }, - { - -- valuable carving slayer - itemid = 26048, - type = "equip", - slot = "hand", - }, - { - -- valuable carving slayer - itemid = 26048, - type = "deequip", - slot = "hand", - }, - { - -- plain carving slayer - itemid = 26047, - type = "equip", - slot = "hand", - }, - { - -- plain carving slayer - itemid = 26047, - type = "deequip", - slot = "hand", - }, - { - -- ornate carving blade - itemid = 26046, - type = "equip", - slot = "hand", - }, - { - -- ornate carving blade - itemid = 26046, - type = "deequip", - slot = "hand", - }, - { - -- valuable carving blade - itemid = 26045, - type = "equip", - slot = "hand", - }, - { - -- valuable carving blade - itemid = 26045, - type = "deequip", - slot = "hand", - }, - { - -- plain carving blade - itemid = 26044, - type = "equip", - slot = "hand", - }, - { - -- plain carving blade - itemid = 26044, - type = "deequip", - slot = "hand", - }, - { - -- ornate remedy hammer - itemid = 26031, - type = "equip", - slot = "hand", - }, - { - -- ornate remedy hammer - itemid = 26031, - type = "deequip", - slot = "hand", - }, - { - -- valuable remedy hammer - itemid = 26030, - type = "equip", - slot = "hand", - }, - { - -- valuable remedy hammer - itemid = 26030, - type = "deequip", - slot = "hand", - }, - { - -- plain remedy hammer - itemid = 26029, - type = "equip", - slot = "hand", - }, - { - -- plain remedy hammer - itemid = 26029, - type = "deequip", - slot = "hand", - }, - { - -- ornate remedy mace - itemid = 26028, - type = "equip", - slot = "hand", - }, - { - -- ornate remedy mace - itemid = 26028, - type = "deequip", - slot = "hand", - }, - { - -- valuable remedy mace - itemid = 26027, - type = "equip", - slot = "hand", - }, - { - -- valuable remedy mace - itemid = 26027, - type = "deequip", - slot = "hand", - }, - { - -- plain remedy mace - itemid = 26026, - type = "equip", - slot = "hand", - }, - { - -- plain remedy mace - itemid = 26026, - type = "deequip", - slot = "hand", - }, - { - -- ornate remedy chopper - itemid = 26025, - type = "equip", - slot = "hand", - }, - { - -- ornate remedy chopper - itemid = 26025, - type = "deequip", - slot = "hand", - }, - { - -- valuable remedy chopper - itemid = 26024, - type = "equip", - slot = "hand", - }, - { - -- valuable remedy chopper - itemid = 26024, - type = "deequip", - slot = "hand", - }, - { - -- plain remedy chopper - itemid = 26023, - type = "equip", - slot = "hand", - }, - { - -- plain remedy chopper - itemid = 26023, - type = "deequip", - slot = "hand", - }, - { - -- ornate remedy axe - itemid = 26022, - type = "equip", - slot = "hand", - }, - { - -- ornate remedy axe - itemid = 26022, - type = "deequip", - slot = "hand", - }, - { - -- valuable remedy axe - itemid = 26021, - type = "equip", - slot = "hand", - }, - { - -- valuable remedy axe - itemid = 26021, - type = "deequip", - slot = "hand", - }, - { - -- plain remedy axe - itemid = 26020, - type = "equip", - slot = "hand", - }, - { - -- plain remedy axe - itemid = 26020, - type = "deequip", - slot = "hand", - }, - { - -- ornate remedy slayer - itemid = 26019, - type = "equip", - slot = "hand", - }, - { - -- ornate remedy slayer - itemid = 26019, - type = "deequip", - slot = "hand", - }, - { - -- valuable remedy slayer - itemid = 26018, - type = "equip", - slot = "hand", - }, - { - -- valuable remedy slayer - itemid = 26018, - type = "deequip", - slot = "hand", - }, - { - -- plain remedy slayer - itemid = 26017, - type = "equip", - slot = "hand", - }, - { - -- plain remedy slayer - itemid = 26017, - type = "deequip", - slot = "hand", - }, - { - -- ornate remedy blade - itemid = 26016, - type = "equip", - slot = "hand", - }, - { - -- ornate remedy blade - itemid = 26016, - type = "deequip", - slot = "hand", - }, - { - -- valuable remedy blade - itemid = 26015, - type = "equip", - slot = "hand", - }, - { - -- valuable remedy blade - itemid = 26015, - type = "deequip", - slot = "hand", - }, - { - -- plain remedy blade - itemid = 26014, - type = "equip", - slot = "hand", - }, - { - -- plain remedy blade - itemid = 26014, - type = "deequip", - slot = "hand", - }, - { - -- ornate mayhem hammer - itemid = 26000, - type = "equip", - slot = "hand", - }, - { - -- ornate mayhem hammer - itemid = 26000, - type = "deequip", - slot = "hand", - }, - { - -- valuable mayhem hammer - itemid = 25999, - type = "equip", - slot = "hand", - }, - { - -- valuable mayhem hammer - itemid = 25999, - type = "deequip", - slot = "hand", - }, - { - -- plain mayhem hammer - itemid = 25998, - type = "equip", - slot = "hand", - }, - { - -- plain mayhem hammer - itemid = 25998, - type = "deequip", - slot = "hand", - }, - { - -- ornate mayhem mace - itemid = 25997, - type = "equip", - slot = "hand", - }, - { - -- ornate mayhem mace - itemid = 25997, - type = "deequip", - slot = "hand", - }, - { - -- valuable mayhem mace - itemid = 25996, - type = "equip", - slot = "hand", - }, - { - -- valuable mayhem mace - itemid = 25996, - type = "deequip", - slot = "hand", - }, - { - -- plain mayhem mace - itemid = 25995, - type = "equip", - slot = "hand", - }, - { - -- plain mayhem mace - itemid = 25995, - type = "deequip", - slot = "hand", - }, - { - -- ornate mayhem chopper - itemid = 25994, - type = "equip", - slot = "hand", - }, - { - -- ornate mayhem chopper - itemid = 25994, - type = "deequip", - slot = "hand", - }, - { - -- valuable mayhem chopper - itemid = 25993, - type = "equip", - slot = "hand", - }, - { - -- valuable mayhem chopper - itemid = 25993, - type = "deequip", - slot = "hand", - }, - { - -- plain mayhem chopper - itemid = 25992, - type = "equip", - slot = "hand", - }, - { - -- plain mayhem chopper - itemid = 25992, - type = "deequip", - slot = "hand", - }, - { - -- ornate mayhem axe - itemid = 25991, - type = "equip", - slot = "hand", - }, - { - -- ornate mayhem axe - itemid = 25991, - type = "deequip", - slot = "hand", - }, - { - -- valuable mayhem axe - itemid = 25990, - type = "equip", - slot = "hand", - }, - { - -- valuable mayhem axe - itemid = 25990, - type = "deequip", - slot = "hand", - }, - { - -- plain mayhem axe - itemid = 25989, - type = "equip", - slot = "hand", - }, - { - -- plain mayhem axe - itemid = 25989, - type = "deequip", - slot = "hand", - }, - { - -- ornate mayhem slayer - itemid = 25988, - type = "equip", - slot = "hand", - }, - { - -- ornate mayhem slayer - itemid = 25988, - type = "deequip", - slot = "hand", - }, - { - -- valuable mayhem slayer - itemid = 25987, - type = "equip", - slot = "hand", - }, - { - -- valuable mayhem slayer - itemid = 25987, - type = "deequip", - slot = "hand", - }, - { - -- plain mayhem slayer - itemid = 25986, - type = "equip", - slot = "hand", - }, - { - -- plain mayhem slayer - itemid = 25986, - type = "deequip", - slot = "hand", - }, - { - -- ornate mayhem blade - itemid = 25985, - type = "equip", - slot = "hand", - }, - { - -- ornate mayhem blade - itemid = 25985, - type = "deequip", - slot = "hand", - }, - { - -- valuable mayhem blade - itemid = 25984, - type = "equip", - slot = "hand", - }, - { - -- valuable mayhem blade - itemid = 25984, - type = "deequip", - slot = "hand", - }, - { - -- plain mayhem blade - itemid = 25983, - type = "equip", - slot = "hand", - }, - { - -- plain mayhem blade - itemid = 25983, - type = "deequip", - slot = "hand", - }, - { - -- mathmaster shield (souvenir) - itemid = 25982, - type = "equip", - slot = "shield", - }, - { - -- mathmaster shield (souvenir) - itemid = 25982, - type = "deequip", - slot = "shield", - }, - { - -- sun catcher - itemid = 25977, - type = "equip", - slot = "ammo", - }, - { - -- sun catcher - itemid = 25977, - type = "deequip", - slot = "ammo", - }, - { - -- starlight vial - itemid = 25976, - type = "equip", - slot = "ammo", - }, - { - -- starlight vial - itemid = 25976, - type = "deequip", - slot = "ammo", - }, - { - -- moon mirror - itemid = 25975, - type = "equip", - slot = "ammo", - }, - { - -- moon mirror - itemid = 25975, - type = "deequip", - slot = "ammo", - }, - { - -- energy war hammer replica - itemid = 25974, - type = "equip", - slot = "hand", - }, - { - -- energy war hammer replica - itemid = 25974, - type = "deequip", - slot = "hand", - }, - { - -- energy orcish maul replica - itemid = 25973, - type = "equip", - slot = "hand", - }, - { - -- energy orcish maul replica - itemid = 25973, - type = "deequip", - slot = "hand", - }, - { - -- energy basher replica - itemid = 25972, - type = "equip", - slot = "hand", - }, - { - -- energy basher replica - itemid = 25972, - type = "deequip", - slot = "hand", - }, - { - -- energy crystal mace replica - itemid = 25971, - type = "equip", - slot = "hand", - }, - { - -- energy crystal mace replica - itemid = 25971, - type = "deequip", - slot = "hand", - }, - { - -- energy clerical mace replica - itemid = 25970, - type = "equip", - slot = "hand", - }, - { - -- energy clerical mace replica - itemid = 25970, - type = "deequip", - slot = "hand", - }, - { - -- energy war axe replica - itemid = 25969, - type = "equip", - slot = "hand", - }, - { - -- energy war axe replica - itemid = 25969, - type = "deequip", - slot = "hand", - }, - { - -- energy headchopper replica - itemid = 25968, - type = "equip", - slot = "hand", - }, - { - -- energy headchopper replica - itemid = 25968, - type = "deequip", - slot = "hand", - }, - { - -- energy heroic axe replica - itemid = 25967, - type = "equip", - slot = "hand", - }, - { - -- energy heroic axe replica - itemid = 25967, - type = "deequip", - slot = "hand", - }, - { - -- energy knight axe replica - itemid = 25966, - type = "equip", - slot = "hand", - }, - { - -- energy knight axe replica - itemid = 25966, - type = "deequip", - slot = "hand", - }, - { - -- energy barbarian axe replica - itemid = 25965, - type = "equip", - slot = "hand", - }, - { - -- energy barbarian axe replica - itemid = 25965, - type = "deequip", - slot = "hand", - }, - { - -- energy dragon slayer replica - itemid = 25964, - type = "equip", - slot = "hand", - }, - { - -- energy dragon slayer replica - itemid = 25964, - type = "deequip", - slot = "hand", - }, - { - -- energy blacksteel replica - itemid = 25963, - type = "equip", - slot = "hand", - }, - { - -- energy blacksteel replica - itemid = 25963, - type = "deequip", - slot = "hand", - }, - { - -- energy mystic blade replica - itemid = 25962, - type = "equip", - slot = "hand", - }, - { - -- energy mystic blade replica - itemid = 25962, - type = "deequip", - slot = "hand", - }, - { - -- energy relic sword replica - itemid = 25961, - type = "equip", - slot = "hand", - }, - { - -- energy relic sword replica - itemid = 25961, - type = "deequip", - slot = "hand", - }, - { - -- energy spike sword replica - itemid = 25960, - type = "equip", - slot = "hand", - }, - { - -- energy spike sword replica - itemid = 25960, - type = "deequip", - slot = "hand", - }, - { - -- earth war hammer replica - itemid = 25959, - type = "equip", - slot = "hand", - }, - { - -- earth war hammer replica - itemid = 25959, - type = "deequip", - slot = "hand", - }, - { - -- earth orcish maul replica - itemid = 25958, - type = "equip", - slot = "hand", - }, - { - -- earth orcish maul replica - itemid = 25958, - type = "deequip", - slot = "hand", - }, - { - -- earth basher replica - itemid = 25957, - type = "equip", - slot = "hand", - }, - { - -- earth basher replica - itemid = 25957, - type = "deequip", - slot = "hand", - }, - { - -- earth crystal mace replica - itemid = 25956, - type = "equip", - slot = "hand", - }, - { - -- earth crystal mace replica - itemid = 25956, - type = "deequip", - slot = "hand", - }, - { - -- earth clerical mace replica - itemid = 25955, - type = "equip", - slot = "hand", - }, - { - -- earth clerical mace replica - itemid = 25955, - type = "deequip", - slot = "hand", - }, - { - -- earth war axe replica - itemid = 25954, - type = "equip", - slot = "hand", - }, - { - -- earth war axe replica - itemid = 25954, - type = "deequip", - slot = "hand", - }, - { - -- earth headchopper replica - itemid = 25953, - type = "equip", - slot = "hand", - }, - { - -- earth headchopper replica - itemid = 25953, - type = "deequip", - slot = "hand", - }, - { - -- earth heroic axe replica - itemid = 25952, - type = "equip", - slot = "hand", - }, - { - -- earth heroic axe replica - itemid = 25952, - type = "deequip", - slot = "hand", - }, - { - -- earth knight axe replica - itemid = 25951, - type = "equip", - slot = "hand", - }, - { - -- earth knight axe replica - itemid = 25951, - type = "deequip", - slot = "hand", - }, - { - -- earth barbarian axe replica - itemid = 25950, - type = "equip", - slot = "hand", - }, - { - -- earth barbarian axe replica - itemid = 25950, - type = "deequip", - slot = "hand", - }, - { - -- earth dragon slayer replica - itemid = 25949, - type = "equip", - slot = "hand", - }, - { - -- earth dragon slayer replica - itemid = 25949, - type = "deequip", - slot = "hand", - }, - { - -- earth blacksteel replica - itemid = 25948, - type = "equip", - slot = "hand", - }, - { - -- earth blacksteel replica - itemid = 25948, - type = "deequip", - slot = "hand", - }, - { - -- earth mystic blade replica - itemid = 25947, - type = "equip", - slot = "hand", - }, - { - -- earth mystic blade replica - itemid = 25947, - type = "deequip", - slot = "hand", - }, - { - -- earth relic sword replica - itemid = 25946, - type = "equip", - slot = "hand", - }, - { - -- earth relic sword replica - itemid = 25946, - type = "deequip", - slot = "hand", - }, - { - -- earth spike sword replica - itemid = 25945, - type = "equip", - slot = "hand", - }, - { - -- earth spike sword replica - itemid = 25945, - type = "deequip", - slot = "hand", - }, - { - -- icy war hammer replica - itemid = 25944, - type = "equip", - slot = "hand", - }, - { - -- icy war hammer replica - itemid = 25944, - type = "deequip", - slot = "hand", - }, - { - -- icy orcish maul replica - itemid = 25943, - type = "equip", - slot = "hand", - }, - { - -- icy orcish maul replica - itemid = 25943, - type = "deequip", - slot = "hand", - }, - { - -- icy basher replica - itemid = 25942, - type = "equip", - slot = "hand", - }, - { - -- icy basher replica - itemid = 25942, - type = "deequip", - slot = "hand", - }, - { - -- icy crystal mace replica - itemid = 25941, - type = "equip", - slot = "hand", - }, - { - -- icy crystal mace replica - itemid = 25941, - type = "deequip", - slot = "hand", - }, - { - -- icy clerical mace replica - itemid = 25940, - type = "equip", - slot = "hand", - }, - { - -- icy clerical mace replica - itemid = 25940, - type = "deequip", - slot = "hand", - }, - { - -- icy war axe replica - itemid = 25939, - type = "equip", - slot = "hand", - }, - { - -- icy war axe replica - itemid = 25939, - type = "deequip", - slot = "hand", - }, - { - -- icy headchopper replica - itemid = 25938, - type = "equip", - slot = "hand", - }, - { - -- icy headchopper replica - itemid = 25938, - type = "deequip", - slot = "hand", - }, - { - -- icy heroic axe replica - itemid = 25937, - type = "equip", - slot = "hand", - }, - { - -- icy heroic axe replica - itemid = 25937, - type = "deequip", - slot = "hand", - }, - { - -- icy knight axe replica - itemid = 25936, - type = "equip", - slot = "hand", - }, - { - -- icy knight axe replica - itemid = 25936, - type = "deequip", - slot = "hand", - }, - { - -- icy barbarian axe replica - itemid = 25935, - type = "equip", - slot = "hand", - }, - { - -- icy barbarian axe replica - itemid = 25935, - type = "deequip", - slot = "hand", - }, - { - -- icy dragon slayer replica - itemid = 25934, - type = "equip", - slot = "hand", - }, - { - -- icy dragon slayer replica - itemid = 25934, - type = "deequip", - slot = "hand", - }, - { - -- icy blacksteel replica - itemid = 25933, - type = "equip", - slot = "hand", - }, - { - -- icy blacksteel replica - itemid = 25933, - type = "deequip", - slot = "hand", - }, - { - -- icy mystic blade replica - itemid = 25932, - type = "equip", - slot = "hand", - }, - { - -- icy mystic blade replica - itemid = 25932, - type = "deequip", - slot = "hand", - }, - { - -- icy relic sword replica - itemid = 25931, - type = "equip", - slot = "hand", - }, - { - -- icy relic sword replica - itemid = 25931, - type = "deequip", - slot = "hand", - }, - { - -- icy spike sword replica - itemid = 25930, - type = "equip", - slot = "hand", - }, - { - -- icy spike sword replica - itemid = 25930, - type = "deequip", - slot = "hand", - }, - { - -- fiery war hammer replica - itemid = 25929, - type = "equip", - slot = "hand", - }, - { - -- fiery war hammer replica - itemid = 25929, - type = "deequip", - slot = "hand", - }, - { - -- fiery orcish maul replica - itemid = 25928, - type = "equip", - slot = "hand", - }, - { - -- fiery orcish maul replica - itemid = 25928, - type = "deequip", - slot = "hand", - }, - { - -- fiery basher replica - itemid = 25927, - type = "equip", - slot = "hand", - }, - { - -- fiery basher replica - itemid = 25927, - type = "deequip", - slot = "hand", - }, - { - -- fiery crystal mace replica - itemid = 25926, - type = "equip", - slot = "hand", - }, - { - -- fiery crystal mace replica - itemid = 25926, - type = "deequip", - slot = "hand", - }, - { - -- fiery clerical mace replica - itemid = 25925, - type = "equip", - slot = "hand", - }, - { - -- fiery clerical mace replica - itemid = 25925, - type = "deequip", - slot = "hand", - }, - { - -- fiery war axe replica - itemid = 25924, - type = "equip", - slot = "hand", - }, - { - -- fiery war axe replica - itemid = 25924, - type = "deequip", - slot = "hand", - }, - { - -- fiery headchopper replica - itemid = 25923, - type = "equip", - slot = "hand", - }, - { - -- fiery headchopper replica - itemid = 25923, - type = "deequip", - slot = "hand", - }, - { - -- fiery heroic axe replica - itemid = 25922, - type = "equip", - slot = "hand", - }, - { - -- fiery heroic axe replica - itemid = 25922, - type = "deequip", - slot = "hand", - }, - { - -- fiery knight axe replica - itemid = 25921, - type = "equip", - slot = "hand", - }, - { - -- fiery knight axe replica - itemid = 25921, - type = "deequip", - slot = "hand", - }, - { - -- fiery barbarian axe replica - itemid = 25920, - type = "equip", - slot = "hand", - }, - { - -- fiery barbarian axe replica - itemid = 25920, - type = "deequip", - slot = "hand", - }, - { - -- fiery dragon slayer replica - itemid = 25919, - type = "equip", - slot = "hand", - }, - { - -- fiery dragon slayer replica - itemid = 25919, - type = "deequip", - slot = "hand", - }, - { - -- fiery blacksteel replica - itemid = 25918, - type = "equip", - slot = "hand", - }, - { - -- fiery blacksteel replica - itemid = 25918, - type = "deequip", - slot = "hand", - }, - { - -- fiery mystic blade replica - itemid = 25917, - type = "equip", - slot = "hand", - }, - { - -- fiery mystic blade replica - itemid = 25917, - type = "deequip", - slot = "hand", - }, - { - -- fiery relic sword replica - itemid = 25916, - type = "equip", - slot = "hand", - }, - { - -- fiery relic sword replica - itemid = 25916, - type = "deequip", - slot = "hand", - }, - { - -- fiery spike sword replica - itemid = 25915, - type = "equip", - slot = "hand", - }, - { - -- fiery spike sword replica - itemid = 25915, - type = "deequip", - slot = "hand", - }, - { - -- blossom bag - itemid = 25780, - type = "equip", - slot = "backpack", - }, - { - -- blossom bag - itemid = 25780, - type = "deequip", - slot = "backpack", - }, - { - -- swan feather cloak - itemid = 25779, - type = "equip", - slot = "armor", - level = 60, - }, - { - -- swan feather cloak - itemid = 25779, - type = "deequip", - slot = "armor", - level = 60, - }, - { - -- wand of darkness - itemid = 25760, - type = "equip", - slot = "hand", - level = 41, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of darkness - itemid = 25760, - type = "deequip", - slot = "hand", - level = 41, - }, - { - -- royal star - itemid = 25759, - type = "equip", - slot = "hand", - level = 120, - }, - { - -- royal star - itemid = 25759, - type = "deequip", - slot = "hand", - level = 120, - }, - { - -- spectral bolt - itemid = 25758, - type = "equip", - slot = "ammo", - }, - { - -- spectral bolt - itemid = 25758, - type = "deequip", - slot = "ammo", - }, - { - -- leaf star - itemid = 25735, - type = "equip", - slot = "hand", - level = 60, - }, - { - -- leaf star - itemid = 25735, - type = "deequip", - slot = "hand", - level = 60, - }, - { - -- dream blossom staff - itemid = 25700, - type = "equip", - slot = "hand", - level = 80, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- dream blossom staff - itemid = 25700, - type = "deequip", - slot = "hand", - level = 80, - }, - { - -- wooden spellbook - itemid = 25699, - type = "equip", - slot = "shield", - level = 80, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- wooden spellbook - itemid = 25699, - type = "deequip", - slot = "shield", - level = 80, - }, - { - -- butterfly ring - itemid = 25698, - type = "equip", - slot = "ring", - level = 50, - }, - { - -- butterfly ring - itemid = 25698, - type = "deequip", - slot = "ring", - level = 50, - }, - { - -- glowing rubbish amulet - itemid = 25297, - type = "equip", - slot = "necklace", - }, - { - -- glowing rubbish amulet - itemid = 25297, - type = "deequip", - slot = "necklace", - }, - { - -- rubbish amulet - itemid = 25296, - type = "equip", - slot = "necklace", - }, - { - -- rubbish amulet - itemid = 25296, - type = "deequip", - slot = "necklace", - }, - { - -- porcelain mask - itemid = 25088, - type = "equip", - slot = "head", - }, - { - -- porcelain mask - itemid = 25088, - type = "deequip", - slot = "head", - }, - { - -- filthy bunnyslippers - itemid = 24409, - type = "equip", - slot = "feet", - }, - { - -- filthy bunnyslippers - itemid = 24409, - type = "deequip", - slot = "feet", - }, - { - -- rusty winged helmet - itemid = 24405, - type = "equip", - slot = "head", - }, - { - -- rusty winged helmet - itemid = 24405, - type = "deequip", - slot = "head", - }, - { - -- tatty Dragon scale legs - itemid = 24404, - type = "equip", - slot = "legs", - }, - { - -- tatty Dragon scale legs - itemid = 24404, - type = "deequip", - slot = "legs", - }, - { - -- chocolatey dragon scale legs - itemid = 24402, - type = "equip", - slot = "legs", - }, - { - -- chocolatey dragon scale legs - itemid = 24402, - type = "deequip", - slot = "legs", - }, - { - -- Ferumbras' Candy Hat - itemid = 24397, - type = "equip", - slot = "head", - }, - { - -- Ferumbras' Candy Hat - itemid = 24397, - type = "deequip", - slot = "head", - }, - { - -- birthday backpack - itemid = 24395, - type = "equip", - slot = "backpack", - }, - { - -- birthday backpack - itemid = 24395, - type = "deequip", - slot = "backpack", - }, - { - -- pillow backpack - itemid = 24393, - type = "equip", - slot = "backpack", - }, - { - -- pillow backpack - itemid = 24393, - type = "deequip", - slot = "backpack", - }, - { - -- collar of red plasma - itemid = 23544, - type = "equip", - slot = "necklace", - level = 150, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- collar of red plasma - itemid = 23544, - type = "deequip", - slot = "necklace", - level = 150, - }, - { - -- collar of green plasma - itemid = 23543, - type = "equip", - slot = "necklace", - level = 150, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- collar of green plasma - itemid = 23543, - type = "deequip", - slot = "necklace", - level = 150, - }, - { - -- collar of blue plasma - itemid = 23542, - type = "equip", - slot = "necklace", - level = 150, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- collar of blue plasma - itemid = 23542, - type = "deequip", - slot = "necklace", - level = 150, - }, - { - -- ring of red plasma - itemid = 23534, - type = "equip", - slot = "ring", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- ring of red plasma - itemid = 23534, - type = "deequip", - slot = "ring", - level = 100, - }, - { - -- ring of red plasma - itemid = 23533, - type = "equip", - slot = "ring", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- ring of red plasma - itemid = 23533, - type = "deequip", - slot = "ring", - level = 100, - }, - { - -- ring of green plasma - itemid = 23532, - type = "equip", - slot = "ring", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- ring of green plasma - itemid = 23532, - type = "deequip", - slot = "ring", - level = 100, - }, - { - -- ring of green plasma - itemid = 23531, - type = "equip", - slot = "ring", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- ring of green plasma - itemid = 23531, - type = "deequip", - slot = "ring", - level = 100, - }, - { - -- ring of blue plasma - itemid = 23530, - type = "equip", - slot = "ring", - level = 100, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- ring of blue plasma - itemid = 23530, - type = "deequip", - slot = "ring", - level = 100, - }, - { - -- ring of blue plasma - itemid = 23529, - type = "equip", - slot = "ring", - level = 100, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- ring of blue plasma - itemid = 23529, - type = "deequip", - slot = "ring", - level = 100, - }, - { - -- collar of red plasma - itemid = 23528, - type = "equip", - slot = "necklace", - level = 150, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- collar of red plasma - itemid = 23528, - type = "deequip", - slot = "necklace", - level = 150, - }, - { - -- collar of green plasma - itemid = 23527, - type = "equip", - slot = "necklace", - level = 150, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- collar of green plasma - itemid = 23527, - type = "deequip", - slot = "necklace", - level = 150, - }, - { - -- collar of blue plasma - itemid = 23526, - type = "equip", - slot = "necklace", - level = 150, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- collar of blue plasma - itemid = 23526, - type = "deequip", - slot = "necklace", - level = 150, - }, - { - -- energetic backpack - itemid = 23525, - type = "equip", - slot = "backpack", - }, - { - -- energetic backpack - itemid = 23525, - type = "deequip", - slot = "backpack", - }, - { - -- void boots - itemid = 23477, - type = "equip", - slot = "feet", - level = 150, - }, - { - -- void boots - itemid = 23477, - type = "deequip", - slot = "feet", - level = 150, - }, - { - -- void boots - itemid = 23476, - type = "equip", - slot = "feet", - level = 150, - }, - { - -- void boots - itemid = 23476, - type = "deequip", - slot = "feet", - level = 150, - }, - { - -- tiara of power - itemid = 23475, - type = "equip", - slot = "head", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- tiara of power - itemid = 23475, - type = "deequip", - slot = "head", - level = 100, - }, - { - -- tiara of power - itemid = 23474, - type = "equip", - slot = "head", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- tiara of power - itemid = 23474, - type = "deequip", - slot = "head", - level = 100, - }, - { - -- rod of carving - itemid = 23339, - type = "equip", - slot = "hand", - level = 100, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- rod of carving - itemid = 23339, - type = "deequip", - slot = "hand", - level = 100, - }, - { - -- wand of carving - itemid = 23335, - type = "equip", - slot = "hand", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of carving - itemid = 23335, - type = "deequip", - slot = "hand", - level = 100, - }, - { - -- crossbow of carving - itemid = 23331, - type = "equip", - slot = "hand", - }, - { - -- crossbow of carving - itemid = 23331, - type = "deequip", - slot = "hand", - }, - { - -- bow of carving - itemid = 23327, - type = "equip", - slot = "hand", - }, - { - -- bow of carving - itemid = 23327, - type = "deequip", - slot = "hand", - }, - { - -- hammer of carving - itemid = 23323, - type = "equip", - slot = "hand", - }, - { - -- hammer of carving - itemid = 23323, - type = "deequip", - slot = "hand", - }, - { - -- mace of carving - itemid = 23319, - type = "equip", - slot = "hand", - }, - { - -- mace of carving - itemid = 23319, - type = "deequip", - slot = "hand", - }, - { - -- chopper of carving - itemid = 23315, - type = "equip", - slot = "hand", - }, - { - -- chopper of carving - itemid = 23315, - type = "deequip", - slot = "hand", - }, - { - -- axe of carving - itemid = 23311, - type = "equip", - slot = "hand", - }, - { - -- axe of carving - itemid = 23311, - type = "deequip", - slot = "hand", - }, - { - -- slayer of carving - itemid = 23307, - type = "equip", - slot = "hand", - }, - { - -- slayer of carving - itemid = 23307, - type = "deequip", - slot = "hand", - }, - { - -- blade of carving - itemid = 23303, - type = "equip", - slot = "hand", - }, - { - -- blade of carving - itemid = 23303, - type = "deequip", - slot = "hand", - }, - { - -- rod of remedy - itemid = 23299, - type = "equip", - slot = "hand", - level = 100, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- rod of remedy - itemid = 23299, - type = "deequip", - slot = "hand", - level = 100, - }, - { - -- wand of remedy - itemid = 23295, - type = "equip", - slot = "hand", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of remedy - itemid = 23295, - type = "deequip", - slot = "hand", - level = 100, - }, - { - -- crossbow of remedy - itemid = 23291, - type = "equip", - slot = "hand", - }, - { - -- crossbow of remedy - itemid = 23291, - type = "deequip", - slot = "hand", - }, - { - -- bow of remedy - itemid = 23287, - type = "equip", - slot = "hand", - }, - { - -- bow of remedy - itemid = 23287, - type = "deequip", - slot = "hand", - }, - { - -- mace of remedy - itemid = 23279, - type = "equip", - slot = "hand", - }, - { - -- mace of remedy - itemid = 23279, - type = "deequip", - slot = "hand", - }, - { - -- chopper of remedy - itemid = 23275, - type = "equip", - slot = "hand", - }, - { - -- chopper of remedy - itemid = 23275, - type = "deequip", - slot = "hand", - }, - { - -- axe of remedy - itemid = 23271, - type = "equip", - slot = "hand", - }, - { - -- axe of remedy - itemid = 23271, - type = "deequip", - slot = "hand", - }, - { - -- slayer of remedy - itemid = 23267, - type = "equip", - slot = "hand", - }, - { - -- slayer of remedy - itemid = 23267, - type = "deequip", - slot = "hand", - }, - { - -- blade of remedy - itemid = 23263, - type = "equip", - slot = "hand", - }, - { - -- blade of remedy - itemid = 23263, - type = "deequip", - slot = "hand", - }, - { - -- rod of mayhem - itemid = 23232, - type = "equip", - slot = "hand", - level = 100, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- rod of mayhem - itemid = 23232, - type = "deequip", - slot = "hand", - level = 100, - }, - { - -- wand of mayhem - itemid = 23231, - type = "equip", - slot = "hand", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of mayhem - itemid = 23231, - type = "deequip", - slot = "hand", - level = 100, - }, - { - -- crossbow of mayhem - itemid = 23230, - type = "equip", - slot = "hand", - }, - { - -- crossbow of mayhem - itemid = 23230, - type = "deequip", - slot = "hand", - }, - { - -- bow of mayhem - itemid = 23229, - type = "equip", - slot = "hand", - }, - { - -- bow of mayhem - itemid = 23229, - type = "deequip", - slot = "hand", - }, - { - -- hammer of mayhem - itemid = 23228, - type = "equip", - slot = "hand", - }, - { - -- hammer of mayhem - itemid = 23228, - type = "deequip", - slot = "hand", - }, - { - -- mace of mayhem - itemid = 23227, - type = "equip", - slot = "hand", - }, - { - -- mace of mayhem - itemid = 23227, - type = "deequip", - slot = "hand", - }, - { - -- chopper of mayhem - itemid = 23226, - type = "equip", - slot = "hand", - }, - { - -- chopper of mayhem - itemid = 23226, - type = "deequip", - slot = "hand", - }, - { - -- axe of mayhem - itemid = 23225, - type = "equip", - slot = "hand", - }, - { - -- axe of mayhem - itemid = 23225, - type = "deequip", - slot = "hand", - }, - { - -- slayer of mayhem - itemid = 23224, - type = "equip", - slot = "hand", - }, - { - -- slayer of mayhem - itemid = 23224, - type = "deequip", - slot = "hand", - }, - { - -- blade of mayhem - itemid = 23223, - type = "equip", - slot = "hand", - }, - { - -- blade of mayhem - itemid = 23223, - type = "deequip", - slot = "hand", - }, - { - -- shield of destiny - itemid = 22890, - type = "equip", - slot = "shield", - }, - { - -- shield of destiny - itemid = 22890, - type = "deequip", - slot = "shield", - }, - { - -- shield of destiny - itemid = 22889, - type = "equip", - slot = "shield", - }, - { - -- shield of destiny - itemid = 22889, - type = "deequip", - slot = "shield", - }, - { - -- rift crossbow - itemid = 22867, - type = "equip", - slot = "hand", - level = 120, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- rift crossbow - itemid = 22867, - type = "deequip", - slot = "hand", - }, - { - -- rift bow - itemid = 22866, - type = "equip", - slot = "hand", - level = 120, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- rift bow - itemid = 22866, - type = "deequip", - slot = "hand", - }, - { - -- boots of homecoming - itemid = 22774, - type = "equip", - slot = "feet", - level = 100, - }, - { - -- boots of homecoming - itemid = 22774, - type = "deequip", - slot = "feet", - level = 100, - }, - { - -- boots of homecoming - itemid = 22773, - type = "equip", - slot = "feet", - level = 100, - }, - { - -- boots of homecoming - itemid = 22773, - type = "deequip", - slot = "feet", - level = 100, - }, - { - -- ferumbras' amulet - itemid = 22768, - type = "equip", - slot = "necklace", - level = 100, - }, - { - -- ferumbras' amulet - itemid = 22768, - type = "deequip", - slot = "necklace", - level = 100, - }, - { - -- ferumbras' amulet - itemid = 22767, - type = "equip", - slot = "necklace", - level = 100, - }, - { - -- ferumbras' amulet - itemid = 22767, - type = "deequip", - slot = "necklace", - level = 100, - }, - { - -- ferumbras' staff (enchanted) - itemid = 22766, - type = "equip", - slot = "hand", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- ferumbras' staff (enchanted) - itemid = 22766, - type = "deequip", - slot = "hand", - level = 100, - }, - { - -- ferumbras' staff (failed) - itemid = 22765, - type = "equip", - slot = "hand", - level = 65, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- ferumbras' staff (failed) - itemid = 22765, - type = "deequip", - slot = "hand", - level = 65, - }, - { - -- Ferumbras' staff (club) - itemid = 22764, - type = "equip", - slot = "hand", - level = 100, - }, - { - -- Ferumbras' staff (club) - itemid = 22764, - type = "deequip", - slot = "hand", - }, - { - -- maimer - itemid = 22762, - type = "equip", - slot = "hand", - level = 150, - }, - { - -- maimer - itemid = 22762, - type = "deequip", - slot = "hand", - }, - { - -- Impaler of the igniter - itemid = 22760, - type = "equip", - slot = "hand", - level = 150, - }, - { - -- Impaler of the igniter - itemid = 22760, - type = "deequip", - slot = "hand", - }, - { - -- plague bite - itemid = 22759, - type = "equip", - slot = "hand", - level = 150, - }, - { - -- plague bite - itemid = 22759, - type = "deequip", - slot = "hand", - }, - { - -- death gaze - itemid = 22758, - type = "equip", - slot = "shield", - level = 200, - }, - { - -- death gaze - itemid = 22758, - type = "deequip", - slot = "shield", - level = 200, - }, - { - -- shroud of despair - itemid = 22757, - type = "equip", - slot = "head", - level = 150, - }, - { - -- shroud of despair - itemid = 22757, - type = "deequip", - slot = "head", - level = 150, - }, - { - -- treader of torment - itemid = 22756, - type = "equip", - slot = "feet", - }, - { - -- treader of torment - itemid = 22756, - type = "deequip", - slot = "feet", - }, - { - -- book of lies - itemid = 22755, - type = "equip", - slot = "shield", - level = 150, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- book of lies - itemid = 22755, - type = "deequip", - slot = "shield", - level = 150, - }, - { - -- visage of the end days - itemid = 22754, - type = "equip", - slot = "head", - }, - { - -- visage of the end days - itemid = 22754, - type = "deequip", - slot = "head", - }, - { - -- ancient amulet - itemid = 22746, - type = "equip", - slot = "necklace", - }, - { - -- ancient amulet - itemid = 22746, - type = "deequip", - slot = "necklace", - }, - { - -- rift lance - itemid = 22727, - type = "equip", - slot = "hand", - level = 70, - }, - { - -- rift lance - itemid = 22727, - type = "deequip", - slot = "hand", - }, - { - -- rift shield - itemid = 22726, - type = "equip", - slot = "shield", - }, - { - -- rift shield - itemid = 22726, - type = "deequip", - slot = "shield", - }, - { - -- rattling gourd - itemid = 22651, - type = "equip", - slot = "shield", - }, - { - -- rattling gourd - itemid = 22651, - type = "deequip", - slot = "shield", - }, - { - -- gourd - itemid = 22650, - type = "equip", - slot = "shield", - }, - { - -- gourd - itemid = 22650, - type = "deequip", - slot = "shield", - }, - { - -- frostmind raiment - itemid = 22537, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- frostmind raiment - itemid = 22537, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- thundermind raiment - itemid = 22536, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- thundermind raiment - itemid = 22536, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- earthmind raiment - itemid = 22535, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- earthmind raiment - itemid = 22535, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- firemind raiment - itemid = 22534, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- firemind raiment - itemid = 22534, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- frostsoul tabard - itemid = 22533, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- frostsoul tabard - itemid = 22533, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- thundersoul tabard - itemid = 22532, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- thundersoul tabard - itemid = 22532, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- earthsoul tabard - itemid = 22531, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- earthsoul tabard - itemid = 22531, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- firesoul tabard - itemid = 22530, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- firesoul tabard - itemid = 22530, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- frostheart platemail - itemid = 22529, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- frostheart platemail - itemid = 22529, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- frostheart hauberk - itemid = 22528, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- frostheart hauberk - itemid = 22528, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- frostheart cuirass - itemid = 22527, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- frostheart cuirass - itemid = 22527, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- thunderheart platemail - itemid = 22526, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- thunderheart platemail - itemid = 22526, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- thunderheart hauberk - itemid = 22525, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- thunderheart hauberk - itemid = 22525, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- thunderheart cuirass - itemid = 22524, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- thunderheart cuirass - itemid = 22524, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- earthheart platemail - itemid = 22523, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- earthheart platemail - itemid = 22523, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- earthheart hauberk - itemid = 22522, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- earthheart hauberk - itemid = 22522, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- earthheart cuirass - itemid = 22521, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- earthheart cuirass - itemid = 22521, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- fireheart platemail - itemid = 22520, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fireheart platemail - itemid = 22520, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- fireheart hauberk - itemid = 22519, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fireheart hauberk - itemid = 22519, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- fireheart cuirass - itemid = 22518, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fireheart cuirass - itemid = 22518, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- onyx pendant - itemid = 22195, - type = "equip", - slot = "necklace", - level = 60, - }, - { - -- onyx pendant - itemid = 22195, - type = "deequip", - slot = "necklace", - level = 60, - }, - { - -- shamanic mask - itemid = 22192, - type = "equip", - slot = "head", - }, - { - -- shamanic mask - itemid = 22192, - type = "deequip", - slot = "head", - }, - { - -- painted gourd rattle - itemid = 22190, - type = "equip", - slot = "shield", - }, - { - -- painted gourd rattle - itemid = 22190, - type = "deequip", - slot = "shield", - }, - { - -- ogre scepta - itemid = 22183, - type = "equip", - slot = "hand", - level = 37, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- ogre scepta - itemid = 22183, - type = "deequip", - slot = "hand", - level = 37, - }, - { - -- ogre choppa - itemid = 22172, - type = "equip", - slot = "hand", - level = 25, - }, - { - -- ogre choppa - itemid = 22172, - type = "deequip", - slot = "hand", - }, - { - -- ogre klubba - itemid = 22171, - type = "equip", - slot = "hand", - level = 50, - }, - { - -- ogre klubba - itemid = 22171, - type = "deequip", - slot = "hand", - }, - { - -- house silversun's signet ring - itemid = 22170, - type = "equip", - slot = "ring", - }, - { - -- house silversun's signet ring - itemid = 22170, - type = "deequip", - slot = "ring", - }, - { - -- dark wizard's crown - itemid = 22154, - type = "equip", - slot = "head", - }, - { - -- dark wizard's crown - itemid = 22154, - type = "deequip", - slot = "head", - }, - { - -- dark wizard's crown - itemid = 22153, - type = "equip", - slot = "head", - }, - { - -- dark wizard's crown - itemid = 22153, - type = "deequip", - slot = "head", - }, - { - -- enchanted werewolf amulet - itemid = 22134, - type = "equip", - slot = "necklace", - }, - { - -- enchanted werewolf amulet - itemid = 22134, - type = "deequip", - slot = "necklace", - }, - { - -- enchanted werewolf helmet - sword - itemid = 22132, - type = "equip", - slot = "necklace", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- enchanted werewolf helmet - sword - itemid = 22132, - type = "deequip", - slot = "necklace", - level = 100, - }, - { - -- enchanted werewolf helmet - ml - itemid = 22130, - type = "equip", - slot = "head", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- enchanted werewolf helmet - ml - itemid = 22130, - type = "deequip", - slot = "head", - level = 100, - }, - { - -- enchanted werewolf helmet - distance - itemid = 22129, - type = "equip", - slot = "head", - level = 100, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- enchanted werewolf helmet - distance - itemid = 22129, - type = "deequip", - slot = "head", - level = 100, - }, - { - -- enchanted werewolf helmet - club - itemid = 22128, - type = "equip", - slot = "head", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- enchanted werewolf helmet - club - itemid = 22128, - type = "deequip", - slot = "head", - level = 100, - }, - { - -- enchanted werewolf helmet - axe - itemid = 22127, - type = "equip", - slot = "head", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- enchanted werewolf helmet - axe - itemid = 22127, - type = "deequip", - slot = "head", - level = 100, - }, - { - -- wereboar loincloth - itemid = 22087, - type = "equip", - slot = "legs", - }, - { - -- wereboar loincloth - itemid = 22087, - type = "deequip", - slot = "legs", - }, - { - -- badger boots - itemid = 22086, - type = "equip", - slot = "feet", - level = 60, - }, - { - -- badger boots - itemid = 22086, - type = "deequip", - slot = "feet", - level = 60, - }, - { - -- fur armor - itemid = 22085, - type = "equip", - slot = "armor", - level = 50, - }, - { - -- fur armor - itemid = 22085, - type = "deequip", - slot = "armor", - level = 50, - }, - { - -- wolf backpack - itemid = 22084, - type = "equip", - slot = "backpack", - }, - { - -- wolf backpack - itemid = 22084, - type = "deequip", - slot = "backpack", - }, - { - -- werewolf helmet - itemid = 22062, - type = "equip", - slot = "head", - level = 100, - }, - { - -- werewolf helmet - itemid = 22062, - type = "deequip", - slot = "head", - level = 100, - }, - { - -- enchanted werewolf amulet - itemid = 22061, - type = "equip", - slot = "necklace", - }, - { - -- enchanted werewolf amulet - itemid = 22061, - type = "deequip", - slot = "necklace", - }, - { - -- werewolf amulet - itemid = 22060, - type = "equip", - slot = "necklace", - }, - { - -- werewolf amulet - itemid = 22060, - type = "deequip", - slot = "necklace", - }, - { - -- oriental shoes - itemid = 21981, - type = "equip", - slot = "feet", - level = 80, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- oriental shoes - itemid = 21981, - type = "deequip", - slot = "feet", - level = 80, - }, - { - -- sweetheart ring - itemid = 21955, - type = "equip", - slot = "ring", - }, - { - -- sweetheart ring - itemid = 21955, - type = "deequip", - slot = "ring", - }, - { - -- crest of the deep seas - itemid = 21892, - type = "equip", - slot = "head", - level = 80, - }, - { - -- crest of the deep seas - itemid = 21892, - type = "deequip", - slot = "head", - level = 80, - }, - { - -- brandon's wedding ring - itemid = 21745, - type = "equip", - slot = "ring", - }, - { - -- brandon's wedding ring - itemid = 21745, - type = "deequip", - slot = "ring", - }, - { - -- simple arrow - itemid = 21470, - type = "equip", - slot = "ammo", - }, - { - -- simple arrow - itemid = 21470, - type = "deequip", - slot = "ammo", - }, - { - -- war backpack - itemid = 21445, - type = "equip", - slot = "backpack", - }, - { - -- war backpack - itemid = 21445, - type = "deequip", - slot = "backpack", - }, - { - -- the Lion's Heart - itemid = 21439, - type = "equip", - slot = "necklace", - }, - { - -- the Lion's Heart - itemid = 21439, - type = "deequip", - slot = "necklace", - }, - { - -- shopping bag - itemid = 21411, - type = "equip", - slot = "backpack", - }, - { - -- shopping bag - itemid = 21411, - type = "deequip", - slot = "backpack", - }, - { - -- broken wooden shield - itemid = 21401, - type = "equip", - slot = "shield", - }, - { - -- broken wooden shield - itemid = 21401, - type = "deequip", - slot = "shield", - }, - { - -- spellbook of the novice - itemid = 21400, - type = "equip", - slot = "shield", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellbook of the novice - itemid = 21400, - type = "deequip", - slot = "shield", - }, - { - -- the chiller - itemid = 21350, - type = "equip", - slot = "hand", - level = 1, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- the chiller - itemid = 21350, - type = "deequip", - slot = "hand", - level = 1, - }, - { - -- the scorcher - itemid = 21348, - type = "equip", - slot = "hand", - level = 1, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- the scorcher - itemid = 21348, - type = "deequip", - slot = "hand", - level = 1, - }, - { - -- glooth backpack - itemid = 21295, - type = "equip", - slot = "backpack", - }, - { - -- glooth backpack - itemid = 21295, - type = "deequip", - slot = "backpack", - }, - { - -- feedbag - itemid = 21292, - type = "equip", - slot = "backpack", - }, - { - -- feedbag - itemid = 21292, - type = "deequip", - slot = "backpack", - }, - { - -- one hit wonder - itemid = 21219, - type = "equip", - slot = "hand", - level = 70, - }, - { - -- one hit wonder - itemid = 21219, - type = "deequip", - slot = "hand", - }, - { - -- glooth amulet - itemid = 21183, - type = "equip", - slot = "necklace", - level = 75, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- glooth amulet - itemid = 21183, - type = "deequip", - slot = "necklace", - level = 75, - }, - { - -- glooth axe - itemid = 21180, - type = "equip", - slot = "hand", - level = 75, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- glooth axe - itemid = 21180, - type = "deequip", - slot = "hand", - }, - { - -- glooth blade - itemid = 21179, - type = "equip", - slot = "hand", - level = 75, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- glooth blade - itemid = 21179, - type = "deequip", - slot = "hand", - }, - { - -- glooth club - itemid = 21178, - type = "equip", - slot = "hand", - level = 75, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- glooth club - itemid = 21178, - type = "deequip", - slot = "hand", - }, - { - -- cowtana - itemid = 21177, - type = "equip", - slot = "hand", - level = 25, - }, - { - -- cowtana - itemid = 21177, - type = "deequip", - slot = "hand", - level = 25, - }, - { - -- execowtioner axe - itemid = 21176, - type = "equip", - slot = "hand", - level = 55, - }, - { - -- execowtioner axe - itemid = 21176, - type = "deequip", - slot = "hand", - }, - { - -- mino shield - itemid = 21175, - type = "equip", - slot = "shield", - }, - { - -- mino shield - itemid = 21175, - type = "deequip", - slot = "shield", - }, - { - -- mino lance - itemid = 21174, - type = "equip", - slot = "hand", - level = 45, - }, - { - -- mino lance - itemid = 21174, - type = "deequip", - slot = "hand", - }, - { - -- moohtant cudgel - itemid = 21173, - type = "equip", - slot = "hand", - level = 60, - }, - { - -- moohtant cudgel - itemid = 21173, - type = "deequip", - slot = "hand", - }, - { - -- glooth whip - itemid = 21172, - type = "equip", - slot = "hand", - level = 25, - }, - { - -- glooth whip - itemid = 21172, - type = "deequip", - slot = "hand", - }, - { - -- metal bat - itemid = 21171, - type = "equip", - slot = "hand", - level = 55, - }, - { - -- metal bat - itemid = 21171, - type = "deequip", - slot = "hand", - }, - { - -- gearwheel chain - itemid = 21170, - type = "equip", - slot = "necklace", - level = 75, - }, - { - -- gearwheel chain - itemid = 21170, - type = "deequip", - slot = "necklace", - level = 75, - }, - { - -- metal spats - itemid = 21169, - type = "equip", - slot = "feet", - level = 50, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- metal spats - itemid = 21169, - type = "deequip", - slot = "feet", - level = 50, - }, - { - -- alloy legs - itemid = 21168, - type = "equip", - slot = "legs", - level = 60, - }, - { - -- alloy legs - itemid = 21168, - type = "deequip", - slot = "legs", - level = 60, - }, - { - -- heat core - itemid = 21167, - type = "equip", - slot = "armor", - }, - { - -- heat core - itemid = 21167, - type = "deequip", - slot = "armor", - }, - { - -- mooh'tah plate - itemid = 21166, - type = "equip", - slot = "armor", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- mooh'tah plate - itemid = 21166, - type = "deequip", - slot = "armor", - }, - { - -- rubber cap - itemid = 21165, - type = "equip", - slot = "head", - level = 70, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- rubber cap - itemid = 21165, - type = "deequip", - slot = "head", - level = 70, - }, - { - -- glooth cape - itemid = 21164, - type = "equip", - slot = "armor", - level = 40, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- glooth cape - itemid = 21164, - type = "deequip", - slot = "armor", - level = 40, - }, - { - -- glooth spear - itemid = 21158, - type = "equip", - slot = "hand", - level = 60, - }, - { - -- glooth spear - itemid = 21158, - type = "deequip", - slot = "hand", - level = 60, - }, - { - -- cake backpack - itemid = 20347, - type = "equip", - slot = "backpack", - }, - { - -- cake backpack - itemid = 20347, - type = "deequip", - slot = "backpack", - }, - { - -- unstable ring of ending - itemid = 20209, - type = "equip", - slot = "ring", - }, - { - -- unstable ring of ending - itemid = 20209, - type = "deequip", - slot = "ring", - }, - { - -- broken visor - itemid = 20184, - type = "equip", - slot = "head", - }, - { - -- broken visor - itemid = 20184, - type = "deequip", - slot = "head", - }, - { - -- ring of ending - itemid = 20182, - type = "equip", - slot = "ring", - level = 200, - }, - { - -- ring of ending - itemid = 20182, - type = "deequip", - slot = "ring", - level = 200, - }, - { - -- eerie song book - itemid = 20140, - type = "equip", - slot = "shield", - }, - { - -- eerie song book - itemid = 20140, - type = "deequip", - slot = "shield", - }, - { - -- umbral master spellbook - itemid = 20090, - type = "equip", - slot = "shield", - level = 250, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- umbral master spellbook - itemid = 20090, - type = "deequip", - slot = "shield", - level = 250, - }, - { - -- umbral spellbook - itemid = 20089, - type = "equip", - slot = "shield", - level = 150, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- umbral spellbook - itemid = 20089, - type = "deequip", - slot = "shield", - level = 150, - }, - { - -- crude umbral spellbook - itemid = 20088, - type = "equip", - slot = "shield", - level = 75, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- crude umbral spellbook - itemid = 20088, - type = "deequip", - slot = "shield", - level = 75, - }, - { - -- umbral master crossbow - itemid = 20087, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- umbral master crossbow - itemid = 20087, - type = "deequip", - slot = "hand", - }, - { - -- umbral crossbow - itemid = 20086, - type = "equip", - slot = "hand", - level = 120, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- umbral crossbow - itemid = 20086, - type = "deequip", - slot = "hand", - }, - { - -- crude umbral crossbow - itemid = 20085, - type = "equip", - slot = "hand", - level = 75, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- crude umbral crossbow - itemid = 20085, - type = "deequip", - slot = "hand", - }, - { - -- umbral master bow - itemid = 20084, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- umbral master bow - itemid = 20084, - type = "deequip", - slot = "hand", - }, - { - -- umbral bow - itemid = 20083, - type = "equip", - slot = "hand", - level = 120, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- umbral bow - itemid = 20083, - type = "deequip", - slot = "hand", - }, - { - -- crude umbral bow - itemid = 20082, - type = "equip", - slot = "hand", - level = 75, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- crude umbral bow - itemid = 20082, - type = "deequip", - slot = "hand", - }, - { - -- umbral master hammer - itemid = 20081, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral master hammer - itemid = 20081, - type = "deequip", - slot = "hand", - }, - { - -- umbral hammer - itemid = 20080, - type = "equip", - slot = "hand", - level = 120, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral hammer - itemid = 20080, - type = "deequip", - slot = "hand", - }, - { - -- crude umbral hammer - itemid = 20079, - type = "equip", - slot = "hand", - level = 75, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crude umbral hammer - itemid = 20079, - type = "deequip", - slot = "hand", - }, - { - -- umbral master mace - itemid = 20078, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral master mace - itemid = 20078, - type = "deequip", - slot = "hand", - }, - { - -- umbral mace - itemid = 20077, - type = "equip", - slot = "hand", - level = 120, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral mace - itemid = 20077, - type = "deequip", - slot = "hand", - }, - { - -- crude umbral mace - itemid = 20076, - type = "equip", - slot = "hand", - level = 75, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crude umbral mace - itemid = 20076, - type = "deequip", - slot = "hand", - }, - { - -- umbral master chopper - itemid = 20075, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral master chopper - itemid = 20075, - type = "deequip", - slot = "hand", - }, - { - -- umbral chopper - itemid = 20074, - type = "equip", - slot = "hand", - level = 120, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral chopper - itemid = 20074, - type = "deequip", - slot = "hand", - }, - { - -- crude umbral chopper - itemid = 20073, - type = "equip", - slot = "hand", - level = 75, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crude umbral chopper - itemid = 20073, - type = "deequip", - slot = "hand", - }, - { - -- umbral master axe - itemid = 20072, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral master axe - itemid = 20072, - type = "deequip", - slot = "hand", - }, - { - -- umbral axe - itemid = 20071, - type = "equip", - slot = "hand", - level = 120, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral axe - itemid = 20071, - type = "deequip", - slot = "hand", - }, - { - -- crude umbral axe - itemid = 20070, - type = "equip", - slot = "hand", - level = 75, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crude umbral axe - itemid = 20070, - type = "deequip", - slot = "hand", - }, - { - -- umbral master slayer - itemid = 20069, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral master slayer - itemid = 20069, - type = "deequip", - slot = "hand", - }, - { - -- umbral slayer - itemid = 20068, - type = "equip", - slot = "hand", - level = 120, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral slayer - itemid = 20068, - type = "deequip", - slot = "hand", - }, - { - -- crude umbral slayer - itemid = 20067, - type = "equip", - slot = "hand", - level = 75, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crude umbral slayer - itemid = 20067, - type = "deequip", - slot = "hand", - level = 75, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral masterblade - itemid = 20066, - type = "equip", - slot = "hand", - level = 250, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral masterblade - itemid = 20066, - type = "deequip", - slot = "hand", - }, - { - -- umbral blade - itemid = 20065, - type = "equip", - slot = "hand", - level = 120, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral blade - itemid = 20065, - type = "deequip", - slot = "hand", - }, - { - -- crude umbral blade - itemid = 20064, - type = "equip", - slot = "hand", - level = 75, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crude umbral blade - itemid = 20064, - type = "deequip", - slot = "hand", - level = 75, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- strange good night songs - itemid = 20050, - type = "equip", - slot = "shield", - }, - { - -- strange good night songs - itemid = 20050, - type = "deequip", - slot = "shield", - }, - { - -- furious frock - itemid = 19391, - type = "equip", - slot = "armor", - level = 130, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- furious frock - itemid = 19391, - type = "deequip", - slot = "armor", - level = 130, - }, - { - -- vampire silk slippers - itemid = 19374, - type = "equip", - slot = "feet", - }, - { - -- vampire silk slippers - itemid = 19374, - type = "deequip", - slot = "feet", - }, - { - -- haunted mirror piece - itemid = 19373, - type = "equip", - slot = "shield", - }, - { - -- haunted mirror piece - itemid = 19373, - type = "deequip", - slot = "shield", - }, - { - -- goo shell - itemid = 19372, - type = "equip", - slot = "armor", - }, - { - -- goo shell - itemid = 19372, - type = "deequip", - slot = "armor", - }, - { - -- icy culottes - itemid = 19366, - type = "equip", - slot = "legs", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- icy culottes - itemid = 19366, - type = "deequip", - slot = "legs", - }, - { - -- runic ice shield - itemid = 19363, - type = "equip", - slot = "shield", - }, - { - -- runic ice shield - itemid = 19363, - type = "deequip", - slot = "shield", - }, - { - -- icicle bow - itemid = 19362, - type = "equip", - slot = "hand", - }, - { - -- icicle bow - itemid = 19362, - type = "deequip", - slot = "hand", - }, - { - -- horn - itemid = 19359, - type = "equip", - slot = "ring", - }, - { - -- horn - itemid = 19359, - type = "deequip", - slot = "ring", - }, - { - -- albino plate - itemid = 19358, - type = "equip", - slot = "armor", - }, - { - -- albino plate - itemid = 19358, - type = "deequip", - slot = "armor", - }, - { - -- shrunken head necklace - itemid = 19357, - type = "equip", - slot = "necklace", - level = 150, - }, - { - -- shrunken head necklace - itemid = 19357, - type = "deequip", - slot = "necklace", - level = 150, - }, - { - -- triple bolt crossbow - itemid = 19356, - type = "equip", - slot = "hand", - level = 70, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- triple bolt crossbow - itemid = 19356, - type = "deequip", - slot = "hand", - }, - { - -- pannier backpack - itemid = 19159, - type = "equip", - slot = "backpack", - }, - { - -- pannier backpack - itemid = 19159, - type = "deequip", - slot = "backpack", - }, - { - -- friendship amulet - itemid = 19153, - type = "equip", - slot = "necklace", - }, - { - -- friendship amulet - itemid = 19153, - type = "deequip", - slot = "necklace", - }, - { - -- vampire's signet ring - itemid = 18935, - type = "equip", - slot = "ring", - }, - { - -- vampire's signet ring - itemid = 18935, - type = "deequip", - slot = "ring", - }, - { - -- spiky club - itemid = 17859, - type = "equip", - slot = "hand", - level = 20, - }, - { - -- spiky club - itemid = 17859, - type = "deequip", - slot = "hand", - }, - { - -- helmet of the lost - itemid = 17852, - type = "equip", - slot = "head", - }, - { - -- helmet of the lost - itemid = 17852, - type = "deequip", - slot = "head", - }, - { - -- leather harness - itemid = 17846, - type = "equip", - slot = "armor", - }, - { - -- leather harness - itemid = 17846, - type = "deequip", - slot = "armor", - }, - { - -- buckle - itemid = 17829, - type = "equip", - slot = "armor", - }, - { - -- buckle - itemid = 17829, - type = "deequip", - slot = "armor", - }, - { - -- pair of iron fists - itemid = 17828, - type = "equip", - slot = "hand", - level = 50, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- pair of iron fists - itemid = 17828, - type = "deequip", - slot = "hand", - }, - { - -- swampling club - itemid = 17824, - type = "equip", - slot = "hand", - }, - { - -- swampling club - itemid = 17824, - type = "deequip", - slot = "hand", - }, - { - -- life preserver - itemid = 17813, - type = "equip", - slot = "hand", - level = 20, - }, - { - -- life preserver - itemid = 17813, - type = "deequip", - slot = "hand", - }, - { - -- ratana - itemid = 17812, - type = "equip", - slot = "hand", - level = 15, - }, - { - -- ratana - itemid = 17812, - type = "deequip", - slot = "hand", - }, - { - -- spike shield - itemid = 17810, - type = "equip", - slot = "shield", - }, - { - -- spike shield - itemid = 17810, - type = "deequip", - slot = "shield", - }, - { - -- sorc and druid staff - itemid = 17111, - type = "equip", - slot = "hand", - level = 1, - vocation = { - { "None", true }, - }, - }, - { - -- sorc and druid staff - itemid = 17111, - type = "deequip", - slot = "hand", - level = 1, - }, - { - -- mean paladin spear - itemid = 17110, - type = "equip", - slot = "hand", - vocation = { - { "None", true }, - }, - }, - { - -- mean paladin spear - itemid = 17110, - type = "deequip", - slot = "hand", - vocation = { - { "None", true }, - }, - }, - { - -- mean knight sword - itemid = 17109, - type = "equip", - slot = "hand", - vocation = { - { "None", true }, - }, - }, - { - -- mean knight sword - itemid = 17109, - type = "deequip", - slot = "hand", - }, - { - -- prismatic ring - itemid = 16264, - type = "equip", - slot = "ring", - level = 120, - }, - { - -- prismatic ring - itemid = 16264, - type = "deequip", - slot = "ring", - level = 120, - }, - { - -- shiny blade - itemid = 16175, - type = "equip", - slot = "hand", - level = 120, - }, - { - -- shiny blade - itemid = 16175, - type = "deequip", - slot = "hand", - }, - { - -- mycological bow - itemid = 16164, - type = "equip", - slot = "hand", - level = 105, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- mycological bow - itemid = 16164, - type = "deequip", - slot = "hand", - }, - { - -- crystal crossbow - itemid = 16163, - type = "equip", - slot = "hand", - level = 90, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- crystal crossbow - itemid = 16163, - type = "deequip", - slot = "hand", - }, - { - -- mycological mace - itemid = 16162, - type = "equip", - slot = "hand", - level = 120, - }, - { - -- mycological mace - itemid = 16162, - type = "deequip", - slot = "hand", - }, - { - -- crystalline axe - itemid = 16161, - type = "equip", - slot = "hand", - level = 120, - }, - { - -- crystalline axe - itemid = 16161, - type = "deequip", - slot = "hand", - }, - { - -- crystalline sword - itemid = 16160, - type = "equip", - slot = "hand", - level = 62, - }, - { - -- crystalline sword - itemid = 16160, - type = "deequip", - slot = "hand", - }, - { - -- envenomed arrow - itemid = 16143, - type = "equip", - slot = "ammo", - }, - { - -- envenomed arrow - itemid = 16143, - type = "deequip", - slot = "ammo", - }, - { - -- drill bolt - itemid = 16142, - type = "equip", - slot = "ammo", - }, - { - -- drill bolt - itemid = 16142, - type = "deequip", - slot = "ammo", - }, - { - -- prismatic bolt - itemid = 16141, - type = "equip", - slot = "ammo", - }, - { - -- prismatic bolt - itemid = 16141, - type = "deequip", - slot = "ammo", - }, - { - -- glacial rod - itemid = 16118, - type = "equip", - slot = "hand", - level = 65, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- glacial rod - itemid = 16118, - type = "deequip", - slot = "hand", - level = 65, - }, - { - -- muck rod - itemid = 16117, - type = "equip", - slot = "hand", - level = 65, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- muck rod - itemid = 16117, - type = "deequip", - slot = "hand", - level = 65, - }, - { - -- prismatic shield - itemid = 16116, - type = "equip", - slot = "shield", - level = 150, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- prismatic shield - itemid = 16116, - type = "deequip", - slot = "shield", - level = 150, - }, - { - -- wand of everblazing - itemid = 16115, - type = "equip", - slot = "hand", - level = 65, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of everblazing - itemid = 16115, - type = "deequip", - slot = "hand", - level = 65, - }, - { - -- prismatic ring - itemid = 16114, - type = "equip", - slot = "ring", - level = 120, - }, - { - -- prismatic ring - itemid = 16114, - type = "deequip", - slot = "ring", - level = 120, - }, - { - -- prismatic necklace - itemid = 16113, - type = "equip", - slot = "necklace", - level = 150, - }, - { - -- prismatic necklace - itemid = 16113, - type = "deequip", - slot = "necklace", - level = 150, - }, - { - -- prismatic boots - itemid = 16112, - type = "equip", - slot = "feet", - level = 150, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- prismatic boots - itemid = 16112, - type = "deequip", - slot = "feet", - level = 150, - }, - { - -- prismatic legs - itemid = 16111, - type = "equip", - slot = "legs", - level = 150, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- prismatic legs - itemid = 16111, - type = "deequip", - slot = "legs", - level = 150, - }, - { - -- prismatic armor - itemid = 16110, - type = "equip", - slot = "armor", - level = 120, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- prismatic armor - itemid = 16110, - type = "deequip", - slot = "armor", - level = 120, - }, - { - -- prismatic helmet - itemid = 16109, - type = "equip", - slot = "head", - level = 150, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- prismatic helmet - itemid = 16109, - type = "deequip", - slot = "head", - level = 150, - }, - { - -- gill necklace - itemid = 16108, - type = "equip", - slot = "necklace", - level = 150, - }, - { - -- gill necklace - itemid = 16108, - type = "deequip", - slot = "necklace", - level = 150, - }, - { - -- spellbook of vigilance - itemid = 16107, - type = "equip", - slot = "shield", - level = 130, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellbook of vigilance - itemid = 16107, - type = "deequip", - slot = "shield", - level = 130, - }, - { - -- gill legs - itemid = 16106, - type = "equip", - slot = "legs", - level = 150, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- gill legs - itemid = 16106, - type = "deequip", - slot = "legs", - level = 150, - }, - { - -- gill coat - itemid = 16105, - type = "equip", - slot = "armor", - level = 150, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- gill coat - itemid = 16105, - type = "deequip", - slot = "armor", - level = 150, - }, - { - -- gill gugel - itemid = 16104, - type = "equip", - slot = "head", - level = 150, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- gill gugel - itemid = 16104, - type = "deequip", - slot = "head", - level = 150, - }, - { - -- crystal backpack - itemid = 16100, - type = "equip", - slot = "backpack", - }, - { - -- crystal backpack - itemid = 16100, - type = "deequip", - slot = "backpack", - }, - { - -- mushroom backpack - itemid = 16099, - type = "equip", - slot = "backpack", - }, - { - -- mushroom backpack - itemid = 16099, - type = "deequip", - slot = "backpack", - }, - { - -- wand of defiance - itemid = 16096, - type = "equip", - slot = "hand", - level = 65, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of defiance - itemid = 16096, - type = "deequip", - slot = "hand", - level = 65, - }, - { - -- crystalline arrow - itemid = 15793, - type = "equip", - slot = "ammo", - }, - { - -- crystalline arrow - itemid = 15793, - type = "deequip", - slot = "ammo", - }, - { - -- crystal bolt - itemid = 15792, - type = "equip", - slot = "ammo", - }, - { - -- crystal bolt - itemid = 15792, - type = "deequip", - slot = "ammo", - }, - { - -- spellbook of ancient arcana - itemid = 14769, - type = "equip", - slot = "shield", - level = 150, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellbook of ancient arcana - itemid = 14769, - type = "deequip", - slot = "shield", - level = 150, - }, - { - -- thorn spitter - itemid = 14768, - type = "equip", - slot = "hand", - level = 150, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- thorn spitter - itemid = 14768, - type = "deequip", - slot = "hand", - }, - { - -- mathmaster shield - itemid = 14761, - type = "equip", - slot = "shield", - }, - { - -- mathmaster shield - itemid = 14761, - type = "deequip", - slot = "shield", - }, - { - -- mathmaster shield - itemid = 14760, - type = "equip", - slot = "shield", - }, - { - -- mathmaster shield - itemid = 14760, - type = "deequip", - slot = "shield", - }, - { - -- anniversary backpack - itemid = 14674, - type = "equip", - slot = "backpack", - }, - { - -- anniversary backpack - itemid = 14674, - type = "deequip", - slot = "backpack", - }, - { - -- vortex bolt - itemid = 14252, - type = "equip", - slot = "ammo", - }, - { - -- vortex bolt - itemid = 14252, - type = "deequip", - slot = "ammo", - }, - { - -- tarsal arrow - itemid = 14251, - type = "equip", - slot = "ammo", - }, - { - -- tarsal arrow - itemid = 14251, - type = "deequip", - slot = "ammo", - }, - { - -- deepling squelcher - itemid = 14250, - type = "equip", - slot = "hand", - level = 48, - }, - { - -- deepling squelcher - itemid = 14250, - type = "deequip", - slot = "hand", - }, - { - -- buggy backpack - itemid = 14249, - type = "equip", - slot = "backpack", - }, - { - -- buggy backpack - itemid = 14249, - type = "deequip", - slot = "backpack", - }, - { - -- deepling backpack - itemid = 14248, - type = "equip", - slot = "backpack", - }, - { - -- deepling backpack - itemid = 14248, - type = "deequip", - slot = "backpack", - }, - { - -- ornate crossbow - itemid = 14247, - type = "equip", - slot = "hand", - level = 50, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- ornate crossbow - itemid = 14247, - type = "deequip", - slot = "hand", - }, - { - -- hive bow - itemid = 14246, - type = "equip", - slot = "hand", - level = 85, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- hive bow - itemid = 14246, - type = "deequip", - slot = "hand", - }, - { - -- hive scythe - itemid = 14089, - type = "equip", - slot = "hand", - level = 70, - }, - { - -- hive scythe - itemid = 14089, - type = "deequip", - slot = "hand", - }, - { - -- carapace shield - itemid = 14088, - type = "equip", - slot = "shield", - }, - { - -- carapace shield - itemid = 14088, - type = "deequip", - slot = "shield", - }, - { - -- grasshopper legs - itemid = 14087, - type = "equip", - slot = "legs", - level = 75, - }, - { - -- grasshopper legs - itemid = 14087, - type = "deequip", - slot = "legs", - level = 75, - }, - { - -- calopteryx cape - itemid = 14086, - type = "equip", - slot = "armor", - level = 80, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- calopteryx cape - itemid = 14086, - type = "deequip", - slot = "armor", - level = 80, - }, - { - -- guardian axe - itemid = 14043, - type = "equip", - slot = "hand", - level = 50, - }, - { - -- guardian axe - itemid = 14043, - type = "deequip", - slot = "hand", - }, - { - -- warrior's shield - itemid = 14042, - type = "equip", - slot = "shield", - }, - { - -- warrior's shield - itemid = 14042, - type = "deequip", - slot = "shield", - }, - { - -- warrior's axe - itemid = 14040, - type = "equip", - slot = "hand", - level = 40, - }, - { - -- warrior's axe - itemid = 14040, - type = "deequip", - slot = "hand", - }, - { - -- ornate mace - itemid = 14001, - type = "equip", - slot = "hand", - level = 90, - }, - { - -- ornate mace - itemid = 14001, - type = "deequip", - slot = "hand", - }, - { - -- ornate shield - itemid = 14000, - type = "equip", - slot = "shield", - level = 130, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- ornate shield - itemid = 14000, - type = "deequip", - slot = "shield", - level = 130, - }, - { - -- ornate legs - itemid = 13999, - type = "equip", - slot = "legs", - level = 185, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- ornate legs - itemid = 13999, - type = "deequip", - slot = "legs", - level = 185, - }, - { - -- depth scutum - itemid = 13998, - type = "equip", - slot = "shield", - level = 120, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- depth scutum - itemid = 13998, - type = "deequip", - slot = "shield", - level = 120, - }, - { - -- depth calcei - itemid = 13997, - type = "equip", - slot = "feet", - level = 150, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- depth calcei - itemid = 13997, - type = "deequip", - slot = "feet", - level = 150, - }, - { - -- depth ocrea - itemid = 13996, - type = "equip", - slot = "legs", - level = 130, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- depth ocrea - itemid = 13996, - type = "deequip", - slot = "legs", - level = 130, - }, - { - -- depth galea - itemid = 13995, - type = "equip", - slot = "head", - level = 150, - }, - { - -- depth galea - itemid = 13995, - type = "deequip", - slot = "head", - level = 150, - }, - { - -- depth lorica - itemid = 13994, - type = "equip", - slot = "armor", - level = 150, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- depth lorica - itemid = 13994, - type = "deequip", - slot = "armor", - level = 150, - }, - { - -- ornate chestplate - itemid = 13993, - type = "equip", - slot = "armor", - level = 200, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- ornate chestplate - itemid = 13993, - type = "deequip", - slot = "armor", - level = 200, - }, - { - -- deepling axe - itemid = 13991, - type = "equip", - slot = "hand", - level = 80, - }, - { - -- deepling axe - itemid = 13991, - type = "deequip", - slot = "hand", - }, - { - -- necklace of the deep - itemid = 13990, - type = "equip", - slot = "necklace", - level = 120, - }, - { - -- necklace of the deep - itemid = 13990, - type = "deequip", - slot = "necklace", - level = 120, - }, - { - -- deepling staff - itemid = 13987, - type = "equip", - slot = "hand", - level = 38, - }, - { - -- deepling staff - itemid = 13987, - type = "deequip", - slot = "hand", - }, - { - -- the Epic Wisdom - itemid = 12810, - type = "equip", - slot = "head", - }, - { - -- the Epic Wisdom - itemid = 12810, - type = "deequip", - slot = "head", - }, - { - -- the Epic Wisdom - itemid = 12809, - type = "equip", - slot = "head", - }, - { - -- the Epic Wisdom - itemid = 12809, - type = "deequip", - slot = "head", - }, - { - -- shimmer wand - itemid = 12741, - type = "equip", - slot = "hand", - level = 40, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- shimmer wand - itemid = 12741, - type = "deequip", - slot = "hand", - level = 40, - }, - { - -- broken ring of ending - itemid = 12737, - type = "equip", - slot = "ring", - }, - { - -- broken ring of ending - itemid = 12737, - type = "deequip", - slot = "ring", - }, - { - -- shimmer bow - itemid = 12733, - type = "equip", - slot = "hand", - level = 40, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- shimmer bow - itemid = 12733, - type = "deequip", - slot = "hand", - }, - { - -- shimmer rod - itemid = 12732, - type = "equip", - slot = "hand", - level = 40, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- shimmer rod - itemid = 12732, - type = "deequip", - slot = "hand", - level = 40, - }, - { - -- shimmer sword - itemid = 12731, - type = "equip", - slot = "hand", - level = 40, - }, - { - -- shimmer sword - itemid = 12731, - type = "deequip", - slot = "hand", - }, - { - -- heavy trident - itemid = 12683, - type = "equip", - slot = "hand", - level = 25, - }, - { - -- heavy trident - itemid = 12683, - type = "deequip", - slot = "hand", - }, - { - -- wooden sword - itemid = 12673, - type = "equip", - slot = "hand", - }, - { - -- wooden sword - itemid = 12673, - type = "deequip", - slot = "hand", - }, - { - -- star ring - itemid = 12670, - type = "equip", - slot = "ring", - vocation = { - { "None", true }, - }, - }, - { - -- star ring - itemid = 12670, - type = "deequip", - slot = "ring", - vocation = { - { "None", true }, - }, - }, - { - -- star ring - itemid = 12669, - type = "equip", - slot = "ring", - vocation = { - { "None", true }, - }, - }, - { - -- star ring - itemid = 12669, - type = "deequip", - slot = "ring", - vocation = { - { "None", true }, - }, - }, - { - -- wand of dimensions - itemid = 12603, - type = "equip", - slot = "hand", - level = 37, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of dimensions - itemid = 12603, - type = "deequip", - slot = "hand", - level = 37, - }, - { - -- mage's cap - itemid = 12599, - type = "equip", - slot = "head", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- mage's cap - itemid = 12599, - type = "deequip", - slot = "head", - }, - { - -- fish tail (equipped) - itemid = 11543, - type = "equip", - slot = "feet", - }, - { - -- fish tail (equipped) - itemid = 11543, - type = "deequip", - slot = "feet", - }, - { - -- golden hyena pendant - itemid = 12543, - type = "equip", - slot = "necklace", - }, - { - -- golden hyena pendant - itemid = 12543, - type = "deequip", - slot = "necklace", - }, - { - -- golden scorpion pendant - itemid = 12542, - type = "equip", - slot = "necklace", - }, - { - -- golden scorpion pendant - itemid = 12542, - type = "deequip", - slot = "necklace", - }, - { - -- old cape - itemid = 11701, - type = "equip", - slot = "armor", - }, - { - -- old cape - itemid = 11701, - type = "deequip", - slot = "armor", - }, - { - -- sedge hat - itemid = 11700, - type = "equip", - slot = "head", - }, - { - -- sedge hat - itemid = 11700, - type = "deequip", - slot = "head", - }, - { - -- loot bag - itemid = 11698, - type = "equip", - slot = "backpack", - }, - { - -- loot bag - itemid = 11698, - type = "deequip", - slot = "backpack", - }, - { - -- blade of corruption - itemid = 11693, - type = "equip", - slot = "hand", - level = 82, - }, - { - -- blade of corruption - itemid = 11693, - type = "deequip", - slot = "hand", - level = 82, - }, - { - -- snake god's sceptre - itemid = 11692, - type = "equip", - slot = "hand", - level = 82, - }, - { - -- snake god's sceptre - itemid = 11692, - type = "deequip", - slot = "hand", - }, - { - -- snake god's wristguard - itemid = 11691, - type = "equip", - slot = "shield", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- snake god's wristguard - itemid = 11691, - type = "deequip", - slot = "shield", - level = 100, - }, - { - -- draken boots - itemid = 4033, - type = "equip", - slot = "feet", - level = 80, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- draken boots - itemid = 4033, - type = "deequip", - slot = "feet", - level = 80, - }, - { - -- elite draken helmet - itemid = 11689, - type = "equip", - slot = "head", - level = 100, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- elite draken helmet - itemid = 11689, - type = "deequip", - slot = "head", - level = 100, - }, - { - -- shield of corruption - itemid = 11688, - type = "equip", - slot = "shield", - level = 80, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- shield of corruption - itemid = 11688, - type = "deequip", - slot = "shield", - level = 80, - }, - { - -- royal scale robe - itemid = 11687, - type = "equip", - slot = "armor", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- royal scale robe - itemid = 11687, - type = "deequip", - slot = "armor", - level = 100, - }, - { - -- royal draken mail - itemid = 11686, - type = "equip", - slot = "armor", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- royal draken mail - itemid = 11686, - type = "deequip", - slot = "armor", - level = 100, - }, - { - -- cobra crown - itemid = 11674, - type = "equip", - slot = "head", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- cobra crown - itemid = 11674, - type = "deequip", - slot = "head", - }, - { - -- twiceslicer - itemid = 11657, - type = "equip", - slot = "hand", - level = 58, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- twiceslicer - itemid = 11657, - type = "deequip", - slot = "hand", - }, - { - -- elite draken mail - itemid = 11651, - type = "equip", - slot = "armor", - level = 100, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- elite draken mail - itemid = 11651, - type = "deequip", - slot = "armor", - level = 100, - }, - { - -- fish tail (unequipped) - itemid = 11542, - type = "equip", - slot = "feet", - }, - { - -- fish tail (unequipped) - itemid = 11542, - type = "deequip", - slot = "feet", - }, - { - -- ornamented brooch - itemid = 11468, - type = "equip", - slot = "necklace", - }, - { - -- ornamented brooch - itemid = 11468, - type = "deequip", - slot = "necklace", - }, - { - -- lucky clover amulet - itemid = 10476, - type = "equip", - slot = "necklace", - }, - { - -- lucky clover amulet - itemid = 10476, - type = "deequip", - slot = "necklace", - }, - { - -- beetle necklace - itemid = 10457, - type = "equip", - slot = "necklace", - }, - { - -- beetle necklace - itemid = 10457, - type = "deequip", - slot = "necklace", - }, - { - -- jade hat - itemid = 10451, - type = "equip", - slot = "head", - level = 60, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- jade hat - itemid = 10451, - type = "deequip", - slot = "head", - level = 60, - }, - { - -- Zaoan robe - itemid = 10439, - type = "equip", - slot = "armor", - level = 60, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- Zaoan robe - itemid = 10439, - type = "deequip", - slot = "armor", - level = 60, - }, - { - -- spellweaver's robe - itemid = 10438, - type = "equip", - slot = "armor", - level = 60, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellweaver's robe - itemid = 10438, - type = "deequip", - slot = "armor", - level = 60, - }, - { - -- wailing widow's necklace - itemid = 10412, - type = "equip", - slot = "necklace", - }, - { - -- wailing widow's necklace - itemid = 10412, - type = "deequip", - slot = "necklace", - }, - { - -- Zaoan halberd - itemid = 10406, - type = "equip", - slot = "hand", - level = 25, - }, - { - -- Zaoan halberd - itemid = 10406, - type = "deequip", - slot = "hand", - }, - { - -- twin hooks - itemid = 10392, - type = "equip", - slot = "hand", - level = 20, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- twin hooks - itemid = 10392, - type = "deequip", - slot = "hand", - }, - { - -- drachaku - itemid = 10391, - type = "equip", - slot = "hand", - level = 55, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- drachaku - itemid = 10391, - type = "deequip", - slot = "hand", - }, - { - -- Zaoan sword - itemid = 10390, - type = "equip", - slot = "hand", - level = 55, - }, - { - -- Zaoan sword - itemid = 10390, - type = "deequip", - slot = "hand", - }, - { - -- sai - itemid = 10389, - type = "equip", - slot = "hand", - level = 50, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sai - itemid = 10389, - type = "deequip", - slot = "hand", - }, - { - -- drakinata - itemid = 10388, - type = "equip", - slot = "hand", - level = 60, - }, - { - -- drakinata - itemid = 10388, - type = "deequip", - slot = "hand", - }, - { - -- Zaoan legs - itemid = 10387, - type = "equip", - slot = "legs", - }, - { - -- Zaoan legs - itemid = 10387, - type = "deequip", - slot = "legs", - }, - { - -- zaoan shoes - itemid = 10386, - type = "equip", - slot = "feet", - }, - { - -- zaoan shoes - itemid = 10386, - type = "deequip", - slot = "feet", - }, - { - -- Zaoan helmet - itemid = 10385, - type = "equip", - slot = "head", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- Zaoan helmet - itemid = 10385, - type = "deequip", - slot = "head", - }, - { - -- Zaoan armor - itemid = 10384, - type = "equip", - slot = "armor", - level = 50, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- Zaoan armor - itemid = 10384, - type = "deequip", - slot = "armor", - level = 50, - }, - { - -- santa backpack - itemid = 10346, - type = "equip", - slot = "backpack", - }, - { - -- santa backpack - itemid = 10346, - type = "deequip", - slot = "backpack", - }, - { - -- minotaur backpack - itemid = 10327, - type = "equip", - slot = "backpack", - }, - { - -- minotaur backpack - itemid = 10327, - type = "deequip", - slot = "backpack", - }, - { - -- dragon backpack - itemid = 10326, - type = "equip", - slot = "backpack", - }, - { - -- dragon backpack - itemid = 10326, - type = "deequip", - slot = "backpack", - }, - { - -- expedition bag - itemid = 10325, - type = "equip", - slot = "backpack", - }, - { - -- expedition bag - itemid = 10325, - type = "deequip", - slot = "backpack", - }, - { - -- expedition backpack - itemid = 10324, - type = "equip", - slot = "backpack", - }, - { - -- expedition backpack - itemid = 10324, - type = "deequip", - slot = "backpack", - }, - { - -- guardian boots - itemid = 10323, - type = "equip", - slot = "feet", - level = 70, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- guardian boots - itemid = 10323, - type = "deequip", - slot = "feet", - level = 70, - }, - { - -- heart backpack - itemid = 10202, - type = "equip", - slot = "backpack", - }, - { - -- heart backpack - itemid = 10202, - type = "deequip", - slot = "backpack", - }, - { - -- dragon scale boots - itemid = 10201, - type = "equip", - slot = "feet", - level = 70, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- dragon scale boots - itemid = 10201, - type = "deequip", - slot = "feet", - level = 70, - }, - { - -- crystal boots - itemid = 10200, - type = "equip", - slot = "feet", - level = 70, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- crystal boots - itemid = 10200, - type = "deequip", - slot = "feet", - level = 70, - }, - { - -- witch hat - itemid = 9653, - type = "equip", - slot = "head", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- witch hat - itemid = 9653, - type = "deequip", - slot = "head", - }, - { - -- crown backpack - itemid = 9605, - type = "equip", - slot = "backpack", - }, - { - -- crown backpack - itemid = 9605, - type = "deequip", - slot = "backpack", - }, - { - -- moon backpack - itemid = 9604, - type = "equip", - slot = "backpack", - }, - { - -- moon backpack - itemid = 9604, - type = "deequip", - slot = "backpack", - }, - { - -- orange bag - itemid = 9603, - type = "equip", - slot = "backpack", - }, - { - -- orange bag - itemid = 9603, - type = "deequip", - slot = "backpack", - }, - { - -- orange backpack - itemid = 9602, - type = "equip", - slot = "backpack", - }, - { - -- orange backpack - itemid = 9602, - type = "deequip", - slot = "backpack", - }, - { - -- demon backpack - itemid = 9601, - type = "equip", - slot = "backpack", - }, - { - -- demon backpack - itemid = 9601, - type = "deequip", - slot = "backpack", - }, - { - -- broken wedding ring - itemid = 9593, - type = "equip", - slot = "ring", - }, - { - -- broken wedding ring - itemid = 9593, - type = "deequip", - slot = "ring", - }, - { - -- engraved wedding ring - itemid = 9585, - type = "equip", - slot = "ring", - }, - { - -- engraved wedding ring - itemid = 9585, - type = "deequip", - slot = "ring", - }, - { - -- the shield Nevermourn - itemid = 9447, - type = "equip", - slot = "shield", - }, - { - -- the shield Nevermourn - itemid = 9447, - type = "deequip", - slot = "shield", - }, - { - -- the rain coat - itemid = 9446, - type = "equip", - slot = "armor", - }, - { - -- the rain coat - itemid = 9446, - type = "deequip", - slot = "armor", - }, - { - -- the shield Nevermourn - itemid = 9401, - type = "equip", - slot = "shield", - }, - { - -- the shield Nevermourn - itemid = 9401, - type = "deequip", - slot = "shield", - }, - { - -- the rain coat - itemid = 9400, - type = "equip", - slot = "armor", - }, - { - -- the rain coat - itemid = 9400, - type = "deequip", - slot = "armor", - }, - { - -- mighty helm of green sparks - itemid = 9399, - type = "equip", - slot = "head", - }, - { - -- mighty helm of green sparks - itemid = 9399, - type = "deequip", - slot = "head", - }, - { - -- incredible mumpiz slayer - itemid = 9396, - type = "equip", - slot = "hand", - }, - { - -- incredible mumpiz slayer - itemid = 9396, - type = "deequip", - slot = "hand", - }, - { - -- claw of 'The Noxious Spawn' - itemid = 9394, - type = "equip", - slot = "ring", - level = 100, - }, - { - -- claw of 'The Noxious Spawn' - itemid = 9394, - type = "deequip", - slot = "ring", - level = 100, - }, - { - -- claw of 'The Noxious Spawn' - itemid = 9392, - type = "equip", - slot = "ring", - level = 100, - }, - { - -- claw of 'The Noxious Spawn' - itemid = 9392, - type = "deequip", - slot = "ring", - level = 100, - }, - { - -- poet's fencing quill - itemid = 9387, - type = "equip", - slot = "hand", - }, - { - -- poet's fencing quill - itemid = 9387, - type = "deequip", - slot = "hand", - }, - { - -- farmer's avenger - itemid = 9386, - type = "equip", - slot = "hand", - }, - { - -- farmer's avenger - itemid = 9386, - type = "deequip", - slot = "hand", - }, - { - -- club of the fury - itemid = 9385, - type = "equip", - slot = "hand", - }, - { - -- club of the fury - itemid = 9385, - type = "deequip", - slot = "hand", - }, - { - -- scythe of the reaper - itemid = 9384, - type = "equip", - slot = "hand", - }, - { - -- scythe of the reaper - itemid = 9384, - type = "deequip", - slot = "hand", - }, - { - -- trousers of the ancients - itemid = 9383, - type = "equip", - slot = "legs", - }, - { - -- trousers of the ancients - itemid = 9383, - type = "deequip", - slot = "legs", - }, - { - -- helmet of nature - itemid = 9382, - type = "equip", - slot = "head", - }, - { - -- helmet of nature - itemid = 9382, - type = "deequip", - slot = "head", - }, - { - -- helmet of ultimate terror - itemid = 9381, - type = "equip", - slot = "head", - }, - { - -- helmet of ultimate terror - itemid = 9381, - type = "deequip", - slot = "head", - }, - { - -- shield of care - itemid = 9380, - type = "equip", - slot = "shield", - }, - { - -- shield of care - itemid = 9380, - type = "deequip", - slot = "shield", - }, - { - -- heavy metal t-shirt - itemid = 9379, - type = "equip", - slot = "armor", - }, - { - -- heavy metal t-shirt - itemid = 9379, - type = "deequip", - slot = "armor", - }, - { - -- musician's bow - itemid = 9378, - type = "equip", - slot = "hand", - }, - { - -- musician's bow - itemid = 9378, - type = "deequip", - slot = "hand", - }, - { - -- shield of the white knight - itemid = 9377, - type = "equip", - slot = "shield", - }, - { - -- shield of the white knight - itemid = 9377, - type = "deequip", - slot = "shield", - }, - { - -- stale bread of ancientness - itemid = 9376, - type = "equip", - slot = "hand", - }, - { - -- stale bread of ancientness - itemid = 9376, - type = "deequip", - slot = "hand", - }, - { - -- pointed rabbitslayer - itemid = 9375, - type = "equip", - slot = "hand", - }, - { - -- pointed rabbitslayer - itemid = 9375, - type = "deequip", - slot = "hand", - }, - { - -- odd hat - itemid = 9374, - type = "equip", - slot = "head", - }, - { - -- odd hat - itemid = 9374, - type = "deequip", - slot = "head", - }, - { - -- glutton's mace - itemid = 9373, - type = "equip", - slot = "hand", - }, - { - -- glutton's mace - itemid = 9373, - type = "deequip", - slot = "hand", - }, - { - -- meat shield - itemid = 9372, - type = "equip", - slot = "shield", - }, - { - -- meat shield - itemid = 9372, - type = "deequip", - slot = "shield", - }, - { - -- shockwave amulet - itemid = 9304, - type = "equip", - slot = "necklace", - level = 80, - }, - { - -- shockwave amulet - itemid = 9304, - type = "deequip", - slot = "necklace", - level = 80, - }, - { - -- leviathan's amulet - itemid = 9303, - type = "equip", - slot = "necklace", - level = 80, - }, - { - -- leviathan's amulet - itemid = 9303, - type = "deequip", - slot = "necklace", - level = 80, - }, - { - -- sacred tree amulet - itemid = 9302, - type = "equip", - slot = "necklace", - level = 80, - }, - { - -- sacred tree amulet - itemid = 9302, - type = "deequip", - slot = "necklace", - level = 80, - }, - { - -- bonfire amulet - itemid = 9301, - type = "equip", - slot = "necklace", - level = 80, - }, - { - -- bonfire amulet - itemid = 9301, - type = "deequip", - slot = "necklace", - level = 80, - }, - { - -- laurel wreath - itemid = 9221, - type = "equip", - slot = "head", - }, - { - -- laurel wreath - itemid = 9221, - type = "deequip", - slot = "head", - }, - { - -- bronze medal - itemid = 9217, - type = "equip", - slot = "necklace", - }, - { - -- bronze medal - itemid = 9217, - type = "deequip", - slot = "necklace", - }, - { - -- silver medal - itemid = 9216, - type = "equip", - slot = "necklace", - }, - { - -- silver medal - itemid = 9216, - type = "deequip", - slot = "necklace", - }, - { - -- gold medal - itemid = 9215, - type = "equip", - slot = "necklace", - }, - { - -- gold medal - itemid = 9215, - type = "deequip", - slot = "necklace", - }, - { - -- grey bag - itemid = 9151, - type = "equip", - slot = "backpack", - }, - { - -- grey bag - itemid = 9151, - type = "deequip", - slot = "backpack", - }, - { - -- batwing hat - itemid = 9103, - type = "equip", - slot = "head", - level = 50, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- batwing hat - itemid = 9103, - type = "deequip", - slot = "head", - level = 50, - }, - { - -- pair firewalker boots - itemid = 9019, - type = "equip", - slot = "feet", - level = 130, - }, - { - -- pair firewalker boots - itemid = 9019, - type = "deequip", - slot = "feet", - level = 130, - }, - { - -- firewalker boots - itemid = 9018, - type = "equip", - slot = "feet", - level = 130, - }, - { - -- firewalker boots - itemid = 9018, - type = "deequip", - slot = "feet", - level = 130, - }, - { - -- coconut shoes - itemid = 9017, - type = "equip", - slot = "feet", - }, - { - -- coconut shoes - itemid = 9017, - type = "deequip", - slot = "feet", - }, - { - -- flower dress - itemid = 9015, - type = "equip", - slot = "armor", - }, - { - -- flower dress - itemid = 9015, - type = "deequip", - slot = "armor", - }, - { - -- leaf legs - itemid = 9014, - type = "equip", - slot = "legs", - }, - { - -- leaf legs - itemid = 9014, - type = "deequip", - slot = "legs", - }, - { - -- flower wreath - itemid = 9013, - type = "equip", - slot = "head", - }, - { - -- flower wreath - itemid = 9013, - type = "deequip", - slot = "head", - }, - { - -- yalahari mask - itemid = 8864, - type = "equip", - slot = "head", - level = 80, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- yalahari mask - itemid = 8864, - type = "deequip", - slot = "head", - level = 80, - }, - { - -- yalahari leg piece - itemid = 8863, - type = "equip", - slot = "legs", - level = 80, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- yalahari leg piece - itemid = 8863, - type = "deequip", - slot = "legs", - level = 80, - }, - { - -- yalahari armor - itemid = 8862, - type = "equip", - slot = "armor", - level = 80, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- yalahari armor - itemid = 8862, - type = "deequip", - slot = "armor", - level = 80, - }, - { - -- brocade bag - itemid = 8861, - type = "equip", - slot = "backpack", - }, - { - -- brocade bag - itemid = 8861, - type = "deequip", - slot = "backpack", - }, - { - -- brocade backpack - itemid = 8860, - type = "equip", - slot = "backpack", - }, - { - -- brocade backpack - itemid = 8860, - type = "deequip", - slot = "backpack", - }, - { - -- golden bag - itemid = 655, - type = "equip", - slot = "backpack", - }, - { - -- golden bag - itemid = 655, - type = "deequip", - slot = "backpack", - }, - { - -- purple bag - itemid = 653, - type = "equip", - slot = "backpack", - }, - { - -- purple bag - itemid = 653, - type = "deequip", - slot = "backpack", - }, - { - -- the calamity - itemid = 8104, - type = "equip", - slot = "hand", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- the calamity - itemid = 8104, - type = "deequip", - slot = "hand", - }, - { - -- the epiphany - itemid = 8103, - type = "equip", - slot = "hand", - level = 120, - }, - { - -- the epiphany - itemid = 8103, - type = "deequip", - slot = "hand", - }, - { - -- emerald sword - itemid = 8102, - type = "equip", - slot = "hand", - level = 100, - }, - { - -- emerald sword - itemid = 8102, - type = "deequip", - slot = "hand", - }, - { - -- the stomper - itemid = 8101, - type = "equip", - slot = "hand", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- the stomper - itemid = 8101, - type = "deequip", - slot = "hand", - }, - { - -- obsidian truncheon - itemid = 8100, - type = "equip", - slot = "hand", - level = 100, - }, - { - -- obsidian truncheon - itemid = 8100, - type = "deequip", - slot = "hand", - }, - { - -- dark trinity mace - itemid = 8099, - type = "equip", - slot = "hand", - level = 120, - }, - { - -- dark trinity mace - itemid = 8099, - type = "deequip", - slot = "hand", - }, - { - -- demonwing axe - itemid = 8098, - type = "equip", - slot = "hand", - level = 120, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- demonwing axe - itemid = 8098, - type = "deequip", - slot = "hand", - }, - { - -- solar axe - itemid = 8097, - type = "equip", - slot = "hand", - level = 130, - }, - { - -- solar axe - itemid = 8097, - type = "deequip", - slot = "hand", - }, - { - -- hellforged axe - itemid = 8096, - type = "equip", - slot = "hand", - level = 110, - }, - { - -- hellforged axe - itemid = 8096, - type = "deequip", - slot = "hand", - }, - { - -- ranger legs - itemid = 8095, - type = "equip", - slot = "legs", - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- ranger legs - itemid = 8095, - type = "deequip", - slot = "legs", - }, - { - -- wand of voodoo - itemid = 8094, - type = "equip", - slot = "hand", - level = 42, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of voodoo - itemid = 8094, - type = "deequip", - slot = "hand", - level = 42, - }, - { - -- wand of draconia - itemid = 8093, - type = "equip", - slot = "hand", - level = 22, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of draconia - itemid = 8093, - type = "deequip", - slot = "hand", - level = 22, - }, - { - -- wand of starstorm - itemid = 8092, - type = "equip", - slot = "hand", - level = 37, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of starstorm - itemid = 8092, - type = "deequip", - slot = "hand", - level = 37, - }, - { - -- spellbook of dark mysteries - itemid = 8090, - type = "equip", - slot = "shield", - level = 80, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellbook of dark mysteries - itemid = 8090, - type = "deequip", - slot = "shield", - level = 80, - }, - { - -- springsprout rod - itemid = 8084, - type = "equip", - slot = "hand", - level = 37, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- springsprout rod - itemid = 8084, - type = "deequip", - slot = "hand", - level = 37, - }, - { - -- northwind rod - itemid = 8083, - type = "equip", - slot = "hand", - level = 22, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- northwind rod - itemid = 8083, - type = "deequip", - slot = "hand", - level = 22, - }, - { - -- underworld rod - itemid = 8082, - type = "equip", - slot = "hand", - level = 42, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- underworld rod - itemid = 8082, - type = "deequip", - slot = "hand", - level = 42, - }, - { - -- terran rainbow shield - itemid = 8081, - type = "equip", - slot = "shield", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- terran rainbow shield - itemid = 8081, - type = "deequip", - slot = "shield", - level = 100, - }, - { - -- sparking rainbow shield - itemid = 8080, - type = "equip", - slot = "shield", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sparking rainbow shield - itemid = 8080, - type = "deequip", - slot = "shield", - level = 100, - }, - { - -- icy rainbow shield - itemid = 8079, - type = "equip", - slot = "shield", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- icy rainbow shield - itemid = 8079, - type = "deequip", - slot = "shield", - level = 100, - }, - { - -- fiery rainbow shield - itemid = 8078, - type = "equip", - slot = "shield", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fiery rainbow shield - itemid = 8078, - type = "deequip", - slot = "shield", - level = 100, - }, - { - -- rainbow shield - itemid = 8077, - type = "equip", - slot = "shield", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- rainbow shield - itemid = 8077, - type = "deequip", - slot = "shield", - level = 100, - }, - { - -- spellscroll of prophecies - itemid = 8076, - type = "equip", - slot = "shield", - level = 70, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellscroll of prophecies - itemid = 8076, - type = "deequip", - slot = "shield", - level = 70, - }, - { - -- spellbook of lost souls - itemid = 8075, - type = "equip", - slot = "shield", - level = 60, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellbook of lost souls - itemid = 8075, - type = "deequip", - slot = "shield", - level = 60, - }, - { - -- spellbook of mind control - itemid = 8074, - type = "equip", - slot = "shield", - level = 50, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellbook of mind control - itemid = 8074, - type = "deequip", - slot = "shield", - level = 50, - }, - { - -- spellbook of warding - itemid = 8073, - type = "equip", - slot = "shield", - level = 40, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellbook of warding - itemid = 8073, - type = "deequip", - slot = "shield", - level = 40, - }, - { - -- spellbook of enlightenment - itemid = 8072, - type = "equip", - slot = "shield", - level = 30, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellbook of enlightenment - itemid = 8072, - type = "deequip", - slot = "shield", - level = 30, - }, - { - -- ethno coat - itemid = 8064, - type = "equip", - slot = "armor", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- ethno coat - itemid = 8064, - type = "deequip", - slot = "armor", - }, - { - -- paladin armor - itemid = 8063, - type = "equip", - slot = "armor", - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- paladin armor - itemid = 8063, - type = "deequip", - slot = "armor", - }, - { - -- robe of the underworld - itemid = 8062, - type = "equip", - slot = "armor", - level = 100, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- robe of the underworld - itemid = 8062, - type = "deequip", - slot = "armor", - level = 100, - }, - { - -- skullcracker armor - itemid = 8061, - type = "equip", - slot = "armor", - level = 85, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- skullcracker armor - itemid = 8061, - type = "deequip", - slot = "armor", - level = 85, - }, - { - -- master archer's armor - itemid = 8060, - type = "equip", - slot = "armor", - level = 100, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- master archer's armor - itemid = 8060, - type = "deequip", - slot = "armor", - level = 100, - }, - { - -- frozen plate - itemid = 8059, - type = "equip", - slot = "armor", - level = 75, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- frozen plate - itemid = 8059, - type = "deequip", - slot = "armor", - level = 75, - }, - { - -- molten plate - itemid = 8058, - type = "equip", - slot = "armor", - level = 75, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- molten plate - itemid = 8058, - type = "deequip", - slot = "armor", - level = 75, - }, - { - -- divine plate - itemid = 8057, - type = "equip", - slot = "armor", - level = 75, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- divine plate - itemid = 8057, - type = "deequip", - slot = "armor", - level = 75, - }, - { - -- oceanborn leviathan armor - itemid = 8056, - type = "equip", - slot = "armor", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- oceanborn leviathan armor - itemid = 8056, - type = "deequip", - slot = "armor", - level = 100, - }, - { - -- windborn colossus armor - itemid = 8055, - type = "equip", - slot = "armor", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- windborn colossus armor - itemid = 8055, - type = "deequip", - slot = "armor", - level = 100, - }, - { - -- earthborn titan armor - itemid = 8054, - type = "equip", - slot = "armor", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- earthborn titan armor - itemid = 8054, - type = "deequip", - slot = "armor", - level = 100, - }, - { - -- fireborn giant armor - itemid = 8053, - type = "equip", - slot = "armor", - level = 100, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fireborn giant armor - itemid = 8053, - type = "deequip", - slot = "armor", - level = 100, - }, - { - -- swamplair armor - itemid = 8052, - type = "equip", - slot = "armor", - level = 60, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- swamplair armor - itemid = 8052, - type = "deequip", - slot = "armor", - level = 60, - }, - { - -- voltage armor - itemid = 8051, - type = "equip", - slot = "armor", - level = 60, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- voltage armor - itemid = 8051, - type = "deequip", - slot = "armor", - level = 60, - }, - { - -- crystalline armor - itemid = 8050, - type = "equip", - slot = "armor", - level = 60, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- crystalline armor - itemid = 8050, - type = "deequip", - slot = "armor", - level = 60, - }, - { - -- lavos armor - itemid = 8049, - type = "equip", - slot = "armor", - level = 60, - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- lavos armor - itemid = 8049, - type = "deequip", - slot = "armor", - level = 60, - }, - { - -- girl's dress - itemid = 8048, - type = "equip", - slot = "armor", - }, - { - -- girl's dress - itemid = 8048, - type = "deequip", - slot = "armor", - }, - { - -- tunic - itemid = 8047, - type = "equip", - slot = "armor", - }, - { - -- tunic - itemid = 8047, - type = "deequip", - slot = "armor", - }, - { - -- summer dress - itemid = 8046, - type = "equip", - slot = "armor", - }, - { - -- summer dress - itemid = 8046, - type = "deequip", - slot = "armor", - }, - { - -- hibiscus dress - itemid = 8045, - type = "equip", - slot = "armor", - }, - { - -- hibiscus dress - itemid = 8045, - type = "deequip", - slot = "armor", - }, - { - -- belted cape - itemid = 8044, - type = "equip", - slot = "armor", - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- belted cape - itemid = 8044, - type = "deequip", - slot = "armor", - }, - { - -- focus cape - itemid = 8043, - type = "equip", - slot = "armor", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- focus cape - itemid = 8043, - type = "deequip", - slot = "armor", - }, - { - -- spirit cloak - itemid = 8042, - type = "equip", - slot = "armor", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spirit cloak - itemid = 8042, - type = "deequip", - slot = "armor", - }, - { - -- greenwood coat - itemid = 8041, - type = "equip", - slot = "armor", - level = 75, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- greenwood coat - itemid = 8041, - type = "deequip", - slot = "armor", - level = 75, - }, - { - -- velvet mantle - itemid = 8040, - type = "equip", - slot = "armor", - level = 75, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- velvet mantle - itemid = 8040, - type = "deequip", - slot = "armor", - level = 75, - }, - { - -- dragon robe - itemid = 8039, - type = "equip", - slot = "armor", - level = 75, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- dragon robe - itemid = 8039, - type = "deequip", - slot = "armor", - level = 75, - }, - { - -- robe of the ice queen - itemid = 8038, - type = "equip", - slot = "armor", - level = 75, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- robe of the ice queen - itemid = 8038, - type = "deequip", - slot = "armor", - level = 75, - }, - { - -- dark lord's cape - itemid = 8037, - type = "equip", - slot = "armor", - level = 65, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- dark lord's cape - itemid = 8037, - type = "deequip", - slot = "armor", - level = 65, - }, - { - -- elethriel's elemental bow - itemid = 8030, - type = "equip", - slot = "hand", - level = 70, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- elethriel's elemental bow - itemid = 8030, - type = "deequip", - slot = "hand", - }, - { - -- silkweaver bow - itemid = 8029, - type = "equip", - slot = "hand", - level = 40, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- silkweaver bow - itemid = 8029, - type = "deequip", - slot = "hand", - }, - { - -- yol's bow - itemid = 8028, - type = "equip", - slot = "hand", - level = 60, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- yol's bow - itemid = 8028, - type = "deequip", - slot = "hand", - }, - { - -- composite hornbow - itemid = 8027, - type = "equip", - slot = "hand", - level = 50, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- composite hornbow - itemid = 8027, - type = "deequip", - slot = "hand", - }, - { - -- warsinger bow - itemid = 8026, - type = "equip", - slot = "hand", - level = 80, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- warsinger bow - itemid = 8026, - type = "deequip", - slot = "hand", - }, - { - -- The ironworker - itemid = 8025, - type = "equip", - slot = "hand", - level = 80, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- The ironworker - itemid = 8025, - type = "deequip", - slot = "hand", - }, - { - -- The Devileye - itemid = 8024, - type = "equip", - slot = "hand", - level = 100, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- The Devileye - itemid = 8024, - type = "deequip", - slot = "hand", - level = 100, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- royal crossbow - itemid = 8023, - type = "equip", - slot = "hand", - level = 130, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- royal crossbow - itemid = 8023, - type = "deequip", - slot = "hand", - }, - { - -- chain bolter - itemid = 8022, - type = "equip", - slot = "hand", - level = 60, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- chain bolter - itemid = 8022, - type = "deequip", - slot = "hand", - }, - { - -- modified crossbow - itemid = 8021, - type = "equip", - slot = "hand", - level = 45, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- modified crossbow - itemid = 8021, - type = "deequip", - slot = "hand", - }, - { - -- witchhunter's coat - itemid = 7993, - type = "equip", - slot = "armor", - level = 50, - }, - { - -- witchhunter's coat - itemid = 7993, - type = "deequip", - slot = "armor", - level = 50, - }, - { - -- mage hat - itemid = 7992, - type = "equip", - slot = "head", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- mage hat - itemid = 7992, - type = "deequip", - slot = "head", - }, - { - -- magician's robe - itemid = 7991, - type = "equip", - slot = "armor", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- magician's robe - itemid = 7991, - type = "deequip", - slot = "armor", - }, - { - -- jagged sword - itemid = 7774, - type = "equip", - slot = "hand", - }, - { - -- jagged sword - itemid = 7774, - type = "deequip", - slot = "hand", - }, - { - -- steel axe - itemid = 7773, - type = "equip", - slot = "hand", - }, - { - -- steel axe - itemid = 7773, - type = "deequip", - slot = "hand", - }, - { - -- Jerom's family necklace - itemid = 7754, - type = "equip", - slot = "necklace", - }, - { - -- Jerom's family necklace - itemid = 7754, - type = "deequip", - slot = "necklace", - }, - { - -- Koshei's ancient amulet - itemid = 7532, - type = "equip", - slot = "necklace", - }, - { - -- Koshei's ancient amulet - itemid = 7532, - type = "deequip", - slot = "necklace", - }, - { - -- viper star - itemid = 7366, - type = "equip", - slot = "hand", - }, - { - -- viper star - itemid = 7366, - type = "deequip", - slot = "hand", - }, - { - -- crimson sword - itemid = 860, - type = "equip", - slot = "hand", - }, - { - -- crimson sword - itemid = 860, - type = "deequip", - slot = "hand", - }, - { - -- shapeshifter ring - itemid = 908, - type = "equip", - slot = "ring", - }, - { - -- shapeshifter ring - itemid = 908, - type = "deequip", - slot = "ring", - }, - { - -- shapeshifter ring - itemid = 907, - type = "equip", - slot = "ring", - }, - { - -- shapeshifter ring - itemid = 907, - type = "deequip", - slot = "ring", - }, - { - -- Throwing Cake - itemid = 904, - type = "equip", - slot = "ring", - }, - { - -- Throwing Cake - itemid = 904, - type = "deequip", - slot = "ring", - }, - { - -- jester hat - itemid = 894, - type = "equip", - slot = "head", - }, - { - -- jester hat - itemid = 894, - type = "deequip", - slot = "head", - }, - { - -- terra hood - itemid = 830, - type = "equip", - slot = "head", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- terra hood - itemid = 830, - type = "deequip", - slot = "head", - }, - { - -- glacier mask - itemid = 829, - type = "equip", - slot = "head", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- glacier mask - itemid = 829, - type = "deequip", - slot = "head", - }, - { - -- lightning headband - itemid = 828, - type = "equip", - slot = "head", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- lightning headband - itemid = 828, - type = "deequip", - slot = "head", - }, - { - -- magma monocle - itemid = 827, - type = "equip", - slot = "head", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- magma monocle - itemid = 827, - type = "deequip", - slot = "head", - }, - { - -- magma coat - itemid = 826, - type = "equip", - slot = "armor", - level = 50, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- magma coat - itemid = 826, - type = "deequip", - slot = "armor", - level = 50, - }, - { - -- lightning robe - itemid = 825, - type = "equip", - slot = "armor", - level = 50, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- lightning robe - itemid = 825, - type = "deequip", - slot = "armor", - level = 50, - }, - { - -- glacier robe - itemid = 824, - type = "equip", - slot = "armor", - level = 50, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- glacier robe - itemid = 824, - type = "deequip", - slot = "armor", - level = 50, - }, - { - -- glacier kilt - itemid = 823, - type = "equip", - slot = "legs", - level = 40, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- glacier kilt - itemid = 823, - type = "deequip", - slot = "legs", - level = 40, - }, - { - -- lightning legs - itemid = 822, - type = "equip", - slot = "legs", - level = 40, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- lightning legs - itemid = 822, - type = "deequip", - slot = "legs", - level = 40, - }, - { - -- magma legs - itemid = 821, - type = "equip", - slot = "legs", - level = 40, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- magma legs - itemid = 821, - type = "deequip", - slot = "legs", - level = 40, - }, - { - -- lightning boots - itemid = 820, - type = "equip", - slot = "feet", - level = 35, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- lightning boots - itemid = 820, - type = "deequip", - slot = "feet", - level = 35, - }, - { - -- glacier shoes - itemid = 819, - type = "equip", - slot = "feet", - level = 35, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- glacier shoes - itemid = 819, - type = "deequip", - slot = "feet", - level = 35, - }, - { - -- magma boots - itemid = 818, - type = "equip", - slot = "feet", - level = 35, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- magma boots - itemid = 818, - type = "deequip", - slot = "feet", - level = 35, - }, - { - -- magma amulet - itemid = 817, - type = "equip", - slot = "necklace", - level = 60, - }, - { - -- magma amulet - itemid = 817, - type = "deequip", - slot = "necklace", - level = 60, - }, - { - -- lightning pendant - itemid = 816, - type = "equip", - slot = "necklace", - level = 60, - }, - { - -- lightning pendant - itemid = 816, - type = "deequip", - slot = "necklace", - level = 60, - }, - { - -- glacier amulet - itemid = 815, - type = "equip", - slot = "necklace", - level = 60, - }, - { - -- glacier amulet - itemid = 815, - type = "deequip", - slot = "necklace", - level = 60, - }, - { - -- terra amulet - itemid = 814, - type = "equip", - slot = "necklace", - level = 60, - }, - { - -- terra amulet - itemid = 814, - type = "deequip", - slot = "necklace", - level = 60, - }, - { - -- terra boots - itemid = 813, - type = "equip", - slot = "feet", - level = 35, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- terra boots - itemid = 813, - type = "deequip", - slot = "feet", - level = 35, - }, - { - -- terra legs - itemid = 812, - type = "equip", - slot = "legs", - level = 40, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- terra legs - itemid = 812, - type = "deequip", - slot = "legs", - level = 40, - }, - { - -- terra mantle - itemid = 811, - type = "equip", - slot = "armor", - level = 50, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- terra mantle - itemid = 811, - type = "deequip", - slot = "armor", - level = 50, - }, - { - -- energy war hammer - itemid = 810, - type = "equip", - slot = "hand", - }, - { - -- energy war hammer - itemid = 810, - type = "deequip", - slot = "hand", - }, - { - -- energy orcish maul - itemid = 809, - type = "equip", - slot = "hand", - }, - { - -- energy orcish maul - itemid = 809, - type = "deequip", - slot = "hand", - }, - { - -- energy cranial basher - itemid = 808, - type = "equip", - slot = "hand", - }, - { - -- energy cranial basher - itemid = 808, - type = "deequip", - slot = "hand", - }, - { - -- energy crystal mace - itemid = 807, - type = "equip", - slot = "hand", - }, - { - -- energy crystal mace - itemid = 807, - type = "deequip", - slot = "hand", - }, - { - -- energy clerical mace - itemid = 806, - type = "equip", - slot = "hand", - level = 20, - }, - { - -- energy clerical mace - itemid = 806, - type = "deequip", - slot = "hand", - }, - { - -- energy war axe - itemid = 805, - type = "equip", - slot = "hand", - }, - { - -- energy war axe - itemid = 805, - type = "deequip", - slot = "hand", - }, - { - -- energy headchopper - itemid = 804, - type = "equip", - slot = "hand", - }, - { - -- energy headchopper - itemid = 804, - type = "deequip", - slot = "hand", - }, - { - -- energy heroic axe - itemid = 803, - type = "equip", - slot = "hand", - }, - { - -- energy heroic axe - itemid = 803, - type = "deequip", - slot = "hand", - }, - { - -- energy knight axe - itemid = 802, - type = "equip", - slot = "hand", - }, - { - -- energy knight axe - itemid = 802, - type = "deequip", - slot = "hand", - }, - { - -- energy barbarian axe - itemid = 801, - type = "equip", - slot = "hand", - }, - { - -- energy barbarian axe - itemid = 801, - type = "deequip", - slot = "hand", - }, - { - -- energy dragon slayer - itemid = 798, - type = "equip", - slot = "hand", - level = 45, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- energy dragon slayer - itemid = 798, - type = "deequip", - slot = "hand", - }, - { - -- energy blacksteel sword - itemid = 797, - type = "equip", - slot = "hand", - }, - { - -- energy blacksteel sword - itemid = 797, - type = "deequip", - slot = "hand", - }, - { - -- energy mystic blade - itemid = 796, - type = "equip", - slot = "hand", - }, - { - -- energy mystic blade - itemid = 796, - type = "deequip", - slot = "hand", - }, - { - -- energy relic sword - itemid = 795, - type = "equip", - slot = "hand", - }, - { - -- energy relic sword - itemid = 795, - type = "deequip", - slot = "hand", - }, - { - -- energy spike sword - itemid = 794, - type = "equip", - slot = "hand", - }, - { - -- energy spike sword - itemid = 794, - type = "deequip", - slot = "hand", - }, - { - -- earth war hammer - itemid = 793, - type = "equip", - slot = "hand", - }, - { - -- earth war hammer - itemid = 793, - type = "deequip", - slot = "hand", - }, - { - -- earth orcish maul - itemid = 792, - type = "equip", - slot = "hand", - }, - { - -- earth orcish maul - itemid = 792, - type = "deequip", - slot = "hand", - }, - { - -- earth cranial basher - itemid = 791, - type = "equip", - slot = "hand", - }, - { - -- earth cranial basher - itemid = 791, - type = "deequip", - slot = "hand", - }, - { - -- earth crystal mace - itemid = 790, - type = "equip", - slot = "hand", - level = 35, - }, - { - -- earth crystal mace - itemid = 790, - type = "deequip", - slot = "hand", - }, - { - -- earth clerical mace - itemid = 789, - type = "equip", - slot = "hand", - }, - { - -- earth clerical mace - itemid = 789, - type = "deequip", - slot = "hand", - }, - { - -- earth war axe - itemid = 788, - type = "equip", - slot = "hand", - }, - { - -- earth war axe - itemid = 788, - type = "deequip", - slot = "hand", - }, - { - -- earth headchopper - itemid = 787, - type = "equip", - slot = "hand", - }, - { - -- earth headchopper - itemid = 787, - type = "deequip", - slot = "hand", - }, - { - -- earth heroic axe - itemid = 786, - type = "equip", - slot = "hand", - }, - { - -- earth heroic axe - itemid = 786, - type = "deequip", - slot = "hand", - }, - { - -- earth knight axe - itemid = 785, - type = "equip", - slot = "hand", - }, - { - -- earth knight axe - itemid = 785, - type = "deequip", - slot = "hand", - }, - { - -- earth barbarian axe - itemid = 784, - type = "equip", - slot = "hand", - }, - { - -- earth barbarian axe - itemid = 784, - type = "deequip", - slot = "hand", - }, - { - -- earth dragon slayer - itemid = 783, - type = "equip", - slot = "hand", - }, - { - -- earth dragon slayer - itemid = 783, - type = "deequip", - slot = "hand", - }, - { - -- earth blacksteel sword - itemid = 782, - type = "equip", - slot = "hand", - }, - { - -- earth blacksteel sword - itemid = 782, - type = "deequip", - slot = "hand", - }, - { - -- earth mystic blade - itemid = 781, - type = "equip", - slot = "hand", - }, - { - -- earth mystic blade - itemid = 781, - type = "deequip", - slot = "hand", - }, - { - -- earth relic sword - itemid = 780, - type = "equip", - slot = "hand", - }, - { - -- earth relic sword - itemid = 780, - type = "deequip", - slot = "hand", - }, - { - -- earth spike sword - itemid = 779, - type = "equip", - slot = "hand", - }, - { - -- earth spike sword - itemid = 779, - type = "deequip", - slot = "hand", - }, - { - -- earth arrow - itemid = 774, - type = "equip", - slot = "ammo", - }, - { - -- earth arrow - itemid = 774, - type = "deequip", - slot = "ammo", - }, - { - -- flaming arrow - itemid = 763, - type = "equip", - slot = "ammo", - }, - { - -- flaming arrow - itemid = 763, - type = "deequip", - slot = "ammo", - }, - { - -- shiver arrow - itemid = 762, - type = "equip", - slot = "ammo", - }, - { - -- shiver arrow - itemid = 762, - type = "deequip", - slot = "ammo", - }, - { - -- flash arrow - itemid = 761, - type = "equip", - slot = "ammo", - }, - { - -- flash arrow - itemid = 761, - type = "deequip", - slot = "ammo", - }, - { - -- icy war hammer - itemid = 693, - type = "equip", - slot = "hand", - }, - { - -- icy war hammer - itemid = 693, - type = "deequip", - slot = "hand", - }, - { - -- icy orcish maul - itemid = 692, - type = "equip", - slot = "hand", - }, - { - -- icy orcish maul - itemid = 692, - type = "deequip", - slot = "hand", - }, - { - -- icy cranial basher - itemid = 691, - type = "equip", - slot = "hand", - }, - { - -- icy cranial basher - itemid = 691, - type = "deequip", - slot = "hand", - }, - { - -- icy crystal mace - itemid = 690, - type = "equip", - slot = "hand", - }, - { - -- icy crystal mace - itemid = 690, - type = "deequip", - slot = "hand", - }, - { - -- icy clerical mace - itemid = 689, - type = "equip", - slot = "hand", - }, - { - -- icy clerical mace - itemid = 689, - type = "deequip", - slot = "hand", - }, - { - -- icy war axe - itemid = 688, - type = "equip", - slot = "hand", - }, - { - -- icy war axe - itemid = 688, - type = "deequip", - slot = "hand", - }, - { - -- icy headchopper - itemid = 687, - type = "equip", - slot = "hand", - }, - { - -- icy headchopper - itemid = 687, - type = "deequip", - slot = "hand", - }, - { - -- icy heroic axe - itemid = 686, - type = "equip", - slot = "hand", - }, - { - -- icy heroic axe - itemid = 686, - type = "deequip", - slot = "hand", - }, - { - -- icy knight axe - itemid = 685, - type = "equip", - slot = "hand", - }, - { - -- icy knight axe - itemid = 685, - type = "deequip", - slot = "hand", - }, - { - -- icy barbarian axe - itemid = 684, - type = "equip", - slot = "hand", - }, - { - -- icy barbarian axe - itemid = 684, - type = "deequip", - slot = "hand", - }, - { - -- icy dragon slayer - itemid = 683, - type = "equip", - slot = "hand", - }, - { - -- icy dragon slayer - itemid = 683, - type = "deequip", - slot = "hand", - }, - { - -- icy blacksteel sword - itemid = 682, - type = "equip", - slot = "hand", - }, - { - -- icy blacksteel sword - itemid = 682, - type = "deequip", - slot = "hand", - }, - { - -- icy mystic blade - itemid = 681, - type = "equip", - slot = "hand", - }, - { - -- icy mystic blade - itemid = 681, - type = "deequip", - slot = "hand", - }, - { - -- icy relic sword - itemid = 680, - type = "equip", - slot = "hand", - }, - { - -- icy relic sword - itemid = 680, - type = "deequip", - slot = "hand", - }, - { - -- icy spike sword - itemid = 679, - type = "equip", - slot = "hand", - }, - { - -- icy spike sword - itemid = 679, - type = "deequip", - slot = "hand", - }, - { - -- fiery war hammer - itemid = 674, - type = "equip", - slot = "hand", - }, - { - -- fiery war hammer - itemid = 674, - type = "deequip", - slot = "hand", - }, - { - -- fiery orcish maul - itemid = 673, - type = "equip", - slot = "hand", - }, - { - -- fiery orcish maul - itemid = 673, - type = "deequip", - slot = "hand", - }, - { - -- fiery cranial basher - itemid = 672, - type = "equip", - slot = "hand", - }, - { - -- fiery cranial basher - itemid = 672, - type = "deequip", - slot = "hand", - }, - { - -- fiery crystal mace - itemid = 671, - type = "equip", - slot = "hand", - }, - { - -- fiery crystal mace - itemid = 671, - type = "deequip", - slot = "hand", - }, - { - -- fiery clerical mace - itemid = 670, - type = "equip", - slot = "hand", - }, - { - -- fiery clerical mace - itemid = 670, - type = "deequip", - slot = "hand", - }, - { - -- fiery war axe - itemid = 669, - type = "equip", - slot = "hand", - }, - { - -- fiery war axe - itemid = 669, - type = "deequip", - slot = "hand", - }, - { - -- fiery headchopper - itemid = 668, - type = "equip", - slot = "hand", - }, - { - -- fiery headchopper - itemid = 668, - type = "deequip", - slot = "hand", - }, - { - -- fiery heroic axe - itemid = 667, - type = "equip", - slot = "hand", - }, - { - -- fiery heroic axe - itemid = 667, - type = "deequip", - slot = "hand", - }, - { - -- fiery knight axe - itemid = 666, - type = "equip", - slot = "hand", - }, - { - -- fiery knight axe - itemid = 666, - type = "deequip", - slot = "hand", - }, - { - -- fiery barbarian axe - itemid = 665, - type = "equip", - slot = "hand", - }, - { - -- fiery barbarian axe - itemid = 665, - type = "deequip", - slot = "hand", - }, - { - -- fiery dragon slayer - itemid = 664, - type = "equip", - slot = "hand", - }, - { - -- fiery dragon slayer - itemid = 664, - type = "deequip", - slot = "hand", - }, - { - -- fiery blacksteel sword - itemid = 663, - type = "equip", - slot = "hand", - }, - { - -- fiery blacksteel sword - itemid = 663, - type = "deequip", - slot = "hand", - }, - { - -- fiery mystic blade - itemid = 662, - type = "equip", - slot = "hand", - }, - { - -- fiery mystic blade - itemid = 662, - type = "deequip", - slot = "hand", - }, - { - -- fiery relic sword - itemid = 661, - type = "equip", - slot = "hand", - }, - { - -- fiery relic sword - itemid = 661, - type = "deequip", - slot = "hand", - }, - { - -- fiery spike sword - itemid = 660, - type = "equip", - slot = "hand", - }, - { - -- fiery spike sword - itemid = 660, - type = "deequip", - slot = "hand", - }, - { - -- blue legs - itemid = 645, - type = "equip", - slot = "legs", - }, - { - -- blue legs - itemid = 645, - type = "deequip", - slot = "legs", - }, - { - -- family signet ring - itemid = 406, - type = "equip", - slot = "ring", - }, - { - -- family signet ring - itemid = 406, - type = "deequip", - slot = "ring", - }, - { - -- suspicious signet ring - itemid = 349, - type = "equip", - slot = "ring", - }, - { - -- suspicious signet ring - itemid = 349, - type = "deequip", - slot = "ring", - }, - { - -- mining helmet - itemid = 875, - type = "equip", - slot = "head", - }, - { - -- mining helmet - itemid = 875, - type = "deequip", - slot = "head", - }, - { - -- mammoth fur shorts - itemid = 7464, - type = "equip", - slot = "legs", - }, - { - -- mammoth fur shorts - itemid = 7464, - type = "deequip", - slot = "legs", - }, - { - -- mammoth fur cape - itemid = 7463, - type = "equip", - slot = "armor", - }, - { - -- mammoth fur cape - itemid = 7463, - type = "deequip", - slot = "armor", - }, - { - -- ragnir helmet - itemid = 7462, - type = "equip", - slot = "head", - }, - { - -- ragnir helmet - itemid = 7462, - type = "deequip", - slot = "head", - }, - { - -- krimhorn helmet - itemid = 7461, - type = "equip", - slot = "head", - }, - { - -- krimhorn helmet - itemid = 7461, - type = "deequip", - slot = "head", - }, - { - -- norse shield - itemid = 7460, - type = "equip", - slot = "shield", - }, - { - -- norse shield - itemid = 7460, - type = "deequip", - slot = "shield", - }, - { - -- pair of earmuffs - itemid = 7459, - type = "equip", - slot = "head", - }, - { - -- pair of earmuffs - itemid = 7459, - type = "deequip", - slot = "head", - }, - { - -- fur cap - itemid = 7458, - type = "equip", - slot = "head", - }, - { - -- fur cap - itemid = 7458, - type = "deequip", - slot = "head", - }, - { - -- fur boots - itemid = 7457, - type = "equip", - slot = "feet", - }, - { - -- fur boots - itemid = 7457, - type = "deequip", - slot = "feet", - }, - { - -- noble axe - itemid = 7456, - type = "equip", - slot = "hand", - level = 35, - }, - { - -- noble axe - itemid = 7456, - type = "deequip", - slot = "hand", - }, - { - -- mythril axe - itemid = 7455, - type = "equip", - slot = "hand", - level = 80, - }, - { - -- mythril axe - itemid = 7455, - type = "deequip", - slot = "hand", - }, - { - -- glorious axe - itemid = 7454, - type = "equip", - slot = "hand", - level = 30, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- glorious axe - itemid = 7454, - type = "deequip", - slot = "hand", - }, - { - -- executioner - itemid = 7453, - type = "equip", - slot = "hand", - level = 85, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- executioner - itemid = 7453, - type = "deequip", - slot = "hand", - }, - { - -- spiked squelcher - itemid = 7452, - type = "equip", - slot = "hand", - level = 30, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- spiked squelcher - itemid = 7452, - type = "deequip", - slot = "hand", - }, - { - -- shadow sceptre - itemid = 7451, - type = "equip", - slot = "hand", - level = 35, - }, - { - -- shadow sceptre - itemid = 7451, - type = "deequip", - slot = "hand", - }, - { - -- hammer of prophecy - itemid = 7450, - type = "equip", - slot = "hand", - level = 120, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- hammer of prophecy - itemid = 7450, - type = "deequip", - slot = "hand", - }, - { - -- crystal sword - itemid = 7449, - type = "equip", - slot = "hand", - level = 25, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crystal sword - itemid = 7449, - type = "deequip", - slot = "hand", - }, - { - -- elvish bow - itemid = 7438, - type = "equip", - slot = "hand", - }, - { - -- elvish bow - itemid = 7438, - type = "deequip", - slot = "hand", - }, - { - -- sapphire hammer - itemid = 7437, - type = "equip", - slot = "hand", - level = 30, - }, - { - -- sapphire hammer - itemid = 7437, - type = "deequip", - slot = "hand", - }, - { - -- angelic axe - itemid = 7436, - type = "equip", - slot = "hand", - level = 45, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- angelic axe - itemid = 7436, - type = "deequip", - slot = "hand", - }, - { - -- impaler - itemid = 7435, - type = "equip", - slot = "hand", - level = 85, - }, - { - -- impaler - itemid = 7435, - type = "deequip", - slot = "hand", - }, - { - -- royal axe - itemid = 7434, - type = "equip", - slot = "hand", - level = 75, - }, - { - -- royal axe - itemid = 7434, - type = "deequip", - slot = "hand", - }, - { - -- ravenwing - itemid = 7433, - type = "equip", - slot = "hand", - level = 65, - }, - { - -- ravenwing - itemid = 7433, - type = "deequip", - slot = "hand", - }, - { - -- furry club - itemid = 7432, - type = "equip", - slot = "hand", - level = 20, - }, - { - -- furry club - itemid = 7432, - type = "deequip", - slot = "hand", - }, - { - -- demonbone - itemid = 7431, - type = "equip", - slot = "hand", - level = 80, - }, - { - -- demonbone - itemid = 7431, - type = "deequip", - slot = "hand", - }, - { - -- dragonbone staff - itemid = 7430, - type = "equip", - slot = "hand", - level = 30, - }, - { - -- dragonbone staff - itemid = 7430, - type = "deequip", - slot = "hand", - }, - { - -- blessed sceptre - itemid = 7429, - type = "equip", - slot = "hand", - level = 75, - }, - { - -- blessed sceptre - itemid = 7429, - type = "deequip", - slot = "hand", - }, - { - -- bonebreaker - itemid = 7428, - type = "equip", - slot = "hand", - level = 55, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- bonebreaker - itemid = 7428, - type = "deequip", - slot = "hand", - }, - { - -- chaos mace - itemid = 7427, - type = "equip", - slot = "hand", - level = 45, - }, - { - -- chaos mace - itemid = 7427, - type = "deequip", - slot = "hand", - }, - { - -- amber staff - itemid = 7426, - type = "equip", - slot = "hand", - level = 40, - }, - { - -- amber staff - itemid = 7426, - type = "deequip", - slot = "hand", - }, - { - -- taurus mace - itemid = 7425, - type = "equip", - slot = "hand", - level = 20, - }, - { - -- taurus mace - itemid = 7425, - type = "deequip", - slot = "hand", - }, - { - -- lunar staff - itemid = 7424, - type = "equip", - slot = "hand", - level = 30, - }, - { - -- lunar staff - itemid = 7424, - type = "deequip", - slot = "hand", - }, - { - -- skullcrusher - itemid = 7423, - type = "equip", - slot = "hand", - level = 85, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- skullcrusher - itemid = 7423, - type = "deequip", - slot = "hand", - }, - { - -- jade hammer - itemid = 7422, - type = "equip", - slot = "hand", - level = 70, - }, - { - -- jade hammer - itemid = 7422, - type = "deequip", - slot = "hand", - }, - { - -- onyx flail - itemid = 7421, - type = "equip", - slot = "hand", - level = 65, - }, - { - -- onyx flail - itemid = 7421, - type = "deequip", - slot = "hand", - }, - { - -- reaper's axe - itemid = 7420, - type = "equip", - slot = "hand", - level = 70, - }, - { - -- reaper's axe - itemid = 7420, - type = "deequip", - slot = "hand", - }, - { - -- dreaded cleaver - itemid = 7419, - type = "equip", - slot = "hand", - level = 40, - }, - { - -- dreaded cleaver - itemid = 7419, - type = "deequip", - slot = "hand", - }, - { - -- nightmare blade - itemid = 7418, - type = "equip", - slot = "hand", - level = 70, - }, - { - -- nightmare blade - itemid = 7418, - type = "deequip", - slot = "hand", - }, - { - -- runed sword - itemid = 7417, - type = "equip", - slot = "hand", - level = 65, - }, - { - -- runed sword - itemid = 7417, - type = "deequip", - slot = "hand", - }, - { - -- bloody edge - itemid = 7416, - type = "equip", - slot = "hand", - level = 55, - }, - { - -- bloody edge - itemid = 7416, - type = "deequip", - slot = "hand", - level = 55, - }, - { - -- cranial basher - itemid = 7415, - type = "equip", - slot = "hand", - level = 60, - }, - { - -- cranial basher - itemid = 7415, - type = "deequip", - slot = "hand", - }, - { - -- abyss hammer - itemid = 7414, - type = "equip", - slot = "hand", - level = 60, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- abyss hammer - itemid = 7414, - type = "deequip", - slot = "hand", - }, - { - -- titan axe - itemid = 7413, - type = "equip", - slot = "hand", - level = 40, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- titan axe - itemid = 7413, - type = "deequip", - slot = "hand", - }, - { - -- butcher's axe - itemid = 7412, - type = "equip", - slot = "hand", - level = 45, - }, - { - -- butcher's axe - itemid = 7412, - type = "deequip", - slot = "hand", - }, - { - -- ornamented axe - itemid = 7411, - type = "equip", - slot = "hand", - level = 50, - }, - { - -- ornamented axe - itemid = 7411, - type = "deequip", - slot = "hand", - }, - { - -- queen's sceptre - itemid = 7410, - type = "equip", - slot = "hand", - level = 55, - }, - { - -- queen's sceptre - itemid = 7410, - type = "deequip", - slot = "hand", - }, - { - -- northern star - itemid = 7409, - type = "equip", - slot = "hand", - level = 50, - }, - { - -- northern star - itemid = 7409, - type = "deequip", - slot = "hand", - }, - { - -- wyvern fang - itemid = 7408, - type = "equip", - slot = "hand", - level = 25, - }, - { - -- wyvern fang - itemid = 7408, - type = "deequip", - slot = "hand", - }, - { - -- haunted blade - itemid = 7407, - type = "equip", - slot = "hand", - level = 30, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- haunted blade - itemid = 7407, - type = "deequip", - slot = "hand", - }, - { - -- blacksteel sword - itemid = 7406, - type = "equip", - slot = "hand", - level = 35, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- blacksteel sword - itemid = 7406, - type = "deequip", - slot = "hand", - level = 35, - }, - { - -- havoc blade - itemid = 7405, - type = "equip", - slot = "hand", - level = 70, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- havoc blade - itemid = 7405, - type = "deequip", - slot = "hand", - }, - { - -- assassin dagger - itemid = 7404, - type = "equip", - slot = "hand", - level = 40, - }, - { - -- assassin dagger - itemid = 7404, - type = "deequip", - slot = "hand", - level = 40, - }, - { - -- berserker - itemid = 7403, - type = "equip", - slot = "hand", - level = 65, - }, - { - -- berserker - itemid = 7403, - type = "deequip", - slot = "hand", - level = 65, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- dragon slayer - itemid = 7402, - type = "equip", - slot = "hand", - level = 45, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- dragon slayer - itemid = 7402, - type = "deequip", - slot = "hand", - }, - { - -- orcish maul - itemid = 7392, - type = "equip", - slot = "hand", - level = 35, - }, - { - -- orcish maul - itemid = 7392, - type = "deequip", - slot = "hand", - }, - { - -- thaian sword - itemid = 7391, - type = "equip", - slot = "hand", - level = 50, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- thaian sword - itemid = 7391, - type = "deequip", - slot = "hand", - }, - { - -- the justice seeker - itemid = 7390, - type = "equip", - slot = "hand", - level = 75, - }, - { - -- the justice seeker - itemid = 7390, - type = "deequip", - slot = "hand", - }, - { - -- heroic axe - itemid = 7389, - type = "equip", - slot = "hand", - level = 60, - }, - { - -- heroic axe - itemid = 7389, - type = "deequip", - slot = "hand", - }, - { - -- vile axe - itemid = 7388, - type = "equip", - slot = "hand", - level = 55, - }, - { - -- vile axe - itemid = 7388, - type = "deequip", - slot = "hand", - }, - { - -- diamond sceptre - itemid = 7387, - type = "equip", - slot = "hand", - level = 25, - }, - { - -- diamond sceptre - itemid = 7387, - type = "deequip", - slot = "hand", - }, - { - -- mercenary sword - itemid = 7386, - type = "equip", - slot = "hand", - level = 40, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- mercenary sword - itemid = 7386, - type = "deequip", - slot = "hand", - }, - { - -- crimson sword - itemid = 7385, - type = "equip", - slot = "hand", - level = 20, - }, - { - -- crimson sword - itemid = 7385, - type = "deequip", - slot = "hand", - level = 20, - }, - { - -- mystic blade - itemid = 7384, - type = "equip", - slot = "hand", - level = 60, - }, - { - -- mystic blade - itemid = 7384, - type = "deequip", - slot = "hand", - }, - { - -- relic sword - itemid = 7383, - type = "equip", - slot = "hand", - level = 50, - }, - { - -- relic sword - itemid = 7383, - type = "deequip", - slot = "hand", - }, - { - -- demonrage sword - itemid = 7382, - type = "equip", - slot = "hand", - level = 60, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- demonrage sword - itemid = 7382, - type = "deequip", - slot = "hand", - }, - { - -- mammoth whopper - itemid = 7381, - type = "equip", - slot = "hand", - level = 20, - }, - { - -- mammoth whopper - itemid = 7381, - type = "deequip", - slot = "hand", - }, - { - -- headchopper - itemid = 7380, - type = "equip", - slot = "hand", - level = 35, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- headchopper - itemid = 7380, - type = "deequip", - slot = "hand", - }, - { - -- brutetamer's staff - itemid = 7379, - type = "equip", - slot = "hand", - level = 25, - }, - { - -- brutetamer's staff - itemid = 7379, - type = "deequip", - slot = "hand", - }, - { - -- royal spear - itemid = 7378, - type = "equip", - slot = "hand", - level = 25, - }, - { - -- royal spear - itemid = 7378, - type = "deequip", - slot = "hand", - level = 25, - }, - { - -- assassin star - itemid = 7368, - type = "equip", - slot = "hand", - level = 80, - }, - { - -- assassin star - itemid = 7368, - type = "deequip", - slot = "hand", - level = 80, - }, - { - -- enchanted spear - itemid = 7367, - type = "equip", - slot = "hand", - level = 42, - }, - { - -- enchanted spear - itemid = 7367, - type = "deequip", - slot = "hand", - level = 42, - }, - { - -- onyx arrow - itemid = 7365, - type = "equip", - slot = "ammo", - }, - { - -- onyx arrow - itemid = 7365, - type = "deequip", - slot = "ammo", - }, - { - -- sniper arrow - itemid = 7364, - type = "equip", - slot = "ammo", - }, - { - -- sniper arrow - itemid = 7364, - type = "deequip", - slot = "ammo", - }, - { - -- piercing bolt - itemid = 7363, - type = "equip", - slot = "ammo", - }, - { - -- piercing bolt - itemid = 7363, - type = "deequip", - slot = "ammo", - }, - { - -- flame of life - itemid = 7360, - type = "additem", - }, - { - -- flame of life - itemid = 7359, - type = "stepin", - }, - { - -- fur bag - itemid = 7343, - type = "equip", - slot = "backpack", - }, - { - -- fur bag - itemid = 7343, - type = "deequip", - slot = "backpack", - }, - { - -- fur backpack - itemid = 7342, - type = "equip", - slot = "backpack", - }, - { - -- fur backpack - itemid = 7342, - type = "deequip", - slot = "backpack", - }, - { - -- party hat - itemid = 6578, - type = "equip", - slot = "head", - }, - { - -- party hat - itemid = 6578, - type = "deequip", - slot = "head", - }, - { - -- ruthless axe - itemid = 6553, - type = "equip", - slot = "hand", - level = 75, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- ruthless axe - itemid = 6553, - type = "deequip", - slot = "hand", - }, - { - -- santa hat - itemid = 6531, - type = "equip", - slot = "head", - }, - { - -- santa hat - itemid = 6531, - type = "deequip", - slot = "head", - }, - { - -- infernal bolt - itemid = 6528, - type = "equip", - slot = "ammo", - }, - { - -- infernal bolt - itemid = 6528, - type = "deequip", - slot = "ammo", - }, - { - -- the avenger - itemid = 6527, - type = "equip", - slot = "hand", - level = 75, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- the avenger - itemid = 6527, - type = "deequip", - slot = "hand", - }, - { - -- necromancer shield - itemid = 6432, - type = "equip", - slot = "shield", - }, - { - -- necromancer shield - itemid = 6432, - type = "deequip", - slot = "shield", - }, - { - -- nightmare shield - itemid = 6390, - type = "equip", - slot = "shield", - }, - { - -- nightmare shield - itemid = 6390, - type = "deequip", - slot = "shield", - }, - { - -- death ring - itemid = 6300, - type = "equip", - slot = "ring", - }, - { - -- death ring - itemid = 6300, - type = "deequip", - slot = "ring", - }, - { - -- death ring - itemid = 6299, - type = "equip", - slot = "ring", - }, - { - -- death ring - itemid = 6299, - type = "deequip", - slot = "ring", - }, - { - -- pair of soft boots - itemid = 6529, - type = "equip", - slot = "feet", - }, - { - -- pair of soft boots - itemid = 6529, - type = "deequip", - slot = "feet", - }, - { - -- tortoise shield - itemid = 6131, - type = "equip", - slot = "shield", - }, - { - -- tortoise shield - itemid = 6131, - type = "deequip", - slot = "shield", - }, - { - -- Dragha's spellbook - itemid = 6120, - type = "equip", - slot = "shield", - }, - { - -- Dragha's spellbook - itemid = 6120, - type = "deequip", - slot = "shield", - }, - { - -- Ron the Ripper's sabre - itemid = 6101, - type = "equip", - slot = "hand", - }, - { - -- Ron the Ripper's sabre - itemid = 6101, - type = "deequip", - slot = "hand", - }, - { - -- pirate hat - itemid = 6096, - type = "equip", - slot = "head", - }, - { - -- pirate hat - itemid = 6096, - type = "deequip", - slot = "head", - }, - { - -- pirate shirt - itemid = 6095, - type = "equip", - slot = "armor", - }, - { - -- pirate shirt - itemid = 6095, - type = "deequip", - slot = "armor", - }, - { - -- beach bag - itemid = 5950, - type = "equip", - slot = "backpack", - }, - { - -- beach bag - itemid = 5950, - type = "deequip", - slot = "backpack", - }, - { - -- beach backpack - itemid = 5949, - type = "equip", - slot = "backpack", - }, - { - -- beach backpack - itemid = 5949, - type = "deequip", - slot = "backpack", - }, - { - -- pirate bag - itemid = 5927, - type = "equip", - slot = "backpack", - }, - { - -- pirate bag - itemid = 5927, - type = "deequip", - slot = "backpack", - }, - { - -- pirate backpack - itemid = 5926, - type = "equip", - slot = "backpack", - }, - { - -- pirate backpack - itemid = 5926, - type = "deequip", - slot = "backpack", - }, - { - -- pirate knee breeches - itemid = 5918, - type = "equip", - slot = "legs", - }, - { - -- pirate knee breeches - itemid = 5918, - type = "deequip", - slot = "legs", - }, - { - -- bandana - itemid = 5917, - type = "equip", - slot = "head", - }, - { - -- bandana - itemid = 5917, - type = "deequip", - slot = "head", - }, - { - -- Ferumbras' hat - itemid = 5903, - type = "equip", - slot = "head", - }, - { - -- Ferumbras' hat - itemid = 5903, - type = "deequip", - slot = "head", - }, - { - -- arbalest - itemid = 5803, - type = "equip", - slot = "hand", - level = 75, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- arbalest - itemid = 5803, - type = "deequip", - slot = "hand", - }, - { - -- jewelled backpack - itemid = 5801, - type = "equip", - slot = "backpack", - }, - { - -- jewelled backpack - itemid = 5801, - type = "deequip", - slot = "backpack", - }, - { - -- skull helmet - itemid = 5741, - type = "equip", - slot = "head", - }, - { - -- skull helmet - itemid = 5741, - type = "deequip", - slot = "head", - }, - { - -- pirate boots - itemid = 5461, - type = "equip", - slot = "feet", - }, - { - -- pirate boots - itemid = 5461, - type = "deequip", - slot = "feet", - }, - { - -- helmet of the deep - itemid = 5460, - type = "equip", - slot = "head", - }, - { - -- helmet of the deep - itemid = 5460, - type = "deequip", - slot = "head", - }, - { - -- spectral dress - itemid = 4836, - type = "equip", - slot = "armor", - }, - { - -- spectral dress - itemid = 4836, - type = "deequip", - slot = "armor", - }, - { - -- bast skirt - itemid = 3560, - type = "equip", - slot = "legs", - }, - { - -- bast skirt - itemid = 3560, - type = "deequip", - slot = "legs", - }, - { - -- crocodile boots - itemid = 3556, - type = "equip", - slot = "feet", - }, - { - -- crocodile boots - itemid = 3556, - type = "deequip", - slot = "feet", - }, - { - -- salamander shield - itemid = 3445, - type = "equip", - slot = "shield", - }, - { - -- salamander shield - itemid = 3445, - type = "deequip", - slot = "shield", - }, - { - -- sentinel shield - itemid = 3444, - type = "equip", - slot = "shield", - }, - { - -- sentinel shield - itemid = 3444, - type = "deequip", - slot = "shield", - }, - { - -- tusk shield - itemid = 3443, - type = "equip", - slot = "shield", - }, - { - -- tusk shield - itemid = 3443, - type = "deequip", - slot = "shield", - }, - { - -- bonelord helmet - itemid = 3408, - type = "equip", - slot = "head", - }, - { - -- bonelord helmet - itemid = 3408, - type = "deequip", - slot = "head", - }, - { - -- charmer's tiara - itemid = 3407, - type = "equip", - slot = "head", - }, - { - -- charmer's tiara - itemid = 3407, - type = "deequip", - slot = "head", - }, - { - -- feather headdress - itemid = 3406, - type = "equip", - slot = "head", - }, - { - -- feather headdress - itemid = 3406, - type = "deequip", - slot = "head", - }, - { - -- horseman helmet - itemid = 3405, - type = "equip", - slot = "head", - }, - { - -- horseman helmet - itemid = 3405, - type = "deequip", - slot = "head", - }, - { - -- leopard armor - itemid = 3404, - type = "equip", - slot = "armor", - }, - { - -- leopard armor - itemid = 3404, - type = "deequip", - slot = "armor", - }, - { - -- tribal mask - itemid = 3403, - type = "equip", - slot = "head", - }, - { - -- tribal mask - itemid = 3403, - type = "deequip", - slot = "head", - }, - { - -- banana staff - itemid = 3348, - type = "equip", - slot = "hand", - }, - { - -- banana staff - itemid = 3348, - type = "deequip", - slot = "hand", - }, - { - -- hunting spear - itemid = 3347, - type = "equip", - slot = "hand", - level = 20, - }, - { - -- hunting spear - itemid = 3347, - type = "deequip", - slot = "hand", - level = 20, - }, - { - -- ripper lance - itemid = 3346, - type = "equip", - slot = "hand", - }, - { - -- ripper lance - itemid = 3346, - type = "deequip", - slot = "hand", - }, - { - -- templar scytheblade - itemid = 3345, - type = "equip", - slot = "hand", - }, - { - -- templar scytheblade - itemid = 3345, - type = "deequip", - slot = "hand", - }, - { - -- beastslayer axe - itemid = 3344, - type = "equip", - slot = "hand", - level = 30, - }, - { - -- beastslayer axe - itemid = 3344, - type = "deequip", - slot = "hand", - }, - { - -- lich staff - itemid = 3343, - type = "equip", - slot = "hand", - level = 40, - }, - { - -- lich staff - itemid = 3343, - type = "deequip", - slot = "hand", - }, - { - -- old and used backpack - itemid = 3244, - type = "equip", - slot = "backpack", - }, - { - -- old and used backpack - itemid = 3244, - type = "deequip", - slot = "backpack", - }, - { - -- camouflage backpack - itemid = 2872, - type = "equip", - slot = "backpack", - }, - { - -- camouflage backpack - itemid = 2872, - type = "deequip", - slot = "backpack", - }, - { - -- camouflage bag - itemid = 2864, - type = "equip", - slot = "backpack", - }, - { - -- camouflage bag - itemid = 2864, - type = "deequip", - slot = "backpack", - }, - { - -- post officer's hat - itemid = 3576, - type = "equip", - slot = "head", - }, - { - -- post officer's hat - itemid = 3576, - type = "deequip", - slot = "head", - }, - { - -- wood cape - itemid = 3575, - type = "equip", - slot = "head", - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- wood cape - itemid = 3575, - type = "deequip", - slot = "head", - }, - { - -- mystic turban - itemid = 3574, - type = "equip", - slot = "head", - }, - { - -- mystic turban - itemid = 3574, - type = "deequip", - slot = "head", - }, - { - -- magician hat - itemid = 3573, - type = "equip", - slot = "head", - }, - { - -- magician hat - itemid = 3573, - type = "deequip", - slot = "head", - }, - { - -- scarf - itemid = 3572, - type = "equip", - slot = "necklace", - }, - { - -- scarf - itemid = 3572, - type = "deequip", - slot = "necklace", - }, - { - -- ranger's cloak - itemid = 3571, - type = "equip", - slot = "armor", - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- ranger's cloak - itemid = 3571, - type = "deequip", - slot = "armor", - }, - { - -- ball gown - itemid = 3570, - type = "equip", - slot = "armor", - }, - { - -- ball gown - itemid = 3570, - type = "deequip", - slot = "armor", - }, - { - -- white dress - itemid = 3569, - type = "equip", - slot = "armor", - }, - { - -- white dress - itemid = 3569, - type = "deequip", - slot = "armor", - }, - { - -- simple dress - itemid = 3568, - type = "equip", - slot = "armor", - }, - { - -- simple dress - itemid = 3568, - type = "deequip", - slot = "armor", - }, - { - -- blue robe - itemid = 3567, - type = "equip", - slot = "armor", - }, - { - -- blue robe - itemid = 3567, - type = "deequip", - slot = "armor", - }, - { - -- red robe - itemid = 3566, - type = "equip", - slot = "armor", - }, - { - -- red robe - itemid = 3566, - type = "deequip", - slot = "armor", - }, - { - -- cape - itemid = 3565, - type = "equip", - slot = "armor", - }, - { - -- cape - itemid = 3565, - type = "deequip", - slot = "armor", - }, - { - -- red tunic - itemid = 3564, - type = "equip", - slot = "armor", - }, - { - -- red tunic - itemid = 3564, - type = "deequip", - slot = "armor", - }, - { - -- green tunic - itemid = 3563, - type = "equip", - slot = "armor", - }, - { - -- green tunic - itemid = 3563, - type = "deequip", - slot = "armor", - }, - { - -- coat - itemid = 3562, - type = "equip", - slot = "armor", - }, - { - -- coat - itemid = 3562, - type = "deequip", - slot = "armor", - }, - { - -- jacket - itemid = 3561, - type = "equip", - slot = "armor", - }, - { - -- jacket - itemid = 3561, - type = "deequip", - slot = "armor", - }, - { - -- leather legs - itemid = 3559, - type = "equip", - slot = "legs", - }, - { - -- leather legs - itemid = 3559, - type = "deequip", - slot = "legs", - }, - { - -- chain legs - itemid = 3558, - type = "equip", - slot = "legs", - }, - { - -- chain legs - itemid = 3558, - type = "deequip", - slot = "legs", - }, - { - -- plate legs - itemid = 3557, - type = "equip", - slot = "legs", - }, - { - -- plate legs - itemid = 3557, - type = "deequip", - slot = "legs", - }, - { - -- golden boots - itemid = 3555, - type = "equip", - slot = "feet", - }, - { - -- golden boots - itemid = 3555, - type = "deequip", - slot = "feet", - }, - { - -- steel boots - itemid = 3554, - type = "equip", - slot = "feet", - }, - { - -- steel boots - itemid = 3554, - type = "deequip", - slot = "feet", - }, - { - -- bunnyslippers - itemid = 3553, - type = "equip", - slot = "feet", - }, - { - -- bunnyslippers - itemid = 3553, - type = "deequip", - slot = "feet", - }, - { - -- leather boots - itemid = 3552, - type = "equip", - slot = "feet", - }, - { - -- leather boots - itemid = 3552, - type = "deequip", - slot = "feet", - }, - { - -- sandals - itemid = 3551, - type = "equip", - slot = "feet", - }, - { - -- sandals - itemid = 3551, - type = "deequip", - slot = "feet", - }, - { - -- patched boots - itemid = 3550, - type = "equip", - slot = "feet", - }, - { - -- patched boots - itemid = 3550, - type = "deequip", - slot = "feet", - }, - { - -- pair of soft boots - itemid = 3549, - type = "equip", - slot = "feet", - }, - { - -- pair of soft boots - itemid = 3549, - type = "deequip", - slot = "feet", - }, - { - -- scythe - itemid = 3453, - type = "equip", - slot = "hand", - }, - { - -- scythe - itemid = 3453, - type = "deequip", - slot = "hand", - }, - { - -- power bolt - itemid = 3450, - type = "equip", - slot = "ammo", - }, - { - -- power bolt - itemid = 3450, - type = "deequip", - slot = "ammo", - }, - { - -- arrow - itemid = 3447, - type = "equip", - slot = "ammo", - }, - { - -- arrow - itemid = 3447, - type = "deequip", - slot = "ammo", - }, - { - -- bolt - itemid = 3446, - type = "equip", - slot = "ammo", - }, - { - -- bolt - itemid = 3446, - type = "deequip", - slot = "ammo", - }, - { - -- tempest shield - itemid = 3442, - type = "equip", - slot = "shield", - }, - { - -- tempest shield - itemid = 3442, - type = "deequip", - slot = "shield", - }, - { - -- bone shield - itemid = 3441, - type = "equip", - slot = "shield", - }, - { - -- bone shield - itemid = 3441, - type = "deequip", - slot = "shield", - }, - { - -- scarab shield - itemid = 3440, - type = "equip", - slot = "shield", - }, - { - -- scarab shield - itemid = 3440, - type = "deequip", - slot = "shield", - }, - { - -- phoenix shield - itemid = 3439, - type = "equip", - slot = "shield", - }, - { - -- phoenix shield - itemid = 3439, - type = "deequip", - slot = "shield", - }, - { - -- eagle shield - itemid = 3438, - type = "equip", - slot = "shield", - }, - { - -- eagle shield - itemid = 3438, - type = "deequip", - slot = "shield", - }, - { - -- amazon shield - itemid = 3437, - type = "equip", - slot = "shield", - }, - { - -- amazon shield - itemid = 3437, - type = "deequip", - slot = "shield", - }, - { - -- medusa shield - itemid = 3436, - type = "equip", - slot = "shield", - }, - { - -- medusa shield - itemid = 3436, - type = "deequip", - slot = "shield", - }, - { - -- castle shield - itemid = 3435, - type = "equip", - slot = "shield", - }, - { - -- castle shield - itemid = 3435, - type = "deequip", - slot = "shield", - }, - { - -- vampire shield - itemid = 3434, - type = "equip", - slot = "shield", - }, - { - -- vampire shield - itemid = 3434, - type = "deequip", - slot = "shield", - }, - { - -- griffin shield - itemid = 3433, - type = "equip", - slot = "shield", - }, - { - -- griffin shield - itemid = 3433, - type = "deequip", - slot = "shield", - }, - { - -- ancient shield - itemid = 3432, - type = "equip", - slot = "shield", - }, - { - -- ancient shield - itemid = 3432, - type = "deequip", - slot = "shield", - }, - { - -- viking shield - itemid = 3431, - type = "equip", - slot = "shield", - }, - { - -- viking shield - itemid = 3431, - type = "deequip", - slot = "shield", - }, - { - -- copper shield - itemid = 3430, - type = "equip", - slot = "shield", - }, - { - -- copper shield - itemid = 3430, - type = "deequip", - slot = "shield", - }, - { - -- black shield - itemid = 3429, - type = "equip", - slot = "shield", - }, - { - -- black shield - itemid = 3429, - type = "deequip", - slot = "shield", - }, - { - -- tower shield - itemid = 3428, - type = "equip", - slot = "shield", - }, - { - -- tower shield - itemid = 3428, - type = "deequip", - slot = "shield", - }, - { - -- rose shield - itemid = 3427, - type = "equip", - slot = "shield", - }, - { - -- rose shield - itemid = 3427, - type = "deequip", - slot = "shield", - }, - { - -- studded shield - itemid = 3426, - type = "equip", - slot = "shield", - }, - { - -- studded shield - itemid = 3426, - type = "deequip", - slot = "shield", - }, - { - -- dwarven shield - itemid = 3425, - type = "equip", - slot = "shield", - }, - { - -- dwarven shield - itemid = 3425, - type = "deequip", - slot = "shield", - }, - { - -- ornamented shield - itemid = 3424, - type = "equip", - slot = "shield", - }, - { - -- ornamented shield - itemid = 3424, - type = "deequip", - slot = "shield", - }, - { - -- blessed shield - itemid = 3423, - type = "equip", - slot = "shield", - }, - { - -- blessed shield - itemid = 3423, - type = "deequip", - slot = "shield", - }, - { - -- great shield - itemid = 3422, - type = "equip", - slot = "shield", - }, - { - -- great shield - itemid = 3422, - type = "deequip", - slot = "shield", - }, - { - -- dark shield - itemid = 3421, - type = "equip", - slot = "shield", - }, - { - -- dark shield - itemid = 3421, - type = "deequip", - slot = "shield", - }, - { - -- demon shield - itemid = 3420, - type = "equip", - slot = "shield", - }, - { - -- demon shield - itemid = 3420, - type = "deequip", - slot = "shield", - }, - { - -- crown shield - itemid = 3419, - type = "equip", - slot = "shield", - }, - { - -- crown shield - itemid = 3419, - type = "deequip", - slot = "shield", - }, - { - -- bonelord shield - itemid = 3418, - type = "equip", - slot = "shield", - }, - { - -- bonelord shield - itemid = 3418, - type = "deequip", - slot = "shield", - }, - { - -- shield of honour - itemid = 3417, - type = "equip", - slot = "shield", - }, - { - -- shield of honour - itemid = 3417, - type = "deequip", - slot = "shield", - }, - { - -- dragon shield - itemid = 3416, - type = "equip", - slot = "shield", - }, - { - -- dragon shield - itemid = 3416, - type = "deequip", - slot = "shield", - }, - { - -- guardian shield - itemid = 3415, - type = "equip", - slot = "shield", - }, - { - -- guardian shield - itemid = 3415, - type = "deequip", - slot = "shield", - }, - { - -- mastermind shield - itemid = 3414, - type = "equip", - slot = "shield", - }, - { - -- mastermind shield - itemid = 3414, - type = "deequip", - slot = "shield", - }, - { - -- battle shield - itemid = 3413, - type = "equip", - slot = "shield", - }, - { - -- battle shield - itemid = 3413, - type = "deequip", - slot = "shield", - }, - { - -- wooden shield - itemid = 3412, - type = "equip", - slot = "shield", - }, - { - -- wooden shield - itemid = 3412, - type = "deequip", - slot = "shield", - }, - { - -- brass shield - itemid = 3411, - type = "equip", - slot = "shield", - }, - { - -- brass shield - itemid = 3411, - type = "deequip", - slot = "shield", - }, - { - -- plate shield - itemid = 3410, - type = "equip", - slot = "shield", - }, - { - -- plate shield - itemid = 3410, - type = "deequip", - slot = "shield", - }, - { - -- steel shield - itemid = 3409, - type = "equip", - slot = "shield", - }, - { - -- steel shield - itemid = 3409, - type = "deequip", - slot = "shield", - }, - { - -- native armor - itemid = 3402, - type = "equip", - slot = "armor", - }, - { - -- native armor - itemid = 3402, - type = "deequip", - slot = "armor", - }, - { - -- elven legs - itemid = 3401, - type = "equip", - slot = "legs", - }, - { - -- elven legs - itemid = 3401, - type = "deequip", - slot = "legs", - }, - { - -- dragon scale helmet - itemid = 3400, - type = "equip", - slot = "head", - }, - { - -- dragon scale helmet - itemid = 3400, - type = "deequip", - slot = "head", - }, - { - -- elven mail - itemid = 3399, - type = "equip", - slot = "armor", - }, - { - -- elven mail - itemid = 3399, - type = "deequip", - slot = "armor", - }, - { - -- dwarven legs - itemid = 3398, - type = "equip", - slot = "legs", - }, - { - -- dwarven legs - itemid = 3398, - type = "deequip", - slot = "legs", - }, - { - -- dwarven armor - itemid = 3397, - type = "equip", - slot = "armor", - }, - { - -- dwarven armor - itemid = 3397, - type = "deequip", - slot = "armor", - }, - { - -- dwarven helmet - itemid = 3396, - type = "equip", - slot = "head", - }, - { - -- dwarven helmet - itemid = 3396, - type = "deequip", - slot = "head", - }, - { - -- ceremonial mask - itemid = 3395, - type = "equip", - slot = "head", - }, - { - -- ceremonial mask - itemid = 3395, - type = "deequip", - slot = "head", - }, - { - -- amazon armor - itemid = 3394, - type = "equip", - slot = "armor", - level = 60, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- amazon armor - itemid = 3394, - type = "deequip", - slot = "armor", - level = 60, - }, - { - -- amazon helmet - itemid = 3393, - type = "equip", - slot = "head", - }, - { - -- amazon helmet - itemid = 3393, - type = "deequip", - slot = "head", - }, - { - -- royal helmet - itemid = 3392, - type = "equip", - slot = "head", - }, - { - -- royal helmet - itemid = 3392, - type = "deequip", - slot = "head", - }, - { - -- crusader helmet - itemid = 3391, - type = "equip", - slot = "head", - }, - { - -- crusader helmet - itemid = 3391, - type = "deequip", - slot = "head", - }, - { - -- horned helmet - itemid = 3390, - type = "equip", - slot = "head", - }, - { - -- horned helmet - itemid = 3390, - type = "deequip", - slot = "head", - }, - { - -- demon legs - itemid = 3389, - type = "equip", - slot = "legs", - }, - { - -- demon legs - itemid = 3389, - type = "deequip", - slot = "legs", - }, - { - -- demon armor - itemid = 3388, - type = "equip", - slot = "armor", - }, - { - -- demon armor - itemid = 3388, - type = "deequip", - slot = "armor", - }, - { - -- demon helmet - itemid = 3387, - type = "equip", - slot = "head", - }, - { - -- demon helmet - itemid = 3387, - type = "deequip", - slot = "head", - }, - { - -- dragon scale mail - itemid = 3386, - type = "equip", - slot = "armor", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- dragon scale mail - itemid = 3386, - type = "deequip", - slot = "armor", - }, - { - -- crown helmet - itemid = 3385, - type = "equip", - slot = "head", - }, - { - -- crown helmet - itemid = 3385, - type = "deequip", - slot = "head", - }, - { - -- dark helmet - itemid = 3384, - type = "equip", - slot = "head", - }, - { - -- dark helmet - itemid = 3384, - type = "deequip", - slot = "head", - }, - { - -- dark armor - itemid = 3383, - type = "equip", - slot = "armor", - }, - { - -- dark armor - itemid = 3383, - type = "deequip", - slot = "armor", - }, - { - -- crown legs - itemid = 3382, - type = "equip", - slot = "legs", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- crown legs - itemid = 3382, - type = "deequip", - slot = "legs", - }, - { - -- crown armor - itemid = 3381, - type = "equip", - slot = "armor", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- crown armor - itemid = 3381, - type = "deequip", - slot = "armor", - }, - { - -- noble armor - itemid = 3380, - type = "equip", - slot = "armor", - }, - { - -- noble armor - itemid = 3380, - type = "deequip", - slot = "armor", - }, - { - -- doublet - itemid = 3379, - type = "equip", - slot = "armor", - }, - { - -- doublet - itemid = 3379, - type = "deequip", - slot = "armor", - }, - { - -- studded armor - itemid = 3378, - type = "equip", - slot = "armor", - }, - { - -- studded armor - itemid = 3378, - type = "deequip", - slot = "armor", - }, - { - -- scale armor - itemid = 3377, - type = "equip", - slot = "armor", - }, - { - -- scale armor - itemid = 3377, - type = "deequip", - slot = "armor", - }, - { - -- studded helmet - itemid = 3376, - type = "equip", - slot = "head", - }, - { - -- studded helmet - itemid = 3376, - type = "deequip", - slot = "head", - }, - { - -- soldier helmet - itemid = 3375, - type = "equip", - slot = "head", - }, - { - -- soldier helmet - itemid = 3375, - type = "deequip", - slot = "head", - }, - { - -- legion helmet - itemid = 3374, - type = "equip", - slot = "head", - }, - { - -- legion helmet - itemid = 3374, - type = "deequip", - slot = "head", - }, - { - -- strange helmet - itemid = 3373, - type = "equip", - slot = "head", - }, - { - -- strange helmet - itemid = 3373, - type = "deequip", - slot = "head", - }, - { - -- brass legs - itemid = 3372, - type = "equip", - slot = "legs", - }, - { - -- brass legs - itemid = 3372, - type = "deequip", - slot = "legs", - }, - { - -- knight legs - itemid = 3371, - type = "equip", - slot = "legs", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- knight legs - itemid = 3371, - type = "deequip", - slot = "legs", - }, - { - -- knight armor - itemid = 3370, - type = "equip", - slot = "armor", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- knight armor - itemid = 3370, - type = "deequip", - slot = "armor", - }, - { - -- warrior helmet - itemid = 3369, - type = "equip", - slot = "head", - }, - { - -- warrior helmet - itemid = 3369, - type = "deequip", - slot = "head", - }, - { - -- winged helmet - itemid = 3368, - type = "equip", - slot = "head", - }, - { - -- winged helmet - itemid = 3368, - type = "deequip", - slot = "head", - }, - { - -- viking helmet - itemid = 3367, - type = "equip", - slot = "head", - }, - { - -- viking helmet - itemid = 3367, - type = "deequip", - slot = "head", - }, - { - -- magic plate armor - itemid = 3366, - type = "equip", - slot = "armor", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- magic plate armor - itemid = 3366, - type = "deequip", - slot = "armor", - }, - { - -- golden helmet - itemid = 3365, - type = "equip", - slot = "head", - }, - { - -- golden helmet - itemid = 3365, - type = "deequip", - slot = "head", - }, - { - -- golden legs - itemid = 3364, - type = "equip", - slot = "legs", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- golden legs - itemid = 3364, - type = "deequip", - slot = "legs", - }, - { - -- dragon scale legs - itemid = 3363, - type = "equip", - slot = "legs", - }, - { - -- dragon scale legs - itemid = 3363, - type = "deequip", - slot = "legs", - }, - { - -- studded legs - itemid = 3362, - type = "equip", - slot = "legs", - }, - { - -- studded legs - itemid = 3362, - type = "deequip", - slot = "legs", - }, - { - -- leather armor - itemid = 3361, - type = "equip", - slot = "armor", - }, - { - -- leather armor - itemid = 3361, - type = "deequip", - slot = "armor", - }, - { - -- golden armor - itemid = 3360, - type = "equip", - slot = "armor", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- golden armor - itemid = 3360, - type = "deequip", - slot = "armor", - }, - { - -- brass armor - itemid = 3359, - type = "equip", - slot = "armor", - }, - { - -- brass armor - itemid = 3359, - type = "deequip", - slot = "armor", - }, - { - -- chain armor - itemid = 3358, - type = "equip", - slot = "armor", - }, - { - -- chain armor - itemid = 3358, - type = "deequip", - slot = "armor", - }, - { - -- plate armor - itemid = 3357, - type = "equip", - slot = "armor", - }, - { - -- plate armor - itemid = 3357, - type = "deequip", - slot = "armor", - }, - { - -- devil helmet - itemid = 3356, - type = "equip", - slot = "head", - }, - { - -- devil helmet - itemid = 3356, - type = "deequip", - slot = "head", - }, - { - -- leather helmet - itemid = 3355, - type = "equip", - slot = "head", - }, - { - -- leather helmet - itemid = 3355, - type = "deequip", - slot = "head", - }, - { - -- brass helmet - itemid = 3354, - type = "equip", - slot = "head", - }, - { - -- brass helmet - itemid = 3354, - type = "deequip", - slot = "head", - }, - { - -- iron helmet - itemid = 3353, - type = "equip", - slot = "head", - }, - { - -- iron helmet - itemid = 3353, - type = "deequip", - slot = "head", - }, - { - -- chain helmet - itemid = 3352, - type = "equip", - slot = "head", - }, - { - -- chain helmet - itemid = 3352, - type = "deequip", - slot = "head", - }, - { - -- steel helmet - itemid = 3351, - type = "equip", - slot = "head", - }, - { - -- steel helmet - itemid = 3351, - type = "deequip", - slot = "head", - }, - { - -- bow - itemid = 3350, - type = "equip", - slot = "hand", - }, - { - -- bow - itemid = 3350, - type = "deequip", - slot = "hand", - }, - { - -- crossbow - itemid = 3349, - type = "equip", - slot = "hand", - }, - { - -- crossbow - itemid = 3349, - type = "deequip", - slot = "hand", - }, - { - -- war axe - itemid = 3342, - type = "equip", - slot = "hand", - level = 65, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- war axe - itemid = 3342, - type = "deequip", - slot = "hand", - }, - { - -- arcane staff - itemid = 3341, - type = "equip", - slot = "hand", - level = 75, - }, - { - -- arcane staff - itemid = 3341, - type = "deequip", - slot = "hand", - }, - { - -- heavy mace - itemid = 3340, - type = "equip", - slot = "hand", - level = 70, - }, - { - -- heavy mace - itemid = 3340, - type = "deequip", - slot = "hand", - }, - { - -- djinn blade - itemid = 3339, - type = "equip", - slot = "hand", - level = 35, - }, - { - -- djinn blade - itemid = 3339, - type = "deequip", - slot = "hand", - }, - { - -- bone sword - itemid = 3338, - type = "equip", - slot = "hand", - }, - { - -- bone sword - itemid = 3338, - type = "deequip", - slot = "hand", - }, - { - -- bone club - itemid = 3337, - type = "equip", - slot = "hand", - }, - { - -- bone club - itemid = 3337, - type = "deequip", - slot = "hand", - }, - { - -- studded club - itemid = 3336, - type = "equip", - slot = "hand", - }, - { - -- studded club - itemid = 3336, - type = "deequip", - slot = "hand", - }, - { - -- twin axe - itemid = 3335, - type = "equip", - slot = "hand", - level = 50, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- twin axe - itemid = 3335, - type = "deequip", - slot = "hand", - }, - { - -- pharaoh sword - itemid = 3334, - type = "equip", - slot = "hand", - level = 45, - }, - { - -- pharaoh sword - itemid = 3334, - type = "deequip", - slot = "hand", - }, - { - -- crystal mace - itemid = 3333, - type = "equip", - slot = "hand", - level = 35, - }, - { - -- crystal mace - itemid = 3333, - type = "deequip", - slot = "hand", - }, - { - -- hammer of wrath - itemid = 3332, - type = "equip", - slot = "hand", - level = 65, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- hammer of wrath - itemid = 3332, - type = "deequip", - slot = "hand", - }, - { - -- ravager's axe - itemid = 3331, - type = "equip", - slot = "hand", - level = 70, - }, - { - -- ravager's axe - itemid = 3331, - type = "deequip", - slot = "hand", - }, - { - -- heavy machete - itemid = 3330, - type = "equip", - slot = "hand", - }, - { - -- heavy machete - itemid = 3330, - type = "deequip", - slot = "hand", - }, - { - -- daramian axe - itemid = 3329, - type = "equip", - slot = "hand", - }, - { - -- daramian axe - itemid = 3329, - type = "deequip", - slot = "hand", - }, - { - -- daramian waraxe - itemid = 3328, - type = "equip", - slot = "hand", - level = 25, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- daramian waraxe - itemid = 3328, - type = "deequip", - slot = "hand", - }, - { - -- daramian mace - itemid = 3327, - type = "equip", - slot = "hand", - }, - { - -- daramian mace - itemid = 3327, - type = "deequip", - slot = "hand", - }, - { - -- epee - itemid = 3326, - type = "equip", - slot = "hand", - level = 30, - }, - { - -- epee - itemid = 3326, - type = "deequip", - slot = "hand", - }, - { - -- light mace - itemid = 3325, - type = "equip", - slot = "hand", - }, - { - -- light mace - itemid = 3325, - type = "deequip", - slot = "hand", - }, - { - -- skull staff - itemid = 3324, - type = "equip", - slot = "hand", - level = 30, - }, - { - -- skull staff - itemid = 3324, - type = "deequip", - slot = "hand", - }, - { - -- dwarven axe - itemid = 3323, - type = "equip", - slot = "hand", - level = 20, - }, - { - -- dwarven axe - itemid = 3323, - type = "deequip", - slot = "hand", - }, - { - -- dragon hammer - itemid = 3322, - type = "equip", - slot = "hand", - level = 25, - }, - { - -- dragon hammer - itemid = 3322, - type = "deequip", - slot = "hand", - }, - { - -- enchanted staff - itemid = 3321, - type = "equip", - slot = "hand", - }, - { - -- enchanted staff - itemid = 3321, - type = "deequip", - slot = "hand", - }, - { - -- fire axe - itemid = 3320, - type = "equip", - slot = "hand", - level = 35, - }, - { - -- fire axe - itemid = 3320, - type = "deequip", - slot = "hand", - }, - { - -- stonecutter axe - itemid = 3319, - type = "equip", - slot = "hand", - level = 90, - }, - { - -- stonecutter axe - itemid = 3319, - type = "deequip", - slot = "hand", - }, - { - -- knight axe - itemid = 3318, - type = "equip", - slot = "hand", - level = 25, - }, - { - -- knight axe - itemid = 3318, - type = "deequip", - slot = "hand", - }, - { - -- barbarian axe - itemid = 3317, - type = "equip", - slot = "hand", - level = 20, - }, - { - -- barbarian axe - itemid = 3317, - type = "deequip", - slot = "hand", - }, - { - -- orcish axe - itemid = 3316, - type = "equip", - slot = "hand", - }, - { - -- orcish axe - itemid = 3316, - type = "deequip", - slot = "hand", - }, - { - -- guardian halberd - itemid = 3315, - type = "equip", - slot = "hand", - level = 55, - }, - { - -- guardian halberd - itemid = 3315, - type = "deequip", - slot = "hand", - }, - { - -- naginata - itemid = 3314, - type = "equip", - slot = "hand", - level = 25, - }, - { - -- naginata - itemid = 3314, - type = "deequip", - slot = "hand", - }, - { - -- obsidian lance - itemid = 3313, - type = "equip", - slot = "hand", - level = 20, - }, - { - -- obsidian lance - itemid = 3313, - type = "deequip", - slot = "hand", - }, - { - -- silver mace - itemid = 3312, - type = "equip", - slot = "hand", - level = 45, - }, - { - -- silver mace - itemid = 3312, - type = "deequip", - slot = "hand", - }, - { - -- clerical mace - itemid = 3311, - type = "equip", - slot = "hand", - level = 20, - }, - { - -- clerical mace - itemid = 3311, - type = "deequip", - slot = "hand", - }, - { - -- iron hammer - itemid = 3310, - type = "equip", - slot = "hand", - }, - { - -- iron hammer - itemid = 3310, - type = "deequip", - slot = "hand", - }, - { - -- thunder hammer - itemid = 3309, - type = "equip", - slot = "hand", - level = 85, - }, - { - -- thunder hammer - itemid = 3309, - type = "deequip", - slot = "hand", - }, - { - -- machete - itemid = 3308, - type = "equip", - slot = "hand", - }, - { - -- machete - itemid = 3308, - type = "deequip", - slot = "hand", - }, - { - -- scimitar - itemid = 3307, - type = "equip", - slot = "hand", - }, - { - -- scimitar - itemid = 3307, - type = "deequip", - slot = "hand", - }, - { - -- golden sickle - itemid = 3306, - type = "equip", - slot = "hand", - }, - { - -- golden sickle - itemid = 3306, - type = "deequip", - slot = "hand", - }, - { - -- battle hammer - itemid = 3305, - type = "equip", - slot = "hand", - }, - { - -- battle hammer - itemid = 3305, - type = "deequip", - slot = "hand", - }, - { - -- crowbar - itemid = 3304, - type = "equip", - slot = "hand", - }, - { - -- crowbar - itemid = 3304, - type = "deequip", - slot = "hand", - }, - { - -- great axe - itemid = 3303, - type = "equip", - slot = "hand", - level = 95, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- great axe - itemid = 3303, - type = "deequip", - slot = "hand", - }, - { - -- dragon lance - itemid = 3302, - type = "equip", - slot = "hand", - level = 60, - }, - { - -- dragon lance - itemid = 3302, - type = "deequip", - slot = "hand", - }, - { - -- broadsword - itemid = 3301, - type = "equip", - slot = "hand", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- broadsword - itemid = 3301, - type = "deequip", - slot = "hand", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- katana - itemid = 3300, - type = "equip", - slot = "hand", - }, - { - -- katana - itemid = 3300, - type = "deequip", - slot = "hand", - }, - { - -- poison dagger - itemid = 3299, - type = "equip", - slot = "hand", - }, - { - -- poison dagger - itemid = 3299, - type = "deequip", - slot = "hand", - }, - { - -- throwing knife - itemid = 3298, - type = "equip", - slot = "hand", - }, - { - -- throwing knife - itemid = 3298, - type = "deequip", - slot = "hand", - }, - { - -- serpent sword - itemid = 3297, - type = "equip", - slot = "hand", - }, - { - -- serpent sword - itemid = 3297, - type = "deequip", - slot = "hand", - }, - { - -- warlord sword - itemid = 3296, - type = "equip", - slot = "hand", - level = 120, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- warlord sword - itemid = 3296, - type = "deequip", - slot = "hand", - }, - { - -- bright sword - itemid = 3295, - type = "equip", - slot = "hand", - level = 30, - }, - { - -- bright sword - itemid = 3295, - type = "deequip", - slot = "hand", - level = 30, - }, - { - -- short sword - itemid = 3294, - type = "equip", - slot = "hand", - }, - { - -- short sword - itemid = 3294, - type = "deequip", - slot = "hand", - }, - { - -- sickle - itemid = 3293, - type = "equip", - slot = "hand", - }, - { - -- sickle - itemid = 3293, - type = "deequip", - slot = "hand", - }, - { - -- combat knife - itemid = 3292, - type = "equip", - slot = "hand", - }, - { - -- combat knife - itemid = 3292, - type = "deequip", - slot = "hand", - }, - { - -- knife - itemid = 3291, - type = "equip", - slot = "hand", - }, - { - -- knife - itemid = 3291, - type = "deequip", - slot = "hand", - }, - { - -- silver dagger - itemid = 3290, - type = "equip", - slot = "hand", - }, - { - -- silver dagger - itemid = 3290, - type = "deequip", - slot = "hand", - }, - { - -- staff - itemid = 3289, - type = "equip", - slot = "hand", - }, - { - -- staff - itemid = 3289, - type = "deequip", - slot = "hand", - }, - { - -- magic sword - itemid = 3288, - type = "equip", - slot = "hand", - level = 80, - }, - { - -- magic sword - itemid = 3288, - type = "deequip", - slot = "hand", - }, - { - -- throwing star - itemid = 3287, - type = "equip", - slot = "hand", - }, - { - -- throwing star - itemid = 3287, - type = "deequip", - slot = "hand", - }, - { - -- mace - itemid = 3286, - type = "equip", - slot = "hand", - }, - { - -- mace - itemid = 3286, - type = "deequip", - slot = "hand", - }, - { - -- longsword - itemid = 3285, - type = "equip", - slot = "hand", - }, - { - -- longsword - itemid = 3285, - type = "deequip", - slot = "hand", - }, - { - -- ice rapier - itemid = 3284, - type = "equip", - slot = "hand", - }, - { - -- ice rapier - itemid = 3284, - type = "deequip", - slot = "hand", - }, - { - -- carlin sword - itemid = 3283, - type = "equip", - slot = "hand", - }, - { - -- carlin sword - itemid = 3283, - type = "deequip", - slot = "hand", - }, - { - -- morning star - itemid = 3282, - type = "equip", - slot = "hand", - }, - { - -- morning star - itemid = 3282, - type = "deequip", - slot = "hand", - }, - { - -- giant sword - itemid = 3281, - type = "equip", - slot = "hand", - level = 55, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- giant sword - itemid = 3281, - type = "deequip", - slot = "hand", - }, - { - -- fire sword - itemid = 3280, - type = "equip", - slot = "hand", - level = 30, - }, - { - -- fire sword - itemid = 3280, - type = "deequip", - slot = "hand", - }, - { - -- war hammer - itemid = 3279, - type = "equip", - slot = "hand", - level = 50, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- war hammer - itemid = 3279, - type = "deequip", - slot = "hand", - }, - { - -- magic longsword - itemid = 3278, - type = "equip", - slot = "hand", - level = 140, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- magic longsword - itemid = 3278, - type = "deequip", - slot = "hand", - }, - { - -- spear - itemid = 3277, - type = "equip", - slot = "hand", - }, - { - -- spear - itemid = 3277, - type = "deequip", - slot = "hand", - }, - { - -- hatchet - itemid = 3276, - type = "equip", - slot = "hand", - }, - { - -- hatchet - itemid = 3276, - type = "deequip", - slot = "hand", - }, - { - -- double axe - itemid = 3275, - type = "equip", - slot = "hand", - level = 25, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- double axe - itemid = 3275, - type = "deequip", - slot = "hand", - }, - { - -- axe - itemid = 3274, - type = "equip", - slot = "hand", - }, - { - -- axe - itemid = 3274, - type = "deequip", - slot = "hand", - }, - { - -- sabre - itemid = 3273, - type = "equip", - slot = "hand", - }, - { - -- sabre - itemid = 3273, - type = "deequip", - slot = "hand", - }, - { - -- rapier - itemid = 3272, - type = "equip", - slot = "hand", - }, - { - -- rapier - itemid = 3272, - type = "deequip", - slot = "hand", - }, - { - -- spike sword - itemid = 3271, - type = "equip", - slot = "hand", - }, - { - -- spike sword - itemid = 3271, - type = "deequip", - slot = "hand", - }, - { - -- club - itemid = 3270, - type = "equip", - slot = "hand", - }, - { - -- club - itemid = 3270, - type = "deequip", - slot = "hand", - }, - { - -- halberd - itemid = 3269, - type = "equip", - slot = "hand", - level = 25, - }, - { - -- halberd - itemid = 3269, - type = "deequip", - slot = "hand", - }, - { - -- hand axe - itemid = 3268, - type = "equip", - slot = "hand", - }, - { - -- hand axe - itemid = 3268, - type = "deequip", - slot = "hand", - }, - { - -- dagger - itemid = 3267, - type = "equip", - slot = "hand", - }, - { - -- dagger - itemid = 3267, - type = "deequip", - slot = "hand", - }, - { - -- battle axe - itemid = 3266, - type = "equip", - slot = "hand", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- battle axe - itemid = 3266, - type = "deequip", - slot = "hand", - }, - { - -- two handed sword - itemid = 3265, - type = "equip", - slot = "hand", - level = 20, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- two handed sword - itemid = 3265, - type = "deequip", - slot = "hand", - }, - { - -- sword - itemid = 3264, - type = "equip", - slot = "hand", - }, - { - -- sword - itemid = 3264, - type = "deequip", - slot = "hand", - }, - { - -- backpack of holding - itemid = 3253, - type = "equip", - slot = "backpack", - }, - { - -- backpack of holding - itemid = 3253, - type = "deequip", - slot = "backpack", - }, - { - -- boots of waterwalking - itemid = 3246, - type = "equip", - slot = "feet", - }, - { - -- boots of waterwalking - itemid = 3246, - type = "deequip", - slot = "feet", - }, - { - -- ring of wishes - itemid = 3245, - type = "equip", - slot = "ring", - }, - { - -- ring of wishes - itemid = 3245, - type = "deequip", - slot = "ring", - }, - { - -- helmet of the ancients - itemid = 3230, - type = "equip", - slot = "head", - }, - { - -- helmet of the ancients - itemid = 3230, - type = "deequip", - slot = "head", - }, - { - -- helmet of the ancients - itemid = 3229, - type = "equip", - slot = "head", - }, - { - -- helmet of the ancients - itemid = 3229, - type = "deequip", - slot = "head", - }, - { - -- damaged helmet - itemid = 3226, - type = "equip", - slot = "head", - }, - { - -- damaged helmet - itemid = 3226, - type = "deequip", - slot = "head", - }, - { - -- hat of the mad - itemid = 3210, - type = "equip", - slot = "head", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- hat of the mad - itemid = 3210, - type = "deequip", - slot = "head", - }, - { - -- giant smithhammer - itemid = 3208, - type = "equip", - slot = "hand", - }, - { - -- giant smithhammer - itemid = 3208, - type = "deequip", - slot = "hand", - }, - { - -- paw amulet - itemid = 3102, - type = "equip", - slot = "necklace", - }, - { - -- paw amulet - itemid = 3102, - type = "deequip", - slot = "necklace", - }, - { - -- ring of healing - itemid = 3100, - type = "equip", - slot = "ring", - }, - { - -- ring of healing - itemid = 3100, - type = "deequip", - slot = "ring", - }, - { - -- dwarven ring - itemid = 3099, - type = "equip", - slot = "ring", - }, - { - -- dwarven ring - itemid = 3099, - type = "deequip", - slot = "ring", - }, - { - -- ring of healing - itemid = 3098, - type = "equip", - slot = "ring", - }, - { - -- ring of healing - itemid = 3098, - type = "deequip", - slot = "ring", - }, - { - -- dwarven ring - itemid = 3097, - type = "equip", - slot = "ring", - }, - { - -- dwarven ring - itemid = 3097, - type = "deequip", - slot = "ring", - }, - { - -- club ring - itemid = 3096, - type = "equip", - slot = "ring", - }, - { - -- club ring - itemid = 3096, - type = "deequip", - slot = "ring", - }, - { - -- axe ring - itemid = 3095, - type = "equip", - slot = "ring", - }, - { - -- axe ring - itemid = 3095, - type = "deequip", - slot = "ring", - }, - { - -- sword ring - itemid = 3094, - type = "equip", - slot = "ring", - }, - { - -- sword ring - itemid = 3094, - type = "deequip", - slot = "ring", - }, - { - -- club ring - itemid = 3093, - type = "equip", - slot = "ring", - }, - { - -- club ring - itemid = 3093, - type = "deequip", - slot = "ring", - }, - { - -- axe ring - itemid = 3092, - type = "equip", - slot = "ring", - }, - { - -- axe ring - itemid = 3092, - type = "deequip", - slot = "ring", - }, - { - -- sword ring - itemid = 3091, - type = "equip", - slot = "ring", - }, - { - -- sword ring - itemid = 3091, - type = "deequip", - slot = "ring", - }, - { - -- time ring - itemid = 3090, - type = "equip", - slot = "ring", - }, - { - -- time ring - itemid = 3090, - type = "deequip", - slot = "ring", - }, - { - -- life ring - itemid = 3089, - type = "equip", - slot = "ring", - }, - { - -- life ring - itemid = 3089, - type = "deequip", - slot = "ring", - }, - { - -- energy ring - itemid = 3088, - type = "equip", - slot = "ring", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- energy ring - itemid = 3088, - type = "deequip", - slot = "ring", - }, - { - -- power ring - itemid = 3087, - type = "equip", - slot = "ring", - }, - { - -- power ring - itemid = 3087, - type = "deequip", - slot = "ring", - }, - { - -- stealth ring - itemid = 3086, - type = "equip", - slot = "ring", - }, - { - -- stealth ring - itemid = 3086, - type = "deequip", - slot = "ring", - }, - { - -- dragon necklace - itemid = 3085, - type = "equip", - slot = "necklace", - }, - { - -- dragon necklace - itemid = 3085, - type = "deequip", - slot = "necklace", - }, - { - -- protection amulet - itemid = 3084, - type = "equip", - slot = "necklace", - }, - { - -- protection amulet - itemid = 3084, - type = "deequip", - slot = "necklace", - }, - { - -- garlic necklace - itemid = 3083, - type = "equip", - slot = "necklace", - }, - { - -- garlic necklace - itemid = 3083, - type = "deequip", - slot = "necklace", - }, - { - -- elven amulet - itemid = 3082, - type = "equip", - slot = "necklace", - }, - { - -- elven amulet - itemid = 3082, - type = "deequip", - slot = "necklace", - }, - { - -- stone skin amulet - itemid = 3081, - type = "equip", - slot = "necklace", - }, - { - -- stone skin amulet - itemid = 3081, - type = "deequip", - slot = "necklace", - }, - { - -- amulet of life - itemid = 3080, - type = "equip", - slot = "necklace", - }, - { - -- amulet of life - itemid = 3080, - type = "deequip", - slot = "necklace", - }, - { - -- boots of haste - itemid = 3079, - type = "equip", - slot = "feet", - }, - { - -- boots of haste - itemid = 3079, - type = "deequip", - slot = "feet", - }, - { - -- wand of dragonbreath - itemid = 3075, - type = "equip", - slot = "hand", - level = 13, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of dragonbreath - itemid = 3075, - type = "deequip", - slot = "hand", - level = 13, - }, - { - -- wand of vortex - itemid = 3074, - type = "equip", - slot = "hand", - level = 6, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of vortex - itemid = 3074, - type = "deequip", - slot = "hand", - level = 6, - }, - { - -- wand of cosmic energy - itemid = 3073, - type = "equip", - slot = "hand", - level = 26, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of cosmic energy - itemid = 3073, - type = "deequip", - slot = "hand", - level = 26, - }, - { - -- wand of decay - itemid = 3072, - type = "equip", - slot = "hand", - level = 19, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of decay - itemid = 3072, - type = "deequip", - slot = "hand", - level = 19, - }, - { - -- wand of inferno - itemid = 3071, - type = "equip", - slot = "hand", - level = 33, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of inferno - itemid = 3071, - type = "deequip", - slot = "hand", - level = 33, - }, - { - -- moonlight rod - itemid = 3070, - type = "equip", - slot = "hand", - level = 13, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- moonlight rod - itemid = 3070, - type = "deequip", - slot = "hand", - level = 13, - }, - { - -- necrotic rod - itemid = 3069, - type = "equip", - slot = "hand", - level = 19, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- necrotic rod - itemid = 3069, - type = "deequip", - slot = "hand", - level = 19, - }, - { - -- hailstorm rod - itemid = 3067, - type = "equip", - slot = "hand", - level = 33, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- hailstorm rod - itemid = 3067, - type = "deequip", - slot = "hand", - level = 33, - }, - { - -- snakebite rod - itemid = 3066, - type = "equip", - slot = "hand", - level = 6, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- snakebite rod - itemid = 3066, - type = "deequip", - slot = "hand", - level = 6, - }, - { - -- terra rod - itemid = 3065, - type = "equip", - slot = "hand", - level = 26, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- terra rod - itemid = 3065, - type = "deequip", - slot = "hand", - level = 26, - }, - { - -- gold ring - itemid = 3063, - type = "equip", - slot = "ring", - }, - { - -- gold ring - itemid = 3063, - type = "deequip", - slot = "ring", - }, - { - -- spellbook - itemid = 3059, - type = "equip", - slot = "shield", - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- spellbook - itemid = 3059, - type = "deequip", - slot = "shield", - }, - { - -- amulet of loss - itemid = 3057, - type = "equip", - slot = "necklace", - }, - { - -- amulet of loss - itemid = 3057, - type = "deequip", - slot = "necklace", - }, - { - -- bronze amulet - itemid = 3056, - type = "equip", - slot = "necklace", - }, - { - -- bronze amulet - itemid = 3056, - type = "deequip", - slot = "necklace", - }, - { - -- platinum amulet - itemid = 3055, - type = "equip", - slot = "necklace", - }, - { - -- platinum amulet - itemid = 3055, - type = "deequip", - slot = "necklace", - }, - { - -- silver amulet - itemid = 3054, - type = "equip", - slot = "necklace", - }, - { - -- silver amulet - itemid = 3054, - type = "deequip", - slot = "necklace", - }, - { - -- time ring - itemid = 3053, - type = "equip", - slot = "ring", - }, - { - -- time ring - itemid = 3053, - type = "deequip", - slot = "ring", - }, - { - -- life ring - itemid = 3052, - type = "equip", - slot = "ring", - }, - { - -- life ring - itemid = 3052, - type = "deequip", - slot = "ring", - }, - { - -- energy ring - itemid = 3051, - type = "equip", - slot = "ring", - vocation = { - { "Knight", true }, - { "Paladin", true, true }, - { "Elite Knight" }, - { "Royal Paladin" }, - }, - }, - { - -- energy ring - itemid = 3051, - type = "deequip", - slot = "ring", - }, - { - -- power ring - itemid = 3050, - type = "equip", - slot = "ring", - }, - { - -- power ring - itemid = 3050, - type = "deequip", - slot = "ring", - }, - { - -- stealth ring - itemid = 3049, - type = "equip", - slot = "ring", - }, - { - -- stealth ring - itemid = 3049, - type = "deequip", - slot = "ring", - }, - { - -- might ring - itemid = 3048, - type = "equip", - slot = "ring", - }, - { - -- might ring - itemid = 3048, - type = "deequip", - slot = "ring", - }, - { - -- strange talisman - itemid = 3045, - type = "equip", - slot = "necklace", - }, - { - -- strange talisman - itemid = 3045, - type = "deequip", - slot = "necklace", - }, - { - -- ancient amulet - itemid = 3025, - type = "equip", - slot = "necklace", - }, - { - -- ancient amulet - itemid = 3025, - type = "deequip", - slot = "necklace", - }, - { - -- ancient tiara - itemid = 3022, - type = "equip", - slot = "head", - }, - { - -- ancient tiara - itemid = 3022, - type = "deequip", - slot = "head", - }, - { - -- sapphire amulet - itemid = 3021, - type = "equip", - slot = "necklace", - }, - { - -- sapphire amulet - itemid = 3021, - type = "deequip", - slot = "necklace", - }, - { - -- demonbone amulet - itemid = 3019, - type = "equip", - slot = "necklace", - }, - { - -- demonbone amulet - itemid = 3019, - type = "deequip", - slot = "necklace", - }, - { - -- scarab amulet - itemid = 3018, - type = "equip", - slot = "necklace", - }, - { - -- scarab amulet - itemid = 3018, - type = "deequip", - slot = "necklace", - }, - { - -- ruby necklace - itemid = 3016, - type = "equip", - slot = "necklace", - }, - { - -- ruby necklace - itemid = 3016, - type = "deequip", - slot = "necklace", - }, - { - -- silver necklace - itemid = 3015, - type = "equip", - slot = "necklace", - }, - { - -- silver necklace - itemid = 3015, - type = "deequip", - slot = "necklace", - }, - { - -- star amulet - itemid = 3014, - type = "equip", - slot = "necklace", - }, - { - -- star amulet - itemid = 3014, - type = "deequip", - slot = "necklace", - }, - { - -- golden amulet - itemid = 3013, - type = "equip", - slot = "necklace", - }, - { - -- golden amulet - itemid = 3013, - type = "deequip", - slot = "necklace", - }, - { - -- wolf tooth chain - itemid = 3012, - type = "equip", - slot = "necklace", - }, - { - -- wolf tooth chain - itemid = 3012, - type = "deequip", - slot = "necklace", - }, - { - -- crown - itemid = 3011, - type = "equip", - slot = "head", - }, - { - -- crown - itemid = 3011, - type = "deequip", - slot = "head", - }, - { - -- bronze necklace - itemid = 3009, - type = "equip", - slot = "necklace", - }, - { - -- bronze necklace - itemid = 3009, - type = "deequip", - slot = "necklace", - }, - { - -- crystal necklace - itemid = 3008, - type = "equip", - slot = "necklace", - }, - { - -- crystal necklace - itemid = 3008, - type = "deequip", - slot = "necklace", - }, - { - -- crystal ring - itemid = 3007, - type = "equip", - slot = "ring", - }, - { - -- crystal ring - itemid = 3007, - type = "deequip", - slot = "ring", - }, - { - -- ring of the sky - itemid = 3006, - type = "equip", - slot = "ring", - }, - { - -- ring of the sky - itemid = 3006, - type = "deequip", - slot = "ring", - }, - { - -- wedding ring - itemid = 3004, - type = "equip", - slot = "ring", - }, - { - -- wedding ring - itemid = 3004, - type = "deequip", - slot = "ring", - }, - { - -- snowball - itemid = 2992, - type = "equip", - slot = "hand", - }, - { - -- snowball - itemid = 2992, - type = "deequip", - slot = "hand", - }, - { - -- golden backpack - itemid = 2871, - type = "equip", - slot = "backpack", - }, - { - -- golden backpack - itemid = 2871, - type = "deequip", - slot = "backpack", - }, - { - -- grey backpack - itemid = 2870, - type = "equip", - slot = "backpack", - }, - { - -- grey backpack - itemid = 2870, - type = "deequip", - slot = "backpack", - }, - { - -- blue backpack - itemid = 2869, - type = "equip", - slot = "backpack", - }, - { - -- blue backpack - itemid = 2869, - type = "deequip", - slot = "backpack", - }, - { - -- purple backpack - itemid = 2868, - type = "equip", - slot = "backpack", - }, - { - -- purple backpack - itemid = 2868, - type = "deequip", - slot = "backpack", - }, - { - -- red backpack - itemid = 2867, - type = "equip", - slot = "backpack", - }, - { - -- red backpack - itemid = 2867, - type = "deequip", - slot = "backpack", - }, - { - -- yellow backpack - itemid = 2866, - type = "equip", - slot = "backpack", - }, - { - -- yellow backpack - itemid = 2866, - type = "deequip", - slot = "backpack", - }, - { - -- green backpack - itemid = 2865, - type = "equip", - slot = "backpack", - }, - { - -- green backpack - itemid = 2865, - type = "deequip", - slot = "backpack", - }, - { - -- golden bag - itemid = 2863, - type = "equip", - slot = "backpack", - }, - { - -- golden bag - itemid = 2863, - type = "deequip", - slot = "backpack", - }, - { - -- grey bag - itemid = 2862, - type = "equip", - slot = "backpack", - }, - { - -- grey bag - itemid = 2862, - type = "deequip", - slot = "backpack", - }, - { - -- blue bag - itemid = 2861, - type = "equip", - slot = "backpack", - }, - { - -- blue bag - itemid = 2861, - type = "deequip", - slot = "backpack", - }, - { - -- purple bag - itemid = 2860, - type = "equip", - slot = "backpack", - }, - { - -- purple bag - itemid = 2860, - type = "deequip", - slot = "backpack", - }, - { - -- red bag - itemid = 2859, - type = "equip", - slot = "backpack", - }, - { - -- red bag - itemid = 2859, - type = "deequip", - slot = "backpack", - }, - { - -- yellow bag - itemid = 2858, - type = "equip", - slot = "backpack", - }, - { - -- yellow bag - itemid = 2858, - type = "deequip", - slot = "backpack", - }, - { - -- green bag - itemid = 2857, - type = "equip", - slot = "backpack", - }, - { - -- green bag - itemid = 2857, - type = "deequip", - slot = "backpack", - }, - { - -- backpack - itemid = 2854, - type = "equip", - slot = "backpack", - }, - { - -- backpack - itemid = 2854, - type = "deequip", - slot = "backpack", - }, - { - -- bag - itemid = 2853, - type = "equip", - slot = "backpack", - }, - { - -- bag - itemid = 2853, - type = "deequip", - slot = "backpack", - }, - { - -- searing fire - itemid = 2138, - type = "stepin", - }, - { - -- searing fire - itemid = 2138, - type = "additem", - }, - { - -- searing fire - itemid = 2137, - type = "stepin", - }, - { - -- searing fire - itemid = 2137, - type = "additem", - }, - { - -- smoke - itemid = 2136, - type = "stepin", - }, - { - -- smoke - itemid = 2136, - type = "additem", - }, - { - -- energy field - itemid = 2135, - type = "stepin", - }, - { - -- energy field - itemid = 2135, - type = "additem", - }, - { - -- poison gas - itemid = 2134, - type = "stepin", - }, - { - -- poison gas - itemid = 2134, - type = "additem", - }, - { - -- fire field - itemid = 2133, - type = "stepin", - }, - { - -- fire field - itemid = 2133, - type = "additem", - }, - { - -- fire field - itemid = 2132, - type = "stepin", - }, - { - -- fire field - itemid = 2132, - type = "additem", - }, - { - -- fire field - itemid = 21465, - type = "stepin", - }, - { - -- fire field - itemid = 21465, - type = "additem", - }, - { - -- rush wood - itemid = 2130, - type = "stepin", - }, - { - -- rush wood - itemid = 2130, - type = "additem", - }, - { - -- magic wall - itemid = 2129, - type = "stepin", - }, - { - -- magic wall - itemid = 2129, - type = "additem", - }, - { - -- magic wall - itemid = 2128, - type = "stepin", - }, - { - -- magic wall - itemid = 2128, - type = "additem", - }, - { - -- poison field - itemid = 2121, - type = "stepin", - }, - { - -- poison field - itemid = 2121, - type = "additem", - }, - { - -- energy field - itemid = 2126, - type = "stepin", - }, - { - -- energy field - itemid = 2126, - type = "additem", - }, - { - -- fire field - itemid = 2125, - type = "stepin", - }, - { - -- fire field - itemid = 2125, - type = "additem", - }, - { - -- fire field - itemid = 2124, - type = "stepin", - }, - { - -- fire field - itemid = 2124, - type = "additem", - }, - { - -- fire field - itemid = 2123, - type = "stepin", - }, - { - -- fire field - itemid = 2123, - type = "additem", - }, - { - -- energy field - itemid = 2122, - type = "stepin", - }, - { - -- energy field - itemid = 2122, - type = "additem", - }, - { - -- poison field - itemid = 105, - type = "stepin", - }, - { - -- poison field - itemid = 105, - type = "additem", - }, - { - -- fire field - itemid = 2120, - type = "stepin", - }, - { - -- fire field - itemid = 2120, - type = "additem", - }, - { - -- fire field - itemid = 2119, - type = "stepin", - }, - { - -- fire field - itemid = 2119, - type = "additem", - }, - { - -- fire field - itemid = 2118, - type = "stepin", - }, - { - -- fire field - itemid = 2118, - type = "additem", - }, - { - -- campfire - itemid = 2000, - type = "stepin", - }, - { - -- campfire - itemid = 2000, - type = "additem", - }, - { - -- campfire - itemid = 1999, - type = "stepin", - }, - { - -- campfire - itemid = 1999, - type = "additem", - }, - { - -- campfire - itemid = 1998, - type = "stepin", - }, - { - -- campfire - itemid = 1998, - type = "additem", - }, - { - -- small stone - itemid = 1781, - type = "equip", - slot = "hand", - }, - { - -- small stone - itemid = 1781, - type = "deequip", - slot = "hand", - }, -} - -for _, i in ipairs(items) do - local movement = MoveEvent() - movement:id(i.itemid or i.itemId) - - if i.type then - movement:type(i.type) - end - if i.slot then - movement:slot(i.slot) - end - if i.level then - movement:level(i.level) - end - if i.vocation then - for _, v in ipairs(i.vocation) do - movement:vocation(v[1], v[2] or false, v[3] or false) - end - end - movement:register() -end diff --git a/data-otservbr-global/scripts/movements/others/closing_door.lua b/data-otservbr-global/scripts/movements/others/closing_door.lua deleted file mode 100644 index 448d208b20f..00000000000 --- a/data-otservbr-global/scripts/movements/others/closing_door.lua +++ /dev/null @@ -1,125 +0,0 @@ --- Level and quests closing door (onStepIn). --- This prevents a player who has not yet done the quest, from crossing the player who has already done so, skipping the entire quest and going straight to the final reward. -local closingDoor = MoveEvent() - -local doorIds = {} -for index, value in ipairs(QuestDoorTable) do - if not table.contains(doorIds, value.openDoor) then - table.insert(doorIds, value.openDoor) - end -end -for index, value in ipairs(LevelDoorTable) do - if not table.contains(doorIds, value.openDoor) then - table.insert(doorIds, value.openDoor) - end -end -local skipActionIds = { - 12107, -} - -function closingDoor.onStepIn(creature, item, position, fromPosition) - local player = creature:getPlayer() - if not player then - return - end - - for index, value in ipairs(QuestDoorTable) do - if value.openDoor == item.itemid then - if player:getStorageValue(item.actionid) ~= -1 or table.contains(skipActionIds, item.actionid) then - return true - else - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "The door seems to be sealed against unwanted intruders.") - player:teleportTo(fromPosition, true) - return false - end - end - end - for index, value in ipairs(LevelDoorTable) do - if value.openDoor == item.itemid then - if item.actionid > 0 and player:getLevel() >= item.actionid - 1000 then - return true - else - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Only the worthy may pass.") - player:teleportTo(fromPosition, true) - return false - end - end - end - return true -end - -for index, value in ipairs(doorIds) do - closingDoor:id(value) -end - -closingDoor:register() - --- Level and quests closing door (onStepOut). --- This closes the door after the player passes through it. -local closingDoor = MoveEvent() - -local doorIds = {} -for index, value in ipairs(QuestDoorTable) do - if not table.contains(doorIds, value.openDoor) then - table.insert(doorIds, value.openDoor) - end -end -for index, value in ipairs(LevelDoorTable) do - if not table.contains(doorIds, value.openDoor) then - table.insert(doorIds, value.openDoor) - end -end - -function closingDoor.onStepOut(creature, item, position, fromPosition) - local player = creature:getPlayer() - if not player then - return - end - - local tile = Tile(position) - if tile:getCreatureCount() > 0 then - return true - end - - local newPosition = { x = position.x + 1, y = position.y, z = position.z } - local query = Tile(newPosition):queryAdd(creature) - if query ~= RETURNVALUE_NOERROR or query == RETURNVALUE_NOTENOUGHROOM then - newPosition.x = newPosition.x - 1 - newPosition.y = newPosition.y + 1 - query = Tile(newPosition):queryAdd(creature) - end - - if query == RETURNVALUE_NOERROR or query ~= RETURNVALUE_NOTENOUGHROOM then - position:relocateTo(newPosition) - end - - local i, tileItem, tileCount = 1, true, tile:getThingCount() - while tileItem and i < tileCount do - tileItem = tile:getThing(i) - if tileItem and tileItem:getUniqueId() ~= item.uid and tileItem:getType():isMovable() then - tileItem:remove() - else - i = i + 1 - end - end - - for index, value in ipairs(LevelDoorTable) do - if value.openDoor == item.itemid then - item:transform(value.closedDoor) - item:getPosition():sendSingleSoundEffect(SOUND_EFFECT_TYPE_ACTION_CLOSE_DOOR) - end - end - for index, value in ipairs(QuestDoorTable) do - if value.openDoor == item.itemid then - item:transform(value.closedDoor) - item:getPosition():sendSingleSoundEffect(SOUND_EFFECT_TYPE_ACTION_CLOSE_DOOR) - end - end - return true -end - -for index, value in ipairs(doorIds) do - closingDoor:id(value) -end - -closingDoor:register() diff --git a/data-otservbr-global/scripts/movements/others/drowning.lua b/data-otservbr-global/scripts/movements/others/drowning.lua deleted file mode 100644 index 6f4fbd7efa6..00000000000 --- a/data-otservbr-global/scripts/movements/others/drowning.lua +++ /dev/null @@ -1,36 +0,0 @@ -local condition = Condition(CONDITION_DROWN) -condition:setParameter(CONDITION_PARAM_PERIODICDAMAGE, -20) -condition:setParameter(CONDITION_PARAM_TICKS, -1) -condition:setParameter(CONDITION_PARAM_TICKINTERVAL, 2000) - -local drowning = MoveEvent() -drowning:type("stepin") - -function drowning.onStepIn(player, item, position, fromPosition) - if player:isPlayer() then - local headItem = player:getSlotItem(CONST_SLOT_HEAD) - if headItem and table.contains({ 5460, 11585, 13995 }, headItem.itemid) then - return true - elseif math.random(1, 10) == 1 then - position:sendMagicEffect(CONST_ME_BUBBLES) - end - player:addCondition(condition) - end - return true -end - -drowning:id(5404, 5405, 5406, 5407, 5408, 5409, 5743, 5764, 8755, 8756, 8757, 9291) -drowning:register() - -drowning = MoveEvent() -drowning:type("stepout") - -function drowning.onStepOut(creature, item, position, fromPosition) - if creature:isPlayer() then - creature:removeCondition(CONDITION_DROWN) - end - return true -end - -drowning:id(5404, 5405, 5406, 5407, 5408, 5409, 5743, 5764, 8755, 8756, 8757, 9291) -drowning:register() diff --git a/data-otservbr-global/scripts/movements/others/noxious_claw.lua b/data-otservbr-global/scripts/movements/others/noxious_claw.lua deleted file mode 100644 index 36cc6dabfee..00000000000 --- a/data-otservbr-global/scripts/movements/others/noxious_claw.lua +++ /dev/null @@ -1,17 +0,0 @@ -local noxiousClaw = MoveEvent() - -function noxiousClaw.onEquip(player, item, slot) - item:transform(9392) - if Tile(player:getPosition()):hasFlag(TILESTATE_PROTECTIONZONE) then - return true - end - - doTargetCombatHealth(0, player, COMBAT_PHYSICALDAMAGE, -200, -200, CONST_ME_DRAWBLOOD) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "It tightens around your wrist as you take it on.") - return true -end - -noxiousClaw:type("equip") -noxiousClaw:id(9393) -noxiousClaw:level(100) -noxiousClaw:register() diff --git a/data-otservbr-global/scripts/movements/others/tiles.lua b/data-otservbr-global/scripts/movements/others/tiles.lua deleted file mode 100644 index b797f0380a3..00000000000 --- a/data-otservbr-global/scripts/movements/others/tiles.lua +++ /dev/null @@ -1,87 +0,0 @@ -local increasing = { [419] = 420, [431] = 430, [452] = 453, [563] = 564, [549] = 562, [10145] = 10146 } -local decreasing = { [420] = 419, [430] = 431, [453] = 452, [564] = 563, [562] = 549, [10146] = 10145 } - --- onStepIn -local tiles = MoveEvent() - -function tiles.onStepIn(creature, item, position, fromPosition) - if not increasing[item.itemid] then - return true - end - - local player = creature:getPlayer() - if not player or player:isInGhostMode() then - return true - end - - item:transform(increasing[item.itemid]) - - if item.actionid >= 1000 then - if player:getLevel() < item.actionid - 1000 then - player:teleportTo(fromPosition, false) - position:sendMagicEffect(CONST_ME_MAGIC_BLUE) - player:sendTextMessage(MESSAGE_FAILURE, "The tile seems to be protected against unwanted intruders.") - end - return true - end - - if position:getTile():hasFlag(TILESTATE_PROTECTIONZONE) then - for _, direction in ipairs(DIRECTIONS_TABLE) do - local playerPosition = player:getPosition() - playerPosition:getNextPosition(direction) - local depotItem = playerPosition:getTile():getItemByType(ITEM_TYPE_DEPOT) - - if depotItem ~= nil then - local depotItems = 0 - for id = 1, configManager.getNumber(configKeys.DEPOT_BOXES) do - depotItems = depotItems + player:getDepotChest(id, true):getItemHoldingCount() - end - - player:sendTextMessage(MESSAGE_FAILURE, "Your depot contains " .. depotItems .. " item" .. (depotItems > 1 and "s." or ".") .. "\ - Your supply stash contains " .. player:getStashCount() .. " item" .. (player:getStashCount() > 1 and "s." or ".")) - player:setSpecialContainersAvailable(true, true, true) - return true - end - end - end - - if item.actionid ~= 0 and player:getStorageValue(item.actionid) <= 0 then - player:teleportTo(fromPosition, false) - position:sendMagicEffect(CONST_ME_MAGIC_BLUE) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "The tile seems to be protected against unwanted intruders.") - return true - end -end - -tiles:type("stepin") - -for index, value in pairs(increasing) do - tiles:id(index) -end - -tiles:register() - -tiles = MoveEvent() - -function tiles.onStepOut(creature, item, position, fromPosition) - if not decreasing[item.itemid] then - return false - end - - local player = creature:getPlayer() - if not player or player:isInGhostMode() then - return true - end - - item:transform(decreasing[item.itemid]) - player:setSpecialContainersAvailable(false, false, false) - return true -end - -tiles:type("stepout") - -for index, value in pairs(decreasing) do - tiles:id(index) -end - -tiles:register() diff --git a/data-otservbr-global/scripts/movements/others/trap.lua b/data-otservbr-global/scripts/movements/others/trap.lua index 155209b7245..09fa89bfc2d 100644 --- a/data-otservbr-global/scripts/movements/others/trap.lua +++ b/data-otservbr-global/scripts/movements/others/trap.lua @@ -14,11 +14,16 @@ function trap.onStepIn(creature, item, position, fromPosition) return true end - if Tile(position):hasFlag(TILESTATE_PROTECTIONZONE) then + local tile = Tile(position) + if not tile then + return true + end + + if tile:hasFlag(TILESTATE_PROTECTIONZONE) then return true end - if Tile(position):getItemCountById(3482) > 1 then + if tile:getItemCountById(3482) > 1 then return true end @@ -30,7 +35,7 @@ function trap.onStepIn(creature, item, position, fromPosition) item:transform(trap.transformTo) end - if item.itemid == 12368 and getCreatureName(creature.uid) == "Starving Wolf" then + if item.itemid == 12368 and creature:getName() == "Starving Wolf" then position:sendMagicEffect(CONST_ME_STUN) creature:remove() Game.createItem(12369, 1, position) diff --git a/data-otservbr-global/scripts/movements/quests/cults_of_tibia/boss_timer.lua b/data-otservbr-global/scripts/movements/quests/cults_of_tibia/boss_timer.lua index 1c2f1834270..f8c15c7f121 100644 --- a/data-otservbr-global/scripts/movements/quests/cults_of_tibia/boss_timer.lua +++ b/data-otservbr-global/scripts/movements/quests/cults_of_tibia/boss_timer.lua @@ -17,7 +17,7 @@ local setting = { { tpPos = { x = 33114, y = 31887, z = 15 }, tpDestination = { x = 33131, y = 31899, z = 15 }, - boss = "The Sinister Hermit", + boss = "The Souldespoiler", }, { tpPos = { x = 33072, y = 31871, z = 15 }, diff --git a/data-otservbr-global/scripts/movements/quests/nightmare_isles/teleport.lua b/data-otservbr-global/scripts/movements/quests/nightmare_isles/teleport.lua deleted file mode 100644 index 80dba0d59b3..00000000000 --- a/data-otservbr-global/scripts/movements/quests/nightmare_isles/teleport.lua +++ /dev/null @@ -1,42 +0,0 @@ -local setting = { - { storage = 210001, teleportPosition = Position(33032, 32400, 7) }, -- entrance teleport Darashia Northwest - { storage = 210002, teleportPosition = Position(33215, 32273, 7) }, -- entrance teleport Darashia North - { storage = 210016, teleportPosition = Position(33255, 32678, 7) }, -- entrance teleport Ankrahmun -} - -local teleports = { - [64001] = 210001, -- northwest Darashia - [64002] = 210002, -- north Darashia - [64003] = 210016, -- north Ankrahmun -} - -local teleport = MoveEvent() - -function teleport.onStepIn(creature, item, position, fromPosition) - local player = creature:getPlayer() - if not player then - return - end - - for i = 1, #setting do - local table = setting[i] - local backStorage = table.storage - if player:getStorageValue(backStorage) >= 1 then - player:teleportTo(table.teleportPosition) - player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) - player:setStorageValue(backStorage, 0) - break - end - end - - local storagePortal = teleports[item.uid] - if storagePortal then - player:teleportTo(Position(33497, 32616, 8)) - player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) - player:setStorageValue(storagePortal, 1) - end - return true -end - -teleport:uid(35020, 64001, 64002, 64003) -teleport:register() diff --git a/data-otservbr-global/scripts/movements/quests/nightmare_isles/teleport_ladder.lua b/data-otservbr-global/scripts/movements/quests/nightmare_isles/teleport_ladder.lua deleted file mode 100644 index 297f4585636..00000000000 --- a/data-otservbr-global/scripts/movements/quests/nightmare_isles/teleport_ladder.lua +++ /dev/null @@ -1,53 +0,0 @@ -local setting = { - [64103] = Position(33475, 32641, 10), - [64104] = Position(33473, 32647, 9), - [64105] = Position(33463, 32585, 8), - [64106] = Position(33457, 32580, 8), - [64107] = Position(33422, 32582, 8), - [64108] = Position(33430, 32600, 10), - [64109] = Position(33420, 32604, 10), - [64120] = Position(33446, 32616, 11), - [64121] = Position(33460, 32632, 10), - [64122] = Position(33429, 32626, 10), - [64123] = Position(33425, 32633, 8), - [64124] = Position(33435, 32631, 8), - [64125] = Position(33478, 32621, 10), - [64126] = Position(33484, 32629, 8), - [64127] = Position(33452, 32617, 11), - [64128] = Position(33419, 32589, 10), -} - -local teleportLadder = MoveEvent() - -function teleportLadder.onStepIn(creature, item, position, fromPosition) - local player = creature:getPlayer() - if not player then - return true - end - - if player:getStorageValue(Storage.TheShatteredIsles.AccessToLagunaIsland) ~= 1 and item.uid == 3206 then - local accessPosition = Position(32340, 32540, 7) - player:teleportTo(accessPosition) - position:sendMagicEffect(CONST_ME_TELEPORT) - accessPosition:sendMagicEffect(CONST_ME_TELEPORT) - return true - end - - local targetPosition = setting[item.actionid] - if not targetPosition then - return true - end - - player:teleportTo(targetPosition) - position:sendMagicEffect(CONST_ME_TELEPORT) - targetPosition:sendMagicEffect(CONST_ME_TELEPORT) - return true -end - -teleportLadder:type("stepin") - -for index, value in pairs(setting) do - teleportLadder:aid(index) -end - -teleportLadder:register() diff --git a/data-otservbr-global/scripts/quests/kilmaresh/1-fafnars-wrath/3-urmahlullu-the-immaculate.lua b/data-otservbr-global/scripts/quests/kilmaresh/1-fafnars-wrath/3-urmahlullu-the-immaculate.lua deleted file mode 100644 index 8c87d35deff..00000000000 --- a/data-otservbr-global/scripts/quests/kilmaresh/1-fafnars-wrath/3-urmahlullu-the-immaculate.lua +++ /dev/null @@ -1,84 +0,0 @@ --- lever to urmahlullu room - -local config = { - requiredLevel = 100, - daily = true, - roomCenterPosition = Position(33919, 31648, 8), - playerPositions = { - Position(33918, 31626, 8), - Position(33919, 31626, 8), - Position(33920, 31626, 8), - Position(33921, 31626, 8), - Position(33922, 31626, 8), - }, - teleportPosition = Position(33918, 31657, 8), - bossPosition = Position(33918, 31641, 8), - bossName = "Urmahlullu the Immaculate", -} - -local leverboss = Action() - -function leverboss.onUse(player, item, fromPosition, target, toPosition, isHotkey) - if item.itemid == 8911 then - -- Check if the player that pulled the lever is on the correct position - if player:getPosition() ~= config.playerPositions[1] then - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You can't start the battle.") - return true - end - - local team, participant = {} - - for i = 1, #config.playerPositions do - participant = Tile(config.playerPositions[i]):getTopCreature() - - -- Check there is a participant player - if participant and participant:isPlayer() then - -- Check participant level - if participant:getLevel() < config.requiredLevel then - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "All the players need to be level " .. config.requiredLevel .. " or higher.") - return true - end - - -- Check participant boss timer - if config.daily and not participant:canFightBoss(config.bossName) then - player:getPosition():sendMagicEffect(CONST_ME_POFF) - player:sendCancelMessage("Not all players are ready yet from last battle.") - return true - end - - team[#team + 1] = participant - end - end - - -- Check if a team currently inside the boss room - local specs, spec = Game.getSpectators(config.roomCenterPosition, false, false, 14, 14, 13, 13) - for i = 1, #specs do - spec = specs[i] - if spec:isPlayer() then - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "A team is already inside the boss room.") - return true - end - - spec:remove() - end - - -- Spawn boss - Game.createMonster("Urmahlullu the Immaculate", config.bossPosition) - - -- Teleport team participants - for i = 1, #team do - team[i]:getPosition():sendMagicEffect(CONST_ME_POFF) - team[i]:teleportTo(config.teleportPosition) - -- Assign boss timer - team[i]:setBossCooldown(config.bossName, os.time() + configManager.getNumber(configKeys.BOSS_DEFAULT_TIME_TO_FIGHT_AGAIN)) -- 20 hours - end - - config.teleportPosition:sendMagicEffect(CONST_ME_ENERGYAREA) - end - - item:transform(8911) - return true -end - -leverboss:uid(9545) -leverboss:register() diff --git a/data-otservbr-global/scripts/quests/threatened_dreams/event-raven_herb_bush.lua b/data-otservbr-global/scripts/quests/threatened_dreams/event-raven_herb_bush.lua index 7f35b07170e..50d74d060b9 100644 --- a/data-otservbr-global/scripts/quests/threatened_dreams/event-raven_herb_bush.lua +++ b/data-otservbr-global/scripts/quests/threatened_dreams/event-raven_herb_bush.lua @@ -1,76 +1,59 @@ -local ThreatenedDreams = Storage.Quest.U11_40.ThreatenedDreams -local periods = { - [LIGHT_STATE_NIGHT] = "Night", - [LIGHT_STATE_DAY] = "Day", - [LIGHT_STATE_SUNRISE] = "Sunrise", - [LIGHT_STATE_SUNSET] = "Sunset", -} local config = { - -- createByType day / night - [1] = { -- create in night - bushId = 25783, - createItem = LIGHT_STATE_NIGHT, - removeItem = LIGHT_STATE_SUNRISE, - pos = Position(33497, 32196, 7), - herbId = 5953, - herbWeight = 1, - storage = ThreatenedDreams.Mission03.RavenHerbTimer, - }, + bushId = 25783, + createItem = LIGHT_STATE_NIGHT, + removeItem = LIGHT_STATE_SUNRISE, + pos = Position(33497, 32196, 7), + herbId = 5953, + herbWeight = 1, + storage = Storage.Quest.U11_40.ThreatenedDreams.Mission03.RavenHerbTimer, } local createRavenHerb = GlobalEvent("createRavenHerb") function createRavenHerb.onPeriodChange(period, light) - local time = getWorldTime() - - if configManager.getBoolean(configKeys.ALL_CONSOLE_LOG) then - logger.info("Starting {} Current light is {} and it's {} Tibian Time", periods[period], light, getFormattedWorldTime(time)) - end - for index, item in pairs(config) do - if item.createItem == period then -- Adding - local createItem = Game.createItem(item.bushId, 1, item.pos) - createItem:setActionId(item.storage) - if createItem then - item.pos:sendMagicEffect(CONST_ME_BIGPLANTS) - end - elseif item.removeItem == period then -- Removing - local target = Tile(item.pos):getItemById(item.bushId) - if target then - item.pos:removeItem(item.bushId, CONST_ME_BIGPLANTS) - end + local pos = config.pos + if config.createItem == period then + local createItem = Game.createItem(config.bushId, 1, pos) + if createItem then + pos:sendMagicEffect(CONST_ME_BIGPLANTS) + end + elseif config.removeItem == period then + local target = Tile(pos):getItemById(config.bushId) + if target then + pos:removeItem(config.bushId, CONST_ME_BIGPLANTS) end end - return true end createRavenHerb:register() local ravenHerb = Action() + function ravenHerb.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local herbConfig = config[1] - local message = "You have found a " .. getItemName(herbConfig.herbId) .. "." + local message = "You have found a " .. getItemName(config.herbId) .. "." local backpack = player:getSlotItem(CONST_SLOT_BACKPACK) if not backpack or backpack:getEmptySlots(true) < 1 then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, message .. " But you have no room to take it.") return true end - if (player:getFreeCapacity() / 100) < herbConfig.herbWeight then - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, message .. ". Weighing " .. herbConfig.herbWeight .. " oz, it is too heavy for you to carry.") + + if (player:getFreeCapacity() / 100) < config.herbWeight then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, message .. ". Weighing " .. config.herbWeight .. " oz, it is too heavy for you to carry.") return true end - if player:getStorageValue(herbConfig.storage) > os.time() then + if player:getStorageValue(config.storage) > os.time() then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "The raven herb cannot be collected right now.") return true end - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have found a " .. getItemName(herbConfig.herbId) .. ".") - player:setStorageValue(herbConfig.storage, os.time() + 60 * 30 * 1000) -- Can be collected on next cycle - player:addItem(herbConfig.herbId, 1) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, message) + player:setStorageValue(config.storage, os.time() + 60 * 30 * 1000) + player:addItem(config.herbId, 1) return true end -ravenHerb:aid(ThreatenedDreams.Mission03.RavenHerbTimer) +ravenHerb:id(25783) ravenHerb:register() diff --git a/data-otservbr-global/scripts/spells/attack/annihilation.lua b/data-otservbr-global/scripts/spells/attack/annihilation.lua deleted file mode 100644 index 5b9f7bc7f5b..00000000000 --- a/data-otservbr-global/scripts/spells/attack/annihilation.lua +++ /dev/null @@ -1,39 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_WEAPONTYPE) -combat:setParameter(COMBAT_PARAM_BLOCKARMOR, 1) -combat:setParameter(COMBAT_PARAM_USECHARGES, 1) - -function onGetFormulaValues(player, skill, attack, factor) - local skillTotal = skill * attack - local levelTotal = player:getLevel() / 5 - return -(((skillTotal * 0.17) + 13) + levelTotal) * 1.28, -(((skillTotal * 0.20) + 34) + levelTotal) * 1.28 -- TODO : Use New Real Formula instead of an % -end - -combat:setCallback(CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(62) -spell:name("Annihilation") -spell:words("exori gran ico") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_ANNIHILATION) -spell:level(110) -spell:mana(300) -spell:isPremium(true) -spell:range(1) -spell:needTarget(true) -spell:blockWalls(true) -spell:needWeapon(true) -spell:cooldown(30 * 1000) -spell:groupCooldown(4 * 1000) -spell:needLearn(false) -spell:vocation("knight;true", "elite knight;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/apprentice's_strike.lua b/data-otservbr-global/scripts/spells/attack/apprentice's_strike.lua deleted file mode 100644 index c4f911aab93..00000000000 --- a/data-otservbr-global/scripts/spells/attack/apprentice's_strike.lua +++ /dev/null @@ -1,36 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_FIREATTACK) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 0.4) + 3 - local max = (level / 5) + (maglevel * 0.7) + 5 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(169) -spell:name("Apprentice's Strike") -spell:words("exori min flam") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_FLAME_STRIKE) -spell:level(8) -spell:mana(6) -spell:isPremium(false) -spell:range(3) -spell:needCasterTargetOrDirection(true) -spell:blockWalls(true) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/berserk.lua b/data-otservbr-global/scripts/spells/attack/berserk.lua deleted file mode 100644 index faf86625457..00000000000 --- a/data-otservbr-global/scripts/spells/attack/berserk.lua +++ /dev/null @@ -1,38 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITAREA) -combat:setParameter(COMBAT_PARAM_BLOCKARMOR, 1) -combat:setParameter(COMBAT_PARAM_USECHARGES, 1) -combat:setArea(createCombatArea(AREA_SQUARE1X1)) - -function onGetFormulaValues(player, skill, attack, factor) - local level = player:getLevel() - - local min = (level / 5) + (skill + attack) * 0.5 - local max = (level / 5) + (skill + attack) * 1.5 - - return -min * 1.1, -max * 1.1 -- TODO : Use New Real Formula instead of an % -end - -combat:setCallback(CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(80) -spell:name("Berserk") -spell:words("exori") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_BERSERK) -spell:level(35) -spell:mana(115) -spell:isPremium(true) -spell:needWeapon(true) -spell:cooldown(4 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("knight;true", "elite knight;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/brutal_strike.lua b/data-otservbr-global/scripts/spells/attack/brutal_strike.lua deleted file mode 100644 index e2e8033617a..00000000000 --- a/data-otservbr-global/scripts/spells/attack/brutal_strike.lua +++ /dev/null @@ -1,38 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_WEAPONTYPE) -combat:setParameter(COMBAT_PARAM_BLOCKARMOR, 1) -combat:setParameter(COMBAT_PARAM_USECHARGES, 1) - -function onGetFormulaValues(player, skill, attack, factor) - local skillTotal = skill * attack - local levelTotal = player:getLevel() / 5 - return -(((skillTotal * 0.02) + 4) + levelTotal) * 1.28, -(((skillTotal * 0.04) + 9) + levelTotal) * 1.28 -- TODO : Use New Real Formula instead of an % -end - -combat:setCallback(CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(61) -spell:name("Brutal Strike") -spell:words("exori ico") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_BRUTAL_STRIKE) -spell:level(16) -spell:mana(30) -spell:isPremium(false) -spell:range(1) -spell:needTarget(true) -spell:blockWalls(true) -spell:needWeapon(true) -spell:cooldown(6 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("knight;true", "elite knight;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/buzz.lua b/data-otservbr-global/scripts/spells/attack/buzz.lua deleted file mode 100644 index 78cb64fe3be..00000000000 --- a/data-otservbr-global/scripts/spells/attack/buzz.lua +++ /dev/null @@ -1,37 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 0.4) + 3 - local max = (level / 5) + (maglevel * 0.7) + 5 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(177) -spell:name("Buzz") -spell:words("exori infir vis") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_BUZZ) -spell:level(1) -spell:mana(6) -spell:isAggressive(true) -spell:isPremium(false) -spell:range(3) -spell:needCasterTargetOrDirection(true) -spell:blockWalls(true) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/chill_out.lua b/data-otservbr-global/scripts/spells/attack/chill_out.lua deleted file mode 100644 index 0f3e44e66a3..00000000000 --- a/data-otservbr-global/scripts/spells/attack/chill_out.lua +++ /dev/null @@ -1,34 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA) -combat:setArea(createCombatArea(AREA_WAVE4, AREADIAGONAL_WAVE4)) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 0.3) + 2 - local max = (level / 5) + (maglevel * 0.6) + 4 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(173) -spell:name("Chill Out") -spell:words("exevo infir frigo hur") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_CHILL_OUT) -spell:level(1) -spell:mana(8) -spell:isPremium(false) -spell:range(1) -spell:needDirection(true) -spell:cooldown(4 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("druid;true", "elder druid;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/curse.lua b/data-otservbr-global/scripts/spells/attack/curse.lua deleted file mode 100644 index f029ce55889..00000000000 --- a/data-otservbr-global/scripts/spells/attack/curse.lua +++ /dev/null @@ -1,50 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_SMALLCLOUDS) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_DEATH) - -local condition = Condition(CONDITION_CURSED) -condition:setParameter(CONDITION_PARAM_DELAYED, 1) - -condition:addDamage(1, 3000, -45) -condition:addDamage(1, 3000, -40) -condition:addDamage(1, 3000, -35) -condition:addDamage(1, 3000, -34) -condition:addDamage(2, 3000, -33) -condition:addDamage(2, 3000, -32) -condition:addDamage(2, 3000, -31) -condition:addDamage(2, 3000, -30) -condition:addDamage(3, 3000, -29) -condition:addDamage(3, 3000, -25) -condition:addDamage(3, 3000, -24) -condition:addDamage(4, 3000, -23) -condition:addDamage(4, 3000, -20) -condition:addDamage(5, 3000, -19) -condition:addDamage(5, 3000, -15) -condition:addDamage(6, 3000, -10) -condition:addDamage(10, 3000, -5) -combat:addCondition(condition) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(139) -spell:name("Curse") -spell:words("utori mort") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_CURSE) -spell:level(75) -spell:mana(30) -spell:isAggressive(true) -spell:range(3) -spell:needTarget(true) -spell:blockWalls(true) -spell:cooldown(40 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/death_strike.lua b/data-otservbr-global/scripts/spells/attack/death_strike.lua deleted file mode 100644 index d8e592309fb..00000000000 --- a/data-otservbr-global/scripts/spells/attack/death_strike.lua +++ /dev/null @@ -1,36 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_DEATH) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 1.403) + 8 - local max = (level / 5) + (maglevel * 2.203) + 13 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(87) -spell:name("Death Strike") -spell:words("exori mort") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_DEATH_STRIKE) -spell:level(16) -spell:mana(20) -spell:isPremium(true) -spell:range(3) -spell:needCasterTargetOrDirection(true) -spell:blockWalls(true) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/divine_caldera.lua b/data-otservbr-global/scripts/spells/attack/divine_caldera.lua deleted file mode 100644 index 8e6ff5f3333..00000000000 --- a/data-otservbr-global/scripts/spells/attack/divine_caldera.lua +++ /dev/null @@ -1,33 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA) -combat:setArea(createCombatArea(AREA_CIRCLE3X3)) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 4) - local max = (level / 5) + (maglevel * 6) - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(124) -spell:name("Divine Caldera") -spell:words("exevo mas san") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_DIVINE_CALDERA) -spell:level(50) -spell:mana(160) -spell:isPremium(true) -spell:isSelfTarget(true) -spell:cooldown(4 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("paladin;true", "royal paladin;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/divine_missile.lua b/data-otservbr-global/scripts/spells/attack/divine_missile.lua deleted file mode 100644 index b12650687a1..00000000000 --- a/data-otservbr-global/scripts/spells/attack/divine_missile.lua +++ /dev/null @@ -1,36 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HOLYDAMAGE) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SMALLHOLY) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 1.79) + 11 - local max = (level / 5) + (maglevel * 3) + 18 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(122) -spell:name("Divine Missile") -spell:words("exori san") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_DIVINE_MISSILE) -spell:level(40) -spell:mana(20) -spell:isPremium(true) -spell:range(4) -spell:needCasterTargetOrDirection(true) -spell:blockWalls(true) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("paladin;true", "royal paladin;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/electrify.lua b/data-otservbr-global/scripts/spells/attack/electrify.lua deleted file mode 100644 index 9f1318ffb53..00000000000 --- a/data-otservbr-global/scripts/spells/attack/electrify.lua +++ /dev/null @@ -1,33 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) - -local condition = Condition(CONDITION_ENERGY) -condition:setParameter(CONDITION_PARAM_DELAYED, 1) -condition:addDamage(25, 3000, -45) -combat:addCondition(condition) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(140) -spell:name("Electrify") -spell:words("utori vis") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_ELECTRIFY) -spell:level(34) -spell:mana(30) -spell:isAggressive(true) -spell:range(3) -spell:needTarget(true) -spell:blockWalls(true) -spell:cooldown(30 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/energy_strike.lua b/data-otservbr-global/scripts/spells/attack/energy_strike.lua deleted file mode 100644 index 7649e4ecc28..00000000000 --- a/data-otservbr-global/scripts/spells/attack/energy_strike.lua +++ /dev/null @@ -1,36 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 1.403) + 8 - local max = (level / 5) + (maglevel * 2.203) + 13 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(88) -spell:name("Energy Strike") -spell:words("exori vis") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_ENERGY_STRIKE) -spell:level(12) -spell:mana(20) -spell:range(3) -spell:isPremium(true) -spell:needCasterTargetOrDirection(true) -spell:blockWalls(true) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/envenom.lua b/data-otservbr-global/scripts/spells/attack/envenom.lua deleted file mode 100644 index 4a128f0d9ea..00000000000 --- a/data-otservbr-global/scripts/spells/attack/envenom.lua +++ /dev/null @@ -1,33 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_SMALLPLANTS) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_EARTH) - -local condition = Condition(CONDITION_POISON) -condition:setParameter(CONDITION_PARAM_DELAYED, 1) -condition:addDamage(25, 3000, -45) -combat:addCondition(condition) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(142) -spell:name("Envenom") -spell:words("utori pox") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_ENVENOM) -spell:level(50) -spell:mana(30) -spell:range(3) -spell:isAggressive(true) -spell:needTarget(true) -spell:blockWalls(true) -spell:cooldown(40 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("druid;true", "elder druid;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/eternal_winter.lua b/data-otservbr-global/scripts/spells/attack/eternal_winter.lua deleted file mode 100644 index 3c06fc9f844..00000000000 --- a/data-otservbr-global/scripts/spells/attack/eternal_winter.lua +++ /dev/null @@ -1,34 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ICETORNADO) -combat:setArea(createCombatArea(AREA_CIRCLE5X5)) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 6) - local max = (level / 5) + (maglevel * 12) - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack", "focus") -spell:id(118) -spell:name("Eternal Winter") -spell:words("exevo gran mas frigo") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_ETERNAL_WINTER) -spell:level(60) -spell:mana(1050) -spell:isPremium(true) -spell:range(5) -spell:isSelfTarget(true) -spell:cooldown(40 * 1000) -spell:groupCooldown(4 * 1000, 40 * 1000) -spell:needLearn(false) -spell:vocation("druid;true", "elder druid;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/ethereal_spear.lua b/data-otservbr-global/scripts/spells/attack/ethereal_spear.lua deleted file mode 100644 index 293b79bec73..00000000000 --- a/data-otservbr-global/scripts/spells/attack/ethereal_spear.lua +++ /dev/null @@ -1,40 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ETHEREALSPEAR) -combat:setParameter(COMBAT_PARAM_BLOCKARMOR, 1) - -function onGetFormulaValues(player, skill, attack, factor) - local level = player:getLevel() - - local min = (level / 5) + (skill + 25) / 3 - local max = (level / 5) + skill + 25 - - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(111) -spell:name("Ethereal Spear") -spell:words("exori con") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_ETHEREAL_SPEAR) -spell:level(23) -spell:mana(25) -spell:isPremium(true) -spell:range(7) -spell:needTarget(true) -spell:blockWalls(true) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("paladin;true", "royal paladin;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/fierce_berserk.lua b/data-otservbr-global/scripts/spells/attack/fierce_berserk.lua deleted file mode 100644 index 3b463510e93..00000000000 --- a/data-otservbr-global/scripts/spells/attack/fierce_berserk.lua +++ /dev/null @@ -1,38 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITAREA) -combat:setParameter(COMBAT_PARAM_BLOCKARMOR, 1) -combat:setParameter(COMBAT_PARAM_USECHARGES, 1) -combat:setArea(createCombatArea(AREA_SQUARE1X1)) - -function onGetFormulaValues(player, skill, attack, factor) - local level = player:getLevel() - - local min = (level / 5) + (skill + 2 * attack) * 1.1 - local max = (level / 5) + (skill + 2 * attack) * 3 - - return -min * 1.1, -max * 1.1 -- TODO : Use New Real Formula instead of an % -end - -combat:setCallback(CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(105) -spell:name("Fierce Berserk") -spell:words("exori gran") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_FIERCE_BERSERK) -spell:level(90) -spell:mana(340) -spell:isPremium(true) -spell:needWeapon(true) -spell:cooldown(6 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("knight;true", "elite knight;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/fire_wave.lua b/data-otservbr-global/scripts/spells/attack/fire_wave.lua deleted file mode 100644 index 3c8dc19feee..00000000000 --- a/data-otservbr-global/scripts/spells/attack/fire_wave.lua +++ /dev/null @@ -1,35 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITBYFIRE) - -local area = createCombatArea(AREA_WAVE4, AREADIAGONAL_WAVE4) -combat:setArea(area) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 1.25) + 4 - local max = (level / 5) + (maglevel * 2) + 12 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(19) -spell:name("Fire Wave") -spell:words("exevo flam hur") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_FIRE_WAVE) -spell:level(18) -spell:mana(25) -spell:isPremium(true) -spell:needDirection(true) -spell:cooldown(4 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/flame_strike.lua b/data-otservbr-global/scripts/spells/attack/flame_strike.lua deleted file mode 100644 index b75a9440b98..00000000000 --- a/data-otservbr-global/scripts/spells/attack/flame_strike.lua +++ /dev/null @@ -1,36 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_FIREATTACK) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 1.403) + 8 - local max = (level / 5) + (maglevel * 2.203) + 13 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(89) -spell:name("Flame Strike") -spell:words("exori flam") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_FLAME_STRIKE) -spell:level(14) -spell:mana(20) -spell:isPremium(true) -spell:range(3) -spell:needCasterTargetOrDirection(true) -spell:blockWalls(true) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("sorcerer;true", "druid;true", "master sorcerer;true", "elder druid;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/front_sweep.lua b/data-otservbr-global/scripts/spells/attack/front_sweep.lua deleted file mode 100644 index 425cfa6e619..00000000000 --- a/data-otservbr-global/scripts/spells/attack/front_sweep.lua +++ /dev/null @@ -1,36 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITAREA) -combat:setParameter(COMBAT_PARAM_BLOCKARMOR, 1) -combat:setParameter(COMBAT_PARAM_USECHARGES, 1) -combat:setArea(createCombatArea(AREA_WAVE6, AREADIAGONAL_WAVE6)) - -function onGetFormulaValues(player, skill, attack, factor) - local skillTotal = skill * attack - local levelTotal = player:getLevel() / 5 - return -(((skillTotal * 0.04) + 31) + levelTotal) * 1.1, -(((skillTotal * 0.08) + 45) + levelTotal) * 1.1 -- TODO : Use New Real Formula instead of an % -end - -combat:setCallback(CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(59) -spell:name("Front Sweep") -spell:words("exori min") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_FRONT_SWEEP) -spell:level(70) -spell:mana(200) -spell:isPremium(true) -spell:needDirection(true) -spell:needWeapon(true) -spell:cooldown(6 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("knight;true", "elite knight;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/great_fire_wave.lua b/data-otservbr-global/scripts/spells/attack/great_fire_wave.lua deleted file mode 100644 index 7361137f8ec..00000000000 --- a/data-otservbr-global/scripts/spells/attack/great_fire_wave.lua +++ /dev/null @@ -1,35 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITBYFIRE) - -local area = createCombatArea(AREA_WAVE7, AREADIAGONAL_WAVE7) -combat:setArea(area) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 2.8) + 16 - local max = (level / 5) + (maglevel * 4.4) + 28 -- TODO: Formulas (TibiaWiki says ~Strong Flame Strike but we need more acurracy) - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(240) -spell:name("Great Fire Wave") -spell:words("exevo gran flam hur") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_GREAT_FIRE_WAVE) -spell:level(38) -spell:mana(120) -spell:isPremium(true) -spell:needDirection(true) -spell:cooldown(4 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/groundshaker.lua b/data-otservbr-global/scripts/spells/attack/groundshaker.lua deleted file mode 100644 index c989b82fac2..00000000000 --- a/data-otservbr-global/scripts/spells/attack/groundshaker.lua +++ /dev/null @@ -1,36 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_GROUNDSHAKER) -combat:setParameter(COMBAT_PARAM_BLOCKARMOR, 1) -combat:setParameter(COMBAT_PARAM_USECHARGES, 1) -combat:setArea(createCombatArea(AREA_CIRCLE3X3)) - -function onGetFormulaValues(player, skill, attack, factor) - local level = player:getLevel() - local min = (level / 5) + (skill + attack) * 0.5 - local max = (level / 5) + (skill + attack) * 1.1 - return -min * 1.28, -max * 1.28 -- TODO : Use New Real Formula instead of an % -end - -combat:setCallback(CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(106) -spell:name("Groundshaker") -spell:words("exori mas") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_GROUNDSHAKER) -spell:level(33) -spell:mana(160) -spell:isPremium(true) -spell:needWeapon(true) -spell:cooldown(8 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("knight;true", "elite knight;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/hells_core.lua b/data-otservbr-global/scripts/spells/attack/hells_core.lua deleted file mode 100644 index 60227d1372d..00000000000 --- a/data-otservbr-global/scripts/spells/attack/hells_core.lua +++ /dev/null @@ -1,33 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) -combat:setArea(createCombatArea(AREA_CIRCLE5X5)) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 10) - local max = (level / 5) + (maglevel * 14) - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:group("attack", "focus") -spell:id(24) -spell:name("Hell's Core") -spell:words("exevo gran mas flam") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_HELL_SCORE) -spell:level(60) -spell:mana(1100) -spell:isSelfTarget(true) -spell:isPremium(true) -spell:cooldown(40 * 1000) -spell:groupCooldown(4 * 1000, 40 * 1000) -spell:needLearn(false) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/holy_flash.lua b/data-otservbr-global/scripts/spells/attack/holy_flash.lua deleted file mode 100644 index a9e0763a77c..00000000000 --- a/data-otservbr-global/scripts/spells/attack/holy_flash.lua +++ /dev/null @@ -1,32 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SMALLHOLY) - -local condition = Condition(CONDITION_DAZZLED) -condition:setParameter(CONDITION_PARAM_DELAYED, 1) -condition:addDamage(math.random(7, 11), 3000, -20) -combat:addCondition(condition) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(143) -spell:name("Holy Flash") -spell:words("utori san") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_HOLY_FLASH) -spell:level(70) -spell:mana(30) -spell:isAggressive(true) -spell:range(3) -spell:needTarget(true) -spell:blockWalls(true) -spell:cooldown(40 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("paladin;true", "royal paladin;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/ice_strike.lua b/data-otservbr-global/scripts/spells/attack/ice_strike.lua deleted file mode 100644 index d1f1ae8b60a..00000000000 --- a/data-otservbr-global/scripts/spells/attack/ice_strike.lua +++ /dev/null @@ -1,36 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ICEATTACK) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SMALLICE) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 1.403) + 8 - local max = (level / 5) + (maglevel * 2.203) + 13 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(112) -spell:name("Ice Strike") -spell:words("exori frigo") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_ICE_STRIKE) -spell:level(15) -spell:mana(20) -spell:isPremium(true) -spell:range(3) -spell:needCasterTargetOrDirection(true) -spell:blockWalls(true) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("druid;true", "sorcerer;true", "elder druid;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/ice_wave.lua b/data-otservbr-global/scripts/spells/attack/ice_wave.lua deleted file mode 100644 index 39992f8fdfc..00000000000 --- a/data-otservbr-global/scripts/spells/attack/ice_wave.lua +++ /dev/null @@ -1,33 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA) -combat:setArea(createCombatArea(AREA_WAVE4, AREADIAGONAL_WAVE4)) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 0.81) + 4 - local max = (level / 5) + (maglevel * 2) + 12 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(121) -spell:name("Ice Wave") -spell:words("exevo frigo hur") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_ICE_WAVE) -spell:level(18) -spell:mana(25) -spell:needDirection(true) -spell:cooldown(4 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("druid;true", "elder druid;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/inflict_wound.lua b/data-otservbr-global/scripts/spells/attack/inflict_wound.lua deleted file mode 100644 index 366ea95c9c5..00000000000 --- a/data-otservbr-global/scripts/spells/attack/inflict_wound.lua +++ /dev/null @@ -1,35 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) -combat:setParameter(COMBAT_PARAM_TARGETCASTERORTOPMOST, 1) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_DRAWBLOOD) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_WEAPONTYPE) -combat:setParameter(COMBATPARAM_USECHARGES, 1) - -local condition = Condition(CONDITION_BLEEDING) -condition:setParameter(CONDITION_PARAM_DELAYED, 10) -condition:addDamage(15, 2000, -50) -combat:addCondition(condition) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(141) -spell:name("Inflict Wound") -spell:words("utori kor") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_INFLICT_WOUND) -spell:level(40) -spell:mana(30) -spell:isAggressive(true) -spell:range(1) -spell:needTarget(true) -spell:blockWalls(true) -spell:cooldown(30 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("knight;true", "elite knight;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/lightning.lua b/data-otservbr-global/scripts/spells/attack/lightning.lua deleted file mode 100644 index 63c60766f52..00000000000 --- a/data-otservbr-global/scripts/spells/attack/lightning.lua +++ /dev/null @@ -1,35 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 2.2) + 12 - local max = (level / 5) + (maglevel * 3.4) + 21 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack", "special") -spell:id(149) -spell:name("Lightning") -spell:words("exori amp vis") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_LIGHTNING) -spell:level(55) -spell:mana(60) -spell:isPremium(true) -spell:range(4) -spell:needCasterTargetOrDirection(true) -spell:blockWalls(true) -spell:cooldown(8 * 1000) -spell:groupCooldown(2 * 1000, 8 * 1000) -spell:needLearn(false) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/mud_attack.lua b/data-otservbr-global/scripts/spells/attack/mud_attack.lua deleted file mode 100644 index 8f96931632d..00000000000 --- a/data-otservbr-global/scripts/spells/attack/mud_attack.lua +++ /dev/null @@ -1,37 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_CARNIPHILA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SMALLEARTH) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 0.4) + 3 - local max = (level / 5) + (maglevel * 0.7) + 5 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(174) -spell:name("Mud Attack") -spell:words("exori infir tera") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_MUD_ATTACK) -spell:level(1) -spell:mana(6) -spell:isAggressive(true) -spell:isPremium(false) -spell:range(3) -spell:needCasterTargetOrDirection(true) -spell:blockWalls(true) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("druid;true", "elder druid;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/physical_strike.lua b/data-otservbr-global/scripts/spells/attack/physical_strike.lua deleted file mode 100644 index 3b30e259499..00000000000 --- a/data-otservbr-global/scripts/spells/attack/physical_strike.lua +++ /dev/null @@ -1,37 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_EXPLOSIONAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_EXPLOSION) -combat:setParameter(COMBAT_PARAM_BLOCKARMOR, 1) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 1.403) + 8 - local max = (level / 5) + (maglevel * 2.203) + 13 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(148) -spell:name("Physical Strike") -spell:words("exori moe ico") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_PHYSICAL_STRIKE) -spell:level(16) -spell:mana(20) -spell:isPremium(true) -spell:range(3) -spell:needCasterTargetOrDirection(true) -spell:blockWalls(true) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("druid;true", "elder druid;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/practice_fire_wave.lua b/data-otservbr-global/scripts/spells/attack/practice_fire_wave.lua deleted file mode 100644 index fb32ba5f266..00000000000 --- a/data-otservbr-global/scripts/spells/attack/practice_fire_wave.lua +++ /dev/null @@ -1,29 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITBYFIRE) -combat:setArea(createCombatArea(AREA_WAVE4, AREADIAGONAL_WAVE4)) - -function onGetFormulaValues(player, level, magicLevel) - return -11, -14 -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:group("attack") -spell:id(167) -spell:name("Practise Fire Wave") -spell:words("exevo dis flam hur") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_PRACTISE_FIRE_WAVE) -spell:level(1) -spell:mana(5) -spell:needDirection(true) -spell:cooldown(4 * 1000) -spell:groupCooldown(2 * 1000) -spell:vocation("none") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/rage_of_the_skies.lua b/data-otservbr-global/scripts/spells/attack/rage_of_the_skies.lua deleted file mode 100644 index 8144dc75c88..00000000000 --- a/data-otservbr-global/scripts/spells/attack/rage_of_the_skies.lua +++ /dev/null @@ -1,33 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_BIGCLOUDS) -combat:setArea(createCombatArea(AREA_CIRCLE6X6)) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 7) - local max = (level / 5) + (maglevel * 14) - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack", "focus") -spell:id(119) -spell:name("Rage of the Skies") -spell:words("exevo gran mas vis") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_RAGE_OF_THE_SKIES) -spell:level(55) -spell:mana(600) -spell:isSelfTarget(true) -spell:isPremium(true) -spell:cooldown(40 * 1000) -spell:groupCooldown(4 * 1000, 40 * 1000) -spell:needLearn(false) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/scorch.lua b/data-otservbr-global/scripts/spells/attack/scorch.lua deleted file mode 100644 index 6d51096912d..00000000000 --- a/data-otservbr-global/scripts/spells/attack/scorch.lua +++ /dev/null @@ -1,34 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITBYFIRE) -combat:setArea(createCombatArea(AREA_WAVE4, AREADIAGONAL_WAVE4)) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 0.3) + 2 - local max = (level / 5) + (maglevel * 0.6) + 4 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(178) -spell:name("Scorch") -spell:words("exevo infir flam hur") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_SCORCH) -spell:level(1) -spell:mana(8) -spell:isAggressive(true) -spell:isPremium(false) -spell:needDirection(true) -spell:cooldown(4 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/strong_energy_strike.lua b/data-otservbr-global/scripts/spells/attack/strong_energy_strike.lua deleted file mode 100644 index e8aa4e5017c..00000000000 --- a/data-otservbr-global/scripts/spells/attack/strong_energy_strike.lua +++ /dev/null @@ -1,36 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 2.8) + 16 - local max = (level / 5) + (maglevel * 4.4) + 28 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack", "special") -spell:id(151) -spell:name("Strong Energy Strike") -spell:words("exori gran vis") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_STRONG_ENERGY_STRIKE) -spell:level(80) -spell:mana(60) -spell:isPremium(true) -spell:range(3) -spell:needCasterTargetOrDirection(true) -spell:blockWalls(true) -spell:cooldown(8 * 1000) -spell:groupCooldown(2 * 1000, 8 * 1000) -spell:needLearn(false) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/strong_ethereal_spear.lua b/data-otservbr-global/scripts/spells/attack/strong_ethereal_spear.lua deleted file mode 100644 index bd2bf61e55f..00000000000 --- a/data-otservbr-global/scripts/spells/attack/strong_ethereal_spear.lua +++ /dev/null @@ -1,36 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ETHEREALSPEAR) -combat:setParameter(COMBAT_PARAM_BLOCKARMOR, 1) - -function onGetFormulaValues(player, skill, attack, factor) - local levelTotal = player:getLevel() / 5 - return -(((2 * skill + attack / 2500) * 2.30) + levelTotal + 7), -(((2 * skill + attack / 1875) * 3.30) + levelTotal + 13) -end - -combat:setCallback(CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(57) -spell:name("Strong Ethereal Spear") -spell:words("exori gran con") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_STRONG_ETHEREAL_SPEAR) -spell:level(90) -spell:mana(55) -spell:isPremium(true) -spell:range(7) -spell:needTarget(true) -spell:blockWalls(true) -spell:cooldown(8 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("paladin;true", "royal paladin;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/strong_flame_strike.lua b/data-otservbr-global/scripts/spells/attack/strong_flame_strike.lua deleted file mode 100644 index b5766a57330..00000000000 --- a/data-otservbr-global/scripts/spells/attack/strong_flame_strike.lua +++ /dev/null @@ -1,36 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_FIREATTACK) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 2.8) + 16 - local max = (level / 5) + (maglevel * 4.4) + 28 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack", "special") -spell:id(150) -spell:name("Strong Flame Strike") -spell:words("exori gran flam") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_STRONG_FLAME_STRIKE) -spell:level(70) -spell:mana(60) -spell:isPremium(true) -spell:range(3) -spell:needCasterTargetOrDirection(true) -spell:blockWalls(true) -spell:cooldown(8 * 1000) -spell:groupCooldown(2 * 1000, 8 * 1000) -spell:needLearn(false) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/strong_ice_strike.lua b/data-otservbr-global/scripts/spells/attack/strong_ice_strike.lua deleted file mode 100644 index f83225e8fbd..00000000000 --- a/data-otservbr-global/scripts/spells/attack/strong_ice_strike.lua +++ /dev/null @@ -1,36 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ICEATTACK) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SMALLICE) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 2.8) + 16 - local max = (level / 5) + (maglevel * 4.4) + 28 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack", "special") -spell:id(152) -spell:name("Strong Ice Strike") -spell:words("exori gran frigo") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_STRONG_ICE_STRIKE) -spell:level(80) -spell:mana(60) -spell:isPremium(true) -spell:range(3) -spell:needCasterTargetOrDirection(true) -spell:blockWalls(true) -spell:cooldown(8 * 1000) -spell:groupCooldown(2 * 1000, 8 * 1000) -spell:needLearn(false) -spell:vocation("druid;true", "elder druid;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/strong_ice_wave.lua b/data-otservbr-global/scripts/spells/attack/strong_ice_wave.lua deleted file mode 100644 index 2f496bc2256..00000000000 --- a/data-otservbr-global/scripts/spells/attack/strong_ice_wave.lua +++ /dev/null @@ -1,32 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA) -combat:setArea(createCombatArea(AREA_SHORTWAVE3)) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 4.5) + 20 - local max = (level / 5) + (maglevel * 7.6) + 48 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(43) -spell:name("Strong Ice Wave") -spell:words("exevo gran frigo hur") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_STRONG_ICE_WAVE) -spell:level(40) -spell:mana(170) -spell:needDirection(true) -spell:cooldown(8 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("druid;true", "elder druid;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/strong_terra_strike.lua b/data-otservbr-global/scripts/spells/attack/strong_terra_strike.lua deleted file mode 100644 index 4ed93a42a7f..00000000000 --- a/data-otservbr-global/scripts/spells/attack/strong_terra_strike.lua +++ /dev/null @@ -1,36 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_CARNIPHILA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SMALLEARTH) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 2.8) + 16 - local max = (level / 5) + (maglevel * 4.4) + 28 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack", "special") -spell:id(153) -spell:name("Strong Terra Strike") -spell:words("exori gran tera") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_STRONG_TERRA_STRIKE) -spell:level(70) -spell:mana(60) -spell:isPremium(true) -spell:range(3) -spell:needCasterTargetOrDirection(true) -spell:blockWalls(true) -spell:cooldown(8 * 1000) -spell:groupCooldown(2 * 1000, 8 * 1000) -spell:needLearn(false) -spell:vocation("druid;true", "elder druid;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/terra_strike.lua b/data-otservbr-global/scripts/spells/attack/terra_strike.lua deleted file mode 100644 index a626374fe88..00000000000 --- a/data-otservbr-global/scripts/spells/attack/terra_strike.lua +++ /dev/null @@ -1,36 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_CARNIPHILA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SMALLEARTH) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 1.403) + 8 - local max = (level / 5) + (maglevel * 2.203) + 13 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(113) -spell:name("Terra Strike") -spell:words("exori tera") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_TERRA_STRIKE) -spell:level(13) -spell:mana(20) -spell:range(3) -spell:isPremium(false) -spell:needCasterTargetOrDirection(true) -spell:blockWalls(true) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/terra_wave.lua b/data-otservbr-global/scripts/spells/attack/terra_wave.lua deleted file mode 100644 index bb3814eae14..00000000000 --- a/data-otservbr-global/scripts/spells/attack/terra_wave.lua +++ /dev/null @@ -1,33 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_SMALLPLANTS) -combat:setArea(createCombatArea(AREA_SQUAREWAVE5, AREADIAGONAL_SQUAREWAVE5)) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 3.5) - local max = (level / 5) + (maglevel * 7) - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(120) -spell:name("Terra Wave") -spell:words("exevo tera hur") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_TERRA_WAVE) -spell:level(38) -spell:mana(170) -spell:isPremium(true) -spell:needDirection(true) -spell:cooldown(4 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("druid;true", "elder druid;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/ultimate_energy_strike.lua b/data-otservbr-global/scripts/spells/attack/ultimate_energy_strike.lua deleted file mode 100644 index 82034163329..00000000000 --- a/data-otservbr-global/scripts/spells/attack/ultimate_energy_strike.lua +++ /dev/null @@ -1,36 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 4.5) + 35 - local max = (level / 5) + (maglevel * 7.3) + 55 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack", "ultimatestrikes") -spell:id(155) -spell:name("Ultimate Energy Strike") -spell:words("exori max vis") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_ULTIMATE_ENERGY_STRIKE) -spell:level(100) -spell:mana(100) -spell:isPremium(true) -spell:range(3) -spell:needCasterTargetOrDirection(true) -spell:blockWalls(true) -spell:cooldown(30 * 1000) -spell:groupCooldown(2 * 1000, 30 * 1000) -spell:needLearn(false) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/ultimate_flame_strike.lua b/data-otservbr-global/scripts/spells/attack/ultimate_flame_strike.lua deleted file mode 100644 index bf3bd788fdf..00000000000 --- a/data-otservbr-global/scripts/spells/attack/ultimate_flame_strike.lua +++ /dev/null @@ -1,36 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_FIREATTACK) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 4.5) + 35 - local max = (level / 5) + (maglevel * 7.3) + 55 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack", "ultimatestrikes") -spell:id(154) -spell:name("Ultimate Flame Strike") -spell:words("exori max flam") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_ULTIMATE_FLAME_STRIKE) -spell:level(90) -spell:mana(100) -spell:isPremium(true) -spell:range(3) -spell:needCasterTargetOrDirection(true) -spell:blockWalls(true) -spell:cooldown(30 * 1000) -spell:groupCooldown(2 * 1000, 30 * 1000) -spell:needLearn(false) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/ultimate_ice_strike.lua b/data-otservbr-global/scripts/spells/attack/ultimate_ice_strike.lua deleted file mode 100644 index 4f8560248e8..00000000000 --- a/data-otservbr-global/scripts/spells/attack/ultimate_ice_strike.lua +++ /dev/null @@ -1,36 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ICEATTACK) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SMALLICE) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 4.5) + 35 - local max = (level / 5) + (maglevel * 7.3) + 55 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack", "ultimatestrikes") -spell:id(156) -spell:name("Ultimate Ice Strike") -spell:words("exori max frigo") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_ULTIMATE_ICE_STRIKE) -spell:level(100) -spell:mana(100) -spell:isPremium(true) -spell:range(3) -spell:needCasterTargetOrDirection(true) -spell:blockWalls(true) -spell:cooldown(30 * 1000) -spell:groupCooldown(4 * 1000, 30 * 1000) -spell:needLearn(false) -spell:vocation("druid;true", "elder druid;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/ultimate_terra_strike.lua b/data-otservbr-global/scripts/spells/attack/ultimate_terra_strike.lua deleted file mode 100644 index 705571c5989..00000000000 --- a/data-otservbr-global/scripts/spells/attack/ultimate_terra_strike.lua +++ /dev/null @@ -1,36 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_CARNIPHILA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SMALLEARTH) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 4.5) + 35 - local max = (level / 5) + (maglevel * 7.3) + 55 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack", "ultimatestrikes") -spell:id(157) -spell:name("Ultimate Terra Strike") -spell:words("exori max tera") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_ULTIMATE_TERRA_STRIKE) -spell:level(90) -spell:mana(100) -spell:isPremium(true) -spell:range(3) -spell:needCasterTargetOrDirection(true) -spell:blockWalls(true) -spell:cooldown(30 * 1000) -spell:groupCooldown(4 * 1000, 30 * 1000) -spell:needLearn(false) -spell:vocation("druid;true", "elder druid;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/whirlwind_throw.lua b/data-otservbr-global/scripts/spells/attack/whirlwind_throw.lua deleted file mode 100644 index 08839f9b926..00000000000 --- a/data-otservbr-global/scripts/spells/attack/whirlwind_throw.lua +++ /dev/null @@ -1,40 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_WEAPONTYPE) -combat:setParameter(COMBAT_PARAM_BLOCKARMOR, 1) -combat:setParameter(COMBAT_PARAM_USECHARGES, 1) - -function onGetFormulaValues(player, skill, attack, factor) - local level = player:getLevel() - local min = (level / 5) + (skill + attack) / 3 - local max = (level / 5) + skill + attack - return -min * 1.28, -max * 1.28 -- TODO : Use New Real Formula instead of an % -end - -combat:setCallback(CALLBACK_PARAM_SKILLVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack") -spell:id(107) -spell:name("Whirlwind Throw") -spell:words("exori hur") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_WHIRLWIND_THROW) -spell:level(28) -spell:mana(40) -spell:isPremium(true) -spell:range(5) -spell:needTarget(true) -spell:blockWalls(true) -spell:needWeapon(true) -spell:cooldown(6 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("knight;true", "elite knight;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/attack/wrath_of_nature.lua b/data-otservbr-global/scripts/spells/attack/wrath_of_nature.lua deleted file mode 100644 index fba886a5fcd..00000000000 --- a/data-otservbr-global/scripts/spells/attack/wrath_of_nature.lua +++ /dev/null @@ -1,33 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_SMALLPLANTS) -combat:setArea(createCombatArea(AREA_CIRCLE6X6)) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 5) - local max = (level / 5) + (maglevel * 10) - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:group("attack", "focus") -spell:id(56) -spell:name("Wrath of Nature") -spell:words("exevo gran mas tera") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_WRATH_OF_NATURE) -spell:level(55) -spell:mana(700) -spell:isPremium(true) -spell:isSelfTarget(true) -spell:cooldown(40 * 1000) -spell:groupCooldown(4 * 1000, 40 * 1000) -spell:needLearn(false) -spell:vocation("druid;true", "elder druid;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/Conjure_Diamond_Arrow.lua b/data-otservbr-global/scripts/spells/conjuring/Conjure_Diamond_Arrow.lua deleted file mode 100644 index 2ab4bbe0647..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/Conjure_Diamond_Arrow.lua +++ /dev/null @@ -1,21 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(0, 25757, 100, CONST_ME_MAGIC_BLUE) -end - -spell:group("support") -spell:id(192) -spell:name("Conjure Diamond Arrow") -spell:words("exevo gran con hur") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(150) -spell:mana(1000) -spell:soul(0) -spell:isPremium(true) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:vocation("paladin;true", "royal paladin;true") -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/Conjure_Royal_Star.lua b/data-otservbr-global/scripts/spells/conjuring/Conjure_Royal_Star.lua deleted file mode 100644 index 9961bcbb9a5..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/Conjure_Royal_Star.lua +++ /dev/null @@ -1,21 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(0, 25759, 30, CONST_ME_MAGIC_BLUE) -end - -spell:group("support") -spell:id(191) -spell:name("Conjure Royal Star") -spell:words("exevo gran con grav") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(150) -spell:mana(1000) -spell:soul(0) -spell:isPremium(true) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:vocation("paladin;true", "royal paladin;true") -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/Conjure_Spectral_Bolt.lua b/data-otservbr-global/scripts/spells/conjuring/Conjure_Spectral_Bolt.lua deleted file mode 100644 index 336eb423139..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/Conjure_Spectral_Bolt.lua +++ /dev/null @@ -1,21 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(0, 35902, 100, CONST_ME_MAGIC_BLUE) -end - -spell:group("support") -spell:id(193) -spell:name("Conjure Spectral Bolt") -spell:words("exevo gran con vis") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(150) -spell:mana(1000) -spell:soul(0) -spell:isPremium(true) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:vocation("paladin;true", "royal paladin;true") -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/Conjure_Wand_of_Darkness.lua b/data-otservbr-global/scripts/spells/conjuring/Conjure_Wand_of_Darkness.lua deleted file mode 100644 index b12edfe9ba9..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/Conjure_Wand_of_Darkness.lua +++ /dev/null @@ -1,22 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(0, 25760, 1, CONST_ME_MAGIC_BLUE) -end - -spell:group("support") -spell:id(92) -spell:name("Conjure Wand of Darkness") -spell:words("exevo gran mort") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_CONJURE_WAND_OF_DARKNESS) -spell:cooldown(30 * 60 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(41) -spell:mana(250) -spell:soul(0) -spell:isPremium(true) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/animate_dead_rune.lua b/data-otservbr-global/scripts/spells/conjuring/animate_dead_rune.lua deleted file mode 100644 index 80632ca6b76..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/animate_dead_rune.lua +++ /dev/null @@ -1,19 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3203, 1) -end - -spell:name("Animate Dead Rune") -spell:words("adana mort") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(27) -spell:mana(600) -spell:soul(5) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/arrow_call.lua b/data-otservbr-global/scripts/spells/conjuring/arrow_call.lua deleted file mode 100644 index b1cade0fed4..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/arrow_call.lua +++ /dev/null @@ -1,21 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(0, 21470, 3, CONST_ME_MAGIC_BLUE) -end - -spell:name("Arrow Call") -spell:words("exevo infir con") -spell:group("support") -spell:vocation("paladin;true", "royal paladin;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_ARROW_CALL) -spell:id(176) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(1) -spell:mana(10) -spell:soul(1) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/avalanche_rune.lua b/data-otservbr-global/scripts/spells/conjuring/avalanche_rune.lua deleted file mode 100644 index 66924dd920d..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/avalanche_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3161, 4) -end - -spell:name("Avalanche Rune") -spell:words("adori mas frigo") -spell:group("support") -spell:vocation("druid;true", "elder druid;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(30) -spell:mana(530) -spell:soul(3) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/blank_rune.lua b/data-otservbr-global/scripts/spells/conjuring/blank_rune.lua deleted file mode 100644 index 63d47208a74..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/blank_rune.lua +++ /dev/null @@ -1,17 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(0, 3147, 1) -end - -spell:name("Blank Rune") -spell:words("adori blank") -spell:group("support") -spell:vocation("druid;true", "paladin;true", "sorcerer;true", "elder druid;true", "royal paladin;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(20) -spell:mana(50) -spell:soul(1) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/chameleon_rune.lua b/data-otservbr-global/scripts/spells/conjuring/chameleon_rune.lua deleted file mode 100644 index fbddb548dd0..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/chameleon_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3178, 1) -end - -spell:name("Chameleon Rune") -spell:words("adevo ina") -spell:group("support") -spell:vocation("druid;true", "elder druid;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(27) -spell:mana(600) -spell:soul(2) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/conjure_arrow.lua b/data-otservbr-global/scripts/spells/conjuring/conjure_arrow.lua deleted file mode 100644 index 498c5c18432..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/conjure_arrow.lua +++ /dev/null @@ -1,21 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(0, 3447, 10, CONST_ME_MAGIC_BLUE) -end - -spell:name("Conjure Arrow") -spell:words("exevo con") -spell:group("support") -spell:vocation("paladin;true", "royal paladin;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_CONJURE_ARROW) -spell:id(51) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(13) -spell:mana(100) -spell:soul(1) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/conjure_bolt.lua b/data-otservbr-global/scripts/spells/conjuring/conjure_bolt.lua deleted file mode 100644 index 91b0c94059f..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/conjure_bolt.lua +++ /dev/null @@ -1,22 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(0, 3446, 5, CONST_ME_MAGIC_BLUE) -end - -spell:name("Conjure Bolt") -spell:words("exevo con mort") -spell:group("support") -spell:vocation("paladin;true", "royal paladin;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_CONJURE_ARROW) -spell:id(79) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(17) -spell:mana(140) -spell:soul(2) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/conjure_explosive_arrow.lua b/data-otservbr-global/scripts/spells/conjuring/conjure_explosive_arrow.lua deleted file mode 100644 index a74ba9c13de..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/conjure_explosive_arrow.lua +++ /dev/null @@ -1,21 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(0, 3449, 8, CONST_ME_MAGIC_BLUE) -end - -spell:name("Conjure Explosive Arrow") -spell:words("exevo con flam") -spell:group("support") -spell:vocation("paladin;true", "royal paladin;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_CONJURE_EXPLOSIVE_ARROW) -spell:id(49) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(25) -spell:mana(290) -spell:soul(3) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/conjure_piercing_bolt.lua b/data-otservbr-global/scripts/spells/conjuring/conjure_piercing_bolt.lua deleted file mode 100644 index db4fa450fd0..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/conjure_piercing_bolt.lua +++ /dev/null @@ -1,21 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(0, 7363, 5, CONST_ME_MAGIC_BLUE) -end - -spell:name("Conjure Piercing Bolt") -spell:words("exevo con grav") -spell:group("support") -spell:vocation("paladin;true", "royal paladin;true") -spell:id(109) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(33) -spell:mana(180) -spell:soul(3) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/conjure_poisoned_arrow.lua b/data-otservbr-global/scripts/spells/conjuring/conjure_poisoned_arrow.lua deleted file mode 100644 index eeb839d4fee..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/conjure_poisoned_arrow.lua +++ /dev/null @@ -1,20 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(0, 3448, 7, CONST_ME_MAGIC_BLUE) -end - -spell:name("Conjure Poisoned Arrow") -spell:words("exevo con pox") -spell:group("support") -spell:vocation("paladin;true", "royal paladin;true") -spell:id(48) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(16) -spell:mana(130) -spell:soul(2) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/conjure_power_bolt.lua b/data-otservbr-global/scripts/spells/conjuring/conjure_power_bolt.lua deleted file mode 100644 index 3ebd95bf33d..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/conjure_power_bolt.lua +++ /dev/null @@ -1,21 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(0, 3450, 10, CONST_ME_MAGIC_BLUE) -end - -spell:name("Conjure Power Bolt") -spell:words("exevo con vis") -spell:group("support") -spell:vocation("royal paladin;true") -spell:id(95) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(59) -spell:mana(700) -spell:soul(4) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/conjure_sniper_arrow.lua b/data-otservbr-global/scripts/spells/conjuring/conjure_sniper_arrow.lua deleted file mode 100644 index c60911472eb..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/conjure_sniper_arrow.lua +++ /dev/null @@ -1,21 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(0, 7364, 5, CONST_ME_MAGIC_BLUE) -end - -spell:name("Conjure Sniper Arrow") -spell:words("exevo con hur") -spell:group("support") -spell:vocation("paladin;true", "royal paladin;true") -spell:id(108) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(24) -spell:mana(160) -spell:soul(3) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/convince_creature_rune.lua b/data-otservbr-global/scripts/spells/conjuring/convince_creature_rune.lua deleted file mode 100644 index 27032d09356..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/convince_creature_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3177, 1) -end - -spell:name("Convince Creature Rune") -spell:words("adeta sio") -spell:group("support") -spell:vocation("druid;true", "elder druid;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(16) -spell:mana(200) -spell:soul(3) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/cure_poison_rune.lua b/data-otservbr-global/scripts/spells/conjuring/cure_poison_rune.lua deleted file mode 100644 index 9a24ce14792..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/cure_poison_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3153, 1) -end - -spell:name("Cure Poison Rune") -spell:words("adana pox") -spell:group("support") -spell:vocation("druid;true", "elder druid;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(15) -spell:mana(200) -spell:soul(1) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/destroy_field_rune.lua b/data-otservbr-global/scripts/spells/conjuring/destroy_field_rune.lua deleted file mode 100644 index 6a59bd798e3..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/destroy_field_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3148, 3) -end - -spell:name("Destroy Field Rune") -spell:words("adito grav") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "paladin;true", "royal paladin;true", "sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(17) -spell:mana(120) -spell:soul(2) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/disintegrate_rune.lua b/data-otservbr-global/scripts/spells/conjuring/disintegrate_rune.lua deleted file mode 100644 index a9ae15a6266..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/disintegrate_rune.lua +++ /dev/null @@ -1,19 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3197, 3) -end - -spell:name("Disintegrate Rune") -spell:words("adito tera") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "paladin;true", "royal paladin;true", "sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(21) -spell:mana(200) -spell:soul(3) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/enchant_spear.lua b/data-otservbr-global/scripts/spells/conjuring/enchant_spear.lua deleted file mode 100644 index 977f0f599fe..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/enchant_spear.lua +++ /dev/null @@ -1,22 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3277, 7367, 1, CONST_ME_MAGIC_GREEN) -end - -spell:name("Enchant Spear") -spell:words("exeta con") -spell:group("support") -spell:vocation("paladin;true", "royal paladin;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_ENCHANT_SPEAR) -spell:id(110) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(45) -spell:mana(350) -spell:soul(3) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/enchant_staff.lua b/data-otservbr-global/scripts/spells/conjuring/enchant_staff.lua deleted file mode 100644 index f5fcc8449a1..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/enchant_staff.lua +++ /dev/null @@ -1,20 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3289, 3321, 1, CONST_ME_MAGIC_GREEN) -end - -spell:name("Enchant Staff") -spell:words("exeta vis") -spell:group("support") -spell:vocation("master sorcerer;true") -spell:id(92) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(41) -spell:mana(80) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/energy_bomb_rune.lua b/data-otservbr-global/scripts/spells/conjuring/energy_bomb_rune.lua deleted file mode 100644 index f3d76844478..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/energy_bomb_rune.lua +++ /dev/null @@ -1,19 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3149, 2) -end - -spell:name("Energy Bomb Rune") -spell:words("adevo mas vis") -spell:group("support") -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(37) -spell:mana(880) -spell:soul(5) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/energy_field_rune.lua b/data-otservbr-global/scripts/spells/conjuring/energy_field_rune.lua deleted file mode 100644 index b3007620adf..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/energy_field_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3164, 3) -end - -spell:name("Energy Field Rune") -spell:words("adevo grav vis") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(18) -spell:mana(320) -spell:soul(2) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/energy_wall_rune.lua b/data-otservbr-global/scripts/spells/conjuring/energy_wall_rune.lua deleted file mode 100644 index d1bddbe7e4d..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/energy_wall_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3166, 4) -end - -spell:name("Energy Wall Rune") -spell:words("adevo mas grav vis") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(41) -spell:mana(1000) -spell:soul(5) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/explosion_rune.lua b/data-otservbr-global/scripts/spells/conjuring/explosion_rune.lua deleted file mode 100644 index 7c5e3edf758..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/explosion_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3200, 6) -end - -spell:name("Explosion Rune") -spell:words("adevo mas hur") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(31) -spell:mana(570) -spell:soul(4) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/fire_bomb_rune.lua b/data-otservbr-global/scripts/spells/conjuring/fire_bomb_rune.lua deleted file mode 100644 index 93e8b089a17..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/fire_bomb_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3192, 2) -end - -spell:name("Fire Bomb Rune") -spell:words("adevo mas flam") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(27) -spell:mana(600) -spell:soul(4) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/fire_field_rune.lua b/data-otservbr-global/scripts/spells/conjuring/fire_field_rune.lua deleted file mode 100644 index d4bb501c733..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/fire_field_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3188, 3) -end - -spell:name("Fire Field Rune") -spell:words("adevo grav flam") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(15) -spell:mana(240) -spell:soul(1) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/fire_wall_rune.lua b/data-otservbr-global/scripts/spells/conjuring/fire_wall_rune.lua deleted file mode 100644 index 4e9d43680d1..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/fire_wall_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3190, 4) -end - -spell:name("Fire Wall Rune") -spell:words("adevo mas grav flam") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(33) -spell:mana(780) -spell:soul(4) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/fireball_rune.lua b/data-otservbr-global/scripts/spells/conjuring/fireball_rune.lua deleted file mode 100644 index 57da67c465e..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/fireball_rune.lua +++ /dev/null @@ -1,19 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3189, 5) -end - -spell:name("Fireball Rune") -spell:words("adori flam") -spell:group("support") -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(27) -spell:mana(460) -spell:soul(3) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/great_fireball_rune.lua b/data-otservbr-global/scripts/spells/conjuring/great_fireball_rune.lua deleted file mode 100644 index 6ea94e6c224..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/great_fireball_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3191, 4) -end - -spell:name("Great Fireball Rune") -spell:words("adori mas flam") -spell:group("support") -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(30) -spell:mana(530) -spell:soul(3) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/heavy_magic_missile_rune.lua b/data-otservbr-global/scripts/spells/conjuring/heavy_magic_missile_rune.lua deleted file mode 100644 index 7b25934a3cc..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/heavy_magic_missile_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3198, 10) -end - -spell:name("Heavy Magic Missile Rune") -spell:words("adori vis") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(25) -spell:mana(350) -spell:soul(2) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/holy_missile_rune.lua b/data-otservbr-global/scripts/spells/conjuring/holy_missile_rune.lua deleted file mode 100644 index a3a940aef96..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/holy_missile_rune.lua +++ /dev/null @@ -1,19 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3182, 5) -end - -spell:name("Holy Missile Rune") -spell:words("adori san") -spell:group("support") -spell:vocation("paladin;true", "royal paladin;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(27) -spell:mana(300) -spell:soul(3) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/icicle_rune.lua b/data-otservbr-global/scripts/spells/conjuring/icicle_rune.lua deleted file mode 100644 index 007e551a429..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/icicle_rune.lua +++ /dev/null @@ -1,19 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3158, 5) -end - -spell:name("Icicle Rune") -spell:words("adori frigo") -spell:group("support") -spell:vocation("druid;true", "elder druid;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(28) -spell:mana(460) -spell:soul(3) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/intense_healing_rune.lua b/data-otservbr-global/scripts/spells/conjuring/intense_healing_rune.lua deleted file mode 100644 index 500024ade58..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/intense_healing_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3152, 1) -end - -spell:name("Intense Healing Rune") -spell:words("adura gran") -spell:group("support") -spell:vocation("druid;true", "elder druid;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(15) -spell:mana(120) -spell:soul(2) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/light_magic_missile_rune.lua b/data-otservbr-global/scripts/spells/conjuring/light_magic_missile_rune.lua deleted file mode 100644 index 03c4ac33b40..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/light_magic_missile_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3174, 10) -end - -spell:name("Light Magic Missile Rune") -spell:words("adori min vis") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(15) -spell:mana(120) -spell:soul(1) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/light_stone_shower_rune.lua b/data-otservbr-global/scripts/spells/conjuring/light_stone_shower_rune.lua deleted file mode 100644 index 56246462392..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/light_stone_shower_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 21351, 4) -end - -spell:name("Light Stone Shower Rune") -spell:words("adori infir mas tera") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(1) -spell:mana(6) -spell:soul(3) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/lightest_magic_missile_rune.lua b/data-otservbr-global/scripts/spells/conjuring/lightest_magic_missile_rune.lua deleted file mode 100644 index a7d21400ffd..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/lightest_magic_missile_rune.lua +++ /dev/null @@ -1,17 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3174, 10, CONST_ME_MAGIC_BLUE) -end - -spell:name("Lightest Magic Missile") -spell:words("adori dis min vis") -spell:group("support") -spell:vocation("none") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(1) -spell:mana(5) -spell:soul(0) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/lightest_missile_rune.lua b/data-otservbr-global/scripts/spells/conjuring/lightest_missile_rune.lua deleted file mode 100644 index 25309db5d9f..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/lightest_missile_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 21352, 10) -end - -spell:name("Lightest Missile Rune") -spell:words("adori infir vis") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(1) -spell:mana(6) -spell:soul(0) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/magic_wall_rune.lua b/data-otservbr-global/scripts/spells/conjuring/magic_wall_rune.lua deleted file mode 100644 index 97d83c83762..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/magic_wall_rune.lua +++ /dev/null @@ -1,19 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3180, 3) -end - -spell:name("Magic Wall Rune") -spell:words("adevo grav tera") -spell:group("support") -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(32) -spell:mana(750) -spell:soul(5) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/paralyze_rune.lua b/data-otservbr-global/scripts/spells/conjuring/paralyze_rune.lua deleted file mode 100644 index 0c14003c488..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/paralyze_rune.lua +++ /dev/null @@ -1,19 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3165, 1) -end - -spell:name("Paralyze Rune") -spell:words("adana ani") -spell:group("support") -spell:vocation("druid;true", "elder druid;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(54) -spell:mana(1400) -spell:soul(3) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/poison_bomb_rune.lua b/data-otservbr-global/scripts/spells/conjuring/poison_bomb_rune.lua deleted file mode 100644 index dce844a384e..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/poison_bomb_rune.lua +++ /dev/null @@ -1,19 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3173, 2) -end - -spell:name("Poison Bomb Rune") -spell:words("adevo mas pox") -spell:group("support") -spell:vocation("druid;true", "elder druid;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(25) -spell:mana(520) -spell:soul(2) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/poison_field_rune.lua b/data-otservbr-global/scripts/spells/conjuring/poison_field_rune.lua deleted file mode 100644 index a1bc7cafcab..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/poison_field_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3172, 3) -end - -spell:name("Poison Field Rune") -spell:words("adevo grav pox") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(14) -spell:mana(200) -spell:soul(1) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/poison_wall_rune.lua b/data-otservbr-global/scripts/spells/conjuring/poison_wall_rune.lua deleted file mode 100644 index e060e27f73e..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/poison_wall_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3176, 4) -end - -spell:name("Poison Wall Rune") -spell:words("adevo mas grav pox") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(29) -spell:mana(640) -spell:soul(3) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/soulfire_rune.lua b/data-otservbr-global/scripts/spells/conjuring/soulfire_rune.lua deleted file mode 100644 index cf4f195dfac..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/soulfire_rune.lua +++ /dev/null @@ -1,19 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3195, 3) -end - -spell:name("Soulfire Rune") -spell:words("adevo res flam") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(27) -spell:mana(420) -spell:soul(3) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/stalagmite_rune.lua b/data-otservbr-global/scripts/spells/conjuring/stalagmite_rune.lua deleted file mode 100644 index 5dc768eb8ac..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/stalagmite_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3179, 10) -end - -spell:name("Stalagmite Rune") -spell:words("adori tera") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(24) -spell:mana(350) -spell:soul(2) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/stone_shower_rune.lua b/data-otservbr-global/scripts/spells/conjuring/stone_shower_rune.lua deleted file mode 100644 index 8a1643dc33f..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/stone_shower_rune.lua +++ /dev/null @@ -1,19 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3175, 4) -end - -spell:name("Stone Shower Rune") -spell:words("adori mas tera") -spell:group("support") -spell:vocation("druid;true", "elder druid;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(28) -spell:mana(430) -spell:soul(3) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/sudden_death_rune.lua b/data-otservbr-global/scripts/spells/conjuring/sudden_death_rune.lua deleted file mode 100644 index 68cc21e2e85..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/sudden_death_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3155, 3) -end - -spell:name("Sudden Death Rune") -spell:words("adori gran mort") -spell:group("support") -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(45) -spell:mana(985) -spell:soul(5) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/thunderstorm_rune.lua b/data-otservbr-global/scripts/spells/conjuring/thunderstorm_rune.lua deleted file mode 100644 index de321b3195b..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/thunderstorm_rune.lua +++ /dev/null @@ -1,19 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3202, 4) -end - -spell:name("Thunderstorm Rune") -spell:words("adori mas vis") -spell:group("support") -spell:vocation("sorcerer;true", "master sorcerer;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(28) -spell:mana(430) -spell:soul(3) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/ultimate_healing_rune.lua b/data-otservbr-global/scripts/spells/conjuring/ultimate_healing_rune.lua deleted file mode 100644 index 618210b58e0..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/ultimate_healing_rune.lua +++ /dev/null @@ -1,18 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3160, 1) -end - -spell:name("Ultimate Healing Rune") -spell:words("adura vita") -spell:group("support") -spell:vocation("druid;true", "elder druid;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(24) -spell:mana(400) -spell:soul(3) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/conjuring/wild_growth_rune.lua b/data-otservbr-global/scripts/spells/conjuring/wild_growth_rune.lua deleted file mode 100644 index 3f2b0d5d40d..00000000000 --- a/data-otservbr-global/scripts/spells/conjuring/wild_growth_rune.lua +++ /dev/null @@ -1,19 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return creature:conjureItem(3147, 3156, 2) -end - -spell:name("Wild Growth Rune") -spell:words("adevo grav vita") -spell:group("support") -spell:vocation("druid;true", "elder druid;true") -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(27) -spell:mana(600) -spell:soul(5) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/bruise_bane.lua b/data-otservbr-global/scripts/spells/healing/bruise_bane.lua deleted file mode 100644 index 2f7be1d1303..00000000000 --- a/data-otservbr-global/scripts/spells/healing/bruise_bane.lua +++ /dev/null @@ -1,35 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -function onGetFormulaValues(_player, level, magicLevel) -- already compared to the official tibia | compared date: 08/03/21(m/d/y) (need more chars test accuracy) - local min = (level * 0.2 + magicLevel * 1.795) - local max = (level * 0.2 + magicLevel * 1.795) + 5 - return min, max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Bruise Bane") -spell:words("exura infir ico") -spell:group("healing") -spell:vocation("knight;true", "elite knight;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_BRUISE_BANE) -spell:id(170) -spell:cooldown(1000) -spell:groupCooldown(1000) -spell:level(1) -spell:mana(10) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:needLearn(false) -spell:isPremium(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/cure_bleeding.lua b/data-otservbr-global/scripts/spells/healing/cure_bleeding.lua deleted file mode 100644 index 46b57ba3e37..00000000000 --- a/data-otservbr-global/scripts/spells/healing/cure_bleeding.lua +++ /dev/null @@ -1,26 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_BLEEDING) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Cure Bleeding") -spell:words("exana kor") -spell:group("healing") -spell:vocation("druid;true", "elder druid;true", "knight;true", "elite knight;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_CURE_BLEEDING) -spell:id(144) -spell:cooldown(6000) -spell:groupCooldown(1000) -spell:level(45) -spell:mana(30) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:needLearn(false) -spell:isPremium(true) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/cure_burning.lua b/data-otservbr-global/scripts/spells/healing/cure_burning.lua deleted file mode 100644 index 9f72af827c6..00000000000 --- a/data-otservbr-global/scripts/spells/healing/cure_burning.lua +++ /dev/null @@ -1,26 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_FIRE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Cure Burning") -spell:words("exana flam") -spell:group("healing") -spell:vocation("druid;true", "elder druid;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_CURE_BURNING) -spell:id(145) -spell:cooldown(6000) -spell:groupCooldown(1000) -spell:level(30) -spell:mana(30) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/cure_curse.lua b/data-otservbr-global/scripts/spells/healing/cure_curse.lua deleted file mode 100644 index cd4237c4204..00000000000 --- a/data-otservbr-global/scripts/spells/healing/cure_curse.lua +++ /dev/null @@ -1,26 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_CURSED) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Cure Curse") -spell:words("exana mort") -spell:group("healing") -spell:vocation("paladin;true", "royal paladin;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_CURE_CURSE) -spell:id(147) -spell:cooldown(6000) -spell:groupCooldown(1000) -spell:level(80) -spell:mana(40) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/cure_electrification.lua b/data-otservbr-global/scripts/spells/healing/cure_electrification.lua deleted file mode 100644 index ae10d513b05..00000000000 --- a/data-otservbr-global/scripts/spells/healing/cure_electrification.lua +++ /dev/null @@ -1,26 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_ENERGY) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Cure Electrification") -spell:words("exana vis") -spell:group("healing") -spell:vocation("druid;true", "elder druid;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_CURE_ELECTRIFICATION) -spell:id(146) -spell:cooldown(6000) -spell:groupCooldown(1000) -spell:level(22) -spell:mana(30) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/cure_poison.lua b/data-otservbr-global/scripts/spells/healing/cure_poison.lua deleted file mode 100644 index f8232ea9b76..00000000000 --- a/data-otservbr-global/scripts/spells/healing/cure_poison.lua +++ /dev/null @@ -1,26 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_POISON) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Cure Poison") -spell:words("exana pox") -spell:group("healing") -spell:vocation("druid;true", "elder druid;true", "knight;true", "elite knight;true", "paladin;true", "royal paladin;true", "sorcerer;true", "master sorcerer;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_CURE_POISON) -spell:id(29) -spell:cooldown(6000) -spell:groupCooldown(1000) -spell:level(10) -spell:mana(30) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/divine_healing.lua b/data-otservbr-global/scripts/spells/healing/divine_healing.lua deleted file mode 100644 index 64151aa5330..00000000000 --- a/data-otservbr-global/scripts/spells/healing/divine_healing.lua +++ /dev/null @@ -1,35 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -function onGetFormulaValues(_player, level, magicLevel) -- already compared to the official tibia | compared date: 05/07/19(m/d/y) - local min = (level * 0.2 + magicLevel * 7.22) + 44 - local max = (level * 0.2 + magicLevel * 12.79) + 79 - return min, max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Divine Healing") -spell:words("exura san") -spell:group("healing") -spell:vocation("paladin;true", "royal paladin;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_DIVINE_HEALING) -spell:id(125) -spell:cooldown(1000) -spell:groupCooldown(1000) -spell:level(35) -spell:mana(160) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/fair_wound_cleansing.lua b/data-otservbr-global/scripts/spells/healing/fair_wound_cleansing.lua deleted file mode 100644 index dc6060e40d3..00000000000 --- a/data-otservbr-global/scripts/spells/healing/fair_wound_cleansing.lua +++ /dev/null @@ -1,35 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) - -function onGetFormulaValues(_player, level, magicLevel) -- already compared to the official tibia | compared date: 05/07/19(m/d/y) - local min = (level * 0.2 + magicLevel * 4 + 25) * 2 - local max = (level * 0.2 + magicLevel * 7.95 + 51) * 2 - return min, max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:group("healing") -spell:id(239) -spell:name("Fair Wound Cleansing") -spell:words("exura med ico") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_FAIR_WOUND_CLEANSING) -spell:level(300) -spell:mana(90) -spell:isPremium(true) -spell:isSelfTarget(true) -spell:cooldown(1000) -spell:groupCooldown(1000) -spell:isAggressive(false) -spell:vocation("knight;true", "elite knight;true") -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/heal_friend.lua b/data-otservbr-global/scripts/spells/healing/heal_friend.lua deleted file mode 100644 index c25c9c1d8fb..00000000000 --- a/data-otservbr-global/scripts/spells/healing/heal_friend.lua +++ /dev/null @@ -1,38 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_GREEN) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -function onGetFormulaValues(player, level, magicLevel) - local min = (level * 0.2 + magicLevel * 10) + 3 - local max = (level * 0.2 + magicLevel * 14) + 5 - return min, max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - creature:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) - return combat:execute(creature, variant) -end - -spell:name("Heal Friend") -spell:words("exura sio") -spell:group("healing") -spell:vocation("druid;true", "elder druid;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_HEAL_FRIEND) -spell:id(84) -spell:cooldown(1000) -spell:groupCooldown(1000) -spell:level(18) -spell:mana(120) -spell:needTarget(true) -spell:hasParams(true) -spell:hasPlayerNameParam(true) -spell:allowOnSelf(false) -spell:isAggressive(false) -spell:isPremium(true) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/heal_monsters.lua b/data-otservbr-global/scripts/spells/healing/heal_monsters.lua deleted file mode 100644 index 476eb3a9e2b..00000000000 --- a/data-otservbr-global/scripts/spells/healing/heal_monsters.lua +++ /dev/null @@ -1,34 +0,0 @@ -function onTargetCreature(creature, target) - local min = 100 - local max = 300 - - if target:isPlayer() then - return true - end - if target:getMaster() then - return true - end - - doTargetCombatHealth(0, target, COMBAT_HEALING, min, max, CONST_ME_NONE) - return true -end - -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, 0) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) -combat:setArea(createCombatArea(AREA_CIRCLE3X3)) -combat:setCallback(CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:name("Heal Monster") -spell:words("#####458") -spell:blockWalls(true) -spell:needLearn(true) -spell:needDirection(true) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/heal_monsters_9x9.lua b/data-otservbr-global/scripts/spells/healing/heal_monsters_9x9.lua deleted file mode 100644 index e8db55def9a..00000000000 --- a/data-otservbr-global/scripts/spells/healing/heal_monsters_9x9.lua +++ /dev/null @@ -1,34 +0,0 @@ -function onTargetCreature(creature, target) - local min = 0 - local max = 1000 - - if target:isPlayer() then - return true - end - if target:getMaster() then - return true - end - - doTargetCombatHealth(0, target, COMBAT_HEALING, min, max, CONST_ME_NONE) - return true -end - -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, 0) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) -combat:setArea(createCombatArea(AREA_CIRCLE6X6)) -combat:setCallback(CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:name("Heal Monster 9x9") -spell:words("#####459") -spell:blockWalls(true) -spell:needLearn(true) -spell:needDirection(true) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/intense_healing.lua b/data-otservbr-global/scripts/spells/healing/intense_healing.lua deleted file mode 100644 index 8813c2daf52..00000000000 --- a/data-otservbr-global/scripts/spells/healing/intense_healing.lua +++ /dev/null @@ -1,33 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -function onGetFormulaValues(player, level, magicLevel) -- already compared to the official tibia | compared date: 05/07/19(m/d/y) - local min = (level * 0.2 + magicLevel * 3.184) + 20 - local max = (level * 0.2 + magicLevel * 5.59) + 35 - return min, max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Intense Healing") -spell:words("exura gran") -spell:group("healing") -spell:vocation("druid;true", "elder druid;true", "paladin;true", "royal paladin;true", "sorcerer;true", "master sorcerer;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_INTENSE_HEALING) -spell:id(2) -spell:cooldown(1000) -spell:groupCooldown(1000) -spell:level(20) -spell:mana(70) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/intense_recovery.lua b/data-otservbr-global/scripts/spells/healing/intense_recovery.lua deleted file mode 100644 index ef90a2c4d36..00000000000 --- a/data-otservbr-global/scripts/spells/healing/intense_recovery.lua +++ /dev/null @@ -1,34 +0,0 @@ -local combat = Combat() -local cooldown = 60000 -- milis - -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_GREEN) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -local condition = Condition(CONDITION_REGENERATION) -condition:setParameter(CONDITION_PARAM_TICKS, cooldown) -condition:setParameter(CONDITION_PARAM_HEALTHGAIN, 40) -condition:setParameter(CONDITION_PARAM_HEALTHTICKS, 3000) -- 3sec -condition:setParameter(CONDITION_PARAM_BUFF_SPELL, true) -combat:addCondition(condition) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Intense Recovery") -spell:words("utura gran") -spell:group("healing") -spell:vocation("knight;true", "elite knight;true", "paladin;true", "royal paladin;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_INTENSE_RECOVERY) -spell:id(160) -spell:cooldown(cooldown) -spell:groupCooldown(1000) -spell:level(100) -spell:mana(165) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/intense_wound_cleansing.lua b/data-otservbr-global/scripts/spells/healing/intense_wound_cleansing.lua deleted file mode 100644 index f7dd7a58f66..00000000000 --- a/data-otservbr-global/scripts/spells/healing/intense_wound_cleansing.lua +++ /dev/null @@ -1,35 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -function onGetFormulaValues(player, level, magicLevel) - local min = (level * 0.2 + magicLevel * 70) + 438 - local max = (level * 0.2 + magicLevel * 92) + 544 - return min, max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Intense Wound Cleansing") -spell:words("exura gran ico") -spell:group("healing") -spell:vocation("knight;true", "elite knight;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_INTENSE_WOUND_CLEANSING) -spell:id(158) -spell:cooldown(600000) -- 600 sec -spell:groupCooldown(1000) -spell:level(80) -spell:mana(200) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/light_healing.lua b/data-otservbr-global/scripts/spells/healing/light_healing.lua deleted file mode 100644 index 6860817bec8..00000000000 --- a/data-otservbr-global/scripts/spells/healing/light_healing.lua +++ /dev/null @@ -1,34 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -function onGetFormulaValues(player, level, magicLevel) -- already compared to the official tibia | compared date: 05/07/19(m/d/y) - local min = (level * 0.2 + magicLevel * 1.4) + 8 - local max = (level * 0.2 + magicLevel * 1.795) + 11 - return min, max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Light Healing") -spell:words("exura") -spell:group("healing") -spell:vocation("druid;true", "elder druid;true", "paladin;true", "royal paladin;true", "sorcerer;true", "master sorcerer;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_LIGHT_HEALING) -spell:id(1) -spell:cooldown(1000) -spell:groupCooldown(1000) -spell:level(8) -spell:mana(20) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/magic_patch.lua b/data-otservbr-global/scripts/spells/healing/magic_patch.lua deleted file mode 100644 index 478d12cf088..00000000000 --- a/data-otservbr-global/scripts/spells/healing/magic_patch.lua +++ /dev/null @@ -1,35 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -function onGetFormulaValues(player, level, maglevel) -- already compared to the official tibia | compared date: 08/03/21(m/d/y) -- possible max limit of 30?, need test in magic level 71+. - local min = (level * 0 + maglevel * 0.1614) + 8 - local max = (level * 0 + maglevel * 0.2468) + 15 - return min, max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Magic Patch") -spell:words("exura infir") -spell:group("healing") -spell:vocation("druid;true", "elder druid;true", "paladin;true", "royal paladin;true", "sorcerer;true", "master sorcerer;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_MAGIC_PATCH) -spell:id(174) -spell:cooldown(1 * 1000) -spell:groupCooldown(1 * 1000) -spell:level(1) -spell:mana(6) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:needLearn(false) -spell:isPremium(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/nature's_embrace.lua b/data-otservbr-global/scripts/spells/healing/nature's_embrace.lua deleted file mode 100644 index 18985db2a7e..00000000000 --- a/data-otservbr-global/scripts/spells/healing/nature's_embrace.lua +++ /dev/null @@ -1,44 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, 0) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 2.5) + (maglevel * 20) - local max = (level / 2.5) + (maglevel * 28) -- TODO: Formulas (TibiaWiki says x2 but need more acurracy) - return min, max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - if creature:isPlayer() and var:getNumber() == creature:getId() then - creature:sendCancelMessage("You can't cast this spell to yourself.") - creature:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - else - return combat:execute(creature, var) - end -end - -spell:group("healing") -spell:id(242) -spell:name("Nature's Embrace") -spell:words("exura gran sio") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_NATURES_EMBRACE) -spell:level(300) -spell:mana(400) -spell:isPremium(true) -spell:needTarget(true) -spell:cooldown(60 * 1000) -spell:groupCooldown(1 * 1000) -spell:isAggressive(false) -spell:isBlockingWalls(true) -spell:hasParams(true) -spell:hasPlayerNameParam(true) -spell:vocation("druid;true", "elder druid;true") -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/practice_healing.lua b/data-otservbr-global/scripts/spells/healing/practice_healing.lua deleted file mode 100644 index 66c8e96ae77..00000000000 --- a/data-otservbr-global/scripts/spells/healing/practice_healing.lua +++ /dev/null @@ -1,33 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) -combat:setFormula(COMBAT_FORMULA_DAMAGE, -5, 0, -9, 0) - -function onGetFormulaValues(player, level, magicLevel) - return 5, 9 -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Practice Healing") -spell:words("exura dis") -spell:group("healing") -spell:vocation("none") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_PRACTISE_HEALING) -spell:id(166) -spell:cooldown(1 * 1000) -spell:groupCooldown(1 * 1000) -spell:level(1) -spell:mana(5) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/recovery.lua b/data-otservbr-global/scripts/spells/healing/recovery.lua deleted file mode 100644 index d4289ff7355..00000000000 --- a/data-otservbr-global/scripts/spells/healing/recovery.lua +++ /dev/null @@ -1,31 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_GREEN) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -local condition = Condition(CONDITION_REGENERATION) -condition:setParameter(CONDITION_PARAM_TICKS, 1 * 60 * 1000) -condition:setParameter(CONDITION_PARAM_HEALTHGAIN, 20) -condition:setParameter(CONDITION_PARAM_HEALTHTICKS, 3 * 1000) -condition:setParameter(CONDITION_PARAM_BUFF_SPELL, true) -combat:addCondition(condition) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Recovery") -spell:words("utura") -spell:group("healing") -spell:vocation("knight;true", "elite knight;true", "paladin;true", "royal paladin;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_RECOVERY) -spell:id(159) -spell:cooldown(1 * 60 * 1000) -spell:groupCooldown(1 * 1000) -spell:level(50) -spell:mana(75) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/restoration.lua b/data-otservbr-global/scripts/spells/healing/restoration.lua deleted file mode 100644 index e17b7f6d55b..00000000000 --- a/data-otservbr-global/scripts/spells/healing/restoration.lua +++ /dev/null @@ -1,34 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, 0) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) - -function onGetFormulaValues(player, level, maglevel) - local min = (level * 1.4 / 5) + (maglevel * 9.22 * 1.4) + 44 * 1.4 - local max = (level * 1.4 / 5) + (maglevel * 10.79 * 1.4) + 79 * 1.4 -- TODO: Formulas (Right now using 40% extra on Ultimate Healing with closer min and max values to the avg) - return min, max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:group("healing") -spell:id(241) -spell:name("Restoration") -spell:words("exura max vita") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_RESTORATION) -spell:level(300) -spell:mana(260) -spell:isSelfTarget(true) -spell:cooldown(6 * 1000) -spell:groupCooldown(1 * 1000) -spell:isAggressive(false) -spell:needLearn(false) -spell:vocation("druid;true", "sorcerer;true", "elder druid;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/salvation.lua b/data-otservbr-global/scripts/spells/healing/salvation.lua deleted file mode 100644 index 3388f7e1296..00000000000 --- a/data-otservbr-global/scripts/spells/healing/salvation.lua +++ /dev/null @@ -1,35 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -function onGetFormulaValues(player, level, magicLevel) -- already compared to the official tibia | compared date: 05/07/19(m/d/y) - local min = (level * 0.2 + magicLevel * 12) + 75 - local max = (level * 0.2 + magicLevel * 20) + 125 - return min, max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Salvation") -spell:words("exura gran san") -spell:group("healing") -spell:vocation("paladin;true", "royal paladin;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_SALVATION) -spell:id(36) -spell:cooldown(1000) -spell:groupCooldown(1000) -spell:level(60) -spell:mana(210) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/ultimate_healing.lua b/data-otservbr-global/scripts/spells/healing/ultimate_healing.lua deleted file mode 100644 index 3876ccdb583..00000000000 --- a/data-otservbr-global/scripts/spells/healing/ultimate_healing.lua +++ /dev/null @@ -1,34 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -function onGetFormulaValues(player, level, magicLevel) - local min = (level / 5) + (magicLevel * 6.8) + 42 - local max = (level / 5) + (magicLevel * 12.9) + 90 - return min, max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Ultimate Healing") -spell:words("exura vita") -spell:group("healing") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_ULTIMATE_HEALING) -spell:id(3) -spell:cooldown(1 * 1000) -spell:groupCooldown(1 * 1000) -spell:level(30) -spell:mana(160) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/healing/wound_cleansing.lua b/data-otservbr-global/scripts/spells/healing/wound_cleansing.lua deleted file mode 100644 index ac3293a0889..00000000000 --- a/data-otservbr-global/scripts/spells/healing/wound_cleansing.lua +++ /dev/null @@ -1,33 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -function onGetFormulaValues(player, level, magicLevel) -- already compared to the official tibia | compared date: 08/03/21(m/d/y) - local min = (level * 0.2 + magicLevel * 4) + 25 - local max = (level * 0.2 + magicLevel * 7.95) + 51 - return min, max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Wound Cleansing") -spell:words("exura ico") -spell:group("healing") -spell:vocation("knight;true", "elite knight;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_WOUND_CLEANSING) -spell:id(123) -spell:cooldown(1 * 1000) -spell:groupCooldown(1 * 1000) -spell:level(8) -spell:mana(40) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/house/edit_door_list.lua b/data-otservbr-global/scripts/spells/house/edit_door_list.lua deleted file mode 100644 index ea3664bb2dd..00000000000 --- a/data-otservbr-global/scripts/spells/house/edit_door_list.lua +++ /dev/null @@ -1,25 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - local creaturePos = creature:getPosition() - creaturePos:getNextPosition(creature:getDirection()) - local tile = Tile(creaturePos) - local house = tile and tile:getHouse() - local doorId = house and house:getDoorIdByPosition(creaturePos) - if not doorId or not house:canEditAccessList(doorId, creature) then - creature:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) - creature:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end - - creature:setEditHouse(house, doorId) - creature:sendHouseWindow(house, doorId) - return true -end - -spell:name("House Door List") -spell:words("aleta grav") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_EDIT_DOOR) -spell:needCasterTargetOrDirection(true) -spell:isAggressive(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/house/edit_guest_list.lua b/data-otservbr-global/scripts/spells/house/edit_guest_list.lua deleted file mode 100644 index c0304f9d85a..00000000000 --- a/data-otservbr-global/scripts/spells/house/edit_guest_list.lua +++ /dev/null @@ -1,23 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(player, variant) - local house = player:getTile():getHouse() - if not house then - return false - end - - if house:canEditAccessList(GUEST_LIST, player) then - player:setEditHouse(house, GUEST_LIST) - player:sendHouseWindow(house, GUEST_LIST) - else - player:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) - player:getPosition():sendMagicEffect(CONST_ME_POFF) - end - return true -end - -spell:name("House Guest List") -spell:words("aleta sio") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_INVITE_GUESTS) -spell:isAggressive(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/house/edit_subowner_list.lua b/data-otservbr-global/scripts/spells/house/edit_subowner_list.lua deleted file mode 100644 index 94a1631b633..00000000000 --- a/data-otservbr-global/scripts/spells/house/edit_subowner_list.lua +++ /dev/null @@ -1,23 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(player, variant) - local house = player:getTile():getHouse() - if not house then - return false - end - - if house:canEditAccessList(SUBOWNER_LIST, player) then - player:setEditHouse(house, SUBOWNER_LIST) - player:sendHouseWindow(house, SUBOWNER_LIST) - else - player:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) - player:getPosition():sendMagicEffect(CONST_ME_POFF) - end - return true -end - -spell:name("House Subowner List") -spell:words("aleta som") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_INVITE_SUBOWNERS) -spell:isAggressive(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/ashfalor_summon.lua b/data-otservbr-global/scripts/spells/monster/ashfalor_summon.lua index 98f0ea4a707..559e7764859 100644 --- a/data-otservbr-global/scripts/spells/monster/ashfalor_summon.lua +++ b/data-otservbr-global/scripts/spells/monster/ashfalor_summon.lua @@ -48,7 +48,7 @@ local maxsummons = 25 local spell = Spell("instant") function spell.onCastSpell(creature, var) - creature:say("RISE MY SERVANTS! RISE!!", TALKTYPE_ORANGE_2) + creature:say("RISE MY SERVANTS! RISE!!", TALKTYPE_MONSTER_YELL) local summoncount = creature:getSummons() local creaturePos = creature:getPosition() diff --git a/data-otservbr-global/scripts/spells/monster/eruption_of_destruction_explosion.lua b/data-otservbr-global/scripts/spells/monster/eruption_of_destruction_explosion.lua index 0f8a01f2102..fbbe4922f14 100644 --- a/data-otservbr-global/scripts/spells/monster/eruption_of_destruction_explosion.lua +++ b/data-otservbr-global/scripts/spells/monster/eruption_of_destruction_explosion.lua @@ -44,16 +44,17 @@ function onTargetTile(creature, pos) end end if #creatureTable ~= nil and #creatureTable > 0 then + local min = 4000 + local max = 6000 for r = 1, #creatureTable do if creatureTable[r] ~= creature then - local min = 4000 - local max = 6000 - local player = Player(creatureTable[r]) - - if isPlayer(creatureTable[r]) == true and table.contains(vocation, player:getVocation():getBaseId()) then - doTargetCombatHealth(creature, creatureTable[r], COMBAT_FIREDAMAGE, -min, -max, CONST_ME_NONE) - elseif isMonster(creatureTable[r]) == true then - doTargetCombatHealth(creature, creatureTable[r], COMBAT_FIREDAMAGE, -min, -max, CONST_ME_NONE) + local creatureInTable = Creature(creatureTable[r]) + if creatureInTable then + if creatureInTable:isPlayer() == true and table.contains(vocation, creatureInTable:getVocation():getBaseId()) then + doTargetCombatHealth(creature, creatureTable[r], COMBAT_FIREDAMAGE, -min, -max, CONST_ME_NONE) + elseif creatureInTable:isMonster() == true then + doTargetCombatHealth(creature, creatureTable[r], COMBAT_FIREDAMAGE, -min, -max, CONST_ME_NONE) + end end end end diff --git a/data-otservbr-global/scripts/spells/monster/furyosa_deathball.lua b/data-otservbr-global/scripts/spells/monster/furyosa_deathball.lua index 8f4bd3cf171..5295044bd32 100644 --- a/data-otservbr-global/scripts/spells/monster/furyosa_deathball.lua +++ b/data-otservbr-global/scripts/spells/monster/furyosa_deathball.lua @@ -25,7 +25,7 @@ local spell = Spell("instant") function spell.onCastSpell(creature, var) if creature:getHealth() < creature:getMaxHealth() * 0.4 then - creature:say("Back in black!", TALKTYPE_ORANGE_1) + creature:say("Back in black!", TALKTYPE_MONSTER_SAY) return combat:execute(creature, var) end return false diff --git a/data-otservbr-global/scripts/spells/monster/gaz'haragoth_death.lua b/data-otservbr-global/scripts/spells/monster/gaz'haragoth_death.lua index e4e979c8205..ea42a9645fd 100644 --- a/data-otservbr-global/scripts/spells/monster/gaz'haragoth_death.lua +++ b/data-otservbr-global/scripts/spells/monster/gaz'haragoth_death.lua @@ -44,16 +44,17 @@ function onTargetTile(creature, pos) end end if #creatureTable ~= nil and #creatureTable > 0 then + local min = 30000 + local max = 30000 for r = 1, #creatureTable do if creatureTable[r] ~= creature then - local min = 30000 - local max = 30000 - local player = Player(creatureTable[r]) - - if isPlayer(creatureTable[r]) == true and table.contains(vocation, player:getVocation():getBaseId()) then - doTargetCombatHealth(creature, creatureTable[r], COMBAT_ENERGYDAMAGE, -min, -max, CONST_ME_NONE) - elseif isMonster(creatureTable[r]) == true then - doTargetCombatHealth(creature, creatureTable[r], COMBAT_ENERGYDAMAGE, -min, -max, CONST_ME_NONE) + local creatureInTable = Creature(creatureTable[r]) + if creatureInTable then + if creatureInTable:isPlayer() and table.contains(vocation, creatureInTable:getVocation():getBaseId()) then + doTargetCombatHealth(creature, creatureTable[r], COMBAT_ENERGYDAMAGE, -min, -max, CONST_ME_NONE) + elseif creatureInTable:isMonster() then + doTargetCombatHealth(creature, creatureTable[r], COMBAT_ENERGYDAMAGE, -min, -max, CONST_ME_NONE) + end end end end @@ -69,14 +70,14 @@ local function delayedCastSpell(cid, var) if not creature then return end - creature:say("Gaz'haragoth calls down: DEATH AND DOOM!", TALKTYPE_ORANGE_2) + creature:say("Gaz'haragoth calls down: DEATH AND DOOM!", TALKTYPE_MONSTER_YELL) return combat:execute(creature, positionToVariant(creature:getPosition())) end local spell = Spell("instant") function spell.onCastSpell(creature, var) - creature:say("Gaz'haragoth begins to channel DEATH AND DOOM into the area! RUN!", TALKTYPE_ORANGE_2) + creature:say("Gaz'haragoth begins to channel DEATH AND DOOM into the area! RUN!", TALKTYPE_MONSTER_YELL) addEvent(delayedCastSpell, 5000, creature:getId(), var) return true end diff --git a/data-otservbr-global/scripts/spells/monster/gaz'haragoth_iceball.lua b/data-otservbr-global/scripts/spells/monster/gaz'haragoth_iceball.lua index b4b4ff08996..2d497f4d629 100644 --- a/data-otservbr-global/scripts/spells/monster/gaz'haragoth_iceball.lua +++ b/data-otservbr-global/scripts/spells/monster/gaz'haragoth_iceball.lua @@ -24,7 +24,7 @@ combat:setArea(area) local spell = Spell("instant") function spell.onCastSpell(creature, var) - creature:say("Chill out!", TALKTYPE_ORANGE_1) + creature:say("Chill out!", TALKTYPE_MONSTER_SAY) return combat:execute(creature, var) end diff --git a/data-otservbr-global/scripts/spells/monster/gaz'haragoth_summon.lua b/data-otservbr-global/scripts/spells/monster/gaz'haragoth_summon.lua index dff51b81c4c..aafb438ac09 100644 --- a/data-otservbr-global/scripts/spells/monster/gaz'haragoth_summon.lua +++ b/data-otservbr-global/scripts/spells/monster/gaz'haragoth_summon.lua @@ -21,7 +21,7 @@ function spell.onCastSpell(creature, var) local monster for i = 1, (GazVariables.MinionsNow - check) do monster = Game.createMonster("Minion of Gaz'haragoth", creature:getPosition(), true, false) - creature:say("Minions! Follow my call!", TALKTYPE_ORANGE_1) + creature:say("Minions! Follow my call!", TALKTYPE_MONSTER_SAY) if monster then monster:setSummon(sum) end @@ -30,7 +30,7 @@ function spell.onCastSpell(creature, var) else if math.random(0, 100) < 25 then local monster = Game.createMonster("Minion of Gaz'haragoth", creature:getPosition(), true, false) - creature:say("Minions! Follow my call!", TALKTYPE_ORANGE_1) + creature:say("Minions! Follow my call!", TALKTYPE_MONSTER_SAY) if monster then monster:setSummon(sum) end diff --git a/data-otservbr-global/scripts/spells/monster/glooth-generator_summon.lua b/data-otservbr-global/scripts/spells/monster/glooth-generator_summon.lua index 0e29bbd334e..6138d0335e7 100644 --- a/data-otservbr-global/scripts/spells/monster/glooth-generator_summon.lua +++ b/data-otservbr-global/scripts/spells/monster/glooth-generator_summon.lua @@ -7,7 +7,7 @@ function spell.onCastSpell(creature, var) return end Game.createMonster("Energy Pulse", creature:getPosition(), true, true) - creature:say("The fully charged generator explodes in a blast!", TALKTYPE_ORANGE_2) + creature:say("The fully charged generator explodes in a blast!", TALKTYPE_MONSTER_YELL) creature:remove() return true end, 14000, creature:getId()) diff --git a/data-otservbr-global/scripts/spells/monster/jewelry_chest_summon.lua b/data-otservbr-global/scripts/spells/monster/jewelry_chest_summon.lua index 5a889af0c27..7f8ae193374 100644 --- a/data-otservbr-global/scripts/spells/monster/jewelry_chest_summon.lua +++ b/data-otservbr-global/scripts/spells/monster/jewelry_chest_summon.lua @@ -19,7 +19,7 @@ function spell.onCastSpell(creature, var) if not mid then return end - mid:say("FREEZE! LET ME SEE YOUR HANDS UP!", TALKTYPE_ORANGE_2) + mid:say("FREEZE! LET ME SEE YOUR HANDS UP!", TALKTYPE_MONSTER_YELL) end end return combat:execute(creature, var) diff --git a/data-otservbr-global/scripts/spells/monster/lisa_heal.lua b/data-otservbr-global/scripts/spells/monster/lisa_heal.lua index 6e1c0d7572a..c0eda49bb97 100644 --- a/data-otservbr-global/scripts/spells/monster/lisa_heal.lua +++ b/data-otservbr-global/scripts/spells/monster/lisa_heal.lua @@ -8,11 +8,11 @@ local spell = Spell("instant") function spell.onCastSpell(creature, var) if creature:getHealth() < creature:getMaxHealth() * 0.07 and not creature:getCondition(CONDITION_REGENERATION, CONDITIONID_DEFAULT, 88888) then - creature:say("Lisa takes a final breath before she's healing up!", TALKTYPE_ORANGE_1) + creature:say("Lisa takes a final breath before she's healing up!", TALKTYPE_MONSTER_SAY) creature:addCondition(condition) addEvent(function(cid) creature:addHealth(math.random(18000, 23000)) - creature:say("Lisa healed up!", TALKTYPE_ORANGE_1) + creature:say("Lisa healed up!", TALKTYPE_MONSTER_SAY) creature:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) return true end, 6 * 1000, creature:getId()) diff --git a/data-otservbr-global/scripts/spells/monster/mawhawk_summon.lua b/data-otservbr-global/scripts/spells/monster/mawhawk_summon.lua index bed90d8cf7c..8e5fd6e9fb7 100644 --- a/data-otservbr-global/scripts/spells/monster/mawhawk_summon.lua +++ b/data-otservbr-global/scripts/spells/monster/mawhawk_summon.lua @@ -10,7 +10,7 @@ local maxsummons = 4 local spell = Spell("instant") function spell.onCastSpell(creature, var) - creature:say("Watch my maws!", TALKTYPE_ORANGE_1) + creature:say("Watch my maws!", TALKTYPE_MONSTER_SAY) local summoncount = creature:getSummons() if #summoncount < 4 then for i = 1, maxsummons - #summoncount do diff --git a/data-otservbr-global/scripts/spells/monster/mawhawk_ue.lua b/data-otservbr-global/scripts/spells/monster/mawhawk_ue.lua index f819e25ed40..f7d2f6a1db3 100644 --- a/data-otservbr-global/scripts/spells/monster/mawhawk_ue.lua +++ b/data-otservbr-global/scripts/spells/monster/mawhawk_ue.lua @@ -83,7 +83,7 @@ function spell.onCastSpell(creature, var) if creature:getHealth() < creature:getMaxHealth() * 0.1 and not creature:getCondition(CONDITION_REGENERATION, CONDITIONID_DEFAULT, 88888) then creature:addCondition(condition) addEvent(delayedCastSpell, 5000, creature:getId(), var) - creature:say("Better flee now.", TALKTYPE_ORANGE_1) + creature:say("Better flee now.", TALKTYPE_MONSTER_SAY) else return end diff --git a/data-otservbr-global/scripts/spells/monster/omrafir_beam.lua b/data-otservbr-global/scripts/spells/monster/omrafir_beam.lua index c160e6e28f9..c6401c746e6 100644 --- a/data-otservbr-global/scripts/spells/monster/omrafir_beam.lua +++ b/data-otservbr-global/scripts/spells/monster/omrafir_beam.lua @@ -104,7 +104,7 @@ local spell = Spell("instant") function spell.onCastSpell(creature, var) if not creature:getCondition(CONDITION_REGENERATION, CONDITIONID_DEFAULT, 88888) then - creature:say("OMRAFIR INHALES DEEPLY!", TALKTYPE_ORANGE_2) + creature:say("OMRAFIR INHALES DEEPLY!", TALKTYPE_MONSTER_YELL) creature:addCondition(condition) addEvent(function(cid, var) local creature = Creature(cid) @@ -120,7 +120,7 @@ function spell.onCastSpell(creature, var) elseif creature:getDirection() == 3 then combat4:execute(creature, positionToVariant(creature:getPosition())) end - creature:say("OMRAFIR BREATHES INFERNAL FIRE", TALKTYPE_ORANGE_2) + creature:say("OMRAFIR BREATHES INFERNAL FIRE", TALKTYPE_MONSTER_YELL) end, 4000, creature:getId(), var) else return diff --git a/data-otservbr-global/scripts/spells/monster/omrafir_healing_2.lua b/data-otservbr-global/scripts/spells/monster/omrafir_healing_2.lua index 83ae82f8d50..369e70b0eab 100644 --- a/data-otservbr-global/scripts/spells/monster/omrafir_healing_2.lua +++ b/data-otservbr-global/scripts/spells/monster/omrafir_healing_2.lua @@ -11,7 +11,7 @@ function spell.onCastSpell(creature, var) if t:getItemById(1487) or t:getItemById(1492) or t:getItemById(1500) then creature:addHealth(health) cpos:sendMagicEffect(CONST_ME_MAGIC_BLUE) - creature:say("Omrafir gains new strength from the fire", TALKTYPE_ORANGE_1) + creature:say("Omrafir gains new strength from the fire", TALKTYPE_MONSTER_SAY) else end end diff --git a/data-otservbr-global/scripts/spells/monster/outburst_explode.lua b/data-otservbr-global/scripts/spells/monster/outburst_explode.lua index aeff02e3cae..c16b220e283 100644 --- a/data-otservbr-global/scripts/spells/monster/outburst_explode.lua +++ b/data-otservbr-global/scripts/spells/monster/outburst_explode.lua @@ -1,28 +1,10 @@ local function outExplode() - local upConer = { x = 32223, y = 31273, z = 14 } -- upLeftCorner - local downConer = { x = 32246, y = 31297, z = 14 } -- downRightCorner - - for i = upConer.x, downConer.x do - for j = upConer.y, downConer.y do - for k = upConer.z, downConer.z do - local room = { x = i, y = j, z = k } - local tile = Tile(room) - if tile then - local creatures = tile:getCreatures() - if creatures and #creatures > 0 then - for _, creatureUid in pairs(creatures) do - local creature = Creature(creatureUid) - if creature then - if creature:isPlayer() then - creature:teleportTo({ x = 32234, y = 31280, z = 14 }) - elseif creature:isMonster() and creature:getName() == "Charging Outburst" then - creature:teleportTo({ x = 32234, y = 31279, z = 14 }) - end - end - end - end - end - end + local spectators = Game.getSpectators(Position(32234, 31285, 14), false, true, 10, 10, 10, 10) + for _, spectator in ipairs(spectators) do + if spectator:isPlayer() then + spectator:teleportTo(Position(32234, 31280, 14)) + elseif spectator:isMonster() and spectator:getName() == "Charging Outburst" then + spectator:teleportTo(Position(32234, 31279, 14)) end end end @@ -54,7 +36,7 @@ local function delayedCastSpell(creature, var) if not creature then return end - return combat:execute(creature, positionToVariant(creature:getPosition())) + return combat:execute(creature, Variant(creature:getPosition())) end function removeOutburst(cid) diff --git a/data-otservbr-global/scripts/spells/monster/prince_drazzak_druid.lua b/data-otservbr-global/scripts/spells/monster/prince_drazzak_druid.lua index a4a4b453efe..e027b05570f 100644 --- a/data-otservbr-global/scripts/spells/monster/prince_drazzak_druid.lua +++ b/data-otservbr-global/scripts/spells/monster/prince_drazzak_druid.lua @@ -63,7 +63,7 @@ local function delayedCastSpell(cid, var) if not creature then return end - creature:say("DIE!", TALKTYPE_ORANGE_1) + creature:say("DIE!", TALKTYPE_MONSTER_SAY) return combat:execute(creature, positionToVariant(creature:getPosition())) end @@ -72,7 +72,7 @@ local spell = Spell("instant") function spell.onCastSpell(creature, var) local value = Game.getStorageValue(storage) if os.time() - value >= 4 then - creature:say("All DRUIDS must DIE!", TALKTYPE_ORANGE_1) + creature:say("All DRUIDS must DIE!", TALKTYPE_MONSTER_SAY) addEvent(delayedCastSpell, 4000, creature:getId(), var) Game.setStorageValue(storage, os.time()) end diff --git a/data-otservbr-global/scripts/spells/monster/prince_drazzak_knight.lua b/data-otservbr-global/scripts/spells/monster/prince_drazzak_knight.lua index c405536845f..1269e18975a 100644 --- a/data-otservbr-global/scripts/spells/monster/prince_drazzak_knight.lua +++ b/data-otservbr-global/scripts/spells/monster/prince_drazzak_knight.lua @@ -47,7 +47,7 @@ local function delayedCastSpell(cid, var) if not creature then return end - creature:say("DIE!", TALKTYPE_ORANGE_1) + creature:say("DIE!", TALKTYPE_MONSTER_SAY) return combat:execute(creature, positionToVariant(creature:getPosition())) end @@ -56,7 +56,7 @@ local spell = Spell("instant") function spell.onCastSpell(creature, var) local value = Game.getStorageValue(storage) if os.time() - value >= 4 then - creature:say("All KNIGHTS must DIE!", TALKTYPE_ORANGE_1) + creature:say("All KNIGHTS must DIE!", TALKTYPE_MONSTER_SAY) addEvent(delayedCastSpell, 4000, creature:getId(), var) Game.setStorageValue(storage, os.time()) end diff --git a/data-otservbr-global/scripts/spells/monster/prince_drazzak_paladin.lua b/data-otservbr-global/scripts/spells/monster/prince_drazzak_paladin.lua index 145b3fa7072..196feb9cb3d 100644 --- a/data-otservbr-global/scripts/spells/monster/prince_drazzak_paladin.lua +++ b/data-otservbr-global/scripts/spells/monster/prince_drazzak_paladin.lua @@ -63,7 +63,7 @@ local function delayedCastSpell(cid, var) if not creature then return end - creature:say("DIE!", TALKTYPE_ORANGE_1) + creature:say("DIE!", TALKTYPE_MONSTER_SAY) return combat:execute(creature, positionToVariant(creature:getPosition())) end @@ -72,7 +72,7 @@ local spell = Spell("instant") function spell.onCastSpell(creature, var) local value = Game.getStorageValue(storage) if os.time() - value >= 4 then - creature:say("All PALADINS must DIE!", TALKTYPE_ORANGE_1) + creature:say("All PALADINS must DIE!", TALKTYPE_MONSTER_SAY) addEvent(delayedCastSpell, 4000, creature:getId(), var) Game.setStorageValue(storage, os.time()) end diff --git a/data-otservbr-global/scripts/spells/monster/prince_drazzak_sorcerer.lua b/data-otservbr-global/scripts/spells/monster/prince_drazzak_sorcerer.lua index 1f0fd9e9d35..8b9ac84dbed 100644 --- a/data-otservbr-global/scripts/spells/monster/prince_drazzak_sorcerer.lua +++ b/data-otservbr-global/scripts/spells/monster/prince_drazzak_sorcerer.lua @@ -63,7 +63,7 @@ local function delayedCastSpell(cid, var) if not creature then return end - creature:say("DIE!", TALKTYPE_ORANGE_1) + creature:say("DIE!", TALKTYPE_MONSTER_SAY) return combat:execute(creature, positionToVariant(creature:getPosition())) end @@ -72,7 +72,7 @@ local spell = Spell("instant") function spell.onCastSpell(creature, var) local value = Game.getStorageValue(storage) if os.time() - value >= 4 then - creature:say("All SORCERERS must DIE!", TALKTYPE_ORANGE_1) + creature:say("All SORCERERS must DIE!", TALKTYPE_MONSTER_SAY) addEvent(delayedCastSpell, 4000, creature:getId(), var) Game.setStorageValue(storage, os.time()) end diff --git a/data-otservbr-global/scripts/spells/monster/prince_drazzak_summon.lua b/data-otservbr-global/scripts/spells/monster/prince_drazzak_summon.lua index f7ca84b6dda..8d810cd2f80 100644 --- a/data-otservbr-global/scripts/spells/monster/prince_drazzak_summon.lua +++ b/data-otservbr-global/scripts/spells/monster/prince_drazzak_summon.lua @@ -12,7 +12,7 @@ function spell.onCastSpell(creature, var) end end if check < 1 then - creature:say("CRUSH THEM ALL!", TALKTYPE_ORANGE_2) + creature:say("CRUSH THEM ALL!", TALKTYPE_MONSTER_YELL) Game.createMonster("Demon", Position(33528, 32330, 12)) Game.createMonster("Demon", Position(33523, 32338, 12)) Game.createMonster("Demon", Position(33532, 32337, 12)) diff --git a/data-otservbr-global/scripts/spells/monster/prince_drazzak_tp.lua b/data-otservbr-global/scripts/spells/monster/prince_drazzak_tp.lua index e2499db0664..32019e8b731 100644 --- a/data-otservbr-global/scripts/spells/monster/prince_drazzak_tp.lua +++ b/data-otservbr-global/scripts/spells/monster/prince_drazzak_tp.lua @@ -2,7 +2,7 @@ local spell = Spell("instant") function spell.onCastSpell(creature, var) local center, center2 = { x = 33529, y = 32334, z = 12, stackpos = 255 }, { x = 33528, y = 32334, z = 12, stackpos = 255 } - creature:say("GET OVER HERE!", TALKTYPE_ORANGE_2, false, 0, center2) + creature:say("GET OVER HERE!", TALKTYPE_MONSTER_YELL, false, 0, center2) for x = 33519, 33538 do for y = 32327, 32342 do local tile = Tile(Position({ x = x, y = y, z = 12 })) diff --git a/data-otservbr-global/scripts/spells/monster/shargon_heal.lua b/data-otservbr-global/scripts/spells/monster/shargon_heal.lua index cf26a8e7a75..ed68a9674d6 100644 --- a/data-otservbr-global/scripts/spells/monster/shargon_heal.lua +++ b/data-otservbr-global/scripts/spells/monster/shargon_heal.lua @@ -11,7 +11,7 @@ function spell.onCastSpell(creature, var) if spectator:isMonster() and spectator:getName() == "Necromantic Energy" then spectator:getPosition():sendMagicEffect(CONST_ME_POFF) spectator:remove() - creature:say(msg, TALKTYPE_ORANGE_1) + creature:say(msg, TALKTYPE_MONSTER_SAY) creature:addHealth(65000) creature:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) return true diff --git a/data-otservbr-global/scripts/spells/monster/terofar_curse.lua b/data-otservbr-global/scripts/spells/monster/terofar_curse.lua index 7595c895ec0..d215b3ea0dc 100644 --- a/data-otservbr-global/scripts/spells/monster/terofar_curse.lua +++ b/data-otservbr-global/scripts/spells/monster/terofar_curse.lua @@ -29,7 +29,7 @@ local spell = Spell("instant") function spell.onCastSpell(creature, var) if not creature:getCondition(CONDITION_REGENERATION, CONDITIONID_DEFAULT, 88888) then creature:addCondition(condition2) - creature:say("Terofar cast a greater death curse on you!", TALKTYPE_ORANGE_1) + creature:say("Terofar cast a greater death curse on you!", TALKTYPE_MONSTER_SAY) else return false end diff --git a/data-otservbr-global/scripts/spells/monster/the_pale_count_bomb.lua b/data-otservbr-global/scripts/spells/monster/the_pale_count_bomb.lua index 0e9ef53cc4c..a8c34832d79 100644 --- a/data-otservbr-global/scripts/spells/monster/the_pale_count_bomb.lua +++ b/data-otservbr-global/scripts/spells/monster/the_pale_count_bomb.lua @@ -25,7 +25,7 @@ combat:setArea(area) local spell = Spell("instant") function spell.onCastSpell(creature, var) - creature:say("Feel the hungry kiss of death!", TALKTYPE_ORANGE_1) + creature:say("Feel the hungry kiss of death!", TALKTYPE_MONSTER_SAY) return combat:execute(creature, var) end diff --git a/data-otservbr-global/scripts/spells/monster/the_pale_count_manadrain.lua b/data-otservbr-global/scripts/spells/monster/the_pale_count_manadrain.lua index 895d3d72954..9d98f712b4a 100644 --- a/data-otservbr-global/scripts/spells/monster/the_pale_count_manadrain.lua +++ b/data-otservbr-global/scripts/spells/monster/the_pale_count_manadrain.lua @@ -24,7 +24,7 @@ combat:setArea(area) local spell = Spell("instant") function spell.onCastSpell(creature, var) - creature:say("Feel the hungry kiss of death!", TALKTYPE_ORANGE_1) + creature:say("Feel the hungry kiss of death!", TALKTYPE_MONSTER_SAY) return combat:execute(creature, var) end diff --git a/data-otservbr-global/scripts/spells/monster/the_pale_count_summon.lua b/data-otservbr-global/scripts/spells/monster/the_pale_count_summon.lua index 86a5b8561bb..a5eaf52e69a 100644 --- a/data-otservbr-global/scripts/spells/monster/the_pale_count_summon.lua +++ b/data-otservbr-global/scripts/spells/monster/the_pale_count_summon.lua @@ -10,7 +10,7 @@ local maxsummons = 4 local spell = Spell("instant") function spell.onCastSpell(creature, var) - creature:say("Out of the dark I call you, fiend in the night!", TALKTYPE_ORANGE_1) + creature:say("Out of the dark I call you, fiend in the night!", TALKTYPE_MONSTER_SAY) local summoncount = creature:getSummons() if #summoncount < 4 then for i = 1, maxsummons - #summoncount do diff --git a/data-otservbr-global/scripts/spells/monster/the_welter_heal.lua b/data-otservbr-global/scripts/spells/monster/the_welter_heal.lua index 09042a13185..68fe6132235 100644 --- a/data-otservbr-global/scripts/spells/monster/the_welter_heal.lua +++ b/data-otservbr-global/scripts/spells/monster/the_welter_heal.lua @@ -10,14 +10,14 @@ function spell.onCastSpell(creature, var) if spectator:isMonster() and spectator:getName() == "Egg" then spectator:getPosition():sendMagicEffect(CONST_ME_HITBYPOISON) spectator:remove() - creature:say("", TALKTYPE_ORANGE_1) + creature:say("", TALKTYPE_MONSTER_SAY) creature:addHealth(25000) creature:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) return true elseif spectator:isMonster() and spectator:getName() == "Spawn of the Welter" then spectator:getPosition():sendMagicEffect(CONST_ME_DRAWBLOOD) spectator:remove() - creature:say("", TALKTYPE_ORANGE_1) + creature:say("", TALKTYPE_MONSTER_SAY) creature:addHealth(25000) creature:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) return true diff --git a/data-otservbr-global/scripts/spells/party/heal_party.lua b/data-otservbr-global/scripts/spells/party/heal_party.lua deleted file mode 100644 index 31c042b0245..00000000000 --- a/data-otservbr-global/scripts/spells/party/heal_party.lua +++ /dev/null @@ -1,86 +0,0 @@ -local combat = Combat() -combat:setParameter(createCombatArea(AREA_CIRCLE5X5)) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, 0) - -local condition = Condition(CONDITION_REGENERATION) -condition:setParameter(CONDITION_PARAM_SUBID, 1) -condition:setParameter(CONDITION_PARAM_BUFF_SPELL, 1) -condition:setParameter(CONDITION_PARAM_TICKS, 2 * 60 * 1000) -condition:setParameter(CONDITION_PARAM_HEALTHGAIN, 20) -condition:setParameter(CONDITION_PARAM_HEALTHTICKS, 2000) - -local baseMana = 120 - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - local position = creature:getPosition() - - local party = creature:getParty() - if not party then - creature:sendCancelMessage("No party members in range.") - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - local membersList = party:getMembers() - membersList[#membersList + 1] = party:getLeader() - if membersList == nil or type(membersList) ~= "table" or #membersList <= 1 then - creature:sendCancelMessage("No party members in range.") - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - local affectedList = {} - for _, targetPlayer in ipairs(membersList) do - if targetPlayer:getPosition():getDistance(position) <= 36 then - affectedList[#affectedList + 1] = targetPlayer - end - end - - local tmp = #affectedList - if tmp <= 1 then - creature:sendCancelMessage("No party members in range.") - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - local mana = math.ceil((0.9 ^ (tmp - 1) * baseMana) * tmp) - if creature:getMana() < mana then - creature:sendCancelMessage(RETURNVALUE_NOTENOUGHMANA) - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - if not combat:execute(creature, var) then - creature:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - creature:addMana(-(mana - baseMana), false) - creature:addManaSpent((mana - baseMana)) - - for _, targetPlayer in ipairs(affectedList) do - targetPlayer:addCondition(condition) - end - - return true -end - -spell:name("Heal Party") -spell:words("utura mas sio") -spell:group("support") -spell:vocation("druid;true", "elder druid;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_HEAL_PARTY) -spell:id(128) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(32) -spell:mana(120) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/party/protect_party.lua b/data-otservbr-global/scripts/spells/party/protect_party.lua deleted file mode 100644 index aa30ed766f1..00000000000 --- a/data-otservbr-global/scripts/spells/party/protect_party.lua +++ /dev/null @@ -1,85 +0,0 @@ -local combat = Combat() -combat:setArea(createCombatArea(AREA_CIRCLE5X5)) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, 0) - -local condition = Condition(CONDITION_ATTRIBUTES) -condition:setParameter(CONDITION_PARAM_SUBID, 2) -condition:setParameter(CONDITION_PARAM_BUFF_SPELL, 1) -condition:setParameter(CONDITION_PARAM_TICKS, 2 * 60 * 1000) -condition:setParameter(CONDITION_PARAM_SKILL_SHIELD, 3) - -local baseMana = 90 - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - local position = creature:getPosition() - - local party = creature:getParty() - if not party then - creature:sendCancelMessage("No party members in range.") - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - local membersList = party:getMembers() - membersList[#membersList + 1] = party:getLeader() - if membersList == nil or type(membersList) ~= "table" or #membersList <= 1 then - creature:sendCancelMessage("No party members in range.") - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - local affectedList = {} - for _, targetPlayer in ipairs(membersList) do - if targetPlayer:getPosition():getDistance(position) <= 36 then - affectedList[#affectedList + 1] = targetPlayer - end - end - - local tmp = #affectedList - if tmp <= 1 then - creature:sendCancelMessage("No party members in range.") - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - local mana = math.ceil((0.9 ^ (tmp - 1) * baseMana) * tmp) - if creature:getMana() < mana then - creature:sendCancelMessage(RETURNVALUE_NOTENOUGHMANA) - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - if not combat:execute(creature, var) then - creature:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - creature:addMana(-(mana - baseMana), false) - creature:addManaSpent((mana - baseMana)) - - for _, targetPlayer in ipairs(affectedList) do - targetPlayer:addCondition(condition) - end - - return true -end - -spell:name("Protect Party") -spell:words("utamo mas sio") -spell:group("support") -spell:vocation("paladin;true", "royal paladin;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_PROTECT_PARTY) -spell:id(127) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(32) -spell:mana(90) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/runes/animate_dead_rune.lua b/data-otservbr-global/scripts/spells/runes/animate_dead_rune.lua deleted file mode 100644 index 28f5893c21b..00000000000 --- a/data-otservbr-global/scripts/spells/runes/animate_dead_rune.lua +++ /dev/null @@ -1,46 +0,0 @@ -local rune = Spell("rune") - -function rune.onCastSpell(player, variant) - local position = variant:getPosition() - local tile = Tile(position) - if tile then - local corpse = tile:getTopDownItem() - if corpse then - local itemType = corpse:getType() - if itemType:isCorpse() and itemType:isMovable() then - if #player:getSummons() < 2 and player:getSkull() ~= SKULL_BLACK then - local summon = Game.createMonster("Skeleton", position, true, true) - if summon then - corpse:remove() - player:setSummon(summon) - position:sendMagicEffect(CONST_ME_MAGIC_BLUE) - return true - end - else - player:sendCancelMessage("You cannot control more creatures.") - player:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end - end - end - end - - player:getPosition():sendMagicEffect(CONST_ME_POFF) - player:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) - return false -end - -rune:id(83) -rune:group("support") -rune:name("animate dead rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_ANIMATE_DEAD_RUNE) -rune:runeId(3203) -rune:allowFarUse(true) -rune:charges(1) -rune:level(27) -rune:magicLevel(4) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/antidote_rune.lua b/data-otservbr-global/scripts/spells/runes/antidote_rune.lua deleted file mode 100644 index 3a99db52b52..00000000000 --- a/data-otservbr-global/scripts/spells/runes/antidote_rune.lua +++ /dev/null @@ -1,26 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, 0) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_POISON) - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:group("healing") -rune:name("antidote rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_CURE_POISON_RUNE) -rune:runeId(3153) -rune:allowFarUse(true) -rune:charges(1) -rune:level(15) -rune:magicLevel(0) -rune:cooldown(1 * 1000) -rune:groupCooldown(1 * 1000) -rune:isAggressive(false) -rune:needTarget(true) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/avalanche.lua b/data-otservbr-global/scripts/spells/runes/avalanche.lua deleted file mode 100644 index 6aefb1e1042..00000000000 --- a/data-otservbr-global/scripts/spells/runes/avalanche.lua +++ /dev/null @@ -1,33 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ICE) -combat:setArea(createCombatArea(AREA_CIRCLE3X3)) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 1.2) + 7 - local max = (level / 5) + (maglevel * 2.8) + 17 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(115) -rune:group("attack") -rune:name("avalanche rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_AVALANCHE_RUNE) -rune:runeId(3161) -rune:allowFarUse(true) -rune:charges(4) -rune:level(30) -rune:magicLevel(4) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/chameleon.lua b/data-otservbr-global/scripts/spells/runes/chameleon.lua deleted file mode 100644 index 92168645e20..00000000000 --- a/data-otservbr-global/scripts/spells/runes/chameleon.lua +++ /dev/null @@ -1,46 +0,0 @@ -local rune = Spell("rune") - -local condition = Condition(CONDITION_OUTFIT) -condition:setTicks(200000) - -function rune.onCastSpell(creature, variant, isHotkey) - local position, item = variant:getPosition() - if position.x == CONTAINER_POSITION then - local container = creature:getContainerById(position.y - 64) - if container then - item = container:getItem(position.z) - else - item = creature:getSlotItem(position.y) - end - else - item = Tile(position):getTopDownItem() - end - - if not item or item.itemid == 0 or not isMovable(item.uid) then - creature:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) - creature:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end - - condition:setOutfit({ lookTypeEx = item.itemid }) - creature:addCondition(condition) - creature:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) - return true -end - -rune:id(14) -rune:group("support") -rune:name("chameleon rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_CHAMELEON_RUNE) -rune:runeId(3178) -rune:allowFarUse(true) -rune:charges(1) -rune:level(27) -rune:magicLevel(4) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:isAggressive(false) -rune:isSelfTarget(true) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/desintegrate_rune.lua b/data-otservbr-global/scripts/spells/runes/desintegrate_rune.lua deleted file mode 100644 index 195c4fdec5b..00000000000 --- a/data-otservbr-global/scripts/spells/runes/desintegrate_rune.lua +++ /dev/null @@ -1,42 +0,0 @@ -local rune = Spell("rune") - -local corpseIds = { 4240, 4241, 4242, 4243, 4246, 4247, 4248 } -local removalLimit = 500 - -function rune.onCastSpell(creature, variant, isHotkey) - local position = variant:getPosition() - local tile = Tile(position) - if tile then - local items = tile:getItems() - if items then - for i, item in ipairs(items) do - if item:getType():isMovable() and item:getUniqueId() > 65535 and item:getActionId() == 0 and not table.contains(corpseIds, item:getId()) then - item:remove() - end - - if i == removalLimit then - break - end - end - end - end - - creature:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) - position:sendMagicEffect(CONST_ME_POFF) - return true -end - -rune:id(78) -rune:group("support") -rune:name("desintegrate rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_DISINTEGRATE_RUNE) -rune:runeId(3197) -rune:allowFarUse(false) -rune:charges(3) -rune:level(21) -rune:magicLevel(4) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:range(1) -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/destroy_field_rune.lua b/data-otservbr-global/scripts/spells/runes/destroy_field_rune.lua deleted file mode 100644 index 024dbc1bcd7..00000000000 --- a/data-otservbr-global/scripts/spells/runes/destroy_field_rune.lua +++ /dev/null @@ -1,35 +0,0 @@ --- This array contains all destroyable field items -local fields = { 105, 2118, 2119, 2120, 2121, 2122, 2123, 2124, 2125, 2126, 2132, 2133, 2134, 2135, 21465 } - -local rune = Spell("rune") - -function rune.onCastSpell(creature, variant, isHotkey) - local position = Variant.getPosition(variant) - local tile = Tile(position) - local field = tile and tile:getItemByType(ITEM_TYPE_MAGICFIELD) - if field and table.contains(fields, field:getId()) then - field:remove() - position:sendMagicEffect(CONST_ME_POFF) - return true - end - - creature:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) - creature:getPosition():sendMagicEffect(CONST_ME_POFF) - return false -end - -rune:id(30) -rune:group("support") -rune:name("destroy field rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_DESTROY_FIELD_RUNE) -rune:runeId(3148) -rune:allowFarUse(true) -rune:charges(3) -rune:level(17) -rune:magicLevel(3) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:isAggressive(false) -rune:range(5) -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/energy_bomb.lua b/data-otservbr-global/scripts/spells/runes/energy_bomb.lua deleted file mode 100644 index 4396c02c0d9..00000000000 --- a/data-otservbr-global/scripts/spells/runes/energy_bomb.lua +++ /dev/null @@ -1,28 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ENERGYHIT) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGYBALL) -combat:setParameter(COMBAT_PARAM_CREATEITEM, ITEM_ENERGYFIELD_PVP) -combat:setArea(createCombatArea(AREA_SQUARE1X1)) - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(55) -rune:group("attack") -rune:name("energybomb rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_ENERGY_BOMB_RUNE) -rune:runeId(3149) -rune:allowFarUse(true) -rune:setPzLocked(true) -rune:charges(2) -rune:level(37) -rune:magicLevel(10) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/energy_field.lua b/data-otservbr-global/scripts/spells/runes/energy_field.lua deleted file mode 100644 index ac36212ac9a..00000000000 --- a/data-otservbr-global/scripts/spells/runes/energy_field.lua +++ /dev/null @@ -1,27 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ENERGYHIT) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGYBALL) -combat:setParameter(COMBAT_PARAM_CREATEITEM, ITEM_ENERGYFIELD_PVP) - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(27) -rune:group("attack") -rune:name("energy field rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_ENERGY_FIELD_RUNE) -rune:runeId(3164) -rune:allowFarUse(true) -rune:setPzLocked(true) -rune:charges(3) -rune:level(18) -rune:magicLevel(3) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/energy_wall.lua b/data-otservbr-global/scripts/spells/runes/energy_wall.lua deleted file mode 100644 index aae0bf029e1..00000000000 --- a/data-otservbr-global/scripts/spells/runes/energy_wall.lua +++ /dev/null @@ -1,28 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ENERGYHIT) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGYBALL) -combat:setParameter(COMBAT_PARAM_CREATEITEM, ITEM_ENERGYFIELD_PVP) -combat:setArea(createCombatArea(AREA_WALLFIELD_ENERGY, AREADIAGONAL_WALLFIELD_ENERGY)) - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(33) -rune:group("attack") -rune:name("energy wall rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_ENERGY_WALL_RUNE) -rune:runeId(3166) -rune:allowFarUse(true) -rune:setPzLocked(true) -rune:charges(4) -rune:level(41) -rune:magicLevel(9) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/explosion.lua b/data-otservbr-global/scripts/spells/runes/explosion.lua deleted file mode 100644 index fb9e27ce6ba..00000000000 --- a/data-otservbr-global/scripts/spells/runes/explosion.lua +++ /dev/null @@ -1,35 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_EXPLOSIONAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_EXPLOSION) -combat:setParameter(COMBAT_PARAM_BLOCKARMOR, 1) -combat:setArea(createCombatArea(AREA_CIRCLE1X1)) - -function onGetFormulaValues(player, level, maglevel) - local min = 0 - local max = (level / 5) + (maglevel * 4.8) - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(18) -rune:group("attack") -rune:name("explosion rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_EXPLOSION_RUNE) -rune:runeId(3200) -rune:allowFarUse(true) -rune:charges(6) -rune:level(31) -rune:magicLevel(6) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/fire_bomb.lua b/data-otservbr-global/scripts/spells/runes/fire_bomb.lua deleted file mode 100644 index 257e07c75c6..00000000000 --- a/data-otservbr-global/scripts/spells/runes/fire_bomb.lua +++ /dev/null @@ -1,28 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITBYFIRE) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) -combat:setParameter(COMBAT_PARAM_CREATEITEM, ITEM_FIREFIELD_PVP_FULL) -combat:setArea(createCombatArea(AREA_SQUARE1X1)) - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(17) -rune:group("attack") -rune:name("firebomb rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_FIRE_BOMB_RUNE) -rune:runeId(3192) -rune:allowFarUse(true) -rune:setPzLocked(true) -rune:charges(2) -rune:level(27) -rune:magicLevel(5) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/fire_field.lua b/data-otservbr-global/scripts/spells/runes/fire_field.lua deleted file mode 100644 index eb42a2d90e3..00000000000 --- a/data-otservbr-global/scripts/spells/runes/fire_field.lua +++ /dev/null @@ -1,27 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITBYFIRE) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) -combat:setParameter(COMBAT_PARAM_CREATEITEM, ITEM_FIREFIELD_PVP_FULL) - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(25) -rune:group("attack") -rune:name("fire field rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_FIRE_FIELD_RUNE) -rune:runeId(3188) -rune:allowFarUse(true) -rune:setPzLocked(true) -rune:charges(3) -rune:level(15) -rune:magicLevel(1) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/fire_wall.lua b/data-otservbr-global/scripts/spells/runes/fire_wall.lua deleted file mode 100644 index a9b7696c3c3..00000000000 --- a/data-otservbr-global/scripts/spells/runes/fire_wall.lua +++ /dev/null @@ -1,28 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITBYFIRE) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) -combat:setParameter(COMBAT_PARAM_CREATEITEM, ITEM_FIREFIELD_PVP_FULL) -combat:setArea(createCombatArea(AREA_WALLFIELD, AREADIAGONAL_WALLFIELD)) - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(28) -rune:group("attack") -rune:name("fire wall rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_FIRE_WALL_RUNE) -rune:runeId(3190) -rune:allowFarUse(true) -rune:setPzLocked(true) -rune:charges(4) -rune:level(33) -rune:magicLevel(6) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/fireball.lua b/data-otservbr-global/scripts/spells/runes/fireball.lua deleted file mode 100644 index 6e7ab7412dd..00000000000 --- a/data-otservbr-global/scripts/spells/runes/fireball.lua +++ /dev/null @@ -1,34 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_FIREATTACK) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 1.81) + 10 - local max = (level / 5) + (maglevel * 3) + 18 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(15) -rune:group("attack") -rune:name("fireball rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_FIREBALL_RUNE) -rune:runeId(3189) -rune:allowFarUse(true) -rune:charges(5) -rune:level(27) -rune:magicLevel(4) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:needTarget(true) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/great_fireball.lua b/data-otservbr-global/scripts/spells/runes/great_fireball.lua deleted file mode 100644 index ca0285986d8..00000000000 --- a/data-otservbr-global/scripts/spells/runes/great_fireball.lua +++ /dev/null @@ -1,34 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) -combat:setArea(createCombatArea(AREA_CIRCLE3X3)) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 1.2) + 7 - local max = (level / 5) + (maglevel * 2.8) + 17 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(16) -rune:group("attack") -rune:name("great fireball rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_GREAT_FIREBALL_RUNE) -rune:runeId(3191) -rune:allowFarUse(true) -rune:charges(4) -rune:level(30) -rune:magicLevel(4) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/heavy_magic_missile.lua b/data-otservbr-global/scripts/spells/runes/heavy_magic_missile.lua deleted file mode 100644 index 6e7c3ad734b..00000000000 --- a/data-otservbr-global/scripts/spells/runes/heavy_magic_missile.lua +++ /dev/null @@ -1,34 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 0.4) + 2 - local max = (level / 5) + (maglevel * 1.59) + 10 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(8) -rune:group("attack") -rune:name("heavy magic missile rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_HEAVY_MAGIC_MISSILE_RUNE) -rune:runeId(3198) -rune:allowFarUse(true) -rune:charges(10) -rune:level(25) -rune:magicLevel(3) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:needTarget(true) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/holy_missile.lua b/data-otservbr-global/scripts/spells/runes/holy_missile.lua deleted file mode 100644 index fe4a3335d0a..00000000000 --- a/data-otservbr-global/scripts/spells/runes/holy_missile.lua +++ /dev/null @@ -1,36 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HOLYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_HOLY) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 1.79) + 11 - local max = (level / 5) + (maglevel * 3.75) + 24 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(130) -rune:group("attack") -rune:name("holy missile rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_HOLY_MISSILE_RUNE) -rune:runeId(3182) -rune:allowFarUse(true) -rune:charges(5) -rune:level(27) -rune:magicLevel(4) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:needTarget(true) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:vocation("paladin;true", "royal paladin;true") -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/icicle.lua b/data-otservbr-global/scripts/spells/runes/icicle.lua deleted file mode 100644 index 67a2ea2a3db..00000000000 --- a/data-otservbr-global/scripts/spells/runes/icicle.lua +++ /dev/null @@ -1,33 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ICE) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 1.81) + 10 - local max = (level / 5) + (maglevel * 3) + 18 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(114) -rune:group("attack") -rune:name("icicle rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_ICICLE_RUNE) -rune:runeId(3158) -rune:allowFarUse(true) -rune:charges(5) -rune:level(28) -rune:magicLevel(4) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:needTarget(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/intense_healing_rune.lua b/data-otservbr-global/scripts/spells/runes/intense_healing_rune.lua deleted file mode 100644 index e6c99de7868..00000000000 --- a/data-otservbr-global/scripts/spells/runes/intense_healing_rune.lua +++ /dev/null @@ -1,43 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, 0) -combat:setParameter(COMBAT_PARAM_TARGETCASTERORTOPMOST, 1) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 3.2) + 20 - local max = (level / 5) + (maglevel * 5.4) + 40 - return min, max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - if Monster(var:getNumber(1073762188)) then - creature:sendCancelMessage("Sorry, not possible.") - creature:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - else - return combat:execute(creature, var) - end -end - -rune:id(4) -rune:group("healing") -rune:name("intense healing rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_INTENSE_HEALING_RUNE) -rune:runeId(3152) -rune:allowFarUse(true) -rune:charges(1) -rune:level(15) -rune:magicLevel(1) -rune:cooldown(1 * 1000) -rune:groupCooldown(1 * 1000) -rune:isAggressive(false) -rune:needTarget(true) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/light_magic_missile.lua b/data-otservbr-global/scripts/spells/runes/light_magic_missile.lua deleted file mode 100644 index 7d2655e69ef..00000000000 --- a/data-otservbr-global/scripts/spells/runes/light_magic_missile.lua +++ /dev/null @@ -1,34 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 0.4) + 2 - local max = (level / 5) + (maglevel * 0.81) + 4 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(7) -rune:group("attack") -rune:name("light magic missile rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_LIGHT_MAGIC_MISSILE_RUNE) -rune:runeId(3174) -rune:allowFarUse(true) -rune:charges(10) -rune:level(15) -rune:magicLevel(0) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:needTarget(true) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/light_stone_shower.lua b/data-otservbr-global/scripts/spells/runes/light_stone_shower.lua deleted file mode 100644 index e201619aee0..00000000000 --- a/data-otservbr-global/scripts/spells/runes/light_stone_shower.lua +++ /dev/null @@ -1,35 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_STONES) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_EARTH) -combat:setArea(createCombatArea(AREA_CIRCLE1X1)) - -function onGetFormulaValues(player, level, maglevel) - level = math.min(level, 20) - maglevel = math.min(maglevel, 20) - local min = (level / 5) + (maglevel * 0.3) + 2 - local max = (level / 5) + (maglevel * 0.45) + 3 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(116) -rune:group("attack") -rune:name("light stone shower rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_LIGHT_STONE_SHOWER_RUNE) -rune:runeId(21351) -rune:allowFarUse(true) -rune:charges(4) -rune:level(1) -rune:magicLevel(0) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/lightest_magic_missile.lua b/data-otservbr-global/scripts/spells/runes/lightest_magic_missile.lua deleted file mode 100644 index d8aa4f65e6b..00000000000 --- a/data-otservbr-global/scripts/spells/runes/lightest_magic_missile.lua +++ /dev/null @@ -1,33 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) - -function onGetFormulaValues(player, level, maglevel) - return -3, -5 -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(7) -rune:group("attack") -rune:name("lightest magic missile rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_PRACTISE_MAGIC_MISSILE_RUNE) -rune:runeId(17512) -rune:allowFarUse(true) -rune:charges(10) -rune:level(1) -rune:magicLevel(0) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:needTarget(true) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:vocation("sorcerer;true", "master sorcerer;true", "druid;true", "elder druid;true", "paladin;true", "royal paladin;true", "knight;true", "elite knight;true") -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/lightest_missile.lua b/data-otservbr-global/scripts/spells/runes/lightest_missile.lua deleted file mode 100644 index ad0e1c6a7fb..00000000000 --- a/data-otservbr-global/scripts/spells/runes/lightest_missile.lua +++ /dev/null @@ -1,35 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ENERGYAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 0.4) + 3 - local max = (level / 5) + (maglevel * 0.8) + 5 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(7) -rune:group("attack") -rune:name("lightest missile rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_LIGHTEST_MISSILE_RUNE) -rune:runeId(21352) -rune:allowFarUse(true) -rune:charges(10) -rune:level(1) -rune:magicLevel(0) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:needTarget(true) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:vocation("sorcerer;true", "master sorcerer;true", "druid;true", "elder druid;true", "paladin;true", "royal paladin;true") -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/paralyze_rune.lua b/data-otservbr-global/scripts/spells/runes/paralyze_rune.lua deleted file mode 100644 index b0c602a159b..00000000000 --- a/data-otservbr-global/scripts/spells/runes/paralyze_rune.lua +++ /dev/null @@ -1,38 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED) -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_UNDEFINEDDAMAGE) - -local condition = Condition(CONDITION_PARALYZE) -condition:setParameter(CONDITION_PARAM_TICKS, 6000) -condition:setFormula(-1, 0, -1, 0) -combat:addCondition(condition) - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var) - if not combat:execute(creature, var) then - return false - end - - creature:getPosition():sendMagicEffect(CONST_ME_MAGIC_GREEN) - return true -end - -rune:id(54) -rune:group("support") -rune:name("paralyze rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_PARALYSE_RUNE) -rune:runeId(3165) -rune:allowFarUse(true) -rune:charges(1) -rune:setPzLocked(true) -rune:level(54) -rune:magicLevel(18) -rune:cooldown(6 * 1000) -rune:groupCooldown(2 * 1000) -rune:mana(1400) -rune:needTarget(true) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:vocation("druid;true", "elder druid;true") -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/poison_bomb.lua b/data-otservbr-global/scripts/spells/runes/poison_bomb.lua deleted file mode 100644 index 117ac2c67e5..00000000000 --- a/data-otservbr-global/scripts/spells/runes/poison_bomb.lua +++ /dev/null @@ -1,28 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_GREEN_RINGS) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_POISON) -combat:setParameter(COMBAT_PARAM_CREATEITEM, ITEM_POISONFIELD_PVP) -combat:setArea(createCombatArea(AREA_SQUARE1X1)) - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(91) -rune:group("attack") -rune:name("poison bomb rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_POISON_BOMB_RUNE) -rune:runeId(3173) -rune:allowFarUse(true) -rune:setPzLocked(true) -rune:charges(2) -rune:level(25) -rune:magicLevel(4) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/poison_field.lua b/data-otservbr-global/scripts/spells/runes/poison_field.lua deleted file mode 100644 index 51c42d67193..00000000000 --- a/data-otservbr-global/scripts/spells/runes/poison_field.lua +++ /dev/null @@ -1,27 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_GREEN_RINGS) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_POISON) -combat:setParameter(COMBAT_PARAM_CREATEITEM, ITEM_POISONFIELD_PVP) - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(26) -rune:group("attack") -rune:name("poison field rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_POISON_FIELD_RUNE) -rune:runeId(3172) -rune:allowFarUse(true) -rune:setPzLocked(true) -rune:charges(3) -rune:level(14) -rune:magicLevel(0) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/poison_wall.lua b/data-otservbr-global/scripts/spells/runes/poison_wall.lua deleted file mode 100644 index 1937b305880..00000000000 --- a/data-otservbr-global/scripts/spells/runes/poison_wall.lua +++ /dev/null @@ -1,28 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_GREEN_RINGS) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_POISON) -combat:setParameter(COMBAT_PARAM_CREATEITEM, ITEM_POISONFIELD_PVP) -combat:setArea(createCombatArea(AREA_WALLFIELD, AREADIAGONAL_WALLFIELD)) - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(32) -rune:group("attack") -rune:name("poison wall rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_POISON_WALL_RUNE) -rune:runeId(3176) -rune:allowFarUse(true) -rune:setPzLocked(true) -rune:charges(4) -rune:level(29) -rune:magicLevel(5) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/soul_fire.lua b/data-otservbr-global/scripts/spells/runes/soul_fire.lua deleted file mode 100644 index 09e4e9f5ef0..00000000000 --- a/data-otservbr-global/scripts/spells/runes/soul_fire.lua +++ /dev/null @@ -1,30 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITBYFIRE) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_FIRE) - -local condition = Condition(CONDITION_FIRE) -condition:setParameter(CONDITION_PARAM_DELAYED, 1) -condition:addDamage(10, 2000, -10) -combat:addCondition(condition) - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:group("attack") -rune:name("soulfire rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_SOUL_FIRE_RUNE) -rune:runeId(3195) -rune:allowFarUse(true) -rune:charges(3) -rune:level(27) -rune:magicLevel(7) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:needTarget(true) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/stalagmite.lua b/data-otservbr-global/scripts/spells/runes/stalagmite.lua deleted file mode 100644 index 7daff02ef17..00000000000 --- a/data-otservbr-global/scripts/spells/runes/stalagmite.lua +++ /dev/null @@ -1,33 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_STONES) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_EARTH) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 0.4) + 2 - local max = (level / 5) + (maglevel * 1.59) + 10 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(77) -rune:group("attack") -rune:name("stalagmite rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_STALAGMITE_RUNE) -rune:runeId(3179) -rune:allowFarUse(true) -rune:charges(10) -rune:level(24) -rune:magicLevel(3) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:needTarget(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/stone_shower.lua b/data-otservbr-global/scripts/spells/runes/stone_shower.lua deleted file mode 100644 index b3cfbd5421b..00000000000 --- a/data-otservbr-global/scripts/spells/runes/stone_shower.lua +++ /dev/null @@ -1,33 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_STONES) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_EARTH) -combat:setArea(createCombatArea(AREA_CIRCLE3X3)) - -function onGetFormulaValues(player, level, magicLevel) - local min = (level / 5) + (magicLevel * 1) + 6 - local max = (level / 5) + (magicLevel * 2.6) + 16 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(116) -rune:group("attack") -rune:name("stone shower rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_STONE_SHOWER_RUNE) -rune:runeId(3175) -rune:allowFarUse(true) -rune:charges(4) -rune:level(28) -rune:magicLevel(4) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/sudden_death.lua b/data-otservbr-global/scripts/spells/runes/sudden_death.lua deleted file mode 100644 index 5716ba337a0..00000000000 --- a/data-otservbr-global/scripts/spells/runes/sudden_death.lua +++ /dev/null @@ -1,34 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SUDDENDEATH) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 4.605) + 28 - local max = (level / 5) + (maglevel * 7.395) + 46 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(21) -rune:group("attack") -rune:name("sudden death rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_SUDDENDEATH_RUNE) -rune:runeId(3155) -rune:allowFarUse(true) -rune:charges(3) -rune:level(45) -rune:magicLevel(15) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:needTarget(true) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/thunderstorm.lua b/data-otservbr-global/scripts/spells/runes/thunderstorm.lua deleted file mode 100644 index 54ee6ed9c60..00000000000 --- a/data-otservbr-global/scripts/spells/runes/thunderstorm.lua +++ /dev/null @@ -1,33 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ENERGYHIT) -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGYBALL) -combat:setArea(createCombatArea(AREA_CIRCLE3X3)) - -function onGetFormulaValues(player, level, magicLevel) - local min = (level / 5) + (magicLevel * 1) + 6 - local max = (level / 5) + (magicLevel * 2.6) + 16 - return -min, -max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - return combat:execute(creature, var) -end - -rune:id(117) -rune:group("attack") -rune:name("thunderstorm rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_THUNDERSTORM_RUNE) -rune:runeId(3202) -rune:allowFarUse(true) -rune:charges(4) -rune:level(28) -rune:magicLevel(4) -rune:cooldown(2 * 1000) -rune:groupCooldown(2 * 1000) -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/ultimate_healing_rune.lua b/data-otservbr-global/scripts/spells/runes/ultimate_healing_rune.lua deleted file mode 100644 index 5dce3c77618..00000000000 --- a/data-otservbr-global/scripts/spells/runes/ultimate_healing_rune.lua +++ /dev/null @@ -1,43 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING) -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, 0) -combat:setParameter(COMBAT_PARAM_TARGETCASTERORTOPMOST, 1) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_PARALYZE) - -function onGetFormulaValues(player, level, maglevel) - local min = (level / 5) + (maglevel * 7.3) + 42 - local max = (level / 5) + (maglevel * 12.4) + 90 - return min, max -end - -combat:setCallback(CALLBACK_PARAM_LEVELMAGICVALUE, "onGetFormulaValues") - -local rune = Spell("rune") - -function rune.onCastSpell(creature, var, isHotkey) - if Monster(var:getNumber(1073762188)) then - creature:sendCancelMessage("Sorry, not possible.") - creature:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - else - return combat:execute(creature, var) - end -end - -rune:id(5) -rune:group("healing") -rune:name("ultimate healing rune") -rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -rune:impactSound(SOUND_EFFECT_TYPE_SPELL_ULTIMATE_HEALING_RUNE) -rune:runeId(3160) -rune:allowFarUse(true) -rune:charges(1) -rune:level(24) -rune:magicLevel(4) -rune:cooldown(1 * 1000) -rune:groupCooldown(1 * 1000) -rune:isAggressive(false) -rune:needTarget(true) -rune:isBlocking(true) -- True = Solid / False = Creature -rune:register() diff --git a/data-otservbr-global/scripts/spells/runes/wild_growth.lua b/data-otservbr-global/scripts/spells/runes/wild_growth.lua deleted file mode 100644 index 708af4b0bc5..00000000000 --- a/data-otservbr-global/scripts/spells/runes/wild_growth.lua +++ /dev/null @@ -1,35 +0,0 @@ -function onCreateWildGrowth(creature, tile) - local wildGrowth - if Game.getWorldType() == WORLD_TYPE_NO_PVP then - wildGrowth = ITEM_WILDGROWTH_SAFE - else - wildGrowth = ITEM_WILDGROWTH - end - local item = Game.createItem(wildGrowth, 1, tile) - item:setDuration(30, 60) -end - -local combat = Combat() -combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) -combat:setCallback(CALLBACK_PARAM_TARGETTILE, "onCreateWildGrowth") - -local spell = Spell("rune") -function spell.onCastSpell(creature, variant, isHotkey) - return combat:execute(creature, variant) -end - -spell:id(94) -spell:name("Wild Growth Rune") -spell:group("attack") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_WILD_GROWTH_RUNE) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(27) -spell:magicLevel(8) -spell:runeId(3156) -spell:charges(2) -spell:isBlocking(true, true) -spell:allowFarUse(true) -spell:vocation("druid;true", "elder druid;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/summon/summon_creature.lua b/data-otservbr-global/scripts/spells/summon/summon_creature.lua deleted file mode 100644 index 74388244f43..00000000000 --- a/data-otservbr-global/scripts/spells/summon/summon_creature.lua +++ /dev/null @@ -1,60 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(player, variant) - local position = player:getPosition() - local monsterName = variant:getString() - local monsterType = MonsterType(monsterName) - - if not monsterType then - player:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - if not player:hasFlag(PlayerFlag_CanSummonAll) then - if not monsterType:isSummonable() then - player:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - if #player:getSummons() >= 2 then - player:sendCancelMessage("You cannot summon more creatures.") - position:sendMagicEffect(CONST_ME_POFF) - return false - end - end - - local manaCost = monsterType:getManaCost() - if player:getMana() < manaCost and not player:hasFlag(PlayerFlag_HasInfiniteMana) then - player:sendCancelMessage(RETURNVALUE_NOTENOUGHMANA) - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - local summon = Game.createMonster(monsterName, position, true, false, player) - if not summon then - player:sendCancelMessage(RETURNVALUE_NOTENOUGHROOM) - position:sendMagicEffect(CONST_ME_POFF) - return false - end - - player:addMana(-manaCost) - player:addManaSpent(manaCost) - position:sendMagicEffect(CONST_ME_MAGIC_BLUE) - summon:getPosition():sendMagicEffect(CONST_ME_TELEPORT) - return true -end - -spell:group("support") -spell:id(9) -spell:name("Summon Creature") -spell:words("utevo res") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_SUMMON_CREATURE) -spell:level(25) -spell:hasParams(true) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("druid;true", "sorcerer;true", "elder druid;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/support/cancel_invisibility.lua b/data-otservbr-global/scripts/spells/support/cancel_invisibility.lua deleted file mode 100644 index 6eada498048..00000000000 --- a/data-otservbr-global/scripts/spells/support/cancel_invisibility.lua +++ /dev/null @@ -1,26 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_DISPEL, CONDITION_INVISIBLE) -combat:setArea(createCombatArea(AREA_CIRCLE3X3)) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Cancel Invisibility") -spell:words("exana ina") -spell:group("support") -spell:vocation("paladin;true", "royal paladin;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_CANCEL_INVISIBILITY) -spell:id(90) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(26) -spell:mana(200) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/support/cancel_magic_shield.lua b/data-otservbr-global/scripts/spells/support/cancel_magic_shield.lua deleted file mode 100644 index 0db3a907503..00000000000 --- a/data-otservbr-global/scripts/spells/support/cancel_magic_shield.lua +++ /dev/null @@ -1,25 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, 0) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - creature:removeCondition(CONDITION_MANASHIELD) - return combat:execute(creature, var) -end - -spell:group("support") -spell:id(245) -spell:name("Cancel Magic Shield") -spell:words("exana vita") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_CANCEL_MAGIC_SHIELD) -spell:level(14) -spell:mana(50) -spell:isAggressive(false) -spell:isSelfTarget(true) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:needLearn(false) -spell:vocation("druid;true", "sorcerer;true", "elder druid;true", "master sorcerer;true") -spell:register() diff --git a/data-otservbr-global/scripts/spells/support/challenge.lua b/data-otservbr-global/scripts/spells/support/challenge.lua deleted file mode 100644 index 3bfd306fbf4..00000000000 --- a/data-otservbr-global/scripts/spells/support/challenge.lua +++ /dev/null @@ -1,30 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setArea(createCombatArea(AREA_SQUARE1X1)) - -function onTargetCreature(creature, target) - return doChallengeCreature(creature, target) -end - -combat:setCallback(CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature") - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Challenge") -spell:words("exeta res") -spell:group("support") -spell:vocation("elite knight;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_CHALLENGE) -spell:id(93) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(20) -spell:mana(30) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/support/creature_illusion.lua b/data-otservbr-global/scripts/spells/support/creature_illusion.lua deleted file mode 100644 index 5d66d0924ca..00000000000 --- a/data-otservbr-global/scripts/spells/support/creature_illusion.lua +++ /dev/null @@ -1,40 +0,0 @@ -local condition = Condition(CONDITION_OUTFIT) -condition:setTicks(180000) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - local returnValue = RETURNVALUE_NOERROR - local monsterType = MonsterType(variant:getString()) - if not monsterType then - returnValue = RETURNVALUE_CREATUREDOESNOTEXIST - elseif not creature:hasFlag(PlayerFlag_CanIllusionAll) and not monsterType:isIllusionable() then - returnValue = RETURNVALUE_NOTPOSSIBLE - end - - if returnValue ~= RETURNVALUE_NOERROR then - creature:sendCancelMessage(returnValue) - creature:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end - - condition:setOutfit(monsterType:getOutfit()) - creature:addCondition(condition) - creature:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) - return true -end - -spell:name("Creature Illusion") -spell:words("utevo res ina") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_CREATURE_ILLUSION) -spell:id(38) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(23) -spell:mana(100) -spell:hasParams(true) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/support/find_person.lua b/data-otservbr-global/scripts/spells/support/find_person.lua deleted file mode 100644 index 9e32ec3b69b..00000000000 --- a/data-otservbr-global/scripts/spells/support/find_person.lua +++ /dev/null @@ -1,92 +0,0 @@ -local LEVEL_LOWER = 1 -local LEVEL_SAME = 2 -local LEVEL_HIGHER = 3 - -local DISTANCE_BESIDE = 1 -local DISTANCE_CLOSE = 2 -local DISTANCE_FAR = 3 -local DISTANCE_VERYFAR = 4 - -local directions = { - [DIRECTION_NORTH] = "north", - [DIRECTION_SOUTH] = "south", - [DIRECTION_EAST] = "east", - [DIRECTION_WEST] = "west", - [DIRECTION_NORTHEAST] = "north-east", - [DIRECTION_NORTHWEST] = "north-west", - [DIRECTION_SOUTHEAST] = "south-east", - [DIRECTION_SOUTHWEST] = "south-west", -} - -local messages = { - [DISTANCE_BESIDE] = { - [LEVEL_LOWER] = "is below you", - [LEVEL_SAME] = "is standing next to you", - [LEVEL_HIGHER] = "is above you", - }, - [DISTANCE_CLOSE] = { - [LEVEL_LOWER] = "is on a lower level to the", - [LEVEL_SAME] = "is to the", - [LEVEL_HIGHER] = "is on a higher level to the", - }, - [DISTANCE_FAR] = "is far to the", - [DISTANCE_VERYFAR] = "is very far to the", -} - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - local target = Player(variant:getString()) - if not target or target:getGroup():getAccess() and not creature:getGroup():getAccess() then - creature:sendCancelMessage(RETURNVALUE_PLAYERWITHTHISNAMEISNOTONLINE) - creature:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end - - local targetPosition = target:getPosition() - local creaturePosition = creature:getPosition() - local positionDifference = { - x = creaturePosition.x - targetPosition.x, - y = creaturePosition.y - targetPosition.y, - z = creaturePosition.z - targetPosition.z, - } - - local maxPositionDifference, direction = math.max(math.abs(positionDifference.x), math.abs(positionDifference.y)) - if maxPositionDifference >= 5 then - local positionTangent = positionDifference.x ~= 0 and positionDifference.y / positionDifference.x or 10 - if math.abs(positionTangent) < 0.4142 then - direction = positionDifference.x > 0 and DIRECTION_WEST or DIRECTION_EAST - elseif math.abs(positionTangent) < 2.4142 then - direction = positionTangent > 0 and (positionDifference.y > 0 and DIRECTION_NORTHWEST or DIRECTION_SOUTHEAST) or positionDifference.x > 0 and DIRECTION_SOUTHWEST or DIRECTION_NORTHEAST - else - direction = positionDifference.y > 0 and DIRECTION_NORTH or DIRECTION_SOUTH - end - end - - local level = positionDifference.z > 0 and LEVEL_HIGHER or positionDifference.z < 0 and LEVEL_LOWER or LEVEL_SAME - local distance = maxPositionDifference < 5 and DISTANCE_BESIDE or maxPositionDifference < 101 and DISTANCE_CLOSE or maxPositionDifference < 275 and DISTANCE_FAR or DISTANCE_VERYFAR - local message = messages[distance][level] or messages[distance] - if distance ~= DISTANCE_BESIDE then - message = message .. " " .. directions[direction] - end - - creature:sendTextMessage(MESSAGE_LOOK, target:getName() .. " " .. message .. ".") - creaturePosition:sendMagicEffect(CONST_ME_MAGIC_BLUE) - return true -end - -spell:name("Find Person") -spell:words("exiva") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "knight;true", "elite knight;true", "paladin;true", "royal paladin;true", "sorcerer;true", "master sorcerer;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_FIND_PERSON) -spell:id(20) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(8) -spell:mana(20) -spell:hasParams(true) -spell:hasPlayerNameParam(true) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/support/food.lua b/data-otservbr-global/scripts/spells/support/food.lua deleted file mode 100644 index 46bd982cdd1..00000000000 --- a/data-otservbr-global/scripts/spells/support/food.lua +++ /dev/null @@ -1,36 +0,0 @@ -local foods = { - 3577, -- meat - 3582, -- ham - 3592, -- grape - 3585, -- apple - 3600, -- bread - 3601, -- roll - 3607, -- cheese -} - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - if math.random(0, 1) == 1 then - creature:addItem(foods[math.random(#foods)]) - end - - creature:addItem(foods[math.random(#foods)]) - creature:getPosition():sendMagicEffect(CONST_ME_MAGIC_GREEN) - return true -end - -spell:name("Food") -spell:words("exevo pan") -spell:group("support") -spell:vocation("druid;true", "elder druid;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_FOOD) -spell:id(42) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(14) -spell:mana(120) -spell:soul(1) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/support/great_light.lua b/data-otservbr-global/scripts/spells/support/great_light.lua deleted file mode 100644 index 2ffe811aebe..00000000000 --- a/data-otservbr-global/scripts/spells/support/great_light.lua +++ /dev/null @@ -1,30 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -local condition = Condition(CONDITION_LIGHT) -condition:setParameter(CONDITION_PARAM_LIGHT_LEVEL, 8) -condition:setParameter(CONDITION_PARAM_LIGHT_COLOR, 215) -condition:setParameter(CONDITION_PARAM_TICKS, (11 * 60 + 35) * 1000) -combat:addCondition(condition) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Great Light") -spell:words("utevo gran lux") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "knight;true", "elite knight;true", "paladin;true", "royal paladin;true", "sorcerer;true", "master sorcerer;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_GREAT_LIGHT) -spell:id(11) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(13) -spell:mana(60) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/support/invisible.lua b/data-otservbr-global/scripts/spells/support/invisible.lua deleted file mode 100644 index 0746bd87fbd..00000000000 --- a/data-otservbr-global/scripts/spells/support/invisible.lua +++ /dev/null @@ -1,28 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -local condition = Condition(CONDITION_INVISIBLE) -condition:setParameter(CONDITION_PARAM_TICKS, 200000) -combat:addCondition(condition) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Invisibility") -spell:words("utana vid") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_INVISIBLE) -spell:id(45) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(35) -spell:mana(440) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/support/levitate.lua b/data-otservbr-global/scripts/spells/support/levitate.lua deleted file mode 100644 index 9309937db05..00000000000 --- a/data-otservbr-global/scripts/spells/support/levitate.lua +++ /dev/null @@ -1,48 +0,0 @@ -local function levitate(creature, parameter) - local fromPosition = creature:getPosition() - - if parameter == "up" and fromPosition.z ~= 8 or parameter == "down" and fromPosition.z ~= 7 then - local toPosition = creature:getPosition() - toPosition:getNextPosition(creature:getDirection()) - - local tile = Tile(parameter == "up" and Position(fromPosition.x, fromPosition.y, fromPosition.z - 1) or toPosition) - if not tile or not tile:getGround() and not tile:hasFlag(parameter == "up" and TILESTATE_IMMOVABLEBLOCKSOLID or TILESTATE_BLOCKSOLID) then - tile = Tile(toPosition.x, toPosition.y, toPosition.z + (parameter == "up" and -1 or 1)) - - if tile and tile:getGround() and not tile:hasFlag(bit.bor(TILESTATE_IMMOVABLEBLOCKSOLID, TILESTATE_FLOORCHANGE)) then - return creature:move(tile, bit.bor(FLAG_IGNOREBLOCKITEM, FLAG_IGNOREBLOCKCREATURE)) - end - end - end - return RETURNVALUE_NOTPOSSIBLE -end - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - local returnValue = levitate(creature, variant:getString():lower()) - if returnValue ~= RETURNVALUE_NOERROR then - creature:sendCancelMessage(returnValue) - creature:getPosition():sendMagicEffect(CONST_ME_POFF) - return false - end - - creature:getPosition():sendMagicEffect(CONST_ME_TELEPORT) - return true -end - -spell:name("Levitate") -spell:words("exani hur") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "knight;true", "elite knight;true", "paladin;true", "royal paladin;true", "sorcerer;true", "master sorcerer;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_LEVITATE) -spell:id(81) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(12) -spell:mana(50) -spell:hasParams(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/support/light.lua b/data-otservbr-global/scripts/spells/support/light.lua deleted file mode 100644 index 9ba4665cac2..00000000000 --- a/data-otservbr-global/scripts/spells/support/light.lua +++ /dev/null @@ -1,30 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) - -local condition = Condition(CONDITION_LIGHT) -condition:setParameter(CONDITION_PARAM_LIGHT_LEVEL, 6) -condition:setParameter(CONDITION_PARAM_LIGHT_COLOR, 215) -condition:setParameter(CONDITION_PARAM_TICKS, (6 * 60 + 10) * 1000) -combat:addCondition(condition) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, variant) - return combat:execute(creature, variant) -end - -spell:name("Light") -spell:words("utevo lux") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "knight;true", "elite knight;true", "paladin;true", "royal paladin;true", "sorcerer;true", "master sorcerer;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_LIGHT) -spell:id(10) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(8) -spell:mana(20) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/support/magic_rope.lua b/data-otservbr-global/scripts/spells/support/magic_rope.lua deleted file mode 100644 index f622b41a275..00000000000 --- a/data-otservbr-global/scripts/spells/support/magic_rope.lua +++ /dev/null @@ -1,38 +0,0 @@ -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - local position = creature:getPosition() - position:sendMagicEffect(CONST_ME_POFF) - - local tile = Tile(position) - if not tile:isRopeSpot() then - creature:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE) - return false - end - - tile = Tile(position:moveUpstairs()) - if not tile then - creature:sendCancelMessage(RETURNVALUE_NOTENOUGHROOM) - return false - end - - creature:teleportTo(position, false) - position:sendMagicEffect(CONST_ME_TELEPORT) - return true -end - -spell:name("Magic Rope") -spell:words("exani tera") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "knight;true", "elite knight;true", "paladin;true", "royal paladin;true", "sorcerer;true", "master sorcerer;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_MAGIC_ROPE) -spell:id(76) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(9) -spell:mana(20) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/spells/support/ultimate_light.lua b/data-otservbr-global/scripts/spells/support/ultimate_light.lua deleted file mode 100644 index 0a92db43a09..00000000000 --- a/data-otservbr-global/scripts/spells/support/ultimate_light.lua +++ /dev/null @@ -1,31 +0,0 @@ -local combat = Combat() -combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) -combat:setParameter(COMBAT_PARAM_AGGRESSIVE, 0) - -local condition = Condition(CONDITION_LIGHT) -condition:setParameter(CONDITION_PARAM_LIGHT_LEVEL, 8) -condition:setParameter(CONDITION_PARAM_LIGHT_COLOR, 215) -condition:setParameter(CONDITION_PARAM_TICKS, (60 * 33 + 10) * 1000) -combat:addCondition(condition) - -local spell = Spell("instant") - -function spell.onCastSpell(creature, var) - return combat:execute(creature, var) -end - -spell:name("Ultimate Light") -spell:words("utevo vis lux") -spell:group("support") -spell:vocation("druid;true", "elder druid;true", "sorcerer;true", "master sorcerer;true") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_ULTIMATE_LIGHT) -spell:id(75) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(26) -spell:mana(140) -spell:isSelfTarget(true) -spell:isAggressive(false) -spell:isPremium(true) -spell:needLearn(false) -spell:register() diff --git a/data-otservbr-global/scripts/hazard/primal.lua b/data-otservbr-global/scripts/systems/hazard_primal.lua similarity index 100% rename from data-otservbr-global/scripts/hazard/primal.lua rename to data-otservbr-global/scripts/systems/hazard_primal.lua diff --git a/data-otservbr-global/scripts/weapons/unscripted_weapons.lua b/data-otservbr-global/scripts/weapons/unscripted_weapons.lua deleted file mode 100644 index 5e6232836e9..00000000000 --- a/data-otservbr-global/scripts/weapons/unscripted_weapons.lua +++ /dev/null @@ -1,5378 +0,0 @@ -local weapons = { - { - -- grand sanguine rod - itemId = 43886, - type = WEAPON_WAND, - wandType = "earth", - level = 600, - mana = 20, - damage = { 100, 124 }, - unproperly = true, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- sanguine rod - itemId = 43885, - type = WEAPON_WAND, - wandType = "earth", - level = 600, - mana = 20, - damage = { 100, 124 }, - unproperly = true, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- grand sanguine coil - itemId = 43883, - type = WEAPON_WAND, - wandType = "energy", - level = 250, - mana = 21, - damage = { 103, 125 }, - unproperly = true, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- sanguine coil - itemId = 43882, - type = WEAPON_WAND, - wandType = "fire", - level = 250, - mana = 21, - damage = { 113, 125 }, - unproperly = true, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- grand sanguine crossbow - itemId = 43880, - type = WEAPON_DISTANCE, - level = 600, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- sanguine crossbow - itemId = 43879, - type = WEAPON_DISTANCE, - level = 600, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- grand sanguine bow - itemId = 43878, - type = WEAPON_DISTANCE, - level = 600, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- sanguine bow - itemId = 43877, - type = WEAPON_DISTANCE, - level = 600, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- grand sanguine battleaxe - itemId = 43875, - type = WEAPON_AXE, - level = 600, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sanguine battleaxe - itemId = 43874, - type = WEAPON_AXE, - level = 600, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- grand sanguine bludgeon - itemId = 43873, - type = WEAPON_CLUB, - level = 600, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sanguine bludgeon - itemId = 43872, - type = WEAPON_CLUB, - level = 600, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- grand sanguine razor - itemId = 43871, - type = WEAPON_SWORD, - level = 600, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sanguine razor - itemId = 43870, - type = WEAPON_SWORD, - level = 600, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- grand sanguine hatchet - itemId = 43869, - type = WEAPON_AXE, - level = 600, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sanguine hatchet - itemId = 43868, - type = WEAPON_AXE, - level = 600, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- grand sanguine cudgel - itemId = 43867, - type = WEAPON_CLUB, - level = 600, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sanguine cudgel - itemId = 43866, - type = WEAPON_CLUB, - level = 600, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- grand sanguine blade - itemId = 43865, - type = WEAPON_SWORD, - level = 600, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sanguine blade - itemId = 43864, - type = WEAPON_SWORD, - level = 600, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- broken macuahuitl - itemId = 40530, - type = WEAPON_SWORD, - }, - { - -- naga rod - itemId = 39163, - type = WEAPON_WAND, - wandType = "ice", - level = 250, - mana = 22, - damage = { 90, 110 }, - unproperly = true, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- naga wand - itemId = 39162, - type = WEAPON_WAND, - wandType = "energy", - level = 250, - mana = 21, - damage = { 90, 120 }, - unproperly = true, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- naga crossbow - itemId = 39159, - type = WEAPON_DISTANCE, - level = 300, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- naga club - itemId = 39157, - type = WEAPON_CLUB, - level = 300, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- naga axe - itemId = 39156, - type = WEAPON_AXE, - level = 300, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- naga sword - itemId = 39155, - type = WEAPON_SWORD, - level = 300, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- gilded eldritch rod - itemId = 36675, - type = WEAPON_WAND, - wandType = "ice", - level = 250, - mana = 22, - damage = { 85, 105 }, - unproperly = true, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- eldritch rod - itemId = 36674, - type = WEAPON_WAND, - wandType = "ice", - level = 250, - mana = 22, - damage = { 85, 105 }, - unproperly = true, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- gilded eldritch wand - itemId = 36669, - type = WEAPON_WAND, - wandType = "fire", - level = 250, - mana = 22, - damage = { 85, 105 }, - unproperly = true, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- eldritch wand - itemId = 36668, - type = WEAPON_WAND, - wandType = "fire", - level = 250, - mana = 22, - damage = { 85, 105 }, - unproperly = true, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- gilded eldritch bow - itemId = 36665, - type = WEAPON_DISTANCE, - level = 250, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- eldritch bow - itemId = 36664, - type = WEAPON_DISTANCE, - level = 250, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- gilded eldritch greataxe - itemId = 36662, - type = WEAPON_AXE, - level = 270, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch greataxe - itemId = 36661, - type = WEAPON_AXE, - level = 270, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- gilded eldritch warmace - itemId = 36660, - type = WEAPON_CLUB, - level = 270, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch warmace - itemId = 36659, - type = WEAPON_CLUB, - level = 270, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- gilded eldritch claymore - itemId = 36658, - type = WEAPON_SWORD, - level = 270, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- eldritch claymore - itemId = 36657, - type = WEAPON_SWORD, - level = 270, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- spectral bolt (no decay) - itemId = 35902, - type = WEAPON_AMMO, - level = 150, - unproperly = true, - action = "removecount", - }, - { - -- jungle wand - itemId = 35522, - type = WEAPON_WAND, - wandType = "earth", - level = 150, - mana = 19, - damage = { 80, 100 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- jungle rod - itemId = 35521, - type = WEAPON_WAND, - wandType = "ice", - level = 150, - mana = 19, - damage = { 80, 100 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- jungle bow - itemId = 35518, - type = WEAPON_DISTANCE, - level = 150, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- throwing axe - itemId = 35515, - type = WEAPON_AXE, - level = 150, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- jungle flail - itemId = 35514, - type = WEAPON_CLUB, - level = 150, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- lion longsword - itemId = 34155, - type = WEAPON_SWORD, - level = 270, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- lion hammer - itemId = 34254, - type = WEAPON_CLUB, - level = 270, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- lion axe - itemId = 34253, - type = WEAPON_AXE, - level = 270, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- lion wand - itemId = 34152, - type = WEAPON_WAND, - wandType = "ice", - level = 220, - mana = 21, - damage = { 89, 109 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- lion rod - itemId = 34151, - type = WEAPON_WAND, - wandType = "ice", - level = 270, - mana = 20, - damage = { 85, 105 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- lion longbow - itemId = 34150, - type = WEAPON_DISTANCE, - level = 270, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- soulhexer rod - itemId = 34091, - type = WEAPON_WAND, - wandType = "ice", - level = 400, - mana = 21, - damage = { 98, 118 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- soultainter wand - itemId = 34090, - type = WEAPON_WAND, - wandType = "death", - level = 400, - mana = 21, - damage = { 100, 120 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- soulpiercer crossbow - itemId = 34089, - type = WEAPON_DISTANCE, - level = 400, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- soulbleeder bow - itemId = 34088, - type = WEAPON_DISTANCE, - level = 400, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- soulmaimer club - itemId = 34087, - type = WEAPON_CLUB, - level = 400, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- soulcrusher club - itemId = 34086, - type = WEAPON_CLUB, - level = 400, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- souleater axe - itemId = 34085, - type = WEAPON_AXE, - level = 400, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- soulbiter axe - itemId = 34084, - type = WEAPON_AXE, - level = 400, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- soulshredder sword - itemId = 34083, - type = WEAPON_SWORD, - level = 400, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- soulcutter sword - itemId = 34082, - type = WEAPON_SWORD, - level = 400, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- phantasmal axe - itemId = 32616, - type = WEAPON_AXE, - level = 180, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- meat hammer - itemId = 32093, - type = WEAPON_CLUB, - }, - { - -- tagralt blade - itemId = 31614, - type = WEAPON_SWORD, - level = 250, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- bow of cataclysm - itemId = 31581, - type = WEAPON_DISTANCE, - level = 250, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- mortal mace - itemId = 31580, - type = WEAPON_CLUB, - level = 220, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- cobra rod - itemId = 30400, - type = WEAPON_WAND, - wandType = "earth", - level = 220, - mana = 21, - damage = { 70, 110 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- cobra wand - itemId = 30399, - type = WEAPON_WAND, - wandType = "energy", - level = 270, - mana = 22, - damage = { 94, 100 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- cobra sword - itemId = 30398, - type = WEAPON_SWORD, - level = 220, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- cobra axe - itemId = 30396, - type = WEAPON_AXE, - level = 220, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- cobra club - itemId = 30395, - type = WEAPON_CLUB, - level = 220, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- cobra crossbow - itemId = 30393, - type = WEAPON_DISTANCE, - level = 220, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- ice hatchet - itemId = 30283, - type = WEAPON_AXE, - }, - { - -- energized limb - itemId = 29425, - type = WEAPON_WAND, - wandType = "fire", - level = 180, - mana = 24, - damage = { 88, 108 }, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- winterblade - itemId = 29422, - type = WEAPON_SWORD, - level = 200, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- summerblade - itemId = 29421, - type = WEAPON_SWORD, - level = 200, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- resizer - itemId = 29419, - type = WEAPON_CLUB, - level = 230, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- living vine bow - itemId = 29417, - type = WEAPON_DISTANCE, - level = 220, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- golden axe - itemId = 29286, - type = WEAPON_AXE, - }, - { - -- wand of destruction test - itemId = 28479, - type = WEAPON_WAND, - }, - { - -- umbral master bow test - itemId = 28478, - type = WEAPON_DISTANCE, - }, - { - -- sorcerer test weapon - itemId = 28466, - type = WEAPON_WAND, - }, - { - -- bow of destruction test - itemId = 28465, - type = WEAPON_DISTANCE, - }, - { - -- test weapon for knights - itemId = 28464, - type = WEAPON_SWORD, - }, - { - -- sulphurous demonbone - itemId = 28832, - type = WEAPON_CLUB, - level = 80, - unproperly = true, - }, - { - -- unliving demonbone - itemId = 28831, - type = WEAPON_CLUB, - level = 80, - unproperly = true, - }, - { - -- energized demonbone - itemId = 28830, - type = WEAPON_CLUB, - level = 80, - unproperly = true, - }, - { - -- rotten demonbone - itemId = 28829, - type = WEAPON_CLUB, - level = 80, - unproperly = true, - }, - { - -- deepling fork - itemId = 28826, - type = WEAPON_WAND, - wandType = "ice", - level = 230, - mana = 23, - damage = { 80, 120 }, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- deepling ceremonial dagger - itemId = 28825, - type = WEAPON_WAND, - wandType = "ice", - level = 180, - mana = 23, - damage = { 86, 98 }, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- falcon mace - itemId = 28725, - type = WEAPON_CLUB, - level = 300, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- falcon battleaxe - itemId = 28724, - type = WEAPON_AXE, - level = 300, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- falcon longsword - itemId = 28723, - type = WEAPON_SWORD, - level = 300, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- falcon bow - itemId = 28718, - type = WEAPON_DISTANCE, - level = 300, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- falcon wand - itemId = 28717, - type = WEAPON_WAND, - wandType = "energy", - level = 300, - mana = 21, - damage = { 86, 102 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- falcon rod - itemId = 28716, - type = WEAPON_WAND, - wandType = "earth", - level = 300, - mana = 20, - damage = { 87, 101 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- gnome sword - itemId = 27651, - type = WEAPON_SWORD, - level = 250, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- mallet handle - itemId = 27525, - type = WEAPON_CLUB, - }, - { - -- strange mallet - itemId = 27523, - type = WEAPON_CLUB, - }, - { - -- rod of destruction - itemId = 27458, - type = WEAPON_WAND, - wandType = "ice", - level = 200, - mana = 20, - damage = { 80, 110 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- wand of destruction - itemId = 27457, - type = WEAPON_WAND, - wandType = "energy", - level = 200, - mana = 20, - damage = { 80, 110 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- crossbow of destruction - itemId = 27456, - type = WEAPON_DISTANCE, - level = 200, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- bow of destruction - itemId = 27455, - type = WEAPON_DISTANCE, - level = 200, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- hammer of destruction - itemId = 27454, - type = WEAPON_CLUB, - level = 200, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- mace of destruction - itemId = 27453, - type = WEAPON_CLUB, - level = 200, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- chopper of destruction - itemId = 27452, - type = WEAPON_AXE, - level = 200, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- axe of destruction - itemId = 27451, - type = WEAPON_AXE, - level = 200, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- slayer of destruction - itemId = 27450, - type = WEAPON_SWORD, - level = 200, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- blade of destruction - itemId = 27449, - type = WEAPON_SWORD, - level = 200, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- ornate carving hammer - itemId = 26061, - type = WEAPON_CLUB, - }, - { - -- valuable carving hammer - itemId = 26060, - type = WEAPON_CLUB, - }, - { - -- plain carving hammer - itemId = 26059, - type = WEAPON_CLUB, - }, - { - -- ornate carving mace - itemId = 26058, - type = WEAPON_CLUB, - }, - { - -- valuable carving mace - itemId = 26057, - type = WEAPON_CLUB, - }, - { - -- plain carving mace - itemId = 26056, - type = WEAPON_CLUB, - }, - { - -- ornate carving chopper - itemId = 26055, - type = WEAPON_AXE, - }, - { - -- valuable carving chopper - itemId = 26054, - type = WEAPON_AXE, - }, - { - -- plain carving chopper - itemId = 26053, - type = WEAPON_AXE, - }, - { - -- ornate carving axe - itemId = 26052, - type = WEAPON_AXE, - }, - { - -- valuable carving axe - itemId = 26051, - type = WEAPON_AXE, - }, - { - -- plain carving axe - itemId = 26050, - type = WEAPON_AXE, - }, - { - -- ornate carving slayer - itemId = 26049, - type = WEAPON_SWORD, - }, - { - -- valuable carving slayer - itemId = 26048, - type = WEAPON_SWORD, - }, - { - -- plain carving slayer - itemId = 26047, - type = WEAPON_SWORD, - }, - { - -- ornate carving blade - itemId = 26046, - type = WEAPON_SWORD, - }, - { - -- valuable carving blade - itemId = 26045, - type = WEAPON_SWORD, - }, - { - -- plain carving blade - itemId = 26044, - type = WEAPON_SWORD, - }, - { - -- ornate remedy hammer - itemId = 26031, - type = WEAPON_CLUB, - }, - { - -- valuable remedy hammer - itemId = 26030, - type = WEAPON_CLUB, - }, - { - -- plain remedy hammer - itemId = 26029, - type = WEAPON_CLUB, - }, - { - -- ornate remedy mace - itemId = 26028, - type = WEAPON_CLUB, - }, - { - -- valuable remedy mace - itemId = 26027, - type = WEAPON_CLUB, - }, - { - -- plain remedy mace - itemId = 26026, - type = WEAPON_CLUB, - }, - { - -- ornate remedy chopper - itemId = 26025, - type = WEAPON_AXE, - }, - { - -- valuable remedy chopper - itemId = 26024, - type = WEAPON_AXE, - }, - { - -- plain remedy chopper - itemId = 26023, - type = WEAPON_AXE, - }, - { - -- ornate remedy axe - itemId = 26022, - type = WEAPON_AXE, - }, - { - -- valuable remedy axe - itemId = 26021, - type = WEAPON_AXE, - }, - { - -- plain remedy axe - itemId = 26020, - type = WEAPON_AXE, - }, - { - -- ornate remedy slayer - itemId = 26019, - type = WEAPON_SWORD, - }, - { - -- valuable remedy slayer - itemId = 26018, - type = WEAPON_SWORD, - }, - { - -- plain remedy slayer - itemId = 26017, - type = WEAPON_SWORD, - }, - { - -- ornate remedy blade - itemId = 26016, - type = WEAPON_SWORD, - }, - { - -- valuable remedy blade - itemId = 26015, - type = WEAPON_SWORD, - }, - { - -- plain remedy blade - itemId = 26014, - type = WEAPON_SWORD, - }, - { - -- ornate mayhem hammer - itemId = 26000, - type = WEAPON_CLUB, - }, - { - -- valuable mayhem hammer - itemId = 25999, - type = WEAPON_CLUB, - }, - { - -- plain mayhem hammer - itemId = 25998, - type = WEAPON_CLUB, - }, - { - -- ornate mayhem mace - itemId = 25997, - type = WEAPON_CLUB, - }, - { - -- valuable mayhem mace - itemId = 25996, - type = WEAPON_CLUB, - }, - { - -- plain mayhem mace - itemId = 25995, - type = WEAPON_CLUB, - }, - { - -- ornate mayhem chopper - itemId = 25994, - type = WEAPON_AXE, - }, - { - -- valuable mayhem chopper - itemId = 25993, - type = WEAPON_AXE, - }, - { - -- plain mayhem chopper - itemId = 25992, - type = WEAPON_AXE, - }, - { - -- ornate mayhem axe - itemId = 25991, - type = WEAPON_AXE, - }, - { - -- valuable mayhem axe - itemId = 25990, - type = WEAPON_AXE, - }, - { - -- plain mayhem axe - itemId = 25989, - type = WEAPON_AXE, - }, - { - -- ornate mayhem slayer - itemId = 25988, - type = WEAPON_SWORD, - }, - { - -- valuable mayhem slayer - itemId = 25987, - type = WEAPON_SWORD, - }, - { - -- plain mayhem slayer - itemId = 25986, - type = WEAPON_SWORD, - }, - { - -- ornate mayhem blade - itemId = 25985, - type = WEAPON_SWORD, - }, - { - -- valuable mayhem blade - itemId = 25984, - type = WEAPON_SWORD, - }, - { - -- plain mayhem blade - itemId = 25983, - type = WEAPON_SWORD, - }, - { - -- energy war hammer replica - itemId = 25974, - type = WEAPON_CLUB, - }, - { - -- energy orcish maul replica - itemId = 25973, - type = WEAPON_CLUB, - }, - { - -- energy basher replica - itemId = 25972, - type = WEAPON_CLUB, - }, - { - -- energy crystal mace replica - itemId = 25971, - type = WEAPON_CLUB, - }, - { - -- energy clerical mace replica - itemId = 25970, - type = WEAPON_CLUB, - }, - { - -- energy war axe replica - itemId = 25969, - type = WEAPON_AXE, - }, - { - -- energy headchopper replica - itemId = 25968, - type = WEAPON_AXE, - }, - { - -- energy heroic axe replica - itemId = 25967, - type = WEAPON_AXE, - }, - { - -- energy knight axe replica - itemId = 25966, - type = WEAPON_AXE, - }, - { - -- energy barbarian axe replica - itemId = 25965, - type = WEAPON_AXE, - }, - { - -- energy dragon slayer replica - itemId = 25964, - type = WEAPON_SWORD, - }, - { - -- energy blacksteel replica - itemId = 25963, - type = WEAPON_SWORD, - }, - { - -- energy mystic blade replica - itemId = 25962, - type = WEAPON_SWORD, - }, - { - -- energy relic sword replica - itemId = 25961, - type = WEAPON_SWORD, - }, - { - -- energy spike sword replica - itemId = 25960, - type = WEAPON_SWORD, - }, - { - -- earth war hammer replica - itemId = 25959, - type = WEAPON_CLUB, - }, - { - -- earth orcish maul replica - itemId = 25958, - type = WEAPON_CLUB, - }, - { - -- earth basher replica - itemId = 25957, - type = WEAPON_CLUB, - }, - { - -- earth crystal mace replica - itemId = 25956, - type = WEAPON_CLUB, - }, - { - -- earth clerical mace replica - itemId = 25955, - type = WEAPON_CLUB, - }, - { - -- earth war axe replica - itemId = 25954, - type = WEAPON_AXE, - }, - { - -- earth headchopper replica - itemId = 25953, - type = WEAPON_AXE, - }, - { - -- earth heroic axe replica - itemId = 25952, - type = WEAPON_AXE, - }, - { - -- earth knight axe replica - itemId = 25951, - type = WEAPON_AXE, - }, - { - -- earth barbarian axe replica - itemId = 25950, - type = WEAPON_AXE, - }, - { - -- earth dragon slayer replica - itemId = 25949, - type = WEAPON_SWORD, - }, - { - -- earth blacksteel replica - itemId = 25948, - type = WEAPON_SWORD, - }, - { - -- earth mystic blade replica - itemId = 25947, - type = WEAPON_SWORD, - }, - { - -- earth relic sword replica - itemId = 25946, - type = WEAPON_SWORD, - }, - { - -- earth spike sword replica - itemId = 25945, - type = WEAPON_SWORD, - }, - { - -- icy war hammer replica - itemId = 25944, - type = WEAPON_CLUB, - }, - { - -- icy orcish maul replica - itemId = 25943, - type = WEAPON_CLUB, - }, - { - -- icy basher replica - itemId = 25942, - type = WEAPON_CLUB, - }, - { - -- icy crystal mace replica - itemId = 25941, - type = WEAPON_CLUB, - }, - { - -- icy clerical mace replica - itemId = 25940, - type = WEAPON_CLUB, - }, - { - -- icy war axe replica - itemId = 25939, - type = WEAPON_AXE, - }, - { - -- icy headchopper replica - itemId = 25938, - type = WEAPON_AXE, - }, - { - -- icy heroic axe replica - itemId = 25937, - type = WEAPON_AXE, - }, - { - -- icy knight axe replica - itemId = 25936, - type = WEAPON_AXE, - }, - { - -- icy barbarian axe replica - itemId = 25935, - type = WEAPON_AXE, - }, - { - -- icy dragon slayer replica - itemId = 25934, - type = WEAPON_SWORD, - }, - { - -- icy blacksteel replica - itemId = 25933, - type = WEAPON_SWORD, - }, - { - -- icy mystic blade replica - itemId = 25932, - type = WEAPON_SWORD, - }, - { - -- icy relic sword replica - itemId = 25931, - type = WEAPON_SWORD, - }, - { - -- icy spike sword replica - itemId = 25930, - type = WEAPON_SWORD, - }, - { - -- fiery war hammer replica - itemId = 25929, - type = WEAPON_CLUB, - }, - { - -- fiery orcish maul replica - itemId = 25928, - type = WEAPON_CLUB, - }, - { - -- fiery basher replica - itemId = 25927, - type = WEAPON_CLUB, - }, - { - -- fiery crystal mace replica - itemId = 25926, - type = WEAPON_CLUB, - }, - { - -- fiery clerical mace replica - itemId = 25925, - type = WEAPON_CLUB, - }, - { - -- fiery war axe replica - itemId = 25924, - type = WEAPON_AXE, - }, - { - -- fiery headchopper replica - itemId = 25923, - type = WEAPON_AXE, - }, - { - -- fiery heroic axe replica - itemId = 25922, - type = WEAPON_AXE, - }, - { - -- fiery knight axe replica - itemId = 25921, - type = WEAPON_AXE, - }, - { - -- fiery barbarian axe replica - itemId = 25920, - type = WEAPON_AXE, - }, - { - -- fiery dragon slayer replica - itemId = 25919, - type = WEAPON_SWORD, - }, - { - -- fiery blacksteel replica - itemId = 25918, - type = WEAPON_SWORD, - }, - { - -- fiery mystic blade replica - itemId = 25917, - type = WEAPON_SWORD, - }, - { - -- fiery relic sword replica - itemId = 25916, - type = WEAPON_SWORD, - }, - { - -- fiery spike sword replica - itemId = 25915, - type = WEAPON_SWORD, - }, - { - -- wand of darkness - itemId = 25760, - type = WEAPON_WAND, - wandType = "death", - level = 41, - mana = 15, - damage = { 80, 100 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- royal star - itemid = 25759, - type = WEAPON_MISSILE, - level = 120, - unproperly = true, - breakchance = 30, - }, - { - -- spectral bolt - itemId = 25758, - type = WEAPON_AMMO, - level = 150, - unproperly = true, - action = "removecount", - }, - { - -- leaf star - itemid = 25735, - type = WEAPON_MISSILE, - level = 60, - unproperly = true, - breakchance = 40, - }, - { - -- dream blossom staff - itemId = 25700, - type = WEAPON_WAND, - wandType = "energy", - level = 80, - mana = 18, - damage = { 63, 77 }, - vocation = { - { "Sorcerer", true }, - { "Druid", true, true }, - { "Master Sorcerer" }, - { "Elder Druid" }, - }, - }, - { - -- rod of carving - itemId = 23339, - type = WEAPON_WAND, - wandType = "ice", - level = 100, - mana = 18, - damage = { 70, 105 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- wand of carving - itemId = 23335, - type = WEAPON_WAND, - wandType = "energy", - level = 100, - mana = 18, - damage = { 70, 105 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- crossbow of carving - itemId = 23331, - type = WEAPON_DISTANCE, - level = 100, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- bow of carving - itemId = 23327, - type = WEAPON_DISTANCE, - level = 100, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- hammer of carving - itemId = 23323, - type = WEAPON_CLUB, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- mace of carving - itemId = 23319, - type = WEAPON_CLUB, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- chopper of carving - itemId = 23315, - type = WEAPON_AXE, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- axe of carving - itemId = 23311, - type = WEAPON_AXE, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- slayer of carving - itemId = 23307, - type = WEAPON_SWORD, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- blade of carving - itemId = 23303, - type = WEAPON_SWORD, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- rod of remedy - itemId = 23299, - type = WEAPON_WAND, - wandType = "ice", - level = 100, - mana = 18, - damage = { 70, 105 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- wand of remedy - itemId = 23295, - type = WEAPON_WAND, - wandType = "energy", - level = 100, - mana = 18, - damage = { 70, 105 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- crossbow of remedy - itemId = 23291, - type = WEAPON_DISTANCE, - level = 100, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- bow of remedy - itemId = 23287, - type = WEAPON_DISTANCE, - level = 100, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- hammer of remedy - itemId = 23283, - type = WEAPON_CLUB, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- mace of remedy - itemId = 23279, - type = WEAPON_CLUB, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- chopper of remedy - itemId = 23275, - type = WEAPON_AXE, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- axe of remedy - itemId = 23271, - type = WEAPON_AXE, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- slayer of remedy - itemId = 23267, - type = WEAPON_SWORD, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- blade of remedy - itemId = 23263, - type = WEAPON_SWORD, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- rod of mayhem - itemId = 23232, - type = WEAPON_WAND, - wandType = "ice", - level = 100, - mana = 18, - damage = { 70, 105 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- wand of mayhem - itemId = 23231, - type = WEAPON_WAND, - wandType = "energy", - level = 100, - mana = 18, - damage = { 70, 105 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- crossbow of mayhem - itemId = 23230, - type = WEAPON_DISTANCE, - level = 100, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- bow of mayhem - itemId = 23229, - type = WEAPON_DISTANCE, - level = 100, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- hammer of mayhem - itemId = 23228, - type = WEAPON_CLUB, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- mace of mayhem - itemId = 23227, - type = WEAPON_CLUB, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- chopper of mayhem - itemId = 23226, - type = WEAPON_AXE, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- axe of mayhem - itemId = 23225, - type = WEAPON_AXE, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- slayer of mayhem - itemId = 23224, - type = WEAPON_SWORD, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- blade of mayhem - itemId = 23223, - type = WEAPON_SWORD, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- rift crossbow - itemId = 22867, - type = WEAPON_DISTANCE, - level = 120, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- rift bow - itemId = 22866, - type = WEAPON_DISTANCE, - level = 120, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- ferumbras' staff (enchanted) - itemId = 22766, - type = WEAPON_WAND, - wandType = "energy", - level = 100, - mana = 19, - damage = { 80, 110 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- ferumbras' staff (failed) - itemId = 22765, - type = WEAPON_WAND, - wandType = "energy", - level = 65, - mana = 17, - damage = { 65, 95 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- Ferumbras' staff - itemId = 22764, - type = WEAPON_CLUB, - level = 100, - unproperly = true, - }, - { - -- maimer - itemId = 22762, - type = WEAPON_CLUB, - level = 150, - unproperly = true, - }, - { - -- Impaler of the igniter - itemId = 22760, - type = WEAPON_SWORD, - level = 150, - unproperly = true, - }, - { - -- plague bite - itemId = 22759, - type = WEAPON_AXE, - level = 150, - unproperly = true, - }, - { - -- rift lance - itemId = 22727, - type = WEAPON_AXE, - level = 70, - unproperly = true, - }, - { - -- ogre sceptra - itemId = 22183, - type = WEAPON_WAND, - wandType = "earth", - level = 37, - mana = 13, - damage = { 56, 74 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- ogre choppa - itemId = 22172, - type = WEAPON_AXE, - level = 25, - unproperly = true, - }, - { - -- ogre klubba - itemId = 22171, - type = WEAPON_AXE, - level = 50, - unproperly = true, - }, - { - -- simple arrow - itemId = 21470, - type = WEAPON_AMMO, - action = "removecount", - }, - { - -- the chiller - itemId = 21350, - type = WEAPON_WAND, - wandType = "ice", - level = 1, - mana = 1, - damage = { 4, 8 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- the scorcher - itemId = 21348, - type = WEAPON_WAND, - wandType = "fire", - level = 1, - mana = 1, - damage = { 4, 8 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- one hit wonder - itemId = 21219, - type = WEAPON_CLUB, - level = 70, - unproperly = true, - }, - { - -- glooth axe - itemId = 21180, - type = WEAPON_AXE, - level = 75, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- glooth blade - itemId = 21179, - type = WEAPON_SWORD, - level = 75, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- glooth club - itemId = 21178, - type = WEAPON_CLUB, - level = 75, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- cowtana - itemId = 21177, - type = WEAPON_SWORD, - level = 25, - unproperly = true, - }, - { - -- execowtioner axe - itemId = 21176, - type = WEAPON_AXE, - level = 55, - unproperly = true, - }, - { - -- mino lance - itemId = 21174, - type = WEAPON_AXE, - level = 45, - unproperly = true, - }, - { - -- moohtant cudgel - itemId = 21173, - type = WEAPON_CLUB, - level = 60, - unproperly = true, - }, - { - -- glooth whip - itemId = 21172, - type = WEAPON_CLUB, - level = 25, - unproperly = true, - }, - { - -- metal bat - itemId = 21171, - type = WEAPON_CLUB, - level = 55, - unproperly = true, - }, - { - -- glooth spear - itemid = 21158, - type = WEAPON_MISSILE, - level = 60, - unproperly = true, - breakchance = 2, - }, - { - -- umbral master crossbow - itemId = 20087, - type = WEAPON_DISTANCE, - level = 250, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- umbral crossbow - itemId = 20086, - type = WEAPON_DISTANCE, - level = 120, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- crude umbral crossbow - itemId = 20085, - type = WEAPON_DISTANCE, - level = 75, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- umbral master bow - itemId = 20084, - type = WEAPON_DISTANCE, - level = 250, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- umbral bow - itemId = 20083, - type = WEAPON_DISTANCE, - level = 120, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- crude umbral bow - itemId = 20082, - type = WEAPON_DISTANCE, - level = 75, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- umbral master hammer - itemId = 20081, - type = WEAPON_CLUB, - level = 250, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral hammer - itemId = 20080, - type = WEAPON_CLUB, - level = 120, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crude umbral hammer - itemId = 20079, - type = WEAPON_CLUB, - level = 75, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral master mace - itemId = 20078, - type = WEAPON_CLUB, - level = 250, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral mace - itemId = 20077, - type = WEAPON_CLUB, - level = 120, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crude umbral mace - itemId = 20076, - type = WEAPON_CLUB, - level = 75, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral master chopper - itemId = 20075, - type = WEAPON_AXE, - level = 250, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral chopper - itemId = 20074, - type = WEAPON_AXE, - level = 120, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crude umbral chopper - itemId = 20073, - type = WEAPON_AXE, - level = 75, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral master axe - itemId = 20072, - type = WEAPON_AXE, - level = 250, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral axe - itemId = 20071, - type = WEAPON_AXE, - level = 120, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crude umbral axe - itemId = 20070, - type = WEAPON_AXE, - level = 75, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral master slayer - itemId = 20069, - type = WEAPON_SWORD, - level = 250, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral slayer - itemId = 20068, - type = WEAPON_SWORD, - level = 120, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crude umbral slayer - itemId = 20067, - type = WEAPON_SWORD, - level = 75, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral masterblade - itemId = 20066, - type = WEAPON_SWORD, - level = 250, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- umbral blade - itemId = 20065, - type = WEAPON_SWORD, - level = 120, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crude umbral blade - itemId = 20064, - type = WEAPON_SWORD, - level = 75, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- icicle bow - itemId = 19362, - type = WEAPON_DISTANCE, - unproperly = true, - }, - { - -- triple bolt crossbow - itemId = 19356, - type = WEAPON_DISTANCE, - level = 70, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- spiky club - itemId = 17859, - type = WEAPON_CLUB, - level = 20, - unproperly = true, - }, - { - -- pair of iron fists - itemId = 17828, - type = WEAPON_CLUB, - level = 50, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- swampling club - itemId = 17824, - type = WEAPON_CLUB, - }, - { - -- life preserver - itemId = 17813, - type = WEAPON_CLUB, - level = 15, - unproperly = true, - }, - { - -- ratana - itemId = 17812, - type = WEAPON_SWORD, - level = 15, - unproperly = true, - }, - { - -- sorc and druid staff - itemId = 17111, - type = WEAPON_WAND, - wandType = "energy", - level = 1, - mana = 2, - damage = { 8, 18 }, - vocation = { - { "None", true }, - }, - }, - { - -- mean paladin spear - itemid = 17110, - type = WEAPON_MISSILE, - breakchance = 3, - vocation = { - { "None", true }, - }, - }, - { - -- mean knight sword - itemId = 17109, - type = WEAPON_SWORD, - unproperly = true, - vocation = { - { "None", true }, - }, - }, - { - -- shiny blade - itemId = 16175, - type = WEAPON_SWORD, - level = 120, - unproperly = true, - }, - { - -- mycological bow - itemId = 16164, - type = WEAPON_DISTANCE, - level = 105, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- crystal crossbow - itemId = 16163, - type = WEAPON_DISTANCE, - level = 90, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- mycological mace - itemId = 16162, - type = WEAPON_CLUB, - level = 120, - unproperly = true, - }, - { - -- crystalline axe - itemId = 16161, - type = WEAPON_AXE, - level = 120, - unproperly = true, - }, - { - -- crystalline sword - itemId = 16160, - type = WEAPON_SWORD, - level = 62, - unproperly = true, - }, - { - -- envenomed arrow - itemid = 16143, - type = WEAPON_AMMO, - level = 70, - unproperly = true, - action = "removecount", - }, - { - -- drill bolt - itemId = 16142, - type = WEAPON_AMMO, - level = 70, - unproperly = true, - action = "removecount", - }, - { - -- prismatic bolt - itemId = 16141, - type = WEAPON_AMMO, - level = 90, - unproperly = true, - action = "removecount", - }, - { - -- glacial rod - itemId = 16118, - type = WEAPON_WAND, - wandType = "ice", - level = 65, - mana = 17, - damage = { 75, 95 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- muck rod - itemId = 16117, - type = WEAPON_WAND, - wandType = "earth", - level = 65, - mana = 17, - damage = { 75, 95 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- wand of everblazing - itemId = 16115, - type = WEAPON_WAND, - wandType = "fire", - level = 65, - mana = 17, - damage = { 75, 95 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of defiance - itemId = 16096, - type = WEAPON_WAND, - wandType = "energy", - level = 65, - mana = 17, - damage = { 75, 95 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- crystalline arrow - itemid = 15793, - type = WEAPON_AMMO, - level = 90, - unproperly = true, - action = "removecount", - }, - { - -- crystal bolt - itemId = 15792, - type = WEAPON_AMMO, - action = "removecount", - }, - { - -- thorn spitter - itemId = 14768, - type = WEAPON_DISTANCE, - level = 150, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- vortex bolt - itemId = 14252, - type = WEAPON_AMMO, - level = 40, - unproperly = true, - action = "removecount", - }, - { - -- tarsal arrow - itemid = 14251, - type = WEAPON_AMMO, - level = 30, - unproperly = true, - action = "removecount", - }, - { - -- deepling squelcher - itemId = 14250, - type = WEAPON_CLUB, - level = 48, - unproperly = true, - }, - { - -- ornate crossbow - itemId = 14247, - type = WEAPON_DISTANCE, - level = 50, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- hive bow - itemId = 14246, - type = WEAPON_DISTANCE, - level = 85, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- hive scythe - itemId = 14089, - type = WEAPON_AXE, - level = 70, - unproperly = true, - }, - { - -- guardian axe - itemId = 14043, - type = WEAPON_AXE, - level = 50, - unproperly = true, - }, - { - -- warrior's axe - itemId = 14040, - type = WEAPON_AXE, - level = 40, - unproperly = true, - }, - { - -- ornate mace - itemId = 14001, - type = WEAPON_CLUB, - level = 90, - unproperly = true, - }, - { - -- deepling axe - itemId = 13991, - type = WEAPON_AXE, - level = 80, - unproperly = true, - }, - { - -- deepling staff - itemId = 13987, - type = WEAPON_CLUB, - level = 38, - unproperly = true, - }, - { - -- shimmer wand - itemId = 12741, - type = WEAPON_WAND, - wandType = "energy", - level = 40, - mana = 13, - damage = { 56, 74 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- shimmer bow - itemId = 12733, - type = WEAPON_DISTANCE, - level = 40, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- shimmer rod - itemId = 12732, - type = WEAPON_WAND, - wandType = "ice", - level = 40, - mana = 13, - damage = { 56, 74 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- shimmer sword - itemId = 12731, - type = WEAPON_SWORD, - level = 40, - unproperly = true, - }, - { - -- heavy trident - itemId = 12683, - type = WEAPON_AXE, - level = 25, - unproperly = true, - }, - { - -- wooden sword - itemId = 12673, - type = WEAPON_SWORD, - }, - { - -- wand of dimensions - itemId = 12603, - type = WEAPON_WAND, - wandType = "death", - level = 37, - mana = 9, - damage = { 44, 62 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- blade of corruption - itemId = 11693, - type = WEAPON_SWORD, - level = 82, - unproperly = true, - }, - { - -- snake god's sceptre - itemId = 11692, - type = WEAPON_CLUB, - level = 82, - unproperly = true, - }, - { - -- twiceslicer - itemId = 11657, - type = WEAPON_SWORD, - level = 58, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- Zaoan halberd - itemId = 10406, - type = WEAPON_AXE, - level = 25, - unproperly = true, - }, - { - -- twin hooks - itemId = 10392, - type = WEAPON_SWORD, - level = 20, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- drachaku - itemId = 10391, - type = WEAPON_CLUB, - level = 55, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- Zaoan sword - itemId = 10390, - type = WEAPON_SWORD, - level = 55, - unproperly = true, - }, - { - -- sai - itemId = 10389, - type = WEAPON_SWORD, - level = 50, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- drakinata - itemId = 10388, - type = WEAPON_AXE, - level = 60, - unproperly = true, - }, - { - -- incredible mumpiz slayer - itemId = 9396, - type = WEAPON_SWORD, - }, - { - -- poet's fencing quill - itemId = 9387, - type = WEAPON_SWORD, - }, - { - -- farmer's avenger - itemId = 9386, - type = WEAPON_AXE, - }, - { - -- club of the fury - itemId = 9385, - type = WEAPON_CLUB, - }, - { - -- scythe of the reaper - itemId = 9384, - type = WEAPON_AXE, - }, - { - -- musician's bow - itemId = 9378, - type = WEAPON_DISTANCE, - }, - { - -- stale bread of ancientness - itemId = 9376, - type = WEAPON_CLUB, - }, - { - -- pointed rabbitslayer - itemId = 9375, - type = WEAPON_SWORD, - }, - { - -- glutton's mace - itemId = 9373, - type = WEAPON_CLUB, - }, - { - -- the calamity - itemId = 8104, - type = WEAPON_SWORD, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- the epiphany - itemId = 8103, - type = WEAPON_SWORD, - level = 120, - unproperly = true, - }, - { - -- emerald sword - itemId = 8102, - type = WEAPON_SWORD, - level = 100, - unproperly = true, - }, - { - -- the stomper - itemId = 8101, - type = WEAPON_CLUB, - level = 100, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- obsidian truncheon - itemId = 8100, - type = WEAPON_CLUB, - level = 100, - unproperly = true, - }, - { - -- dark trinity mace - itemId = 8099, - type = WEAPON_CLUB, - level = 120, - unproperly = true, - }, - { - -- demonwing axe - itemId = 8098, - type = WEAPON_AXE, - level = 120, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- solar axe - itemId = 8097, - type = WEAPON_AXE, - level = 130, - unproperly = true, - }, - { - -- hellforged axe - itemId = 8096, - type = WEAPON_AXE, - level = 110, - unproperly = true, - }, - { - -- wand of voodoo - itemId = 8094, - type = WEAPON_WAND, - wandType = "death", - level = 42, - mana = 13, - damage = { 56, 74 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of draconia - itemId = 8093, - type = WEAPON_WAND, - wandType = "fire", - level = 22, - mana = 5, - damage = { 23, 37 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of starmstorm - itemId = 8092, - type = WEAPON_WAND, - wandType = "energy", - level = 37, - mana = 13, - damage = { 56, 74 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- springsprout rod - itemId = 8084, - type = WEAPON_WAND, - wandType = "earth", - level = 37, - mana = 13, - damage = { 56, 74 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- northwind rod - itemId = 8083, - type = WEAPON_WAND, - wandType = "ice", - level = 22, - mana = 5, - damage = { 23, 37 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- underworld rod - itemId = 8082, - type = WEAPON_WAND, - wandType = "death", - level = 42, - mana = 13, - damage = { 56, 74 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- elethriel's elemental bow - itemId = 8030, - type = WEAPON_DISTANCE, - level = 70, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- silkweaver bow - itemId = 8029, - type = WEAPON_DISTANCE, - level = 40, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- yol's bow - itemId = 8028, - type = WEAPON_DISTANCE, - level = 60, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- composite hornbow - itemId = 8027, - type = WEAPON_DISTANCE, - level = 50, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- warsinger bow - itemId = 8026, - type = WEAPON_DISTANCE, - level = 80, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- ironworker - itemId = 8025, - type = WEAPON_DISTANCE, - level = 80, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- devileye - itemId = 8024, - type = WEAPON_DISTANCE, - level = 100, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- royal crossbow - itemId = 8023, - type = WEAPON_DISTANCE, - level = 130, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- chain bolter - itemId = 8022, - type = WEAPON_DISTANCE, - level = 60, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- modified crossbow - itemId = 8021, - type = WEAPON_DISTANCE, - level = 45, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- jagged sword - itemId = 7774, - type = WEAPON_SWORD, - }, - { - -- steel axe - itemId = 7773, - type = WEAPON_AXE, - }, - { - -- crimson sword - itemId = 860, - type = WEAPON_SWORD, - }, - { - -- energy war hammer - itemId = 810, - type = WEAPON_CLUB, - level = 50, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- energy orcish maul - itemId = 809, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - action = "removecharge", - }, - { - -- energy cranial basher - itemId = 808, - type = WEAPON_CLUB, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- energy crystal mace - itemId = 807, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - action = "removecharge", - }, - { - -- energy clerical mace - itemId = 806, - type = WEAPON_CLUB, - level = 20, - unproperly = true, - action = "removecharge", - }, - { - -- energy war axe - itemId = 805, - type = WEAPON_AXE, - level = 65, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- energy headchopper - itemId = 804, - type = WEAPON_AXE, - level = 35, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- energy heroic axe - itemId = 803, - type = WEAPON_AXE, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- energy knight axe - itemId = 802, - type = WEAPON_AXE, - level = 25, - unproperly = true, - action = "removecharge", - }, - { - -- energy barbarian axe - itemId = 801, - type = WEAPON_AXE, - level = 20, - unproperly = true, - action = "removecharge", - }, - { - -- energy dragon slayer - itemId = 798, - type = WEAPON_SWORD, - level = 45, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- energy blacksteel sword - itemId = 797, - type = WEAPON_SWORD, - level = 35, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- energy mystic blade - itemId = 796, - type = WEAPON_SWORD, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- energy relic sword - itemId = 795, - type = WEAPON_SWORD, - level = 50, - unproperly = true, - action = "removecharge", - }, - { - -- energy spike sword - itemId = 794, - type = WEAPON_SWORD, - action = "removecharge", - }, - { - -- earth war hammer - itemId = 793, - type = WEAPON_CLUB, - level = 50, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- earth orcish maul - itemId = 792, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - action = "removecharge", - }, - { - -- earth cranial basher - itemId = 791, - type = WEAPON_CLUB, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- earth crystal mace - itemId = 790, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - action = "removecharge", - }, - { - -- earth clerical mace - itemId = 789, - type = WEAPON_CLUB, - level = 20, - unproperly = true, - action = "removecharge", - }, - { - -- earth war axe - itemId = 788, - type = WEAPON_AXE, - level = 65, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- earth headchopper - itemId = 787, - type = WEAPON_AXE, - level = 35, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- earth heroic axe - itemId = 786, - type = WEAPON_AXE, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- earth knight axe - itemId = 785, - type = WEAPON_AXE, - level = 25, - unproperly = true, - action = "removecharge", - }, - { - -- earth barbarian axe - itemId = 784, - type = WEAPON_AXE, - level = 20, - unproperly = true, - action = "removecharge", - }, - { - -- earth dragon slayer - itemId = 783, - type = WEAPON_SWORD, - level = 45, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- earth blacksteel sword - itemId = 782, - type = WEAPON_SWORD, - level = 35, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- earth mystic blade - itemId = 781, - type = WEAPON_SWORD, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- earth relic sword - itemId = 780, - type = WEAPON_SWORD, - level = 50, - unproperly = true, - action = "removecharge", - }, - { - -- earth spike sword - itemId = 779, - type = WEAPON_SWORD, - action = "removecharge", - }, - { - -- earth arrow - itemid = 774, - type = WEAPON_AMMO, - level = 20, - unproperly = true, - action = "removecount", - }, - { - -- flaming arrow - itemid = 763, - type = WEAPON_AMMO, - level = 20, - unproperly = true, - action = "removecount", - }, - { - -- shiver arrow - itemid = 762, - type = WEAPON_AMMO, - level = 20, - unproperly = true, - action = "removecount", - }, - { - -- flash arrow - itemid = 761, - type = WEAPON_AMMO, - level = 20, - unproperly = true, - action = "removecount", - }, - { - -- icy war hammer - itemId = 693, - type = WEAPON_CLUB, - level = 50, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- icy orcish maul - itemId = 692, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - action = "removecharge", - }, - { - -- icy cranial basher - itemId = 691, - type = WEAPON_CLUB, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- icy crystal mace - itemId = 690, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - action = "removecharge", - }, - { - -- icy clerical mace - itemId = 689, - type = WEAPON_CLUB, - level = 20, - unproperly = true, - action = "removecharge", - }, - { - -- icy war axe - itemId = 688, - type = WEAPON_AXE, - level = 65, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- icy headchopper - itemId = 687, - type = WEAPON_AXE, - level = 35, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- icy heroic axe - itemId = 686, - type = WEAPON_AXE, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- icy knight axe - itemId = 685, - type = WEAPON_AXE, - level = 25, - unproperly = true, - action = "removecharge", - }, - { - -- icy barbarian axe - itemId = 684, - type = WEAPON_AXE, - level = 20, - unproperly = true, - action = "removecharge", - }, - { - -- icy dragon slayer - itemId = 683, - type = WEAPON_SWORD, - level = 45, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- icy blacksteel sword - itemId = 682, - type = WEAPON_SWORD, - level = 35, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- icy mystic blade - itemId = 681, - type = WEAPON_SWORD, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- icy relic sword - itemId = 680, - type = WEAPON_SWORD, - level = 50, - unproperly = true, - action = "removecharge", - }, - { - -- icy spike sword - itemId = 679, - type = WEAPON_SWORD, - action = "removecharge", - }, - { - -- fiery war hammer - itemId = 674, - type = WEAPON_CLUB, - level = 50, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fiery orcish maul - itemId = 673, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - action = "removecharge", - }, - { - -- fiery cranial basher - itemId = 672, - type = WEAPON_CLUB, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- fiery crystal mace - itemId = 671, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - action = "removecharge", - }, - { - -- fiery clerical mace - itemId = 670, - type = WEAPON_CLUB, - level = 20, - unproperly = true, - action = "removecharge", - }, - { - -- fiery war axe - itemId = 669, - type = WEAPON_AXE, - level = 65, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fiery headchopper - itemId = 668, - type = WEAPON_AXE, - level = 35, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fiery heroic axe - itemId = 667, - type = WEAPON_AXE, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- fiery knight axe - itemId = 666, - type = WEAPON_AXE, - level = 25, - unproperly = true, - action = "removecharge", - }, - { - -- fiery barbarian axe - itemId = 665, - type = WEAPON_AXE, - level = 20, - unproperly = true, - action = "removecharge", - }, - { - -- fiery dragon slayer - itemId = 664, - type = WEAPON_SWORD, - level = 45, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fiery blacksteel sword - itemId = 663, - type = WEAPON_SWORD, - level = 35, - unproperly = true, - action = "removecharge", - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fiery mystic blade - itemId = 662, - type = WEAPON_SWORD, - level = 60, - unproperly = true, - action = "removecharge", - }, - { - -- fiery relic sword - itemId = 661, - type = WEAPON_SWORD, - level = 50, - unproperly = true, - action = "removecharge", - }, - { - -- fiery spike sword - itemId = 660, - type = WEAPON_SWORD, - action = "removecharge", - }, - { - -- noble axe - itemId = 7456, - type = WEAPON_AXE, - level = 35, - unproperly = true, - }, - { - -- mythril axe - itemId = 7455, - type = WEAPON_AXE, - level = 80, - unproperly = true, - }, - { - -- glorious axe - itemId = 7454, - type = WEAPON_AXE, - level = 30, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- executioner - itemId = 7453, - type = WEAPON_AXE, - level = 85, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- spiked squelcher - itemId = 7452, - type = WEAPON_CLUB, - level = 30, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- shadow sceptre - itemId = 7451, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - }, - { - -- hammer of prophecy - itemId = 7450, - type = WEAPON_CLUB, - level = 120, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crystal sword - itemId = 7449, - type = WEAPON_SWORD, - level = 25, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- elvish bow - itemId = 7438, - type = WEAPON_DISTANCE, - }, - { - -- sapphire hammer - itemId = 7437, - type = WEAPON_CLUB, - level = 30, - unproperly = true, - }, - { - -- angelic axe - itemId = 7436, - type = WEAPON_AXE, - level = 45, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- impaler - itemId = 7435, - type = WEAPON_AXE, - level = 85, - unproperly = true, - }, - { - -- royal axe - itemId = 7434, - type = WEAPON_AXE, - level = 75, - unproperly = true, - }, - { - -- ravenwing - itemId = 7433, - type = WEAPON_AXE, - level = 65, - unproperly = true, - }, - { - -- furry club - itemId = 7432, - type = WEAPON_CLUB, - level = 20, - unproperly = true, - }, - { - -- demonbone - itemId = 7431, - type = WEAPON_CLUB, - level = 80, - unproperly = true, - }, - { - -- dragonbone staff - itemId = 7430, - type = WEAPON_CLUB, - level = 30, - unproperly = true, - }, - { - -- blessed sceptre - itemId = 7429, - type = WEAPON_CLUB, - level = 75, - unproperly = true, - }, - { - -- bonebreaker - itemId = 7428, - type = WEAPON_CLUB, - level = 55, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- chaos mace - itemId = 7427, - type = WEAPON_CLUB, - level = 45, - unproperly = true, - }, - { - -- amber staff - itemId = 7426, - type = WEAPON_CLUB, - level = 40, - unproperly = true, - }, - { - -- taurus mace - itemId = 7425, - type = WEAPON_CLUB, - level = 20, - unproperly = true, - }, - { - -- lunar staff - itemId = 7424, - type = WEAPON_CLUB, - level = 30, - unproperly = true, - }, - { - -- skullcrusher - itemId = 7423, - type = WEAPON_CLUB, - level = 85, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- jade hammer - itemId = 7422, - type = WEAPON_CLUB, - level = 70, - unproperly = true, - }, - { - -- onyx flail - itemId = 7421, - type = WEAPON_CLUB, - level = 65, - unproperly = true, - }, - { - -- reaper's axe - itemId = 7420, - type = WEAPON_AXE, - level = 70, - unproperly = true, - }, - { - -- dreaded cleaver - itemId = 7419, - type = WEAPON_AXE, - level = 40, - unproperly = true, - }, - { - -- nightmare blade - itemId = 7418, - type = WEAPON_SWORD, - level = 70, - unproperly = true, - }, - { - -- runed sword - itemId = 7417, - type = WEAPON_SWORD, - level = 65, - unproperly = true, - }, - { - -- bloody edge - itemId = 7416, - type = WEAPON_SWORD, - level = 55, - unproperly = true, - }, - { - -- cranial basher - itemId = 7415, - type = WEAPON_CLUB, - level = 60, - unproperly = true, - }, - { - -- abyss hammer - itemId = 7414, - type = WEAPON_CLUB, - level = 60, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- titan axe - itemId = 7413, - type = WEAPON_AXE, - level = 40, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- butcher's axe - itemId = 7412, - type = WEAPON_AXE, - level = 45, - unproperly = true, - }, - { - -- ornamented axe - itemId = 7411, - type = WEAPON_AXE, - level = 50, - unproperly = true, - }, - { - -- queen's sceptre - itemId = 7410, - type = WEAPON_CLUB, - level = 55, - unproperly = true, - }, - { - -- northern star - itemId = 7409, - type = WEAPON_CLUB, - level = 50, - unproperly = true, - }, - { - -- wyvern fang - itemId = 7408, - type = WEAPON_SWORD, - level = 25, - unproperly = true, - }, - { - -- haunted blade - itemId = 7407, - type = WEAPON_SWORD, - level = 30, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- blacksteel sword - itemId = 7406, - type = WEAPON_SWORD, - level = 35, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- havoc blade - itemId = 7405, - type = WEAPON_SWORD, - level = 70, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- assassin dagger - itemId = 7404, - type = WEAPON_SWORD, - level = 40, - unproperly = true, - }, - { - -- berserker - itemId = 7403, - type = WEAPON_SWORD, - level = 65, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- dragon slayer - itemId = 7402, - type = WEAPON_SWORD, - level = 45, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- orcish maul - itemId = 7392, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - }, - { - -- thaian sword - itemId = 7391, - type = WEAPON_SWORD, - level = 50, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- the justice seeker - itemId = 7390, - type = WEAPON_SWORD, - level = 75, - unproperly = true, - }, - { - -- heroic axe - itemId = 7389, - type = WEAPON_AXE, - level = 60, - unproperly = true, - }, - { - -- vile axe - itemId = 7388, - type = WEAPON_AXE, - level = 55, - unproperly = true, - }, - { - -- diamond sceptre - itemId = 7387, - type = WEAPON_CLUB, - level = 25, - unproperly = true, - }, - { - -- mercenary sword - itemId = 7386, - type = WEAPON_SWORD, - level = 40, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- crimson sword - itemId = 7385, - type = WEAPON_SWORD, - level = 20, - unproperly = true, - }, - { - -- mystic blade - itemId = 7384, - type = WEAPON_SWORD, - level = 60, - unproperly = true, - }, - { - -- relic sword - itemId = 7383, - type = WEAPON_SWORD, - level = 50, - unproperly = true, - }, - { - -- demonrage sword - itemId = 7382, - type = WEAPON_SWORD, - level = 60, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- mammoth whopper - itemId = 7381, - type = WEAPON_CLUB, - level = 20, - unproperly = true, - }, - { - -- headchopper - itemId = 7380, - type = WEAPON_AXE, - level = 35, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- brutetamer's staff - itemId = 7379, - type = WEAPON_CLUB, - level = 25, - unproperly = true, - }, - { - -- royal spear - itemid = 7378, - type = WEAPON_MISSILE, - level = 25, - unproperly = true, - breakchance = 3, - }, - { - -- assassin star - itemid = 7368, - type = WEAPON_MISSILE, - level = 80, - unproperly = true, - breakchance = 33, - }, - { - -- enchanted spear - itemid = 7367, - type = WEAPON_MISSILE, - level = 42, - unproperly = true, - breakchance = 1, - }, - { - -- onyx arrow - itemid = 7365, - type = WEAPON_AMMO, - level = 40, - unproperly = true, - action = "removecount", - }, - { - -- sniper arrow - itemid = 7364, - type = WEAPON_AMMO, - level = 20, - unproperly = true, - action = "removecount", - }, - { - -- piercing bolt - itemId = 7363, - type = WEAPON_AMMO, - level = 30, - unproperly = true, - action = "removecount", - }, - { - -- ruthless axe - itemId = 6553, - type = WEAPON_AXE, - level = 75, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- infernal bolt - itemId = 6528, - type = WEAPON_AMMO, - level = 110, - unproperly = true, - action = "removecount", - }, - { - -- the avenger - itemId = 6527, - type = WEAPON_SWORD, - level = 75, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- Ron the Ripper's sabre - itemId = 6101, - type = WEAPON_SWORD, - }, - { - -- arbalest - itemId = 5803, - type = WEAPON_DISTANCE, - level = 75, - unproperly = true, - vocation = { - { "Paladin", true }, - { "Royal Paladin" }, - }, - }, - { - -- banana staff - itemId = 3348, - type = WEAPON_CLUB, - }, - { - -- hunting spear - itemId = 3347, - type = WEAPON_MISSILE, - level = 20, - unproperly = true, - breakchance = 6, - }, - { - -- ripper lance - itemId = 3346, - type = WEAPON_AXE, - }, - { - -- templar scytheblade - itemId = 3345, - type = WEAPON_SWORD, - }, - { - -- beastslayer axe - itemId = 3344, - type = WEAPON_AXE, - level = 30, - unproperly = true, - }, - { - -- lich staff - itemId = 3343, - type = WEAPON_CLUB, - level = 40, - unproperly = true, - }, - { - -- scythe - itemId = 3453, - type = WEAPON_CLUB, - }, - { - -- power bolt - itemId = 3450, - type = WEAPON_AMMO, - level = 55, - unproperly = true, - action = "removecount", - }, - { - -- arrow - itemId = 3447, - type = WEAPON_AMMO, - action = "removecount", - }, - { - -- bolt - itemId = 3446, - type = WEAPON_AMMO, - action = "removecount", - }, - { - -- bow - itemId = 3350, - type = WEAPON_DISTANCE, - }, - { - -- crossbow - itemId = 3349, - type = WEAPON_DISTANCE, - }, - { - -- war axe - itemId = 3342, - type = WEAPON_AXE, - level = 65, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- arcane staff - itemId = 3341, - type = WEAPON_CLUB, - level = 75, - unproperly = true, - }, - { - -- heavy mace - itemId = 3340, - type = WEAPON_CLUB, - level = 70, - unproperly = true, - }, - { - -- djinn blade - itemId = 3339, - type = WEAPON_SWORD, - level = 35, - unproperly = true, - }, - { - -- bone sword - itemId = 3338, - type = WEAPON_SWORD, - }, - { - -- bone club - itemId = 3337, - type = WEAPON_CLUB, - }, - { - -- studded club - itemId = 3336, - type = WEAPON_CLUB, - }, - { - -- twin axe - itemId = 3335, - type = WEAPON_AXE, - level = 50, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- pharaoh sword - itemId = 3334, - type = WEAPON_SWORD, - level = 45, - unproperly = true, - }, - { - -- crystal mace - itemId = 3333, - type = WEAPON_CLUB, - level = 35, - unproperly = true, - }, - { - -- hammer of wrath - itemId = 3332, - type = WEAPON_CLUB, - level = 65, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- ravager's axe - itemId = 3331, - type = WEAPON_AXE, - level = 70, - unproperly = true, - }, - { - -- heavy machete - itemId = 3330, - type = WEAPON_SWORD, - }, - { - -- daramian axe - itemId = 3329, - type = WEAPON_AXE, - }, - { - -- daramian waraxe - itemId = 3328, - type = WEAPON_AXE, - level = 25, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- daramian mace - itemId = 3327, - type = WEAPON_CLUB, - }, - { - -- epee - itemId = 3326, - type = WEAPON_SWORD, - level = 30, - unproperly = true, - }, - { - -- light mace - itemId = 3325, - type = WEAPON_CLUB, - }, - { - -- skull staff - itemId = 3324, - type = WEAPON_CLUB, - level = 30, - unproperly = true, - }, - { - -- dwarven axe - itemId = 3323, - type = WEAPON_AXE, - level = 20, - unproperly = true, - }, - { - -- dragon hammer - itemId = 3322, - type = WEAPON_CLUB, - level = 25, - unproperly = true, - }, - { - -- enchanted staff - itemId = 3321, - type = WEAPON_CLUB, - }, - { - -- fire axe - itemId = 3320, - type = WEAPON_AXE, - level = 35, - unproperly = true, - }, - { - -- stonecutter axe - itemId = 3319, - type = WEAPON_AXE, - level = 90, - unproperly = true, - }, - { - -- knight axe - itemId = 3318, - type = WEAPON_AXE, - level = 25, - unproperly = true, - }, - { - -- barbarian axe - itemId = 3317, - type = WEAPON_AXE, - level = 20, - unproperly = true, - }, - { - -- orcish axe - itemId = 3316, - type = WEAPON_AXE, - }, - { - -- guardian halberd - itemId = 3315, - type = WEAPON_AXE, - level = 55, - unproperly = true, - }, - { - -- naginata - itemId = 3314, - type = WEAPON_AXE, - level = 25, - unproperly = true, - }, - { - -- obsidian lance - itemId = 3313, - type = WEAPON_AXE, - level = 20, - unproperly = true, - }, - { - -- silver mace - itemId = 3312, - type = WEAPON_CLUB, - level = 45, - unproperly = true, - }, - { - -- clerical mace - itemId = 3311, - type = WEAPON_CLUB, - level = 20, - unproperly = true, - }, - { - -- iron hammer - itemId = 3310, - type = WEAPON_CLUB, - }, - { - -- thunder hammer - itemId = 3309, - type = WEAPON_CLUB, - level = 85, - unproperly = true, - }, - { - -- machete - itemId = 3308, - type = WEAPON_SWORD, - }, - { - -- scimitar - itemId = 3307, - type = WEAPON_SWORD, - }, - { - -- golden sickle - itemId = 3306, - type = WEAPON_AXE, - }, - { - -- battle hammer - itemId = 3305, - type = WEAPON_CLUB, - }, - { - -- crowbar - itemId = 3304, - type = WEAPON_CLUB, - }, - { - -- great axe - itemId = 3303, - type = WEAPON_AXE, - level = 95, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- dragon lance - itemId = 3302, - type = WEAPON_AXE, - level = 60, - unproperly = true, - }, - { - -- broadsword - itemId = 3301, - type = WEAPON_SWORD, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- katana - itemId = 3300, - type = WEAPON_SWORD, - }, - { - -- poison dagger - itemid = 3299, - type = WEAPON_SWORD, - }, - { - -- throwing knife - itemid = 3298, - type = WEAPON_MISSILE, - breakchance = 7, - }, - { - -- serpent sword - itemId = 3297, - type = WEAPON_SWORD, - }, - { - -- warlord sword - itemId = 3296, - type = WEAPON_SWORD, - level = 120, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- bright sword - itemId = 3295, - type = WEAPON_SWORD, - }, - { - -- short sword - itemId = 3294, - type = WEAPON_SWORD, - }, - { - -- sickle - itemId = 3293, - type = WEAPON_AXE, - }, - { - -- combat knife - itemId = 3292, - type = WEAPON_SWORD, - }, - { - -- knife - itemId = 3291, - type = WEAPON_SWORD, - }, - { - -- silver dagger - itemId = 3290, - type = WEAPON_SWORD, - }, - { - -- staff - itemId = 3289, - type = WEAPON_CLUB, - }, - { - -- magic sword - itemId = 3288, - type = WEAPON_SWORD, - level = 80, - unproperly = true, - }, - { - -- throwing star - itemId = 3287, - type = WEAPON_MISSILE, - breakchance = 10, - }, - { - -- mace - itemId = 3286, - type = WEAPON_CLUB, - }, - { - -- longsword - itemId = 3285, - type = WEAPON_SWORD, - }, - { - -- ice rapier - itemId = 3284, - type = WEAPON_SWORD, - action = "removecharge", - }, - { - -- carlin sword - itemId = 3283, - type = WEAPON_SWORD, - }, - { - -- morning star - itemId = 3282, - type = WEAPON_CLUB, - }, - { - -- giant sword - itemId = 3281, - type = WEAPON_SWORD, - level = 55, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- fire sword - itemId = 3280, - type = WEAPON_SWORD, - level = 30, - unproperly = true, - }, - { - -- war hammer - itemId = 3279, - type = WEAPON_CLUB, - level = 50, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- magic longsword - itemId = 3278, - type = WEAPON_SWORD, - level = 140, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- spear - itemId = 3277, - type = WEAPON_MISSILE, - breakchance = 3, - }, - { - -- hatchet - itemId = 3276, - type = WEAPON_AXE, - }, - { - -- double axe - itemId = 3275, - type = WEAPON_AXE, - level = 25, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- axe - itemId = 3274, - type = WEAPON_AXE, - }, - { - -- sabre - itemId = 3273, - type = WEAPON_SWORD, - }, - { - -- rapier - itemId = 3272, - type = WEAPON_SWORD, - }, - { - -- spike sword - itemId = 3271, - type = WEAPON_SWORD, - }, - { - -- club - itemId = 3270, - type = WEAPON_CLUB, - }, - { - -- halberd - itemId = 3269, - type = WEAPON_AXE, - level = 25, - unproperly = true, - }, - { - -- hand axe - itemId = 3268, - type = WEAPON_AXE, - }, - { - -- dagger - itemId = 3267, - type = WEAPON_SWORD, - }, - { - -- battle axe - itemId = 3266, - type = WEAPON_AXE, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- two handed sword - itemId = 3265, - type = WEAPON_SWORD, - level = 20, - unproperly = true, - vocation = { - { "Knight", true }, - { "Elite Knight" }, - }, - }, - { - -- sword - itemId = 3264, - type = WEAPON_SWORD, - }, - { - -- giant smithhammer - itemId = 3208, - type = WEAPON_CLUB, - }, - { - -- wand of dragonbreath - itemId = 3075, - type = WEAPON_WAND, - wandType = "fire", - level = 13, - mana = 3, - damage = { 13, 25 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of vortex - itemId = 3074, - type = WEAPON_WAND, - wandType = "energy", - level = 6, - mana = 1, - damage = { 8, 18 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of cosmic energy - itemId = 3073, - type = WEAPON_WAND, - wandType = "energy", - level = 26, - mana = 8, - damage = { 37, 53 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of decay - itemId = 3072, - type = WEAPON_WAND, - wandType = "death", - level = 19, - mana = 5, - damage = { 23, 37 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- wand of inferno - itemId = 3071, - type = WEAPON_WAND, - wandType = "fire", - level = 33, - mana = 8, - damage = { 56, 74 }, - vocation = { - { "Sorcerer", true }, - { "Master Sorcerer" }, - }, - }, - { - -- moonlight rod - itemId = 3070, - type = WEAPON_WAND, - wandType = "ice", - level = 13, - mana = 3, - damage = { 13, 25 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- necrotic rod - itemId = 3069, - type = WEAPON_WAND, - wandType = "death", - level = 19, - mana = 5, - damage = { 23, 37 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- hailstorm rod - itemId = 3067, - type = WEAPON_WAND, - wandType = "ice", - level = 33, - mana = 13, - damage = { 56, 74 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- snakebit rod - itemId = 3066, - type = WEAPON_WAND, - wandType = "earth", - level = 6, - mana = 2, - damage = { 8, 18 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- terra rod - itemId = 3065, - type = WEAPON_WAND, - wandType = "earth", - level = 26, - mana = 8, - damage = { 37, 53 }, - vocation = { - { "Druid", true }, - { "Elder Druid" }, - }, - }, - { - -- snowball - itemid = 2992, - type = WEAPON_MISSILE, - action = "removecount", - }, - { - -- small stone - itemid = 1781, - type = WEAPON_MISSILE, - breakchance = 3, - }, -} - -for _, w in ipairs(weapons) do - local weapon = Weapon(w.type) - weapon:id(w.itemid or w.itemId) - - if w.action then - weapon:action(w.action) - end - if w.breakchance or w.breakChance then - weapon:breakChance(w.breakchance or w.breakChance) - end - if w.level then - weapon:level(w.level) - end - if w.mana then - weapon:mana(w.mana) - end - if w.unproperly then - weapon:wieldUnproperly(w.unproperly) - end - if w.damage then - weapon:damage(w.damage[1], w.damage[2]) - end - if w.wandtype or w.wandType then - weapon:element(w.wandtype or w.wandType) - end - if w.vocation then - for _, v in ipairs(w.vocation) do - weapon:vocation(v[1], v[2] or false, v[3] or false) - end - end - - weapon:register() -end diff --git a/data-otservbr-global/scripts/world_changes/fury_gates.lua b/data-otservbr-global/scripts/world_changes/fury_gates.lua new file mode 100644 index 00000000000..96700d0971a --- /dev/null +++ b/data-otservbr-global/scripts/world_changes/fury_gates.lua @@ -0,0 +1,72 @@ +local function furyWebhook(message) + Webhook.sendMessage(":fire: " .. message, announcementChannels["serverAnnouncements"]) +end + +local gates = { + { city = "Ab'dendriel", mapName = "abdendriel", exitPosition = Position(32680, 31720, 7) }, + { city = "Ankrahmun", mapName = "ankrahmun", exitPosition = Position(33269, 32841, 7) }, + { city = "Carlin", mapName = "carlin", exitPosition = Position(32263, 31848, 7) }, + { city = "Darashia", mapName = "darashia", exitPosition = Position(33304, 32371, 7) }, + { city = "Edron", mapName = "edron", exitPosition = Position(33221, 31923, 7) }, + { city = "Kazordoon", mapName = "kazordoon", exitPosition = Position(32575, 31981, 7) }, + { city = "Liberty Bay", mapName = "libertybay", exitPosition = Position(32348, 32693, 7) }, + { city = "Port Hope", mapName = "porthope", exitPosition = Position(32530, 32712, 7) }, + { city = "Thais", mapName = "thais", exitPosition = Position(32265, 32164, 7) }, + { city = "Venore", mapName = "venore", exitPosition = Position(32834, 32082, 7) }, +} + +local furyGates = GlobalEvent("Load Fury Gates") + +function furyGates.onStartup(interval) + local totalGates = #gates + if totalGates == 0 then + return true + end + + local gateId = math.random(1, totalGates) + local selectedGate = gates[gateId] + Game.loadMap(DATA_DIRECTORY .. "/world/world_changes/fury_gates/" .. selectedGate.mapName .. ".otbm") + Game.setStorageValue(GlobalStorage.FuryGates, gateId) + + logger.info("[World Change] Fury Gate has arrived in {}!", selectedGate.city) + addEvent(furyWebhook, 60000, (string.format("Fury Gate will be active in %s today", selectedGate.city))) + return true +end + +furyGates:register() + +local furyGatesTeleports = MoveEvent() + +function furyGatesTeleports.onStepIn(creature, item, position, fromPosition) + local player = creature:getPlayer() + if not player then + return true + end + + local gateId = Game.getStorageValue(GlobalStorage.FuryGates) + if not gates[gateId] then + return true + end + + if item.actionid == 9710 then + if not player:isPremium() or not player:isPromoted() or player:getLevel() < 60 then + player:teleportTo(fromPosition) + player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) + player:say("Only Premium promoted players of level 60 or higher are able to enter this portal.", TALKTYPE_MONSTER_SAY, false, player, fromPosition) + return true + end + + player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) + player:teleportTo(Position(33290, 31786, 13)) + player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) + elseif item.actionid == 9715 then + player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) + player:teleportTo(gates[gateId].exitPosition) + player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) + end + return true +end + +furyGatesTeleports:type("stepin") +furyGatesTeleports:aid(9710, 9715) +furyGatesTeleports:register() diff --git a/data-otservbr-global/scripts/world_changes/grimvale_respawn_event.lua b/data-otservbr-global/scripts/world_changes/grimvale_respawn_event.lua new file mode 100644 index 00000000000..b1cea5504e9 --- /dev/null +++ b/data-otservbr-global/scripts/world_changes/grimvale_respawn_event.lua @@ -0,0 +1,40 @@ +local grimvaleConfig = { + position = { fromPosition = Position(33330, 31670, 7), toPosition = Position(33350, 31690, 7) }, + spawnDay = 13, +} + +local function createRandomMonster(position, availableMonsters) + local tile = Tile(position) + if not tile or tile:getItemById(486) or tile:hasProperty(CONST_PROP_BLOCKSOLID) or tile:getTopCreature() then + return false + end + + local monsterName = availableMonsters[math.random(#availableMonsters)] + local monster = Game.createMonster(monsterName, position) + if monster then + monster:setSpawnPosition() + monster:remove() + end + return true +end + +local function spawnMonsters(monstersToSpawn) + for x = grimvaleConfig.position.fromPosition.x, grimvaleConfig.position.toPosition.x do + for y = grimvaleConfig.position.fromPosition.y, grimvaleConfig.position.toPosition.y do + if math.random(1000) >= 983 then + if createRandomMonster(Position(x, y, 7), monstersToSpawn) then + break + end + end + end + end +end + +local grimvaleRespawnEvent = GlobalEvent("GrimvaleRespawnEvent") + +function grimvaleRespawnEvent.onStartup() + spawnMonsters(grimvaleConfig.spawnDay == tonumber(os.date("%d")) and { "wereboar", "werebadger" } or { "bandit", "badger", "blue butterfly", "yellow butterfly" }) + return true +end + +grimvaleRespawnEvent:register() diff --git a/data-otservbr-global/scripts/world_changes/iron_servant_transformation.lua b/data-otservbr-global/scripts/world_changes/iron_servant_transformation.lua new file mode 100644 index 00000000000..65e6af5a3b2 --- /dev/null +++ b/data-otservbr-global/scripts/world_changes/iron_servant_transformation.lua @@ -0,0 +1,31 @@ +local ironServantTransformation = EventCallback() + +ironServantTransformation.monsterOnSpawn = function(monster, position) + if monster:getName():lower() ~= "iron servant replica" then + return + end + + local chance = math.random(100) + if Game.getStorageValue(GlobalStorage.ForgottenKnowledge.MechanismDiamond) >= 1 and Game.getStorageValue(GlobalStorage.ForgottenKnowledge.MechanismGolden) >= 1 then + if chance > 30 then + local monsterType = math.random(2) == 1 and "diamond servant replica" or "golden servant replica" + Game.createMonster(monsterType, monster:getPosition(), false, true) + monster:remove() + end + return + end + + if Game.getStorageValue(GlobalStorage.ForgottenKnowledge.MechanismDiamond) >= 1 and chance > 30 then + Game.createMonster("diamond servant replica", monster:getPosition(), false, true) + monster:remove() + return + end + + if Game.getStorageValue(GlobalStorage.ForgottenKnowledge.MechanismGolden) >= 1 and chance > 30 then + Game.createMonster("golden servant replica", monster:getPosition(), false, true) + monster:remove() + end + return true +end + +ironServantTransformation:register() diff --git a/data-otservbr-global/scripts/world_changes/nightmare_isles.lua b/data-otservbr-global/scripts/world_changes/nightmare_isles.lua new file mode 100644 index 00000000000..4d35a0dde12 --- /dev/null +++ b/data-otservbr-global/scripts/world_changes/nightmare_isles.lua @@ -0,0 +1,119 @@ +local function Nightmarewebhook(message) -- New local function that runs on delay to send webhook message. + Webhook.sendMessage(":thought_balloon: " .. message, announcementChannels["serverAnnouncements"]) +end + +local nightmareIsleConfig = { + { displayName = "North of Ankrahmun", mapName = "ankrahmun-north", storage = GlobalStorage.WorldBoard.NightmareIsle.AnkrahmunNorth }, + { displayName = "North of Darashia", mapName = "darashia-north", storage = GlobalStorage.WorldBoard.NightmareIsle.DarashiaNorth }, + { displayName = "West of Darashia", mapName = "darashia-west", storage = GlobalStorage.WorldBoard.NightmareIsle.DarashiaWest }, +} + +local nightmareIsleEvent = GlobalEvent("Nightmare Isle") + +function nightmareIsleEvent.onStartup() + for _, config in ipairs(nightmareIsleConfig) do + Game.setStorageValue(config.storage, -1) + end + + local randomMap = nightmareIsleConfig[math.random(#nightmareIsleConfig)] + Game.loadMap(DATA_DIRECTORY .. "/world/world_changes/nightmare_isle/" .. randomMap.mapName .. ".otbm") + Game.setStorageValue(randomMap.storage, 1) + + logger.info("[World Change] Nightmare Isle is active in " .. randomMap.displayName) + + addEvent(Nightmarewebhook, 60000, string.format("Nightmare Isle will be active %s today", randomMap.displayName)) + return true +end + +nightmareIsleEvent:register() + +local teleportExits = { + { position = Position(33255, 32678, 7), storage = GlobalStorage.WorldBoard.NightmareIsle.AnkrahmunNorth }, + { position = Position(33215, 32273, 7), storage = GlobalStorage.WorldBoard.NightmareIsle.DarashiaNorth }, + { position = Position(33032, 32400, 7), storage = GlobalStorage.WorldBoard.NightmareIsle.DarashiaWest }, +} + +local teleportExit = MoveEvent() + +function teleportExit.onStepIn(creature, item, position, fromPosition) + local player = creature:getPlayer() + if not player then + return + end + + for _, config in ipairs(teleportExits) do + if Game.getStorageValue(config.storage) == 1 then + player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) + player:teleportTo(config.position) + player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) + return true + end + end + return true +end + +teleportExit:uid(35020) +teleportExit:register() + +local teleportEntrace = MoveEvent() + +function teleportEntrace.onStepIn(creature, item, position, fromPosition) + local player = creature:getPlayer() + if not player then + return + end + + player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) + player:teleportTo(Position(33497, 32616, 8)) + player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) + return true +end + +teleportEntrace:uid(64001, 64002, 64003) +teleportEntrace:register() + +local teleportPositions = { + [64103] = Position(33475, 32641, 10), + [64104] = Position(33473, 32647, 9), + [64105] = Position(33463, 32585, 8), + [64106] = Position(33457, 32580, 8), + [64107] = Position(33422, 32582, 8), + [64108] = Position(33430, 32600, 10), + [64109] = Position(33420, 32604, 10), + [64120] = Position(33446, 32616, 11), + [64121] = Position(33460, 32632, 10), + [64122] = Position(33429, 32626, 10), + [64123] = Position(33425, 32633, 8), + [64124] = Position(33435, 32631, 8), + [64125] = Position(33478, 32621, 10), + [64126] = Position(33484, 32629, 8), + [64127] = Position(33452, 32617, 11), + [64128] = Position(33419, 32589, 10), +} + +local teleportLadder = MoveEvent() + +function teleportLadder.onStepIn(creature, item, position, fromPosition) + local player = creature:getPlayer() + if not player then + return true + end + + local targetPosition = teleportPositions[item.actionid] + if not targetPosition then + return true + end + + player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) + player:teleportTo(targetPosition) + player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) + return true +end + +teleportLadder:type("stepin") + +for index, value in pairs(teleportPositions) do + teleportLadder:aid(index) +end + +teleportLadder:register() diff --git a/data-otservbr-global/scripts/globalevents/worldchanges/oriental_trader.lua b/data-otservbr-global/scripts/world_changes/oriental_trader.lua similarity index 100% rename from data-otservbr-global/scripts/globalevents/worldchanges/oriental_trader.lua rename to data-otservbr-global/scripts/world_changes/oriental_trader.lua diff --git a/data-otservbr-global/scripts/world_changes/spawns_npc_by_time.lua b/data-otservbr-global/scripts/world_changes/spawns_npc_by_time.lua new file mode 100644 index 00000000000..4793055f8a0 --- /dev/null +++ b/data-otservbr-global/scripts/world_changes/spawns_npc_by_time.lua @@ -0,0 +1,28 @@ +local npcSpawns = { + { name = "Ghostly Wolf", spawnPeriod = LIGHT_STATE_SUNSET, despawnPeriod = LIGHT_STATE_SUNRISE, position = { x = 33332, y = 32052, z = 7 } }, + { name = "Talila", spawnPeriod = LIGHT_STATE_SUNSET, despawnPeriod = LIGHT_STATE_SUNRISE, position = { x = 33504, y = 32222, z = 7 } }, + { name = "Valindara", spawnPeriod = LIGHT_STATE_SUNRISE, despawnPeriod = LIGHT_STATE_SUNSET, position = { x = 33504, y = 32222, z = 7 } }, +} + +local spawnsNpcByTime = GlobalEvent("SpawnsNpcByTime") + +function spawnsNpcByTime.onPeriodChange(period) + for _, npcSpawn in ipairs(npcSpawns) do + if npcSpawn.spawnPeriod == period then + local spawnNpc = Game.createNpc(npcSpawn.name, npcSpawn.position) + if spawnNpc then + spawnNpc:setMasterPos(npcSpawn.position) + spawnNpc:getPosition():sendMagicEffect(CONST_ME_TELEPORT) + end + elseif npcSpawn.despawnPeriod == period then + local despawnNpc = Npc(npcSpawn.name) + if despawnNpc then + despawnNpc:getPosition():sendMagicEffect(CONST_ME_TELEPORT) + despawnNpc:remove() + end + end + end + return true +end + +spawnsNpcByTime:register() diff --git a/data-otservbr-global/scripts/world_changes/the_dream_courts.lua b/data-otservbr-global/scripts/world_changes/the_dream_courts.lua new file mode 100644 index 00000000000..bb3bcc3a6a8 --- /dev/null +++ b/data-otservbr-global/scripts/world_changes/the_dream_courts.lua @@ -0,0 +1,26 @@ +local dreamCourtsConfig = { + ["Monday"] = { map = "plagueroot", bossName = "Plagueroot" }, + ["Tuesday"] = { map = "malofur_mangrinder", bossName = "Malofur Mangrinder" }, + ["Wednesday"] = { map = "maxxenius", bossName = "Maxxenius" }, + ["Thursday"] = { map = "alptramun", bossName = "Alptramun" }, + ["Friday"] = { map = "izcandar_the_banished", bossName = "Izcandar the Banished" }, + ["Saturday"] = { map = "maxxenius", bossName = "Maxxenius" }, + ["Sunday"] = { map = "alptramun", bossName = "Alptramun" }, +} + +local dreamCourtsEvent = GlobalEvent("DreamCourts") + +function dreamCourtsEvent.onStartup() + local currentDay = os.date("%A") + local dayConfig = dreamCourtsConfig[currentDay] + if not dayConfig then + logger.warn("[World Change] The Dream Courts map not defined for the current day: {}", currentDay) + return false + end + + Game.loadMap(DATA_DIRECTORY .. "/world/quest/the_dream_courts/" .. dayConfig.map .. ".otbm") + logger.info("[World Change] The Dream Courts today's boss is: {}!", dayConfig.bossName) + return true +end + +dreamCourtsEvent:register() diff --git a/data-otservbr-global/scripts/world_changes/their_masters_voice.lua b/data-otservbr-global/scripts/world_changes/their_masters_voice.lua new file mode 100644 index 00000000000..af1354dae6c --- /dev/null +++ b/data-otservbr-global/scripts/world_changes/their_masters_voice.lua @@ -0,0 +1,21 @@ +local theirMastersVoiceEvent = GlobalEvent("TheirMastersVoice") + +function theirMastersVoiceEvent.onStartup() + if math.random(100) <= 20 then + for x = 33306, 33369 do + for y = 31847, 31919 do + local position = Position(x, y, 9) + local tile = Tile(position) + if tile then + local fungus = tile:getItemById(12065) + if fungus and math.random(100) <= 30 then + fungus:transform(math.random(12059, 12063)) + fungus:getPosition():sendMagicEffect(CONST_ME_YELLOW_RINGS) + end + end + end + end + end +end + +theirMastersVoiceEvent:register() diff --git a/data-otservbr-global/startup/tables/chest.lua b/data-otservbr-global/startup/tables/chest.lua index f5049f93f61..228e9ba2976 100644 --- a/data-otservbr-global/startup/tables/chest.lua +++ b/data-otservbr-global/startup/tables/chest.lua @@ -1186,4 +1186,8 @@ ChestUnique = { itemId = 11810, itemPos = { x = 33195, y = 31765, z = 1 }, }, + [14042] = { + itemId = 2473, + itemPos = { x = 32099, y = 32198, z = 9 }, + }, } diff --git a/data-otservbr-global/world/otservbr-npc.xml b/data-otservbr-global/world/otservbr-npc.xml index e707a58c248..10772902341 100644 --- a/data-otservbr-global/world/otservbr-npc.xml +++ b/data-otservbr-global/world/otservbr-npc.xml @@ -2986,4 +2986,13 @@ + + + + + + + + + diff --git a/data-otservbr-global/world/world_changes/dream_courts_bosses/Alptramun.otbm b/data-otservbr-global/world/quest/the_dream_courts/alptramun.otbm similarity index 100% rename from data-otservbr-global/world/world_changes/dream_courts_bosses/Alptramun.otbm rename to data-otservbr-global/world/quest/the_dream_courts/alptramun.otbm diff --git a/data-otservbr-global/world/world_changes/dream_courts_bosses/Izcandar_the_Banished.otbm b/data-otservbr-global/world/quest/the_dream_courts/izcandar_the_banished.otbm similarity index 100% rename from data-otservbr-global/world/world_changes/dream_courts_bosses/Izcandar_the_Banished.otbm rename to data-otservbr-global/world/quest/the_dream_courts/izcandar_the_banished.otbm diff --git a/data-otservbr-global/world/world_changes/dream_courts_bosses/Malofur_Mangrinder.otbm b/data-otservbr-global/world/quest/the_dream_courts/malofur_mangrinder.otbm similarity index 100% rename from data-otservbr-global/world/world_changes/dream_courts_bosses/Malofur_Mangrinder.otbm rename to data-otservbr-global/world/quest/the_dream_courts/malofur_mangrinder.otbm diff --git a/data-otservbr-global/world/world_changes/dream_courts_bosses/Maxxenius.otbm b/data-otservbr-global/world/quest/the_dream_courts/maxxenius.otbm similarity index 100% rename from data-otservbr-global/world/world_changes/dream_courts_bosses/Maxxenius.otbm rename to data-otservbr-global/world/quest/the_dream_courts/maxxenius.otbm diff --git a/data-otservbr-global/world/world_changes/dream_courts_bosses/Plagueroot.otbm b/data-otservbr-global/world/quest/the_dream_courts/plagueroot.otbm similarity index 100% rename from data-otservbr-global/world/world_changes/dream_courts_bosses/Plagueroot.otbm rename to data-otservbr-global/world/quest/the_dream_courts/plagueroot.otbm diff --git a/data/XML/events.xml b/data/XML/events.xml index 982f21e3fcd..c4f483b21ef 100644 --- a/data/XML/events.xml +++ b/data/XML/events.xml @@ -1,13 +1,13 @@ - +
- +
diff --git a/data/XML/familiars.xml b/data/XML/familiars.xml index 3c446167b5b..a73f5394fc2 100644 --- a/data/XML/familiars.xml +++ b/data/XML/familiars.xml @@ -1,32 +1,26 @@ - + - - - + + - - - + + - - - + + - - - diff --git a/data/XML/mounts.xml b/data/XML/mounts.xml index 31e8c8068b5..b8decc87a59 100644 --- a/data/XML/mounts.xml +++ b/data/XML/mounts.xml @@ -218,7 +218,9 @@ - + + + diff --git a/data/XML/outfits.xml b/data/XML/outfits.xml index 7178a5d6908..e18d48e865b 100644 --- a/data/XML/outfits.xml +++ b/data/XML/outfits.xml @@ -1,6 +1,6 @@ - + @@ -89,7 +89,7 @@ - + @@ -117,7 +117,7 @@ - + diff --git a/data/events/scripts/monster.lua b/data/events/scripts/monster.lua index ea991672854..e69de29bb2d 100644 --- a/data/events/scripts/monster.lua +++ b/data/events/scripts/monster.lua @@ -1,19 +0,0 @@ -local function calculateBonus(bonus) - local bonusCount = math.floor(bonus / 100) - local remainder = bonus % 100 - if remainder > 0 then - local probability = math.random(0, 100) - bonusCount = bonusCount + (probability < remainder and 1 or 0) - end - - return bonusCount -end - -local function checkItemType(itemId) - local itemType = ItemType(itemId):getType() - -- Based on enum ItemTypes_t - if (itemType > 0 and itemType < 4) or itemType == 7 or itemType == 8 or itemType == 11 or itemType == 13 or (itemType > 15 and itemType < 22) then - return true - end - return false -end diff --git a/data/events/scripts/scheduler/example.lua b/data/events/scripts/scheduler/example.lua deleted file mode 100644 index d095ed1064f..00000000000 --- a/data/events/scripts/scheduler/example.lua +++ /dev/null @@ -1,25 +0,0 @@ --- [OtServerBr] --- Event scheduler lua scripts, on this file is possible to load any kind --- of global values, create functions or create and register GlobalEvents using the revscript system. --- For example you can load a 'local Example = GlobalEvent("example")' and register it with 'Example:register()', --- adding the 'Example.onStartup()' or 'Example.onThink(interval)' with 'Example:interval(time)'. --- With 'onStartup()' you can load any raid, for example loading a entire map/hunt and the choseen spawns. - --- Examples: --- Loading map: Game.loadMap(DATA_DIRECTORY.. '/world/myMapFolder/myMapFile.otbm') --- Loading spawn: addEvent(function() Game.loadSpawnFile(DATA_DIRECTORY.. '/world/mySpawnFolder/mySpawnFile.xml) end, 30 * 1000) - -local Example_One = GlobalEvent("Example one") -function Example_One.onStartup() - return true -end - -Example_One:register() - -local Example_Two = GlobalEvent("Example two") -function Example_Two.onThink(interval) - return true -end - -Example_Two:interval(10000) -- 10 seconds interval -Example_Two:register() diff --git a/data/global.lua b/data/global.lua index 2d5ffc31cf0..9ea4fd128a9 100644 --- a/data/global.lua +++ b/data/global.lua @@ -56,18 +56,10 @@ AUTH_TYPE = configManager.getString(configKeys.AUTH_TYPE) GLOBAL_CHARM_GUT = 120 -- 20% more chance to get creature products from looting GLOBAL_CHARM_SCAVENGE = 125 -- 25% more chance to get creature products from skinning ---WEATHER -weatherConfig = { - groundEffect = CONST_ME_LOSEENERGY, - fallEffect = CONST_ANI_SMALLICE, - thunderEffect = configManager.getBoolean(configKeys.WEATHER_THUNDER), - minDMG = 1, - maxDMG = 5, -} - -- Event Schedule SCHEDULE_LOOT_RATE = 100 SCHEDULE_EXP_RATE = 100 +SCHEDULE_BOSS_LOOT_RATE = 100 SCHEDULE_SKILL_RATE = 100 SCHEDULE_SPAWN_RATE = 100 @@ -85,6 +77,7 @@ SCARLETT_MAY_DIE = 0 ropeSpots = { 386, 421, 386, 7762, 12202, 12936, 14238, 17238, 23363, 21965, 21966, 21967, 21968 } specialRopeSpots = { 12935 } +swimmingTiles = { 629, 630, 631, 632, 633, 634, 4809, 4810, 4811, 4812, 4813, 4814 } -- Global tables for systems if not _G.GlobalBosses then @@ -108,11 +101,6 @@ if not _G.NextUseConcoctionTime then _G.NextUseConcoctionTime = {} end --- Delay potion -if not _G.PlayerDelayPotion then - _G.PlayerDelayPotion = {} -end - table.contains = function(array, value) for _, targetColumn in pairs(array) do if targetColumn == value then diff --git a/data/items/items.xml b/data/items/items.xml index 666ee75b1f5..097081b8dd3 100644 --- a/data/items/items.xml +++ b/data/items/items.xml @@ -41,6 +41,9 @@ + + + @@ -710,6 +713,9 @@ + + + @@ -805,6 +811,9 @@ + + + @@ -1102,6 +1111,9 @@ + + + @@ -1136,12 +1148,18 @@ + + + + + + @@ -1171,6 +1189,11 @@ + + + + + @@ -1179,6 +1202,13 @@ + + + + + + + @@ -1187,6 +1217,13 @@ + + + + + + + @@ -1194,6 +1231,14 @@ + + + + + + + + @@ -1201,6 +1246,14 @@ + + + + + + + + @@ -1209,6 +1262,13 @@ + + + + + + + @@ -1217,6 +1277,13 @@ + + + + + + + @@ -1225,6 +1292,13 @@ + + + + + + + @@ -1232,6 +1306,14 @@ + + + + + + + + @@ -1239,6 +1321,14 @@ + + + + + + + + @@ -1247,6 +1337,13 @@ + + + + + + + @@ -1255,6 +1352,13 @@ + + + + + + + @@ -1263,6 +1367,13 @@ + + + + + + + @@ -1270,6 +1381,13 @@ + + + + + + + @@ -1277,6 +1395,14 @@ + + + + + + + + @@ -1301,6 +1427,11 @@ + + + + + @@ -1309,6 +1440,13 @@ + + + + + + + @@ -1317,6 +1455,13 @@ + + + + + + + @@ -1324,6 +1469,14 @@ + + + + + + + + @@ -1331,6 +1484,14 @@ + + + + + + + + @@ -1339,6 +1500,13 @@ + + + + + + + @@ -1347,6 +1515,13 @@ + + + + + + + @@ -1355,6 +1530,13 @@ + + + + + + + @@ -1362,6 +1544,14 @@ + + + + + + + + @@ -1369,6 +1559,14 @@ + + + + + + + + @@ -1377,6 +1575,13 @@ + + + + + + + @@ -1385,6 +1590,13 @@ + + + + + + + @@ -1393,6 +1605,13 @@ + + + + + + + @@ -1400,6 +1619,13 @@ + + + + + + + @@ -1407,6 +1633,14 @@ + + + + + + + + @@ -1840,6 +2074,13 @@ + + + + + + + @@ -1850,6 +2091,13 @@ + + + + + + + @@ -1860,6 +2108,13 @@ + + + + + + + @@ -1926,6 +2181,13 @@ + + + + + + + @@ -1942,6 +2204,11 @@ + + + + + @@ -1950,6 +2217,13 @@ + + + + + + + @@ -1958,6 +2232,13 @@ + + + + + + + @@ -1965,6 +2246,14 @@ + + + + + + + + @@ -1972,6 +2261,14 @@ + + + + + + + + @@ -1980,6 +2277,13 @@ + + + + + + + @@ -1988,6 +2292,13 @@ + + + + + + + @@ -1996,6 +2307,13 @@ + + + + + + + @@ -2003,6 +2321,14 @@ + + + + + + + + @@ -2010,6 +2336,14 @@ + + + + + + + + @@ -2018,6 +2352,13 @@ + + + + + + + @@ -2026,6 +2367,13 @@ + + + + + + + @@ -2034,6 +2382,13 @@ + + + + + + + @@ -2041,6 +2396,13 @@ + + + + + + + @@ -2048,6 +2410,14 @@ + + + + + + + + @@ -2055,6 +2425,11 @@ + + + + + @@ -2063,6 +2438,13 @@ + + + + + + + @@ -2071,6 +2453,13 @@ + + + + + + + @@ -2078,6 +2467,14 @@ + + + + + + + + @@ -2085,6 +2482,14 @@ + + + + + + + + @@ -2097,6 +2502,13 @@ + + + + + + + @@ -2105,6 +2517,13 @@ + + + + + + + @@ -2113,6 +2532,13 @@ + + + + + + + @@ -2120,6 +2546,14 @@ + + + + + + + + @@ -2127,6 +2561,14 @@ + + + + + + + + @@ -2135,6 +2577,13 @@ + + + + + + + @@ -2143,6 +2592,13 @@ + + + + + + + @@ -2151,6 +2607,13 @@ + + + + + + + @@ -2158,6 +2621,13 @@ + + + + + + + @@ -2165,6 +2635,14 @@ + + + + + + + + @@ -2172,6 +2650,11 @@ + + + + + @@ -2179,6 +2662,11 @@ + + + + + @@ -2187,6 +2675,11 @@ + + + + + @@ -2196,6 +2689,10 @@ + + + + @@ -2205,6 +2702,10 @@ + + + + @@ -2214,6 +2715,10 @@ + + + + @@ -2223,6 +2728,10 @@ + + + + @@ -2233,6 +2742,11 @@ + + + + + @@ -2241,6 +2755,11 @@ + + + + + @@ -2251,6 +2770,11 @@ + + + + + @@ -2258,6 +2782,11 @@ + + + + + @@ -2265,6 +2794,11 @@ + + + + + @@ -2272,6 +2806,11 @@ + + + + + @@ -2279,6 +2818,11 @@ + + + + + @@ -2286,6 +2830,11 @@ + + + + + @@ -2293,6 +2842,11 @@ + + + + + @@ -2300,6 +2854,10 @@ + + + + @@ -2307,6 +2865,10 @@ + + + + @@ -2314,6 +2876,10 @@ + + + + @@ -2321,6 +2887,10 @@ + + + + @@ -2384,6 +2954,10 @@ + + + + @@ -2454,6 +3028,9 @@ + + + @@ -2482,6 +3059,9 @@ + + + @@ -2524,13 +3104,15 @@ + + + - @@ -2538,12 +3120,18 @@ + + + + + + @@ -3264,6 +3852,11 @@ + + + + + @@ -3630,6 +4223,9 @@ + + + @@ -3640,12 +4236,18 @@ + + + + + + @@ -3655,6 +4257,9 @@ + + + @@ -3664,6 +4269,9 @@ + + + @@ -3673,6 +4281,9 @@ + + + @@ -3682,11 +4293,17 @@ + + + + + + @@ -3696,6 +4313,9 @@ + + + @@ -3707,9 +4327,15 @@ + + + + + + @@ -3717,6 +4343,9 @@ + + + @@ -3737,12 +4366,18 @@ + + + + + + @@ -3754,6 +4389,9 @@ + + + @@ -3763,11 +4401,17 @@ + + + + + + @@ -3778,6 +4422,9 @@ + + + @@ -3788,6 +4435,9 @@ + + + @@ -5279,6 +5929,9 @@ + + + @@ -5287,6 +5940,9 @@ + + + @@ -5302,41 +5958,65 @@ + + + + + + + + + + + + + + + + + + + + + + + + @@ -5345,6 +6025,9 @@ + + + @@ -5353,6 +6036,9 @@ + + + @@ -5361,6 +6047,9 @@ + + + @@ -5369,6 +6058,9 @@ + + + @@ -5377,6 +6069,9 @@ + + + @@ -5385,6 +6080,9 @@ + + + @@ -5393,6 +6091,9 @@ + + + @@ -5401,6 +6102,9 @@ + + + @@ -5874,6 +6578,11 @@ + + + + + @@ -5922,6 +6631,9 @@ + + + @@ -5929,18 +6641,30 @@ + + + + + + + + + + + + @@ -5949,27 +6673,45 @@ + + + + + + + + + + + + + + + + + + @@ -5978,10 +6720,16 @@ + + + + + + @@ -5990,6 +6738,9 @@ + + + @@ -6002,6 +6753,9 @@ + + + @@ -6014,6 +6768,9 @@ + + + @@ -6099,6 +6856,9 @@ + + + @@ -6127,6 +6887,9 @@ + + + @@ -6134,6 +6897,9 @@ + + + @@ -6141,6 +6907,9 @@ + + + @@ -6148,6 +6917,10 @@ + + + + @@ -6155,6 +6928,9 @@ + + + @@ -6162,6 +6938,9 @@ + + + @@ -6170,12 +6949,18 @@ + + + + + + @@ -6184,10 +6969,16 @@ + + + + + + @@ -6208,6 +6999,10 @@ + + + + @@ -6224,6 +7019,9 @@ + + + @@ -6233,6 +7031,16 @@ + + + + + + + + + + @@ -6241,6 +7049,16 @@ + + + + + + + + + + @@ -6249,6 +7067,16 @@ + + + + + + + + + + @@ -6261,6 +7089,16 @@ + + + + + + + + + + @@ -6269,6 +7107,16 @@ + + + + + + + + + + @@ -6276,6 +7124,16 @@ + + + + + + + + + + @@ -6283,6 +7141,16 @@ + + + + + + + + + + @@ -6290,6 +7158,16 @@ + + + + + + + + + + @@ -6297,6 +7175,16 @@ + + + + + + + + + + @@ -6309,6 +7197,16 @@ + + + + + + + + + + @@ -6327,10 +7225,16 @@ + + + + + + @@ -6340,6 +7244,9 @@ + + + @@ -6354,6 +7261,9 @@ + + + @@ -6362,6 +7272,9 @@ + + + @@ -6370,6 +7283,9 @@ + + + @@ -6378,6 +7294,9 @@ + + + @@ -6388,6 +7307,9 @@ + + + @@ -6397,6 +7319,9 @@ + + + @@ -6407,6 +7332,10 @@ + + + + @@ -6420,6 +7349,9 @@ + + + @@ -6428,6 +7360,9 @@ + + + @@ -6435,6 +7370,9 @@ + + + @@ -6442,6 +7380,9 @@ + + + @@ -6449,6 +7390,9 @@ + + + @@ -6458,6 +7402,9 @@ + + + @@ -6467,6 +7414,9 @@ + + + @@ -6476,6 +7426,9 @@ + + + @@ -6483,12 +7436,18 @@ + + + + + + @@ -6499,6 +7458,9 @@ + + + @@ -6511,6 +7473,9 @@ + + + @@ -6521,6 +7486,9 @@ + + + @@ -6965,6 +7933,10 @@ + + + + @@ -6980,6 +7952,10 @@ + + + + @@ -7053,6 +8029,9 @@ + + + @@ -7068,6 +8047,9 @@ + + + @@ -7075,6 +8057,9 @@ + + + @@ -7159,14 +8144,23 @@ + + + + + + + + + @@ -7198,6 +8192,9 @@ + + + @@ -7252,6 +8249,10 @@ + + + + @@ -7260,6 +8261,13 @@ + + + + + + + @@ -7268,6 +8276,12 @@ + + + + + + @@ -7275,6 +8289,10 @@ + + + + @@ -7282,6 +8300,10 @@ + + + + @@ -7290,6 +8312,12 @@ + + + + + + @@ -7297,6 +8325,10 @@ + + + + @@ -7313,6 +8345,10 @@ + + + + @@ -7321,6 +8357,10 @@ + + + + @@ -7329,6 +8369,10 @@ + + + + @@ -7336,6 +8380,10 @@ + + + + @@ -7344,6 +8392,13 @@ + + + + + + + @@ -7351,6 +8406,10 @@ + + + + @@ -7360,6 +8419,11 @@ + + + + + @@ -7369,6 +8433,13 @@ + + + + + + + @@ -7384,6 +8455,13 @@ + + + + + + + @@ -7394,6 +8472,12 @@ + + + + + + @@ -7410,6 +8494,13 @@ + + + + + + + @@ -7417,6 +8508,10 @@ + + + + @@ -7425,6 +8520,10 @@ + + + + @@ -7435,6 +8534,11 @@ + + + + + @@ -7442,6 +8546,10 @@ + + + + @@ -7449,6 +8557,10 @@ + + + + @@ -7458,6 +8570,11 @@ + + + + + @@ -7474,6 +8591,12 @@ + + + + + + @@ -7482,6 +8605,10 @@ + + + + @@ -7489,6 +8616,10 @@ + + + + @@ -7496,6 +8627,10 @@ + + + + @@ -7503,6 +8638,10 @@ + + + + @@ -7510,6 +8649,10 @@ + + + + @@ -7517,6 +8660,10 @@ + + + + @@ -7533,6 +8680,12 @@ + + + + + + @@ -7542,6 +8695,13 @@ + + + + + + + @@ -7551,6 +8711,10 @@ + + + + @@ -7560,6 +8724,11 @@ + + + + + @@ -7568,6 +8737,10 @@ + + + + @@ -7576,6 +8749,10 @@ + + + + @@ -7591,6 +8768,11 @@ + + + + + @@ -7607,6 +8789,12 @@ + + + + + + @@ -7623,6 +8811,13 @@ + + + + + + + @@ -7631,6 +8826,10 @@ + + + + @@ -7638,6 +8837,10 @@ + + + + @@ -7645,6 +8848,10 @@ + + + + @@ -7653,6 +8860,10 @@ + + + + @@ -7660,6 +8871,10 @@ + + + + @@ -7676,6 +8891,12 @@ + + + + + + @@ -7683,6 +8904,10 @@ + + + + @@ -7698,6 +8923,12 @@ + + + + + + @@ -7714,6 +8945,12 @@ + + + + + + @@ -7722,6 +8959,12 @@ + + + + + + @@ -7730,6 +8973,12 @@ + + + + + + @@ -7745,6 +8994,12 @@ + + + + + + @@ -7752,6 +9007,10 @@ + + + + @@ -7767,6 +9026,12 @@ + + + + + + @@ -7782,6 +9047,12 @@ + + + + + + @@ -7798,6 +9069,12 @@ + + + + + + @@ -7808,6 +9085,12 @@ + + + + + + @@ -7819,6 +9102,10 @@ + + + + @@ -7826,6 +9113,12 @@ + + + + + + @@ -7841,6 +9134,12 @@ + + + + + + @@ -7857,6 +9156,12 @@ + + + + + + @@ -7864,6 +9169,10 @@ + + + + @@ -7878,6 +9187,12 @@ + + + + + + @@ -7885,6 +9200,10 @@ + + + + @@ -7893,6 +9212,13 @@ + + + + + + + @@ -7900,6 +9226,10 @@ + + + + @@ -7907,6 +9237,10 @@ + + + + @@ -7921,6 +9255,12 @@ + + + + + + @@ -7936,6 +9276,13 @@ + + + + + + + @@ -7951,6 +9298,12 @@ + + + + + + @@ -7959,6 +9312,12 @@ + + + + + + @@ -7974,6 +9333,13 @@ + + + + + + + @@ -7982,6 +9348,10 @@ + + + + @@ -7990,6 +9360,10 @@ + + + + @@ -7997,6 +9371,10 @@ + + + + @@ -8012,6 +9390,12 @@ + + + + + + @@ -8028,6 +9412,12 @@ + + + + + + @@ -8044,6 +9434,12 @@ + + + + + + @@ -8059,6 +9455,13 @@ + + + + + + + @@ -8068,6 +9471,12 @@ + + + + + + @@ -8083,6 +9492,12 @@ + + + + + + @@ -8091,6 +9506,10 @@ + + + + @@ -8099,6 +9518,10 @@ + + + + @@ -8108,6 +9531,13 @@ + + + + + + + @@ -8116,6 +9546,10 @@ + + + + @@ -8131,6 +9565,10 @@ + + + + @@ -8139,41 +9577,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + @@ -8188,11 +9651,17 @@ + + + + + + @@ -8207,26 +9676,43 @@ + + + + + + + + + + + + + + + + + @@ -8241,6 +9727,9 @@ + + + @@ -8255,17 +9744,27 @@ + + + + + + + + + + @@ -8279,6 +9778,9 @@ + + + @@ -8293,51 +9795,83 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -8352,6 +9886,9 @@ + + + @@ -8366,21 +9903,35 @@ + + + + + + + + + + + + + + @@ -8394,6 +9945,9 @@ + + + @@ -8408,6 +9962,10 @@ + + + + @@ -8422,6 +9980,9 @@ + + + @@ -8436,16 +9997,25 @@ + + + + + + + + + @@ -8459,6 +10029,9 @@ + + + @@ -8473,6 +10046,9 @@ + + + @@ -8486,6 +10062,9 @@ + + + @@ -8501,11 +10080,19 @@ + + + + + + + + @@ -8520,6 +10107,9 @@ + + + @@ -8535,12 +10125,18 @@ + + + + + + @@ -8555,27 +10151,42 @@ + + + + + + + + + + + + + + + @@ -8590,20 +10201,32 @@ + + + + + + + + + + + + @@ -8617,6 +10240,9 @@ + + + @@ -8632,30 +10258,45 @@ + + + + + + + + + + + + + + + @@ -8672,12 +10313,18 @@ + + + + + + @@ -8693,12 +10340,18 @@ + + + + + + @@ -8714,6 +10367,9 @@ + + + @@ -8729,6 +10385,9 @@ + + + @@ -8745,12 +10404,18 @@ + + + + + + @@ -8767,6 +10432,9 @@ + + + @@ -8774,6 +10442,9 @@ + + + @@ -8790,24 +10461,36 @@ + + + + + + + + + + + + @@ -8823,6 +10506,9 @@ + + + @@ -8830,12 +10516,18 @@ + + + + + + @@ -8851,12 +10543,18 @@ + + + + + + @@ -8872,6 +10570,9 @@ + + + @@ -8888,6 +10589,9 @@ + + + @@ -8903,6 +10607,9 @@ + + + @@ -8918,6 +10625,9 @@ + + + @@ -8933,12 +10643,18 @@ + + + + + + @@ -8955,18 +10671,27 @@ + + + + + + + + + @@ -8982,12 +10707,18 @@ + + + + + + @@ -9003,12 +10734,18 @@ + + + + + + @@ -9018,6 +10755,11 @@ + + + + + @@ -9027,6 +10769,11 @@ + + + + + @@ -9054,6 +10801,13 @@ + + + + + + + @@ -9070,6 +10824,10 @@ + + + + @@ -9335,6 +11093,9 @@ + + + @@ -9343,6 +11104,9 @@ + + + @@ -9350,6 +11114,9 @@ + + + @@ -9358,6 +11125,9 @@ + + + @@ -9365,6 +11135,9 @@ + + + @@ -9373,6 +11146,9 @@ + + + @@ -9381,6 +11157,9 @@ + + + @@ -9389,56 +11168,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -9454,27 +11266,46 @@ + + + + + + + + + + + + + + + + + + + @@ -9488,12 +11319,18 @@ + + + + + + @@ -9501,11 +11338,18 @@ + + + + + + + @@ -10304,6 +12148,11 @@ + + + + + @@ -12135,6 +13984,7 @@ + @@ -12142,11 +13992,13 @@ + + @@ -12154,6 +14006,7 @@ + @@ -12161,6 +14014,7 @@ + @@ -12248,6 +14102,9 @@ + + + @@ -13053,6 +14910,9 @@ + + + @@ -13061,6 +14921,9 @@ + + + @@ -13639,6 +15502,9 @@ + + + @@ -13758,6 +15624,9 @@ + + + @@ -13772,6 +15641,13 @@ + + + + + + + @@ -13966,7 +15842,7 @@ - + @@ -13988,6 +15864,9 @@ + + + @@ -14043,11 +15922,17 @@ + + + + + + @@ -14082,11 +15967,17 @@ + + + + + + @@ -14098,7 +15989,7 @@ - + @@ -14192,11 +16083,17 @@ + + + + + + @@ -14996,11 +16893,17 @@ + + + + + + @@ -15023,6 +16926,10 @@ + + + + @@ -15109,6 +17016,9 @@ + + + @@ -15138,6 +17048,9 @@ + + + @@ -15361,6 +17274,9 @@ + + + @@ -15373,6 +17289,9 @@ + + + @@ -15772,6 +17691,9 @@ + + + @@ -15810,6 +17732,9 @@ + + + @@ -16058,6 +17983,13 @@ + + + + + + + @@ -16067,12 +17999,22 @@ + + + + + + + + + + @@ -16083,6 +18025,9 @@ + + + @@ -16166,6 +18111,13 @@ + + + + + + + @@ -16243,6 +18195,9 @@ + + + @@ -17169,11 +19124,17 @@ + + + + + + @@ -17227,11 +19188,17 @@ + + + + + + @@ -17244,6 +19211,13 @@ + + + + + + + @@ -17253,6 +19227,13 @@ + + + + + + + @@ -17262,6 +19243,13 @@ + + + + + + + @@ -17272,6 +19260,9 @@ + + + @@ -17281,6 +19272,13 @@ + + + + + + + @@ -17290,6 +19288,13 @@ + + + + + + + @@ -17344,6 +19349,13 @@ + + + + + + + @@ -17352,6 +19364,12 @@ + + + + + + @@ -17368,6 +19386,13 @@ + + + + + + + @@ -17376,6 +19401,12 @@ + + + + + + @@ -17391,6 +19422,13 @@ + + + + + + + @@ -17406,6 +19444,12 @@ + + + + + + @@ -17422,6 +19466,12 @@ + + + + + + @@ -17437,6 +19487,12 @@ + + + + + + @@ -17446,6 +19502,13 @@ + + + + + + + @@ -17454,6 +19517,12 @@ + + + + + + @@ -17462,6 +19531,12 @@ + + + + + + @@ -17478,6 +19553,12 @@ + + + + + + @@ -17486,6 +19567,12 @@ + + + + + + @@ -17501,6 +19588,13 @@ + + + + + + + @@ -17517,6 +19611,12 @@ + + + + + + @@ -17568,6 +19668,13 @@ + + + + + + + @@ -17583,6 +19690,13 @@ + + + + + + + @@ -17598,6 +19712,12 @@ + + + + + + @@ -17613,6 +19733,13 @@ + + + + + + + @@ -17629,6 +19756,13 @@ + + + + + + + @@ -17644,6 +19778,13 @@ + + + + + + + @@ -17659,6 +19800,12 @@ + + + + + + @@ -17667,6 +19814,12 @@ + + + + + + @@ -17680,6 +19833,12 @@ + + + + + + @@ -17688,6 +19847,12 @@ + + + + + + @@ -17702,6 +19867,12 @@ + + + + + + @@ -17710,6 +19881,13 @@ + + + + + + + @@ -17726,6 +19904,13 @@ + + + + + + + @@ -17742,6 +19927,12 @@ + + + + + + @@ -17757,6 +19948,12 @@ + + + + + + @@ -17772,6 +19969,12 @@ + + + + + + @@ -17787,6 +19990,12 @@ + + + + + + @@ -17802,6 +20011,12 @@ + + + + + + @@ -17809,6 +20024,12 @@ + + + + + + @@ -17823,6 +20044,12 @@ + + + + + + @@ -17831,6 +20058,12 @@ + + + + + + @@ -17846,6 +20079,13 @@ + + + + + + + @@ -17861,6 +20101,12 @@ + + + + + + @@ -17869,6 +20115,12 @@ + + + + + + @@ -17884,6 +20136,12 @@ + + + + + + @@ -17893,6 +20151,12 @@ + + + + + + @@ -17902,6 +20166,13 @@ + + + + + + + @@ -17918,6 +20189,12 @@ + + + + + + @@ -17933,6 +20210,12 @@ + + + + + + @@ -17948,6 +20231,12 @@ + + + + + + @@ -17956,6 +20245,12 @@ + + + + + + @@ -17964,6 +20259,12 @@ + + + + + + @@ -17980,6 +20281,12 @@ + + + + + + @@ -17995,6 +20302,12 @@ + + + + + + @@ -18003,6 +20316,13 @@ + + + + + + + @@ -18018,6 +20338,12 @@ + + + + + + @@ -18035,6 +20361,10 @@ + + + + @@ -18085,6 +20415,13 @@ + + + + + + + @@ -18092,6 +20429,13 @@ + + + + + + + @@ -18106,6 +20450,12 @@ + + + + + + @@ -18121,6 +20471,13 @@ + + + + + + + @@ -18136,6 +20493,13 @@ + + + + + + + @@ -18144,6 +20508,13 @@ + + + + + + + @@ -18159,6 +20530,12 @@ + + + + + + @@ -18173,6 +20550,12 @@ + + + + + + @@ -18181,6 +20564,9 @@ + + + @@ -18195,11 +20581,17 @@ + + + + + + @@ -18215,16 +20607,25 @@ + + + + + + + + + @@ -18240,11 +20641,17 @@ + + + + + + @@ -18310,6 +20717,9 @@ + + + @@ -18561,6 +20971,9 @@ + + + @@ -18612,6 +21025,10 @@ + + + + @@ -18620,6 +21037,10 @@ + + + + @@ -18935,6 +21356,10 @@ + + + + @@ -18944,12 +21369,20 @@ + + + + + + + + @@ -19017,6 +21450,13 @@ + + + + + + + @@ -19033,6 +21473,13 @@ + + + + + + + @@ -19050,6 +21497,13 @@ + + + + + + + @@ -19066,6 +21520,13 @@ + + + + + + + @@ -19081,6 +21542,13 @@ + + + + + + + @@ -19098,6 +21566,13 @@ + + + + + + + @@ -19115,6 +21590,13 @@ + + + + + + + @@ -19123,6 +21605,13 @@ + + + + + + + @@ -19139,6 +21628,13 @@ + + + + + + + @@ -19147,6 +21643,13 @@ + + + + + + + @@ -19173,6 +21676,11 @@ + + + + + @@ -19180,6 +21688,11 @@ + + + + + @@ -19188,6 +21701,11 @@ + + + + + @@ -19196,6 +21714,11 @@ + + + + + @@ -19203,39 +21726,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -19243,6 +21795,11 @@ + + + + + @@ -19250,6 +21807,11 @@ + + + + + @@ -19257,6 +21819,11 @@ + + + + + @@ -19264,6 +21831,11 @@ + + + + + @@ -19272,6 +21844,11 @@ + + + + + @@ -19280,6 +21857,11 @@ + + + + + @@ -19288,6 +21870,11 @@ + + + + + @@ -19296,6 +21883,11 @@ + + + + + @@ -19303,6 +21895,11 @@ + + + + + @@ -19310,6 +21907,11 @@ + + + + + @@ -19317,6 +21919,11 @@ + + + + + @@ -19331,6 +21938,11 @@ + + + + + @@ -19338,12 +21950,22 @@ + + + + + + + + + + @@ -19359,12 +21981,20 @@ + + + + + + + + @@ -19387,6 +22017,11 @@ + + + + + @@ -19403,6 +22038,11 @@ + + + + + @@ -19410,6 +22050,11 @@ + + + + + @@ -19417,6 +22062,11 @@ + + + + + @@ -19424,6 +22074,11 @@ + + + + + @@ -19431,6 +22086,11 @@ + + + + + @@ -19441,6 +22101,11 @@ + + + + + @@ -19450,6 +22115,11 @@ + + + + + @@ -19460,6 +22130,11 @@ + + + + + @@ -19473,6 +22148,11 @@ + + + + + @@ -19486,6 +22166,16 @@ + + + + + + + + + + @@ -19499,6 +22189,16 @@ + + + + + + + + + + @@ -19507,6 +22207,16 @@ + + + + + + + + + + @@ -19515,6 +22225,11 @@ + + + + + @@ -19531,6 +22246,16 @@ + + + + + + + + + + @@ -19543,6 +22268,16 @@ + + + + + + + + + + @@ -19555,11 +22290,25 @@ + + + + + + + + + + + + + + @@ -19575,6 +22324,13 @@ + + + + + + + @@ -19590,6 +22346,12 @@ + + + + + + @@ -19605,6 +22367,13 @@ + + + + + + + @@ -19613,6 +22382,12 @@ + + + + + + @@ -19628,6 +22403,12 @@ + + + + + + @@ -19642,6 +22423,13 @@ + + + + + + + @@ -19657,6 +22445,12 @@ + + + + + + @@ -19671,6 +22465,12 @@ + + + + + + @@ -19678,6 +22478,13 @@ + + + + + + + @@ -20710,17 +23517,28 @@ + + + + + + + + + + + @@ -20728,6 +23546,11 @@ + + + + + @@ -20738,6 +23561,11 @@ + + + + + @@ -21126,14 +23954,23 @@ + + + + + + + + + @@ -21145,6 +23982,9 @@ + + + @@ -21157,6 +23997,10 @@ + + + + @@ -21166,6 +24010,10 @@ + + + + @@ -21532,6 +24380,11 @@ + + + + + @@ -21676,6 +24529,9 @@ + + + @@ -21941,18 +24797,27 @@ + + + + + + + + + @@ -21975,6 +24840,9 @@ + + + @@ -22165,6 +25033,10 @@ + + + + @@ -22175,6 +25047,10 @@ + + + + @@ -22184,6 +25060,10 @@ + + + + @@ -22194,6 +25074,10 @@ + + + + @@ -22311,6 +25195,9 @@ + + + @@ -22318,6 +25205,10 @@ + + + + @@ -22332,6 +25223,9 @@ + + + @@ -22340,6 +25234,10 @@ + + + + @@ -22347,6 +25245,10 @@ + + + + @@ -22362,6 +25264,9 @@ + + + @@ -22377,6 +25282,10 @@ + + + + @@ -22392,6 +25301,9 @@ + + + @@ -22407,6 +25319,9 @@ + + + @@ -22420,6 +25335,9 @@ + + + @@ -22433,11 +25351,17 @@ + + + + + + @@ -22446,6 +25370,10 @@ + + + + @@ -22453,6 +25381,10 @@ + + + + @@ -22461,6 +25393,10 @@ + + + + @@ -22468,6 +25404,10 @@ + + + + @@ -22492,6 +25432,10 @@ + + + + @@ -22504,6 +25448,10 @@ + + + + @@ -22518,6 +25466,10 @@ + + + + @@ -22534,17 +25486,26 @@ + + + + + + + + + @@ -22596,6 +25557,9 @@ + + + @@ -22604,6 +25568,9 @@ + + + @@ -22751,6 +25718,9 @@ + + + @@ -22775,6 +25745,9 @@ + + + @@ -22813,6 +25786,9 @@ + + + @@ -22821,11 +25797,17 @@ + + + + + + @@ -22834,6 +25816,9 @@ + + + @@ -22842,6 +25827,9 @@ + + + @@ -22921,11 +25909,11 @@ - + - + @@ -22973,7 +25961,7 @@ - + @@ -23003,7 +25991,7 @@ - + @@ -23014,10 +26002,14 @@ + + + + - + @@ -23041,7 +26033,7 @@ - + @@ -23067,7 +26059,7 @@ - + @@ -23554,6 +26546,11 @@ + + + + + @@ -23564,6 +26561,11 @@ + + + + + @@ -23572,6 +26574,9 @@ + + + @@ -23689,7 +26694,7 @@ - + @@ -23709,10 +26714,9 @@ - + - + @@ -23721,15 +26725,14 @@ - - + + - + @@ -23798,11 +26801,11 @@ - + - + @@ -23810,7 +26813,7 @@ - + @@ -23829,7 +26832,7 @@ - + @@ -23849,7 +26852,7 @@ - + @@ -23857,11 +26860,11 @@ - + - + @@ -23878,8 +26881,7 @@ - + @@ -23896,6 +26898,11 @@ + + + + + @@ -23904,11 +26911,17 @@ + + + + + + @@ -23917,6 +26930,9 @@ + + + @@ -23925,6 +26941,9 @@ + + + @@ -24017,6 +27036,9 @@ + + + @@ -24139,6 +27161,11 @@ + + + + + @@ -24153,6 +27180,10 @@ + + + + @@ -24160,12 +27191,18 @@ + + + + + + @@ -24181,6 +27218,12 @@ + + + + + + @@ -24189,6 +27232,13 @@ + + + + + + + @@ -24204,6 +27254,12 @@ + + + + + + @@ -24212,6 +27268,13 @@ + + + + + + + @@ -24227,6 +27290,13 @@ + + + + + + + @@ -24301,6 +27371,12 @@ + + + + + + @@ -24316,7 +27392,7 @@ - + @@ -24324,10 +27400,13 @@ + + + - + @@ -24356,7 +27435,7 @@ - + @@ -24421,6 +27500,11 @@ + + + + + @@ -24428,6 +27512,11 @@ + + + + + @@ -24483,7 +27572,7 @@ - + @@ -24494,10 +27583,15 @@ + + + + + - + @@ -24522,6 +27616,9 @@ + + + @@ -24551,6 +27648,9 @@ + + + @@ -25125,7 +28225,7 @@ - + @@ -25133,9 +28233,8 @@ - - + + @@ -25144,9 +28243,9 @@ - - - + + + @@ -25223,6 +28322,9 @@ + + + @@ -25333,7 +28435,7 @@ - + @@ -25399,11 +28501,17 @@ + + + + + + @@ -25723,6 +28831,11 @@ + + + + + @@ -25762,6 +28875,13 @@ + + + + + + + @@ -25841,6 +28961,10 @@ + + + + @@ -25896,6 +29020,11 @@ + + + + + @@ -25903,6 +29032,11 @@ + + + + + @@ -25919,6 +29053,11 @@ + + + + + @@ -25934,6 +29073,11 @@ + + + + + @@ -25946,6 +29090,11 @@ + + + + + @@ -25960,6 +29109,12 @@ + + + + + + @@ -25974,6 +29129,12 @@ + + + + + + @@ -25987,6 +29148,9 @@ + + + @@ -25998,16 +29162,22 @@ + + + + + + - + @@ -26694,7 +29864,7 @@ - + @@ -27198,15 +30368,21 @@ + + + + + + - - + + @@ -27341,6 +30517,10 @@ + + + + @@ -27361,6 +30541,16 @@ + + + + + + + + + + @@ -27469,6 +30659,10 @@ + + + + @@ -27479,6 +30673,10 @@ + + + + @@ -27494,6 +30692,10 @@ + + + + @@ -27534,6 +30736,12 @@ + + + + + + @@ -27629,6 +30837,12 @@ + + + + + + @@ -27640,6 +30854,16 @@ + + + + + + + + + + @@ -27654,6 +30878,13 @@ + + + + + + + @@ -27670,6 +30901,9 @@ + + + @@ -27688,6 +30922,16 @@ + + + + + + + + + + @@ -28661,6 +31905,12 @@ + + + + + + @@ -28671,6 +31921,10 @@ + + + + @@ -28678,6 +31932,12 @@ + + + + + + @@ -28699,6 +31959,11 @@ + + + + + @@ -28715,6 +31980,11 @@ + + + + + @@ -28722,6 +31992,10 @@ + + + + @@ -28729,6 +32003,11 @@ + + + + + @@ -28738,6 +32017,11 @@ + + + + + @@ -28754,6 +32038,11 @@ + + + + + @@ -28761,6 +32050,11 @@ + + + + + @@ -28778,6 +32072,11 @@ + + + + + @@ -28792,6 +32091,12 @@ + + + + + + @@ -28955,6 +32260,12 @@ + + + + + + @@ -28973,6 +32284,9 @@ + + + @@ -28981,6 +32295,12 @@ + + + + + + @@ -29026,7 +32346,7 @@ - + @@ -29042,11 +32362,11 @@ - + - + @@ -29071,6 +32391,11 @@ + + + + + @@ -29078,6 +32403,10 @@ + + + + @@ -29093,6 +32422,9 @@ + + + @@ -29107,6 +32439,12 @@ + + + + + + @@ -29313,6 +32651,13 @@ + + + + + + + @@ -29323,6 +32668,13 @@ + + + + + + + @@ -29331,6 +32683,9 @@ + + + @@ -29339,6 +32694,9 @@ + + + @@ -29353,6 +32711,12 @@ + + + + + + @@ -29362,6 +32726,13 @@ + + + + + + + @@ -29371,6 +32742,13 @@ + + + + + + + @@ -29417,6 +32795,9 @@ + + + @@ -29549,6 +32930,13 @@ + + + + + + + @@ -29558,6 +32946,11 @@ + + + + + @@ -30190,6 +33583,11 @@ + + + + + @@ -30199,6 +33597,13 @@ + + + + + + + @@ -30660,6 +34065,16 @@ + + + + + + + + + + @@ -30676,6 +34091,9 @@ + + + @@ -30684,6 +34102,9 @@ + + + @@ -30706,6 +34127,11 @@ + + + + + @@ -30714,6 +34140,11 @@ + + + + + @@ -30722,6 +34153,11 @@ + + + + + @@ -30732,6 +34168,11 @@ + + + + + @@ -30741,6 +34182,10 @@ + + + + @@ -30748,6 +34193,11 @@ + + + + + @@ -30764,6 +34214,11 @@ + + + + + @@ -30771,6 +34226,11 @@ + + + + + @@ -30782,6 +34242,11 @@ + + + + + @@ -30791,6 +34256,10 @@ + + + + @@ -30801,6 +34270,10 @@ + + + + @@ -30809,6 +34282,16 @@ + + + + + + + + + + @@ -30818,6 +34301,11 @@ + + + + + @@ -30827,6 +34315,16 @@ + + + + + + + + + + @@ -30836,10 +34334,20 @@ + + + + + + + + + + - + @@ -30859,7 +34367,7 @@ - + @@ -30887,7 +34395,7 @@ - + @@ -30912,7 +34420,7 @@ - + @@ -30930,6 +34438,13 @@ + + + + + + + @@ -30939,6 +34454,13 @@ + + + + + + + @@ -30949,6 +34471,13 @@ + + + + + + + @@ -31012,6 +34541,12 @@ + + + + + + @@ -31029,6 +34564,12 @@ + + + + + + @@ -31045,6 +34586,12 @@ + + + + + + @@ -31055,6 +34602,13 @@ + + + + + + + @@ -31072,6 +34626,13 @@ + + + + + + + @@ -31123,6 +34684,12 @@ + + + + + + @@ -31337,6 +34904,10 @@ + + + + @@ -31499,6 +35070,12 @@ + + + + + + @@ -31509,6 +35086,12 @@ + + + + + + @@ -31516,6 +35099,16 @@ + + + + + + + + + + @@ -32367,6 +35960,9 @@ + + + @@ -32376,6 +35972,12 @@ + + + + + + @@ -32391,6 +35993,12 @@ + + + + + + @@ -32419,7 +36027,7 @@ - + @@ -32430,6 +36038,10 @@ + + + + @@ -32440,7 +36052,7 @@ - + @@ -32448,21 +36060,30 @@ + + + + + + + + + + - - + + - + @@ -32475,11 +36096,14 @@ + + + - - + + @@ -32508,6 +36132,9 @@ + + + @@ -32523,11 +36150,11 @@ - + - + @@ -32540,6 +36167,12 @@ + + + + + + @@ -34842,8 +38475,7 @@ - + @@ -34864,6 +38496,9 @@ + + + @@ -35140,7 +38775,7 @@ - + @@ -35288,9 +38923,9 @@ - - - + + + @@ -35581,6 +39216,9 @@ + + + @@ -35610,6 +39248,9 @@ + + + @@ -35775,12 +39416,23 @@ + + + + + + + + + + + @@ -35796,12 +39448,18 @@ + + + + + + @@ -35825,6 +39483,11 @@ + + + + + @@ -35841,6 +39504,9 @@ + + + @@ -35853,6 +39519,10 @@ + + + + @@ -35869,6 +39539,9 @@ + + + @@ -35885,6 +39558,9 @@ + + + @@ -35892,6 +39568,9 @@ + + + @@ -35918,6 +39597,11 @@ + + + + + @@ -35940,6 +39624,12 @@ + + + + + + @@ -36138,6 +39828,9 @@ + + + @@ -36200,6 +39893,13 @@ + + + + + + + @@ -36215,6 +39915,13 @@ + + + + + + + @@ -36231,6 +39938,13 @@ + + + + + + + @@ -36239,6 +39953,13 @@ + + + + + + + @@ -36254,6 +39975,13 @@ + + + + + + + @@ -36270,6 +39998,13 @@ + + + + + + + @@ -36278,6 +40013,13 @@ + + + + + + + @@ -36293,6 +40035,13 @@ + + + + + + + @@ -36309,6 +40058,13 @@ + + + + + + + @@ -36317,6 +40073,13 @@ + + + + + + + @@ -36332,6 +40095,13 @@ + + + + + + + @@ -36348,6 +40118,13 @@ + + + + + + + @@ -36356,6 +40133,13 @@ + + + + + + + @@ -36371,6 +40155,13 @@ + + + + + + + @@ -36387,6 +40178,13 @@ + + + + + + + @@ -36395,6 +40193,13 @@ + + + + + + + @@ -36410,6 +40215,13 @@ + + + + + + + @@ -36426,6 +40238,13 @@ + + + + + + + @@ -36436,6 +40255,13 @@ + + + + + + + @@ -36453,6 +40279,13 @@ + + + + + + + @@ -36471,6 +40304,13 @@ + + + + + + + @@ -36481,6 +40321,13 @@ + + + + + + + @@ -36498,6 +40345,13 @@ + + + + + + + @@ -36516,6 +40370,13 @@ + + + + + + + @@ -36527,6 +40388,11 @@ + + + + + @@ -36543,6 +40409,11 @@ + + + + + @@ -36559,6 +40430,11 @@ + + + + + @@ -36688,6 +40564,9 @@ + + + @@ -36857,6 +40736,10 @@ + + + + @@ -36865,6 +40748,9 @@ + + + @@ -36896,19 +40782,18 @@ - + - + - + @@ -36919,7 +40804,7 @@ - + @@ -36942,6 +40827,9 @@ + + + @@ -37228,6 +41116,9 @@ + + + @@ -37753,7 +41644,7 @@ - + @@ -37910,11 +41801,18 @@ - - - - - + + + + + + + + + + + + @@ -37930,6 +41828,11 @@ + + + + + @@ -37938,6 +41841,11 @@ + + + + + @@ -37951,6 +41859,10 @@ + + + + @@ -37965,12 +41877,19 @@ + + + + + + + @@ -37980,11 +41899,20 @@ + + + + + + + + + @@ -37992,6 +41920,12 @@ + + + + + + @@ -38006,6 +41940,12 @@ + + + + + + @@ -38014,6 +41954,12 @@ + + + + + + @@ -38021,12 +41967,21 @@ + + + + + + + + + @@ -38035,6 +41990,12 @@ + + + + + + @@ -38043,6 +42004,12 @@ + + + + + + @@ -38053,6 +42020,14 @@ + + + + + + + + @@ -38063,6 +42038,14 @@ + + + + + + + + @@ -38073,6 +42056,14 @@ + + + + + + + + @@ -38091,6 +42082,11 @@ + + + + + @@ -38216,6 +42212,12 @@ + + + + + ogre klubb + @@ -38245,6 +42247,9 @@ + + + @@ -38259,6 +42264,9 @@ + + + @@ -38320,6 +42328,16 @@ + + + + + + + + + + @@ -38328,6 +42346,16 @@ + + + + + + + + + + @@ -38424,11 +42452,18 @@ + + + + + + + @@ -38443,6 +42478,9 @@ + + + @@ -38510,12 +42548,14 @@ - + - + @@ -38529,6 +42569,9 @@ + + + @@ -38550,6 +42593,9 @@ + + + @@ -38631,6 +42677,9 @@ + + + @@ -38658,6 +42707,11 @@ + + + + + @@ -38801,6 +42855,9 @@ + + + @@ -39008,7 +43065,7 @@ - + @@ -39053,7 +43110,7 @@ - + @@ -39206,6 +43263,10 @@ + + + + @@ -39348,9 +43409,9 @@ - - + + @@ -39373,6 +43434,9 @@ + + + @@ -39449,11 +43513,11 @@ - + - + @@ -39483,6 +43547,11 @@ + + + + + @@ -39760,6 +43829,9 @@ + + + @@ -39768,6 +43840,9 @@ + + + @@ -39775,6 +43850,10 @@ + + + + @@ -39854,7 +43933,7 @@ - + @@ -39867,6 +43946,9 @@ + + + @@ -39875,6 +43957,10 @@ + + + + @@ -39885,6 +43971,10 @@ + + + + @@ -39892,6 +43982,9 @@ + + + @@ -40008,9 +44101,8 @@ - - + + @@ -40031,6 +44123,11 @@ + + + + + @@ -40041,6 +44138,11 @@ + + + + + @@ -40051,6 +44153,11 @@ + + + + + @@ -40060,6 +44167,11 @@ + + + + + @@ -40075,6 +44187,11 @@ + + + + + @@ -40090,6 +44207,9 @@ + + + @@ -40172,7 +44292,8 @@ - + @@ -40204,6 +44325,9 @@ + + + @@ -40212,6 +44336,12 @@ + + + + + + @@ -40220,6 +44350,12 @@ + + + + + + @@ -40240,10 +44376,20 @@ + + + + + + + + + + - + @@ -40261,16 +44407,19 @@ - + - + + + + @@ -40288,6 +44437,9 @@ + + + @@ -40302,6 +44454,10 @@ + + + + @@ -40462,6 +44618,11 @@ + + + + + @@ -40470,6 +44631,11 @@ + + + + + @@ -40478,6 +44644,11 @@ + + + + + @@ -40486,6 +44657,11 @@ + + + + + @@ -40494,6 +44670,11 @@ + + + + + @@ -40502,6 +44683,11 @@ + + + + + @@ -40510,6 +44696,11 @@ + + + + + @@ -40518,6 +44709,11 @@ + + + + + @@ -40526,6 +44722,11 @@ + + + + + @@ -40534,6 +44735,11 @@ + + + + + @@ -40542,6 +44748,11 @@ + + + + + @@ -40550,6 +44761,11 @@ + + + + + @@ -40558,6 +44774,11 @@ + + + + + @@ -40566,6 +44787,11 @@ + + + + + @@ -40574,6 +44800,11 @@ + + + + + @@ -40582,6 +44813,11 @@ + + + + + @@ -40590,6 +44826,11 @@ + + + + + @@ -40598,6 +44839,11 @@ + + + + + @@ -40606,6 +44852,11 @@ + + + + + @@ -40614,6 +44865,11 @@ + + + + + @@ -40669,11 +44925,17 @@ + + + + + + @@ -40891,11 +45153,11 @@ - + - + @@ -40915,6 +45177,9 @@ + + + @@ -40930,18 +45195,24 @@ + + + + + + - + - - + + @@ -41005,6 +45276,9 @@ + + + @@ -41031,6 +45305,9 @@ + + + @@ -41046,6 +45323,11 @@ + + + + + @@ -41053,11 +45335,18 @@ + + + + + + + @@ -41073,6 +45362,10 @@ + + + + @@ -41082,6 +45375,12 @@ + + + + + + @@ -41090,6 +45389,12 @@ + + + + + + @@ -41108,6 +45413,12 @@ + + + + + + @@ -41119,6 +45430,12 @@ + + + + + + @@ -41128,6 +45445,16 @@ + + + + + + + + + + @@ -41138,18 +45465,36 @@ + + + + + + + + + + + + + + + + + + @@ -41173,11 +45518,19 @@ + + + + + + + + @@ -41335,6 +45688,13 @@ + + + + + + + @@ -41352,6 +45712,13 @@ + + + + + + + @@ -41398,14 +45765,24 @@ - + + + + - + + + + @@ -41943,6 +46320,11 @@ + + + + + @@ -41959,6 +46341,11 @@ + + + + + @@ -41976,6 +46363,10 @@ + + + + @@ -41985,6 +46376,10 @@ + + + + @@ -42054,7 +46449,7 @@ - + @@ -42063,11 +46458,11 @@ - + - + @@ -42086,12 +46481,12 @@ - - + + - + @@ -42111,23 +46506,23 @@ - - + + - - + + - - + + - - + + @@ -42136,7 +46531,7 @@ - + @@ -42145,24 +46540,24 @@ - - + + - + - + - + - + @@ -42171,6 +46566,9 @@ + + + @@ -42181,6 +46579,11 @@ + + + + + @@ -42194,6 +46597,11 @@ + + + + + @@ -42206,12 +46614,22 @@ + + + + + + + + + + @@ -42222,12 +46640,22 @@ + + + + + + + + + + @@ -42241,12 +46669,22 @@ + + + + + + + + + + @@ -42259,6 +46697,11 @@ + + + + + @@ -42291,18 +46734,33 @@ + + + + + + + + + + + + + + + @@ -42936,7 +47394,7 @@ - + @@ -42949,7 +47407,7 @@ - + @@ -42961,7 +47419,7 @@ - + @@ -42991,6 +47449,9 @@ + + + @@ -43004,6 +47465,9 @@ + + + @@ -43015,6 +47479,9 @@ + + + @@ -43022,6 +47489,9 @@ + + + @@ -43029,12 +47499,18 @@ + + + + + + @@ -43042,6 +47518,9 @@ + + + @@ -43270,8 +47749,7 @@ - + @@ -43682,11 +48160,14 @@ + + + - - + + @@ -44000,11 +48481,17 @@ + + + + + + @@ -44202,7 +48689,7 @@ - + @@ -44283,6 +48770,10 @@ + + + + @@ -44300,6 +48791,11 @@ + + + + + @@ -44314,6 +48810,16 @@ + + + + + + + + + + @@ -44419,13 +48925,20 @@ + + + + + + + - + @@ -44491,6 +49004,13 @@ + + + + + + + @@ -44500,6 +49020,13 @@ + + + + + + + @@ -44514,6 +49041,16 @@ + + + + + + + + + + @@ -44566,11 +49103,18 @@ + + + + + + + @@ -44991,6 +49535,10 @@ + + + + @@ -44998,6 +49546,10 @@ + + + + @@ -45005,6 +49557,10 @@ + + + + @@ -45012,6 +49568,10 @@ + + + + @@ -45019,6 +49579,10 @@ + + + + @@ -45026,6 +49590,10 @@ + + + + @@ -45033,6 +49601,10 @@ + + + + @@ -45040,6 +49612,10 @@ + + + + @@ -45047,6 +49623,10 @@ + + + + @@ -45054,6 +49634,10 @@ + + + + @@ -45061,6 +49645,10 @@ + + + + @@ -45068,6 +49656,10 @@ + + + + @@ -45075,6 +49667,10 @@ + + + + @@ -45082,6 +49678,10 @@ + + + + @@ -45089,6 +49689,10 @@ + + + + @@ -45096,6 +49700,10 @@ + + + + @@ -45103,6 +49711,10 @@ + + + + @@ -45110,6 +49722,10 @@ + + + + @@ -45117,6 +49733,10 @@ + + + + @@ -45124,6 +49744,10 @@ + + + + @@ -45131,6 +49755,10 @@ + + + + @@ -45138,6 +49766,10 @@ + + + + @@ -45145,6 +49777,10 @@ + + + + @@ -45152,6 +49788,10 @@ + + + + @@ -45159,6 +49799,10 @@ + + + + @@ -45166,6 +49810,10 @@ + + + + @@ -45173,6 +49821,10 @@ + + + + @@ -45180,6 +49832,10 @@ + + + + @@ -45187,6 +49843,10 @@ + + + + @@ -45194,6 +49854,10 @@ + + + + @@ -45201,6 +49865,10 @@ + + + + @@ -45208,6 +49876,10 @@ + + + + @@ -45215,6 +49887,10 @@ + + + + @@ -45222,6 +49898,10 @@ + + + + @@ -45229,6 +49909,10 @@ + + + + @@ -45236,6 +49920,10 @@ + + + + @@ -45243,6 +49931,10 @@ + + + + @@ -45250,6 +49942,10 @@ + + + + @@ -45257,6 +49953,10 @@ + + + + @@ -45264,6 +49964,10 @@ + + + + @@ -45271,6 +49975,10 @@ + + + + @@ -45278,6 +49986,10 @@ + + + + @@ -45285,6 +49997,10 @@ + + + + @@ -45292,6 +50008,10 @@ + + + + @@ -45299,6 +50019,10 @@ + + + + @@ -45306,6 +50030,10 @@ + + + + @@ -45313,6 +50041,10 @@ + + + + @@ -45320,6 +50052,10 @@ + + + + @@ -45327,6 +50063,10 @@ + + + + @@ -45334,6 +50074,10 @@ + + + + @@ -45341,6 +50085,10 @@ + + + + @@ -45348,6 +50096,10 @@ + + + + @@ -45355,6 +50107,10 @@ + + + + @@ -45362,6 +50118,10 @@ + + + + @@ -45369,6 +50129,10 @@ + + + + @@ -45376,6 +50140,10 @@ + + + + @@ -45383,6 +50151,10 @@ + + + + @@ -45390,6 +50162,10 @@ + + + + @@ -45397,6 +50173,10 @@ + + + + @@ -45404,24 +50184,37 @@ + + + + + + + + + + + + + @@ -45440,6 +50233,9 @@ + + + @@ -45447,6 +50243,10 @@ + + + + @@ -45454,6 +50254,10 @@ + + + + @@ -45461,6 +50265,10 @@ + + + + @@ -45468,6 +50276,10 @@ + + + + @@ -45475,6 +50287,10 @@ + + + + @@ -45482,6 +50298,10 @@ + + + + @@ -45489,6 +50309,10 @@ + + + + @@ -45496,6 +50320,10 @@ + + + + @@ -45503,6 +50331,10 @@ + + + + @@ -45510,6 +50342,10 @@ + + + + @@ -45517,6 +50353,10 @@ + + + + @@ -45524,6 +50364,10 @@ + + + + @@ -45531,6 +50375,10 @@ + + + + @@ -45538,6 +50386,10 @@ + + + + @@ -45545,6 +50397,10 @@ + + + + @@ -45552,6 +50408,10 @@ + + + + @@ -45559,6 +50419,10 @@ + + + + @@ -45566,6 +50430,10 @@ + + + + @@ -45645,6 +50513,10 @@ + + + + @@ -45652,6 +50524,10 @@ + + + + @@ -45659,6 +50535,10 @@ + + + + @@ -45666,6 +50546,10 @@ + + + + @@ -45673,6 +50557,10 @@ + + + + @@ -45680,6 +50568,10 @@ + + + + @@ -45687,6 +50579,10 @@ + + + + @@ -45694,6 +50590,10 @@ + + + + @@ -45701,6 +50601,10 @@ + + + + @@ -45708,6 +50612,10 @@ + + + + @@ -45715,6 +50623,10 @@ + + + + @@ -45722,6 +50634,10 @@ + + + + @@ -45729,6 +50645,10 @@ + + + + @@ -45736,6 +50656,10 @@ + + + + @@ -45743,6 +50667,10 @@ + + + + @@ -45750,6 +50678,10 @@ + + + + @@ -45757,6 +50689,10 @@ + + + + @@ -45764,6 +50700,10 @@ + + + + @@ -45843,6 +50783,10 @@ + + + + @@ -45850,6 +50794,10 @@ + + + + @@ -45857,6 +50805,10 @@ + + + + @@ -45864,6 +50816,10 @@ + + + + @@ -45871,6 +50827,10 @@ + + + + @@ -45878,6 +50838,10 @@ + + + + @@ -45885,6 +50849,10 @@ + + + + @@ -45892,6 +50860,10 @@ + + + + @@ -45899,6 +50871,10 @@ + + + + @@ -45906,6 +50882,10 @@ + + + + @@ -45913,6 +50893,10 @@ + + + + @@ -45920,6 +50904,10 @@ + + + + @@ -45927,6 +50915,10 @@ + + + + @@ -45934,6 +50926,10 @@ + + + + @@ -45941,6 +50937,10 @@ + + + + @@ -45948,6 +50948,10 @@ + + + + @@ -45955,6 +50959,10 @@ + + + + @@ -45962,6 +50970,10 @@ + + + + @@ -46354,13 +51366,13 @@ - - + + - - + + @@ -46485,18 +51497,30 @@ + + + + + + + + + + + + @@ -46699,6 +51723,13 @@ + + + + + + + @@ -46713,6 +51744,13 @@ + + + + + + + @@ -46726,6 +51764,13 @@ + + + + + + + @@ -46740,6 +51785,13 @@ + + + + + + + @@ -46753,6 +51805,13 @@ + + + + + + + @@ -46767,6 +51826,13 @@ + + + + + + + @@ -46783,6 +51849,13 @@ + + + + + + + @@ -46799,6 +51872,13 @@ + + + + + + + @@ -46812,6 +51892,16 @@ + + + + + + + + + + @@ -46825,6 +51915,16 @@ + + + + + + + + + + @@ -46987,6 +52087,9 @@ + + + @@ -46995,6 +52098,10 @@ + + + + @@ -47008,6 +52115,10 @@ + + + + @@ -47137,6 +52248,10 @@ + + + + @@ -47407,6 +52522,11 @@ + + + + + @@ -47423,6 +52543,11 @@ + + + + + @@ -47431,6 +52556,11 @@ + + + + + @@ -47450,6 +52580,11 @@ + + + + + @@ -47467,12 +52602,22 @@ + + + + + + + + + + @@ -47996,10 +53141,24 @@ - - + + + + + + + + + + + + + + + + @@ -48014,6 +53173,9 @@ + + + @@ -48025,8 +53187,17 @@ + + + + + + + + + + - @@ -48312,6 +53483,9 @@ + + + @@ -48930,6 +54104,11 @@ + + + + + @@ -48948,6 +54127,11 @@ + + + + + @@ -48963,6 +54147,16 @@ + + + + + + + + + + @@ -48978,6 +54172,16 @@ + + + + + + + + + + @@ -48997,6 +54201,13 @@ + + + + + + + @@ -49013,6 +54224,11 @@ + + + + + @@ -49024,6 +54240,11 @@ + + + + + @@ -49041,6 +54262,11 @@ + + + + + @@ -49058,6 +54284,11 @@ + + + + + @@ -49075,6 +54306,13 @@ + + + + + + + @@ -49092,6 +54330,13 @@ + + + + + + + @@ -49109,6 +54354,13 @@ + + + + + + + @@ -49501,6 +54753,16 @@ + + + + + + + + + + @@ -49518,6 +54780,16 @@ + + + + + + + + + + @@ -49534,6 +54806,12 @@ + + + + + + @@ -49549,6 +54827,12 @@ + + + + + + @@ -49564,6 +54848,12 @@ + + + + + + @@ -49579,6 +54869,12 @@ + + + + + + @@ -49957,6 +55253,10 @@ + + + + @@ -50168,6 +55468,13 @@ + + + + + + + @@ -50183,6 +55490,11 @@ + + + + + @@ -50200,6 +55512,13 @@ + + + + + + + @@ -50217,6 +55536,11 @@ + + + + + @@ -50233,6 +55557,13 @@ + + + + + + + @@ -50249,6 +55580,13 @@ + + + + + + + @@ -50264,6 +55602,11 @@ + + + + + @@ -50273,6 +55616,11 @@ + + + + + @@ -50288,6 +55636,16 @@ + + + + + + + + + + @@ -50303,6 +55661,11 @@ + + + + + @@ -50318,14 +55681,29 @@ + + + + + + + + + + + + + + + @@ -50345,6 +55723,11 @@ + + + + + @@ -50361,6 +55744,11 @@ + + + + + @@ -51170,6 +56558,9 @@ + + + @@ -51232,6 +56623,9 @@ + + + @@ -51240,6 +56634,9 @@ + + + @@ -51532,9 +56929,15 @@ + + + + + + @@ -51546,6 +56949,9 @@ + + + @@ -51564,6 +56970,10 @@ + + + + @@ -51689,6 +57099,10 @@ + + + + @@ -51703,8 +57117,7 @@ - + @@ -51750,6 +57163,11 @@ + + + + + @@ -51763,6 +57181,11 @@ + + + + + @@ -51770,6 +57193,11 @@ + + + + + @@ -51783,6 +57211,11 @@ + + + + + @@ -51882,6 +57315,13 @@ + + + + + + + @@ -51891,6 +57331,11 @@ + + + + + @@ -51906,6 +57351,13 @@ + + + + + + + @@ -51921,6 +57373,13 @@ + + + + + + + @@ -51939,6 +57398,11 @@ + + + + + @@ -51954,6 +57418,13 @@ + + + + + + + @@ -51969,6 +57440,16 @@ + + + + + + + + + + @@ -51984,9 +57465,24 @@ + + + + + + + + + + + + + + + @@ -51999,6 +57495,11 @@ + + + + + @@ -52006,6 +57507,11 @@ + + + + + @@ -52528,6 +58034,9 @@ + + + @@ -52557,6 +58066,9 @@ + + + @@ -52670,6 +58182,9 @@ + + + @@ -52838,6 +58353,9 @@ + + + @@ -53077,11 +58595,17 @@ + + + + + + @@ -53102,6 +58626,9 @@ + + + @@ -53467,6 +58994,10 @@ + + + + @@ -53474,6 +59005,10 @@ + + + + @@ -53547,6 +59082,11 @@ + + + + + @@ -53562,6 +59102,11 @@ + + + + + @@ -53576,6 +59121,11 @@ + + + + + @@ -53592,6 +59142,13 @@ + + + + + + + @@ -53610,6 +59167,13 @@ + + + + + + + @@ -53622,6 +59186,11 @@ + + + + + @@ -53637,6 +59206,11 @@ + + + + + @@ -53734,6 +59308,13 @@ + + + + + + + @@ -53749,6 +59330,10 @@ + + + + @@ -53761,6 +59346,11 @@ + + + + + @@ -53780,6 +59370,10 @@ + + + + @@ -53797,6 +59391,9 @@ + + + @@ -53804,6 +59401,10 @@ + + + + @@ -54000,6 +59601,9 @@ + + + @@ -54031,8 +59635,8 @@ - - + + @@ -54381,9 +59985,8 @@ - - + + @@ -54499,6 +60102,10 @@ + + + + @@ -54510,21 +60117,33 @@ + + + + + + + + + + + + @@ -56008,6 +61627,9 @@ + + + @@ -56133,6 +61755,13 @@ + + + + + + + @@ -56144,6 +61773,11 @@ + + + + + @@ -56151,6 +61785,11 @@ + + + + + @@ -56160,6 +61799,11 @@ + + + + + @@ -56168,12 +61812,19 @@ + + + + + + + @@ -56210,6 +61861,11 @@ + + + + + @@ -56219,6 +61875,9 @@ + + + @@ -56243,10 +61902,18 @@ + + + + + + + + @@ -56298,6 +61965,9 @@ + + + @@ -57346,7 +63016,7 @@ - + @@ -57794,7 +63464,7 @@ - + @@ -57829,15 +63499,15 @@ - + - + - + @@ -57845,7 +63515,7 @@ - + @@ -58013,6 +63683,9 @@ + + + @@ -58045,8 +63718,8 @@ - - + + @@ -58266,15 +63939,15 @@ - + - + - + @@ -58299,6 +63972,9 @@ + + + @@ -58320,6 +63996,13 @@ + + + + + + + @@ -58338,6 +64021,13 @@ + + + + + + + @@ -58358,6 +64048,13 @@ + + + + + + + @@ -58376,6 +64073,13 @@ + + + + + + + @@ -58396,6 +64100,13 @@ + + + + + + + @@ -58414,6 +64125,13 @@ + + + + + + + @@ -58435,6 +64153,13 @@ + + + + + + + @@ -58456,6 +64181,13 @@ + + + + + + + @@ -58472,6 +64204,16 @@ + + + + + + + + + + @@ -58490,6 +64232,16 @@ + + + + + + + + + + @@ -58497,6 +64249,11 @@ + + + + + @@ -58504,6 +64261,11 @@ + + + + + @@ -58520,6 +64282,11 @@ + + + + + @@ -58536,6 +64303,11 @@ + + + + + @@ -58551,6 +64323,11 @@ + + + + + @@ -58564,6 +64341,11 @@ + + + + + @@ -58574,6 +64356,11 @@ + + + + + @@ -58591,6 +64378,11 @@ + + + + + @@ -58730,63 +64522,63 @@ - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + @@ -58806,6 +64598,13 @@ + + + + + + + @@ -58821,6 +64620,16 @@ + + + + + + + + + + @@ -58836,6 +64645,16 @@ + + + + + + + + + + @@ -58854,6 +64673,11 @@ + + + + + @@ -58871,6 +64695,11 @@ + + + + + @@ -58888,6 +64717,13 @@ + + + + + + + @@ -58905,6 +64741,11 @@ + + + + + @@ -58923,6 +64764,11 @@ + + + + + @@ -58932,21 +64778,25 @@ + + + + - - + + - - + + - - + + @@ -59228,6 +65078,13 @@ + + + + + + + @@ -59244,6 +65101,13 @@ + + + + + + + @@ -59567,12 +65431,14 @@ - + - + @@ -60057,6 +65923,13 @@ + + + + + + + @@ -60073,12 +65946,24 @@ + + + + + + + + + + + + @@ -60086,6 +65971,11 @@ + + + + + @@ -60105,6 +65995,13 @@ + + + + + + + @@ -60115,6 +66012,11 @@ + + + + + @@ -60125,6 +66027,11 @@ + + + + + @@ -60139,6 +66046,16 @@ + + + + + + + + + + @@ -60153,6 +66070,16 @@ + + + + + + + + + + @@ -60160,18 +66087,31 @@ + + + + + + + + + + + + + @@ -60180,11 +66120,11 @@ - + - + @@ -60216,7 +66156,7 @@ - + @@ -60239,7 +66179,7 @@ - + @@ -60306,7 +66246,7 @@ - + @@ -60337,19 +66277,27 @@ - + + + + + + + + + @@ -60706,13 +66654,13 @@ - - + + - - + + @@ -60721,8 +66669,8 @@ - - + + @@ -60731,8 +66679,8 @@ - - + + @@ -60751,6 +66699,13 @@ + + + + + + + @@ -61416,6 +67371,11 @@ + + + + + @@ -61433,6 +67393,13 @@ + + + + + + + @@ -61451,6 +67418,13 @@ + + + + + + + @@ -61468,6 +67442,13 @@ + + + + + + + @@ -61486,6 +67467,13 @@ + + + + + + + @@ -61503,6 +67491,13 @@ + + + + + + + @@ -61521,6 +67516,13 @@ + + + + + + + @@ -61536,6 +67538,11 @@ + + + + + @@ -61555,6 +67562,13 @@ + + + + + + + @@ -61575,6 +67589,13 @@ + + + + + + + @@ -61584,6 +67605,11 @@ + + + + + @@ -61592,6 +67618,11 @@ + + + + + @@ -61608,6 +67639,17 @@ + + + + + + + + + + + @@ -61625,6 +67667,17 @@ + + + + + + + + + + + @@ -61640,6 +67693,11 @@ + + + + + @@ -61655,6 +67713,11 @@ + + + + + @@ -61674,6 +67737,11 @@ + + + + + @@ -61693,6 +67761,11 @@ + + + + + @@ -61711,6 +67784,17 @@ + + + + + + + + + + + @@ -61730,6 +67814,17 @@ + + + + + + + + + + + @@ -62836,21 +68931,25 @@ - + - + - + - + @@ -63193,8 +69292,8 @@ - - + + @@ -64281,6 +70380,9 @@ + + + @@ -64326,8 +70428,8 @@ - - + + @@ -64489,6 +70591,9 @@ + + + @@ -64503,6 +70608,9 @@ + + + @@ -64517,6 +70625,9 @@ + + + @@ -64524,9 +70635,16 @@ + + + + + + + @@ -65261,6 +71379,11 @@ + + + + + @@ -65281,6 +71404,11 @@ + + + + + @@ -65303,6 +71431,11 @@ + + + + + @@ -65313,6 +71446,11 @@ + + + + + @@ -65327,6 +71465,11 @@ + + + + + @@ -65346,6 +71489,11 @@ + + + + + @@ -65360,6 +71508,11 @@ + + + + + @@ -65379,6 +71532,11 @@ + + + + + @@ -65395,6 +71553,13 @@ + + + + + + + @@ -65411,6 +71576,13 @@ + + + + + + + @@ -65427,6 +71599,13 @@ + + + + + + + @@ -65437,6 +71616,11 @@ + + + + + @@ -65456,6 +71640,13 @@ + + + + + + + @@ -65464,6 +71655,11 @@ + + + + + @@ -65475,6 +71671,11 @@ + + + + + @@ -65491,6 +71692,17 @@ + + + + + + + + + + + @@ -65507,6 +71719,17 @@ + + + + + + + + + + + @@ -65522,6 +71745,11 @@ + + + + + @@ -65538,6 +71766,11 @@ + + + + + @@ -65545,6 +71778,11 @@ + + + + + @@ -65552,6 +71790,11 @@ + + + + + @@ -65563,6 +71806,11 @@ + + + + + @@ -65581,6 +71829,11 @@ + + + + + @@ -65591,6 +71844,11 @@ + + + + + @@ -65599,6 +71857,11 @@ + + + + + @@ -65617,6 +71880,11 @@ + + + + + @@ -65627,6 +71895,11 @@ + + + + + @@ -65635,6 +71908,11 @@ + + + + + @@ -65653,6 +71931,11 @@ + + + + + @@ -65664,6 +71947,11 @@ + + + + + @@ -65672,6 +71960,11 @@ + + + + + @@ -65688,6 +71981,11 @@ + + + + + @@ -65698,6 +71996,11 @@ + + + + + @@ -65867,6 +72170,11 @@ + + + + + @@ -65881,10 +72189,20 @@ + + + + + + + + + + @@ -67082,6 +73400,9 @@ + + + @@ -67515,8 +73836,8 @@ - - + + @@ -67556,12 +73877,19 @@ + + + + + + + @@ -67574,12 +73902,18 @@ + + + + + + @@ -67638,6 +73972,11 @@ + + + + + @@ -67648,6 +73987,11 @@ + + + + + @@ -67656,6 +74000,11 @@ + + + + + @@ -67672,6 +74021,11 @@ + + + + + @@ -67681,6 +74035,11 @@ + + + + + @@ -67691,6 +74050,11 @@ + + + + + @@ -67708,6 +74072,11 @@ + + + + + @@ -67715,6 +74084,11 @@ + + + + + @@ -68795,6 +75169,13 @@ + + + + + + + @@ -68811,6 +75192,13 @@ + + + + + + + @@ -68827,6 +75215,13 @@ + + + + + + + @@ -68843,6 +75238,13 @@ + + + + + + + @@ -68859,6 +75261,13 @@ + + + + + + + @@ -68875,6 +75284,13 @@ + + + + + + + @@ -68893,6 +75309,13 @@ + + + + + + + @@ -68911,6 +75334,13 @@ + + + + + + + @@ -68929,6 +75359,13 @@ + + + + + + + @@ -68947,6 +75384,13 @@ + + + + + + + @@ -68965,6 +75409,13 @@ + + + + + + + @@ -68983,6 +75434,13 @@ + + + + + + + @@ -68993,6 +75451,11 @@ + + + + + @@ -69014,6 +75477,13 @@ + + + + + + + @@ -69035,6 +75505,13 @@ + + + + + + + @@ -69056,6 +75533,13 @@ + + + + + + + @@ -69077,6 +75561,13 @@ + + + + + + + @@ -69086,6 +75577,11 @@ + + + + + @@ -69103,6 +75599,17 @@ + + + + + + + + + + + @@ -69120,6 +75627,17 @@ + + + + + + + + + + + @@ -69133,6 +75651,11 @@ + + + + + @@ -69150,6 +75673,17 @@ + + + + + + + + + + + @@ -69167,6 +75701,17 @@ + + + + + + + + + + + @@ -69180,6 +75725,11 @@ + + + + + diff --git a/data/libs/compat/compat.lua b/data/libs/compat/compat.lua index cd9b8146763..061d1dbe47e 100644 --- a/data/libs/compat/compat.lua +++ b/data/libs/compat/compat.lua @@ -1,38 +1,12 @@ -TRUE = true -FALSE = false - -MESSAGE_STATUS_CONSOLE_RED = MESSAGE_GAMEMASTER_CONSOLE - -MESSAGE_STATUS_DEFAULT = MESSAGE_LOGIN -MESSAGE_STATUS_WARNING = MESSAGE_ADMINISTRADOR -MESSAGE_EVENT_ADVANCE = MESSAGE_EVENT_ADVANCE - -MESSAGE_STATUS_SMALL = MESSAGE_FAILURE -MESSAGE_INFO_DESCR = MESSAGE_LOOK -MESSAGE_DAMAGE_DEALT = MESSAGE_DAMAGE_DEALT -MESSAGE_DAMAGE_RECEIVED = MESSAGE_DAMAGE_RECEIVED -MESSAGE_EVENT_DEFAULT = MESSAGE_STATUS - -MESSAGE_EVENT_ORANGE = TALKTYPE_MONSTER_SAY -MESSAGE_STATUS_CONSOLE_ORANGE = TALKTYPE_MONSTER_YELL - if type(result) then result = Result end + result.getDataInt = result.getNumber result.getDataLong = result.getNumber result.getDataString = result.getString result.getDataStream = result.getStream -LUA_ERROR = false -LUA_NO_ERROR = true - -STACKPOS_GROUND = 0 -STACKPOS_FIRST_ITEM_ABOVE_GROUNDTILE = 1 -STACKPOS_SECOND_ITEM_ABOVE_GROUNDTILE = 2 -STACKPOS_THIRD_ITEM_ABOVE_GROUNDTILE = 3 -STACKPOS_FOURTH_ITEM_ABOVE_GROUNDTILE = 4 -STACKPOS_FIFTH_ITEM_ABOVE_GROUNDTILE = 5 STACKPOS_TOP_CREATURE = 253 STACKPOS_TOP_FIELD = 254 STACKPOS_TOP_MOVABLE_ITEM_OR_CREATURE = 255 @@ -41,11 +15,6 @@ THING_TYPE_PLAYER = CREATURETYPE_PLAYER + 1 THING_TYPE_MONSTER = CREATURETYPE_MONSTER + 1 THING_TYPE_NPC = CREATURETYPE_NPC + 1 -COMBAT_POISONDAMAGE = COMBAT_EARTHDAMAGE -CONDITION_EXHAUST = CONDITION_EXHAUST_WEAPON -TALKTYPE_ORANGE_1 = TALKTYPE_MONSTER_SAY -TALKTYPE_ORANGE_2 = TALKTYPE_MONSTER_YELL - function pushThing(thing) local t = { uid = 0, itemid = 0, type = 0, actionid = 0 } if thing then @@ -84,7 +53,7 @@ Combat.setCondition = function(...) end setCombatCondition = function(...) - logger.warn("[setCombatCondition] - Function was renamed to addCombatCondition and will be removed in the future") + logger.warn("[setCombatCondition] - Function was renamed to Combat.addCondition and will be removed in the future") Combat.addCondition(...) end @@ -95,73 +64,121 @@ addDamageCondition = Condition.addDamage addOutfitCondition = Condition.setOutfit function doCombat(cid, combat, var) + local line = debug.getinfo(2).currentline + local source = debug.getinfo(2).source:match("@?(.*)") + logger.warn("Deprecation Warning: The function 'doCombat(cid, combat, var)' is outdated. Please use the new format 'combat:execute(cid, var)'. Update needed at: Line {}, Source: {}.", line, source) return combat:execute(cid, var) end function isCreature(cid) + local line = debug.getinfo(2).currentline + local source = debug.getinfo(2).source:match("@?(.*)") + logger.warn("Deprecation Warning: The function 'isCreature(cid)' is outdated. Please use the new format 'Creature(cid)'. Update needed at: Line {}, Source: {}.", line, source) return Creature(cid) ~= nil end function isPlayer(cid) + local line = debug.getinfo(2).currentline + local source = debug.getinfo(2).source:match("@?(.*)") + logger.warn("Deprecation Warning: The function 'isPlayer(cid)' is outdated. Please use the new format 'Player(cid)'. Update needed at: Line {}, Source: {}.", line, source) return Player(cid) ~= nil end function isMonster(cid) + local line = debug.getinfo(2).currentline + local source = debug.getinfo(2).source:match("@?(.*)") + logger.warn("Deprecation Warning: The function 'isMonster(cid)' is outdated. Please use the new format 'Monster(cid)'. Update needed at: Line {}, Source: {}.", line, source) return Monster(cid) ~= nil end function isSummon(cid) + local line = debug.getinfo(2).currentline + local source = debug.getinfo(2).source:match("@?(.*)") + logger.warn("Deprecation Warning: The function 'isSummon(cid)' is outdated. Please use the new format 'c:getMaster()', where 'c' refers to a Creature (player or monster). Update needed at: Line {}, Source: {}.", line, source) return Creature(cid):getMaster() ~= nil end function isNpc(cid) + local line = debug.getinfo(2).currentline + local source = debug.getinfo(2).source:match("@?(.*)") + logger.warn("Deprecation Warning: The function 'isNpc(cid)' is outdated. Please use the new format 'Npc(cid)'. Update needed at: Line {}, Source: {}.", line, source) return Npc(cid) ~= nil end function isItem(uid) + local line = debug.getinfo(2).currentline + local source = debug.getinfo(2).source:match("@?(.*)") + logger.warn("Deprecation Warning: The function 'isItem(uid)' is outdated. Please use the new format 'Item(uid)'. Update needed at: Line {}, Source: {}.", line, source) return Item(uid) ~= nil end function isContainer(uid) + local line = debug.getinfo(2).currentline + local source = debug.getinfo(2).source:match("@?(.*)") + logger.warn("Deprecation Warning: The function 'isContainer(uid)' is outdated. Please use the new format 'Container(uid)'. Update needed at: Line {}, Source: {}.", line, source) return Container(uid) ~= nil end function getCreatureName(cid) + local line = debug.getinfo(2).currentline + local source = debug.getinfo(2).source:match("@?(.*)") + logger.warn("Deprecation Warning: The function 'getCreatureName(cid)' is outdated. Please use the new format 'c:getName()', where 'c' refers to a Creature (player or monster). Update needed at: Line {}, Source: {}.", line, source) local c = Creature(cid) return c and c:getName() or false end function getCreatureHealth(cid) + local line = debug.getinfo(2).currentline + local source = debug.getinfo(2).source:match("@?(.*)") + logger.warn("Deprecation Warning: The function 'getCreatureHealth(cid)' is outdated. Please use the new format 'c:getHealth()', where 'c' refers to a Creature (player or monster). Update needed at: Line {}, Source: {}.", line, source) local c = Creature(cid) return c and c:getHealth() or false end function getCreatureMaxHealth(cid) + local line = debug.getinfo(2).currentline + local source = debug.getinfo(2).source:match("@?(.*)") + logger.warn("Deprecation Warning: The function 'getCreatureMaxHealth(cid)' is outdated. Please use the new format 'c:getMaxHealth()', where 'c' refers to a Creature (player or monster). Update needed at: Line {}, Source: {}.", line, source) local c = Creature(cid) return c and c:getMaxHealth() or false end function getCreaturePosition(cid) + local line = debug.getinfo(2).currentline + local source = debug.getinfo(2).source:match("@?(.*)") + logger.warn("Deprecation Warning: The function 'getCreaturePosition(cid)' is outdated. Please use the new format 'c:getPosition()', where 'c' refers to a Creature (player or monster). Update needed at: Line {}, Source: {}.", line, source) local c = Creature(cid) return c and c:getPosition() or false end function getCreatureOutfit(cid) + local line = debug.getinfo(2).currentline + local source = debug.getinfo(2).source:match("@?(.*)") + logger.warn("Deprecation Warning: The function 'getCreatureOutfit(cid)' is outdated. Please use the new format 'c:getOutfit()', where 'c' refers to a Creature (player or monster). Update needed at: Line {}, Source: {}.", line, source) local c = Creature(cid) return c and c:getOutfit() or false end function getCreatureSpeed(cid) + local line = debug.getinfo(2).currentline + local source = debug.getinfo(2).source:match("@?(.*)") + logger.warn("Deprecation Warning: The function 'getCreatureSpeed(cid)' is outdated. Please use the new format 'c:getSpeed()', where 'c' refers to a Creature (player or monster). Update needed at: Line {}, Source: {}.", line, source) local c = Creature(cid) return c and c:getSpeed() or false end function getCreatureBaseSpeed(cid) + local line = debug.getinfo(2).currentline + local source = debug.getinfo(2).source:match("@?(.*)") + logger.warn("Deprecation Warning: The function 'getCreatureBaseSpeed(cid)' is outdated. Please use the new format 'c:getBaseSpeed()', where 'c' refers to a Creature (player or monster). Update needed at: Line {}, Source: {}.", line, source) local c = Creature(cid) return c and c:getBaseSpeed() or false end function getCreatureTarget(cid) + local line = debug.getinfo(2).currentline + local source = debug.getinfo(2).source:match("@?(.*)") + logger.warn("Deprecation Warning: The function 'getCreatureTarget(cid)' is outdated. Please use the new format 'c:getTarget():getId()', where 'c' refers to a Creature (player or monster). Update needed at: Line {}, Source: {}.", line, source) local c = Creature(cid) if c then local target = c:getTarget() @@ -171,6 +188,9 @@ function getCreatureTarget(cid) end function getCreatureMaster(cid) + local line = debug.getinfo(2).currentline + local source = debug.getinfo(2).source:match("@?(.*)") + logger.warn("Deprecation Warning: The function 'getCreatureMaster(cid)' is outdated. Please use the new format 'c:getMaster():getId()', where 'c' refers to a Creature (player or monster). Update needed at: Line {}, Source: {}.", line, source) local c = Creature(cid) if c then local master = c:getMaster() @@ -181,7 +201,7 @@ end function getCreatureSummons(cid) local c = Creature(cid) - if c == nil then + if not c then return false end @@ -195,16 +215,25 @@ end getCreaturePos = getCreaturePosition function doCreatureAddHealth(cid, health) + local line = debug.getinfo(2).currentline + local source = debug.getinfo(2).source:match("@?(.*)") + logger.warn("Deprecation Warning: The function 'doCreatureAddHealth(cid, health)' is outdated. Please use the new format 'c:addHealth(health)', where 'c' refers to a Creature (player or monster). Update needed at: Line {}, Source: {}.", line, source) local c = Creature(cid) return c and c:addHealth(health) or false end function doRemoveCreature(cid) + local line = debug.getinfo(2).currentline + local source = debug.getinfo(2).source:match("@?(.*)") + logger.warn("Deprecation Warning: The function 'doRemoveCreature(cid)' is outdated. Please use the new format 'c:remove()', where 'c' refers to a Creature (player or monster). Update needed at: Line {}, Source: {}.", line, source) local c = Creature(cid) return c and c:remove() or false end function doCreatureSetLookDir(cid, direction) + local line = debug.getinfo(2).currentline + local source = debug.getinfo(2).source:match("@?(.*)") + logger.warn("Deprecation Warning: The function 'doCreatureSetLookDir(cid, direction)' is outdated. Please use the new format 'c:setDirection(direction)', where 'c' refers to a Creature (player or monster). Update needed at: Line {}, Source: {}.", line, source) local c = Creature(cid) return c and c:setDirection(direction) or false end @@ -582,7 +611,7 @@ function getPlayerGUIDByName(name) local resultId = db.storeQuery("SELECT `id` FROM `players` WHERE `name` = " .. db.escapeString(name)) if resultId ~= false then local guid = Result.getNumber(resultId, "id") - result.free(resultId) + Result.free(resultId) return guid end return 0 @@ -597,7 +626,7 @@ function getAccountNumberByPlayerName(name) local resultId = db.storeQuery("SELECT `account_id` FROM `players` WHERE `name` = " .. db.escapeString(name)) if resultId ~= false then local accountId = Result.getNumber(resultId, "account_id") - result.free(resultId) + Result.free(resultId) return accountId end return 0 @@ -1032,7 +1061,7 @@ function getGuildId(guildName) end local guildId = Result.getNumber(resultId, "id") - result.free(resultId) + Result.free(resultId) return guildId end diff --git a/data/libs/core/global_storage.lua b/data/libs/core/global_storage.lua index 778073f3ca6..cfca535dc4b 100644 --- a/data/libs/core/global_storage.lua +++ b/data/libs/core/global_storage.lua @@ -25,5 +25,6 @@ Global = { Storage = { FamiliarSummonEvent10 = 30054, FamiliarSummonEvent60 = 30055, + CobraFlask = 30056, }, } diff --git a/data/libs/functions/creature.lua b/data/libs/functions/creature.lua index 29e0303ca7e..be95a45144c 100644 --- a/data/libs/functions/creature.lua +++ b/data/libs/functions/creature.lua @@ -78,10 +78,6 @@ function Creature:setMonsterOutfit(monster, time) return false end - if self:isPlayer() and not (self:hasFlag(PlayerFlag_CanIllusionAll) or monsterType:isIllusionable()) then - return false - end - local condition = Condition(CONDITION_OUTFIT) condition:setOutfit(monsterType:getOutfit()) condition:setTicks(time) diff --git a/data/libs/functions/functions.lua b/data/libs/functions/functions.lua index 46ae81e7b1f..9eb1b0b57b5 100644 --- a/data/libs/functions/functions.lua +++ b/data/libs/functions/functions.lua @@ -588,7 +588,7 @@ function cleanAreaQuest(frompos, topos, itemtable, blockmonsters) return true end -function kickerPlayerRoomAfferMin(playername, fromPosition, toPosition, teleportPos, message, monsterName, minutes, firstCall, itemtable, blockmonsters) +function kickerPlayerRoomAfterMin(playername, fromPosition, toPosition, teleportPos, message, monsterName, minutes, firstCall, itemtable, blockmonsters) local players = false if type(playername) == table then players = true @@ -658,7 +658,7 @@ function kickerPlayerRoomAfferMin(playername, fromPosition, toPosition, teleport end local min = 60 -- Use the 60 for 1 minute if firstCall then - addEvent(kickerPlayerRoomAfferMin, 1000, playername, fromPosition, toPosition, teleportPos, message, monsterName, minutes, false, itemtable, blockmonsters) + addEvent(kickerPlayerRoomAfterMin, 1000, playername, fromPosition, toPosition, teleportPos, message, monsterName, minutes, false, itemtable, blockmonsters) else local subt = minutes - 1 if monsterName ~= "" then @@ -666,7 +666,7 @@ function kickerPlayerRoomAfferMin(playername, fromPosition, toPosition, teleport subt = 2 end end - addEvent(kickerPlayerRoomAfferMin, min * 1000, playername, fromPosition, toPosition, teleportPos, message, monsterName, subt, false, itemtable, blockmonsters) + addEvent(kickerPlayerRoomAfterMin, min * 1000, playername, fromPosition, toPosition, teleportPos, message, monsterName, subt, false, itemtable, blockmonsters) end end @@ -850,47 +850,6 @@ function pack(t, ...) return t end -if not PLAYER_STORAGE then - PLAYER_STORAGE = {} -end - -function Player:setSpecialStorage(storage, value) - if not PLAYER_STORAGE[self:getGuid()] then - self:loadSpecialStorage() - end - - PLAYER_STORAGE[self:getGuid()][storage] = value -end - -function Player:getSpecialStorage(storage) - if not PLAYER_STORAGE[self:getGuid()] then - self:loadSpecialStorage() - end - - return PLAYER_STORAGE[self:getGuid()][storage] -end - -function Player:loadSpecialStorage() - if not PLAYER_STORAGE then - PLAYER_STORAGE = {} - end - - PLAYER_STORAGE[self:getGuid()] = {} - local resultId = db.storeQuery("SELECT * FROM `player_misc` WHERE `player_id` = " .. self:getGuid()) - if resultId then - local info = Result.getStream(resultId, "info") or "{}" - unserializeTable(info, PLAYER_STORAGE[self:getGuid()]) - end -end - -function Player:saveSpecialStorage() - if PLAYER_STORAGE and PLAYER_STORAGE[self:getGuid()] then - local tmp = serializeTable(PLAYER_STORAGE[self:getGuid()]) - db.query("DELETE FROM `player_misc` WHERE `player_id` = " .. self:getGuid()) - db.query(string.format("INSERT INTO `player_misc` (`player_id`, `info`) VALUES (%d, %s)", self:getGuid(), db.escapeBlob(tmp, #tmp))) - end -end - -- Can be used in every boss function kickPlayersAfterTime(players, fromPos, toPos, exit) for _, pid in pairs(players) do diff --git a/data/libs/functions/modal_window_helper.lua b/data/libs/functions/modal_window_helper.lua index 9de5e394cc5..ed169805b06 100644 --- a/data/libs/functions/modal_window_helper.lua +++ b/data/libs/functions/modal_window_helper.lua @@ -209,7 +209,7 @@ function ModalWindow:sendToPlayer(player) local playerId = player:getId() ModalWindows[playerId] = ModalWindows[playerId] or {} ModalWindows[playerId][self.modalWindowId] = self - player:registerEvent("modalWindowHelper") + player:registerEvent("ModalWindowHelper") self.using = self.using + 1 return modalWindow:sendToPlayer(player) end diff --git a/data/libs/functions/monstertype.lua b/data/libs/functions/monstertype.lua index bd86b38a439..168cab13109 100644 --- a/data/libs/functions/monstertype.lua +++ b/data/libs/functions/monstertype.lua @@ -10,6 +10,10 @@ function MonsterType:generateLootRoll(config, resultTable) local factor = config.factor or 1.0 local uniqueItems = {} + if self:isRewardBoss() then + factor = factor * SCHEDULE_BOSS_LOOT_RATE / 100 + end + local result = resultTable or {} for _, item in ipairs(monsterLoot) do local iType = ItemType(item.itemId) diff --git a/data/libs/functions/player.lua b/data/libs/functions/player.lua index 810b72c0002..03e88d7ccca 100644 --- a/data/libs/functions/player.lua +++ b/data/libs/functions/player.lua @@ -316,40 +316,6 @@ function Player.getMarriageDescription(thing) return descr end -function Player.sendWeatherEffect(self, groundEffect, fallEffect, thunderEffect) - local position, random = self:getPosition(), math.random - position.x = position.x + random(-7, 7) - position.y = position.y + random(-5, 5) - local fromPosition = Position(position.x + 1, position.y, position.z) - fromPosition.x = position.x - 7 - fromPosition.y = position.y - 5 - local tile, getGround - for Z = 1, 7 do - fromPosition.z = Z - position.z = Z - tile = Tile(position) - if tile then - -- If there is a tile, stop checking floors - fromPosition:sendDistanceEffect(position, fallEffect) - position:sendMagicEffect(groundEffect, self) - getGround = tile:getGround() - if getGround and ItemType(getGround:getId()):getFluidSource() == 1 then - position:sendMagicEffect(CONST_ME_LOSEENERGY, self) - end - break - end - end - if thunderEffect and tile and not tile:hasFlag(TILESTATE_PROTECTIONZONE) then - if random(2) == 1 then - local topCreature = tile:getTopCreature() - if topCreature and topCreature:isPlayer() and topCreature:getAccountType() < ACCOUNT_TYPE_SENIORTUTOR then - position:sendMagicEffect(CONST_ME_BIGCLOUDS, self) - doTargetCombatHealth(0, self, COMBAT_ENERGYDAMAGE, -weatherConfig.minDMG, -weatherConfig.maxDMG, CONST_ME_NONE) - end - end - end -end - function Player:getFamiliarName() local vocation = FAMILIAR_ID[self:getVocation():getBaseId()] local familiarName @@ -1000,3 +966,37 @@ do return true end end + +function Player:questKV(questName) + return self:kv():scoped("quests"):scoped(questName) +end + +function Player:canGetReward(rewardId, questName) + if self:questKV(questName):get("completed") then + self:sendTextMessage(MESSAGE_EVENT_ADVANCE, "The box is empty.") + return false + end + + local rewardItem = ItemType(rewardId) + if not rewardItem then + self:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Reward item is wrong, please contact an administrator.") + return false + end + + local itemWeight = rewardItem:getWeight() / 100 + local baseMessage = "You have found a " .. rewardItem:getName() + local backpack = self:getSlotItem(CONST_SLOT_BACKPACK) + if not backpack or backpack:getEmptySlots(true) < 1 then + baseMessage = baseMessage .. ", but you have no room to take it." + self:sendTextMessage(MESSAGE_EVENT_ADVANCE, baseMessage) + return false + end + + if (self:getFreeCapacity() / 100) < itemWeight then + baseMessage = baseMessage .. ". Weighing " .. itemWeight .. " oz, it is too heavy for you to carry." + self:sendTextMessage(MESSAGE_EVENT_ADVANCE, baseMessage) + return false + end + + return true +end diff --git a/data/libs/functions/revscriptsys.lua b/data/libs/functions/revscriptsys.lua index 5a31ec086f3..84b8275e3ce 100644 --- a/data/libs/functions/revscriptsys.lua +++ b/data/libs/functions/revscriptsys.lua @@ -108,7 +108,7 @@ do local function EventCallbackNewIndex(self, key, value) local func = eventCallbacks[key] if func and type(func) == "function" then - logger.debug("[Registering EventCallback: {}", key) + logger.trace("[Registering EventCallback: {}", key) func(self, value) self:type(key) else diff --git a/data/libs/systems/hireling.lua b/data/libs/systems/hireling.lua index 42390a2cc01..8b5784759fa 100644 --- a/data/libs/systems/hireling.lua +++ b/data/libs/systems/hireling.lua @@ -386,8 +386,24 @@ end -- [[ GLOBAL FUNCTIONS DEFINITIONS ]] function SaveHirelings() + local successCount = 0 + local failedCount = 0 + for _, hireling in ipairs(HIRELINGS) do - hireling:save() + local success = hireling:save() + + if not success then + failedCount = failedCount + 1 + logger.warn("Failed to save hireling: {} (ID: {}).", hireling:getName(), hireling:getId()) + else + successCount = successCount + 1 + end + end + + if successCount == #HIRELINGS then + logger.info("All hirelings successfully saved.") + else + logger.warn("Failed to save {} hirelings.", failedCount) end end diff --git a/data/libs/systems/load.lua b/data/libs/systems/load.lua index bc52090f27b..5c7073ad64e 100644 --- a/data/libs/systems/load.lua +++ b/data/libs/systems/load.lua @@ -1,10 +1,8 @@ -- Load systems functions -dofile(CORE_DIRECTORY .. "/libs/systems/achievements.lua") dofile(CORE_DIRECTORY .. "/libs/systems/concoctions.lua") dofile(CORE_DIRECTORY .. "/libs/systems/daily_reward.lua") dofile(CORE_DIRECTORY .. "/libs/systems/encounters.lua") dofile(CORE_DIRECTORY .. "/libs/systems/exaltation_forge.lua") -dofile(CORE_DIRECTORY .. "/libs/systems/exercise_training.lua") dofile(CORE_DIRECTORY .. "/libs/systems/familiar.lua") dofile(CORE_DIRECTORY .. "/libs/systems/features.lua") dofile(CORE_DIRECTORY .. "/libs/systems/hazard.lua") diff --git a/data/modules/scripts/gamestore/init.lua b/data/modules/scripts/gamestore/init.lua index b82ff7278f1..4fa9daea28b 100644 --- a/data/modules/scripts/gamestore/init.lua +++ b/data/modules/scripts/gamestore/init.lua @@ -412,6 +412,7 @@ function parseBuyStoreOffer(playerId, msg) and offer.type ~= GameStore.OfferTypes.OFFER_TYPE_EXPBOOST and offer.type ~= GameStore.OfferTypes.OFFER_TYPE_PREYBONUS and offer.type ~= GameStore.OfferTypes.OFFER_TYPE_PREYSLOT + and offer.type ~= GameStore.OfferTypes.OFFER_TYPE_HUNTINGSLOT and offer.type ~= GameStore.OfferTypes.OFFER_TYPE_TEMPLE and offer.type ~= GameStore.OfferTypes.OFFER_TYPE_SEXCHANGE and offer.type ~= GameStore.OfferTypes.OFFER_TYPE_INSTANT_REWARD_ACCESS @@ -442,9 +443,9 @@ function parseBuyStoreOffer(playerId, msg) -- Handled errors have a code index and unhandled errors do not local pcallOk, pcallError = pcall(function() if offer.type == GameStore.OfferTypes.OFFER_TYPE_ITEM then - GameStore.processItemPurchase(player, offer.itemtype, offer.count, offer.movable, offer.setOwner) + GameStore.processItemPurchase(player, offer.itemtype, offer.count or 1, offer.movable, offer.setOwner) elseif offer.type == GameStore.OfferTypes.OFFER_TYPE_ITEM_UNIQUE then - GameStore.processItemPurchase(player, offer.itemtype, offer.count, offer.movable, offer.setOwner) + GameStore.processItemPurchase(player, offer.itemtype, offer.count or 1, offer.movable, offer.setOwner) elseif offer.type == GameStore.OfferTypes.OFFER_TYPE_INSTANT_REWARD_ACCESS then GameStore.processInstantRewardAccess(player, offer.count) elseif offer.type == GameStore.OfferTypes.OFFER_TYPE_CHARMS then @@ -472,6 +473,8 @@ function parseBuyStoreOffer(playerId, msg) GameStore.processSexChangePurchase(player) elseif offer.type == GameStore.OfferTypes.OFFER_TYPE_EXPBOOST then GameStore.processExpBoostPuchase(player) + elseif offer.type == GameStore.OfferTypes.OFFER_TYPE_HUNTINGSLOT then + GameStore.processTaskHuntingThirdSlot(player) elseif offer.type == GameStore.OfferTypes.OFFER_TYPE_PREYSLOT then GameStore.processPreyThirdSlot(player) elseif offer.type == GameStore.OfferTypes.OFFER_TYPE_PREYBONUS then @@ -625,6 +628,7 @@ function Player.canBuyOffer(self, offer) offer.type ~= GameStore.OfferTypes.OFFER_TYPE_NAMECHANGE and offer.type ~= GameStore.OfferTypes.OFFER_TYPE_EXPBOOST and offer.type ~= GameStore.OfferTypes.OFFER_TYPE_PREYSLOT + and offer.type ~= GameStore.OfferTypes.OFFER_TYPE_HUNTINGSLOT and offer.type ~= GameStore.OfferTypes.OFFER_TYPE_PREYBONUS and offer.type ~= GameStore.OfferTypes.OFFER_TYPE_TEMPLE and offer.type ~= GameStore.OfferTypes.OFFER_TYPE_SEXCHANGE @@ -1585,15 +1589,26 @@ function GameStore.processStackablePurchase(player, offerId, offerCount, offerNa return error({ code = 0, message = errorMsg }) end + local iType = ItemType(offerId) + if not iType then + return nil + end + local inbox = player:getStoreInbox() if inbox then - local item = inbox:addItem(offerId, offerCount) - if item then - if movable ~= true then - item:setAttribute(ITEM_ATTRIBUTE_STORE, systemTime()) + local stackSize = iType:getStackSize() + local remainingCount = offerCount + while remainingCount > 0 do + local countToAdd = math.min(remainingCount, stackSize) + local inboxItem = inbox:addItem(offerId, countToAdd) + if inboxItem then + if movable ~= true then + inboxItem:setAttribute(ITEM_ATTRIBUTE_STORE, systemTime()) + end + else + return error({ code = 0, message = "Error adding item to store inbox." }) end - else - return error({ code = 0, message = "Error adding item to store inbox." }) + remainingCount = remainingCount - countToAdd end end end @@ -1616,20 +1631,22 @@ function GameStore.processHouseRelatedPurchase(player, offer) local inbox = player:getStoreInbox() if inbox then for _, itemId in ipairs(itemIds) do - local decoKit = inbox:addItem(ITEM_DECORATION_KIT, 1) - if decoKit then - decoKit:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, "You bought this item in the Store.\nUnwrap it in your own house to create a <" .. ItemType(itemId):getName() .. ">.") - decoKit:setCustomAttribute("unWrapId", itemId) - if isCaskItem(itemId) then - decoKit:setAttribute(ITEM_ATTRIBUTE_DATE, offer.count) - end + for i = 1, offer.count do + local decoKit = inbox:addItem(ITEM_DECORATION_KIT, 1) + if decoKit then + decoKit:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, "You bought this item in the Store.\nUnwrap it in your own house to create a <" .. ItemType(itemId):getName() .. ">.") + decoKit:setCustomAttribute("unWrapId", itemId) + if isCaskItem(itemId) then + decoKit:setAttribute(ITEM_ATTRIBUTE_DATE, offer.count) + end - if offer.movable ~= true then - decoKit:setAttribute(ITEM_ATTRIBUTE_STORE, systemTime()) + if offer.movable ~= true then + decoKit:setAttribute(ITEM_ATTRIBUTE_STORE, systemTime()) + end end end + player:sendUpdateContainer(inbox) end - player:sendUpdateContainer(inbox) end end diff --git a/data/npclib/npc_system/modules.lua b/data/npclib/npc_system/modules.lua index 5e7db715080..f9177d9c96d 100644 --- a/data/npclib/npc_system/modules.lua +++ b/data/npclib/npc_system/modules.lua @@ -240,6 +240,7 @@ if Modules == nil then player:kv():set("npc-exhaustion", os.time() + 3) -- 3 seconds player:teleportTo(destination) playerPosition:sendMagicEffect(CONST_ME_TELEPORT) + player:addAchievementProgress("Ship's Kobold", 1250) -- What a foolish Quest - Mission 3 if Storage.WhatAFoolish.PieBoxTimer ~= nil then diff --git a/data-otservbr-global/scripts/actions/door/custom_door.lua b/data/scripts/actions/doors/custom_door.lua similarity index 100% rename from data-otservbr-global/scripts/actions/door/custom_door.lua rename to data/scripts/actions/doors/custom_door.lua diff --git a/data-otservbr-global/scripts/actions/door/key_door.lua b/data/scripts/actions/doors/key_door.lua similarity index 97% rename from data-otservbr-global/scripts/actions/door/key_door.lua rename to data/scripts/actions/doors/key_door.lua index 4f748b6b635..5823c17a2e9 100644 --- a/data-otservbr-global/scripts/actions/door/key_door.lua +++ b/data/scripts/actions/doors/key_door.lua @@ -29,7 +29,7 @@ local keyDoor = Action() function keyDoor.onUse(player, item, fromPosition, target, toPosition, isHotkey) -- It is locked msg if table.contains(keyLockedDoor, item.itemid) or (table.contains(keyUnlockedDoor, item.itemid) and table.contains({ 1001, 101 }, item.actionid)) then - player:sendTextMessage(MESSAGE_INFO_DESCR, "It is locked.") + player:sendTextMessage(MESSAGE_LOOK, "It is locked.") return true end diff --git a/data-otservbr-global/scripts/actions/door/level_door.lua b/data/scripts/actions/doors/level_door.lua similarity index 100% rename from data-otservbr-global/scripts/actions/door/level_door.lua rename to data/scripts/actions/doors/level_door.lua diff --git a/data-otservbr-global/scripts/actions/door/quest_door.lua b/data/scripts/actions/doors/quest_door.lua similarity index 100% rename from data-otservbr-global/scripts/actions/door/quest_door.lua rename to data/scripts/actions/doors/quest_door.lua diff --git a/data-otservbr-global/scripts/actions/other/anniversary_reward_boxes.lua b/data/scripts/actions/items/anniversary_reward_boxes.lua similarity index 92% rename from data-otservbr-global/scripts/actions/other/anniversary_reward_boxes.lua rename to data/scripts/actions/items/anniversary_reward_boxes.lua index 8327222a570..d5d36bb7455 100644 --- a/data-otservbr-global/scripts/actions/other/anniversary_reward_boxes.lua +++ b/data/scripts/actions/items/anniversary_reward_boxes.lua @@ -55,22 +55,24 @@ local config = { } local rewardBox = Action() + function rewardBox.onUse(player, item, fromPosition, itemEx, toPosition) local box = config[item:getId()] - if not box or not player then + if not box then return false end - for i = 1, #box do - if box[i] then - player:addItem(box[i].id, box[i].count) - player:getPosition():sendMagicEffect(CONST_ME_PRISMATIC_SPARK) - end + + for _, reward in ipairs(box) do + player:addItem(reward.id, reward.count) + player:getPosition():sendMagicEffect(CONST_ME_PRISMATIC_SPARK) end + item:remove() return true end -for index, value in pairs(config) do +for index, _ in pairs(config) do rewardBox:id(index) end + rewardBox:register() diff --git a/data/scripts/actions/items/banana_chocolate_shake.lua b/data/scripts/actions/items/banana_chocolate_shake.lua new file mode 100644 index 00000000000..083b4f965da --- /dev/null +++ b/data/scripts/actions/items/banana_chocolate_shake.lua @@ -0,0 +1,18 @@ +local bananaChocolateShake = Action() + +function bananaChocolateShake.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if player:hasExhaustion("special-foods-cooldown") then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You need to wait before using it again.") + return true + end + + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You don't really know what this did to you, but suddenly you feel very happy.") + player:say("Slurp.", TALKTYPE_MONSTER_SAY) + player:getPosition():sendMagicEffect(CONST_ME_HEARTS) + player:setExhaustion("special-foods-cooldown", 10 * 60) + item:remove(1) + return true +end + +bananaChocolateShake:id(9083) +bananaChocolateShake:register() diff --git a/data/scripts/actions/items/blessed_steak.lua b/data/scripts/actions/items/blessed_steak.lua new file mode 100644 index 00000000000..32b2d12162e --- /dev/null +++ b/data/scripts/actions/items/blessed_steak.lua @@ -0,0 +1,19 @@ +local blessedSteak = Action() + +function blessedSteak.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if player:hasExhaustion("special-foods-cooldown") then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You need to wait before using it again.") + return true + end + + player:addMana(player:getMaxMana()) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your mana has been refilled.") + player:say("Chomp.", TALKTYPE_MONSTER_SAY) + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) + player:setExhaustion("special-foods-cooldown", 10 * 60) + item:remove(1) + return true +end + +blessedSteak:id(9086) +blessedSteak:register() diff --git a/data/scripts/actions/items/carrot_cake.lua b/data/scripts/actions/items/carrot_cake.lua new file mode 100644 index 00000000000..28432188685 --- /dev/null +++ b/data/scripts/actions/items/carrot_cake.lua @@ -0,0 +1,26 @@ +local distanceCondition = Condition(CONDITION_ATTRIBUTES) +distanceCondition:setParameter(CONDITION_PARAM_SUBID, JeanPierreDistance) +distanceCondition:setParameter(CONDITION_PARAM_BUFF_SPELL, 1) +distanceCondition:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) +distanceCondition:setParameter(CONDITION_PARAM_SKILL_DISTANCE, 10) +distanceCondition:setParameter(CONDITION_PARAM_FORCEUPDATE, true) + +local carrotCake = Action() + +function carrotCake.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if player:hasExhaustion("special-foods-cooldown") then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You need to wait before using it again.") + return true + end + + player:addCondition(distanceCondition) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You feel more focused.") + player:say("Mmmm.", TALKTYPE_MONSTER_SAY) + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) + player:setExhaustion("special-foods-cooldown", 10 * 60) + item:remove(1) + return true +end + +carrotCake:id(9087) +carrotCake:register() diff --git a/data-otservbr-global/scripts/custom/change_gold.lua b/data/scripts/actions/items/change_gold.lua similarity index 89% rename from data-otservbr-global/scripts/custom/change_gold.lua rename to data/scripts/actions/items/change_gold.lua index bcde27d9fca..c81ebdd7e26 100644 --- a/data-otservbr-global/scripts/custom/change_gold.lua +++ b/data/scripts/actions/items/change_gold.lua @@ -3,7 +3,9 @@ local config = { [ITEM_PLATINUM_COIN] = { changeBack = ITEM_GOLD_COIN, changeTo = ITEM_CRYSTAL_COIN }, [ITEM_CRYSTAL_COIN] = { changeBack = ITEM_PLATINUM_COIN }, } + local changeGold = Action() + function changeGold.onUse(player, item, fromPosition, target, toPosition, isHotkey) local coin = config[item:getId()] if coin.changeTo and item.type == 100 then @@ -18,5 +20,5 @@ function changeGold.onUse(player, item, fromPosition, target, toPosition, isHotk return false end -changeGold:id(3031, 3035, 3043) +changeGold:id(ITEM_GOLD_COIN, ITEM_PLATINUM_COIN, ITEM_CRYSTAL_COIN) changeGold:register() diff --git a/data/scripts/actions/items/cobra_flask.lua b/data/scripts/actions/items/cobra_flask.lua new file mode 100644 index 00000000000..ddeecf8ec4f --- /dev/null +++ b/data/scripts/actions/items/cobra_flask.lua @@ -0,0 +1,30 @@ +local applyCobraFlaskEffectOnMonsterSpawn = EventCallback() + +applyCobraFlaskEffectOnMonsterSpawn.monsterOnSpawn = function(monster, position) + if table.contains({ "cobra scout", "cobra vizier", "cobra assassin" }, monster:getName():lower()) then + if Game.getStorageValue(Global.Storage.CobraFlask) >= os.time() then + monster:setHealth(monster:getMaxHealth() * 0.75) + monster:getPosition():sendMagicEffect(CONST_ME_GREEN_RINGS) + else + Game.setStorageValue(Global.Storage.CobraFlask, -1) + end + end + return true +end + +applyCobraFlaskEffectOnMonsterSpawn:register() + +local cobraFlask = Action() + +function cobraFlask.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if table.contains({ 31284, 31285, 31286, 31287 }, target:getId()) then + target:getPosition():sendMagicEffect(CONST_ME_GREENSMOKE) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You carefully pour just a tiny, little, finely dosed... and there goes the whole content of the bottle. Stand back!") + item:transform(31297) + Game.setStorageValue(Global.Storage.CobraFlask, os.time() + 30 * 60) + end + return true +end + +cobraFlask:id(31296) +cobraFlask:register() diff --git a/data/scripts/actions/items/coconut_shrimp_bake.lua b/data/scripts/actions/items/coconut_shrimp_bake.lua new file mode 100644 index 00000000000..bc7ba97ddd3 --- /dev/null +++ b/data/scripts/actions/items/coconut_shrimp_bake.lua @@ -0,0 +1,31 @@ +local coconutShrimpBake = Action() + +function coconutShrimpBake.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if player:hasExhaustion("special-foods-cooldown") then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You need to wait before using it again.") + return true + end + + local headItem = player:getSlotItem(CONST_SLOT_HEAD) + if not headItem then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You should only eat this dish when wearing a helmet of the deep or a depth galea and walking underwater.") + return true + end + + local acceptableHelmets = { 5460, 11585, 13995 } + if not table.contains(acceptableHelmets, headItem:getId()) then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You should only eat this dish when wearing a helmet of the deep or a depth galea and walking underwater.") + return true + end + + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your underwater walking speed while wearing a " .. headItem:getName() .. " has increased for twenty-four hours.") + player:say("Yum.", TALKTYPE_MONSTER_SAY) + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_GREEN) + player:setExhaustion("special-foods-cooldown", 10 * 60) + player:setExhaustion("coconut-shrimp-bake", 24 * 60 * 60) + item:remove(1) + return true +end + +coconutShrimpBake:id(11584) +coconutShrimpBake:register() diff --git a/data-otservbr-global/scripts/actions/other/costume_bags.lua b/data/scripts/actions/items/costume_bags.lua similarity index 63% rename from data-otservbr-global/scripts/actions/other/costume_bags.lua rename to data/scripts/actions/items/costume_bags.lua index 4a159a1db3a..8dfe91ac3b9 100644 --- a/data-otservbr-global/scripts/actions/other/costume_bags.lua +++ b/data/scripts/actions/items/costume_bags.lua @@ -1,24 +1,27 @@ local config = { - [653] = { "orc warrior", "pirate cutthroat", "dworc voodoomaster", "dwarf guard", "minotaur mage", "ogre shaman", "ogre brute", "rat" }, -- common - [655] = { "serpent spawn", "demon", "juggernaut", "behemoth", "ashmunrah", "vexclaw", "grimeleech", "hellflayer", "black sheep" }, -- uncommon - [654] = { "quara hydromancer", "diabolic imp", "banshee", "frost giant", "lich", "vexclaw", "grimeleech", "hellflayer", "ogre shaman", "ogre brute", "pig" }, -- deluxe - [24949] = { "old beholder", "old bug", "old wolf", "old giant spider" }, -- old + [653] = { "orc warrior", "pirate cutthroat", "dworc voodoomaster", "dwarf guard", "minotaur mage", "ogre shaman", "ogre brute", "rat" }, + [654] = { "quara hydromancer", "diabolic imp", "banshee", "frost giant", "lich", "vexclaw", "grimeleech", "hellflayer", "ogre shaman", "ogre brute", "pig" }, + [655] = { "serpent spawn", "demon", "juggernaut", "behemoth", "ashmunrah", "vexclaw", "grimeleech", "hellflayer", "black sheep" }, + [24949] = { "old beholder", "old bug", "old wolf", "old giant spider" }, } local costumeBags = Action() function costumeBags.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local monsterNames = config[item.itemid] - if not monsterNames then + local creatures = config[item.itemid] + if not creatures then return true end - player:sendTextMessage(MESSAGE_STATUS, "You will stay 5 minutes transformed in a monster!") - doSetMonsterOutfit(player, monsterNames[math.random(#monsterNames)], 300 * 1000) + + player:setMonsterOutfit(creatures[math.random(#creatures)], 5 * 60 * 10 * 1000) player:addAchievementProgress("Masquerader", 100) - item:getPosition():sendMagicEffect(36) + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) item:remove() return true end -costumeBags:id(653, 655, 654, 24949) +for k, v in pairs(config) do + costumeBags:id(k) +end + costumeBags:register() diff --git a/data/scripts/actions/items/cup_of_molten_gold.lua b/data/scripts/actions/items/cup_of_molten_gold.lua new file mode 100644 index 00000000000..f9ccc81c8a2 --- /dev/null +++ b/data/scripts/actions/items/cup_of_molten_gold.lua @@ -0,0 +1,29 @@ +local cupOfMoltenGold = Action() + +function cupOfMoltenGold.onUse(player, item, fromPosition, target, toPosition, isHotkey) + local targetId = target.itemid + if not table.contains({ 3614, 19111 }, targetId) then + return false + end + + if math.random(100) <= 10 then + local transformedItemId = 12550 + if targetId == 19111 then + item:transform(transformedItemId) + else + player:addItem(transformedItemId, 1) + end + else + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Drizzling all over a fir cone you picked from the tree, the molten gold only covers about half of it - not enough.") + + if targetId == 19111 then + target:remove(1) + end + + item:remove(1) + end + return true +end + +cupOfMoltenGold:id(12804) +cupOfMoltenGold:register() diff --git a/data/scripts/actions/items/demonic_candy_ball.lua b/data/scripts/actions/items/demonic_candy_ball.lua new file mode 100644 index 00000000000..c2e44c1efb1 --- /dev/null +++ b/data/scripts/actions/items/demonic_candy_ball.lua @@ -0,0 +1,72 @@ +local defenseCondition = Condition(CONDITION_ATTRIBUTES) +defenseCondition:setParameter(CONDITION_PARAM_SUBID, JeanPierreDefense) +defenseCondition:setParameter(CONDITION_PARAM_BUFF_SPELL, 1) +defenseCondition:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) +defenseCondition:setParameter(CONDITION_PARAM_SKILL_SHIELD, 10) +defenseCondition:setParameter(CONDITION_PARAM_FORCEUPDATE, true) + +local magicLevelCondition = Condition(CONDITION_ATTRIBUTES) +magicLevelCondition:setParameter(CONDITION_PARAM_SUBID, JeanPierreMagicLevel) +magicLevelCondition:setParameter(CONDITION_PARAM_BUFF_SPELL, 1) +magicLevelCondition:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) +magicLevelCondition:setParameter(CONDITION_PARAM_STAT_MAGICPOINTS, 5) +magicLevelCondition:setParameter(CONDITION_PARAM_FORCEUPDATE, true) + +local meleeCondition = Condition(CONDITION_ATTRIBUTES) +meleeCondition:setParameter(CONDITION_PARAM_SUBID, JeanPierreMelee) +meleeCondition:setParameter(CONDITION_PARAM_BUFF_SPELL, 1) +meleeCondition:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) +meleeCondition:setParameter(CONDITION_PARAM_SKILL_MELEE, 10) +meleeCondition:setParameter(CONDITION_PARAM_FORCEUPDATE, true) + +local distanceCondition = Condition(CONDITION_ATTRIBUTES) +distanceCondition:setParameter(CONDITION_PARAM_SUBID, JeanPierreDistance) +distanceCondition:setParameter(CONDITION_PARAM_BUFF_SPELL, 1) +distanceCondition:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) +distanceCondition:setParameter(CONDITION_PARAM_SKILL_DISTANCE, 10) +distanceCondition:setParameter(CONDITION_PARAM_FORCEUPDATE, true) + +local speedCondition = Condition(CONDITION_HASTE) +speedCondition:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) +speedCondition:setParameter(CONDITION_PARAM_SPEED, 729) + +local lightCondition = Condition(CONDITION_LIGHT) +lightCondition:setParameter(CONDITION_PARAM_LIGHT_LEVEL, 15) +lightCondition:setParameter(CONDITION_PARAM_LIGHT_COLOR, 154) +lightCondition:setTicks(60 * 60 * 1000) + +local demonicCandyBall = Action() + +function demonicCandyBall.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if player:hasExhaustion("special-foods-cooldown") then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You need to wait before using it again.") + return true + end + + local availableConditions = { defenseCondition, magicLevelCondition, meleeCondition, distanceCondition, speedCondition } + local randomConditionIndex = math.random(1, 4) + + if randomConditionIndex == 1 then + player:addCondition(availableConditions[math.random(1, #availableConditions)]) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You feel stronger, but you have no idea what was increased.") + elseif randomConditionIndex == 2 then + player:addCondition(lightCondition) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You feel enlightened.") + elseif randomConditionIndex == 3 then + player:addCondition(condition_i) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You became invisible.") + elseif randomConditionIndex == 4 then + player:addHealth(player:getMaxHealth()) + player:addMana(player:getMaxMana()) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your vitality has been restored.") + end + + player:say("Smack.", TALKTYPE_MONSTER_SAY) + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) + player:setExhaustion("special-foods-cooldown", 10 * 60) + item:remove(1) + return true +end + +demonicCandyBall:id(11587) +demonicCandyBall:register() diff --git a/data/scripts/actions/items/die.lua b/data/scripts/actions/items/die.lua new file mode 100644 index 00000000000..661926e79ea --- /dev/null +++ b/data/scripts/actions/items/die.lua @@ -0,0 +1,36 @@ +local die = Action() + +function die.onUse(player, item, fromPosition, target, toPosition, isHotkey) + local position = item:getPosition() + local value = math.random(1, 6) + local isInGhostMode = player:isInGhostMode() + + if not isInGhostMode then + position:sendMagicEffect(CONST_ME_CRAPS) + + local spectators = Game.getSpectators(position, false, true, 3, 3) + for _, spectator in ipairs(spectators) do + player:say(player:getName() .. " rolled a " .. value .. ".", TALKTYPE_MONSTER_SAY, isInGhostMode, spectator, position) + end + end + + if value == 6 then + local rolledSixCount = player:kv():get("die-rolled-six") or 0 + player:kv():set("die-rolled-six", rolledSixCount + 1) + + if rolledSixCount == 2 then + player:addAchievement("Number of the Beast") + end + else + player:kv():remove("die-rolled-six") + end + + item:transform(5791 + value) + return true +end + +for items = 5792, 5797 do + die:id(items) +end + +die:register() diff --git a/data/libs/systems/exercise_training.lua b/data/scripts/actions/items/exercise_training_weapons.lua similarity index 51% rename from data/libs/systems/exercise_training.lua rename to data/scripts/actions/items/exercise_training_weapons.lua index ab4282b3cbb..4a72f19e5c8 100644 --- a/data/libs/systems/exercise_training.lua +++ b/data/scripts/actions/items/exercise_training_weapons.lua @@ -1,4 +1,6 @@ -ExerciseWeaponsTable = { +local exhaustionTime = 10 + +local exerciseWeaponsTable = { -- MELE [28540] = { skill = SKILL_SWORD }, [28552] = { skill = SKILL_SWORD }, @@ -35,7 +37,7 @@ ExerciseWeaponsTable = { local dummies = Game.getDummies() -function LeaveTraining(playerId) +local function leaveExerciseTraining(playerId) if _G.OnExerciseTraining[playerId] then stopEvent(_G.OnExerciseTraining[playerId].event) _G.OnExerciseTraining[playerId] = nil @@ -48,40 +50,40 @@ function LeaveTraining(playerId) return end -function ExerciseEvent(playerId, tilePosition, weaponId, dummyId) +local function exerciseTrainingEvent(playerId, tilePosition, weaponId, dummyId) local player = Player(playerId) if not player then - return LeaveTraining(playerId) + return leaveExerciseTraining(playerId) end if player:isTraining() == 0 then player:sendTextMessage(MESSAGE_FAILURE, "You have stopped training.") - return LeaveTraining(playerId) + return leaveExerciseTraining(playerId) end if not Tile(tilePosition):getItemById(dummyId) then player:sendTextMessage(MESSAGE_FAILURE, "Someone has moved the dummy, the training has stopped.") - LeaveTraining(playerId) + leaveExerciseTraining(playerId) return false end local playerPosition = player:getPosition() if not playerPosition:isProtectionZoneTile() then player:sendTextMessage(MESSAGE_FAILURE, "You are no longer in a protection zone, the training has stopped.") - LeaveTraining(playerId) + leaveExerciseTraining(playerId) return false end if player:getItemCount(weaponId) <= 0 then player:sendTextMessage(MESSAGE_FAILURE, "You need the training weapon in the backpack, the training has stopped.") - LeaveTraining(playerId) + leaveExerciseTraining(playerId) return false end local weapon = player:getItemById(weaponId, true) if not weapon:isItem() or not weapon:hasAttribute(ITEM_ATTRIBUTE_CHARGES) then player:sendTextMessage(MESSAGE_FAILURE, "The selected item is not a training weapon, the training has stopped.") - LeaveTraining(playerId) + leaveExerciseTraining(playerId) return false end @@ -89,37 +91,118 @@ function ExerciseEvent(playerId, tilePosition, weaponId, dummyId) if not weaponCharges or weaponCharges <= 0 then weapon:remove(1) -- ?? player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your training weapon has disappeared.") - LeaveTraining(playerId) + leaveExerciseTraining(playerId) return false end - local isMagic = ExerciseWeaponsTable[weaponId].skill == SKILL_MAGLEVEL if not dummies[dummyId] then return false end - local rate = dummies[dummyId] / 100 + local rate = dummies[dummyId] / 100 + local isMagic = exerciseWeaponsTable[weaponId].skill == SKILL_MAGLEVEL if isMagic then player:addManaSpent(500 * rate) else - player:addSkillTries(ExerciseWeaponsTable[weaponId].skill, 7 * rate) + player:addSkillTries(exerciseWeaponsTable[weaponId].skill, 7 * rate) end weapon:setAttribute(ITEM_ATTRIBUTE_CHARGES, (weaponCharges - 1)) tilePosition:sendMagicEffect(CONST_ME_HITAREA) - if ExerciseWeaponsTable[weaponId].effect then - playerPosition:sendDistanceEffect(tilePosition, ExerciseWeaponsTable[weaponId].effect) + if exerciseWeaponsTable[weaponId].effect then + playerPosition:sendDistanceEffect(tilePosition, exerciseWeaponsTable[weaponId].effect) end if weapon:getAttribute(ITEM_ATTRIBUTE_CHARGES) <= 0 then weapon:remove(1) player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your training weapon has disappeared.") - LeaveTraining(playerId) + leaveExerciseTraining(playerId) return false end local vocation = player:getVocation() - _G.OnExerciseTraining[playerId].event = addEvent(ExerciseEvent, vocation:getBaseAttackSpeed() / configManager.getFloat(configKeys.RATE_EXERCISE_TRAINING_SPEED), playerId, tilePosition, weaponId, dummyId) + _G.OnExerciseTraining[playerId].event = addEvent(exerciseTrainingEvent, vocation:getBaseAttackSpeed() / configManager.getFloat(configKeys.RATE_EXERCISE_TRAINING_SPEED), playerId, tilePosition, weaponId, dummyId) return true end + +local function isDummy(id) + return dummies[id] and dummies[id] > 0 +end + +local exerciseTraining = Action() + +function exerciseTraining.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if not target or not target:getId() then + return true + end + + local playerId = player:getId() + local targetId = target:getId() + + if target:isItem() and isDummy(targetId) then + if _G.OnExerciseTraining[playerId] then + player:sendTextMessage(MESSAGE_FAILURE, "You are already training!") + return true + end + + local playerPos = player:getPosition() + if not exerciseWeaponsTable[item.itemid].allowFarUse and (playerPos:getDistance(target:getPosition()) > 1) then + player:sendTextMessage(MESSAGE_FAILURE, "Get closer to the dummy.") + return true + end + + if not playerPos:isProtectionZoneTile() then + player:sendTextMessage(MESSAGE_FAILURE, "You need to be in a protection zone.") + return true + end + + local playerHouse = player:getTile():getHouse() + local targetPos = target:getPosition() + local targetHouse = Tile(targetPos):getHouse() + + if targetHouse and isDummy(targetId) then + if playerHouse ~= targetHouse then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You must be inside the house to use this dummy.") + return true + end + + local playersOnDummy = 0 + for _, playerTraining in pairs(_G.OnExerciseTraining) do + if playerTraining.dummyPos == targetPos then + playersOnDummy = playersOnDummy + 1 + end + + if playersOnDummy >= configManager.getNumber(configKeys.MAX_ALLOWED_ON_A_DUMMY) then + player:sendTextMessage(MESSAGE_FAILURE, "That exercise dummy is busy.") + return true + end + end + end + + if player:hasExhaustion("training-exhaustion") then + player:sendTextMessage(MESSAGE_FAILURE, "This exercise dummy can only be used after a " .. exhaustionTime .. " seconds cooldown.") + return true + end + + _G.OnExerciseTraining[playerId] = {} + if not _G.OnExerciseTraining[playerId].event then + _G.OnExerciseTraining[playerId].event = addEvent(exerciseTrainingEvent, 0, playerId, targetPos, item.itemid, targetId) + _G.OnExerciseTraining[playerId].dummyPos = targetPos + player:setTraining(true) + player:setExhaustion("training-exhaustion", exhaustionTime) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have started training on an exercise dummy.") + end + return true + end + return false +end + +for weaponId, weapon in pairs(exerciseWeaponsTable) do + exerciseTraining:id(weaponId) + if weapon.allowFarUse then + exerciseTraining:allowFarUse(true) + end +end + +exerciseTraining:register() diff --git a/data-canary/scripts/actions/other/explosive_present.lua b/data/scripts/actions/items/explosive_present.lua similarity index 81% rename from data-canary/scripts/actions/other/explosive_present.lua rename to data/scripts/actions/items/explosive_present.lua index 33878ffda93..2ca4730decd 100644 --- a/data-canary/scripts/actions/other/explosive_present.lua +++ b/data/scripts/actions/items/explosive_present.lua @@ -3,9 +3,10 @@ local explosivePresent = Action() function explosivePresent.onUse(player, item, fromPosition, target, toPosition, isHotkey) player:say("KABOOOOOOOOOOM!", TALKTYPE_MONSTER_SAY) player:getPosition():sendMagicEffect(CONST_ME_FIREAREA) + player:addAchievement("Joke's on You") item:remove() return true end -explosivePresent:id(3218) +explosivePresent:id(906) explosivePresent:register() diff --git a/data/scripts/actions/items/filled_jalapeno_peppers.lua b/data/scripts/actions/items/filled_jalapeno_peppers.lua new file mode 100644 index 00000000000..57df8d6b191 --- /dev/null +++ b/data/scripts/actions/items/filled_jalapeno_peppers.lua @@ -0,0 +1,23 @@ +local speedCondition = Condition(CONDITION_HASTE) +speedCondition:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) +speedCondition:setParameter(CONDITION_PARAM_SPEED, 729) + +local filledJalapenoPeppers = Action() + +function filledJalapenoPeppers.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if player:hasExhaustion("special-foods-cooldown") then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You need to wait before using it again.") + return true + end + + player:addCondition(speedCondition) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your speed has been increased.") + player:say("Munch.", TALKTYPE_MONSTER_SAY) + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) + player:setExhaustion("special-foods-cooldown", 10 * 60) + item:remove(1) + return true +end + +filledJalapenoPeppers:id(9085) +filledJalapenoPeppers:register() diff --git a/data-otservbr-global/scripts/actions/other/fireworks_rocket.lua b/data/scripts/actions/items/fireworks_rocket.lua similarity index 76% rename from data-otservbr-global/scripts/actions/other/fireworks_rocket.lua rename to data/scripts/actions/items/fireworks_rocket.lua index 2003fe96fc8..3a259e6d0cf 100644 --- a/data-otservbr-global/scripts/actions/other/fireworks_rocket.lua +++ b/data/scripts/actions/items/fireworks_rocket.lua @@ -4,12 +4,13 @@ function fireworksRocket.onUse(player, item, fromPosition, target, toPosition, i if fromPosition.x ~= CONTAINER_POSITION then fromPosition:sendMagicEffect(math.random(CONST_ME_FIREWORK_YELLOW, CONST_ME_FIREWORK_BLUE)) else - local position = player:getPosition() - position:sendMagicEffect(CONST_ME_HITBYFIRE) - position:sendMagicEffect(CONST_ME_EXPLOSIONAREA) + player:getPosition():sendMagicEffect(CONST_ME_FIREAREA) + player:getPosition():sendMagicEffect(CONST_ME_HITBYFIRE) player:say("Ouch! Rather place it on the ground next time.", TALKTYPE_MONSTER_SAY) + player:addAchievementProgress("Rocket in Pocket", 3) player:addHealth(-10, COMBAT_PHYSICALDAMAGE) end + player:addAchievementProgress("Fireworks in the Sky", 250) item:remove() return true diff --git a/data-otservbr-global/scripts/actions/other/food.lua b/data/scripts/actions/items/foods.lua similarity index 94% rename from data-otservbr-global/scripts/actions/other/food.lua rename to data/scripts/actions/items/foods.lua index 3c6b5290fed..4a8072d163e 100644 --- a/data-otservbr-global/scripts/actions/other/food.lua +++ b/data/scripts/actions/items/foods.lua @@ -82,7 +82,6 @@ local foods = { [8017] = { 5, "Munch." }, -- beetroot [8019] = { 11, "Yum." }, -- chocolate cake [8177] = { 7, "Slurp." }, -- yummy gummy worm - [8194] = { 0, "Urgh.", CONST_ME_MAGIC_BLUE }, -- garlic bread [8197] = { 5, "Crunch." }, -- bulb of garlic [9537] = { 0, "Your head begins to feel better." }, -- headache pill [10329] = { 15, "Yum." }, -- rice ball @@ -124,29 +123,24 @@ local foods = { } local food = Action() + function food.onUse(player, item, fromPosition, target, toPosition, isHotkey) - local bloodBrothersStorage = Storage.Quest.U8_4.BloodBrothers local itemFood = foods[item.itemid] - local effect = itemFood[3] if not itemFood then return false end + local condition = player:getCondition(CONDITION_REGENERATION, CONDITIONID_DEFAULT) if condition and math.floor(condition:getTicks() / 1000 + (itemFood[1] * 12)) >= 1200 then player:sendTextMessage(MESSAGE_FAILURE, "You are full.") return true end - if item.itemid == 8194 and player:getStorageValue(bloodBrothersStorage.GarlicBread) == 0 then - player:setStorageValue(bloodBrothersStorage.GarlicBread, 1) - end + player:feed(itemFood[1] * 12) player:say(itemFood[2], TALKTYPE_MONSTER_SAY) - item:remove(1) player:updateSupplyTracker(item) player:getPosition():sendSingleSoundEffect(SOUND_EFFECT_TYPE_ACTION_EAT, player:isInGhostMode() and nil or player) - if effect then - player:getPosition():sendMagicEffect(effect) - end + item:remove(1) return true end diff --git a/data/scripts/actions/items/garlic_bread.lua b/data/scripts/actions/items/garlic_bread.lua new file mode 100644 index 00000000000..315dbbadd5c --- /dev/null +++ b/data/scripts/actions/items/garlic_bread.lua @@ -0,0 +1,9 @@ +local garlicBread = Action() + +function garlicBread.onUse(player, item, fromPosition, target, toPosition, isHotkey) + player:say("After taking a small bite you decide that you don't want to eat that.", TALKTYPE_MONSTER_SAY) + return true +end + +garlicBread:id(8194) +garlicBread:register() diff --git a/data/scripts/actions/items/glooth_bag.lua b/data/scripts/actions/items/glooth_bag.lua new file mode 100644 index 00000000000..a3703ea08dc --- /dev/null +++ b/data/scripts/actions/items/glooth_bag.lua @@ -0,0 +1,40 @@ +local config = { + { chanceFrom = 0, chanceTo = 1875, itemId = 21158, count = 2 }, -- glooth spear + { chanceFrom = 1876, chanceTo = 3418, itemId = 21183 }, -- glooth amulet + { chanceFrom = 3419, chanceTo = 4933, itemId = 21178 }, -- glooth club + { chanceFrom = 4934, chanceTo = 6397, itemId = 21180 }, -- glooth axe + { chanceFrom = 6398, chanceTo = 7829, itemId = 21179 }, -- glooth blade + { chanceFrom = 7830, chanceTo = 8462, itemId = 21295 }, -- glooth backpack + { chanceFrom = 8463, chanceTo = 8975, itemId = 21143, count = 10 }, -- glooth sandwich + { chanceFrom = 8976, chanceTo = 9469, itemId = 21144, count = 10 }, -- bowl of glooth soup + { chanceFrom = 9470, chanceTo = 9922, itemId = 21146, count = 10 }, -- glooth steak + { chanceFrom = 9923, chanceTo = 10000, itemId = 21186 }, -- control unit +} + +local gloothBag = Action() + +function gloothBag.onUse(player, item, fromPosition, target, toPosition, isHotkey) + local chance = math.random(0, 10000) + for i = 1, #config do + local randomItem = config[i] + if chance >= randomItem.chanceFrom and chance <= randomItem.chanceTo then + if randomItem.itemId then + local gift = randomItem.itemId + local count = randomItem.count or 1 + if type(count) == "table" then + count = math.random(count[1], count[2]) + end + + player:addItem(gift, count) + end + + item:getPosition():sendMagicEffect(CONST_ME_HITBYPOISON) + item:remove(1) + return true + end + end + return false +end + +gloothBag:id(21203) +gloothBag:register() diff --git a/data-canary/scripts/actions/tools/gold_converter.lua b/data/scripts/actions/items/gold_converter.lua similarity index 100% rename from data-canary/scripts/actions/tools/gold_converter.lua rename to data/scripts/actions/items/gold_converter.lua diff --git a/data/scripts/actions/items/hireling_foods.lua b/data/scripts/actions/items/hireling_foods.lua new file mode 100644 index 00000000000..30783fde9c8 --- /dev/null +++ b/data/scripts/actions/items/hireling_foods.lua @@ -0,0 +1,69 @@ +local hasteCondition = Condition(CONDITION_HASTE) +hasteCondition:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) +hasteCondition:setParameter(CONDITION_PARAM_SPEED, 80) + +local fishingCondition = Condition(CONDITION_ATTRIBUTES) +fishingCondition:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) +fishingCondition:setParameter(CONDITION_PARAM_SKILL_FISHING, 30) + +local magicPointsCondition = Condition(CONDITION_ATTRIBUTES) +magicPointsCondition:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) +magicPointsCondition:setParameter(CONDITION_PARAM_STAT_MAGICPOINTS, 3) + +local meleeCondition = Condition(CONDITION_ATTRIBUTES) +meleeCondition:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) +meleeCondition:setParameter(CONDITION_PARAM_SKILL_MELEE, 3) + +local shieldCondition = Condition(CONDITION_ATTRIBUTES) +shieldCondition:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) +shieldCondition:setParameter(CONDITION_PARAM_SKILL_SHIELD, 7) + +local distanceCondition = Condition(CONDITION_ATTRIBUTES) +distanceCondition:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) +distanceCondition:setParameter(CONDITION_PARAM_SKILL_DISTANCE, 7) + +local gourmetDishes = { + [29408] = { condition = shieldCondition, message = "Chomp." }, + [29409] = { condition = distanceCondition, message = "Yummm." }, + [29410] = { condition = magicPointsCondition, message = "Munch." }, + [29411] = { condition = meleeCondition, message = "Munch." }, + [29412] = { condition = hasteCondition, message = "Yummm." }, + [29413] = { condition = fishingCondition, message = "Mmmmm." }, + [29414] = { healing = true, message = "Munch." }, + [29415] = { manaRestore = true, message = "Chomp." }, + [29416] = { message = "Blurg." }, +} + +local hirelingFoods = Action() + +function hirelingFoods.onUse(player, item, fromPosition, target, toPosition, isHotkey) + local dish = gourmetDishes[item.itemid] + if not dish then + return true + end + + if player:hasExhaustion("special-foods-cooldown") then + player:sendCancelMessage("You're still too full to eat any gourmet dishes for a while.") + return true + end + + if dish.condition then + player:addCondition(dish.condition) + elseif dish.healing then + player:addHealth(player:getMaxHealth() * 0.3) + elseif dish.manaRestore then + player:addMana(player:getMaxMana() * 0.3) + end + + player:say(dish.message, TALKTYPE_MONSTER_SAY) + player:setExhaustion("special-foods-cooldown", 10 * 60) + + item:remove(1) + return true +end + +for index, value in pairs(gourmetDishes) do + hirelingFoods:id(index) +end + +hirelingFoods:register() diff --git a/data/scripts/actions/items/hydra_tongue_salad.lua b/data/scripts/actions/items/hydra_tongue_salad.lua new file mode 100644 index 00000000000..4c8cad3258a --- /dev/null +++ b/data/scripts/actions/items/hydra_tongue_salad.lua @@ -0,0 +1,35 @@ +local conditionsToRemove = { + CONDITION_POISON, + CONDITION_FIRE, + CONDITION_ENERGY, + CONDITION_PARALYZE, + CONDITION_DRUNK, + CONDITION_DROWN, + CONDITION_FREEZING, + CONDITION_DAZZLED, + CONDITION_CURSED, + CONDITION_BLEEDING, +} + +local hydraTongueSalad = Action() + +function hydraTongueSalad.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if player:hasExhaustion("special-foods-cooldown") then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You need to wait before using it again.") + return true + end + + for _, conditionType in ipairs(conditionsToRemove) do + player:removeCondition(conditionType) + end + + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You feel better body condition.") + player:say("Chomp.", TALKTYPE_MONSTER_SAY) + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) + player:setExhaustion("special-foods-cooldown", 10 * 60) + item:remove(1) + return true +end + +hydraTongueSalad:id(9080) +hydraTongueSalad:register() diff --git a/data/scripts/actions/items/magic_gold_converter.lua b/data/scripts/actions/items/magic_gold_converter.lua new file mode 100644 index 00000000000..a66b58eb7be --- /dev/null +++ b/data/scripts/actions/items/magic_gold_converter.lua @@ -0,0 +1,63 @@ +local data = { + converterIds = { + [28525] = 28526, + [28526] = 28525, + }, + + coins = { + [ITEM_GOLD_COIN] = ITEM_PLATINUM_COIN, + [ITEM_PLATINUM_COIN] = ITEM_CRYSTAL_COIN, + }, +} + +local function findAndConvertCoins(player, container, converter) + for i = 0, container:getSize() - 1 do + local item = container:getItem(i) + if item:isContainer() then + findAndConvertCoins(player, Container(item.uid), converter) + else + for fromId, toId in pairs(data.coins) do + if item:getId() == fromId and item:getCount() == 100 then + item:remove() + if not (container:addItem(toId, 1)) then + player:addItem(toId, 1) + end + + converter:setAttribute(ITEM_ATTRIBUTE_CHARGES, converter:getAttribute(ITEM_ATTRIBUTE_CHARGES) - 1) + return true + end + end + end + end + return false +end + +local function startConverter(playerId, converterItemId) + local player = Player(playerId) + if player then + local converter = player:getItemById(converterItemId, true) + if converter and converter:hasAttribute(ITEM_ATTRIBUTE_CHARGES) then + local charges = converter:getAttribute(ITEM_ATTRIBUTE_CHARGES) + if charges >= 1 then + if player:getItemCount(ITEM_GOLD_COIN) >= 100 or player:getItemCount(ITEM_PLATINUM_COIN) >= 100 then + findAndConvertCoins(player, player:getStoreInbox(), converter) + end + addEvent(startConverter, 300, playerId, converterItemId) + else + converter:remove(1) + end + end + end +end + +local magicGoldConverter = Action() + +function magicGoldConverter.onUse(player, item, fromPosition, target, toPosition, isHotkey) + item:transform(data.converterIds[item.itemid]) + item:decay() + startConverter(player:getId(), 28526) + return true +end + +magicGoldConverter:id(28525, 28526) +magicGoldConverter:register() diff --git a/data-otservbr-global/scripts/actions/other/muck_remover.lua b/data/scripts/actions/items/muck_remover.lua similarity index 90% rename from data-otservbr-global/scripts/actions/other/muck_remover.lua rename to data/scripts/actions/items/muck_remover.lua index 606e8912ce0..9c94ab730ce 100644 --- a/data-otservbr-global/scripts/actions/other/muck_remover.lua +++ b/data/scripts/actions/items/muck_remover.lua @@ -22,14 +22,14 @@ function muckRemover.onUse(player, item, fromPosition, target, toPosition, isHot randomItem = config[i] if chance >= randomItem.from and chance <= randomItem.to then if toPosition.x == CONTAINER_POSITION then - target:getParent():addItem(randomItem.itemId, randomItem.count or 1, INDEX_WHEREEVER, FLAG_NOLIMIT) + player:addItem(randomItem.itemId, randomItem.count or 1) else Game.createItem(randomItem.itemId, randomItem.count or 1, toPosition) end + player:addAchievementProgress("Goo Goo Dancer", 100) target:getPosition():sendMagicEffect(CONST_ME_GREEN_RINGS) target:remove(1) - item:remove(1) break end diff --git a/data/scripts/actions/items/music_box.lua b/data/scripts/actions/items/music_box.lua new file mode 100644 index 00000000000..1be3e0c73a6 --- /dev/null +++ b/data/scripts/actions/items/music_box.lua @@ -0,0 +1,43 @@ +local config = { + ["dragonling"] = { mountId = 31, achievement = "Dragon Mimicry", tameMessage = "The wild dragonling will accompany you as a friend from now on.", sound = "FI?" }, + ["draptor"] = { mountId = 6, achievement = "Scales and Tail", tameMessage = "The wild draptor will accompany you as a friend from now on.", sound = "Screeeeeeeeech" }, + ["enraged white deer"] = { mountId = 18, achievement = "Friend of Elves", tameMessage = "The wild deer will accompany you as a friend from now on.", sound = "*bell*" }, + ["ironblight"] = { mountId = 29, achievement = "Magnetised", tameMessage = "The ironblight will accompany you as a friend from now on.", sound = "Plinngggg" }, + ["magma crawler"] = { mountId = 30, achievement = "Way to Hell", tameMessage = "The magma crawler will accompany you as a friend from now on.", sound = "ZzzZzzZzzzZz" }, + ["midnight panther"] = { mountId = 5, achievement = "Starless Night", tameMessage = "The wild panther will accompany you as a friend from now on.", sound = "Purrrrrrr" }, + ["wailing widow"] = { mountId = 1, achievement = "Spin-Off", tameMessage = "You have tamed the wailing widow.", sound = "Sssssssss" }, + ["wild horse"] = { mountId = 17, achievement = "Lucky Horseshoe", tameMessage = "The horse accepts you as its new master.", sound = "*snort*" }, + ["panda"] = { mountId = 19, achievement = "Chequered Teddy", tameMessage = "The panda will accompany you as a friend from now on.", sound = "Rrrrr... Grrrr" }, +} + +local musicBox = Action() + +function musicBox.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if not target:isCreature() or not target:isMonster() or target:getMaster() then + return false + end + + local monsterConfig = config[target:getName():lower()] + if not monsterConfig then + return false + end + + if player:hasMount(monsterConfig.mountId) then + return false + end + + player:addMount(monsterConfig.mountId) + player:addAchievement("Natural Born Cowboy") + player:addAchievement(monsterConfig.achievement) + player:say(monsterConfig.tameMessage, TALKTYPE_MONSTER_SAY) + toPosition:sendMagicEffect(CONST_ME_SOUND_RED) + + target:say(monsterConfig.sound, TALKTYPE_MONSTER_SAY) + target:remove() + + item:remove(1) + return true +end + +musicBox:id(16244) +musicBox:register() diff --git a/data/scripts/actions/items/northern_fishburger.lua b/data/scripts/actions/items/northern_fishburger.lua new file mode 100644 index 00000000000..3648ba102b3 --- /dev/null +++ b/data/scripts/actions/items/northern_fishburger.lua @@ -0,0 +1,26 @@ +local fishingCondition = Condition(CONDITION_ATTRIBUTES) +fishingCondition:setParameter(CONDITION_PARAM_SUBID, JeanPierreFishing) +fishingCondition:setParameter(CONDITION_PARAM_BUFF_SPELL, 1) +fishingCondition:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) +fishingCondition:setParameter(CONDITION_PARAM_SKILL_FISHING, 50) +fishingCondition:setParameter(CONDITION_PARAM_FORCEUPDATE, true) + +local northernFishburger = Action() + +function northernFishburger.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if player:hasExhaustion("special-foods-cooldown") then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You need to wait before using it again.") + return true + end + + player:addCondition(fishingCondition) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You felt fishing inspiration.") + player:say("Smack.", TALKTYPE_MONSTER_SAY) + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) + player:setExhaustion("special-foods-cooldown", 10 * 60) + item:remove(1) + return true +end + +northernFishburger:id(9088) +northernFishburger:register() diff --git a/data/scripts/actions/items/pot_of_blackjack.lua b/data/scripts/actions/items/pot_of_blackjack.lua new file mode 100644 index 00000000000..fd4cc52b920 --- /dev/null +++ b/data/scripts/actions/items/pot_of_blackjack.lua @@ -0,0 +1,35 @@ +local potOfBlackjack = Action() + +function potOfBlackjack.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if player:hasExhaustion("special-foods-cooldown") then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You need to wait before using it again.") + return true + end + + local remainingGulps = player:kv():get("pot-of-blackjack") or math.random(2, 4) + + if remainingGulps > 0 then + remainingGulps = remainingGulps - 1 + player:kv():set("pot-of-blackjack", remainingGulps) + + local message + if remainingGulps > 0 then + message = "You take a gulp from the large bowl, but there's still some blackjack in it." + else + message = "You take the last gulp from the large bowl. No leftovers!" + end + + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, message) + end + + player:addHealth(5000) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You take a gulp from the large bowl.") + player:say("Gulp.", TALKTYPE_MONSTER_SAY) + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) + player:setExhaustion("special-foods-cooldown", 10 * 60) + item:remove(1) + return true +end + +potOfBlackjack:id(11586) +potOfBlackjack:register() diff --git a/data/scripts/actions/items/potions.lua b/data/scripts/actions/items/potions.lua new file mode 100644 index 00000000000..02e92349363 --- /dev/null +++ b/data/scripts/actions/items/potions.lua @@ -0,0 +1,143 @@ +local berserk = Condition(CONDITION_ATTRIBUTES) +berserk:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) +berserk:setParameter(CONDITION_PARAM_SUBID, JeanPierreMelee) +berserk:setParameter(CONDITION_PARAM_SKILL_MELEE, 5) +berserk:setParameter(CONDITION_PARAM_SKILL_SHIELD, -10) +berserk:setParameter(CONDITION_PARAM_BUFF_SPELL, true) + +local mastermind = Condition(CONDITION_ATTRIBUTES) +mastermind:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) +mastermind:setParameter(CONDITION_PARAM_SUBID, JeanPierreMagicLevel) +mastermind:setParameter(CONDITION_PARAM_STAT_MAGICPOINTS, 3) +mastermind:setParameter(CONDITION_PARAM_BUFF_SPELL, true) + +local bullseye = Condition(CONDITION_ATTRIBUTES) +bullseye:setParameter(CONDITION_PARAM_TICKS, 10 * 60 * 1000) +bullseye:setParameter(CONDITION_PARAM_SUBID, JeanPierreDistance) +bullseye:setParameter(CONDITION_PARAM_SKILL_DISTANCE, 5) +bullseye:setParameter(CONDITION_PARAM_SKILL_SHIELD, -10) +bullseye:setParameter(CONDITION_PARAM_BUFF_SPELL, true) + +local antidote = Combat() +antidote:setParameter(COMBAT_PARAM_TYPE, COMBAT_HEALING) +antidote:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) +antidote:setParameter(COMBAT_PARAM_DISPEL, CONDITION_POISON) +antidote:setParameter(COMBAT_PARAM_AGGRESSIVE, false) +antidote:setParameter(COMBAT_PARAM_TARGETCASTERORTOPMOST, true) + +local function magicshield(player) + local condition = Condition(CONDITION_MANASHIELD) + condition:setParameter(CONDITION_PARAM_TICKS, 60000) + condition:setParameter(CONDITION_PARAM_MANASHIELD, math.min(player:getMaxMana(), 300 + 7.6 * player:getLevel() + 7 * player:getMagicLevel())) + player:addCondition(condition) +end + +local potions = { + [236] = { health = { 250, 350 }, vocations = { VOCATION.BASE_ID.PALADIN, VOCATION.BASE_ID.KNIGHT }, level = 50, flask = 283, description = "Only knights and paladins of level 50 or above may drink this fluid." }, + [237] = { mana = { 115, 185 }, level = 50, flask = 283, description = "Only players of level 50 or above may drink this fluid." }, + [238] = { mana = { 150, 250 }, vocations = { VOCATION.BASE_ID.SORCERER, VOCATION.BASE_ID.DRUID, VOCATION.BASE_ID.PALADIN }, level = 80, flask = 284, description = "Only sorcerers, druids and paladins of level 80 or above may drink this fluid." }, + [239] = { health = { 425, 575 }, vocations = { VOCATION.BASE_ID.KNIGHT }, level = 80, flask = 284, description = "Only knights of level 80 or above may drink this fluid." }, + [266] = { health = { 125, 175 }, flask = 285 }, + [268] = { mana = { 75, 125 }, flask = 285 }, + [6558] = { transform = { id = { 236, 237 } }, effect = CONST_ME_DRAWBLOOD }, + [7439] = { vocations = { VOCATION.BASE_ID.KNIGHT }, condition = berserk, effect = CONST_ME_MAGIC_RED, description = "Only knights may drink this potion.", text = "You feel stronger.", achievement = "Berserker" }, + [7440] = { vocations = { VOCATION.BASE_ID.SORCERER, VOCATION.BASE_ID.DRUID }, condition = mastermind, effect = CONST_ME_MAGIC_BLUE, description = "Only sorcerers and druids may drink this potion.", text = "You feel smarter.", achievement = "Mastermind" }, + [7443] = { vocations = { VOCATION.BASE_ID.PALADIN }, condition = bullseye, effect = CONST_ME_MAGIC_GREEN, description = "Only paladins may drink this potion.", text = "You feel more accurate.", achievement = "Sharpshooter" }, + [7642] = { health = { 250, 350 }, mana = { 100, 200 }, vocations = { VOCATION.BASE_ID.PALADIN }, level = 80, flask = 284, description = "Only paladins of level 80 or above may drink this fluid." }, + [7643] = { health = { 650, 850 }, vocations = { VOCATION.BASE_ID.KNIGHT }, level = 130, flask = 284, description = "Only knights of level 130 or above may drink this fluid." }, + [7644] = { combat = antidote, flask = 285 }, + [7876] = { health = { 60, 90 }, flask = 285 }, + [23373] = { mana = { 425, 575 }, vocations = { VOCATION.BASE_ID.SORCERER, VOCATION.BASE_ID.DRUID }, level = 130, flask = 284, description = "Only druids and sorcerers of level 130 or above may drink this fluid." }, + [23374] = { health = { 420, 580 }, mana = { 250, 350 }, vocations = { VOCATION.BASE_ID.PALADIN }, level = 130, flask = 284, description = "Only paladins of level 130 or above may drink this fluid." }, + [23375] = { health = { 875, 1125 }, vocations = { VOCATION.BASE_ID.KNIGHT }, level = 200, flask = 284, description = "Only knights of level 200 or above may drink this fluid." }, + [35563] = { vocations = { VOCATION.BASE_ID.SORCERER, VOCATION.BASE_ID.DRUID }, level = 14, func = magicshield, effect = CONST_ME_ENERGYAREA, description = "Only sorcerers and druids of level 14 or above may drink this potion." }, +} + +local flaskPotion = Action() + +function flaskPotion.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if not target or type(target) == "userdata" and not target:isPlayer() then + return false + end + + local potion = potions[item:getId()] + if not player:getGroup():getAccess() and (potion.level and player:getLevel() < potion.level or potion.vocations and not table.contains(potion.vocations, player:getVocation():getBaseId())) then + player:say(potion.description, MESSAGE_POTION) + return true + end + + if potion.health or potion.mana or potion.combat then + if potion.health then + doTargetCombatHealth(player, target, COMBAT_HEALING, potion.health[1], potion.health[2], CONST_ME_MAGIC_BLUE) + end + + if potion.mana then + doTargetCombatMana(0, target, potion.mana[1], potion.mana[2], CONST_ME_MAGIC_BLUE) + end + + if potion.combat then + potion.combat:execute(target, Variant(target:getId())) + end + + if not potion.effect and target:getPosition() ~= nil then + target:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) + end + + player:addAchievementProgress("Potion Addict", 100000) + target:say("Aaaah...", MESSAGE_POTION) + + local deactivatedFlasks = player:kv():get("talkaction.potions.flask") or false + if not deactivatedFlasks then + local container = Container(item:getParent().uid) + local inbox = player:getSlotItem(CONST_SLOT_STORE_INBOX) + + if fromPosition.x == CONTAINER_POSITION and container ~= inbox and container:getEmptySlots() ~= 0 then + container:addItem(potion.flask, 1) + else + Game.createItem(potion.flask, 1, fromPosition) + end + end + end + + player:getPosition():sendSingleSoundEffect(SOUND_EFFECT_TYPE_ITEM_USE_POTION, player:isInGhostMode() and nil or player) + + if potion.func then + potion.func(player) + player:say("Aaaah...", MESSAGE_POTION) + player:getPosition():sendMagicEffect(potion.effect) + + if potion.achievement then + player:addAchievementProgress(potion.achievement, 100) + end + end + + if potion.condition then + player:addCondition(potion.condition) + player:say(potion.text, MESSAGE_POTION) + player:getPosition():sendMagicEffect(potion.effect) + end + + if potion.transform then + if item:getCount() >= 1 then + item:remove(1) + player:addItem(potion.transform.id[math.random(#potion.transform.id)], 1) + item:getPosition():sendMagicEffect(potion.effect) + player:addAchievementProgress("Demonic Barkeeper", 250) + return true + end + end + + if not configManager.getBoolean(configKeys.REMOVE_POTION_CHARGES) then + return true + end + + player:updateSupplyTracker(item) + item:remove(1) + return true +end + +for index, value in pairs(potions) do + flaskPotion:id(index) +end + +flaskPotion:register() diff --git a/data/scripts/actions/items/roasted_dragon_wings.lua b/data/scripts/actions/items/roasted_dragon_wings.lua new file mode 100644 index 00000000000..719c7fa0e20 --- /dev/null +++ b/data/scripts/actions/items/roasted_dragon_wings.lua @@ -0,0 +1,26 @@ +local defenseCondition = Condition(CONDITION_ATTRIBUTES) +defenseCondition:setParameter(CONDITION_PARAM_SUBID, JeanPierreDefense) +defenseCondition:setParameter(CONDITION_PARAM_BUFF_SPELL, 1) +defenseCondition:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) +defenseCondition:setParameter(CONDITION_PARAM_SKILL_SHIELD, 10) +defenseCondition:setParameter(CONDITION_PARAM_FORCEUPDATE, true) + +local roastedDragonWings = Action() + +function roastedDragonWings.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if player:hasExhaustion("special-foods-cooldown") then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You need to wait before using it again.") + return true + end + + player:addCondition(defenseCondition) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You feel less vulnerable.") + player:say("Chomp.", TALKTYPE_MONSTER_SAY) + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) + player:setExhaustion("special-foods-cooldown", 10 * 60) + item:remove(1) + return true +end + +roastedDragonWings:id(9081) +roastedDragonWings:register() diff --git a/data/scripts/actions/items/rotworm_stew.lua b/data/scripts/actions/items/rotworm_stew.lua new file mode 100644 index 00000000000..7b965da5857 --- /dev/null +++ b/data/scripts/actions/items/rotworm_stew.lua @@ -0,0 +1,19 @@ +local rotwormStew = Action() + +function rotwormStew.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if player:hasExhaustion("special-foods-cooldown") then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You need to wait before using it again.") + return true + end + + player:addHealth(player:getMaxHealth()) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your health has been refilled.") + player:say("Gulp.", TALKTYPE_MONSTER_SAY) + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) + player:setExhaustion("special-foods-cooldown", 10 * 60) + item:remove(1) + return true +end + +rotwormStew:id(9079) +rotwormStew:register() diff --git a/data/scripts/actions/items/rust_remover.lua b/data/scripts/actions/items/rust_remover.lua new file mode 100644 index 00000000000..caa61e0f298 --- /dev/null +++ b/data/scripts/actions/items/rust_remover.lua @@ -0,0 +1,115 @@ +local config = { + [8894] = { -- heavily rusted armor + [1] = { id = 3358, chance = 6994 }, -- chain armor + [2] = { id = 3377, chance = 3952 }, -- scale armor + [3] = { id = 3359, chance = 1502 }, -- brass armor + [4] = { id = 3357, chance = 197 }, -- plate armor + }, + [8895] = { -- rusted armor + [1] = { id = 3358, chance = 6437 }, -- scale armor + [2] = { id = 3358, chance = 4606 }, -- chain armor + [3] = { id = 3359, chance = 3029 }, -- brass armor + [4] = { id = 3357, chance = 1559 }, -- plate armor + [5] = { id = 3370, chance = 595 }, -- knight armor + [6] = { id = 8063, chance = 283 }, -- paladin armor + [7] = { id = 3381, chance = 49 }, -- crown armor + }, + [8896] = { -- slightly rusted armor + [1] = { id = 3359, chance = 6681 }, -- brass armor + [2] = { id = 3357, chance = 3767 }, -- plate armor + [3] = { id = 3370, chance = 1832 }, -- knight armor + [4] = { id = 3381, chance = 177 }, -- crown armor + [5] = { id = 8063, chance = 31 }, -- paladin armor + [6] = { id = 3360, chance = 10 }, -- golden armor + }, + [8897] = { -- heavily rusted legs + [1] = { id = 3558, chance = 6949 }, -- chain legs + [2] = { id = 3362, chance = 3692 }, -- studded legs + [3] = { id = 3372, chance = 1307 }, -- brass legs + [4] = { id = 3557, chance = 133 }, -- plate legs + }, + [8898] = { -- rusted legs + [1] = { id = 3362, chance = 5962 }, -- studded legs + [2] = { id = 3558, chance = 4037 }, -- chain legs + [3] = { id = 3372, chance = 2174 }, -- brass legs + [4] = { id = 3557, chance = 1242 }, -- plate legs + [5] = { id = 3371, chance = 186 }, -- knight legs + }, + [8899] = { -- slightly rusted legs + [1] = { id = 3372, chance = 6500 }, -- brass legs + [2] = { id = 3557, chance = 3800 }, -- plate legs + [3] = { id = 3371, chance = 200 }, -- knight legs + [4] = { id = 3382, chance = 52 }, -- crown legs + [5] = { id = 3364, chance = 30 }, -- golden legs + }, + [8902] = { -- slightly rusted shield + [1] = { id = 3410, chance = 3137 }, -- plate shield + [2] = { id = 3432, chance = 2887 }, -- ancient shield + [3] = { id = 7460, chance = 929 }, -- norse shield + [4] = { id = 3419, chance = 23 }, -- crown shield + [5] = { id = 3434, chance = 10 }, -- vampire shield + }, + [8907] = { -- rusted helmet + [1] = { id = 3354, chance = 2200 }, -- brass helmet + [2] = { id = 3376, chance = 1870 }, -- studded helmet + [3] = { id = 3353, chance = 1490 }, -- iron helmet + [4] = { id = 3351, chance = 1010 }, -- steel helmet + [5] = { id = 3385, chance = 190 }, -- crown helmet + [6] = { id = 3391, chance = 10 }, -- crusader helmet + }, + [8908] = { -- slightly rusted helmet + [1] = { id = 3353, chance = 3156 }, -- iron helmet + [2] = { id = 3351, chance = 2976 }, -- steel helmet + [3] = { id = 3385, chance = 963 }, -- crown helmet + [4] = { id = 3391, chance = 210 }, -- crusader helmet + [5] = { id = 3392, chance = 7 }, -- royal helmet + }, +} + +local rustRemover = Action() + +function rustRemover.onUse(player, item, fromPosition, target, toPosition, isHotkey) + local targetItem = config[target.itemid] + if not targetItem then + return true + end + + local randomChance = math.random(10000) + local index = false + + if targetItem[1].chance >= randomChance then + while not index do + local randomIndex = math.random(#targetItem) + if targetItem[randomIndex].chance >= randomChance then + index = randomIndex + end + end + end + + if not index then + local msg = nil + if table.contains({ 8894, 8895, 8896 }, target.itemid) then + msg = "The armor was already damaged so badly that it broke when you tried to clean it." + elseif table.contains({ 8897, 8898, 8899 }, target.itemid) then + msg = "The legs were already damaged so badly that they broke when you tried to clean them." + elseif table.contains({ 8902 }, target.itemid) then + msg = "The shield was already damaged so badly that it broke when you tried to clean it." + elseif table.contains({ 8907, 8908 }, target.itemid) then + msg = "The helmet was already damaged so badly that it broke when you tried to clean it." + end + + player:say(msg, TALKTYPE_MONSTER_SAY) + target:getPosition():sendMagicEffect(CONST_ME_BLOCKHIT) + target:remove() + else + target:transform(targetItem[index].id) + target:getPosition():sendMagicEffect(CONST_ME_MAGIC_GREEN) + player:addAchievementProgress("Polisher", 1000) + end + + item:remove(1) + return true +end + +rustRemover:id(9016) +rustRemover:register() diff --git a/data/scripts/actions/items/scroll_of_ascension.lua b/data/scripts/actions/items/scroll_of_ascension.lua new file mode 100644 index 00000000000..1b32d0d994a --- /dev/null +++ b/data/scripts/actions/items/scroll_of_ascension.lua @@ -0,0 +1,22 @@ +local scrollOfAscension = Action() + +function scrollOfAscension.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if player:hasExhaustion("scroll-of-ascension") then + return true + end + + local playerTile = Tile(player:getPosition()) + if playerTile and playerTile:getGround() and table.contains(swimmingTiles, playerTile:getGround():getId()) then + player:say("The scroll could get wet, step out of the water first.", TALKTYPE_MONSTER_SAY) + return true + end + + player:setMonsterOutfit(math.random(10) > 1 and "Demon" or "Ferumbras", 5 * 60 * 1000) + player:say("Magical sparks whirl around the scroll as you read it and then your appearance is changing.", TALKTYPE_MONSTER_SAY) + player:getPosition():sendMagicEffect(CONST_ME_HITBYFIRE) + player:setExhaustion("scroll-of-ascension", 60 * 60) + return true +end + +scrollOfAscension:id(22771) +scrollOfAscension:register() diff --git a/data/scripts/actions/items/spellbook.lua b/data/scripts/actions/items/spellbook.lua new file mode 100644 index 00000000000..ef777b68269 --- /dev/null +++ b/data/scripts/actions/items/spellbook.lua @@ -0,0 +1,55 @@ +local function sortSpellsByLevel(spellList, levelKey) + table.sort(spellList, function(a, b) + return a[levelKey] < b[levelKey] + end) +end + +local function appendSpellsInfo(spellList, header, levelKey, manaKey) + local text = "" + local prevLevel = -1 + + for i, spell in ipairs(spellList) do + local line = "" + if prevLevel ~= spell[levelKey] then + line = (i == 1 and "" or "\n") .. header .. spell[levelKey] .. "\n" + prevLevel = spell[levelKey] + end + + text = text .. line .. " " .. spell.words .. " - " .. spell.name .. " : " .. spell[manaKey] .. "\n" + end + return text +end + +local spellbook = Action() + +function spellbook.onUse(player, item, fromPosition, target, toPosition, isHotkey) + local spellsForLevel = {} + local spellsForMagicLevel = {} + + for _, spell in ipairs(player:getInstantSpells()) do + if (spell.level > 0 or spell.mlevel > 0) and spell.level + spell.mlevel > 0 then + if spell.manapercent > 0 then + spell.mana = spell.manapercent .. "%" + end + + if spell.level > 0 then + spellsForLevel[#spellsForLevel + 1] = spell + else + spellsForMagicLevel[#spellsForMagicLevel + 1] = spell + end + end + end + + sortSpellsByLevel(spellsForLevel, "level") + sortSpellsByLevel(spellsForMagicLevel, "mlevel") + + local spellsText = appendSpellsInfo(spellsForLevel, "Spells for Level ", "level", "mana") + spellsText = spellsText .. "\n" + spellsText = spellsText .. appendSpellsInfo(spellsForMagicLevel, "Spells for Magic Level ", "mlevel", "mana") + + player:showTextDialog(item:getId(), spellsText) + return true +end + +spellbook:id(3059, 6120, 8072, 8073, 8074, 8075, 8076, 8090, 11691, 14769, 16107, 20088, 21400, 22755, 25699, 29431, 20089, 20090, 34153) +spellbook:register() diff --git a/data-otservbr-global/scripts/actions/store_coins.lua b/data/scripts/actions/items/store_coins.lua similarity index 78% rename from data-otservbr-global/scripts/actions/store_coins.lua rename to data/scripts/actions/items/store_coins.lua index b52611dd30c..6e4f0cf45c1 100644 --- a/data-otservbr-global/scripts/actions/store_coins.lua +++ b/data/scripts/actions/items/store_coins.lua @@ -1,11 +1,14 @@ local storeCoin = Action() function storeCoin.onUse(player, item, fromPosition, target, toPosition, isHotkey) - player:getPosition():sendMagicEffect(CONST_ME_MAGIC_GREEN) local count = item:getCount() - item:remove() player:addTransferableCoins(count) player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have added " .. count .. " tibia coins to your balance. Your total is now " .. player:getTransferableCoins() .. ".") + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_GREEN) + item:remove() + + logger.warn("[StoreCoinScript - ITEM_STORE_COIN] The player {} used the item to store Tibia Coins.", player:getName()) + return true end storeCoin:id(ITEM_STORE_COIN) diff --git a/data/scripts/actions/items/sweet_mangonaise_elixir.lua b/data/scripts/actions/items/sweet_mangonaise_elixir.lua new file mode 100644 index 00000000000..fc5d1f33272 --- /dev/null +++ b/data/scripts/actions/items/sweet_mangonaise_elixir.lua @@ -0,0 +1,53 @@ +local ringMultiplicationTable = { + [3048] = 3048, + [3049] = 3086, + [3050] = 3087, + [3051] = 3088, + [3052] = 3089, + [3053] = 3090, + [3091] = 3094, + [3092] = 3095, + [3093] = 3096, + [3097] = 3099, + [3098] = 3100, + [6299] = 6300, + [12669] = 12670, + [16114] = 16264, +} + +local sweetMangonaiseElixir = Action() + +function sweetMangonaiseElixir.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if player:hasExhaustion("special-foods-cooldown") then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You need to wait before using it again.") + return true + end + + local playerRing = player:getSlotItem(CONST_SLOT_RING) + if not playerRing or not table.contains(ringMultiplicationTable, playerRing:getId()) then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "No ring equipped.") + player:getPosition():sendMagicEffect(CONST_ME_POFF) + return true + end + + local ringId = ringMultiplicationTable[playerRing:getId()] + if not ringId then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "This ring cannot be multiplied.") + player:getPosition():sendMagicEffect(CONST_ME_POFF) + return false + end + + for i = 1, 10 do + player:addItem(ringId) + end + + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your ring has been multiplied.") + player:say("Slurp.", TALKTYPE_MONSTER_SAY) + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) + player:setExhaustion("special-foods-cooldown", 10 * 60) + item:remove(1) + return true +end + +sweetMangonaiseElixir:id(11588) +sweetMangonaiseElixir:register() diff --git a/data/scripts/actions/items/tropical_fried_terrorbird.lua b/data/scripts/actions/items/tropical_fried_terrorbird.lua new file mode 100644 index 00000000000..342ba545a25 --- /dev/null +++ b/data/scripts/actions/items/tropical_fried_terrorbird.lua @@ -0,0 +1,26 @@ +local magicLevelCondition = Condition(CONDITION_ATTRIBUTES) +magicLevelCondition:setParameter(CONDITION_PARAM_SUBID, JeanPierreMagicLevel) +magicLevelCondition:setParameter(CONDITION_PARAM_BUFF_SPELL, 1) +magicLevelCondition:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) +magicLevelCondition:setParameter(CONDITION_PARAM_STAT_MAGICPOINTS, 5) +magicLevelCondition:setParameter(CONDITION_PARAM_FORCEUPDATE, true) + +local tropicalFriedTerrorbird = Action() + +function tropicalFriedTerrorbird.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if player:hasExhaustion("special-foods-cooldown") then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You need to wait before using it again.") + return true + end + + player:addCondition(magicLevelCondition) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You feel smarter.") + player:say("Chomp.", TALKTYPE_MONSTER_SAY) + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) + player:setExhaustion("special-foods-cooldown", 10 * 60) + item:remove(1) + return true +end + +tropicalFriedTerrorbird:id(9082) +tropicalFriedTerrorbird:register() diff --git a/data/scripts/actions/items/usable_afflicted_outfit_items.lua b/data/scripts/actions/items/usable_afflicted_outfit_items.lua new file mode 100644 index 00000000000..30c92194655 --- /dev/null +++ b/data/scripts/actions/items/usable_afflicted_outfit_items.lua @@ -0,0 +1,57 @@ +local usableAfflictedOutfitItems = Action() + +function usableAfflictedOutfitItems.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if not player:isPremium() then + player:sendCancelMessage(RETURNVALUE_YOUNEEDPREMIUMACCOUNT) + return true + end + + local outfitId = player:getSex() == PLAYERSEX_FEMALE and 431 or 430 + if item.itemid == 12786 then + if not player:hasOutfit(outfitId) or player:hasOutfit(outfitId, 2) then + return true + end + + player:addOutfitAddon(430, 2) + player:addOutfitAddon(431, 2) + player:say("You gained a plague mask for your outfit.", TALKTYPE_MONSTER_SAY, false, player) + player:getPosition():sendMagicEffect(CONST_ME_POFF) + player:addAchievementProgress("Beak Doctor", 2) + item:remove() + elseif item.itemid == 12787 then + if not player:hasOutfit(outfitId) or player:hasOutfit(outfitId, 1) then + return true + end + + player:addOutfitAddon(430, 1) + player:addOutfitAddon(431, 1) + player:getPosition():sendMagicEffect(CONST_ME_POFF) + player:say("You gained a plague bell for your outfit.", TALKTYPE_MONSTER_SAY, false, player) + player:addAchievementProgress("Beak Doctor", 2) + item:remove() + else + if player:hasOutfit(outfitId) then + return true + end + + local requiredItemIds = { 12551, 12552, 12553, 12554, 12555, 12556 } + for _, itemId in ipairs(requiredItemIds) do + if player:getItemCount(itemId) < 1 then + return true + end + end + + for _, itemId in ipairs(requiredItemIds) do + player:removeItem(itemId, 1) + end + + player:addOutfit(430) + player:addOutfit(431) + player:say("You have restored an outfit.", TALKTYPE_MONSTER_SAY, false, player) + player:getPosition():sendMagicEffect(CONST_ME_POFF) + end + return true +end + +usableAfflictedOutfitItems:id(12551, 12552, 12553, 12554, 12555, 12556, 12786, 12787) +usableAfflictedOutfitItems:register() diff --git a/data/scripts/actions/items/usable_mount_items.lua b/data/scripts/actions/items/usable_mount_items.lua new file mode 100644 index 00000000000..ed8ff50a64a --- /dev/null +++ b/data/scripts/actions/items/usable_mount_items.lua @@ -0,0 +1,40 @@ +local config = { + [23538] = { name = "vortexion", mountId = 94, tameMessage = "You receive the permission to ride a sparkion." }, + [23684] = { name = "neon sparkid", mountId = 98, tameMessage = "You receive the permission to ride a neon sparkid." }, + [23685] = { name = "vortexion", mountId = 99, tameMessage = "You receive the permission to ride a vortexion." }, + [32629] = { name = "haze", mountId = 162, achievement = "Nothing but Hot Air", tameMessage = "You are now versed to ride the haze!" }, +} + +local usableItemMounts = Action() + +function usableItemMounts.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if not player:isPremium() then + player:sendCancelMessage(RETURNVALUE_YOUNEEDPREMIUMACCOUNT) + return true + end + + local useItem = config[item.itemid] + if player:hasMount(useItem.mountId) then + return false + end + + if useItem.achievement then + player:addAchievement(useItem.achievement) + end + + if table.contains({ 23538, 23684, 23685 }, item.itemid) then + player:addAchievementProgress("Vortex Tamer", 3) + end + + player:addMount(useItem.mountId) + player:addAchievement("Natural Born Cowboy") + player:say(useItem.tameMessage, TALKTYPE_MONSTER_SAY) + item:remove(1) + return true +end + +for k, v in pairs(config) do + usableItemMounts:id(k) +end + +usableItemMounts:register() diff --git a/data/scripts/actions/items/usable_outfit_items.lua b/data/scripts/actions/items/usable_outfit_items.lua new file mode 100644 index 00000000000..faa5a5af0eb --- /dev/null +++ b/data/scripts/actions/items/usable_outfit_items.lua @@ -0,0 +1,92 @@ +local outfitConfig = { + -- soil guardian + [16252] = { female = 514, male = 516, effect = CONST_ME_GREEN_RINGS }, + [16253] = { female = 514, male = 516, addon = 1, effect = CONST_ME_GREEN_RINGS, achievement = "Funghitastic" }, + [16254] = { female = 514, male = 516, addon = 2, effect = CONST_ME_GREEN_RINGS, achievement = "Funghitastic" }, + + -- crystal warlord + [16255] = { female = 513, male = 512, effect = CONST_ME_GIANTICE }, + [16256] = { female = 513, male = 512, addon = 1, effect = CONST_ME_GIANTICE, achievement = "Crystal Clear" }, + [16257] = { female = 513, male = 512, addon = 2, effect = CONST_ME_GIANTICE, achievement = "Crystal Clear" }, + + -- makeshift warrior + [27655] = { female = 1043, male = 1042, whiteText = "By using the plan you knock together a makeshift armour out of wooden planks, rusty nails and leather rags." }, + [27657] = { female = 1043, male = 1042, addon = 1, achievement = "Cobbled and Patched", whiteText = "You use the wooden planks to knock up a makeshift shield and weapon." }, + [27656] = { female = 1043, male = 1042, addon = 2, achievement = "Cobbled and Patched", whiteText = "You use the tinged pot as a makeshift helmet." }, + + -- hand of the inquisition + [31738] = { female = 1244, male = 1243, addon = 1, effect = CONST_ME_HOLYAREA, achievement = "Inquisition's Arm" }, + [31737] = { female = 1244, male = 1243, addon = 2, effect = CONST_ME_HOLYAREA, achievement = "Inquisition's Arm" }, + + -- poltergeist + [32630] = { female = 1271, male = 1270, addon = 1, effect = CONST_ME_BLUE_GHOST, achievement = "Mainstreet Nightmare", orangeText = "The spooky hood is yours!" }, + [32631] = { female = 1271, male = 1270, addon = 2, effect = CONST_ME_BLUE_GHOST, achievement = "Mainstreet Nightmare", orangeText = "You can use the ghost claw now!" }, + + -- revenant + [34075] = { female = 1323, male = 1322, addon = 1, effect = CONST_ME_HOLYAREA, achievement = "Unleash the Beast", orangeText = "Now the beast is unleashed!" }, + [34076] = { female = 1323, male = 1322, addon = 2, effect = CONST_ME_HOLYAREA, achievement = "Unleash the Beast", orangeText = "Wild power flows though your body!" }, + + -- rascoohan + [35595] = { female = 1372, male = 1371, addon = 1, achievement = "Honorary Rascoohan", orangeText = "You feel a bit more raccoonish." }, + [35695] = { female = 1372, male = 1371, addon = 2, achievement = "Honorary Rascoohan", orangeText = "Hmmm, trash cans!!" }, + + -- fire-fighter + [39544] = { female = 1569, male = 1568, addon = 1, achievement = "Friendly Fire", orangeText = "You feel like fighting a fire!" }, + [39545] = { female = 1569, male = 1568, addon = 2, achievement = "Friendly Fire", orangeText = "The flame engulfs you!" }, +} + +local usableOutfitItems = Action() + +function usableOutfitItems.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if not player:isPremium() then + player:sendCancelMessage(RETURNVALUE_YOUNEEDPREMIUMACCOUNT) + return true + end + + local outfitInfo = outfitConfig[item.itemid] + local looktype = player:getSex() == PLAYERSEX_FEMALE and outfitInfo.female or outfitInfo.male + if not player:hasOutfit(looktype) then + if outfitInfo.addon then + player:sendCancelMessage("You need the outfit for this part.") + return true + end + + player:addOutfit(outfitInfo.female) + player:addOutfit(outfitInfo.male) + player:getPosition():sendMagicEffect(outfitInfo.effect or CONST_ME_GIFT_WRAPS) + if outfitInfo.orangeText then + player:say(outfitInfo.orangeText, TALKTYPE_MONSTER_SAY) + elseif outfitInfo.whiteText then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, outfitInfo.whiteText) + end + item:remove(1) + return true + end + + if player:hasOutfit(looktype, outfitInfo.addon) then + player:sendCancelMessage("You already own this outfit part.") + return true + end + + player:addOutfitAddon(outfitInfo.female, outfitInfo.addon) + player:addOutfitAddon(outfitInfo.male, outfitInfo.addon) + player:getPosition():sendMagicEffect(outfitInfo.effect or CONST_ME_GIFT_WRAPS) + if outfitInfo.orangeText then + player:say(outfitInfo.orangeText, TALKTYPE_MONSTER_SAY) + elseif outfitInfo.whiteText then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, outfitInfo.whiteText) + end + + if player:hasOutfit(looktype, 3) then + player:addAchievement(outfitInfo.achievement) + end + + item:remove(1) + return true +end + +for itemId, _ in pairs(outfitConfig) do + usableOutfitItems:id(itemId) +end + +usableOutfitItems:register() diff --git a/data/scripts/actions/items/veggie_casserole.lua b/data/scripts/actions/items/veggie_casserole.lua new file mode 100644 index 00000000000..d0ef6c99a78 --- /dev/null +++ b/data/scripts/actions/items/veggie_casserole.lua @@ -0,0 +1,26 @@ +local meleeCondition = Condition(CONDITION_ATTRIBUTES) +meleeCondition:setParameter(CONDITION_PARAM_SUBID, JeanPierreMelee) +meleeCondition:setParameter(CONDITION_PARAM_BUFF_SPELL, 1) +meleeCondition:setParameter(CONDITION_PARAM_TICKS, 60 * 60 * 1000) +meleeCondition:setParameter(CONDITION_PARAM_SKILL_MELEE, 10) +meleeCondition:setParameter(CONDITION_PARAM_FORCEUPDATE, true) + +local veggieCasserole = Action() + +function veggieCasserole.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if player:hasExhaustion("special-foods-cooldown") then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You need to wait before using it again.") + return true + end + + player:addCondition(meleeCondition) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You feel stronger.") + player:say("Yum.", TALKTYPE_MONSTER_SAY) + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) + player:setExhaustion("special-foods-cooldown", 10 * 60) + item:remove(1) + return true +end + +veggieCasserole:id(9084) +veggieCasserole:register() diff --git a/data-canary/scripts/actions/other/voodoo_doll.lua b/data/scripts/actions/items/voodoo_doll.lua similarity index 92% rename from data-canary/scripts/actions/other/voodoo_doll.lua rename to data/scripts/actions/items/voodoo_doll.lua index 07940e32864..6e906e9b996 100644 --- a/data-canary/scripts/actions/other/voodoo_doll.lua +++ b/data/scripts/actions/items/voodoo_doll.lua @@ -8,6 +8,7 @@ function voodooDoll.onUse(player, item, fromPosition, target, toPosition, isHotk local text = "" if math.random(100) <= 5 then text = "You concentrate on your victim and hit the needle in the doll." + player:addAchievement("Dark Voodoo Priest") toPosition:sendMagicEffect(CONST_ME_DRAWBLOOD, player) else text = "You concentrate on your victim, hit the needle in the doll.......but nothing happens." diff --git a/data-otservbr-global/scripts/actions/wheel_scrolls.lua b/data/scripts/actions/items/wheel_scrolls.lua similarity index 72% rename from data-otservbr-global/scripts/actions/wheel_scrolls.lua rename to data/scripts/actions/items/wheel_scrolls.lua index f620be24260..b42339a706e 100644 --- a/data-otservbr-global/scripts/actions/wheel_scrolls.lua +++ b/data/scripts/actions/items/wheel_scrolls.lua @@ -10,20 +10,19 @@ local scroll = Action() function scroll.onUse(player, item, fromPosition, target, toPosition, isHotkey) if player:getLevel() < 51 then - player:sendTextMessage(MESSAGE_INFO_DESCR, "Only a hero of level 51 or above can decipher this scroll.") + player:sendTextMessage(MESSAGE_LOOK, "Only a hero of level 51 or above can decipher this scroll.") return true end local scrollData = promotionScrolls[item:getId()] if player:getStorageValueByName(scrollData.storageName) == 1 then - player:sendTextMessage(MESSAGE_INFO_DESCR, "You have already deciphered this scroll.") + player:sendTextMessage(MESSAGE_LOOK, "You have already deciphered this scroll.") return true end player:setStorageValueByName(scrollData.storageName, 1) - player:sendTextMessage(MESSAGE_INFO_DESCR, "You have gained " .. scrollData.points .. " promotion points for the Wheel of Destiny by deciphering the " .. scrollData.name .. ".") + player:sendTextMessage(MESSAGE_LOOK, "You have gained " .. scrollData.points .. " promotion points for the Wheel of Destiny by deciphering the " .. scrollData.name .. ".") item:remove(1) - return true end diff --git a/data-otservbr-global/scripts/actions/other/carpets.lua b/data/scripts/actions/objects/carpets.lua similarity index 93% rename from data-otservbr-global/scripts/actions/other/carpets.lua rename to data/scripts/actions/objects/carpets.lua index ccd69a7e446..6232eb2f1a1 100644 --- a/data-otservbr-global/scripts/actions/other/carpets.lua +++ b/data/scripts/actions/objects/carpets.lua @@ -170,23 +170,35 @@ function carpets.onUse(player, item, fp, target, toPosition, isHotkey) end local fromPosition = item:getPosition() - local tile = Tile(fromPosition) - if not fromPosition:getTile():getHouse() then + local tile = fromPosition:getTile() + if not tile then player:sendTextMessage(MESSAGE_FAILURE, "You may use this only inside a house.") - elseif tile:getItemCountById(item.itemid) == 1 then + return true + end + + local house = tile:getHouse() + if not house then + player:sendTextMessage(MESSAGE_FAILURE, "You may use this only inside a house.") + return true + end + + local itemCount = tile:getItemCountById(item.itemid) + if itemCount == 1 then local topItem = tile:getTopTopItem() if topItem and topItem:canReceiveAutoCarpet() then item:remove() return true end + for k, v in pairs(carpetItems) do - if tile:getItemCountById(k) > 0 and k ~= item.itemid then + if k ~= item.itemid and tile:getItemCountById(k) > 0 then player:sendCancelMessage(Game.getReturnMessage(RETURNVALUE_NOTPOSSIBLE)) return true end end - item:transform(carpet) end + + item:transform(carpet) return true end diff --git a/data/scripts/actions/objects/cask_and_kegs.lua b/data/scripts/actions/objects/cask_and_kegs.lua new file mode 100644 index 00000000000..1180257ed18 --- /dev/null +++ b/data/scripts/actions/objects/cask_and_kegs.lua @@ -0,0 +1,61 @@ +local targetIdList = { + [25879] = { itemId = 285, transform = 266 }, + [25880] = { itemId = 283, transform = 236 }, + [25881] = { itemId = 284, transform = 239 }, + [25882] = { itemId = 284, transform = 7643 }, + [25883] = { itemId = 284, transform = 23375 }, + [25889] = { itemId = 285, transform = 268 }, + [25890] = { itemId = 283, transform = 237 }, + [25891] = { itemId = 284, transform = 238 }, + [25892] = { itemId = 284, transform = 23373 }, + [25899] = { itemId = 284, transform = 7642 }, + [25900] = { itemId = 284, transform = 23374 }, + [25903] = { itemId = 285, transform = 266 }, + [25904] = { itemId = 283, transform = 236 }, + [25905] = { itemId = 284, transform = 239 }, + [25906] = { itemId = 284, transform = 7643 }, + [25907] = { itemId = 284, transform = 23375 }, + [25908] = { itemId = 285, transform = 268 }, + [25909] = { itemId = 283, transform = 237 }, + [25910] = { itemId = 284, transform = 238 }, + [25911] = { itemId = 284, transform = 23373 }, + [25913] = { itemId = 284, transform = 7642 }, + [25914] = { itemId = 284, transform = 23374 }, +} + +local flasks = Action() + +function flasks.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if not target or not target:getItem() then + return false + end + + local charges = target:getCharges() + local itemCount = item:getCount() + if itemCount > charges then + itemCount = charges + end + + local targetId = targetIdList[target:getId()] + if targetId and item:getId() == targetId.itemId and charges > 0 then + local potMath = item:getCount() - itemCount + local parent = item:getParent() + if not (parent:isContainer() and parent:addItem(item:getId(), potMath)) then + player:addItem(item:getId(), potMath, true) + end + + item:transform(targetId.transform, itemCount) + charges = charges - itemCount + target:transform(target:getId(), charges) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, string.format("Remaining %s charges.", charges)) + + if charges == 0 then + target:remove() + end + return true + end + return false +end + +flasks:id(283, 284, 285) +flasks:register() diff --git a/data-canary/scripts/daily_reward/daily_reward_shrine.lua b/data/scripts/actions/objects/daily_reward_shrine.lua similarity index 100% rename from data-canary/scripts/daily_reward/daily_reward_shrine.lua rename to data/scripts/actions/objects/daily_reward_shrine.lua diff --git a/data-canary/scripts/exaltation_forge/exaltation_forge.lua b/data/scripts/actions/objects/exaltation_forge.lua similarity index 100% rename from data-canary/scripts/exaltation_forge/exaltation_forge.lua rename to data/scripts/actions/objects/exaltation_forge.lua diff --git a/data/scripts/actions/objects/hive_gates.lua b/data/scripts/actions/objects/hive_gates.lua new file mode 100644 index 00000000000..12c56b8ce74 --- /dev/null +++ b/data/scripts/actions/objects/hive_gates.lua @@ -0,0 +1,25 @@ +local hiveGates = Action() + +function hiveGates.onUse(player, item, fromPosition, target, toPosition, isHotkey) + local position = player:getPosition() + if item:getId() == 13278 or item:getId() == 13279 or item:getId() == 13280 or item:getId() == 13281 or item:getId() == 13282 or item:getId() == 13283 then + if position.y == toPosition.y then + return false + end + + toPosition.y = position.y > toPosition.y and toPosition.y - 1 or toPosition.y + 1 + elseif item:getId() == 13290 or item:getId() == 13291 or item:getId() == 13292 or item:getId() == 13293 or item:getId() == 13294 then + if position.x == toPosition.x then + return false + end + + toPosition.x = position.x > toPosition.x and toPosition.x - 1 or toPosition.x + 1 + end + + player:teleportTo(toPosition) + toPosition:sendMagicEffect(CONST_ME_TELEPORT) + return true +end + +hiveGates:id(13278, 13279, 13280, 13281, 13282, 13283, 13290, 13291, 13292, 13293, 13294) +hiveGates:register() diff --git a/data-canary/scripts/actions/market.lua b/data/scripts/actions/objects/market.lua similarity index 100% rename from data-canary/scripts/actions/market.lua rename to data/scripts/actions/objects/market.lua diff --git a/data-otservbr-global/scripts/actions/other/offline_training_book.lua b/data/scripts/actions/objects/offline_training_book.lua similarity index 100% rename from data-otservbr-global/scripts/actions/other/offline_training_book.lua rename to data/scripts/actions/objects/offline_training_book.lua diff --git a/data-canary/scripts/actions/other/skill_trainer.lua b/data/scripts/actions/objects/skill_trainer.lua similarity index 100% rename from data-canary/scripts/actions/other/skill_trainer.lua rename to data/scripts/actions/objects/skill_trainer.lua diff --git a/data-canary/scripts/actions/stash.lua b/data/scripts/actions/objects/stash.lua similarity index 100% rename from data-canary/scripts/actions/stash.lua rename to data/scripts/actions/objects/stash.lua diff --git a/data-canary/scripts/actions/other/wall_mirror.lua b/data/scripts/actions/objects/wall_mirror.lua similarity index 74% rename from data-canary/scripts/actions/other/wall_mirror.lua rename to data/scripts/actions/objects/wall_mirror.lua index 46c5fbe2fa4..d76a39218a3 100644 --- a/data-canary/scripts/actions/other/wall_mirror.lua +++ b/data/scripts/actions/objects/wall_mirror.lua @@ -15,12 +15,13 @@ local setting = { local wallMirror = Action() function wallMirror.onUse(player, item, fromPosition, target, toPosition, isHotkey) - if player:getStorageValue(PlayerStorageKeys.delayWallMirror) <= os.time() then - player:say(setting[math.random(1, #setting)], TALKTYPE_MONSTER_SAY) - player:setStorageValue(PlayerStorageKeys.delayWallMirror, os.time() + 20 * 60 * 60) - else + if player:hasExhaustion("delay-wall-mirror") then player:say("Don't be so vain about your appearance.", TALKTYPE_MONSTER_SAY) + return true end + + player:say(setting[math.random(1, #setting)], TALKTYPE_MONSTER_SAY) + player:setExhaustion("delay-wall-mirror", 20 * 60 * 60) return true end diff --git a/data-canary/scripts/actions/other/windows.lua b/data/scripts/actions/objects/windows.lua similarity index 100% rename from data-canary/scripts/actions/other/windows.lua rename to data/scripts/actions/objects/windows.lua diff --git a/data/scripts/actions/tools/claw_of_the_noxious_spawn.lua b/data/scripts/actions/tools/claw_of_the_noxious_spawn.lua new file mode 100644 index 00000000000..5e49dda6e05 --- /dev/null +++ b/data/scripts/actions/tools/claw_of_the_noxious_spawn.lua @@ -0,0 +1,32 @@ +local cursed = Condition(CONDITION_CURSED) +cursed:setParameter(CONDITION_PARAM_DELAYED, true) +cursed:setParameter(CONDITION_PARAM_MINVALUE, -800) +cursed:setParameter(CONDITION_PARAM_MAXVALUE, -1200) +cursed:setParameter(CONDITION_PARAM_STARTVALUE, -1) +cursed:setParameter(CONDITION_PARAM_TICKINTERVAL, 4000) +cursed:setParameter(CONDITION_PARAM_FORCEUPDATE, true) + +local clawOfTheNoxiousSpawn = Action() + +function clawOfTheNoxiousSpawn.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if item == player:getSlotItem(CONST_SLOT_RING) then + if math.random(100) <= 5 then + player:addCondition(cursed) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You are cursed by The Noxious Spawn!") + item:transform(9395) + item:decay() + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_RED) + player:addAchievement("Cursed!") + else + player:removeCondition(CONDITION_POISON) + item:transform(9394) + item:decay() + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_GREEN) + end + return true + end + return false +end + +clawOfTheNoxiousSpawn:id(9392) +clawOfTheNoxiousSpawn:register() diff --git a/data/scripts/actions/tools/toolgear.lua b/data/scripts/actions/tools/toolgear.lua new file mode 100644 index 00000000000..8db5506c52d --- /dev/null +++ b/data/scripts/actions/tools/toolgear.lua @@ -0,0 +1,23 @@ +local toolGear = Action() + +function toolGear.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if math.random(100) > 5 then + return onUseRope(player, item, fromPosition, target, toPosition, isHotkey) + or onUseShovel(player, item, fromPosition, target, toPosition, isHotkey) + or onUsePick(player, item, fromPosition, target, toPosition, isHotkey) + or onUseMachete(player, item, fromPosition, target, toPosition, isHotkey) + or onUseCrowbar(player, item, fromPosition, target, toPosition, isHotkey) + or onUseSpoon(player, item, fromPosition, target, toPosition, isHotkey) + or onUseScythe(player, item, fromPosition, target, toPosition, isHotkey) + or onUseKitchenKnife(player, item, fromPosition, target, toPosition, isHotkey) + else + player:say("Oh no! Your tool is jammed and can't be used for a minute.", TALKTYPE_MONSTER_SAY) + player:addAchievementProgress("Bad Timing", 10) + item:transform(item.itemid + 1) + item:decay() + end + return true +end + +toolGear:id(9594, 9596, 9598) +toolGear:register() diff --git a/data-canary/scripts/creaturescripts/familiar/on_advance.lua b/data/scripts/creaturescripts/familiar/on_advance.lua similarity index 100% rename from data-canary/scripts/creaturescripts/familiar/on_advance.lua rename to data/scripts/creaturescripts/familiar/on_advance.lua diff --git a/data-canary/scripts/creaturescripts/familiar/on_death.lua b/data/scripts/creaturescripts/familiar/on_death.lua similarity index 100% rename from data-canary/scripts/creaturescripts/familiar/on_death.lua rename to data/scripts/creaturescripts/familiar/on_death.lua diff --git a/data-canary/scripts/creaturescripts/familiar/on_login.lua b/data/scripts/creaturescripts/familiar/on_login.lua similarity index 100% rename from data-canary/scripts/creaturescripts/familiar/on_login.lua rename to data/scripts/creaturescripts/familiar/on_login.lua diff --git a/data/scripts/creaturescripts/monster/giant_spider_wyda_death.lua b/data/scripts/creaturescripts/monster/giant_spider_wyda_death.lua new file mode 100644 index 00000000000..37ba34ffbf3 --- /dev/null +++ b/data/scripts/creaturescripts/monster/giant_spider_wyda_death.lua @@ -0,0 +1,12 @@ +local creatureevent = CreatureEvent("GiantSpiderWyda") + +function creatureevent.onDeath(creature, corpse, killer, mostDamageKiller, lastHitUnjustified, mostDamageUnjustified) + creature:say("It seems this was just an illusion.", TALKTYPE_MONSTER_SAY) + + if mostDamageKiller:isPlayer() then + mostDamageKiller:addAchievement("Someone's Bored") + end + return true +end + +creatureevent:register() diff --git a/data-otservbr-global/scripts/creaturescripts/monster/white_deer.lua b/data/scripts/creaturescripts/monster/white_deer_death.lua similarity index 90% rename from data-otservbr-global/scripts/creaturescripts/monster/white_deer.lua rename to data/scripts/creaturescripts/monster/white_deer_death.lua index 5fff12eaad4..cc9c9377a6e 100644 --- a/data-otservbr-global/scripts/creaturescripts/monster/white_deer.lua +++ b/data/scripts/creaturescripts/monster/white_deer_death.lua @@ -1,11 +1,11 @@ local config = { - -- ordered by chance, the last chance being 100 { chance = 30, monster = "Enraged White Deer", message = "The white deer summons all his strength and turns to fight!" }, { chance = 100, monster = "Desperate White Deer", message = "The white deer desperately tries to escape!" }, } local whiteDeerDeath = CreatureEvent("WhiteDeerDeath") -function whiteDeerDeath.onDeath(creature, corpse, killer, mostDamageKiller, unjustified, mostDamageUnjustified) + +function whiteDeerDeath.onDeath(creature, corpse, killer, mostDamageKiller, lastHitUnjustified, mostDamageUnjustified) local targetMonster = creature:getMonster() if not targetMonster or targetMonster:getMaster() then return true diff --git a/data-otservbr-global/scripts/creaturescripts/monster/white_deer_scout.lua b/data/scripts/creaturescripts/monster/white_deer_scouts.lua similarity index 81% rename from data-otservbr-global/scripts/creaturescripts/monster/white_deer_scout.lua rename to data/scripts/creaturescripts/monster/white_deer_scouts.lua index 8466df46af7..214c0ad5269 100644 --- a/data-otservbr-global/scripts/creaturescripts/monster/white_deer_scout.lua +++ b/data/scripts/creaturescripts/monster/white_deer_scouts.lua @@ -1,5 +1,6 @@ local whiteDeerScoutsDeath = CreatureEvent("WhiteDeerScoutsDeath") -function whiteDeerScoutsDeath.onDeath(creature, corpse, lasthitkiller, mostdamagekiller, lasthitunjustified, mostdamageunjustified) + +function whiteDeerScoutsDeath.onDeath(creature, corpse, killer, mostDamageKiller, lastHitUnjustified, mostDamageUnjustified) local targetMonster = creature:getMonster() if not targetMonster or targetMonster:getMaster() then return true @@ -16,6 +17,7 @@ function whiteDeerScoutsDeath.onDeath(creature, corpse, lasthitkiller, mostdamag targetMonster:say("The elves came too late to save the deer, however they might avenge it.", TALKTYPE_MONSTER_SAY) end + return true end whiteDeerScoutsDeath:register() diff --git a/data-otservbr-global/scripts/creaturescripts/others/modal_window_helper.lua b/data/scripts/creaturescripts/others/modal_window_helper.lua similarity index 93% rename from data-otservbr-global/scripts/creaturescripts/others/modal_window_helper.lua rename to data/scripts/creaturescripts/others/modal_window_helper.lua index d2651af1e69..a3a33b3d274 100644 --- a/data-otservbr-global/scripts/creaturescripts/others/modal_window_helper.lua +++ b/data/scripts/creaturescripts/others/modal_window_helper.lua @@ -1,4 +1,4 @@ -local creatureEvent = CreatureEvent("modalWindowHelper") +local creatureEvent = CreatureEvent("ModalWindowHelper") function creatureEvent.onModalWindow(player, modalWindowId, buttonId, choiceId) local playerId = player:getId() diff --git a/data/scripts/creaturescripts/others/remove_empty_parcel.lua b/data/scripts/creaturescripts/others/remove_empty_parcel.lua new file mode 100644 index 00000000000..1e2ad8b40f1 --- /dev/null +++ b/data/scripts/creaturescripts/others/remove_empty_parcel.lua @@ -0,0 +1,20 @@ +local removeEmptyParcelsEvent = CreatureEvent("RemoveEmptyParcelsOnLogin") + +function removeEmptyParcelsEvent.onLogin(player) + local emptyParcelsToRemove = {} + for _, parcel in ipairs(player:getStoreInbox():getItems(true)) do + if parcel:getId() == ITEM_PARCEL_STAMPED and parcel:getEmptySlots() == 10 then + table.insert(emptyParcelsToRemove, parcel) + end + end + + if #emptyParcelsToRemove > 0 then + for _, parcel in pairs(emptyParcelsToRemove) do + parcel:remove() + end + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, #emptyParcelsToRemove .. " empty parcels were removed from your store inbox!") + end + return true +end + +removeEmptyParcelsEvent:register() diff --git a/data/scripts/creaturescripts/player/login.lua b/data/scripts/creaturescripts/player/login.lua new file mode 100644 index 00000000000..34d139a047d --- /dev/null +++ b/data/scripts/creaturescripts/player/login.lua @@ -0,0 +1,163 @@ +local function sendBoostMessage(player, category, isIncreased) + return player:sendTextMessage(MESSAGE_BOOSTED_CREATURE, string.format("Event! %s is %screased. Happy Hunting!", category, isIncreased and "in" or "de")) +end + +local function onMovementRemoveProtection(playerId, oldPos, time) + local player = Player(playerId) + if not player then + return true + end + + local playerPos = player:getPosition() + if (playerPos.x ~= oldPos.x or playerPos.y ~= oldPos.y or playerPos.z ~= oldPos.z) or player:getTarget() then + player:kv():remove("combat-protection") + return true + end + + addEvent(onMovementRemoveProtection, 1000, playerId, oldPos, time - 1) +end + +local playerLoginGlobal = CreatureEvent("PlayerLoginGlobal") + +function playerLoginGlobal.onLogin(player) + -- Welcome + local loginStr + if player:getLastLoginSaved() == 0 then + loginStr = "Please choose your outfit." + player:sendOutfitWindow() + local startStreakLevel = configManager.getNumber(configKeys.START_STREAK_LEVEL) + if startStreakLevel > 0 then + player:setStreakLevel(startStreakLevel) + end + + db.query("UPDATE `players` SET `istutorial` = 0 WHERE `id` = " .. player:getGuid()) + else + loginStr = string.format("Your last visit in %s: %s.", SERVER_NAME, os.date("%d %b %Y %X", player:getLastLoginSaved())) + end + player:sendTextMessage(MESSAGE_LOGIN, loginStr) + + -- Promotion + local vocation = player:getVocation() + local promotion = vocation:getPromotion() + if player:isPremium() then + local hasPromotion = player:kv():get("promoted") + if not player:isPromoted() and hasPromotion then + player:setVocation(promotion) + end + elseif player:isPromoted() then + player:setVocation(vocation:getDemotion()) + end + + -- Boosted + player:sendTextMessage(MESSAGE_BOOSTED_CREATURE, "Today's boosted creature: " .. Game.getBoostedCreature() .. " \ + Boosted creatures yield more experience points, carry more loot than usual and respawn at a faster rate.") + player:sendTextMessage(MESSAGE_BOOSTED_CREATURE, "Today's boosted boss: " .. Game.getBoostedBoss() .. " \ + Boosted bosses contain more loot and count more kills for your Bosstiary.") + + -- Rewards + local rewards = #player:getRewardList() + if rewards > 0 then + player:sendTextMessage(MESSAGE_LOGIN, string.format("You have %d reward%s in your reward chest.", rewards, rewards > 1 and "s" or "")) + end + + -- Rate events: + if SCHEDULE_EXP_RATE ~= 100 then + sendBoostMessage(player, "Exp Rate", SCHEDULE_EXP_RATE > 100) + end + + if SCHEDULE_SPAWN_RATE ~= 100 then + sendBoostMessage(player, "Spawn Rate", SCHEDULE_SPAWN_RATE > 100) + end + + if SCHEDULE_LOOT_RATE ~= 100 then + sendBoostMessage(player, "Loot Rate", SCHEDULE_LOOT_RATE > 100) + end + + if SCHEDULE_BOSS_LOOT_RATE ~= 100 then + sendBoostMessage(player, "Boss Loot Rate", SCHEDULE_BOSS_LOOT_RATE > 100) + end + + if SCHEDULE_SKILL_RATE ~= 100 then + sendBoostMessage(player, "Skill Rate", SCHEDULE_SKILL_RATE > 100) + end + + -- Send Recruiter Outfit + local resultId = db.storeQuery("SELECT `recruiter` FROM `accounts` WHERE `id`= " .. getAccountNumberByPlayerName(getPlayerName(player))) + if resultId then + local recruiterStatus = Result.getNumber(resultId, "recruiter") + local sex = player:getSex() + local outfitId = (sex == 1) and 746 or 745 + for outfitAddOn = 0, 2 do + if recruiterStatus >= outfitAddOn * 3 + 1 then + if not player:hasOutfit(outfitId, outfitAddOn) then + if outfitAddOn == 0 then + player:addOutfit(outfitId) + else + player:addOutfitAddon(outfitId, outfitAddOn) + end + end + end + end + end + + -- Send Client Exp Display + if configManager.getBoolean(configKeys.XP_DISPLAY_MODE) then + local baseRate = player:getFinalBaseRateExperience() * 100 + if configManager.getBoolean(configKeys.VIP_SYSTEM_ENABLED) then + local vipBonusExp = configManager.getNumber(configKeys.VIP_BONUS_EXP) + if vipBonusExp > 0 and player:isVip() then + vipBonusExp = (vipBonusExp > 100 and 100) or vipBonusExp + baseRate = baseRate * (1 + (vipBonusExp / 100)) + player:sendTextMessage(MESSAGE_BOOSTED_CREATURE, "Normal base xp is: " .. baseRate .. "%, because you are VIP, bonus of " .. vipBonusExp .. "%") + end + end + + player:setBaseXpGain(baseRate) + end + + player:setStaminaXpBoost(player:getFinalBonusStamina() * 100) + player:getFinalLowLevelBonus() + + -- Set Ghost Mode + if player:getGroup():getId() >= GROUP_TYPE_GAMEMASTER then + player:setGhostMode(true) + end + + -- Resets + if _G.OnExerciseTraining[player:getId()] then + stopEvent(_G.OnExerciseTraining[player:getId()].event) + _G.OnExerciseTraining[player:getId()] = nil + player:setTraining(false) + end + + local playerId = player:getId() + _G.NextUseStaminaTime[playerId] = 1 + _G.NextUseXpStamina[playerId] = 1 + _G.NextUseConcoctionTime[playerId] = 1 + DailyReward.init(playerId) + + local stats = player:inBossFight() + if stats then + stats.playerId = player:getId() + end + + -- Remove Boss Time + if GetDailyRewardLastServerSave() >= player:getLastLoginSaved() then + player:setRemoveBossTime(1) + end + + -- Remove combat protection + local isProtected = player:kv():get("combat-protection") or 0 + if isProtected < 1 then + player:kv():set("combat-protection", 1) + onMovementRemoveProtection(playerId, player:getPosition(), 10) + end + + player:initializeLoyaltySystem() + player:registerEvent("PlayerDeath") + player:registerEvent("DropLoot") + player:registerEvent("BossParticipation") + return true +end + +playerLoginGlobal:register() diff --git a/data-otservbr-global/scripts/creaturescripts/others/logout.lua b/data/scripts/creaturescripts/player/logout.lua similarity index 71% rename from data-otservbr-global/scripts/creaturescripts/others/logout.lua rename to data/scripts/creaturescripts/player/logout.lua index ecdb13378d2..cab57c5ad68 100644 --- a/data-otservbr-global/scripts/creaturescripts/others/logout.lua +++ b/data/scripts/creaturescripts/player/logout.lua @@ -1,23 +1,21 @@ local playerLogout = CreatureEvent("PlayerLogout") + function playerLogout.onLogout(player) local playerId = player:getId() - if _G.NextUseStaminaTime[playerId] ~= nil then + if _G.NextUseStaminaTime[playerId] then _G.NextUseStaminaTime[playerId] = nil end - player:saveSpecialStorage() - player:setStorageValue(Storage.ExerciseDummyExhaust, 0) - local stats = player:inBossFight() if stats then local boss = Monster(stats.bossId) - -- Player logged out (or died) in the middle of a boss fight, store his damageOut and stamina if boss then local dmgOut = boss:getDamageMap()[playerId] if dmgOut then stats.damageOut = (stats.damageOut or 0) + dmgOut.total end + stats.stamina = player:getStamina() end end @@ -27,8 +25,6 @@ function playerLogout.onLogout(player) _G.OnExerciseTraining[playerId] = nil player:setTraining(false) end - - player:setStorageValue(17101, 0) return true end diff --git a/data-otservbr-global/scripts/creaturescripts/players/namelock.lua b/data/scripts/creaturescripts/player/name_lock.lua similarity index 90% rename from data-otservbr-global/scripts/creaturescripts/players/namelock.lua rename to data/scripts/creaturescripts/player/name_lock.lua index c34eab6f181..cb2af81de3f 100644 --- a/data-otservbr-global/scripts/creaturescripts/players/namelock.lua +++ b/data/scripts/creaturescripts/player/name_lock.lua @@ -3,9 +3,10 @@ function CheckNamelock(player) if not namelockReason then return true end + player:setMoveLocked(true) player:teleportTo(player:getTown():getTemplePosition()) - player:sendTextMessage(MESSAGE_ADMINISTRADOR, "Your name has been locked for the following reason: " .. namelockReason .. ".") + player:sendTextMessage(MESSAGE_ADMINISTRATOR, "Your name has been locked for the following reason: " .. namelockReason .. ".") player:openStore("extras") addPlayerEvent(sendRequestPurchaseData, 50, player, 65002, GameStore.ClientOfferTypes.CLIENT_STORE_OFFER_NAMECHANGE) addPlayerEvent(CheckNamelock, 30000, player) diff --git a/data-canary/scripts/creaturescripts/offline_training.lua b/data/scripts/creaturescripts/player/offline_training.lua similarity index 97% rename from data-canary/scripts/creaturescripts/offline_training.lua rename to data/scripts/creaturescripts/player/offline_training.lua index e6ada9880d1..abfb0b94b3d 100644 --- a/data-canary/scripts/creaturescripts/offline_training.lua +++ b/data/scripts/creaturescripts/player/offline_training.lua @@ -1,4 +1,4 @@ -local offlineTraining = CreatureEvent("Offline Training") +local offlineTraining = CreatureEvent("OfflineTraining") function offlineTraining.onLogin(player) local lastLogout = player:getLastLogout() @@ -72,7 +72,6 @@ function offlineTraining.onLogin(player) if updateSkills then player:addOfflineTrainingTries(SKILL_SHIELD, trainingTime / 4) end - return true end diff --git a/data-otservbr-global/scripts/creaturescripts/others/regenerate_stamina.lua b/data/scripts/creaturescripts/player/regenerate_stamina.lua similarity index 99% rename from data-otservbr-global/scripts/creaturescripts/others/regenerate_stamina.lua rename to data/scripts/creaturescripts/player/regenerate_stamina.lua index 4c70f7eb080..52c78e93f39 100644 --- a/data-otservbr-global/scripts/creaturescripts/others/regenerate_stamina.lua +++ b/data/scripts/creaturescripts/player/regenerate_stamina.lua @@ -1,4 +1,5 @@ local regenerateStamina = CreatureEvent("RegenerateStamina") + function regenerateStamina.onLogin(player) if not configManager.getBoolean(configKeys.STAMINA_SYSTEM) then return true @@ -6,6 +7,7 @@ function regenerateStamina.onLogin(player) local lastLogout = player:getLastLogout() local offlineTime = lastLogout ~= 0 and math.min(os.time() - lastLogout, 86400 * 21) or 0 + offlineTime = offlineTime - 600 if offlineTime < 180 then @@ -15,12 +17,14 @@ function regenerateStamina.onLogin(player) local staminaMinutes = player:getStamina() local maxNormalStaminaRegen = 2340 - math.min(2340, staminaMinutes) local regainStaminaMinutes = offlineTime / 180 + if regainStaminaMinutes > maxNormalStaminaRegen then local happyHourStaminaRegen = (offlineTime - (maxNormalStaminaRegen * 180)) / 360 staminaMinutes = math.min(2520, math.max(2340, staminaMinutes) + happyHourStaminaRegen) else staminaMinutes = staminaMinutes + regainStaminaMinutes end + player:setStamina(staminaMinutes) return true end diff --git a/data/scripts/creaturescripts/player/send_first_items.lua b/data/scripts/creaturescripts/player/send_first_items.lua new file mode 100644 index 00000000000..53fecd11554 --- /dev/null +++ b/data/scripts/creaturescripts/player/send_first_items.lua @@ -0,0 +1,113 @@ +local config = { + [VOCATION.ID.NONE] = { + container = { + { 3003, 1 }, -- rope + { 3457, 1 }, -- shovel + }, + }, + + [VOCATION.ID.SORCERER] = { + items = { + { 3059, 1 }, -- spellbook + { 3074, 1 }, -- wand of vortex + { 7991, 1 }, -- magician's robe + { 7992, 1 }, -- mage hat + { 3362, 1 }, -- studded legs + { 3552, 1 }, -- leather boots + { 3572, 1 }, -- scarf + }, + + container = { + { 3003, 1 }, -- rope + { 5710, 1 }, -- light shovel + { 268, 10 }, -- mana potion + }, + }, + + [VOCATION.ID.DRUID] = { + items = { + { 3059, 1 }, -- spellbook + { 3066, 1 }, -- snakebite rod + { 7991, 1 }, -- magician's robe + { 7992, 1 }, -- mage hat + { 3362, 1 }, -- studded legs + { 3552, 1 }, -- leather boots + { 3572, 1 }, -- scarf + }, + + container = { + { 3003, 1 }, -- rope + { 5710, 1 }, -- light shovel + { 268, 10 }, -- mana potion + }, + }, + + [VOCATION.ID.PALADIN] = { + items = { + { 3425, 1 }, -- dwarven shield + { 3277, 1 }, -- spear + { 3571, 1 }, -- ranger's cloak + { 8095, 1 }, -- ranger legs + { 3552, 1 }, -- leather boots + { 3572, 1 }, -- scarf + { 3374, 1 }, -- legion helmet + }, + + container = { + { 3003, 1 }, -- rope + { 5710, 1 }, -- light shovel + { 266, 10 }, -- health potion + { 3350, 1 }, -- bow + { 3447, 50 }, -- 50 arrows + }, + }, + + [VOCATION.ID.KNIGHT] = { + items = { + { 3425, 1 }, -- dwarven shield + { 7773, 1 }, -- steel axe + { 3359, 1 }, -- brass armor + { 3354, 1 }, -- brass helmet + { 3372, 1 }, -- brass legs + { 3552, 1 }, -- leather boots + { 3572, 1 }, -- scarf + }, + + container = { + { 7774, 1 }, -- jagged sword + { 3327, 1 }, -- daramanian mace + { 3003, 1 }, -- rope + { 5710, 1 }, -- light shovel + { 266, 10 }, -- health potion + }, + }, +} + +local sendFirstItems = CreatureEvent("SendFirstItems") + +function sendFirstItems.onLogin(player) + local targetVocation = config[player:getVocation():getId()] + if not targetVocation or player:getLastLoginSaved() ~= 0 then + return true + end + + if targetVocation.items then + for i = 1, #targetVocation.items do + player:addItem(targetVocation.items[i][1], targetVocation.items[i][2]) + end + end + + local backpack = player:addItem(2854) + if not backpack then + return true + end + + if targetVocation.container then + for i = 1, #targetVocation.container do + backpack:addItem(targetVocation.container[i][1], targetVocation.container[i][2]) + end + end + return true +end + +sendFirstItems:register() diff --git a/data/scripts/creaturescripts/player/update_player_on_advanced_level.lua b/data/scripts/creaturescripts/player/update_player_on_advanced_level.lua new file mode 100644 index 00000000000..aa22976740c --- /dev/null +++ b/data/scripts/creaturescripts/player/update_player_on_advanced_level.lua @@ -0,0 +1,15 @@ +local updatePlayerOnAdvancedLevel = CreatureEvent("UpdatePlayerOnAdvancedLevel") + +function updatePlayerOnAdvancedLevel.onAdvance(player, skill, oldLevel, newLevel) + if skill ~= SKILL_LEVEL or newLevel <= oldLevel then + return true + end + + player:addHealth(player:getMaxHealth()) + player:addMana(player:getMaxMana()) + player:getFinalLowLevelBonus() + player:save() + return true +end + +updatePlayerOnAdvancedLevel:register() diff --git a/data/scripts/eventcallbacks/monster/on_spawn.lua b/data/scripts/eventcallbacks/monster/on_spawn.lua index e0480d8e325..e40778aafce 100644 --- a/data/scripts/eventcallbacks/monster/on_spawn.lua +++ b/data/scripts/eventcallbacks/monster/on_spawn.lua @@ -1,53 +1,16 @@ -local function handleCobra(monster) - if monster:getName():lower() == "cobra scout" or monster:getName():lower() == "cobra vizier" or monster:getName():lower() == "cobra assassin" then - if getGlobalStorageValue(GlobalStorage.CobraBastionFlask) >= os.time() then - monster:setHealth(monster:getMaxHealth() * 0.75) - end - end -end - -local function handleIronServantReplica(monster) - if monster:getName():lower() ~= "iron servant replica" then - return - end - - local chance = math.random(100) - if Game.getStorageValue(GlobalStorage.ForgottenKnowledge.MechanismDiamond) >= 1 and Game.getStorageValue(GlobalStorage.ForgottenKnowledge.MechanismGolden) >= 1 then - if chance > 30 then - local monsterType = math.random(2) == 1 and "diamond servant replica" or "golden servant replica" - Game.createMonster(monsterType, monster:getPosition(), false, true) - monster:remove() - end - return - end - - if Game.getStorageValue(GlobalStorage.ForgottenKnowledge.MechanismDiamond) >= 1 and chance > 30 then - Game.createMonster("diamond servant replica", monster:getPosition(), false, true) - monster:remove() - return - end - - if Game.getStorageValue(GlobalStorage.ForgottenKnowledge.MechanismGolden) >= 1 and chance > 30 then - Game.createMonster("golden servant replica", monster:getPosition(), false, true) - monster:remove() - end -end - local callback = EventCallback() function callback.monsterOnSpawn(monster, position) if not monster then return end + HazardMonster.onSpawn(monster, position) if monster:getType():isRewardBoss() then monster:setReward(true) end - handleCobra(monster) - handleIronServantReplica(monster) - if not monster:getType():canSpawn(position) then monster:remove() else diff --git a/data-canary/scripts/globalevents/global_server_save.lua b/data/scripts/globalevents/global_server_save.lua similarity index 59% rename from data-canary/scripts/globalevents/global_server_save.lua rename to data/scripts/globalevents/global_server_save.lua index 51e1ed1fc35..00eaebbc3c3 100644 --- a/data-canary/scripts/globalevents/global_server_save.lua +++ b/data/scripts/globalevents/global_server_save.lua @@ -2,26 +2,26 @@ local function ServerSave() if configManager.getBoolean(configKeys.GLOBAL_SERVER_SAVE_CLEAN_MAP) then cleanMap() end + if configManager.getBoolean(configKeys.GLOBAL_SERVER_SAVE_CLOSE) then Game.setGameState(GAME_STATE_CLOSED) - end - if configManager.getBoolean(configKeys.GLOBAL_SERVER_SAVE_SHUTDOWN) then + elseif configManager.getBoolean(configKeys.GLOBAL_SERVER_SAVE_SHUTDOWN) then Game.setGameState(GAME_STATE_SHUTDOWN) end - -- Updating daily reward next server save + + -- Update daily reward next server save timestamp UpdateDailyRewardGlobalStorage(DailyReward.storages.lastServerSave, os.time()) end local function ServerSaveWarning(time) - -- minus one minutes + -- Calculate remaining time, minus one minute local remainingTime = tonumber(time) - 60000 if configManager.getBoolean(configKeys.GLOBAL_SERVER_SAVE_NOTIFY_MESSAGE) then - local message = "Server is saving game in " .. (remainingTime / 60000) .. " minute(s). Please logout." + local message = "Server is saving the game in " .. (remainingTime / 60000) .. " minute(s). Please logout." Webhook.sendMessage("Server save", message, WEBHOOK_COLOR_WARNING) Game.broadcastMessage(message, MESSAGE_GAME_HIGHLIGHT) end - -- if greater than one minute, schedule another warning - -- else the next event will be the server save + if remainingTime > 60000 then addEvent(ServerSaveWarning, 60000, remainingTime) else @@ -29,19 +29,22 @@ local function ServerSaveWarning(time) end end +local globalServerSave = GlobalEvent("GlobalServerSave") + -- Function that is called by the global events when it reaches the time configured --- interval is the time between the event start and the the effective save, it will send an notify message every minute -local serversave = GlobalEvent("serversave") -function serversave.onTime(interval) +-- Interval is the time between the event start and the effective save, it will send a notify message every minute +function globalServerSave.onTime(interval) local remainingTime = configManager.getNumber(configKeys.GLOBAL_SERVER_SAVE_NOTIFY_DURATION) * 60000 if configManager.getBoolean(configKeys.GLOBAL_SERVER_SAVE_NOTIFY_MESSAGE) then - local message = "Server is saving game in " .. (remainingTime / 60000) .. " minute(s). Please logout." + local message = "Server is saving the game in " .. (remainingTime / 60000) .. " minute(s). Please logout." Webhook.sendMessage("Server save", message, WEBHOOK_COLOR_WARNING) Game.broadcastMessage(message, MESSAGE_GAME_HIGHLIGHT) end - addEvent(ServerSaveWarning, 60000, remainingTime) -- Schedule next event in 1 minute(60000) + + -- Schedule the next warning event in 1 minute (60000 milliseconds) + addEvent(ServerSaveWarning, 60000, remainingTime) return not configManager.getBoolean(configKeys.GLOBAL_SERVER_SAVE_SHUTDOWN) end -serversave:time(configManager.getString(configKeys.GLOBAL_SERVER_SAVE_TIME)) -serversave:register() +globalServerSave:time(configManager.getString(configKeys.GLOBAL_SERVER_SAVE_TIME)) +globalServerSave:register() diff --git a/data-otservbr-global/scripts/globalevents/others/hireling_save.lua b/data/scripts/globalevents/hireling_save.lua similarity index 53% rename from data-otservbr-global/scripts/globalevents/others/hireling_save.lua rename to data/scripts/globalevents/hireling_save.lua index 19a3ba364f2..9f975ec9207 100644 --- a/data-otservbr-global/scripts/globalevents/others/hireling_save.lua +++ b/data/scripts/globalevents/hireling_save.lua @@ -1,6 +1,6 @@ -local hirelingSave = GlobalEvent("hirelingSave") +local hirelingSave = GlobalEvent("HirelingSave") + function hirelingSave.onShutdown() - logger.info("Saving Hirelings") SaveHirelings() return true end diff --git a/data-canary/scripts/globalevents/record.lua b/data/scripts/globalevents/online_record.lua similarity index 52% rename from data-canary/scripts/globalevents/record.lua rename to data/scripts/globalevents/online_record.lua index 981b2db003c..506fd328ac1 100644 --- a/data-canary/scripts/globalevents/record.lua +++ b/data/scripts/globalevents/online_record.lua @@ -1,8 +1,8 @@ -local globalevent = GlobalEvent("Player Record") +local onlineRecord = GlobalEvent("OnlineRecord") -function globalevent.onRecord(current, old) +function onlineRecord.onRecord(current, old) addEvent(Game.broadcastMessage, 150, "New record: " .. current .. " players are logged in.", MESSAGE_LOGIN) return true end -globalevent:register() +onlineRecord:register() diff --git a/data-otservbr-global/scripts/globalevents/customs/save_interval.lua b/data/scripts/globalevents/save_interval.lua similarity index 100% rename from data-otservbr-global/scripts/globalevents/customs/save_interval.lua rename to data/scripts/globalevents/save_interval.lua diff --git a/data/scripts/globalevents/server_initialization.lua b/data/scripts/globalevents/server_initialization.lua index 26494c82ce4..97478582fc8 100644 --- a/data/scripts/globalevents/server_initialization.lua +++ b/data/scripts/globalevents/server_initialization.lua @@ -60,44 +60,41 @@ local function storeTownsInDatabase() end end --- Function to recursively check for duplicate values in a given variable's storage -local function checkDuplicateStorageValues(varTable, seen, duplicates) +-- Functions to recursively check for duplicate values in a given variable's storage and log the results +local seen, duplicatesValues + +local function checkDuplicateStorageValues(varTable) for _, value in pairs(varTable) do if type(value) == "table" then - checkDuplicateStorageValues(value, seen, duplicates) + checkDuplicateStorageValues(value) elseif seen[value] then - table.insert(duplicates, value) + table.insert(duplicatesValues, value) else seen[value] = true end end + return #duplicatesValues > 0 and duplicatesValues or false end --- Function to check for duplicate values in a given variable's storage -local function checkDuplicateStorageValuesWrapper(varName) - local seen = {} - local duplicates = {} - - local varTable = _G[varName] - if type(varTable) == "table" then - checkDuplicateStorageValues(varTable, seen, duplicates) - else - logger.warn("Warning: '" .. varName .. "' is not a table.") - end - - return #duplicates > 0 and duplicates or false -end - --- Function to check duplicated variable values and log the results -local function checkAndLogDuplicateValues(variableNames) - for _, variableName in ipairs(variableNames) do - local duplicates = checkDuplicateStorageValuesWrapper(variableName) - - if duplicates then - logger.warn("Checking " .. variableName .. ": Duplicate values found: " .. table.concat(duplicates, ", ")) +local function checkAndLogDuplicateValues(tableNames) + for _, tableName in ipairs(tableNames) do + local varTable = _G[tableName] + if type(varTable) == "table" then + seen = {} + duplicatesValues = {} + + local duplicates = checkDuplicateStorageValues(varTable) + if duplicates then + logger.warn("Checking {}: Duplicate values found: {}", tableName, table.concat(duplicates, ", ")) + else + logger.info("Checking {}: No duplicate values found.", tableName) + end else - logger.info("Checking " .. variableName .. ": No duplicate values found.") + logger.warn("{} is not a table. Unable to check for duplicate values.", varTable) end + + seen = nil + duplicatesValues = nil end end @@ -108,6 +105,11 @@ local function updateEventRates() SCHEDULE_LOOT_RATE = lootRate end + local bossLootRate = EventsScheduler.getEventSBossLoot() + if bossLootRate ~= 100 then + SCHEDULE_BOSS_LOOT_RATE = bossLootRate + end + local expRate = EventsScheduler.getEventSExp() if expRate ~= 100 then SCHEDULE_EXP_RATE = expRate @@ -124,8 +126,8 @@ local function updateEventRates() end -- Log information if any of the rates are not 100% - if expRate ~= 100 or lootRate ~= 100 or spawnRate ~= 100 or skillRate ~= 100 then - logger.info("[Events] Exp: {}%, loot: {}%, Spawn: {}%, Skill: {}%", expRate, lootRate, spawnRate, skillRate) + if expRate ~= 100 or lootRate ~= 100 or spawnRate ~= 100 or skillRate ~= 100 or bossLootRate ~= 100 then + logger.info("[Events] Exp: {}%, Loot: {}%, Spawn: {}%, Skill: {}%, Boss loot: {}%", expRate, lootRate, spawnRate, skillRate, bossLootRate) end end diff --git a/data/libs/systems/achievements.lua b/data/scripts/lib/register_achievements.lua similarity index 60% rename from data/libs/systems/achievements.lua rename to data/scripts/lib/register_achievements.lua index 3a5a4b96117..11d238d8bcf 100644 --- a/data/libs/systems/achievements.lua +++ b/data/scripts/lib/register_achievements.lua @@ -1,508 +1,426 @@ ---[[ - -Achievements Lib Created By Eduardo Montilva (Darkhaos) for TFS 1.X - -LAST UPDATE: 23 July 2019 (PRE-Tibia Update 12.20) - -Functions: - getAchievementInfoById(achievement_id) - getAchievementInfoByName(achievement_name) - getSecretAchievements() - getPublicAchievements() - getAchievements() - Player:addAchievement(achievement_id/name[, showMsg]) - Player:removeAchievement(achievement_id/name) - Player:hasAchievement(achievement_id/name) - Player:addAllAchievements([showMsg]) - Player:removeAllAchievements() - Player:getSecretAchievements() - Player:getPublicAchievements() - Player:getAchievements() - isAchievementSecret(achievement_id/name) - Player:getAchievementPoints() - -Note: This lib was created following the data found in tibia.wikia.com. - Achievements with no points (or points equal to 0) are achievements with no available info about points in tibia.wikia.com. These achievements should be updated ---]] - --- Updated by F@bio Jr --- Reordered by Tibia Version and alphabetically --- LAST UPDATE: 01 December 2019 (PRE-Tibia Update 12.30) - -ACHIEVEMENTS_BASE = 300000 -- base storage -ACHIEVEMENTS_ACTION_BASE = 20000 --this storage will be used to save the process to obtain the certain achievement ---(Ex: this storage + the id of achievement 'Allowance Collector' to save... --- ...how many piggy banks has been broken - -achievements = { - --8.6 - [1] = { name = "Allow Cookies?", grade = 1, points = 2, description = "With a perfectly harmless smile you fooled all of those wisecrackers into eating your exploding cookies. Consider a boy or girl scout outfit next time to make the trick even better." }, - [2] = { name = "Allowance Collector", grade = 1, points = 2, secret = true, description = "You certainly have your ways when it comes to acquiring money. Many of them are pink and paved with broken fragments of porcelain." }, - [3] = { name = "Amateur Actor", grade = 1, points = 2, description = "You helped bringing Princess Buttercup, Doctor Dumbness and Lucky the Wonder Dog to life - and will probably dream of them tonight, since you memorised your lines perfectly. What a .. special piece of.. screenplay." }, - [4] = { name = "Animal Activist", grade = 1, points = 2, description = "You have a soft spot for little, weak animals, and you do everything in your power to protect them - even if you probably eat dragons for breakfast." }, - [5] = { name = "Annihilator", grade = 2, points = 5, description = "You've daringly jumped into the infamous Annihilator and survived - taking home fame, glory and your reward." }, - [6] = { name = "Archpostman", grade = 1, points = 3, description = "Delivering letters and parcels has always been a secret passion of yours, and now you can officially put on your blue hat, blow your Post Horn and do what you like to do most. Beware of dogs!" }, +ACHIEVEMENTS = { + [1] = { name = "Castlemania", grade = 2, points = 5, secret = true, description = "You have an eye for suspicious places and love to read other people's diaries, especially those with vampire stories in it. You're also a dedicated token collector and explorer. Respect!" }, + [2] = { name = "Chorister", grade = 1, points = 1, description = "Lalalala... you now know the cult's hymn sung in Liberty Bay by heart. Not that hard, considering that it mainly consists of two notes and repetitive lyrics." }, + [3] = { name = "The Milkman", grade = 1, points = 2, description = "Who's the milkman? You are!" }, + [4] = { name = "Vive la Resistance", grade = 1, points = 2, description = "You've always been a rebel - admit it! Supplying prisoners, caring for outcasts, stealing from the rich and giving to the poor - no wait, that was another story." }, + [5] = { name = "Culinary Master", grade = 2, points = 4, description = "Simple hams and bread merely make you laugh. You're the master of the extra-ordinaire, melter of cheese, fryer of bat wings and shaker of shakes. Delicious!" }, + [6] = { name = "Shell Seeker", grade = 1, points = 3, secret = true, description = "You found a hundred beautiful pearls in large sea shells. By now that necklace should be finished - and hopefully you didn't get your fingers squeezed too often during the process." }, [7] = { name = "Backpack Tourist", grade = 1, points = 1, secret = true, description = "If someone lost a random thing in a random place, you're probably a good person to ask and go find it, even if you don't know what and where." }, - [8] = { name = "Beach Tamer", grade = 1, points = 2, description = "You re-enacted the Taming of the Shrew on a beach setting and proved that you can handle capricious girls quite well. With or without fish tails." }, - [9] = { name = "Bearhugger", grade = 1, points = 1, description = "Warm, furry and cuddly - though that same bear you just hugged would probably rip you into pieces if he had been conscious, he reminded you of that old teddy bear which always slept in your bed when you were still small." }, - [10] = { name = "Blessed!", grade = 1, points = 2, description = "You travelled the world for an almost meaningless prayer - but at least you don't have to do that again and can get a new blessed stake in the blink of an eye." }, + [8] = { name = "Dread Lord", grade = 3, points = 8, secret = true, description = "You don't care for rules that others set up and shape the world to your liking. Having left behind meaningless conventions and morals, you prize only the power you wield. You're a master of your fate and battle to cleanse the world." }, + [9] = { name = "Lord Protector", grade = 3, points = 8, secret = true, description = "You proved yourself - not only in your dreams - and possess a strong and spiritual mind. Your valorous fight against demons and the undead plague has granted you the highest and most respected rank among the Nightmare Knights." }, + [10] = { name = "Nightmare Knight", grade = 1, points = 1, description = "You follow the path of dreams and that of responsibility without self-centered power. Free from greed and selfishness, you help others without expecting a reward." }, [11] = { name = "Bone Brother", grade = 1, points = 1, description = "You've joined the undead bone brothers - making death your enemy and your weapon as well. Devouring what's weak and leaving space for what's strong is your primary goal." }, - [12] = { name = "Castlemania", grade = 2, points = 5, secret = true, description = "You have an eye for suspicious places and love to read other people's diaries, especially those with vampire stories in it. You're also a dedicated token collector and explorer. Respect!" }, - [13] = { name = "Champion of Chazorai", grade = 2, points = 4, description = "You won the merciless 2 vs. 2 team tournament on the Isle of Strife and wiped out wave after wave of fearsome opponents. Death or victory - you certainly chose the latter." }, - [14] = { name = "Chorister", grade = 1, points = 1, description = "Lalalala... you now know the cult's hymn sung in Liberty Bay" }, - [15] = { name = "Clay Fighter", grade = 1, points = 3, secret = true, description = "You love getting your hands wet and dirty - and covered with clay. Your perfect sculpture of Brog, the raging Titan is your true masterpiece." }, - [16] = { name = "Clay to Fame", grade = 2, points = 6, secret = true, description = "Sculpting Brog, the raging Titan, is your secret passion. Numerous perfect little clay statues with your name on them can be found everywhere around Tibia." }, - [17] = { name = "Cold as Ice", grade = 2, points = 6, secret = true, description = "Take an ice cube and an obsidian knife and you'll very likely shape something really pretty from it. Mostly cute little mammoths, which are a hit with all the girls." }, - [18] = { name = "Culinary Master", grade = 2, points = 4, description = "Simple hams and bread merely make you laugh. You're the master of the extra-ordinaire, melter of cheese, fryer of bat wings and shaker of shakes. Delicious!" }, - [19] = { name = "Deep Sea Diver", grade = 2, points = 4, secret = true, description = "Under the sea - might not be your natural living space, but you're feeling quite comfortable on the ocean floor. Quara don't scare you anymore and sometimes you sleep with your helmet of the deep still equipped." }, - [20] = { name = "Dread Lord", grade = 3, points = 8, secret = true, description = "You don't care for rules that others set up and shape the world to your liking. Having left behind meaningless conventions and morals, you prize only the power you wield. You're a master of your fate and battle to cleanse the world." }, - [21] = { name = "Efreet Ally", grade = 1, points = 3, description = 'Even though the welcomed you only reluctantly and viewed you as "only a human" for quite some time, you managed to impress Malor and gained his respect and trade options with the green djinns.' }, - [22] = { name = "Elite Hunter", grade = 2, points = 5, description = "You jump at every opportunity for a hunting challenge that's offered to you and carry out those tasks with deadly precision. You're a hunter at heart and a valuable member of the Paw & Fur Society." }, - [23] = { name = "Explorer", grade = 2, points = 4, description = "You've been to places most people don't even know the names of. Collecting botanic, zoologic and ectoplasmic samples is your daily business and you're always prepared to discover new horizons." }, - [24] = { name = "Exquisite Taste", grade = 1, points = 2, secret = true, description = "You love fish - but preferably those caught in the cold north. Even though they're hard to come by you never get tired of picking holes in ice sheets and hanging your fishing rod in." }, - [25] = { name = "Firewalker", grade = 2, points = 4, secret = true, description = "Running barefoot across ember is not for you! You do it the elegant way. Yet, you're kind of drawn to fire and warm surroundings in general - you like it hot!" }, - [26] = { name = "Fireworks in the Sky", grade = 1, points = 2, secret = true, description = "You love the moment right before your rocket takes off and explodes into beautiful colours - not only on new year's eve!" }, - [27] = { name = "Follower of Azerus", grade = 2, points = 4, description = "When you do something, you do it right. You have an opinion and you stand by it - and no one will be able to convince you otherwise. On a sidenote, you're a bit on the brutal and war-oriented side, but that's not a bad thing, is it?" }, - [28] = { name = "Follower of Palimuth", grade = 2, points = 4, description = "You're a peacekeeper and listen to what the small people have to say. You've made up your mind and know who to help and for which reasons - and you do it consistently. Your war is fought with reason rather than weapons." }, - [29] = { name = "Fountain of Life", grade = 1, points = 1, secret = true, description = "You found and took a sip from the Fountain of Life. Thought it didn't grant you eternal life, you feel changed and somehow at peace." }, - [30] = { name = "Friend of the Apes", grade = 2, points = 4, description = "You know Banuta like the back of your hand and are good at destroying caskets and urns. The sight of giant footprints doesn't keep you from exploring unknown areas either." }, - [31] = { name = "Ghostwhisperer", grade = 1, points = 3, description = "You don't hunt them, you talk to them. You know that ghosts might keep secrets that have been long lost among the living, and you're skilled at talking them into revealing them to you." }, - [32] = { name = "Golem in the Gears", grade = 2, points = 4, description = "You're an aspiring mago-mechanic. Science and magic work well together in your eyes - and even though you probably delivered countless wrong charges while working for Telas, you might just have enough knowledge to build your own golem now." }, - [33] = { name = "Green Thumb", grade = 2, points = 4, secret = true, description = "If someone gives you seeds, you usually grow a beautiful plant from it within a few days. You like your house green and decorated with flowers. Probably you also talk to them." }, - [34] = { name = "Greenhorn", grade = 1, points = 2, description = "You wiped out Orcus the Cruel in the Arena of Svargrond. You're still a bit green behind the ears, but there's some great potential." }, - [35] = { name = "Herbicide", grade = 3, points = 8, secret = true, description = "You're one of the brave heroes to face and defeat the mysterious demon oak and all the critters it threw in your face. Wielding your blessed axe no tree dares stand in your way - demonic or not." }, - [36] = { name = "Here, Fishy Fishy!", grade = 1, points = 1, secret = true, description = "Ah, the smell of the sea! Standing at the shore and casting a line is one of your favourite activities. For you, fishingis relaxing - and at the same time, providing easy food. Perfect!" }, - [37] = { name = "High-Flyer", grade = 2, points = 4, secret = true, description = "The breeze in your hair, your fingers clutching the rim of your Carpet - that's how you like to travel. Faster! Higher! And a looping every now and then." }, - [38] = { name = "High Inquisitor", grade = 2, points = 5, description = "You're the one who poses the questions around here, and you know how to get the answers you want to hear. Besides, you're a famous exorcist and slay a few vampires and demons here and there. You and your stake are a perfect team." }, - [39] = { name = "His True Face", grade = 1, points = 3, secret = true, description = "You're one of the few Tibians who Armenius chose to actually show his true face to - and he made you fight him. Either that means you're very lucky or very unlucky, but one thing's for sure - it's extremely rare." }, + [12] = { name = "Blessed!", grade = 1, points = 2, description = "You travelled the world for an almost meaningless prayer - but at least you don't have to do that again and can get a new blessed stake in the blink of an eye." }, + [13] = { name = "Recognised Trader", grade = 1, points = 3, description = "You're a talented merchant who's able to handle wares with care, finds good offers and digs up rares every now and then. Never late to complete an order, you're a reliable trader - at least in Rashid's eyes." }, + [14] = { name = "Fountain of Life", grade = 1, points = 1, secret = true, description = "You found and took a sip from the Fountain of Life. Thought it didn't grant you eternal life, you feel changed and somehow at peace." }, + [15] = { name = "Lord of the Elements", grade = 2, points = 5, description = "You travelled the surreal realm of the elemental spheres, summoned and slayed the Lord of the Elements, all in order to retrieve neutral matter. And as brave as you were, you couldn't have done it without your team!" }, + [16] = { name = "Beach Tamer", grade = 1, points = 2, description = "You re-enacted the Taming of the Shrew on a beach setting and proved that you can handle capricious girls quite well. With or without fish tails." }, + [17] = { name = "Follower of Azerus", grade = 2, points = 4, description = "When you do something, you do it right. You have an opinion and you stand by it - and no one will be able to convince you otherwise. On a sidenote, you're a bit on the brutal and war-oriented side, but that's not a bad thing, is it?" }, + [18] = { name = "Follower of Palimuth", grade = 2, points = 4, description = "You're a peacekeeper and listen to what the small people have to say. You've made up your mind and know who to help and for which reasons - and you do it consistently. Your war is fought with reason rather than weapons." }, + [19] = { name = "Elite Hunter", grade = 2, points = 5, description = "You jump at every opportunity for a hunting challenge that's offered to you and carry out those tasks with deadly precision. You're a hunter at heart and a valuable member of the Paw & Fur Society." }, + [20] = { name = "Huntsman", grade = 1, points = 2, description = "You're familiar with hunting tasks and have carried out quite a few already. A bright career as hunter for the Paw & Fur society lies ahead!" }, + [21] = { name = "Passionate Kisser", grade = 1, points = 3, description = "For you, a kiss is more than a simple touch of lips. You kiss maidens and deadbeats alike with unmatched affection and faced death and rebirth through the kiss of the banshee queen. Lucky are those who get to share such an intimate moment with you!" }, + [22] = { name = "Top AVIN Agent", grade = 2, points = 4, description = "You've proven yourself as a worthy member of the 'family' and successfully carried out numerous spy missions for your 'uncle' to support the Venorean traders and their goals." }, + [23] = { name = "Top CGB Agent", grade = 2, points = 4, description = "Girl power! Whether you're female or not, you've proven absolute loyalty and the willingness to put your life at stake for the girls brigade of Carlin." }, + [24] = { name = "Top TBI Agent", grade = 2, points = 4, description = "Conspiracies and open secrets are your daily bread. You've shown loyalty to the Thaian crown through your courage when facing enemies and completing spy missions. You're an excellent field agent of the TBI." }, + [25] = { name = "Secret Agent", grade = 1, points = 1, description = "Pack your spy gear and get ready for some dangerous missions in service of a secret agency. You've shown you want to - but can you really do it? Time will tell." }, + [26] = { name = "Golem in the Gears", grade = 2, points = 4, description = "You're an aspiring mago-mechanic. Science and magic work well together in your eyes - and even though you probably delivered countless wrong charges while working for Telas, you might just have enough knowledge to build your own golem now." }, + [27] = { name = "Poet Laureate", grade = 1, points = 2, secret = true, description = "Poems, verses, songs and rhymes you've recited many times. You have passed the cryptic door, raconteur of ancient lore. Even elves you've left impressed, so it seems you're truly blessed." }, + [28] = { name = "Minstrel", grade = 1, points = 2, secret = true, description = "You can handle any music instrument you're given - and actually manage to produce a pleasant sound with it. You're a welcome guest and entertainer in most taverns." }, + [29] = { name = "Friend of the Apes", grade = 2, points = 4, description = "You know Banuta like the back of your hand and are good at destroying caskets and urns. The sight of giant footprints doesn't keep you from exploring unknown areas either." }, + [30] = { name = "Territorial", grade = 1, points = 1, secret = true, description = "Your map is your friend — always in your back pocket and covered with countless marks of interesting and useful locations. One could say that you might be lost without it — but luckily there's no way to take it from you." }, + [31] = { name = "Marid Ally", grade = 1, points = 3, description = "You've proven to be a valuable ally to the Marid, and Gabel welcomed you to trade with Haroun and Nah'Bob whenever you want to. Though the Djinn war has still not ended, the Marid can't fail with you on their side." }, + [32] = { name = "Efreet Ally", grade = 1, points = 3, description = 'Even though the Efreet welcomed you only reluctantly and viewed you as "only a human" for quite some time, you managed to impress Malor and gained his respect and trade options with the green djinns.' }, + [33] = { name = "Lucid Dreamer", grade = 1, points = 2, description = "Dreams - are your reality? Strange visions, ticking clocks, going to bed and waking up somewhere completely else - that was some trip, but you're almost sure you actually did enjoy it." }, + [34] = { name = "Explorer", grade = 2, points = 4, description = "You've been to places most people don't even know the names of. Collecting botanic, zoologic and ectoplasmic samples is your daily business and you're always prepared to discover new horizons." }, + [35] = { name = "Sea Scout", grade = 1, points = 2, description = "Not even the hostile underwater environment stops you from doing your duty for the Explorer Society. Scouting the Quara realm is a piece of cake for you." }, + [36] = { name = "Unlikely Pathfinder", grade = 1, points = 2, secret = true, description = "Wow - what was that? You don't know how you ended up here, but somehow you did. How to get from Beregar to Kazordoon in a jiffy - that's something those dwarves would love to know, but you're not quite sure how to reproduce it." }, + [37] = { name = "Bearhugger", grade = 1, points = 1, description = "Warm, furry and cuddly - though that same bear you just hugged would probably rip you into pieces if he had been conscious, he reminded you of that old teddy bear which always slept in your bed when you were still small." }, + [38] = { name = "Ghostwhisperer", grade = 1, points = 3, description = "You don't hunt them, you talk to them. You know that ghosts might keep secrets that have been long lost among the living, and you're skilled at talking them into revealing them to you." }, + [39] = { name = "Animal Activist", grade = 1, points = 2, description = "You have a soft spot for little, weak animals, and you do everything in your power to protect them - even if you probably eat dragons for breakfast." }, [40] = { name = "Honorary Barbarian", grade = 1, points = 1, description = "You've hugged bears, pushed mammoths and proved your drinking skills. And even though you have a slight hangover, a partially fractured rib and some greasy hair on your tongue, you're quite proud to call yourself a honorary barbarian from now on." }, - [41] = { name = "Huntsman", grade = 1, points = 2, description = "You're familiar with hunting tasks and have carried out quite a few already. A bright career as hunter for the Paw & Fur society lies ahead!" }, - [42] = { name = "Ice Sculptor", grade = 1, points = 3, secret = true, description = "You love to hang out in cold surroundings and consider ice the best material to be shaped. What a waste to use ice cubes for drinks when you can create a beautiful mammoth statue from it!" }, - [43] = { name = "Interior Decorator", grade = 2, points = 4, secret = true, description = "Your home is your castle - and the furniture in it is just as important. Your friends ask for your advice when decorating their Houses and your probably own every statue, rack and bed there is." }, - [44] = { name = "Jamjam", grade = 2, points = 5, secret = true, description = "When it comes to interracial understanding, you're an expert. You've mastered the language of the Chakoya and made someone really happy with your generosity. Achuq!" }, - [45] = { name = "Jinx", grade = 1, points = 2, secret = true, description = "Sometimes you feel there's a gremlin in there. So many lottery tickets, so many blanks? That's just not fair! Share your misery with the world." }, - [46] = { name = "Just in Time", grade = 1, points = 1, description = "You're a fast runner and are good at delivering wares which are bound to decay just in the nick of time, even if you can't use any means of transportation or if your hands get cold or smelly in the process." }, - [47] = { name = "King Tibianus Fan", grade = 1, points = 3, description = "You're not sure what it is, but you feel drawn to royalty. Your knees are always a bit grazed from crawling around in front of thrones and you love hanging out in castles. Maybe you should consider applying as a guard?" }, - [48] = { name = "Lord Protector", grade = 3, points = 8, secret = true, description = "You proved yourself - not only in your dreams - and possess a strong and spiritual mind. Your valorous fight against demons and the undead plague has granted you the highest and most respected rank among the Nightmare Knights." }, - [49] = { name = "Lord of the Elements", grade = 2, points = 5, description = "You travelled the surreal realm of the elemental spheres, summoned and slayed the Lord of the Elements, all in order to retrieve neutral matter. And as brave as you were, you couldn't have done it without your team!" }, - [50] = { name = "Lucid Dreamer", grade = 1, points = 2, description = "Dreams - are your reality? Strange visions, ticking clocks, going to bed and waking up somewhere completely else - that was some trip, but you're almost sure you actually did enjoy it." }, - [51] = { name = "Lucky Devil", grade = 2, points = 4, secret = true, description = "That's almost too much luck for one person. If something's really, really rare - it probably falls into your lap sooner or later. Congratulations!" }, - [52] = { name = "Marble Madness", grade = 2, points = 6, secret = true, description = "Your little statues of Tibiasula have become quite famous around Tibia and there's few people with similar skills when it comes to shaping marble." }, - [53] = { name = "Marblelous", grade = 1, points = 3, secret = true, description = "You're an aspiring marble sculptor with promising skills - proven by the perfect little Tibiasula statue you shaped. One day you'll be really famous!" }, - [54] = { name = "Marid Ally", grade = 1, points = 3, description = "You've proven to be a valuable ally to the Marid, and Gabel welcomed you to trade with Haroun and Nah'Bob whenever you want to. Though the Djinn war has still not ended, the Marid can't fail with you on their side." }, - [55] = { name = "Masquerader", grade = 1, points = 3, secret = true, description = "You probably don't know anymore how you really look like - usually when you look into a mirror, some kind of monster stares back at you. On the other hand - maybe that's an improvement?" }, - [56] = { name = "Master Thief", grade = 2, points = 4, description = "Robbing, inviting yourself to VIP parties, faking contracts and pretending to be someone else - you're a jack of all trades when it comes to illegal activities. You take no prisoners, except for the occasional goldfish now and then." }, - [57] = { name = "Master of the Nexus", grade = 2, points = 6, description = "You were able to fight your way through the countless hordes in the Demon Forge. Once more you proved that nothing is impossible." }, - [58] = { name = "Matchmaker", grade = 1, points = 1, description = "You don't believe in romance to be a coincidence or in love at first sight. In fact - love potions, bouquets of flowers and cheesy poems do the trick much better than ever could. Keep those hormones flowing!" }, - [59] = { name = "Mathemagician", grade = 1, points = 1, description = "Sometimes the biggest secrets of life can have a simple solution." }, + [41] = { name = "High Inquisitor", grade = 2, points = 5, description = "You're the one who poses the questions around here, and you know how to get the answers you want to hear. Besides, you're a famous exorcist and slay a few vampires and demons here and there. You and your stake are a perfect team." }, + [42] = { name = "Worm Whacker", grade = 1, points = 1, secret = true, description = "Weehee! Whack those worms! You sure know how to handle a big hammer." }, + [43] = { name = "King Tibianus Fan", grade = 1, points = 3, description = "You're not sure what it is, but you feel drawn to royalty. Your knees are always a bit grazed from crawling around in front of thrones and you love hanging out in castles. Maybe you should consider applying as a guard?" }, + [44] = { name = "Just in Time", grade = 1, points = 1, description = "You're a fast runner and are good at delivering wares which are bound to decay just in the nick of time, even if you can't use any means of transportation or if your hands get cold or smelly in the process." }, + [45] = { name = "Perfect Fool", grade = 1, points = 3, description = "You love playing jokes on others and tricking them into looking a little silly. Wagging tongues say that the moment of realisation in your victims' eyes is the reward you feed on, but you're probably just kidding and having fun with them... right??" }, + [46] = { name = "Mathemagician", grade = 1, points = 1, description = "Sometimes the biggest secrets of life can have a simple solution." }, + [47] = { name = "Archpostman", grade = 1, points = 3, description = "Delivering letters and parcels has always been a secret passion of yours, and now you can officially put on your blue hat, blow your post horn and do what you like to do most. Beware of dogs!" }, + [48] = { name = "Matchmaker", grade = 1, points = 1, description = "You don't believe in romance to be a coincidence or in love at first sight. In fact - love potions, bouquets of flowers and cheesy poems do the trick much better than ever could. Keep those hormones flowing!" }, + [49] = { name = "His True Face", grade = 1, points = 3, secret = true, description = "You're one of the few Tibians who Armenius chose to actually show his true face to - and he made you fight him. Either that means you're very lucky or very unlucky, but one thing's for sure - it's extremely rare." }, + [50] = { name = "Razing!", grade = 3, points = 7, secret = true, description = "People with sharp canine teeth better beware of you, especially at nighttime, or they might find a stake between their ribs. You're a merciless vampire hunter and have gathered numerous tokens as proof." }, + [51] = { name = "Master Thief", grade = 2, points = 4, description = "Robbing, inviting yourself to VIP parties, faking contracts and pretending to be someone else - you're a jack of all trades when it comes to illegal activities. You take no prisoners, except for the occasional goldfish now and then." }, + [52] = { name = "Amateur Actor", grade = 1, points = 2, description = "You helped bringing Princess Buttercup, Doctor Dumbness and Lucky the Wonder Dog to life - and will probably dream of them tonight, since you memorised your lines perfectly. What a .. special piece of.. screenplay." }, + [53] = { name = "Scrapper", grade = 1, points = 3, description = "You put out the Spirit of Fire's flames in the arena of Svargrond. Arena fights are for you - fair, square, with simple rules and one-on-one battles." }, + [54] = { name = "Greenhorn", grade = 1, points = 2, description = "You wiped out Orcus the Cruel in the Arena of Svargrond. You're still a bit green behind the ears, but there's some great potential." }, + [55] = { name = "Warlord of Svargrond", grade = 2, points = 5, description = "You sent the Obliverator into oblivion in the arena of Svargrond and defeated nine other dangerous enemies on the way. All hail the Warlord of Svargrond!" }, + [56] = { name = "Herbicide", grade = 3, points = 8, secret = true, description = "You're one of the brave heroes to face and defeat the mysterious demon oak and all the critters it threw in your face. Wielding your blessed axe no tree dares stand in your way - demonic or not." }, + [57] = { name = "Annihilator", grade = 2, points = 5, description = "You've daringly jumped into the infamous Annihilator and survived - taking home fame, glory and your reward." }, + [58] = { name = "Master of the Nexus", grade = 2, points = 6, description = "You were able to fight your way through the countless hordes in the Demon Forge. Once more you proved that nothing is impossible." }, + [59] = { name = "Talented Dancer", grade = 1, points = 1, description = "You're a lord or lady of the dance - and not afraid to use your skills to impress tribal gods. One step to the left, one jump to the right, twist and shout!" }, [60] = { name = "Ministrel", grade = 1, points = 2, secret = true, description = "You can handle any music instrument you're given - and actually manage to produce a pleasant sound with it. You're a welcome guest and entertainer in most taverns." }, - [61] = { name = "Nightmare Knight", grade = 1, points = 1, description = "You follow the path of dreams and that of responsibility without self-centered power. Free from greed and selfishness, you help others without expecting a reward." }, - [62] = { name = "Party Animal", grade = 1, points = 1, secret = true, description = "Oh my god, it's a paaaaaaaaaaaarty! You're always in for fun, friends and booze and love being the center of attention. There's endless reasons to celebrate! Woohoo!" }, - [63] = { name = "Passionate Kisser", grade = 1, points = 3, description = "For you, a kiss is more than a simple touch of lips. You kiss maidens and deadbeats alike with unmatched affection and faced death and rebirth through the kiss of the banshee queen. Lucky are those who get to share such an intimate moment with you!" }, - [64] = { name = "Perfect Fool", grade = 1, points = 3, description = "You love playing jokes on others and tricking them into looking a little silly. Wagging tongues say that the moment of realisation in your victims' eyes is the reward you feed on, but you're probably just kidding and having fun with them... right??" }, - [65] = { name = "Poet Laureate", grade = 1, points = 2, secret = true, description = "Poems, verses, songs and rhymes you've recited many times. You have passed the cryptic door, raconteur of ancient lore. Even elves you've left impressed, so it seems you're truly blessed." }, - [66] = { name = "Polisher", grade = 2, points = 4, secret = true, description = "If you see a rusty item, you can't resist polishing it. There's always a little flask of rust remover in your inventory - who knows, there might be a golden armor beneath all that dirt!" }, - [67] = { name = "Potion Addict", grade = 2, points = 4, secret = true, description = "Your local magic trader considers you one of his best customers - you usually buy large stocks of potions so you won't wake up in the middle of the night craving for more. Yet, you always seem to run out of them too fast. Cheers!" }, - [68] = { name = "Quick as a Turtle", grade = 1, points = 2, secret = true, description = "There... is... simply... no... better... way - than to travel on the back of a turtle. At least you get to enjoy the beautiful surroundings of Laguna." }, - [69] = { name = "Razing!", grade = 3, points = 7, secret = true, description = "People with sharp canine teeth better beware of you, especially at nighttime, or they might find a stake between their ribs. You're a merciless vampire hunter and have gathered numerous tokens as proof." }, - [70] = { name = "Recognised Trader", grade = 1, points = 3, description = "You're a talented merchant who's able to handle wares with care, finds good offers and digs up rares every now and then. Never late to complete an order, you're a reliable trader - at least in Rashid's eyes." }, - [71] = { name = "Rockstar", grade = 1, points = 3, secret = true, description = "Music just comes to you naturally. You feel comfortable on any stage, at any time, and secretly hope that someday you will be able to defeat your foes by playing music only. Rock on!" }, - [72] = { name = "Ruthless", grade = 2, points = 5, description = "You've touched all thrones of The Ruthless Seven and absorbed some of their evil spirit. It may have changed you forever." }, - [73] = { name = "Scrapper", grade = 1, points = 3, description = "You put out the Spirit of Fire's flames in the arena of Svargrond. Arena fights are for you - fair, square, with simple rules and one-on-one battles." }, - [74] = { name = "Sea Scout", grade = 1, points = 2, description = "Not even the hostile underwater environment stops you from doing your duty for the Explorer Society. Scouting the Quara realm is a piece of cake for you." }, - [75] = { name = "Secret Agent", grade = 1, points = 1, description = "Pack your spy gear and get ready for some dangerous missions in service of a secret agency. You've shown you want to - but can you really do it? Time will tell." }, - [76] = { name = "Shell Seeker", grade = 1, points = 3, secret = true, description = "You found a hundred beautiful pearls in large sea shells. By now that necklace should be finished - and hopefully you didn't get your fingers squeezed too often during the process." }, - [77] = { name = "Ship's Kobold", grade = 2, points = 4, secret = true, description = "You've probably never gotten seasick in your life - you love spending your free time on the ocean and covered quite a lot of miles with ships. Aren't you glad you didn't have to swim all that?" }, - [78] = { name = "Steampunked", grade = 1, points = 2, secret = true, description = "Travelling with the dwarven steamboats through the underground rivers is your preferred way of crossing the lands. No pesky seagulls, and good beer on board!" }, - [79] = { name = "Superstitious", grade = 1, points = 2, secret = true, description = "Fortune tellers and horoscopes guide you through your life. And you probably wouldn't dare going on a big game hunt without your trusty voodoo skull giving you his approval for the day." }, - [80] = { name = "Talented Dancer", grade = 1, points = 1, description = "You're a lord or lady of the dance - and not afraid to use your skills to impress tribal gods. One step to the left, one jump to the right, twist and shout!" }, - [81] = { name = "Territorial", grade = 1, points = 1, secret = true, description = "Your map is your friend - always in your back pocket and covered with countless marks of interesting and useful locations. One could say that you might be lost without it - but luckily there's no way to take it from you." }, - [82] = { name = "The Milkman", grade = 1, points = 2, description = "Who's the milkman? You are!" }, - [83] = { name = "Top AVIN Agent", grade = 2, points = 4, description = "You've proven yourself as a worthy member of the 'family' and successfully carried out numerous spy missions for your 'uncle' to support the Venorean traders and their goals." }, - [84] = { name = "Top CGB Agent", grade = 2, points = 4, description = "Girl power! Whether you're female or not, you've proven absolute loyalty and the willingness to put your life at stake for the girls brigade of Carlin." }, - [85] = { name = "Top TBI Agent", grade = 2, points = 4, description = "Conspiracies and open secrets are your daily bread. You've shown loyalty to the Thaian crown through your courage when facing enemies and completing spy missions. You're an excellent field agent of the TBI." }, - [86] = { name = "Turncoat", grade = 2, points = 4, secret = true, description = "You served Yalahar - but you didn't seem so sure whom to believe on the way. Both Azerus and Palimuth had good reasons for their actions, and thus you followed your gut instinct in the end, even if you helped either of them. May Yalahar prosper!" }, - [87] = { name = "Vanity", grade = 1, points = 3, secret = true, description = "Aren't you just perfectly, wonderfully, beautifully gorgeous? You can't pass a mirror without admiring your looks. Or maybe doing a quick check whether something's stuck in your teeth, perhaps?" }, - [88] = { name = "Vive la Resistance", grade = 1, points = 2, description = "You've always been a rebel - admit it! Supplying prisoners, caring for outcasts, stealing from the rich and giving to the poor - no wait, that was another story." }, - [89] = { name = "Warlord of Svargrond", grade = 2, points = 5, description = "You sent the Obliverator into oblivion in the arena of Svargrond and defeated nine other dangerous enemies on the way. All hail the Warlord of Svargrond!" }, - [90] = { name = "Waverider", grade = 1, points = 2, secret = true, description = "One thing's for sure: You definitely love swimming. Hanging out on the beach with your friends, having ice cream and playing beach ball is splashingly good fun!" }, - [91] = { name = "Wayfarer", grade = 1, points = 3, secret = true, description = "Dragon dreams are golden." }, - [92] = { name = "Worm Whacker", grade = 1, points = 1, secret = true, description = "Weehee! Whack those worms! You sure know how to handle a big hammer." }, - - --8.61 - [93] = { name = "Cocoon of Doom", grade = 1, points = 3, secret = true, description = "You helped bringing Devovorga's dangerous tentacles and her humongous cocoon down - not stopping her transformation, but ultimately completing a crucial step to her death." }, - [94] = { name = "Daring Trespasser", grade = 1, points = 3, secret = true, description = "You've entered the lair of Devovorga and joined the crew trying to take her down - whether crowned with success or not doesn't matter, but they can't blame you for not trying!" }, - [95] = { name = "Devovorga's Nemesis", grade = 2, points = 5, secret = true, description = "One special hero among many. This year - it was you. Devovorga withdrew in a darker realm because she could not withstand your power - and that of your comrades. Time will tell if the choice you made was good - but for now, it saved your world." }, - [96] = { name = "I Did My Part", grade = 1, points = 2, secret = true, description = "Your world is lucky to have you! You don't hesitate to jump in and help when brave heroes are called to save the world." }, - [97] = { name = "Notorious Worldsaver", grade = 3, points = 8, secret = true, description = "You're in the front line when it comes to saving your world or taking part in social events. Whether you do it noticed or unnoticed by the people, your world can rely on you to dutifully do your part to make it a better place for everyone." }, + [61] = { name = "Ruthless", grade = 2, points = 5, description = "You've touched all thrones of the Ruthless Seven and absorbed some of their evil spirit. It may have changed you forever." }, + [62] = { name = "Champion of Chazorai", grade = 2, points = 4, description = "You won the merciless 2 vs. 2 team tournament on the Isle of Strife and wiped out wave after wave of fearsome opponents. Death or victory - you certainly chose the latter." }, + [63] = { name = "Wayfarer", grade = 1, points = 3, secret = true, description = "Dragon dreams are golden." }, + [64] = { name = "Waverider", grade = 1, points = 2, secret = true, description = "One thing's for sure: You definitely love swimming. Hanging out on the beach with your friends, having ice cream and playing beach ball is splashingly good fun!" }, + [65] = { name = "Rockstar", grade = 1, points = 3, secret = true, description = "Music just comes to you naturally. You feel comfortable on any stage, at any time, and secretly hope that someday you will be able to defeat your foes by playing music only. Rock on!" }, + [66] = { name = "Allowance Collector", grade = 1, points = 2, secret = true, description = "You certainly have your ways when it comes to acquiring money. Many of them are pink and paved with broken fragments of porcelain." }, + [67] = { name = "High-Flyer", grade = 2, points = 4, secret = true, description = "The breeze in your hair, your fingers clutching the rim of your carpet - that's how you like to travel. Faster! Higher! And a looping every now and then." }, + [68] = { name = "Clay Fighter", grade = 1, points = 3, secret = true, description = "You love getting your hands wet and dirty - and covered with clay. Your perfect sculpture of Brog, the raging Titan is your true masterpiece." }, + [69] = { name = "Masquerader", grade = 1, points = 3, secret = true, description = "You probably don't know anymore how you really look like - usually when you look into a mirror, some kind of monster stares back at you. On the other hand - maybe that's an improvement?" }, + [70] = { name = "Deep Sea Diver", grade = 2, points = 4, secret = true, description = "Under the sea - might not be your natural living space, but you're feeling quite comfortable on the ocean floor. Quara don't scare you anymore and sometimes you sleep with your helmet of the deep still equipped." }, + [71] = { name = "Firewalker", grade = 2, points = 4, secret = true, description = "Running barefoot across ember is not for you! You do it the elegant way. Yet, you're kind of drawn to fire and warm surroundings in general - you like it hot!" }, + [72] = { name = "Here, Fishy Fishy!", grade = 1, points = 1, secret = true, description = "Ah, the smell of the sea! Standing at the shore and casting a line is one of your favourite activities. For you, fishing is relaxing - and at the same time, providing easy food. Perfect!" }, + [73] = { name = "Green Thumb", grade = 2, points = 4, secret = true, description = "If someone gives you seeds, you usually grow a beautiful plant from it within a few days. You like your house green and decorated with flowers. Probably you also talk to them." }, + [74] = { name = "Potion Addict", grade = 2, points = 4, secret = true, description = "Your local magic trader considers you one of his best customers - you usually buy large stocks of potions so you won't wake up in the middle of the night craving for more. Yet, you always seem to run out of them too fast. Cheers!" }, + [75] = { name = "Ice Sculptor", grade = 1, points = 3, secret = true, description = "You love to hang out in cold surroundings and consider ice the best material to be shaped. What a waste to use ice cubes for drinks when you can create a beautiful mammoth statue from it!" }, + [76] = { name = "Interior Decorator", grade = 2, points = 4, secret = true, description = "Your home is your castle - and the furniture in it is just as important. Your friends ask for your advice when decorating their houses and your probably own every statue, rack and bed there is." }, + [77] = { name = "Jinx", grade = 1, points = 2, secret = true, description = "Sometimes you feel there's a gremlin in there. So many lottery tickets, so many blanks? That's just not fair! Share your misery with the world." }, + [78] = { name = "Lucky Devil", grade = 2, points = 4, secret = true, description = "That's almost too much luck for one person. If something's really, really rare - it probably falls into your lap sooner or later. Congratulations!" }, + [79] = { name = "Marblelous", grade = 1, points = 3, secret = true, description = "You're an aspiring marble sculptor with promising skills - proven by the perfect little Tibiasula statue you shaped. One day you'll be really famous!" }, + [80] = { name = "Party Animal", grade = 1, points = 1, secret = true, description = "Oh my god, it's a paaaaaaaaaaaarty! You're always in for fun, friends and booze and love being the center of attention. There's endless reasons to celebrate! Woohoo!" }, + [81] = { name = "Fireworks in the Sky", grade = 1, points = 2, secret = true, description = "You love the moment right before your rocket takes off and explodes into beautiful colours - not only on new year's eve!" }, + [82] = { name = "Quick as a Turtle", grade = 1, points = 2, secret = true, description = "There... is... simply... no... better... way - than to travel on the back of a turtle. At least you get to enjoy the beautiful surroundings of Laguna." }, + [83] = { name = "Polisher", grade = 2, points = 4, secret = true, description = "If you see a rusty item, you can't resist polishing it. There's always a little flask of rust remover in your inventory – who knows, there might be a golden armor beneath all that dirt!" }, + [84] = { name = "Ship's Kobold", grade = 2, points = 4, secret = true, description = "You’ve probably never gotten seasick in your life — you love spending your free time on the ocean and covered quite a lot of miles with ships. Aren’t you glad you didn’t have to swim all that?" }, + [85] = { name = "Steampunked", grade = 1, points = 2, secret = true, description = "Travelling with the dwarven steamboats through the underground rivers is your preferred way of crossing the lands. No pesky seagulls, and good beer on board!" }, + [86] = { name = "Vanity", grade = 1, points = 3, secret = true, description = "Aren't you just perfectly, wonderfully, beautifully gorgeous? You can't pass a mirror without admiring your looks. Or maybe doing a quick check whether something's stuck in your teeth, perhaps?" }, + [87] = { name = "Superstitious", grade = 1, points = 2, secret = true, description = "Fortune tellers and horoscopes guide you through your life. And you probably wouldn't dare going on a big game hunt without your trusty voodoo skull giving you his approval for the day." }, + [88] = { name = "Turncoat", grade = 2, points = 4, secret = true, description = "You served Yalahar - but you didn't seem so sure whom to believe on the way. Both Azerus and Palimuth had good reasons for their actions, and thus you followed your gut instinct in the end, even if you helped either of them. May Yalahar prosper!" }, + [89] = { name = "Marble Madness", grade = 2, points = 6, secret = true, description = "Your little statues of Tibiasula have become quite famous around Tibia and there's few people with similar skills when it comes to shaping marble." }, + [90] = { name = "Clay to Fame", grade = 2, points = 6, secret = true, description = "Sculpting Brog, the raging Titan, is your secret passion. Numerous perfect little clay statues with your name on them can be found everywhere around Tibia." }, + [91] = { name = "Cold as Ice", grade = 2, points = 6, secret = true, description = "Take an ice cube and an obsidian knife and you'll very likely shape something really pretty from it. Mostly cute little mammoths, which are a hit with all the girls." }, + [92] = { name = "Exquisite Taste", grade = 1, points = 2, secret = true, description = "You love fish - but preferably those caught in the cold north. Even though they're hard to come by you never get tired of picking holes in ice sheets and hanging your fishing rod in." }, + [93] = { name = "Jamjam", grade = 2, points = 5, secret = true, description = "When it comes to interracial understanding, you're an expert. You've mastered the language of the Chakoya and made someone really happy with your generosity. Achuq!" }, + [94] = { name = "I Did My Part", grade = 1, points = 2, secret = true, description = "Your world is lucky to have you! You don't hesitate to jump in and help when brave heroes are called to save the world." }, + [95] = { name = "Notorious Worldsaver", grade = 3, points = 8, secret = true, description = "You're in the front line when it comes to saving your world or taking part in social events. Whether you do it noticed or unnoticed by the people, your world can rely on you to dutifully do your part to make it a better place for everyone." }, + [96] = { name = "Teamplayer", grade = 1, points = 2, secret = true, description = "You don't consider yourself too good to do the dirty work while someone else might win the laurels for killing Devovorga. They couldn't do it without you!" }, + [97] = { name = "Daring Trespasser", grade = 1, points = 3, secret = true, description = "You've entered the lair of Devovorga and joined the crew trying to take her down - whether crowned with success or not doesn't matter, but they can't blame you for not trying!" }, [98] = { name = "Slayer of Anmothra", grade = 1, points = 2, secret = true, description = "Souls are like butterflies. The black soul of a living weapon yearning to strike lies shattered beneath your feet." }, [99] = { name = "Slayer of Chikhaton", grade = 1, points = 2, secret = true, description = "Power lies in the will of her who commands it. You fought it with full force - and were stronger." }, [100] = { name = "Slayer of Irahsae", grade = 1, points = 2, secret = true, description = "Few things equal the wild fury of a trapped and riven creature. You were a worthy opponent." }, [101] = { name = "Slayer of Phrodomo", grade = 1, points = 2, secret = true, description = "Blind hatred took physical form, violently rebelling against the injustice it was born into. You were not able to bring justice - but at least temporary peace." }, [102] = { name = "Slayer of Teneshpar", grade = 1, points = 2, secret = true, description = "The forbidden knowledge of aeons was never meant to invade this world. You silenced its voice before it could be made heard." }, - [103] = { name = "Teamplayer", grade = 1, points = 2, secret = true, description = "You don't consider yourself too good to do the dirty work while someone else might win the laurels for killing Devovorga. They couldn't do it without you!" }, - - --8.62 - [104] = { name = "Alumni", grade = 2, points = 6, description = "You're considered a first-rate graduate of the Magic Academy in Edron due to your pioneering discoveries and successful studies in the field of experimental magic and spell development. Ever considered teaching the Armageddon spell?" }, - [105] = { name = "Aristocrat", grade = 2, points = 4, description = "You begin your day by bathing in your pot of gold and you don't mind showing off your wealth while strolling the streets in your best clothes - after all it's your hard-earned money! You prefer to be addressed with 'Your Highness'." }, - [106] = { name = "Bad Timing", grade = 1, points = 2, secret = true, description = "Argh! Not now! How is it that those multifunctional tools never fail when you're using them for something completely trivial like squeezing juice, but mess up when you desperately need to climb up a rope spot with a fire-breathing dragon chasing you?" }, - [107] = { name = "Berserker", grade = 1, points = 3, description = "RAWR! Strength running through your body, your heart racing faster and adrenaline fueling your every weapon swing. All in a little bottle. No refund for destroyed furniture. For further questions consult your healer or potion dealer." }, - [108] = { name = "Bluebarian", grade = 1, points = 2, secret = true, description = "You live the life of hunters and gatherers. Well, especially that of a gatherer, and especially of one who gathers lots of blueberries. Have you checked the colour of your tongue lately?" }, - [109] = { name = "Brutal Politeness", grade = 2, points = 6, description = "What is best in life? To crush your enemies. To see them driven before you. And to maybe have a nice cup of tea afterwards." }, - [110] = { name = "Commitment Phobic", grade = 1, points = 2, secret = true, description = "Longterm relationships are just not for you. And each time you think you're in love, you're proven wrong shortly afterwards. Or maybe you just end up with the wrong lover each time - exploited and betrayed. Staying single might just be better." }, - [111] = { name = "Cookie Monster", grade = 1, points = 1, secret = true, description = "You can easily be found by anyone if they just follow the cookie crumb trail. And for you, true love means to give away your last cookie." }, - [112] = { name = "Cursed!", grade = 1, points = 3, secret = true, description = "The wrath of the Noxious Spawn - you accidentally managed to incur it. Your days are counted and your death inevitable. Sometime. Someplace." }, - [113] = { name = "Demonbane", grade = 2, points = 6, description = "You don't carry that stake just for decoration - you're prepared to use it. Usually you're seen hightailing through the deepest dungeons leaving a trail of slain demons. Whoever dares stand in your way should prepare to die." }, - [114] = { name = "Demonic Barkeeper", grade = 1, points = 3, description = "Thick, red - shaken, not stirred - and with a straw in it: that's the way you prefer your demon blood. Served with an onion ring, the subtle metallic aftertaste is almost not noticeable. Beneficial effects on health or mana are welcome." }, - [116] = { name = "Do Not Disturb", grade = 1, points = 1, secret = true, description = "Urgh! Close the windows! Shut out the sun rearing its ugly yellow head, shut out the earsplitting laughter of your neighbour's corpulent children. Ahhh. Embrace sweet darkness and silence." }, - [117] = { name = "Exemplary Citizen", grade = 2, points = 4, description = "Every city should be proud to call someone like you its inhabitant. You're keeping the streets clean and help settling the usual disputes in front of the depot. Also, you probably own a cat and like hiking." }, - [118] = { name = "Fool at Heart", grade = 1, points = 3, description = "And remember: Never try to teach a pig to sing. It wastes your time and annoys the pig." }, - [119] = { name = "Free Items!", grade = 1, points = 3, secret = true, description = "Yay! Finders keepers, losers weepers! Who cares where all that stuff came from and if you had to crawl through garbage piles to get it? It's FREE!" }, - [120] = { name = "Godslayer", grade = 2, points = 4, description = "You have defeated the Snake God's incarnations and, with a final powerful swing of the snake sceptre, cut off his life force supply. The story of power, deceit and corruption has come to an end - or... not?" }, - [121] = { name = "Gold Digger", grade = 2, points = 4, secret = true, description = "Hidden treasures below the sand dunes of the desert - you have a nose for finding them and you know where to dig. They might not make you filthy rich, but they're shiny and pretty anyhow." }, - [122] = { name = "Happy Farmer", grade = 1, points = 1, secret = true, description = "Scythe swung over your shoulder, sun burning down on your back - you are a farmer at heart and love working in the fields. Or then again maybe you just create fancy crop circles to scare your fellow men." }, - [123] = { name = "Heartbreaker", grade = 1, points = 1, secret = true, description = "Trust? Love? Faithfulness? Pah! Antiquated sentiments. As long as you have fun, you do not mind stepping on lots of hearts. Preferably while wearing combat boots." }, - [124] = { name = "Homebrewed", grade = 1, points = 1, secret = true, description = "Yo-ho-ho and a bottle of rum - homebrewed, of course, made from handpicked and personally harvested sugar cane plants. Now, let it age in an oak barrel and enjoy it in about 10 years. Or for the impatient ones: Let's have a paaaarty right now!" }, - [125] = { name = "Hunting with Style", grade = 2, points = 6, description = "At daytime you can be found camouflaged in the woods laying traps or chasing big game, at night you're sitting by the campfire and sharing your hunting stories. You eat what you hunted and wear what you skinned. Life could go on like that forever." }, - [126] = { name = "I Need a Hug", grade = 1, points = 2, description = "You and your stuffed furry friends are inseparable, and you're not ashamed to take them to bed with you - who knows when you will wake up in the middle of the night in dire need of a cuddle?" }, - [127] = { name = "In Shining Armor", grade = 2, points = 6, description = "With edged blade and fully equipped in a sturdy full plate armor, you charge at your enemies with both strength and valour. There's always a maiden to save and a dragon to slay for you." }, - [128] = { name = "Joke's on You", grade = 1, points = 1, secret = true, description = "Well - the contents of that present weren't quite what you expected. With friends like these, who needs enemies?" }, - [129] = { name = "Keeper of the Flame", grade = 1, points = 2, secret = true, description = "One of the Lightbearers. One of those who helped to keep the basins burning and worked together against the darkness. The demonic whispers behind the thin veil between the worlds - they were silenced again thanks to your help." }, - [130] = { name = "Let the Sunshine In", grade = 1, points = 1, secret = true, description = "Rise and shine! It's a beautiful new day - open your windows, feel the warm sunlight, watch the birds singing on your windowsill and care for your plants. What reason is there not to be happy?" }, - [131] = { name = "Life on the Streets", grade = 2, points = 4, description = "You're a beggar, homeless, wearing filthy and ragged clothes. But that doesn't mean you have to beg anyone for stuff - and you still kept your pride. Fine feathers do not necessarily make fine birds - what's under them is more important." }, - [132] = { name = "Make a Wish", grade = 1, points = 1, secret = true, description = "But close your eyes and don't tell anyone what you wished for, or it won't come true!" }, - [133] = { name = "Master of War", grade = 2, points = 6, description = "You're not afraid to show your colours in the heat of battle. Enemies fear your lethal lance and impenetrable armor. The list of the wars you've won is impressive. Hail and kill!" }, - [134] = { name = "Mastermind", grade = 1, points = 3, description = "You feel you could solve the hardest riddles within a minute or so. Plus, there's a nice boost on your spell damage. All in a little bottle. Aftereffects - feeling slightly stupid. For further questions consult your healer or potion dealer." }, - [135] = { name = "Mister Sandman", grade = 1, points = 2, secret = true, description = "Tired... so tired... curling up in a warm and cosy bed seems like the perfect thing to do right now. Sweet dreams!" }, - [136] = { name = "Modest Guest", grade = 1, points = 1, secret = true, description = "You don't need much to sleep comfortably. A pile of straw and a roof over your head - with the latter being completely optional - is quite enough to relax. You don't even mind the rats nibbling on your toes." }, - [137] = { name = "Mutated Presents", grade = 1, points = 1, secret = true, description = "Muahahaha it's a... mutated pumpkin! After helping to take it down - you DID help, didn't you? - you claimed your reward and got a more or less weird present. Happy Halloween!" }, - [138] = { name = "Natural Sweetener", grade = 1, points = 1, secret = true, description = "Liberty Bay is the perfect hangout for you and harvesting sugar cane quite a relaxing leisure activity. Would you like some tea with your sugar, hon?" }, - [139] = { name = "Nightmare Walker", grade = 2, points = 6, description = "You do not fear nightmares, you travel in them - facing countless horrors and fighting the fate they're about to bring. Few believe the dark prophecies you bring back from those dreams, but those who do fight alongside you as Nightmare Knights." }, - [140] = { name = "Nothing Can Stop Me", grade = 1, points = 1, secret = true, description = "You laugh at unprepared adventurers stuck in high grass or rush wood. Or maybe you actually do help them out. They call you... 'Machete'." }, - [141] = { name = "Number of the Beast", grade = 1, points = 2, description = "Six. Six. Six." }, - [142] = { name = "Of Wolves and Bears", grade = 2, points = 6, description = "One with nature, one with wildlife. Raw and animalistic power, sharpened senses, howling on the highest cliffs and roaring in the thickest forests - that's you." }, - [143] = { name = "One Thousand and One", grade = 2, points = 6, description = "You feel at home under the hot desert sun with sand between your toes, and your favourite means of travel is a flying carpet. Also, you can probably do that head isolation dance move." }, - [144] = { name = "Oops", grade = 1, points = 2, secret = true, description = "So much for your feathered little friend! Maybe standing in front of the birdcage, squeezing its neck and shouting 'Sing! Sing! Sing!' was a little too much for it?!" }, - [145] = { name = "Out in the Snowstorm", grade = 2, points = 4, description = "Snow heaps and hailstorms can't keep you from where you want to go. You're perfectly equipped for any expedition into the perpetual ice and know how to keep your feet warm. If you're a woman, that's quite an accomplishment, too." }, - [146] = { name = "Peazzekeeper", grade = 2, points = 6, description = "You're a humble warrior who doesn't need wealth or specialised equipment for travelling and fighting. You feel at home in the northern lands of Zao and did your part in fighting its corruption." }, - [147] = { name = "Piece of Cake", grade = 1, points = 1, description = "Life can be so easy with the right cake at the right time - and you mastered baking many different ones, so you should be prepared for almost everything life decides to throw at you." }, - [148] = { name = "Ritualist", grade = 2, points = 6, description = "You could be the author of the magnum opus 'How to Summon the Ultimate Beast from the Infernal Depths, Volume I'. Or, if your mind and heart are pure, you rather summon beings to help others. Or maybe just a little cat to have someone to cuddle." }, - [149] = { name = "Rock Me to Sleep", grade = 1, points = 1, secret = true, description = "Sleeping - you do it with style. You're chilling in your hammock, listening to the sound of the birds and crickets as you slowly drift away into the realm of dreams." }, - [150] = { name = "Rocket in Pocket", grade = 1, points = 1, secret = true, description = "Either you are not a fast learner or you find some pleasure in setting yourself on fire. Or you're just looking for a fancy title. In any case, you should know that passing gas during your little donkey experiments is not recommended." }, - [151] = { name = "Rollercoaster", grade = 1, points = 1, description = "Up and down and up and down... and then the big looping! Wait - they don't build loopings in Kazordoon. But ore wagon rides are still fun!" }, - [152] = { name = "Santa's Li'l Helper", grade = 1, points = 2, secret = true, description = "Christmas is your favourite time of the year, and boy, do you love presents. Buy some nice things for your friends, hide them away until - well, until you decide to actually unwrap them rather yourself." }, - [153] = { name = "Sharpshooter", grade = 1, points = 3, description = "Improved eyesight, arrows and bolts flying at the speed of light and pinning your enemies with extra damage. All in a little bottle. No consumption of carrots required. For further questions consult your healer or potion dealer." }, - [154] = { name = "Skull and Bones", grade = 2, points = 6, description = "Wearing the insignia and dark robes of the Brotherhood of Bones you roam the lands spreading fear and pain, creating new soldiers for the necromantic army which is about to rise soon. Hail the Brotherhood." }, - [155] = { name = "Slim Chance", grade = 1, points = 1, description = "Okay, let's face it - as long as you believe it could potentially lead you to the biggest treasure ever, you won't let go of that map, however fishy it might look. There must be a secret behind all of this!" }, - [156] = { name = "Swashbuckler", grade = 2, points = 6, description = "Ye be a gentleman o' fortune, fightin' and carousin' on the high seas, out fer booty and lassies! Ye no be answerin' to no man or blasted monarchy and yer life ain't fer the lily-livered. Aye, matey!" }, - [157] = { name = "Sweet Tooth", grade = 1, points = 2, secret = true, description = "The famous 'Ode to a Molten Chocolate Cake' was probably written by you. Spending a rainy afternoon in front of the chimney, wrapped in a blanket while indulging in cocoa delights sounds just like something you'd do. Enjoy!" }, - [158] = { name = "Swift Death", grade = 2, points = 6, description = "Stealth kills and backstabbing are you specialty. Your numerous victims are usually unaware of their imminent death, which you bring to them silently and swiftly. Everything is permitted." }, - [159] = { name = "The Cake's the Truth", grade = 1, points = 1, secret = true, description = "And anyone claiming otherwise is a liar." }, - [160] = { name = "The Day After", grade = 1, points = 2, secret = true, description = "Uhm... who's that person who you just woke up beside? Broken cocktail glasses on the floor, flowers all over the room, and why the heck are you wearing a ring? Yesterday must have been a long, weird day..." }, - [161] = { name = "The Undertaker", grade = 1, points = 2, secret = true, description = "You and your shovel - a match made in heaven. Or hell, for that matter. Somewhere down below in any case. You're magically attracted by stone piles and love to open them up and see where those holes lead you. Good biceps as well." }, - [162] = { name = "True Lightbearer", grade = 2, points = 5, secret = true, description = "You're one of the most dedicated Lightbearers - without you, the demons would have torn the veil between the worlds for sure. You've lit each and every basin, travelling high and low, pushing back the otherworldly forces. Let there be light!" }, - [163] = { name = "Warlock", grade = 2, points = 6, description = "You're proficient in the darker ways of magic and are usually found sitting inside a circle of candles and skulls muttering unspeakable words. Don't carry things too far or the demons might come get you." }, - [164] = { name = "Way of the Shaman", grade = 2, points = 6, description = "Shaking your rattle and dancing around the fire to jungle drums sounds like something you like doing. Besides, dreadlocks are a convenient way to wear your hair - no combing required!" }, - [165] = { name = "Wild Warrior", grade = 2, points = 6, description = "Valour is for weaklings - it doesn't matter how you win the battle, as long as you're victorious. Thick armor would just hinder your movements, thus you keep it light and rely on speed and skill instead of hiding in an uncomfortable shell." }, - [166] = { name = "With a Cherry on Top", grade = 1, points = 1, secret = true, description = "You like your cake soft, with fruity bits and a nice sugar icing. And you prefer to make them by yourself. Have you ever considered opening a bakery? You must be really good by now!" }, + [103] = { name = "Cocoon of Doom", grade = 1, points = 3, secret = true, description = "You helped bringing Devovorga's dangerous tentacles and her humongous cocoon down - not stopping her transformation, but ultimately completing a crucial step to her death." }, + [104] = { name = "Devovorga's Nemesis", grade = 2, points = 5, secret = true, description = "One special hero among many. This year - it was you. Devovorga withdrew in a darker realm because she could not withstand your power - and that of your comrades. Time will tell if the choice you made was good - but for now, it saved your world." }, + [105] = { name = "Mister Sandman", grade = 1, points = 2, secret = true, description = "Tired... so tired... curling up in a warm and cosy bed seems like the perfect thing to do right now. Sweet dreams!" }, + [106] = { name = "Rock Me to Sleep", grade = 1, points = 1, secret = true, description = "Sleeping - you do it with style. You're chilling in your hammock, listening to the sound of the birds and crickets as you slowly drift away into the realm of dreams." }, + [107] = { name = "Modest Guest", grade = 1, points = 1, secret = true, description = "You don't need much to sleep comfortably. A pile of straw and a roof over your head - with the latter being completely optional - is quite enough to relax. You don't even mind the rats nibbling on your toes." }, + [108] = { name = "Joke's on You", grade = 1, points = 1, secret = true, description = "Well - the contents of that present weren't quite what you expected. With friends like these, who needs enemies?" }, + [109] = { name = "Oops", grade = 1, points = 2, secret = true, description = "So much for your feathered little friend! Maybe standing in front of the birdcage, squeezing its neck and shouting 'Sing! Sing! Sing!' was a little too much for it?!" }, + [110] = { name = "Bluebarian", grade = 1, points = 2, secret = true, description = "You live the life of hunters and gatherers. Well, especially that of a gatherer, and especially of one who gathers lots of blueberries. Have you checked the colour of your tongue lately?" }, + [111] = { name = "Demonic Barkeeper", grade = 1, points = 3, description = "Thick, red - shaken, not stirred - and with a straw in it: that's the way you prefer your demon blood. Served with an onion ring, the subtle metallic aftertaste is almost not noticeable. Beneficial effects on health or mana are welcome." }, + [112] = { name = "The Snowman", grade = 1, points = 1, secret = true, description = "You love the winter. Fully equipped with scarf and gloves, you like to have fun outside while building lots of snowmen with your friends. Snowball fight, anyone?" }, + [113] = { name = "Number of the Beast", grade = 1, points = 2, description = "Six. Six. Six." }, + [114] = { name = "I Need a Hug", grade = 1, points = 2, description = "You and your stuffed furry friends are inseparable, and you're not ashamed to take them to bed with you - who knows when you will wake up in the middle of the night in dire need of a cuddle?" }, + [115] = { name = "Slim Chance", grade = 1, points = 1, description = "Okay, let's face it - as long as you believe it could potentially lead you to the biggest treasure ever, you won't let go of that map, however fishy it might look. There must be a secret behind all of this!" }, + [116] = { name = "Rocket in Pocket", grade = 1, points = 1, secret = true, description = "Either you are not a fast learner or you find some pleasure in setting yourself on fire. Or you're just looking for a fancy title. In any case, you should know that passing gas during your little donkey experiments is not recommended." }, + [117] = { name = "Make a Wish", grade = 1, points = 1, secret = true, description = "But close your eyes and don't tell anyone what you wished for, or it won't come true!" }, + [118] = { name = "Santa's Li'l Helper", grade = 1, points = 2, secret = true, description = "Christmas is your favourite time of the year, and boy, do you love presents. Buy some nice things for your friends, hide them away until - well, until you decide to actually unwrap them rather yourself." }, + [119] = { name = "Cursed!", grade = 1, points = 3, secret = true, description = "The wrath of the Noxious Spawn - you accidentally managed to incur it. Your days are counted and your death inevitable. Sometime. Someplace." }, + [120] = { name = "Free Items!", grade = 1, points = 3, secret = true, description = "Yay! Finders keepers, losers weepers! Who cares where all that stuff came from and if you had to crawl through garbage piles to get it? It's FREE!" }, + [121] = { name = "Rollercoaster", grade = 1, points = 1, description = "Up and down and up and down... and then the big looping! Wait - they don't build loopings in Kazordoon. But ore wagon rides are still fun!" }, + [122] = { name = "Transmutator", grade = 2, points = 5, secret = true, description = "You, Sir or Lady, are a true alchemist. Conducting transmutating experiments to find every possible combination has been your secret passion since years and the results of your research are incredible. Science has just taken a leap thanks to you!" }, + [123] = { name = "Berserker", grade = 1, points = 3, description = "RAWR! Strength running through your body, your heart racing faster and adrenaline fueling your every weapon swing. All in a little bottle. No refund for destroyed furniture. For further questions consult your healer or potion dealer." }, + [124] = { name = "Mastermind", grade = 1, points = 3, description = "You feel you could solve the hardest riddles within a minute or so. Plus, there's a nice boost on your spell damage. All in a little bottle. Aftereffects - feeling slightly stupid. For further questions consult your healer or potion dealer." }, + [125] = { name = "Sharpshooter", grade = 1, points = 3, description = "Improved eyesight, arrows and bolts flying at the speed of light and pinning your enemies with extra damage. All in a little bottle. No consumption of carrots required. For further questions consult your healer or potion dealer." }, + [126] = { name = "Do Not Disturb", grade = 1, points = 1, secret = true, description = "Urgh! Close the windows! Shut out the sun rearing its ugly yellow head, shut out the earsplitting laughter of your neighbour's corpulent children. Ahhh. Embrace sweet darkness and silence." }, + [127] = { name = "Let the Sunshine In", grade = 1, points = 1, secret = true, description = "Rise and shine! It's a beautiful new day - open your windows, feel the warm sunlight, watch the birds singing on your windowsill and care for your plants. What reason is there not to be happy?" }, + [128] = { name = "Bad Timing", grade = 1, points = 2, secret = true, description = "Argh! Not now! How is it that those multifunctional tools never fail when you're using them for something completely trivial like squeezing juice, but mess up when you desperately need to climb up a rope spot with a fire-breathing dragon chasing you?" }, + [129] = { name = "Nothing Can Stop Me", grade = 1, points = 1, secret = true, description = "You laugh at unprepared adventurers stuck in high grass or rush wood. Or maybe you actually do help them out. They call you... 'Machete'." }, + [130] = { name = "Happy Farmer", grade = 1, points = 1, secret = true, description = "Scythe swung over your shoulder, sun burning down on your back - you are a farmer at heart and love working in the fields. Or then again maybe you just create fancy crop circles to scare your fellow men." }, + [131] = { name = "Natural Sweetener", grade = 1, points = 1, secret = true, description = "Liberty Bay is the perfect hangout for you and harvesting sugar cane quite a relaxing leisure activity. Would you like some tea with your sugar, hon?" }, + [132] = { name = "Homebrewed", grade = 1, points = 1, secret = true, description = "Yo-ho-ho and a bottle of rum - homebrewed, of course, made from handpicked and personally harvested sugar cane plants. Now, let it age in an oak barrel and enjoy it in about 10 years. Or for the impatient ones: Let's have a paaaarty right now!" }, + [133] = { name = "Gold Digger", grade = 2, points = 4, secret = true, description = "Hidden treasures below the sand dunes of the desert - you have a nose for finding them and you know where to dig. They might not make you filthy rich, but they're shiny and pretty anyhow." }, + [134] = { name = "The Undertaker", grade = 1, points = 2, secret = true, description = "You and your shovel - a match made in heaven. Or hell, for that matter. Somewhere down below in any case. You're magically attracted by stone piles and love to open them up and see where those holes lead you. Good biceps as well." }, + [135] = { name = "Cookie Monster", grade = 1, points = 1, secret = true, description = "You can easily be found by anyone if they just follow the cookie crumb trail. And for you, true love means to give away your last cookie." }, + [136] = { name = "The Cake's the Truth", grade = 1, points = 1, secret = true, description = "And anyone claiming otherwise is a liar." }, + [137] = { name = "Sweet Tooth", grade = 1, points = 2, secret = true, description = "The famous 'Ode to a Molten Chocolate Cake' was probably written by you. Spending a rainy afternoon in front of the chimney, wrapped in a blanket while indulging in cocoa delights sounds just like something you'd do. Enjoy!" }, + [138] = { name = "With a Cherry on Top", grade = 1, points = 1, secret = true, description = "You like your cake soft, with fruity bits and a nice sugar icing. And you prefer to make them by yourself. Have you ever considered opening a bakery? You must be really good by now!" }, + [139] = { name = "Mutated Presents", grade = 1, points = 1, secret = true, description = "Muahahaha it's a... mutated pumpkin! After helping to take it down - you DID help, didn't you? - you claimed your reward and got a more or less weird present. Happy Halloween!" }, + [140] = { name = "Keeper of the Flame", grade = 1, points = 2, secret = true, description = "One of the Lightbearers. One of those who helped to keep the basins burning and worked together against the darkness. The demonic whispers behind the thin veil between the worlds - they were silenced again thanks to your help." }, + [141] = { name = "True Lightbearer", grade = 2, points = 5, secret = true, description = "You're one of the most dedicated Lightbearers - without you, the demons would have torn the veil between the worlds for sure. You've lit each and every basin, travelling high and low, pushing back the otherworldly forces. Let there be light!" }, + [142] = { name = "Godslayer", grade = 2, points = 4, description = "You have defeated the Snake God's incarnations and, with a final powerful swing of the snake sceptre, cut off his life force supply. The story of power, deceit and corruption has come to an end - or... not?" }, + [143] = { name = "The Day After", grade = 1, points = 2, secret = true, description = "Uhm... who's that person who you just woke up beside? Broken cocktail glasses on the floor, flowers all over the room, and why the heck are you wearing a ring? Yesterday must have been a long, weird day..." }, + [144] = { name = "Commitment Phobic", grade = 1, points = 2, secret = true, description = "Longterm relationships are just not for you. And each time you think you're in love, you're proven wrong shortly afterwards. Or maybe you just end up with the wrong lover each time - exploited and betrayed. Staying single might just be better." }, + [145] = { name = "Heartbreaker", grade = 1, points = 1, secret = true, description = "Trust? Love? Faithfulness? Pah! Antiquated sentiments. As long as you have fun, you do not mind stepping on lots of hearts. Preferably while wearing combat boots." }, + [146] = { name = "Swift Death", grade = 2, points = 6, description = "Stealth kills and backstabbing are you specialty. Your numerous victims are usually unaware of their imminent death, which you bring to them silently and swiftly. Everything is permitted." }, + [147] = { name = "Brutal Politeness", grade = 2, points = 6, description = "What is best in life? To crush your enemies. To see them driven before you. And to maybe have a nice cup of tea afterwards." }, + [148] = { name = "Life on the Streets", grade = 2, points = 4, description = "You're a beggar, homeless, wearing filthy and ragged clothes. But that doesn't mean you have to beg anyone for stuff - and you still kept your pride. Fine feathers do not necessarily make fine birds - what's under them is more important." }, + [149] = { name = "Skull and Bones", grade = 2, points = 6, description = "Wearing the insignia and dark robes of the Brotherhood of Bones you roam the lands spreading fear and pain, creating new soldiers for the necromantic army which is about to rise soon. Hail the Brotherhood." }, + [150] = { name = "Nightmare Walker", grade = 2, points = 6, description = "You do not fear nightmares, you travel in them - facing countless horrors and fighting the fate they're about to bring. Few believe the dark prophecies you bring back from those dreams, but those who do fight alongside you as Nightmare Knights." }, + [151] = { name = "Exemplary Citizen", grade = 2, points = 4, description = "Every city should be proud to call someone like you its inhabitant. You're keeping the streets clean and help settling the usual disputes in front of the depot. Also, you probably own a cat and like hiking." }, + [152] = { name = "Demonbane", grade = 2, points = 6, description = "You don't carry that stake just for decoration - you're prepared to use it. Usually you're seen hightailing through the deepest dungeons leaving a trail of slain demons. Whoever dares stand in your way should prepare to die." }, + [153] = { name = "Of Wolves and Bears", grade = 2, points = 6, description = "One with nature, one with wildlife. Raw and animalistic power, sharpened senses, howling on the highest cliffs and roaring in the thickest forests - that's you." }, + [154] = { name = "Hunting with Style", grade = 2, points = 6, description = "At daytime you can be found camouflaged in the woods laying traps or chasing big game, at night you're sitting by the campfire and sharing your hunting stories. You eat what you hunted and wear what you skinned. Life could go on like that forever." }, + [155] = { name = "Fool at Heart", grade = 1, points = 3, description = "And remember: Never try to teach a pig to sing. It wastes your time and annoys the pig." }, + [156] = { name = "In Shining Armor", grade = 2, points = 6, description = "With edged blade and fully equipped in a sturdy full plate armor, you charge at your enemies with both strength and valour. There's always a maiden to save and a dragon to slay for you." }, + [157] = { name = "Aristocrat", grade = 2, points = 4, description = "You begin your day by bathing in your pot of gold and you don't mind showing off your wealth while strolling the streets in your best clothes - after all it's your hard-earned money! You prefer to be addressed with 'Your Highness'." }, + [158] = { name = "Out in the Snowstorm", grade = 2, points = 4, description = "Snow heaps and hailstorms can't keep you from where you want to go. You're perfectly equipped for any expedition into the perpetual ice and know how to keep your feet warm. If you're a woman, that's quite an accomplishment, too." }, + [159] = { name = "One Thousand and One", grade = 2, points = 6, description = "You feel at home under the hot desert sun with sand between your toes, and your favourite means of travel is a flying carpet. Also, you can probably do that head isolation dance move." }, + [160] = { name = "Swashbuckler", grade = 2, points = 6, description = "Ye be a gentleman o' fortune, fightin' and carousin' on the high seas, out fer booty and lassies! Ye no be answerin' to no man or blasted monarchy and yer life ain't fer the lily-livered. Aye, matey!" }, + [161] = { name = "Way of the Shaman", grade = 2, points = 6, description = "Shaking your rattle and dancing around the fire to jungle drums sounds like something you like doing. Besides, dreadlocks are a convenient way to wear your hair - no combing required!" }, + [162] = { name = "Ritualist", grade = 2, points = 6, description = "You could be the author of the magnum opus 'How to Summon the Ultimate Beast from the Infernal Depths, Volume I'. Or, if your mind and heart are pure, you rather summon beings to help others. Or maybe just a little cat to have someone to cuddle." }, + [163] = { name = "Master of War", grade = 2, points = 6, description = "You're not afraid to show your colours in the heat of battle. Enemies fear your lethal lance and impenetrable armor. The list of the wars you've won is impressive. Hail and kill!" }, + [164] = { name = "Wild Warrior", grade = 2, points = 6, description = "Valour is for weaklings - it doesn't matter how you win the battle, as long as you're victorious. Thick armor would just hinder your movements, thus you keep it light and rely on speed and skill instead of hiding in an uncomfortable shell." }, + [165] = { name = "Peazzekeeper", grade = 2, points = 6, description = "You're a humble warrior who doesn't need wealth or specialised equipment for travelling and fighting. You feel at home in the northern lands of Zao and did your part in fighting its corruption." }, + [166] = { name = "Yalahari of Wisdom", grade = 1, points = 3, description = "Your deeds for Yalahar are usually characterised by deep insight and thoughtful actions. Thanks to you, Yalahar might have a chance to grow peacefully and with happy people living in it." }, [167] = { name = "Yalahari of Power", grade = 1, points = 3, description = "You defend Yalahar with brute force and are ready to lead it into a glorious battle, if necessary. Thanks to you, Yalahar will be powerful enough to stand up against any enemy." }, - [168] = { name = "Yalahari of Wisdom", grade = 1, points = 3, description = "Your deeds for Yalahar are usually characterised by deep insight and thoughtful actions. Thanks to you, Yalahar might have a chance to grow peacefully and with happy people living in it." }, - - --8.7 - [169] = { name = "Afraid of no Ghost!", grade = 1, points = 2, description = "You passed their test and helped the Spirithunters testing equipment, researching the supernatural and catching ghosts - it's you they're gonna call." }, - [170] = { name = "Ashes to Dust", grade = 2, points = 4, secret = true, description = "Staking vampires and demons has almost turned into your profession. You make sure to gather even the tiniest amount of evil dust particles. Beware of silicosis." }, - [171] = { name = "Baby Sitter", grade = 1, points = 1, secret = true, description = "You have cheered up a demon baby and returned it to its mother. A quick count of your fingers will reveal if you made it through unharmed." }, - [172] = { name = "Banebringers' Bane", grade = 1, points = 2, secret = true, description = "You sacrificed a lot of ingredients to create the protective brew of the witches and played a significant part in the efforts to repel the dreaded banebringers. The drawback is that even the banebringers may take notice of you ..." }, - [173] = { name = "Berry Picker", grade = 2, points = 4, secret = true, description = "The Combined Magical Winterberry Society hereby honours continued selfless dedication and extraordinary efforts in the Annual Autumn Vintage." }, - [174] = { name = "Bunny Slipped", grade = 1, points = 2, description = "Indeed, you have a soft spot for rabbits. Maybe the rabbits you saved today will be the rabbits that will save you tomorrow. When you are really hungry." }, - [175] = { name = "Cake Conqueror", grade = 1, points = 1, description = "You have bravely stepped onto the cake isle. Is there any more beautiful, tasty place to be in the whole world?" }, - [176] = { name = "Dark Voodoo Priest", grade = 1, points = 2, secret = true, description = "Sinister curses, evil magic - you don't shy away from punishing others by questionable means. Someone just gave you a strange look - now where's that needle again?" }, - [177] = { name = "Extreme Degustation", grade = 1, points = 2, secret = true, description = "Almost all the plants you tested for Chartan in Zao where inedible - you tasted them all, yet you're still standing! You should really get some fresh air now, though." }, - [178] = { name = "Fire Devil", grade = 1, points = 3, secret = true, description = "To keep the witches' fire burning, you trashed a lot of the wood the bane bringers animated. Some might find your fascination for fire ... disturbing." }, - [179] = { name = "Fire Lighter", grade = 1, points = 1, secret = true, description = "You have helped to keep the witches fire burning. Just watch your fingers, it's hot!" }, - [180] = { name = "Ghost Sailor", grade = 1, points = 1, secret = true, description = "You have sailed the nether seas with the Ghost Captain. Despite the perils, you and your fellow crewmen have braved the challenge." }, - [181] = { name = "Guinea Pig", grade = 1, points = 2, description = "True scientists know their equipment. Testing new inventions is essential daily work for any hard working researcher. You showed no fear and took all the new equipment from Spectulus and Sinclair for a spin." }, - [182] = { name = "Hidden Powers", grade = 1, points = 2, description = "You've discovered the Ancients' hidden powers - from now on, they will aid you in your adventures." }, - [183] = { name = "Honorary Witch", grade = 2, points = 4, secret = true, description = "Your efforts in fighting back the banebringers has not gone unnoticed. You are a legend amongst the witches and your name is whispered with awe and admiration." }, - [184] = { name = "I Like it Fancy", grade = 1, points = 1, secret = true, description = "You definitely know how to bring out the best in your furniture and decoration pieces. Beautiful." }, - [185] = { name = "Master Shapeshifter", grade = 1, points = 2, secret = true, description = "You have mastered Kuriks challenge in all possible shapes." }, - [186] = { name = "Merry Adventures", grade = 1, points = 2, description = "You went into the forest, met Rottin Wood and the Married Men and helped them out in their camp. Oh, and don't worry about those merchants. They won't dare mentioning the strangely large sums of gold they actually possessed which are missing now." }, - [187] = { name = "Nanny from Hell", grade = 1, points = 3, secret = true, description = "You have cheered up a bunch of demon babies and returned them to their mother. Don't bother the burn marks, don't bother the strains of grey hair, don't bother the nights you wake up screaming. It was worth it ... probably ... somehow." }, - [188] = { name = "Natural Born Cowboy", grade = 1, points = 1, secret = true, description = "Oh, the joy of riding! You've just got your very first own mount. Conveniently enough you don't even need stables, but can summon it any time you like." }, - [189] = { name = "Nether Pirate", grade = 1, points = 3, secret = true, description = "Not fearing death or ghosts you have traveled with the ghost captain several times and are a seasoned traveler of the netherworld. The dead and the living whisper about your exploits with appreciation." }, - [190] = { name = "Nomad Soul", grade = 1, points = 2, secret = true, description = "Home is where your current favourite hunting ground is, and though you might hold certain places more dear than others you never feel attached enough to really stay in one city for long. Pack all your stuff - it's time to move on again." }, - [191] = { name = "Petrologist", grade = 1, points = 2, secret = true, description = "Stones have always fascinated you. So has the chance of finding something really precious inside one of them. Statistically you should've discovered a few nice treasures by now. But then again, most statistics are overriden by Mother Disfortune." }, - [192] = { name = "Pyromaniac", grade = 2, points = 4, secret = true, description = "Love ... fire! So ... shiny! Must ... buuuurrrn!" }, - [193] = { name = "Safely Stored Away", grade = 1, points = 2, secret = true, description = "Don't worry, no one will be able to take it from you. Probably." }, - [194] = { name = "Scourge of Death", grade = 2, points = 5, secret = true, description = "You are a master of the nether sea and have traveled with the ghost captain so many times that you know his ship and the perils of the nether sea inside out. You laugh in the face of death and may return as a ghost pirate yourself in the afterlife!" }, + [168] = { name = "Piece of Cake", grade = 1, points = 1, description = "Life can be so easy with the right cake at the right time - and you mastered baking many different ones, so you should be prepared for almost everything life decides to throw at you." }, + [169] = { name = "Alumni", grade = 2, points = 6, description = "You're considered a first-rate graduate of the Magic Academy in Edron due to your pioneering discoveries and successful studies in the field of experimental magic and spell development. Ever considered teaching the Armageddon spell?" }, + [170] = { name = "Warlock", grade = 2, points = 6, description = "You're proficient in the darker ways of magic and are usually found sitting inside a circle of candles and skulls muttering unspeakable words. Don't carry things too far or the demons might come get you." }, + [171] = { name = "Bunny Slipped", grade = 1, points = 2, secret = true, description = "Indeed, you have a soft spot for rabbits. Maybe the rabbits you saved today will be the rabbits that will save you tomorrow. When you are really hungry." }, + [172] = { name = "Guinea Pig", grade = 1, points = 2, description = "True scientists know their equipment. Testing new inventions is essential daily work for any hard working researcher. You showed no fear and took all the new equipment from Spectulus and Sinclair for a spin." }, + [173] = { name = "Merry Adventures", grade = 1, points = 2, description = "You went into the forest, met Rottin Wood and the Married Men and helped them out in their camp. Oh, and don't worry about those merchants. They won't dare mentioning the strangely large sums of gold they actually possessed which are missing now." }, + [174] = { name = "Afraid of no Ghost!", grade = 1, points = 2, description = "You passed their test and helped the Spirithunters testing equipment, researching the supernatural and catching ghosts - it's you they're gonna call." }, + [175] = { name = "Extreme Degustation", grade = 1, points = 2, secret = true, description = "Almost all the plants you tested for Chartan in Zao where inedible - you tasted them all, yet you're still standing! You should really get some fresh air now, though." }, + [176] = { name = "Cake Conqueror", grade = 1, points = 1, secret = true, description = "You have bravely stepped onto the cake isle. Is there any more beautiful, tasty place to be in the whole world?" }, + [177] = { name = "Baby Sitter", grade = 1, points = 1, secret = true, description = "You have cheered up a demon baby and returned it to its mother. A quick count of your fingers will reveal if you made it through unharmed." }, + [178] = { name = "Nanny from Hell", grade = 1, points = 3, secret = true, description = "You have cheered up a bunch of demon babies and returned them to their mother. Don't bother the burn marks, don't bother the strains of grey hair, don't bother the nights you wake up screaming. It was worth it ... probably ... somehow." }, + [179] = { name = "Ghost Sailor", grade = 1, points = 1, secret = true, description = "You have sailed the nether seas with the Ghost Captain. Despite the perils, you and your fellow crewmen have braved the challenge." }, + [180] = { name = "Spectral Traveller", grade = 1, points = 2, secret = true, description = "You have sailed the nether seas with the Ghost Captain several times. The dangers of the nether have become familiar to you and unexperienced travelers turn to you for advice." }, + [181] = { name = "Nether Pirate", grade = 1, points = 3, secret = true, description = "Not fearing death or ghosts you have traveled with the ghost captain several times and are a seasoned traveler of the netherworld. The dead and the living whisper about your exploits with appreciation." }, + [182] = { name = "Scourge of Death", grade = 2, points = 5, secret = true, description = "You are a master of the nether sea and have traveled with the ghost captain so many times that you know his ship and the perils of the nether sea inside out. You laugh in the face of death and may return as a ghost pirate yourself in the afterlife!" }, + [183] = { name = "Fire Lighter", grade = 1, points = 1, secret = true, description = "You have helped to keep the witches fire burning. Just watch your fingers, it's hot!" }, + [184] = { name = "Witches Lil' Helper", grade = 1, points = 1, secret = true, description = "You sacrificed ingredients to create the protective brew of the witches." }, + [185] = { name = "Banebringers' Bane", grade = 1, points = 2, secret = true, description = "You sacrificed a lot of ingredients to create the protective brew of the witches and played a significant part in the efforts to repel the dreaded banebringers. The drawback is that even the banebringers may take notice of you ..." }, + [186] = { name = "Fire Devil", grade = 1, points = 3, secret = true, description = "To keep the witches' fire burning, you trashed a lot of the wood the bane bringers animated. Some might find your fascination for fire ... disturbing." }, + [187] = { name = "Pyromaniac", grade = 2, points = 4, secret = true, description = "Love ... fire! So ... shiny! Must ... buuuurrrn!" }, + [188] = { name = "Honorary Witch", grade = 2, points = 4, secret = true, description = "Your efforts in fighting back the banebringers has not gone unnoticed. You are a legend amongst the witches and your name is whispered with awe and admiration." }, + [189] = { name = "Natural Born Cowboy", grade = 1, points = 1, secret = true, description = "Oh, the joy of riding! You've just got your very first own mount. Conveniently enough you don't even need stables, but can summon it any time you like." }, + [190] = { name = "Petrologist", grade = 1, points = 2, secret = true, description = "Stones have always fascinated you. So has the chance of finding something really precious inside one of them. Statistically you should've discovered a few nice treasures by now. But then again, most statistics are overriden by Mother Disfortune." }, + [191] = { name = "Hidden Powers", grade = 1, points = 2, description = "You've discovered the Ancients' hidden powers - from now on, they will aid you in your adventures." }, + [192] = { name = "I Like it Fancy", grade = 1, points = 1, secret = true, description = "You definitely know how to bring out the best in your furniture and decoration pieces. Beautiful." }, + [193] = { name = "Skin-Deep", grade = 2, points = 4, secret = true, description = "You always carry your obsidian knife with you and won't hesitate to use it. You've skinned countless little - and bigger - critters and yeah: they usually don't get any more beautiful on the inside. It's rather blood and gore and all that..." }, + [194] = { name = "Ashes to Dust", grade = 2, points = 4, secret = true, description = "Staking vampires and demons has almost turned into your profession. You make sure to gather even the tiniest amount of evil dust particles. Beware of silicosis." }, [195] = { name = "Silent Pet", grade = 1, points = 1, secret = true, description = "Awww. Your very own little goldfish friend - he's cute, he's shiny and he can't complain should you forget to feed him. He'll definitely brighten up your day!" }, - [196] = { name = "Skin-Deep", grade = 2, points = 4, secret = true, description = "You always carry your obsidian knife with you and won't hesitate to use it. You've skinned countless little - and bigger - critters and yeah: they usually don't get any more beautiful on the inside. It's rather blood and gore and all that..." }, - [197] = { name = "Snowbunny", grade = 1, points = 2, secret = true, description = "Hopping, hopping through the snow - that's the funnest way to go! Making footprints in a flurry - it's more fun the more you hurry! Licking icicles all day - Winter, never go away!" }, - [198] = { name = "Something's in There", grade = 1, points = 1, secret = true, description = "By the gods! What was that?" }, - [199] = { name = "Spectral Traveler", grade = 1, points = 2, secret = true, description = "You have sailed the nether seas with the Ghost Captain several times. The dangers of the nether have become familiar to you and unexperienced travelers turn to you for advice." }, - [200] = { name = "True Colours", grade = 1, points = 3, secret = true, description = "You and your friends showed the three wizards your loyalty three times - I am sure at least one of them is probably eternally thankful and exceedingly proud of you." }, - [201] = { name = "Truth Be Told", grade = 1, points = 2, secret = true, description = "You told Jack the truth by explaining you and Spectulus made a mistake when trying to convince him of being a completely different person." }, - [202] = { name = "Witches Lil' Helper", grade = 1, points = 1, secret = true, description = "You sacrificed ingredients to create the protective brew of the witches." }, + [196] = { name = "Safely Stored Away", grade = 1, points = 2, secret = true, description = "Don't worry, no one will be able to take it from you. Probably." }, + [197] = { name = "Something's in There", grade = 1, points = 1, secret = true, description = "By the gods! What was that?" }, + [198] = { name = "Silent Pet", grade = 1, points = 1, secret = true, description = "Awww. Your very own little goldfish friend - he's cute, he's shiny and he can't complain should you forget to feed him. He'll definitely brighten up your day!" }, + [199] = { name = "Snowbunny", grade = 1, points = 2, secret = true, description = "Hopping, hopping through the snow - that's the funnest way to go! Making footprints in a flurry - it's more fun the more you hurry! Licking icicles all day - Winter, never go away!" }, + [200] = { name = "Dark Voodoo Priest", grade = 1, points = 2, secret = true, description = "Sinister curses, evil magic - you don't shy away from punishing others by questionable means. Someone just gave you a strange look - now where's that needle again?" }, + [201] = { name = "Nomad Soul", grade = 1, points = 2, secret = true, description = "Home is where your current favourite hunting ground is, and though you might hold certain places more dear than others you never feel attached enough to really stay in one city for long. Pack all your stuff - it's time to move on again." }, + [202] = { name = "Truth Be Told", grade = 1, points = 2, secret = true, description = "You told Jack the truth by explaining you and Spectulus made a mistake when trying to convince him of being a completely different person." }, [203] = { name = "You Don't Know Jack", grade = 1, points = 2, secret = true, description = "You did not tell Jack the truth about the mistake you and Spectulus made when trying to convince him about being a completely different person. He will live in doubt until the end of his existence." }, - - --9.1 - [204] = { name = "Askarak Nemesis", grade = 1, points = 1, secret = true, description = "You are now the royal archfiend of the Askarak, prince slayer." }, - [205] = { name = "Beak Doctor", grade = 2, points = 4, description = "You significantly helped the afflicted citizens of Venore in times of dire need. Somehow you still feel close to the victims of the fever outbreak. Your clothes make you one of them, one poor soul amongst the countless afflicted." }, - [206] = { name = "Biodegradable", grade = 1, points = 1, secret = true, description = "You caught fifty rare shimmer swimmers. Getting rid of all those corpses by dumping them into the lake really was worth it, wasn't it? Wait, didn't something move in the water just now...?" }, - [207] = { name = "Deer Hunt", grade = 1, points = 1, secret = true, description = "You managed to kill more than four hundred white deer - it looks like you are one of the main reasons they will soon be considered extinct, way to go!" }, - [208] = { name = "Doctor! Doctor!", grade = 1, points = 2, secret = true, description = "Did someone call a doctor? You delivered 100 medicine bags to Ottokar of the Venore poor house in times of dire need, well done!" }, - [209] = { name = "Eye of the Deep", grade = 1, points = 1, secret = true, description = "You didn't look into it - at least not for too long... but Groam did. And you relieved him. Just don't tell his friend Dronk." }, - [210] = { name = "Firefighter", grade = 1, points = 2, secret = true, description = "You extinguished 500 thornfires! You were there when the Firestarters took over Shadowthorn. You saved the day - and the home of some elves which will try to kill you nonetheless. Isn't it nice to see everything restored just as it was before..?" }, + [204] = { name = "Berry Picker", grade = 2, points = 4, secret = true, description = "The Combined Magical Winterberry Society hereby honours continued selfless dedication and extraordinary efforts in the Annual Autumn Vintage." }, + [205] = { name = "True Colours", grade = 1, points = 3, secret = true, description = "You and your friends showed the three wizards your loyalty three times - I am sure at least one of them is probably eternally thankful and exceedingly proud of you." }, + [206] = { name = "Master Shapeshifter", grade = 1, points = 2, secret = true, description = "You have mastered Kuriks challenge in all possible shapes." }, + [207] = { name = "Slimer", grade = 1, points = 1, secret = true, description = "With the assistance of your friendly little helper, you gobbled more than 500 chunks of slime. Well done, Slimer." }, + [208] = { name = "Mageslayer", grade = 1, points = 1, secret = true, description = "You killed the raging mage in his tower south of Zao. Again. But this one just keeps coming back. The dimensional portal collapsed once more and you know he will eventually return but hey - a raging mage, it's like asking for it..." }, + [209] = { name = "Biodegradable", grade = 1, points = 1, secret = true, description = "You caught fifty rare shimmer swimmers. Getting rid of all those corpses by dumping them into the lake really was worth it, wasn't it? Wait, didn't something move in the water just now...?" }, + [210] = { name = "Eye of the Deep", grade = 1, points = 1, secret = true, description = "You didn't look into it - at least not for too long... but Groam did. And you relieved him. Just don't tell his friend Dronk." }, [211] = { name = "Invader of the Deep", grade = 1, points = 2, secret = true, description = "Many creatures of the deep have lost their lives by your hand. Three hundred have entered the depths of eternity. You should probably fear the revenge of the Eyes of the Deep." }, - [212] = { name = "Mageslayer", grade = 1, points = 1, secret = true, description = "You killed the raging mage in his tower south of Zao. Again. But this one just keeps coming back. The dimensional portal collapsed once more and you know he will eventually return but hey - a raging mage, it's like asking for it..." }, - [213] = { name = "Mystic Fabric Magic", grade = 2, points = 4, description = "You vanquished the mad mage, you subdued the raging mage - no spellweaving self-exposer can stand in your way. Yet you are quite absorbed in magical studies yourself. This very fabric reflects this personal approval of the magic arts." }, - [214] = { name = "Shaburak Nemesis", grade = 1, points = 1, secret = true, description = "You are now the public archenemy of the Shaburak, prince slayer." }, - [215] = { name = "Slimer", grade = 1, points = 1, secret = true, description = "With the assistance of your friendly little helper, you gobbled more than 500 chunks of slime. Well done, Slimer." }, - - --9.2 - [216] = { name = "Arachnoise", grade = 1, points = 1, description = "You've shattered each of Bloodweb's eight frozen legs. As they say: break a leg, and then some more." }, - [217] = { name = "Back into the Abyss", grade = 1, points = 1, description = "You've cut off a whole lot of tentacles today. Thul was driven back to where he belongs." }, - [218] = { name = "Beautiful Agony", grade = 1, points = 2, description = "Ethershreck's cry of agony kept ringing in your ear for hours after he had dissolved into thin air. He probably moved to another plane of existence... for a while." }, - [219] = { name = "Blood-Red Snapper", grade = 1, points = 1, description = "You've tainted the jungle floor with the Snapper's crimson blood." }, + [212] = { name = "Firefighter", grade = 1, points = 2, secret = true, description = "You extinguished 500 thornfires! You were there when the Firestarters took over Shadowthorn. You saved the day - and the home of some elves which will try to kill you nonetheless. Isn't it nice to see everything restored just as it was before..?" }, + [213] = { name = "Deer Hunt", grade = 1, points = 1, secret = true, description = "You managed to kill more than four hundred white deer - it looks like you are one of the main reasons they will soon be considered extinct, way to go!" }, + [214] = { name = "Askarak Nemesis", grade = 1, points = 1, secret = true, description = "You are now the royal archfiend of the Askarak, prince slayer." }, + [215] = { name = "Shaburak Nemesis", grade = 1, points = 1, secret = true, description = "You are now the public archenemy of the Shaburak, prince slayer." }, + [216] = { name = "Fearless", grade = 1, points = 1, secret = true, description = 'You broke the jar of Horestis - fifty times. Either you know no fear or simply ignore it. Whatever the case, you are "fearless" indeed.' }, + [217] = { name = "Doctor! Doctor!", grade = 1, points = 2, secret = true, description = "Did someone call a doctor? You delivered 100 medicine bags to Ottokar of the Venore poor house in times of dire need, well done!" }, + [218] = { name = "Beak Doctor", grade = 2, points = 4, description = "You significantly helped the afflicted citizens of Venore in times of dire need. Somehow you still feel close to the victims of the fever outbreak. Your clothes make you one of them, one poor soul amongst the countless afflicted." }, + [219] = { name = "Mystic Fabric Magic", grade = 2, points = 4, description = "You vanquished the mad mage, you subdued the raging mage - no spellweaving self-exposer can stand in your way. Yet you are quite absorbed in magical studies yourself. This very fabric reflects this personal approval of the magic arts." }, [220] = { name = "Breaking the Ice", grade = 1, points = 1, description = "You almost made friends with Shardhead... before he died. Poor guy only seems to attract violence with his frosty attitude." }, - [221] = { name = "Choking on Her Venom", grade = 1, points = 1, description = "The Old Widow fell prey to your supreme hunting skills." }, - [222] = { name = "Crawling Death", grade = 1, points = 1, description = "You ripped the ancient scarab Fleshcrawler apart and made sure he didn't get under your skin." }, - [223] = { name = "Hissing Downfall", grade = 1, points = 2, description = "You've vansquished the Noxious Spawn and his serpentine heart." }, - [224] = { name = "Just Cracked Me Up!", grade = 1, points = 2, description = "Stonecracker's head was much softer than the stones he threw at you." }, - [225] = { name = "Meat Skewer", grade = 1, points = 1, description = "You've impaled the big mammoth Bloodtusk with his own tusks." }, - [226] = { name = "No More Hiding", grade = 1, points = 1, description = "You've found a well-hidden spider queen and caught her off guard in the middle of her meal." }, - [227] = { name = "One Less", grade = 1, points = 2, description = "The Many is no more, but how many more are there? One can never know." }, - [228] = { name = "Pwned a Lot of Fur", grade = 3, points = 8, secret = true, description = "You've faced and defeated a lot of the mighty bosses the Paw and Fur society sent you out to kill. All by yourself. What a hunt!" }, - [229] = { name = "Rootless Behaviour", grade = 1, points = 1, description = "You've descended into the swampy depths of Deathbine's lair and made quick work of it." }, - [230] = { name = "Scorched Flames", grade = 1, points = 1, description = "A mighty blaze went out today. It's Flameborn's turn to wait for his rebirth in the eternal cycle of life and death." }, - [231] = { name = "Something Smells", grade = 1, points = 1, description = "You've exinguished the Sulphur Scuttler's gas clouds and made the air in his cave a little better... at least for a while." }, - [232] = { name = "Spareribs for Dinner", grade = 1, points = 1, description = "Ribstride is striding no more. He had quite a few ribs to spare though." }, - [233] = { name = "The Drowned Sea God", grade = 1, points = 2, description = "As the killer of Leviathan, the giant sea serpent, his underwater kingdom is now under your reign." }, - [234] = { name = "The Gates of Hell", grade = 1, points = 2, description = "It seems the gates to the underworld have to remain unprotected for a while. Kerberos, the mighty hellhound, lost his head. All three of them." }, - [235] = { name = "The Serpent's Bride", grade = 1, points = 2, description = "You made a knot with Gorgo's living curls and took her scalp. You couldn't save her countless petrified victims, but at least you didn't become one." }, - [236] = { name = "Twisted Mutation", grade = 1, points = 1, description = "You've slain Esmeralda, the most hideous and aggressive of the mutated rats. No one will know that you almost lost a finger in the process." }, - - --9.4 - [237] = { name = "Bane of the Hive", grade = 1, points = 2, description = "Countless fights and never tiring effort in the war against the hive grant you the experience to finish your outfit with the last remaining part. Your chitin outfit is a testament of your skills and dedication for the cause." }, - [238] = { name = "Chest Robber", grade = 1, points = 1, description = "You've discovered three nomad camps and stole their supplies. Well, you can probably use them better then they can." }, - [239] = { name = "Chitin Bane", grade = 2, points = 4, description = "You have become competent and efficient in gathering the substance that is needed to fight the hive. You almost smell like dissolved chitin and the Hive Born would tell their children scary stories about you if they could speak." }, - [240] = { name = "Confusion", grade = 1, points = 3, description = "The destruction you have caused by now can be felt throughout the whole hive. The mayhem that follows your step caused significant confusion in the consciousness of the hive." }, - [241] = { name = "Dazzler", grade = 1, points = 3, description = "In the war against the hive, your efforts in blinding it begin to pay off. Your actions have blinded the hive severely and the entity seems to become aware that something dangerous is happening." }, - [242] = { name = "Death Song", grade = 1, points = 3, description = "You hushed the songs of war in the black depths by sliencing more than three hundred Deepling Spellsingers." }, - [243] = { name = "Depth Dwellers", grade = 1, points = 3, description = "By eliminating at least three hundred Deepling Warriors you delivered quite a blow to the amassing armies of the deep." }, - [244] = { name = "Desert Fisher", grade = 1, points = 1, description = "You managed to catch a fish in a surrounding that usually doesn't even carry water. Everything is subject to change, probably..." }, - [245] = { name = "Dog Sitter", grade = 1, points = 1, description = "You showed Noodles the way home. How long will it take this time until he's on the loose again? That dog must be really bored in the throne room by now." }, - [246] = { name = "Down the Drain", grade = 1, points = 2, description = "You've found a secret dungeon in the flooded plains and killed several of its inhabitants. And now you have wet feet." }, - [247] = { name = "Exterminator", grade = 2, points = 4, description = "Efficient and lethal, you have gained significant experience in fighting the elite forces of the hive. Almost single-handed, you have slain the best of the Hive Born and live to tell the tale." }, - [248] = { name = "Fire from the Earth", grade = 1, points = 2, description = "You've survived the Hellgorge eruption and found a way through the flames and lava. You've even managed to kill a few fireborn on the way." }, - [249] = { name = "Gatherer", grade = 1, points = 2, description = "By killing creatures of the hive and gaining weapons for further missions, you started a quite effective way of war. You gathered a lot of dissolved chitin to resupply the war effort." }, + [221] = { name = "Arachnoise", grade = 1, points = 1, description = "You've shattered each of Bloodweb's eight frozen legs. As they say: break a leg, and then some more." }, + [222] = { name = "Rootless Behaviour", grade = 1, points = 1, description = "You've descended into the swampy depths of Deathbine's lair and made quick work of it." }, + [223] = { name = "Twisted Mutation", grade = 1, points = 1, description = "You've slain Esmeralda, the most hideous and aggressive of the mutated rats. No one will know that you almost lost a finger in the process." }, + [224] = { name = "Beautiful Agony", grade = 1, points = 2, description = "Ethershreck's cry of agony kept ringing in your ear for hours after he had dissolved into thin air. He probably moved to another plane of existence... for a while." }, + [225] = { name = "Scorched Flames", grade = 1, points = 1, description = "A mighty blaze went out today. It's Flameborn's turn to wait for his rebirth in the eternal cycle of life and death." }, + [226] = { name = "Crawling Death", grade = 1, points = 1, description = "You ripped the ancient scarab Fleshcrawler apart and made sure he didn't get under your skin." }, + [227] = { name = "The Serpent's Bride", grade = 1, points = 2, description = "You made a knot with Gorgo's living curls and took her scalp. You couldn't save her countless petrified victims, but at least you didn't become one." }, + [228] = { name = "No More Hiding", grade = 1, points = 1, description = "You've found a well-hidden spider queen and caught her off guard in the middle of her meal." }, + [229] = { name = "The Gates of Hell", grade = 1, points = 2, description = "It seems the gates to the underworld have to remain unprotected for a while. Kerberos, the mighty hellhound, lost his head. All three of them." }, + [230] = { name = "The Drowned Sea God", grade = 1, points = 2, description = "As the killer of Leviathan, the giant sea serpent, his underwater kingdom is now under your reign." }, + [231] = { name = "Spareribs for Dinner", grade = 1, points = 1, description = "Ribstride is striding no more. He had quite a few ribs to spare though." }, + [232] = { name = "Breaking the Ice", grade = 1, points = 1, description = "You almost made friends with Shardhead... before he died. Poor guy only seems to attract violence with his frosty attitude." }, + [233] = { name = "Just Cracked Me Up!", grade = 1, points = 2, description = "Stonecracker's head was much softer than the stones he threw at you." }, + [234] = { name = "Something Smells", grade = 1, points = 1, description = "You've exinguished the Sulphur Scuttler's gas clouds and made the air in his cave a little better... at least for a while." }, + [235] = { name = "Meat Skewer", grade = 1, points = 1, description = "You've impaled the big mammoth Bloodtusk with his own tusks." }, + [236] = { name = "One Less", grade = 1, points = 2, description = "The Many is no more, but how many more are there? One can never know." }, + [237] = { name = "Hissing Downfall", grade = 1, points = 2, description = "You've vanquished the Noxious Spawn and his serpentine heart." }, + [238] = { name = "Choking on Her Venom", grade = 1, points = 1, description = "The Old Widow fell prey to your supreme hunting skills." }, + [239] = { name = "Blood-Red Snapper", grade = 1, points = 1, description = "You've tainted the jungle floor with the Snapper's crimson blood." }, + [240] = { name = "Back into the Abyss", grade = 1, points = 1, description = "You've cut off a whole lot of tentacles today. Thul was driven back to where he belongs." }, + [241] = { name = "Pwned a Lot of Fur", grade = 3, points = 8, secret = true, description = "You've faced and defeated a lot of the mighty bosses the Paw and Fur society sent you out to kill. All by yourself. What a hunt!" }, + [242] = { name = "Honest Finder", grade = 1, points = 1, description = "You've stopped the bank robber and returned the bag full of gold. Good to know there are still lawful Tibians like you around." }, + [243] = { name = "Goldhunter", grade = 1, points = 2, secret = true, description = "If it wasn't for you, several banks in Tibia would've gotten bankrupt by now. Keep on chasing bank robbers and no one will have to worry about the Tibian economy!" }, + [244] = { name = "Trail of the Ape God", grade = 1, points = 1, secret = true, description = "You've discovered a trail of giant footprints and terrified elephants running everywhere. Could it be that the mysterious ape god is rambling in the jungle?" }, + [245] = { name = "Someone's Bored", grade = 1, points = 1, secret = true, description = "That was NOT a giant spider. There's some witchcraft at work here." }, + [246] = { name = "Whistle-Blower", grade = 1, points = 1, secret = true, description = "You can't keep a secret, can you? Then again, you're just fulfilling your duty to the Queen of Carlin as a lawful citizen. That's a good thing, isn't it...?" }, + [247] = { name = "Torn Treasures", grade = 1, points = 1, secret = true, description = "Wyda seems to be really, really bored. You also found out that she doesn't really need all those blood herbs that adventurers brought her. Still, she was nice enough to take one from you and gave you something quite cool in exchange." }, + [248] = { name = "Loyal Subject", grade = 1, points = 1, secret = true, description = "You joined the Kingsday festivities and payed King Tibianus your respects. Now, off to party!" }, + [249] = { name = "Desert Fisher", grade = 1, points = 1, description = "You managed to catch a fish in a surrounding that usually doesn't even carry water. Everything is subject to change, probably..." }, [250] = { name = "Gem Cutter", grade = 1, points = 1, secret = true, description = 'You cut your first gem - and it bears your own name! Now that would be a nice gift! This does not make it a "true" Heart of the Sea, however...' }, - [251] = { name = "Goldhunter", grade = 1, points = 2, secret = true, description = " If it wasn't for you, several banks in Tibia would've gotten bankrupt by now. Keep on chasing bank robbers and no one will have to worry about the Tibian economy!" }, - [252] = { name = "Guard Killer", grade = 1, points = 2, description = "You have proven that you can beat the best of the hive. You have caused first promising breaches in the defence of the hive" }, - [253] = { name = "Guardian Downfall", grade = 2, points = 4, description = "You ended the life of over three hundred Deepling Guards. Not quite the guardian of the Deeplings, are you?" }, - [254] = { name = "Headache", grade = 1, points = 2, description = "Even in the deepest structures of the hive, you began to strike against the mighty foe. Your actions probably already gave the hive a headache." }, - [255] = { name = "Heartburn", grade = 1, points = 3, description = "Never-tiring, you attack the inner organs of the mighty hive. Your attacks on the hive's digestion system begin to cause some trouble." }, - [256] = { name = "Hickup", grade = 1, points = 2, description = "You have grown accustomed to frequenting the hive's stomach system. Your actions have caused the hive some first digestion problems." }, - [257] = { name = "Hive Blinder", grade = 2, points = 4, description = "You have put a lot of time and energy into keeping the hive unaware of what is happening on Quirefang. The hive learnt to fear your actions. It would surely crush you with all its might ... if it could only find you!" }, - [258] = { name = "Hive Fighter", grade = 1, points = 1, description = "You have participated that much in the hive war, that you are able to create some makeshift armor from the remains of dead hive born that can be found in the major hive, to show of your skill." }, - [259] = { name = "Hive Infiltrator", grade = 1, points = 3, description = "The most powerful warriors of the hive were killed by you by the dozens. The hive is not safe anymore because of your actions." }, - [260] = { name = "Hive War Veteran", grade = 1, points = 1, description = "Your invaluable experience in fighting the hive allows you to add another piece of armor to your chitin outfit to proove your dedication for the cause." }, - [261] = { name = "Honest Finder", grade = 1, points = 1, description = "You've stopped the bank robber and returned the bag full of gold. Good to know there are still lawful Tibians like you around." }, - [262] = { name = "Ice Harvester", grade = 1, points = 1, description = "You witnessed the thawing of Svargrond and harvested rare seeds from some strange icy plants. They must be good for something." }, - [263] = { name = "Loyal Subject", grade = 1, points = 1, description = "You joined the Kingsday festivities and payed King Tibianus your respects. Now, off to party!" }, - [264] = { name = "Manic", grade = 2, points = 4, description = "You have destroyed a significant amount of the hive's vital nerve centres and caused massive destruction to the hive's awareness. You are probably causing the hive horrible nightmares." }, - [265] = { name = "Minor Disturbance", grade = 1, points = 2, description = "Your actions start to make a difference. You have blinded the antennae of the hive often enough to become an annoyance to it." }, - [266] = { name = "Navigational Error", grade = 2, points = 5, secret = true, description = "You confronted the Navigator." }, - [267] = { name = "Pimple", grade = 1, points = 3, description = "You are getting more and more experienced in destroying the supply of the enemy's forces. Your actions caused the hive some severe skin problems." }, - [268] = { name = "Planter", grade = 1, points = 2, description = "The hive has to be fought with might and main, hampering its soldiers is only the first step. You diligently stopped the pores of the hive to spread its warriors." }, - [269] = { name = "Preservationist", grade = 1, points = 1, secret = true, description = "You are a pretty smart thinker and managed to create everlasting flowers. They might become a big hit with all the people who aren't blessed with a green thumb or just forgetful." }, - [270] = { name = "Si, Ariki!", grade = 1, points = 1, description = "You've found the oriental traveller Yasir and were able to trade with him - even if you didn't really understand his language." }, - [271] = { name = "Someone's Bored", grade = 1, points = 1, secret = true, description = "That was NOT a giant spider. There's some witchcraft at work here." }, - [272] = { name = "Spolium Profundis", grade = 2, points = 4, description = "You travelled the depths of this very world. You entered the blackness of the deep sea to conquer the realm of the Deeplings. May this suit remind you of the strange beauty below." }, - [273] = { name = "Stomach Ulcer", grade = 2, points = 4, description = "You severely disrupted the digestion of the hive. The hive should for sure see a doctor. It seems you proved to be more than it can swallow." }, - [274] = { name = "Supplier", grade = 1, points = 3, description = "The need for supplies often decides over loss or victory. Your tireless efforts to resupply the resources keeps the war against the hive going." }, + [251] = { name = "Dog Sitter", grade = 1, points = 1, description = "You showed Noodles the way home. How long will it take this time until he's on the loose again? That dog must be really bored in the throne room by now." }, + [252] = { name = "Ice Harvester", grade = 1, points = 1, description = "You witnessed the thawing of Svargrond and harvested rare seeds from some strange icy plants. They must be good for something." }, + [253] = { name = "Preservationist", grade = 1, points = 1, secret = true, description = "You are a pretty smart thinker and managed to create everlasting flowers. They might become a big hit with all the people who aren't blessed with a green thumb or just forgetful." }, + [254] = { name = "Chest Robber", grade = 1, points = 1, description = "You've discovered three nomad camps and stole their supplies. Well, you can probably use them better then they can." }, + [255] = { name = "Down the Drain", grade = 1, points = 2, description = "You've found a secret dungeon in the flooded plains and killed several of its inhabitants. And now you have wet feet." }, + [256] = { name = "Fire from the Earth", grade = 1, points = 2, description = "You've survived the Hellgorge eruption and found a way through the flames and lava. You've even managed to kill a few fireborn on the way." }, + [257] = { name = "Minor Disturbance", grade = 1, points = 2, description = "Your actions start to make a difference. You have blinded the antennae of the hive often enough to become an annoyance to it." }, + [258] = { name = "Dazzler", grade = 1, points = 3, description = "In the war against the hive, your efforts in blinding it begin to pay off. Your actions have blinded the hive severely and the entity seems to become aware that something dangerous is happening." }, + [259] = { name = "Hive Blinder", grade = 2, points = 4, description = "You have put a lot of time and energy into keeping the hive unaware of what is happening on Quirefang. The hive learnt to fear your actions. It would surely crush you with all its might ... if it could only find you!" }, + [260] = { name = "Hickup", grade = 1, points = 2, description = "You have grown accustomed to frequenting the hive's stomach system. Your actions have caused the hive some first digestion problems." }, + [261] = { name = "Heartburn", grade = 1, points = 3, description = "Never-tiring, you attack the inner organs of the mighty hive. Your attacks on the hive's digestion system begin to cause some trouble." }, + [262] = { name = "Stomach Ulcer", grade = 2, points = 4, description = "You severely disrupted the digestion of the hive. The hive should for sure see a doctor. It seems you proved to be more than it can swallow." }, + [263] = { name = "Planter", grade = 1, points = 2, description = "The hive has to be fought with might and main, hampering its soldiers is only the first step. You diligently stopped the pores of the hive to spread its warriors." }, + [264] = { name = "Pimple", grade = 1, points = 3, description = "You are getting more and more experienced in destroying the supply of the enemy's forces. Your actions caused the hive some severe skin problems." }, + [265] = { name = "Suppressor", grade = 2, points = 4, description = "A war is won by those who have the best supply of troops. The hive's troops have been dealt a significant blow by your actions. You interrupted the hive's replenishment of troops lastingly and severely." }, + [266] = { name = "Gatherer", grade = 1, points = 2, description = "By killing creatures of the hive and gaining weapons for further missions, you started a quite effective way of war. You gathered a lot of dissolved chitin to resupply the war effort." }, + [267] = { name = "Supplier", grade = 1, points = 3, description = "The need for supplies often decides over loss or victory. Your tireless efforts to resupply the resources keeps the war against the hive going." }, + [268] = { name = "Chitin Bane", grade = 2, points = 4, description = "You have become competent and efficient in gathering the substance that is needed to fight the hive. You almost smell like dissolved chitin and the Hive Born would tell their children scary stories about you if they could speak." }, + [269] = { name = "Guard Killer", grade = 1, points = 2, description = "You have proven that you can beat the best of the hive. You have caused first promising breaches in the defence of the hive" }, + [270] = { name = "Hive Infiltrator", grade = 1, points = 3, description = "The most powerful warriors of the hive were killed by you by the dozens. The hive is not safe anymore because of your actions." }, + [271] = { name = "Exterminator", grade = 2, points = 4, description = "Efficient and lethal, you have gained significant experience in fighting the elite forces of the hive. Almost single-handed, you have slain the best of the Hive Born and live to tell the tale." }, + [272] = { name = "Headache", grade = 1, points = 2, description = "Even in the deepest structures of the hive, you began to strike against the mighty foe. Your actions probably already gave the hive a headache." }, + [273] = { name = "Confusion", grade = 1, points = 3, description = "The destruction you have caused by now can be felt throughout the whole hive. The mayhem that follows your step caused significant confusion in the consciousness of the hive." }, + [274] = { name = "Manic", grade = 2, points = 4, description = "You have destroyed a significant amount of the hive's vital nerve centers and caused massive destruction to the hive's awareness. You are probably causing the hive horrible nightmares." }, [275] = { name = "Suppressor", grade = 2, points = 4, description = "A war is won by those who have the best supply of troops. The hive's troops have been dealt a significant blow by your actions. You interrupted the hive's replenishment of troops lastingly and severely." }, - [276] = { name = "Torn Treasures", grade = 1, points = 1, secret = true, description = "Wyda seems to be really, really bored. You also found out that she doesn't really need all those blood herbs that adventurers brought her. Still, she was nice enough to take one from you and gave you something quite cool in exchange." }, - [277] = { name = "Trail of the Ape God", grade = 1, points = 1, secret = true, description = "You've discovered a trail of giant footprints and Terrified Elephants running everywhere. Could it be that the mysterious Ape God is rambling in the jungle?" }, - [278] = { name = "Whistle-Blower", grade = 1, points = 1, secret = true, description = "You can't keep a secret, can you? Then again, you're just fulfilling your duty to the Queen of Carlin as a lawful citizen. That's a good thing, isn't it...?" }, - - --9.5 - [279] = { name = "Back from the Dead", grade = 1, points = 2, description = "You overcame the undead Zanakeph and sent him back into the darkness that spawned him." }, - [280] = { name = "Dream's Over", grade = 1, points = 1, description = "No more fear and bad dreams. You stabbed Tormentor to death with its scythe leg." }, - [281] = { name = "Enter zze Draken!", grade = 1, points = 2, description = "You gave zzze draken a tazte of your finizzzing move." }, - [282] = { name = "Howly Silence", grade = 1, points = 1, description = "You muted the everlasting howling of Hemming." }, - [283] = { name = "Kapow!", grade = 1, points = 1, description = "No joke, you murdered the bat." }, + [276] = { name = "Navigational Error", grade = 2, points = 5, secret = true, description = "You confronted the Navigator." }, + [277] = { name = "Si, Ariki!", grade = 1, points = 1, description = "You've found the oriental traveller Yasir and were able to trade with him - even if you didn't really understand his language." }, + [278] = { name = "Guardian Downfall", grade = 2, points = 4, description = "You ended the life of over three hundred Deepling Guards. Not quite the guardian of the Deeplings, are you?" }, + [279] = { name = "Death Song", grade = 1, points = 3, description = "You hushed the songs of war in the black depths by sliencing more than three hundred Deepling Spellsingers." }, + [280] = { name = "Depth Dwellers", grade = 1, points = 3, description = "By eliminating at least three hundred Deepling Warriors you delivered quite a blow to the amassing armies of the deep." }, + [281] = { name = "Gem Cutter", grade = 1, points = 1, secret = true, description = 'You cut your first gem - and it bears your own name! Now that would be a nice gift! This does not make it a "true" Heart of the Sea, however...' }, + [282] = { name = "Spolium Profundis", grade = 2, points = 4, description = "You travelled the depths of this very world. You entered the blackness of the deep sea to conquer the realm of the Deeplings. May this suit remind you of the strange beauty below." }, + [283] = { name = "Bane of the Hive", grade = 1, points = 2, description = "Countless fights and never tiring effort in the war against the hive grant you the experience to finish your outfit with the last remaining part. Your chitin outfit is a testament of your skills and dedication for the cause." }, [284] = { name = "King of the Ring", grade = 1, points = 2, description = "Bretzecutioner's body just got slammed away. You are a true king of the ring!" }, - [285] = { name = "Pwned All Fur", grade = 3, points = 8, secret = true, description = "You've faced and defeated each of the mighty bosses the Paw and Fur society sent you out to kill. All by yourself. What a hunt!" }, - [286] = { name = "Stepped on a Big Toe", grade = 1, points = 1, description = "This time you knocked out the big one." }, - [287] = { name = "Zzztill Zzztanding!", grade = 1, points = 1, description = "You wiped Fazzrah away - zzeemzz like now you're the captain." }, - - --9.6 - [288] = { name = "Becoming a Bigfoot", grade = 1, points = 1, description = "You did it! You convinced the reclusive gnomes to accept you as one of their Bigfoots. Now you are ready to help them. With big feet big missions seen to come." }, - [289] = { name = "Bibby's Bloodbath", grade = 1, points = 1, secret = true, description = "You lend a helping hand in defeating invading Orcs by destroying their warcamp along with their leader. Bibby's personal bloodbath..." }, - [290] = { name = "Call Me Sparky", grade = 1, points = 1, description = "Admittedly you enjoyed the killing as usual. But the part with the sparks still gives you shivers ... or is it that there is some charge left on you?" }, - [291] = { name = "Crystal Clear", grade = 1, points = 3, description = "If the gnomes had told you that crystal armor is see-through you had probably changed your underwear in time." }, - [292] = { name = "Crystal Keeper", grade = 1, points = 1, description = "So you repaired the light of some crystals for those gnomes. What's next? Sitting a week in a mushroom bed as a temporary mushroom?" }, - [293] = { name = "Crystals in Love", grade = 1, points = 1, description = "You brought two loving crystals together. Perhaps they might even name one of their children after you. To bad you forgot to leave your calling card." }, - [294] = { name = "Death from Below", grade = 1, points = 2, secret = true, description = "The face of the enemy is unmasked. You have encountered one of 'those below' and survived. More than that, you managed to kill the beast and prove once and for all that the enemy can be beaten." }, - [295] = { name = "Death on Strike", grade = 2, points = 4, secret = true, description = "Again and again Deathstrike has fallen to your prowess. Perhaps it's time for people calling YOU Deathstrike from now on." }, + [285] = { name = "Hive War Veteran", grade = 1, points = 1, description = "Your invaluable experience in fighting the hive allows you to add another piece of armor to your chitin outfit to prove your dedication for the cause." }, + [286] = { name = "Hive Fighter", grade = 1, points = 1, description = "You have participated that much in the hive war, that you are able to create some makeshift armor from the remains of dead hive born that can be found in the major hive, to show of your skill." }, + [287] = { name = "Howly Silence", grade = 1, points = 1, description = "You muted the everlasting howling of Hemming." }, + [288] = { name = "Dream's Over", grade = 1, points = 1, description = "No more fear and bad dreams. You stabbed Tormentor to death with its scythe leg." }, + [289] = { name = "Zzztill Zzztanding!", grade = 1, points = 1, description = "You wiped Fazzrah away - zzeemzz like now you're the captain." }, + [290] = { name = "Stepped on a Big Toe", grade = 1, points = 1, description = "This time you knocked out the big one." }, + [291] = { name = "Kapow!", grade = 1, points = 1, description = "No joke, you murdered the bat." }, + [292] = { name = "Enter zze Draken!", grade = 1, points = 2, description = "You gave zzze draken a tazte of your finizzzing move." }, + [293] = { name = "King of the Ring", grade = 1, points = 2, description = "Bretzecutioner's body just got slammed away. You are a true king of the ring!" }, + [294] = { name = "Back from the Dead", grade = 1, points = 2, description = "You overcame the undead Zanakeph and sent him back into the darkness that spawned him." }, + [295] = { name = "Pwned All Fur", grade = 3, points = 8, secret = true, description = "You've faced and defeated each of the mighty bosses the Paw and Fur society sent you out to kill. All by yourself. What a hunt!" }, [296] = { name = "Diplomatic Immunity", grade = 2, points = 4, secret = true, description = "You killed the ambassador of the abyss that often that they might consider sending another one. Perhaps that will one day stop further intrusions." }, - [297] = { name = "Dungeon Cleaner", grade = 1, points = 3, secret = true, description = "Seen it all. Done it all. Your unstoppable force swept through the dungeons and you vanquished their masters. Not to forget the precious loot you took! Now stop reading this and continue hunting! Time is money after all!" }, - [298] = { name = "Fall of the Fallen", grade = 2, points = 4, secret = true, description = "Have you ever wondered how he reappears again and again? You only care for the loot, do you? Gotcha!" }, - [299] = { name = "Final Strike", grade = 1, points = 2, secret = true, description = "The mighty Deathstrike is dead! One legend is dead and you're on your way to become one yourself." }, - [300] = { name = "Funghitastic", grade = 1, points = 3, description = "Finally your dream to become a walking mushroom has come true ... No, wait a minute!" }, - [301] = { name = "Gnome Friend", grade = 1, points = 2, description = "The gnomes are warming up to you. One or two of them might actually bother to remember your name. You're allowed to access their gnomebase alpha. You are prepared to boldly put your gib feet into areas few humans have walked before." }, - [302] = { name = "Gnome Little Helper", grade = 1, points = 1, description = "You think the gnomes start to like you. A little step for a Bigfoot but a big step for humanity." }, - [303] = { name = "Gnomebane's Bane", grade = 1, points = 2, secret = true, description = "The fallen gnome is dead and justice served. But what was it that the gnome whispered with his last breath? He's your father???" }, - [304] = { name = "Gnomelike", grade = 1, points = 3, description = "You have become a household name in gnomish society! Your name is mentioned by gnomes more than once. Of course usually by gnomish mothers whose children refuse to eat their mushroom soup, but you are certainly making some tremendous progress." }, - [305] = { name = "Gnomish Art Of War", grade = 1, points = 3, description = "You have unleashed your inner gnome and slain some of the most fearsome threats that gnomekind has ever faced. Now you can come and go to the warzones as it pleases you. The enemies of gnomekind will never be safe again." }, - [306] = { name = "Goo Goo Dancer", grade = 1, points = 1, secret = true, description = "Seeing a mucus plug makes your heart dance and you can't resist to see what it hides. Goo goo away!" }, + [297] = { name = "Bibby's Bloodbath", grade = 1, points = 1, secret = true, description = "You lend a helping hand in defeating invading Orcs by destroying their warcamp along with their leader. Bibby's personal bloodbath..." }, + [298] = { name = "Nestling", grade = 1, points = 1, description = "You cleansed the land from an eight legged nuisance by defeating Mamma Longlegs three times. She won't be back soon... or will she?" }, + [299] = { name = "Becoming a Bigfoot", grade = 1, points = 1, description = "You did it! You convinced the reclusive gnomes to accept you as one of their Bigfoots. Now you are ready to help them. With big feet big missions seen to come." }, + [300] = { name = "Gnome Little Helper", grade = 1, points = 1, description = "You think the gnomes start to like you. A little step for a Bigfoot but a big step for humanity." }, + [301] = { name = "Gnome Friend", grade = 1, points = 2, description = "The gnomes are warming up to you. One or two of them might actually bother to remember your name. You're allowed to access their gnomebase alpha. You are prepared to boldly put your big feet into areas few humans have walked before." }, + [302] = { name = "Gnomelike", grade = 1, points = 3, description = "You have become a household name in gnomish society! Your name is mentioned by gnomes more than once. Of course usually by gnomish mothers whose children refuse to eat their mushroom soup, but you are certainly making some tremendous progress." }, + [303] = { name = "Honorary Gnome", grade = 2, points = 4, description = "You accomplished what few humans ever will: you truly impressed the gnomes. This might not change their outlook on humanity as a whole, but at least you can bathe in gnomish respect! And don't forget you're now allowed to enter the warzones!" }, + [304] = { name = "Crystals in Love", grade = 1, points = 1, description = "You brought two loving crystals together. Perhaps they might even name one of their children after you. Too bad you forgot to leave your calling card." }, + [305] = { name = "Substitute Tinker", grade = 1, points = 1, description = "Ring-a-ding! You have visited the golem workshop and lent a hand in repairing them. To know those golems are safe is worth all the bruises, isn't it?" }, + [306] = { name = "Spore Hunter", grade = 1, points = 1, description = "After hunting for the correct mushrooms and their spores you're starting to feel like a mushroom yourself. A few times more and you might start thinking like a mushroom, who knows?" }, [307] = { name = "Grinding Again", grade = 1, points = 1, description = "Burnt fingers and itching lungs are a small price for bringing those gnomes some lousy stone and getting almost killed! Your mother warned you to better become a farmer." }, - [308] = { name = "Honorary Gnome", grade = 2, points = 4, description = "You accomplished what few humans ever will: you truly impressed the gnomes. This might not change their outlook on humanity as a whole, but at least you can bathe in gnomish respect! And don't forget you're now allowed to enter the warzones!" }, - [309] = { name = "Nestling", grade = 1, points = 1, description = "You cleansed the land from an eight legged nuisance by defeating Mamma Longlegs three times. She won't be back soon... or will she?" }, - [310] = { name = "One Foot Vs. Many", grade = 1, points = 1, description = "One Bigfoot won over thousands of tiny feet. Perhaps the gnomes are wrong and size matters?" }, - [311] = { name = "Spore Hunter", grade = 1, points = 1, description = "After hunting for the correct mushrooms and their spores you're starting to feel like a mushroom yourself. A few times more and you might start thinking like a mushroom, who knows?" }, - [312] = { name = "Substitute Tinker", grade = 1, points = 1, description = "Ring-a-ding! You have visited the golem workshop and lent a hand in repairing them. To know those golems are safe is worth all the bruises, isn't it?" }, - [313] = { name = "The Picky Pig", grade = 1, points = 1, description = "The gnomes decided their pigs need some exclusive diet and you had to do all the dirty work - but wasn't the piglet adorable?" }, - - --9.8 - [314] = { name = "Task Manager", grade = 1, points = 2, secret = true, description = "Helping a poor, stupid goblin to feed his starving children and wifes feels good ... if you'd only get rid of the strange feeling that you're missing something." }, - [315] = { name = "True Dedication", grade = 2, points = 5, secret = true, description = "You conquered the demon challenge and prevailed... now show off your success in style!" }, - - --10.1 - [316] = { name = "Gravedigger", grade = 1, points = 3, description = "Assisting Omrabas' sick plan to resurrect made you dig your way through the blood-soaked halls of Drefia. Maybe better he failed!" }, - [317] = { name = "Repenter", grade = 1, points = 1, secret = true, description = "You cleansed your soul in serving the Repenter enclave and purified thine self in completing all tasks in a single day of labour." }, - - --10.2 - [318] = { name = "Cave Completionist", grade = 1, points = 2, description = " You have helped the gnomes of the spike in securing the caves and explored enough of the lightles depths to earn you a complete cave explorers outfit. Well done!" }, - - --10.3 - [319] = { name = "Dream Warden", grade = 2, points = 5, description = "It doesn't matter what noise you would hear... dream, nightmare, illusion - there is nothing you can't vanquish. You are a true Dream Warden." }, - [320] = { name = "Dream Wright", grade = 1, points = 1, description = "You have mended many a broken dream and so, the dream of Roshamuul is safely being told over and over again." }, - [321] = { name = "Ending the Horror", grade = 1, points = 2, description = "You have cleansed the lands of many retching horrors. You sure know how to end a bad dream: forcefully, that's how!" }, - [322] = { name = "Luring Silence", grade = 1, points = 2, description = "What a scientific discovery - they really DO communicate! Using their own communication habits against them, you lured a large pack of silencers away from the walls of Roshamuul." }, + [308] = { name = "Dungeon Cleaner", grade = 1, points = 3, secret = true, description = "Seen it all. Done it all. Your unstoppable force swept through the dungeons and you vanquished their masters. Not to forget the precious loot you took! Now stop reading this and continue hunting! Time is money after all!" }, + [309] = { name = "Crystal Keeper", grade = 1, points = 1, description = "So you repaired the light of some crystals for those gnomes. What's next? Sitting a week in a mushroom bed as a temporary mushroom?" }, + [310] = { name = "Call Me Sparky", grade = 1, points = 1, description = "Admittedly you enjoyed the killing as usual. But the part with the sparks still gives you shivers ... or is it that there is some charge left on you?" }, + [311] = { name = "One Foot Vs. Many", grade = 1, points = 1, description = "One Bigfoot won over thousands of tiny feet. Perhaps the gnomes are wrong and size matters?" }, + [312] = { name = "The Picky Pig", grade = 1, points = 1, description = "The gnomes decided their pigs need some exclusive diet and you had to do all the dirty work - but wasn't the piglet adorable?" }, + [313] = { name = "Diplomatic Immunity", grade = 2, points = 4, secret = true, description = "You killed the ambassador of the abyss that often that they might consider sending another one. Perhaps that will one day stop further intrusions." }, + [314] = { name = "Fall of the Fallen", grade = 2, points = 4, secret = true, description = "Have you ever wondered how he reappears again and again? You only care for the loot, do you? Gotcha!" }, + [315] = { name = "Death on Strike", grade = 2, points = 4, secret = true, description = "Again and again Deathstrike has fallen to your prowess. Perhaps it's time for people calling YOU Deathstrike from now on." }, + [316] = { name = "Death from Below", grade = 1, points = 2, secret = true, description = "The face of the enemy is unmasked. You have encountered one of 'those below' and survived. More than that, you managed to kill the beast and prove once and for all that the enemy can be beaten." }, + [317] = { name = "Gnomebane's Bane", grade = 1, points = 2, secret = true, description = "The fallen gnome is dead and justice served. But what was it that the gnome whispered with his last breath? He's your father???" }, + [318] = { name = "Final Strike", grade = 1, points = 2, secret = true, description = "The mighty Deathstrike is dead! One legend is dead and you're on your way to become one yourself." }, + [319] = { name = "Goo Goo Dancer", grade = 1, points = 1, secret = true, description = "Seeing a mucus plug makes your heart dance and you can't resist to see what it hides. Goo goo away!" }, + [320] = { name = "Funghitastic", grade = 1, points = 3, description = "Finally your dream to become a walking mushroom has come true ... No, wait a minute!" }, + [321] = { name = "Crystal Clear", grade = 1, points = 3, description = "If the gnomes had told you that crystal armor is see-through you had probably changed your underwear in time." }, + [322] = { name = "Gnomish Art Of War", grade = 1, points = 3, description = "You have unleashed your inner gnome and slain some of the most fearsome threats that gnomekind has ever faced. Now you can come and go to the warzones as it pleases you. The enemies of gnomekind will never be safe again." }, [323] = { name = "Never Surrender", grade = 1, points = 3, description = "You did not show any signs of surrender to any sight of... you get the picture. Even a hundred of them did not pose a threat to you." }, - [324] = { name = "Nevermending Story", grade = 1, points = 3, secret = true, description = "You collected all of the mysterious bottle messages around the island of Roshamuul and located the remains of the first mate. Time will tell if his tale of mending an evil ring holds true." }, - [325] = { name = "Noblesse Obliterated", grade = 2, points = 6, description = "After a battle like this you know who your friends are." }, - [326] = { name = "Prison Break", grade = 3, points = 8, description = "Gaz'haragoth... a day to remember! Your world accomplished someting really big - and you have been part of it!" }, - [327] = { name = "Sleepwalking", grade = 1, points = 1, description = "You know your way, in dream and waking. And how to make tea that transcends the boundaries of conscience." }, - [328] = { name = "Umbral Archer", grade = 2, points = 6, description = "You managed to transform, improve and sacrify your bow into a master state and have proven yourself worthy in a nightmarish world." }, + [324] = { name = "True Dedication", grade = 2, points = 5, secret = true, description = "You conquered the demon challenge and prevailed... now show off your success in style!" }, + [325] = { name = "Task Manager", grade = 1, points = 2, secret = true, description = "Helping a poor, stupid goblin to feed his starving children and wifes feels good ... if you'd only get rid of the strange feeling that you're missing something." }, + [326] = { name = "Gravedigger", grade = 1, points = 3, description = "Assisting Omrabas' sick plan to resurrect made you dig your way through the blood-soaked halls of Drefia. Maybe better he failed!" }, + [327] = { name = "Repenter", grade = 1, points = 1, secret = true, description = "You cleansed your soul in serving the Repenter enclave and purified thine self in completing all tasks in a single day of labour." }, + [328] = { name = "Umbral Swordsman", grade = 2, points = 6, description = "You managed to transform, improve and sacrify your blade into a master state and have proven yourself worthy in a nightmarish world." }, [329] = { name = "Umbral Berserker", grade = 2, points = 6, description = "You managed to transform, improve and sacrify your hammer into a master state and have proven yourself worthy in a nightmarish world." }, [330] = { name = "Umbral Bladelord", grade = 2, points = 6, description = "You managed to transform, improve and sacrify your slayer into a master state and have proven yourself worthy in a nightmarish world." }, - [331] = { name = "Umbral Brawler", grade = 2, points = 6, description = "You managed to transform, improve and sacrify your mace into a master state and have proven yourself worthy in a nightmarish world." }, - [332] = { name = "Umbral Executioner", grade = 2, points = 6, description = "You managed to transform, improve and sacrify your chopper into a master state and have proven yourself worthy in a nightmarish world." }, - [333] = { name = "Umbral Harbringer", grade = 2, points = 6, description = "You managed to transform, improve and sacrify your spellbook into a master state and have proven yourself worthy in a nightmarish world." }, - [334] = { name = "Umbral Headsman", grade = 2, points = 6, description = "You managed to transform, improve and sacrify your axe into a master state and have proven yourself worthy in a nightmarish world." }, - [335] = { name = "Umbral Marksman", grade = 2, points = 6, description = "You managed to transform, improve and sacrify your crossbow into a master state and have proven yourself worthy in a nightmarish world." }, - [336] = { name = "Umbral Master", grade = 3, points = 8, description = "You managed to transform, improve and sacrify all kinds of weapons into a master state and have proven yourself worthy in a nightmarish world. Respect!" }, - [337] = { name = "Umbral Swordsman", grade = 2, points = 6, description = "You managed to transform, improve and sacrify your blade into a master state and have proven yourself worthy in a nightmarish world." }, - - --10.5 - [338] = { name = "Combo Master", grade = 1, points = 1, secret = true, description = "You accomplished 10 or more consecutive chains in a row! That's killing at least 39 creatures in the correct order - now that's combinatorics!" }, - [339] = { name = "Elementary, My Dear", grade = 1, points = 1, description = "Through the spirit of science and exploration, you have discovered how to enter the secret hideout of the renowned Dr Merlay." }, - [340] = { name = "Glooth Engineer", grade = 2, points = 5, description = "Though you might have averted a dire threat for Rathleton, this relative peace may only hold for a while. At least you've scavenged an outfit from some of the poor fellows that have fallen prey to death priest Shagron." }, - [341] = { name = "Rathleton Citizen", grade = 1, points = 1, description = "By having rendered numerous services to the city of Rathleton you have been promoted to the rank of Citizen." }, - [342] = { name = "Rathleton Commoner", grade = 1, points = 1, description = "By having rendered numerous services to the city of Rathleton you have been promoted to the rank of Commoner." }, - [343] = { name = "Rathleton Inhabitant", grade = 1, points = 1, description = "By having rendered numerous services to the city of Rathleton you have been promoted to the rank of Inhabitant." }, - - --10.56 - [344] = { name = "Seasoned Adventurer", grade = 1, points = 1, description = "Adventure is your middle name. You spent much time in dangerous lands and have seen things others only dream of. You know your way around in Tibia - you are a seasoned adventurer now. And your journey has only just begun!" }, - - --10.7 - [345] = { name = "Go with da Lava Flow", grade = 1, points = 1, secret = true, description = "You escaped the glowing hot lava death trap, Professor Maxxen has set for you - Captain Caveworm is indeed proud!" }, - [346] = { name = "Lion's Den Explorer", grade = 1, points = 1, secret = true, description = "You discovered the Lion's Rock, passed the tests to enter the inner sanctum and finally revealed the secrets of the buried temple. You literally put your head in the lion's mouth and survived." }, - [347] = { name = "Mind the Step!", grade = 1, points = 1, description = "You've got a mind ready to draw strange conclusions that defy the laws of logic and sidestep reality. Or maybe it's just a lucky guess - or adventurous recklessness?" }, - [348] = { name = "Plant vs. Minos", grade = 1, points = 4, secret = true, description = "You have defeated the wallbreaker and saved the glooth plant." }, - [349] = { name = "Publicity", grade = 1, points = 1, description = "You are a man of the public. Or of good publicity at least. Through your efforts in advertising the airtight cloth, Zeronex might yet be redeemed - and Rathleton might yet see its first working Gloud Ship." }, - [350] = { name = "Rathleton Squire", grade = 1, points = 1, description = "By having rendered numerous services to the city of Rathleton you have been promoted to the rank of Squire." }, - [351] = { name = "Robo Chop", grade = 1, points = 4, secret = true, description = "You have defeated the glooth bomb and chopped down a lot of metal monsters on your way." }, - [352] = { name = "Rumble in the Plant", grade = 2, points = 4, secret = true, description = "You have defeated the tremor worm - and wonder what kind of fish you'd be able to catch with such a bait." }, - [353] = { name = "Snake Charmer", grade = 1, points = 1, description = "By restoring the Everhungry Altar, you charmed the Fire-Feathered Sea Serpent back into its fitful sleep, twenty miles beneath the sea." }, - [354] = { name = "The Professor's Nut", grade = 1, points = 3, description = "He seriously stored away a wallnut? That was a nutty professor indeed." }, - [355] = { name = "Wail of the Banshee", grade = 1, points = 1, secret = true, description = "You saw the Crystal Gardens with all their stunning beauty and survived the equally impressive monsters there. In the end you discovered a great evil and destroyed it with the help of a banshee who was not even aware of her support." }, - - --10.8 - [356] = { name = "Bearbaiting", grade = 1, points = 1, description = "Hunter's greeting! Your skillful use of the slingshot actually stunned a large bear. The creature is slightly dazed, but seems susceptible to your commands. Let's declare open season on all our foes!" }, - [357] = { name = "Beneath the Sea", grade = 1, points = 3, description = "Not really twenty thousand miles, but you had to dive a fair way beneath the sea to find your personal Manta Ray." }, - [358] = { name = "Blacknailed", grade = 1, points = 1, description = "Well, you can rest your nailcase now. This gravedigger's fingernails are nice and clean. Though after the next hellride, you might not want to let it hand any food to you." }, - [359] = { name = "Cartography 101", grade = 1, points = 2, description = "You succeeded in finding and charting several previously unexplored landmarks and locations for the Adventurer's Guild, you probably never need to ask anyone for the way - do you?" }, - [360] = { name = "Chequered Teddy", grade = 1, points = 1, description = "Don't let its fluffy appearance deceive you. The panda is a creature of the wild. It will take you to the most distant regions of Tibia, always in hopes of a little bamboo to nibble on or to check on a possible mate." }, - [361] = { name = "Dragon Mimicry", grade = 1, points = 2, description = "It's not really a dragon, but rather a kind of chimera. Nonetheless a decent mount to impress any passer-by." }, - [362] = { name = "Fabled Construction", grade = 1, points = 3, description = "Finding all the pieces to this complicated vehicle was one kind of a challenge. However, what you built in the end is rather a fabled than a feeble construction." }, - [363] = { name = "Fata Morgana", grade = 1, points = 2, description = "There are many delusions and phantasms in the desert. You saw a false oasis with fruit-bearing palm trees. Instead of water and refreshment, however, you found a dromedary in the end. What a useful Fata Morgana!" }, - [364] = { name = "Fried Shrimp", grade = 1, points = 2, description = "This must be underwater love - this enormous crustacean now does thy bidding. Or maybe it's just in it for a little more of that shrimp barbecue, as that's a little hard to come by in the sea." }, - [365] = { name = "Friend of Elves", grade = 1, points = 1, description = "Kingly deer mostly prefer elves as friends and familiars. This one, however, decided to favour you as a confidant and rider. Well done!" }, - [366] = { name = "Gear Up", grade = 1, points = 3, description = "Installing that control unit was a no-brainer. Now you're in control to make it walk this way or that, or to change tack at any moment if required. Your faithful walker mount obeys your every command." }, - [367] = { name = "Golden Sands", grade = 1, points = 3, description = "Counting ten thousand grains of sand could not have been harder than gaining this impressive mount." }, + [331] = { name = "Cave Completionist", grade = 1, points = 2, description = "You have helped the gnomes of the spike in securing the caves and explored enough of the lightles depths to earn you a complete cave explorers outfit. Well done!" }, + [332] = { name = "Umbral Bladelord", grade = 2, points = 6, description = "You managed to transform, improve and sacrify your slayer into a master state and have proven yourself worthy in a nightmarish world." }, + [333] = { name = "Umbral Headsman", grade = 2, points = 6, description = "You managed to transform, improve and sacrify your axe into a master state and have proven yourself worthy in a nightmarish world." }, + [334] = { name = "Umbral Executioner", grade = 2, points = 6, description = "You managed to transform, improve and sacrify your chopper into a master state and have proven yourself worthy in a nightmarish world." }, + [335] = { name = "Umbral Brawler", grade = 2, points = 6, description = "You managed to transform, improve and sacrify your mace into a master state and have proven yourself worthy in a nightmarish world." }, + [336] = { name = "Umbral Berserker", grade = 2, points = 6, description = "You managed to transform, improve and sacrify your hammer into a master state and have proven yourself worthy in a nightmarish world." }, + [337] = { name = "Umbral Archer", grade = 2, points = 6, description = "You managed to transform, improve and sacrify your bow into a master state and have proven yourself worthy in a nightmarish world." }, + [338] = { name = "Umbral Marksman", grade = 2, points = 6, description = "You managed to transform, improve and sacrify your crossbow into a master state and have proven yourself worthy in a nightmarish world." }, + [339] = { name = "Umbral Harbinger", grade = 2, points = 6, description = "You managed to transform, improve and sacrify your spellbook into a master state and have proven yourself worthy in a nightmarish world." }, + [340] = { name = "Umbral Master", grade = 3, points = 8, description = "You managed to transform, improve and sacrify all kinds of weapons into a master state and have proven yourself worthy in a nightmarish world. Respect!" }, + [341] = { name = "Nevermending Story", grade = 1, points = 3, secret = true, description = "You collected all of the mysterious bottle messages around the island of Roshamuul and located the remains of the first mate. Time will tell if his tale of mending an evil ring holds true." }, + [342] = { name = "Luring Silence", grade = 1, points = 2, description = "What a scientific discovery - they really DO communicate! Using their own communication habits against them, you lured a large pack of silencers away from the walls of Roshamuul." }, + [343] = { name = "Never Surrender", grade = 1, points = 3, description = "You did not show any signs of surrender to any sight of... you get the picture. Even a hundred of them did not pose a threat to you." }, + [344] = { name = "Dream Wright", grade = 1, points = 1, description = "You have mended many a broken dream and so, the dream of Roshamuul is safely being told over and over again." }, + [345] = { name = "Ending the Horror", grade = 1, points = 2, description = "You have cleansed the lands of many retching horrors. You sure know how to end a bad dream: forcefully, that's how!" }, + [346] = { name = "Sleepwalking", grade = 1, points = 1, description = "You know your way, in dream and waking. And how to make tea that transcends the boundaries of conscience." }, + [347] = { name = "Dream Warden", grade = 2, points = 5, description = "It doesn't matter what noise you would hear... dream, nightmare, illusion - there is nothing you can't vanquish. You are a true Dream Warden." }, + [348] = { name = "Prison Break", grade = 3, points = 8, description = "Gaz'haragoth... a day to remember! Your world accomplished something really big - and you have been part of it!" }, + [349] = { name = "Noblesse Obliterated", grade = 2, points = 6, description = "After a battle like this you know who your friends are." }, + [350] = { name = "Elementary, My Dear", grade = 1, points = 1, description = "Through the spirit of science and exploration, you have discovered how to enter the secret hideout of the renowned Dr Merlay." }, + [351] = { name = "Rathleton Commoner", grade = 1, points = 1, description = "By having rendered numerous services to the city of Rathleton you have been promoted to the rank of Commoner." }, + [352] = { name = "Rathleton Inhabitant", grade = 1, points = 1, description = "By having rendered numerous services to the city of Rathleton you have been promoted to the rank of Inhabitant." }, + [353] = { name = "Rathleton Citizen", grade = 1, points = 1, description = "By having rendered numerous services to the city of Rathleton you have been promoted to the rank of Citizen." }, + [354] = { name = "Combo Master", grade = 1, points = 1, secret = true, description = "You accomplished 10 or more consecutive chains in a row! That's killing at least 39 creatures in the correct order - now that's combinatorics!" }, + [355] = { name = "Glooth Engineer", grade = 2, points = 5, description = "Though you might have averted a dire threat for Rathleton, this relative peace may only hold for a while. At least you've scavenged an outfit from some of the poor fellows that have fallen prey to death priest Shagron." }, + [356] = { name = "Lion's Den Explorer", grade = 1, points = 1, secret = true, description = "You discovered the Lion's Rock, passed the tests to enter the inner sanctum and finally revealed the secrets of the buried temple. You literally put your head in the lion's mouth and survived." }, + [357] = { name = "Seasoned Adventurer", grade = 1, points = 1, description = "Adventure is your middle name. You spent much time in dangerous lands and have seen things others only dream of. You know your way around in Tibia - you are a seasoned adventurer now. And your journey has only just begun!" }, + [358] = { name = "Mind the Step!", grade = 1, points = 1, description = "You've got a mind ready to draw strange conclusions that defy the laws of logic and sidestep reality. Or maybe it's just a lucky guess - or adventurous recklessness?" }, + [359] = { name = "Rathleton Squire", grade = 1, points = 1, description = "By having rendered numerous services to the city of Rathleton you have been promoted to the rank of Squire." }, + [360] = { name = "The Professor's Nut", grade = 1, points = 3, description = "He seriously stored away a wallnut? That was a nutty professor indeed." }, + [361] = { name = "Plant vs. Minos", grade = 2, points = 4, secret = true, description = "You have defeated the wallbreaker and saved the glooth plant." }, + [362] = { name = "Rumble in the Plant", grade = 2, points = 4, secret = true, description = "You have defeated the tremor worm - and wonder what kind of fish you'd be able to catch with such a bait." }, + [363] = { name = "Robo Chop", grade = 2, points = 4, secret = true, description = "You have defeated the glooth bomb and chopped down a lot of metal monsters on your way." }, + [364] = { name = "Go with da Lava Flow", grade = 1, points = 1, secret = true, description = "You escaped the glowing hot lava death trap, Professor Maxxen has set for you - Captain Caveworm is indeed proud!" }, + [365] = { name = "Wail of the Banshee", grade = 1, points = 1, secret = true, description = "You saw the Crystal Gardens with all their stunning beauty and survived the equally impressive monsters there. In the end you discovered a great evil and destroyed it with the help of a banshee who was not even aware of her support." }, + [366] = { name = "Publicity", grade = 1, points = 1, description = "You are a man of the public. Or of good publicity at least. Through your efforts in advertising the airtight cloth, Zeronex might yet be redeemed - and Rathleton might yet see its first working Gloud Ship." }, + [367] = { name = "Snake Charmer", grade = 1, points = 1, description = "By restoring the Everhungry Altar, you charmed the Fire-Feathered Sea Serpent back into its fitful sleep, twenty miles beneath the sea." }, [368] = { name = "Hoard of the Dragon", grade = 1, points = 1, secret = true, description = "Your adventurous way through countless dragon lairs earned you a pretty treasure - and surely the enmity of many a dragon." }, [369] = { name = "Icy Glare", grade = 1, points = 1, description = "Here's looking at you, kid. This ancient creature seems to size you up with its brilliant eyes and barely tolerates you riding it. Maybe it thinks you're the defrosted snack, after all?" }, - [370] = { name = "Knock on Wood", grade = 1, points = 3, description = "It's a wound-up wooden lizard! Well, stranger things have happened, or so you're told. Just hop on and let this wood-and-tin contraption take you anywhere you want to wind down a bit. And hope you don't get hit by lightning underway." }, - [371] = { name = "Lion King", grade = 1, points = 1, description = "By mastering the secrets of Lion's Rock, you proved yourself worthy to face the mighty lions there. One of them even chose to accompany you." }, - [372] = { name = "Little Ball of Wool", grade = 1, points = 1, description = "You found a lost sheep and thus a steady source of black wool. But careful: don't get entangled." }, - [373] = { name = "Lost Palace Raider", grade = 1, points = 2, secret = true, description = "Lifting the secrets of a fabulous palace and defeating a beautiful demon princess was a thrilling experience indeed. This site's marvels nearly matched its terrors. Nearly." }, - [374] = { name = "Lovely Dots", grade = 1, points = 3, description = "Finding a four-leaved clover is always a sign of luck. And as luck would have it, you even baited a lovely dotted ladybug. Lucky you!" }, - [375] = { name = "Loyal Lad", grade = 1, points = 1, description = "Having a loyal friend alongside is comforting to every adventurer. If only this lad was not so stubborn..." }, - [376] = { name = "Lucky Horseshoe", grade = 1, points = 1, description = "'Sweets for my steed' could be your motto. An impressive horse is eating out of your hand. Saddle up and be ready to find adventure, new friends, and maybe someone to shoe your horse now and then." }, - [377] = { name = "Luminous Kitty", grade = 1, points = 3, description = "You made some efforts to bring a little more light into the world. And what a nice present you got in return!" }, - [378] = { name = "Magnetised", grade = 1, points = 2, description = "This magnetic beast attracted you in a very literal way. Or was it attracted by your metal equipment? Anyway, you seem to be stuck together now." }, - [379] = { name = "Mind the Dog!", grade = 1, points = 2, description = "Barking dogs never bite, as the saying goes. But this one clearly tried. In the end, however, you were able to walk the dog - ahem, gnarlhound." }, - [380] = { name = "Out of the Stone Age", grade = 1, points = 3, description = "What a blast from the past! This thankful patient thinks you missed your dentist vocation. It's now ready to take a bite of the future and to carry you to your next adventure, or your next patient." }, - [381] = { name = "Pecking Order", grade = 1, points = 1, description = "Ah, the old carrot-on-a-stick trick. Well done! You've made the racing bird accept you as a rider and provider. Just don't feed it your fingers." }, - [382] = { name = "Personal Nightmare", grade = 1, points = 3, description = "It might come as a shock to you, but this is the mount of your dreams. Not exactly the white steed of Prince Charming, but maybe the ladies will still scream and faint at the sight of you." }, - [383] = { name = "Pig-Headed", grade = 1, points = 2, description = "Whoa, sow long! This boar is like a force of nature, breaking through the undergrowth of all the Tibian forests and all records of speed. Hang on!" }, - [384] = { name = "Scales and Tail", grade = 1, points = 2, description = "The Muggy Plains are a dangerous place, often raided by dragons. But that was your luck: thus you found this scaly little guy." }, - [385] = { name = "Slugging Around", grade = 1, points = 2, description = "Drugging a snail can have some beneficial side effects. You're now the proud owner of a snarling, speed-crazy slug. Maybe it'll purr if you stroke it. Anyway, life should be one slick ride from now on." }, - [386] = { name = "Spin-Off", grade = 1, points = 1, description = "Seems like this spider has got a sweet tooth. As a result, eight hairy legs are now at your disposal to crawl and weave at your whim, and strike fear into the hearts of men." }, - [387] = { name = "Starless Night", grade = 1, points = 3, description = "By many it is considered a myth like the Yeti. But you came, saw and tamed it. Now you're the proud rider of a midnight panther, black as a starless night." }, - [388] = { name = "Stuntman", grade = 1, points = 3, description = "A drop of oil and you're good to go. This unique mount will roll merrily in and out of any strange place you want to visit. If you see no exit, you probably ended up in a circus ring. Ah well, the show must go on!" }, - [389] = { name = "Swamp Beast", grade = 1, points = 1, description = "By cleverly using a leech to cool that raging bull's blood, you managed not to get swamped or trampled in a water buffalo stampede. The creature is now docile and follows your every command." }, - [390] = { name = "The Right Tone", grade = 1, points = 1, description = "By setting the right tone you convinced a crystal wolf to accompany you. Remember it is made of crystal, though, so be careful in a banshee's presence." }, - [391] = { name = "Thick-Skinned", grade = 1, points = 2, description = "It's unstoppable! Walls? Fortresses? Obstacles? Objections? Pah! Nothing will stand before the stampor. Arrows and spears bounce off its hide, enemies are trampled by the dozen. Just don't go for the subtle approach or a date on this thing." }, - [392] = { name = "Way to Hell", grade = 1, points = 2, description = "This fiery beast really tried to give you hell. But not even a magma crawler can resist a mug of spicy, hot glow wine. Skol!" }, - - --10.9 - [393] = { name = "Hat Hunter", grade = 2, points = 5, description = "You sucessfully fought against all odds to protect your world from an ascending god! – You weren't there for the hat only after all?" }, - [394] = { name = "Ogre Chef", grade = 1, points = 1, description = "You didn't manage to become an ogre chief. But at least you are, beyond doubt, a worthy ogre chef." }, - [395] = { name = "Rift Warrior", grade = 1, points = 3, description = "You went through hell. Seven times. You defeated the demons. Countless times. You put an end to Ferumbras claims to ascendancy. Once and for all." }, - [396] = { name = "The Call of the Wild", grade = 1, points = 2, description = "You opposed man-eating ogres and clumsy clomps. You grappled with hungry chieftains, desperate goblins and angry spirits. So you truly overcame the wild vastness of Krailos." }, - - --10.94 - [397] = { name = "Ender of the End", grade = 2, points = 5, description = "You have entered the heart of destruction and valiantly defeated the world devourer. By your actions you have postponed the end of the world — at least for a while." }, - [398] = { name = "Vortex Tamer", grade = 2, points = 5, description = "After a long journey and dedication you were favoured by fortune and have tamed all three elusive beasts of the vortex. Unless the Vortexion decides you're a tasty morsel you can enjoy your small stable of ravaging beasts from beyond." }, - - --11.02 - [399] = { name = "Forbidden Fruit", grade = 1, points = 1, secret = true, description = "You could not resist the taste of the forbidden fruit. Since you don't feel changed at all, it couldn't have been that bad after all. Or could it?" }, - [400] = { name = "Forbidden Knowledge", grade = 1, points = 1, secret = true, description = "Perhaps with so much acquired knowledge, never meant for you, you know even when to stop! Time will tell whether this knowledge will do more harm or good." }, - [401] = { name = "Rhino Rider", grade = 1, points = 1, description = "Don't forget, even your rhino sometimes needs a hug. A careful one in this case." }, - - --11.03 - [402] = { name = "Treasure Hunter", grade = 1, points = 3, description = "You wandered the world of Tibia in search of the ancient dragons' hoards. You are sure, you found them all." }, - - --11.40 - [403] = { name = "Corruption Contained", grade = 2, points = 5, description = "You have managed to stall the worst incursion of corruption. Still this is just one battle won in an all out war for your world." }, - [404] = { name = "Fairy Teasing", grade = 1, points = 1, secret = true, description = "Teasing fairies is fun. They leave behind such pretty clouds of glittering dust when chased. Just hope they don't get you back for it." }, - [405] = { name = "Toothfairy Assistant", grade = 1, points = 1, description = "You assisted a very prominent fae and you fought tooth and nail to earn this title." }, - - --11.50 - [406] = { name = "Buried the Baron", grade = 1, points = 1, description = "You defeated the Baron from Below and destroyed his lava pump!" }, + [370] = { name = "Little Ball of Wool", grade = 1, points = 1, description = "You found a lost sheep and thus a steady source of black wool. But careful: don't get entangled." }, + [371] = { name = "Luminous Kitty", grade = 1, points = 3, description = "You made some efforts to bring a little more light into the world. And what a nice present you got in return!" }, + [372] = { name = "The Right Tone", grade = 1, points = 1, description = "By setting the right tone you convinced a crystal wolf to accompany you. Remember it is made of crystal, though, so be careful in a banshee's presence." }, + [373] = { name = "Loyal Lad", grade = 1, points = 1, description = "Having a loyal friend alongside is comforting to every adventurer. If only this lad was not so stubborn..." }, + [374] = { name = "Dragon Mimicry", grade = 1, points = 2, description = "It's not really a dragon, but rather a kind of chimera. Nonetheless a decent mount to impress any passer-by." }, + [375] = { name = "Scales and Tail", grade = 1, points = 2, description = "The Muggy Plains are a dangerous place, often raided by dragons. But that was your luck: thus you found this scaly little guy." }, + [376] = { name = "Fata Morgana", grade = 1, points = 2, description = "There are many delusions and phantasms in the desert. You saw a false oasis with fruit-bearing palm trees. Instead of water and refreshment, however, you found a dromedary in the end. What a useful Fata Morgana!" }, + [377] = { name = "Fabled Construction", grade = 1, points = 3, description = "Finding all the pieces to this complicated vehicle was one kind of a challenge. However, what you built in the end is rather a fabled than a feeble construction." }, + [378] = { name = "Mind the Dog!", grade = 1, points = 2, description = "Barking dogs never bite, as the saying goes. But this one clearly tried. In the end, however, you were able to walk the dog - ahem, gnarlhound." }, + [379] = { name = "Magnetised", grade = 1, points = 2, description = "This magnetic beast attracted you in a very literal way. Or was it attracted by your metal equipment? Anyway, you seem to be stuck together now." }, + [380] = { name = "Golden Sands", grade = 1, points = 3, description = "Counting ten thousand grains of sand could not have been harder than gaining this impressive mount." }, + [381] = { name = "Friend of Elves", grade = 1, points = 1, description = "Kingly deer mostly prefer elves as friends and familiars. This one, however, decided to favour you as a confidant and rider. Well done!" }, + [382] = { name = "Lovely Dots", grade = 1, points = 3, description = "Finding a four-leaved clover is always a sign of luck. And as luck would have it, you even baited a lovely dotted ladybug. Lucky you!" }, + [383] = { name = "Way to Hell", grade = 1, points = 2, description = "This fiery beast really tried to give you hell. But not even a magma crawler can resist a mug of spicy, hot glow wine. Skol!" }, + [384] = { name = "Beneath the Sea", grade = 1, points = 3, description = "Not really twenty thousand miles, but you had to dive a fair way beneath the sea to find your personal Manta Ray." }, + [385] = { name = "Starless Night", grade = 1, points = 3, description = "By many it is considered a myth like the Yeti. But you came, saw and tamed it. Now you're the proud rider of a midnight panther, black as a starless night." }, + [386] = { name = "Lion King", grade = 1, points = 1, description = "By mastering the secrets of Lion's Rock, you proved yourself worthy to face the mighty lions there. One of them even chose to accompany you." }, + [387] = { name = "Pecking Order", grade = 1, points = 1, description = "Ah, the old carrot-on-a-stick trick. Well done! You've made the racing bird accept you as a rider and provider. Just don't feed it your fingers." }, + [388] = { name = "Pig-Headed", grade = 1, points = 2, description = "Whoa, sow long! This boar is like a force of nature, breaking through the undergrowth of all the Tibian forests and all records of speed. Hang on!" }, + [389] = { name = "Personal Nightmare", grade = 1, points = 3, description = "It might come as a shock to you, but this is the mount of your dreams. Not exactly the white steed of Prince Charming, but maybe the ladies will still scream and faint at the sight of you." }, + [390] = { name = "Thick-Skinned", grade = 1, points = 2, description = "It's unstoppable! Walls? Fortresses? Obstacles? Objections? Pah! Nothing will stand before the stampor. Arrows and spears bounce off its hide, enemies are trampled by the dozen. Just don't go for the subtle approach or a date on this thing." }, + [391] = { name = "Chequered Teddy", grade = 1, points = 1, description = "Don't let its fluffy appearance deceive you. The panda is a creature of the wild. It will take you to the most distant regions of Tibia, always in hopes of a little bamboo to nibble on or to check on a possible mate." }, + [392] = { name = "Blacknailed", grade = 1, points = 1, description = "Well, you can rest your nailcase now. This gravedigger's fingernails are nice and clean. Though after the next hellride, you might not want to let it hand any food to you." }, + [393] = { name = "Slugging Around", grade = 1, points = 2, description = "Drugging a snail can have some beneficial side effects. You're now the proud owner of a snarling, speed-crazy slug. Maybe it'll purr if you stroke it. Anyway, life should be one slick ride from now on." }, + [394] = { name = "Knock on Wood", grade = 1, points = 3, description = "It's a wound-up wooden lizard! Well, stranger things have happened, or so you're told. Just hop on and let this wood-and-tin contraption take you anywhere you want to wind down a bit. And hope you don't get hit by lightning underway." }, + [395] = { name = "Fried Shrimp", grade = 1, points = 2, description = "This must be underwater love - this enormous crustacean now does thy bidding. Or maybe it's just in it for a little more of that shrimp barbecue, as that's a little hard to come by in the sea." }, + [396] = { name = "Out of the Stone Age", grade = 1, points = 3, description = "What a blast from the past! This thankful patient thinks you missed your dentist vocation. It's now ready to take a bite of the future and to carry you to your next adventure, or your next patient." }, + [397] = { name = "Stuntman", grade = 1, points = 3, description = "A drop of oil and you're good to go. This unique mount will roll merrily in and out of any strange place you want to visit. If you see no exit, you probably ended up in a circus ring. Ah well, the show must go on!" }, + [398] = { name = "Gear Up", grade = 1, points = 3, description = "Installing that control unit was a no-brainer. Now you're in control to make it walk this way or that, or to change tack at any moment if required. Your faithful walker mount obeys your every command." }, + [399] = { name = "Bearbaiting", grade = 1, points = 1, description = "Hunter's greeting! Your skillful use of the slingshot actually stunned a large bear. The creature is slightly dazed, but seems susceptible to your commands. Let's declare open season on all our foes!" }, + [400] = { name = "Lucky Horseshoe", grade = 1, points = 1, description = "'Sweets for my steed' could be your motto. An impressive horse is eating out of your hand. Saddle up and be ready to find adventure, new friends, and maybe someone to shoe your horse now and then." }, + [401] = { name = "Swamp Beast", grade = 1, points = 1, description = "By cleverly using a leech to cool that raging bull's blood, you managed not to get swamped or trampled in a water buffalo stampede. The creature is now docile and follows your every command." }, + [402] = { name = "Spin-Off", grade = 1, points = 1, description = "Seems like this spider has got a sweet tooth. As a result, eight hairy legs are now at your disposal to crawl and weave at your whim, and strike fear into the hearts of men." }, + [403] = { name = "Icy Glare", grade = 1, points = 1, description = "Here's looking at you, kid. This ancient creature seems to size you up with its brilliant eyes and barely tolerates you riding it. Maybe it thinks you're the defrosted snack, after all?" }, + [404] = { name = "Cartography 101", grade = 1, points = 2, description = "You succeeded in finding and charting several previously unexplored landmarks and locations for the Adventurer's Guild, you probably never need to ask anyone for the way - do you?" }, + [405] = { name = "Lost Palace Raider", grade = 1, points = 2, secret = true, description = "Lifting the secrets of a fabulous palace and defeating a beautiful demon princess was a thrilling experience indeed. This site's marvels nearly matched its terrors. Nearly." }, + [406] = { name = "The More the Merrier", grade = 0, points = 0, secret = true, description = "It's dangerous to go alone... Take ten friends." }, [407] = { name = "Contender", grade = 1, points = 3, description = "You have fully unlocked 10 medium monsters in the cyclopedia." }, - [408] = { name = "Death in the Depths", grade = 1, points = 2, description = "The Baron from Below, Duke of the Depths and the Count of the Core are no more!" }, + [408] = { name = "Rift Warrior", grade = 1, points = 3, description = "You went through hell. Seven times. You defeated the demons. Countless times. You put an end to Ferumbras claims to ascendancy. Once and for all." }, [409] = { name = "Duked It Out", grade = 1, points = 1, description = "You defeated the Duke of the Depths and destroyed his lava pump!" }, - [410] = { name = "His Days are Counted", grade = 1, points = 1, description = "You defeated the Count of the Core and destroyed his lava pump!" }, - [411] = { name = "Hunting Permit", grade = 1, points = 1, description = "You have fully unlocked your very first monster in the cyclopedia." }, - [412] = { name = "Little Adventure", grade = 1, points = 1, description = "You have fully unlocked 10 easy monsters in the cyclopedia." }, - [413] = { name = "Little Big Adventure", grade = 1, points = 2, secret = true, description = "You have fully unlocked 100 easy monsters in the cyclopedia." }, - [414] = { name = "Master Hunter", grade = 2, points = 6, secret = true, description = "You have fully unlocked 100 hard monsters in the cyclopedia." }, - [415] = { name = "Over the Moon", grade = 2, points = 5, description = "The Curse of the Full Moon transforms harmless citizens into feral beasts. But with your help, Edron and Cormaya are safe - fairly." }, - [416] = { name = "Scourge of Scarabs", grade = 1, points = 3, description = "You took the heat and defeated the Ancient Spawn of Morgathla!" }, - [417] = { name = "Serious Contender", grade = 2, points = 4, secret = true, description = "You have fully unlocked 100 medium monsters in the cyclopedia." }, - [418] = { name = "Skilled Hunter", grade = 2, points = 5, description = "You have fully unlocked 10 hard monsters in the cyclopedia." }, - - --11.80 - [419] = { name = "All Hail the King", grade = 1, points = 1, description = "Old temples, a meadowy countryside and the splendour of Thais - you really know every corner of King Tibianus' realm now." }, - [420] = { name = "Ancient Splendor", grade = 1, points = 1, description = "You've braved the perils of Yalahar and learned of its gloomy shadows of long gone greatness." }, - [421] = { name = "Battle Mage", grade = 2, points = 6, description = "Wielding dangerous knowledge as well as the sword is your expertise. You have proven yourself versatile in all manner of situations." }, - [422] = { name = "Bibliomaniac", grade = 1, points = 3, description = "You passion for reading was somewhat diminished by biting books and aggressive quills. But this flying specimen proved to be a loyal companion. Never judge a book by its cover!" }, + [410] = { name = "Hat Hunter", grade = 2, points = 5, description = "You sucessfully fought against all odds to protect your world from an ascending god! – You weren't there for the hat only after all?" }, + [411] = { name = "Ogre Chef", grade = 1, points = 1, description = "You didn't manage to become an ogre chief. But at least you are, beyond doubt, a worthy ogre chef." }, + [412] = { name = "The Call of the Wild", grade = 1, points = 2, description = "You opposed man-eating ogres and clumsy clomps. You grappled with hungry chieftains, desperate goblins and angry spirits. So you truly overcame the wild vastness of Krailos." }, + [413] = { name = "Ender of the End", grade = 2, points = 5, description = "You have entered the heart of destruction and valiantly defeated the world devourer. By your actions you have postponed the end of the world — at least for a while." }, + [414] = { name = "Vortex Tamer", grade = 2, points = 5, description = "After a long journey and dedication you were favoured by fortune and have tamed all three elusive beasts of the vortex. Unless the Vortexion decides you're a tasty morsel you can enjoy your small stable of ravaging beasts from beyond." }, + [415] = { name = "Rhino Rider", grade = 1, points = 1, description = "Don't forget, even your rhino sometimes needs a hug. A careful one in this case." }, + [416] = { name = "Forbidden Fruit", grade = 1, points = 1, secret = true, description = "You could not resist the taste of the forbidden fruit. Since you don't feel changed at all, it couldn't have been that bad after all. Or could it?" }, + [417] = { name = "Forbidden Knowledge", grade = 1, points = 1, secret = true, description = "Perhaps with so much acquired knowledge, never meant for you, you know even when to stop! Time will tell whether this knowledge will do more harm or good." }, + [418] = { name = "Treasure Hunter", grade = 1, points = 3, secret = true, description = "You wandered the world of Tibia in search of the ancient dragons' hoards. You are sure, you found them all." }, + [419] = { name = "Reason to Celebrate", grade = 1, points = 1, description = "You met the legendary First Dragon and survived. That's a reason to celebrate for sure." }, + [420] = { name = "Toothfairy Assistant", grade = 1, points = 1, description = "You assisted a very prominent fae and you fought tooth and nail to earn this title." }, + [421] = { name = "Fairy Teasing", grade = 1, points = 1, secret = true, description = "Teasing fairies is fun. They leave behind such pretty clouds of glittering dust when chased. Just hope they don't get you back for it." }, + [422] = { name = "Corruption Contained", grade = 2, points = 5, description = "You have managed to stall the worst incursion of corruption. Still this is just one battle won in an all out war for your world." }, [423] = { name = "Daraman's Footsteps", grade = 1, points = 1, description = "You journeyed through Darashia and the sea of sand around it, while fighting the perils of the desert." }, [424] = { name = "Dwarven Mines", grade = 1, points = 1, description = "Vast mines, an orc fortress and the magnificence of Kazordoon - you really know every corner of North-Eastern Mainland now." }, [425] = { name = "Elven Woods", grade = 1, points = 1, description = "Tall trees, deep forests and and the beauty of Ab'Dendriel - you really know every corner of the elven lands now." }, @@ -510,279 +428,233 @@ achievements = { [427] = { name = "High and Dry", grade = 1, points = 2, description = "You asked Captain Charles to take a shortcut quite a few times. Now you are all too familiar with desert islands all over Tibia." }, [428] = { name = "Jewel in the Swamp", grade = 1, points = 1, description = "Damp swamps, a dry desert and the opulence of Venore - you really know every corner of Eastern Mainland now." }, [429] = { name = "King of the Jungle", grade = 1, points = 1, description = "You have searched Port Hope and the jungle that thoroughly, that you are up to adoption by a friendly ape family." }, - [430] = { name = "Liberty Bay Watch", grade = 1, points = 1, description = "A pirate's haven and a burglar's hideout. You found your way around Liberty Bay and its surroundings - land, ho!" }, - [431] = { name = "Library Liberator", grade = 1, points = 3, description = "Though you couldn't prevent the theft of the godbreaker knowledge, you still managed to fight of the invasion of the library and to kill the scourge of oblivion, a powerful servant of the enemy." }, - [432] = { name = "Lizard Kingdom", grade = 1, points = 1, description = "From the southern steppe through the Dragonblaze Mountains and the Muggy Plains to the forbidden city of Razzachai - you really know every corner of Zao now." }, - [433] = { name = "Long Live the Queen", grade = 1, points = 1, description = "Ancient battlefields, amazons and the glory of Carlin - you really know every corner of Queen Eloise's realm now." }, - [434] = { name = "Master Debater", grade = 1, points = 1, secret = true, description = "You truly are the grand master of verbal debate! Now going forth and putting this wisdom to good use in everyday life... is probably debatable." }, - [435] = { name = "Millennial Falcon", grade = 1, points = 3, secret = true, description = "You defeated Grand Master Oberon and the remnants of the Order of the Falcon, no matter the odds." }, - [436] = { name = "Mummy's Dearest", grade = 1, points = 1, description = "You have combed the desert and searched the pyramid city of Ankrahmun." }, - [437] = { name = "Race to the Pole", grade = 1, points = 1, description = "You have expelled the fog of the unknown from the islands of Svargrond. Maybe not as first, but that's not what matters in the end." }, - [438] = { name = "Realms of Dreams", grade = 1, points = 1, description = "Lush meadows, colourful fairies and sentient stones - you really know every corner of Feyrist now." }, - [439] = { name = "Spectulation", grade = 1, points = 1, secret = true, description = "You checked out a strange temple deep in the jungles of Tiquanda. Spectulus was right, it was indeed overrun by strange fish-men you now call Deathlings." }, - [440] = { name = "Stronghold of Edron", grade = 1, points = 1, description = "Strong fortresses, sprawling woods and ivory towers - you really know every corner of Edron now." }, - [441] = { name = "The Ogre Steppe", grade = 1, points = 1, description = "A vast steppe, voracious ogres and dried out salt seas - you really know every corner of Krailos now." }, - [442] = { name = "Trip to the Beach", grade = 1, points = 1, description = "Braving a hive full of unimaginable proportions and its grotesque creatures on the surface is only one side of Gray Beach. Your full trip of the island also included a dive into the black nothingness of the deep sea, facing the wrath of the Njey." }, - [443] = { name = "Twisted Dreams", grade = 1, points = 1, description = "A journey through a dreamscape of evil is no small feat. Yet you traversed the nightmarish lands of Roshamuul and live to tell the tale. Don't fall asleep now..." }, - [444] = { name = "Widely Travelled", grade = 3, points = 7, description = "As a true globetrotter you can now show your colours proudly with this extraordinary outfit." }, - - --11.86 - [445] = { name = "Exalted Battle Mage", grade = 1, points = 2, description = "Not only did you master the battlefield as a mage, you were also induced to the most inner secrets of the art of magical warfare and prevailed." }, - [446] = { name = "Running the Rift", grade = 1, points = 3, description = "You don't just have a permission to ride a rift runner, you literally went through hell and earned it!" }, - - --12.00 - [447] = { name = "Champion of Summer", grade = 1, points = 2, secret = true, description = "You have vanquished numerous arena champions in the name of the Summer Court." }, - [448] = { name = "Champion of Winter", grade = 1, points = 2, secret = true, description = "You have vanquished numerous arena champions in the name of the Winter Court." }, - [449] = { name = "Dream Catcher", grade = 1, points = 3, description = "You are the slayer of the ancient nightmare beast and prevented the nightmare to spread its madness." }, - [450] = { name = "Dream Warrior", grade = 2, points = 6, description = "You became an acquaintance of the courts of dreams and acquired the right to display your new status and title of 'dream warrior'." }, - [451] = { name = "Keeper of the 7 Keys", grade = 1, points = 2, description = "You found the Seven Keys to unlock ... no, not the seven seas. But at least seven doors in the realm of dreams." }, - [452] = { name = "Lacewing Catcher", grade = 1, points = 3, description = "You caught a lacewing moth with your lantern. It will follow you in companionship as the bearer of the lantern will be its guide through the darkness now." }, - [453] = { name = "Moth Whisperer", grade = 1, points = 3, description = "Your lantern was too bewitching for a hibernal moth. It couldn't withstand and follows you, the bearer of the lantern, now." }, - [454] = { name = "Tied the Knot", grade = 1, points = 1, secret = true, description = "You figured out the right order of spells in the buried cathedral, how enchanting!" }, - - --12.02 - [455] = { name = "No Horse Open Sleigh", grade = 1, points = 3, description = "This sleigh is not driven by magic but pushed by a percht. Hopefully you two get along well together...!" }, - [456] = { name = "Raider in the Dark", grade = 2, points = 6, description = "But can you truly be one of them?" }, - - --12.20 - [457] = { name = "A Study in Scarlett", grade = 1, points = 3, secret = true, description = "You ended the regn of Scarlett Etzel. All-seeing yet blind, ever powerful yet ultimately helpless, she never got a second chance to truly see. Or has she..." }, - [458] = { name = "Avid Spectral Reader", grade = 1, points = 1, secret = true, description = "What draws things to other dimensions, one wonders. You read the almanac at just the right spot to end up... where, of all places? That is the problem with dimensional travel: you will never know. Or you have always known. And everything in between." }, - [459] = { name = "Gryphon Rider", grade = 1, points = 3, description = "Unmasking spies, killing demons, discovering omens, solving puzzles and fighting ogres, manticores and feral sphinxes. - Nobody said it was easy to become a gryphon rider." }, - [460] = { name = "Hippofoddermus", grade = 1, points = 1, secret = true, description = "You did the hippo population of Kilmaresh a great favour. A well-fed hippo is a happy hippo." }, - [461] = { name = "Inquisition's Hand", grade = 1, points = 3, secret = true, description = "You defeated the Lich Knights and became the hand of the Inquisition, allowed to wear their special garb." }, - [462] = { name = "Sculptor Apprentice", grade = 1, points = 2, secret = true, description = "Granted, you didn't carve those lifelike animal figurines yourself. But helping a medusa to find proper objects and even watching her using her petrifying gaze is almost as rewarding." }, - [463] = { name = "Sun and Sea", grade = 2, points = 5, description = "You made sure that the balance of sun and sea is preserved in Kilmaresh. The Golden City of Issavi won't forget your favour." }, - [464] = { name = "The Empire's Glory", grade = 1, points = 1, description = "Mythical creatures, forgotten catacombs and the Golden City - you really know every corner of Kilmaresh now." }, - - --12.20.9066 - [465] = { name = "Do a Barrel Roll!", grade = 1, points = 3, description = "Riding a traditional beer barrel from the Orcsoberfest is a once-in-a-lifetime experience. Beer sold separately." }, - [466] = { name = "Orcsoberfest Welcome", grade = 1, points = 3, secret = true, description = 'The Orcsoberfest is not only known for its traditional food, beer and customs but also fun events and excitement! You took part in all of that and can now truly say: "I survived!"' }, - [467] = { name = "Traditionalist", grade = 2, points = 0, description = "You proudly wear the traditional Orcsoberfest garb, same as it ever was and as it always will be." }, - - --12.30 - [468] = { name = "Beyonder", grade = 1, points = 3, description = "Adventurous beyond death, you travelled the Netherworld. Although you had just the ghost of a chance you survived and even came back from the realm of the dead." }, - [469] = { name = "Falconer", grade = 1, points = 3, description = "A true beastmaster learns the language of his animal companions. Now you as well can bolster your unique bond with nature and help preserve the balance of life as a proud falconer." }, - [470] = { name = "Mainstreet Nightmare", grade = 1, points = 2, description = "Now you are able to wander around Tibia wearing an angst-inducing vestment." }, - [471] = { name = "Monsterhunter", grade = 1, points = 2, description = "Fear me, monsters! There is some more slaying to come!" }, + [430] = { name = "Little Adventure", grade = 1, points = 1, description = "You have fully unlocked 10 easy monsters in the cyclopedia." }, + [431] = { name = "Little Big Adventure", grade = 1, points = 2, secret = true, description = "You have fully unlocked 100 easy monsters in the cyclopedia." }, + [432] = { name = "Contender", grade = 1, points = 3, description = "You have fully unlocked 10 medium monsters in the cyclopedia." }, + [433] = { name = "Serious Contender", grade = 2, points = 4, secret = true, description = "You have fully unlocked 100 medium monsters in the cyclopedia." }, + [434] = { name = "Skilled Hunter", grade = 2, points = 5, description = "You have fully unlocked 10 hard monsters in the cyclopedia." }, + [435] = { name = "Master Hunter", grade = 2, points = 6, secret = true, description = "You have fully unlocked 100 hard monsters in the cyclopedia." }, + [436] = { name = "Hunting Permit", grade = 1, points = 1, description = "You have fully unlocked your very first monster in the cyclopedia." }, + [437] = { name = "Over the Moon", grade = 2, points = 5, description = "The Curse of the Full Moon transforms harmless citizens into feral beasts. But with your help, Edron and Cormaya are safe - fairly." }, + [438] = { name = "His Days are Counted", grade = 1, points = 1, description = "You defeated the Count of the Core and destroyed his lava pump!" }, + [439] = { name = "Duked It Out", grade = 1, points = 1, description = "You defeated the Duke of the Depths and destroyed his lava pump!" }, + [440] = { name = "Buried the Baron", grade = 1, points = 1, description = "You defeated the Baron from Below and destroyed his lava pump!" }, + [441] = { name = "Death in the Depths", grade = 1, points = 2, description = "The Baron from Below, Duke of the Depths and the Count of the Core are no more!" }, + [442] = { name = "Scourge of Scarabs", grade = 1, points = 3, description = "You took the heat and defeated the Ancient Spawn of Morgathla!" }, + [443] = { name = "Cobbled and Patched", grade = 2, points = 6, description = "Exploring the depths of Tibia can be a dangerous task. Surprisingly, some crude wood planks, rusty nails and a tinged pot can offer a sufficient protection against the creatures lurking in the deep." }, + [444] = { name = "Up the Molehill", grade = 1, points = 3, description = "Putting this candle stump on your new mount was kind of a waiting game. You're even tempted to call it whack-a-mole. But in the end you found a loyal companion for your journeys into the depths." }, + [445] = { name = "Master Debater", grade = 1, points = 1, secret = true, description = "You truly are the grand master of verbal debate! Now going forth and putting this wisdom to good use in everyday life... is probably debatable." }, + [446] = { name = "High and Dry", grade = 1, points = 2, secret = true, description = "You asked Captain Charles to take a shortcut quite a few times. Now you are all too familiar with desert islands all over Tibia." }, + [447] = { name = "Elven Woods", grade = 1, points = 1, description = "Tall trees, deep forests and and the beauty of Ab'Dendriel - you really know every corner of the elven lands now." }, + [448] = { name = "Long Live the Queen", grade = 1, points = 1, description = "Ancient battlefields, amazons and the glory of Carlin - you really know every corner of Queen Eloise's realm now." }, + [449] = { name = "Stronghold of Edron", grade = 1, points = 1, description = "Strong fortresses, sprawling woods and ivory towers - you really know every corner of Edron now." }, + [450] = { name = "Dwarven Mines", grade = 1, points = 1, description = "Vast mines, an orc fortress and the magnificence of Kazordoon - you really know every corner of North-Eastern Mainland now." }, + [451] = { name = "All Hail the King", grade = 1, points = 1, description = "Old temples, a meadowy countryside and the splendour of Thais - you really know every corner of King Tibianus' realm now." }, + [452] = { name = "Jewel in the Swamp", grade = 1, points = 1, description = "Damp swamps, a dry desert and the opulence of Venore - you really know every corner of Eastern Mainland now." }, + [453] = { name = "The Ogre Steppe", grade = 1, points = 1, description = "A vast steppe, voracious ogres and dried out salt seas - you really know every corner of Krailos now." }, + [454] = { name = "Realms of Dreams", grade = 1, points = 1, description = "Lush meadows, colourful fairies and sentient stones - you really know every corner of Feyrist now." }, + [455] = { name = "Mummy's Dearest", grade = 1, points = 1, description = "You have combed the desert and searched the pyramid city of Ankrahmun." }, + [456] = { name = "Daraman's Footsteps", grade = 1, points = 1, description = "You journeyed through Darashia and the sea of sand around it, while fighting the perils of the desert." }, + [457] = { name = "King of the Jungle", grade = 1, points = 1, description = "You have searched Port Hope and the jungle that thoroughly, that you are up to adoption by a friendly ape family." }, + [458] = { name = "Ancient Splendor", grade = 1, points = 1, description = "You've braved the perils of Yalahar and learned of its gloomy shadows of long gone greatness." }, + [459] = { name = "Liberty Bay Watch", grade = 1, points = 1, description = "A pirate's haven and a burglar's hideout. You found your way around Liberty Bay and its surroundings - land, ho!" }, + [460] = { name = "Race to the Pole", grade = 1, points = 1, description = "You have expelled the fog of the unknown from the islands of Svargrond. Maybe not as first, but that's not what matters in the end." }, + [461] = { name = "Lizard Kingdom", grade = 1, points = 1, description = "From the southern steppe through the Dragonblaze Mountains and the Muggy Plains to the forbidden city of Razachai - you really know every corner of Zao now." }, + [462] = { name = "Trip to the Beach", grade = 1, points = 1, description = "Braving a hive full of unimaginable proportions and its grotesque creatures on the surface is only one side of Gray Beach. Your full trip of the island also included a dive into the black nothingness of the deep sea, facing the wrath of the Njey." }, + [463] = { name = "Glooth Punk", grade = 1, points = 1, description = "Glooth is the substance that powers a whole continent and all its weird inhabitants, workshops and factories. You travelled this strange smorgasbord of curiosities in its entirety - just in time for tea." }, + [464] = { name = "Twisted Dreams", grade = 1, points = 1, description = "A journey through a dreamscape of evil is no small feat. Yet you traversed the nightmarish lands of Roshamuul and live to tell the tale. Don't fall asleep now..." }, + [465] = { name = "Library Liberator", grade = 1, points = 3, description = "Though you couldn't prevent the theft of the godbreaker knowledge, you still managed to fight off the invasion of the library and to kill the scourge of oblivion, a powerful servant of the enemy." }, + [466] = { name = "Spectulation", grade = 1, points = 1, secret = true, description = "You checked out a strange temple deep in the jungles of Tiquanda. Spectulus was right, it was indeed overrun by strange fish-men you now call Deathlings." }, + [467] = { name = "Millennial Falcon", grade = 1, points = 3, secret = true, description = "You defeated Grand Master Oberon and the remnants of the Order of the Falcon, no matter the odds." }, + [468] = { name = "Bibliomaniac", grade = 1, points = 3, description = "You passion for reading was somewhat diminished by biting books and aggressive quills. But this flying specimen proved to be a loyal companion. Never judge a book by its cover!" }, + [469] = { name = "Battle Mage", grade = 2, points = 6, description = "Wielding dangerous knowledge as well as the sword is your expertise. You have proven yourself versatile in all manner of situations." }, + [470] = { name = "Widely Travelled", grade = 3, points = 7, description = "As a true globetrotter you can now show your colours proudly with this extraordinary outfit." }, + [471] = { name = "Running the Rift", grade = 1, points = 3, description = "You don't just have a permission to ride a rift runner, you literally went through hell and earned it!" }, [472] = { name = "Nothing but Hot Air", grade = 1, points = 2, description = "You have tamed the ghostly mists to do your bidding. For now ..." }, - [473] = { name = "Prospectre", grade = 1, points = 1, secret = true, description = "You made acquaintance with the Thaian. A strange contemporary with a dark history. No man but a derivate of green and obsession." }, - [474] = { name = "Steppe Elegance", grade = 1, points = 2, description = "Champion of the wildlands, a swift strider among the creatures of the wild. The elegant nature of the gallop, this envoy of speed has mastered, indicates the precise understanding of its terrain and environment." }, - [475] = { name = "Taskmaster", grade = 1, points = 2, description = "Having hunted and bested them all, you live for the thrill of the hunt!" }, - [476] = { name = "Verminbane", grade = 1, points = 2, description = "And so it begins!" }, - - --Custom - [477] = { name = "Waypoint Explorer", grade = 1, points = 1, description = "You've explored all the towns of Tibia and discovered each town's waypoint." }, - [478] = { name = "Up the Molehill", grade = 1, points = 3, description = "Putting this candle stump on your new mount was kind of a waiting game. You're even tempted to call it whack-a-mole. But in the end you found a loyal companion for your journeys into the depths." }, - [479] = { name = "Inquisition's Arm", grade = 1, points = 2, description = "Your special outfit, bestowed exclusively on a dedicated hand of the Inquisition, is now complete." }, - - --12.60 - [480] = { name = "Honorary Rascoohan", grade = 1, points = 2, description = "When in Rascacoon, do as the Rascoohans do!" }, - [481] = { name = "Release the Kraken", grade = 1, points = 3, description = "Riding around on this squishy companion gives you the feeling of flying through the air... uhm... swimming through the seven seas!" }, + [473] = { name = "Exalted Battle Mage", grade = 1, points = 2, description = "Not only did you master the battlefield as a mage, you were also induced to the most inner secrets of the art of magical warfare and prevailed." }, + [474] = { name = "Areas of Effect", grade = 1, points = 3, secret = true, description = "Wisely contributing your resources to areas, you pushed creatures to maximum effect, allowing improved respawn for everyone! Well done!" }, + [475] = { name = "Tied the Knot", grade = 1, points = 1, secret = true, description = "You figured out the right order of spells in the buried cathedral, how enchanting!" }, + [476] = { name = "Keeper of the 7 Keys", grade = 1, points = 2, description = "You found the Seven Keys to unlock ... no, not the seven seas. But at least seven doors in the realm of dreams." }, + [477] = { name = "Dream Warrior", grade = 2, points = 6, description = "You became an acquaintance of the courts of dreams and acquired the right to display your new status and title of 'dream warrior'." }, + [478] = { name = "Moth Whisperer", grade = 1, points = 3, description = "Your lantern was too bewitching for a hibernal moth. It couldn't withstand and follows you, the bearer of the lantern, now." }, + [479] = { name = "Lacewing Catcher", grade = 1, points = 3, description = "You caught a lacewing moth with your lantern. It will follow you in companionship as the bearer of the lantern will be its guide through the darkness now." }, + [480] = { name = "No Horse Open Sleigh", grade = 1, points = 3, description = "This sleigh is not driven by magic but pushed by a percht. Hopefully you two get along well together...!" }, + [481] = { name = "Raider in the Dark", grade = 2, points = 6, description = "But can you truly be one of them?" }, + [482] = { name = "Dream Catcher", grade = 1, points = 3, description = "You are the slayer of the ancient nightmare beast and prevented the nightmare to spread its madness." }, + [483] = { name = "Champion of Summer", grade = 1, points = 2, secret = true, description = "You have vanquished numerous arena champions in the name of the Summer Court." }, + [484] = { name = "Champion of Winter", grade = 1, points = 2, secret = true, description = "You have vanquished numerous arena champions in the name of the Winter Court." }, + [485] = { name = "Allow Cookies?", grade = 2, points = 6, description = "With a perfectly harmless smile, you tricked all the funny guys into eating your exploding cookies. Next time you pull this prank, consider wearing a Boy Scout outfit to make it even better." }, + [486] = { name = "Bewitcher", grade = 2, points = 5, secret = true, description = "You literally put everything in that cauldron except lilac and gooseberries." }, + [487] = { name = "Gryphon Rider", grade = 1, points = 3, description = "Unmasking spies, killing demons, discovering omens, solving puzzles and fighting ogres, manticores and feral sphinxes. - Nobody said it was easy to become a gryphon rider." }, + [488] = { name = "Sculptor Apprentice", grade = 1, points = 2, secret = true, description = "Granted, you didn't carve those lifelike animal figurines yourself. But helping a medusa to find proper objects and even watching her using her petrifying gaze is almost as rewarding." }, + [489] = { name = "Sun and Sea", grade = 2, points = 5, description = "You made sure that the balance of sun and sea is preserved in Kilmaresh. The Golden City of Issavi won't forget your favour." }, + [490] = { name = "A Study in Scarlett", grade = 1, points = 3, secret = true, description = "You ended the regn of Scarlett Etzel. All-seeing yet blind, ever powerful yet ultimately helpless, she never got a second chance to truly see. Or has she..." }, + [491] = { name = "Avid Spectral Reader", grade = 1, points = 1, secret = true, description = "What draws things to other dimensions, one wonders. You read the almanac at just the right spot to end up... where, of all places? That is the problem with dimensional travel: you will never know. Or you have always known. And everything in between." }, + [492] = { name = "Hippofoddermus", grade = 1, points = 1, secret = true, description = "You did the hippo population of Kilmaresh a great favour. A well-fed hippo is a happy hippo." }, + [493] = { name = "Inquisition's Hand", grade = 1, points = 3, description = "You defeated the Lich Knights and became the hand of the Inquisition, allowed to wear their special garb." }, + [494] = { name = "The Empire's Glory", grade = 1, points = 1, description = "Mythical creatures, forgotten catacombs and the Golden City - you really know every corner of Kilmaresh now." }, + [495] = { name = "Inquisition's Arm", grade = 1, points = 2, description = "Your special garb, solely awarded to a dedicated Hand of the Inquisition, is now complete." }, + [496] = { name = "Traditionalist", grade = 2, points = 6, description = "You proudly wear the traditional Orcsoberfest garb, same as it ever was and as it always will be." }, + [497] = { name = "Do a Barrel Roll!", grade = 1, points = 3, description = "Riding a traditional beer barrel from the Orcsoberfest is a once-in-a-lifetime experience. Beer sold separately." }, + [499] = { name = "Orcsoberfest Welcome", grade = 1, points = 3, secret = true, description = 'The Orcsoberfest is not only known for its traditional food, beer and customs but also fun events and excitement! You took part in all of that and can now truly say: "I survived!"' }, + [500] = { name = "Prospectre", grade = 1, points = 1, secret = true, description = "You made acquaintance with the Thaian. A strange contemporary with a dark history. No man but a derivate of greed and obsession." }, + [501] = { name = "Nothing but Hot Air", grade = 1, points = 3, description = "You have tamed the ghostly mists to do your bidding. For now ..." }, + [502] = { name = "Verminbane", grade = 1, points = 1, description = "And so it begins!" }, + [503] = { name = "Monsterhunter", grade = 1, points = 2, description = "Fear me, monsters! There is some more slaying to come!" }, + [504] = { name = "Taskmaster", grade = 1, points = 3, description = "Having hunted and bested them all, you live for the thrill of the hunt!" }, + [505] = { name = "Mainstreet Nightmare", grade = 1, points = 2, description = "Now you are able to wander around Tibia wearing an angst-inducing vestment." }, + [506] = { name = "Falconer", grade = 1, points = 2, description = "A true beastmaster learns the language of his animal companions. Now you as well can bolster your unique bond with nature and help preserve the balance of life as a proud falconer." }, + [507] = { name = "Steppe Elegance", grade = 1, points = 3, description = "Champion of the wildlands, a swift strider among the creatures of the wild. The elegant nature of the gallop, this envoy of speed has mastered, indicates the precise understanding of its terrain and environment." }, + [508] = { name = "Beyonder", grade = 1, points = 3, description = "Adventurous beyond death, you travelled the Netherworld. Although you had just the ghost of a chance you survived and even came back from the realm of the dead." }, + [510] = { name = "Drama in Darama", grade = 1, points = 3, description = "If a pride of lions and a pack of hyaenas feud, it is not called a catfight but a ... whatsoever. For sure, it caused a lot of drama in the Darama Desert." }, + [511] = { name = "Malefitz", grade = 1, points = 1, secret = true, description = "Made acquaintance with three brothers Fitz." }, + [512] = { name = "Lionheart", grade = 1, points = 3, description = "You bested the maleficent duo Drume and Fugue and restored order to the besieged town of Bounac. You conquered the exotic stronghold of the Order of the Cobra and bested the undead knights of the Order of the Falcon. A true knight in heart and mind." }, + [514] = { name = "You Got Horse Power", grade = 3, points = 8, description = "Brought back to the realm of the living this magnificent creature will carry you through death and everything that lays beyond." }, + [515] = { name = "Unleash the Beast", grade = 3, points = 8, description = "You defeated the manifestation of Goshnar's evil traits by fighting your way through beasts you didn't even want to imagine. It transformed you and now you can also look the part." }, + [516] = { name = "Well Roared, Lion!", grade = 1, points = 1, description = "You helped Domizian and thus proved yourself worthy to enter the werelion sanctum underneath Lion's Rock. You faced the mighty werelions there and one of the rare white lions even chose to accompany you." }, + [518] = { name = "Honorary Rascoohan", grade = 1, points = 2, description = "When in Rascacoon, do as the Rascoohans do!" }, + [519] = { name = "Release the Kraken", grade = 1, points = 3, description = "Riding around on this squishy companion gives you the feeling of flying through the air... uhm... swimming through the seven seas!" }, + [521] = { name = "Pied Piper", grade = 1, points = 3, secret = true, description = "You are not exactly the Pied Piper of Hamelin but at least you managed to fend off a decent amount of pirats and helped to keep them out of the cities." }, + [522] = { name = "Woodcarver", grade = 1, points = 3, secret = true, description = "You defeated Megasylvan Yselda in the wake of the sleeping carnisylvan menace deep under Bounac." }, + [523] = { name = "Bounacean Chivalry", grade = 1, points = 2, secret = true, description = "Yselda forever stands watch against the carnisylvan menace. Ever awake, waiting in the dark, her heart longs to be united with her king once again. Deep empathy let a hero to bring her Kesar's tulip as a token of his love. That hero was you." }, + [524] = { name = "Knowledge Raider", grade = 1, points = 3, description = "Your thirst for knowledge is insatiable. In the task of helping your gnomish friends, flawless execution is just the icing on the cake." }, + [525] = { name = "Citizen of Issavi", grade = 1, points = 2, description = "It was not the first time that you helped the Sapphire Blade or the Midnight Flame with a difficult task. You may now wear the Kilmareshian robes as well as the tagralt blade and the eye-embroidered veil of the seers as a sign of Issavi's gratitude." }, + [527] = { name = "Hot on the Trail", grade = 1, points = 3, description = "Since it is fireproof, this flaming creature feels right at home in raging infernos. But remember: just because it doesn't burn, you still do!" }, + [528] = { name = "Shell We Take a Ride", grade = 1, points = 3, description = "Equipped with the shell of a tortoise and claws of a lobster this insect like companion will help you through every hardship." }, + [529] = { name = "Phantastic!", grade = 1, points = 3, description = "This mighty pachyderm will march into battle as if just taking its Sunday stroll. The cost of friendship was only a few drome points!" }, + [530] = { name = "Some Like It Hot", grade = 1, points = 2, description = "You have braved the searing heat in the tunnels deep below Kazordoon and vanquished the Brainstealer. The voices inside your head are finally silenced." }, + [531] = { name = "First Achievement", grade = 1, points = 1, secret = true, description = "Congratulations to your very first achievement! ... Well, not really. But imagine, it is. Because at this point during your journey into Tibia's past, achievements have been introduced." }, + [532] = { name = "Sharp Dressed", grade = 1, points = 2, description = "Just everyone will be crazy about you if you are wearing this formal dress. They will come running, promise!" }, + [533] = { name = "Engine Driver", grade = 1, points = 3, description = "This glooth-driven locomotive will bring you to any party in the blink of an eye." }, +} - -- 12.90 - [482] = { name = "Friendly Fire", grade = 1, points = 2, description = "You mastered the fire and tamed a supervulcano!" }, +--[[ - -- - [483] = { name = "Dream Warrior", grade = 2, points = 6, description = "You became an acquaintance of the courts of dreams and acquired the right to display your new status and title of 'dream warrior'." }, -} +Functions: + Game.getAchievementInfoById(achievement_id) + Game.getAchievementInfoByName(achievement_name) + Game.getSecretAchievements() + Game.getPublicAchievements() + Game.getAchievements() + Game.isAchievementSecret(achievement_id/name) + Player:addAchievement(achievement_id/name[, showMsg]) + Player:removeAchievement(achievement_id/name) + Player:hasAchievement(achievement_id/name) + Player:addAllAchievements([showMsg]) + Player:removeAllAchievements() + Player:getSecretAchievements() + Player:getPublicAchievements() + Player:getAchievements() + Player:getAchievementPoints() +]] ACHIEVEMENT_FIRST = 1 -ACHIEVEMENT_LAST = #achievements +ACHIEVEMENT_LAST = #ACHIEVEMENTS -function getAchievementInfoById(id) - for k, v in pairs(achievements) do - if k == id then - local t = {} - t.id = k - t.actionStorage = ACHIEVEMENTS_ACTION_BASE + k - for inf, it in pairs(v) do - t[inf] = it - end - return t - end +for id, achievTable in pairs(ACHIEVEMENTS) do + if achievTable.name == nil then + logger.error(string.format("[Achievements registration] - Invalid achievement with no name, id: '%s'", id)) + goto continue -- Skips to the next iteration using the 'continue' label end - return false -end -function getAchievementInfoByName(name) - for k, v in pairs(achievements) do - if v.name:lower() == name:lower() then - local t = {} - t.id = k - t.actionStorage = ACHIEVEMENTS_ACTION_BASE + k - for inf, it in pairs(v) do - t[inf] = it - end - return t - end + if achievTable.description == nil then + logger.error(string.format("[Achievements registration] - Invalid achievement with no description, id: '%s'", id)) + goto continue -- Skips to the next iteration end - return false -end -function getSecretAchievements() - local t = {} - for k, v in pairs(achievements) do - if v.secret then - t[#t + 1] = k - end - end - return t -end + -- Set default values for 'secret', 'grade', and 'points' if not present + local secret = achievTable.secret or false + local grade = achievTable.grade or 0 + local points = achievTable.points or 0 -function getPublicAchievements() - local t = {} - for k, v in pairs(achivements) do - if not v.secret then - t[#t + 1] = k - end - end - return t -end + logger.trace("[Achievements registration] - Registering achievement '{}' with id '{}'", achievTable.name, id) + Game.registerAchievement(id, achievTable.name, achievTable.description, secret, grade, points) -function getAchievements() - return achievements + ::continue:: -- Label used by 'goto' to continue the loop end -function isAchievementSecret(ach) - local achievement - if isNumber(ach) then - achievement = getAchievementInfoById(ach) +function Game.isAchievementSecret(achievement) + local foundAchievement + if isNumber(achievement) then + foundAchievement = Game.getAchievementInfoById(achievement) else - achievement = getAchievementInfoByName(ach) + foundAchievement = Game.getAchievementInfoByName(achievement) end - if not achievement then - return logger.error("[isAchievementSecret] - Invalid achievement '{}'", ach) and false + if not foundAchievement then + return Spdlog.error(string.format("[isAchievementSecret] - Invalid achievement '%s'", ach)) and false end return achievement.secret end -function Player.hasAchievement(self, ach) - local achievement - if isNumber(ach) then - achievement = getAchievementInfoById(ach) - else - achievement = getAchievementInfoByName(ach) - end - if not achievement then - return logger.error("[Player.hasAchievement] - Invalid achievement '{}'.", ach) and false - end - - return self:getStorageValue(ACHIEVEMENTS_BASE + achievement.id) > 0 -end - function Player.getAchievements(self) - local t = {} - for k = 1, #achievements do - if self:hasAchievement(k) then - t[#t + 1] = k - end - end - return t -end - -function Player.addAchievement(self, ach, denyMsg) - local achievement - if isNumber(ach) then - achievement = getAchievementInfoById(ach) - else - achievement = getAchievementInfoByName(ach) - end - if not achievement then - return logger.error("[Player.addAchievement] - Invalid achievement '{}'.", ach) and false - end - - if not self:hasAchievement(achievement.id) then - self:setStorageValue(ACHIEVEMENTS_BASE + achievement.id, 1) - self:sendTakeScreenshot(SCREENSHOT_TYPE_ACHIEVEMENT) - if not denyMsg then - self:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'Congratulations! You earned the achievement "' .. achievement.name .. '".') + local unlockedAchievements = {} + local index = 1 + for achievIdentifier = 1, #ACHIEVEMENTS do + if self:hasAchievement(achievIdentifier) then + unlockedAchievements[index] = achievIdentifier + index = index + 1 end end - return true -end - -function Player.removeAchievement(self, ach) - local achievement - if isNumber(ach) then - achievement = getAchievementInfoById(ach) - else - achievement = getAchievementInfoByName(ach) - end - if not achievement then - return logger.error("[Player.removeAchievement] - Invalid achievement '{}'.", ach) and false - end - - if self:hasAchievement(achievement.id) then - self:setStorageValue(ACHIEVEMENTS_BASE + achievement.id, -1) - end - return true + return unlockedAchievements end function Player.addAllAchievements(self, denyMsg) - for i = ACHIEVEMENT_FIRST, ACHIEVEMENT_LAST do - self:addAchievement(i, denyMsg) + for achievIdentifier = ACHIEVEMENT_FIRST, ACHIEVEMENT_LAST do + self:addAchievement(achievIdentifier, denyMsg) end return true end function Player.removeAllAchievements(self) - for k = 1, #achievements do - if self:hasAchievement(k) then - self:removeAchievement(k) + for achievIdentifier = 1, #ACHIEVEMENTS do + if self:hasAchievement(achievIdentifier) then + self:removeAchievement(achievIdentifier) end end return true end function Player.getSecretAchievements(self) - local t = {} - for k, v in pairs(achievements) do - if self:hasAchievement(k) and v.secret then - t[#t + 1] = k + local unlockedSecretAchievements = {} + for achievIdentifier, achievementDetails in pairs(ACHIEVEMENTS) do + if self:hasAchievement(achievIdentifier) and achievementDetails.secret then + unlockedSecretAchievements[#unlockedSecretAchievements + 1] = achievIdentifier end end - return t + return unlockedSecretAchievements end function Player.getPublicAchievements(self) - local t = {} - for k, v in pairs(achievements) do - if self:hasAchievement(k) and not v.secret then - t[#t + 1] = k + local unlockedPublicAchievements = {} + for achievIdentifier, achievementDetails in pairs(ACHIEVEMENTS) do + if self:hasAchievement(achievIdentifier) and not achievementDetails.secret then + unlockedPublicAchievements[#unlockedPublicAchievements + 1] = achievIdentifier end end - return t + return unlockedPublicAchievements end -function Player.getAchievementPoints(self) - local points = 0 - local list = self:getAchievements() - if #list > 0 then --has achievements - for i = 1, #list do - local a = getAchievementInfoById(list[i]) - if a.points > 0 then --avoid achievements with unknow points - points = points + a.points - end - end +function Player.addAchievementProgress(self, achievement, totalProgress) + local foundAchievement = isNumber(achievement) and Game.getAchievementInfoById(achievement) or Game.getAchievementInfoByName(achievement) + if not foundAchievement then + logger.error("[Player.addAchievementProgress] - Invalid achievement '{}'", achievement) + return end - return points -end -function Player.addAchievementProgress(self, ach, value) - local achievement = isNumber(ach) and getAchievementInfoById(ach) or getAchievementInfoByName(ach) - if not achievement then - logger.error("[Player.addAchievementProgress] - Invalid achievement '{}'.", ach) - return true + local achievScope = self:kv():scoped("achievements") + local achievScopeName = tostring(foundAchievement.name .. "-progress") + local progressNumber = achievScope:get(achievScopeName) or 0 + local newProgress = progressNumber + 1 + if newProgress > totalProgress then + return end - local storage = ACHIEVEMENTS_ACTION_BASE + achievement.id - local progress = self:getStorageValue(storage) - if progress < value then - self:setStorageValue(storage, math.max(1, progress) + 1) - elseif progress == value then - self:setStorageValue(storage, value + 1) - self:addAchievement(achievement.id) + if newProgress == totalProgress then + self:addAchievement(foundAchievement.id) + logger.debug("[Player.addAchievementProgress] - Achievement '{}' completed", foundAchievement.name) end - return true + + logger.debug("[Player.addAchievementProgress] - Achievement '{}' progress updated to '{}', total progress '{}'", foundAchievement.name, newProgress, totalProgress) + achievScope:set(achievScopeName, newProgress) end diff --git a/data/scripts/lib/register_actions.lua b/data/scripts/lib/register_actions.lua index 1522ad20417..25d23f1926d 100644 --- a/data/scripts/lib/register_actions.lua +++ b/data/scripts/lib/register_actions.lua @@ -407,7 +407,7 @@ function onUseRope(player, item, fromPosition, target, toPosition, isHotkey) end local tile = Tile(toPosition) - if tile:isRopeSpot() then + if tile and tile:isRopeSpot() then player:teleportTo(toPosition:moveUpstairs()) if target.itemid == 7762 then if player:getStorageValue(Storage.RookgaardTutorialIsland.TutorialHintsStorage) < 22 then @@ -471,6 +471,7 @@ function onUseShovel(player, item, fromPosition, target, toPosition, isHotkey) return true end player:teleportTo(toPosition, false) + player:addAchievementProgress("The Undertaker", 500) elseif target.itemid == 1822 and target:getPosition() == Position(33222, 31100, 7) then player:teleportTo(Position(33223, 31100, 8)) elseif table.contains({ 231, 231 }, target.itemid) then @@ -480,6 +481,7 @@ function onUseShovel(player, item, fromPosition, target, toPosition, isHotkey) target:decay() elseif rand == 1 then Game.createItem(3042, 1, toPosition) + player:addAchievementProgress("Gold Digger", 100) elseif rand > 95 then Game.createMonster("Scarab", toPosition) end @@ -625,6 +627,7 @@ function onUsePick(player, item, fromPosition, target, toPosition, isHotkey) end target:getPosition():sendMagicEffect(CONST_ME_BLOCKHIT) target:remove(1) + player:addAchievementProgress("Petrologist", 100) elseif target.itemid == 7200 then target:transform(7236) target:decay() diff --git a/data/scripts/lib/register_lever_tables.lua b/data/scripts/lib/register_lever_tables.lua index ce8ad6a02b8..66a78f42a11 100644 --- a/data/scripts/lib/register_lever_tables.lua +++ b/data/scripts/lib/register_lever_tables.lua @@ -10,5 +10,5 @@ AscendingFerumbrasConfig = { days = 3, range = 20, time = 60, -- time in minutes to remove the player - vortex = 23482, + vortex = 23726, } diff --git a/data/scripts/movements/claw_of_the_noxious_spawn.lua b/data/scripts/movements/claw_of_the_noxious_spawn.lua new file mode 100644 index 00000000000..8abef020ad9 --- /dev/null +++ b/data/scripts/movements/claw_of_the_noxious_spawn.lua @@ -0,0 +1,18 @@ +local clawOfTheNoxiousSpawn = MoveEvent() + +function clawOfTheNoxiousSpawn.onEquip(player, item, slot, isCheck) + if not isCheck then + if not Tile(player:getPosition()):hasFlag(TILESTATE_PROTECTIONZONE) then + doTargetCombatHealth(0, player, COMBAT_PHYSICALDAMAGE, -150, -200, CONST_ME_DRAWBLOOD) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, (math.random(2) == 1 and "It tightens around your wrist as you take it on." or "Ouch! The serpent claw stabbed you.")) + return true + end + end + return true +end + +clawOfTheNoxiousSpawn:type("equip") +clawOfTheNoxiousSpawn:slot("ring") +clawOfTheNoxiousSpawn:id(9393) +clawOfTheNoxiousSpawn:level(100) +clawOfTheNoxiousSpawn:register() diff --git a/data-canary/scripts/movements/closing_door.lua b/data/scripts/movements/closing_door.lua similarity index 99% rename from data-canary/scripts/movements/closing_door.lua rename to data/scripts/movements/closing_door.lua index a8d1f928c15..3a63407267e 100644 --- a/data-canary/scripts/movements/closing_door.lua +++ b/data/scripts/movements/closing_door.lua @@ -10,6 +10,7 @@ for index, value in ipairs(QuestDoorTable) do table.insert(doorIds, value.openDoor) end end + for index, value in ipairs(LevelDoorTable) do if not table.contains(doorIds, value.openDoor) then table.insert(doorIds, value.openDoor) @@ -33,6 +34,7 @@ function closingDoor.onStepIn(creature, item, position, fromPosition) end end end + for index, value in ipairs(LevelDoorTable) do if value.openDoor == item.itemid then if item.actionid > 0 and player:getLevel() >= item.actionid - 1000 then @@ -66,6 +68,7 @@ for index, value in ipairs(QuestDoorTable) do table.insert(doorIds, value.openDoor) end end + for index, value in ipairs(LevelDoorTable) do if not table.contains(doorIds, value.openDoor) then table.insert(doorIds, value.openDoor) @@ -79,12 +82,14 @@ function closingDoor.onStepOut(creature, item, position, fromPosition) end local tile = Tile(position) + if tile:getCreatureCount() > 0 then return true end local newPosition = { x = position.x + 1, y = position.y, z = position.z } local query = Tile(newPosition):queryAdd(creature) + if query ~= RETURNVALUE_NOERROR or query == RETURNVALUE_NOTENOUGHROOM then newPosition.x = newPosition.x - 1 newPosition.y = newPosition.y + 1 @@ -96,6 +101,7 @@ function closingDoor.onStepOut(creature, item, position, fromPosition) end local i, tileItem, tileCount = 1, true, tile:getThingCount() + while tileItem and i < tileCount do tileItem = tile:getThing(i) if tileItem and tileItem:getUniqueId() ~= item.uid and tileItem:getType():isMovable() then @@ -110,6 +116,7 @@ function closingDoor.onStepOut(creature, item, position, fromPosition) item:transform(value.closedDoor) end end + for index, value in ipairs(QuestDoorTable) do if value.openDoor == item.itemid then item:transform(value.closedDoor) diff --git a/data-canary/scripts/movements/drowning.lua b/data/scripts/movements/drowning.lua similarity index 50% rename from data-canary/scripts/movements/drowning.lua rename to data/scripts/movements/drowning.lua index 00266d57d1e..a32dcb216cb 100644 --- a/data-canary/scripts/movements/drowning.lua +++ b/data/scripts/movements/drowning.lua @@ -3,16 +3,31 @@ condition:setParameter(CONDITION_PARAM_PERIODICDAMAGE, -20) condition:setParameter(CONDITION_PARAM_TICKS, -1) condition:setParameter(CONDITION_PARAM_TICKINTERVAL, 2000) +local conditionHaste = Condition(CONDITION_HASTE) +conditionHaste:setTicks(-1) +conditionHaste:setFormula(1.0, 300, 1.0, 300) + local drowning = MoveEvent() drowning:type("stepin") function drowning.onStepIn(creature, item, position, fromPosition) - if creature:isPlayer() then - if math.random(1, 10) == 1 then - position:sendMagicEffect(CONST_ME_BUBBLES) + local player = creature:getPlayer() + if not player then + return false + end + + local headItem = player:getSlotItem(CONST_SLOT_HEAD) + if headItem and table.contains({ 5460, 11585, 13995 }, headItem:getId()) then + if player:hasExhaustion("coconut-shrimp-bake") then + player:addCondition(conditionHaste) end - creature:addCondition(condition) + + return true + elseif math.random(1, 10) == 1 then + position:sendMagicEffect(CONST_ME_BUBBLES) end + + player:addCondition(condition) return true end @@ -23,9 +38,13 @@ drowning = MoveEvent() drowning:type("stepout") function drowning.onStepOut(creature, item, position, fromPosition) - if creature:isPlayer() then - creature:removeCondition(CONDITION_DROWN) + local player = creature:getPlayer() + if not player then + return false end + + player:removeCondition(CONDITION_DROWN) + player:removeCondition(CONDITION_HASTE) return true end diff --git a/data-otservbr-global/scripts/movements/others/snow.lua b/data/scripts/movements/snow.lua similarity index 89% rename from data-otservbr-global/scripts/movements/others/snow.lua rename to data/scripts/movements/snow.lua index 72a70293f84..d4801dcb25b 100644 --- a/data-otservbr-global/scripts/movements/others/snow.lua +++ b/data/scripts/movements/snow.lua @@ -11,6 +11,8 @@ function snow.onStepOut(creature, item, position, fromPosition) else item:transform(item.itemid + 15) end + + player:addAchievementProgress("Snowbunny", 10000) item:decay() return true end diff --git a/data-canary/scripts/movements/tiles.lua b/data/scripts/movements/special_tiles.lua similarity index 86% rename from data-canary/scripts/movements/tiles.lua rename to data/scripts/movements/special_tiles.lua index 5f0f74e2c80..a1ec92dbbad 100644 --- a/data-canary/scripts/movements/tiles.lua +++ b/data/scripts/movements/special_tiles.lua @@ -1,17 +1,15 @@ local increasing = { [419] = 420, [431] = 430, [452] = 453, [563] = 564, [549] = 562, [10145] = 10146 } local decreasing = { [420] = 419, [430] = 431, [453] = 452, [564] = 563, [562] = 549, [10146] = 10145 } --- onStepIn local tile = MoveEvent() -tile:type("stepin") function tile.onStepIn(creature, item, position, fromPosition) - if not increasing[item.itemid] then + local player = creature:getPlayer() + if not player or player:isInGhostMode() then return true end - local player = creature:getPlayer() - if not player or player:isInGhostMode() then + if not increasing[item.itemid] then return true end @@ -30,14 +28,19 @@ function tile.onStepIn(creature, item, position, fromPosition) for _, direction in ipairs(DIRECTIONS_TABLE) do local playerPosition = player:getPosition() playerPosition:getNextPosition(direction) + local depotItem = playerPosition:getTile():getItemByType(ITEM_TYPE_DEPOT) - if depotItem ~= nil then + if depotItem then local depotItems = 0 + for id = 1, configManager.getNumber(configKeys.DEPOT_BOXES) do depotItems = depotItems + player:getDepotChest(id, true):getItemHoldingCount() end - player:sendTextMessage(MESSAGE_FAILURE, "Your depot contains " .. depotItems .. " item" .. (depotItems > 1 and "s." or ".") .. "\ - Your supply stash contains " .. player:getStashCount() .. " item" .. (player:getStashCount() > 1 and "s." or ".")) + + local depotMessage = "Your depot contains " .. depotItems .. " item" .. (depotItems ~= 1 and "s." or ".") + local stashMessage = "Your supply stash contains " .. player:getStashCount() .. " item" .. (player:getStashCount() ~= 1 and "s." or ".") + + player:sendTextMessage(MESSAGE_FAILURE, depotMessage .. "\n" .. stashMessage) player:setSpecialContainersAvailable(true, true, true) return true end @@ -57,18 +60,18 @@ for index, value in pairs(increasing) do tile:id(index) end +tile:type("stepin") tile:register() tile = MoveEvent() -tile:type("stepout") function tile.onStepOut(creature, item, position, fromPosition) - if not decreasing[item.itemid] then + local player = creature:getPlayer() + if not player or player:isInGhostMode() then return true end - local player = creature:getPlayer() - if not player or player:isInGhostMode() then + if not decreasing[item.itemid] then return true end @@ -81,4 +84,5 @@ for index, value in pairs(decreasing) do tile:id(index) end +tile:type("stepout") tile:register() diff --git a/data-otservbr-global/scripts/movements/others/swimming.lua b/data/scripts/movements/swimming.lua similarity index 70% rename from data-otservbr-global/scripts/movements/others/swimming.lua rename to data/scripts/movements/swimming.lua index eee6858a1ce..d34d5036510 100644 --- a/data-otservbr-global/scripts/movements/others/swimming.lua +++ b/data/scripts/movements/swimming.lua @@ -18,31 +18,35 @@ local conditions = { local swimming = MoveEvent() function swimming.onStepIn(creature, item, position, fromPosition) - if not creature:isPlayer() then + local player = creature:getPlayer() + if not player then return false end + for i = 1, #conditions do - creature:removeCondition(conditions[i]) + player:removeCondition(conditions[i]) end - creature:addCondition(condition) + + player:addCondition(condition) return true end swimming:type("stepin") -swimming:id(629, 630, 631, 632, 633, 634) +swimming:id(unpack(swimmingTiles)) swimming:register() swimming = MoveEvent() function swimming.onStepOut(creature, item, position, fromPosition) - if not creature:isPlayer() then + local player = creature:getPlayer() + if not player then return false end - creature:removeCondition(CONDITION_OUTFIT) + player:removeCondition(CONDITION_OUTFIT) return true end swimming:type("stepout") -swimming:id(629, 630, 631, 632, 633, 634) +swimming:id(unpack(swimmingTiles)) swimming:register() diff --git a/data-canary/scripts/movements/yellow_pillow.lua b/data/scripts/movements/yellow_pillow.lua similarity index 66% rename from data-canary/scripts/movements/yellow_pillow.lua rename to data/scripts/movements/yellow_pillow.lua index 6d981448ca5..f0a433f2fb7 100644 --- a/data-canary/scripts/movements/yellow_pillow.lua +++ b/data/scripts/movements/yellow_pillow.lua @@ -1,14 +1,16 @@ local yellowPillow = MoveEvent() -yellowPillow:type("stepin") -function yellowPillow.onStepIn(player, item, position, fromPosition) +function yellowPillow.onStepIn(creature, item, position, fromPosition) + local player = creature:getPlayer() if not player or player:isInGhostMode() then return true end + player:say("Faaart!", TALKTYPE_MONSTER_SAY) item:getPosition():sendMagicEffect(CONST_ME_POFF) return true end -yellowPillow:id(8072) +yellowPillow:id(2397) +yellowPillow:type("stepin") yellowPillow:register() diff --git a/data/scripts/reward_chest/boss_health_change.lua b/data/scripts/reward_chest/boss_health_change.lua deleted file mode 100644 index 037d6aa567a..00000000000 --- a/data/scripts/reward_chest/boss_health_change.lua +++ /dev/null @@ -1,44 +0,0 @@ -local bossParticipation = CreatureEvent("BossParticipation") - -function bossParticipation.onHealthChange(creature, attacker, primaryDamage, primaryType, secondaryDamage, secondaryType, origin) - if not next(_G.GlobalBosses) then - return primaryDamage, primaryType, secondaryDamage, secondaryType - end - - if not creature or not attacker then - return primaryDamage, primaryType, secondaryDamage, secondaryType - end - - local stats = creature:inBossFight() - if not stats then - return primaryDamage, primaryType, secondaryDamage, secondaryType - end - - local creatureId, attackerId = creature:getId(), attacker:getId() - -- Update player id - stats.playerId = creatureId - - -- Account for healing of others active in the boss fight - if primaryType == COMBAT_HEALING and attacker:isPlayer() and attackerId ~= creatureId then - local healerStats = GetPlayerStats(stats.bossId, attacker:getGuid(), true) - healerStats.active = true - -- Update player id - healerStats.playerId = attackerId - healerStats.healing = healerStats.healing + primaryDamage - elseif stats.bossId == attackerId then - -- Account for damage taken from the boss - stats.damageIn = stats.damageIn + primaryDamage - end - return primaryDamage, primaryType, secondaryDamage, secondaryType -end - -bossParticipation:register() - -local loginBossPlayer = CreatureEvent("LoginBossPlayer") - -function loginBossPlayer.onLogin(player) - player:registerEvent("BossDeath") - return true -end - -loginBossPlayer:register() diff --git a/data/scripts/reward_chest/boss_think.lua b/data/scripts/reward_chest/boss_think.lua deleted file mode 100644 index 9029c88da41..00000000000 --- a/data/scripts/reward_chest/boss_think.lua +++ /dev/null @@ -1,11 +0,0 @@ -local bossThink = CreatureEvent("BossThink") - -function bossThink.onThink(creature, interval) - if not creature then - return true - end - - ResetAndSetTargetList(creature) -end - -bossThink:register() diff --git a/data-canary/scripts/runes/animate_dead_rune.lua b/data/scripts/runes/animate_dead_rune.lua similarity index 100% rename from data-canary/scripts/runes/animate_dead_rune.lua rename to data/scripts/runes/animate_dead_rune.lua diff --git a/data-canary/scripts/runes/antidote_rune.lua b/data/scripts/runes/antidote_rune.lua similarity index 100% rename from data-canary/scripts/runes/antidote_rune.lua rename to data/scripts/runes/antidote_rune.lua diff --git a/data-canary/scripts/runes/avalanche.lua b/data/scripts/runes/avalanche.lua similarity index 100% rename from data-canary/scripts/runes/avalanche.lua rename to data/scripts/runes/avalanche.lua diff --git a/data-canary/scripts/runes/chameleon.lua b/data/scripts/runes/chameleon.lua similarity index 100% rename from data-canary/scripts/runes/chameleon.lua rename to data/scripts/runes/chameleon.lua diff --git a/data-otservbr-global/scripts/spells/runes/convince_creature.lua b/data/scripts/runes/convince_creature.lua similarity index 100% rename from data-otservbr-global/scripts/spells/runes/convince_creature.lua rename to data/scripts/runes/convince_creature.lua diff --git a/data-canary/scripts/runes/desintegrate_rune.lua b/data/scripts/runes/desintegrate_rune.lua similarity index 100% rename from data-canary/scripts/runes/desintegrate_rune.lua rename to data/scripts/runes/desintegrate_rune.lua diff --git a/data-canary/scripts/runes/destroy_field_rune.lua b/data/scripts/runes/destroy_field_rune.lua similarity index 100% rename from data-canary/scripts/runes/destroy_field_rune.lua rename to data/scripts/runes/destroy_field_rune.lua diff --git a/data-canary/scripts/runes/energy_bomb.lua b/data/scripts/runes/energy_bomb.lua similarity index 100% rename from data-canary/scripts/runes/energy_bomb.lua rename to data/scripts/runes/energy_bomb.lua diff --git a/data-canary/scripts/runes/energy_field.lua b/data/scripts/runes/energy_field.lua similarity index 100% rename from data-canary/scripts/runes/energy_field.lua rename to data/scripts/runes/energy_field.lua diff --git a/data-canary/scripts/runes/energy_wall.lua b/data/scripts/runes/energy_wall.lua similarity index 100% rename from data-canary/scripts/runes/energy_wall.lua rename to data/scripts/runes/energy_wall.lua diff --git a/data-canary/scripts/runes/explosion.lua b/data/scripts/runes/explosion.lua similarity index 100% rename from data-canary/scripts/runes/explosion.lua rename to data/scripts/runes/explosion.lua diff --git a/data-canary/scripts/runes/fire_bomb.lua b/data/scripts/runes/fire_bomb.lua similarity index 100% rename from data-canary/scripts/runes/fire_bomb.lua rename to data/scripts/runes/fire_bomb.lua diff --git a/data-canary/scripts/runes/fire_field.lua b/data/scripts/runes/fire_field.lua similarity index 100% rename from data-canary/scripts/runes/fire_field.lua rename to data/scripts/runes/fire_field.lua diff --git a/data-canary/scripts/runes/fire_wall.lua b/data/scripts/runes/fire_wall.lua similarity index 100% rename from data-canary/scripts/runes/fire_wall.lua rename to data/scripts/runes/fire_wall.lua diff --git a/data-canary/scripts/runes/fireball.lua b/data/scripts/runes/fireball.lua similarity index 100% rename from data-canary/scripts/runes/fireball.lua rename to data/scripts/runes/fireball.lua diff --git a/data-canary/scripts/runes/great_fireball.lua b/data/scripts/runes/great_fireball.lua similarity index 100% rename from data-canary/scripts/runes/great_fireball.lua rename to data/scripts/runes/great_fireball.lua diff --git a/data-canary/scripts/runes/heavy_magic_missile.lua b/data/scripts/runes/heavy_magic_missile.lua similarity index 100% rename from data-canary/scripts/runes/heavy_magic_missile.lua rename to data/scripts/runes/heavy_magic_missile.lua diff --git a/data-canary/scripts/runes/holy_missile.lua b/data/scripts/runes/holy_missile.lua similarity index 100% rename from data-canary/scripts/runes/holy_missile.lua rename to data/scripts/runes/holy_missile.lua diff --git a/data-canary/scripts/runes/icicle.lua b/data/scripts/runes/icicle.lua similarity index 100% rename from data-canary/scripts/runes/icicle.lua rename to data/scripts/runes/icicle.lua diff --git a/data-canary/scripts/runes/intense_healing_rune.lua b/data/scripts/runes/intense_healing_rune.lua similarity index 100% rename from data-canary/scripts/runes/intense_healing_rune.lua rename to data/scripts/runes/intense_healing_rune.lua diff --git a/data-canary/scripts/runes/light_magic_missile.lua b/data/scripts/runes/light_magic_missile.lua similarity index 100% rename from data-canary/scripts/runes/light_magic_missile.lua rename to data/scripts/runes/light_magic_missile.lua diff --git a/data-canary/scripts/runes/light_stone_shower.lua b/data/scripts/runes/light_stone_shower.lua similarity index 100% rename from data-canary/scripts/runes/light_stone_shower.lua rename to data/scripts/runes/light_stone_shower.lua diff --git a/data-canary/scripts/runes/lightest_magic_missile.lua b/data/scripts/runes/lightest_magic_missile.lua similarity index 100% rename from data-canary/scripts/runes/lightest_magic_missile.lua rename to data/scripts/runes/lightest_magic_missile.lua diff --git a/data-canary/scripts/runes/lightest_missile.lua b/data/scripts/runes/lightest_missile.lua similarity index 100% rename from data-canary/scripts/runes/lightest_missile.lua rename to data/scripts/runes/lightest_missile.lua diff --git a/data-otservbr-global/scripts/spells/runes/magic_wall.lua b/data/scripts/runes/magic_wall.lua similarity index 50% rename from data-otservbr-global/scripts/spells/runes/magic_wall.lua rename to data/scripts/runes/magic_wall.lua index 75f9757c686..9ccfbb2a833 100644 --- a/data-otservbr-global/scripts/spells/runes/magic_wall.lua +++ b/data/scripts/runes/magic_wall.lua @@ -13,22 +13,22 @@ local combat = Combat() combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) combat:setCallback(CALLBACK_PARAM_TARGETTILE, "onCreateMagicWall") -local spell = Spell("rune") -function spell.onCastSpell(creature, variant, isHotkey) +local rune = Spell("rune") +function rune.onCastSpell(creature, variant, isHotkey) return combat:execute(creature, variant) end -spell:id(86) -spell:name("Magic Wall Rune") -spell:group("attack") -spell:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) -spell:impactSound(SOUND_EFFECT_TYPE_SPELL_MAGIC_WALL_RUNE) -spell:cooldown(2 * 1000) -spell:groupCooldown(2 * 1000) -spell:level(32) -spell:magicLevel(9) -spell:runeId(3180) -spell:charges(3) -spell:isBlocking(true, true) -spell:allowFarUse(true) -spell:register() +rune:id(86) +rune:name("Magic Wall Rune") +rune:group("attack") +rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) +rune:impactSound(SOUND_EFFECT_TYPE_SPELL_MAGIC_WALL_RUNE) +rune:cooldown(2 * 1000) +rune:groupCooldown(2 * 1000) +rune:level(32) +rune:magicLevel(9) +rune:runeId(3180) +rune:charges(3) +rune:isBlocking(true, true) +rune:allowFarUse(true) +rune:register() diff --git a/data-canary/scripts/runes/paralyze_rune.lua b/data/scripts/runes/paralyze_rune.lua similarity index 100% rename from data-canary/scripts/runes/paralyze_rune.lua rename to data/scripts/runes/paralyze_rune.lua diff --git a/data-canary/scripts/runes/poison_bomb.lua b/data/scripts/runes/poison_bomb.lua similarity index 100% rename from data-canary/scripts/runes/poison_bomb.lua rename to data/scripts/runes/poison_bomb.lua diff --git a/data-canary/scripts/runes/poison_field.lua b/data/scripts/runes/poison_field.lua similarity index 100% rename from data-canary/scripts/runes/poison_field.lua rename to data/scripts/runes/poison_field.lua diff --git a/data-canary/scripts/runes/poison_wall.lua b/data/scripts/runes/poison_wall.lua similarity index 100% rename from data-canary/scripts/runes/poison_wall.lua rename to data/scripts/runes/poison_wall.lua diff --git a/data-canary/scripts/runes/soul_fire.lua b/data/scripts/runes/soul_fire.lua similarity index 100% rename from data-canary/scripts/runes/soul_fire.lua rename to data/scripts/runes/soul_fire.lua diff --git a/data-canary/scripts/runes/stalagmite.lua b/data/scripts/runes/stalagmite.lua similarity index 100% rename from data-canary/scripts/runes/stalagmite.lua rename to data/scripts/runes/stalagmite.lua diff --git a/data-canary/scripts/runes/stone_shower.lua b/data/scripts/runes/stone_shower.lua similarity index 100% rename from data-canary/scripts/runes/stone_shower.lua rename to data/scripts/runes/stone_shower.lua diff --git a/data-canary/scripts/runes/sudden_death.lua b/data/scripts/runes/sudden_death.lua similarity index 100% rename from data-canary/scripts/runes/sudden_death.lua rename to data/scripts/runes/sudden_death.lua diff --git a/data-canary/scripts/runes/thunderstorm.lua b/data/scripts/runes/thunderstorm.lua similarity index 100% rename from data-canary/scripts/runes/thunderstorm.lua rename to data/scripts/runes/thunderstorm.lua diff --git a/data-canary/scripts/runes/ultimate_healing_rune.lua b/data/scripts/runes/ultimate_healing_rune.lua similarity index 100% rename from data-canary/scripts/runes/ultimate_healing_rune.lua rename to data/scripts/runes/ultimate_healing_rune.lua diff --git a/data/scripts/runes/wild_growth.lua b/data/scripts/runes/wild_growth.lua new file mode 100644 index 00000000000..71d2d4a662b --- /dev/null +++ b/data/scripts/runes/wild_growth.lua @@ -0,0 +1,35 @@ +function onCreateWildGrowth(creature, tile) + local wildGrowth + if Game.getWorldType() == WORLD_TYPE_NO_PVP then + wildGrowth = ITEM_WILDGROWTH_SAFE + else + wildGrowth = ITEM_WILDGROWTH + end + local item = Game.createItem(wildGrowth, 1, tile) + item:setDuration(30, 60) +end + +local combat = Combat() +combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) +combat:setCallback(CALLBACK_PARAM_TARGETTILE, "onCreateWildGrowth") + +local rune = Spell("rune") +function rune.onCastSpell(creature, variant, isHotkey) + return combat:execute(creature, variant) +end + +rune:id(94) +rune:name("Wild Growth Rune") +rune:group("attack") +rune:castSound(SOUND_EFFECT_TYPE_SPELL_OR_RUNE) +rune:impactSound(SOUND_EFFECT_TYPE_SPELL_WILD_GROWTH_RUNE) +rune:cooldown(2 * 1000) +rune:groupCooldown(2 * 1000) +rune:level(27) +rune:magicLevel(8) +rune:runeId(3156) +rune:charges(2) +rune:isBlocking(true, true) +rune:allowFarUse(true) +rune:vocation("druid;true", "elder druid;true") +rune:register() diff --git a/data-otservbr-global/scripts/spells/#example.lua b/data/scripts/spells/#example.lua similarity index 100% rename from data-otservbr-global/scripts/spells/#example.lua rename to data/scripts/spells/#example.lua diff --git a/data-canary/scripts/spells/attack/annihilation.lua b/data/scripts/spells/attack/annihilation.lua similarity index 100% rename from data-canary/scripts/spells/attack/annihilation.lua rename to data/scripts/spells/attack/annihilation.lua diff --git a/data-canary/scripts/spells/attack/apprentice's_strike.lua b/data/scripts/spells/attack/apprentice's_strike.lua similarity index 100% rename from data-canary/scripts/spells/attack/apprentice's_strike.lua rename to data/scripts/spells/attack/apprentice's_strike.lua diff --git a/data-canary/scripts/spells/attack/berserk.lua b/data/scripts/spells/attack/berserk.lua similarity index 100% rename from data-canary/scripts/spells/attack/berserk.lua rename to data/scripts/spells/attack/berserk.lua diff --git a/data-canary/scripts/spells/attack/brutal_strike.lua b/data/scripts/spells/attack/brutal_strike.lua similarity index 100% rename from data-canary/scripts/spells/attack/brutal_strike.lua rename to data/scripts/spells/attack/brutal_strike.lua diff --git a/data-canary/scripts/spells/attack/buzz.lua b/data/scripts/spells/attack/buzz.lua similarity index 100% rename from data-canary/scripts/spells/attack/buzz.lua rename to data/scripts/spells/attack/buzz.lua diff --git a/data-canary/scripts/spells/attack/chill_out.lua b/data/scripts/spells/attack/chill_out.lua similarity index 100% rename from data-canary/scripts/spells/attack/chill_out.lua rename to data/scripts/spells/attack/chill_out.lua diff --git a/data-canary/scripts/spells/attack/curse.lua b/data/scripts/spells/attack/curse.lua similarity index 100% rename from data-canary/scripts/spells/attack/curse.lua rename to data/scripts/spells/attack/curse.lua diff --git a/data-canary/scripts/spells/attack/death_strike.lua b/data/scripts/spells/attack/death_strike.lua similarity index 100% rename from data-canary/scripts/spells/attack/death_strike.lua rename to data/scripts/spells/attack/death_strike.lua diff --git a/data-canary/scripts/spells/attack/divine_caldera.lua b/data/scripts/spells/attack/divine_caldera.lua similarity index 100% rename from data-canary/scripts/spells/attack/divine_caldera.lua rename to data/scripts/spells/attack/divine_caldera.lua diff --git a/data-otservbr-global/scripts/spells/attack/divine_grenade.lua b/data/scripts/spells/attack/divine_grenade.lua similarity index 100% rename from data-otservbr-global/scripts/spells/attack/divine_grenade.lua rename to data/scripts/spells/attack/divine_grenade.lua diff --git a/data-canary/scripts/spells/attack/divine_missile.lua b/data/scripts/spells/attack/divine_missile.lua similarity index 100% rename from data-canary/scripts/spells/attack/divine_missile.lua rename to data/scripts/spells/attack/divine_missile.lua diff --git a/data-canary/scripts/spells/attack/electrify.lua b/data/scripts/spells/attack/electrify.lua similarity index 100% rename from data-canary/scripts/spells/attack/electrify.lua rename to data/scripts/spells/attack/electrify.lua diff --git a/data-otservbr-global/scripts/spells/attack/energy_beam.lua b/data/scripts/spells/attack/energy_beam.lua similarity index 100% rename from data-otservbr-global/scripts/spells/attack/energy_beam.lua rename to data/scripts/spells/attack/energy_beam.lua diff --git a/data-canary/scripts/spells/attack/energy_strike.lua b/data/scripts/spells/attack/energy_strike.lua similarity index 100% rename from data-canary/scripts/spells/attack/energy_strike.lua rename to data/scripts/spells/attack/energy_strike.lua diff --git a/data-otservbr-global/scripts/spells/attack/energy_wave.lua b/data/scripts/spells/attack/energy_wave.lua similarity index 100% rename from data-otservbr-global/scripts/spells/attack/energy_wave.lua rename to data/scripts/spells/attack/energy_wave.lua diff --git a/data-canary/scripts/spells/attack/envenom.lua b/data/scripts/spells/attack/envenom.lua similarity index 100% rename from data-canary/scripts/spells/attack/envenom.lua rename to data/scripts/spells/attack/envenom.lua diff --git a/data-canary/scripts/spells/attack/eternal_winter.lua b/data/scripts/spells/attack/eternal_winter.lua similarity index 100% rename from data-canary/scripts/spells/attack/eternal_winter.lua rename to data/scripts/spells/attack/eternal_winter.lua diff --git a/data-canary/scripts/spells/attack/ethereal_spear.lua b/data/scripts/spells/attack/ethereal_spear.lua similarity index 100% rename from data-canary/scripts/spells/attack/ethereal_spear.lua rename to data/scripts/spells/attack/ethereal_spear.lua diff --git a/data-otservbr-global/scripts/spells/attack/executioners_throw.lua b/data/scripts/spells/attack/executioners_throw.lua similarity index 99% rename from data-otservbr-global/scripts/spells/attack/executioners_throw.lua rename to data/scripts/spells/attack/executioners_throw.lua index c63baac5f22..2f2220625c5 100644 --- a/data-otservbr-global/scripts/spells/attack/executioners_throw.lua +++ b/data/scripts/spells/attack/executioners_throw.lua @@ -68,7 +68,7 @@ spell:group("attack") spell:id(261) spell:name("Executioner's Throw") spell:words("exori amp kor") -spell:level(1) +spell:level(300) spell:mana(225) spell:isPremium(true) spell:range(5) diff --git a/data-canary/scripts/spells/attack/fierce_berserk.lua b/data/scripts/spells/attack/fierce_berserk.lua similarity index 100% rename from data-canary/scripts/spells/attack/fierce_berserk.lua rename to data/scripts/spells/attack/fierce_berserk.lua diff --git a/data-canary/scripts/spells/attack/fire_wave.lua b/data/scripts/spells/attack/fire_wave.lua similarity index 100% rename from data-canary/scripts/spells/attack/fire_wave.lua rename to data/scripts/spells/attack/fire_wave.lua diff --git a/data-canary/scripts/spells/attack/flame_strike.lua b/data/scripts/spells/attack/flame_strike.lua similarity index 100% rename from data-canary/scripts/spells/attack/flame_strike.lua rename to data/scripts/spells/attack/flame_strike.lua diff --git a/data-canary/scripts/spells/attack/front_sweep.lua b/data/scripts/spells/attack/front_sweep.lua similarity index 100% rename from data-canary/scripts/spells/attack/front_sweep.lua rename to data/scripts/spells/attack/front_sweep.lua diff --git a/data-otservbr-global/scripts/spells/attack/great_death_beam.lua b/data/scripts/spells/attack/great_death_beam.lua similarity index 99% rename from data-otservbr-global/scripts/spells/attack/great_death_beam.lua rename to data/scripts/spells/attack/great_death_beam.lua index 7416dd726ed..02a17c78f41 100644 --- a/data-otservbr-global/scripts/spells/attack/great_death_beam.lua +++ b/data/scripts/spells/attack/great_death_beam.lua @@ -57,7 +57,7 @@ spell:group("attack") spell:id(260) spell:name("Great Death Beam") spell:words("exevo max mort") -spell:level(1) +spell:level(300) spell:mana(140) spell:isPremium(false) spell:needDirection(true) diff --git a/data-otservbr-global/scripts/spells/attack/great_energy_beam.lua b/data/scripts/spells/attack/great_energy_beam.lua similarity index 100% rename from data-otservbr-global/scripts/spells/attack/great_energy_beam.lua rename to data/scripts/spells/attack/great_energy_beam.lua diff --git a/data-canary/scripts/spells/attack/great_fire_wave.lua b/data/scripts/spells/attack/great_fire_wave.lua similarity index 100% rename from data-canary/scripts/spells/attack/great_fire_wave.lua rename to data/scripts/spells/attack/great_fire_wave.lua diff --git a/data-canary/scripts/spells/attack/groundshaker.lua b/data/scripts/spells/attack/groundshaker.lua similarity index 100% rename from data-canary/scripts/spells/attack/groundshaker.lua rename to data/scripts/spells/attack/groundshaker.lua diff --git a/data-canary/scripts/spells/attack/hells_core.lua b/data/scripts/spells/attack/hells_core.lua similarity index 100% rename from data-canary/scripts/spells/attack/hells_core.lua rename to data/scripts/spells/attack/hells_core.lua diff --git a/data-canary/scripts/spells/attack/holy_flash.lua b/data/scripts/spells/attack/holy_flash.lua similarity index 100% rename from data-canary/scripts/spells/attack/holy_flash.lua rename to data/scripts/spells/attack/holy_flash.lua diff --git a/data-otservbr-global/scripts/spells/attack/ice_burst.lua b/data/scripts/spells/attack/ice_burst.lua similarity index 98% rename from data-otservbr-global/scripts/spells/attack/ice_burst.lua rename to data/scripts/spells/attack/ice_burst.lua index d701b153270..9e1560f9dc9 100644 --- a/data-otservbr-global/scripts/spells/attack/ice_burst.lua +++ b/data/scripts/spells/attack/ice_burst.lua @@ -53,8 +53,8 @@ spell:group("attack") spell:id(262) spell:name("Ice Burst") spell:words("exevo ulus frigo") -spell:level(1) -spell:mana(170) +spell:level(300) +spell:mana(230) spell:isPremium(true) spell:cooldown(1000) -- Cooldown is calculated on the casting spell:groupCooldown(2 * 1000) diff --git a/data-canary/scripts/spells/attack/ice_strike.lua b/data/scripts/spells/attack/ice_strike.lua similarity index 100% rename from data-canary/scripts/spells/attack/ice_strike.lua rename to data/scripts/spells/attack/ice_strike.lua diff --git a/data-canary/scripts/spells/attack/ice_wave.lua b/data/scripts/spells/attack/ice_wave.lua similarity index 100% rename from data-canary/scripts/spells/attack/ice_wave.lua rename to data/scripts/spells/attack/ice_wave.lua diff --git a/data-otservbr-global/scripts/spells/attack/ignite.lua b/data/scripts/spells/attack/ignite.lua similarity index 100% rename from data-otservbr-global/scripts/spells/attack/ignite.lua rename to data/scripts/spells/attack/ignite.lua diff --git a/data-canary/scripts/spells/attack/inflict_wound.lua b/data/scripts/spells/attack/inflict_wound.lua similarity index 100% rename from data-canary/scripts/spells/attack/inflict_wound.lua rename to data/scripts/spells/attack/inflict_wound.lua diff --git a/data-canary/scripts/spells/attack/lightning.lua b/data/scripts/spells/attack/lightning.lua similarity index 100% rename from data-canary/scripts/spells/attack/lightning.lua rename to data/scripts/spells/attack/lightning.lua diff --git a/data-canary/scripts/spells/attack/mud_attack.lua b/data/scripts/spells/attack/mud_attack.lua similarity index 100% rename from data-canary/scripts/spells/attack/mud_attack.lua rename to data/scripts/spells/attack/mud_attack.lua diff --git a/data-canary/scripts/spells/attack/physical_strike.lua b/data/scripts/spells/attack/physical_strike.lua similarity index 100% rename from data-canary/scripts/spells/attack/physical_strike.lua rename to data/scripts/spells/attack/physical_strike.lua diff --git a/data-canary/scripts/spells/attack/practice_fire_wave.lua b/data/scripts/spells/attack/practice_fire_wave.lua similarity index 100% rename from data-canary/scripts/spells/attack/practice_fire_wave.lua rename to data/scripts/spells/attack/practice_fire_wave.lua diff --git a/data-canary/scripts/spells/attack/rage_of_the_skies.lua b/data/scripts/spells/attack/rage_of_the_skies.lua similarity index 100% rename from data-canary/scripts/spells/attack/rage_of_the_skies.lua rename to data/scripts/spells/attack/rage_of_the_skies.lua diff --git a/data-canary/scripts/spells/attack/scorch.lua b/data/scripts/spells/attack/scorch.lua similarity index 100% rename from data-canary/scripts/spells/attack/scorch.lua rename to data/scripts/spells/attack/scorch.lua diff --git a/data-canary/scripts/spells/attack/strong_energy_strike.lua b/data/scripts/spells/attack/strong_energy_strike.lua similarity index 100% rename from data-canary/scripts/spells/attack/strong_energy_strike.lua rename to data/scripts/spells/attack/strong_energy_strike.lua diff --git a/data-canary/scripts/spells/attack/strong_ethereal_spear.lua b/data/scripts/spells/attack/strong_ethereal_spear.lua similarity index 100% rename from data-canary/scripts/spells/attack/strong_ethereal_spear.lua rename to data/scripts/spells/attack/strong_ethereal_spear.lua diff --git a/data-canary/scripts/spells/attack/strong_flame_strike.lua b/data/scripts/spells/attack/strong_flame_strike.lua similarity index 100% rename from data-canary/scripts/spells/attack/strong_flame_strike.lua rename to data/scripts/spells/attack/strong_flame_strike.lua diff --git a/data-canary/scripts/spells/attack/strong_ice_strike.lua b/data/scripts/spells/attack/strong_ice_strike.lua similarity index 100% rename from data-canary/scripts/spells/attack/strong_ice_strike.lua rename to data/scripts/spells/attack/strong_ice_strike.lua diff --git a/data-canary/scripts/spells/attack/strong_ice_wave.lua b/data/scripts/spells/attack/strong_ice_wave.lua similarity index 100% rename from data-canary/scripts/spells/attack/strong_ice_wave.lua rename to data/scripts/spells/attack/strong_ice_wave.lua diff --git a/data-canary/scripts/spells/attack/strong_terra_strike.lua b/data/scripts/spells/attack/strong_terra_strike.lua similarity index 100% rename from data-canary/scripts/spells/attack/strong_terra_strike.lua rename to data/scripts/spells/attack/strong_terra_strike.lua diff --git a/data-otservbr-global/scripts/spells/attack/terra_burst.lua b/data/scripts/spells/attack/terra_burst.lua similarity index 98% rename from data-otservbr-global/scripts/spells/attack/terra_burst.lua rename to data/scripts/spells/attack/terra_burst.lua index 75e25dbcdbe..8a805c0ba48 100644 --- a/data-otservbr-global/scripts/spells/attack/terra_burst.lua +++ b/data/scripts/spells/attack/terra_burst.lua @@ -53,8 +53,8 @@ spell:group("attack") spell:id(263) spell:name("Terra Burst") spell:words("exevo ulus tera") -spell:level(1) -spell:mana(170) +spell:level(300) +spell:mana(230) spell:isPremium(true) spell:cooldown(1000) -- Cooldown is calculated on the casting spell:groupCooldown(2 * 1000) diff --git a/data-canary/scripts/spells/attack/terra_strike.lua b/data/scripts/spells/attack/terra_strike.lua similarity index 100% rename from data-canary/scripts/spells/attack/terra_strike.lua rename to data/scripts/spells/attack/terra_strike.lua diff --git a/data-canary/scripts/spells/attack/terra_wave.lua b/data/scripts/spells/attack/terra_wave.lua similarity index 100% rename from data-canary/scripts/spells/attack/terra_wave.lua rename to data/scripts/spells/attack/terra_wave.lua diff --git a/data-canary/scripts/spells/attack/ultimate_energy_strike.lua b/data/scripts/spells/attack/ultimate_energy_strike.lua similarity index 100% rename from data-canary/scripts/spells/attack/ultimate_energy_strike.lua rename to data/scripts/spells/attack/ultimate_energy_strike.lua diff --git a/data-canary/scripts/spells/attack/ultimate_flame_strike.lua b/data/scripts/spells/attack/ultimate_flame_strike.lua similarity index 100% rename from data-canary/scripts/spells/attack/ultimate_flame_strike.lua rename to data/scripts/spells/attack/ultimate_flame_strike.lua diff --git a/data-canary/scripts/spells/attack/ultimate_ice_strike.lua b/data/scripts/spells/attack/ultimate_ice_strike.lua similarity index 100% rename from data-canary/scripts/spells/attack/ultimate_ice_strike.lua rename to data/scripts/spells/attack/ultimate_ice_strike.lua diff --git a/data-canary/scripts/spells/attack/ultimate_terra_strike.lua b/data/scripts/spells/attack/ultimate_terra_strike.lua similarity index 100% rename from data-canary/scripts/spells/attack/ultimate_terra_strike.lua rename to data/scripts/spells/attack/ultimate_terra_strike.lua diff --git a/data-canary/scripts/spells/attack/whirlwind_throw.lua b/data/scripts/spells/attack/whirlwind_throw.lua similarity index 100% rename from data-canary/scripts/spells/attack/whirlwind_throw.lua rename to data/scripts/spells/attack/whirlwind_throw.lua diff --git a/data-canary/scripts/spells/attack/wrath_of_nature.lua b/data/scripts/spells/attack/wrath_of_nature.lua similarity index 100% rename from data-canary/scripts/spells/attack/wrath_of_nature.lua rename to data/scripts/spells/attack/wrath_of_nature.lua diff --git a/data-canary/scripts/spells/conjuring/animate_dead_rune.lua b/data/scripts/spells/conjuring/animate_dead_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/animate_dead_rune.lua rename to data/scripts/spells/conjuring/animate_dead_rune.lua diff --git a/data-canary/scripts/spells/conjuring/arrow_call.lua b/data/scripts/spells/conjuring/arrow_call.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/arrow_call.lua rename to data/scripts/spells/conjuring/arrow_call.lua diff --git a/data-canary/scripts/spells/conjuring/avalanche_rune.lua b/data/scripts/spells/conjuring/avalanche_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/avalanche_rune.lua rename to data/scripts/spells/conjuring/avalanche_rune.lua diff --git a/data-canary/scripts/spells/conjuring/blank_rune.lua b/data/scripts/spells/conjuring/blank_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/blank_rune.lua rename to data/scripts/spells/conjuring/blank_rune.lua diff --git a/data-canary/scripts/spells/conjuring/chameleon_rune.lua b/data/scripts/spells/conjuring/chameleon_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/chameleon_rune.lua rename to data/scripts/spells/conjuring/chameleon_rune.lua diff --git a/data-canary/scripts/spells/conjuring/conjure_arrow.lua b/data/scripts/spells/conjuring/conjure_arrow.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/conjure_arrow.lua rename to data/scripts/spells/conjuring/conjure_arrow.lua diff --git a/data-canary/scripts/spells/conjuring/conjure_bolt.lua b/data/scripts/spells/conjuring/conjure_bolt.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/conjure_bolt.lua rename to data/scripts/spells/conjuring/conjure_bolt.lua diff --git a/data-canary/scripts/spells/conjuring/Conjure_Diamond_Arrow.lua b/data/scripts/spells/conjuring/conjure_diamond_arrow.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/Conjure_Diamond_Arrow.lua rename to data/scripts/spells/conjuring/conjure_diamond_arrow.lua diff --git a/data-canary/scripts/spells/conjuring/conjure_explosive_arrow.lua b/data/scripts/spells/conjuring/conjure_explosive_arrow.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/conjure_explosive_arrow.lua rename to data/scripts/spells/conjuring/conjure_explosive_arrow.lua diff --git a/data-canary/scripts/spells/conjuring/conjure_piercing_bolt.lua b/data/scripts/spells/conjuring/conjure_piercing_bolt.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/conjure_piercing_bolt.lua rename to data/scripts/spells/conjuring/conjure_piercing_bolt.lua diff --git a/data-canary/scripts/spells/conjuring/conjure_poisoned_arrow.lua b/data/scripts/spells/conjuring/conjure_poisoned_arrow.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/conjure_poisoned_arrow.lua rename to data/scripts/spells/conjuring/conjure_poisoned_arrow.lua diff --git a/data-canary/scripts/spells/conjuring/conjure_power_bolt.lua b/data/scripts/spells/conjuring/conjure_power_bolt.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/conjure_power_bolt.lua rename to data/scripts/spells/conjuring/conjure_power_bolt.lua diff --git a/data-canary/scripts/spells/conjuring/Conjure_Royal_Star.lua b/data/scripts/spells/conjuring/conjure_royal_star.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/Conjure_Royal_Star.lua rename to data/scripts/spells/conjuring/conjure_royal_star.lua diff --git a/data-canary/scripts/spells/conjuring/conjure_sniper_arrow.lua b/data/scripts/spells/conjuring/conjure_sniper_arrow.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/conjure_sniper_arrow.lua rename to data/scripts/spells/conjuring/conjure_sniper_arrow.lua diff --git a/data-canary/scripts/spells/conjuring/Conjure_Spectral_Bolt.lua b/data/scripts/spells/conjuring/conjure_spectral_bolt.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/Conjure_Spectral_Bolt.lua rename to data/scripts/spells/conjuring/conjure_spectral_bolt.lua diff --git a/data-canary/scripts/spells/conjuring/Conjure_Wand_of_Darkness.lua b/data/scripts/spells/conjuring/conjure_wand_of_darkness.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/Conjure_Wand_of_Darkness.lua rename to data/scripts/spells/conjuring/conjure_wand_of_darkness.lua diff --git a/data-canary/scripts/spells/conjuring/convince_creature_rune.lua b/data/scripts/spells/conjuring/convince_creature_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/convince_creature_rune.lua rename to data/scripts/spells/conjuring/convince_creature_rune.lua diff --git a/data-canary/scripts/spells/conjuring/cure_poison_rune.lua b/data/scripts/spells/conjuring/cure_poison_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/cure_poison_rune.lua rename to data/scripts/spells/conjuring/cure_poison_rune.lua diff --git a/data-canary/scripts/spells/conjuring/destroy_field_rune.lua b/data/scripts/spells/conjuring/destroy_field_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/destroy_field_rune.lua rename to data/scripts/spells/conjuring/destroy_field_rune.lua diff --git a/data-canary/scripts/spells/conjuring/disintegrate_rune.lua b/data/scripts/spells/conjuring/disintegrate_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/disintegrate_rune.lua rename to data/scripts/spells/conjuring/disintegrate_rune.lua diff --git a/data-canary/scripts/spells/conjuring/enchant_spear.lua b/data/scripts/spells/conjuring/enchant_spear.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/enchant_spear.lua rename to data/scripts/spells/conjuring/enchant_spear.lua diff --git a/data-canary/scripts/spells/conjuring/enchant_staff.lua b/data/scripts/spells/conjuring/enchant_staff.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/enchant_staff.lua rename to data/scripts/spells/conjuring/enchant_staff.lua diff --git a/data-canary/scripts/spells/conjuring/energy_bomb_rune.lua b/data/scripts/spells/conjuring/energy_bomb_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/energy_bomb_rune.lua rename to data/scripts/spells/conjuring/energy_bomb_rune.lua diff --git a/data-canary/scripts/spells/conjuring/energy_field_rune.lua b/data/scripts/spells/conjuring/energy_field_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/energy_field_rune.lua rename to data/scripts/spells/conjuring/energy_field_rune.lua diff --git a/data-canary/scripts/spells/conjuring/energy_wall_rune.lua b/data/scripts/spells/conjuring/energy_wall_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/energy_wall_rune.lua rename to data/scripts/spells/conjuring/energy_wall_rune.lua diff --git a/data-canary/scripts/spells/conjuring/explosion_rune.lua b/data/scripts/spells/conjuring/explosion_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/explosion_rune.lua rename to data/scripts/spells/conjuring/explosion_rune.lua diff --git a/data-canary/scripts/spells/conjuring/fire_bomb_rune.lua b/data/scripts/spells/conjuring/fire_bomb_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/fire_bomb_rune.lua rename to data/scripts/spells/conjuring/fire_bomb_rune.lua diff --git a/data-canary/scripts/spells/conjuring/fire_field_rune.lua b/data/scripts/spells/conjuring/fire_field_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/fire_field_rune.lua rename to data/scripts/spells/conjuring/fire_field_rune.lua diff --git a/data-canary/scripts/spells/conjuring/fire_wall_rune.lua b/data/scripts/spells/conjuring/fire_wall_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/fire_wall_rune.lua rename to data/scripts/spells/conjuring/fire_wall_rune.lua diff --git a/data-canary/scripts/spells/conjuring/fireball_rune.lua b/data/scripts/spells/conjuring/fireball_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/fireball_rune.lua rename to data/scripts/spells/conjuring/fireball_rune.lua diff --git a/data-canary/scripts/spells/conjuring/great_fireball_rune.lua b/data/scripts/spells/conjuring/great_fireball_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/great_fireball_rune.lua rename to data/scripts/spells/conjuring/great_fireball_rune.lua diff --git a/data-canary/scripts/spells/conjuring/heavy_magic_missile_rune.lua b/data/scripts/spells/conjuring/heavy_magic_missile_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/heavy_magic_missile_rune.lua rename to data/scripts/spells/conjuring/heavy_magic_missile_rune.lua diff --git a/data-canary/scripts/spells/conjuring/holy_missile_rune.lua b/data/scripts/spells/conjuring/holy_missile_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/holy_missile_rune.lua rename to data/scripts/spells/conjuring/holy_missile_rune.lua diff --git a/data-canary/scripts/spells/conjuring/icicle_rune.lua b/data/scripts/spells/conjuring/icicle_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/icicle_rune.lua rename to data/scripts/spells/conjuring/icicle_rune.lua diff --git a/data-canary/scripts/spells/conjuring/intense_healing_rune.lua b/data/scripts/spells/conjuring/intense_healing_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/intense_healing_rune.lua rename to data/scripts/spells/conjuring/intense_healing_rune.lua diff --git a/data-canary/scripts/spells/conjuring/light_magic_missile_rune.lua b/data/scripts/spells/conjuring/light_magic_missile_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/light_magic_missile_rune.lua rename to data/scripts/spells/conjuring/light_magic_missile_rune.lua diff --git a/data-canary/scripts/spells/conjuring/light_stone_shower_rune.lua b/data/scripts/spells/conjuring/light_stone_shower_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/light_stone_shower_rune.lua rename to data/scripts/spells/conjuring/light_stone_shower_rune.lua diff --git a/data-canary/scripts/spells/conjuring/lightest_magic_missile_rune.lua b/data/scripts/spells/conjuring/lightest_magic_missile_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/lightest_magic_missile_rune.lua rename to data/scripts/spells/conjuring/lightest_magic_missile_rune.lua diff --git a/data-canary/scripts/spells/conjuring/lightest_missile_rune.lua b/data/scripts/spells/conjuring/lightest_missile_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/lightest_missile_rune.lua rename to data/scripts/spells/conjuring/lightest_missile_rune.lua diff --git a/data-canary/scripts/spells/conjuring/magic_wall_rune.lua b/data/scripts/spells/conjuring/magic_wall_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/magic_wall_rune.lua rename to data/scripts/spells/conjuring/magic_wall_rune.lua diff --git a/data-canary/scripts/spells/conjuring/paralyze_rune.lua b/data/scripts/spells/conjuring/paralyze_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/paralyze_rune.lua rename to data/scripts/spells/conjuring/paralyze_rune.lua diff --git a/data-canary/scripts/spells/conjuring/poison_bomb_rune.lua b/data/scripts/spells/conjuring/poison_bomb_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/poison_bomb_rune.lua rename to data/scripts/spells/conjuring/poison_bomb_rune.lua diff --git a/data-canary/scripts/spells/conjuring/poison_field_rune.lua b/data/scripts/spells/conjuring/poison_field_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/poison_field_rune.lua rename to data/scripts/spells/conjuring/poison_field_rune.lua diff --git a/data-canary/scripts/spells/conjuring/poison_wall_rune.lua b/data/scripts/spells/conjuring/poison_wall_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/poison_wall_rune.lua rename to data/scripts/spells/conjuring/poison_wall_rune.lua diff --git a/data-canary/scripts/spells/conjuring/soulfire_rune.lua b/data/scripts/spells/conjuring/soulfire_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/soulfire_rune.lua rename to data/scripts/spells/conjuring/soulfire_rune.lua diff --git a/data-canary/scripts/spells/conjuring/stalagmite_rune.lua b/data/scripts/spells/conjuring/stalagmite_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/stalagmite_rune.lua rename to data/scripts/spells/conjuring/stalagmite_rune.lua diff --git a/data-canary/scripts/spells/conjuring/stone_shower_rune.lua b/data/scripts/spells/conjuring/stone_shower_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/stone_shower_rune.lua rename to data/scripts/spells/conjuring/stone_shower_rune.lua diff --git a/data-canary/scripts/spells/conjuring/sudden_death_rune.lua b/data/scripts/spells/conjuring/sudden_death_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/sudden_death_rune.lua rename to data/scripts/spells/conjuring/sudden_death_rune.lua diff --git a/data-canary/scripts/spells/conjuring/thunderstorm_rune.lua b/data/scripts/spells/conjuring/thunderstorm_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/thunderstorm_rune.lua rename to data/scripts/spells/conjuring/thunderstorm_rune.lua diff --git a/data-canary/scripts/spells/conjuring/ultimate_healing_rune.lua b/data/scripts/spells/conjuring/ultimate_healing_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/ultimate_healing_rune.lua rename to data/scripts/spells/conjuring/ultimate_healing_rune.lua diff --git a/data-canary/scripts/spells/conjuring/wild_growth_rune.lua b/data/scripts/spells/conjuring/wild_growth_rune.lua similarity index 100% rename from data-canary/scripts/spells/conjuring/wild_growth_rune.lua rename to data/scripts/spells/conjuring/wild_growth_rune.lua diff --git a/data-otservbr-global/scripts/spells/familiar/druid_familiar.lua b/data/scripts/spells/familiar/druid_familiar.lua similarity index 100% rename from data-otservbr-global/scripts/spells/familiar/druid_familiar.lua rename to data/scripts/spells/familiar/druid_familiar.lua diff --git a/data-otservbr-global/scripts/spells/familiar/knight_familiar.lua b/data/scripts/spells/familiar/knight_familiar.lua similarity index 100% rename from data-otservbr-global/scripts/spells/familiar/knight_familiar.lua rename to data/scripts/spells/familiar/knight_familiar.lua diff --git a/data-otservbr-global/scripts/spells/familiar/paladin_familiar.lua b/data/scripts/spells/familiar/paladin_familiar.lua similarity index 100% rename from data-otservbr-global/scripts/spells/familiar/paladin_familiar.lua rename to data/scripts/spells/familiar/paladin_familiar.lua diff --git a/data-otservbr-global/scripts/spells/familiar/sorcerer_familiar.lua b/data/scripts/spells/familiar/sorcerer_familiar.lua similarity index 100% rename from data-otservbr-global/scripts/spells/familiar/sorcerer_familiar.lua rename to data/scripts/spells/familiar/sorcerer_familiar.lua diff --git a/data-canary/scripts/spells/healing/bruise_bane.lua b/data/scripts/spells/healing/bruise_bane.lua similarity index 100% rename from data-canary/scripts/spells/healing/bruise_bane.lua rename to data/scripts/spells/healing/bruise_bane.lua diff --git a/data-canary/scripts/spells/healing/cure_bleeding.lua b/data/scripts/spells/healing/cure_bleeding.lua similarity index 100% rename from data-canary/scripts/spells/healing/cure_bleeding.lua rename to data/scripts/spells/healing/cure_bleeding.lua diff --git a/data-canary/scripts/spells/healing/cure_burning.lua b/data/scripts/spells/healing/cure_burning.lua similarity index 100% rename from data-canary/scripts/spells/healing/cure_burning.lua rename to data/scripts/spells/healing/cure_burning.lua diff --git a/data-canary/scripts/spells/healing/cure_curse.lua b/data/scripts/spells/healing/cure_curse.lua similarity index 100% rename from data-canary/scripts/spells/healing/cure_curse.lua rename to data/scripts/spells/healing/cure_curse.lua diff --git a/data-canary/scripts/spells/healing/cure_electrification.lua b/data/scripts/spells/healing/cure_electrification.lua similarity index 100% rename from data-canary/scripts/spells/healing/cure_electrification.lua rename to data/scripts/spells/healing/cure_electrification.lua diff --git a/data-canary/scripts/spells/healing/cure_poison.lua b/data/scripts/spells/healing/cure_poison.lua similarity index 100% rename from data-canary/scripts/spells/healing/cure_poison.lua rename to data/scripts/spells/healing/cure_poison.lua diff --git a/data-canary/scripts/spells/healing/divine_healing.lua b/data/scripts/spells/healing/divine_healing.lua similarity index 100% rename from data-canary/scripts/spells/healing/divine_healing.lua rename to data/scripts/spells/healing/divine_healing.lua diff --git a/data-canary/scripts/spells/healing/fair_wound_cleansing.lua b/data/scripts/spells/healing/fair_wound_cleansing.lua similarity index 100% rename from data-canary/scripts/spells/healing/fair_wound_cleansing.lua rename to data/scripts/spells/healing/fair_wound_cleansing.lua diff --git a/data-canary/scripts/spells/healing/heal_friend.lua b/data/scripts/spells/healing/heal_friend.lua similarity index 100% rename from data-canary/scripts/spells/healing/heal_friend.lua rename to data/scripts/spells/healing/heal_friend.lua diff --git a/data-canary/scripts/spells/healing/heal_monsters.lua b/data/scripts/spells/healing/heal_monsters.lua similarity index 100% rename from data-canary/scripts/spells/healing/heal_monsters.lua rename to data/scripts/spells/healing/heal_monsters.lua diff --git a/data-canary/scripts/spells/healing/heal_monsters_9x9.lua b/data/scripts/spells/healing/heal_monsters_9x9.lua similarity index 100% rename from data-canary/scripts/spells/healing/heal_monsters_9x9.lua rename to data/scripts/spells/healing/heal_monsters_9x9.lua diff --git a/data-canary/scripts/spells/healing/intense_healing.lua b/data/scripts/spells/healing/intense_healing.lua similarity index 100% rename from data-canary/scripts/spells/healing/intense_healing.lua rename to data/scripts/spells/healing/intense_healing.lua diff --git a/data-canary/scripts/spells/healing/intense_recovery.lua b/data/scripts/spells/healing/intense_recovery.lua similarity index 100% rename from data-canary/scripts/spells/healing/intense_recovery.lua rename to data/scripts/spells/healing/intense_recovery.lua diff --git a/data-canary/scripts/spells/healing/intense_wound_cleansing.lua b/data/scripts/spells/healing/intense_wound_cleansing.lua similarity index 100% rename from data-canary/scripts/spells/healing/intense_wound_cleansing.lua rename to data/scripts/spells/healing/intense_wound_cleansing.lua diff --git a/data-canary/scripts/spells/healing/light_healing.lua b/data/scripts/spells/healing/light_healing.lua similarity index 100% rename from data-canary/scripts/spells/healing/light_healing.lua rename to data/scripts/spells/healing/light_healing.lua diff --git a/data-canary/scripts/spells/healing/magic_patch.lua b/data/scripts/spells/healing/magic_patch.lua similarity index 100% rename from data-canary/scripts/spells/healing/magic_patch.lua rename to data/scripts/spells/healing/magic_patch.lua diff --git a/data-otservbr-global/scripts/spells/healing/mass_healing.lua b/data/scripts/spells/healing/mass_healing.lua similarity index 100% rename from data-otservbr-global/scripts/spells/healing/mass_healing.lua rename to data/scripts/spells/healing/mass_healing.lua diff --git a/data-canary/scripts/spells/healing/nature's_embrace.lua b/data/scripts/spells/healing/nature's_embrace.lua similarity index 100% rename from data-canary/scripts/spells/healing/nature's_embrace.lua rename to data/scripts/spells/healing/nature's_embrace.lua diff --git a/data-canary/scripts/spells/healing/practice_healing.lua b/data/scripts/spells/healing/practice_healing.lua similarity index 100% rename from data-canary/scripts/spells/healing/practice_healing.lua rename to data/scripts/spells/healing/practice_healing.lua diff --git a/data-canary/scripts/spells/healing/recovery.lua b/data/scripts/spells/healing/recovery.lua similarity index 100% rename from data-canary/scripts/spells/healing/recovery.lua rename to data/scripts/spells/healing/recovery.lua diff --git a/data-canary/scripts/spells/healing/restoration.lua b/data/scripts/spells/healing/restoration.lua similarity index 100% rename from data-canary/scripts/spells/healing/restoration.lua rename to data/scripts/spells/healing/restoration.lua diff --git a/data-canary/scripts/spells/healing/salvation.lua b/data/scripts/spells/healing/salvation.lua similarity index 100% rename from data-canary/scripts/spells/healing/salvation.lua rename to data/scripts/spells/healing/salvation.lua diff --git a/data-canary/scripts/spells/healing/ultimate_healing.lua b/data/scripts/spells/healing/ultimate_healing.lua similarity index 100% rename from data-canary/scripts/spells/healing/ultimate_healing.lua rename to data/scripts/spells/healing/ultimate_healing.lua diff --git a/data-canary/scripts/spells/healing/wound_cleansing.lua b/data/scripts/spells/healing/wound_cleansing.lua similarity index 100% rename from data-canary/scripts/spells/healing/wound_cleansing.lua rename to data/scripts/spells/healing/wound_cleansing.lua diff --git a/data-canary/scripts/spells/house/edit_door_list.lua b/data/scripts/spells/house/edit_door_list.lua similarity index 100% rename from data-canary/scripts/spells/house/edit_door_list.lua rename to data/scripts/spells/house/edit_door_list.lua diff --git a/data-canary/scripts/spells/house/edit_guest_list.lua b/data/scripts/spells/house/edit_guest_list.lua similarity index 100% rename from data-canary/scripts/spells/house/edit_guest_list.lua rename to data/scripts/spells/house/edit_guest_list.lua diff --git a/data-canary/scripts/spells/house/edit_subowner_list.lua b/data/scripts/spells/house/edit_subowner_list.lua similarity index 100% rename from data-canary/scripts/spells/house/edit_subowner_list.lua rename to data/scripts/spells/house/edit_subowner_list.lua diff --git a/data-otservbr-global/scripts/spells/house/kick.lua b/data/scripts/spells/house/kick.lua similarity index 100% rename from data-otservbr-global/scripts/spells/house/kick.lua rename to data/scripts/spells/house/kick.lua diff --git a/data-otservbr-global/scripts/spells/party/enchant_party.lua b/data/scripts/spells/party/enchant_party.lua similarity index 100% rename from data-otservbr-global/scripts/spells/party/enchant_party.lua rename to data/scripts/spells/party/enchant_party.lua diff --git a/data-canary/scripts/spells/party/heal_party.lua b/data/scripts/spells/party/heal_party.lua similarity index 100% rename from data-canary/scripts/spells/party/heal_party.lua rename to data/scripts/spells/party/heal_party.lua diff --git a/data-canary/scripts/spells/party/protect_party.lua b/data/scripts/spells/party/protect_party.lua similarity index 100% rename from data-canary/scripts/spells/party/protect_party.lua rename to data/scripts/spells/party/protect_party.lua diff --git a/data-otservbr-global/scripts/spells/party/train_party.lua b/data/scripts/spells/party/train_party.lua similarity index 100% rename from data-otservbr-global/scripts/spells/party/train_party.lua rename to data/scripts/spells/party/train_party.lua diff --git a/data-otservbr-global/scripts/spells/support/avatar_of_light.lua b/data/scripts/spells/support/avatar_of_light.lua similarity index 97% rename from data-otservbr-global/scripts/spells/support/avatar_of_light.lua rename to data/scripts/spells/support/avatar_of_light.lua index 80d56b8f672..edc25c4f66e 100644 --- a/data-otservbr-global/scripts/spells/support/avatar_of_light.lua +++ b/data/scripts/spells/support/avatar_of_light.lua @@ -40,8 +40,8 @@ spell:group("support") spell:id(265) spell:name("Avatar of Light") spell:words("uteta res sac") -spell:level(1) -spell:mana(800) +spell:level(300) +spell:mana(1500) spell:isPremium(true) spell:cooldown(1000) -- Cooldown is calculated on the casting spell:groupCooldown(2 * 1000) diff --git a/data-otservbr-global/scripts/spells/support/avatar_of_nature.lua b/data/scripts/spells/support/avatar_of_nature.lua similarity index 97% rename from data-otservbr-global/scripts/spells/support/avatar_of_nature.lua rename to data/scripts/spells/support/avatar_of_nature.lua index 4cbae9bb009..0bd1473c3ca 100644 --- a/data-otservbr-global/scripts/spells/support/avatar_of_nature.lua +++ b/data/scripts/spells/support/avatar_of_nature.lua @@ -40,8 +40,8 @@ spell:group("support") spell:id(267) spell:name("Avatar of Nature") spell:words("uteta res dru") -spell:level(1) -spell:mana(800) +spell:level(300) +spell:mana(2200) spell:isPremium(true) spell:cooldown(1000) -- Cooldown is calculated on the casting spell:groupCooldown(2 * 1000) diff --git a/data-otservbr-global/scripts/spells/support/avatar_of_steel.lua b/data/scripts/spells/support/avatar_of_steel.lua similarity index 98% rename from data-otservbr-global/scripts/spells/support/avatar_of_steel.lua rename to data/scripts/spells/support/avatar_of_steel.lua index ca940308a60..8380a524c6d 100644 --- a/data-otservbr-global/scripts/spells/support/avatar_of_steel.lua +++ b/data/scripts/spells/support/avatar_of_steel.lua @@ -40,7 +40,7 @@ spell:group("support") spell:id(264) spell:name("Avatar of Steel") spell:words("uteta res eq") -spell:level(1) +spell:level(300) spell:mana(800) spell:isPremium(true) spell:cooldown(1000) -- Cooldown is calculated on the casting diff --git a/data-otservbr-global/scripts/spells/support/avatar_of_storm.lua b/data/scripts/spells/support/avatar_of_storm.lua similarity index 97% rename from data-otservbr-global/scripts/spells/support/avatar_of_storm.lua rename to data/scripts/spells/support/avatar_of_storm.lua index e701f501a85..79bb4e3b37e 100644 --- a/data-otservbr-global/scripts/spells/support/avatar_of_storm.lua +++ b/data/scripts/spells/support/avatar_of_storm.lua @@ -40,8 +40,8 @@ spell:group("support") spell:id(266) spell:name("Avatar of Storm") spell:words("uteta res ven") -spell:level(1) -spell:mana(800) +spell:level(300) +spell:mana(2200) spell:isPremium(true) spell:cooldown(1000) -- Cooldown is calculated on the casting spell:groupCooldown(2 * 1000) diff --git a/data-otservbr-global/scripts/spells/support/blood_rage.lua b/data/scripts/spells/support/blood_rage.lua similarity index 100% rename from data-otservbr-global/scripts/spells/support/blood_rage.lua rename to data/scripts/spells/support/blood_rage.lua diff --git a/data-canary/scripts/spells/support/cancel_invisibility.lua b/data/scripts/spells/support/cancel_invisibility.lua similarity index 100% rename from data-canary/scripts/spells/support/cancel_invisibility.lua rename to data/scripts/spells/support/cancel_invisibility.lua diff --git a/data-canary/scripts/spells/support/cancel_magic_shield.lua b/data/scripts/spells/support/cancel_magic_shield.lua similarity index 100% rename from data-canary/scripts/spells/support/cancel_magic_shield.lua rename to data/scripts/spells/support/cancel_magic_shield.lua diff --git a/data-canary/scripts/spells/support/challenge.lua b/data/scripts/spells/support/challenge.lua similarity index 100% rename from data-canary/scripts/spells/support/challenge.lua rename to data/scripts/spells/support/challenge.lua diff --git a/data-otservbr-global/scripts/spells/support/charge.lua b/data/scripts/spells/support/charge.lua similarity index 100% rename from data-otservbr-global/scripts/spells/support/charge.lua rename to data/scripts/spells/support/charge.lua diff --git a/data-otservbr-global/scripts/spells/support/chivalrous_challenge.lua b/data/scripts/spells/support/chivalrous_challenge.lua similarity index 100% rename from data-otservbr-global/scripts/spells/support/chivalrous_challenge.lua rename to data/scripts/spells/support/chivalrous_challenge.lua diff --git a/data-canary/scripts/spells/support/creature_illusion.lua b/data/scripts/spells/support/creature_illusion.lua similarity index 100% rename from data-canary/scripts/spells/support/creature_illusion.lua rename to data/scripts/spells/support/creature_illusion.lua diff --git a/data-otservbr-global/scripts/spells/support/divine_dazzle.lua b/data/scripts/spells/support/divine_dazzle.lua similarity index 100% rename from data-otservbr-global/scripts/spells/support/divine_dazzle.lua rename to data/scripts/spells/support/divine_dazzle.lua diff --git a/data-otservbr-global/scripts/spells/support/divine_empowerment.lua b/data/scripts/spells/support/divine_empowerment.lua similarity index 99% rename from data-otservbr-global/scripts/spells/support/divine_empowerment.lua rename to data/scripts/spells/support/divine_empowerment.lua index 05fcb2b8a42..e05203359f8 100644 --- a/data-otservbr-global/scripts/spells/support/divine_empowerment.lua +++ b/data/scripts/spells/support/divine_empowerment.lua @@ -57,7 +57,7 @@ spell:group("support") spell:id(268) spell:name("Divine Empowerment") spell:words("utevo grav san") -spell:level(1) +spell:level(300) spell:mana(500) spell:isPremium(true) spell:range(7) diff --git a/data-otservbr-global/scripts/spells/support/expose_weakness.lua b/data/scripts/spells/support/expose_weakness.lua similarity index 100% rename from data-otservbr-global/scripts/spells/support/expose_weakness.lua rename to data/scripts/spells/support/expose_weakness.lua diff --git a/data-otservbr-global/scripts/spells/support/find_fiend.lua b/data/scripts/spells/support/find_fiend.lua similarity index 98% rename from data-otservbr-global/scripts/spells/support/find_fiend.lua rename to data/scripts/spells/support/find_fiend.lua index dd2a91f0584..fe1c040f956 100644 --- a/data-otservbr-global/scripts/spells/support/find_fiend.lua +++ b/data/scripts/spells/support/find_fiend.lua @@ -101,7 +101,7 @@ function spell.onCastSpell(creature, variant) message = string.format(message .. " " .. ForgeMonster:getTimeLeftToChangeMonster(target)) end - creature:sendTextMessage(MESSAGE_INFO_DESCR, message) + creature:sendTextMessage(MESSAGE_LOOK, message) creaturePosition:sendMagicEffect(CONST_ME_MAGIC_BLUE) return true end diff --git a/data-canary/scripts/spells/support/find_person.lua b/data/scripts/spells/support/find_person.lua similarity index 100% rename from data-canary/scripts/spells/support/find_person.lua rename to data/scripts/spells/support/find_person.lua diff --git a/data-canary/scripts/spells/support/food.lua b/data/scripts/spells/support/food.lua similarity index 100% rename from data-canary/scripts/spells/support/food.lua rename to data/scripts/spells/support/food.lua diff --git a/data-canary/scripts/spells/support/great_light.lua b/data/scripts/spells/support/great_light.lua similarity index 100% rename from data-canary/scripts/spells/support/great_light.lua rename to data/scripts/spells/support/great_light.lua diff --git a/data-otservbr-global/scripts/spells/support/haste.lua b/data/scripts/spells/support/haste.lua similarity index 100% rename from data-otservbr-global/scripts/spells/support/haste.lua rename to data/scripts/spells/support/haste.lua diff --git a/data-canary/scripts/spells/support/invisible.lua b/data/scripts/spells/support/invisible.lua similarity index 100% rename from data-canary/scripts/spells/support/invisible.lua rename to data/scripts/spells/support/invisible.lua diff --git a/data-canary/scripts/spells/support/levitate.lua b/data/scripts/spells/support/levitate.lua similarity index 100% rename from data-canary/scripts/spells/support/levitate.lua rename to data/scripts/spells/support/levitate.lua diff --git a/data-canary/scripts/spells/support/light.lua b/data/scripts/spells/support/light.lua similarity index 100% rename from data-canary/scripts/spells/support/light.lua rename to data/scripts/spells/support/light.lua diff --git a/data-canary/scripts/spells/support/magic_rope.lua b/data/scripts/spells/support/magic_rope.lua similarity index 100% rename from data-canary/scripts/spells/support/magic_rope.lua rename to data/scripts/spells/support/magic_rope.lua diff --git a/data-otservbr-global/scripts/spells/support/magic_shield.lua b/data/scripts/spells/support/magic_shield.lua similarity index 100% rename from data-otservbr-global/scripts/spells/support/magic_shield.lua rename to data/scripts/spells/support/magic_shield.lua diff --git a/data-otservbr-global/scripts/spells/support/protector.lua b/data/scripts/spells/support/protector.lua similarity index 100% rename from data-otservbr-global/scripts/spells/support/protector.lua rename to data/scripts/spells/support/protector.lua diff --git a/data-otservbr-global/scripts/spells/support/sap_strength.lua b/data/scripts/spells/support/sap_strength.lua similarity index 100% rename from data-otservbr-global/scripts/spells/support/sap_strength.lua rename to data/scripts/spells/support/sap_strength.lua diff --git a/data-otservbr-global/scripts/spells/support/sharpshooter.lua b/data/scripts/spells/support/sharpshooter.lua similarity index 100% rename from data-otservbr-global/scripts/spells/support/sharpshooter.lua rename to data/scripts/spells/support/sharpshooter.lua diff --git a/data-otservbr-global/scripts/spells/support/strong_haste.lua b/data/scripts/spells/support/strong_haste.lua similarity index 100% rename from data-otservbr-global/scripts/spells/support/strong_haste.lua rename to data/scripts/spells/support/strong_haste.lua diff --git a/data-canary/scripts/spells/summon/summon_creature.lua b/data/scripts/spells/support/summon_creature.lua similarity index 100% rename from data-canary/scripts/spells/summon/summon_creature.lua rename to data/scripts/spells/support/summon_creature.lua diff --git a/data-otservbr-global/scripts/spells/support/swift_foot.lua b/data/scripts/spells/support/swift_foot.lua similarity index 100% rename from data-otservbr-global/scripts/spells/support/swift_foot.lua rename to data/scripts/spells/support/swift_foot.lua diff --git a/data-canary/scripts/spells/support/ultimate_light.lua b/data/scripts/spells/support/ultimate_light.lua similarity index 100% rename from data-canary/scripts/spells/support/ultimate_light.lua rename to data/scripts/spells/support/ultimate_light.lua diff --git a/data-otservbr-global/scripts/bestiary/charms.lua b/data/scripts/systems/bestiary_charms.lua similarity index 100% rename from data-otservbr-global/scripts/bestiary/charms.lua rename to data/scripts/systems/bestiary_charms.lua diff --git a/data/scripts/discord_webhook/discord_webhook.lua b/data/scripts/systems/discord_webhook.lua similarity index 100% rename from data/scripts/discord_webhook/discord_webhook.lua rename to data/scripts/systems/discord_webhook.lua diff --git a/data-otservbr-global/scripts/item_classification/item_tiers.lua b/data/scripts/systems/item_tiers.lua similarity index 100% rename from data-otservbr-global/scripts/item_classification/item_tiers.lua rename to data/scripts/systems/item_tiers.lua diff --git a/data/scripts/reward_chest/boss_death.lua b/data/scripts/systems/reward_chest.lua similarity index 73% rename from data/scripts/reward_chest/boss_death.lua rename to data/scripts/systems/reward_chest.lua index 900d8538d01..2ee8e297b2a 100644 --- a/data/scripts/reward_chest/boss_death.lua +++ b/data/scripts/systems/reward_chest.lua @@ -131,3 +131,60 @@ function bossDeath.onDeath(creature, corpse, killer, mostDamageKiller, lastHitUn end bossDeath:register() + +local bossParticipation = CreatureEvent("BossParticipation") + +function bossParticipation.onHealthChange(creature, attacker, primaryDamage, primaryType, secondaryDamage, secondaryType, origin) + if not next(_G.GlobalBosses) then + return primaryDamage, primaryType, secondaryDamage, secondaryType + end + + if not creature or not attacker then + return primaryDamage, primaryType, secondaryDamage, secondaryType + end + + local stats = creature:inBossFight() + if not stats then + return primaryDamage, primaryType, secondaryDamage, secondaryType + end + + local creatureId, attackerId = creature:getId(), attacker:getId() + -- Update player id + stats.playerId = creatureId + + -- Account for healing of others active in the boss fight + if primaryType == COMBAT_HEALING and attacker:isPlayer() and attackerId ~= creatureId then + local healerStats = GetPlayerStats(stats.bossId, attacker:getGuid(), true) + healerStats.active = true + -- Update player id + healerStats.playerId = attackerId + healerStats.healing = healerStats.healing + primaryDamage + elseif stats.bossId == attackerId then + -- Account for damage taken from the boss + stats.damageIn = stats.damageIn + primaryDamage + end + return primaryDamage, primaryType, secondaryDamage, secondaryType +end + +bossParticipation:register() + +local loginBossPlayer = CreatureEvent("LoginBossPlayer") + +function loginBossPlayer.onLogin(player) + player:registerEvent("BossDeath") + return true +end + +loginBossPlayer:register() + +local bossThink = CreatureEvent("BossThink") + +function bossThink.onThink(creature, interval) + if not creature then + return true + end + + ResetAndSetTargetList(creature) +end + +bossThink:register() diff --git a/data/scripts/talkactions/gm/ban.lua b/data/scripts/talkactions/gm/ban.lua index 8b46394a3e2..0ab07040333 100644 --- a/data/scripts/talkactions/gm/ban.lua +++ b/data/scripts/talkactions/gm/ban.lua @@ -37,11 +37,11 @@ function ban.onSay(player, words, param) local target = Player(name) if target then local text = target:getName() .. " has been banned" - player:sendTextMessage(MESSAGE_ADMINISTRADOR, text) + player:sendTextMessage(MESSAGE_ADMINISTRATOR, text) Webhook.sendMessage("Player Banned", text .. " reason: " .. reason .. ". (by: " .. player:getName() .. ")", WEBHOOK_COLOR_YELLOW, announcementChannels["serverAnnouncements"]) target:remove() else - player:sendTextMessage(MESSAGE_ADMINISTRADOR, name .. " has been banned.") + player:sendTextMessage(MESSAGE_ADMINISTRATOR, name .. " has been banned.") end end diff --git a/data/scripts/talkactions/gm/broadcast.lua b/data/scripts/talkactions/gm/broadcast.lua index 021f218ebe3..dffbe1bb0e9 100644 --- a/data/scripts/talkactions/gm/broadcast.lua +++ b/data/scripts/talkactions/gm/broadcast.lua @@ -5,7 +5,7 @@ function Broadcast(text, filter) if filter and not filter(targetPlayer) then goto continue end - targetPlayer:sendTextMessage(MESSAGE_ADMINISTRADOR, text) + targetPlayer:sendTextMessage(MESSAGE_ADMINISTRATOR, text) ::continue:: end end diff --git a/data/scripts/talkactions/gm/clean.lua b/data/scripts/talkactions/gm/clean.lua index 6fe5f3cddfa..18ab149e216 100644 --- a/data/scripts/talkactions/gm/clean.lua +++ b/data/scripts/talkactions/gm/clean.lua @@ -6,7 +6,7 @@ function clean.onSay(player, words, param) local itemCount = cleanMap() if itemCount ~= 0 then - player:sendTextMessage(MESSAGE_ADMINISTRADOR, "Cleaned " .. itemCount .. " item" .. (itemCount > 1 and "s" or "") .. " from the map.") + player:sendTextMessage(MESSAGE_ADMINISTRATOR, "Cleaned " .. itemCount .. " item" .. (itemCount > 1 and "s" or "") .. " from the map.") end return true end diff --git a/data/scripts/talkactions/gm/mc_check.lua b/data/scripts/talkactions/gm/mc_check.lua index c93661053e4..1815b7fdc9d 100644 --- a/data/scripts/talkactions/gm/mc_check.lua +++ b/data/scripts/talkactions/gm/mc_check.lua @@ -4,7 +4,7 @@ function mcCheck.onSay(player, words, param) -- create log logCommand(player, words, param) - player:sendTextMessage(MESSAGE_ADMINISTRADOR, "Multiclient Check List:") + player:sendTextMessage(MESSAGE_ADMINISTRATOR, "Multiclient Check List:") local ipList = {} local players = Game.getPlayers() for i = 1, #players do @@ -29,7 +29,7 @@ function mcCheck.onSay(player, words, param) tmpPlayer = list[i] message = ("%s, %s [%d]"):format(message, tmpPlayer:getName(), tmpPlayer:getLevel()) end - player:sendTextMessage(MESSAGE_ADMINISTRADOR, message .. ".") + player:sendTextMessage(MESSAGE_ADMINISTRATOR, message .. ".") end end return true diff --git a/data/scripts/talkactions/gm/namelock.lua b/data/scripts/talkactions/gm/namelock.lua index 1b204759e02..27e41710096 100644 --- a/data/scripts/talkactions/gm/namelock.lua +++ b/data/scripts/talkactions/gm/namelock.lua @@ -33,7 +33,7 @@ function namelock.onSay(player, words, param) target:kv():set("namelock", reason) local text = target:getName() .. " has been namelocked" logger.info(text .. ", reason: " .. reason) - player:sendTextMessage(MESSAGE_ADMINISTRADOR, text) + player:sendTextMessage(MESSAGE_ADMINISTRATOR, text) Webhook.sendMessage("Player Namelocked", text .. " reason: " .. reason .. ".", WEBHOOK_COLOR_YELLOW, announcementChannels["serverAnnouncements"]) if online then CheckNamelock(target) diff --git a/data/scripts/talkactions/gm/spy.lua b/data/scripts/talkactions/gm/spy.lua index 4466bc70d6d..7cd5c68ca56 100644 --- a/data/scripts/talkactions/gm/spy.lua +++ b/data/scripts/talkactions/gm/spy.lua @@ -1,4 +1,4 @@ -local function getItemsInContainer(cont, sep) +local function getItemsInContainer(container, sep) local text = "" local tsep = "" local count @@ -6,9 +6,9 @@ local function getItemsInContainer(cont, sep) tsep = tsep .. "-" end tsep = tsep .. ">" - for i = 0, getContainerSize(cont.uid) - 1 do - local item = getContainerItem(cont.uid, i) - if not isContainer(item.uid) then + for slot = 0, container:getSize() - 1 do + local item = container:getItem(slot) + if not item:isContainer() then if item.type > 0 then count = "(" .. item.type .. "x)" else @@ -16,7 +16,7 @@ local function getItemsInContainer(cont, sep) end text = text .. "\n" .. tsep .. ItemType(item.itemid):getName() .. " " .. count else - if getContainerSize(item.uid) > 0 then + if item:getSize() > 0 then text = text .. "\n" .. tsep .. ItemType(item.itemd):getName() text = text .. getItemsInContainer(item, sep + 2) else @@ -42,12 +42,12 @@ function spy.onSay(player, words, param) if target and target:isPlayer() then local slotName = { "Helmet", "Amulet", "Backpack", "Armor", "Right Hand", "Left Hand", "Legs", "Boots", "Ring", "Arrow" } - local text = "Equipments of " .. Creature(target):getName() + local text = "Equipments of " .. target:getName() for i = 1, 10 do text = text .. "\n\n" local item = target:getSlotItem(i) if item and item.itemid > 0 then - if isContainer(item.uid) then + if item:isContainer() then text = text .. slotName[i] .. ": " .. ItemType(item.itemid):getName() .. getItemsInContainer(item, 1) else local count diff --git a/data/scripts/talkactions/gm/unban.lua b/data/scripts/talkactions/gm/unban.lua index 264335eeec7..3d1caba8b77 100644 --- a/data/scripts/talkactions/gm/unban.lua +++ b/data/scripts/talkactions/gm/unban.lua @@ -18,7 +18,7 @@ function unban.onSay(player, words, param) db.asyncQuery("DELETE FROM `ip_bans` WHERE `ip` = " .. Result.getNumber(resultId, "lastip")) Result.free(resultId) local text = param .. " has been unbanned." - player:sendTextMessage(MESSAGE_ADMINISTRADOR, text) + player:sendTextMessage(MESSAGE_ADMINISTRATOR, text) Webhook.sendMessage("Player Unbanned", text .. " (by: " .. player:getName() .. ")", WEBHOOK_COLOR_YELLOW, announcementChannels["serverAnnouncements"]) return true end diff --git a/data/scripts/talkactions/god/achievement_functions.lua b/data/scripts/talkactions/god/achievement_functions.lua new file mode 100644 index 00000000000..b608f75ce25 --- /dev/null +++ b/data/scripts/talkactions/god/achievement_functions.lua @@ -0,0 +1,96 @@ +local addAchievement = TalkAction("/addachievement") + +function addAchievement.onSay(player, words, param) + logCommand(player, words, param) + local params = param:split(",") + if #params < 2 then + player:sendCancelMessage("Usage: /addachievement playerName, achievementId|Name") + return true + end + + local targetPlayerName, achievementIdentifier = params[1], params[2] + local targetPlayer = Player(targetPlayerName) + if not targetPlayer then + player:sendCancelMessage("Player " .. targetPlayerName .. " is not online.") + return true + end + + local achievementId = tonumber(achievementIdentifier) + local achievementName = tostring(achievementIdentifier):lower():trimSpace():titleCase() + local achievementInfo = achievementId and Game.getAchievementInfoById(achievementId) or Game.getAchievementInfoByName(achievementName) + if achievementInfo.id == 0 or achievementInfo.name == nil then + player:sendCancelMessage("Invalid achievement. Use valid ID or name.") + return true + end + + targetPlayer:addAchievement(achievementInfo.id, true) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Achievement " .. achievementInfo.name .. " added successfully to " .. targetPlayerName .. ".") + return true +end + +addAchievement:separator(" ") +addAchievement:groupType("god") +addAchievement:register() + +local removeAchievement = TalkAction("/removeachievement") + +function removeAchievement.onSay(player, words, param) + logCommand(player, words, param) + local params = param:split(",") + if #params < 2 then + player:sendCancelMessage("Usage: /removeachievement playerName, achievementId") + return true + end + + local targetPlayerName, achievementIdentifier = params[1], params[2] + local targetPlayer = Player(targetPlayerName) + if not targetPlayer then + player:sendCancelMessage("Player " .. targetPlayerName .. " is not online.") + return true + end + + local achievementId = tonumber(achievementIdentifier) + local achievementName = tostring(achievementIdentifier):lower():trimSpace():titleCase() + local achievementInfo = achievementId and Game.getAchievementInfoById(achievementId) or Game.getAchievementInfoByName(achievementName) + if not achievementInfo then + player:sendCancelMessage("Invalid achievement identifier. Use either ID or name.") + return true + end + + targetPlayer:removeAchievement(achievementInfo.id) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Achievement " .. achievementInfo.name .. " removed successfully.") + return true +end + +removeAchievement:separator(" ") +removeAchievement:groupType("god") +removeAchievement:register() + +local checkAchievements = TalkAction("/checkachievements") + +function checkAchievements.onSay(player, words, param) + logCommand(player, words, param) + if param == "" then + player:sendCancelMessage("Usage: /checkachievements playerName") + return true + end + + local targetPlayer = Player(param) + if not targetPlayer then + player:sendCancelMessage("Player " .. param .. " is not online.") + return true + end + + local ACHIEVEMENTS = targetPlayer:getAchievements() + local message = "Achievements: " + for _, achievementId in pairs(ACHIEVEMENTS) do + local achievementInfo = Game.getAchievementInfoById(achievementId) + message = message .. achievementInfo.name .. ", " + end + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, message) + return true +end + +checkAchievements:separator(" ") +checkAchievements:groupType("god") +checkAchievements:register() diff --git a/data/scripts/talkactions/god/add_bosstiary_kills.lua b/data/scripts/talkactions/god/add_bosstiary_kills.lua index 4e5aecdfbd4..a6463c26162 100644 --- a/data/scripts/talkactions/god/add_bosstiary_kills.lua +++ b/data/scripts/talkactions/god/add_bosstiary_kills.lua @@ -24,9 +24,9 @@ function talkaction.onSay(player, words, param) local message = "Added received kills: " .. kills .. ", for boss: " .. monsterName if target == player then - player:sendTextMessage(MESSAGE_ADMINISTRADOR, message .. " to yourself.") + player:sendTextMessage(MESSAGE_ADMINISTRATOR, message .. " to yourself.") else - player:sendTextMessage(MESSAGE_ADMINISTRADOR, message .. " to player: " .. targetName) + player:sendTextMessage(MESSAGE_ADMINISTRATOR, message .. " to player: " .. targetName) target:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You received kills: " .. kills .. ", to boss: " .. monsterName) end target:addBosstiaryKill(monsterName, kills) diff --git a/data/scripts/talkactions/god/add_mount.lua b/data/scripts/talkactions/god/add_mount.lua index 813f46f38a9..b8b2f00dda1 100644 --- a/data/scripts/talkactions/god/add_mount.lua +++ b/data/scripts/talkactions/god/add_mount.lua @@ -22,8 +22,8 @@ function addOutfit.onSay(player, words, param) if target then local mount = tonumber(split[2]) target:addMount(mount) - target:sendTextMessage(MESSAGE_ADMINISTRADOR, "" .. player:getName() .. " has been added a new mount for you.") - player:sendTextMessage(MESSAGE_ADMINISTRADOR, "You have sucessfull added mount " .. mount .. " to the player " .. target:getName() .. ".") + target:sendTextMessage(MESSAGE_ADMINISTRATOR, "" .. player:getName() .. " has been added a new mount for you.") + player:sendTextMessage(MESSAGE_ADMINISTRATOR, "You have sucessfull added mount " .. mount .. " to the player " .. target:getName() .. ".") if printConsole then logger.info("[addOutfit.onSay] - Player: {} has been added mount: {} to the player: {}", player:getName(), lookType, target:getName()) end diff --git a/data/scripts/talkactions/god/add_outfit.lua b/data/scripts/talkactions/god/add_outfit.lua index 825aaf84c7e..a27fb4f8a18 100644 --- a/data/scripts/talkactions/god/add_outfit.lua +++ b/data/scripts/talkactions/god/add_outfit.lua @@ -24,8 +24,8 @@ function addOutfit.onSay(player, words, param) if target then local lookType = tonumber(split[2]) target:addOutfit(lookType) - target:sendTextMessage(MESSAGE_ADMINISTRADOR, "" .. player:getName() .. " has been added a new outfit for you.") - player:sendTextMessage(MESSAGE_ADMINISTRADOR, "You have sucessfull added looktype " .. lookType .. " to the player " .. target:getName() .. ".") + target:sendTextMessage(MESSAGE_ADMINISTRATOR, "" .. player:getName() .. " has been added a new outfit for you.") + player:sendTextMessage(MESSAGE_ADMINISTRATOR, "You have sucessfull added looktype " .. lookType .. " to the player " .. target:getName() .. ".") if printConsole then logger.info("[addOutfit.onSay] - Player: {} has been added looktype: {} to the player: {}", player:getName(), lookType, target:getName()) end diff --git a/data/scripts/talkactions/god/close_server.lua b/data/scripts/talkactions/god/close_server.lua index 930cde5be79..ad8cfadef2c 100644 --- a/data/scripts/talkactions/god/close_server.lua +++ b/data/scripts/talkactions/god/close_server.lua @@ -19,10 +19,10 @@ function closeServer.onSay(player, words, param) end elseif param == "maintainance" then Game.setGameState(GAME_STATE_MAINTAIN) - player:sendTextMessage(MESSAGE_ADMINISTRADOR, "Server is set to maintenance mode.") + player:sendTextMessage(MESSAGE_ADMINISTRATOR, "Server is set to maintenance mode.") else Game.setGameState(GAME_STATE_CLOSED) - player:sendTextMessage(MESSAGE_ADMINISTRADOR, "Server is now closed.") + player:sendTextMessage(MESSAGE_ADMINISTRATOR, "Server is now closed.") Webhook.sendMessage(":yellow_square: Server was closed by: **" .. player:getName() .. "**", announcementChannels["serverAnnouncements"]) end return true diff --git a/data/scripts/talkactions/god/ip_ban.lua b/data/scripts/talkactions/god/ip_ban.lua index 9826d726c87..09269de446f 100644 --- a/data/scripts/talkactions/god/ip_ban.lua +++ b/data/scripts/talkactions/god/ip_ban.lua @@ -32,14 +32,14 @@ function ipBan.onSay(player, words, param) resultId = db.storeQuery("SELECT 1 FROM `ip_bans` WHERE `ip` = " .. targetIp) if resultId ~= false then - player:sendTextMessage(MESSAGE_ADMINISTRADOR, targetName .. " is already IP banned.") + player:sendTextMessage(MESSAGE_ADMINISTRATOR, targetName .. " is already IP banned.") Result.free(resultId) return true end local timeNow = os.time() db.query("INSERT INTO `ip_bans` (`ip`, `reason`, `banned_at`, `expires_at`, `banned_by`) VALUES (" .. targetIp .. ", '', " .. timeNow .. ", " .. timeNow + (ipBanDays * 86400) .. ", " .. player:getGuid() .. ")") - player:sendTextMessage(MESSAGE_ADMINISTRADOR, targetName .. " has been IP banned.") + player:sendTextMessage(MESSAGE_ADMINISTRATOR, targetName .. " has been IP banned.") return true end diff --git a/data/scripts/talkactions/god/manage_storage.lua b/data/scripts/talkactions/god/manage_storage.lua index 27a153e6d70..929ef7b4417 100644 --- a/data/scripts/talkactions/god/manage_storage.lua +++ b/data/scripts/talkactions/god/manage_storage.lua @@ -26,13 +26,13 @@ function Player.getStorageValueTalkaction(self, param) if storageKey == nil then -- Get the key for this storage name local storageName = tostring(split[2]) - local storageValue = self:getStorageValueByName(storageName) + local storageValue = target:getStorageValueByName(storageName) self:sendTextMessage(MESSAGE_EVENT_ADVANCE, "The storage with id: " .. storageName .. " from player " .. split[1] .. " is: " .. storageValue .. ".") - return true + else + local storageValue = target:getStorageValue(storageKey) + self:sendTextMessage(MESSAGE_EVENT_ADVANCE, "The storage with id: " .. storageKey .. " from player " .. split[1] .. " is: " .. storageValue .. ".") end - local storageValue = self:getStorageValue(storageKey) - self:sendTextMessage(MESSAGE_EVENT_ADVANCE, "The storage with id: " .. storageKey .. " from player " .. split[1] .. " is: " .. storageValue .. ".") return true end diff --git a/data/scripts/talkactions/god/open_server.lua b/data/scripts/talkactions/god/open_server.lua index 84f0b4afe49..83ac47878a1 100644 --- a/data/scripts/talkactions/god/open_server.lua +++ b/data/scripts/talkactions/god/open_server.lua @@ -5,7 +5,7 @@ function openServer.onSay(player, words, param) logCommand(player, words, param) Game.setGameState(GAME_STATE_NORMAL) - player:sendTextMessage(MESSAGE_ADMINISTRADOR, "Server is now open.") + player:sendTextMessage(MESSAGE_ADMINISTRATOR, "Server is now open.") Webhook.sendMessage(":green_circle: Server was opened by: **" .. player:getName() .. "**", announcementChannels["serverAnnouncements"]) return true end diff --git a/data/scripts/talkactions/god/raids.lua b/data/scripts/talkactions/god/raids.lua index 15f21801293..b9b4b909668 100644 --- a/data/scripts/talkactions/god/raids.lua +++ b/data/scripts/talkactions/god/raids.lua @@ -12,18 +12,18 @@ function startRaid.onSay(player, words, param) if Raid.registry[param] then local raid = Raid.registry[param] if raid:tryStart(true) then - player:sendTextMessage(MESSAGE_ADMINISTRADOR, "Raid " .. param .. " started.") + player:sendTextMessage(MESSAGE_ADMINISTRATOR, "Raid " .. param .. " started.") else - player:sendTextMessage(MESSAGE_ADMINISTRADOR, "Raid " .. param .. " could not be started.") + player:sendTextMessage(MESSAGE_ADMINISTRATOR, "Raid " .. param .. " could not be started.") end return true end local returnValue = Game.startRaid(param) if returnValue ~= RETURNVALUE_NOERROR then - player:sendTextMessage(MESSAGE_ADMINISTRADOR, Game.getReturnMessage(returnValue)) + player:sendTextMessage(MESSAGE_ADMINISTRATOR, Game.getReturnMessage(returnValue)) else - player:sendTextMessage(MESSAGE_ADMINISTRADOR, "Raid started.") + player:sendTextMessage(MESSAGE_ADMINISTRATOR, "Raid started.") end return true end diff --git a/data/scripts/talkactions/god/reload.lua b/data/scripts/talkactions/god/reload.lua index 290288a19df..5bf72868320 100644 --- a/data/scripts/talkactions/god/reload.lua +++ b/data/scripts/talkactions/god/reload.lua @@ -1,93 +1,66 @@ --- NOTE: Using this script might cause unwanted changes. --- This script forces a reload in the entire server, this means --- that everything that is stored in memory might stop to work --- properly and/or completely. --- --- This script should be used in test environments only. +local reloadTypes = { + ["all"] = RELOAD_TYPE_ALL, + ["channel"] = RELOAD_TYPE_CHAT, + ["chat"] = RELOAD_TYPE_CHAT, + ["chatchannels"] = RELOAD_TYPE_CHAT, + ["config"] = RELOAD_TYPE_CONFIG, + ["configuration"] = RELOAD_TYPE_CONFIG, + ["core"] = RELOAD_TYPE_CORE, + ["events"] = RELOAD_TYPE_EVENTS, + ["global"] = RELOAD_TYPE_CORE, + ["group"] = RELOAD_TYPE_GROUPS, + ["groups"] = RELOAD_TYPE_GROUPS, + ["imbuements"] = RELOAD_TYPE_IMBUEMENTS, + ["items"] = RELOAD_TYPE_ITEMS, + ["lib"] = RELOAD_TYPE_CORE, + ["libs"] = RELOAD_TYPE_CORE, + ["module"] = RELOAD_TYPE_MODULES, + ["modules"] = RELOAD_TYPE_MODULES, + ["monster"] = RELOAD_TYPE_MONSTERS, + ["monsters"] = RELOAD_TYPE_MONSTERS, + ["mount"] = RELOAD_TYPE_MOUNTS, + ["mounts"] = RELOAD_TYPE_MOUNTS, + ["npc"] = RELOAD_TYPE_NPCS, + ["npcs"] = RELOAD_TYPE_NPCS, + ["raid"] = RELOAD_TYPE_RAIDS, + ["raids"] = RELOAD_TYPE_RAIDS, + ["rate"] = RELOAD_TYPE_CORE, + ["rates"] = RELOAD_TYPE_CORE, + ["script"] = RELOAD_TYPE_SCRIPTS, + ["scripts"] = RELOAD_TYPE_SCRIPTS, + ["stage"] = RELOAD_TYPE_CORE, + ["stages"] = RELOAD_TYPE_CORE, +} -function Player.reloadTalkaction(self, words, param) - local reloadTypes = { - ["all"] = RELOAD_TYPE_ALL, - - ["chat"] = RELOAD_TYPE_CHAT, - ["channel"] = RELOAD_TYPE_CHAT, - ["chatchannels"] = RELOAD_TYPE_CHAT, - - ["config"] = RELOAD_TYPE_CONFIG, - ["configuration"] = RELOAD_TYPE_CONFIG, - - ["events"] = RELOAD_TYPE_EVENTS, - - ["items"] = RELOAD_TYPE_ITEMS, - - ["module"] = RELOAD_TYPE_MODULES, - ["modules"] = RELOAD_TYPE_MODULES, - - ["monster"] = RELOAD_TYPE_MONSTERS, - ["monsters"] = RELOAD_TYPE_MONSTERS, - - ["mount"] = RELOAD_TYPE_MOUNTS, - ["mounts"] = RELOAD_TYPE_MOUNTS, - - ["npc"] = RELOAD_TYPE_NPCS, - ["npcs"] = RELOAD_TYPE_NPCS, - - ["raid"] = RELOAD_TYPE_RAIDS, - ["raids"] = RELOAD_TYPE_RAIDS, - - ["scripts"] = RELOAD_TYPE_SCRIPTS, - ["script"] = RELOAD_TYPE_SCRIPTS, - - ["rate"] = RELOAD_TYPE_CORE, - ["rates"] = RELOAD_TYPE_CORE, - ["stage"] = RELOAD_TYPE_CORE, - ["stages"] = RELOAD_TYPE_CORE, - ["global"] = RELOAD_TYPE_CORE, - ["core"] = RELOAD_TYPE_CORE, - ["lib"] = RELOAD_TYPE_CORE, - ["libs"] = RELOAD_TYPE_CORE, - - ["imbuements"] = RELOAD_TYPE_IMBUEMENTS, - - ["group"] = RELOAD_TYPE_GROUPS, - ["groups"] = RELOAD_TYPE_GROUPS, - } +local reload = TalkAction("/reload") +function reload.onSay(player, words, param) if not configManager.getBoolean(configKeys.ALLOW_RELOAD) then - self:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Reload command is disabled.") + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Reload command is disabled.") return true end if param == "" then - self:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Command param required.") + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Command param required.") return true end -- create log - logCommand(self, "/reload", param) + logCommand(player, "/reload", param) local reloadType = reloadTypes[param:lower()] - if reloadType then - -- Force save server before reload - saveServer() - SaveHirelings() - logger.info("Saved Hirelings") - self:sendTextMessage(MESSAGE_ADMINISTRADOR, "Server is saved.. Now will reload configs!") - - Game.reload(reloadType) - self:sendTextMessage(MESSAGE_LOOK, string.format("Reloaded %s.", param:lower())) - logger.info("Reloaded {}", param:lower()) - elseif not reloadType then - self:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Reload type not found.") - logger.warn("[reload.onSay] - Reload type '{}' not found", param) + if not reloadType then + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Reload type not found.") + return true end - return true -end -local reload = TalkAction("/reload") + saveServer() + SaveHirelings() -function reload.onSay(player, words, param) - return player:reloadTalkaction(words, param) + Game.reload(reloadType) + + player:sendTextMessage(MESSAGE_ADMINISTRATOR, string.format("The server has been reloaded, %s and configurations are now being reloaded.", param:lower())) + return true end reload:separator(" ") diff --git a/data/scripts/talkactions/god/save.lua b/data/scripts/talkactions/god/save.lua index ac2ad633d32..845df50d9b4 100644 --- a/data/scripts/talkactions/god/save.lua +++ b/data/scripts/talkactions/god/save.lua @@ -1,12 +1,4 @@ local savingEvent = 0 -function saveLoop(delay) - saveServer() - SaveHirelings() - logger.info("Saved Hirelings") - if delay > 0 then - savingEvent = addEvent(saveLoop, delay, delay) - end -end local save = TalkAction("/save") @@ -16,13 +8,17 @@ function save.onSay(player, words, param) if isNumber(param) then stopEvent(savingEvent) - saveLoop(tonumber(param) * 60 * 1000) + local delay = tonumber(param) * 60 * 1000 + savingEvent = addEvent(function() + saveServer() + SaveHirelings() + end, delay, delay) else saveServer() SaveHirelings() - logger.info("Saved Hirelings") - player:sendTextMessage(MESSAGE_ADMINISTRADOR, "Server is saved ...") + player:sendTextMessage(MESSAGE_ADMINISTRATOR, "Server has been saved.") end + return true end save:separator(" ") diff --git a/data/scripts/talkactions/god/start_raid.lua b/data/scripts/talkactions/god/start_raid.lua index b43e77c061a..cbd3fe24a79 100644 --- a/data/scripts/talkactions/god/start_raid.lua +++ b/data/scripts/talkactions/god/start_raid.lua @@ -11,9 +11,9 @@ function startRaid.onSay(player, words, param) local returnValue = Game.startRaid(param) if returnValue ~= RETURNVALUE_NOERROR then - player:sendTextMessage(MESSAGE_ADMINISTRADOR, Game.getReturnMessage(returnValue)) + player:sendTextMessage(MESSAGE_ADMINISTRATOR, Game.getReturnMessage(returnValue)) else - player:sendTextMessage(MESSAGE_ADMINISTRADOR, "Raid started.") + player:sendTextMessage(MESSAGE_ADMINISTRATOR, "Raid started.") end return true end diff --git a/data/scripts/talkactions/player/refill.lua b/data/scripts/talkactions/player/refill.lua index 7d8dca9e8ef..d61a98d329f 100644 --- a/data/scripts/talkactions/player/refill.lua +++ b/data/scripts/talkactions/player/refill.lua @@ -31,10 +31,10 @@ function refill.onSay(player, words, param) end end if #refilledItems == 0 then - player:sendTextMessage(MESSAGE_INFO_DESCR, "You do not have any items to refill or lack silver tokens.") + player:sendTextMessage(MESSAGE_LOOK, "You do not have any items to refill or lack silver tokens.") else local itemList = table.concat(refilledItems, ", ") - player:sendTextMessage(MESSAGE_INFO_DESCR, "Refilled " .. itemList .. " for a total of " .. totalCost .. " silver tokens.") + player:sendTextMessage(MESSAGE_LOOK, "Refilled " .. itemList .. " for a total of " .. totalCost .. " silver tokens.") end return true end diff --git a/schema.sql b/schema.sql index 756339fd9d6..58e6ea216ce 100644 --- a/schema.sql +++ b/schema.sql @@ -7,7 +7,7 @@ CREATE TABLE IF NOT EXISTS `server_config` ( CONSTRAINT `server_config_pk` PRIMARY KEY (`config`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -INSERT INTO `server_config` (`config`, `value`) VALUES ('db_version', '43'), ('motd_hash', ''), ('motd_num', '0'), ('players_record', '0'); +INSERT INTO `server_config` (`config`, `value`) VALUES ('db_version', '44'), ('motd_hash', ''), ('motd_num', '0'), ('players_record', '0'); -- Table structure `accounts` CREATE TABLE IF NOT EXISTS `accounts` ( @@ -312,9 +312,12 @@ CREATE TABLE IF NOT EXISTS `guild_wars` ( `guild2` int(11) NOT NULL DEFAULT '0', `name1` varchar(255) NOT NULL, `name2` varchar(255) NOT NULL, - `status` tinyint(2) NOT NULL DEFAULT '0', + `status` tinyint(2) UNSIGNED NOT NULL DEFAULT '0', `started` bigint(15) NOT NULL DEFAULT '0', `ended` bigint(15) NOT NULL DEFAULT '0', + `frags_limit` smallint(4) UNSIGNED NOT NULL DEFAULT '0', + `payment` bigint(13) UNSIGNED NOT NULL DEFAULT '0', + `duration_days` tinyint(3) UNSIGNED NOT NULL DEFAULT '0', INDEX `guild1` (`guild1`), INDEX `guild2` (`guild2`), CONSTRAINT `guild_wars_pk` PRIMARY KEY (`id`) @@ -640,12 +643,6 @@ CREATE TABLE IF NOT EXISTS `player_kills` ( `unavenged` tinyint(1) NOT NULL DEFAULT '0' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; --- Table structure `player_misc` -CREATE TABLE IF NOT EXISTS `player_misc` ( - `player_id` int(11) NOT NULL, - `info` blob NOT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -- Table structure `player_namelocks` CREATE TABLE IF NOT EXISTS `player_namelocks` ( `player_id` int(11) NOT NULL, diff --git a/src/account/account.cpp b/src/account/account.cpp index 700ec44a64d..2e5f58dd864 100644 --- a/src/account/account.cpp +++ b/src/account/account.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/account/account.hpp b/src/account/account.hpp index 6ce50e1e0eb..d968ba8ddfb 100644 --- a/src/account/account.hpp +++ b/src/account/account.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/account/account_info.hpp b/src/account/account_info.hpp index 1488c7e26a3..698c3b96c1c 100644 --- a/src/account/account_info.hpp +++ b/src/account/account_info.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/account/account_repository.cpp b/src/account/account_repository.cpp index b7ff20e9353..babca847043 100644 --- a/src/account/account_repository.cpp +++ b/src/account/account_repository.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/account/account_repository.hpp b/src/account/account_repository.hpp index 8625e8b588e..0d4dcc7abcf 100644 --- a/src/account/account_repository.hpp +++ b/src/account/account_repository.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/account/account_repository_db.cpp b/src/account/account_repository_db.cpp index 7e39c2e8ee2..b150a636a97 100644 --- a/src/account/account_repository_db.cpp +++ b/src/account/account_repository_db.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -20,9 +20,7 @@ #include "account/account_info.hpp" AccountRepositoryDB::AccountRepositoryDB() : - coinTypeToColumn({ { enumToValue(CoinType::Normal), "coins" }, - { enumToValue(CoinType::Tournament), "tournament_coins" }, - { enumToValue(CoinType::Transferable), "coins_transferable" } }) { } + coinTypeToColumn({ { enumToValue(CoinType::Normal), "coins" }, { enumToValue(CoinType::Tournament), "tournament_coins" }, { enumToValue(CoinType::Transferable), "coins_transferable" } }) { } bool AccountRepositoryDB::loadByID(const uint32_t &id, AccountInfo &acc) { auto query = fmt::format("SELECT `id`, `type`, `premdays`, `lastday`, `creation`, `premdays_purchased`, 0 AS `expires` FROM `accounts` WHERE `id` = {}", id); diff --git a/src/account/account_repository_db.hpp b/src/account/account_repository_db.hpp index 6de39506b04..651600e3bc4 100644 --- a/src/account/account_repository_db.hpp +++ b/src/account/account_repository_db.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/canary_server.cpp b/src/canary_server.cpp index 1a2454a9ad0..56cd53bf567 100644 --- a/src/canary_server.cpp +++ b/src/canary_server.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -341,8 +341,17 @@ void CanaryServer::loadModules() { } auto coreFolder = g_configManager().getString(CORE_DIRECTORY, __FUNCTION__); - // Load items dependencies + // Load appearances.dat first modulesLoadHelper((g_game().loadAppearanceProtobuf(coreFolder + "/items/appearances.dat") == ERROR_NONE), "appearances.dat"); + + // Load XML folder dependencies (order matters) + modulesLoadHelper(g_vocations().loadFromXml(), "XML/vocations.xml"); + modulesLoadHelper(g_eventsScheduler().loadScheduleEventFromXml(), "XML/events.xml"); + modulesLoadHelper(Outfits::getInstance().loadFromXml(), "XML/outfits.xml"); + modulesLoadHelper(Familiars::getInstance().loadFromXml(), "XML/familiars.xml"); + modulesLoadHelper(g_imbuements().loadFromXml(), "XML/imbuements.xml"); + modulesLoadHelper(g_storages().loadFromXML(), "XML/storages.xml"); + modulesLoadHelper(Item::items.loadFromXml(), "items.xml"); const auto datapackFolder = g_configManager().getString(DATA_DIRECTORY, __FUNCTION__); @@ -351,17 +360,10 @@ void CanaryServer::loadModules() { modulesLoadHelper((g_luaEnvironment().loadFile(coreFolder + "/core.lua", "core.lua") == 0), "core.lua"); modulesLoadHelper(g_scripts().loadScripts(coreFolder + "/scripts/lib", true, false), coreFolder + "/scripts/libs"); modulesLoadHelper(g_scripts().loadScripts(coreFolder + "/scripts", false, false), coreFolder + "/scripts"); + modulesLoadHelper((g_npcs().load(true, false)), "npclib"); - // Second XML scripts - modulesLoadHelper(g_vocations().loadFromXml(), "XML/vocations.xml"); - modulesLoadHelper(g_eventsScheduler().loadScheduleEventFromXml(), "XML/events.xml"); - modulesLoadHelper(Outfits::getInstance().loadFromXml(), "XML/outfits.xml"); - modulesLoadHelper(Familiars::getInstance().loadFromXml(), "XML/familiars.xml"); - modulesLoadHelper(g_imbuements().loadFromXml(), "XML/imbuements.xml"); - modulesLoadHelper(g_storages().loadFromXML(), "XML/storages.xml"); - modulesLoadHelper(g_modules().loadFromXml(), "modules/modules.xml"); modulesLoadHelper(g_events().loadFromXml(), "events/events.xml"); - modulesLoadHelper((g_npcs().load(true, false)), "npclib"); + modulesLoadHelper(g_modules().loadFromXml(), "modules/modules.xml"); logger.debug("Loading datapack scripts on folder: {}/", datapackName); // Load scripts diff --git a/src/canary_server.hpp b/src/canary_server.hpp index d9374309c4a..bb22232b8e4 100644 --- a/src/canary_server.hpp +++ b/src/canary_server.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/config/config_enums.hpp b/src/config/config_enums.hpp index 7432f955ff9..b9b857f435c 100644 --- a/src/config/config_enums.hpp +++ b/src/config/config_enums.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -17,7 +17,6 @@ enum ConfigKey_t : uint16_t { ALLOW_BLOCK_SPAWN, ALLOW_CHANGEOUTFIT, ALLOW_RELOAD, - ALL_CONSOLE_LOG, AUTH_TYPE, AUTOBANK, AUTOLOOT, @@ -28,15 +27,19 @@ enum ConfigKey_t : uint16_t { BOOSTED_BOSS_KILL_BONUS, BOOSTED_BOSS_LOOT_BONUS, BOOSTED_BOSS_SLOT, - BOSSTIARY_KILL_MULTIPLIER, BOSS_DEFAULT_TIME_TO_DEFEAT, BOSS_DEFAULT_TIME_TO_FIGHT_AGAIN, + BOSSTIARY_KILL_MULTIPLIER, BUY_AOL_COMMAND_FEE, BUY_BLESS_COMMAND_FEE, CHECK_EXPIRED_MARKET_OFFERS_EACH_MINUTES, CLASSIC_ATTACK_SPEED, CLEAN_PROTECTION_ZONES, COMBAT_CHAIN_DELAY, + COMBAT_CHAIN_TARGETS, + COMBAT_CHAIN_SKILL_FORMULA_AXE, + COMBAT_CHAIN_SKILL_FORMULA_CLUB, + COMBAT_CHAIN_SKILL_FORMULA_SWORD, COMPRESSION_LEVEL, CONVERT_UNSAFE_SCRIPTS, CORE_DIRECTORY, @@ -47,31 +50,31 @@ enum ConfigKey_t : uint16_t { DEFAULT_DESPAWNRADIUS, DEFAULT_DESPAWNRANGE, DEFAULT_PRIORITY, - DEPOTCHEST, DEPOT_BOXES, + DEPOTCHEST, DISABLE_LEGACY_RAIDS, DISABLE_MONSTER_ARMOR, DISCORD_SEND_FOOTER, DISCORD_WEBHOOK_DELAY_MS, DISCORD_WEBHOOK_URL, EMOTE_SPELLS, - EXPERIENCE_FROM_PLAYERS, - EXP_FROM_PLAYERS_LEVEL_RANGE, + ENABLE_PLAYER_PUT_ITEM_IN_AMMO_SLOT, EX_ACTIONS_DELAY_INTERVAL, + EXP_FROM_PLAYERS_LEVEL_RANGE, + EXPERIENCE_FROM_PLAYERS, FAMILIAR_TIME, FORCE_MONSTERTYPE_LOAD, FORGE_AMOUNT_MULTIPLIER, FORGE_BASE_SUCCESS_RATE, FORGE_BONUS_SUCCESS_RATE, - FORGE_FUSION_DUST_COST, FORGE_CONVERGENCE_FUSION_DUST_COST, - FORGE_TRANSFER_DUST_COST, FORGE_CONVERGENCE_TRANSFER_DUST_COST, FORGE_CORE_COST, FORGE_COST_ONE_SLIVER, FORGE_FIENDISH_CREATURES_LIMIT, FORGE_FIENDISH_INTERVAL_TIME, FORGE_FIENDISH_INTERVAL_TYPE, + FORGE_FUSION_DUST_COST, FORGE_INFLUENCED_CREATURES_LIMIT, FORGE_MAX_DUST, FORGE_MAX_ITEM_TIER, @@ -79,6 +82,7 @@ enum ConfigKey_t : uint16_t { FORGE_MIN_SLIVERS, FORGE_SLIVER_AMOUNT, FORGE_TIER_LOSS_REDUCTION, + FORGE_TRANSFER_DUST_COST, FRAG_TIME, FREE_DEPOT_LIMIT, FREE_PREMIUM, @@ -117,12 +121,14 @@ enum ConfigKey_t : uint16_t { LOCATION, LOGIN_PORT, LOGLEVEL, + LOOTPOUCH_MAXLIMIT, LOW_LEVEL_BONUS_EXP, LOYALTY_BONUS_PERCENTAGE_MULTIPLIER, LOYALTY_ENABLED, LOYALTY_POINTS_PER_CREATION_DAY, LOYALTY_POINTS_PER_PREMIUM_DAY_PURCHASED, LOYALTY_POINTS_PER_PREMIUM_DAY_SPENT, + M_CONST, MAINTAIN_MODE_MESSAGE, MAP_AUTHOR, MAP_CUSTOM_AUTHOR, @@ -132,16 +138,16 @@ enum ConfigKey_t : uint16_t { MARKET_OFFER_DURATION, MARKET_PREMIUM, MAX_ALLOWED_ON_A_DUMMY, - MAX_CONTAINER, MAX_CONTAINER_ITEM, + MAX_CONTAINER, MAX_DAMAGE_REFLECTION, MAX_ELEMENTAL_RESISTANCE, MAX_MARKET_OFFERS_AT_A_TIME_PER_PLAYER, MAX_MESSAGEBUFFER, MAX_PACKETS_PER_SECOND, - MAX_PLAYERS, MAX_PLAYERS_OUTSIDE_PZ_PER_ACCOUNT, MAX_PLAYERS_PER_ACCOUNT, + MAX_PLAYERS, MAX_SPEED_ATTACKONFIST, METRICS_ENABLE_OSTREAM, METRICS_ENABLE_PROMETHEUS, @@ -159,7 +165,6 @@ enum ConfigKey_t : uint16_t { MYSQL_PASS, MYSQL_SOCK, MYSQL_USER, - M_CONST, OLD_PROTOCOL, ONE_PLAYER_ON_ACCOUNT, ONLY_INVITED_CAN_MOVE_HOUSE_ITEMS, @@ -174,8 +179,8 @@ enum ConfigKey_t : uint16_t { PARALLELISM, PARTY_AUTO_SHARE_EXPERIENCE, PARTY_LIST_MAX_DISTANCE, - PARTY_SHARE_LOOT_BOOSTS, PARTY_SHARE_LOOT_BOOSTS_DIMINISHING_FACTOR, + PARTY_SHARE_LOOT_BOOSTS, PREMIUM_DEPOT_LIMIT, PREY_BONUS_REROLL_PRICE, PREY_BONUS_TIME, @@ -199,13 +204,13 @@ enum ConfigKey_t : uint16_t { RATE_BOSS_HEALTH, RATE_EXERCISE_TRAINING_SPEED, RATE_EXPERIENCE, - RATE_HEALTH_REGEN, RATE_HEALTH_REGEN_SPEED, + RATE_HEALTH_REGEN, RATE_KILLING_IN_THE_NAME_OF_POINTS, RATE_LOOT, RATE_MAGIC, - RATE_MANA_REGEN, RATE_MANA_REGEN_SPEED, + RATE_MANA_REGEN, RATE_MONSTER_ATTACK, RATE_MONSTER_DEFENSE, RATE_MONSTER_HEALTH, @@ -214,8 +219,8 @@ enum ConfigKey_t : uint16_t { RATE_NPC_HEALTH, RATE_OFFLINE_TRAINING_SPEED, RATE_SKILL, - RATE_SOUL_REGEN, RATE_SOUL_REGEN_SPEED, + RATE_SOUL_REGEN, RATE_SPAWN, RATE_SPELL_COOLDOWN, RATE_USE_STAGES, @@ -238,24 +243,28 @@ enum ConfigKey_t : uint16_t { SCRIPTS_CONSOLE_LOGS, SERVER_MOTD, SERVER_NAME, + SHOW_LOOTS_IN_BESTIARY, SKULLED_DEATH_LOSE_STORE_ITEM, SORT_LOOT_BY_CHANCE, SQL_PORT, STAIRHOP_DELAY, STAMINA_GREEN_DELAY, STAMINA_ORANGE_DELAY, - STAMINA_PZ, STAMINA_PZ_GAIN, + STAMINA_PZ, STAMINA_SYSTEM, - STAMINA_TRAINER, STAMINA_TRAINER_DELAY, STAMINA_TRAINER_GAIN, + STAMINA_TRAINER, + START_STREAK_LEVEL, STASH_ITEMS, STASH_MOVING, - STATUSQUERY_TIMEOUT, STATUS_PORT, + STATUSQUERY_TIMEOUT, STORE_COIN_PACKET, STORE_IMAGES_URL, + STOREINBOX_MAXLIMIT, + T_CONST, TASK_HUNTING_BONUS_REROLL_PRICE, TASK_HUNTING_ENABLED, TASK_HUNTING_FREE_REROLL_TIME, @@ -269,6 +278,7 @@ enum ConfigKey_t : uint16_t { TIBIADROME_CONCOCTION_DURATION, TIBIADROME_CONCOCTION_TICK_TYPE, TOGGLE_ATTACK_SPEED_ONFIST, + TOGGLE_CHAIN_SYSTEM, TOGGLE_DOWNLOAD_MAP, TOGGLE_FREE_QUEST, TOGGLE_GOLD_POUCH_ALLOW_ANYTHING, @@ -281,8 +291,9 @@ enum ConfigKey_t : uint16_t { TOGGLE_MAP_CUSTOM, TOGGLE_MOUNT_IN_PZ, TOGGLE_RECEIVE_REWARD, - TOGGLE_SAVE_INTERVAL, + TOGGLE_SAVE_ASYNC, TOGGLE_SAVE_INTERVAL_CLEAN_MAP, + TOGGLE_SAVE_INTERVAL, TOGGLE_SERVER_IS_RETRO, TOGGLE_TRAVELS_FREE, TOGGLE_WHEELSYSTEM, @@ -290,7 +301,6 @@ enum ConfigKey_t : uint16_t { TRANSCENDANCE_CHANCE_FORMULA_A, TRANSCENDANCE_CHANCE_FORMULA_B, TRANSCENDANCE_CHANCE_FORMULA_C, - T_CONST, URL, USE_ANY_DATAPACK_FOLDER, VIP_AUTOLOOT_VIP_ONLY, @@ -302,8 +312,6 @@ enum ConfigKey_t : uint16_t { VIP_STAY_ONLINE, VIP_SYSTEM_ENABLED, WARN_UNSAFE_SCRIPTS, - WEATHER_RAIN, - WEATHER_THUNDER, WEEK_KILLS_TO_RED, WHEEL_ATELIER_REVEAL_GREATER_COST, WHEEL_ATELIER_REVEAL_LESSER_COST, @@ -315,6 +323,4 @@ enum ConfigKey_t : uint16_t { WHITE_SKULL_TIME, WORLD_TYPE, XP_DISPLAY_MODE, - STOREINBOX_MAXLIMIT, - LOOTPOUCH_MAXLIMIT, }; diff --git a/src/config/configmanager.cpp b/src/config/configmanager.cpp index 7842d7b4d88..c1702672e71 100644 --- a/src/config/configmanager.cpp +++ b/src/config/configmanager.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -46,364 +46,323 @@ bool ConfigManager::load() { // Info that must be loaded one time (unless we reset the modules involved) if (!loaded) { loadBoolConfig(L, BIND_ONLY_GLOBAL_ADDRESS, "bindOnlyGlobalAddress", false); + loadBoolConfig(L, DISABLE_LEGACY_RAIDS, "disableLegacyRaids", false); + loadBoolConfig(L, OLD_PROTOCOL, "allowOldProtocol", true); loadBoolConfig(L, OPTIMIZE_DATABASE, "startupDatabaseOptimization", true); - loadBoolConfig(L, TOGGLE_MAP_CUSTOM, "toggleMapCustom", true); - loadBoolConfig(L, TOGGLE_MAINTAIN_MODE, "toggleMaintainMode", false); loadBoolConfig(L, RANDOM_MONSTER_SPAWN, "randomMonsterSpawn", false); - loadStringConfig(L, MAINTAIN_MODE_MESSAGE, "maintainModeMessage", ""); - - loadStringConfig(L, IP, "ip", "127.0.0.1"); - loadStringConfig(L, MAP_NAME, "mapName", "canary"); - loadStringConfig(L, MAP_DOWNLOAD_URL, "mapDownloadUrl", ""); - loadStringConfig(L, MAP_AUTHOR, "mapAuthor", "Eduardo Dantas"); - - loadStringConfig(L, MAP_CUSTOM_NAME, "mapCustomName", ""); - loadStringConfig(L, MAP_CUSTOM_AUTHOR, "mapCustomAuthor", "OTServBR"); + loadBoolConfig(L, RESET_SESSIONS_ON_STARTUP, "resetSessionsOnStartup", false); + loadBoolConfig(L, TOGGLE_MAINTAIN_MODE, "toggleMaintainMode", false); + loadBoolConfig(L, TOGGLE_MAP_CUSTOM, "toggleMapCustom", true); - loadStringConfig(L, HOUSE_RENT_PERIOD, "houseRentPeriod", "never"); loadFloatConfig(L, HOUSE_PRICE_RENT_MULTIPLIER, "housePriceRentMultiplier", 1.0); loadFloatConfig(L, HOUSE_RENT_RATE, "houseRentRate", 1.0); - loadStringConfig(L, MYSQL_HOST, "mysqlHost", "127.0.0.1"); - loadStringConfig(L, MYSQL_USER, "mysqlUser", "root"); - loadStringConfig(L, MYSQL_PASS, "mysqlPass", ""); - loadStringConfig(L, MYSQL_DB, "mysqlDatabase", "canary"); - loadStringConfig(L, MYSQL_SOCK, "mysqlSock", ""); - loadStringConfig(L, AUTH_TYPE, "authType", "password"); - loadBoolConfig(L, RESET_SESSIONS_ON_STARTUP, "resetSessionsOnStartup", false); - - loadIntConfig(L, SQL_PORT, "mysqlPort", 3306); + loadIntConfig(L, DEPOT_BOXES, "depotBoxes", 20); + loadIntConfig(L, FREE_DEPOT_LIMIT, "freeDepotLimit", 2000); loadIntConfig(L, GAME_PORT, "gameProtocolPort", 7172); loadIntConfig(L, LOGIN_PORT, "loginProtocolPort", 7171); - loadIntConfig(L, STATUS_PORT, "statusProtocolPort", 7171); - loadIntConfig(L, MARKET_OFFER_DURATION, "marketOfferDuration", 30 * 24 * 60 * 60); - - loadIntConfig(L, FREE_DEPOT_LIMIT, "freeDepotLimit", 2000); loadIntConfig(L, PREMIUM_DEPOT_LIMIT, "premiumDepotLimit", 8000); - loadIntConfig(L, DEPOT_BOXES, "depotBoxes", 20); + loadIntConfig(L, SQL_PORT, "mysqlPort", 3306); loadIntConfig(L, STASH_ITEMS, "stashItemCount", 5000); + loadIntConfig(L, STATUS_PORT, "statusProtocolPort", 7171); - loadBoolConfig(L, OLD_PROTOCOL, "allowOldProtocol", true); - loadBoolConfig(L, DISABLE_LEGACY_RAIDS, "disableLegacyRaids", false); + loadStringConfig(L, AUTH_TYPE, "authType", "password"); + loadStringConfig(L, HOUSE_RENT_PERIOD, "houseRentPeriod", "never"); + loadStringConfig(L, IP, "ip", "127.0.0.1"); + loadStringConfig(L, MAINTAIN_MODE_MESSAGE, "maintainModeMessage", ""); + loadStringConfig(L, MAP_AUTHOR, "mapAuthor", "Eduardo Dantas"); + loadStringConfig(L, MAP_CUSTOM_AUTHOR, "mapCustomAuthor", "OTServBR"); + loadStringConfig(L, MAP_CUSTOM_NAME, "mapCustomName", ""); + loadStringConfig(L, MAP_DOWNLOAD_URL, "mapDownloadUrl", ""); + loadStringConfig(L, MAP_NAME, "mapName", "canary"); + loadStringConfig(L, MYSQL_DB, "mysqlDatabase", "canary"); + loadStringConfig(L, MYSQL_HOST, "mysqlHost", "127.0.0.1"); + loadStringConfig(L, MYSQL_PASS, "mysqlPass", ""); + loadStringConfig(L, MYSQL_SOCK, "mysqlSock", ""); + loadStringConfig(L, MYSQL_USER, "mysqlUser", "root"); } - loadBoolConfig(L, ALLOW_CHANGEOUTFIT, "allowChangeOutfit", true); - loadIntConfig(L, MAX_PLAYERS_PER_ACCOUNT, "maxPlayersOnlinePerAccount", 1); - loadIntConfig(L, MAX_PLAYERS_OUTSIDE_PZ_PER_ACCOUNT, "maxPlayersOutsidePZPerAccount", 1); loadBoolConfig(L, AIMBOT_HOTKEY_ENABLED, "hotkeyAimbotEnabled", true); - loadBoolConfig(L, REMOVE_RUNE_CHARGES, "removeChargesFromRunes", true); - loadBoolConfig(L, EXPERIENCE_FROM_PLAYERS, "experienceByKillingPlayers", false); - loadBoolConfig(L, FREE_PREMIUM, "freePremium", false); - loadBoolConfig(L, REPLACE_KICK_ON_LOGIN, "replaceKickOnLogin", true); - loadBoolConfig(L, MARKET_PREMIUM, "premiumToCreateMarketOffer", true); - loadBoolConfig(L, EMOTE_SPELLS, "emoteSpells", false); - loadBoolConfig(L, STAMINA_SYSTEM, "staminaSystem", true); - loadBoolConfig(L, WARN_UNSAFE_SCRIPTS, "warnUnsafeScripts", true); - loadBoolConfig(L, CONVERT_UNSAFE_SCRIPTS, "convertUnsafeScripts", true); + loadBoolConfig(L, ALLOW_BLOCK_SPAWN, "allowBlockSpawn", true); + loadBoolConfig(L, ALLOW_CHANGEOUTFIT, "allowChangeOutfit", true); + loadBoolConfig(L, ALLOW_RELOAD, "allowReload", false); + loadBoolConfig(L, AUTOBANK, "autoBank", false); + loadBoolConfig(L, AUTOLOOT, "autoLoot", false); + loadBoolConfig(L, BOOSTED_BOSS_SLOT, "boostedBossSlot", true); loadBoolConfig(L, CLASSIC_ATTACK_SPEED, "classicAttackSpeed", false); - loadBoolConfig(L, TOGGLE_ATTACK_SPEED_ONFIST, "toggleAttackSpeedOnFist", false); + loadBoolConfig(L, CLEAN_PROTECTION_ZONES, "cleanProtectionZones", false); + loadBoolConfig(L, CONVERT_UNSAFE_SCRIPTS, "convertUnsafeScripts", true); loadBoolConfig(L, DISABLE_MONSTER_ARMOR, "disableMonsterArmor", false); - loadIntConfig(L, MULTIPLIER_ATTACKONFIST, "multiplierSpeedOnFist", 5); - loadIntConfig(L, MAX_SPEED_ATTACKONFIST, "maxSpeedOnFist", 500); - loadBoolConfig(L, SCRIPTS_CONSOLE_LOGS, "showScriptsLogInConsole", true); - loadBoolConfig(L, STASH_MOVING, "stashMoving", false); - loadBoolConfig(L, ALLOW_BLOCK_SPAWN, "allowBlockSpawn", true); - loadBoolConfig(L, REMOVE_WEAPON_AMMO, "removeWeaponAmmunition", true); - loadBoolConfig(L, REMOVE_WEAPON_CHARGES, "removeWeaponCharges", true); - loadBoolConfig(L, REMOVE_BEGINNING_WEAPON_AMMO, "removeBeginningWeaponAmmunition", true); - loadBoolConfig(L, REFUND_BEGINNING_WEAPON_MANA, "refundBeginningWeaponMana", false); - loadBoolConfig(L, REMOVE_POTION_CHARGES, "removeChargesFromPotions", true); - loadBoolConfig(L, GLOBAL_SERVER_SAVE_NOTIFY_MESSAGE, "globalServerSaveNotifyMessage", true); + loadBoolConfig(L, DISCORD_SEND_FOOTER, "discordSendFooter", true); + loadBoolConfig(L, EMOTE_SPELLS, "emoteSpells", false); + loadBoolConfig(L, ENABLE_PLAYER_PUT_ITEM_IN_AMMO_SLOT, "enablePlayerPutItemInAmmoSlot", false); + loadBoolConfig(L, EXPERIENCE_FROM_PLAYERS, "experienceByKillingPlayers", false); + loadBoolConfig(L, FORCE_MONSTERTYPE_LOAD, "forceMonsterTypesOnLoad", true); + loadBoolConfig(L, FREE_PREMIUM, "freePremium", false); loadBoolConfig(L, GLOBAL_SERVER_SAVE_CLEAN_MAP, "globalServerSaveCleanMap", false); loadBoolConfig(L, GLOBAL_SERVER_SAVE_CLOSE, "globalServerSaveClose", false); - loadBoolConfig(L, FORCE_MONSTERTYPE_LOAD, "forceMonsterTypesOnLoad", true); - loadBoolConfig(L, HOUSE_OWNED_BY_ACCOUNT, "houseOwnedByAccount", false); - loadBoolConfig(L, CLEAN_PROTECTION_ZONES, "cleanProtectionZones", false); + loadBoolConfig(L, GLOBAL_SERVER_SAVE_NOTIFY_MESSAGE, "globalServerSaveNotifyMessage", true); loadBoolConfig(L, GLOBAL_SERVER_SAVE_SHUTDOWN, "globalServerSaveShutdown", true); + loadBoolConfig(L, HOUSE_OWNED_BY_ACCOUNT, "houseOwnedByAccount", false); + loadBoolConfig(L, HOUSE_PURSHASED_SHOW_PRICE, "housePurchasedShowPrice", false); + loadBoolConfig(L, INVENTORY_GLOW, "inventoryGlowOnFiveBless", false); + loadBoolConfig(L, LOYALTY_ENABLED, "loyaltyEnabled", true); + loadBoolConfig(L, MARKET_PREMIUM, "premiumToCreateMarketOffer", true); + loadBoolConfig(L, METRICS_ENABLE_OSTREAM, "metricsEnableOstream", false); + loadBoolConfig(L, METRICS_ENABLE_PROMETHEUS, "metricsEnablePrometheus", false); + loadBoolConfig(L, ONLY_INVITED_CAN_MOVE_HOUSE_ITEMS, "onlyInvitedCanMoveHouseItems", true); + loadBoolConfig(L, ONLY_PREMIUM_ACCOUNT, "onlyPremiumAccount", false); + loadBoolConfig(L, PARTY_AUTO_SHARE_EXPERIENCE, "partyAutoShareExperience", true); + loadBoolConfig(L, PARTY_SHARE_LOOT_BOOSTS, "partyShareLootBoosts", true); + loadBoolConfig(L, PREY_ENABLED, "preySystemEnabled", true); + loadBoolConfig(L, PREY_FREE_THIRD_SLOT, "preyFreeThirdSlot", false); loadBoolConfig(L, PUSH_WHEN_ATTACKING, "pushWhenAttacking", false); - loadIntConfig(L, MIN_DELAY_BETWEEN_CONDITIONS, "minDelayBetweenConditions", 0); - - loadBoolConfig(L, WEATHER_RAIN, "weatherRain", false); - loadBoolConfig(L, WEATHER_THUNDER, "thunderEffect", false); - loadBoolConfig(L, ALL_CONSOLE_LOG, "allConsoleLog", false); - loadBoolConfig(L, TOGGLE_FREE_QUEST, "toggleFreeQuest", true); - loadBoolConfig(L, AUTOLOOT, "autoLoot", false); - loadBoolConfig(L, AUTOBANK, "autoBank", false); - loadBoolConfig(L, STAMINA_TRAINER, "staminaTrainer", false); - loadBoolConfig(L, STAMINA_PZ, "staminaPz", false); + loadBoolConfig(L, RATE_USE_STAGES, "rateUseStages", false); + loadBoolConfig(L, REFUND_BEGINNING_WEAPON_MANA, "refundBeginningWeaponMana", false); + loadBoolConfig(L, REMOVE_BEGINNING_WEAPON_AMMO, "removeBeginningWeaponAmmunition", true); + loadBoolConfig(L, REMOVE_POTION_CHARGES, "removeChargesFromPotions", true); + loadBoolConfig(L, REMOVE_RUNE_CHARGES, "removeChargesFromRunes", true); + loadBoolConfig(L, REMOVE_WEAPON_AMMO, "removeWeaponAmmunition", true); + loadBoolConfig(L, REMOVE_WEAPON_CHARGES, "removeWeaponCharges", true); + loadBoolConfig(L, REPLACE_KICK_ON_LOGIN, "replaceKickOnLogin", true); + loadBoolConfig(L, REWARD_CHEST_COLLECT_ENABLED, "rewardChestCollectEnabled", true); + loadBoolConfig(L, SCRIPTS_CONSOLE_LOGS, "showScriptsLogInConsole", true); + loadBoolConfig(L, SHOW_LOOTS_IN_BESTIARY, "showLootsInBestiary", false); + loadBoolConfig(L, SKULLED_DEATH_LOSE_STORE_ITEM, "skulledDeathLoseStoreItem", false); loadBoolConfig(L, SORT_LOOT_BY_CHANCE, "sortLootByChance", false); - loadBoolConfig(L, TOGGLE_SAVE_INTERVAL, "toggleSaveInterval", false); - loadBoolConfig(L, TOGGLE_SAVE_INTERVAL_CLEAN_MAP, "toggleSaveIntervalCleanMap", false); + loadBoolConfig(L, STAMINA_PZ, "staminaPz", false); + loadBoolConfig(L, STAMINA_SYSTEM, "staminaSystem", true); + loadBoolConfig(L, STAMINA_TRAINER, "staminaTrainer", false); + loadBoolConfig(L, STASH_MOVING, "stashMoving", false); + loadBoolConfig(L, TASK_HUNTING_ENABLED, "taskHuntingSystemEnabled", true); + loadBoolConfig(L, TASK_HUNTING_FREE_THIRD_SLOT, "taskHuntingFreeThirdSlot", false); + loadBoolConfig(L, TELEPORT_PLAYER_TO_VOCATION_ROOM, "teleportPlayerToVocationRoom", true); loadBoolConfig(L, TELEPORT_SUMMONS, "teleportSummons", false); - loadBoolConfig(L, ALLOW_RELOAD, "allowReload", false); - - loadBoolConfig(L, ONLY_PREMIUM_ACCOUNT, "onlyPremiumAccount", false); - loadBoolConfig(L, RATE_USE_STAGES, "rateUseStages", false); - loadBoolConfig(L, TOGGLE_IMBUEMENT_SHRINE_STORAGE, "toggleImbuementShrineStorage", true); - loadBoolConfig(L, TOGGLE_IMBUEMENT_NON_AGGRESSIVE_FIGHT_ONLY, "toggleImbuementNonAggressiveFightOnly", false); - + loadBoolConfig(L, TOGGLE_ATTACK_SPEED_ONFIST, "toggleAttackSpeedOnFist", false); + loadBoolConfig(L, TOGGLE_CHAIN_SYSTEM, "toggleChainSystem", true); loadBoolConfig(L, TOGGLE_DOWNLOAD_MAP, "toggleDownloadMap", false); + loadBoolConfig(L, TOGGLE_FREE_QUEST, "toggleFreeQuest", true); + loadBoolConfig(L, TOGGLE_GOLD_POUCH_ALLOW_ANYTHING, "toggleGoldPouchAllowAnything", false); + loadBoolConfig(L, TOGGLE_GOLD_POUCH_QUICKLOOT_ONLY, "toggleGoldPouchQuickLootOnly", false); + loadBoolConfig(L, TOGGLE_HAZARDSYSTEM, "toogleHazardSystem", true); + loadBoolConfig(L, TOGGLE_HOUSE_TRANSFER_ON_SERVER_RESTART, "togglehouseTransferOnRestart", false); + loadBoolConfig(L, TOGGLE_IMBUEMENT_NON_AGGRESSIVE_FIGHT_ONLY, "toggleImbuementNonAggressiveFightOnly", false); + loadBoolConfig(L, TOGGLE_IMBUEMENT_SHRINE_STORAGE, "toggleImbuementShrineStorage", true); + loadBoolConfig(L, TOGGLE_MOUNT_IN_PZ, "toggleMountInProtectionZone", false); + loadBoolConfig(L, TOGGLE_RECEIVE_REWARD, "toggleReceiveReward", false); + loadBoolConfig(L, TOGGLE_SAVE_ASYNC, "toggleSaveAsync", false); + loadBoolConfig(L, TOGGLE_SAVE_INTERVAL_CLEAN_MAP, "toggleSaveIntervalCleanMap", false); + loadBoolConfig(L, TOGGLE_SAVE_INTERVAL, "toggleSaveInterval", false); + loadBoolConfig(L, TOGGLE_SERVER_IS_RETRO, "toggleServerIsRetroPVP", false); + loadBoolConfig(L, TOGGLE_TRAVELS_FREE, "toggleTravelsFree", false); + loadBoolConfig(L, TOGGLE_WHEELSYSTEM, "wheelSystemEnabled", true); loadBoolConfig(L, USE_ANY_DATAPACK_FOLDER, "useAnyDatapackFolder", false); - loadBoolConfig(L, INVENTORY_GLOW, "inventoryGlowOnFiveBless", false); + loadBoolConfig(L, VIP_AUTOLOOT_VIP_ONLY, "vipAutoLootVipOnly", false); + loadBoolConfig(L, VIP_KEEP_HOUSE, "vipKeepHouse", false); + loadBoolConfig(L, VIP_STAY_ONLINE, "vipStayOnline", false); + loadBoolConfig(L, VIP_SYSTEM_ENABLED, "vipSystemEnabled", false); + loadBoolConfig(L, WARN_UNSAFE_SCRIPTS, "warnUnsafeScripts", true); loadBoolConfig(L, XP_DISPLAY_MODE, "experienceDisplayRates", true); - loadStringConfig(L, DEFAULT_PRIORITY, "defaultPriority", "high"); - loadStringConfig(L, SERVER_NAME, "serverName", ""); - loadStringConfig(L, SERVER_MOTD, "serverMotd", ""); - loadStringConfig(L, OWNER_NAME, "ownerName", ""); - loadStringConfig(L, OWNER_EMAIL, "ownerEmail", ""); - loadStringConfig(L, URL, "url", ""); - loadStringConfig(L, LOCATION, "location", ""); - loadStringConfig(L, WORLD_TYPE, "worldType", "pvp"); - loadStringConfig(L, STORE_IMAGES_URL, "coinImagesURL", ""); - loadStringConfig(L, DISCORD_WEBHOOK_URL, "discordWebhookURL", ""); - loadBoolConfig(L, DISCORD_SEND_FOOTER, "discordSendFooter", true); - loadStringConfig(L, SAVE_INTERVAL_TYPE, "saveIntervalType", ""); - loadStringConfig(L, GLOBAL_SERVER_SAVE_TIME, "globalServerSaveTime", "06:00"); - loadStringConfig(L, DATA_DIRECTORY, "dataPackDirectory", "data-otservbr-global"); - loadStringConfig(L, CORE_DIRECTORY, "coreDirectory", "data"); - - loadStringConfig(L, FORGE_FIENDISH_INTERVAL_TYPE, "forgeFiendishIntervalType", "hour"); - loadStringConfig(L, FORGE_FIENDISH_INTERVAL_TIME, "forgeFiendishIntervalTime", "1"); - - loadIntConfig(L, MAX_PLAYERS, "maxPlayers", 0); - loadIntConfig(L, PZ_LOCKED, "pzLocked", 60000); - loadIntConfig(L, DEFAULT_DESPAWNRANGE, "deSpawnRange", 2); - loadIntConfig(L, DEFAULT_DESPAWNRADIUS, "deSpawnRadius", 50); - loadIntConfig(L, RATE_EXPERIENCE, "rateExp", 1); - loadIntConfig(L, RATE_SKILL, "rateSkill", 1); - loadIntConfig(L, RATE_LOOT, "rateLoot", 1); - loadIntConfig(L, RATE_MAGIC, "rateMagic", 1); - loadIntConfig(L, RATE_SPAWN, "rateSpawn", 1); - loadIntConfig(L, RATE_KILLING_IN_THE_NAME_OF_POINTS, "rateKillingInTheNameOfPoints", 1); - - loadIntConfig(L, HOUSE_PRICE_PER_SQM, "housePriceEachSQM", 1000); - loadIntConfig(L, HOUSE_BUY_LEVEL, "houseBuyLevel", 0); - loadIntConfig(L, HOUSE_LOSE_AFTER_INACTIVITY, "houseLoseAfterInactivity", 0); - loadBoolConfig(L, HOUSE_PURSHASED_SHOW_PRICE, "housePurchasedShowPrice", false); - loadBoolConfig(L, ONLY_INVITED_CAN_MOVE_HOUSE_ITEMS, "onlyInvitedCanMoveHouseItems", true); - - loadIntConfig(L, ACTIONS_DELAY_INTERVAL, "timeBetweenActions", 200); - loadIntConfig(L, EX_ACTIONS_DELAY_INTERVAL, "timeBetweenExActions", 1000); - loadIntConfig(L, MAX_MESSAGEBUFFER, "maxMessageBuffer", 4); - loadIntConfig(L, KICK_AFTER_MINUTES, "kickIdlePlayerAfterMinutes", 15); - loadIntConfig(L, PROTECTION_LEVEL, "protectionLevel", 1); - loadIntConfig(L, DEATH_LOSE_PERCENT, "deathLosePercent", -1); - loadIntConfig(L, STATUSQUERY_TIMEOUT, "statusTimeout", 5000); - loadIntConfig(L, FRAG_TIME, "timeToDecreaseFrags", 24 * 60 * 60 * 1000); - loadIntConfig(L, WHITE_SKULL_TIME, "whiteSkullTime", 15 * 60 * 1000); - loadIntConfig(L, STAIRHOP_DELAY, "stairJumpExhaustion", 2000); - loadIntConfig(L, MAX_CONTAINER, "maxContainer", 500); - loadIntConfig(L, MAX_CONTAINER_ITEM, "maxItem", 5000); - loadIntConfig(L, EXP_FROM_PLAYERS_LEVEL_RANGE, "expFromPlayersLevelRange", 75); - loadIntConfig(L, CHECK_EXPIRED_MARKET_OFFERS_EACH_MINUTES, "checkExpiredMarketOffersEachMinutes", 60); - loadIntConfig(L, MAX_MARKET_OFFERS_AT_A_TIME_PER_PLAYER, "maxMarketOffersAtATimePerPlayer", 100); - loadIntConfig(L, MAX_PACKETS_PER_SECOND, "maxPacketsPerSecond", 25); - loadIntConfig(L, COMPRESSION_LEVEL, "packetCompressionLevel", 6); - loadIntConfig(L, STORE_COIN_PACKET, "coinPacketSize", 25); - loadIntConfig(L, DAY_KILLS_TO_RED, "dayKillsToRedSkull", 3); - loadIntConfig(L, WEEK_KILLS_TO_RED, "weekKillsToRedSkull", 5); - loadIntConfig(L, MONTH_KILLS_TO_RED, "monthKillsToRedSkull", 10); - loadIntConfig(L, RED_SKULL_DURATION, "redSkullDuration", 30); - loadIntConfig(L, BLACK_SKULL_DURATION, "blackSkullDuration", 45); - loadIntConfig(L, ORANGE_SKULL_DURATION, "orangeSkullDuration", 7); - loadIntConfig(L, GLOBAL_SERVER_SAVE_NOTIFY_DURATION, "globalServerSaveNotifyDuration", 5); - - loadIntConfig(L, PARTY_LIST_MAX_DISTANCE, "partyListMaxDistance", 0); - - loadIntConfig(L, PUSH_DELAY, "pushDelay", 1000); - loadIntConfig(L, PUSH_DISTANCE_DELAY, "pushDistanceDelay", 1500); - - loadIntConfig(L, STAMINA_ORANGE_DELAY, "staminaOrangeDelay", 1); - loadIntConfig(L, STAMINA_GREEN_DELAY, "staminaGreenDelay", 5); - loadIntConfig(L, STAMINA_PZ_GAIN, "staminaPzGain", 1); - loadIntConfig(L, STAMINA_TRAINER_DELAY, "staminaTrainerDelay", 5); - loadIntConfig(L, STAMINA_TRAINER_GAIN, "staminaTrainerGain", 1); - loadIntConfig(L, SAVE_INTERVAL_TIME, "saveIntervalTime", 1); - loadIntConfig(L, MAX_ALLOWED_ON_A_DUMMY, "maxAllowedOnADummy", 1); - loadIntConfig(L, FREE_QUEST_STAGE, "freeQuestStage", 1); - loadIntConfig(L, DEPOTCHEST, "depotChest", 4); - loadIntConfig(L, CRITICALCHANCE, "criticalChance", 10); - - loadIntConfig(L, ADVENTURERSBLESSING_LEVEL, "adventurersBlessingLevel", 21); - loadBoolConfig(L, SKULLED_DEATH_LOSE_STORE_ITEM, "skulledDeathLoseStoreItem", false); - loadIntConfig(L, FORGE_MAX_ITEM_TIER, "forgeMaxItemTier", 10); - loadIntConfig(L, FORGE_COST_ONE_SLIVER, "forgeCostOneSliver", 20); - loadIntConfig(L, FORGE_SLIVER_AMOUNT, "forgeSliverAmount", 3); - loadIntConfig(L, FORGE_CORE_COST, "forgeCoreCost", 50); - loadIntConfig(L, FORGE_MAX_DUST, "forgeMaxDust", 225); - loadIntConfig(L, FORGE_FUSION_DUST_COST, "forgeFusionDustCost", 100); - loadIntConfig(L, FORGE_CONVERGENCE_FUSION_DUST_COST, "forgeConvergenceFusionCost", 130); - loadIntConfig(L, FORGE_TRANSFER_DUST_COST, "forgeTransferDustCost", 100); - loadIntConfig(L, FORGE_CONVERGENCE_TRANSFER_DUST_COST, "forgeConvergenceTransferCost", 160); - loadIntConfig(L, FORGE_BASE_SUCCESS_RATE, "forgeBaseSuccessRate", 50); - loadIntConfig(L, FORGE_BONUS_SUCCESS_RATE, "forgeBonusSuccessRate", 15); - loadIntConfig(L, FORGE_TIER_LOSS_REDUCTION, "forgeTierLossReduction", 50); - loadFloatConfig(L, FORGE_AMOUNT_MULTIPLIER, "forgeAmountMultiplier", 3.0); - loadIntConfig(L, FORGE_MIN_SLIVERS, "forgeMinSlivers", 3); - loadIntConfig(L, FORGE_MAX_SLIVERS, "forgeMaxSlivers", 7); - loadIntConfig(L, FORGE_INFLUENCED_CREATURES_LIMIT, "forgeInfluencedLimit", 300); - loadIntConfig(L, FORGE_FIENDISH_CREATURES_LIMIT, "forgeFiendishLimit", 3); - - loadFloatConfig(L, RUSE_CHANCE_FORMULA_A, "ruseChanceFormulaA", 0.0307576); - loadFloatConfig(L, RUSE_CHANCE_FORMULA_B, "ruseChanceFormulaB", 0.440697); - loadFloatConfig(L, RUSE_CHANCE_FORMULA_C, "ruseChanceFormulaC", 0.026); - - loadFloatConfig(L, ONSLAUGHT_CHANCE_FORMULA_A, "onslaughtChanceFormulaA", 0.05); - loadFloatConfig(L, ONSLAUGHT_CHANCE_FORMULA_B, "onslaughtChanceFormulaB", 0.4); - loadFloatConfig(L, ONSLAUGHT_CHANCE_FORMULA_C, "onslaughtChanceFormulaC", 0.05); - - loadFloatConfig(L, MOMENTUM_CHANCE_FORMULA_A, "momentumChanceFormulaA", 0.05); - loadFloatConfig(L, MOMENTUM_CHANCE_FORMULA_B, "momentumChanceFormulaB", 1.9); - loadFloatConfig(L, MOMENTUM_CHANCE_FORMULA_C, "momentumChanceFormulaC", 0.05); - - loadFloatConfig(L, TRANSCENDANCE_CHANCE_FORMULA_A, "transcendanceChanceFormulaA", 0.0127); - loadFloatConfig(L, TRANSCENDANCE_CHANCE_FORMULA_B, "transcendanceChanceFormulaB", 0.1070); - loadFloatConfig(L, TRANSCENDANCE_CHANCE_FORMULA_C, "transcendanceChanceFormulaC", 0.0073); - - loadIntConfig(L, TRANSCENDANCE_AVATAR_DURATION, "transcendanceAvatarDuration", 7000); - - loadIntConfig(L, DISCORD_WEBHOOK_DELAY_MS, "discordWebhookDelayMs", Webhook::DEFAULT_DELAY_MS); - loadFloatConfig(L, BESTIARY_RATE_CHARM_SHOP_PRICE, "bestiaryRateCharmShopPrice", 1.0); - loadFloatConfig(L, RATE_HEALTH_REGEN, "rateHealthRegen", 1.0); - loadFloatConfig(L, RATE_HEALTH_REGEN_SPEED, "rateHealthRegenSpeed", 1.0); - loadFloatConfig(L, RATE_MANA_REGEN, "rateManaRegen", 1.0); - loadFloatConfig(L, RATE_MANA_REGEN_SPEED, "rateManaRegenSpeed", 1.0); - loadFloatConfig(L, RATE_SOUL_REGEN, "rateSoulRegen", 1.0); - loadFloatConfig(L, RATE_SOUL_REGEN_SPEED, "rateSoulRegenSpeed", 1.0); - loadFloatConfig(L, RATE_SPELL_COOLDOWN, "rateSpellCooldown", 1.0); + loadFloatConfig(L, FORGE_AMOUNT_MULTIPLIER, "forgeAmountMultiplier", 3.0); + loadFloatConfig(L, HAZARD_EXP_BONUS_MULTIPLIER, "hazardExpBonusMultiplier", 2.0); + loadFloatConfig(L, LOYALTY_BONUS_PERCENTAGE_MULTIPLIER, "loyaltyBonusPercentageMultiplier", 1.0); + loadFloatConfig(L, MOMENTUM_CHANCE_FORMULA_A, "momentumChanceFormulaA", 0.05); + loadFloatConfig(L, MOMENTUM_CHANCE_FORMULA_B, "momentumChanceFormulaB", 1.9); + loadFloatConfig(L, MOMENTUM_CHANCE_FORMULA_C, "momentumChanceFormulaC", 0.05); + loadFloatConfig(L, ONSLAUGHT_CHANCE_FORMULA_A, "onslaughtChanceFormulaA", 0.05); + loadFloatConfig(L, ONSLAUGHT_CHANCE_FORMULA_B, "onslaughtChanceFormulaB", 0.4); + loadFloatConfig(L, ONSLAUGHT_CHANCE_FORMULA_C, "onslaughtChanceFormulaC", 0.05); + loadFloatConfig(L, PARTY_SHARE_LOOT_BOOSTS_DIMINISHING_FACTOR, "partyShareLootBoostsDimishingFactor", 0.7f); + loadFloatConfig(L, PVP_RATE_DAMAGE_REDUCTION_PER_LEVEL, "pvpRateDamageReductionPerLevel", 0.0); + loadFloatConfig(L, PVP_RATE_DAMAGE_TAKEN_PER_LEVEL, "pvpRateDamageTakenPerLevel", 0.0); loadFloatConfig(L, RATE_ATTACK_SPEED, "rateAttackSpeed", 1.0); - loadFloatConfig(L, RATE_OFFLINE_TRAINING_SPEED, "rateOfflineTrainingSpeed", 1.0); + loadFloatConfig(L, RATE_BOSS_ATTACK, "rateBossAttack", 1.0); + loadFloatConfig(L, RATE_BOSS_DEFENSE, "rateBossDefense", 1.0); + loadFloatConfig(L, RATE_BOSS_HEALTH, "rateBossHealth", 1.0); loadFloatConfig(L, RATE_EXERCISE_TRAINING_SPEED, "rateExerciseTrainingSpeed", 1.0); - loadIntConfig(L, COMBAT_CHAIN_DELAY, "combatChainDelay", 50); - - loadFloatConfig(L, RATE_MONSTER_HEALTH, "rateMonsterHealth", 1.0); + loadFloatConfig(L, RATE_HEALTH_REGEN_SPEED, "rateHealthRegenSpeed", 1.0); + loadFloatConfig(L, RATE_HEALTH_REGEN, "rateHealthRegen", 1.0); + loadFloatConfig(L, RATE_MANA_REGEN_SPEED, "rateManaRegenSpeed", 1.0); + loadFloatConfig(L, RATE_MANA_REGEN, "rateManaRegen", 1.0); loadFloatConfig(L, RATE_MONSTER_ATTACK, "rateMonsterAttack", 1.0); loadFloatConfig(L, RATE_MONSTER_DEFENSE, "rateMonsterDefense", 1.0); - loadFloatConfig(L, RATE_BOSS_HEALTH, "rateBossHealth", 1.0); - loadFloatConfig(L, RATE_BOSS_ATTACK, "rateBossAttack", 1.0); - loadFloatConfig(L, RATE_BOSS_DEFENSE, "rateBossDefense", 1.0); - loadIntConfig(L, BOSS_DEFAULT_TIME_TO_FIGHT_AGAIN, "bossDefaultTimeToFightAgain", 20 * 60 * 60); - loadIntConfig(L, BOSS_DEFAULT_TIME_TO_DEFEAT, "bossDefaultTimeToDefeat", 20 * 60); - - loadIntConfig(L, MIN_ELEMENTAL_RESISTANCE, "minElementalResistance", -200); - loadIntConfig(L, MAX_ELEMENTAL_RESISTANCE, "maxElementalResistance", 200); - loadIntConfig(L, MAX_DAMAGE_REFLECTION, "maxDamageReflection", 200); - - loadFloatConfig(L, RATE_NPC_HEALTH, "rateNpcHealth", 1.0); + loadFloatConfig(L, RATE_MONSTER_HEALTH, "rateMonsterHealth", 1.0); loadFloatConfig(L, RATE_NPC_ATTACK, "rateNpcAttack", 1.0); loadFloatConfig(L, RATE_NPC_DEFENSE, "rateNpcDefense", 1.0); + loadFloatConfig(L, RATE_NPC_HEALTH, "rateNpcHealth", 1.0); + loadFloatConfig(L, RATE_OFFLINE_TRAINING_SPEED, "rateOfflineTrainingSpeed", 1.0); + loadFloatConfig(L, RATE_SOUL_REGEN_SPEED, "rateSoulRegenSpeed", 1.0); + loadFloatConfig(L, RATE_SOUL_REGEN, "rateSoulRegen", 1.0); + loadFloatConfig(L, RATE_SPELL_COOLDOWN, "rateSpellCooldown", 1.0); + loadFloatConfig(L, RUSE_CHANCE_FORMULA_A, "ruseChanceFormulaA", 0.0307576); + loadFloatConfig(L, RUSE_CHANCE_FORMULA_B, "ruseChanceFormulaB", 0.440697); + loadFloatConfig(L, RUSE_CHANCE_FORMULA_C, "ruseChanceFormulaC", 0.026); + loadFloatConfig(L, TRANSCENDANCE_CHANCE_FORMULA_A, "transcendanceChanceFormulaA", 0.0127); + loadFloatConfig(L, TRANSCENDANCE_CHANCE_FORMULA_B, "transcendanceChanceFormulaB", 0.1070); + loadFloatConfig(L, TRANSCENDANCE_CHANCE_FORMULA_C, "transcendanceChanceFormulaC", 0.0073); - loadBoolConfig(L, PREY_ENABLED, "preySystemEnabled", true); - loadBoolConfig(L, PREY_FREE_THIRD_SLOT, "preyFreeThirdSlot", false); - loadIntConfig(L, PREY_REROLL_PRICE_LEVEL, "preyRerollPricePerLevel", 200); - loadIntConfig(L, PREY_SELECTION_LIST_PRICE, "preySelectListPrice", 5); - loadIntConfig(L, PREY_BONUS_TIME, "preyBonusTime", 7200); - loadIntConfig(L, PREY_BONUS_REROLL_PRICE, "preyBonusRerollPrice", 1); - loadIntConfig(L, PREY_FREE_REROLL_TIME, "preyFreeRerollTime", 72000); - - loadBoolConfig(L, TASK_HUNTING_ENABLED, "taskHuntingSystemEnabled", true); - loadBoolConfig(L, TASK_HUNTING_FREE_THIRD_SLOT, "taskHuntingFreeThirdSlot", false); - loadIntConfig(L, TASK_HUNTING_LIMIT_EXHAUST, "taskHuntingLimitedTasksExhaust", 72000); - loadIntConfig(L, TASK_HUNTING_REROLL_PRICE_LEVEL, "taskHuntingRerollPricePerLevel", 200); - loadIntConfig(L, TASK_HUNTING_SELECTION_LIST_PRICE, "taskHuntingSelectListPrice", 5); - loadIntConfig(L, TASK_HUNTING_BONUS_REROLL_PRICE, "taskHuntingBonusRerollPrice", 1); - loadIntConfig(L, TASK_HUNTING_FREE_REROLL_TIME, "taskHuntingFreeRerollTime", 72000); - + loadIntConfig(L, ACTIONS_DELAY_INTERVAL, "timeBetweenActions", 200); + loadIntConfig(L, ADVENTURERSBLESSING_LEVEL, "adventurersBlessingLevel", 21); loadIntConfig(L, BESTIARY_KILL_MULTIPLIER, "bestiaryKillMultiplier", 1); - loadIntConfig(L, BOSSTIARY_KILL_MULTIPLIER, "bosstiaryKillMultiplier", 1); - loadBoolConfig(L, BOOSTED_BOSS_SLOT, "boostedBossSlot", true); - loadIntConfig(L, BOOSTED_BOSS_LOOT_BONUS, "boostedBossLootBonus", 250); + loadIntConfig(L, BLACK_SKULL_DURATION, "blackSkullDuration", 45); loadIntConfig(L, BOOSTED_BOSS_KILL_BONUS, "boostedBossKillBonus", 3); - - loadIntConfig(L, FAMILIAR_TIME, "familiarTime", 30); - - loadBoolConfig(L, TOGGLE_GOLD_POUCH_ALLOW_ANYTHING, "toggleGoldPouchAllowAnything", false); - loadBoolConfig(L, TOGGLE_GOLD_POUCH_QUICKLOOT_ONLY, "toggleGoldPouchQuickLootOnly", false); - loadBoolConfig(L, TOGGLE_SERVER_IS_RETRO, "toggleServerIsRetroPVP", false); - loadBoolConfig(L, TOGGLE_TRAVELS_FREE, "toggleTravelsFree", false); + loadIntConfig(L, BOOSTED_BOSS_LOOT_BONUS, "boostedBossLootBonus", 250); + loadIntConfig(L, BOSS_DEFAULT_TIME_TO_DEFEAT, "bossDefaultTimeToDefeat", 20 * 60); + loadIntConfig(L, BOSS_DEFAULT_TIME_TO_FIGHT_AGAIN, "bossDefaultTimeToFightAgain", 20 * 60 * 60); + loadIntConfig(L, BOSSTIARY_KILL_MULTIPLIER, "bosstiaryKillMultiplier", 1); loadIntConfig(L, BUY_AOL_COMMAND_FEE, "buyAolCommandFee", 0); loadIntConfig(L, BUY_BLESS_COMMAND_FEE, "buyBlessCommandFee", 0); - loadBoolConfig(L, TELEPORT_PLAYER_TO_VOCATION_ROOM, "teleportPlayerToVocationRoom", true); - - loadBoolConfig(L, TOGGLE_HAZARDSYSTEM, "toogleHazardSystem", true); - loadIntConfig(L, HAZARD_CRITICAL_INTERVAL, "hazardCriticalInterval", 2000); + loadIntConfig(L, CHECK_EXPIRED_MARKET_OFFERS_EACH_MINUTES, "checkExpiredMarketOffersEachMinutes", 60); + loadIntConfig(L, COMBAT_CHAIN_DELAY, "combatChainDelay", 50); + loadIntConfig(L, COMBAT_CHAIN_TARGETS, "combatChainTargets", 5); + loadFloatConfig(L, COMBAT_CHAIN_SKILL_FORMULA_AXE, "combatChainSkillFormulaAxe", 0.9); + loadFloatConfig(L, COMBAT_CHAIN_SKILL_FORMULA_CLUB, "combatChainSkillFormulaClub", 0.7); + loadFloatConfig(L, COMBAT_CHAIN_SKILL_FORMULA_SWORD, "combatChainSkillFormulaSword", 1.1); + loadIntConfig(L, COMPRESSION_LEVEL, "packetCompressionLevel", 6); + loadIntConfig(L, CRITICALCHANCE, "criticalChance", 10); + loadIntConfig(L, DAY_KILLS_TO_RED, "dayKillsToRedSkull", 3); + loadIntConfig(L, DEATH_LOSE_PERCENT, "deathLosePercent", -1); + loadIntConfig(L, DEFAULT_DESPAWNRADIUS, "deSpawnRadius", 50); + loadIntConfig(L, DEFAULT_DESPAWNRANGE, "deSpawnRange", 2); + loadIntConfig(L, DEPOTCHEST, "depotChest", 4); + loadIntConfig(L, DISCORD_WEBHOOK_DELAY_MS, "discordWebhookDelayMs", Webhook::DEFAULT_DELAY_MS); + loadIntConfig(L, EX_ACTIONS_DELAY_INTERVAL, "timeBetweenExActions", 1000); + loadIntConfig(L, EXP_FROM_PLAYERS_LEVEL_RANGE, "expFromPlayersLevelRange", 75); + loadIntConfig(L, FAMILIAR_TIME, "familiarTime", 30); + loadIntConfig(L, FORGE_BASE_SUCCESS_RATE, "forgeBaseSuccessRate", 50); + loadIntConfig(L, FORGE_BONUS_SUCCESS_RATE, "forgeBonusSuccessRate", 15); + loadIntConfig(L, FORGE_CONVERGENCE_FUSION_DUST_COST, "forgeConvergenceFusionCost", 130); + loadIntConfig(L, FORGE_CONVERGENCE_TRANSFER_DUST_COST, "forgeConvergenceTransferCost", 160); + loadIntConfig(L, FORGE_CORE_COST, "forgeCoreCost", 50); + loadIntConfig(L, FORGE_COST_ONE_SLIVER, "forgeCostOneSliver", 20); + loadIntConfig(L, FORGE_FIENDISH_CREATURES_LIMIT, "forgeFiendishLimit", 3); + loadIntConfig(L, FORGE_FUSION_DUST_COST, "forgeFusionDustCost", 100); + loadIntConfig(L, FORGE_INFLUENCED_CREATURES_LIMIT, "forgeInfluencedLimit", 300); + loadIntConfig(L, FORGE_MAX_DUST, "forgeMaxDust", 225); + loadIntConfig(L, FORGE_MAX_ITEM_TIER, "forgeMaxItemTier", 10); + loadIntConfig(L, FORGE_MAX_SLIVERS, "forgeMaxSlivers", 7); + loadIntConfig(L, FORGE_MIN_SLIVERS, "forgeMinSlivers", 3); + loadIntConfig(L, FORGE_SLIVER_AMOUNT, "forgeSliverAmount", 3); + loadIntConfig(L, FORGE_TIER_LOSS_REDUCTION, "forgeTierLossReduction", 50); + loadIntConfig(L, FORGE_TRANSFER_DUST_COST, "forgeTransferDustCost", 100); + loadIntConfig(L, FRAG_TIME, "timeToDecreaseFrags", 24 * 60 * 60 * 1000); + loadIntConfig(L, FREE_QUEST_STAGE, "freeQuestStage", 1); + loadIntConfig(L, GLOBAL_SERVER_SAVE_NOTIFY_DURATION, "globalServerSaveNotifyDuration", 5); loadIntConfig(L, HAZARD_CRITICAL_CHANCE, "hazardCriticalChance", 750); + loadIntConfig(L, HAZARD_CRITICAL_INTERVAL, "hazardCriticalInterval", 2000); loadIntConfig(L, HAZARD_CRITICAL_MULTIPLIER, "hazardCriticalMultiplier", 25); loadIntConfig(L, HAZARD_DAMAGE_MULTIPLIER, "hazardDamageMultiplier", 200); loadIntConfig(L, HAZARD_DEFENSE_MULTIPLIER, "hazardDefenseMultiplier", 0); loadIntConfig(L, HAZARD_DODGE_MULTIPLIER, "hazardDodgeMultiplier", 85); + loadIntConfig(L, HAZARD_LOOT_BONUS_MULTIPLIER, "hazardLootBonusMultiplier", 2); + loadIntConfig(L, HAZARD_PODS_DAMAGE, "hazardPodsDamage", 5); loadIntConfig(L, HAZARD_PODS_DROP_MULTIPLIER, "hazardPodsDropMultiplier", 87); loadIntConfig(L, HAZARD_PODS_TIME_TO_DAMAGE, "hazardPodsTimeToDamage", 2000); loadIntConfig(L, HAZARD_PODS_TIME_TO_SPAWN, "hazardPodsTimeToSpawn", 4000); - loadFloatConfig(L, HAZARD_EXP_BONUS_MULTIPLIER, "hazardExpBonusMultiplier", 2.0); - loadIntConfig(L, HAZARD_LOOT_BONUS_MULTIPLIER, "hazardLootBonusMultiplier", 2); - loadIntConfig(L, HAZARD_PODS_DAMAGE, "hazardPodsDamage", 5); loadIntConfig(L, HAZARD_SPAWN_PLUNDER_MULTIPLIER, "hazardSpawnPlunderMultiplier", 25); + loadIntConfig(L, HOUSE_BUY_LEVEL, "houseBuyLevel", 0); + loadIntConfig(L, HOUSE_LOSE_AFTER_INACTIVITY, "houseLoseAfterInactivity", 0); + loadIntConfig(L, HOUSE_PRICE_PER_SQM, "housePriceEachSQM", 1000); + loadIntConfig(L, KICK_AFTER_MINUTES, "kickIdlePlayerAfterMinutes", 15); + loadIntConfig(L, LOOTPOUCH_MAXLIMIT, "lootPouchMaxLimit", 2000); loadIntConfig(L, LOW_LEVEL_BONUS_EXP, "lowLevelBonusExp", 50); - - loadBoolConfig(L, LOYALTY_ENABLED, "loyaltyEnabled", true); loadIntConfig(L, LOYALTY_POINTS_PER_CREATION_DAY, "loyaltyPointsPerCreationDay", 1); - loadIntConfig(L, LOYALTY_POINTS_PER_PREMIUM_DAY_SPENT, "loyaltyPointsPerPremiumDaySpent", 0); loadIntConfig(L, LOYALTY_POINTS_PER_PREMIUM_DAY_PURCHASED, "loyaltyPointsPerPremiumDayPurchased", 0); - loadFloatConfig(L, LOYALTY_BONUS_PERCENTAGE_MULTIPLIER, "loyaltyBonusPercentageMultiplier", 1.0); - - loadBoolConfig(L, TOGGLE_WHEELSYSTEM, "wheelSystemEnabled", true); - loadIntConfig(L, WHEEL_POINTS_PER_LEVEL, "wheelPointsPerLevel", 1); - - loadIntConfig(L, WHEEL_ATELIER_ROTATE_LESSER_COST, "wheelAtelierRotateLesserCost", 125000); - loadIntConfig(L, WHEEL_ATELIER_ROTATE_REGULAR_COST, "wheelAtelierRotateRegularCost", 250000); - loadIntConfig(L, WHEEL_ATELIER_ROTATE_GREATER_COST, "wheelAtelierRotateGreaterCost", 500000); - - loadIntConfig(L, WHEEL_ATELIER_REVEAL_LESSER_COST, "wheelAtelierRevealLesserCost", 125000); - loadIntConfig(L, WHEEL_ATELIER_REVEAL_REGULAR_COST, "wheelAtelierRevealRegularCost", 1000000); - loadIntConfig(L, WHEEL_ATELIER_REVEAL_GREATER_COST, "wheelAtelierRevealGreaterCost", 6000000); - - loadBoolConfig(L, PARTY_AUTO_SHARE_EXPERIENCE, "partyAutoShareExperience", true); - loadBoolConfig(L, PARTY_SHARE_LOOT_BOOSTS, "partyShareLootBoosts", true); - loadFloatConfig(L, PARTY_SHARE_LOOT_BOOSTS_DIMINISHING_FACTOR, "partyShareLootBoostsDimishingFactor", 0.7f); + loadIntConfig(L, LOYALTY_POINTS_PER_PREMIUM_DAY_SPENT, "loyaltyPointsPerPremiumDaySpent", 0); + loadIntConfig(L, MAX_ALLOWED_ON_A_DUMMY, "maxAllowedOnADummy", 1); + loadIntConfig(L, MAX_CONTAINER_ITEM, "maxItem", 5000); + loadIntConfig(L, MAX_CONTAINER, "maxContainer", 500); + loadIntConfig(L, MAX_DAMAGE_REFLECTION, "maxDamageReflection", 200); + loadIntConfig(L, MAX_ELEMENTAL_RESISTANCE, "maxElementalResistance", 200); + loadIntConfig(L, MAX_MARKET_OFFERS_AT_A_TIME_PER_PLAYER, "maxMarketOffersAtATimePerPlayer", 100); + loadIntConfig(L, MAX_MESSAGEBUFFER, "maxMessageBuffer", 4); + loadIntConfig(L, MAX_PACKETS_PER_SECOND, "maxPacketsPerSecond", 25); + loadIntConfig(L, MAX_PLAYERS_OUTSIDE_PZ_PER_ACCOUNT, "maxPlayersOutsidePZPerAccount", 1); + loadIntConfig(L, MAX_PLAYERS_PER_ACCOUNT, "maxPlayersOnlinePerAccount", 1); + loadIntConfig(L, MAX_PLAYERS, "maxPlayers", 0); + loadIntConfig(L, MAX_SPEED_ATTACKONFIST, "maxSpeedOnFist", 500); + loadIntConfig(L, METRICS_OSTREAM_INTERVAL, "metricsOstreamInterval", 1000); + loadIntConfig(L, MIN_DELAY_BETWEEN_CONDITIONS, "minDelayBetweenConditions", 0); + loadIntConfig(L, MIN_ELEMENTAL_RESISTANCE, "minElementalResistance", -200); + loadIntConfig(L, MONTH_KILLS_TO_RED, "monthKillsToRedSkull", 10); + loadIntConfig(L, MULTIPLIER_ATTACKONFIST, "multiplierSpeedOnFist", 5); + loadIntConfig(L, ORANGE_SKULL_DURATION, "orangeSkullDuration", 7); + loadIntConfig(L, PARALLELISM, "parallelism", 2); + loadIntConfig(L, PARTY_LIST_MAX_DISTANCE, "partyListMaxDistance", 0); + loadIntConfig(L, PREY_BONUS_REROLL_PRICE, "preyBonusRerollPrice", 1); + loadIntConfig(L, PREY_BONUS_TIME, "preyBonusTime", 7200); + loadIntConfig(L, PREY_FREE_REROLL_TIME, "preyFreeRerollTime", 72000); + loadIntConfig(L, PREY_REROLL_PRICE_LEVEL, "preyRerollPricePerLevel", 200); + loadIntConfig(L, PREY_SELECTION_LIST_PRICE, "preySelectListPrice", 5); + loadIntConfig(L, PROTECTION_LEVEL, "protectionLevel", 1); + loadIntConfig(L, PUSH_DELAY, "pushDelay", 1000); + loadIntConfig(L, PUSH_DISTANCE_DELAY, "pushDistanceDelay", 1500); + loadIntConfig(L, PVP_MAX_LEVEL_DIFFERENCE, "pvpMaxLevelDifference", 0); + loadIntConfig(L, PZ_LOCKED, "pzLocked", 60000); + loadIntConfig(L, RATE_EXPERIENCE, "rateExp", 1); + loadIntConfig(L, RATE_KILLING_IN_THE_NAME_OF_POINTS, "rateKillingInTheNameOfPoints", 1); + loadIntConfig(L, RATE_LOOT, "rateLoot", 1); + loadIntConfig(L, RATE_MAGIC, "rateMagic", 1); + loadIntConfig(L, RATE_SKILL, "rateSkill", 1); + loadIntConfig(L, RATE_SPAWN, "rateSpawn", 1); + loadIntConfig(L, RED_SKULL_DURATION, "redSkullDuration", 30); + loadIntConfig(L, REWARD_CHEST_MAX_COLLECT_ITEMS, "rewardChestMaxCollectItems", 200); + loadIntConfig(L, SAVE_INTERVAL_TIME, "saveIntervalTime", 1); + loadIntConfig(L, STAIRHOP_DELAY, "stairJumpExhaustion", 2000); + loadIntConfig(L, STAMINA_GREEN_DELAY, "staminaGreenDelay", 5); + loadIntConfig(L, STAMINA_ORANGE_DELAY, "staminaOrangeDelay", 1); + loadIntConfig(L, STAMINA_PZ_GAIN, "staminaPzGain", 1); + loadIntConfig(L, STAMINA_TRAINER_DELAY, "staminaTrainerDelay", 5); + loadIntConfig(L, STAMINA_TRAINER_GAIN, "staminaTrainerGain", 1); + loadIntConfig(L, START_STREAK_LEVEL, "startStreakLevel", 0); + loadIntConfig(L, STATUSQUERY_TIMEOUT, "statusTimeout", 5000); + loadIntConfig(L, STORE_COIN_PACKET, "coinPacketSize", 25); + loadIntConfig(L, STOREINBOX_MAXLIMIT, "storeInboxMaxLimit", 2000); + loadIntConfig(L, T_CONST, "temporaryConst", 2); + loadIntConfig(L, TASK_HUNTING_BONUS_REROLL_PRICE, "taskHuntingBonusRerollPrice", 1); + loadIntConfig(L, TASK_HUNTING_FREE_REROLL_TIME, "taskHuntingFreeRerollTime", 72000); + loadIntConfig(L, TASK_HUNTING_LIMIT_EXHAUST, "taskHuntingLimitedTasksExhaust", 72000); + loadIntConfig(L, TASK_HUNTING_REROLL_PRICE_LEVEL, "taskHuntingRerollPricePerLevel", 200); + loadIntConfig(L, TASK_HUNTING_SELECTION_LIST_PRICE, "taskHuntingSelectListPrice", 5); loadIntConfig(L, TIBIADROME_CONCOCTION_COOLDOWN, "tibiadromeConcoctionCooldown", 24 * 60 * 60); loadIntConfig(L, TIBIADROME_CONCOCTION_DURATION, "tibiadromeConcoctionDuration", 1 * 60 * 60); - loadStringConfig(L, TIBIADROME_CONCOCTION_TICK_TYPE, "tibiadromeConcoctionTickType", "online"); - - loadStringConfig(L, M_CONST, "memoryConst", "1<<16"); - loadIntConfig(L, T_CONST, "temporaryConst", 2); - loadIntConfig(L, PARALLELISM, "parallelism", 2); - - // Vip System - loadBoolConfig(L, VIP_SYSTEM_ENABLED, "vipSystemEnabled", false); + loadIntConfig(L, TRANSCENDANCE_AVATAR_DURATION, "transcendanceAvatarDuration", 7000); loadIntConfig(L, VIP_BONUS_EXP, "vipBonusExp", 0); loadIntConfig(L, VIP_BONUS_LOOT, "vipBonusLoot", 0); loadIntConfig(L, VIP_BONUS_SKILL, "vipBonusSkill", 0); - loadBoolConfig(L, VIP_AUTOLOOT_VIP_ONLY, "vipAutoLootVipOnly", false); - loadBoolConfig(L, VIP_KEEP_HOUSE, "vipKeepHouse", false); - loadBoolConfig(L, VIP_STAY_ONLINE, "vipStayOnline", false); loadIntConfig(L, VIP_FAMILIAR_TIME_COOLDOWN_REDUCTION, "vipFamiliarTimeCooldownReduction", 0); + loadIntConfig(L, WEEK_KILLS_TO_RED, "weekKillsToRedSkull", 5); + loadIntConfig(L, WHEEL_ATELIER_REVEAL_GREATER_COST, "wheelAtelierRevealGreaterCost", 6000000); + loadIntConfig(L, WHEEL_ATELIER_REVEAL_LESSER_COST, "wheelAtelierRevealLesserCost", 125000); + loadIntConfig(L, WHEEL_ATELIER_REVEAL_REGULAR_COST, "wheelAtelierRevealRegularCost", 1000000); + loadIntConfig(L, WHEEL_ATELIER_ROTATE_GREATER_COST, "wheelAtelierRotateGreaterCost", 500000); + loadIntConfig(L, WHEEL_ATELIER_ROTATE_LESSER_COST, "wheelAtelierRotateLesserCost", 125000); + loadIntConfig(L, WHEEL_ATELIER_ROTATE_REGULAR_COST, "wheelAtelierRotateRegularCost", 250000); + loadIntConfig(L, WHEEL_POINTS_PER_LEVEL, "wheelPointsPerLevel", 1); + loadIntConfig(L, WHITE_SKULL_TIME, "whiteSkullTime", 15 * 60 * 1000); - loadBoolConfig(L, REWARD_CHEST_COLLECT_ENABLED, "rewardChestCollectEnabled", true); - loadIntConfig(L, REWARD_CHEST_MAX_COLLECT_ITEMS, "rewardChestMaxCollectItems", 200); - - // PVP System - loadFloatConfig(L, PVP_RATE_DAMAGE_TAKEN_PER_LEVEL, "pvpRateDamageTakenPerLevel", 0.0); - loadFloatConfig(L, PVP_RATE_DAMAGE_REDUCTION_PER_LEVEL, "pvpRateDamageReductionPerLevel", 0.0); - loadIntConfig(L, PVP_MAX_LEVEL_DIFFERENCE, "pvpMaxLevelDifference", 0); - - loadBoolConfig(L, TOGGLE_MOUNT_IN_PZ, "toggleMountInProtectionZone", false); - - loadBoolConfig(L, TOGGLE_HOUSE_TRANSFER_ON_SERVER_RESTART, "togglehouseTransferOnRestart", false); - - loadBoolConfig(L, TOGGLE_RECEIVE_REWARD, "toggleReceiveReward", false); - - loadBoolConfig(L, METRICS_ENABLE_PROMETHEUS, "metricsEnablePrometheus", false); + loadStringConfig(L, CORE_DIRECTORY, "coreDirectory", "data"); + loadStringConfig(L, DATA_DIRECTORY, "dataPackDirectory", "data-otservbr-global"); + loadStringConfig(L, DEFAULT_PRIORITY, "defaultPriority", "high"); + loadStringConfig(L, DISCORD_WEBHOOK_URL, "discordWebhookURL", ""); + loadStringConfig(L, FORGE_FIENDISH_INTERVAL_TIME, "forgeFiendishIntervalTime", "1"); + loadStringConfig(L, FORGE_FIENDISH_INTERVAL_TYPE, "forgeFiendishIntervalType", "hour"); + loadStringConfig(L, GLOBAL_SERVER_SAVE_TIME, "globalServerSaveTime", "06:00"); + loadStringConfig(L, LOCATION, "location", ""); + loadStringConfig(L, M_CONST, "memoryConst", "1<<16"); loadStringConfig(L, METRICS_PROMETHEUS_ADDRESS, "metricsPrometheusAddress", "localhost:9464"); - - loadBoolConfig(L, METRICS_ENABLE_OSTREAM, "metricsEnableOstream", false); - loadIntConfig(L, METRICS_OSTREAM_INTERVAL, "metricsOstreamInterval", 1000); - - loadIntConfig(L, STOREINBOX_MAXLIMIT, "storeInboxMaxLimit", 2000); - loadIntConfig(L, LOOTPOUCH_MAXLIMIT, "lootPouchMaxLimit", 2000); + loadStringConfig(L, OWNER_EMAIL, "ownerEmail", ""); + loadStringConfig(L, OWNER_NAME, "ownerName", ""); + loadStringConfig(L, SAVE_INTERVAL_TYPE, "saveIntervalType", ""); + loadStringConfig(L, SERVER_MOTD, "serverMotd", ""); + loadStringConfig(L, SERVER_NAME, "serverName", ""); + loadStringConfig(L, STORE_IMAGES_URL, "coinImagesURL", ""); + loadStringConfig(L, TIBIADROME_CONCOCTION_TICK_TYPE, "tibiadromeConcoctionTickType", "online"); + loadStringConfig(L, URL, "url", ""); + loadStringConfig(L, WORLD_TYPE, "worldType", "pvp"); loaded = true; lua_close(L); diff --git a/src/config/configmanager.hpp b/src/config/configmanager.hpp index f57e2de8466..406ff69891e 100644 --- a/src/config/configmanager.hpp +++ b/src/config/configmanager.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/core.hpp b/src/core.hpp index 8ca52d107da..ad64df77646 100644 --- a/src/core.hpp +++ b/src/core.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/CMakeLists.txt b/src/creatures/CMakeLists.txt index d5884fdc871..f3dedf3a8f3 100644 --- a/src/creatures/CMakeLists.txt +++ b/src/creatures/CMakeLists.txt @@ -21,6 +21,7 @@ target_sources(${PROJECT_NAME}_lib PRIVATE players/management/waitlist.cpp players/storages/storages.cpp players/player.cpp + players/achievement/player_achievement.cpp players/wheel/player_wheel.cpp players/wheel/wheel_gems.cpp players/vocations/vocation.cpp diff --git a/src/creatures/appearance/mounts/mounts.cpp b/src/creatures/appearance/mounts/mounts.cpp index e28b34ea7d4..dff0f02a451 100644 --- a/src/creatures/appearance/mounts/mounts.cpp +++ b/src/creatures/appearance/mounts/mounts.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/appearance/mounts/mounts.hpp b/src/creatures/appearance/mounts/mounts.hpp index fea303203b6..05bd330a66b 100644 --- a/src/creatures/appearance/mounts/mounts.hpp +++ b/src/creatures/appearance/mounts/mounts.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/appearance/outfit/outfit.cpp b/src/creatures/appearance/outfit/outfit.cpp index 5425f7fed31..6f0490339de 100644 --- a/src/creatures/appearance/outfit/outfit.cpp +++ b/src/creatures/appearance/outfit/outfit.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/appearance/outfit/outfit.hpp b/src/creatures/appearance/outfit/outfit.hpp index ff27e4448f0..e1a5143c673 100644 --- a/src/creatures/appearance/outfit/outfit.hpp +++ b/src/creatures/appearance/outfit/outfit.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/combat/combat.cpp b/src/creatures/combat/combat.cpp index c8edeedf07d..532f4d48bb1 100644 --- a/src/creatures/combat/combat.cpp +++ b/src/creatures/combat/combat.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -510,6 +510,7 @@ bool Combat::setCallback(CallBackParam_t key) { case CALLBACK_PARAM_CHAINVALUE: { params.chainCallback = std::make_unique(); + params.chainCallback->setFromLua(true); return true; } @@ -521,6 +522,11 @@ bool Combat::setCallback(CallBackParam_t key) { return false; } +void Combat::setChainCallback(uint8_t chainTargets, uint8_t chainDistance, bool backtracking) { + params.chainCallback = std::make_unique(chainTargets, chainDistance, backtracking); + g_logger().trace("ChainCallback created: {}, with targets: {}, distance: {}, backtracking: {}", params.chainCallback != nullptr, chainTargets, chainDistance, backtracking); +} + CallBack* Combat::getCallback(CallBackParam_t key) { switch (key) { case CALLBACK_PARAM_LEVELMAGICVALUE: @@ -930,6 +936,82 @@ void Combat::doChainEffect(const Position &origin, const Position &dest, uint8_t } } +void Combat::setupChain(const std::shared_ptr &weapon) { + if (!weapon) { + return; + } + + if (weapon->isChainDisabled()) { + return; + } + + const auto &weaponType = weapon->getWeaponType(); + if (weaponType == WEAPON_NONE || weaponType == WEAPON_SHIELD || weaponType == WEAPON_AMMO || weaponType == WEAPON_DISTANCE) { + return; + } + + // clang-format off + static std::list areaList = { + 0, 0, 0, 1, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 0, + 1, 1, 1, 3, 1, 1, 1, + 0, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 1, 0, 0, 0, + }; + // clang-format on + auto area = std::make_unique(); + area->setupArea(areaList, 7); + setArea(area); + g_logger().trace("Weapon: {}, element type: {}", Item::items[weapon->getID()].name, weapon->params.combatType); + setParam(COMBAT_PARAM_TYPE, weapon->params.combatType); + if (weaponType != WEAPON_WAND) { + setParam(COMBAT_PARAM_BLOCKARMOR, true); + } + + weapon->params.chainCallback = std::make_unique(); + + auto setCommonValues = [this, weapon](double formula, SoundEffect_t impactSound, uint32_t effect) { + double weaponSkillFormula = weapon->getChainSkillValue(); + setPlayerCombatValues(COMBAT_FORMULA_SKILL, 0, 0, weaponSkillFormula ? weaponSkillFormula : formula, 0); + setParam(COMBAT_PARAM_IMPACTSOUND, impactSound); + setParam(COMBAT_PARAM_EFFECT, effect); + setParam(COMBAT_PARAM_BLOCKARMOR, true); + }; + + setChainCallback(g_configManager().getNumber(COMBAT_CHAIN_TARGETS, __FUNCTION__), 1, true); + + switch (weaponType) { + case WEAPON_SWORD: + setCommonValues(g_configManager().getFloat(COMBAT_CHAIN_SKILL_FORMULA_SWORD, __FUNCTION__), MELEE_ATK_SWORD, CONST_ME_SLASH); + break; + case WEAPON_CLUB: + setCommonValues(g_configManager().getFloat(COMBAT_CHAIN_SKILL_FORMULA_CLUB, __FUNCTION__), MELEE_ATK_CLUB, CONST_ME_BLACK_BLOOD); + break; + case WEAPON_AXE: + setCommonValues(g_configManager().getFloat(COMBAT_CHAIN_SKILL_FORMULA_AXE, __FUNCTION__), MELEE_ATK_AXE, CONST_ANI_WHIRLWINDAXE); + break; + } + + if (weaponType == WEAPON_WAND) { + static const std::map> elementEffects = { + { COMBAT_DEATHDAMAGE, { CONST_ME_MORTAREA, CONST_ME_BLACK_BLOOD } }, + { COMBAT_ENERGYDAMAGE, { CONST_ME_ENERGYAREA, CONST_ME_PINK_ENERGY_SPARK } }, + { COMBAT_FIREDAMAGE, { CONST_ME_FIREATTACK, CONST_ME_FIREATTACK } }, + { COMBAT_ICEDAMAGE, { CONST_ME_ICEATTACK, CONST_ME_ICEATTACK } }, + { COMBAT_EARTHDAMAGE, { CONST_ME_STONES, CONST_ME_POISONAREA } }, + }; + + auto it = elementEffects.find(weapon->getElementType()); + if (it != elementEffects.end()) { + setPlayerCombatValues(COMBAT_FORMULA_SKILL, 0, 0, 1.0, 0); + setParam(COMBAT_PARAM_EFFECT, it->second.first); + setParam(COMBAT_PARAM_CHAIN_EFFECT, it->second.second); + } + } +} + bool Combat::doCombatChain(std::shared_ptr caster, std::shared_ptr target, bool aggressive) const { metrics::method_latency measure(__METHOD_NAME__); if (!params.chainCallback) { @@ -939,7 +1021,7 @@ bool Combat::doCombatChain(std::shared_ptr caster, std::shared_ptronChainCombat(caster, maxTargets, chainDistance, backtracking); + params.chainCallback->getChainValues(caster, maxTargets, chainDistance, backtracking); auto targets = pickChainTargets(caster, params, chainDistance, maxTargets, backtracking, aggressive, target); g_logger().debug("[{}] Chain targets: {}", __FUNCTION__, targets.size()); @@ -1476,42 +1558,16 @@ void ValueCallback::getMinMaxValues(std::shared_ptr player, CombatDamage case COMBAT_FORMULA_SKILL: { // onGetPlayerMinMaxValues(player, attackSkill, attackValue, attackFactor) std::shared_ptr tool = player->getWeapon(); - const WeaponShared_ptr weapon = g_weapons().getWeapon(tool); - std::shared_ptr item = nullptr; - + const auto &weapon = g_weapons().getWeapon(tool); + int32_t attackSkill = 0; + float attackFactor = 0; if (weapon) { - attackValue = tool->getAttack(); - if (tool->getWeaponType() == WEAPON_AMMO) { - item = player->getWeapon(true); - if (item) { - attackValue += item->getAttack(); - } - } - - CombatType_t elementType = weapon->getElementType(); - damage.secondary.type = elementType; - - if (elementType != COMBAT_NONE) { - if (weapon) { - elementAttack = weapon->getElementDamageValue(); - shouldCalculateSecondaryDamage = true; - attackValue += elementAttack; - } - } else { - shouldCalculateSecondaryDamage = false; - } - - if (useCharges) { - auto charges = tool->getAttribute(ItemAttribute_t::CHARGES); - if (charges != 0) { - g_game().transformItem(tool, tool->getID(), charges - 1); - } - } + shouldCalculateSecondaryDamage = weapon->calculateSkillFormula(player, attackSkill, attackValue, attackFactor, elementAttack, damage, useCharges); } - lua_pushnumber(L, player->getWeaponSkill(item ? item : tool)); + lua_pushnumber(L, attackSkill); lua_pushnumber(L, attackValue); - lua_pushnumber(L, player->getAttackFactor()); + lua_pushnumber(L, attackFactor); parameters += 3; break; } @@ -1635,7 +1691,19 @@ void TargetCallback::onTargetCombat(std::shared_ptr creature, std::sha //**********************************************************// -void ChainCallback::onChainCombat(std::shared_ptr creature, uint8_t &maxTargets, uint8_t &chainDistance, bool &backtracking) const { +void ChainCallback::getChainValues(const std::shared_ptr &creature, uint8_t &maxTargets, uint8_t &chainDistance, bool &backtracking) { + if (m_fromLua) { + onChainCombat(creature, maxTargets, chainDistance, backtracking); + return; + } + + if (m_chainTargets && m_chainDistance) { + maxTargets = m_chainTargets; + chainDistance = m_chainDistance; + backtracking = m_backtracking; + } +} +void ChainCallback::onChainCombat(std::shared_ptr creature, uint8_t &maxTargets, uint8_t &chainDistance, bool &backtracking) { // onChainCombat(creature) if (!scriptInterface->reserveScriptEnv()) { g_logger().error("[ChainCallback::onTargetCombat - Creature {}] " diff --git a/src/creatures/combat/combat.hpp b/src/creatures/combat/combat.hpp index 71554b3761d..6a79455c7c4 100644 --- a/src/creatures/combat/combat.hpp +++ b/src/creatures/combat/combat.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -20,6 +20,7 @@ class Item; class Spell; class Player; class MatrixArea; +class Weapon; // for luascript callback class ValueCallback final : public CallBack { @@ -59,7 +60,22 @@ class TargetCallback final : public CallBack { class ChainCallback final : public CallBack { public: - void onChainCombat(std::shared_ptr creature, uint8_t &chainTargets, uint8_t &chainDistance, bool &backtracking) const; + ChainCallback() = default; + ChainCallback(uint8_t &chainTargets, uint8_t &chainDistance, bool &backtracking) : + m_chainDistance(chainDistance), m_chainTargets(chainTargets), m_backtracking(backtracking) { } + + void getChainValues(const std::shared_ptr &creature, uint8_t &maxTargets, uint8_t &chainDistance, bool &backtracking); + void setFromLua(bool fromLua) { + m_fromLua = fromLua; + } + +private: + void onChainCombat(std::shared_ptr creature, uint8_t &chainTargets, uint8_t &chainDistance, bool &backtracking); + + uint8_t m_chainTargets = 0; + uint8_t m_chainDistance = 0; + bool m_backtracking = false; + bool m_fromLua = false; }; class ChainPickerCallback final : public CallBack { @@ -293,6 +309,7 @@ class Combat { bool doCombat(std::shared_ptr caster, const Position &pos) const; bool setCallback(CallBackParam_t key); + void setChainCallback(uint8_t chainTargets, uint8_t chainDistance, bool backtracking); CallBack* getCallback(CallBackParam_t key); bool setParam(CombatParam_t param, uint32_t value); @@ -328,6 +345,9 @@ class Combat { */ void setRuneSpellName(const std::string &value); + void setupChain(const std::shared_ptr &weapon); + bool doCombatChain(std::shared_ptr caster, std::shared_ptr target, bool aggressive) const; + private: static void doChainEffect(const Position &origin, const Position &pos, uint8_t effect); static std::vector>> pickChainTargets(std::shared_ptr caster, const CombatParams ¶ms, uint8_t chainDistance, uint8_t maxTargets, bool aggressive, bool backtracking, std::shared_ptr initialTarget = nullptr); @@ -376,8 +396,6 @@ class Combat { int32_t getLevelFormula(std::shared_ptr player, const std::shared_ptr wheelSpell, const CombatDamage &damage) const; CombatDamage getCombatDamage(std::shared_ptr creature, std::shared_ptr target) const; - bool doCombatChain(std::shared_ptr caster, std::shared_ptr target, bool aggressive) const; - // configureable CombatParams params; diff --git a/src/creatures/combat/condition.cpp b/src/creatures/combat/condition.cpp index 9549abd4014..d54a3deb1d0 100644 --- a/src/creatures/combat/condition.cpp +++ b/src/creatures/combat/condition.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/combat/condition.hpp b/src/creatures/combat/condition.hpp index 28d637b8b87..1cffba99b50 100644 --- a/src/creatures/combat/condition.hpp +++ b/src/creatures/combat/condition.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/combat/spells.cpp b/src/creatures/combat/spells.cpp index e41c1cf5194..60cc5e7d2a9 100644 --- a/src/creatures/combat/spells.cpp +++ b/src/creatures/combat/spells.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/combat/spells.hpp b/src/creatures/combat/spells.hpp index 804ec62f930..cd1a7aaa623 100644 --- a/src/creatures/combat/spells.hpp +++ b/src/creatures/combat/spells.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -191,8 +191,14 @@ class Spell : public BaseSpell { [[nodiscard]] const VocSpellMap &getVocMap() const { return vocSpellMap; } - void addVocMap(uint16_t n, bool b) { - vocSpellMap[n] = b; + void addVocMap(uint16_t vocationId, bool b) { + if (vocationId == 0XFFFF) { + g_logger().error("Vocation overflow for spell: {}", getName()); + return; + } + + g_logger().trace("Adding spell: {} to voc id: {}", getName(), vocationId); + vocSpellMap[vocationId] = b; } SpellGroup_t getGroup() { diff --git a/src/creatures/creature.cpp b/src/creatures/creature.cpp index b917a23d640..d17ee454402 100644 --- a/src/creatures/creature.cpp +++ b/src/creatures/creature.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/creature.hpp b/src/creatures/creature.hpp index a21403edcef..4acbacb570a 100644 --- a/src/creatures/creature.hpp +++ b/src/creatures/creature.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/creatures_definitions.hpp b/src/creatures/creatures_definitions.hpp index 674f0b6775c..46fb5fe5979 100644 --- a/src/creatures/creatures_definitions.hpp +++ b/src/creatures/creatures_definitions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/interactions/chat.cpp b/src/creatures/interactions/chat.cpp index ec3472d7bc6..f30c3f219e3 100644 --- a/src/creatures/interactions/chat.cpp +++ b/src/creatures/interactions/chat.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/interactions/chat.hpp b/src/creatures/interactions/chat.hpp index 36768fa4f44..022b3f540a1 100644 --- a/src/creatures/interactions/chat.hpp +++ b/src/creatures/interactions/chat.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/monsters/monster.cpp b/src/creatures/monsters/monster.cpp index 6fbed225215..5f31c67aa72 100644 --- a/src/creatures/monsters/monster.cpp +++ b/src/creatures/monsters/monster.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/monsters/monster.hpp b/src/creatures/monsters/monster.hpp index be95bb80d74..edf3874161d 100644 --- a/src/creatures/monsters/monster.hpp +++ b/src/creatures/monsters/monster.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/monsters/monsters.cpp b/src/creatures/monsters/monsters.cpp index 463238e913a..190c14c76e5 100644 --- a/src/creatures/monsters/monsters.cpp +++ b/src/creatures/monsters/monsters.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/monsters/monsters.hpp b/src/creatures/monsters/monsters.hpp index ab18ca6c9d6..0fa2a3d88db 100644 --- a/src/creatures/monsters/monsters.hpp +++ b/src/creatures/monsters/monsters.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/monsters/spawns/spawn_monster.cpp b/src/creatures/monsters/spawns/spawn_monster.cpp index c0f2fb382e8..aec222d723a 100644 --- a/src/creatures/monsters/spawns/spawn_monster.cpp +++ b/src/creatures/monsters/spawns/spawn_monster.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/monsters/spawns/spawn_monster.hpp b/src/creatures/monsters/spawns/spawn_monster.hpp index bf83e5dec0a..800b36fda5a 100644 --- a/src/creatures/monsters/spawns/spawn_monster.hpp +++ b/src/creatures/monsters/spawns/spawn_monster.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/npcs/npc.cpp b/src/creatures/npcs/npc.cpp index 7fe61491efd..0f9f60cec9b 100644 --- a/src/creatures/npcs/npc.cpp +++ b/src/creatures/npcs/npc.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/npcs/npc.hpp b/src/creatures/npcs/npc.hpp index 393b24867a1..2d4e87ac7b8 100644 --- a/src/creatures/npcs/npc.hpp +++ b/src/creatures/npcs/npc.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/npcs/npcs.cpp b/src/creatures/npcs/npcs.cpp index 50fff3aa75b..ecfd2750a94 100644 --- a/src/creatures/npcs/npcs.cpp +++ b/src/creatures/npcs/npcs.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/npcs/npcs.hpp b/src/creatures/npcs/npcs.hpp index 48170a94fd4..1a984abf2e8 100644 --- a/src/creatures/npcs/npcs.hpp +++ b/src/creatures/npcs/npcs.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/npcs/spawns/spawn_npc.cpp b/src/creatures/npcs/spawns/spawn_npc.cpp index 68fa0c2407b..7fd99d6c37f 100644 --- a/src/creatures/npcs/spawns/spawn_npc.cpp +++ b/src/creatures/npcs/spawns/spawn_npc.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/npcs/spawns/spawn_npc.hpp b/src/creatures/npcs/spawns/spawn_npc.hpp index dccc1a75e62..d02a83e80c5 100644 --- a/src/creatures/npcs/spawns/spawn_npc.hpp +++ b/src/creatures/npcs/spawns/spawn_npc.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/achievement/player_achievement.cpp b/src/creatures/players/achievement/player_achievement.cpp new file mode 100644 index 00000000000..18e2db3d3f2 --- /dev/null +++ b/src/creatures/players/achievement/player_achievement.cpp @@ -0,0 +1,136 @@ +/** + * Canary - A free and open-source MMORPG server emulator + * Copyright (©) 2019-2024 OpenTibiaBR + * Repository: https://github.com/opentibiabr/canary + * License: https://github.com/opentibiabr/canary/blob/main/LICENSE + * Contributors: https://github.com/opentibiabr/canary/graphs/contributors + * Website: https://docs.opentibiabr.com/ + */ + +#include "pch.hpp" + +#include "player_achievement.hpp" + +#include "creatures/players/player.hpp" +#include "game/game.hpp" +#include "kv/kv.hpp" + +PlayerAchievement::PlayerAchievement(Player &player) : + m_player(player) { + auto unlockedAchievements = getUnlockedKV()->keys(); + for (const auto &achievementName : unlockedAchievements) { + const Achievement &achievement = g_game().getAchievementByName(achievementName); + if (achievement.id == 0) { + g_logger().error("[{}] - Achievement {} not found.", __FUNCTION__, achievementName); + continue; + } + + m_achievementsUnlocked.push_back({ achievement.id, getUnlockedKV()->get(achievementName)->getNumber() }); + } +} + +bool PlayerAchievement::add(uint16_t id, bool message /* = true*/, uint32_t timestamp /* = 0*/) { + if (isUnlocked(id)) { + return false; + } + + const Achievement &achievement = g_game().getAchievementById(id); + if (achievement.id == 0) { + return false; + } + + if (message) { + m_player.sendTextMessage(MESSAGE_EVENT_ADVANCE, fmt::format("Congratulations! You earned the achievement {}.", achievement.name)); + } + + addPoints(achievement.points); + int toSaveTimeStamp = timestamp != 0 ? timestamp : (OTSYS_TIME() / 1000); + getUnlockedKV()->set(achievement.name, toSaveTimeStamp); + m_achievementsUnlocked.push_back({ achievement.id, toSaveTimeStamp }); + m_achievementsUnlocked.shrink_to_fit(); + return true; +} + +bool PlayerAchievement::remove(uint16_t id) { + if (!isUnlocked(id)) { + return false; + } + + Achievement achievement = g_game().getAchievementById(id); + if (achievement.id == 0) { + return false; + } + + if (auto it = std::find_if(m_achievementsUnlocked.begin(), m_achievementsUnlocked.end(), [id](auto achievement_it) { + return achievement_it.first == id; + }); + it != m_achievementsUnlocked.end()) { + getUnlockedKV()->remove(achievement.name); + m_achievementsUnlocked.erase(it); + removePoints(achievement.points); + m_achievementsUnlocked.shrink_to_fit(); + return true; + } + + return false; +} + +bool PlayerAchievement::isUnlocked(uint16_t id) const { + if (id == 0) { + return false; + } + + if (auto it = std::find_if(m_achievementsUnlocked.begin(), m_achievementsUnlocked.end(), [id](auto achievement_it) { + return achievement_it.first == id; + }); + it != m_achievementsUnlocked.end()) { + return true; + } + + return false; +} + +uint16_t PlayerAchievement::getPoints() const { + return m_player.kv()->scoped("achievements")->get("points")->getNumber(); +} + +void PlayerAchievement::addPoints(uint16_t toAddPoints) { + auto oldPoints = getPoints(); + m_player.kv()->scoped("achievements")->set("points", oldPoints + toAddPoints); +} + +void PlayerAchievement::removePoints(uint16_t points) { + auto oldPoints = getPoints(); + m_player.kv()->scoped("achievements")->set("points", oldPoints - std::min(oldPoints, points)); +} + +std::vector> PlayerAchievement::getUnlockedAchievements() const { + return m_achievementsUnlocked; +} + +void PlayerAchievement::sendUnlockedSecretAchievements() { + std::vector> m_achievementsUnlocked; + uint16_t unlockedSecret = 0; + for (const auto &[achievId, achievCreatedTime] : getUnlockedAchievements()) { + Achievement achievement = g_game().getAchievementById(achievId); + if (achievement.id == 0) { + continue; + } + + if (achievement.secret) { + unlockedSecret++; + } + + m_achievementsUnlocked.push_back({ achievement, achievCreatedTime }); + } + + m_player.sendCyclopediaCharacterAchievements(unlockedSecret, m_achievementsUnlocked); +} + +const std::shared_ptr &PlayerAchievement::getUnlockedKV() { + if (m_unlockedKV == nullptr) { + m_unlockedKV = m_player.kv()->scoped("achievements")->scoped("unlocked"); + } + + return m_unlockedKV; +} diff --git a/src/creatures/players/achievement/player_achievement.hpp b/src/creatures/players/achievement/player_achievement.hpp new file mode 100644 index 00000000000..8959ce429ca --- /dev/null +++ b/src/creatures/players/achievement/player_achievement.hpp @@ -0,0 +1,47 @@ +/** + * Canary - A free and open-source MMORPG server emulator + * Copyright (©) 2019-2024 OpenTibiaBR + * Repository: https://github.com/opentibiabr/canary + * License: https://github.com/opentibiabr/canary/blob/main/LICENSE + * Contributors: https://github.com/opentibiabr/canary/graphs/contributors + * Website: https://docs.opentibiabr.com/ + */ + +#pragma once + +class Player; +class KV; + +struct Achievement { + Achievement() { } + + std::string name; + std::string description; + + bool secret = false; + + uint8_t grade = 0; + uint8_t points = 0; + + uint16_t id = 0; +}; + +class PlayerAchievement { +public: + explicit PlayerAchievement(Player &player); + bool add(uint16_t id, bool message = true, uint32_t timestamp = 0); + bool remove(uint16_t id); + bool isUnlocked(uint16_t id) const; + uint16_t getPoints() const; + void addPoints(uint16_t toAddPoints); + void removePoints(uint16_t toRemovePoints); + std::vector> getUnlockedAchievements() const; + void sendUnlockedSecretAchievements(); + const std::shared_ptr &getUnlockedKV(); + +private: + // {achievement ID, time when it was unlocked} + std::shared_ptr m_unlockedKV; + std::vector> m_achievementsUnlocked; + Player &m_player; +}; diff --git a/src/creatures/players/grouping/familiars.cpp b/src/creatures/players/grouping/familiars.cpp index 58b0116fbb5..538519685c3 100644 --- a/src/creatures/players/grouping/familiars.cpp +++ b/src/creatures/players/grouping/familiars.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/grouping/familiars.hpp b/src/creatures/players/grouping/familiars.hpp index 012cca1e9df..aae9b34e227 100644 --- a/src/creatures/players/grouping/familiars.hpp +++ b/src/creatures/players/grouping/familiars.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/grouping/groups.cpp b/src/creatures/players/grouping/groups.cpp index 639837dabdc..40dd13bc385 100644 --- a/src/creatures/players/grouping/groups.cpp +++ b/src/creatures/players/grouping/groups.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/grouping/groups.hpp b/src/creatures/players/grouping/groups.hpp index f27ca61ad81..3d74564173d 100644 --- a/src/creatures/players/grouping/groups.hpp +++ b/src/creatures/players/grouping/groups.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/grouping/guild.cpp b/src/creatures/players/grouping/guild.cpp index 14b59b8e9d5..aca512f28e3 100644 --- a/src/creatures/players/grouping/guild.cpp +++ b/src/creatures/players/grouping/guild.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/grouping/guild.hpp b/src/creatures/players/grouping/guild.hpp index ee16c469c26..834eb03252c 100644 --- a/src/creatures/players/grouping/guild.hpp +++ b/src/creatures/players/grouping/guild.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/grouping/party.cpp b/src/creatures/players/grouping/party.cpp index e78e4edddf0..880fc77594f 100644 --- a/src/creatures/players/grouping/party.cpp +++ b/src/creatures/players/grouping/party.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/grouping/party.hpp b/src/creatures/players/grouping/party.hpp index d4c0cea0b35..a356d1a032b 100644 --- a/src/creatures/players/grouping/party.hpp +++ b/src/creatures/players/grouping/party.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/grouping/team_finder.hpp b/src/creatures/players/grouping/team_finder.hpp index 609ce0f673f..123ce7c07d8 100644 --- a/src/creatures/players/grouping/team_finder.hpp +++ b/src/creatures/players/grouping/team_finder.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/highscore_category.hpp b/src/creatures/players/highscore_category.hpp new file mode 100644 index 00000000000..b387199f315 --- /dev/null +++ b/src/creatures/players/highscore_category.hpp @@ -0,0 +1,19 @@ +/** + * Canary - A free and open-source MMORPG server emulator + * Copyright (©) 2019-2024 OpenTibiaBR + * Repository: https://github.com/opentibiabr/canary + * License: https://github.com/opentibiabr/canary/blob/main/LICENSE + * Contributors: https://github.com/opentibiabr/canary/graphs/contributors + * Website: https://docs.opentibiabr.com/ + */ + +#pragma once + +struct HighscoreCategory { + HighscoreCategory(const std::string &name, uint8_t id) : + m_name(name), + m_id(id) { } + + std::string m_name; + uint8_t m_id; +}; diff --git a/src/creatures/players/imbuements/imbuements.cpp b/src/creatures/players/imbuements/imbuements.cpp index 093eae3c956..ed312dbf8e1 100644 --- a/src/creatures/players/imbuements/imbuements.cpp +++ b/src/creatures/players/imbuements/imbuements.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/imbuements/imbuements.hpp b/src/creatures/players/imbuements/imbuements.hpp index 69c5219a0d8..265e813aa1c 100644 --- a/src/creatures/players/imbuements/imbuements.hpp +++ b/src/creatures/players/imbuements/imbuements.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/management/ban.cpp b/src/creatures/players/management/ban.cpp index 3315836ebea..d81045c5344 100644 --- a/src/creatures/players/management/ban.cpp +++ b/src/creatures/players/management/ban.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/management/ban.hpp b/src/creatures/players/management/ban.hpp index 576f2f16acf..6fdb94296df 100644 --- a/src/creatures/players/management/ban.hpp +++ b/src/creatures/players/management/ban.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/management/waitlist.cpp b/src/creatures/players/management/waitlist.cpp index f2bfa8e4204..345c20f2650 100644 --- a/src/creatures/players/management/waitlist.cpp +++ b/src/creatures/players/management/waitlist.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/management/waitlist.hpp b/src/creatures/players/management/waitlist.hpp index 28b65c7cad0..24752f2647d 100644 --- a/src/creatures/players/management/waitlist.hpp +++ b/src/creatures/players/management/waitlist.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/player.cpp b/src/creatures/players/player.cpp index d89656502e5..6dd304e90ba 100644 --- a/src/creatures/players/player.cpp +++ b/src/creatures/players/player.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -15,6 +15,7 @@ #include "creatures/monsters/monsters.hpp" #include "creatures/players/player.hpp" #include "creatures/players/wheel/player_wheel.hpp" +#include "creatures/players/achievement/player_achievement.hpp" #include "creatures/players/storages/storages.hpp" #include "game/game.hpp" #include "game/modal_window/modal_window.hpp" @@ -47,6 +48,7 @@ Player::Player(ProtocolGame_ptr p) : inbox(std::make_shared(ITEM_INBOX)), client(std::move(p)) { m_wheelPlayer = std::make_unique(*this); + m_playerAchievement = std::make_unique(*this); } Player::~Player() { @@ -2188,7 +2190,7 @@ void Player::onThink(uint32_t interval) { } else if (client && idleTime == 60000 * kickAfterMinutes) { std::ostringstream ss; ss << "There was no variation in your behaviour for " << kickAfterMinutes << " minutes. You will be disconnected in one minute if there is no change in your actions until then."; - client->sendTextMessage(TextMessage(MESSAGE_ADMINISTRADOR, ss.str())); + client->sendTextMessage(TextMessage(MESSAGE_ADMINISTRATOR, ss.str())); } } @@ -2667,6 +2669,11 @@ BlockType_t Player::blockHit(std::shared_ptr attacker, CombatType_t co } void Player::death(std::shared_ptr lastHitCreature) { + if (!g_configManager().getBoolean(TOGGLE_MOUNT_IN_PZ, __FUNCTION__) && isMounted()) { + dismount(); + g_game().internalCreatureChangeOutfit(getPlayer(), defaultOutfit); + } + loginPosition = town->getTemplePosition(); g_game().sendSingleSoundEffect(static_self_cast()->getPosition(), sex == PLAYERSEX_FEMALE ? SoundEffect_t::HUMAN_FEMALE_DEATH : SoundEffect_t::HUMAN_MALE_DEATH, getPlayer()); @@ -3175,12 +3182,18 @@ ReturnValue Player::queryAdd(int32_t index, const std::shared_ptr &thing, ReturnValue ret = RETURNVALUE_NOERROR; const int32_t &slotPosition = item->getSlotPosition(); - if ((slotPosition & SLOTP_HEAD) || (slotPosition & SLOTP_NECKLACE) || (slotPosition & SLOTP_BACKPACK) || (slotPosition & SLOTP_ARMOR) || (slotPosition & SLOTP_LEGS) || (slotPosition & SLOTP_FEET) || (slotPosition & SLOTP_RING)) { - ret = RETURNVALUE_CANNOTBEDRESSED; - } else if (slotPosition & SLOTP_TWO_HAND) { - ret = RETURNVALUE_PUTTHISOBJECTINBOTHHANDS; - } else if ((slotPosition & SLOTP_RIGHT) || (slotPosition & SLOTP_LEFT)) { - ret = RETURNVALUE_CANNOTBEDRESSED; + + bool allowPutItemsOnAmmoSlot = g_configManager().getBoolean(ENABLE_PLAYER_PUT_ITEM_IN_AMMO_SLOT, __FUNCTION__); + if (allowPutItemsOnAmmoSlot && index == CONST_SLOT_AMMO) { + ret = RETURNVALUE_NOERROR; + } else { + if ((slotPosition & SLOTP_HEAD) || (slotPosition & SLOTP_NECKLACE) || (slotPosition & SLOTP_BACKPACK) || (slotPosition & SLOTP_ARMOR) || (slotPosition & SLOTP_LEGS) || (slotPosition & SLOTP_FEET) || (slotPosition & SLOTP_RING)) { + ret = RETURNVALUE_CANNOTBEDRESSED; + } else if (slotPosition & SLOTP_TWO_HAND) { + ret = RETURNVALUE_PUTTHISOBJECTINBOTHHANDS; + } else if ((slotPosition & SLOTP_RIGHT) || (slotPosition & SLOTP_LEFT)) { + ret = RETURNVALUE_CANNOTBEDRESSED; + } } switch (index) { @@ -3322,8 +3335,12 @@ ReturnValue Player::queryAdd(int32_t index, const std::shared_ptr &thing, } case CONST_SLOT_AMMO: { - if ((slotPosition & SLOTP_AMMO)) { + if (allowPutItemsOnAmmoSlot) { ret = RETURNVALUE_NOERROR; + } else { + if ((slotPosition & SLOTP_AMMO)) { + ret = RETURNVALUE_NOERROR; + } } break; } @@ -6107,6 +6124,12 @@ void Player::sendClosePrivate(uint16_t channelId) { } } +void Player::sendCyclopediaCharacterAchievements(uint16_t secretsUnlocked, std::vector> achievementsUnlocked) { + if (client) { + client->sendCyclopediaCharacterAchievements(secretsUnlocked, achievementsUnlocked); + } +} + uint64_t Player::getMoney() const { std::vector> containers; uint64_t moneyCount = 0; @@ -7933,6 +7956,15 @@ const std::unique_ptr &Player::wheel() const { return m_wheelPlayer; } +// Achievement interface +std::unique_ptr &Player::achiev() { + return m_playerAchievement; +} + +const std::unique_ptr &Player::achiev() const { + return m_playerAchievement; +} + void Player::sendLootMessage(const std::string &message) const { auto party = getParty(); if (!party) { @@ -8042,3 +8074,13 @@ void Player::checkAndShowBlessingMessage() { sendTextMessage(MESSAGE_EVENT_ADVANCE, blessOutput.str()); } } + +bool Player::canSpeakWithHireling(uint8_t speechbubble) { + const auto &playerTile = getTile(); + const auto &house = playerTile ? playerTile->getHouse() : nullptr; + if (speechbubble == SPEECHBUBBLE_HIRELING && (!house || house->getHouseAccessLevel(static_self_cast()) == HOUSE_NOT_INVITED)) { + return false; + } + + return true; +} diff --git a/src/creatures/players/player.hpp b/src/creatures/players/player.hpp index 814914295f4..a6bf0076a43 100644 --- a/src/creatures/players/player.hpp +++ b/src/creatures/players/player.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -48,10 +48,12 @@ class PreySlot; class TaskHuntingSlot; class Spell; class PlayerWheel; +class PlayerAchievement; class Spectators; class Account; struct ModalWindow; +struct Achievement; struct ForgeHistory { ForgeAction_t actionType = ForgeAction_t::FUSION; @@ -1623,11 +1625,7 @@ class Player final : public Creature, public Cylinder, public Bankable { client->sendCyclopediaCharacterRecentPvPKills(page, pages, entries); } } - void sendCyclopediaCharacterAchievements() { - if (client) { - client->sendCyclopediaCharacterAchievements(); - } - } + void sendCyclopediaCharacterAchievements(uint16_t secretsUnlocked, std::vector> achievementsUnlocked); void sendCyclopediaCharacterItemSummary() { if (client) { client->sendCyclopediaCharacterItemSummary(); @@ -2587,10 +2585,14 @@ class Player final : public Creature, public Cylinder, public Bankable { */ std::vector> getEquippedItems() const; - // Player wheel methods interface + // Player wheel interface std::unique_ptr &wheel(); const std::unique_ptr &wheel() const; + // Player achievement interface + std::unique_ptr &achiev(); + const std::unique_ptr &achiev() const; + void sendLootMessage(const std::string &message) const; std::shared_ptr getLootPouch(); @@ -2599,6 +2601,8 @@ class Player final : public Creature, public Cylinder, public Bankable { std::shared_ptr getStoreInbox() const; + bool canSpeakWithHireling(uint8_t speechbubble); + private: friend class PlayerLock; std::mutex mutex; @@ -2980,8 +2984,10 @@ class Player final : public Creature, public Cylinder, public Bankable { friend class PlayerWheel; friend class IOLoginDataLoad; friend class IOLoginDataSave; + friend class PlayerAchievement; std::unique_ptr m_wheelPlayer; + std::unique_ptr m_playerAchievement; std::mutex quickLootMutex; diff --git a/src/creatures/players/storages/storages.cpp b/src/creatures/players/storages/storages.cpp index 8476fa978a5..7fe925ce9e3 100644 --- a/src/creatures/players/storages/storages.cpp +++ b/src/creatures/players/storages/storages.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/storages/storages.hpp b/src/creatures/players/storages/storages.hpp index afe79a8ad7b..afc9fe14f90 100644 --- a/src/creatures/players/storages/storages.hpp +++ b/src/creatures/players/storages/storages.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/vocations/vocation.cpp b/src/creatures/players/vocations/vocation.cpp index fc07cea986f..c9a276a641d 100644 --- a/src/creatures/players/vocations/vocation.cpp +++ b/src/creatures/players/vocations/vocation.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/vocations/vocation.hpp b/src/creatures/players/vocations/vocation.hpp index 8f81e3805e3..a658e21ece7 100644 --- a/src/creatures/players/vocations/vocation.hpp +++ b/src/creatures/players/vocations/vocation.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/wheel/player_wheel.cpp b/src/creatures/players/wheel/player_wheel.cpp index 9151896cb10..b2fa39960e1 100644 --- a/src/creatures/players/wheel/player_wheel.cpp +++ b/src/creatures/players/wheel/player_wheel.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/wheel/player_wheel.hpp b/src/creatures/players/wheel/player_wheel.hpp index 13a65144c23..3ede17c339d 100644 --- a/src/creatures/players/wheel/player_wheel.hpp +++ b/src/creatures/players/wheel/player_wheel.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/wheel/wheel_definitions.hpp b/src/creatures/players/wheel/wheel_definitions.hpp index 0f40d32bf96..8432e9dca21 100644 --- a/src/creatures/players/wheel/wheel_definitions.hpp +++ b/src/creatures/players/wheel/wheel_definitions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/wheel/wheel_gems.cpp b/src/creatures/players/wheel/wheel_gems.cpp index d7957a9bb05..c3653298c12 100644 --- a/src/creatures/players/wheel/wheel_gems.cpp +++ b/src/creatures/players/wheel/wheel_gems.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/creatures/players/wheel/wheel_gems.hpp b/src/creatures/players/wheel/wheel_gems.hpp index fa47fe12ad2..762684cb383 100644 --- a/src/creatures/players/wheel/wheel_gems.hpp +++ b/src/creatures/players/wheel/wheel_gems.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/database/database.cpp b/src/database/database.cpp index c548b13614a..f226587c511 100644 --- a/src/database/database.cpp +++ b/src/database/database.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/database/database.hpp b/src/database/database.hpp index 9554b2f0bed..2a27c30159b 100644 --- a/src/database/database.hpp +++ b/src/database/database.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/database/database_definitions.hpp b/src/database/database_definitions.hpp index 4e46313fe57..8fe18495115 100644 --- a/src/database/database_definitions.hpp +++ b/src/database/database_definitions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/database/databasemanager.cpp b/src/database/databasemanager.cpp index 373a91fa243..cbcc116dd9a 100644 --- a/src/database/databasemanager.cpp +++ b/src/database/databasemanager.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/database/databasemanager.hpp b/src/database/databasemanager.hpp index 5b66d054d7e..9be5bb0ebf7 100644 --- a/src/database/databasemanager.hpp +++ b/src/database/databasemanager.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/database/databasetasks.cpp b/src/database/databasetasks.cpp index 43370593bef..6d43992ac81 100644 --- a/src/database/databasetasks.cpp +++ b/src/database/databasetasks.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/database/databasetasks.hpp b/src/database/databasetasks.hpp index 90a29d1515b..6922dfc566f 100644 --- a/src/database/databasetasks.hpp +++ b/src/database/databasetasks.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/declarations.hpp b/src/declarations.hpp index 0e698022417..294d9a813c6 100644 --- a/src/declarations.hpp +++ b/src/declarations.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/enums/account_coins.hpp b/src/enums/account_coins.hpp index 65fccac4eb9..0980500aaaa 100644 --- a/src/enums/account_coins.hpp +++ b/src/enums/account_coins.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/enums/account_errors.hpp b/src/enums/account_errors.hpp index 8a9bc6ee308..d5686618162 100644 --- a/src/enums/account_errors.hpp +++ b/src/enums/account_errors.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/enums/account_group_type.hpp b/src/enums/account_group_type.hpp index 6f9e9390a3d..778e706a2cd 100644 --- a/src/enums/account_group_type.hpp +++ b/src/enums/account_group_type.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/enums/account_type.hpp b/src/enums/account_type.hpp index 5b4286a837c..df76c4a289f 100644 --- a/src/enums/account_type.hpp +++ b/src/enums/account_type.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/enums/forge_conversion.hpp b/src/enums/forge_conversion.hpp index 8f84a453bf2..8d990081d55 100644 --- a/src/enums/forge_conversion.hpp +++ b/src/enums/forge_conversion.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/enums/item_attribute.hpp b/src/enums/item_attribute.hpp index 1f6bccf1671..adc49c11a19 100644 --- a/src/enums/item_attribute.hpp +++ b/src/enums/item_attribute.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/enums/lua_variant_type.hpp b/src/enums/lua_variant_type.hpp index 7f7ac216dd5..32dac39dc87 100644 --- a/src/enums/lua_variant_type.hpp +++ b/src/enums/lua_variant_type.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/enums/object_category.hpp b/src/enums/object_category.hpp index fe3e4422a34..74191bf9b50 100644 --- a/src/enums/object_category.hpp +++ b/src/enums/object_category.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/game/bank/bank.cpp b/src/game/bank/bank.cpp index 713ee645733..5f8db90fd1a 100644 --- a/src/game/bank/bank.cpp +++ b/src/game/bank/bank.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/game/bank/bank.hpp b/src/game/bank/bank.hpp index f4ebbb7beb9..9e65a55aeb9 100644 --- a/src/game/bank/bank.hpp +++ b/src/game/bank/bank.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/game/functions/game_reload.cpp b/src/game/functions/game_reload.cpp index f40e9cf9047..887877bb1eb 100644 --- a/src/game/functions/game_reload.cpp +++ b/src/game/functions/game_reload.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -61,6 +61,15 @@ uint8_t GameReload::getReloadNumber(Reload_t reloadTypes) const { return magic_enum::enum_integer(reloadTypes); } +// Helper function for logging reload status +void logReloadStatus(const std::string &name, bool result) { + if (result) { + g_logger().info("Reloaded: {}", name); + } else { + g_logger().error("Failed to reload: {}", name); + } +} + /* * From here down have the private members functions * These should only be used within the class itself @@ -72,98 +81,123 @@ bool GameReload::reloadAll() const { reloadResults.reserve(magic_enum::enum_count()); for (auto value : magic_enum::enum_values()) { - g_logger().info("Reloading: {}", magic_enum::enum_name(value)); - if (value == Reload_t::RELOAD_TYPE_ALL) { - continue; + const auto name = magic_enum::enum_name(value); + g_logger().info("Reloading: {}", name); + if (value != Reload_t::RELOAD_TYPE_ALL) { + reloadResults.push_back(init(value)); } - - reloadResults.push_back(init(value)); } return std::ranges::any_of(reloadResults, [](bool result) { return result; }); } bool GameReload::reloadChat() const { - return g_chat().load(); + const bool result = g_chat().load(); + logReloadStatus("Chat", result); + return result; } bool GameReload::reloadConfig() const { - return g_configManager().reload(); + const bool result = g_configManager().reload(); + logReloadStatus("Config", result); + return result; } bool GameReload::reloadEvents() const { - return g_events().loadFromXml(); + const bool result = g_events().loadFromXml(); + logReloadStatus("Events", result); + return result; } bool GameReload::reloadCore() const { - if (auto coreFolder = g_configManager().getString(CORE_DIRECTORY, __FUNCTION__); - g_luaEnvironment().loadFile(coreFolder + "/core.lua", "core.lua") == 0) { - // Reload scripts lib - auto datapackFolder = g_configManager().getString(DATA_DIRECTORY, __FUNCTION__); - if (!g_scripts().loadScripts(datapackFolder + "/scripts/lib", true, false)) { - return false; + const auto &coreFolder = g_configManager().getString(CORE_DIRECTORY, __FUNCTION__); + const bool coreLoaded = g_luaEnvironment().loadFile(coreFolder + "/core.lua", "core.lua") == 0; + + if (coreLoaded) { + const auto &datapackFolder = g_configManager().getString(CORE_DIRECTORY, __FUNCTION__); + const bool scriptsLoaded = g_scripts().loadScripts(coreFolder + "/scripts/lib", true, false); + if (scriptsLoaded) { + return true; } - - return true; } + + logReloadStatus("Core", false); return false; } bool GameReload::reloadImbuements() const { - return g_imbuements().reload(); + const bool result = g_imbuements().reload(); + logReloadStatus("Imbuements", result); + return result; } bool GameReload::reloadItems() const { - return Item::items.reload(); + const bool result = Item::items.reload(); + logReloadStatus("Items", result); + return result; } bool GameReload::reloadModules() const { - return g_modules().reload(); + const bool result = g_modules().reload(); + logReloadStatus("Modules", result); + return result; } bool GameReload::reloadMonsters() const { - // Clear registered MonsterType vector g_monsters().clear(); - // Resets monster spells to prevent the spell from being incorrectly cleared from memory - auto datapackFolder = g_configManager().getString(DATA_DIRECTORY, __FUNCTION__); - if (!g_scripts().loadScripts(datapackFolder + "/scripts/lib", true, false)) { - return false; - } + const auto &datapackFolder = g_configManager().getString(DATA_DIRECTORY, __FUNCTION__); + const auto &coreFolder = g_configManager().getString(CORE_DIRECTORY, __FUNCTION__); - if (g_scripts().loadScripts(datapackFolder + "/monster", false, true) && g_scripts().loadScripts(datapackFolder + "/scripts/lib", true, true)) { + const bool scriptsLoaded = g_scripts().loadScripts(coreFolder + "/scripts/lib", true, false); + const bool monsterScriptsLoaded = g_scripts().loadScripts(datapackFolder + "/monster", false, true); + + if (scriptsLoaded && monsterScriptsLoaded) { + logReloadStatus("Monsters", true); return true; + } else { + logReloadStatus("Monsters", false); + return false; } - return false; } bool GameReload::reloadMounts() const { - return g_game().mounts.reload(); + const bool result = g_game().mounts.reload(); + logReloadStatus("Mounts", result); + return result; } bool GameReload::reloadNpcs() const { - return g_npcs().reload(); + const bool result = g_npcs().reload(); + logReloadStatus("NPCs", result); + return result; } bool GameReload::reloadRaids() const { - return g_game().raids.reload() && g_game().raids.startup(); + const bool result = g_game().raids.reload() && g_game().raids.startup(); + logReloadStatus("Raids", result); + return result; } bool GameReload::reloadScripts() const { g_scripts().clearAllScripts(); Zone::clearZones(); - // Reset scripts lib to prevent the objects from being incorrectly cleared from memory - auto datapackFolder = g_configManager().getString(DATA_DIRECTORY, __FUNCTION__); - g_scripts().loadScripts(datapackFolder + "/scripts/lib", true, false); - auto coreFolder = g_configManager().getString(CORE_DIRECTORY, __FUNCTION__); + + const auto &datapackFolder = g_configManager().getString(DATA_DIRECTORY, __FUNCTION__); + const auto &coreFolder = g_configManager().getString(CORE_DIRECTORY, __FUNCTION__); + + g_scripts().loadScripts(coreFolder + "/scripts/lib", true, false); g_scripts().loadScripts(datapackFolder + "/scripts", false, true); g_scripts().loadScripts(coreFolder + "/scripts", false, true); // It should come last, after everything else has been cleaned up. reloadMonsters(); reloadNpcs(); + logReloadStatus("Scripts", true); return true; } bool GameReload::reloadGroups() const { - return g_game().groups.reload(); + const bool result = g_game().groups.reload(); + logReloadStatus("Groups", result); + return result; } diff --git a/src/game/functions/game_reload.hpp b/src/game/functions/game_reload.hpp index 29cbac4b847..e2f3789cfde 100644 --- a/src/game/functions/game_reload.hpp +++ b/src/game/functions/game_reload.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -64,7 +64,6 @@ class GameReload : public Game { bool reloadNpcs() const; bool reloadRaids() const; bool reloadScripts() const; - bool reloadTalkaction() const; bool reloadGroups() const; }; diff --git a/src/game/game.cpp b/src/game/game.cpp index b2186f6a6d2..ab39f632457 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -9,6 +9,8 @@ #include "pch.hpp" +#include "game/game.hpp" + #include "lua/creature/actions.hpp" #include "items/bed.hpp" #include "creatures/creature.hpp" @@ -16,7 +18,7 @@ #include "lua/creature/events.hpp" #include "lua/callbacks/event_callback.hpp" #include "lua/callbacks/events_callbacks.hpp" -#include "game/game.hpp" +#include "creatures/players/highscore_category.hpp" #include "game/zones/zone.hpp" #include "lua/global/globalevent.hpp" #include "io/iologindata.hpp" @@ -34,6 +36,7 @@ #include "items/weapons/weapons.hpp" #include "creatures/players/imbuements/imbuements.hpp" #include "creatures/players/wheel/player_wheel.hpp" +#include "creatures/players/achievement/player_achievement.hpp" #include "creatures/npcs/npc.hpp" #include "server/network/webhook/webhook.hpp" #include "server/network/protocol/protocollogin.hpp" @@ -50,6 +53,23 @@ #include +enum class HighscoreCategories_t : uint8_t { + EXPERIENCE = 0, + FIST_FIGHTING = 1, + CLUB_FIGHTING = 2, + SWORD_FIGHTING = 3, + AXE_FIGHTING = 4, + DISTANCE_FIGHTING = 5, + SHIELDING = 6, + FISHING = 7, + MAGIC_LEVEL = 8, + LOYALTY = 9, + ACHIEVEMENTS = 10, + CHARMS = 11, + DROME = 12, + GOSHNAR = 13, +}; + namespace InternalGame { void sendBlockEffect(BlockType_t blockType, CombatType_t combatType, const Position &targetPos, std::shared_ptr source) { if (blockType == BLOCK_DEFENSE) { @@ -186,6 +206,35 @@ Game::Game() { // Create instance of IOWheel to Game class m_IOWheel = std::make_unique(); + + m_highscoreCategoriesNames = { + { static_cast(HighscoreCategories_t::ACHIEVEMENTS), "Achievement Points" }, + { static_cast(HighscoreCategories_t::AXE_FIGHTING), "Axe Fighting" }, + { static_cast(HighscoreCategories_t::CHARMS), "Charm Points" }, + { static_cast(HighscoreCategories_t::CLUB_FIGHTING), "Club Fighting" }, + { static_cast(HighscoreCategories_t::EXPERIENCE), "Experience Points" }, + { static_cast(HighscoreCategories_t::DISTANCE_FIGHTING), "Distance Fighting" }, + { static_cast(HighscoreCategories_t::DROME), "Drome Score" }, + { static_cast(HighscoreCategories_t::FISHING), "Fishing" }, + { static_cast(HighscoreCategories_t::FIST_FIGHTING), "Fist Fighting" }, + { static_cast(HighscoreCategories_t::GOSHNAR), "Goshnar's Taint" }, + { static_cast(HighscoreCategories_t::LOYALTY), "Loyalty Points" }, + { static_cast(HighscoreCategories_t::MAGIC_LEVEL), "Magic Level" }, + { static_cast(HighscoreCategories_t::SHIELDING), "Shielding" }, + { static_cast(HighscoreCategories_t::SWORD_FIGHTING), "Sword Fighting" }, + }; + + m_highscoreCategories = { + HighscoreCategory("Experience Points", static_cast(HighscoreCategories_t::EXPERIENCE)), + HighscoreCategory("Fist Fighting", static_cast(HighscoreCategories_t::FIST_FIGHTING)), + HighscoreCategory("Club Fighting", static_cast(HighscoreCategories_t::CLUB_FIGHTING)), + HighscoreCategory("Sword Fighting", static_cast(HighscoreCategories_t::SWORD_FIGHTING)), + HighscoreCategory("Axe Fighting", static_cast(HighscoreCategories_t::AXE_FIGHTING)), + HighscoreCategory("Distance Fighting", static_cast(HighscoreCategories_t::DISTANCE_FIGHTING)), + HighscoreCategory("Shielding", static_cast(HighscoreCategories_t::SHIELDING)), + HighscoreCategory("Fishing", static_cast(HighscoreCategories_t::FISHING)), + HighscoreCategory("Magic Level", static_cast(HighscoreCategories_t::MAGIC_LEVEL)) + }; } Game::~Game() = default; @@ -1570,7 +1619,7 @@ void Game::playerMoveItem(std::shared_ptr player, const Position &fromPo auto toHouseTile = map.getTile(mapToPos)->dynamic_self_cast(); auto fromHouseTile = map.getTile(mapFromPos)->dynamic_self_cast(); if (fromHouseTile && (!toHouseTile || toHouseTile->getHouse()->getId() != fromHouseTile->getHouse()->getId())) { - player->sendCancelMessage("You can't move this item outside a house."); + player->sendCancelMessage("You cannot move this item out of this house."); return; } } @@ -1617,12 +1666,12 @@ ReturnValue Game::checkMoveItemToCylinder(std::shared_ptr player, std::s bool allowAnything = g_configManager().getBoolean(TOGGLE_GOLD_POUCH_ALLOW_ANYTHING, __FUNCTION__); if (!allowAnything && item->getID() != ITEM_GOLD_COIN && item->getID() != ITEM_PLATINUM_COIN && item->getID() != ITEM_CRYSTAL_COIN) { - return RETURNVALUE_CONTAINERNOTENOUGHROOM; + return RETURNVALUE_ITEMCANNOTBEMOVEDPOUCH; } - // prevent move up + // prevent move up from ponch to store inbox. if (!item->canBeMovedToStore() && fromCylinder->getContainer() && fromCylinder->getContainer()->getID() == ITEM_GOLD_POUCH) { - return RETURNVALUE_CONTAINERNOTENOUGHROOM; + return RETURNVALUE_NOTBOUGHTINSTORE; } return RETURNVALUE_NOERROR; @@ -1632,7 +1681,7 @@ ReturnValue Game::checkMoveItemToCylinder(std::shared_ptr player, std::s const auto parentContainer = topParentContainer->getParent() ? topParentContainer->getParent()->getContainer() : nullptr; auto isStoreInbox = parentContainer && parentContainer->isStoreInbox(); if (!item->canBeMovedToStore() && (containerID == ITEM_STORE_INBOX || isStoreInbox)) { - return RETURNVALUE_CONTAINERNOTENOUGHROOM; + return RETURNVALUE_NOTBOUGHTINSTORE; } if (item->isStoreItem()) { @@ -1656,7 +1705,7 @@ ReturnValue Game::checkMoveItemToCylinder(std::shared_ptr player, std::s } if (!isValidMoveItem) { - return RETURNVALUE_NOTPOSSIBLE; + return RETURNVALUE_ITEMCANNOTBEMOVEDTHERE; } if (item->hasOwner() && !item->isOwner(player)) { @@ -1689,7 +1738,7 @@ ReturnValue Game::checkMoveItemToCylinder(std::shared_ptr player, std::s } if (item->isStoreItem() && !house) { - return RETURNVALUE_NOTPOSSIBLE; + return RETURNVALUE_ITEMCANNOTBEMOVEDTHERE; } } } @@ -5236,7 +5285,8 @@ void Game::playerSetManagedContainer(uint32_t playerId, ObjectCategory_t categor } std::shared_ptr container = thing->getContainer(); - if (!container || (container->getID() == ITEM_GOLD_POUCH && category != OBJECTCATEGORY_GOLD && !g_configManager().getBoolean(TOGGLE_GOLD_POUCH_ALLOW_ANYTHING, __FUNCTION__))) { + auto allowConfig = !g_configManager().getBoolean(TOGGLE_GOLD_POUCH_ALLOW_ANYTHING, __FUNCTION__) || !g_configManager().getBoolean(TOGGLE_GOLD_POUCH_QUICKLOOT_ONLY, __FUNCTION__); + if (!container || (container->getID() == ITEM_GOLD_POUCH && category != OBJECTCATEGORY_GOLD) && !allowConfig) { player->sendCancelMessage(RETURNVALUE_NOTPOSSIBLE); return; } @@ -5641,7 +5691,7 @@ void Game::playerChangeOutfit(uint32_t playerId, Outfit_t outfit, uint8_t isMoun return; } - if (playerTile->hasFlag(TILESTATE_PROTECTIONZONE)) { + if (!g_configManager().getBoolean(TOGGLE_MOUNT_IN_PZ, __FUNCTION__) && playerTile->hasFlag(TILESTATE_PROTECTIONZONE)) { outfit.lookMount = 0; } @@ -5858,6 +5908,10 @@ void Game::playerSpeakToNpc(std::shared_ptr player, const std::string &t } for (const auto &spectator : Spectators().find(player->getPosition()).filter()) { + if (!player->canSpeakWithHireling(spectator->getNpc()->getSpeechBubble())) { + continue; + } + spectator->getNpc()->onCreatureSay(player, TALKTYPE_PRIVATE_PN, text); } @@ -8109,7 +8163,7 @@ void Game::playerCyclopediaCharacterInfo(std::shared_ptr player, uint32_ break; } case CYCLOPEDIA_CHARACTERINFO_ACHIEVEMENTS: - player->sendCyclopediaCharacterAchievements(); + player->achiev()->sendUnlockedSecretAchievements(); break; case CYCLOPEDIA_CHARACTERINFO_ITEMSUMMARY: player->sendCyclopediaCharacterItemSummary(); @@ -8289,33 +8343,34 @@ void Game::playerHighscores(std::shared_ptr player, HighscoreType_t type } std::string categoryName; - switch (category) { - case HIGHSCORE_CATEGORY_FIST_FIGHTING: + const auto &categoryType = static_cast(category); + switch (categoryType) { + case HighscoreCategories_t::FIST_FIGHTING: categoryName = "skill_fist"; break; - case HIGHSCORE_CATEGORY_CLUB_FIGHTING: + case HighscoreCategories_t::CLUB_FIGHTING: categoryName = "skill_club"; break; - case HIGHSCORE_CATEGORY_SWORD_FIGHTING: + case HighscoreCategories_t::SWORD_FIGHTING: categoryName = "skill_sword"; break; - case HIGHSCORE_CATEGORY_AXE_FIGHTING: + case HighscoreCategories_t::AXE_FIGHTING: categoryName = "skill_axe"; break; - case HIGHSCORE_CATEGORY_DISTANCE_FIGHTING: + case HighscoreCategories_t::DISTANCE_FIGHTING: categoryName = "skill_dist"; break; - case HIGHSCORE_CATEGORY_SHIELDING: + case HighscoreCategories_t::SHIELDING: categoryName = "skill_shielding"; break; - case HIGHSCORE_CATEGORY_FISHING: + case HighscoreCategories_t::FISHING: categoryName = "skill_fishing"; break; - case HIGHSCORE_CATEGORY_MAGIC_LEVEL: + case HighscoreCategories_t::MAGIC_LEVEL: categoryName = "maglevel"; break; default: { - category = HIGHSCORE_CATEGORY_EXPERIENCE; + category = static_cast(HighscoreCategories_t::EXPERIENCE); categoryName = "experience"; break; } @@ -8401,6 +8456,16 @@ void Game::playerNpcGreet(uint32_t playerId, uint32_t npcId) { return; } + // Check npc say exhausted + if (player->isUIExhausted()) { + player->sendCancelMessage(RETURNVALUE_YOUAREEXHAUSTED); + return; + } + + if (!player->canSpeakWithHireling(npc->getSpeechBubble())) { + return; + } + auto spectators = Spectators().find(player->getPosition(), true); spectators.insert(npc); internalCreatureSay(player, TALKTYPE_SAY, "hi", false, &spectators); @@ -8412,6 +8477,8 @@ void Game::playerNpcGreet(uint32_t playerId, uint32_t npcId) { } else { internalCreatureSay(player, TALKTYPE_PRIVATE_PN, "sail", false, &npcsSpectators); } + + player->updateUIExhausted(); } void Game::playerLeaveMarket(uint32_t playerId) { @@ -10280,3 +10347,61 @@ void Game::afterCreatureZoneChange(std::shared_ptr creature, const std g_callbacks().executeCallback(EventCallback_t::zoneAfterCreatureEnter, &EventCallback::zoneAfterCreatureEnter, zone, creature); } } + +const std::unordered_map &Game::getHighscoreCategoriesName() const { + return m_highscoreCategoriesNames; +} + +const std::vector &Game::getHighscoreCategories() const { + return m_highscoreCategories; +} + +void Game::registerAchievement(uint16_t id, std::string name, std::string description, bool secret, uint8_t grade, uint8_t points) { + m_achievements[id] = Achievement(); + m_achievements[id].id = id; + m_achievements[id].name = name; + m_achievements[id].description = description; + m_achievements[id].secret = secret; + m_achievements[id].grade = grade; + m_achievements[id].points = points; + + m_achievementsNameToId.emplace(name, id); +} + +Achievement Game::getAchievementById(uint16_t id) { + return m_achievements[id]; +} + +Achievement Game::getAchievementByName(std::string name) { + auto it = m_achievementsNameToId.find(name); + if (it != m_achievementsNameToId.end()) { + return getAchievementById(it->second); + } + return {}; +} + +std::vector Game::getSecretAchievements() { + std::vector secrets; + for (const auto &achievement : m_achievements) { + if (achievement.second.secret) { + secrets.emplace_back(achievement.second); + } + } + + return secrets; +} + +std::vector Game::getPublicAchievements() { + std::vector publics; + for (const auto &achievement : m_achievements) { + if (!achievement.second.secret) { + publics.emplace_back(achievement.second); + } + } + + return publics; +} + +std::map Game::getAchievements() { + return m_achievements; +} diff --git a/src/game/game.hpp b/src/game/game.hpp index 56e28fe0459..d70263c1775 100644 --- a/src/game/game.hpp +++ b/src/game/game.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -48,6 +48,9 @@ class Guild; class Mounts; class Spectators; +struct Achievement; +struct HighscoreCategory; + static constexpr uint16_t SERVER_BEAT = 0x32; static constexpr int32_t EVENT_MS = 10000; static constexpr int32_t EVENT_LIGHTINTERVAL_MS = 10000; @@ -703,7 +706,24 @@ class Game { void setTransferPlayerHouseItems(uint32_t houseId, uint32_t playerId); void transferHouseItemsToDepot(); + const std::unordered_map &getHighscoreCategoriesName() const; + + const std::vector &getHighscoreCategories() const; + + void registerAchievement(uint16_t id, std::string name, std::string description, bool secret, uint8_t grade, uint8_t points); + Achievement getAchievementById(uint16_t id); + Achievement getAchievementByName(std::string name); + std::vector getSecretAchievements(); + std::vector getPublicAchievements(); + std::map getAchievements(); + private: + std::map m_achievements; + std::map m_achievementsNameToId; + + std::vector m_highscoreCategories; + std::unordered_map m_highscoreCategoriesNames; + std::map forgeMonsterEventIds; std::unordered_set fiendishMonsters; std::unordered_set influencedMonsters; diff --git a/src/game/game_definitions.hpp b/src/game/game_definitions.hpp index f529f93d169..2dadcbbd87c 100644 --- a/src/game/game_definitions.hpp +++ b/src/game/game_definitions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -84,18 +84,6 @@ enum CyclopediaCharacterInfo_RecentKillStatus_t : uint8_t { CYCLOPEDIA_CHARACTERINFO_RECENTKILLSTATUS_ARENA = 4 }; -enum HighscoreCategories_t : uint8_t { - HIGHSCORE_CATEGORY_EXPERIENCE = 0, - HIGHSCORE_CATEGORY_FIST_FIGHTING, - HIGHSCORE_CATEGORY_CLUB_FIGHTING, - HIGHSCORE_CATEGORY_SWORD_FIGHTING, - HIGHSCORE_CATEGORY_AXE_FIGHTING, - HIGHSCORE_CATEGORY_DISTANCE_FIGHTING, - HIGHSCORE_CATEGORY_SHIELDING, - HIGHSCORE_CATEGORY_FISHING, - HIGHSCORE_CATEGORY_MAGIC_LEVEL -}; - enum HighscoreType_t : uint8_t { HIGHSCORE_GETENTRIES = 0, HIGHSCORE_OURRANK = 1 diff --git a/src/game/modal_window/modal_window.hpp b/src/game/modal_window/modal_window.hpp index f79ab41cfea..f31a6d6ae17 100644 --- a/src/game/modal_window/modal_window.hpp +++ b/src/game/modal_window/modal_window.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/game/movement/position.cpp b/src/game/movement/position.cpp index 0dccd9c9beb..807a65ad458 100644 --- a/src/game/movement/position.cpp +++ b/src/game/movement/position.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/game/movement/position.hpp b/src/game/movement/position.hpp index 7ec62154785..87e74ee3e22 100644 --- a/src/game/movement/position.hpp +++ b/src/game/movement/position.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/game/movement/teleport.cpp b/src/game/movement/teleport.cpp index 5fdb984e168..d5a3a73daf1 100644 --- a/src/game/movement/teleport.cpp +++ b/src/game/movement/teleport.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/game/movement/teleport.hpp b/src/game/movement/teleport.hpp index 998e844b2d6..9e26e1864cf 100644 --- a/src/game/movement/teleport.hpp +++ b/src/game/movement/teleport.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/game/scheduling/dispatcher.cpp b/src/game/scheduling/dispatcher.cpp index fff897def89..ec999848a92 100644 --- a/src/game/scheduling/dispatcher.cpp +++ b/src/game/scheduling/dispatcher.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/game/scheduling/dispatcher.hpp b/src/game/scheduling/dispatcher.hpp index 1c5f72658c1..d9e26a0b5d5 100644 --- a/src/game/scheduling/dispatcher.hpp +++ b/src/game/scheduling/dispatcher.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/game/scheduling/events_scheduler.cpp b/src/game/scheduling/events_scheduler.cpp index 5eaebba700c..c57f84b667c 100644 --- a/src/game/scheduling/events_scheduler.cpp +++ b/src/game/scheduling/events_scheduler.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -74,6 +74,12 @@ bool EventsScheduler::loadScheduleEventFromXml() { g_eventsScheduler().setLootSchedule(lootrate); } + if (ingameNode.attribute("bosslootrate")) { + uint16_t bosslootrate = static_cast(ingameNode.attribute("bosslootrate").as_uint()); + currentEventRates.bosslootrate = bosslootrate; + g_eventsScheduler().setBossLootSchedule(bosslootrate); + } + if (ingameNode.attribute("spawnrate")) { uint16_t spawnrate = static_cast(ingameNode.attribute("spawnrate").as_uint()); currentEventRates.spawnrate = spawnrate; @@ -96,6 +102,9 @@ bool EventsScheduler::loadScheduleEventFromXml() { if (rates.lootrate != 100 && currentEventRates.lootrate != 100 && rates.lootrate == currentEventRates.lootrate) { modifiedRates.emplace_back("lootrate"); } + if (rates.bosslootrate != 100 && currentEventRates.bosslootrate != 100 && rates.bosslootrate == currentEventRates.bosslootrate) { + modifiedRates.emplace_back("bosslootrate"); + } if (rates.spawnrate != 100 && currentEventRates.spawnrate != 100 && rates.spawnrate == currentEventRates.spawnrate) { modifiedRates.emplace_back("spawnrate"); } diff --git a/src/game/scheduling/events_scheduler.hpp b/src/game/scheduling/events_scheduler.hpp index ea20a26f992..6c8233d8b0e 100644 --- a/src/game/scheduling/events_scheduler.hpp +++ b/src/game/scheduling/events_scheduler.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -21,6 +21,7 @@ struct EventScheduler { struct EventRates { uint16_t exprate = 100; uint32_t lootrate = 100; + uint32_t bosslootrate = 100; uint32_t spawnrate = 100; uint16_t skillrate = 100; }; @@ -55,6 +56,13 @@ class EventsScheduler { lootSchedule = (lootSchedule * lootrate) / 100; } + uint32_t getBossLootSchedule() const { + return bossLootSchedule; + } + void setBossLootSchedule(uint32_t bosslootrate) { + bossLootSchedule = (bossLootSchedule * bosslootrate) / 100; + } + uint32_t getSpawnMonsterSchedule() const { return spawnMonsterSchedule; } @@ -73,6 +81,7 @@ class EventsScheduler { // Event schedule uint16_t expSchedule = 100; uint32_t lootSchedule = 100; + uint32_t bossLootSchedule = 100; uint16_t skillSchedule = 100; uint32_t spawnMonsterSchedule = 100; diff --git a/src/game/scheduling/save_manager.cpp b/src/game/scheduling/save_manager.cpp index dfbcd04a0c6..2c1eff6657c 100644 --- a/src/game/scheduling/save_manager.cpp +++ b/src/game/scheduling/save_manager.cpp @@ -35,6 +35,12 @@ void SaveManager::scheduleAll() { auto scheduledAt = std::chrono::steady_clock::now(); m_scheduledAt = scheduledAt; + // Disable save async if the config is set to false + if (!g_configManager().getBoolean(TOGGLE_SAVE_ASYNC, __FUNCTION__)) { + saveAll(); + return; + } + threadPool.addLoad([this, scheduledAt]() { if (m_scheduledAt.load() != scheduledAt) { logger.warn("Skipping save for server because another save has been scheduled."); @@ -50,6 +56,16 @@ void SaveManager::schedulePlayer(std::weak_ptr playerPtr) { logger.debug("Skipping save for player because player is no longer online."); return; } + + // Disable save async if the config is set to false + if (!g_configManager().getBoolean(TOGGLE_SAVE_ASYNC, __FUNCTION__)) { + if (g_game().getGameState() == GAME_STATE_NORMAL) { + logger.debug("Saving player {}.", playerToSave->getName()); + } + doSavePlayer(playerToSave); + return; + } + logger.debug("Scheduling player {} for saving.", playerToSave->getName()); auto scheduledAt = std::chrono::steady_clock::now(); m_playerMap[playerToSave->getGUID()] = scheduledAt; @@ -76,7 +92,9 @@ bool SaveManager::doSavePlayer(std::shared_ptr player) { Benchmark bm_savePlayer; Player::PlayerLock lock(player); m_playerMap.erase(player->getGUID()); - logger.debug("Saving player {}...", player->getName()); + if (g_game().getGameState() == GAME_STATE_NORMAL) { + logger.debug("Saving player {}.", player->getName()); + } bool saveSuccess = IOLoginData::savePlayer(player); if (!saveSuccess) { diff --git a/src/game/scheduling/save_manager.hpp b/src/game/scheduling/save_manager.hpp index a809dd73f6a..745231c0075 100644 --- a/src/game/scheduling/save_manager.hpp +++ b/src/game/scheduling/save_manager.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/game/scheduling/task.cpp b/src/game/scheduling/task.cpp index 9cfe215bbd2..96355968bd1 100644 --- a/src/game/scheduling/task.cpp +++ b/src/game/scheduling/task.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/game/scheduling/task.hpp b/src/game/scheduling/task.hpp index 2360deeed75..c6591887c8a 100644 --- a/src/game/scheduling/task.hpp +++ b/src/game/scheduling/task.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/game/zones/zone.cpp b/src/game/zones/zone.cpp index 97ef72cf24f..b6c1191aa78 100644 --- a/src/game/zones/zone.cpp +++ b/src/game/zones/zone.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/game/zones/zone.hpp b/src/game/zones/zone.hpp index 99adf9d985d..82969a25792 100644 --- a/src/game/zones/zone.hpp +++ b/src/game/zones/zone.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/fileloader.cpp b/src/io/fileloader.cpp index ab80267a5a1..38bf2be19e3 100644 --- a/src/io/fileloader.cpp +++ b/src/io/fileloader.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/fileloader.hpp b/src/io/fileloader.hpp index 15756909fdb..2069487202f 100644 --- a/src/io/fileloader.hpp +++ b/src/io/fileloader.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/filestream.cpp b/src/io/filestream.cpp index be370719db5..fc8ae6116fc 100644 --- a/src/io/filestream.cpp +++ b/src/io/filestream.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/filestream.hpp b/src/io/filestream.hpp index 89b04808425..1478fa836df 100644 --- a/src/io/filestream.hpp +++ b/src/io/filestream.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/functions/iologindata_load_player.cpp b/src/io/functions/iologindata_load_player.cpp index 021d4b7c96e..bd61b2456bb 100644 --- a/src/io/functions/iologindata_load_player.cpp +++ b/src/io/functions/iologindata_load_player.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/functions/iologindata_load_player.hpp b/src/io/functions/iologindata_load_player.hpp index e8b0b4094de..07a478d2dc3 100644 --- a/src/io/functions/iologindata_load_player.hpp +++ b/src/io/functions/iologindata_load_player.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/functions/iologindata_save_player.cpp b/src/io/functions/iologindata_save_player.cpp index e6adeb2f4b2..7bc1b34c864 100644 --- a/src/io/functions/iologindata_save_player.cpp +++ b/src/io/functions/iologindata_save_player.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -327,16 +327,19 @@ bool IOLoginDataSave::savePlayerStash(std::shared_ptr player) { return false; } + query.str(""); + + DBInsert stashQuery("INSERT INTO `player_stash` (`player_id`,`item_id`,`item_count`) VALUES "); for (const auto &[itemId, itemCount] : player->getStashItems()) { - query.str(""); - query << "INSERT INTO `player_stash` (`player_id`,`item_id`,`item_count`) VALUES ("; - query << player->getGUID() << ", "; - query << itemId << ", "; - query << itemCount << ")"; - if (!db.executeQuery(query.str())) { + query << player->getGUID() << ',' << itemId << ',' << itemCount; + if (!stashQuery.addRow(query)) { return false; } } + + if (!stashQuery.execute()) { + return false; + } return true; } diff --git a/src/io/functions/iologindata_save_player.hpp b/src/io/functions/iologindata_save_player.hpp index 1c3cf89cb9c..5bc2ea9ce02 100644 --- a/src/io/functions/iologindata_save_player.hpp +++ b/src/io/functions/iologindata_save_player.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/io_bosstiary.cpp b/src/io/io_bosstiary.cpp index eea2c7f3547..0090c0b3ebb 100644 --- a/src/io/io_bosstiary.cpp +++ b/src/io/io_bosstiary.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/io_bosstiary.hpp b/src/io/io_bosstiary.hpp index b491247b295..84d9f0955e0 100644 --- a/src/io/io_bosstiary.hpp +++ b/src/io/io_bosstiary.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/io_definitions.hpp b/src/io/io_definitions.hpp index 22d61883ac8..ed546114803 100644 --- a/src/io/io_definitions.hpp +++ b/src/io/io_definitions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/io_wheel.cpp b/src/io/io_wheel.cpp index d0f3c5c1e28..6e7c2b02b0f 100644 --- a/src/io/io_wheel.cpp +++ b/src/io/io_wheel.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/io_wheel.hpp b/src/io/io_wheel.hpp index 1bc56428b08..e354f9aee52 100644 --- a/src/io/io_wheel.hpp +++ b/src/io/io_wheel.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/iobestiary.cpp b/src/io/iobestiary.cpp index a16c6164a93..f7305d8503c 100644 --- a/src/io/iobestiary.cpp +++ b/src/io/iobestiary.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/iobestiary.hpp b/src/io/iobestiary.hpp index 896e00434a1..9cb2ef2fe55 100644 --- a/src/io/iobestiary.hpp +++ b/src/io/iobestiary.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/ioguild.cpp b/src/io/ioguild.cpp index 7555c5c0ed8..99e1e750676 100644 --- a/src/io/ioguild.cpp +++ b/src/io/ioguild.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -60,7 +60,7 @@ uint32_t IOGuild::getGuildIdByName(const std::string &name) { void IOGuild::getWarList(uint32_t guildId, GuildWarVector &guildWarVector) { std::ostringstream query; - query << "SELECT `guild1`, `guild2` FROM `guild_wars` WHERE (`guild1` = " << guildId << " OR `guild2` = " << guildId << ") AND `ended` = 0 AND `status` = 1"; + query << "SELECT `guild1`, `guild2` FROM `guild_wars` WHERE (`guild1` = " << guildId << " OR `guild2` = " << guildId << ") AND `status` = 1"; DBResult_ptr result = Database::getInstance().storeQuery(query.str()); if (!result) { diff --git a/src/io/ioguild.hpp b/src/io/ioguild.hpp index d56a451a43e..cc450841bd1 100644 --- a/src/io/ioguild.hpp +++ b/src/io/ioguild.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/iologindata.cpp b/src/io/iologindata.cpp index f65d76f7a8b..7e113ef901e 100644 --- a/src/io/iologindata.cpp +++ b/src/io/iologindata.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/iologindata.hpp b/src/io/iologindata.hpp index c7902dd4e61..b9fcc124ea0 100644 --- a/src/io/iologindata.hpp +++ b/src/io/iologindata.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/iomap.cpp b/src/io/iomap.cpp index a84365bedf1..4edfefa66d1 100644 --- a/src/io/iomap.cpp +++ b/src/io/iomap.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/iomap.hpp b/src/io/iomap.hpp index e74f1ce3bfa..78fcc23191f 100644 --- a/src/io/iomap.hpp +++ b/src/io/iomap.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/iomapserialize.cpp b/src/io/iomapserialize.cpp index 7d40bb54b73..475a210a760 100644 --- a/src/io/iomapserialize.cpp +++ b/src/io/iomapserialize.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -47,8 +47,9 @@ void IOMapSerialize::loadHouseItems(Map* map) { while (item_count--) { if (auto houseTile = std::dynamic_pointer_cast(tile)) { - const auto house = houseTile->getHouse(); - if (house->getOwner() == 0) { + const auto &house = houseTile->getHouse(); + auto isTransferOnRestart = g_configManager().getBoolean(TOGGLE_HOUSE_TRANSFER_ON_SERVER_RESTART, __FUNCTION__); + if (!isTransferOnRestart && house->getOwner() == 0) { g_logger().trace("Skipping load item from house id: {}, position: {}, house does not have owner", house->getId(), house->getEntryPosition().toString()); house->clearHouseInfo(false); continue; diff --git a/src/io/iomapserialize.hpp b/src/io/iomapserialize.hpp index 017dd970529..08cbac01128 100644 --- a/src/io/iomapserialize.hpp +++ b/src/io/iomapserialize.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/iomarket.cpp b/src/io/iomarket.cpp index f308e10e687..ac79ef4c541 100644 --- a/src/io/iomarket.cpp +++ b/src/io/iomarket.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/iomarket.hpp b/src/io/iomarket.hpp index b02fba0ce6a..33180053584 100644 --- a/src/io/iomarket.hpp +++ b/src/io/iomarket.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/ioprey.cpp b/src/io/ioprey.cpp index 2a1c0eebd7a..642423c2abd 100644 --- a/src/io/ioprey.cpp +++ b/src/io/ioprey.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/io/ioprey.hpp b/src/io/ioprey.hpp index 2219e630b92..221f2ce5562 100644 --- a/src/io/ioprey.hpp +++ b/src/io/ioprey.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/bed.cpp b/src/items/bed.cpp index a1af00b2334..4ce4a1e0edd 100644 --- a/src/items/bed.cpp +++ b/src/items/bed.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/bed.hpp b/src/items/bed.hpp index 6fafe858a90..59c0c66f68c 100644 --- a/src/items/bed.hpp +++ b/src/items/bed.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/containers/container.cpp b/src/items/containers/container.cpp index c4f6e04988d..7bd7dcef2c9 100644 --- a/src/items/containers/container.cpp +++ b/src/items/containers/container.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/containers/container.hpp b/src/items/containers/container.hpp index 9bcd2389299..6bfb509b8d3 100644 --- a/src/items/containers/container.hpp +++ b/src/items/containers/container.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/containers/depot/depotchest.cpp b/src/items/containers/depot/depotchest.cpp index 198ec3e14f0..15488267f04 100644 --- a/src/items/containers/depot/depotchest.cpp +++ b/src/items/containers/depot/depotchest.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/containers/depot/depotchest.hpp b/src/items/containers/depot/depotchest.hpp index 069bad38209..6b64ca2b897 100644 --- a/src/items/containers/depot/depotchest.hpp +++ b/src/items/containers/depot/depotchest.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/containers/depot/depotlocker.cpp b/src/items/containers/depot/depotlocker.cpp index c431e8bd58e..0be000794ef 100644 --- a/src/items/containers/depot/depotlocker.cpp +++ b/src/items/containers/depot/depotlocker.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/containers/depot/depotlocker.hpp b/src/items/containers/depot/depotlocker.hpp index b8f33c15c70..09d794c444f 100644 --- a/src/items/containers/depot/depotlocker.hpp +++ b/src/items/containers/depot/depotlocker.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/containers/inbox/inbox.cpp b/src/items/containers/inbox/inbox.cpp index 7859cd3be3f..9b22c53748a 100644 --- a/src/items/containers/inbox/inbox.cpp +++ b/src/items/containers/inbox/inbox.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/containers/inbox/inbox.hpp b/src/items/containers/inbox/inbox.hpp index 058f96e029a..79eb126edc8 100644 --- a/src/items/containers/inbox/inbox.hpp +++ b/src/items/containers/inbox/inbox.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/containers/mailbox/mailbox.cpp b/src/items/containers/mailbox/mailbox.cpp index 19b3db5367a..c2c9b2f61e1 100644 --- a/src/items/containers/mailbox/mailbox.cpp +++ b/src/items/containers/mailbox/mailbox.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/containers/mailbox/mailbox.hpp b/src/items/containers/mailbox/mailbox.hpp index 5f47b61b290..116cd0ee1c4 100644 --- a/src/items/containers/mailbox/mailbox.hpp +++ b/src/items/containers/mailbox/mailbox.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/containers/rewards/reward.cpp b/src/items/containers/rewards/reward.cpp index 62ef98b0c7e..4b1757bd6c8 100644 --- a/src/items/containers/rewards/reward.cpp +++ b/src/items/containers/rewards/reward.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/containers/rewards/reward.hpp b/src/items/containers/rewards/reward.hpp index f372fbfb74b..1ab3c8f9b70 100644 --- a/src/items/containers/rewards/reward.hpp +++ b/src/items/containers/rewards/reward.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/containers/rewards/rewardchest.cpp b/src/items/containers/rewards/rewardchest.cpp index 00729491139..c9bb8112f90 100644 --- a/src/items/containers/rewards/rewardchest.cpp +++ b/src/items/containers/rewards/rewardchest.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/containers/rewards/rewardchest.hpp b/src/items/containers/rewards/rewardchest.hpp index 295eafc06df..2960128eb75 100644 --- a/src/items/containers/rewards/rewardchest.hpp +++ b/src/items/containers/rewards/rewardchest.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/cylinder.cpp b/src/items/cylinder.cpp index c328b1fbd8d..0636e5ff34c 100644 --- a/src/items/cylinder.cpp +++ b/src/items/cylinder.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/cylinder.hpp b/src/items/cylinder.hpp index bab34b5ce04..f6c149dd589 100644 --- a/src/items/cylinder.hpp +++ b/src/items/cylinder.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/decay/decay.cpp b/src/items/decay/decay.cpp index 4afc2e8287a..27ae7b6b485 100644 --- a/src/items/decay/decay.cpp +++ b/src/items/decay/decay.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/decay/decay.hpp b/src/items/decay/decay.hpp index 5d103f45daa..e2916f6134f 100644 --- a/src/items/decay/decay.hpp +++ b/src/items/decay/decay.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/functions/item/attribute.cpp b/src/items/functions/item/attribute.cpp index fcc2ad501ee..c67c6ce38f7 100644 --- a/src/items/functions/item/attribute.cpp +++ b/src/items/functions/item/attribute.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/functions/item/attribute.hpp b/src/items/functions/item/attribute.hpp index 8ffbcc880f7..a2d3ba128ed 100644 --- a/src/items/functions/item/attribute.hpp +++ b/src/items/functions/item/attribute.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/functions/item/custom_attribute.cpp b/src/items/functions/item/custom_attribute.cpp index f7cfa925eac..202c57c0960 100644 --- a/src/items/functions/item/custom_attribute.cpp +++ b/src/items/functions/item/custom_attribute.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/functions/item/custom_attribute.hpp b/src/items/functions/item/custom_attribute.hpp index 2d609e8cdaa..e91832c6b6b 100644 --- a/src/items/functions/item/custom_attribute.hpp +++ b/src/items/functions/item/custom_attribute.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/functions/item/item_parse.cpp b/src/items/functions/item/item_parse.cpp index e5f6a45a51e..a6255983f67 100644 --- a/src/items/functions/item/item_parse.cpp +++ b/src/items/functions/item/item_parse.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -10,7 +10,10 @@ #include "pch.hpp" #include "items/functions/item/item_parse.hpp" +#include "items/weapons/weapons.hpp" +#include "lua/creature/movement.hpp" #include "utils/pugicast.hpp" +#include "creatures/combat/combat.hpp" void ItemParse::initParse(const std::string &tmpStrValue, pugi::xml_node attributeNode, pugi::xml_attribute valueAttribute, ItemType &itemType) { // Parse all item attributes @@ -74,6 +77,7 @@ void ItemParse::initParse(const std::string &tmpStrValue, pugi::xml_node attribu ItemParse::parseTransformOnUse(tmpStrValue, valueAttribute, itemType); ItemParse::parsePrimaryType(tmpStrValue, valueAttribute, itemType); ItemParse::parseHouseRelated(tmpStrValue, valueAttribute, itemType); + ItemParse::parseUnscriptedItems(tmpStrValue, attributeNode, valueAttribute, itemType); } void ItemParse::parseDummyRate(pugi::xml_node attributeNode, ItemType &itemType) { @@ -967,3 +971,299 @@ void ItemParse::parseHouseRelated(const std::string_view &tmpStrValue, pugi::xml itemType.m_canBeUsedByGuests = valueAttribute.as_bool(); } } + +void ItemParse::createAndRegisterScript(ItemType &itemType, pugi::xml_node attributeNode, MoveEvent_t eventType /*= MOVE_EVENT_NONE*/, WeaponType_t weaponType /*= WEAPON_NONE*/) { + std::shared_ptr moveevent; + if (eventType != MOVE_EVENT_NONE) { + moveevent = std::make_shared(&g_moveEvents().getScriptInterface()); + moveevent->setItemId(itemType.id); + moveevent->setEventType(eventType); + moveevent->setFromXML(true); + + if (eventType == MOVE_EVENT_EQUIP) { + moveevent->equipFunction = moveevent->EquipItem; + } else if (eventType == MOVE_EVENT_DEEQUIP) { + moveevent->equipFunction = moveevent->DeEquipItem; + } else if (eventType == MOVE_EVENT_STEP_IN) { + moveevent->stepFunction = moveevent->StepInField; + } else if (eventType == MOVE_EVENT_STEP_OUT) { + moveevent->stepFunction = moveevent->StepOutField; + } else if (eventType == MOVE_EVENT_ADD_ITEM_ITEMTILE) { + moveevent->moveFunction = moveevent->AddItemField; + } else if (eventType == MOVE_EVENT_REMOVE_ITEM) { + moveevent->moveFunction = moveevent->RemoveItemField; + } + } + + std::shared_ptr weapon = nullptr; + if (weaponType != WEAPON_NONE) { + if (weaponType == WEAPON_DISTANCE || weaponType == WEAPON_AMMO || weaponType == WEAPON_MISSILE) { + weapon = std::make_shared(&g_weapons().getScriptInterface()); + } else if (weaponType == WEAPON_WAND) { + weapon = std::make_shared(&g_weapons().getScriptInterface()); + } else { + weapon = std::make_shared(&g_weapons().getScriptInterface()); + } + + weapon->weaponType = weaponType; + itemType.weaponType = weapon->weaponType; + weapon->configureWeapon(itemType); + g_logger().trace("Created weapon with type '{}'", getWeaponName(weaponType)); + } + uint32_t fromDamage = 0; + uint32_t toDamage = 0; + for (auto subAttributeNode : attributeNode.children()) { + pugi::xml_attribute subKeyAttribute = subAttributeNode.attribute("key"); + if (!subKeyAttribute) { + continue; + } + + pugi::xml_attribute subValueAttribute = subAttributeNode.attribute("value"); + if (!subValueAttribute) { + continue; + } + + auto stringKey = asLowerCaseString(subKeyAttribute.as_string()); + if (stringKey == "slot") { + if (moveevent && (moveevent->getEventType() == MOVE_EVENT_EQUIP || moveevent->getEventType() == MOVE_EVENT_DEEQUIP)) { + auto slotName = asLowerCaseString(subValueAttribute.as_string()); + if (slotName == "head") { + moveevent->setSlot(SLOTP_HEAD); + } else if (slotName == "necklace") { + moveevent->setSlot(SLOTP_NECKLACE); + } else if (slotName == "backpack") { + moveevent->setSlot(SLOTP_BACKPACK); + } else if (slotName == "armor" || slotName == "body") { + moveevent->setSlot(SLOTP_ARMOR); + } else if (slotName == "right-hand") { + moveevent->setSlot(SLOTP_RIGHT); + } else if (slotName == "left-hand") { + moveevent->setSlot(SLOTP_LEFT); + } else if (slotName == "hand" || slotName == "shield") { + moveevent->setSlot(SLOTP_RIGHT | SLOTP_LEFT); + } else if (slotName == "legs") { + moveevent->setSlot(SLOTP_LEGS); + } else if (slotName == "feet") { + moveevent->setSlot(SLOTP_FEET); + } else if (slotName == "ring") { + moveevent->setSlot(SLOTP_RING); + } else if (slotName == "ammo") { + moveevent->setSlot(SLOTP_AMMO); + } else { + g_logger().warn("[{}] unknown slot type '{}'", __FUNCTION__, slotName); + } + } else if (weapon) { + uint16_t id = weapon->getID(); + ItemType &it = Item::items.getItemType(id); + auto slotName = asLowerCaseString(subValueAttribute.as_string()); + if (slotName == "two-handed") { + it.slotPosition = SLOTP_TWO_HAND; + } else { + it.slotPosition = SLOTP_HAND; + } + } + } else if (stringKey == "level") { + auto numberValue = subValueAttribute.as_uint(); + if (moveevent) { + g_logger().trace("Added required moveevent level '{}'", numberValue); + moveevent->setRequiredLevel(numberValue); + moveevent->setWieldInfo(WIELDINFO_LEVEL); + } else if (weapon) { + g_logger().trace("Added required weapon level '{}'", numberValue); + weapon->setRequiredLevel(numberValue); + weapon->setWieldInfo(WIELDINFO_LEVEL); + } + } else if (stringKey == "vocation") { + auto vocations = subValueAttribute.as_string(); + std::string tmp; + std::stringstream ss(vocations); + std::string token; + + while (std::getline(ss, token, ',')) { + token.erase(token.begin(), std::find_if(token.begin(), token.end(), [](unsigned char ch) { + return !std::isspace(ch); + })); + token.erase(std::find_if(token.rbegin(), token.rend(), [](unsigned char ch) { + return !std::isspace(ch); + }).base(), + token.end()); + + std::string v1; + bool showInDescription = false; + + std::stringstream inner_ss(token); + std::getline(inner_ss, v1, ';'); + std::string showInDescriptionStr; + std::getline(inner_ss, showInDescriptionStr, ';'); + showInDescription = showInDescriptionStr == "true"; + + if (moveevent) { + moveevent->addVocEquipMap(v1); + moveevent->setWieldInfo(WIELDINFO_VOCREQ); + } + + if (showInDescription) { + if (moveevent && moveevent->getVocationString().empty()) { + tmp = asLowerCaseString(v1); + tmp += "s"; + moveevent->setVocationString(tmp); + } else if (weapon && weapon->getVocationString().empty()) { + tmp = asLowerCaseString(v1); + tmp += "s"; + weapon->setVocationString(tmp); + } else { + tmp += ", "; + tmp += asLowerCaseString(v1); + tmp += "s"; + } + } + } + + size_t lastComma = tmp.rfind(','); + if (lastComma != std::string::npos) { + tmp.replace(lastComma, 1, " and"); + if (moveevent) { + moveevent->setVocationString(tmp); + } else if (weapon) { + weapon->setVocationString(tmp); + } + } + } else if (stringKey == "action" && weapon) { + auto action = asLowerCaseString(subValueAttribute.as_string()); + if (action == "removecharge") { + weapon->action = WEAPONACTION_REMOVECHARGE; + } else if (action == "removecount") { + weapon->action = WEAPONACTION_REMOVECOUNT; + } else if (action == "move") { + weapon->action = WEAPONACTION_MOVE; + } + } else if (stringKey == "breakchance" && weapon) { + weapon->setBreakChance(subValueAttribute.as_uint()); + } else if (stringKey == "mana" && weapon) { + weapon->setMana(subValueAttribute.as_uint()); + } else if (stringKey == "unproperly" && weapon) { + weapon->setWieldUnproperly(subValueAttribute.as_bool()); + } else if (stringKey == "fromdamage" && weapon) { + fromDamage = subValueAttribute.as_uint(); + } else if (stringKey == "todamage" && weapon) { + toDamage = subValueAttribute.as_uint(); + } else if (stringKey == "wandtype" && weapon) { + std::string elementName = asLowerCaseString(subValueAttribute.as_string()); + if (elementName == "earth") { + weapon->params.combatType = COMBAT_EARTHDAMAGE; + } else if (elementName == "ice") { + weapon->params.combatType = COMBAT_ICEDAMAGE; + } else if (elementName == "energy") { + weapon->params.combatType = COMBAT_ENERGYDAMAGE; + } else if (elementName == "fire") { + weapon->params.combatType = COMBAT_FIREDAMAGE; + } else if (elementName == "death") { + weapon->params.combatType = COMBAT_DEATHDAMAGE; + } else if (elementName == "holy") { + weapon->params.combatType = COMBAT_HOLYDAMAGE; + } else { + g_logger().warn("[{}] - wandtype '{}' does not exist", __FUNCTION__, elementName); + } + } else if (stringKey == "chain" && weapon) { + if (auto value = subValueAttribute.as_double()) { + weapon->setChainSkillValue(value); + g_logger().trace("Found chain skill value '{}' for weapon: {}", value, itemType.name); + } + if (subValueAttribute.as_bool() == false) { + weapon->setDisabledChain(); + g_logger().warn("Chain disabled for weapon: {}", itemType.name); + } + } + } + + if (weapon) { + if (auto weaponWand = dynamic_pointer_cast(weapon)) { + g_logger().trace("Added weapon damage from '{}', to '{}'", fromDamage, toDamage); + weaponWand->setMinChange(fromDamage); + weaponWand->setMaxChange(toDamage); + } + + auto combat = weapon->getCombat(); + if (combat) { + combat->setupChain(weapon); + } + + if (weapon->getWieldInfo() != 0) { + itemType.wieldInfo = weapon->getWieldInfo(); + itemType.vocationString = weapon->getVocationString(); + itemType.minReqLevel = weapon->getReqLevel(); + itemType.minReqMagicLevel = weapon->getReqMagLv(); + } + + if (!g_weapons().registerLuaEvent(weapon, true)) { + g_logger().error("[{}] failed to register weapon from item name {}", __FUNCTION__, itemType.name); + } + } + + if (moveevent && !g_moveEvents().registerLuaItemEvent(moveevent)) { + g_logger().error("[{}] failed to register moveevent from item name {}", __FUNCTION__, itemType.name); + } +} + +void ItemParse::parseUnscriptedItems(const std::string_view &tmpStrValue, pugi::xml_node attributeNode, pugi::xml_attribute valueAttribute, ItemType &itemType) { + if (tmpStrValue == "script") { + std::string scriptName = valueAttribute.as_string(); + auto tokens = split(scriptName.data(), ';'); + for (const auto &token : tokens) { + if (token == "moveevent") { + g_logger().trace("Registering moveevent for item id '{}', name '{}'", itemType.id, itemType.name); + MoveEvent_t eventType = MOVE_EVENT_NONE; + for (auto subAttributeNode : attributeNode.children()) { + pugi::xml_attribute subKeyAttribute = subAttributeNode.attribute("key"); + if (!subKeyAttribute) { + continue; + } + + pugi::xml_attribute subValueAttribute = subAttributeNode.attribute("value"); + if (!subValueAttribute) { + continue; + } + + auto stringKey = asLowerCaseString(subKeyAttribute.as_string()); + if (stringKey == "eventtype") { + const auto &eventTypeName = asLowerCaseString(subValueAttribute.as_string()); + eventType = getMoveEventType(eventTypeName); + g_logger().trace("Found event type '{}'", eventTypeName); + break; + } + } + + // Event type stepin/out need to be registered both at same time + if (eventType == MOVE_EVENT_NONE) { + createAndRegisterScript(itemType, attributeNode, MOVE_EVENT_EQUIP); + createAndRegisterScript(itemType, attributeNode, MOVE_EVENT_DEEQUIP); + } else { + createAndRegisterScript(itemType, attributeNode, eventType); + } + } else if (token == "weapon") { + WeaponType_t weaponType; + g_logger().trace("Registering weapon for item id '{}', name '{}'", itemType.id, itemType.name); + for (auto subAttributeNode : attributeNode.children()) { + pugi::xml_attribute subKeyAttribute = subAttributeNode.attribute("key"); + if (!subKeyAttribute) { + continue; + } + + pugi::xml_attribute subValueAttribute = subAttributeNode.attribute("value"); + if (!subValueAttribute) { + continue; + } + + auto stringKey = asLowerCaseString(subKeyAttribute.as_string()); + if (stringKey == "weapontype") { + weaponType = getWeaponType(subValueAttribute.as_string()); + g_logger().trace("Found weapon type '{}''", subValueAttribute.as_string()); + break; + } + } + + createAndRegisterScript(itemType, attributeNode, MOVE_EVENT_NONE, weaponType); + } + } + } +} diff --git a/src/items/functions/item/item_parse.hpp b/src/items/functions/item/item_parse.hpp index f60277ad5d7..7859a77fe9c 100644 --- a/src/items/functions/item/item_parse.hpp +++ b/src/items/functions/item/item_parse.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -157,6 +157,7 @@ const phmap::flat_hash_map ItemParseAttribut { "reflectpercentall", ITEM_PARSE_REFLECTPERCENTALL }, { "primarytype", ITEM_PARSE_PRIMARYTYPE }, { "usedbyhouseguests", ITEM_PARSE_USEDBYGUESTS }, + { "script", ITEM_PARSE_SCRIPT }, }; const phmap::flat_hash_map ItemTypesMap = { @@ -312,10 +313,12 @@ class ItemParse : public Items { static void parseTransformOnUse(const std::string_view &tmpStrValue, pugi::xml_attribute valueAttribute, ItemType &itemType); static void parsePrimaryType(const std::string_view &tmpStrValue, pugi::xml_attribute valueAttribute, ItemType &itemType); static void parseHouseRelated(const std::string_view &tmpStrValue, pugi::xml_attribute valueAttribute, ItemType &itemType); + static void parseUnscriptedItems(const std::string_view &tmpStrValue, pugi::xml_node attributeNode, pugi::xml_attribute valueAttribute, ItemType &itemType); private: // Parent of the function: static void parseField static std::tuple parseFieldConditions(std::string lowerStringValue, pugi::xml_attribute valueAttribute); static CombatType_t parseFieldCombatType(std::string string, pugi::xml_attribute valueAttribute); static void parseFieldCombatDamage(std::shared_ptr conditionDamage, std::string stringValue, pugi::xml_node attributeNode); + static void createAndRegisterScript(ItemType &itemType, pugi::xml_node attributeNode, MoveEvent_t eventType = MOVE_EVENT_NONE, WeaponType_t weaponType = WEAPON_NONE); }; diff --git a/src/items/item.cpp b/src/items/item.cpp index 2c0569711c7..b51c076d80b 100644 --- a/src/items/item.cpp +++ b/src/items/item.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -831,7 +831,7 @@ Attr_ReadValue Item::readAttr(AttrTypes_t attr, PropStream &propStream) { return ATTR_READ_ERROR; } - g_logger().debug("Setting flag {} flags, to item id {}", flags, getID()); + g_logger().trace("Setting obtain flag {} flags, to item id {}", flags, getID()); setAttribute(ItemAttribute_t::OBTAINCONTAINER, flags); break; } diff --git a/src/items/item.hpp b/src/items/item.hpp index c720cf969d0..9ff0d3d15aa 100644 --- a/src/items/item.hpp +++ b/src/items/item.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/items.cpp b/src/items/items.cpp index b26c980cc45..9e31f5f105f 100644 --- a/src/items/items.cpp +++ b/src/items/items.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -11,6 +11,8 @@ #include "items/functions/item/item_parse.hpp" #include "items/items.hpp" +#include "items/weapons/weapons.hpp" +#include "lua/creature/movement.hpp" #include "game/game.hpp" #include "utils/pugicast.hpp" @@ -23,6 +25,8 @@ void Items::clear() { ladders.clear(); dummys.clear(); nameToItems.clear(); + g_moveEvents().clear(true); + g_weapons().clear(true); } using LootTypeNames = phmap::flat_hash_map; @@ -184,8 +188,7 @@ void Items::loadFromProtobuf() { iType.isWrapKit = object.flags().wrapkit(); if (!iType.name.empty()) { - nameToItems.insert({ asLowerCaseString(iType.name), - iType.id }); + nameToItems.insert({ asLowerCaseString(iType.name), iType.id }); } } @@ -269,8 +272,7 @@ void Items::parseItemNode(const pugi::xml_node &itemNode, uint16_t id) { } itemType.name = xmlName; - nameToItems.insert({ asLowerCaseString(itemType.name), - id }); + nameToItems.insert({ asLowerCaseString(itemType.name), id }); } itemType.loaded = true; diff --git a/src/items/items.hpp b/src/items/items.hpp index 1d4f014c12a..f9e48ae1032 100644 --- a/src/items/items.hpp +++ b/src/items/items.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/items_classification.hpp b/src/items/items_classification.hpp index bd8b61f801d..601abd328ed 100644 --- a/src/items/items_classification.hpp +++ b/src/items/items_classification.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/items_definitions.hpp b/src/items/items_definitions.hpp index 3c200daa3e9..f044d4b5248 100644 --- a/src/items/items_definitions.hpp +++ b/src/items/items_definitions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -35,6 +35,9 @@ enum Attr_ReadValue { enum ReturnValue { RETURNVALUE_NOERROR, + RETURNVALUE_NOTBOUGHTINSTORE, + RETURNVALUE_ITEMCANNOTBEMOVEDTHERE, + RETURNVALUE_ITEMCANNOTBEMOVEDPOUCH, RETURNVALUE_NOTPOSSIBLE, RETURNVALUE_NOTENOUGHROOM, RETURNVALUE_PLAYERISPZLOCKED, @@ -602,6 +605,7 @@ enum ItemParseAttributes_t { ITEM_PARSE_REFLECTDAMAGE, ITEM_PARSE_PRIMARYTYPE, ITEM_PARSE_USEDBYGUESTS, + ITEM_PARSE_SCRIPT, }; struct ImbuementInfo { diff --git a/src/items/thing.cpp b/src/items/thing.cpp index 0665f15a6e5..6eec7994df8 100644 --- a/src/items/thing.cpp +++ b/src/items/thing.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/thing.hpp b/src/items/thing.hpp index bc7d7f3af78..9e8662d5f45 100644 --- a/src/items/thing.hpp +++ b/src/items/thing.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/tile.cpp b/src/items/tile.cpp index 2f3d24ce24b..ca354700f22 100644 --- a/src/items/tile.cpp +++ b/src/items/tile.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/tile.hpp b/src/items/tile.hpp index f3a4cc7c6b1..71f9d4ae09c 100644 --- a/src/items/tile.hpp +++ b/src/items/tile.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/trashholder.cpp b/src/items/trashholder.cpp index 40c1f0e49b4..65676a75a37 100644 --- a/src/items/trashholder.cpp +++ b/src/items/trashholder.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/trashholder.hpp b/src/items/trashholder.hpp index 0aa52ed7bee..771c8687fbd 100644 --- a/src/items/trashholder.hpp +++ b/src/items/trashholder.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/items/weapons/weapons.cpp b/src/items/weapons/weapons.cpp index 0c6853ec807..aa90fda6c2d 100644 --- a/src/items/weapons/weapons.cpp +++ b/src/items/weapons/weapons.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -31,12 +31,34 @@ const WeaponShared_ptr Weapons::getWeapon(std::shared_ptr item) const { return it->second; } -void Weapons::clear() { +void Weapons::clear(bool isFromXML /*= false*/) { + if (isFromXML) { + int numRemoved = 0; + for (auto it = weapons.begin(); it != weapons.end();) { + if (it->second && it->second->isFromXML()) { + g_logger().debug("Weapon with id '{}' is from XML and will be removed.", it->first); + it = weapons.erase(it); + ++numRemoved; + } else { + ++it; + } + } + + if (numRemoved > 0) { + g_logger().debug("Removed '{}' Weapon from XML.", numRemoved); + } + + return; + } + weapons.clear(); } -bool Weapons::registerLuaEvent(WeaponShared_ptr event) { +bool Weapons::registerLuaEvent(WeaponShared_ptr event, bool fromXML /*= false*/) { weapons[event->getID()] = event; + if (fromXML) { + event->setFromXML(fromXML); + } return true; } @@ -190,6 +212,7 @@ void Weapon::internalUseWeapon(std::shared_ptr player, std::shared_ptrgetID(); executeUseWeapon(player, var); + g_logger().debug("Weapon::internalUseWeapon - Lua callback executed."); } else { CombatDamage damage; WeaponType_t weaponType = item->getWeaponType(); @@ -198,8 +221,10 @@ void Weapon::internalUseWeapon(std::shared_ptr player, std::shared_ptr player, std::shared_ptrdoCombatChain(player, target, params.aggressive); + } else { + Combat::doCombatHealth(player, target, damage, params); + } + + g_logger().debug("Weapon::internalUseWeapon - cpp callback executed."); } onUsedWeapon(player, item, target->getTile()); @@ -356,6 +387,43 @@ void Weapon::decrementItemCount(std::shared_ptr item) { } } +bool Weapon::calculateSkillFormula(const std::shared_ptr &player, int32_t &attackSkill, int32_t &attackValue, float &attackFactor, int16_t &elementAttack, CombatDamage &damage, bool useCharges /* = false*/) const { + std::shared_ptr tool = player->getWeapon(); + if (!tool) { + return false; + } + + std::shared_ptr item = nullptr; + attackValue = tool->getAttack(); + if (tool->getWeaponType() == WEAPON_AMMO) { + item = player->getWeapon(true); + if (item) { + attackValue += item->getAttack(); + } + } + + CombatType_t elementType = getElementType(); + damage.secondary.type = elementType; + + bool shouldCalculateSecondaryDamage = false; + if (elementType != COMBAT_NONE) { + elementAttack = getElementDamageValue(); + shouldCalculateSecondaryDamage = true; + attackValue += elementAttack; + } + + if (useCharges) { + auto charges = tool->getAttribute(ItemAttribute_t::CHARGES); + if (charges != 0) { + g_game().transformItem(tool, tool->getID(), charges - 1); + } + } + + attackSkill = player->getWeaponSkill(item ? item : tool); + attackFactor = player->getAttackFactor(); + return shouldCalculateSecondaryDamage; +} + WeaponMelee::WeaponMelee(LuaScriptInterface* interface) : Weapon(interface) { // Add combat type and blocked attributes to the weapon @@ -813,11 +881,27 @@ void WeaponWand::configureWeapon(const ItemType &it) { Weapon::configureWeapon(it); } -int32_t WeaponWand::getWeaponDamage(std::shared_ptr, std::shared_ptr, std::shared_ptr, bool maxDamage /*= false*/) const { - if (maxDamage) { - return -maxChange; +int32_t WeaponWand::getWeaponDamage(std::shared_ptr player, std::shared_ptr, std::shared_ptr, bool maxDamage /* = false*/) const { + if (!g_configManager().getBoolean(TOGGLE_CHAIN_SYSTEM, __FUNCTION__)) { + // Returns maximum damage or a random value between minChange and maxChange + return maxDamage ? -maxChange : -normal_random(minChange, maxChange); } - return -normal_random(minChange, maxChange); + + // If chain system is enabled, calculates magic-based damage + int32_t attackSkill; + int32_t attackValue; + float attackFactor; + [[maybe_unused]] int16_t elementAttack; + [[maybe_unused]] CombatDamage combatDamage; + calculateSkillFormula(player, attackSkill, attackValue, attackFactor, elementAttack, combatDamage); + + auto magLevel = player->getMagicLevel(); + auto level = player->getLevel(); + double min = (level / 5.0) + (magLevel + attackValue) / 3.0; + double max = (level / 5.0) + (magLevel + attackValue); + + // Returns the calculated maximum damage or a random value between the calculated minimum and maximum + return maxDamage ? -max : -normal_random(min, max); } int16_t WeaponWand::getElementDamageValue() const { diff --git a/src/items/weapons/weapons.hpp b/src/items/weapons/weapons.hpp index b6ab050d8ea..5b2b260e2ee 100644 --- a/src/items/weapons/weapons.hpp +++ b/src/items/weapons/weapons.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -44,8 +44,8 @@ class Weapons final : public Scripts { static int32_t getMaxMeleeDamage(int32_t attackSkill, int32_t attackValue); static int32_t getMaxWeaponDamage(uint32_t level, int32_t attackSkill, int32_t attackValue, float attackFactor, bool isMelee); - bool registerLuaEvent(WeaponShared_ptr event); - void clear(); + bool registerLuaEvent(WeaponShared_ptr event, bool fromXML = false); + void clear(bool isFromXML = false); private: std::map weapons; @@ -176,6 +176,53 @@ class Weapon : public Script { vocationString = str; } + void setFromXML(bool newFromXML) { + m_fromXML = newFromXML; + } + + bool isFromXML() const { + return m_fromXML; + } + + void setChainSkillValue(double value) { + m_chainSkillValue = value; + } + + double getChainSkillValue() const { + return m_chainSkillValue; + } + + void setDisabledChain() { + m_isDisabledChain = true; + } + + bool isChainDisabled() const { + return m_isDisabledChain; + } + + const WeaponType_t getWeaponType() const { + return weaponType; + } + + const std::shared_ptr getCombat() const { + if (!m_combat) { + g_logger().error("Weapon::getCombat() - m_combat is nullptr"); + return nullptr; + } + + return m_combat; + } + + std::shared_ptr getCombat() { + if (!m_combat) { + m_combat = std::make_shared(); + } + + return m_combat; + } + + bool calculateSkillFormula(const std::shared_ptr &player, int32_t &attackSkill, int32_t &attackValue, float &attackFactor, int16_t &elementAttack, CombatDamage &damage, bool useCharges = false) const; + protected: void internalUseWeapon(std::shared_ptr player, std::shared_ptr item, std::shared_ptr target, int32_t damageModifier, int32_t cleavePercent = 0) const; void internalUseWeapon(std::shared_ptr player, std::shared_ptr item, std::shared_ptr tile) const; @@ -199,10 +246,12 @@ class Weapon : public Script { uint32_t healthPercent = 0; uint32_t soul = 0; uint32_t wieldInfo = WIELDINFO_NONE; + double m_chainSkillValue = 0.0; uint8_t breakChance = 0; bool enabled = true; bool premium = false; bool wieldUnproperly = false; + bool m_isDisabledChain = false; std::string vocationString = ""; void onUsedWeapon(std::shared_ptr player, std::shared_ptr item, std::shared_ptr destTile) const; @@ -213,12 +262,16 @@ class Weapon : public Script { CombatParams params; WeaponType_t weaponType; std::map vocWeaponMap; + std::shared_ptr m_combat; + + bool m_fromXML = false; friend class Combat; friend class WeaponWand; friend class WeaponMelee; friend class WeaponDistance; friend class WeaponFunctions; + friend class ItemParse; }; class WeaponMelee final : public Weapon { @@ -290,7 +343,7 @@ class WeaponWand final : public Weapon { return 0; } CombatType_t getElementType() const override { - return COMBAT_NONE; + return params.combatType; } virtual int16_t getElementDamageValue() const override; void setMinChange(int32_t change) { diff --git a/src/kv/kv.cpp b/src/kv/kv.cpp index 6f516c78480..29a9787f72f 100644 --- a/src/kv/kv.cpp +++ b/src/kv/kv.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/kv/kv.hpp b/src/kv/kv.hpp index 07b277d51da..fa32461b24b 100644 --- a/src/kv/kv.hpp +++ b/src/kv/kv.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/kv/kv_sql.cpp b/src/kv/kv_sql.cpp index e5a3fc2ba3a..57d2cc57a10 100644 --- a/src/kv/kv_sql.cpp +++ b/src/kv/kv_sql.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/kv/kv_sql.hpp b/src/kv/kv_sql.hpp index fd181b1cef7..1d7a6387d68 100644 --- a/src/kv/kv_sql.hpp +++ b/src/kv/kv_sql.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/kv/value_wrapper.cpp b/src/kv/value_wrapper.cpp index c8ee3be5038..78f828248a1 100644 --- a/src/kv/value_wrapper.cpp +++ b/src/kv/value_wrapper.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/kv/value_wrapper.hpp b/src/kv/value_wrapper.hpp index 1503575c5b1..0b388187dc3 100644 --- a/src/kv/value_wrapper.hpp +++ b/src/kv/value_wrapper.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/kv/value_wrapper_proto.cpp b/src/kv/value_wrapper_proto.cpp index 9e60296c6e6..4362101957e 100644 --- a/src/kv/value_wrapper_proto.cpp +++ b/src/kv/value_wrapper_proto.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/kv/value_wrapper_proto.hpp b/src/kv/value_wrapper_proto.hpp index 5c347880468..382b91a040b 100644 --- a/src/kv/value_wrapper_proto.hpp +++ b/src/kv/value_wrapper_proto.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lib/di/container.hpp b/src/lib/di/container.hpp index ee9868908ae..3c15e30b3d9 100644 --- a/src/lib/di/container.hpp +++ b/src/lib/di/container.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lib/logging/log_with_spd_log.cpp b/src/lib/logging/log_with_spd_log.cpp index ca56f146915..f8cfe16946d 100644 --- a/src/lib/logging/log_with_spd_log.cpp +++ b/src/lib/logging/log_with_spd_log.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lib/logging/log_with_spd_log.hpp b/src/lib/logging/log_with_spd_log.hpp index 6e2fd075e9d..983ee716c0d 100644 --- a/src/lib/logging/log_with_spd_log.hpp +++ b/src/lib/logging/log_with_spd_log.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lib/logging/logger.hpp b/src/lib/logging/logger.hpp index e8474b74858..bc6c455fbde 100644 --- a/src/lib/logging/logger.hpp +++ b/src/lib/logging/logger.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lib/messaging/command.hpp b/src/lib/messaging/command.hpp index d37003bfec6..83af9a9bd31 100644 --- a/src/lib/messaging/command.hpp +++ b/src/lib/messaging/command.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lib/messaging/event.hpp b/src/lib/messaging/event.hpp index 573c41b3056..df966b81c98 100644 --- a/src/lib/messaging/event.hpp +++ b/src/lib/messaging/event.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lib/messaging/message.hpp b/src/lib/messaging/message.hpp index 2d08cadaf0b..4707a5f04c0 100644 --- a/src/lib/messaging/message.hpp +++ b/src/lib/messaging/message.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lib/metrics/metrics.cpp b/src/lib/metrics/metrics.cpp index ffdfda919fc..2a65e9a7d5d 100644 --- a/src/lib/metrics/metrics.cpp +++ b/src/lib/metrics/metrics.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lib/metrics/metrics.hpp b/src/lib/metrics/metrics.hpp index 4ea34ef9e9f..0d8c291dfbe 100644 --- a/src/lib/metrics/metrics.hpp +++ b/src/lib/metrics/metrics.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lib/thread/thread_pool.cpp b/src/lib/thread/thread_pool.cpp index b36c137904c..e01028810bc 100644 --- a/src/lib/thread/thread_pool.cpp +++ b/src/lib/thread/thread_pool.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lib/thread/thread_pool.hpp b/src/lib/thread/thread_pool.hpp index 8ad60f14676..e36d8beca57 100644 --- a/src/lib/thread/thread_pool.hpp +++ b/src/lib/thread/thread_pool.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/callbacks/callbacks_definitions.hpp b/src/lua/callbacks/callbacks_definitions.hpp index a5716053a75..521a2c4cda7 100644 --- a/src/lua/callbacks/callbacks_definitions.hpp +++ b/src/lua/callbacks/callbacks_definitions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/callbacks/creaturecallback.cpp b/src/lua/callbacks/creaturecallback.cpp index df5845f46c0..11e33a9b1e1 100644 --- a/src/lua/callbacks/creaturecallback.cpp +++ b/src/lua/callbacks/creaturecallback.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/callbacks/creaturecallback.hpp b/src/lua/callbacks/creaturecallback.hpp index f59cef0248e..f7665720410 100644 --- a/src/lua/callbacks/creaturecallback.hpp +++ b/src/lua/callbacks/creaturecallback.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/callbacks/event_callback.cpp b/src/lua/callbacks/event_callback.cpp index 8510502b226..51c03131fa9 100644 --- a/src/lua/callbacks/event_callback.cpp +++ b/src/lua/callbacks/event_callback.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/callbacks/event_callback.hpp b/src/lua/callbacks/event_callback.hpp index 152c86b8ed7..d9dc4a9b110 100644 --- a/src/lua/callbacks/event_callback.hpp +++ b/src/lua/callbacks/event_callback.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/callbacks/events_callbacks.cpp b/src/lua/callbacks/events_callbacks.cpp index 2c0ca056dc6..4a1830f80fb 100644 --- a/src/lua/callbacks/events_callbacks.cpp +++ b/src/lua/callbacks/events_callbacks.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/callbacks/events_callbacks.hpp b/src/lua/callbacks/events_callbacks.hpp index 7eb471430ef..53b119f6445 100644 --- a/src/lua/callbacks/events_callbacks.hpp +++ b/src/lua/callbacks/events_callbacks.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/creature/actions.cpp b/src/lua/creature/actions.cpp index 25653ab0fa5..42f3e12c865 100644 --- a/src/lua/creature/actions.cpp +++ b/src/lua/creature/actions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/creature/actions.hpp b/src/lua/creature/actions.hpp index c0fb1a27790..80fd2ea54e9 100644 --- a/src/lua/creature/actions.hpp +++ b/src/lua/creature/actions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/creature/creatureevent.cpp b/src/lua/creature/creatureevent.cpp index 29feb652036..e3ac954908f 100644 --- a/src/lua/creature/creatureevent.cpp +++ b/src/lua/creature/creatureevent.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/creature/creatureevent.hpp b/src/lua/creature/creatureevent.hpp index 24052aa84a2..8a208343e11 100644 --- a/src/lua/creature/creatureevent.hpp +++ b/src/lua/creature/creatureevent.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/creature/events.cpp b/src/lua/creature/events.cpp index 3ce3f88bdb3..2917d128b8a 100644 --- a/src/lua/creature/events.cpp +++ b/src/lua/creature/events.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/creature/events.hpp b/src/lua/creature/events.hpp index 08260c8aef4..1ec6d4ba81c 100644 --- a/src/lua/creature/events.hpp +++ b/src/lua/creature/events.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/creature/movement.cpp b/src/lua/creature/movement.cpp index b3901ea1ff0..076d2b90216 100644 --- a/src/lua/creature/movement.cpp +++ b/src/lua/creature/movement.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -15,7 +15,34 @@ #include "lua/callbacks/events_callbacks.hpp" #include "lua/creature/movement.hpp" -void MoveEvents::clear() { +void MoveEvents::clear(bool isFromXML /*= false*/) { + if (isFromXML) { + int numRemoved = 0; + for (auto &pair : itemIdMap) { + MoveEventList &moveEventList = pair.second; + + for (int moveEventType = 0; moveEventType < MOVE_EVENT_LAST; ++moveEventType) { + auto &eventList = moveEventList.moveEvent[moveEventType]; + + int originalSize = eventList.size(); + + eventList.remove_if([&](const std::shared_ptr &moveEvent) { + bool removed = moveEvent && moveEvent->isFromXML(); + if (removed) { + g_logger().debug("MoveEvent with id '{}' is from XML and will be removed.", pair.first); + ++numRemoved; + } + return removed; + }); + } + } + + if (numRemoved > 0) { + g_logger().debug("Removed '{}' MoveEvent from XML.", numRemoved); + } + return; + } + uniqueIdMap.clear(); actionIdMap.clear(); itemIdMap.clear(); diff --git a/src/lua/creature/movement.hpp b/src/lua/creature/movement.hpp index d410cf2a03f..485454a0564 100644 --- a/src/lua/creature/movement.hpp +++ b/src/lua/creature/movement.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -112,7 +112,7 @@ class MoveEvents final : public Scripts { bool registerLuaUniqueEvent(const std::shared_ptr moveEvent); bool registerLuaPositionEvent(const std::shared_ptr moveEvent); bool registerLuaEvent(const std::shared_ptr event); - void clear(); + void clear(bool isFromXML = false); private: void clearMap(std::map &map) const; @@ -179,7 +179,7 @@ class MoveEvent final : public Script, public SharedObject { return vocEquipMap; } void addVocEquipMap(std::string vocName) { - int32_t vocationId = g_vocations().getVocationId(vocName); + uint16_t vocationId = g_vocations().getVocationId(vocName); if (vocationId != -1) { vocEquipMap[vocationId] = true; } @@ -251,6 +251,14 @@ class MoveEvent final : public Script, public SharedObject { static uint32_t EquipItem(const std::shared_ptr moveEvent, std::shared_ptr player, std::shared_ptr item, Slots_t slot, bool boolean); static uint32_t DeEquipItem(const std::shared_ptr moveEvent, std::shared_ptr player, std::shared_ptr item, Slots_t slot, bool boolean); + void setFromXML(bool newFromXML) { + m_fromXML = newFromXML; + } + + bool isFromXML() const { + return m_fromXML; + } + private: std::string getScriptTypeName() const override; @@ -290,10 +298,13 @@ class MoveEvent final : public Script, public SharedObject { std::map vocEquipMap; bool tileItem = false; + bool m_fromXML = false; + std::vector itemIdVector; std::vector actionIdVector; std::vector uniqueIdVector; std::vector positionVector; friend class MoveEventFunctions; + friend class ItemParse; }; diff --git a/src/lua/creature/raids.cpp b/src/lua/creature/raids.cpp index f30155578b3..f0d7cecf402 100644 --- a/src/lua/creature/raids.cpp +++ b/src/lua/creature/raids.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/creature/raids.hpp b/src/lua/creature/raids.hpp index d78f79bf8f5..0266641edda 100644 --- a/src/lua/creature/raids.hpp +++ b/src/lua/creature/raids.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/creature/talkaction.cpp b/src/lua/creature/talkaction.cpp index 72c2f098f87..3586bdbceea 100644 --- a/src/lua/creature/talkaction.cpp +++ b/src/lua/creature/talkaction.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/creature/talkaction.hpp b/src/lua/creature/talkaction.hpp index a6b34d04af3..ec68539850c 100644 --- a/src/lua/creature/talkaction.hpp +++ b/src/lua/creature/talkaction.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/core_functions.hpp b/src/lua/functions/core/core_functions.hpp index b1aa3271337..c6c14121b06 100644 --- a/src/lua/functions/core/core_functions.hpp +++ b/src/lua/functions/core/core_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/game/bank_functions.hpp b/src/lua/functions/core/game/bank_functions.hpp index a49bf7ed734..db450f49469 100644 --- a/src/lua/functions/core/game/bank_functions.hpp +++ b/src/lua/functions/core/game/bank_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/game/config_functions.cpp b/src/lua/functions/core/game/config_functions.cpp index 1a646fe7931..a84c500b985 100644 --- a/src/lua/functions/core/game/config_functions.cpp +++ b/src/lua/functions/core/game/config_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/game/config_functions.hpp b/src/lua/functions/core/game/config_functions.hpp index 4c5d57e8715..ae4952e9643 100644 --- a/src/lua/functions/core/game/config_functions.hpp +++ b/src/lua/functions/core/game/config_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/game/core_game_functions.hpp b/src/lua/functions/core/game/core_game_functions.hpp index c330f15ebbb..03bcc236daf 100644 --- a/src/lua/functions/core/game/core_game_functions.hpp +++ b/src/lua/functions/core/game/core_game_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/game/game_functions.cpp b/src/lua/functions/core/game/game_functions.cpp index 5221d2c9e4f..ea418dede66 100644 --- a/src/lua/functions/core/game/game_functions.cpp +++ b/src/lua/functions/core/game/game_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -26,6 +26,7 @@ #include "lua/creature/events.hpp" #include "lua/callbacks/event_callback.hpp" #include "lua/callbacks/events_callbacks.hpp" +#include "creatures/players/achievement/player_achievement.hpp" #include "map/spectators.hpp" // Game @@ -793,3 +794,113 @@ int GameFunctions::luaGameGetEventCallbacks(lua_State* L) { lua_pop(L, 1); return 1; } + +int GameFunctions::luaGameRegisterAchievement(lua_State* L) { + // Game.registerAchievement(id, name, description, secret, grade, points) + if (lua_gettop(L) < 6) { + reportErrorFunc("Achievement can only be registered with all params."); + return 1; + } + + uint16_t id = getNumber(L, 1); + std::string name = getString(L, 2); + std::string description = getString(L, 3); + bool secret = getBoolean(L, 4); + uint8_t grade = getNumber(L, 5); + uint8_t points = getNumber(L, 6); + g_game().registerAchievement(id, name, description, secret, grade, points); + pushBoolean(L, true); + return 1; +} + +int GameFunctions::luaGameGetAchievementInfoById(lua_State* L) { + // Game.getAchievementInfoById(id) + uint16_t id = getNumber(L, 1); + Achievement achievement = g_game().getAchievementById(id); + if (achievement.id == 0) { + reportErrorFunc("Achievement id is wrong"); + return 1; + } + + lua_createtable(L, 0, 6); + setField(L, "id", achievement.id); + setField(L, "name", achievement.name); + setField(L, "description", achievement.description); + setField(L, "points", achievement.points); + setField(L, "grade", achievement.grade); + setField(L, "secret", achievement.secret); + return 1; +} + +int GameFunctions::luaGameGetAchievementInfoByName(lua_State* L) { + // Game.getAchievementInfoByName(name) + std::string name = getString(L, 1); + Achievement achievement = g_game().getAchievementByName(name); + if (achievement.id == 0) { + reportErrorFunc("Achievement name is wrong"); + return 1; + } + + lua_createtable(L, 0, 6); + setField(L, "id", achievement.id); + setField(L, "name", achievement.name); + setField(L, "description", achievement.description); + setField(L, "points", achievement.points); + setField(L, "grade", achievement.grade); + setField(L, "secret", achievement.secret); + return 1; +} + +int GameFunctions::luaGameGetSecretAchievements(lua_State* L) { + // Game.getSecretAchievements() + const std::vector &achievements = g_game().getSecretAchievements(); + int index = 0; + lua_createtable(L, achievements.size(), 0); + for (const auto &achievement : achievements) { + lua_createtable(L, 0, 6); + setField(L, "id", achievement.id); + setField(L, "name", achievement.name); + setField(L, "description", achievement.description); + setField(L, "points", achievement.points); + setField(L, "grade", achievement.grade); + setField(L, "secret", achievement.secret); + lua_rawseti(L, -2, ++index); + } + return 1; +} + +int GameFunctions::luaGameGetPublicAchievements(lua_State* L) { + // Game.getPublicAchievements() + const std::vector &achievements = g_game().getPublicAchievements(); + int index = 0; + lua_createtable(L, achievements.size(), 0); + for (const auto &achievement : achievements) { + lua_createtable(L, 0, 6); + setField(L, "id", achievement.id); + setField(L, "name", achievement.name); + setField(L, "description", achievement.description); + setField(L, "points", achievement.points); + setField(L, "grade", achievement.grade); + setField(L, "secret", achievement.secret); + lua_rawseti(L, -2, ++index); + } + return 1; +} + +int GameFunctions::luaGameGetAchievements(lua_State* L) { + // Game.getAchievements() + const std::map &achievements = g_game().getAchievements(); + int index = 0; + lua_createtable(L, achievements.size(), 0); + for (const auto &achievement_it : achievements) { + lua_createtable(L, 0, 6); + setField(L, "id", achievement_it.first); + setField(L, "name", achievement_it.second.name); + setField(L, "description", achievement_it.second.description); + setField(L, "points", achievement_it.second.points); + setField(L, "grade", achievement_it.second.grade); + setField(L, "secret", achievement_it.second.secret); + lua_rawseti(L, -2, ++index); + } + return 1; +} diff --git a/src/lua/functions/core/game/game_functions.hpp b/src/lua/functions/core/game/game_functions.hpp index 95febd76e0d..7f3b642e97d 100644 --- a/src/lua/functions/core/game/game_functions.hpp +++ b/src/lua/functions/core/game/game_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -81,6 +81,13 @@ class GameFunctions final : LuaScriptInterface { registerMethod(L, "Game", "getTalkActions", GameFunctions::luaGameGetTalkActions); registerMethod(L, "Game", "getEventCallbacks", GameFunctions::luaGameGetEventCallbacks); + + registerMethod(L, "Game", "registerAchievement", GameFunctions::luaGameRegisterAchievement); + registerMethod(L, "Game", "getAchievementInfoById", GameFunctions::luaGameGetAchievementInfoById); + registerMethod(L, "Game", "getAchievementInfoByName", GameFunctions::luaGameGetAchievementInfoByName); + registerMethod(L, "Game", "getSecretAchievements", GameFunctions::luaGameGetSecretAchievements); + registerMethod(L, "Game", "getPublicAchievements", GameFunctions::luaGameGetPublicAchievements); + registerMethod(L, "Game", "getAchievements", GameFunctions::luaGameGetAchievements); } private: @@ -150,4 +157,11 @@ class GameFunctions final : LuaScriptInterface { static int luaGameGetTalkActions(lua_State* L); static int luaGameGetEventCallbacks(lua_State* L); + + static int luaGameRegisterAchievement(lua_State* L); + static int luaGameGetAchievementInfoById(lua_State* L); + static int luaGameGetAchievementInfoByName(lua_State* L); + static int luaGameGetSecretAchievements(lua_State* L); + static int luaGameGetPublicAchievements(lua_State* L); + static int luaGameGetAchievements(lua_State* L); }; diff --git a/src/lua/functions/core/game/global_functions.cpp b/src/lua/functions/core/game/global_functions.cpp index bd40793f32f..cbb133211f8 100644 --- a/src/lua/functions/core/game/global_functions.cpp +++ b/src/lua/functions/core/game/global_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -94,24 +94,6 @@ int GlobalFunctions::luaDoPlayerAddItem(lua_State* L) { return 1; } -int GlobalFunctions::luaDoSetCreatureLight(lua_State* L) { - // doSetCreatureLight(cid, lightLevel, lightColor, time) - std::shared_ptr creature = getCreature(L, 1); - if (!creature) { - reportErrorFunc(getErrorDesc(LUA_ERROR_PLAYER_NOT_FOUND)); - pushBoolean(L, false); - return 1; - } - - uint16_t level = getNumber(L, 2); - uint16_t color = getNumber(L, 3); - uint32_t time = getNumber(L, 4); - std::shared_ptr condition = Condition::createCondition(CONDITIONID_COMBAT, CONDITION_LIGHT, time, level | (color << 8)); - creature->addCondition(condition); - pushBoolean(L, true); - return 1; -} - int GlobalFunctions::luaIsValidUID(lua_State* L) { // isValidUID(uid) pushBoolean(L, getScriptEnv()->getThingByUID(getNumber(L, -1)) != nullptr); diff --git a/src/lua/functions/core/game/global_functions.hpp b/src/lua/functions/core/game/global_functions.hpp index 6ccb6c45d9d..cef752c6695 100644 --- a/src/lua/functions/core/game/global_functions.hpp +++ b/src/lua/functions/core/game/global_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -25,7 +25,6 @@ class GlobalFunctions final : LuaScriptInterface { lua_register(L, "doAreaCombatMana", GlobalFunctions::luaDoAreaCombatMana); lua_register(L, "doChallengeCreature", GlobalFunctions::luaDoChallengeCreature); lua_register(L, "doPlayerAddItem", GlobalFunctions::luaDoPlayerAddItem); - lua_register(L, "doSetCreatureLight", GlobalFunctions::luaDoSetCreatureLight); lua_register(L, "doTargetCombatCondition", GlobalFunctions::luaDoTargetCombatCondition); lua_register(L, "doTargetCombatDispel", GlobalFunctions::luaDoTargetCombatDispel); lua_register(L, "doTargetCombatHealth", GlobalFunctions::luaDoTargetCombatHealth); @@ -66,7 +65,6 @@ class GlobalFunctions final : LuaScriptInterface { static int luaDoAreaCombatMana(lua_State* L); static int luaDoChallengeCreature(lua_State* L); static int luaDoPlayerAddItem(lua_State* L); - static int luaDoSetCreatureLight(lua_State* L); static int luaDoTargetCombatCondition(lua_State* L); static int luaDoTargetCombatDispel(lua_State* L); static int luaDoTargetCombatHealth(lua_State* L); diff --git a/src/lua/functions/core/game/lua_enums.cpp b/src/lua/functions/core/game/lua_enums.cpp index 9fa6ae75aa5..d0be72158d6 100644 --- a/src/lua/functions/core/game/lua_enums.cpp +++ b/src/lua/functions/core/game/lua_enums.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -756,7 +756,7 @@ void LuaEnums::initGameStateEnums(lua_State* L) { void LuaEnums::initMessageEnums(lua_State* L) { registerEnum(L, MESSAGE_GAMEMASTER_CONSOLE); registerEnum(L, MESSAGE_LOGIN); - registerEnum(L, MESSAGE_ADMINISTRADOR); + registerEnum(L, MESSAGE_ADMINISTRATOR); registerEnum(L, MESSAGE_EVENT_ADVANCE); registerEnum(L, MESSAGE_GAME_HIGHLIGHT); registerEnum(L, MESSAGE_FAILURE); @@ -880,6 +880,7 @@ void LuaEnums::initItemIdEnums(lua_State* L) { registerEnum(L, ITEM_REWARD_CONTAINER); registerEnum(L, ITEM_AMULETOFLOSS); registerEnum(L, ITEM_PARCEL); + registerEnum(L, ITEM_PARCEL_STAMPED); registerEnum(L, ITEM_LABEL); registerEnum(L, ITEM_FIREFIELD_PVP_FULL); registerEnum(L, ITEM_FIREFIELD_PVP_MEDIUM); @@ -1138,6 +1139,9 @@ void LuaEnums::initMapMarkEnums(lua_State* L) { // Use with Game.getReturnMessage void LuaEnums::initReturnValueEnums(lua_State* L) { registerEnum(L, RETURNVALUE_NOERROR); + registerEnum(L, RETURNVALUE_NOTBOUGHTINSTORE); + registerEnum(L, RETURNVALUE_ITEMCANNOTBEMOVEDTHERE); + registerEnum(L, RETURNVALUE_ITEMCANNOTBEMOVEDPOUCH); registerEnum(L, RETURNVALUE_NOTPOSSIBLE); registerEnum(L, RETURNVALUE_NOTENOUGHROOM); registerEnum(L, RETURNVALUE_PLAYERISPZLOCKED); diff --git a/src/lua/functions/core/game/lua_enums.hpp b/src/lua/functions/core/game/lua_enums.hpp index 654b46059d0..8beabbbacee 100644 --- a/src/lua/functions/core/game/lua_enums.hpp +++ b/src/lua/functions/core/game/lua_enums.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/game/modal_window_functions.cpp b/src/lua/functions/core/game/modal_window_functions.cpp index 754d36d43ea..0221a9e9a59 100644 --- a/src/lua/functions/core/game/modal_window_functions.cpp +++ b/src/lua/functions/core/game/modal_window_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/game/modal_window_functions.hpp b/src/lua/functions/core/game/modal_window_functions.hpp index 78e935314bc..9d6b9192026 100644 --- a/src/lua/functions/core/game/modal_window_functions.hpp +++ b/src/lua/functions/core/game/modal_window_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/libs/bit_functions.cpp b/src/lua/functions/core/libs/bit_functions.cpp index ea1bb3db8e1..86f76a77a26 100644 --- a/src/lua/functions/core/libs/bit_functions.cpp +++ b/src/lua/functions/core/libs/bit_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/libs/bit_functions.hpp b/src/lua/functions/core/libs/bit_functions.hpp index 2c514276fa4..c2143fde198 100644 --- a/src/lua/functions/core/libs/bit_functions.hpp +++ b/src/lua/functions/core/libs/bit_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/libs/core_libs_functions.hpp b/src/lua/functions/core/libs/core_libs_functions.hpp index 4badabe262f..614c59e6e3d 100644 --- a/src/lua/functions/core/libs/core_libs_functions.hpp +++ b/src/lua/functions/core/libs/core_libs_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/libs/db_functions.cpp b/src/lua/functions/core/libs/db_functions.cpp index 72aee912c23..d5f5a62e0f8 100644 --- a/src/lua/functions/core/libs/db_functions.cpp +++ b/src/lua/functions/core/libs/db_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/libs/db_functions.hpp b/src/lua/functions/core/libs/db_functions.hpp index 8e7f3147949..99b69f1f7ba 100644 --- a/src/lua/functions/core/libs/db_functions.hpp +++ b/src/lua/functions/core/libs/db_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/libs/kv_functions.cpp b/src/lua/functions/core/libs/kv_functions.cpp index dbef916364d..5ed9c9cfe5d 100644 --- a/src/lua/functions/core/libs/kv_functions.cpp +++ b/src/lua/functions/core/libs/kv_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/libs/kv_functions.hpp b/src/lua/functions/core/libs/kv_functions.hpp index f6775f9e257..919901df7f8 100644 --- a/src/lua/functions/core/libs/kv_functions.hpp +++ b/src/lua/functions/core/libs/kv_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/libs/logger_functions.cpp b/src/lua/functions/core/libs/logger_functions.cpp index 7b7f21b8219..1b2605f6421 100644 --- a/src/lua/functions/core/libs/logger_functions.cpp +++ b/src/lua/functions/core/libs/logger_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -24,6 +24,7 @@ void LoggerFunctions::init(lua_State* L) { registerMethod(L, "logger", "warn", LoggerFunctions::luaLoggerWarn); registerMethod(L, "logger", "error", LoggerFunctions::luaLoggerError); registerMethod(L, "logger", "debug", LoggerFunctions::luaLoggerDebug); + registerMethod(L, "logger", "trace", LoggerFunctions::luaLoggerTrace); } int LoggerFunctions::luaSpdlogInfo(lua_State* L) { @@ -107,3 +108,13 @@ int LoggerFunctions::luaLoggerDebug(lua_State* L) { } return 1; } + +int LoggerFunctions::luaLoggerTrace(lua_State* L) { + // logger.trace(text) + if (isString(L, 1)) { + g_logger().trace(getFormatedLoggerMessage(L)); + } else { + reportErrorFunc("First parameter needs to be a string"); + } + return 1; +} diff --git a/src/lua/functions/core/libs/logger_functions.hpp b/src/lua/functions/core/libs/logger_functions.hpp index d1db895d61b..2c4dba46cc1 100644 --- a/src/lua/functions/core/libs/logger_functions.hpp +++ b/src/lua/functions/core/libs/logger_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -25,4 +25,5 @@ class LoggerFunctions final : public LuaScriptInterface { static int luaLoggerError(lua_State* L); static int luaLoggerInfo(lua_State* L); static int luaLoggerWarn(lua_State* L); + static int luaLoggerTrace(lua_State* L); }; diff --git a/src/lua/functions/core/libs/metrics_functions.cpp b/src/lua/functions/core/libs/metrics_functions.cpp index 4c0b916c94d..9dc9fa528cb 100644 --- a/src/lua/functions/core/libs/metrics_functions.cpp +++ b/src/lua/functions/core/libs/metrics_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/libs/metrics_functions.hpp b/src/lua/functions/core/libs/metrics_functions.hpp index 47d492c3d42..e71f005aaa8 100644 --- a/src/lua/functions/core/libs/metrics_functions.hpp +++ b/src/lua/functions/core/libs/metrics_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/libs/result_functions.cpp b/src/lua/functions/core/libs/result_functions.cpp index 1c2115e96b8..512f90f7da5 100644 --- a/src/lua/functions/core/libs/result_functions.cpp +++ b/src/lua/functions/core/libs/result_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/libs/result_functions.hpp b/src/lua/functions/core/libs/result_functions.hpp index 47eacc5137c..4aa25173ed7 100644 --- a/src/lua/functions/core/libs/result_functions.hpp +++ b/src/lua/functions/core/libs/result_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/network/core_network_functions.hpp b/src/lua/functions/core/network/core_network_functions.hpp index a43553e7638..c1e65ec15ac 100644 --- a/src/lua/functions/core/network/core_network_functions.hpp +++ b/src/lua/functions/core/network/core_network_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/network/network_message_functions.cpp b/src/lua/functions/core/network/network_message_functions.cpp index 630cd185d1b..a1b66264fac 100644 --- a/src/lua/functions/core/network/network_message_functions.cpp +++ b/src/lua/functions/core/network/network_message_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/network/network_message_functions.hpp b/src/lua/functions/core/network/network_message_functions.hpp index df27dbd19af..5a2982c0d85 100644 --- a/src/lua/functions/core/network/network_message_functions.hpp +++ b/src/lua/functions/core/network/network_message_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/network/webhook_functions.cpp b/src/lua/functions/core/network/webhook_functions.cpp index 43e1935d903..37372f8b23a 100644 --- a/src/lua/functions/core/network/webhook_functions.cpp +++ b/src/lua/functions/core/network/webhook_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/core/network/webhook_functions.hpp b/src/lua/functions/core/network/webhook_functions.hpp index ac79e40ec3e..7d5f53ba4b8 100644 --- a/src/lua/functions/core/network/webhook_functions.hpp +++ b/src/lua/functions/core/network/webhook_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/combat/combat_functions.cpp b/src/lua/functions/creatures/combat/combat_functions.cpp index 0d55cae9060..3bba21d179c 100644 --- a/src/lua/functions/creatures/combat/combat_functions.cpp +++ b/src/lua/functions/creatures/combat/combat_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/combat/combat_functions.hpp b/src/lua/functions/creatures/combat/combat_functions.hpp index 652255d7ae4..e031713e98e 100644 --- a/src/lua/functions/creatures/combat/combat_functions.hpp +++ b/src/lua/functions/creatures/combat/combat_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/combat/condition_functions.cpp b/src/lua/functions/creatures/combat/condition_functions.cpp index efd468ac3d6..7bc2535bdf4 100644 --- a/src/lua/functions/creatures/combat/condition_functions.cpp +++ b/src/lua/functions/creatures/combat/condition_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/combat/condition_functions.hpp b/src/lua/functions/creatures/combat/condition_functions.hpp index 7357cf9a991..938c5170542 100644 --- a/src/lua/functions/creatures/combat/condition_functions.hpp +++ b/src/lua/functions/creatures/combat/condition_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/combat/spell_functions.cpp b/src/lua/functions/creatures/combat/spell_functions.cpp index c76df1163ea..0bcf7c9c11a 100644 --- a/src/lua/functions/creatures/combat/spell_functions.cpp +++ b/src/lua/functions/creatures/combat/spell_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/combat/spell_functions.hpp b/src/lua/functions/creatures/combat/spell_functions.hpp index 9a4acb6fac9..7f2487ba16f 100644 --- a/src/lua/functions/creatures/combat/spell_functions.hpp +++ b/src/lua/functions/creatures/combat/spell_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/combat/variant_functions.cpp b/src/lua/functions/creatures/combat/variant_functions.cpp index 602dbfa1820..3b0299983fd 100644 --- a/src/lua/functions/creatures/combat/variant_functions.cpp +++ b/src/lua/functions/creatures/combat/variant_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/combat/variant_functions.hpp b/src/lua/functions/creatures/combat/variant_functions.hpp index 3f91600dedc..c62bbc114a8 100644 --- a/src/lua/functions/creatures/combat/variant_functions.hpp +++ b/src/lua/functions/creatures/combat/variant_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/creature_functions.cpp b/src/lua/functions/creatures/creature_functions.cpp index 8315a690f36..a633afe9749 100644 --- a/src/lua/functions/creatures/creature_functions.cpp +++ b/src/lua/functions/creatures/creature_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/creature_functions.hpp b/src/lua/functions/creatures/creature_functions.hpp index 48c374936c0..0876bb72901 100644 --- a/src/lua/functions/creatures/creature_functions.hpp +++ b/src/lua/functions/creatures/creature_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/monster/charm_functions.cpp b/src/lua/functions/creatures/monster/charm_functions.cpp index 2e6234d61c6..48f7ff5aec9 100644 --- a/src/lua/functions/creatures/monster/charm_functions.cpp +++ b/src/lua/functions/creatures/monster/charm_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/monster/charm_functions.hpp b/src/lua/functions/creatures/monster/charm_functions.hpp index 4a76658653a..7be1c8de635 100644 --- a/src/lua/functions/creatures/monster/charm_functions.hpp +++ b/src/lua/functions/creatures/monster/charm_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/monster/loot_functions.cpp b/src/lua/functions/creatures/monster/loot_functions.cpp index b23508033bc..3fe3a188368 100644 --- a/src/lua/functions/creatures/monster/loot_functions.cpp +++ b/src/lua/functions/creatures/monster/loot_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/monster/loot_functions.hpp b/src/lua/functions/creatures/monster/loot_functions.hpp index 919588ee38e..77059307a66 100644 --- a/src/lua/functions/creatures/monster/loot_functions.hpp +++ b/src/lua/functions/creatures/monster/loot_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/monster/monster_functions.cpp b/src/lua/functions/creatures/monster/monster_functions.cpp index 0c6bcf8c5bf..1591053c391 100644 --- a/src/lua/functions/creatures/monster/monster_functions.cpp +++ b/src/lua/functions/creatures/monster/monster_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/monster/monster_functions.hpp b/src/lua/functions/creatures/monster/monster_functions.hpp index a74253a1905..bf2785ae430 100644 --- a/src/lua/functions/creatures/monster/monster_functions.hpp +++ b/src/lua/functions/creatures/monster/monster_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/monster/monster_spell_functions.cpp b/src/lua/functions/creatures/monster/monster_spell_functions.cpp index 00e0c7c89b0..ee00fd43af7 100644 --- a/src/lua/functions/creatures/monster/monster_spell_functions.cpp +++ b/src/lua/functions/creatures/monster/monster_spell_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/monster/monster_spell_functions.hpp b/src/lua/functions/creatures/monster/monster_spell_functions.hpp index 4a1a4871c5e..ad737ea9326 100644 --- a/src/lua/functions/creatures/monster/monster_spell_functions.hpp +++ b/src/lua/functions/creatures/monster/monster_spell_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/monster/monster_type_functions.cpp b/src/lua/functions/creatures/monster/monster_type_functions.cpp index 269ff6aa3c3..b937083fddb 100644 --- a/src/lua/functions/creatures/monster/monster_type_functions.cpp +++ b/src/lua/functions/creatures/monster/monster_type_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/monster/monster_type_functions.hpp b/src/lua/functions/creatures/monster/monster_type_functions.hpp index f1b2a98bf50..9a72f53b145 100644 --- a/src/lua/functions/creatures/monster/monster_type_functions.hpp +++ b/src/lua/functions/creatures/monster/monster_type_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/npc/npc_functions.cpp b/src/lua/functions/creatures/npc/npc_functions.cpp index c4f447c8823..43c2950a802 100644 --- a/src/lua/functions/creatures/npc/npc_functions.cpp +++ b/src/lua/functions/creatures/npc/npc_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/npc/npc_functions.hpp b/src/lua/functions/creatures/npc/npc_functions.hpp index ef3371a54fb..1622a15c0e7 100644 --- a/src/lua/functions/creatures/npc/npc_functions.hpp +++ b/src/lua/functions/creatures/npc/npc_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/npc/npc_type_functions.cpp b/src/lua/functions/creatures/npc/npc_type_functions.cpp index 35bbebbe848..ef79b671a34 100644 --- a/src/lua/functions/creatures/npc/npc_type_functions.cpp +++ b/src/lua/functions/creatures/npc/npc_type_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/npc/npc_type_functions.hpp b/src/lua/functions/creatures/npc/npc_type_functions.hpp index a6646b7b2f4..ce799c71f20 100644 --- a/src/lua/functions/creatures/npc/npc_type_functions.hpp +++ b/src/lua/functions/creatures/npc/npc_type_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/npc/shop_functions.cpp b/src/lua/functions/creatures/npc/shop_functions.cpp index 66de7afd962..ee848e0bf47 100644 --- a/src/lua/functions/creatures/npc/shop_functions.cpp +++ b/src/lua/functions/creatures/npc/shop_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/npc/shop_functions.hpp b/src/lua/functions/creatures/npc/shop_functions.hpp index 1ffb53c92dc..e5a6c9943cc 100644 --- a/src/lua/functions/creatures/npc/shop_functions.hpp +++ b/src/lua/functions/creatures/npc/shop_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/player/group_functions.cpp b/src/lua/functions/creatures/player/group_functions.cpp index 13b2701253f..0ea195fe745 100644 --- a/src/lua/functions/creatures/player/group_functions.cpp +++ b/src/lua/functions/creatures/player/group_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/player/group_functions.hpp b/src/lua/functions/creatures/player/group_functions.hpp index 68ce41adeb9..ecc3ac07280 100644 --- a/src/lua/functions/creatures/player/group_functions.hpp +++ b/src/lua/functions/creatures/player/group_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/player/guild_functions.cpp b/src/lua/functions/creatures/player/guild_functions.cpp index 81464483fdc..196f0f9d31e 100644 --- a/src/lua/functions/creatures/player/guild_functions.cpp +++ b/src/lua/functions/creatures/player/guild_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/player/guild_functions.hpp b/src/lua/functions/creatures/player/guild_functions.hpp index f2977038328..e5c48244415 100644 --- a/src/lua/functions/creatures/player/guild_functions.hpp +++ b/src/lua/functions/creatures/player/guild_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/player/mount_functions.cpp b/src/lua/functions/creatures/player/mount_functions.cpp index 719c75ad7c2..49b16db6caa 100644 --- a/src/lua/functions/creatures/player/mount_functions.cpp +++ b/src/lua/functions/creatures/player/mount_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/player/mount_functions.hpp b/src/lua/functions/creatures/player/mount_functions.hpp index 61222e912b4..3a4db6d6f92 100644 --- a/src/lua/functions/creatures/player/mount_functions.hpp +++ b/src/lua/functions/creatures/player/mount_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/player/party_functions.cpp b/src/lua/functions/creatures/player/party_functions.cpp index e16499870a6..d739cde3ceb 100644 --- a/src/lua/functions/creatures/player/party_functions.cpp +++ b/src/lua/functions/creatures/player/party_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/player/party_functions.hpp b/src/lua/functions/creatures/player/party_functions.hpp index 30ff517201d..312a39952fe 100644 --- a/src/lua/functions/creatures/player/party_functions.hpp +++ b/src/lua/functions/creatures/player/party_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/player/player_functions.cpp b/src/lua/functions/creatures/player/player_functions.cpp index 6b3dd7e5e0c..f723d7dd475 100644 --- a/src/lua/functions/creatures/player/player_functions.cpp +++ b/src/lua/functions/creatures/player/player_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -14,6 +14,7 @@ #include "creatures/interactions/chat.hpp" #include "creatures/players/player.hpp" #include "creatures/players/wheel/player_wheel.hpp" +#include "creatures/players/achievement/player_achievement.hpp" #include "game/game.hpp" #include "io/iologindata.hpp" #include "io/ioprey.hpp" @@ -4178,6 +4179,107 @@ int PlayerFunctions::luaPlayerGetStoreInbox(lua_State* L) { return 1; } +int PlayerFunctions::luaPlayerHasAchievement(lua_State* L) { + // player:hasAchievement(id or name) + const auto &player = getUserdataShared(L, 1); + if (!player) { + reportErrorFunc(getErrorDesc(LUA_ERROR_PLAYER_NOT_FOUND)); + return 1; + } + + uint16_t achievementId = 0; + if (isNumber(L, 2)) { + achievementId = getNumber(L, 2); + } else { + achievementId = g_game().getAchievementByName(getString(L, 2)).id; + } + + pushBoolean(L, player->achiev()->isUnlocked(achievementId)); + return 1; +} + +int PlayerFunctions::luaPlayerAddAchievement(lua_State* L) { + // player:addAchievement(id or name[, sendMessage = true]) + const auto &player = getUserdataShared(L, 1); + if (!player) { + reportErrorFunc(getErrorDesc(LUA_ERROR_PLAYER_NOT_FOUND)); + return 1; + } + + uint16_t achievementId = 0; + if (isNumber(L, 2)) { + achievementId = getNumber(L, 2); + } else { + achievementId = g_game().getAchievementByName(getString(L, 2)).id; + } + + pushBoolean(L, player->achiev()->add(achievementId, getBoolean(L, 3, true))); + return 1; +} + +int PlayerFunctions::luaPlayerRemoveAchievement(lua_State* L) { + // player:removeAchievement(id or name) + const auto &player = getUserdataShared(L, 1); + if (!player) { + reportErrorFunc(getErrorDesc(LUA_ERROR_PLAYER_NOT_FOUND)); + return 1; + } + + uint16_t achievementId = 0; + if (isNumber(L, 2)) { + achievementId = getNumber(L, 2); + } else { + achievementId = g_game().getAchievementByName(getString(L, 2)).id; + } + + pushBoolean(L, player->achiev()->remove(achievementId)); + return 1; +} + +int PlayerFunctions::luaPlayerGetAchievementPoints(lua_State* L) { + // player:getAchievementPoints() + const auto &player = getUserdataShared(L, 1); + if (!player) { + reportErrorFunc(getErrorDesc(LUA_ERROR_PLAYER_NOT_FOUND)); + return 1; + } + + lua_pushnumber(L, player->achiev()->getPoints()); + return 1; +} + +int PlayerFunctions::luaPlayerAddAchievementPoints(lua_State* L) { + // player:addAchievementPoints(amount) + const auto &player = getUserdataShared(L, 1); + if (!player) { + reportErrorFunc(getErrorDesc(LUA_ERROR_PLAYER_NOT_FOUND)); + return 1; + } + + auto points = getNumber(L, 2); + if (points > 0) { + player->achiev()->addPoints(points); + } + pushBoolean(L, true); + return 1; +} + +int PlayerFunctions::luaPlayerRemoveAchievementPoints(lua_State* L) { + // player:removeAchievementPoints(amount) + const auto &player = getUserdataShared(L, 1); + if (!player) { + reportErrorFunc(getErrorDesc(LUA_ERROR_PLAYER_NOT_FOUND)); + return 1; + } + + auto points = getNumber(L, 2); + if (points > 0) { + player->achiev()->removePoints(points); + } + pushBoolean(L, true); + return 1; +} + int PlayerFunctions::luaPlayerSendTakeScreenshot(lua_State* L) { // player:sendTakeScreenshot(screenshotType) const auto &player = getUserdataShared(L, 1); @@ -4190,4 +4292,4 @@ int PlayerFunctions::luaPlayerSendTakeScreenshot(lua_State* L) { player->sendTakeScreenshot(screenshotType); pushBoolean(L, true); return 1; -} +} \ No newline at end of file diff --git a/src/lua/functions/creatures/player/player_functions.hpp b/src/lua/functions/creatures/player/player_functions.hpp index 3cf0da73968..ba55ad2934d 100644 --- a/src/lua/functions/creatures/player/player_functions.hpp +++ b/src/lua/functions/creatures/player/player_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -357,6 +357,13 @@ class PlayerFunctions final : LuaScriptInterface { registerMethod(L, "Player", "kv", PlayerFunctions::luaPlayerKV); registerMethod(L, "Player", "getStoreInbox", PlayerFunctions::luaPlayerGetStoreInbox); + registerMethod(L, "Player", "hasAchievement", PlayerFunctions::luaPlayerHasAchievement); + registerMethod(L, "Player", "addAchievement", PlayerFunctions::luaPlayerAddAchievement); + registerMethod(L, "Player", "removeAchievement", PlayerFunctions::luaPlayerRemoveAchievement); + registerMethod(L, "Player", "getAchievementPoints", PlayerFunctions::luaPlayerGetAchievementPoints); + registerMethod(L, "Player", "addAchievementPoints", PlayerFunctions::luaPlayerAddAchievementPoints); + registerMethod(L, "Player", "removeAchievementPoints", PlayerFunctions::luaPlayerRemoveAchievementPoints); + registerMethod(L, "Player", "sendTakeScreenshot", PlayerFunctions::luaPlayerSendTakeScreenshot); GroupFunctions::init(L); @@ -706,6 +713,13 @@ class PlayerFunctions final : LuaScriptInterface { static int luaPlayerKV(lua_State* L); static int luaPlayerGetStoreInbox(lua_State* L); + static int luaPlayerHasAchievement(lua_State* L); + static int luaPlayerAddAchievement(lua_State* L); + static int luaPlayerRemoveAchievement(lua_State* L); + static int luaPlayerGetAchievementPoints(lua_State* L); + static int luaPlayerAddAchievementPoints(lua_State* L); + static int luaPlayerRemoveAchievementPoints(lua_State* L); + static int luaPlayerSendTakeScreenshot(lua_State* L); friend class CreatureFunctions; diff --git a/src/lua/functions/creatures/player/vocation_functions.cpp b/src/lua/functions/creatures/player/vocation_functions.cpp index 4d6a99cc15f..5e95a827ff9 100644 --- a/src/lua/functions/creatures/player/vocation_functions.cpp +++ b/src/lua/functions/creatures/player/vocation_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/creatures/player/vocation_functions.hpp b/src/lua/functions/creatures/player/vocation_functions.hpp index 67868ae1ea8..7205580f90f 100644 --- a/src/lua/functions/creatures/player/vocation_functions.hpp +++ b/src/lua/functions/creatures/player/vocation_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/events/action_functions.cpp b/src/lua/functions/events/action_functions.cpp index e0e746d4149..c1fd581f8bd 100644 --- a/src/lua/functions/events/action_functions.cpp +++ b/src/lua/functions/events/action_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/events/action_functions.hpp b/src/lua/functions/events/action_functions.hpp index 759d5275f2e..952ee746a5a 100644 --- a/src/lua/functions/events/action_functions.hpp +++ b/src/lua/functions/events/action_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/events/creature_event_functions.cpp b/src/lua/functions/events/creature_event_functions.cpp index 2c5da7661f8..7b5e25a12f3 100644 --- a/src/lua/functions/events/creature_event_functions.cpp +++ b/src/lua/functions/events/creature_event_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/events/creature_event_functions.hpp b/src/lua/functions/events/creature_event_functions.hpp index 8c1d5a871c0..64b9e6e4eb8 100644 --- a/src/lua/functions/events/creature_event_functions.hpp +++ b/src/lua/functions/events/creature_event_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/events/event_callback_functions.cpp b/src/lua/functions/events/event_callback_functions.cpp index 3be4adf256a..54457f4367a 100644 --- a/src/lua/functions/events/event_callback_functions.cpp +++ b/src/lua/functions/events/event_callback_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/events/event_callback_functions.hpp b/src/lua/functions/events/event_callback_functions.hpp index 9cdc21729cb..a5fa9e8900c 100644 --- a/src/lua/functions/events/event_callback_functions.hpp +++ b/src/lua/functions/events/event_callback_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/events/events_functions.hpp b/src/lua/functions/events/events_functions.hpp index d9be1e080d3..6830b7c1a73 100644 --- a/src/lua/functions/events/events_functions.hpp +++ b/src/lua/functions/events/events_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/events/events_scheduler_functions.cpp b/src/lua/functions/events/events_scheduler_functions.cpp index d07482dd295..e26794e218a 100644 --- a/src/lua/functions/events/events_scheduler_functions.cpp +++ b/src/lua/functions/events/events_scheduler_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -18,6 +18,12 @@ int EventsSchedulerFunctions::luaEventsSchedulergetEventSLoot(lua_State* L) { return 1; } +int EventsSchedulerFunctions::luaEventsSchedulergetEventSBossLoot(lua_State* L) { + // EventsScheduler.getEventSLoot + lua_pushnumber(L, g_eventsScheduler().getBossLootSchedule()); + return 1; +} + int EventsSchedulerFunctions::luaEventsSchedulergetEventSSkill(lua_State* L) { // EventsScheduler.getEventSSkill lua_pushnumber(L, g_eventsScheduler().getSkillSchedule()); diff --git a/src/lua/functions/events/events_scheduler_functions.hpp b/src/lua/functions/events/events_scheduler_functions.hpp index ab7978043f0..bedbf16b4a1 100644 --- a/src/lua/functions/events/events_scheduler_functions.hpp +++ b/src/lua/functions/events/events_scheduler_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -17,6 +17,7 @@ class EventsSchedulerFunctions final : private LuaScriptInterface { registerTable(L, "EventsScheduler"); registerMethod(L, "EventsScheduler", "getEventSLoot", EventsSchedulerFunctions::luaEventsSchedulergetEventSLoot); + registerMethod(L, "EventsScheduler", "getEventSBossLoot", EventsSchedulerFunctions::luaEventsSchedulergetEventSBossLoot); registerMethod(L, "EventsScheduler", "getEventSSkill", EventsSchedulerFunctions::luaEventsSchedulergetEventSSkill); registerMethod(L, "EventsScheduler", "getEventSExp", EventsSchedulerFunctions::luaEventsSchedulergetEventSExp); registerMethod(L, "EventsScheduler", "getSpawnMonsterSchedule", EventsSchedulerFunctions::luaEventsSchedulergetSpawnMonsterSchedule); @@ -24,6 +25,7 @@ class EventsSchedulerFunctions final : private LuaScriptInterface { private: static int luaEventsSchedulergetEventSLoot(lua_State* L); + static int luaEventsSchedulergetEventSBossLoot(lua_State* L); static int luaEventsSchedulergetEventSSkill(lua_State* L); static int luaEventsSchedulergetEventSExp(lua_State* L); static int luaEventsSchedulergetSpawnMonsterSchedule(lua_State* L); diff --git a/src/lua/functions/events/global_event_functions.cpp b/src/lua/functions/events/global_event_functions.cpp index 955f477bcae..8f54e5b03fd 100644 --- a/src/lua/functions/events/global_event_functions.cpp +++ b/src/lua/functions/events/global_event_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/events/global_event_functions.hpp b/src/lua/functions/events/global_event_functions.hpp index dd9491928ff..6c988a61ca1 100644 --- a/src/lua/functions/events/global_event_functions.hpp +++ b/src/lua/functions/events/global_event_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/events/move_event_functions.cpp b/src/lua/functions/events/move_event_functions.cpp index 07bf82d4c58..5de49c26f59 100644 --- a/src/lua/functions/events/move_event_functions.cpp +++ b/src/lua/functions/events/move_event_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/events/move_event_functions.hpp b/src/lua/functions/events/move_event_functions.hpp index 23187553e16..6e6412bec73 100644 --- a/src/lua/functions/events/move_event_functions.hpp +++ b/src/lua/functions/events/move_event_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/events/talk_action_functions.cpp b/src/lua/functions/events/talk_action_functions.cpp index d6d77287776..8618cc3c4a3 100644 --- a/src/lua/functions/events/talk_action_functions.cpp +++ b/src/lua/functions/events/talk_action_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/events/talk_action_functions.hpp b/src/lua/functions/events/talk_action_functions.hpp index a8c003828b9..6b2bc9b7a20 100644 --- a/src/lua/functions/events/talk_action_functions.hpp +++ b/src/lua/functions/events/talk_action_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/items/container_functions.cpp b/src/lua/functions/items/container_functions.cpp index 132acbdc5b4..a2251de641c 100644 --- a/src/lua/functions/items/container_functions.cpp +++ b/src/lua/functions/items/container_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/items/container_functions.hpp b/src/lua/functions/items/container_functions.hpp index 186f6b68119..568018b45fd 100644 --- a/src/lua/functions/items/container_functions.hpp +++ b/src/lua/functions/items/container_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/items/imbuement_functions.cpp b/src/lua/functions/items/imbuement_functions.cpp index 2a4e85d7d88..f24a3f564d7 100644 --- a/src/lua/functions/items/imbuement_functions.cpp +++ b/src/lua/functions/items/imbuement_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/items/imbuement_functions.hpp b/src/lua/functions/items/imbuement_functions.hpp index 018c7faad85..516fe91a3b1 100644 --- a/src/lua/functions/items/imbuement_functions.hpp +++ b/src/lua/functions/items/imbuement_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/items/item_classification_functions.cpp b/src/lua/functions/items/item_classification_functions.cpp index 5120f8391ff..aa8cf19d589 100644 --- a/src/lua/functions/items/item_classification_functions.cpp +++ b/src/lua/functions/items/item_classification_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/items/item_classification_functions.hpp b/src/lua/functions/items/item_classification_functions.hpp index 95f778705fa..ebbd9fddd47 100644 --- a/src/lua/functions/items/item_classification_functions.hpp +++ b/src/lua/functions/items/item_classification_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/items/item_functions.cpp b/src/lua/functions/items/item_functions.cpp index 3e9190055c4..71ab040f47d 100644 --- a/src/lua/functions/items/item_functions.cpp +++ b/src/lua/functions/items/item_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/items/item_functions.hpp b/src/lua/functions/items/item_functions.hpp index 5e8c81187a9..44e111479a3 100644 --- a/src/lua/functions/items/item_functions.hpp +++ b/src/lua/functions/items/item_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/items/item_type_functions.cpp b/src/lua/functions/items/item_type_functions.cpp index 4ff757b3dcd..b528795a050 100644 --- a/src/lua/functions/items/item_type_functions.cpp +++ b/src/lua/functions/items/item_type_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/items/item_type_functions.hpp b/src/lua/functions/items/item_type_functions.hpp index 46eaa646217..ce53d429804 100644 --- a/src/lua/functions/items/item_type_functions.hpp +++ b/src/lua/functions/items/item_type_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/items/weapon_functions.cpp b/src/lua/functions/items/weapon_functions.cpp index 3a41d0ac75d..962c1181fe4 100644 --- a/src/lua/functions/items/weapon_functions.cpp +++ b/src/lua/functions/items/weapon_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/items/weapon_functions.hpp b/src/lua/functions/items/weapon_functions.hpp index 01ba6966317..b7ac6fe6aaa 100644 --- a/src/lua/functions/items/weapon_functions.hpp +++ b/src/lua/functions/items/weapon_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/lua_functions_loader.cpp b/src/lua/functions/lua_functions_loader.cpp index 77f360ce036..69ee85dd865 100644 --- a/src/lua/functions/lua_functions_loader.cpp +++ b/src/lua/functions/lua_functions_loader.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/lua_functions_loader.hpp b/src/lua/functions/lua_functions_loader.hpp index 26ae6219f1e..e5251e3a1c3 100644 --- a/src/lua/functions/lua_functions_loader.hpp +++ b/src/lua/functions/lua_functions_loader.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/map/house_functions.cpp b/src/lua/functions/map/house_functions.cpp index 834382ae432..ffba0d0b5a9 100644 --- a/src/lua/functions/map/house_functions.cpp +++ b/src/lua/functions/map/house_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/map/house_functions.hpp b/src/lua/functions/map/house_functions.hpp index b5419ad5e13..ede7e1f0998 100644 --- a/src/lua/functions/map/house_functions.hpp +++ b/src/lua/functions/map/house_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/map/map_functions.hpp b/src/lua/functions/map/map_functions.hpp index 526705dcc6b..43b025c9155 100644 --- a/src/lua/functions/map/map_functions.hpp +++ b/src/lua/functions/map/map_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/map/position_functions.cpp b/src/lua/functions/map/position_functions.cpp index b68d8501588..579304266c0 100644 --- a/src/lua/functions/map/position_functions.cpp +++ b/src/lua/functions/map/position_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/map/position_functions.hpp b/src/lua/functions/map/position_functions.hpp index b7a6de50d45..095ec0667c7 100644 --- a/src/lua/functions/map/position_functions.hpp +++ b/src/lua/functions/map/position_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/map/teleport_functions.cpp b/src/lua/functions/map/teleport_functions.cpp index 05a4b408f61..32fce583057 100644 --- a/src/lua/functions/map/teleport_functions.cpp +++ b/src/lua/functions/map/teleport_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/map/teleport_functions.hpp b/src/lua/functions/map/teleport_functions.hpp index 6c02c162028..152cf8f0d9e 100644 --- a/src/lua/functions/map/teleport_functions.hpp +++ b/src/lua/functions/map/teleport_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/map/tile_functions.cpp b/src/lua/functions/map/tile_functions.cpp index 448671c3b81..cdd82abda8c 100644 --- a/src/lua/functions/map/tile_functions.cpp +++ b/src/lua/functions/map/tile_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/map/tile_functions.hpp b/src/lua/functions/map/tile_functions.hpp index a1956171c54..78e8c44b32c 100644 --- a/src/lua/functions/map/tile_functions.hpp +++ b/src/lua/functions/map/tile_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/map/town_functions.cpp b/src/lua/functions/map/town_functions.cpp index f50042c1566..053aca36b82 100644 --- a/src/lua/functions/map/town_functions.cpp +++ b/src/lua/functions/map/town_functions.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/functions/map/town_functions.hpp b/src/lua/functions/map/town_functions.hpp index 4f60eeab28e..65ff991c2c9 100644 --- a/src/lua/functions/map/town_functions.hpp +++ b/src/lua/functions/map/town_functions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/global/baseevents.cpp b/src/lua/global/baseevents.cpp index 7347c898c40..9728342f7ed 100644 --- a/src/lua/global/baseevents.cpp +++ b/src/lua/global/baseevents.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/global/baseevents.hpp b/src/lua/global/baseevents.hpp index 84b16ca6ef4..48e2d104a92 100644 --- a/src/lua/global/baseevents.hpp +++ b/src/lua/global/baseevents.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/global/globalevent.cpp b/src/lua/global/globalevent.cpp index c50eba9b8d4..62650b429a9 100644 --- a/src/lua/global/globalevent.cpp +++ b/src/lua/global/globalevent.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/global/globalevent.hpp b/src/lua/global/globalevent.hpp index 683da71260f..004c6cb5f8c 100644 --- a/src/lua/global/globalevent.hpp +++ b/src/lua/global/globalevent.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/global/lua_timer_event_descr.hpp b/src/lua/global/lua_timer_event_descr.hpp index da9bdc9b402..a8f7563654f 100644 --- a/src/lua/global/lua_timer_event_descr.hpp +++ b/src/lua/global/lua_timer_event_descr.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/global/lua_variant.hpp b/src/lua/global/lua_variant.hpp index 13250cc6288..6ec24d4f8af 100644 --- a/src/lua/global/lua_variant.hpp +++ b/src/lua/global/lua_variant.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/global/shared_object.hpp b/src/lua/global/shared_object.hpp index 3370bb022c1..4a6fc3c988e 100644 --- a/src/lua/global/shared_object.hpp +++ b/src/lua/global/shared_object.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/lua_definitions.hpp b/src/lua/lua_definitions.hpp index e0ff4028c0b..083871e237b 100644 --- a/src/lua/lua_definitions.hpp +++ b/src/lua/lua_definitions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/modules/modules.cpp b/src/lua/modules/modules.cpp index 5e1565251c8..8b79524ec2c 100644 --- a/src/lua/modules/modules.cpp +++ b/src/lua/modules/modules.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/modules/modules.hpp b/src/lua/modules/modules.hpp index f72baf94fe1..6543138d515 100644 --- a/src/lua/modules/modules.hpp +++ b/src/lua/modules/modules.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/scripts/lua_environment.cpp b/src/lua/scripts/lua_environment.cpp index f5552d108a4..f3d2273df34 100644 --- a/src/lua/scripts/lua_environment.cpp +++ b/src/lua/scripts/lua_environment.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/scripts/lua_environment.hpp b/src/lua/scripts/lua_environment.hpp index 8a7e7db66af..b467599cad4 100644 --- a/src/lua/scripts/lua_environment.hpp +++ b/src/lua/scripts/lua_environment.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/scripts/luajit_sync.hpp b/src/lua/scripts/luajit_sync.hpp index f32f82efc65..62f5720bd95 100644 --- a/src/lua/scripts/luajit_sync.hpp +++ b/src/lua/scripts/luajit_sync.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/scripts/luascript.cpp b/src/lua/scripts/luascript.cpp index adefef958ed..d67b90e9d18 100644 --- a/src/lua/scripts/luascript.cpp +++ b/src/lua/scripts/luascript.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/scripts/luascript.hpp b/src/lua/scripts/luascript.hpp index b7845c84558..06654c35a21 100644 --- a/src/lua/scripts/luascript.hpp +++ b/src/lua/scripts/luascript.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/scripts/script_environment.cpp b/src/lua/scripts/script_environment.cpp index ccebdb1a8dd..4a7ad7acd94 100644 --- a/src/lua/scripts/script_environment.cpp +++ b/src/lua/scripts/script_environment.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/scripts/script_environment.hpp b/src/lua/scripts/script_environment.hpp index 285e5d77131..fe89d3f1e5d 100644 --- a/src/lua/scripts/script_environment.hpp +++ b/src/lua/scripts/script_environment.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/scripts/scripts.cpp b/src/lua/scripts/scripts.cpp index 14c9b8c26cb..1d395cdd096 100644 --- a/src/lua/scripts/scripts.cpp +++ b/src/lua/scripts/scripts.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/lua/scripts/scripts.hpp b/src/lua/scripts/scripts.hpp index a0344a33b3d..7cefaaaf8bd 100644 --- a/src/lua/scripts/scripts.hpp +++ b/src/lua/scripts/scripts.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/main.cpp b/src/main.cpp index ae80f752c92..be289d397f6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/map/house/house.cpp b/src/map/house/house.cpp index 5090ff86bc5..7967e21c3cc 100644 --- a/src/map/house/house.cpp +++ b/src/map/house/house.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/map/house/house.hpp b/src/map/house/house.hpp index 9b70f444524..aa4b746cc0a 100644 --- a/src/map/house/house.hpp +++ b/src/map/house/house.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/map/house/housetile.cpp b/src/map/house/housetile.cpp index 3ed661a1c12..6b301f0e817 100644 --- a/src/map/house/housetile.cpp +++ b/src/map/house/housetile.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/map/house/housetile.hpp b/src/map/house/housetile.hpp index 04da8a4e7f2..b661251dbea 100644 --- a/src/map/house/housetile.hpp +++ b/src/map/house/housetile.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/map/map.cpp b/src/map/map.cpp index 662e85f18d7..395e6d7d2be 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/map/map.hpp b/src/map/map.hpp index d5ca9b2af14..0894853e30e 100644 --- a/src/map/map.hpp +++ b/src/map/map.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/map/map_definitions.hpp b/src/map/map_definitions.hpp index 3c61e7a2091..67c9878b92d 100644 --- a/src/map/map_definitions.hpp +++ b/src/map/map_definitions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/map/mapcache.cpp b/src/map/mapcache.cpp index e0e58e5f099..ede4d3fd862 100644 --- a/src/map/mapcache.cpp +++ b/src/map/mapcache.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/map/spectators.cpp b/src/map/spectators.cpp index 8ae8514bb97..18ce13871fe 100644 --- a/src/map/spectators.cpp +++ b/src/map/spectators.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/map/spectators.hpp b/src/map/spectators.hpp index 6b9a0445510..93526e05c93 100644 --- a/src/map/spectators.hpp +++ b/src/map/spectators.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/map/town.hpp b/src/map/town.hpp index f6ab241b54b..d6529fa30ef 100644 --- a/src/map/town.hpp +++ b/src/map/town.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/pch.hpp b/src/pch.hpp index 60f059fa4a3..522411b5621 100644 --- a/src/pch.hpp +++ b/src/pch.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/protobuf/appearances.pb.cc b/src/protobuf/appearances.pb.cc deleted file mode 100644 index ced2a617345..00000000000 --- a/src/protobuf/appearances.pb.cc +++ /dev/null @@ -1,10027 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: appearances.proto - -#include "appearances.pb.h" - -#include - -#include -#include -#include -#include -#include -#include -#include -// @@protoc_insertion_point(includes) -#include - -PROTOBUF_PRAGMA_INIT_SEG - -namespace _pb = ::PROTOBUF_NAMESPACE_ID; -namespace _pbi = _pb::internal; - -namespace Canary { -namespace protobuf { -namespace appearances { -PROTOBUF_CONSTEXPR Coordinate::Coordinate( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.x_)*/0u - , /*decltype(_impl_.y_)*/0u - , /*decltype(_impl_.z_)*/0u} {} -struct CoordinateDefaultTypeInternal { - PROTOBUF_CONSTEXPR CoordinateDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~CoordinateDefaultTypeInternal() {} - union { - Coordinate _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 CoordinateDefaultTypeInternal _Coordinate_default_instance_; -PROTOBUF_CONSTEXPR Appearances::Appearances( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.object_)*/{} - , /*decltype(_impl_.outfit_)*/{} - , /*decltype(_impl_.effect_)*/{} - , /*decltype(_impl_.missile_)*/{} - , /*decltype(_impl_.special_meaning_appearance_ids_)*/nullptr} {} -struct AppearancesDefaultTypeInternal { - PROTOBUF_CONSTEXPR AppearancesDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~AppearancesDefaultTypeInternal() {} - union { - Appearances _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AppearancesDefaultTypeInternal _Appearances_default_instance_; -PROTOBUF_CONSTEXPR SpritePhase::SpritePhase( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.duration_min_)*/0u - , /*decltype(_impl_.duration_max_)*/0u} {} -struct SpritePhaseDefaultTypeInternal { - PROTOBUF_CONSTEXPR SpritePhaseDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~SpritePhaseDefaultTypeInternal() {} - union { - SpritePhase _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SpritePhaseDefaultTypeInternal _SpritePhase_default_instance_; -PROTOBUF_CONSTEXPR SpriteAnimation::SpriteAnimation( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.sprite_phase_)*/{} - , /*decltype(_impl_.default_start_phase_)*/0u - , /*decltype(_impl_.synchronized_)*/false - , /*decltype(_impl_.random_start_phase_)*/false - , /*decltype(_impl_.loop_count_)*/0u - , /*decltype(_impl_.loop_type_)*/-1} {} -struct SpriteAnimationDefaultTypeInternal { - PROTOBUF_CONSTEXPR SpriteAnimationDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~SpriteAnimationDefaultTypeInternal() {} - union { - SpriteAnimation _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SpriteAnimationDefaultTypeInternal _SpriteAnimation_default_instance_; -PROTOBUF_CONSTEXPR Box::Box( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.x_)*/0u - , /*decltype(_impl_.y_)*/0u - , /*decltype(_impl_.width_)*/0u - , /*decltype(_impl_.height_)*/0u} {} -struct BoxDefaultTypeInternal { - PROTOBUF_CONSTEXPR BoxDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~BoxDefaultTypeInternal() {} - union { - Box _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 BoxDefaultTypeInternal _Box_default_instance_; -PROTOBUF_CONSTEXPR SpriteInfo::SpriteInfo( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.sprite_id_)*/{} - , /*decltype(_impl_.bounding_box_per_direction_)*/{} - , /*decltype(_impl_.animation_)*/nullptr - , /*decltype(_impl_.pattern_width_)*/0u - , /*decltype(_impl_.pattern_height_)*/0u - , /*decltype(_impl_.pattern_depth_)*/0u - , /*decltype(_impl_.layers_)*/0u - , /*decltype(_impl_.bounding_square_)*/0u - , /*decltype(_impl_.is_opaque_)*/false} {} -struct SpriteInfoDefaultTypeInternal { - PROTOBUF_CONSTEXPR SpriteInfoDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~SpriteInfoDefaultTypeInternal() {} - union { - SpriteInfo _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SpriteInfoDefaultTypeInternal _SpriteInfo_default_instance_; -PROTOBUF_CONSTEXPR FrameGroup::FrameGroup( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.sprite_info_)*/nullptr - , /*decltype(_impl_.fixed_frame_group_)*/0 - , /*decltype(_impl_.id_)*/0u} {} -struct FrameGroupDefaultTypeInternal { - PROTOBUF_CONSTEXPR FrameGroupDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~FrameGroupDefaultTypeInternal() {} - union { - FrameGroup _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 FrameGroupDefaultTypeInternal _FrameGroup_default_instance_; -PROTOBUF_CONSTEXPR Appearance::Appearance( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.frame_group_)*/{} - , /*decltype(_impl_.name_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}} - , /*decltype(_impl_.description_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}} - , /*decltype(_impl_.flags_)*/nullptr - , /*decltype(_impl_.id_)*/0u} {} -struct AppearanceDefaultTypeInternal { - PROTOBUF_CONSTEXPR AppearanceDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~AppearanceDefaultTypeInternal() {} - union { - Appearance _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AppearanceDefaultTypeInternal _Appearance_default_instance_; -PROTOBUF_CONSTEXPR AppearanceFlags::AppearanceFlags( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.npcsaledata_)*/{} - , /*decltype(_impl_.bank_)*/nullptr - , /*decltype(_impl_.write_)*/nullptr - , /*decltype(_impl_.write_once_)*/nullptr - , /*decltype(_impl_.hook_)*/nullptr - , /*decltype(_impl_.light_)*/nullptr - , /*decltype(_impl_.shift_)*/nullptr - , /*decltype(_impl_.height_)*/nullptr - , /*decltype(_impl_.automap_)*/nullptr - , /*decltype(_impl_.lenshelp_)*/nullptr - , /*decltype(_impl_.clothes_)*/nullptr - , /*decltype(_impl_.default_action_)*/nullptr - , /*decltype(_impl_.market_)*/nullptr - , /*decltype(_impl_.changedtoexpire_)*/nullptr - , /*decltype(_impl_.cyclopediaitem_)*/nullptr - , /*decltype(_impl_.upgradeclassification_)*/nullptr - , /*decltype(_impl_.clip_)*/false - , /*decltype(_impl_.bottom_)*/false - , /*decltype(_impl_.top_)*/false - , /*decltype(_impl_.container_)*/false - , /*decltype(_impl_.cumulative_)*/false - , /*decltype(_impl_.usable_)*/false - , /*decltype(_impl_.forceuse_)*/false - , /*decltype(_impl_.multiuse_)*/false - , /*decltype(_impl_.liquidpool_)*/false - , /*decltype(_impl_.unpass_)*/false - , /*decltype(_impl_.unmove_)*/false - , /*decltype(_impl_.unsight_)*/false - , /*decltype(_impl_.avoid_)*/false - , /*decltype(_impl_.no_movement_animation_)*/false - , /*decltype(_impl_.take_)*/false - , /*decltype(_impl_.liquidcontainer_)*/false - , /*decltype(_impl_.hang_)*/false - , /*decltype(_impl_.rotate_)*/false - , /*decltype(_impl_.dont_hide_)*/false - , /*decltype(_impl_.translucent_)*/false - , /*decltype(_impl_.lying_object_)*/false - , /*decltype(_impl_.animate_always_)*/false - , /*decltype(_impl_.fullbank_)*/false - , /*decltype(_impl_.ignore_look_)*/false - , /*decltype(_impl_.wrap_)*/false - , /*decltype(_impl_.unwrap_)*/false - , /*decltype(_impl_.topeffect_)*/false - , /*decltype(_impl_.corpse_)*/false - , /*decltype(_impl_.player_corpse_)*/false - , /*decltype(_impl_.ammo_)*/false - , /*decltype(_impl_.show_off_socket_)*/false - , /*decltype(_impl_.reportable_)*/false - , /*decltype(_impl_.reverse_addons_east_)*/false - , /*decltype(_impl_.reverse_addons_west_)*/false - , /*decltype(_impl_.reverse_addons_south_)*/false - , /*decltype(_impl_.reverse_addons_north_)*/false - , /*decltype(_impl_.wearout_)*/false - , /*decltype(_impl_.clockexpire_)*/false - , /*decltype(_impl_.expire_)*/false - , /*decltype(_impl_.expirestop_)*/false - , /*decltype(_impl_.wrapkit_)*/false} {} -struct AppearanceFlagsDefaultTypeInternal { - PROTOBUF_CONSTEXPR AppearanceFlagsDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~AppearanceFlagsDefaultTypeInternal() {} - union { - AppearanceFlags _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AppearanceFlagsDefaultTypeInternal _AppearanceFlags_default_instance_; -PROTOBUF_CONSTEXPR AppearanceFlagUpgradeClassification::AppearanceFlagUpgradeClassification( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.upgrade_classification_)*/0u} {} -struct AppearanceFlagUpgradeClassificationDefaultTypeInternal { - PROTOBUF_CONSTEXPR AppearanceFlagUpgradeClassificationDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~AppearanceFlagUpgradeClassificationDefaultTypeInternal() {} - union { - AppearanceFlagUpgradeClassification _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AppearanceFlagUpgradeClassificationDefaultTypeInternal _AppearanceFlagUpgradeClassification_default_instance_; -PROTOBUF_CONSTEXPR AppearanceFlagBank::AppearanceFlagBank( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.waypoints_)*/0u} {} -struct AppearanceFlagBankDefaultTypeInternal { - PROTOBUF_CONSTEXPR AppearanceFlagBankDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~AppearanceFlagBankDefaultTypeInternal() {} - union { - AppearanceFlagBank _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AppearanceFlagBankDefaultTypeInternal _AppearanceFlagBank_default_instance_; -PROTOBUF_CONSTEXPR AppearanceFlagWrite::AppearanceFlagWrite( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.max_text_length_)*/0u} {} -struct AppearanceFlagWriteDefaultTypeInternal { - PROTOBUF_CONSTEXPR AppearanceFlagWriteDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~AppearanceFlagWriteDefaultTypeInternal() {} - union { - AppearanceFlagWrite _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AppearanceFlagWriteDefaultTypeInternal _AppearanceFlagWrite_default_instance_; -PROTOBUF_CONSTEXPR AppearanceFlagWriteOnce::AppearanceFlagWriteOnce( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.max_text_length_once_)*/0u} {} -struct AppearanceFlagWriteOnceDefaultTypeInternal { - PROTOBUF_CONSTEXPR AppearanceFlagWriteOnceDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~AppearanceFlagWriteOnceDefaultTypeInternal() {} - union { - AppearanceFlagWriteOnce _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AppearanceFlagWriteOnceDefaultTypeInternal _AppearanceFlagWriteOnce_default_instance_; -PROTOBUF_CONSTEXPR AppearanceFlagLight::AppearanceFlagLight( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.brightness_)*/0u - , /*decltype(_impl_.color_)*/0u} {} -struct AppearanceFlagLightDefaultTypeInternal { - PROTOBUF_CONSTEXPR AppearanceFlagLightDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~AppearanceFlagLightDefaultTypeInternal() {} - union { - AppearanceFlagLight _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AppearanceFlagLightDefaultTypeInternal _AppearanceFlagLight_default_instance_; -PROTOBUF_CONSTEXPR AppearanceFlagHeight::AppearanceFlagHeight( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.elevation_)*/0u} {} -struct AppearanceFlagHeightDefaultTypeInternal { - PROTOBUF_CONSTEXPR AppearanceFlagHeightDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~AppearanceFlagHeightDefaultTypeInternal() {} - union { - AppearanceFlagHeight _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AppearanceFlagHeightDefaultTypeInternal _AppearanceFlagHeight_default_instance_; -PROTOBUF_CONSTEXPR AppearanceFlagShift::AppearanceFlagShift( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.x_)*/0u - , /*decltype(_impl_.y_)*/0u} {} -struct AppearanceFlagShiftDefaultTypeInternal { - PROTOBUF_CONSTEXPR AppearanceFlagShiftDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~AppearanceFlagShiftDefaultTypeInternal() {} - union { - AppearanceFlagShift _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AppearanceFlagShiftDefaultTypeInternal _AppearanceFlagShift_default_instance_; -PROTOBUF_CONSTEXPR AppearanceFlagClothes::AppearanceFlagClothes( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.slot_)*/0u} {} -struct AppearanceFlagClothesDefaultTypeInternal { - PROTOBUF_CONSTEXPR AppearanceFlagClothesDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~AppearanceFlagClothesDefaultTypeInternal() {} - union { - AppearanceFlagClothes _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AppearanceFlagClothesDefaultTypeInternal _AppearanceFlagClothes_default_instance_; -PROTOBUF_CONSTEXPR AppearanceFlagDefaultAction::AppearanceFlagDefaultAction( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.action_)*/0} {} -struct AppearanceFlagDefaultActionDefaultTypeInternal { - PROTOBUF_CONSTEXPR AppearanceFlagDefaultActionDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~AppearanceFlagDefaultActionDefaultTypeInternal() {} - union { - AppearanceFlagDefaultAction _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AppearanceFlagDefaultActionDefaultTypeInternal _AppearanceFlagDefaultAction_default_instance_; -PROTOBUF_CONSTEXPR AppearanceFlagMarket::AppearanceFlagMarket( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.restrict_to_profession_)*/{} - , /*decltype(_impl_.trade_as_object_id_)*/0u - , /*decltype(_impl_.show_as_object_id_)*/0u - , /*decltype(_impl_.minimum_level_)*/0u - , /*decltype(_impl_.category_)*/1} {} -struct AppearanceFlagMarketDefaultTypeInternal { - PROTOBUF_CONSTEXPR AppearanceFlagMarketDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~AppearanceFlagMarketDefaultTypeInternal() {} - union { - AppearanceFlagMarket _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AppearanceFlagMarketDefaultTypeInternal _AppearanceFlagMarket_default_instance_; -PROTOBUF_CONSTEXPR AppearanceFlagNPC::AppearanceFlagNPC( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.name_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}} - , /*decltype(_impl_.location_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}} - , /*decltype(_impl_.currency_quest_flag_display_name_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}} - , /*decltype(_impl_.sale_price_)*/0u - , /*decltype(_impl_.buy_price_)*/0u - , /*decltype(_impl_.currency_object_type_id_)*/0u} {} -struct AppearanceFlagNPCDefaultTypeInternal { - PROTOBUF_CONSTEXPR AppearanceFlagNPCDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~AppearanceFlagNPCDefaultTypeInternal() {} - union { - AppearanceFlagNPC _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AppearanceFlagNPCDefaultTypeInternal _AppearanceFlagNPC_default_instance_; -PROTOBUF_CONSTEXPR AppearanceFlagAutomap::AppearanceFlagAutomap( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.color_)*/0u} {} -struct AppearanceFlagAutomapDefaultTypeInternal { - PROTOBUF_CONSTEXPR AppearanceFlagAutomapDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~AppearanceFlagAutomapDefaultTypeInternal() {} - union { - AppearanceFlagAutomap _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AppearanceFlagAutomapDefaultTypeInternal _AppearanceFlagAutomap_default_instance_; -PROTOBUF_CONSTEXPR AppearanceFlagHook::AppearanceFlagHook( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.direction_)*/1} {} -struct AppearanceFlagHookDefaultTypeInternal { - PROTOBUF_CONSTEXPR AppearanceFlagHookDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~AppearanceFlagHookDefaultTypeInternal() {} - union { - AppearanceFlagHook _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AppearanceFlagHookDefaultTypeInternal _AppearanceFlagHook_default_instance_; -PROTOBUF_CONSTEXPR AppearanceFlagLenshelp::AppearanceFlagLenshelp( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.id_)*/0u} {} -struct AppearanceFlagLenshelpDefaultTypeInternal { - PROTOBUF_CONSTEXPR AppearanceFlagLenshelpDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~AppearanceFlagLenshelpDefaultTypeInternal() {} - union { - AppearanceFlagLenshelp _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AppearanceFlagLenshelpDefaultTypeInternal _AppearanceFlagLenshelp_default_instance_; -PROTOBUF_CONSTEXPR AppearanceFlagChangedToExpire::AppearanceFlagChangedToExpire( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.former_object_typeid_)*/0u} {} -struct AppearanceFlagChangedToExpireDefaultTypeInternal { - PROTOBUF_CONSTEXPR AppearanceFlagChangedToExpireDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~AppearanceFlagChangedToExpireDefaultTypeInternal() {} - union { - AppearanceFlagChangedToExpire _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AppearanceFlagChangedToExpireDefaultTypeInternal _AppearanceFlagChangedToExpire_default_instance_; -PROTOBUF_CONSTEXPR AppearanceFlagCyclopedia::AppearanceFlagCyclopedia( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.cyclopedia_type_)*/0u} {} -struct AppearanceFlagCyclopediaDefaultTypeInternal { - PROTOBUF_CONSTEXPR AppearanceFlagCyclopediaDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~AppearanceFlagCyclopediaDefaultTypeInternal() {} - union { - AppearanceFlagCyclopedia _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 AppearanceFlagCyclopediaDefaultTypeInternal _AppearanceFlagCyclopedia_default_instance_; -PROTOBUF_CONSTEXPR SpecialMeaningAppearanceIds::SpecialMeaningAppearanceIds( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_._has_bits_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_.gold_coin_id_)*/0u - , /*decltype(_impl_.platinum_coin_id_)*/0u - , /*decltype(_impl_.crystal_coin_id_)*/0u - , /*decltype(_impl_.tibia_coin_id_)*/0u - , /*decltype(_impl_.stamped_letter_id_)*/0u - , /*decltype(_impl_.supply_stash_id_)*/0u - , /*decltype(_impl_.reward_chest_id_)*/0u} {} -struct SpecialMeaningAppearanceIdsDefaultTypeInternal { - PROTOBUF_CONSTEXPR SpecialMeaningAppearanceIdsDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~SpecialMeaningAppearanceIdsDefaultTypeInternal() {} - union { - SpecialMeaningAppearanceIds _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 SpecialMeaningAppearanceIdsDefaultTypeInternal _SpecialMeaningAppearanceIds_default_instance_; -} // namespace appearances -} // namespace protobuf -} // namespace Canary -static ::_pb::Metadata file_level_metadata_appearances_2eproto[26]; -static const ::_pb::EnumDescriptor* file_level_enum_descriptors_appearances_2eproto[6]; -static constexpr ::_pb::ServiceDescriptor const** file_level_service_descriptors_appearances_2eproto = nullptr; - -const uint32_t TableStruct_appearances_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Coordinate, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Coordinate, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Coordinate, _impl_.x_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Coordinate, _impl_.y_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Coordinate, _impl_.z_), - 0, - 1, - 2, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Appearances, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Appearances, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Appearances, _impl_.object_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Appearances, _impl_.outfit_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Appearances, _impl_.effect_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Appearances, _impl_.missile_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Appearances, _impl_.special_meaning_appearance_ids_), - ~0u, - ~0u, - ~0u, - ~0u, - 0, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpritePhase, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpritePhase, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpritePhase, _impl_.duration_min_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpritePhase, _impl_.duration_max_), - 0, - 1, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpriteAnimation, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpriteAnimation, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpriteAnimation, _impl_.default_start_phase_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpriteAnimation, _impl_.synchronized_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpriteAnimation, _impl_.random_start_phase_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpriteAnimation, _impl_.loop_type_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpriteAnimation, _impl_.loop_count_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpriteAnimation, _impl_.sprite_phase_), - 0, - 1, - 2, - 4, - 3, - ~0u, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Box, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Box, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Box, _impl_.x_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Box, _impl_.y_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Box, _impl_.width_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Box, _impl_.height_), - 0, - 1, - 2, - 3, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpriteInfo, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpriteInfo, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpriteInfo, _impl_.pattern_width_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpriteInfo, _impl_.pattern_height_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpriteInfo, _impl_.pattern_depth_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpriteInfo, _impl_.layers_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpriteInfo, _impl_.sprite_id_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpriteInfo, _impl_.bounding_square_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpriteInfo, _impl_.animation_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpriteInfo, _impl_.is_opaque_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpriteInfo, _impl_.bounding_box_per_direction_), - 1, - 2, - 3, - 4, - ~0u, - 5, - 0, - 6, - ~0u, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::FrameGroup, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::FrameGroup, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::FrameGroup, _impl_.fixed_frame_group_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::FrameGroup, _impl_.id_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::FrameGroup, _impl_.sprite_info_), - 1, - 2, - 0, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Appearance, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Appearance, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Appearance, _impl_.id_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Appearance, _impl_.frame_group_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Appearance, _impl_.flags_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Appearance, _impl_.name_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::Appearance, _impl_.description_), - 3, - ~0u, - 2, - 0, - 1, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.bank_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.clip_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.bottom_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.top_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.container_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.cumulative_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.usable_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.forceuse_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.multiuse_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.write_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.write_once_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.liquidpool_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.unpass_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.unmove_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.unsight_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.avoid_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.no_movement_animation_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.take_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.liquidcontainer_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.hang_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.hook_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.rotate_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.light_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.dont_hide_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.translucent_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.shift_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.height_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.lying_object_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.animate_always_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.automap_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.lenshelp_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.fullbank_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.ignore_look_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.clothes_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.default_action_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.market_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.wrap_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.unwrap_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.topeffect_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.npcsaledata_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.changedtoexpire_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.corpse_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.player_corpse_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.cyclopediaitem_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.ammo_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.show_off_socket_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.reportable_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.upgradeclassification_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.reverse_addons_east_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.reverse_addons_west_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.reverse_addons_south_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.reverse_addons_north_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.wearout_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.clockexpire_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.expire_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.expirestop_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlags, _impl_.wrapkit_), - 0, - 15, - 16, - 17, - 18, - 19, - 20, - 21, - 22, - 1, - 2, - 23, - 24, - 25, - 26, - 27, - 28, - 29, - 30, - 31, - 3, - 32, - 4, - 33, - 34, - 5, - 6, - 35, - 36, - 7, - 8, - 37, - 38, - 9, - 10, - 11, - 39, - 40, - 41, - ~0u, - 12, - 42, - 43, - 13, - 44, - 45, - 46, - 14, - 47, - 48, - 49, - 50, - 51, - 52, - 53, - 54, - 55, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification, _impl_.upgrade_classification_), - 0, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagBank, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagBank, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagBank, _impl_.waypoints_), - 0, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagWrite, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagWrite, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagWrite, _impl_.max_text_length_), - 0, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagWriteOnce, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagWriteOnce, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagWriteOnce, _impl_.max_text_length_once_), - 0, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagLight, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagLight, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagLight, _impl_.brightness_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagLight, _impl_.color_), - 0, - 1, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagHeight, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagHeight, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagHeight, _impl_.elevation_), - 0, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagShift, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagShift, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagShift, _impl_.x_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagShift, _impl_.y_), - 0, - 1, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagClothes, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagClothes, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagClothes, _impl_.slot_), - 0, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagDefaultAction, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagDefaultAction, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagDefaultAction, _impl_.action_), - 0, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagMarket, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagMarket, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagMarket, _impl_.category_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagMarket, _impl_.trade_as_object_id_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagMarket, _impl_.show_as_object_id_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagMarket, _impl_.restrict_to_profession_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagMarket, _impl_.minimum_level_), - 3, - 0, - 1, - ~0u, - 2, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagNPC, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagNPC, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagNPC, _impl_.name_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagNPC, _impl_.location_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagNPC, _impl_.sale_price_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagNPC, _impl_.buy_price_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagNPC, _impl_.currency_object_type_id_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagNPC, _impl_.currency_quest_flag_display_name_), - 0, - 1, - 3, - 4, - 5, - 2, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagAutomap, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagAutomap, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagAutomap, _impl_.color_), - 0, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagHook, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagHook, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagHook, _impl_.direction_), - 0, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagLenshelp, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagLenshelp, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagLenshelp, _impl_.id_), - 0, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagChangedToExpire, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagChangedToExpire, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagChangedToExpire, _impl_.former_object_typeid_), - 0, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagCyclopedia, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagCyclopedia, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::AppearanceFlagCyclopedia, _impl_.cyclopedia_type_), - 0, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpecialMeaningAppearanceIds, _impl_._has_bits_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpecialMeaningAppearanceIds, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpecialMeaningAppearanceIds, _impl_.gold_coin_id_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpecialMeaningAppearanceIds, _impl_.platinum_coin_id_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpecialMeaningAppearanceIds, _impl_.crystal_coin_id_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpecialMeaningAppearanceIds, _impl_.tibia_coin_id_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpecialMeaningAppearanceIds, _impl_.stamped_letter_id_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpecialMeaningAppearanceIds, _impl_.supply_stash_id_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::appearances::SpecialMeaningAppearanceIds, _impl_.reward_chest_id_), - 0, - 1, - 2, - 3, - 4, - 5, - 6, -}; -static const ::_pbi::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { - { 0, 9, -1, sizeof(::Canary::protobuf::appearances::Coordinate)}, - { 12, 23, -1, sizeof(::Canary::protobuf::appearances::Appearances)}, - { 28, 36, -1, sizeof(::Canary::protobuf::appearances::SpritePhase)}, - { 38, 50, -1, sizeof(::Canary::protobuf::appearances::SpriteAnimation)}, - { 56, 66, -1, sizeof(::Canary::protobuf::appearances::Box)}, - { 70, 85, -1, sizeof(::Canary::protobuf::appearances::SpriteInfo)}, - { 94, 103, -1, sizeof(::Canary::protobuf::appearances::FrameGroup)}, - { 106, 117, -1, sizeof(::Canary::protobuf::appearances::Appearance)}, - { 122, 185, -1, sizeof(::Canary::protobuf::appearances::AppearanceFlags)}, - { 242, 249, -1, sizeof(::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification)}, - { 250, 257, -1, sizeof(::Canary::protobuf::appearances::AppearanceFlagBank)}, - { 258, 265, -1, sizeof(::Canary::protobuf::appearances::AppearanceFlagWrite)}, - { 266, 273, -1, sizeof(::Canary::protobuf::appearances::AppearanceFlagWriteOnce)}, - { 274, 282, -1, sizeof(::Canary::protobuf::appearances::AppearanceFlagLight)}, - { 284, 291, -1, sizeof(::Canary::protobuf::appearances::AppearanceFlagHeight)}, - { 292, 300, -1, sizeof(::Canary::protobuf::appearances::AppearanceFlagShift)}, - { 302, 309, -1, sizeof(::Canary::protobuf::appearances::AppearanceFlagClothes)}, - { 310, 317, -1, sizeof(::Canary::protobuf::appearances::AppearanceFlagDefaultAction)}, - { 318, 329, -1, sizeof(::Canary::protobuf::appearances::AppearanceFlagMarket)}, - { 334, 346, -1, sizeof(::Canary::protobuf::appearances::AppearanceFlagNPC)}, - { 352, 359, -1, sizeof(::Canary::protobuf::appearances::AppearanceFlagAutomap)}, - { 360, 367, -1, sizeof(::Canary::protobuf::appearances::AppearanceFlagHook)}, - { 368, 375, -1, sizeof(::Canary::protobuf::appearances::AppearanceFlagLenshelp)}, - { 376, 383, -1, sizeof(::Canary::protobuf::appearances::AppearanceFlagChangedToExpire)}, - { 384, 391, -1, sizeof(::Canary::protobuf::appearances::AppearanceFlagCyclopedia)}, - { 392, 405, -1, sizeof(::Canary::protobuf::appearances::SpecialMeaningAppearanceIds)}, -}; - -static const ::_pb::Message* const file_default_instances[] = { - &::Canary::protobuf::appearances::_Coordinate_default_instance_._instance, - &::Canary::protobuf::appearances::_Appearances_default_instance_._instance, - &::Canary::protobuf::appearances::_SpritePhase_default_instance_._instance, - &::Canary::protobuf::appearances::_SpriteAnimation_default_instance_._instance, - &::Canary::protobuf::appearances::_Box_default_instance_._instance, - &::Canary::protobuf::appearances::_SpriteInfo_default_instance_._instance, - &::Canary::protobuf::appearances::_FrameGroup_default_instance_._instance, - &::Canary::protobuf::appearances::_Appearance_default_instance_._instance, - &::Canary::protobuf::appearances::_AppearanceFlags_default_instance_._instance, - &::Canary::protobuf::appearances::_AppearanceFlagUpgradeClassification_default_instance_._instance, - &::Canary::protobuf::appearances::_AppearanceFlagBank_default_instance_._instance, - &::Canary::protobuf::appearances::_AppearanceFlagWrite_default_instance_._instance, - &::Canary::protobuf::appearances::_AppearanceFlagWriteOnce_default_instance_._instance, - &::Canary::protobuf::appearances::_AppearanceFlagLight_default_instance_._instance, - &::Canary::protobuf::appearances::_AppearanceFlagHeight_default_instance_._instance, - &::Canary::protobuf::appearances::_AppearanceFlagShift_default_instance_._instance, - &::Canary::protobuf::appearances::_AppearanceFlagClothes_default_instance_._instance, - &::Canary::protobuf::appearances::_AppearanceFlagDefaultAction_default_instance_._instance, - &::Canary::protobuf::appearances::_AppearanceFlagMarket_default_instance_._instance, - &::Canary::protobuf::appearances::_AppearanceFlagNPC_default_instance_._instance, - &::Canary::protobuf::appearances::_AppearanceFlagAutomap_default_instance_._instance, - &::Canary::protobuf::appearances::_AppearanceFlagHook_default_instance_._instance, - &::Canary::protobuf::appearances::_AppearanceFlagLenshelp_default_instance_._instance, - &::Canary::protobuf::appearances::_AppearanceFlagChangedToExpire_default_instance_._instance, - &::Canary::protobuf::appearances::_AppearanceFlagCyclopedia_default_instance_._instance, - &::Canary::protobuf::appearances::_SpecialMeaningAppearanceIds_default_instance_._instance, -}; - -const char descriptor_table_protodef_appearances_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = - "\n\021appearances.proto\022\033Canary.protobuf.app" - "earances\"-\n\nCoordinate\022\t\n\001x\030\001 \001(\r\022\t\n\001y\030\002" - " \001(\r\022\t\n\001z\030\003 \001(\r\"\324\002\n\013Appearances\0227\n\006objec" - "t\030\001 \003(\0132\'.Canary.protobuf.appearances.Ap" - "pearance\0227\n\006outfit\030\002 \003(\0132\'.Canary.protob" - "uf.appearances.Appearance\0227\n\006effect\030\003 \003(" - "\0132\'.Canary.protobuf.appearances.Appearan" - "ce\0228\n\007missile\030\004 \003(\0132\'.Canary.protobuf.ap" - "pearances.Appearance\022`\n\036special_meaning_" - "appearance_ids\030\005 \001(\01328.Canary.protobuf.a" - "ppearances.SpecialMeaningAppearanceIds\"9" - "\n\013SpritePhase\022\024\n\014duration_min\030\001 \001(\r\022\024\n\014d" - "uration_max\030\002 \001(\r\"\371\001\n\017SpriteAnimation\022\033\n" - "\023default_start_phase\030\001 \001(\r\022\024\n\014synchroniz" - "ed\030\002 \001(\010\022\032\n\022random_start_phase\030\003 \001(\010\022C\n\t" - "loop_type\030\004 \001(\01620.Canary.protobuf.appear" - "ances.ANIMATION_LOOP_TYPE\022\022\n\nloop_count\030" - "\005 \001(\r\022>\n\014sprite_phase\030\006 \003(\0132(.Canary.pro" - "tobuf.appearances.SpritePhase\":\n\003Box\022\t\n\001" - "x\030\001 \001(\r\022\t\n\001y\030\002 \001(\r\022\r\n\005width\030\003 \001(\r\022\016\n\006hei" - "ght\030\004 \001(\r\"\250\002\n\nSpriteInfo\022\025\n\rpattern_widt" - "h\030\001 \001(\r\022\026\n\016pattern_height\030\002 \001(\r\022\025\n\rpatte" - "rn_depth\030\003 \001(\r\022\016\n\006layers\030\004 \001(\r\022\021\n\tsprite" - "_id\030\005 \003(\r\022\027\n\017bounding_square\030\007 \001(\r\022\?\n\tan" - "imation\030\006 \001(\0132,.Canary.protobuf.appearan" - "ces.SpriteAnimation\022\021\n\tis_opaque\030\010 \001(\010\022D" - "\n\032bounding_box_per_direction\030\t \003(\0132 .Can" - "ary.protobuf.appearances.Box\"\241\001\n\nFrameGr" - "oup\022I\n\021fixed_frame_group\030\001 \001(\0162..Canary." - "protobuf.appearances.FIXED_FRAME_GROUP\022\n" - "\n\002id\030\002 \001(\r\022<\n\013sprite_info\030\003 \001(\0132\'.Canary" - ".protobuf.appearances.SpriteInfo\"\266\001\n\nApp" - "earance\022\n\n\002id\030\001 \001(\r\022<\n\013frame_group\030\002 \003(\013" - "2\'.Canary.protobuf.appearances.FrameGrou" - "p\022;\n\005flags\030\003 \001(\0132,.Canary.protobuf.appea" - "rances.AppearanceFlags\022\014\n\004name\030\004 \001(\014\022\023\n\013" - "description\030\005 \001(\014\"\256\017\n\017AppearanceFlags\022=\n" - "\004bank\030\001 \001(\0132/.Canary.protobuf.appearance" - "s.AppearanceFlagBank\022\014\n\004clip\030\002 \001(\010\022\016\n\006bo" - "ttom\030\003 \001(\010\022\013\n\003top\030\004 \001(\010\022\021\n\tcontainer\030\005 \001" - "(\010\022\022\n\ncumulative\030\006 \001(\010\022\016\n\006usable\030\007 \001(\010\022\020" - "\n\010forceuse\030\010 \001(\010\022\020\n\010multiuse\030\t \001(\010\022\?\n\005wr" - "ite\030\n \001(\01320.Canary.protobuf.appearances." - "AppearanceFlagWrite\022H\n\nwrite_once\030\013 \001(\0132" - "4.Canary.protobuf.appearances.Appearance" - "FlagWriteOnce\022\022\n\nliquidpool\030\014 \001(\010\022\016\n\006unp" - "ass\030\r \001(\010\022\016\n\006unmove\030\016 \001(\010\022\017\n\007unsight\030\017 \001" - "(\010\022\r\n\005avoid\030\020 \001(\010\022\035\n\025no_movement_animati" - "on\030\021 \001(\010\022\014\n\004take\030\022 \001(\010\022\027\n\017liquidcontaine" - "r\030\023 \001(\010\022\014\n\004hang\030\024 \001(\010\022=\n\004hook\030\025 \001(\0132/.Ca" - "nary.protobuf.appearances.AppearanceFlag" - "Hook\022\016\n\006rotate\030\026 \001(\010\022\?\n\005light\030\027 \001(\01320.Ca" - "nary.protobuf.appearances.AppearanceFlag" - "Light\022\021\n\tdont_hide\030\030 \001(\010\022\023\n\013translucent\030" - "\031 \001(\010\022\?\n\005shift\030\032 \001(\01320.Canary.protobuf.a" - "ppearances.AppearanceFlagShift\022A\n\006height" - "\030\033 \001(\01321.Canary.protobuf.appearances.App" - "earanceFlagHeight\022\024\n\014lying_object\030\034 \001(\010\022" - "\026\n\016animate_always\030\035 \001(\010\022C\n\007automap\030\036 \001(\013" - "22.Canary.protobuf.appearances.Appearanc" - "eFlagAutomap\022E\n\010lenshelp\030\037 \001(\01323.Canary." - "protobuf.appearances.AppearanceFlagLensh" - "elp\022\020\n\010fullbank\030 \001(\010\022\023\n\013ignore_look\030! \001" - "(\010\022C\n\007clothes\030\" \001(\01322.Canary.protobuf.ap" - "pearances.AppearanceFlagClothes\022P\n\016defau" - "lt_action\030# \001(\01328.Canary.protobuf.appear" - "ances.AppearanceFlagDefaultAction\022A\n\006mar" - "ket\030$ \001(\01321.Canary.protobuf.appearances." - "AppearanceFlagMarket\022\014\n\004wrap\030% \001(\010\022\016\n\006un" - "wrap\030& \001(\010\022\021\n\ttopeffect\030\' \001(\010\022C\n\013npcsale" - "data\030( \003(\0132..Canary.protobuf.appearances" - ".AppearanceFlagNPC\022S\n\017changedtoexpire\030) " - "\001(\0132:.Canary.protobuf.appearances.Appear" - "anceFlagChangedToExpire\022\016\n\006corpse\030* \001(\010\022" - "\025\n\rplayer_corpse\030+ \001(\010\022M\n\016cyclopediaitem" - "\030, \001(\01325.Canary.protobuf.appearances.App" - "earanceFlagCyclopedia\022\014\n\004ammo\030- \001(\010\022\027\n\017s" - "how_off_socket\030. \001(\010\022\022\n\nreportable\030/ \001(\010" - "\022_\n\025upgradeclassification\0300 \001(\0132@.Canary" - ".protobuf.appearances.AppearanceFlagUpgr" - "adeClassification\022\033\n\023reverse_addons_east" - "\0301 \001(\010\022\033\n\023reverse_addons_west\0302 \001(\010\022\034\n\024r" - "everse_addons_south\0303 \001(\010\022\034\n\024reverse_add" - "ons_north\0304 \001(\010\022\017\n\007wearout\0305 \001(\010\022\023\n\013cloc" - "kexpire\0306 \001(\010\022\016\n\006expire\0307 \001(\010\022\022\n\nexpires" - "top\0308 \001(\010\022\017\n\007wrapkit\0309 \001(\010\"E\n#Appearance" - "FlagUpgradeClassification\022\036\n\026upgrade_cla" - "ssification\030\001 \001(\r\"\'\n\022AppearanceFlagBank\022" - "\021\n\twaypoints\030\001 \001(\r\".\n\023AppearanceFlagWrit" - "e\022\027\n\017max_text_length\030\001 \001(\r\"7\n\027Appearance" - "FlagWriteOnce\022\034\n\024max_text_length_once\030\001 " - "\001(\r\"8\n\023AppearanceFlagLight\022\022\n\nbrightness" - "\030\001 \001(\r\022\r\n\005color\030\002 \001(\r\")\n\024AppearanceFlagH" - "eight\022\021\n\televation\030\001 \001(\r\"+\n\023AppearanceFl" - "agShift\022\t\n\001x\030\001 \001(\r\022\t\n\001y\030\002 \001(\r\"%\n\025Appeara" - "nceFlagClothes\022\014\n\004slot\030\001 \001(\r\"Y\n\033Appearan" - "ceFlagDefaultAction\022:\n\006action\030\001 \001(\0162*.Ca" - "nary.protobuf.appearances.PLAYER_ACTION\"" - "\362\001\n\024AppearanceFlagMarket\022<\n\010category\030\001 \001" - "(\0162*.Canary.protobuf.appearances.ITEM_CA" - "TEGORY\022\032\n\022trade_as_object_id\030\002 \001(\r\022\031\n\021sh" - "ow_as_object_id\030\003 \001(\r\022N\n\026restrict_to_pro" - "fession\030\005 \003(\0162..Canary.protobuf.appearan" - "ces.PLAYER_PROFESSION\022\025\n\rminimum_level\030\006" - " \001(\r\"\245\001\n\021AppearanceFlagNPC\022\014\n\004name\030\001 \001(\014" - "\022\020\n\010location\030\002 \001(\014\022\022\n\nsale_price\030\003 \001(\r\022\021" - "\n\tbuy_price\030\004 \001(\r\022\037\n\027currency_object_typ" - "e_id\030\005 \001(\r\022(\n currency_quest_flag_displa" - "y_name\030\006 \001(\014\"&\n\025AppearanceFlagAutomap\022\r\n" - "\005color\030\001 \001(\r\"O\n\022AppearanceFlagHook\0229\n\tdi" - "rection\030\001 \001(\0162&.Canary.protobuf.appearan" - "ces.HOOK_TYPE\"$\n\026AppearanceFlagLenshelp\022" - "\n\n\002id\030\001 \001(\r\"=\n\035AppearanceFlagChangedToEx" - "pire\022\034\n\024former_object_typeid\030\001 \001(\r\"3\n\030Ap" - "pearanceFlagCyclopedia\022\027\n\017cyclopedia_typ" - "e\030\001 \001(\r\"\312\001\n\033SpecialMeaningAppearanceIds\022" - "\024\n\014gold_coin_id\030\001 \001(\r\022\030\n\020platinum_coin_i" - "d\030\002 \001(\r\022\027\n\017crystal_coin_id\030\003 \001(\r\022\025\n\rtibi" - "a_coin_id\030\004 \001(\r\022\031\n\021stamped_letter_id\030\005 \001" - "(\r\022\027\n\017supply_stash_id\030\006 \001(\r\022\027\n\017reward_ch" - "est_id\030\007 \001(\r*\224\001\n\rPLAYER_ACTION\022\026\n\022PLAYER" - "_ACTION_NONE\020\000\022\026\n\022PLAYER_ACTION_LOOK\020\001\022\025" - "\n\021PLAYER_ACTION_USE\020\002\022\026\n\022PLAYER_ACTION_O" - "PEN\020\003\022$\n PLAYER_ACTION_AUTOWALK_HIGHLIGH" - "T\020\004*\315\005\n\rITEM_CATEGORY\022\030\n\024ITEM_CATEGORY_A" - "RMORS\020\001\022\031\n\025ITEM_CATEGORY_AMULETS\020\002\022\027\n\023IT" - "EM_CATEGORY_BOOTS\020\003\022\034\n\030ITEM_CATEGORY_CON" - "TAINERS\020\004\022\034\n\030ITEM_CATEGORY_DECORATION\020\005\022" - "\026\n\022ITEM_CATEGORY_FOOD\020\006\022\036\n\032ITEM_CATEGORY" - "_HELMETS_HATS\020\007\022\026\n\022ITEM_CATEGORY_LEGS\020\010\022" - "\030\n\024ITEM_CATEGORY_OTHERS\020\t\022\031\n\025ITEM_CATEGO" - "RY_POTIONS\020\n\022\027\n\023ITEM_CATEGORY_RINGS\020\013\022\027\n" - "\023ITEM_CATEGORY_RUNES\020\014\022\031\n\025ITEM_CATEGORY_" - "SHIELDS\020\r\022\027\n\023ITEM_CATEGORY_TOOLS\020\016\022\033\n\027IT" - "EM_CATEGORY_VALUABLES\020\017\022\034\n\030ITEM_CATEGORY" - "_AMMUNITION\020\020\022\026\n\022ITEM_CATEGORY_AXES\020\021\022\027\n" - "\023ITEM_CATEGORY_CLUBS\020\022\022\"\n\036ITEM_CATEGORY_" - "DISTANCE_WEAPONS\020\023\022\030\n\024ITEM_CATEGORY_SWOR" - "DS\020\024\022\034\n\030ITEM_CATEGORY_WANDS_RODS\020\025\022!\n\035IT" - "EM_CATEGORY_PREMIUM_SCROLLS\020\026\022\035\n\031ITEM_CA" - "TEGORY_TIBIA_COINS\020\027\022#\n\037ITEM_CATEGORY_CR" - "EATURE_PRODUCTS\020\030\022\030\n\024ITEM_CATEGORY_QUIVE" - "R\020\031*\355\001\n\021PLAYER_PROFESSION\022\"\n\025PLAYER_PROF" - "ESSION_ANY\020\377\377\377\377\377\377\377\377\377\001\022\032\n\026PLAYER_PROFESSI" - "ON_NONE\020\000\022\034\n\030PLAYER_PROFESSION_KNIGHT\020\001\022" - "\035\n\031PLAYER_PROFESSION_PALADIN\020\002\022\036\n\032PLAYER" - "_PROFESSION_SORCERER\020\003\022\033\n\027PLAYER_PROFESS" - "ION_DRUID\020\004\022\036\n\032PLAYER_PROFESSION_PROMOTE" - "D\020\n*\203\001\n\023ANIMATION_LOOP_TYPE\022)\n\034ANIMATION" - "_LOOP_TYPE_PINGPONG\020\377\377\377\377\377\377\377\377\377\001\022 \n\034ANIMAT" - "ION_LOOP_TYPE_INFINITE\020\000\022\037\n\033ANIMATION_LO" - "OP_TYPE_COUNTED\020\001*4\n\tHOOK_TYPE\022\023\n\017HOOK_T" - "YPE_SOUTH\020\001\022\022\n\016HOOK_TYPE_EAST\020\002*\201\001\n\021FIXE" - "D_FRAME_GROUP\022!\n\035FIXED_FRAME_GROUP_OUTFI" - "T_IDLE\020\000\022#\n\037FIXED_FRAME_GROUP_OUTFIT_MOV" - "ING\020\001\022$\n FIXED_FRAME_GROUP_OBJECT_INITIA" - "L\020\002" - ; -static ::_pbi::once_flag descriptor_table_appearances_2eproto_once; -const ::_pbi::DescriptorTable descriptor_table_appearances_2eproto = { - false, false, 6243, descriptor_table_protodef_appearances_2eproto, - "appearances.proto", - &descriptor_table_appearances_2eproto_once, nullptr, 0, 26, - schemas, file_default_instances, TableStruct_appearances_2eproto::offsets, - file_level_metadata_appearances_2eproto, file_level_enum_descriptors_appearances_2eproto, - file_level_service_descriptors_appearances_2eproto, -}; -PROTOBUF_ATTRIBUTE_WEAK const ::_pbi::DescriptorTable* descriptor_table_appearances_2eproto_getter() { - return &descriptor_table_appearances_2eproto; -} - -// Force running AddDescriptors() at dynamic initialization time. -PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_appearances_2eproto(&descriptor_table_appearances_2eproto); -namespace Canary { -namespace protobuf { -namespace appearances { -const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* PLAYER_ACTION_descriptor() { - ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_appearances_2eproto); - return file_level_enum_descriptors_appearances_2eproto[0]; -} -bool PLAYER_ACTION_IsValid(int value) { - switch (value) { - case 0: - case 1: - case 2: - case 3: - case 4: - return true; - default: - return false; - } -} - -const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* ITEM_CATEGORY_descriptor() { - ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_appearances_2eproto); - return file_level_enum_descriptors_appearances_2eproto[1]; -} -bool ITEM_CATEGORY_IsValid(int value) { - switch (value) { - case 1: - case 2: - case 3: - case 4: - case 5: - case 6: - case 7: - case 8: - case 9: - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 16: - case 17: - case 18: - case 19: - case 20: - case 21: - case 22: - case 23: - case 24: - case 25: - return true; - default: - return false; - } -} - -const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* PLAYER_PROFESSION_descriptor() { - ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_appearances_2eproto); - return file_level_enum_descriptors_appearances_2eproto[2]; -} -bool PLAYER_PROFESSION_IsValid(int value) { - switch (value) { - case -1: - case 0: - case 1: - case 2: - case 3: - case 4: - case 10: - return true; - default: - return false; - } -} - -const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* ANIMATION_LOOP_TYPE_descriptor() { - ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_appearances_2eproto); - return file_level_enum_descriptors_appearances_2eproto[3]; -} -bool ANIMATION_LOOP_TYPE_IsValid(int value) { - switch (value) { - case -1: - case 0: - case 1: - return true; - default: - return false; - } -} - -const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* HOOK_TYPE_descriptor() { - ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_appearances_2eproto); - return file_level_enum_descriptors_appearances_2eproto[4]; -} -bool HOOK_TYPE_IsValid(int value) { - switch (value) { - case 1: - case 2: - return true; - default: - return false; - } -} - -const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* FIXED_FRAME_GROUP_descriptor() { - ::PROTOBUF_NAMESPACE_ID::internal::AssignDescriptors(&descriptor_table_appearances_2eproto); - return file_level_enum_descriptors_appearances_2eproto[5]; -} -bool FIXED_FRAME_GROUP_IsValid(int value) { - switch (value) { - case 0: - case 1: - case 2: - return true; - default: - return false; - } -} - - -// =================================================================== - -class Coordinate::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_x(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } - static void set_has_y(HasBits* has_bits) { - (*has_bits)[0] |= 2u; - } - static void set_has_z(HasBits* has_bits) { - (*has_bits)[0] |= 4u; - } -}; - -Coordinate::Coordinate(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.Coordinate) -} -Coordinate::Coordinate(const Coordinate& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - Coordinate* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.x_){} - , decltype(_impl_.y_){} - , decltype(_impl_.z_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - ::memcpy(&_impl_.x_, &from._impl_.x_, - static_cast(reinterpret_cast(&_impl_.z_) - - reinterpret_cast(&_impl_.x_)) + sizeof(_impl_.z_)); - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.Coordinate) -} - -inline void Coordinate::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.x_){0u} - , decltype(_impl_.y_){0u} - , decltype(_impl_.z_){0u} - }; -} - -Coordinate::~Coordinate() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.Coordinate) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void Coordinate::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); -} - -void Coordinate::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void Coordinate::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.Coordinate) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000007u) { - ::memset(&_impl_.x_, 0, static_cast( - reinterpret_cast(&_impl_.z_) - - reinterpret_cast(&_impl_.x_)) + sizeof(_impl_.z_)); - } - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* Coordinate::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional uint32 x = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - _Internal::set_has_x(&has_bits); - _impl_.x_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 y = 2; - case 2: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 16)) { - _Internal::set_has_y(&has_bits); - _impl_.y_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 z = 3; - case 3: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 24)) { - _Internal::set_has_z(&has_bits); - _impl_.z_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* Coordinate::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.Coordinate) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional uint32 x = 1; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(1, this->_internal_x(), target); - } - - // optional uint32 y = 2; - if (cached_has_bits & 0x00000002u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(2, this->_internal_y(), target); - } - - // optional uint32 z = 3; - if (cached_has_bits & 0x00000004u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(3, this->_internal_z(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.Coordinate) - return target; -} - -size_t Coordinate::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.Coordinate) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000007u) { - // optional uint32 x = 1; - if (cached_has_bits & 0x00000001u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_x()); - } - - // optional uint32 y = 2; - if (cached_has_bits & 0x00000002u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_y()); - } - - // optional uint32 z = 3; - if (cached_has_bits & 0x00000004u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_z()); - } - - } - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData Coordinate::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - Coordinate::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*Coordinate::GetClassData() const { return &_class_data_; } - - -void Coordinate::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.Coordinate) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = from._impl_._has_bits_[0]; - if (cached_has_bits & 0x00000007u) { - if (cached_has_bits & 0x00000001u) { - _this->_impl_.x_ = from._impl_.x_; - } - if (cached_has_bits & 0x00000002u) { - _this->_impl_.y_ = from._impl_.y_; - } - if (cached_has_bits & 0x00000004u) { - _this->_impl_.z_ = from._impl_.z_; - } - _this->_impl_._has_bits_[0] |= cached_has_bits; - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void Coordinate::CopyFrom(const Coordinate& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.Coordinate) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool Coordinate::IsInitialized() const { - return true; -} - -void Coordinate::InternalSwap(Coordinate* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - ::PROTOBUF_NAMESPACE_ID::internal::memswap< - PROTOBUF_FIELD_OFFSET(Coordinate, _impl_.z_) - + sizeof(Coordinate::_impl_.z_) - - PROTOBUF_FIELD_OFFSET(Coordinate, _impl_.x_)>( - reinterpret_cast(&_impl_.x_), - reinterpret_cast(&other->_impl_.x_)); -} - -::PROTOBUF_NAMESPACE_ID::Metadata Coordinate::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[0]); -} - -// =================================================================== - -class Appearances::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static const ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds& special_meaning_appearance_ids(const Appearances* msg); - static void set_has_special_meaning_appearance_ids(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } -}; - -const ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds& -Appearances::_Internal::special_meaning_appearance_ids(const Appearances* msg) { - return *msg->_impl_.special_meaning_appearance_ids_; -} -Appearances::Appearances(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.Appearances) -} -Appearances::Appearances(const Appearances& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - Appearances* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.object_){from._impl_.object_} - , decltype(_impl_.outfit_){from._impl_.outfit_} - , decltype(_impl_.effect_){from._impl_.effect_} - , decltype(_impl_.missile_){from._impl_.missile_} - , decltype(_impl_.special_meaning_appearance_ids_){nullptr}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - if (from._internal_has_special_meaning_appearance_ids()) { - _this->_impl_.special_meaning_appearance_ids_ = new ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds(*from._impl_.special_meaning_appearance_ids_); - } - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.Appearances) -} - -inline void Appearances::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.object_){arena} - , decltype(_impl_.outfit_){arena} - , decltype(_impl_.effect_){arena} - , decltype(_impl_.missile_){arena} - , decltype(_impl_.special_meaning_appearance_ids_){nullptr} - }; -} - -Appearances::~Appearances() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.Appearances) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void Appearances::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); - _impl_.object_.~RepeatedPtrField(); - _impl_.outfit_.~RepeatedPtrField(); - _impl_.effect_.~RepeatedPtrField(); - _impl_.missile_.~RepeatedPtrField(); - if (this != internal_default_instance()) delete _impl_.special_meaning_appearance_ids_; -} - -void Appearances::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void Appearances::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.Appearances) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.object_.Clear(); - _impl_.outfit_.Clear(); - _impl_.effect_.Clear(); - _impl_.missile_.Clear(); - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000001u) { - GOOGLE_DCHECK(_impl_.special_meaning_appearance_ids_ != nullptr); - _impl_.special_meaning_appearance_ids_->Clear(); - } - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* Appearances::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // repeated .Canary.protobuf.appearances.Appearance object = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 10)) { - ptr -= 1; - do { - ptr += 1; - ptr = ctx->ParseMessage(_internal_add_object(), ptr); - CHK_(ptr); - if (!ctx->DataAvailable(ptr)) break; - } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<10>(ptr)); - } else - goto handle_unusual; - continue; - // repeated .Canary.protobuf.appearances.Appearance outfit = 2; - case 2: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 18)) { - ptr -= 1; - do { - ptr += 1; - ptr = ctx->ParseMessage(_internal_add_outfit(), ptr); - CHK_(ptr); - if (!ctx->DataAvailable(ptr)) break; - } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<18>(ptr)); - } else - goto handle_unusual; - continue; - // repeated .Canary.protobuf.appearances.Appearance effect = 3; - case 3: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 26)) { - ptr -= 1; - do { - ptr += 1; - ptr = ctx->ParseMessage(_internal_add_effect(), ptr); - CHK_(ptr); - if (!ctx->DataAvailable(ptr)) break; - } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<26>(ptr)); - } else - goto handle_unusual; - continue; - // repeated .Canary.protobuf.appearances.Appearance missile = 4; - case 4: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 34)) { - ptr -= 1; - do { - ptr += 1; - ptr = ctx->ParseMessage(_internal_add_missile(), ptr); - CHK_(ptr); - if (!ctx->DataAvailable(ptr)) break; - } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<34>(ptr)); - } else - goto handle_unusual; - continue; - // optional .Canary.protobuf.appearances.SpecialMeaningAppearanceIds special_meaning_appearance_ids = 5; - case 5: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 42)) { - ptr = ctx->ParseMessage(_internal_mutable_special_meaning_appearance_ids(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* Appearances::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.Appearances) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - // repeated .Canary.protobuf.appearances.Appearance object = 1; - for (unsigned i = 0, - n = static_cast(this->_internal_object_size()); i < n; i++) { - const auto& repfield = this->_internal_object(i); - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(1, repfield, repfield.GetCachedSize(), target, stream); - } - - // repeated .Canary.protobuf.appearances.Appearance outfit = 2; - for (unsigned i = 0, - n = static_cast(this->_internal_outfit_size()); i < n; i++) { - const auto& repfield = this->_internal_outfit(i); - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(2, repfield, repfield.GetCachedSize(), target, stream); - } - - // repeated .Canary.protobuf.appearances.Appearance effect = 3; - for (unsigned i = 0, - n = static_cast(this->_internal_effect_size()); i < n; i++) { - const auto& repfield = this->_internal_effect(i); - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(3, repfield, repfield.GetCachedSize(), target, stream); - } - - // repeated .Canary.protobuf.appearances.Appearance missile = 4; - for (unsigned i = 0, - n = static_cast(this->_internal_missile_size()); i < n; i++) { - const auto& repfield = this->_internal_missile(i); - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(4, repfield, repfield.GetCachedSize(), target, stream); - } - - cached_has_bits = _impl_._has_bits_[0]; - // optional .Canary.protobuf.appearances.SpecialMeaningAppearanceIds special_meaning_appearance_ids = 5; - if (cached_has_bits & 0x00000001u) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(5, _Internal::special_meaning_appearance_ids(this), - _Internal::special_meaning_appearance_ids(this).GetCachedSize(), target, stream); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.Appearances) - return target; -} - -size_t Appearances::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.Appearances) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // repeated .Canary.protobuf.appearances.Appearance object = 1; - total_size += 1UL * this->_internal_object_size(); - for (const auto& msg : this->_impl_.object_) { - total_size += - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg); - } - - // repeated .Canary.protobuf.appearances.Appearance outfit = 2; - total_size += 1UL * this->_internal_outfit_size(); - for (const auto& msg : this->_impl_.outfit_) { - total_size += - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg); - } - - // repeated .Canary.protobuf.appearances.Appearance effect = 3; - total_size += 1UL * this->_internal_effect_size(); - for (const auto& msg : this->_impl_.effect_) { - total_size += - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg); - } - - // repeated .Canary.protobuf.appearances.Appearance missile = 4; - total_size += 1UL * this->_internal_missile_size(); - for (const auto& msg : this->_impl_.missile_) { - total_size += - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg); - } - - // optional .Canary.protobuf.appearances.SpecialMeaningAppearanceIds special_meaning_appearance_ids = 5; - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000001u) { - total_size += 1 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.special_meaning_appearance_ids_); - } - - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData Appearances::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - Appearances::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*Appearances::GetClassData() const { return &_class_data_; } - - -void Appearances::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.Appearances) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - _this->_impl_.object_.MergeFrom(from._impl_.object_); - _this->_impl_.outfit_.MergeFrom(from._impl_.outfit_); - _this->_impl_.effect_.MergeFrom(from._impl_.effect_); - _this->_impl_.missile_.MergeFrom(from._impl_.missile_); - if (from._internal_has_special_meaning_appearance_ids()) { - _this->_internal_mutable_special_meaning_appearance_ids()->::Canary::protobuf::appearances::SpecialMeaningAppearanceIds::MergeFrom( - from._internal_special_meaning_appearance_ids()); - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void Appearances::CopyFrom(const Appearances& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.Appearances) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool Appearances::IsInitialized() const { - return true; -} - -void Appearances::InternalSwap(Appearances* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - _impl_.object_.InternalSwap(&other->_impl_.object_); - _impl_.outfit_.InternalSwap(&other->_impl_.outfit_); - _impl_.effect_.InternalSwap(&other->_impl_.effect_); - _impl_.missile_.InternalSwap(&other->_impl_.missile_); - swap(_impl_.special_meaning_appearance_ids_, other->_impl_.special_meaning_appearance_ids_); -} - -::PROTOBUF_NAMESPACE_ID::Metadata Appearances::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[1]); -} - -// =================================================================== - -class SpritePhase::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_duration_min(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } - static void set_has_duration_max(HasBits* has_bits) { - (*has_bits)[0] |= 2u; - } -}; - -SpritePhase::SpritePhase(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.SpritePhase) -} -SpritePhase::SpritePhase(const SpritePhase& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - SpritePhase* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.duration_min_){} - , decltype(_impl_.duration_max_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - ::memcpy(&_impl_.duration_min_, &from._impl_.duration_min_, - static_cast(reinterpret_cast(&_impl_.duration_max_) - - reinterpret_cast(&_impl_.duration_min_)) + sizeof(_impl_.duration_max_)); - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.SpritePhase) -} - -inline void SpritePhase::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.duration_min_){0u} - , decltype(_impl_.duration_max_){0u} - }; -} - -SpritePhase::~SpritePhase() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.SpritePhase) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void SpritePhase::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); -} - -void SpritePhase::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void SpritePhase::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.SpritePhase) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000003u) { - ::memset(&_impl_.duration_min_, 0, static_cast( - reinterpret_cast(&_impl_.duration_max_) - - reinterpret_cast(&_impl_.duration_min_)) + sizeof(_impl_.duration_max_)); - } - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* SpritePhase::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional uint32 duration_min = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - _Internal::set_has_duration_min(&has_bits); - _impl_.duration_min_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 duration_max = 2; - case 2: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 16)) { - _Internal::set_has_duration_max(&has_bits); - _impl_.duration_max_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* SpritePhase::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.SpritePhase) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional uint32 duration_min = 1; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(1, this->_internal_duration_min(), target); - } - - // optional uint32 duration_max = 2; - if (cached_has_bits & 0x00000002u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(2, this->_internal_duration_max(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.SpritePhase) - return target; -} - -size_t SpritePhase::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.SpritePhase) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000003u) { - // optional uint32 duration_min = 1; - if (cached_has_bits & 0x00000001u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_duration_min()); - } - - // optional uint32 duration_max = 2; - if (cached_has_bits & 0x00000002u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_duration_max()); - } - - } - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData SpritePhase::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - SpritePhase::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*SpritePhase::GetClassData() const { return &_class_data_; } - - -void SpritePhase::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.SpritePhase) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = from._impl_._has_bits_[0]; - if (cached_has_bits & 0x00000003u) { - if (cached_has_bits & 0x00000001u) { - _this->_impl_.duration_min_ = from._impl_.duration_min_; - } - if (cached_has_bits & 0x00000002u) { - _this->_impl_.duration_max_ = from._impl_.duration_max_; - } - _this->_impl_._has_bits_[0] |= cached_has_bits; - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void SpritePhase::CopyFrom(const SpritePhase& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.SpritePhase) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool SpritePhase::IsInitialized() const { - return true; -} - -void SpritePhase::InternalSwap(SpritePhase* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - ::PROTOBUF_NAMESPACE_ID::internal::memswap< - PROTOBUF_FIELD_OFFSET(SpritePhase, _impl_.duration_max_) - + sizeof(SpritePhase::_impl_.duration_max_) - - PROTOBUF_FIELD_OFFSET(SpritePhase, _impl_.duration_min_)>( - reinterpret_cast(&_impl_.duration_min_), - reinterpret_cast(&other->_impl_.duration_min_)); -} - -::PROTOBUF_NAMESPACE_ID::Metadata SpritePhase::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[2]); -} - -// =================================================================== - -class SpriteAnimation::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_default_start_phase(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } - static void set_has_synchronized(HasBits* has_bits) { - (*has_bits)[0] |= 2u; - } - static void set_has_random_start_phase(HasBits* has_bits) { - (*has_bits)[0] |= 4u; - } - static void set_has_loop_type(HasBits* has_bits) { - (*has_bits)[0] |= 16u; - } - static void set_has_loop_count(HasBits* has_bits) { - (*has_bits)[0] |= 8u; - } -}; - -SpriteAnimation::SpriteAnimation(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.SpriteAnimation) -} -SpriteAnimation::SpriteAnimation(const SpriteAnimation& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - SpriteAnimation* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.sprite_phase_){from._impl_.sprite_phase_} - , decltype(_impl_.default_start_phase_){} - , decltype(_impl_.synchronized_){} - , decltype(_impl_.random_start_phase_){} - , decltype(_impl_.loop_count_){} - , decltype(_impl_.loop_type_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - ::memcpy(&_impl_.default_start_phase_, &from._impl_.default_start_phase_, - static_cast(reinterpret_cast(&_impl_.loop_type_) - - reinterpret_cast(&_impl_.default_start_phase_)) + sizeof(_impl_.loop_type_)); - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.SpriteAnimation) -} - -inline void SpriteAnimation::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.sprite_phase_){arena} - , decltype(_impl_.default_start_phase_){0u} - , decltype(_impl_.synchronized_){false} - , decltype(_impl_.random_start_phase_){false} - , decltype(_impl_.loop_count_){0u} - , decltype(_impl_.loop_type_){-1} - }; -} - -SpriteAnimation::~SpriteAnimation() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.SpriteAnimation) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void SpriteAnimation::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); - _impl_.sprite_phase_.~RepeatedPtrField(); -} - -void SpriteAnimation::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void SpriteAnimation::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.SpriteAnimation) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.sprite_phase_.Clear(); - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x0000001fu) { - ::memset(&_impl_.default_start_phase_, 0, static_cast( - reinterpret_cast(&_impl_.loop_count_) - - reinterpret_cast(&_impl_.default_start_phase_)) + sizeof(_impl_.loop_count_)); - _impl_.loop_type_ = -1; - } - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* SpriteAnimation::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional uint32 default_start_phase = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - _Internal::set_has_default_start_phase(&has_bits); - _impl_.default_start_phase_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool synchronized = 2; - case 2: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 16)) { - _Internal::set_has_synchronized(&has_bits); - _impl_.synchronized_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool random_start_phase = 3; - case 3: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 24)) { - _Internal::set_has_random_start_phase(&has_bits); - _impl_.random_start_phase_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional .Canary.protobuf.appearances.ANIMATION_LOOP_TYPE loop_type = 4; - case 4: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 32)) { - uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - if (PROTOBUF_PREDICT_TRUE(::Canary::protobuf::appearances::ANIMATION_LOOP_TYPE_IsValid(val))) { - _internal_set_loop_type(static_cast<::Canary::protobuf::appearances::ANIMATION_LOOP_TYPE>(val)); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::WriteVarint(4, val, mutable_unknown_fields()); - } - } else - goto handle_unusual; - continue; - // optional uint32 loop_count = 5; - case 5: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 40)) { - _Internal::set_has_loop_count(&has_bits); - _impl_.loop_count_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // repeated .Canary.protobuf.appearances.SpritePhase sprite_phase = 6; - case 6: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 50)) { - ptr -= 1; - do { - ptr += 1; - ptr = ctx->ParseMessage(_internal_add_sprite_phase(), ptr); - CHK_(ptr); - if (!ctx->DataAvailable(ptr)) break; - } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<50>(ptr)); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* SpriteAnimation::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.SpriteAnimation) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional uint32 default_start_phase = 1; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(1, this->_internal_default_start_phase(), target); - } - - // optional bool synchronized = 2; - if (cached_has_bits & 0x00000002u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(2, this->_internal_synchronized(), target); - } - - // optional bool random_start_phase = 3; - if (cached_has_bits & 0x00000004u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(3, this->_internal_random_start_phase(), target); - } - - // optional .Canary.protobuf.appearances.ANIMATION_LOOP_TYPE loop_type = 4; - if (cached_has_bits & 0x00000010u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteEnumToArray( - 4, this->_internal_loop_type(), target); - } - - // optional uint32 loop_count = 5; - if (cached_has_bits & 0x00000008u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(5, this->_internal_loop_count(), target); - } - - // repeated .Canary.protobuf.appearances.SpritePhase sprite_phase = 6; - for (unsigned i = 0, - n = static_cast(this->_internal_sprite_phase_size()); i < n; i++) { - const auto& repfield = this->_internal_sprite_phase(i); - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(6, repfield, repfield.GetCachedSize(), target, stream); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.SpriteAnimation) - return target; -} - -size_t SpriteAnimation::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.SpriteAnimation) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // repeated .Canary.protobuf.appearances.SpritePhase sprite_phase = 6; - total_size += 1UL * this->_internal_sprite_phase_size(); - for (const auto& msg : this->_impl_.sprite_phase_) { - total_size += - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg); - } - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x0000001fu) { - // optional uint32 default_start_phase = 1; - if (cached_has_bits & 0x00000001u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_default_start_phase()); - } - - // optional bool synchronized = 2; - if (cached_has_bits & 0x00000002u) { - total_size += 1 + 1; - } - - // optional bool random_start_phase = 3; - if (cached_has_bits & 0x00000004u) { - total_size += 1 + 1; - } - - // optional uint32 loop_count = 5; - if (cached_has_bits & 0x00000008u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_loop_count()); - } - - // optional .Canary.protobuf.appearances.ANIMATION_LOOP_TYPE loop_type = 4; - if (cached_has_bits & 0x00000010u) { - total_size += 1 + - ::_pbi::WireFormatLite::EnumSize(this->_internal_loop_type()); - } - - } - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData SpriteAnimation::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - SpriteAnimation::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*SpriteAnimation::GetClassData() const { return &_class_data_; } - - -void SpriteAnimation::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.SpriteAnimation) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - _this->_impl_.sprite_phase_.MergeFrom(from._impl_.sprite_phase_); - cached_has_bits = from._impl_._has_bits_[0]; - if (cached_has_bits & 0x0000001fu) { - if (cached_has_bits & 0x00000001u) { - _this->_impl_.default_start_phase_ = from._impl_.default_start_phase_; - } - if (cached_has_bits & 0x00000002u) { - _this->_impl_.synchronized_ = from._impl_.synchronized_; - } - if (cached_has_bits & 0x00000004u) { - _this->_impl_.random_start_phase_ = from._impl_.random_start_phase_; - } - if (cached_has_bits & 0x00000008u) { - _this->_impl_.loop_count_ = from._impl_.loop_count_; - } - if (cached_has_bits & 0x00000010u) { - _this->_impl_.loop_type_ = from._impl_.loop_type_; - } - _this->_impl_._has_bits_[0] |= cached_has_bits; - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void SpriteAnimation::CopyFrom(const SpriteAnimation& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.SpriteAnimation) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool SpriteAnimation::IsInitialized() const { - return true; -} - -void SpriteAnimation::InternalSwap(SpriteAnimation* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - _impl_.sprite_phase_.InternalSwap(&other->_impl_.sprite_phase_); - ::PROTOBUF_NAMESPACE_ID::internal::memswap< - PROTOBUF_FIELD_OFFSET(SpriteAnimation, _impl_.loop_count_) - + sizeof(SpriteAnimation::_impl_.loop_count_) - - PROTOBUF_FIELD_OFFSET(SpriteAnimation, _impl_.default_start_phase_)>( - reinterpret_cast(&_impl_.default_start_phase_), - reinterpret_cast(&other->_impl_.default_start_phase_)); - swap(_impl_.loop_type_, other->_impl_.loop_type_); -} - -::PROTOBUF_NAMESPACE_ID::Metadata SpriteAnimation::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[3]); -} - -// =================================================================== - -class Box::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_x(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } - static void set_has_y(HasBits* has_bits) { - (*has_bits)[0] |= 2u; - } - static void set_has_width(HasBits* has_bits) { - (*has_bits)[0] |= 4u; - } - static void set_has_height(HasBits* has_bits) { - (*has_bits)[0] |= 8u; - } -}; - -Box::Box(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.Box) -} -Box::Box(const Box& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - Box* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.x_){} - , decltype(_impl_.y_){} - , decltype(_impl_.width_){} - , decltype(_impl_.height_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - ::memcpy(&_impl_.x_, &from._impl_.x_, - static_cast(reinterpret_cast(&_impl_.height_) - - reinterpret_cast(&_impl_.x_)) + sizeof(_impl_.height_)); - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.Box) -} - -inline void Box::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.x_){0u} - , decltype(_impl_.y_){0u} - , decltype(_impl_.width_){0u} - , decltype(_impl_.height_){0u} - }; -} - -Box::~Box() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.Box) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void Box::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); -} - -void Box::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void Box::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.Box) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x0000000fu) { - ::memset(&_impl_.x_, 0, static_cast( - reinterpret_cast(&_impl_.height_) - - reinterpret_cast(&_impl_.x_)) + sizeof(_impl_.height_)); - } - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* Box::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional uint32 x = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - _Internal::set_has_x(&has_bits); - _impl_.x_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 y = 2; - case 2: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 16)) { - _Internal::set_has_y(&has_bits); - _impl_.y_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 width = 3; - case 3: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 24)) { - _Internal::set_has_width(&has_bits); - _impl_.width_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 height = 4; - case 4: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 32)) { - _Internal::set_has_height(&has_bits); - _impl_.height_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* Box::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.Box) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional uint32 x = 1; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(1, this->_internal_x(), target); - } - - // optional uint32 y = 2; - if (cached_has_bits & 0x00000002u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(2, this->_internal_y(), target); - } - - // optional uint32 width = 3; - if (cached_has_bits & 0x00000004u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(3, this->_internal_width(), target); - } - - // optional uint32 height = 4; - if (cached_has_bits & 0x00000008u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(4, this->_internal_height(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.Box) - return target; -} - -size_t Box::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.Box) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x0000000fu) { - // optional uint32 x = 1; - if (cached_has_bits & 0x00000001u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_x()); - } - - // optional uint32 y = 2; - if (cached_has_bits & 0x00000002u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_y()); - } - - // optional uint32 width = 3; - if (cached_has_bits & 0x00000004u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_width()); - } - - // optional uint32 height = 4; - if (cached_has_bits & 0x00000008u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_height()); - } - - } - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData Box::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - Box::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*Box::GetClassData() const { return &_class_data_; } - - -void Box::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.Box) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = from._impl_._has_bits_[0]; - if (cached_has_bits & 0x0000000fu) { - if (cached_has_bits & 0x00000001u) { - _this->_impl_.x_ = from._impl_.x_; - } - if (cached_has_bits & 0x00000002u) { - _this->_impl_.y_ = from._impl_.y_; - } - if (cached_has_bits & 0x00000004u) { - _this->_impl_.width_ = from._impl_.width_; - } - if (cached_has_bits & 0x00000008u) { - _this->_impl_.height_ = from._impl_.height_; - } - _this->_impl_._has_bits_[0] |= cached_has_bits; - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void Box::CopyFrom(const Box& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.Box) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool Box::IsInitialized() const { - return true; -} - -void Box::InternalSwap(Box* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - ::PROTOBUF_NAMESPACE_ID::internal::memswap< - PROTOBUF_FIELD_OFFSET(Box, _impl_.height_) - + sizeof(Box::_impl_.height_) - - PROTOBUF_FIELD_OFFSET(Box, _impl_.x_)>( - reinterpret_cast(&_impl_.x_), - reinterpret_cast(&other->_impl_.x_)); -} - -::PROTOBUF_NAMESPACE_ID::Metadata Box::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[4]); -} - -// =================================================================== - -class SpriteInfo::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_pattern_width(HasBits* has_bits) { - (*has_bits)[0] |= 2u; - } - static void set_has_pattern_height(HasBits* has_bits) { - (*has_bits)[0] |= 4u; - } - static void set_has_pattern_depth(HasBits* has_bits) { - (*has_bits)[0] |= 8u; - } - static void set_has_layers(HasBits* has_bits) { - (*has_bits)[0] |= 16u; - } - static void set_has_bounding_square(HasBits* has_bits) { - (*has_bits)[0] |= 32u; - } - static const ::Canary::protobuf::appearances::SpriteAnimation& animation(const SpriteInfo* msg); - static void set_has_animation(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } - static void set_has_is_opaque(HasBits* has_bits) { - (*has_bits)[0] |= 64u; - } -}; - -const ::Canary::protobuf::appearances::SpriteAnimation& -SpriteInfo::_Internal::animation(const SpriteInfo* msg) { - return *msg->_impl_.animation_; -} -SpriteInfo::SpriteInfo(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.SpriteInfo) -} -SpriteInfo::SpriteInfo(const SpriteInfo& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - SpriteInfo* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.sprite_id_){from._impl_.sprite_id_} - , decltype(_impl_.bounding_box_per_direction_){from._impl_.bounding_box_per_direction_} - , decltype(_impl_.animation_){nullptr} - , decltype(_impl_.pattern_width_){} - , decltype(_impl_.pattern_height_){} - , decltype(_impl_.pattern_depth_){} - , decltype(_impl_.layers_){} - , decltype(_impl_.bounding_square_){} - , decltype(_impl_.is_opaque_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - if (from._internal_has_animation()) { - _this->_impl_.animation_ = new ::Canary::protobuf::appearances::SpriteAnimation(*from._impl_.animation_); - } - ::memcpy(&_impl_.pattern_width_, &from._impl_.pattern_width_, - static_cast(reinterpret_cast(&_impl_.is_opaque_) - - reinterpret_cast(&_impl_.pattern_width_)) + sizeof(_impl_.is_opaque_)); - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.SpriteInfo) -} - -inline void SpriteInfo::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.sprite_id_){arena} - , decltype(_impl_.bounding_box_per_direction_){arena} - , decltype(_impl_.animation_){nullptr} - , decltype(_impl_.pattern_width_){0u} - , decltype(_impl_.pattern_height_){0u} - , decltype(_impl_.pattern_depth_){0u} - , decltype(_impl_.layers_){0u} - , decltype(_impl_.bounding_square_){0u} - , decltype(_impl_.is_opaque_){false} - }; -} - -SpriteInfo::~SpriteInfo() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.SpriteInfo) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void SpriteInfo::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); - _impl_.sprite_id_.~RepeatedField(); - _impl_.bounding_box_per_direction_.~RepeatedPtrField(); - if (this != internal_default_instance()) delete _impl_.animation_; -} - -void SpriteInfo::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void SpriteInfo::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.SpriteInfo) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.sprite_id_.Clear(); - _impl_.bounding_box_per_direction_.Clear(); - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000001u) { - GOOGLE_DCHECK(_impl_.animation_ != nullptr); - _impl_.animation_->Clear(); - } - if (cached_has_bits & 0x0000007eu) { - ::memset(&_impl_.pattern_width_, 0, static_cast( - reinterpret_cast(&_impl_.is_opaque_) - - reinterpret_cast(&_impl_.pattern_width_)) + sizeof(_impl_.is_opaque_)); - } - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* SpriteInfo::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional uint32 pattern_width = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - _Internal::set_has_pattern_width(&has_bits); - _impl_.pattern_width_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 pattern_height = 2; - case 2: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 16)) { - _Internal::set_has_pattern_height(&has_bits); - _impl_.pattern_height_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 pattern_depth = 3; - case 3: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 24)) { - _Internal::set_has_pattern_depth(&has_bits); - _impl_.pattern_depth_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 layers = 4; - case 4: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 32)) { - _Internal::set_has_layers(&has_bits); - _impl_.layers_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // repeated uint32 sprite_id = 5; - case 5: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 40)) { - ptr -= 1; - do { - ptr += 1; - _internal_add_sprite_id(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr)); - CHK_(ptr); - if (!ctx->DataAvailable(ptr)) break; - } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<40>(ptr)); - } else if (static_cast(tag) == 42) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedUInt32Parser(_internal_mutable_sprite_id(), ptr, ctx); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional .Canary.protobuf.appearances.SpriteAnimation animation = 6; - case 6: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 50)) { - ptr = ctx->ParseMessage(_internal_mutable_animation(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 bounding_square = 7; - case 7: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 56)) { - _Internal::set_has_bounding_square(&has_bits); - _impl_.bounding_square_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool is_opaque = 8; - case 8: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 64)) { - _Internal::set_has_is_opaque(&has_bits); - _impl_.is_opaque_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // repeated .Canary.protobuf.appearances.Box bounding_box_per_direction = 9; - case 9: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 74)) { - ptr -= 1; - do { - ptr += 1; - ptr = ctx->ParseMessage(_internal_add_bounding_box_per_direction(), ptr); - CHK_(ptr); - if (!ctx->DataAvailable(ptr)) break; - } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<74>(ptr)); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* SpriteInfo::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.SpriteInfo) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional uint32 pattern_width = 1; - if (cached_has_bits & 0x00000002u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(1, this->_internal_pattern_width(), target); - } - - // optional uint32 pattern_height = 2; - if (cached_has_bits & 0x00000004u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(2, this->_internal_pattern_height(), target); - } - - // optional uint32 pattern_depth = 3; - if (cached_has_bits & 0x00000008u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(3, this->_internal_pattern_depth(), target); - } - - // optional uint32 layers = 4; - if (cached_has_bits & 0x00000010u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(4, this->_internal_layers(), target); - } - - // repeated uint32 sprite_id = 5; - for (int i = 0, n = this->_internal_sprite_id_size(); i < n; i++) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(5, this->_internal_sprite_id(i), target); - } - - // optional .Canary.protobuf.appearances.SpriteAnimation animation = 6; - if (cached_has_bits & 0x00000001u) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(6, _Internal::animation(this), - _Internal::animation(this).GetCachedSize(), target, stream); - } - - // optional uint32 bounding_square = 7; - if (cached_has_bits & 0x00000020u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(7, this->_internal_bounding_square(), target); - } - - // optional bool is_opaque = 8; - if (cached_has_bits & 0x00000040u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(8, this->_internal_is_opaque(), target); - } - - // repeated .Canary.protobuf.appearances.Box bounding_box_per_direction = 9; - for (unsigned i = 0, - n = static_cast(this->_internal_bounding_box_per_direction_size()); i < n; i++) { - const auto& repfield = this->_internal_bounding_box_per_direction(i); - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(9, repfield, repfield.GetCachedSize(), target, stream); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.SpriteInfo) - return target; -} - -size_t SpriteInfo::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.SpriteInfo) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // repeated uint32 sprite_id = 5; - { - size_t data_size = ::_pbi::WireFormatLite:: - UInt32Size(this->_impl_.sprite_id_); - total_size += 1 * - ::_pbi::FromIntSize(this->_internal_sprite_id_size()); - total_size += data_size; - } - - // repeated .Canary.protobuf.appearances.Box bounding_box_per_direction = 9; - total_size += 1UL * this->_internal_bounding_box_per_direction_size(); - for (const auto& msg : this->_impl_.bounding_box_per_direction_) { - total_size += - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg); - } - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x0000007fu) { - // optional .Canary.protobuf.appearances.SpriteAnimation animation = 6; - if (cached_has_bits & 0x00000001u) { - total_size += 1 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.animation_); - } - - // optional uint32 pattern_width = 1; - if (cached_has_bits & 0x00000002u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_pattern_width()); - } - - // optional uint32 pattern_height = 2; - if (cached_has_bits & 0x00000004u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_pattern_height()); - } - - // optional uint32 pattern_depth = 3; - if (cached_has_bits & 0x00000008u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_pattern_depth()); - } - - // optional uint32 layers = 4; - if (cached_has_bits & 0x00000010u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_layers()); - } - - // optional uint32 bounding_square = 7; - if (cached_has_bits & 0x00000020u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_bounding_square()); - } - - // optional bool is_opaque = 8; - if (cached_has_bits & 0x00000040u) { - total_size += 1 + 1; - } - - } - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData SpriteInfo::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - SpriteInfo::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*SpriteInfo::GetClassData() const { return &_class_data_; } - - -void SpriteInfo::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.SpriteInfo) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - _this->_impl_.sprite_id_.MergeFrom(from._impl_.sprite_id_); - _this->_impl_.bounding_box_per_direction_.MergeFrom(from._impl_.bounding_box_per_direction_); - cached_has_bits = from._impl_._has_bits_[0]; - if (cached_has_bits & 0x0000007fu) { - if (cached_has_bits & 0x00000001u) { - _this->_internal_mutable_animation()->::Canary::protobuf::appearances::SpriteAnimation::MergeFrom( - from._internal_animation()); - } - if (cached_has_bits & 0x00000002u) { - _this->_impl_.pattern_width_ = from._impl_.pattern_width_; - } - if (cached_has_bits & 0x00000004u) { - _this->_impl_.pattern_height_ = from._impl_.pattern_height_; - } - if (cached_has_bits & 0x00000008u) { - _this->_impl_.pattern_depth_ = from._impl_.pattern_depth_; - } - if (cached_has_bits & 0x00000010u) { - _this->_impl_.layers_ = from._impl_.layers_; - } - if (cached_has_bits & 0x00000020u) { - _this->_impl_.bounding_square_ = from._impl_.bounding_square_; - } - if (cached_has_bits & 0x00000040u) { - _this->_impl_.is_opaque_ = from._impl_.is_opaque_; - } - _this->_impl_._has_bits_[0] |= cached_has_bits; - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void SpriteInfo::CopyFrom(const SpriteInfo& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.SpriteInfo) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool SpriteInfo::IsInitialized() const { - return true; -} - -void SpriteInfo::InternalSwap(SpriteInfo* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - _impl_.sprite_id_.InternalSwap(&other->_impl_.sprite_id_); - _impl_.bounding_box_per_direction_.InternalSwap(&other->_impl_.bounding_box_per_direction_); - ::PROTOBUF_NAMESPACE_ID::internal::memswap< - PROTOBUF_FIELD_OFFSET(SpriteInfo, _impl_.is_opaque_) - + sizeof(SpriteInfo::_impl_.is_opaque_) - - PROTOBUF_FIELD_OFFSET(SpriteInfo, _impl_.animation_)>( - reinterpret_cast(&_impl_.animation_), - reinterpret_cast(&other->_impl_.animation_)); -} - -::PROTOBUF_NAMESPACE_ID::Metadata SpriteInfo::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[5]); -} - -// =================================================================== - -class FrameGroup::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_fixed_frame_group(HasBits* has_bits) { - (*has_bits)[0] |= 2u; - } - static void set_has_id(HasBits* has_bits) { - (*has_bits)[0] |= 4u; - } - static const ::Canary::protobuf::appearances::SpriteInfo& sprite_info(const FrameGroup* msg); - static void set_has_sprite_info(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } -}; - -const ::Canary::protobuf::appearances::SpriteInfo& -FrameGroup::_Internal::sprite_info(const FrameGroup* msg) { - return *msg->_impl_.sprite_info_; -} -FrameGroup::FrameGroup(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.FrameGroup) -} -FrameGroup::FrameGroup(const FrameGroup& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - FrameGroup* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.sprite_info_){nullptr} - , decltype(_impl_.fixed_frame_group_){} - , decltype(_impl_.id_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - if (from._internal_has_sprite_info()) { - _this->_impl_.sprite_info_ = new ::Canary::protobuf::appearances::SpriteInfo(*from._impl_.sprite_info_); - } - ::memcpy(&_impl_.fixed_frame_group_, &from._impl_.fixed_frame_group_, - static_cast(reinterpret_cast(&_impl_.id_) - - reinterpret_cast(&_impl_.fixed_frame_group_)) + sizeof(_impl_.id_)); - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.FrameGroup) -} - -inline void FrameGroup::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.sprite_info_){nullptr} - , decltype(_impl_.fixed_frame_group_){0} - , decltype(_impl_.id_){0u} - }; -} - -FrameGroup::~FrameGroup() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.FrameGroup) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void FrameGroup::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); - if (this != internal_default_instance()) delete _impl_.sprite_info_; -} - -void FrameGroup::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void FrameGroup::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.FrameGroup) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000001u) { - GOOGLE_DCHECK(_impl_.sprite_info_ != nullptr); - _impl_.sprite_info_->Clear(); - } - if (cached_has_bits & 0x00000006u) { - ::memset(&_impl_.fixed_frame_group_, 0, static_cast( - reinterpret_cast(&_impl_.id_) - - reinterpret_cast(&_impl_.fixed_frame_group_)) + sizeof(_impl_.id_)); - } - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* FrameGroup::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional .Canary.protobuf.appearances.FIXED_FRAME_GROUP fixed_frame_group = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - if (PROTOBUF_PREDICT_TRUE(::Canary::protobuf::appearances::FIXED_FRAME_GROUP_IsValid(val))) { - _internal_set_fixed_frame_group(static_cast<::Canary::protobuf::appearances::FIXED_FRAME_GROUP>(val)); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::WriteVarint(1, val, mutable_unknown_fields()); - } - } else - goto handle_unusual; - continue; - // optional uint32 id = 2; - case 2: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 16)) { - _Internal::set_has_id(&has_bits); - _impl_.id_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional .Canary.protobuf.appearances.SpriteInfo sprite_info = 3; - case 3: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 26)) { - ptr = ctx->ParseMessage(_internal_mutable_sprite_info(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* FrameGroup::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.FrameGroup) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional .Canary.protobuf.appearances.FIXED_FRAME_GROUP fixed_frame_group = 1; - if (cached_has_bits & 0x00000002u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteEnumToArray( - 1, this->_internal_fixed_frame_group(), target); - } - - // optional uint32 id = 2; - if (cached_has_bits & 0x00000004u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(2, this->_internal_id(), target); - } - - // optional .Canary.protobuf.appearances.SpriteInfo sprite_info = 3; - if (cached_has_bits & 0x00000001u) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(3, _Internal::sprite_info(this), - _Internal::sprite_info(this).GetCachedSize(), target, stream); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.FrameGroup) - return target; -} - -size_t FrameGroup::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.FrameGroup) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000007u) { - // optional .Canary.protobuf.appearances.SpriteInfo sprite_info = 3; - if (cached_has_bits & 0x00000001u) { - total_size += 1 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.sprite_info_); - } - - // optional .Canary.protobuf.appearances.FIXED_FRAME_GROUP fixed_frame_group = 1; - if (cached_has_bits & 0x00000002u) { - total_size += 1 + - ::_pbi::WireFormatLite::EnumSize(this->_internal_fixed_frame_group()); - } - - // optional uint32 id = 2; - if (cached_has_bits & 0x00000004u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_id()); - } - - } - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData FrameGroup::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - FrameGroup::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*FrameGroup::GetClassData() const { return &_class_data_; } - - -void FrameGroup::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.FrameGroup) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = from._impl_._has_bits_[0]; - if (cached_has_bits & 0x00000007u) { - if (cached_has_bits & 0x00000001u) { - _this->_internal_mutable_sprite_info()->::Canary::protobuf::appearances::SpriteInfo::MergeFrom( - from._internal_sprite_info()); - } - if (cached_has_bits & 0x00000002u) { - _this->_impl_.fixed_frame_group_ = from._impl_.fixed_frame_group_; - } - if (cached_has_bits & 0x00000004u) { - _this->_impl_.id_ = from._impl_.id_; - } - _this->_impl_._has_bits_[0] |= cached_has_bits; - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void FrameGroup::CopyFrom(const FrameGroup& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.FrameGroup) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool FrameGroup::IsInitialized() const { - return true; -} - -void FrameGroup::InternalSwap(FrameGroup* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - ::PROTOBUF_NAMESPACE_ID::internal::memswap< - PROTOBUF_FIELD_OFFSET(FrameGroup, _impl_.id_) - + sizeof(FrameGroup::_impl_.id_) - - PROTOBUF_FIELD_OFFSET(FrameGroup, _impl_.sprite_info_)>( - reinterpret_cast(&_impl_.sprite_info_), - reinterpret_cast(&other->_impl_.sprite_info_)); -} - -::PROTOBUF_NAMESPACE_ID::Metadata FrameGroup::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[6]); -} - -// =================================================================== - -class Appearance::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_id(HasBits* has_bits) { - (*has_bits)[0] |= 8u; - } - static const ::Canary::protobuf::appearances::AppearanceFlags& flags(const Appearance* msg); - static void set_has_flags(HasBits* has_bits) { - (*has_bits)[0] |= 4u; - } - static void set_has_name(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } - static void set_has_description(HasBits* has_bits) { - (*has_bits)[0] |= 2u; - } -}; - -const ::Canary::protobuf::appearances::AppearanceFlags& -Appearance::_Internal::flags(const Appearance* msg) { - return *msg->_impl_.flags_; -} -Appearance::Appearance(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.Appearance) -} -Appearance::Appearance(const Appearance& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - Appearance* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.frame_group_){from._impl_.frame_group_} - , decltype(_impl_.name_){} - , decltype(_impl_.description_){} - , decltype(_impl_.flags_){nullptr} - , decltype(_impl_.id_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - _impl_.name_.InitDefault(); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - _impl_.name_.Set("", GetArenaForAllocation()); - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (from._internal_has_name()) { - _this->_impl_.name_.Set(from._internal_name(), - _this->GetArenaForAllocation()); - } - _impl_.description_.InitDefault(); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - _impl_.description_.Set("", GetArenaForAllocation()); - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (from._internal_has_description()) { - _this->_impl_.description_.Set(from._internal_description(), - _this->GetArenaForAllocation()); - } - if (from._internal_has_flags()) { - _this->_impl_.flags_ = new ::Canary::protobuf::appearances::AppearanceFlags(*from._impl_.flags_); - } - _this->_impl_.id_ = from._impl_.id_; - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.Appearance) -} - -inline void Appearance::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.frame_group_){arena} - , decltype(_impl_.name_){} - , decltype(_impl_.description_){} - , decltype(_impl_.flags_){nullptr} - , decltype(_impl_.id_){0u} - }; - _impl_.name_.InitDefault(); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - _impl_.name_.Set("", GetArenaForAllocation()); - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - _impl_.description_.InitDefault(); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - _impl_.description_.Set("", GetArenaForAllocation()); - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING -} - -Appearance::~Appearance() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.Appearance) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void Appearance::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); - _impl_.frame_group_.~RepeatedPtrField(); - _impl_.name_.Destroy(); - _impl_.description_.Destroy(); - if (this != internal_default_instance()) delete _impl_.flags_; -} - -void Appearance::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void Appearance::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.Appearance) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.frame_group_.Clear(); - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000007u) { - if (cached_has_bits & 0x00000001u) { - _impl_.name_.ClearNonDefaultToEmpty(); - } - if (cached_has_bits & 0x00000002u) { - _impl_.description_.ClearNonDefaultToEmpty(); - } - if (cached_has_bits & 0x00000004u) { - GOOGLE_DCHECK(_impl_.flags_ != nullptr); - _impl_.flags_->Clear(); - } - } - _impl_.id_ = 0u; - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* Appearance::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional uint32 id = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - _Internal::set_has_id(&has_bits); - _impl_.id_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // repeated .Canary.protobuf.appearances.FrameGroup frame_group = 2; - case 2: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 18)) { - ptr -= 1; - do { - ptr += 1; - ptr = ctx->ParseMessage(_internal_add_frame_group(), ptr); - CHK_(ptr); - if (!ctx->DataAvailable(ptr)) break; - } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<18>(ptr)); - } else - goto handle_unusual; - continue; - // optional .Canary.protobuf.appearances.AppearanceFlags flags = 3; - case 3: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 26)) { - ptr = ctx->ParseMessage(_internal_mutable_flags(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bytes name = 4; - case 4: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 34)) { - auto str = _internal_mutable_name(); - ptr = ::_pbi::InlineGreedyStringParser(str, ptr, ctx); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bytes description = 5; - case 5: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 42)) { - auto str = _internal_mutable_description(); - ptr = ::_pbi::InlineGreedyStringParser(str, ptr, ctx); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* Appearance::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.Appearance) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional uint32 id = 1; - if (cached_has_bits & 0x00000008u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(1, this->_internal_id(), target); - } - - // repeated .Canary.protobuf.appearances.FrameGroup frame_group = 2; - for (unsigned i = 0, - n = static_cast(this->_internal_frame_group_size()); i < n; i++) { - const auto& repfield = this->_internal_frame_group(i); - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(2, repfield, repfield.GetCachedSize(), target, stream); - } - - // optional .Canary.protobuf.appearances.AppearanceFlags flags = 3; - if (cached_has_bits & 0x00000004u) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(3, _Internal::flags(this), - _Internal::flags(this).GetCachedSize(), target, stream); - } - - // optional bytes name = 4; - if (cached_has_bits & 0x00000001u) { - target = stream->WriteBytesMaybeAliased( - 4, this->_internal_name(), target); - } - - // optional bytes description = 5; - if (cached_has_bits & 0x00000002u) { - target = stream->WriteBytesMaybeAliased( - 5, this->_internal_description(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.Appearance) - return target; -} - -size_t Appearance::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.Appearance) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // repeated .Canary.protobuf.appearances.FrameGroup frame_group = 2; - total_size += 1UL * this->_internal_frame_group_size(); - for (const auto& msg : this->_impl_.frame_group_) { - total_size += - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg); - } - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x0000000fu) { - // optional bytes name = 4; - if (cached_has_bits & 0x00000001u) { - total_size += 1 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::BytesSize( - this->_internal_name()); - } - - // optional bytes description = 5; - if (cached_has_bits & 0x00000002u) { - total_size += 1 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::BytesSize( - this->_internal_description()); - } - - // optional .Canary.protobuf.appearances.AppearanceFlags flags = 3; - if (cached_has_bits & 0x00000004u) { - total_size += 1 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.flags_); - } - - // optional uint32 id = 1; - if (cached_has_bits & 0x00000008u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_id()); - } - - } - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData Appearance::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - Appearance::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*Appearance::GetClassData() const { return &_class_data_; } - - -void Appearance::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.Appearance) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - _this->_impl_.frame_group_.MergeFrom(from._impl_.frame_group_); - cached_has_bits = from._impl_._has_bits_[0]; - if (cached_has_bits & 0x0000000fu) { - if (cached_has_bits & 0x00000001u) { - _this->_internal_set_name(from._internal_name()); - } - if (cached_has_bits & 0x00000002u) { - _this->_internal_set_description(from._internal_description()); - } - if (cached_has_bits & 0x00000004u) { - _this->_internal_mutable_flags()->::Canary::protobuf::appearances::AppearanceFlags::MergeFrom( - from._internal_flags()); - } - if (cached_has_bits & 0x00000008u) { - _this->_impl_.id_ = from._impl_.id_; - } - _this->_impl_._has_bits_[0] |= cached_has_bits; - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void Appearance::CopyFrom(const Appearance& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.Appearance) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool Appearance::IsInitialized() const { - return true; -} - -void Appearance::InternalSwap(Appearance* other) { - using std::swap; - auto* lhs_arena = GetArenaForAllocation(); - auto* rhs_arena = other->GetArenaForAllocation(); - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - _impl_.frame_group_.InternalSwap(&other->_impl_.frame_group_); - ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr::InternalSwap( - &_impl_.name_, lhs_arena, - &other->_impl_.name_, rhs_arena - ); - ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr::InternalSwap( - &_impl_.description_, lhs_arena, - &other->_impl_.description_, rhs_arena - ); - ::PROTOBUF_NAMESPACE_ID::internal::memswap< - PROTOBUF_FIELD_OFFSET(Appearance, _impl_.id_) - + sizeof(Appearance::_impl_.id_) - - PROTOBUF_FIELD_OFFSET(Appearance, _impl_.flags_)>( - reinterpret_cast(&_impl_.flags_), - reinterpret_cast(&other->_impl_.flags_)); -} - -::PROTOBUF_NAMESPACE_ID::Metadata Appearance::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[7]); -} - -// =================================================================== - -class AppearanceFlags::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static const ::Canary::protobuf::appearances::AppearanceFlagBank& bank(const AppearanceFlags* msg); - static void set_has_bank(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } - static void set_has_clip(HasBits* has_bits) { - (*has_bits)[0] |= 32768u; - } - static void set_has_bottom(HasBits* has_bits) { - (*has_bits)[0] |= 65536u; - } - static void set_has_top(HasBits* has_bits) { - (*has_bits)[0] |= 131072u; - } - static void set_has_container(HasBits* has_bits) { - (*has_bits)[0] |= 262144u; - } - static void set_has_cumulative(HasBits* has_bits) { - (*has_bits)[0] |= 524288u; - } - static void set_has_usable(HasBits* has_bits) { - (*has_bits)[0] |= 1048576u; - } - static void set_has_forceuse(HasBits* has_bits) { - (*has_bits)[0] |= 2097152u; - } - static void set_has_multiuse(HasBits* has_bits) { - (*has_bits)[0] |= 4194304u; - } - static const ::Canary::protobuf::appearances::AppearanceFlagWrite& write(const AppearanceFlags* msg); - static void set_has_write(HasBits* has_bits) { - (*has_bits)[0] |= 2u; - } - static const ::Canary::protobuf::appearances::AppearanceFlagWriteOnce& write_once(const AppearanceFlags* msg); - static void set_has_write_once(HasBits* has_bits) { - (*has_bits)[0] |= 4u; - } - static void set_has_liquidpool(HasBits* has_bits) { - (*has_bits)[0] |= 8388608u; - } - static void set_has_unpass(HasBits* has_bits) { - (*has_bits)[0] |= 16777216u; - } - static void set_has_unmove(HasBits* has_bits) { - (*has_bits)[0] |= 33554432u; - } - static void set_has_unsight(HasBits* has_bits) { - (*has_bits)[0] |= 67108864u; - } - static void set_has_avoid(HasBits* has_bits) { - (*has_bits)[0] |= 134217728u; - } - static void set_has_no_movement_animation(HasBits* has_bits) { - (*has_bits)[0] |= 268435456u; - } - static void set_has_take(HasBits* has_bits) { - (*has_bits)[0] |= 536870912u; - } - static void set_has_liquidcontainer(HasBits* has_bits) { - (*has_bits)[0] |= 1073741824u; - } - static void set_has_hang(HasBits* has_bits) { - (*has_bits)[0] |= 2147483648u; - } - static const ::Canary::protobuf::appearances::AppearanceFlagHook& hook(const AppearanceFlags* msg); - static void set_has_hook(HasBits* has_bits) { - (*has_bits)[0] |= 8u; - } - static void set_has_rotate(HasBits* has_bits) { - (*has_bits)[1] |= 1u; - } - static const ::Canary::protobuf::appearances::AppearanceFlagLight& light(const AppearanceFlags* msg); - static void set_has_light(HasBits* has_bits) { - (*has_bits)[0] |= 16u; - } - static void set_has_dont_hide(HasBits* has_bits) { - (*has_bits)[1] |= 2u; - } - static void set_has_translucent(HasBits* has_bits) { - (*has_bits)[1] |= 4u; - } - static const ::Canary::protobuf::appearances::AppearanceFlagShift& shift(const AppearanceFlags* msg); - static void set_has_shift(HasBits* has_bits) { - (*has_bits)[0] |= 32u; - } - static const ::Canary::protobuf::appearances::AppearanceFlagHeight& height(const AppearanceFlags* msg); - static void set_has_height(HasBits* has_bits) { - (*has_bits)[0] |= 64u; - } - static void set_has_lying_object(HasBits* has_bits) { - (*has_bits)[1] |= 8u; - } - static void set_has_animate_always(HasBits* has_bits) { - (*has_bits)[1] |= 16u; - } - static const ::Canary::protobuf::appearances::AppearanceFlagAutomap& automap(const AppearanceFlags* msg); - static void set_has_automap(HasBits* has_bits) { - (*has_bits)[0] |= 128u; - } - static const ::Canary::protobuf::appearances::AppearanceFlagLenshelp& lenshelp(const AppearanceFlags* msg); - static void set_has_lenshelp(HasBits* has_bits) { - (*has_bits)[0] |= 256u; - } - static void set_has_fullbank(HasBits* has_bits) { - (*has_bits)[1] |= 32u; - } - static void set_has_ignore_look(HasBits* has_bits) { - (*has_bits)[1] |= 64u; - } - static const ::Canary::protobuf::appearances::AppearanceFlagClothes& clothes(const AppearanceFlags* msg); - static void set_has_clothes(HasBits* has_bits) { - (*has_bits)[0] |= 512u; - } - static const ::Canary::protobuf::appearances::AppearanceFlagDefaultAction& default_action(const AppearanceFlags* msg); - static void set_has_default_action(HasBits* has_bits) { - (*has_bits)[0] |= 1024u; - } - static const ::Canary::protobuf::appearances::AppearanceFlagMarket& market(const AppearanceFlags* msg); - static void set_has_market(HasBits* has_bits) { - (*has_bits)[0] |= 2048u; - } - static void set_has_wrap(HasBits* has_bits) { - (*has_bits)[1] |= 128u; - } - static void set_has_unwrap(HasBits* has_bits) { - (*has_bits)[1] |= 256u; - } - static void set_has_topeffect(HasBits* has_bits) { - (*has_bits)[1] |= 512u; - } - static const ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire& changedtoexpire(const AppearanceFlags* msg); - static void set_has_changedtoexpire(HasBits* has_bits) { - (*has_bits)[0] |= 4096u; - } - static void set_has_corpse(HasBits* has_bits) { - (*has_bits)[1] |= 1024u; - } - static void set_has_player_corpse(HasBits* has_bits) { - (*has_bits)[1] |= 2048u; - } - static const ::Canary::protobuf::appearances::AppearanceFlagCyclopedia& cyclopediaitem(const AppearanceFlags* msg); - static void set_has_cyclopediaitem(HasBits* has_bits) { - (*has_bits)[0] |= 8192u; - } - static void set_has_ammo(HasBits* has_bits) { - (*has_bits)[1] |= 4096u; - } - static void set_has_show_off_socket(HasBits* has_bits) { - (*has_bits)[1] |= 8192u; - } - static void set_has_reportable(HasBits* has_bits) { - (*has_bits)[1] |= 16384u; - } - static const ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification& upgradeclassification(const AppearanceFlags* msg); - static void set_has_upgradeclassification(HasBits* has_bits) { - (*has_bits)[0] |= 16384u; - } - static void set_has_reverse_addons_east(HasBits* has_bits) { - (*has_bits)[1] |= 32768u; - } - static void set_has_reverse_addons_west(HasBits* has_bits) { - (*has_bits)[1] |= 65536u; - } - static void set_has_reverse_addons_south(HasBits* has_bits) { - (*has_bits)[1] |= 131072u; - } - static void set_has_reverse_addons_north(HasBits* has_bits) { - (*has_bits)[1] |= 262144u; - } - static void set_has_wearout(HasBits* has_bits) { - (*has_bits)[1] |= 524288u; - } - static void set_has_clockexpire(HasBits* has_bits) { - (*has_bits)[1] |= 1048576u; - } - static void set_has_expire(HasBits* has_bits) { - (*has_bits)[1] |= 2097152u; - } - static void set_has_expirestop(HasBits* has_bits) { - (*has_bits)[1] |= 4194304u; - } - static void set_has_wrapkit(HasBits* has_bits) { - (*has_bits)[1] |= 8388608u; - } -}; - -const ::Canary::protobuf::appearances::AppearanceFlagBank& -AppearanceFlags::_Internal::bank(const AppearanceFlags* msg) { - return *msg->_impl_.bank_; -} -const ::Canary::protobuf::appearances::AppearanceFlagWrite& -AppearanceFlags::_Internal::write(const AppearanceFlags* msg) { - return *msg->_impl_.write_; -} -const ::Canary::protobuf::appearances::AppearanceFlagWriteOnce& -AppearanceFlags::_Internal::write_once(const AppearanceFlags* msg) { - return *msg->_impl_.write_once_; -} -const ::Canary::protobuf::appearances::AppearanceFlagHook& -AppearanceFlags::_Internal::hook(const AppearanceFlags* msg) { - return *msg->_impl_.hook_; -} -const ::Canary::protobuf::appearances::AppearanceFlagLight& -AppearanceFlags::_Internal::light(const AppearanceFlags* msg) { - return *msg->_impl_.light_; -} -const ::Canary::protobuf::appearances::AppearanceFlagShift& -AppearanceFlags::_Internal::shift(const AppearanceFlags* msg) { - return *msg->_impl_.shift_; -} -const ::Canary::protobuf::appearances::AppearanceFlagHeight& -AppearanceFlags::_Internal::height(const AppearanceFlags* msg) { - return *msg->_impl_.height_; -} -const ::Canary::protobuf::appearances::AppearanceFlagAutomap& -AppearanceFlags::_Internal::automap(const AppearanceFlags* msg) { - return *msg->_impl_.automap_; -} -const ::Canary::protobuf::appearances::AppearanceFlagLenshelp& -AppearanceFlags::_Internal::lenshelp(const AppearanceFlags* msg) { - return *msg->_impl_.lenshelp_; -} -const ::Canary::protobuf::appearances::AppearanceFlagClothes& -AppearanceFlags::_Internal::clothes(const AppearanceFlags* msg) { - return *msg->_impl_.clothes_; -} -const ::Canary::protobuf::appearances::AppearanceFlagDefaultAction& -AppearanceFlags::_Internal::default_action(const AppearanceFlags* msg) { - return *msg->_impl_.default_action_; -} -const ::Canary::protobuf::appearances::AppearanceFlagMarket& -AppearanceFlags::_Internal::market(const AppearanceFlags* msg) { - return *msg->_impl_.market_; -} -const ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire& -AppearanceFlags::_Internal::changedtoexpire(const AppearanceFlags* msg) { - return *msg->_impl_.changedtoexpire_; -} -const ::Canary::protobuf::appearances::AppearanceFlagCyclopedia& -AppearanceFlags::_Internal::cyclopediaitem(const AppearanceFlags* msg) { - return *msg->_impl_.cyclopediaitem_; -} -const ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification& -AppearanceFlags::_Internal::upgradeclassification(const AppearanceFlags* msg) { - return *msg->_impl_.upgradeclassification_; -} -AppearanceFlags::AppearanceFlags(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.AppearanceFlags) -} -AppearanceFlags::AppearanceFlags(const AppearanceFlags& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - AppearanceFlags* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.npcsaledata_){from._impl_.npcsaledata_} - , decltype(_impl_.bank_){nullptr} - , decltype(_impl_.write_){nullptr} - , decltype(_impl_.write_once_){nullptr} - , decltype(_impl_.hook_){nullptr} - , decltype(_impl_.light_){nullptr} - , decltype(_impl_.shift_){nullptr} - , decltype(_impl_.height_){nullptr} - , decltype(_impl_.automap_){nullptr} - , decltype(_impl_.lenshelp_){nullptr} - , decltype(_impl_.clothes_){nullptr} - , decltype(_impl_.default_action_){nullptr} - , decltype(_impl_.market_){nullptr} - , decltype(_impl_.changedtoexpire_){nullptr} - , decltype(_impl_.cyclopediaitem_){nullptr} - , decltype(_impl_.upgradeclassification_){nullptr} - , decltype(_impl_.clip_){} - , decltype(_impl_.bottom_){} - , decltype(_impl_.top_){} - , decltype(_impl_.container_){} - , decltype(_impl_.cumulative_){} - , decltype(_impl_.usable_){} - , decltype(_impl_.forceuse_){} - , decltype(_impl_.multiuse_){} - , decltype(_impl_.liquidpool_){} - , decltype(_impl_.unpass_){} - , decltype(_impl_.unmove_){} - , decltype(_impl_.unsight_){} - , decltype(_impl_.avoid_){} - , decltype(_impl_.no_movement_animation_){} - , decltype(_impl_.take_){} - , decltype(_impl_.liquidcontainer_){} - , decltype(_impl_.hang_){} - , decltype(_impl_.rotate_){} - , decltype(_impl_.dont_hide_){} - , decltype(_impl_.translucent_){} - , decltype(_impl_.lying_object_){} - , decltype(_impl_.animate_always_){} - , decltype(_impl_.fullbank_){} - , decltype(_impl_.ignore_look_){} - , decltype(_impl_.wrap_){} - , decltype(_impl_.unwrap_){} - , decltype(_impl_.topeffect_){} - , decltype(_impl_.corpse_){} - , decltype(_impl_.player_corpse_){} - , decltype(_impl_.ammo_){} - , decltype(_impl_.show_off_socket_){} - , decltype(_impl_.reportable_){} - , decltype(_impl_.reverse_addons_east_){} - , decltype(_impl_.reverse_addons_west_){} - , decltype(_impl_.reverse_addons_south_){} - , decltype(_impl_.reverse_addons_north_){} - , decltype(_impl_.wearout_){} - , decltype(_impl_.clockexpire_){} - , decltype(_impl_.expire_){} - , decltype(_impl_.expirestop_){} - , decltype(_impl_.wrapkit_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - if (from._internal_has_bank()) { - _this->_impl_.bank_ = new ::Canary::protobuf::appearances::AppearanceFlagBank(*from._impl_.bank_); - } - if (from._internal_has_write()) { - _this->_impl_.write_ = new ::Canary::protobuf::appearances::AppearanceFlagWrite(*from._impl_.write_); - } - if (from._internal_has_write_once()) { - _this->_impl_.write_once_ = new ::Canary::protobuf::appearances::AppearanceFlagWriteOnce(*from._impl_.write_once_); - } - if (from._internal_has_hook()) { - _this->_impl_.hook_ = new ::Canary::protobuf::appearances::AppearanceFlagHook(*from._impl_.hook_); - } - if (from._internal_has_light()) { - _this->_impl_.light_ = new ::Canary::protobuf::appearances::AppearanceFlagLight(*from._impl_.light_); - } - if (from._internal_has_shift()) { - _this->_impl_.shift_ = new ::Canary::protobuf::appearances::AppearanceFlagShift(*from._impl_.shift_); - } - if (from._internal_has_height()) { - _this->_impl_.height_ = new ::Canary::protobuf::appearances::AppearanceFlagHeight(*from._impl_.height_); - } - if (from._internal_has_automap()) { - _this->_impl_.automap_ = new ::Canary::protobuf::appearances::AppearanceFlagAutomap(*from._impl_.automap_); - } - if (from._internal_has_lenshelp()) { - _this->_impl_.lenshelp_ = new ::Canary::protobuf::appearances::AppearanceFlagLenshelp(*from._impl_.lenshelp_); - } - if (from._internal_has_clothes()) { - _this->_impl_.clothes_ = new ::Canary::protobuf::appearances::AppearanceFlagClothes(*from._impl_.clothes_); - } - if (from._internal_has_default_action()) { - _this->_impl_.default_action_ = new ::Canary::protobuf::appearances::AppearanceFlagDefaultAction(*from._impl_.default_action_); - } - if (from._internal_has_market()) { - _this->_impl_.market_ = new ::Canary::protobuf::appearances::AppearanceFlagMarket(*from._impl_.market_); - } - if (from._internal_has_changedtoexpire()) { - _this->_impl_.changedtoexpire_ = new ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire(*from._impl_.changedtoexpire_); - } - if (from._internal_has_cyclopediaitem()) { - _this->_impl_.cyclopediaitem_ = new ::Canary::protobuf::appearances::AppearanceFlagCyclopedia(*from._impl_.cyclopediaitem_); - } - if (from._internal_has_upgradeclassification()) { - _this->_impl_.upgradeclassification_ = new ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification(*from._impl_.upgradeclassification_); - } - ::memcpy(&_impl_.clip_, &from._impl_.clip_, - static_cast(reinterpret_cast(&_impl_.wrapkit_) - - reinterpret_cast(&_impl_.clip_)) + sizeof(_impl_.wrapkit_)); - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.AppearanceFlags) -} - -inline void AppearanceFlags::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.npcsaledata_){arena} - , decltype(_impl_.bank_){nullptr} - , decltype(_impl_.write_){nullptr} - , decltype(_impl_.write_once_){nullptr} - , decltype(_impl_.hook_){nullptr} - , decltype(_impl_.light_){nullptr} - , decltype(_impl_.shift_){nullptr} - , decltype(_impl_.height_){nullptr} - , decltype(_impl_.automap_){nullptr} - , decltype(_impl_.lenshelp_){nullptr} - , decltype(_impl_.clothes_){nullptr} - , decltype(_impl_.default_action_){nullptr} - , decltype(_impl_.market_){nullptr} - , decltype(_impl_.changedtoexpire_){nullptr} - , decltype(_impl_.cyclopediaitem_){nullptr} - , decltype(_impl_.upgradeclassification_){nullptr} - , decltype(_impl_.clip_){false} - , decltype(_impl_.bottom_){false} - , decltype(_impl_.top_){false} - , decltype(_impl_.container_){false} - , decltype(_impl_.cumulative_){false} - , decltype(_impl_.usable_){false} - , decltype(_impl_.forceuse_){false} - , decltype(_impl_.multiuse_){false} - , decltype(_impl_.liquidpool_){false} - , decltype(_impl_.unpass_){false} - , decltype(_impl_.unmove_){false} - , decltype(_impl_.unsight_){false} - , decltype(_impl_.avoid_){false} - , decltype(_impl_.no_movement_animation_){false} - , decltype(_impl_.take_){false} - , decltype(_impl_.liquidcontainer_){false} - , decltype(_impl_.hang_){false} - , decltype(_impl_.rotate_){false} - , decltype(_impl_.dont_hide_){false} - , decltype(_impl_.translucent_){false} - , decltype(_impl_.lying_object_){false} - , decltype(_impl_.animate_always_){false} - , decltype(_impl_.fullbank_){false} - , decltype(_impl_.ignore_look_){false} - , decltype(_impl_.wrap_){false} - , decltype(_impl_.unwrap_){false} - , decltype(_impl_.topeffect_){false} - , decltype(_impl_.corpse_){false} - , decltype(_impl_.player_corpse_){false} - , decltype(_impl_.ammo_){false} - , decltype(_impl_.show_off_socket_){false} - , decltype(_impl_.reportable_){false} - , decltype(_impl_.reverse_addons_east_){false} - , decltype(_impl_.reverse_addons_west_){false} - , decltype(_impl_.reverse_addons_south_){false} - , decltype(_impl_.reverse_addons_north_){false} - , decltype(_impl_.wearout_){false} - , decltype(_impl_.clockexpire_){false} - , decltype(_impl_.expire_){false} - , decltype(_impl_.expirestop_){false} - , decltype(_impl_.wrapkit_){false} - }; -} - -AppearanceFlags::~AppearanceFlags() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.AppearanceFlags) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void AppearanceFlags::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); - _impl_.npcsaledata_.~RepeatedPtrField(); - if (this != internal_default_instance()) delete _impl_.bank_; - if (this != internal_default_instance()) delete _impl_.write_; - if (this != internal_default_instance()) delete _impl_.write_once_; - if (this != internal_default_instance()) delete _impl_.hook_; - if (this != internal_default_instance()) delete _impl_.light_; - if (this != internal_default_instance()) delete _impl_.shift_; - if (this != internal_default_instance()) delete _impl_.height_; - if (this != internal_default_instance()) delete _impl_.automap_; - if (this != internal_default_instance()) delete _impl_.lenshelp_; - if (this != internal_default_instance()) delete _impl_.clothes_; - if (this != internal_default_instance()) delete _impl_.default_action_; - if (this != internal_default_instance()) delete _impl_.market_; - if (this != internal_default_instance()) delete _impl_.changedtoexpire_; - if (this != internal_default_instance()) delete _impl_.cyclopediaitem_; - if (this != internal_default_instance()) delete _impl_.upgradeclassification_; -} - -void AppearanceFlags::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void AppearanceFlags::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.AppearanceFlags) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.npcsaledata_.Clear(); - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x000000ffu) { - if (cached_has_bits & 0x00000001u) { - GOOGLE_DCHECK(_impl_.bank_ != nullptr); - _impl_.bank_->Clear(); - } - if (cached_has_bits & 0x00000002u) { - GOOGLE_DCHECK(_impl_.write_ != nullptr); - _impl_.write_->Clear(); - } - if (cached_has_bits & 0x00000004u) { - GOOGLE_DCHECK(_impl_.write_once_ != nullptr); - _impl_.write_once_->Clear(); - } - if (cached_has_bits & 0x00000008u) { - GOOGLE_DCHECK(_impl_.hook_ != nullptr); - _impl_.hook_->Clear(); - } - if (cached_has_bits & 0x00000010u) { - GOOGLE_DCHECK(_impl_.light_ != nullptr); - _impl_.light_->Clear(); - } - if (cached_has_bits & 0x00000020u) { - GOOGLE_DCHECK(_impl_.shift_ != nullptr); - _impl_.shift_->Clear(); - } - if (cached_has_bits & 0x00000040u) { - GOOGLE_DCHECK(_impl_.height_ != nullptr); - _impl_.height_->Clear(); - } - if (cached_has_bits & 0x00000080u) { - GOOGLE_DCHECK(_impl_.automap_ != nullptr); - _impl_.automap_->Clear(); - } - } - if (cached_has_bits & 0x00007f00u) { - if (cached_has_bits & 0x00000100u) { - GOOGLE_DCHECK(_impl_.lenshelp_ != nullptr); - _impl_.lenshelp_->Clear(); - } - if (cached_has_bits & 0x00000200u) { - GOOGLE_DCHECK(_impl_.clothes_ != nullptr); - _impl_.clothes_->Clear(); - } - if (cached_has_bits & 0x00000400u) { - GOOGLE_DCHECK(_impl_.default_action_ != nullptr); - _impl_.default_action_->Clear(); - } - if (cached_has_bits & 0x00000800u) { - GOOGLE_DCHECK(_impl_.market_ != nullptr); - _impl_.market_->Clear(); - } - if (cached_has_bits & 0x00001000u) { - GOOGLE_DCHECK(_impl_.changedtoexpire_ != nullptr); - _impl_.changedtoexpire_->Clear(); - } - if (cached_has_bits & 0x00002000u) { - GOOGLE_DCHECK(_impl_.cyclopediaitem_ != nullptr); - _impl_.cyclopediaitem_->Clear(); - } - if (cached_has_bits & 0x00004000u) { - GOOGLE_DCHECK(_impl_.upgradeclassification_ != nullptr); - _impl_.upgradeclassification_->Clear(); - } - } - _impl_.clip_ = false; - if (cached_has_bits & 0x00ff0000u) { - ::memset(&_impl_.bottom_, 0, static_cast( - reinterpret_cast(&_impl_.liquidpool_) - - reinterpret_cast(&_impl_.bottom_)) + sizeof(_impl_.liquidpool_)); - } - if (cached_has_bits & 0xff000000u) { - ::memset(&_impl_.unpass_, 0, static_cast( - reinterpret_cast(&_impl_.hang_) - - reinterpret_cast(&_impl_.unpass_)) + sizeof(_impl_.hang_)); - } - cached_has_bits = _impl_._has_bits_[1]; - if (cached_has_bits & 0x000000ffu) { - ::memset(&_impl_.rotate_, 0, static_cast( - reinterpret_cast(&_impl_.wrap_) - - reinterpret_cast(&_impl_.rotate_)) + sizeof(_impl_.wrap_)); - } - if (cached_has_bits & 0x0000ff00u) { - ::memset(&_impl_.unwrap_, 0, static_cast( - reinterpret_cast(&_impl_.reverse_addons_east_) - - reinterpret_cast(&_impl_.unwrap_)) + sizeof(_impl_.reverse_addons_east_)); - } - if (cached_has_bits & 0x00ff0000u) { - ::memset(&_impl_.reverse_addons_west_, 0, static_cast( - reinterpret_cast(&_impl_.wrapkit_) - - reinterpret_cast(&_impl_.reverse_addons_west_)) + sizeof(_impl_.wrapkit_)); - } - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* AppearanceFlags::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional .Canary.protobuf.appearances.AppearanceFlagBank bank = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 10)) { - ptr = ctx->ParseMessage(_internal_mutable_bank(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool clip = 2; - case 2: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 16)) { - _Internal::set_has_clip(&_impl_._has_bits_); - _impl_.clip_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool bottom = 3; - case 3: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 24)) { - _Internal::set_has_bottom(&_impl_._has_bits_); - _impl_.bottom_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool top = 4; - case 4: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 32)) { - _Internal::set_has_top(&_impl_._has_bits_); - _impl_.top_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool container = 5; - case 5: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 40)) { - _Internal::set_has_container(&_impl_._has_bits_); - _impl_.container_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool cumulative = 6; - case 6: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 48)) { - _Internal::set_has_cumulative(&_impl_._has_bits_); - _impl_.cumulative_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool usable = 7; - case 7: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 56)) { - _Internal::set_has_usable(&_impl_._has_bits_); - _impl_.usable_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool forceuse = 8; - case 8: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 64)) { - _Internal::set_has_forceuse(&_impl_._has_bits_); - _impl_.forceuse_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool multiuse = 9; - case 9: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 72)) { - _Internal::set_has_multiuse(&_impl_._has_bits_); - _impl_.multiuse_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional .Canary.protobuf.appearances.AppearanceFlagWrite write = 10; - case 10: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 82)) { - ptr = ctx->ParseMessage(_internal_mutable_write(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional .Canary.protobuf.appearances.AppearanceFlagWriteOnce write_once = 11; - case 11: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 90)) { - ptr = ctx->ParseMessage(_internal_mutable_write_once(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool liquidpool = 12; - case 12: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 96)) { - _Internal::set_has_liquidpool(&_impl_._has_bits_); - _impl_.liquidpool_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool unpass = 13; - case 13: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 104)) { - _Internal::set_has_unpass(&_impl_._has_bits_); - _impl_.unpass_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool unmove = 14; - case 14: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 112)) { - _Internal::set_has_unmove(&_impl_._has_bits_); - _impl_.unmove_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool unsight = 15; - case 15: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 120)) { - _Internal::set_has_unsight(&_impl_._has_bits_); - _impl_.unsight_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool avoid = 16; - case 16: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 128)) { - _Internal::set_has_avoid(&_impl_._has_bits_); - _impl_.avoid_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool no_movement_animation = 17; - case 17: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 136)) { - _Internal::set_has_no_movement_animation(&_impl_._has_bits_); - _impl_.no_movement_animation_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool take = 18; - case 18: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 144)) { - _Internal::set_has_take(&_impl_._has_bits_); - _impl_.take_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool liquidcontainer = 19; - case 19: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 152)) { - _Internal::set_has_liquidcontainer(&_impl_._has_bits_); - _impl_.liquidcontainer_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool hang = 20; - case 20: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 160)) { - _Internal::set_has_hang(&_impl_._has_bits_); - _impl_.hang_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional .Canary.protobuf.appearances.AppearanceFlagHook hook = 21; - case 21: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 170)) { - ptr = ctx->ParseMessage(_internal_mutable_hook(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool rotate = 22; - case 22: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 176)) { - _Internal::set_has_rotate(&_impl_._has_bits_); - _impl_.rotate_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional .Canary.protobuf.appearances.AppearanceFlagLight light = 23; - case 23: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 186)) { - ptr = ctx->ParseMessage(_internal_mutable_light(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool dont_hide = 24; - case 24: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 192)) { - _Internal::set_has_dont_hide(&_impl_._has_bits_); - _impl_.dont_hide_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool translucent = 25; - case 25: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 200)) { - _Internal::set_has_translucent(&_impl_._has_bits_); - _impl_.translucent_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional .Canary.protobuf.appearances.AppearanceFlagShift shift = 26; - case 26: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 210)) { - ptr = ctx->ParseMessage(_internal_mutable_shift(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional .Canary.protobuf.appearances.AppearanceFlagHeight height = 27; - case 27: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 218)) { - ptr = ctx->ParseMessage(_internal_mutable_height(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool lying_object = 28; - case 28: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 224)) { - _Internal::set_has_lying_object(&_impl_._has_bits_); - _impl_.lying_object_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool animate_always = 29; - case 29: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 232)) { - _Internal::set_has_animate_always(&_impl_._has_bits_); - _impl_.animate_always_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional .Canary.protobuf.appearances.AppearanceFlagAutomap automap = 30; - case 30: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 242)) { - ptr = ctx->ParseMessage(_internal_mutable_automap(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional .Canary.protobuf.appearances.AppearanceFlagLenshelp lenshelp = 31; - case 31: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 250)) { - ptr = ctx->ParseMessage(_internal_mutable_lenshelp(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool fullbank = 32; - case 32: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 0)) { - _Internal::set_has_fullbank(&_impl_._has_bits_); - _impl_.fullbank_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool ignore_look = 33; - case 33: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - _Internal::set_has_ignore_look(&_impl_._has_bits_); - _impl_.ignore_look_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional .Canary.protobuf.appearances.AppearanceFlagClothes clothes = 34; - case 34: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 18)) { - ptr = ctx->ParseMessage(_internal_mutable_clothes(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional .Canary.protobuf.appearances.AppearanceFlagDefaultAction default_action = 35; - case 35: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 26)) { - ptr = ctx->ParseMessage(_internal_mutable_default_action(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional .Canary.protobuf.appearances.AppearanceFlagMarket market = 36; - case 36: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 34)) { - ptr = ctx->ParseMessage(_internal_mutable_market(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool wrap = 37; - case 37: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 40)) { - _Internal::set_has_wrap(&_impl_._has_bits_); - _impl_.wrap_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool unwrap = 38; - case 38: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 48)) { - _Internal::set_has_unwrap(&_impl_._has_bits_); - _impl_.unwrap_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool topeffect = 39; - case 39: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 56)) { - _Internal::set_has_topeffect(&_impl_._has_bits_); - _impl_.topeffect_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // repeated .Canary.protobuf.appearances.AppearanceFlagNPC npcsaledata = 40; - case 40: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 66)) { - ptr -= 2; - do { - ptr += 2; - ptr = ctx->ParseMessage(_internal_add_npcsaledata(), ptr); - CHK_(ptr); - if (!ctx->DataAvailable(ptr)) break; - } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<322>(ptr)); - } else - goto handle_unusual; - continue; - // optional .Canary.protobuf.appearances.AppearanceFlagChangedToExpire changedtoexpire = 41; - case 41: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 74)) { - ptr = ctx->ParseMessage(_internal_mutable_changedtoexpire(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool corpse = 42; - case 42: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 80)) { - _Internal::set_has_corpse(&_impl_._has_bits_); - _impl_.corpse_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool player_corpse = 43; - case 43: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 88)) { - _Internal::set_has_player_corpse(&_impl_._has_bits_); - _impl_.player_corpse_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional .Canary.protobuf.appearances.AppearanceFlagCyclopedia cyclopediaitem = 44; - case 44: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 98)) { - ptr = ctx->ParseMessage(_internal_mutable_cyclopediaitem(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool ammo = 45; - case 45: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 104)) { - _Internal::set_has_ammo(&_impl_._has_bits_); - _impl_.ammo_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool show_off_socket = 46; - case 46: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 112)) { - _Internal::set_has_show_off_socket(&_impl_._has_bits_); - _impl_.show_off_socket_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool reportable = 47; - case 47: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 120)) { - _Internal::set_has_reportable(&_impl_._has_bits_); - _impl_.reportable_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional .Canary.protobuf.appearances.AppearanceFlagUpgradeClassification upgradeclassification = 48; - case 48: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 130)) { - ptr = ctx->ParseMessage(_internal_mutable_upgradeclassification(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool reverse_addons_east = 49; - case 49: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 136)) { - _Internal::set_has_reverse_addons_east(&_impl_._has_bits_); - _impl_.reverse_addons_east_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool reverse_addons_west = 50; - case 50: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 144)) { - _Internal::set_has_reverse_addons_west(&_impl_._has_bits_); - _impl_.reverse_addons_west_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool reverse_addons_south = 51; - case 51: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 152)) { - _Internal::set_has_reverse_addons_south(&_impl_._has_bits_); - _impl_.reverse_addons_south_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool reverse_addons_north = 52; - case 52: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 160)) { - _Internal::set_has_reverse_addons_north(&_impl_._has_bits_); - _impl_.reverse_addons_north_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool wearout = 53; - case 53: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 168)) { - _Internal::set_has_wearout(&_impl_._has_bits_); - _impl_.wearout_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool clockexpire = 54; - case 54: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 176)) { - _Internal::set_has_clockexpire(&_impl_._has_bits_); - _impl_.clockexpire_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool expire = 55; - case 55: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 184)) { - _Internal::set_has_expire(&_impl_._has_bits_); - _impl_.expire_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool expirestop = 56; - case 56: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 192)) { - _Internal::set_has_expirestop(&_impl_._has_bits_); - _impl_.expirestop_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bool wrapkit = 57; - case 57: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 200)) { - _Internal::set_has_wrapkit(&_impl_._has_bits_); - _impl_.wrapkit_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* AppearanceFlags::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.AppearanceFlags) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional .Canary.protobuf.appearances.AppearanceFlagBank bank = 1; - if (cached_has_bits & 0x00000001u) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(1, _Internal::bank(this), - _Internal::bank(this).GetCachedSize(), target, stream); - } - - // optional bool clip = 2; - if (cached_has_bits & 0x00008000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(2, this->_internal_clip(), target); - } - - // optional bool bottom = 3; - if (cached_has_bits & 0x00010000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(3, this->_internal_bottom(), target); - } - - // optional bool top = 4; - if (cached_has_bits & 0x00020000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(4, this->_internal_top(), target); - } - - // optional bool container = 5; - if (cached_has_bits & 0x00040000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(5, this->_internal_container(), target); - } - - // optional bool cumulative = 6; - if (cached_has_bits & 0x00080000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(6, this->_internal_cumulative(), target); - } - - // optional bool usable = 7; - if (cached_has_bits & 0x00100000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(7, this->_internal_usable(), target); - } - - // optional bool forceuse = 8; - if (cached_has_bits & 0x00200000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(8, this->_internal_forceuse(), target); - } - - // optional bool multiuse = 9; - if (cached_has_bits & 0x00400000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(9, this->_internal_multiuse(), target); - } - - // optional .Canary.protobuf.appearances.AppearanceFlagWrite write = 10; - if (cached_has_bits & 0x00000002u) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(10, _Internal::write(this), - _Internal::write(this).GetCachedSize(), target, stream); - } - - // optional .Canary.protobuf.appearances.AppearanceFlagWriteOnce write_once = 11; - if (cached_has_bits & 0x00000004u) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(11, _Internal::write_once(this), - _Internal::write_once(this).GetCachedSize(), target, stream); - } - - // optional bool liquidpool = 12; - if (cached_has_bits & 0x00800000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(12, this->_internal_liquidpool(), target); - } - - // optional bool unpass = 13; - if (cached_has_bits & 0x01000000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(13, this->_internal_unpass(), target); - } - - // optional bool unmove = 14; - if (cached_has_bits & 0x02000000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(14, this->_internal_unmove(), target); - } - - // optional bool unsight = 15; - if (cached_has_bits & 0x04000000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(15, this->_internal_unsight(), target); - } - - // optional bool avoid = 16; - if (cached_has_bits & 0x08000000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(16, this->_internal_avoid(), target); - } - - // optional bool no_movement_animation = 17; - if (cached_has_bits & 0x10000000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(17, this->_internal_no_movement_animation(), target); - } - - // optional bool take = 18; - if (cached_has_bits & 0x20000000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(18, this->_internal_take(), target); - } - - // optional bool liquidcontainer = 19; - if (cached_has_bits & 0x40000000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(19, this->_internal_liquidcontainer(), target); - } - - // optional bool hang = 20; - if (cached_has_bits & 0x80000000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(20, this->_internal_hang(), target); - } - - // optional .Canary.protobuf.appearances.AppearanceFlagHook hook = 21; - if (cached_has_bits & 0x00000008u) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(21, _Internal::hook(this), - _Internal::hook(this).GetCachedSize(), target, stream); - } - - cached_has_bits = _impl_._has_bits_[1]; - // optional bool rotate = 22; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(22, this->_internal_rotate(), target); - } - - cached_has_bits = _impl_._has_bits_[0]; - // optional .Canary.protobuf.appearances.AppearanceFlagLight light = 23; - if (cached_has_bits & 0x00000010u) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(23, _Internal::light(this), - _Internal::light(this).GetCachedSize(), target, stream); - } - - cached_has_bits = _impl_._has_bits_[1]; - // optional bool dont_hide = 24; - if (cached_has_bits & 0x00000002u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(24, this->_internal_dont_hide(), target); - } - - // optional bool translucent = 25; - if (cached_has_bits & 0x00000004u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(25, this->_internal_translucent(), target); - } - - cached_has_bits = _impl_._has_bits_[0]; - // optional .Canary.protobuf.appearances.AppearanceFlagShift shift = 26; - if (cached_has_bits & 0x00000020u) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(26, _Internal::shift(this), - _Internal::shift(this).GetCachedSize(), target, stream); - } - - // optional .Canary.protobuf.appearances.AppearanceFlagHeight height = 27; - if (cached_has_bits & 0x00000040u) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(27, _Internal::height(this), - _Internal::height(this).GetCachedSize(), target, stream); - } - - cached_has_bits = _impl_._has_bits_[1]; - // optional bool lying_object = 28; - if (cached_has_bits & 0x00000008u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(28, this->_internal_lying_object(), target); - } - - // optional bool animate_always = 29; - if (cached_has_bits & 0x00000010u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(29, this->_internal_animate_always(), target); - } - - cached_has_bits = _impl_._has_bits_[0]; - // optional .Canary.protobuf.appearances.AppearanceFlagAutomap automap = 30; - if (cached_has_bits & 0x00000080u) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(30, _Internal::automap(this), - _Internal::automap(this).GetCachedSize(), target, stream); - } - - // optional .Canary.protobuf.appearances.AppearanceFlagLenshelp lenshelp = 31; - if (cached_has_bits & 0x00000100u) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(31, _Internal::lenshelp(this), - _Internal::lenshelp(this).GetCachedSize(), target, stream); - } - - cached_has_bits = _impl_._has_bits_[1]; - // optional bool fullbank = 32; - if (cached_has_bits & 0x00000020u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(32, this->_internal_fullbank(), target); - } - - // optional bool ignore_look = 33; - if (cached_has_bits & 0x00000040u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(33, this->_internal_ignore_look(), target); - } - - cached_has_bits = _impl_._has_bits_[0]; - // optional .Canary.protobuf.appearances.AppearanceFlagClothes clothes = 34; - if (cached_has_bits & 0x00000200u) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(34, _Internal::clothes(this), - _Internal::clothes(this).GetCachedSize(), target, stream); - } - - // optional .Canary.protobuf.appearances.AppearanceFlagDefaultAction default_action = 35; - if (cached_has_bits & 0x00000400u) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(35, _Internal::default_action(this), - _Internal::default_action(this).GetCachedSize(), target, stream); - } - - // optional .Canary.protobuf.appearances.AppearanceFlagMarket market = 36; - if (cached_has_bits & 0x00000800u) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(36, _Internal::market(this), - _Internal::market(this).GetCachedSize(), target, stream); - } - - cached_has_bits = _impl_._has_bits_[1]; - // optional bool wrap = 37; - if (cached_has_bits & 0x00000080u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(37, this->_internal_wrap(), target); - } - - // optional bool unwrap = 38; - if (cached_has_bits & 0x00000100u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(38, this->_internal_unwrap(), target); - } - - // optional bool topeffect = 39; - if (cached_has_bits & 0x00000200u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(39, this->_internal_topeffect(), target); - } - - // repeated .Canary.protobuf.appearances.AppearanceFlagNPC npcsaledata = 40; - for (unsigned i = 0, - n = static_cast(this->_internal_npcsaledata_size()); i < n; i++) { - const auto& repfield = this->_internal_npcsaledata(i); - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(40, repfield, repfield.GetCachedSize(), target, stream); - } - - cached_has_bits = _impl_._has_bits_[0]; - // optional .Canary.protobuf.appearances.AppearanceFlagChangedToExpire changedtoexpire = 41; - if (cached_has_bits & 0x00001000u) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(41, _Internal::changedtoexpire(this), - _Internal::changedtoexpire(this).GetCachedSize(), target, stream); - } - - cached_has_bits = _impl_._has_bits_[1]; - // optional bool corpse = 42; - if (cached_has_bits & 0x00000400u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(42, this->_internal_corpse(), target); - } - - // optional bool player_corpse = 43; - if (cached_has_bits & 0x00000800u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(43, this->_internal_player_corpse(), target); - } - - cached_has_bits = _impl_._has_bits_[0]; - // optional .Canary.protobuf.appearances.AppearanceFlagCyclopedia cyclopediaitem = 44; - if (cached_has_bits & 0x00002000u) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(44, _Internal::cyclopediaitem(this), - _Internal::cyclopediaitem(this).GetCachedSize(), target, stream); - } - - cached_has_bits = _impl_._has_bits_[1]; - // optional bool ammo = 45; - if (cached_has_bits & 0x00001000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(45, this->_internal_ammo(), target); - } - - // optional bool show_off_socket = 46; - if (cached_has_bits & 0x00002000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(46, this->_internal_show_off_socket(), target); - } - - // optional bool reportable = 47; - if (cached_has_bits & 0x00004000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(47, this->_internal_reportable(), target); - } - - cached_has_bits = _impl_._has_bits_[0]; - // optional .Canary.protobuf.appearances.AppearanceFlagUpgradeClassification upgradeclassification = 48; - if (cached_has_bits & 0x00004000u) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(48, _Internal::upgradeclassification(this), - _Internal::upgradeclassification(this).GetCachedSize(), target, stream); - } - - cached_has_bits = _impl_._has_bits_[1]; - // optional bool reverse_addons_east = 49; - if (cached_has_bits & 0x00008000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(49, this->_internal_reverse_addons_east(), target); - } - - // optional bool reverse_addons_west = 50; - if (cached_has_bits & 0x00010000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(50, this->_internal_reverse_addons_west(), target); - } - - // optional bool reverse_addons_south = 51; - if (cached_has_bits & 0x00020000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(51, this->_internal_reverse_addons_south(), target); - } - - // optional bool reverse_addons_north = 52; - if (cached_has_bits & 0x00040000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(52, this->_internal_reverse_addons_north(), target); - } - - // optional bool wearout = 53; - if (cached_has_bits & 0x00080000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(53, this->_internal_wearout(), target); - } - - // optional bool clockexpire = 54; - if (cached_has_bits & 0x00100000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(54, this->_internal_clockexpire(), target); - } - - // optional bool expire = 55; - if (cached_has_bits & 0x00200000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(55, this->_internal_expire(), target); - } - - // optional bool expirestop = 56; - if (cached_has_bits & 0x00400000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(56, this->_internal_expirestop(), target); - } - - // optional bool wrapkit = 57; - if (cached_has_bits & 0x00800000u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(57, this->_internal_wrapkit(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.AppearanceFlags) - return target; -} - -size_t AppearanceFlags::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.AppearanceFlags) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // repeated .Canary.protobuf.appearances.AppearanceFlagNPC npcsaledata = 40; - total_size += 2UL * this->_internal_npcsaledata_size(); - for (const auto& msg : this->_impl_.npcsaledata_) { - total_size += - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg); - } - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x000000ffu) { - // optional .Canary.protobuf.appearances.AppearanceFlagBank bank = 1; - if (cached_has_bits & 0x00000001u) { - total_size += 1 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.bank_); - } - - // optional .Canary.protobuf.appearances.AppearanceFlagWrite write = 10; - if (cached_has_bits & 0x00000002u) { - total_size += 1 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.write_); - } - - // optional .Canary.protobuf.appearances.AppearanceFlagWriteOnce write_once = 11; - if (cached_has_bits & 0x00000004u) { - total_size += 1 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.write_once_); - } - - // optional .Canary.protobuf.appearances.AppearanceFlagHook hook = 21; - if (cached_has_bits & 0x00000008u) { - total_size += 2 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.hook_); - } - - // optional .Canary.protobuf.appearances.AppearanceFlagLight light = 23; - if (cached_has_bits & 0x00000010u) { - total_size += 2 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.light_); - } - - // optional .Canary.protobuf.appearances.AppearanceFlagShift shift = 26; - if (cached_has_bits & 0x00000020u) { - total_size += 2 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.shift_); - } - - // optional .Canary.protobuf.appearances.AppearanceFlagHeight height = 27; - if (cached_has_bits & 0x00000040u) { - total_size += 2 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.height_); - } - - // optional .Canary.protobuf.appearances.AppearanceFlagAutomap automap = 30; - if (cached_has_bits & 0x00000080u) { - total_size += 2 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.automap_); - } - - } - if (cached_has_bits & 0x0000ff00u) { - // optional .Canary.protobuf.appearances.AppearanceFlagLenshelp lenshelp = 31; - if (cached_has_bits & 0x00000100u) { - total_size += 2 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.lenshelp_); - } - - // optional .Canary.protobuf.appearances.AppearanceFlagClothes clothes = 34; - if (cached_has_bits & 0x00000200u) { - total_size += 2 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.clothes_); - } - - // optional .Canary.protobuf.appearances.AppearanceFlagDefaultAction default_action = 35; - if (cached_has_bits & 0x00000400u) { - total_size += 2 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.default_action_); - } - - // optional .Canary.protobuf.appearances.AppearanceFlagMarket market = 36; - if (cached_has_bits & 0x00000800u) { - total_size += 2 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.market_); - } - - // optional .Canary.protobuf.appearances.AppearanceFlagChangedToExpire changedtoexpire = 41; - if (cached_has_bits & 0x00001000u) { - total_size += 2 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.changedtoexpire_); - } - - // optional .Canary.protobuf.appearances.AppearanceFlagCyclopedia cyclopediaitem = 44; - if (cached_has_bits & 0x00002000u) { - total_size += 2 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.cyclopediaitem_); - } - - // optional .Canary.protobuf.appearances.AppearanceFlagUpgradeClassification upgradeclassification = 48; - if (cached_has_bits & 0x00004000u) { - total_size += 2 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.upgradeclassification_); - } - - // optional bool clip = 2; - if (cached_has_bits & 0x00008000u) { - total_size += 1 + 1; - } - - } - if (cached_has_bits & 0x00ff0000u) { - // optional bool bottom = 3; - if (cached_has_bits & 0x00010000u) { - total_size += 1 + 1; - } - - // optional bool top = 4; - if (cached_has_bits & 0x00020000u) { - total_size += 1 + 1; - } - - // optional bool container = 5; - if (cached_has_bits & 0x00040000u) { - total_size += 1 + 1; - } - - // optional bool cumulative = 6; - if (cached_has_bits & 0x00080000u) { - total_size += 1 + 1; - } - - // optional bool usable = 7; - if (cached_has_bits & 0x00100000u) { - total_size += 1 + 1; - } - - // optional bool forceuse = 8; - if (cached_has_bits & 0x00200000u) { - total_size += 1 + 1; - } - - // optional bool multiuse = 9; - if (cached_has_bits & 0x00400000u) { - total_size += 1 + 1; - } - - // optional bool liquidpool = 12; - if (cached_has_bits & 0x00800000u) { - total_size += 1 + 1; - } - - } - if (cached_has_bits & 0xff000000u) { - // optional bool unpass = 13; - if (cached_has_bits & 0x01000000u) { - total_size += 1 + 1; - } - - // optional bool unmove = 14; - if (cached_has_bits & 0x02000000u) { - total_size += 1 + 1; - } - - // optional bool unsight = 15; - if (cached_has_bits & 0x04000000u) { - total_size += 1 + 1; - } - - // optional bool avoid = 16; - if (cached_has_bits & 0x08000000u) { - total_size += 2 + 1; - } - - // optional bool no_movement_animation = 17; - if (cached_has_bits & 0x10000000u) { - total_size += 2 + 1; - } - - // optional bool take = 18; - if (cached_has_bits & 0x20000000u) { - total_size += 2 + 1; - } - - // optional bool liquidcontainer = 19; - if (cached_has_bits & 0x40000000u) { - total_size += 2 + 1; - } - - // optional bool hang = 20; - if (cached_has_bits & 0x80000000u) { - total_size += 2 + 1; - } - - } - cached_has_bits = _impl_._has_bits_[1]; - if (cached_has_bits & 0x000000ffu) { - // optional bool rotate = 22; - if (cached_has_bits & 0x00000001u) { - total_size += 2 + 1; - } - - // optional bool dont_hide = 24; - if (cached_has_bits & 0x00000002u) { - total_size += 2 + 1; - } - - // optional bool translucent = 25; - if (cached_has_bits & 0x00000004u) { - total_size += 2 + 1; - } - - // optional bool lying_object = 28; - if (cached_has_bits & 0x00000008u) { - total_size += 2 + 1; - } - - // optional bool animate_always = 29; - if (cached_has_bits & 0x00000010u) { - total_size += 2 + 1; - } - - // optional bool fullbank = 32; - if (cached_has_bits & 0x00000020u) { - total_size += 2 + 1; - } - - // optional bool ignore_look = 33; - if (cached_has_bits & 0x00000040u) { - total_size += 2 + 1; - } - - // optional bool wrap = 37; - if (cached_has_bits & 0x00000080u) { - total_size += 2 + 1; - } - - } - if (cached_has_bits & 0x0000ff00u) { - // optional bool unwrap = 38; - if (cached_has_bits & 0x00000100u) { - total_size += 2 + 1; - } - - // optional bool topeffect = 39; - if (cached_has_bits & 0x00000200u) { - total_size += 2 + 1; - } - - // optional bool corpse = 42; - if (cached_has_bits & 0x00000400u) { - total_size += 2 + 1; - } - - // optional bool player_corpse = 43; - if (cached_has_bits & 0x00000800u) { - total_size += 2 + 1; - } - - // optional bool ammo = 45; - if (cached_has_bits & 0x00001000u) { - total_size += 2 + 1; - } - - // optional bool show_off_socket = 46; - if (cached_has_bits & 0x00002000u) { - total_size += 2 + 1; - } - - // optional bool reportable = 47; - if (cached_has_bits & 0x00004000u) { - total_size += 2 + 1; - } - - // optional bool reverse_addons_east = 49; - if (cached_has_bits & 0x00008000u) { - total_size += 2 + 1; - } - - } - if (cached_has_bits & 0x00ff0000u) { - // optional bool reverse_addons_west = 50; - if (cached_has_bits & 0x00010000u) { - total_size += 2 + 1; - } - - // optional bool reverse_addons_south = 51; - if (cached_has_bits & 0x00020000u) { - total_size += 2 + 1; - } - - // optional bool reverse_addons_north = 52; - if (cached_has_bits & 0x00040000u) { - total_size += 2 + 1; - } - - // optional bool wearout = 53; - if (cached_has_bits & 0x00080000u) { - total_size += 2 + 1; - } - - // optional bool clockexpire = 54; - if (cached_has_bits & 0x00100000u) { - total_size += 2 + 1; - } - - // optional bool expire = 55; - if (cached_has_bits & 0x00200000u) { - total_size += 2 + 1; - } - - // optional bool expirestop = 56; - if (cached_has_bits & 0x00400000u) { - total_size += 2 + 1; - } - - // optional bool wrapkit = 57; - if (cached_has_bits & 0x00800000u) { - total_size += 2 + 1; - } - - } - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData AppearanceFlags::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - AppearanceFlags::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*AppearanceFlags::GetClassData() const { return &_class_data_; } - - -void AppearanceFlags::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.AppearanceFlags) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - _this->_impl_.npcsaledata_.MergeFrom(from._impl_.npcsaledata_); - cached_has_bits = from._impl_._has_bits_[0]; - if (cached_has_bits & 0x000000ffu) { - if (cached_has_bits & 0x00000001u) { - _this->_internal_mutable_bank()->::Canary::protobuf::appearances::AppearanceFlagBank::MergeFrom( - from._internal_bank()); - } - if (cached_has_bits & 0x00000002u) { - _this->_internal_mutable_write()->::Canary::protobuf::appearances::AppearanceFlagWrite::MergeFrom( - from._internal_write()); - } - if (cached_has_bits & 0x00000004u) { - _this->_internal_mutable_write_once()->::Canary::protobuf::appearances::AppearanceFlagWriteOnce::MergeFrom( - from._internal_write_once()); - } - if (cached_has_bits & 0x00000008u) { - _this->_internal_mutable_hook()->::Canary::protobuf::appearances::AppearanceFlagHook::MergeFrom( - from._internal_hook()); - } - if (cached_has_bits & 0x00000010u) { - _this->_internal_mutable_light()->::Canary::protobuf::appearances::AppearanceFlagLight::MergeFrom( - from._internal_light()); - } - if (cached_has_bits & 0x00000020u) { - _this->_internal_mutable_shift()->::Canary::protobuf::appearances::AppearanceFlagShift::MergeFrom( - from._internal_shift()); - } - if (cached_has_bits & 0x00000040u) { - _this->_internal_mutable_height()->::Canary::protobuf::appearances::AppearanceFlagHeight::MergeFrom( - from._internal_height()); - } - if (cached_has_bits & 0x00000080u) { - _this->_internal_mutable_automap()->::Canary::protobuf::appearances::AppearanceFlagAutomap::MergeFrom( - from._internal_automap()); - } - } - if (cached_has_bits & 0x0000ff00u) { - if (cached_has_bits & 0x00000100u) { - _this->_internal_mutable_lenshelp()->::Canary::protobuf::appearances::AppearanceFlagLenshelp::MergeFrom( - from._internal_lenshelp()); - } - if (cached_has_bits & 0x00000200u) { - _this->_internal_mutable_clothes()->::Canary::protobuf::appearances::AppearanceFlagClothes::MergeFrom( - from._internal_clothes()); - } - if (cached_has_bits & 0x00000400u) { - _this->_internal_mutable_default_action()->::Canary::protobuf::appearances::AppearanceFlagDefaultAction::MergeFrom( - from._internal_default_action()); - } - if (cached_has_bits & 0x00000800u) { - _this->_internal_mutable_market()->::Canary::protobuf::appearances::AppearanceFlagMarket::MergeFrom( - from._internal_market()); - } - if (cached_has_bits & 0x00001000u) { - _this->_internal_mutable_changedtoexpire()->::Canary::protobuf::appearances::AppearanceFlagChangedToExpire::MergeFrom( - from._internal_changedtoexpire()); - } - if (cached_has_bits & 0x00002000u) { - _this->_internal_mutable_cyclopediaitem()->::Canary::protobuf::appearances::AppearanceFlagCyclopedia::MergeFrom( - from._internal_cyclopediaitem()); - } - if (cached_has_bits & 0x00004000u) { - _this->_internal_mutable_upgradeclassification()->::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification::MergeFrom( - from._internal_upgradeclassification()); - } - if (cached_has_bits & 0x00008000u) { - _this->_impl_.clip_ = from._impl_.clip_; - } - _this->_impl_._has_bits_[0] |= cached_has_bits; - } - if (cached_has_bits & 0x00ff0000u) { - if (cached_has_bits & 0x00010000u) { - _this->_impl_.bottom_ = from._impl_.bottom_; - } - if (cached_has_bits & 0x00020000u) { - _this->_impl_.top_ = from._impl_.top_; - } - if (cached_has_bits & 0x00040000u) { - _this->_impl_.container_ = from._impl_.container_; - } - if (cached_has_bits & 0x00080000u) { - _this->_impl_.cumulative_ = from._impl_.cumulative_; - } - if (cached_has_bits & 0x00100000u) { - _this->_impl_.usable_ = from._impl_.usable_; - } - if (cached_has_bits & 0x00200000u) { - _this->_impl_.forceuse_ = from._impl_.forceuse_; - } - if (cached_has_bits & 0x00400000u) { - _this->_impl_.multiuse_ = from._impl_.multiuse_; - } - if (cached_has_bits & 0x00800000u) { - _this->_impl_.liquidpool_ = from._impl_.liquidpool_; - } - _this->_impl_._has_bits_[0] |= cached_has_bits; - } - if (cached_has_bits & 0xff000000u) { - if (cached_has_bits & 0x01000000u) { - _this->_impl_.unpass_ = from._impl_.unpass_; - } - if (cached_has_bits & 0x02000000u) { - _this->_impl_.unmove_ = from._impl_.unmove_; - } - if (cached_has_bits & 0x04000000u) { - _this->_impl_.unsight_ = from._impl_.unsight_; - } - if (cached_has_bits & 0x08000000u) { - _this->_impl_.avoid_ = from._impl_.avoid_; - } - if (cached_has_bits & 0x10000000u) { - _this->_impl_.no_movement_animation_ = from._impl_.no_movement_animation_; - } - if (cached_has_bits & 0x20000000u) { - _this->_impl_.take_ = from._impl_.take_; - } - if (cached_has_bits & 0x40000000u) { - _this->_impl_.liquidcontainer_ = from._impl_.liquidcontainer_; - } - if (cached_has_bits & 0x80000000u) { - _this->_impl_.hang_ = from._impl_.hang_; - } - _this->_impl_._has_bits_[0] |= cached_has_bits; - } - cached_has_bits = from._impl_._has_bits_[1]; - if (cached_has_bits & 0x000000ffu) { - if (cached_has_bits & 0x00000001u) { - _this->_impl_.rotate_ = from._impl_.rotate_; - } - if (cached_has_bits & 0x00000002u) { - _this->_impl_.dont_hide_ = from._impl_.dont_hide_; - } - if (cached_has_bits & 0x00000004u) { - _this->_impl_.translucent_ = from._impl_.translucent_; - } - if (cached_has_bits & 0x00000008u) { - _this->_impl_.lying_object_ = from._impl_.lying_object_; - } - if (cached_has_bits & 0x00000010u) { - _this->_impl_.animate_always_ = from._impl_.animate_always_; - } - if (cached_has_bits & 0x00000020u) { - _this->_impl_.fullbank_ = from._impl_.fullbank_; - } - if (cached_has_bits & 0x00000040u) { - _this->_impl_.ignore_look_ = from._impl_.ignore_look_; - } - if (cached_has_bits & 0x00000080u) { - _this->_impl_.wrap_ = from._impl_.wrap_; - } - _this->_impl_._has_bits_[1] |= cached_has_bits; - } - if (cached_has_bits & 0x0000ff00u) { - if (cached_has_bits & 0x00000100u) { - _this->_impl_.unwrap_ = from._impl_.unwrap_; - } - if (cached_has_bits & 0x00000200u) { - _this->_impl_.topeffect_ = from._impl_.topeffect_; - } - if (cached_has_bits & 0x00000400u) { - _this->_impl_.corpse_ = from._impl_.corpse_; - } - if (cached_has_bits & 0x00000800u) { - _this->_impl_.player_corpse_ = from._impl_.player_corpse_; - } - if (cached_has_bits & 0x00001000u) { - _this->_impl_.ammo_ = from._impl_.ammo_; - } - if (cached_has_bits & 0x00002000u) { - _this->_impl_.show_off_socket_ = from._impl_.show_off_socket_; - } - if (cached_has_bits & 0x00004000u) { - _this->_impl_.reportable_ = from._impl_.reportable_; - } - if (cached_has_bits & 0x00008000u) { - _this->_impl_.reverse_addons_east_ = from._impl_.reverse_addons_east_; - } - _this->_impl_._has_bits_[1] |= cached_has_bits; - } - if (cached_has_bits & 0x00ff0000u) { - if (cached_has_bits & 0x00010000u) { - _this->_impl_.reverse_addons_west_ = from._impl_.reverse_addons_west_; - } - if (cached_has_bits & 0x00020000u) { - _this->_impl_.reverse_addons_south_ = from._impl_.reverse_addons_south_; - } - if (cached_has_bits & 0x00040000u) { - _this->_impl_.reverse_addons_north_ = from._impl_.reverse_addons_north_; - } - if (cached_has_bits & 0x00080000u) { - _this->_impl_.wearout_ = from._impl_.wearout_; - } - if (cached_has_bits & 0x00100000u) { - _this->_impl_.clockexpire_ = from._impl_.clockexpire_; - } - if (cached_has_bits & 0x00200000u) { - _this->_impl_.expire_ = from._impl_.expire_; - } - if (cached_has_bits & 0x00400000u) { - _this->_impl_.expirestop_ = from._impl_.expirestop_; - } - if (cached_has_bits & 0x00800000u) { - _this->_impl_.wrapkit_ = from._impl_.wrapkit_; - } - _this->_impl_._has_bits_[1] |= cached_has_bits; - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void AppearanceFlags::CopyFrom(const AppearanceFlags& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.AppearanceFlags) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool AppearanceFlags::IsInitialized() const { - return true; -} - -void AppearanceFlags::InternalSwap(AppearanceFlags* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - swap(_impl_._has_bits_[1], other->_impl_._has_bits_[1]); - _impl_.npcsaledata_.InternalSwap(&other->_impl_.npcsaledata_); - ::PROTOBUF_NAMESPACE_ID::internal::memswap< - PROTOBUF_FIELD_OFFSET(AppearanceFlags, _impl_.wrapkit_) - + sizeof(AppearanceFlags::_impl_.wrapkit_) - - PROTOBUF_FIELD_OFFSET(AppearanceFlags, _impl_.bank_)>( - reinterpret_cast(&_impl_.bank_), - reinterpret_cast(&other->_impl_.bank_)); -} - -::PROTOBUF_NAMESPACE_ID::Metadata AppearanceFlags::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[8]); -} - -// =================================================================== - -class AppearanceFlagUpgradeClassification::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_upgrade_classification(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } -}; - -AppearanceFlagUpgradeClassification::AppearanceFlagUpgradeClassification(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.AppearanceFlagUpgradeClassification) -} -AppearanceFlagUpgradeClassification::AppearanceFlagUpgradeClassification(const AppearanceFlagUpgradeClassification& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - AppearanceFlagUpgradeClassification* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.upgrade_classification_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - _this->_impl_.upgrade_classification_ = from._impl_.upgrade_classification_; - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.AppearanceFlagUpgradeClassification) -} - -inline void AppearanceFlagUpgradeClassification::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.upgrade_classification_){0u} - }; -} - -AppearanceFlagUpgradeClassification::~AppearanceFlagUpgradeClassification() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.AppearanceFlagUpgradeClassification) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void AppearanceFlagUpgradeClassification::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); -} - -void AppearanceFlagUpgradeClassification::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void AppearanceFlagUpgradeClassification::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.AppearanceFlagUpgradeClassification) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.upgrade_classification_ = 0u; - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* AppearanceFlagUpgradeClassification::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional uint32 upgrade_classification = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - _Internal::set_has_upgrade_classification(&has_bits); - _impl_.upgrade_classification_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* AppearanceFlagUpgradeClassification::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.AppearanceFlagUpgradeClassification) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional uint32 upgrade_classification = 1; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(1, this->_internal_upgrade_classification(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.AppearanceFlagUpgradeClassification) - return target; -} - -size_t AppearanceFlagUpgradeClassification::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.AppearanceFlagUpgradeClassification) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // optional uint32 upgrade_classification = 1; - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000001u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_upgrade_classification()); - } - - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData AppearanceFlagUpgradeClassification::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - AppearanceFlagUpgradeClassification::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*AppearanceFlagUpgradeClassification::GetClassData() const { return &_class_data_; } - - -void AppearanceFlagUpgradeClassification::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.AppearanceFlagUpgradeClassification) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - if (from._internal_has_upgrade_classification()) { - _this->_internal_set_upgrade_classification(from._internal_upgrade_classification()); - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void AppearanceFlagUpgradeClassification::CopyFrom(const AppearanceFlagUpgradeClassification& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.AppearanceFlagUpgradeClassification) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool AppearanceFlagUpgradeClassification::IsInitialized() const { - return true; -} - -void AppearanceFlagUpgradeClassification::InternalSwap(AppearanceFlagUpgradeClassification* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - swap(_impl_.upgrade_classification_, other->_impl_.upgrade_classification_); -} - -::PROTOBUF_NAMESPACE_ID::Metadata AppearanceFlagUpgradeClassification::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[9]); -} - -// =================================================================== - -class AppearanceFlagBank::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_waypoints(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } -}; - -AppearanceFlagBank::AppearanceFlagBank(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.AppearanceFlagBank) -} -AppearanceFlagBank::AppearanceFlagBank(const AppearanceFlagBank& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - AppearanceFlagBank* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.waypoints_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - _this->_impl_.waypoints_ = from._impl_.waypoints_; - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.AppearanceFlagBank) -} - -inline void AppearanceFlagBank::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.waypoints_){0u} - }; -} - -AppearanceFlagBank::~AppearanceFlagBank() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.AppearanceFlagBank) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void AppearanceFlagBank::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); -} - -void AppearanceFlagBank::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void AppearanceFlagBank::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.AppearanceFlagBank) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.waypoints_ = 0u; - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* AppearanceFlagBank::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional uint32 waypoints = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - _Internal::set_has_waypoints(&has_bits); - _impl_.waypoints_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* AppearanceFlagBank::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.AppearanceFlagBank) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional uint32 waypoints = 1; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(1, this->_internal_waypoints(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.AppearanceFlagBank) - return target; -} - -size_t AppearanceFlagBank::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.AppearanceFlagBank) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // optional uint32 waypoints = 1; - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000001u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_waypoints()); - } - - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData AppearanceFlagBank::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - AppearanceFlagBank::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*AppearanceFlagBank::GetClassData() const { return &_class_data_; } - - -void AppearanceFlagBank::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.AppearanceFlagBank) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - if (from._internal_has_waypoints()) { - _this->_internal_set_waypoints(from._internal_waypoints()); - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void AppearanceFlagBank::CopyFrom(const AppearanceFlagBank& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.AppearanceFlagBank) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool AppearanceFlagBank::IsInitialized() const { - return true; -} - -void AppearanceFlagBank::InternalSwap(AppearanceFlagBank* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - swap(_impl_.waypoints_, other->_impl_.waypoints_); -} - -::PROTOBUF_NAMESPACE_ID::Metadata AppearanceFlagBank::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[10]); -} - -// =================================================================== - -class AppearanceFlagWrite::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_max_text_length(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } -}; - -AppearanceFlagWrite::AppearanceFlagWrite(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.AppearanceFlagWrite) -} -AppearanceFlagWrite::AppearanceFlagWrite(const AppearanceFlagWrite& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - AppearanceFlagWrite* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.max_text_length_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - _this->_impl_.max_text_length_ = from._impl_.max_text_length_; - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.AppearanceFlagWrite) -} - -inline void AppearanceFlagWrite::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.max_text_length_){0u} - }; -} - -AppearanceFlagWrite::~AppearanceFlagWrite() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.AppearanceFlagWrite) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void AppearanceFlagWrite::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); -} - -void AppearanceFlagWrite::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void AppearanceFlagWrite::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.AppearanceFlagWrite) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.max_text_length_ = 0u; - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* AppearanceFlagWrite::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional uint32 max_text_length = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - _Internal::set_has_max_text_length(&has_bits); - _impl_.max_text_length_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* AppearanceFlagWrite::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.AppearanceFlagWrite) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional uint32 max_text_length = 1; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(1, this->_internal_max_text_length(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.AppearanceFlagWrite) - return target; -} - -size_t AppearanceFlagWrite::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.AppearanceFlagWrite) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // optional uint32 max_text_length = 1; - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000001u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_max_text_length()); - } - - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData AppearanceFlagWrite::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - AppearanceFlagWrite::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*AppearanceFlagWrite::GetClassData() const { return &_class_data_; } - - -void AppearanceFlagWrite::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.AppearanceFlagWrite) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - if (from._internal_has_max_text_length()) { - _this->_internal_set_max_text_length(from._internal_max_text_length()); - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void AppearanceFlagWrite::CopyFrom(const AppearanceFlagWrite& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.AppearanceFlagWrite) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool AppearanceFlagWrite::IsInitialized() const { - return true; -} - -void AppearanceFlagWrite::InternalSwap(AppearanceFlagWrite* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - swap(_impl_.max_text_length_, other->_impl_.max_text_length_); -} - -::PROTOBUF_NAMESPACE_ID::Metadata AppearanceFlagWrite::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[11]); -} - -// =================================================================== - -class AppearanceFlagWriteOnce::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_max_text_length_once(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } -}; - -AppearanceFlagWriteOnce::AppearanceFlagWriteOnce(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.AppearanceFlagWriteOnce) -} -AppearanceFlagWriteOnce::AppearanceFlagWriteOnce(const AppearanceFlagWriteOnce& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - AppearanceFlagWriteOnce* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.max_text_length_once_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - _this->_impl_.max_text_length_once_ = from._impl_.max_text_length_once_; - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.AppearanceFlagWriteOnce) -} - -inline void AppearanceFlagWriteOnce::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.max_text_length_once_){0u} - }; -} - -AppearanceFlagWriteOnce::~AppearanceFlagWriteOnce() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.AppearanceFlagWriteOnce) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void AppearanceFlagWriteOnce::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); -} - -void AppearanceFlagWriteOnce::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void AppearanceFlagWriteOnce::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.AppearanceFlagWriteOnce) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.max_text_length_once_ = 0u; - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* AppearanceFlagWriteOnce::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional uint32 max_text_length_once = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - _Internal::set_has_max_text_length_once(&has_bits); - _impl_.max_text_length_once_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* AppearanceFlagWriteOnce::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.AppearanceFlagWriteOnce) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional uint32 max_text_length_once = 1; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(1, this->_internal_max_text_length_once(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.AppearanceFlagWriteOnce) - return target; -} - -size_t AppearanceFlagWriteOnce::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.AppearanceFlagWriteOnce) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // optional uint32 max_text_length_once = 1; - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000001u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_max_text_length_once()); - } - - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData AppearanceFlagWriteOnce::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - AppearanceFlagWriteOnce::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*AppearanceFlagWriteOnce::GetClassData() const { return &_class_data_; } - - -void AppearanceFlagWriteOnce::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.AppearanceFlagWriteOnce) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - if (from._internal_has_max_text_length_once()) { - _this->_internal_set_max_text_length_once(from._internal_max_text_length_once()); - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void AppearanceFlagWriteOnce::CopyFrom(const AppearanceFlagWriteOnce& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.AppearanceFlagWriteOnce) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool AppearanceFlagWriteOnce::IsInitialized() const { - return true; -} - -void AppearanceFlagWriteOnce::InternalSwap(AppearanceFlagWriteOnce* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - swap(_impl_.max_text_length_once_, other->_impl_.max_text_length_once_); -} - -::PROTOBUF_NAMESPACE_ID::Metadata AppearanceFlagWriteOnce::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[12]); -} - -// =================================================================== - -class AppearanceFlagLight::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_brightness(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } - static void set_has_color(HasBits* has_bits) { - (*has_bits)[0] |= 2u; - } -}; - -AppearanceFlagLight::AppearanceFlagLight(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.AppearanceFlagLight) -} -AppearanceFlagLight::AppearanceFlagLight(const AppearanceFlagLight& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - AppearanceFlagLight* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.brightness_){} - , decltype(_impl_.color_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - ::memcpy(&_impl_.brightness_, &from._impl_.brightness_, - static_cast(reinterpret_cast(&_impl_.color_) - - reinterpret_cast(&_impl_.brightness_)) + sizeof(_impl_.color_)); - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.AppearanceFlagLight) -} - -inline void AppearanceFlagLight::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.brightness_){0u} - , decltype(_impl_.color_){0u} - }; -} - -AppearanceFlagLight::~AppearanceFlagLight() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.AppearanceFlagLight) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void AppearanceFlagLight::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); -} - -void AppearanceFlagLight::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void AppearanceFlagLight::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.AppearanceFlagLight) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000003u) { - ::memset(&_impl_.brightness_, 0, static_cast( - reinterpret_cast(&_impl_.color_) - - reinterpret_cast(&_impl_.brightness_)) + sizeof(_impl_.color_)); - } - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* AppearanceFlagLight::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional uint32 brightness = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - _Internal::set_has_brightness(&has_bits); - _impl_.brightness_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 color = 2; - case 2: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 16)) { - _Internal::set_has_color(&has_bits); - _impl_.color_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* AppearanceFlagLight::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.AppearanceFlagLight) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional uint32 brightness = 1; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(1, this->_internal_brightness(), target); - } - - // optional uint32 color = 2; - if (cached_has_bits & 0x00000002u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(2, this->_internal_color(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.AppearanceFlagLight) - return target; -} - -size_t AppearanceFlagLight::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.AppearanceFlagLight) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000003u) { - // optional uint32 brightness = 1; - if (cached_has_bits & 0x00000001u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_brightness()); - } - - // optional uint32 color = 2; - if (cached_has_bits & 0x00000002u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_color()); - } - - } - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData AppearanceFlagLight::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - AppearanceFlagLight::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*AppearanceFlagLight::GetClassData() const { return &_class_data_; } - - -void AppearanceFlagLight::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.AppearanceFlagLight) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = from._impl_._has_bits_[0]; - if (cached_has_bits & 0x00000003u) { - if (cached_has_bits & 0x00000001u) { - _this->_impl_.brightness_ = from._impl_.brightness_; - } - if (cached_has_bits & 0x00000002u) { - _this->_impl_.color_ = from._impl_.color_; - } - _this->_impl_._has_bits_[0] |= cached_has_bits; - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void AppearanceFlagLight::CopyFrom(const AppearanceFlagLight& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.AppearanceFlagLight) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool AppearanceFlagLight::IsInitialized() const { - return true; -} - -void AppearanceFlagLight::InternalSwap(AppearanceFlagLight* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - ::PROTOBUF_NAMESPACE_ID::internal::memswap< - PROTOBUF_FIELD_OFFSET(AppearanceFlagLight, _impl_.color_) - + sizeof(AppearanceFlagLight::_impl_.color_) - - PROTOBUF_FIELD_OFFSET(AppearanceFlagLight, _impl_.brightness_)>( - reinterpret_cast(&_impl_.brightness_), - reinterpret_cast(&other->_impl_.brightness_)); -} - -::PROTOBUF_NAMESPACE_ID::Metadata AppearanceFlagLight::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[13]); -} - -// =================================================================== - -class AppearanceFlagHeight::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_elevation(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } -}; - -AppearanceFlagHeight::AppearanceFlagHeight(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.AppearanceFlagHeight) -} -AppearanceFlagHeight::AppearanceFlagHeight(const AppearanceFlagHeight& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - AppearanceFlagHeight* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.elevation_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - _this->_impl_.elevation_ = from._impl_.elevation_; - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.AppearanceFlagHeight) -} - -inline void AppearanceFlagHeight::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.elevation_){0u} - }; -} - -AppearanceFlagHeight::~AppearanceFlagHeight() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.AppearanceFlagHeight) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void AppearanceFlagHeight::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); -} - -void AppearanceFlagHeight::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void AppearanceFlagHeight::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.AppearanceFlagHeight) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.elevation_ = 0u; - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* AppearanceFlagHeight::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional uint32 elevation = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - _Internal::set_has_elevation(&has_bits); - _impl_.elevation_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* AppearanceFlagHeight::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.AppearanceFlagHeight) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional uint32 elevation = 1; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(1, this->_internal_elevation(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.AppearanceFlagHeight) - return target; -} - -size_t AppearanceFlagHeight::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.AppearanceFlagHeight) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // optional uint32 elevation = 1; - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000001u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_elevation()); - } - - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData AppearanceFlagHeight::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - AppearanceFlagHeight::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*AppearanceFlagHeight::GetClassData() const { return &_class_data_; } - - -void AppearanceFlagHeight::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.AppearanceFlagHeight) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - if (from._internal_has_elevation()) { - _this->_internal_set_elevation(from._internal_elevation()); - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void AppearanceFlagHeight::CopyFrom(const AppearanceFlagHeight& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.AppearanceFlagHeight) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool AppearanceFlagHeight::IsInitialized() const { - return true; -} - -void AppearanceFlagHeight::InternalSwap(AppearanceFlagHeight* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - swap(_impl_.elevation_, other->_impl_.elevation_); -} - -::PROTOBUF_NAMESPACE_ID::Metadata AppearanceFlagHeight::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[14]); -} - -// =================================================================== - -class AppearanceFlagShift::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_x(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } - static void set_has_y(HasBits* has_bits) { - (*has_bits)[0] |= 2u; - } -}; - -AppearanceFlagShift::AppearanceFlagShift(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.AppearanceFlagShift) -} -AppearanceFlagShift::AppearanceFlagShift(const AppearanceFlagShift& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - AppearanceFlagShift* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.x_){} - , decltype(_impl_.y_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - ::memcpy(&_impl_.x_, &from._impl_.x_, - static_cast(reinterpret_cast(&_impl_.y_) - - reinterpret_cast(&_impl_.x_)) + sizeof(_impl_.y_)); - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.AppearanceFlagShift) -} - -inline void AppearanceFlagShift::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.x_){0u} - , decltype(_impl_.y_){0u} - }; -} - -AppearanceFlagShift::~AppearanceFlagShift() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.AppearanceFlagShift) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void AppearanceFlagShift::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); -} - -void AppearanceFlagShift::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void AppearanceFlagShift::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.AppearanceFlagShift) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000003u) { - ::memset(&_impl_.x_, 0, static_cast( - reinterpret_cast(&_impl_.y_) - - reinterpret_cast(&_impl_.x_)) + sizeof(_impl_.y_)); - } - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* AppearanceFlagShift::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional uint32 x = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - _Internal::set_has_x(&has_bits); - _impl_.x_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 y = 2; - case 2: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 16)) { - _Internal::set_has_y(&has_bits); - _impl_.y_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* AppearanceFlagShift::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.AppearanceFlagShift) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional uint32 x = 1; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(1, this->_internal_x(), target); - } - - // optional uint32 y = 2; - if (cached_has_bits & 0x00000002u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(2, this->_internal_y(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.AppearanceFlagShift) - return target; -} - -size_t AppearanceFlagShift::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.AppearanceFlagShift) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000003u) { - // optional uint32 x = 1; - if (cached_has_bits & 0x00000001u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_x()); - } - - // optional uint32 y = 2; - if (cached_has_bits & 0x00000002u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_y()); - } - - } - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData AppearanceFlagShift::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - AppearanceFlagShift::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*AppearanceFlagShift::GetClassData() const { return &_class_data_; } - - -void AppearanceFlagShift::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.AppearanceFlagShift) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = from._impl_._has_bits_[0]; - if (cached_has_bits & 0x00000003u) { - if (cached_has_bits & 0x00000001u) { - _this->_impl_.x_ = from._impl_.x_; - } - if (cached_has_bits & 0x00000002u) { - _this->_impl_.y_ = from._impl_.y_; - } - _this->_impl_._has_bits_[0] |= cached_has_bits; - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void AppearanceFlagShift::CopyFrom(const AppearanceFlagShift& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.AppearanceFlagShift) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool AppearanceFlagShift::IsInitialized() const { - return true; -} - -void AppearanceFlagShift::InternalSwap(AppearanceFlagShift* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - ::PROTOBUF_NAMESPACE_ID::internal::memswap< - PROTOBUF_FIELD_OFFSET(AppearanceFlagShift, _impl_.y_) - + sizeof(AppearanceFlagShift::_impl_.y_) - - PROTOBUF_FIELD_OFFSET(AppearanceFlagShift, _impl_.x_)>( - reinterpret_cast(&_impl_.x_), - reinterpret_cast(&other->_impl_.x_)); -} - -::PROTOBUF_NAMESPACE_ID::Metadata AppearanceFlagShift::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[15]); -} - -// =================================================================== - -class AppearanceFlagClothes::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_slot(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } -}; - -AppearanceFlagClothes::AppearanceFlagClothes(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.AppearanceFlagClothes) -} -AppearanceFlagClothes::AppearanceFlagClothes(const AppearanceFlagClothes& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - AppearanceFlagClothes* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.slot_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - _this->_impl_.slot_ = from._impl_.slot_; - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.AppearanceFlagClothes) -} - -inline void AppearanceFlagClothes::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.slot_){0u} - }; -} - -AppearanceFlagClothes::~AppearanceFlagClothes() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.AppearanceFlagClothes) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void AppearanceFlagClothes::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); -} - -void AppearanceFlagClothes::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void AppearanceFlagClothes::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.AppearanceFlagClothes) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.slot_ = 0u; - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* AppearanceFlagClothes::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional uint32 slot = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - _Internal::set_has_slot(&has_bits); - _impl_.slot_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* AppearanceFlagClothes::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.AppearanceFlagClothes) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional uint32 slot = 1; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(1, this->_internal_slot(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.AppearanceFlagClothes) - return target; -} - -size_t AppearanceFlagClothes::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.AppearanceFlagClothes) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // optional uint32 slot = 1; - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000001u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_slot()); - } - - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData AppearanceFlagClothes::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - AppearanceFlagClothes::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*AppearanceFlagClothes::GetClassData() const { return &_class_data_; } - - -void AppearanceFlagClothes::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.AppearanceFlagClothes) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - if (from._internal_has_slot()) { - _this->_internal_set_slot(from._internal_slot()); - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void AppearanceFlagClothes::CopyFrom(const AppearanceFlagClothes& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.AppearanceFlagClothes) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool AppearanceFlagClothes::IsInitialized() const { - return true; -} - -void AppearanceFlagClothes::InternalSwap(AppearanceFlagClothes* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - swap(_impl_.slot_, other->_impl_.slot_); -} - -::PROTOBUF_NAMESPACE_ID::Metadata AppearanceFlagClothes::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[16]); -} - -// =================================================================== - -class AppearanceFlagDefaultAction::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_action(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } -}; - -AppearanceFlagDefaultAction::AppearanceFlagDefaultAction(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.AppearanceFlagDefaultAction) -} -AppearanceFlagDefaultAction::AppearanceFlagDefaultAction(const AppearanceFlagDefaultAction& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - AppearanceFlagDefaultAction* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.action_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - _this->_impl_.action_ = from._impl_.action_; - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.AppearanceFlagDefaultAction) -} - -inline void AppearanceFlagDefaultAction::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.action_){0} - }; -} - -AppearanceFlagDefaultAction::~AppearanceFlagDefaultAction() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.AppearanceFlagDefaultAction) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void AppearanceFlagDefaultAction::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); -} - -void AppearanceFlagDefaultAction::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void AppearanceFlagDefaultAction::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.AppearanceFlagDefaultAction) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.action_ = 0; - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* AppearanceFlagDefaultAction::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional .Canary.protobuf.appearances.PLAYER_ACTION action = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - if (PROTOBUF_PREDICT_TRUE(::Canary::protobuf::appearances::PLAYER_ACTION_IsValid(val))) { - _internal_set_action(static_cast<::Canary::protobuf::appearances::PLAYER_ACTION>(val)); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::WriteVarint(1, val, mutable_unknown_fields()); - } - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* AppearanceFlagDefaultAction::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.AppearanceFlagDefaultAction) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional .Canary.protobuf.appearances.PLAYER_ACTION action = 1; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteEnumToArray( - 1, this->_internal_action(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.AppearanceFlagDefaultAction) - return target; -} - -size_t AppearanceFlagDefaultAction::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.AppearanceFlagDefaultAction) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // optional .Canary.protobuf.appearances.PLAYER_ACTION action = 1; - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000001u) { - total_size += 1 + - ::_pbi::WireFormatLite::EnumSize(this->_internal_action()); - } - - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData AppearanceFlagDefaultAction::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - AppearanceFlagDefaultAction::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*AppearanceFlagDefaultAction::GetClassData() const { return &_class_data_; } - - -void AppearanceFlagDefaultAction::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.AppearanceFlagDefaultAction) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - if (from._internal_has_action()) { - _this->_internal_set_action(from._internal_action()); - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void AppearanceFlagDefaultAction::CopyFrom(const AppearanceFlagDefaultAction& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.AppearanceFlagDefaultAction) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool AppearanceFlagDefaultAction::IsInitialized() const { - return true; -} - -void AppearanceFlagDefaultAction::InternalSwap(AppearanceFlagDefaultAction* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - swap(_impl_.action_, other->_impl_.action_); -} - -::PROTOBUF_NAMESPACE_ID::Metadata AppearanceFlagDefaultAction::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[17]); -} - -// =================================================================== - -class AppearanceFlagMarket::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_category(HasBits* has_bits) { - (*has_bits)[0] |= 8u; - } - static void set_has_trade_as_object_id(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } - static void set_has_show_as_object_id(HasBits* has_bits) { - (*has_bits)[0] |= 2u; - } - static void set_has_minimum_level(HasBits* has_bits) { - (*has_bits)[0] |= 4u; - } -}; - -AppearanceFlagMarket::AppearanceFlagMarket(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.AppearanceFlagMarket) -} -AppearanceFlagMarket::AppearanceFlagMarket(const AppearanceFlagMarket& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - AppearanceFlagMarket* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.restrict_to_profession_){from._impl_.restrict_to_profession_} - , decltype(_impl_.trade_as_object_id_){} - , decltype(_impl_.show_as_object_id_){} - , decltype(_impl_.minimum_level_){} - , decltype(_impl_.category_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - ::memcpy(&_impl_.trade_as_object_id_, &from._impl_.trade_as_object_id_, - static_cast(reinterpret_cast(&_impl_.category_) - - reinterpret_cast(&_impl_.trade_as_object_id_)) + sizeof(_impl_.category_)); - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.AppearanceFlagMarket) -} - -inline void AppearanceFlagMarket::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.restrict_to_profession_){arena} - , decltype(_impl_.trade_as_object_id_){0u} - , decltype(_impl_.show_as_object_id_){0u} - , decltype(_impl_.minimum_level_){0u} - , decltype(_impl_.category_){1} - }; -} - -AppearanceFlagMarket::~AppearanceFlagMarket() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.AppearanceFlagMarket) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void AppearanceFlagMarket::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); - _impl_.restrict_to_profession_.~RepeatedField(); -} - -void AppearanceFlagMarket::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void AppearanceFlagMarket::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.AppearanceFlagMarket) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.restrict_to_profession_.Clear(); - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x0000000fu) { - ::memset(&_impl_.trade_as_object_id_, 0, static_cast( - reinterpret_cast(&_impl_.minimum_level_) - - reinterpret_cast(&_impl_.trade_as_object_id_)) + sizeof(_impl_.minimum_level_)); - _impl_.category_ = 1; - } - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* AppearanceFlagMarket::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional .Canary.protobuf.appearances.ITEM_CATEGORY category = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - if (PROTOBUF_PREDICT_TRUE(::Canary::protobuf::appearances::ITEM_CATEGORY_IsValid(val))) { - _internal_set_category(static_cast<::Canary::protobuf::appearances::ITEM_CATEGORY>(val)); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::WriteVarint(1, val, mutable_unknown_fields()); - } - } else - goto handle_unusual; - continue; - // optional uint32 trade_as_object_id = 2; - case 2: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 16)) { - _Internal::set_has_trade_as_object_id(&has_bits); - _impl_.trade_as_object_id_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 show_as_object_id = 3; - case 3: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 24)) { - _Internal::set_has_show_as_object_id(&has_bits); - _impl_.show_as_object_id_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // repeated .Canary.protobuf.appearances.PLAYER_PROFESSION restrict_to_profession = 5; - case 5: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 40)) { - ptr -= 1; - do { - ptr += 1; - uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - if (PROTOBUF_PREDICT_TRUE(::Canary::protobuf::appearances::PLAYER_PROFESSION_IsValid(val))) { - _internal_add_restrict_to_profession(static_cast<::Canary::protobuf::appearances::PLAYER_PROFESSION>(val)); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::WriteVarint(5, val, mutable_unknown_fields()); - } - if (!ctx->DataAvailable(ptr)) break; - } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<40>(ptr)); - } else if (static_cast(tag) == 42) { - ptr = ::PROTOBUF_NAMESPACE_ID::internal::PackedEnumParser<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(_internal_mutable_restrict_to_profession(), ptr, ctx, ::Canary::protobuf::appearances::PLAYER_PROFESSION_IsValid, &_internal_metadata_, 5); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 minimum_level = 6; - case 6: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 48)) { - _Internal::set_has_minimum_level(&has_bits); - _impl_.minimum_level_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* AppearanceFlagMarket::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.AppearanceFlagMarket) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional .Canary.protobuf.appearances.ITEM_CATEGORY category = 1; - if (cached_has_bits & 0x00000008u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteEnumToArray( - 1, this->_internal_category(), target); - } - - // optional uint32 trade_as_object_id = 2; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(2, this->_internal_trade_as_object_id(), target); - } - - // optional uint32 show_as_object_id = 3; - if (cached_has_bits & 0x00000002u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(3, this->_internal_show_as_object_id(), target); - } - - // repeated .Canary.protobuf.appearances.PLAYER_PROFESSION restrict_to_profession = 5; - for (int i = 0, n = this->_internal_restrict_to_profession_size(); i < n; i++) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteEnumToArray( - 5, this->_internal_restrict_to_profession(i), target); - } - - // optional uint32 minimum_level = 6; - if (cached_has_bits & 0x00000004u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(6, this->_internal_minimum_level(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.AppearanceFlagMarket) - return target; -} - -size_t AppearanceFlagMarket::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.AppearanceFlagMarket) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // repeated .Canary.protobuf.appearances.PLAYER_PROFESSION restrict_to_profession = 5; - { - size_t data_size = 0; - unsigned int count = static_cast(this->_internal_restrict_to_profession_size());for (unsigned int i = 0; i < count; i++) { - data_size += ::_pbi::WireFormatLite::EnumSize( - this->_internal_restrict_to_profession(static_cast(i))); - } - total_size += (1UL * count) + data_size; - } - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x0000000fu) { - // optional uint32 trade_as_object_id = 2; - if (cached_has_bits & 0x00000001u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_trade_as_object_id()); - } - - // optional uint32 show_as_object_id = 3; - if (cached_has_bits & 0x00000002u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_show_as_object_id()); - } - - // optional uint32 minimum_level = 6; - if (cached_has_bits & 0x00000004u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_minimum_level()); - } - - // optional .Canary.protobuf.appearances.ITEM_CATEGORY category = 1; - if (cached_has_bits & 0x00000008u) { - total_size += 1 + - ::_pbi::WireFormatLite::EnumSize(this->_internal_category()); - } - - } - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData AppearanceFlagMarket::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - AppearanceFlagMarket::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*AppearanceFlagMarket::GetClassData() const { return &_class_data_; } - - -void AppearanceFlagMarket::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.AppearanceFlagMarket) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - _this->_impl_.restrict_to_profession_.MergeFrom(from._impl_.restrict_to_profession_); - cached_has_bits = from._impl_._has_bits_[0]; - if (cached_has_bits & 0x0000000fu) { - if (cached_has_bits & 0x00000001u) { - _this->_impl_.trade_as_object_id_ = from._impl_.trade_as_object_id_; - } - if (cached_has_bits & 0x00000002u) { - _this->_impl_.show_as_object_id_ = from._impl_.show_as_object_id_; - } - if (cached_has_bits & 0x00000004u) { - _this->_impl_.minimum_level_ = from._impl_.minimum_level_; - } - if (cached_has_bits & 0x00000008u) { - _this->_impl_.category_ = from._impl_.category_; - } - _this->_impl_._has_bits_[0] |= cached_has_bits; - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void AppearanceFlagMarket::CopyFrom(const AppearanceFlagMarket& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.AppearanceFlagMarket) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool AppearanceFlagMarket::IsInitialized() const { - return true; -} - -void AppearanceFlagMarket::InternalSwap(AppearanceFlagMarket* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - _impl_.restrict_to_profession_.InternalSwap(&other->_impl_.restrict_to_profession_); - ::PROTOBUF_NAMESPACE_ID::internal::memswap< - PROTOBUF_FIELD_OFFSET(AppearanceFlagMarket, _impl_.minimum_level_) - + sizeof(AppearanceFlagMarket::_impl_.minimum_level_) - - PROTOBUF_FIELD_OFFSET(AppearanceFlagMarket, _impl_.trade_as_object_id_)>( - reinterpret_cast(&_impl_.trade_as_object_id_), - reinterpret_cast(&other->_impl_.trade_as_object_id_)); - swap(_impl_.category_, other->_impl_.category_); -} - -::PROTOBUF_NAMESPACE_ID::Metadata AppearanceFlagMarket::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[18]); -} - -// =================================================================== - -class AppearanceFlagNPC::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_name(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } - static void set_has_location(HasBits* has_bits) { - (*has_bits)[0] |= 2u; - } - static void set_has_sale_price(HasBits* has_bits) { - (*has_bits)[0] |= 8u; - } - static void set_has_buy_price(HasBits* has_bits) { - (*has_bits)[0] |= 16u; - } - static void set_has_currency_object_type_id(HasBits* has_bits) { - (*has_bits)[0] |= 32u; - } - static void set_has_currency_quest_flag_display_name(HasBits* has_bits) { - (*has_bits)[0] |= 4u; - } -}; - -AppearanceFlagNPC::AppearanceFlagNPC(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.AppearanceFlagNPC) -} -AppearanceFlagNPC::AppearanceFlagNPC(const AppearanceFlagNPC& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - AppearanceFlagNPC* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.name_){} - , decltype(_impl_.location_){} - , decltype(_impl_.currency_quest_flag_display_name_){} - , decltype(_impl_.sale_price_){} - , decltype(_impl_.buy_price_){} - , decltype(_impl_.currency_object_type_id_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - _impl_.name_.InitDefault(); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - _impl_.name_.Set("", GetArenaForAllocation()); - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (from._internal_has_name()) { - _this->_impl_.name_.Set(from._internal_name(), - _this->GetArenaForAllocation()); - } - _impl_.location_.InitDefault(); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - _impl_.location_.Set("", GetArenaForAllocation()); - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (from._internal_has_location()) { - _this->_impl_.location_.Set(from._internal_location(), - _this->GetArenaForAllocation()); - } - _impl_.currency_quest_flag_display_name_.InitDefault(); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - _impl_.currency_quest_flag_display_name_.Set("", GetArenaForAllocation()); - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (from._internal_has_currency_quest_flag_display_name()) { - _this->_impl_.currency_quest_flag_display_name_.Set(from._internal_currency_quest_flag_display_name(), - _this->GetArenaForAllocation()); - } - ::memcpy(&_impl_.sale_price_, &from._impl_.sale_price_, - static_cast(reinterpret_cast(&_impl_.currency_object_type_id_) - - reinterpret_cast(&_impl_.sale_price_)) + sizeof(_impl_.currency_object_type_id_)); - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.AppearanceFlagNPC) -} - -inline void AppearanceFlagNPC::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.name_){} - , decltype(_impl_.location_){} - , decltype(_impl_.currency_quest_flag_display_name_){} - , decltype(_impl_.sale_price_){0u} - , decltype(_impl_.buy_price_){0u} - , decltype(_impl_.currency_object_type_id_){0u} - }; - _impl_.name_.InitDefault(); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - _impl_.name_.Set("", GetArenaForAllocation()); - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - _impl_.location_.InitDefault(); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - _impl_.location_.Set("", GetArenaForAllocation()); - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - _impl_.currency_quest_flag_display_name_.InitDefault(); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - _impl_.currency_quest_flag_display_name_.Set("", GetArenaForAllocation()); - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING -} - -AppearanceFlagNPC::~AppearanceFlagNPC() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.AppearanceFlagNPC) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void AppearanceFlagNPC::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); - _impl_.name_.Destroy(); - _impl_.location_.Destroy(); - _impl_.currency_quest_flag_display_name_.Destroy(); -} - -void AppearanceFlagNPC::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void AppearanceFlagNPC::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.AppearanceFlagNPC) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000007u) { - if (cached_has_bits & 0x00000001u) { - _impl_.name_.ClearNonDefaultToEmpty(); - } - if (cached_has_bits & 0x00000002u) { - _impl_.location_.ClearNonDefaultToEmpty(); - } - if (cached_has_bits & 0x00000004u) { - _impl_.currency_quest_flag_display_name_.ClearNonDefaultToEmpty(); - } - } - if (cached_has_bits & 0x00000038u) { - ::memset(&_impl_.sale_price_, 0, static_cast( - reinterpret_cast(&_impl_.currency_object_type_id_) - - reinterpret_cast(&_impl_.sale_price_)) + sizeof(_impl_.currency_object_type_id_)); - } - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* AppearanceFlagNPC::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional bytes name = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 10)) { - auto str = _internal_mutable_name(); - ptr = ::_pbi::InlineGreedyStringParser(str, ptr, ctx); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bytes location = 2; - case 2: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 18)) { - auto str = _internal_mutable_location(); - ptr = ::_pbi::InlineGreedyStringParser(str, ptr, ctx); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 sale_price = 3; - case 3: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 24)) { - _Internal::set_has_sale_price(&has_bits); - _impl_.sale_price_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 buy_price = 4; - case 4: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 32)) { - _Internal::set_has_buy_price(&has_bits); - _impl_.buy_price_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 currency_object_type_id = 5; - case 5: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 40)) { - _Internal::set_has_currency_object_type_id(&has_bits); - _impl_.currency_object_type_id_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional bytes currency_quest_flag_display_name = 6; - case 6: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 50)) { - auto str = _internal_mutable_currency_quest_flag_display_name(); - ptr = ::_pbi::InlineGreedyStringParser(str, ptr, ctx); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* AppearanceFlagNPC::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.AppearanceFlagNPC) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional bytes name = 1; - if (cached_has_bits & 0x00000001u) { - target = stream->WriteBytesMaybeAliased( - 1, this->_internal_name(), target); - } - - // optional bytes location = 2; - if (cached_has_bits & 0x00000002u) { - target = stream->WriteBytesMaybeAliased( - 2, this->_internal_location(), target); - } - - // optional uint32 sale_price = 3; - if (cached_has_bits & 0x00000008u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(3, this->_internal_sale_price(), target); - } - - // optional uint32 buy_price = 4; - if (cached_has_bits & 0x00000010u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(4, this->_internal_buy_price(), target); - } - - // optional uint32 currency_object_type_id = 5; - if (cached_has_bits & 0x00000020u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(5, this->_internal_currency_object_type_id(), target); - } - - // optional bytes currency_quest_flag_display_name = 6; - if (cached_has_bits & 0x00000004u) { - target = stream->WriteBytesMaybeAliased( - 6, this->_internal_currency_quest_flag_display_name(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.AppearanceFlagNPC) - return target; -} - -size_t AppearanceFlagNPC::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.AppearanceFlagNPC) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x0000003fu) { - // optional bytes name = 1; - if (cached_has_bits & 0x00000001u) { - total_size += 1 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::BytesSize( - this->_internal_name()); - } - - // optional bytes location = 2; - if (cached_has_bits & 0x00000002u) { - total_size += 1 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::BytesSize( - this->_internal_location()); - } - - // optional bytes currency_quest_flag_display_name = 6; - if (cached_has_bits & 0x00000004u) { - total_size += 1 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::BytesSize( - this->_internal_currency_quest_flag_display_name()); - } - - // optional uint32 sale_price = 3; - if (cached_has_bits & 0x00000008u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_sale_price()); - } - - // optional uint32 buy_price = 4; - if (cached_has_bits & 0x00000010u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_buy_price()); - } - - // optional uint32 currency_object_type_id = 5; - if (cached_has_bits & 0x00000020u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_currency_object_type_id()); - } - - } - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData AppearanceFlagNPC::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - AppearanceFlagNPC::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*AppearanceFlagNPC::GetClassData() const { return &_class_data_; } - - -void AppearanceFlagNPC::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.AppearanceFlagNPC) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = from._impl_._has_bits_[0]; - if (cached_has_bits & 0x0000003fu) { - if (cached_has_bits & 0x00000001u) { - _this->_internal_set_name(from._internal_name()); - } - if (cached_has_bits & 0x00000002u) { - _this->_internal_set_location(from._internal_location()); - } - if (cached_has_bits & 0x00000004u) { - _this->_internal_set_currency_quest_flag_display_name(from._internal_currency_quest_flag_display_name()); - } - if (cached_has_bits & 0x00000008u) { - _this->_impl_.sale_price_ = from._impl_.sale_price_; - } - if (cached_has_bits & 0x00000010u) { - _this->_impl_.buy_price_ = from._impl_.buy_price_; - } - if (cached_has_bits & 0x00000020u) { - _this->_impl_.currency_object_type_id_ = from._impl_.currency_object_type_id_; - } - _this->_impl_._has_bits_[0] |= cached_has_bits; - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void AppearanceFlagNPC::CopyFrom(const AppearanceFlagNPC& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.AppearanceFlagNPC) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool AppearanceFlagNPC::IsInitialized() const { - return true; -} - -void AppearanceFlagNPC::InternalSwap(AppearanceFlagNPC* other) { - using std::swap; - auto* lhs_arena = GetArenaForAllocation(); - auto* rhs_arena = other->GetArenaForAllocation(); - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr::InternalSwap( - &_impl_.name_, lhs_arena, - &other->_impl_.name_, rhs_arena - ); - ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr::InternalSwap( - &_impl_.location_, lhs_arena, - &other->_impl_.location_, rhs_arena - ); - ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr::InternalSwap( - &_impl_.currency_quest_flag_display_name_, lhs_arena, - &other->_impl_.currency_quest_flag_display_name_, rhs_arena - ); - ::PROTOBUF_NAMESPACE_ID::internal::memswap< - PROTOBUF_FIELD_OFFSET(AppearanceFlagNPC, _impl_.currency_object_type_id_) - + sizeof(AppearanceFlagNPC::_impl_.currency_object_type_id_) - - PROTOBUF_FIELD_OFFSET(AppearanceFlagNPC, _impl_.sale_price_)>( - reinterpret_cast(&_impl_.sale_price_), - reinterpret_cast(&other->_impl_.sale_price_)); -} - -::PROTOBUF_NAMESPACE_ID::Metadata AppearanceFlagNPC::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[19]); -} - -// =================================================================== - -class AppearanceFlagAutomap::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_color(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } -}; - -AppearanceFlagAutomap::AppearanceFlagAutomap(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.AppearanceFlagAutomap) -} -AppearanceFlagAutomap::AppearanceFlagAutomap(const AppearanceFlagAutomap& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - AppearanceFlagAutomap* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.color_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - _this->_impl_.color_ = from._impl_.color_; - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.AppearanceFlagAutomap) -} - -inline void AppearanceFlagAutomap::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.color_){0u} - }; -} - -AppearanceFlagAutomap::~AppearanceFlagAutomap() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.AppearanceFlagAutomap) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void AppearanceFlagAutomap::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); -} - -void AppearanceFlagAutomap::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void AppearanceFlagAutomap::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.AppearanceFlagAutomap) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.color_ = 0u; - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* AppearanceFlagAutomap::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional uint32 color = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - _Internal::set_has_color(&has_bits); - _impl_.color_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* AppearanceFlagAutomap::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.AppearanceFlagAutomap) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional uint32 color = 1; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(1, this->_internal_color(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.AppearanceFlagAutomap) - return target; -} - -size_t AppearanceFlagAutomap::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.AppearanceFlagAutomap) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // optional uint32 color = 1; - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000001u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_color()); - } - - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData AppearanceFlagAutomap::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - AppearanceFlagAutomap::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*AppearanceFlagAutomap::GetClassData() const { return &_class_data_; } - - -void AppearanceFlagAutomap::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.AppearanceFlagAutomap) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - if (from._internal_has_color()) { - _this->_internal_set_color(from._internal_color()); - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void AppearanceFlagAutomap::CopyFrom(const AppearanceFlagAutomap& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.AppearanceFlagAutomap) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool AppearanceFlagAutomap::IsInitialized() const { - return true; -} - -void AppearanceFlagAutomap::InternalSwap(AppearanceFlagAutomap* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - swap(_impl_.color_, other->_impl_.color_); -} - -::PROTOBUF_NAMESPACE_ID::Metadata AppearanceFlagAutomap::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[20]); -} - -// =================================================================== - -class AppearanceFlagHook::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_direction(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } -}; - -AppearanceFlagHook::AppearanceFlagHook(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.AppearanceFlagHook) -} -AppearanceFlagHook::AppearanceFlagHook(const AppearanceFlagHook& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - AppearanceFlagHook* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.direction_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - _this->_impl_.direction_ = from._impl_.direction_; - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.AppearanceFlagHook) -} - -inline void AppearanceFlagHook::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.direction_){1} - }; -} - -AppearanceFlagHook::~AppearanceFlagHook() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.AppearanceFlagHook) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void AppearanceFlagHook::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); -} - -void AppearanceFlagHook::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void AppearanceFlagHook::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.AppearanceFlagHook) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.direction_ = 1; - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* AppearanceFlagHook::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional .Canary.protobuf.appearances.HOOK_TYPE direction = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - uint64_t val = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr); - CHK_(ptr); - if (PROTOBUF_PREDICT_TRUE(::Canary::protobuf::appearances::HOOK_TYPE_IsValid(val))) { - _internal_set_direction(static_cast<::Canary::protobuf::appearances::HOOK_TYPE>(val)); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::WriteVarint(1, val, mutable_unknown_fields()); - } - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* AppearanceFlagHook::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.AppearanceFlagHook) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional .Canary.protobuf.appearances.HOOK_TYPE direction = 1; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteEnumToArray( - 1, this->_internal_direction(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.AppearanceFlagHook) - return target; -} - -size_t AppearanceFlagHook::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.AppearanceFlagHook) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // optional .Canary.protobuf.appearances.HOOK_TYPE direction = 1; - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000001u) { - total_size += 1 + - ::_pbi::WireFormatLite::EnumSize(this->_internal_direction()); - } - - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData AppearanceFlagHook::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - AppearanceFlagHook::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*AppearanceFlagHook::GetClassData() const { return &_class_data_; } - - -void AppearanceFlagHook::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.AppearanceFlagHook) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - if (from._internal_has_direction()) { - _this->_internal_set_direction(from._internal_direction()); - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void AppearanceFlagHook::CopyFrom(const AppearanceFlagHook& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.AppearanceFlagHook) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool AppearanceFlagHook::IsInitialized() const { - return true; -} - -void AppearanceFlagHook::InternalSwap(AppearanceFlagHook* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - swap(_impl_.direction_, other->_impl_.direction_); -} - -::PROTOBUF_NAMESPACE_ID::Metadata AppearanceFlagHook::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[21]); -} - -// =================================================================== - -class AppearanceFlagLenshelp::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_id(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } -}; - -AppearanceFlagLenshelp::AppearanceFlagLenshelp(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.AppearanceFlagLenshelp) -} -AppearanceFlagLenshelp::AppearanceFlagLenshelp(const AppearanceFlagLenshelp& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - AppearanceFlagLenshelp* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.id_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - _this->_impl_.id_ = from._impl_.id_; - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.AppearanceFlagLenshelp) -} - -inline void AppearanceFlagLenshelp::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.id_){0u} - }; -} - -AppearanceFlagLenshelp::~AppearanceFlagLenshelp() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.AppearanceFlagLenshelp) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void AppearanceFlagLenshelp::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); -} - -void AppearanceFlagLenshelp::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void AppearanceFlagLenshelp::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.AppearanceFlagLenshelp) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.id_ = 0u; - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* AppearanceFlagLenshelp::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional uint32 id = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - _Internal::set_has_id(&has_bits); - _impl_.id_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* AppearanceFlagLenshelp::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.AppearanceFlagLenshelp) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional uint32 id = 1; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(1, this->_internal_id(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.AppearanceFlagLenshelp) - return target; -} - -size_t AppearanceFlagLenshelp::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.AppearanceFlagLenshelp) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // optional uint32 id = 1; - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000001u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_id()); - } - - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData AppearanceFlagLenshelp::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - AppearanceFlagLenshelp::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*AppearanceFlagLenshelp::GetClassData() const { return &_class_data_; } - - -void AppearanceFlagLenshelp::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.AppearanceFlagLenshelp) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - if (from._internal_has_id()) { - _this->_internal_set_id(from._internal_id()); - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void AppearanceFlagLenshelp::CopyFrom(const AppearanceFlagLenshelp& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.AppearanceFlagLenshelp) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool AppearanceFlagLenshelp::IsInitialized() const { - return true; -} - -void AppearanceFlagLenshelp::InternalSwap(AppearanceFlagLenshelp* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - swap(_impl_.id_, other->_impl_.id_); -} - -::PROTOBUF_NAMESPACE_ID::Metadata AppearanceFlagLenshelp::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[22]); -} - -// =================================================================== - -class AppearanceFlagChangedToExpire::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_former_object_typeid(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } -}; - -AppearanceFlagChangedToExpire::AppearanceFlagChangedToExpire(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.AppearanceFlagChangedToExpire) -} -AppearanceFlagChangedToExpire::AppearanceFlagChangedToExpire(const AppearanceFlagChangedToExpire& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - AppearanceFlagChangedToExpire* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.former_object_typeid_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - _this->_impl_.former_object_typeid_ = from._impl_.former_object_typeid_; - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.AppearanceFlagChangedToExpire) -} - -inline void AppearanceFlagChangedToExpire::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.former_object_typeid_){0u} - }; -} - -AppearanceFlagChangedToExpire::~AppearanceFlagChangedToExpire() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.AppearanceFlagChangedToExpire) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void AppearanceFlagChangedToExpire::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); -} - -void AppearanceFlagChangedToExpire::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void AppearanceFlagChangedToExpire::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.AppearanceFlagChangedToExpire) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.former_object_typeid_ = 0u; - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* AppearanceFlagChangedToExpire::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional uint32 former_object_typeid = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - _Internal::set_has_former_object_typeid(&has_bits); - _impl_.former_object_typeid_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* AppearanceFlagChangedToExpire::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.AppearanceFlagChangedToExpire) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional uint32 former_object_typeid = 1; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(1, this->_internal_former_object_typeid(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.AppearanceFlagChangedToExpire) - return target; -} - -size_t AppearanceFlagChangedToExpire::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.AppearanceFlagChangedToExpire) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // optional uint32 former_object_typeid = 1; - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000001u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_former_object_typeid()); - } - - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData AppearanceFlagChangedToExpire::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - AppearanceFlagChangedToExpire::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*AppearanceFlagChangedToExpire::GetClassData() const { return &_class_data_; } - - -void AppearanceFlagChangedToExpire::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.AppearanceFlagChangedToExpire) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - if (from._internal_has_former_object_typeid()) { - _this->_internal_set_former_object_typeid(from._internal_former_object_typeid()); - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void AppearanceFlagChangedToExpire::CopyFrom(const AppearanceFlagChangedToExpire& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.AppearanceFlagChangedToExpire) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool AppearanceFlagChangedToExpire::IsInitialized() const { - return true; -} - -void AppearanceFlagChangedToExpire::InternalSwap(AppearanceFlagChangedToExpire* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - swap(_impl_.former_object_typeid_, other->_impl_.former_object_typeid_); -} - -::PROTOBUF_NAMESPACE_ID::Metadata AppearanceFlagChangedToExpire::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[23]); -} - -// =================================================================== - -class AppearanceFlagCyclopedia::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_cyclopedia_type(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } -}; - -AppearanceFlagCyclopedia::AppearanceFlagCyclopedia(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.AppearanceFlagCyclopedia) -} -AppearanceFlagCyclopedia::AppearanceFlagCyclopedia(const AppearanceFlagCyclopedia& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - AppearanceFlagCyclopedia* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.cyclopedia_type_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - _this->_impl_.cyclopedia_type_ = from._impl_.cyclopedia_type_; - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.AppearanceFlagCyclopedia) -} - -inline void AppearanceFlagCyclopedia::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.cyclopedia_type_){0u} - }; -} - -AppearanceFlagCyclopedia::~AppearanceFlagCyclopedia() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.AppearanceFlagCyclopedia) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void AppearanceFlagCyclopedia::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); -} - -void AppearanceFlagCyclopedia::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void AppearanceFlagCyclopedia::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.AppearanceFlagCyclopedia) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.cyclopedia_type_ = 0u; - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* AppearanceFlagCyclopedia::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional uint32 cyclopedia_type = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - _Internal::set_has_cyclopedia_type(&has_bits); - _impl_.cyclopedia_type_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* AppearanceFlagCyclopedia::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.AppearanceFlagCyclopedia) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional uint32 cyclopedia_type = 1; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(1, this->_internal_cyclopedia_type(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.AppearanceFlagCyclopedia) - return target; -} - -size_t AppearanceFlagCyclopedia::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.AppearanceFlagCyclopedia) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // optional uint32 cyclopedia_type = 1; - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x00000001u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_cyclopedia_type()); - } - - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData AppearanceFlagCyclopedia::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - AppearanceFlagCyclopedia::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*AppearanceFlagCyclopedia::GetClassData() const { return &_class_data_; } - - -void AppearanceFlagCyclopedia::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.AppearanceFlagCyclopedia) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - if (from._internal_has_cyclopedia_type()) { - _this->_internal_set_cyclopedia_type(from._internal_cyclopedia_type()); - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void AppearanceFlagCyclopedia::CopyFrom(const AppearanceFlagCyclopedia& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.AppearanceFlagCyclopedia) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool AppearanceFlagCyclopedia::IsInitialized() const { - return true; -} - -void AppearanceFlagCyclopedia::InternalSwap(AppearanceFlagCyclopedia* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - swap(_impl_.cyclopedia_type_, other->_impl_.cyclopedia_type_); -} - -::PROTOBUF_NAMESPACE_ID::Metadata AppearanceFlagCyclopedia::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[24]); -} - -// =================================================================== - -class SpecialMeaningAppearanceIds::_Internal { - public: - using HasBits = decltype(std::declval()._impl_._has_bits_); - static void set_has_gold_coin_id(HasBits* has_bits) { - (*has_bits)[0] |= 1u; - } - static void set_has_platinum_coin_id(HasBits* has_bits) { - (*has_bits)[0] |= 2u; - } - static void set_has_crystal_coin_id(HasBits* has_bits) { - (*has_bits)[0] |= 4u; - } - static void set_has_tibia_coin_id(HasBits* has_bits) { - (*has_bits)[0] |= 8u; - } - static void set_has_stamped_letter_id(HasBits* has_bits) { - (*has_bits)[0] |= 16u; - } - static void set_has_supply_stash_id(HasBits* has_bits) { - (*has_bits)[0] |= 32u; - } - static void set_has_reward_chest_id(HasBits* has_bits) { - (*has_bits)[0] |= 64u; - } -}; - -SpecialMeaningAppearanceIds::SpecialMeaningAppearanceIds(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.appearances.SpecialMeaningAppearanceIds) -} -SpecialMeaningAppearanceIds::SpecialMeaningAppearanceIds(const SpecialMeaningAppearanceIds& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - SpecialMeaningAppearanceIds* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){from._impl_._has_bits_} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.gold_coin_id_){} - , decltype(_impl_.platinum_coin_id_){} - , decltype(_impl_.crystal_coin_id_){} - , decltype(_impl_.tibia_coin_id_){} - , decltype(_impl_.stamped_letter_id_){} - , decltype(_impl_.supply_stash_id_){} - , decltype(_impl_.reward_chest_id_){}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - ::memcpy(&_impl_.gold_coin_id_, &from._impl_.gold_coin_id_, - static_cast(reinterpret_cast(&_impl_.reward_chest_id_) - - reinterpret_cast(&_impl_.gold_coin_id_)) + sizeof(_impl_.reward_chest_id_)); - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.appearances.SpecialMeaningAppearanceIds) -} - -inline void SpecialMeaningAppearanceIds::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_._has_bits_){} - , /*decltype(_impl_._cached_size_)*/{} - , decltype(_impl_.gold_coin_id_){0u} - , decltype(_impl_.platinum_coin_id_){0u} - , decltype(_impl_.crystal_coin_id_){0u} - , decltype(_impl_.tibia_coin_id_){0u} - , decltype(_impl_.stamped_letter_id_){0u} - , decltype(_impl_.supply_stash_id_){0u} - , decltype(_impl_.reward_chest_id_){0u} - }; -} - -SpecialMeaningAppearanceIds::~SpecialMeaningAppearanceIds() { - // @@protoc_insertion_point(destructor:Canary.protobuf.appearances.SpecialMeaningAppearanceIds) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void SpecialMeaningAppearanceIds::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); -} - -void SpecialMeaningAppearanceIds::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void SpecialMeaningAppearanceIds::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.appearances.SpecialMeaningAppearanceIds) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x0000007fu) { - ::memset(&_impl_.gold_coin_id_, 0, static_cast( - reinterpret_cast(&_impl_.reward_chest_id_) - - reinterpret_cast(&_impl_.gold_coin_id_)) + sizeof(_impl_.reward_chest_id_)); - } - _impl_._has_bits_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* SpecialMeaningAppearanceIds::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - _Internal::HasBits has_bits{}; - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // optional uint32 gold_coin_id = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 8)) { - _Internal::set_has_gold_coin_id(&has_bits); - _impl_.gold_coin_id_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 platinum_coin_id = 2; - case 2: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 16)) { - _Internal::set_has_platinum_coin_id(&has_bits); - _impl_.platinum_coin_id_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 crystal_coin_id = 3; - case 3: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 24)) { - _Internal::set_has_crystal_coin_id(&has_bits); - _impl_.crystal_coin_id_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 tibia_coin_id = 4; - case 4: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 32)) { - _Internal::set_has_tibia_coin_id(&has_bits); - _impl_.tibia_coin_id_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 stamped_letter_id = 5; - case 5: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 40)) { - _Internal::set_has_stamped_letter_id(&has_bits); - _impl_.stamped_letter_id_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 supply_stash_id = 6; - case 6: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 48)) { - _Internal::set_has_supply_stash_id(&has_bits); - _impl_.supply_stash_id_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // optional uint32 reward_chest_id = 7; - case 7: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 56)) { - _Internal::set_has_reward_chest_id(&has_bits); - _impl_.reward_chest_id_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - _impl_._has_bits_.Or(has_bits); - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* SpecialMeaningAppearanceIds::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.appearances.SpecialMeaningAppearanceIds) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - // optional uint32 gold_coin_id = 1; - if (cached_has_bits & 0x00000001u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(1, this->_internal_gold_coin_id(), target); - } - - // optional uint32 platinum_coin_id = 2; - if (cached_has_bits & 0x00000002u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(2, this->_internal_platinum_coin_id(), target); - } - - // optional uint32 crystal_coin_id = 3; - if (cached_has_bits & 0x00000004u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(3, this->_internal_crystal_coin_id(), target); - } - - // optional uint32 tibia_coin_id = 4; - if (cached_has_bits & 0x00000008u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(4, this->_internal_tibia_coin_id(), target); - } - - // optional uint32 stamped_letter_id = 5; - if (cached_has_bits & 0x00000010u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(5, this->_internal_stamped_letter_id(), target); - } - - // optional uint32 supply_stash_id = 6; - if (cached_has_bits & 0x00000020u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(6, this->_internal_supply_stash_id(), target); - } - - // optional uint32 reward_chest_id = 7; - if (cached_has_bits & 0x00000040u) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteUInt32ToArray(7, this->_internal_reward_chest_id(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.appearances.SpecialMeaningAppearanceIds) - return target; -} - -size_t SpecialMeaningAppearanceIds::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.appearances.SpecialMeaningAppearanceIds) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - cached_has_bits = _impl_._has_bits_[0]; - if (cached_has_bits & 0x0000007fu) { - // optional uint32 gold_coin_id = 1; - if (cached_has_bits & 0x00000001u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_gold_coin_id()); - } - - // optional uint32 platinum_coin_id = 2; - if (cached_has_bits & 0x00000002u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_platinum_coin_id()); - } - - // optional uint32 crystal_coin_id = 3; - if (cached_has_bits & 0x00000004u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_crystal_coin_id()); - } - - // optional uint32 tibia_coin_id = 4; - if (cached_has_bits & 0x00000008u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_tibia_coin_id()); - } - - // optional uint32 stamped_letter_id = 5; - if (cached_has_bits & 0x00000010u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_stamped_letter_id()); - } - - // optional uint32 supply_stash_id = 6; - if (cached_has_bits & 0x00000020u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_supply_stash_id()); - } - - // optional uint32 reward_chest_id = 7; - if (cached_has_bits & 0x00000040u) { - total_size += ::_pbi::WireFormatLite::UInt32SizePlusOne(this->_internal_reward_chest_id()); - } - - } - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData SpecialMeaningAppearanceIds::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - SpecialMeaningAppearanceIds::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*SpecialMeaningAppearanceIds::GetClassData() const { return &_class_data_; } - - -void SpecialMeaningAppearanceIds::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.appearances.SpecialMeaningAppearanceIds) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - cached_has_bits = from._impl_._has_bits_[0]; - if (cached_has_bits & 0x0000007fu) { - if (cached_has_bits & 0x00000001u) { - _this->_impl_.gold_coin_id_ = from._impl_.gold_coin_id_; - } - if (cached_has_bits & 0x00000002u) { - _this->_impl_.platinum_coin_id_ = from._impl_.platinum_coin_id_; - } - if (cached_has_bits & 0x00000004u) { - _this->_impl_.crystal_coin_id_ = from._impl_.crystal_coin_id_; - } - if (cached_has_bits & 0x00000008u) { - _this->_impl_.tibia_coin_id_ = from._impl_.tibia_coin_id_; - } - if (cached_has_bits & 0x00000010u) { - _this->_impl_.stamped_letter_id_ = from._impl_.stamped_letter_id_; - } - if (cached_has_bits & 0x00000020u) { - _this->_impl_.supply_stash_id_ = from._impl_.supply_stash_id_; - } - if (cached_has_bits & 0x00000040u) { - _this->_impl_.reward_chest_id_ = from._impl_.reward_chest_id_; - } - _this->_impl_._has_bits_[0] |= cached_has_bits; - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void SpecialMeaningAppearanceIds::CopyFrom(const SpecialMeaningAppearanceIds& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.appearances.SpecialMeaningAppearanceIds) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool SpecialMeaningAppearanceIds::IsInitialized() const { - return true; -} - -void SpecialMeaningAppearanceIds::InternalSwap(SpecialMeaningAppearanceIds* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_._has_bits_[0], other->_impl_._has_bits_[0]); - ::PROTOBUF_NAMESPACE_ID::internal::memswap< - PROTOBUF_FIELD_OFFSET(SpecialMeaningAppearanceIds, _impl_.reward_chest_id_) - + sizeof(SpecialMeaningAppearanceIds::_impl_.reward_chest_id_) - - PROTOBUF_FIELD_OFFSET(SpecialMeaningAppearanceIds, _impl_.gold_coin_id_)>( - reinterpret_cast(&_impl_.gold_coin_id_), - reinterpret_cast(&other->_impl_.gold_coin_id_)); -} - -::PROTOBUF_NAMESPACE_ID::Metadata SpecialMeaningAppearanceIds::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_appearances_2eproto_getter, &descriptor_table_appearances_2eproto_once, - file_level_metadata_appearances_2eproto[25]); -} - -// @@protoc_insertion_point(namespace_scope) -} // namespace appearances -} // namespace protobuf -} // namespace Canary -PROTOBUF_NAMESPACE_OPEN -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::Coordinate* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::Coordinate >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::Coordinate >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::Appearances* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::Appearances >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::Appearances >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::SpritePhase* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::SpritePhase >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::SpritePhase >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::SpriteAnimation* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::SpriteAnimation >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::SpriteAnimation >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::Box* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::Box >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::Box >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::SpriteInfo* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::SpriteInfo >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::SpriteInfo >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::FrameGroup* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::FrameGroup >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::FrameGroup >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::Appearance* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::Appearance >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::Appearance >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::AppearanceFlags* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::AppearanceFlags >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::AppearanceFlags >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::AppearanceFlagBank* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::AppearanceFlagBank >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::AppearanceFlagBank >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::AppearanceFlagWrite* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::AppearanceFlagWrite >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::AppearanceFlagWrite >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::AppearanceFlagWriteOnce* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::AppearanceFlagWriteOnce >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::AppearanceFlagWriteOnce >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::AppearanceFlagLight* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::AppearanceFlagLight >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::AppearanceFlagLight >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::AppearanceFlagHeight* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::AppearanceFlagHeight >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::AppearanceFlagHeight >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::AppearanceFlagShift* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::AppearanceFlagShift >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::AppearanceFlagShift >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::AppearanceFlagClothes* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::AppearanceFlagClothes >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::AppearanceFlagClothes >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::AppearanceFlagDefaultAction* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::AppearanceFlagDefaultAction >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::AppearanceFlagDefaultAction >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::AppearanceFlagMarket* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::AppearanceFlagMarket >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::AppearanceFlagMarket >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::AppearanceFlagNPC* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::AppearanceFlagNPC >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::AppearanceFlagNPC >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::AppearanceFlagAutomap* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::AppearanceFlagAutomap >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::AppearanceFlagAutomap >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::AppearanceFlagHook* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::AppearanceFlagHook >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::AppearanceFlagHook >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::AppearanceFlagLenshelp* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::AppearanceFlagLenshelp >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::AppearanceFlagLenshelp >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::AppearanceFlagCyclopedia* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::AppearanceFlagCyclopedia >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::AppearanceFlagCyclopedia >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds* -Arena::CreateMaybeMessage< ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds >(arena); -} -PROTOBUF_NAMESPACE_CLOSE - -// @@protoc_insertion_point(global_scope) -#include diff --git a/src/protobuf/appearances.pb.h b/src/protobuf/appearances.pb.h deleted file mode 100644 index 65bc2c7e9cc..00000000000 --- a/src/protobuf/appearances.pb.h +++ /dev/null @@ -1,11506 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: appearances.proto - -#ifndef GOOGLE_PROTOBUF_INCLUDED_appearances_2eproto -#define GOOGLE_PROTOBUF_INCLUDED_appearances_2eproto - -#include -#include - -#include -#if PROTOBUF_VERSION < 3021000 -#error This file was generated by a newer version of protoc which is -#error incompatible with your Protocol Buffer headers. Please update -#error your headers. -#endif -#if 3021012 < PROTOBUF_MIN_PROTOC_VERSION -#error This file was generated by an older version of protoc which is -#error incompatible with your Protocol Buffer headers. Please -#error regenerate this file with a newer version of protoc. -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include // IWYU pragma: export -#include // IWYU pragma: export -#include -#include -// @@protoc_insertion_point(includes) -#include -#define PROTOBUF_INTERNAL_EXPORT_appearances_2eproto -PROTOBUF_NAMESPACE_OPEN -namespace internal { -class AnyMetadata; -} // namespace internal -PROTOBUF_NAMESPACE_CLOSE - -// Internal implementation detail -- do not use these members. -struct TableStruct_appearances_2eproto { - static const uint32_t offsets[]; -}; -extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_appearances_2eproto; -namespace Canary { -namespace protobuf { -namespace appearances { -class Appearance; -struct AppearanceDefaultTypeInternal; -extern AppearanceDefaultTypeInternal _Appearance_default_instance_; -class AppearanceFlagAutomap; -struct AppearanceFlagAutomapDefaultTypeInternal; -extern AppearanceFlagAutomapDefaultTypeInternal _AppearanceFlagAutomap_default_instance_; -class AppearanceFlagBank; -struct AppearanceFlagBankDefaultTypeInternal; -extern AppearanceFlagBankDefaultTypeInternal _AppearanceFlagBank_default_instance_; -class AppearanceFlagChangedToExpire; -struct AppearanceFlagChangedToExpireDefaultTypeInternal; -extern AppearanceFlagChangedToExpireDefaultTypeInternal _AppearanceFlagChangedToExpire_default_instance_; -class AppearanceFlagClothes; -struct AppearanceFlagClothesDefaultTypeInternal; -extern AppearanceFlagClothesDefaultTypeInternal _AppearanceFlagClothes_default_instance_; -class AppearanceFlagCyclopedia; -struct AppearanceFlagCyclopediaDefaultTypeInternal; -extern AppearanceFlagCyclopediaDefaultTypeInternal _AppearanceFlagCyclopedia_default_instance_; -class AppearanceFlagDefaultAction; -struct AppearanceFlagDefaultActionDefaultTypeInternal; -extern AppearanceFlagDefaultActionDefaultTypeInternal _AppearanceFlagDefaultAction_default_instance_; -class AppearanceFlagHeight; -struct AppearanceFlagHeightDefaultTypeInternal; -extern AppearanceFlagHeightDefaultTypeInternal _AppearanceFlagHeight_default_instance_; -class AppearanceFlagHook; -struct AppearanceFlagHookDefaultTypeInternal; -extern AppearanceFlagHookDefaultTypeInternal _AppearanceFlagHook_default_instance_; -class AppearanceFlagLenshelp; -struct AppearanceFlagLenshelpDefaultTypeInternal; -extern AppearanceFlagLenshelpDefaultTypeInternal _AppearanceFlagLenshelp_default_instance_; -class AppearanceFlagLight; -struct AppearanceFlagLightDefaultTypeInternal; -extern AppearanceFlagLightDefaultTypeInternal _AppearanceFlagLight_default_instance_; -class AppearanceFlagMarket; -struct AppearanceFlagMarketDefaultTypeInternal; -extern AppearanceFlagMarketDefaultTypeInternal _AppearanceFlagMarket_default_instance_; -class AppearanceFlagNPC; -struct AppearanceFlagNPCDefaultTypeInternal; -extern AppearanceFlagNPCDefaultTypeInternal _AppearanceFlagNPC_default_instance_; -class AppearanceFlagShift; -struct AppearanceFlagShiftDefaultTypeInternal; -extern AppearanceFlagShiftDefaultTypeInternal _AppearanceFlagShift_default_instance_; -class AppearanceFlagUpgradeClassification; -struct AppearanceFlagUpgradeClassificationDefaultTypeInternal; -extern AppearanceFlagUpgradeClassificationDefaultTypeInternal _AppearanceFlagUpgradeClassification_default_instance_; -class AppearanceFlagWrite; -struct AppearanceFlagWriteDefaultTypeInternal; -extern AppearanceFlagWriteDefaultTypeInternal _AppearanceFlagWrite_default_instance_; -class AppearanceFlagWriteOnce; -struct AppearanceFlagWriteOnceDefaultTypeInternal; -extern AppearanceFlagWriteOnceDefaultTypeInternal _AppearanceFlagWriteOnce_default_instance_; -class AppearanceFlags; -struct AppearanceFlagsDefaultTypeInternal; -extern AppearanceFlagsDefaultTypeInternal _AppearanceFlags_default_instance_; -class Appearances; -struct AppearancesDefaultTypeInternal; -extern AppearancesDefaultTypeInternal _Appearances_default_instance_; -class Box; -struct BoxDefaultTypeInternal; -extern BoxDefaultTypeInternal _Box_default_instance_; -class Coordinate; -struct CoordinateDefaultTypeInternal; -extern CoordinateDefaultTypeInternal _Coordinate_default_instance_; -class FrameGroup; -struct FrameGroupDefaultTypeInternal; -extern FrameGroupDefaultTypeInternal _FrameGroup_default_instance_; -class SpecialMeaningAppearanceIds; -struct SpecialMeaningAppearanceIdsDefaultTypeInternal; -extern SpecialMeaningAppearanceIdsDefaultTypeInternal _SpecialMeaningAppearanceIds_default_instance_; -class SpriteAnimation; -struct SpriteAnimationDefaultTypeInternal; -extern SpriteAnimationDefaultTypeInternal _SpriteAnimation_default_instance_; -class SpriteInfo; -struct SpriteInfoDefaultTypeInternal; -extern SpriteInfoDefaultTypeInternal _SpriteInfo_default_instance_; -class SpritePhase; -struct SpritePhaseDefaultTypeInternal; -extern SpritePhaseDefaultTypeInternal _SpritePhase_default_instance_; -} // namespace appearances -} // namespace protobuf -} // namespace Canary -PROTOBUF_NAMESPACE_OPEN -template<> ::Canary::protobuf::appearances::Appearance* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::Appearance>(Arena*); -template<> ::Canary::protobuf::appearances::AppearanceFlagAutomap* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagAutomap>(Arena*); -template<> ::Canary::protobuf::appearances::AppearanceFlagBank* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagBank>(Arena*); -template<> ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagChangedToExpire>(Arena*); -template<> ::Canary::protobuf::appearances::AppearanceFlagClothes* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagClothes>(Arena*); -template<> ::Canary::protobuf::appearances::AppearanceFlagCyclopedia* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagCyclopedia>(Arena*); -template<> ::Canary::protobuf::appearances::AppearanceFlagDefaultAction* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagDefaultAction>(Arena*); -template<> ::Canary::protobuf::appearances::AppearanceFlagHeight* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagHeight>(Arena*); -template<> ::Canary::protobuf::appearances::AppearanceFlagHook* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagHook>(Arena*); -template<> ::Canary::protobuf::appearances::AppearanceFlagLenshelp* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagLenshelp>(Arena*); -template<> ::Canary::protobuf::appearances::AppearanceFlagLight* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagLight>(Arena*); -template<> ::Canary::protobuf::appearances::AppearanceFlagMarket* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagMarket>(Arena*); -template<> ::Canary::protobuf::appearances::AppearanceFlagNPC* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagNPC>(Arena*); -template<> ::Canary::protobuf::appearances::AppearanceFlagShift* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagShift>(Arena*); -template<> ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification>(Arena*); -template<> ::Canary::protobuf::appearances::AppearanceFlagWrite* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagWrite>(Arena*); -template<> ::Canary::protobuf::appearances::AppearanceFlagWriteOnce* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagWriteOnce>(Arena*); -template<> ::Canary::protobuf::appearances::AppearanceFlags* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlags>(Arena*); -template<> ::Canary::protobuf::appearances::Appearances* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::Appearances>(Arena*); -template<> ::Canary::protobuf::appearances::Box* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::Box>(Arena*); -template<> ::Canary::protobuf::appearances::Coordinate* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::Coordinate>(Arena*); -template<> ::Canary::protobuf::appearances::FrameGroup* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::FrameGroup>(Arena*); -template<> ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::SpecialMeaningAppearanceIds>(Arena*); -template<> ::Canary::protobuf::appearances::SpriteAnimation* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::SpriteAnimation>(Arena*); -template<> ::Canary::protobuf::appearances::SpriteInfo* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::SpriteInfo>(Arena*); -template<> ::Canary::protobuf::appearances::SpritePhase* Arena::CreateMaybeMessage<::Canary::protobuf::appearances::SpritePhase>(Arena*); -PROTOBUF_NAMESPACE_CLOSE -namespace Canary { -namespace protobuf { -namespace appearances { - -enum PLAYER_ACTION : int { - PLAYER_ACTION_NONE = 0, - PLAYER_ACTION_LOOK = 1, - PLAYER_ACTION_USE = 2, - PLAYER_ACTION_OPEN = 3, - PLAYER_ACTION_AUTOWALK_HIGHLIGHT = 4 -}; -bool PLAYER_ACTION_IsValid(int value); -constexpr PLAYER_ACTION PLAYER_ACTION_MIN = PLAYER_ACTION_NONE; -constexpr PLAYER_ACTION PLAYER_ACTION_MAX = PLAYER_ACTION_AUTOWALK_HIGHLIGHT; -constexpr int PLAYER_ACTION_ARRAYSIZE = PLAYER_ACTION_MAX + 1; - -const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* PLAYER_ACTION_descriptor(); -template -inline const std::string& PLAYER_ACTION_Name(T enum_t_value) { - static_assert(::std::is_same::value || - ::std::is_integral::value, - "Incorrect type passed to function PLAYER_ACTION_Name."); - return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum( - PLAYER_ACTION_descriptor(), enum_t_value); -} -inline bool PLAYER_ACTION_Parse( - ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, PLAYER_ACTION* value) { - return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum( - PLAYER_ACTION_descriptor(), name, value); -} -enum ITEM_CATEGORY : int { - ITEM_CATEGORY_ARMORS = 1, - ITEM_CATEGORY_AMULETS = 2, - ITEM_CATEGORY_BOOTS = 3, - ITEM_CATEGORY_CONTAINERS = 4, - ITEM_CATEGORY_DECORATION = 5, - ITEM_CATEGORY_FOOD = 6, - ITEM_CATEGORY_HELMETS_HATS = 7, - ITEM_CATEGORY_LEGS = 8, - ITEM_CATEGORY_OTHERS = 9, - ITEM_CATEGORY_POTIONS = 10, - ITEM_CATEGORY_RINGS = 11, - ITEM_CATEGORY_RUNES = 12, - ITEM_CATEGORY_SHIELDS = 13, - ITEM_CATEGORY_TOOLS = 14, - ITEM_CATEGORY_VALUABLES = 15, - ITEM_CATEGORY_AMMUNITION = 16, - ITEM_CATEGORY_AXES = 17, - ITEM_CATEGORY_CLUBS = 18, - ITEM_CATEGORY_DISTANCE_WEAPONS = 19, - ITEM_CATEGORY_SWORDS = 20, - ITEM_CATEGORY_WANDS_RODS = 21, - ITEM_CATEGORY_PREMIUM_SCROLLS = 22, - ITEM_CATEGORY_TIBIA_COINS = 23, - ITEM_CATEGORY_CREATURE_PRODUCTS = 24, - ITEM_CATEGORY_QUIVER = 25 -}; -bool ITEM_CATEGORY_IsValid(int value); -constexpr ITEM_CATEGORY ITEM_CATEGORY_MIN = ITEM_CATEGORY_ARMORS; -constexpr ITEM_CATEGORY ITEM_CATEGORY_MAX = ITEM_CATEGORY_QUIVER; -constexpr int ITEM_CATEGORY_ARRAYSIZE = ITEM_CATEGORY_MAX + 1; - -const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* ITEM_CATEGORY_descriptor(); -template -inline const std::string& ITEM_CATEGORY_Name(T enum_t_value) { - static_assert(::std::is_same::value || - ::std::is_integral::value, - "Incorrect type passed to function ITEM_CATEGORY_Name."); - return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum( - ITEM_CATEGORY_descriptor(), enum_t_value); -} -inline bool ITEM_CATEGORY_Parse( - ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, ITEM_CATEGORY* value) { - return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum( - ITEM_CATEGORY_descriptor(), name, value); -} -enum PLAYER_PROFESSION : int { - PLAYER_PROFESSION_ANY = -1, - PLAYER_PROFESSION_NONE = 0, - PLAYER_PROFESSION_KNIGHT = 1, - PLAYER_PROFESSION_PALADIN = 2, - PLAYER_PROFESSION_SORCERER = 3, - PLAYER_PROFESSION_DRUID = 4, - PLAYER_PROFESSION_PROMOTED = 10 -}; -bool PLAYER_PROFESSION_IsValid(int value); -constexpr PLAYER_PROFESSION PLAYER_PROFESSION_MIN = PLAYER_PROFESSION_ANY; -constexpr PLAYER_PROFESSION PLAYER_PROFESSION_MAX = PLAYER_PROFESSION_PROMOTED; -constexpr int PLAYER_PROFESSION_ARRAYSIZE = PLAYER_PROFESSION_MAX + 1; - -const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* PLAYER_PROFESSION_descriptor(); -template -inline const std::string& PLAYER_PROFESSION_Name(T enum_t_value) { - static_assert(::std::is_same::value || - ::std::is_integral::value, - "Incorrect type passed to function PLAYER_PROFESSION_Name."); - return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum( - PLAYER_PROFESSION_descriptor(), enum_t_value); -} -inline bool PLAYER_PROFESSION_Parse( - ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, PLAYER_PROFESSION* value) { - return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum( - PLAYER_PROFESSION_descriptor(), name, value); -} -enum ANIMATION_LOOP_TYPE : int { - ANIMATION_LOOP_TYPE_PINGPONG = -1, - ANIMATION_LOOP_TYPE_INFINITE = 0, - ANIMATION_LOOP_TYPE_COUNTED = 1 -}; -bool ANIMATION_LOOP_TYPE_IsValid(int value); -constexpr ANIMATION_LOOP_TYPE ANIMATION_LOOP_TYPE_MIN = ANIMATION_LOOP_TYPE_PINGPONG; -constexpr ANIMATION_LOOP_TYPE ANIMATION_LOOP_TYPE_MAX = ANIMATION_LOOP_TYPE_COUNTED; -constexpr int ANIMATION_LOOP_TYPE_ARRAYSIZE = ANIMATION_LOOP_TYPE_MAX + 1; - -const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* ANIMATION_LOOP_TYPE_descriptor(); -template -inline const std::string& ANIMATION_LOOP_TYPE_Name(T enum_t_value) { - static_assert(::std::is_same::value || - ::std::is_integral::value, - "Incorrect type passed to function ANIMATION_LOOP_TYPE_Name."); - return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum( - ANIMATION_LOOP_TYPE_descriptor(), enum_t_value); -} -inline bool ANIMATION_LOOP_TYPE_Parse( - ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, ANIMATION_LOOP_TYPE* value) { - return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum( - ANIMATION_LOOP_TYPE_descriptor(), name, value); -} -enum HOOK_TYPE : int { - HOOK_TYPE_SOUTH = 1, - HOOK_TYPE_EAST = 2 -}; -bool HOOK_TYPE_IsValid(int value); -constexpr HOOK_TYPE HOOK_TYPE_MIN = HOOK_TYPE_SOUTH; -constexpr HOOK_TYPE HOOK_TYPE_MAX = HOOK_TYPE_EAST; -constexpr int HOOK_TYPE_ARRAYSIZE = HOOK_TYPE_MAX + 1; - -const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* HOOK_TYPE_descriptor(); -template -inline const std::string& HOOK_TYPE_Name(T enum_t_value) { - static_assert(::std::is_same::value || - ::std::is_integral::value, - "Incorrect type passed to function HOOK_TYPE_Name."); - return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum( - HOOK_TYPE_descriptor(), enum_t_value); -} -inline bool HOOK_TYPE_Parse( - ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, HOOK_TYPE* value) { - return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum( - HOOK_TYPE_descriptor(), name, value); -} -enum FIXED_FRAME_GROUP : int { - FIXED_FRAME_GROUP_OUTFIT_IDLE = 0, - FIXED_FRAME_GROUP_OUTFIT_MOVING = 1, - FIXED_FRAME_GROUP_OBJECT_INITIAL = 2 -}; -bool FIXED_FRAME_GROUP_IsValid(int value); -constexpr FIXED_FRAME_GROUP FIXED_FRAME_GROUP_MIN = FIXED_FRAME_GROUP_OUTFIT_IDLE; -constexpr FIXED_FRAME_GROUP FIXED_FRAME_GROUP_MAX = FIXED_FRAME_GROUP_OBJECT_INITIAL; -constexpr int FIXED_FRAME_GROUP_ARRAYSIZE = FIXED_FRAME_GROUP_MAX + 1; - -const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* FIXED_FRAME_GROUP_descriptor(); -template -inline const std::string& FIXED_FRAME_GROUP_Name(T enum_t_value) { - static_assert(::std::is_same::value || - ::std::is_integral::value, - "Incorrect type passed to function FIXED_FRAME_GROUP_Name."); - return ::PROTOBUF_NAMESPACE_ID::internal::NameOfEnum( - FIXED_FRAME_GROUP_descriptor(), enum_t_value); -} -inline bool FIXED_FRAME_GROUP_Parse( - ::PROTOBUF_NAMESPACE_ID::ConstStringParam name, FIXED_FRAME_GROUP* value) { - return ::PROTOBUF_NAMESPACE_ID::internal::ParseNamedEnum( - FIXED_FRAME_GROUP_descriptor(), name, value); -} -// =================================================================== - -class Coordinate final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.Coordinate) */ { - public: - inline Coordinate() : Coordinate(nullptr) {} - ~Coordinate() override; - explicit PROTOBUF_CONSTEXPR Coordinate(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - Coordinate(const Coordinate& from); - Coordinate(Coordinate&& from) noexcept - : Coordinate() { - *this = ::std::move(from); - } - - inline Coordinate& operator=(const Coordinate& from) { - CopyFrom(from); - return *this; - } - inline Coordinate& operator=(Coordinate&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const Coordinate& default_instance() { - return *internal_default_instance(); - } - static inline const Coordinate* internal_default_instance() { - return reinterpret_cast( - &_Coordinate_default_instance_); - } - static constexpr int kIndexInFileMessages = - 0; - - friend void swap(Coordinate& a, Coordinate& b) { - a.Swap(&b); - } - inline void Swap(Coordinate* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(Coordinate* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - Coordinate* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const Coordinate& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const Coordinate& from) { - Coordinate::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(Coordinate* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.Coordinate"; - } - protected: - explicit Coordinate(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kXFieldNumber = 1, - kYFieldNumber = 2, - kZFieldNumber = 3, - }; - // optional uint32 x = 1; - bool has_x() const; - private: - bool _internal_has_x() const; - public: - void clear_x(); - uint32_t x() const; - void set_x(uint32_t value); - private: - uint32_t _internal_x() const; - void _internal_set_x(uint32_t value); - public: - - // optional uint32 y = 2; - bool has_y() const; - private: - bool _internal_has_y() const; - public: - void clear_y(); - uint32_t y() const; - void set_y(uint32_t value); - private: - uint32_t _internal_y() const; - void _internal_set_y(uint32_t value); - public: - - // optional uint32 z = 3; - bool has_z() const; - private: - bool _internal_has_z() const; - public: - void clear_z(); - uint32_t z() const; - void set_z(uint32_t value); - private: - uint32_t _internal_z() const; - void _internal_set_z(uint32_t value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.Coordinate) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - uint32_t x_; - uint32_t y_; - uint32_t z_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class Appearances final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.Appearances) */ { - public: - inline Appearances() : Appearances(nullptr) {} - ~Appearances() override; - explicit PROTOBUF_CONSTEXPR Appearances(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - Appearances(const Appearances& from); - Appearances(Appearances&& from) noexcept - : Appearances() { - *this = ::std::move(from); - } - - inline Appearances& operator=(const Appearances& from) { - CopyFrom(from); - return *this; - } - inline Appearances& operator=(Appearances&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const Appearances& default_instance() { - return *internal_default_instance(); - } - static inline const Appearances* internal_default_instance() { - return reinterpret_cast( - &_Appearances_default_instance_); - } - static constexpr int kIndexInFileMessages = - 1; - - friend void swap(Appearances& a, Appearances& b) { - a.Swap(&b); - } - inline void Swap(Appearances* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(Appearances* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - Appearances* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const Appearances& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const Appearances& from) { - Appearances::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(Appearances* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.Appearances"; - } - protected: - explicit Appearances(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kObjectFieldNumber = 1, - kOutfitFieldNumber = 2, - kEffectFieldNumber = 3, - kMissileFieldNumber = 4, - kSpecialMeaningAppearanceIdsFieldNumber = 5, - }; - // repeated .Canary.protobuf.appearances.Appearance object = 1; - int object_size() const; - private: - int _internal_object_size() const; - public: - void clear_object(); - ::Canary::protobuf::appearances::Appearance* mutable_object(int index); - ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Appearance >* - mutable_object(); - private: - const ::Canary::protobuf::appearances::Appearance& _internal_object(int index) const; - ::Canary::protobuf::appearances::Appearance* _internal_add_object(); - public: - const ::Canary::protobuf::appearances::Appearance& object(int index) const; - ::Canary::protobuf::appearances::Appearance* add_object(); - const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Appearance >& - object() const; - - // repeated .Canary.protobuf.appearances.Appearance outfit = 2; - int outfit_size() const; - private: - int _internal_outfit_size() const; - public: - void clear_outfit(); - ::Canary::protobuf::appearances::Appearance* mutable_outfit(int index); - ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Appearance >* - mutable_outfit(); - private: - const ::Canary::protobuf::appearances::Appearance& _internal_outfit(int index) const; - ::Canary::protobuf::appearances::Appearance* _internal_add_outfit(); - public: - const ::Canary::protobuf::appearances::Appearance& outfit(int index) const; - ::Canary::protobuf::appearances::Appearance* add_outfit(); - const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Appearance >& - outfit() const; - - // repeated .Canary.protobuf.appearances.Appearance effect = 3; - int effect_size() const; - private: - int _internal_effect_size() const; - public: - void clear_effect(); - ::Canary::protobuf::appearances::Appearance* mutable_effect(int index); - ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Appearance >* - mutable_effect(); - private: - const ::Canary::protobuf::appearances::Appearance& _internal_effect(int index) const; - ::Canary::protobuf::appearances::Appearance* _internal_add_effect(); - public: - const ::Canary::protobuf::appearances::Appearance& effect(int index) const; - ::Canary::protobuf::appearances::Appearance* add_effect(); - const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Appearance >& - effect() const; - - // repeated .Canary.protobuf.appearances.Appearance missile = 4; - int missile_size() const; - private: - int _internal_missile_size() const; - public: - void clear_missile(); - ::Canary::protobuf::appearances::Appearance* mutable_missile(int index); - ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Appearance >* - mutable_missile(); - private: - const ::Canary::protobuf::appearances::Appearance& _internal_missile(int index) const; - ::Canary::protobuf::appearances::Appearance* _internal_add_missile(); - public: - const ::Canary::protobuf::appearances::Appearance& missile(int index) const; - ::Canary::protobuf::appearances::Appearance* add_missile(); - const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Appearance >& - missile() const; - - // optional .Canary.protobuf.appearances.SpecialMeaningAppearanceIds special_meaning_appearance_ids = 5; - bool has_special_meaning_appearance_ids() const; - private: - bool _internal_has_special_meaning_appearance_ids() const; - public: - void clear_special_meaning_appearance_ids(); - const ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds& special_meaning_appearance_ids() const; - PROTOBUF_NODISCARD ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds* release_special_meaning_appearance_ids(); - ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds* mutable_special_meaning_appearance_ids(); - void set_allocated_special_meaning_appearance_ids(::Canary::protobuf::appearances::SpecialMeaningAppearanceIds* special_meaning_appearance_ids); - private: - const ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds& _internal_special_meaning_appearance_ids() const; - ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds* _internal_mutable_special_meaning_appearance_ids(); - public: - void unsafe_arena_set_allocated_special_meaning_appearance_ids( - ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds* special_meaning_appearance_ids); - ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds* unsafe_arena_release_special_meaning_appearance_ids(); - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.Appearances) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Appearance > object_; - ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Appearance > outfit_; - ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Appearance > effect_; - ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Appearance > missile_; - ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds* special_meaning_appearance_ids_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class SpritePhase final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.SpritePhase) */ { - public: - inline SpritePhase() : SpritePhase(nullptr) {} - ~SpritePhase() override; - explicit PROTOBUF_CONSTEXPR SpritePhase(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - SpritePhase(const SpritePhase& from); - SpritePhase(SpritePhase&& from) noexcept - : SpritePhase() { - *this = ::std::move(from); - } - - inline SpritePhase& operator=(const SpritePhase& from) { - CopyFrom(from); - return *this; - } - inline SpritePhase& operator=(SpritePhase&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const SpritePhase& default_instance() { - return *internal_default_instance(); - } - static inline const SpritePhase* internal_default_instance() { - return reinterpret_cast( - &_SpritePhase_default_instance_); - } - static constexpr int kIndexInFileMessages = - 2; - - friend void swap(SpritePhase& a, SpritePhase& b) { - a.Swap(&b); - } - inline void Swap(SpritePhase* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(SpritePhase* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - SpritePhase* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const SpritePhase& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const SpritePhase& from) { - SpritePhase::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(SpritePhase* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.SpritePhase"; - } - protected: - explicit SpritePhase(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kDurationMinFieldNumber = 1, - kDurationMaxFieldNumber = 2, - }; - // optional uint32 duration_min = 1; - bool has_duration_min() const; - private: - bool _internal_has_duration_min() const; - public: - void clear_duration_min(); - uint32_t duration_min() const; - void set_duration_min(uint32_t value); - private: - uint32_t _internal_duration_min() const; - void _internal_set_duration_min(uint32_t value); - public: - - // optional uint32 duration_max = 2; - bool has_duration_max() const; - private: - bool _internal_has_duration_max() const; - public: - void clear_duration_max(); - uint32_t duration_max() const; - void set_duration_max(uint32_t value); - private: - uint32_t _internal_duration_max() const; - void _internal_set_duration_max(uint32_t value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.SpritePhase) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - uint32_t duration_min_; - uint32_t duration_max_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class SpriteAnimation final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.SpriteAnimation) */ { - public: - inline SpriteAnimation() : SpriteAnimation(nullptr) {} - ~SpriteAnimation() override; - explicit PROTOBUF_CONSTEXPR SpriteAnimation(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - SpriteAnimation(const SpriteAnimation& from); - SpriteAnimation(SpriteAnimation&& from) noexcept - : SpriteAnimation() { - *this = ::std::move(from); - } - - inline SpriteAnimation& operator=(const SpriteAnimation& from) { - CopyFrom(from); - return *this; - } - inline SpriteAnimation& operator=(SpriteAnimation&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const SpriteAnimation& default_instance() { - return *internal_default_instance(); - } - static inline const SpriteAnimation* internal_default_instance() { - return reinterpret_cast( - &_SpriteAnimation_default_instance_); - } - static constexpr int kIndexInFileMessages = - 3; - - friend void swap(SpriteAnimation& a, SpriteAnimation& b) { - a.Swap(&b); - } - inline void Swap(SpriteAnimation* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(SpriteAnimation* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - SpriteAnimation* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const SpriteAnimation& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const SpriteAnimation& from) { - SpriteAnimation::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(SpriteAnimation* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.SpriteAnimation"; - } - protected: - explicit SpriteAnimation(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kSpritePhaseFieldNumber = 6, - kDefaultStartPhaseFieldNumber = 1, - kSynchronizedFieldNumber = 2, - kRandomStartPhaseFieldNumber = 3, - kLoopCountFieldNumber = 5, - kLoopTypeFieldNumber = 4, - }; - // repeated .Canary.protobuf.appearances.SpritePhase sprite_phase = 6; - int sprite_phase_size() const; - private: - int _internal_sprite_phase_size() const; - public: - void clear_sprite_phase(); - ::Canary::protobuf::appearances::SpritePhase* mutable_sprite_phase(int index); - ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::SpritePhase >* - mutable_sprite_phase(); - private: - const ::Canary::protobuf::appearances::SpritePhase& _internal_sprite_phase(int index) const; - ::Canary::protobuf::appearances::SpritePhase* _internal_add_sprite_phase(); - public: - const ::Canary::protobuf::appearances::SpritePhase& sprite_phase(int index) const; - ::Canary::protobuf::appearances::SpritePhase* add_sprite_phase(); - const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::SpritePhase >& - sprite_phase() const; - - // optional uint32 default_start_phase = 1; - bool has_default_start_phase() const; - private: - bool _internal_has_default_start_phase() const; - public: - void clear_default_start_phase(); - uint32_t default_start_phase() const; - void set_default_start_phase(uint32_t value); - private: - uint32_t _internal_default_start_phase() const; - void _internal_set_default_start_phase(uint32_t value); - public: - - // optional bool synchronized = 2; - bool has_synchronized() const; - private: - bool _internal_has_synchronized() const; - public: - void clear_synchronized(); - bool synchronized() const; - void set_synchronized(bool value); - private: - bool _internal_synchronized() const; - void _internal_set_synchronized(bool value); - public: - - // optional bool random_start_phase = 3; - bool has_random_start_phase() const; - private: - bool _internal_has_random_start_phase() const; - public: - void clear_random_start_phase(); - bool random_start_phase() const; - void set_random_start_phase(bool value); - private: - bool _internal_random_start_phase() const; - void _internal_set_random_start_phase(bool value); - public: - - // optional uint32 loop_count = 5; - bool has_loop_count() const; - private: - bool _internal_has_loop_count() const; - public: - void clear_loop_count(); - uint32_t loop_count() const; - void set_loop_count(uint32_t value); - private: - uint32_t _internal_loop_count() const; - void _internal_set_loop_count(uint32_t value); - public: - - // optional .Canary.protobuf.appearances.ANIMATION_LOOP_TYPE loop_type = 4; - bool has_loop_type() const; - private: - bool _internal_has_loop_type() const; - public: - void clear_loop_type(); - ::Canary::protobuf::appearances::ANIMATION_LOOP_TYPE loop_type() const; - void set_loop_type(::Canary::protobuf::appearances::ANIMATION_LOOP_TYPE value); - private: - ::Canary::protobuf::appearances::ANIMATION_LOOP_TYPE _internal_loop_type() const; - void _internal_set_loop_type(::Canary::protobuf::appearances::ANIMATION_LOOP_TYPE value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.SpriteAnimation) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::SpritePhase > sprite_phase_; - uint32_t default_start_phase_; - bool synchronized_; - bool random_start_phase_; - uint32_t loop_count_; - int loop_type_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class Box final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.Box) */ { - public: - inline Box() : Box(nullptr) {} - ~Box() override; - explicit PROTOBUF_CONSTEXPR Box(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - Box(const Box& from); - Box(Box&& from) noexcept - : Box() { - *this = ::std::move(from); - } - - inline Box& operator=(const Box& from) { - CopyFrom(from); - return *this; - } - inline Box& operator=(Box&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const Box& default_instance() { - return *internal_default_instance(); - } - static inline const Box* internal_default_instance() { - return reinterpret_cast( - &_Box_default_instance_); - } - static constexpr int kIndexInFileMessages = - 4; - - friend void swap(Box& a, Box& b) { - a.Swap(&b); - } - inline void Swap(Box* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(Box* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - Box* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const Box& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const Box& from) { - Box::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(Box* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.Box"; - } - protected: - explicit Box(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kXFieldNumber = 1, - kYFieldNumber = 2, - kWidthFieldNumber = 3, - kHeightFieldNumber = 4, - }; - // optional uint32 x = 1; - bool has_x() const; - private: - bool _internal_has_x() const; - public: - void clear_x(); - uint32_t x() const; - void set_x(uint32_t value); - private: - uint32_t _internal_x() const; - void _internal_set_x(uint32_t value); - public: - - // optional uint32 y = 2; - bool has_y() const; - private: - bool _internal_has_y() const; - public: - void clear_y(); - uint32_t y() const; - void set_y(uint32_t value); - private: - uint32_t _internal_y() const; - void _internal_set_y(uint32_t value); - public: - - // optional uint32 width = 3; - bool has_width() const; - private: - bool _internal_has_width() const; - public: - void clear_width(); - uint32_t width() const; - void set_width(uint32_t value); - private: - uint32_t _internal_width() const; - void _internal_set_width(uint32_t value); - public: - - // optional uint32 height = 4; - bool has_height() const; - private: - bool _internal_has_height() const; - public: - void clear_height(); - uint32_t height() const; - void set_height(uint32_t value); - private: - uint32_t _internal_height() const; - void _internal_set_height(uint32_t value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.Box) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - uint32_t x_; - uint32_t y_; - uint32_t width_; - uint32_t height_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class SpriteInfo final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.SpriteInfo) */ { - public: - inline SpriteInfo() : SpriteInfo(nullptr) {} - ~SpriteInfo() override; - explicit PROTOBUF_CONSTEXPR SpriteInfo(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - SpriteInfo(const SpriteInfo& from); - SpriteInfo(SpriteInfo&& from) noexcept - : SpriteInfo() { - *this = ::std::move(from); - } - - inline SpriteInfo& operator=(const SpriteInfo& from) { - CopyFrom(from); - return *this; - } - inline SpriteInfo& operator=(SpriteInfo&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const SpriteInfo& default_instance() { - return *internal_default_instance(); - } - static inline const SpriteInfo* internal_default_instance() { - return reinterpret_cast( - &_SpriteInfo_default_instance_); - } - static constexpr int kIndexInFileMessages = - 5; - - friend void swap(SpriteInfo& a, SpriteInfo& b) { - a.Swap(&b); - } - inline void Swap(SpriteInfo* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(SpriteInfo* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - SpriteInfo* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const SpriteInfo& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const SpriteInfo& from) { - SpriteInfo::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(SpriteInfo* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.SpriteInfo"; - } - protected: - explicit SpriteInfo(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kSpriteIdFieldNumber = 5, - kBoundingBoxPerDirectionFieldNumber = 9, - kAnimationFieldNumber = 6, - kPatternWidthFieldNumber = 1, - kPatternHeightFieldNumber = 2, - kPatternDepthFieldNumber = 3, - kLayersFieldNumber = 4, - kBoundingSquareFieldNumber = 7, - kIsOpaqueFieldNumber = 8, - }; - // repeated uint32 sprite_id = 5; - int sprite_id_size() const; - private: - int _internal_sprite_id_size() const; - public: - void clear_sprite_id(); - private: - uint32_t _internal_sprite_id(int index) const; - const ::PROTOBUF_NAMESPACE_ID::RepeatedField< uint32_t >& - _internal_sprite_id() const; - void _internal_add_sprite_id(uint32_t value); - ::PROTOBUF_NAMESPACE_ID::RepeatedField< uint32_t >* - _internal_mutable_sprite_id(); - public: - uint32_t sprite_id(int index) const; - void set_sprite_id(int index, uint32_t value); - void add_sprite_id(uint32_t value); - const ::PROTOBUF_NAMESPACE_ID::RepeatedField< uint32_t >& - sprite_id() const; - ::PROTOBUF_NAMESPACE_ID::RepeatedField< uint32_t >* - mutable_sprite_id(); - - // repeated .Canary.protobuf.appearances.Box bounding_box_per_direction = 9; - int bounding_box_per_direction_size() const; - private: - int _internal_bounding_box_per_direction_size() const; - public: - void clear_bounding_box_per_direction(); - ::Canary::protobuf::appearances::Box* mutable_bounding_box_per_direction(int index); - ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Box >* - mutable_bounding_box_per_direction(); - private: - const ::Canary::protobuf::appearances::Box& _internal_bounding_box_per_direction(int index) const; - ::Canary::protobuf::appearances::Box* _internal_add_bounding_box_per_direction(); - public: - const ::Canary::protobuf::appearances::Box& bounding_box_per_direction(int index) const; - ::Canary::protobuf::appearances::Box* add_bounding_box_per_direction(); - const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Box >& - bounding_box_per_direction() const; - - // optional .Canary.protobuf.appearances.SpriteAnimation animation = 6; - bool has_animation() const; - private: - bool _internal_has_animation() const; - public: - void clear_animation(); - const ::Canary::protobuf::appearances::SpriteAnimation& animation() const; - PROTOBUF_NODISCARD ::Canary::protobuf::appearances::SpriteAnimation* release_animation(); - ::Canary::protobuf::appearances::SpriteAnimation* mutable_animation(); - void set_allocated_animation(::Canary::protobuf::appearances::SpriteAnimation* animation); - private: - const ::Canary::protobuf::appearances::SpriteAnimation& _internal_animation() const; - ::Canary::protobuf::appearances::SpriteAnimation* _internal_mutable_animation(); - public: - void unsafe_arena_set_allocated_animation( - ::Canary::protobuf::appearances::SpriteAnimation* animation); - ::Canary::protobuf::appearances::SpriteAnimation* unsafe_arena_release_animation(); - - // optional uint32 pattern_width = 1; - bool has_pattern_width() const; - private: - bool _internal_has_pattern_width() const; - public: - void clear_pattern_width(); - uint32_t pattern_width() const; - void set_pattern_width(uint32_t value); - private: - uint32_t _internal_pattern_width() const; - void _internal_set_pattern_width(uint32_t value); - public: - - // optional uint32 pattern_height = 2; - bool has_pattern_height() const; - private: - bool _internal_has_pattern_height() const; - public: - void clear_pattern_height(); - uint32_t pattern_height() const; - void set_pattern_height(uint32_t value); - private: - uint32_t _internal_pattern_height() const; - void _internal_set_pattern_height(uint32_t value); - public: - - // optional uint32 pattern_depth = 3; - bool has_pattern_depth() const; - private: - bool _internal_has_pattern_depth() const; - public: - void clear_pattern_depth(); - uint32_t pattern_depth() const; - void set_pattern_depth(uint32_t value); - private: - uint32_t _internal_pattern_depth() const; - void _internal_set_pattern_depth(uint32_t value); - public: - - // optional uint32 layers = 4; - bool has_layers() const; - private: - bool _internal_has_layers() const; - public: - void clear_layers(); - uint32_t layers() const; - void set_layers(uint32_t value); - private: - uint32_t _internal_layers() const; - void _internal_set_layers(uint32_t value); - public: - - // optional uint32 bounding_square = 7; - bool has_bounding_square() const; - private: - bool _internal_has_bounding_square() const; - public: - void clear_bounding_square(); - uint32_t bounding_square() const; - void set_bounding_square(uint32_t value); - private: - uint32_t _internal_bounding_square() const; - void _internal_set_bounding_square(uint32_t value); - public: - - // optional bool is_opaque = 8; - bool has_is_opaque() const; - private: - bool _internal_has_is_opaque() const; - public: - void clear_is_opaque(); - bool is_opaque() const; - void set_is_opaque(bool value); - private: - bool _internal_is_opaque() const; - void _internal_set_is_opaque(bool value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.SpriteInfo) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - ::PROTOBUF_NAMESPACE_ID::RepeatedField< uint32_t > sprite_id_; - ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Box > bounding_box_per_direction_; - ::Canary::protobuf::appearances::SpriteAnimation* animation_; - uint32_t pattern_width_; - uint32_t pattern_height_; - uint32_t pattern_depth_; - uint32_t layers_; - uint32_t bounding_square_; - bool is_opaque_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class FrameGroup final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.FrameGroup) */ { - public: - inline FrameGroup() : FrameGroup(nullptr) {} - ~FrameGroup() override; - explicit PROTOBUF_CONSTEXPR FrameGroup(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - FrameGroup(const FrameGroup& from); - FrameGroup(FrameGroup&& from) noexcept - : FrameGroup() { - *this = ::std::move(from); - } - - inline FrameGroup& operator=(const FrameGroup& from) { - CopyFrom(from); - return *this; - } - inline FrameGroup& operator=(FrameGroup&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const FrameGroup& default_instance() { - return *internal_default_instance(); - } - static inline const FrameGroup* internal_default_instance() { - return reinterpret_cast( - &_FrameGroup_default_instance_); - } - static constexpr int kIndexInFileMessages = - 6; - - friend void swap(FrameGroup& a, FrameGroup& b) { - a.Swap(&b); - } - inline void Swap(FrameGroup* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(FrameGroup* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - FrameGroup* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const FrameGroup& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const FrameGroup& from) { - FrameGroup::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(FrameGroup* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.FrameGroup"; - } - protected: - explicit FrameGroup(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kSpriteInfoFieldNumber = 3, - kFixedFrameGroupFieldNumber = 1, - kIdFieldNumber = 2, - }; - // optional .Canary.protobuf.appearances.SpriteInfo sprite_info = 3; - bool has_sprite_info() const; - private: - bool _internal_has_sprite_info() const; - public: - void clear_sprite_info(); - const ::Canary::protobuf::appearances::SpriteInfo& sprite_info() const; - PROTOBUF_NODISCARD ::Canary::protobuf::appearances::SpriteInfo* release_sprite_info(); - ::Canary::protobuf::appearances::SpriteInfo* mutable_sprite_info(); - void set_allocated_sprite_info(::Canary::protobuf::appearances::SpriteInfo* sprite_info); - private: - const ::Canary::protobuf::appearances::SpriteInfo& _internal_sprite_info() const; - ::Canary::protobuf::appearances::SpriteInfo* _internal_mutable_sprite_info(); - public: - void unsafe_arena_set_allocated_sprite_info( - ::Canary::protobuf::appearances::SpriteInfo* sprite_info); - ::Canary::protobuf::appearances::SpriteInfo* unsafe_arena_release_sprite_info(); - - // optional .Canary.protobuf.appearances.FIXED_FRAME_GROUP fixed_frame_group = 1; - bool has_fixed_frame_group() const; - private: - bool _internal_has_fixed_frame_group() const; - public: - void clear_fixed_frame_group(); - ::Canary::protobuf::appearances::FIXED_FRAME_GROUP fixed_frame_group() const; - void set_fixed_frame_group(::Canary::protobuf::appearances::FIXED_FRAME_GROUP value); - private: - ::Canary::protobuf::appearances::FIXED_FRAME_GROUP _internal_fixed_frame_group() const; - void _internal_set_fixed_frame_group(::Canary::protobuf::appearances::FIXED_FRAME_GROUP value); - public: - - // optional uint32 id = 2; - bool has_id() const; - private: - bool _internal_has_id() const; - public: - void clear_id(); - uint32_t id() const; - void set_id(uint32_t value); - private: - uint32_t _internal_id() const; - void _internal_set_id(uint32_t value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.FrameGroup) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - ::Canary::protobuf::appearances::SpriteInfo* sprite_info_; - int fixed_frame_group_; - uint32_t id_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class Appearance final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.Appearance) */ { - public: - inline Appearance() : Appearance(nullptr) {} - ~Appearance() override; - explicit PROTOBUF_CONSTEXPR Appearance(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - Appearance(const Appearance& from); - Appearance(Appearance&& from) noexcept - : Appearance() { - *this = ::std::move(from); - } - - inline Appearance& operator=(const Appearance& from) { - CopyFrom(from); - return *this; - } - inline Appearance& operator=(Appearance&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const Appearance& default_instance() { - return *internal_default_instance(); - } - static inline const Appearance* internal_default_instance() { - return reinterpret_cast( - &_Appearance_default_instance_); - } - static constexpr int kIndexInFileMessages = - 7; - - friend void swap(Appearance& a, Appearance& b) { - a.Swap(&b); - } - inline void Swap(Appearance* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(Appearance* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - Appearance* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const Appearance& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const Appearance& from) { - Appearance::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(Appearance* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.Appearance"; - } - protected: - explicit Appearance(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kFrameGroupFieldNumber = 2, - kNameFieldNumber = 4, - kDescriptionFieldNumber = 5, - kFlagsFieldNumber = 3, - kIdFieldNumber = 1, - }; - // repeated .Canary.protobuf.appearances.FrameGroup frame_group = 2; - int frame_group_size() const; - private: - int _internal_frame_group_size() const; - public: - void clear_frame_group(); - ::Canary::protobuf::appearances::FrameGroup* mutable_frame_group(int index); - ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::FrameGroup >* - mutable_frame_group(); - private: - const ::Canary::protobuf::appearances::FrameGroup& _internal_frame_group(int index) const; - ::Canary::protobuf::appearances::FrameGroup* _internal_add_frame_group(); - public: - const ::Canary::protobuf::appearances::FrameGroup& frame_group(int index) const; - ::Canary::protobuf::appearances::FrameGroup* add_frame_group(); - const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::FrameGroup >& - frame_group() const; - - // optional bytes name = 4; - bool has_name() const; - private: - bool _internal_has_name() const; - public: - void clear_name(); - const std::string& name() const; - template - void set_name(ArgT0&& arg0, ArgT... args); - std::string* mutable_name(); - PROTOBUF_NODISCARD std::string* release_name(); - void set_allocated_name(std::string* name); - private: - const std::string& _internal_name() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_name(const std::string& value); - std::string* _internal_mutable_name(); - public: - - // optional bytes description = 5; - bool has_description() const; - private: - bool _internal_has_description() const; - public: - void clear_description(); - const std::string& description() const; - template - void set_description(ArgT0&& arg0, ArgT... args); - std::string* mutable_description(); - PROTOBUF_NODISCARD std::string* release_description(); - void set_allocated_description(std::string* description); - private: - const std::string& _internal_description() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_description(const std::string& value); - std::string* _internal_mutable_description(); - public: - - // optional .Canary.protobuf.appearances.AppearanceFlags flags = 3; - bool has_flags() const; - private: - bool _internal_has_flags() const; - public: - void clear_flags(); - const ::Canary::protobuf::appearances::AppearanceFlags& flags() const; - PROTOBUF_NODISCARD ::Canary::protobuf::appearances::AppearanceFlags* release_flags(); - ::Canary::protobuf::appearances::AppearanceFlags* mutable_flags(); - void set_allocated_flags(::Canary::protobuf::appearances::AppearanceFlags* flags); - private: - const ::Canary::protobuf::appearances::AppearanceFlags& _internal_flags() const; - ::Canary::protobuf::appearances::AppearanceFlags* _internal_mutable_flags(); - public: - void unsafe_arena_set_allocated_flags( - ::Canary::protobuf::appearances::AppearanceFlags* flags); - ::Canary::protobuf::appearances::AppearanceFlags* unsafe_arena_release_flags(); - - // optional uint32 id = 1; - bool has_id() const; - private: - bool _internal_has_id() const; - public: - void clear_id(); - uint32_t id() const; - void set_id(uint32_t value); - private: - uint32_t _internal_id() const; - void _internal_set_id(uint32_t value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.Appearance) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::FrameGroup > frame_group_; - ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr name_; - ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr description_; - ::Canary::protobuf::appearances::AppearanceFlags* flags_; - uint32_t id_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class AppearanceFlags final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.AppearanceFlags) */ { - public: - inline AppearanceFlags() : AppearanceFlags(nullptr) {} - ~AppearanceFlags() override; - explicit PROTOBUF_CONSTEXPR AppearanceFlags(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - AppearanceFlags(const AppearanceFlags& from); - AppearanceFlags(AppearanceFlags&& from) noexcept - : AppearanceFlags() { - *this = ::std::move(from); - } - - inline AppearanceFlags& operator=(const AppearanceFlags& from) { - CopyFrom(from); - return *this; - } - inline AppearanceFlags& operator=(AppearanceFlags&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const AppearanceFlags& default_instance() { - return *internal_default_instance(); - } - static inline const AppearanceFlags* internal_default_instance() { - return reinterpret_cast( - &_AppearanceFlags_default_instance_); - } - static constexpr int kIndexInFileMessages = - 8; - - friend void swap(AppearanceFlags& a, AppearanceFlags& b) { - a.Swap(&b); - } - inline void Swap(AppearanceFlags* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(AppearanceFlags* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - AppearanceFlags* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const AppearanceFlags& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const AppearanceFlags& from) { - AppearanceFlags::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(AppearanceFlags* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.AppearanceFlags"; - } - protected: - explicit AppearanceFlags(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kNpcsaledataFieldNumber = 40, - kBankFieldNumber = 1, - kWriteFieldNumber = 10, - kWriteOnceFieldNumber = 11, - kHookFieldNumber = 21, - kLightFieldNumber = 23, - kShiftFieldNumber = 26, - kHeightFieldNumber = 27, - kAutomapFieldNumber = 30, - kLenshelpFieldNumber = 31, - kClothesFieldNumber = 34, - kDefaultActionFieldNumber = 35, - kMarketFieldNumber = 36, - kChangedtoexpireFieldNumber = 41, - kCyclopediaitemFieldNumber = 44, - kUpgradeclassificationFieldNumber = 48, - kClipFieldNumber = 2, - kBottomFieldNumber = 3, - kTopFieldNumber = 4, - kContainerFieldNumber = 5, - kCumulativeFieldNumber = 6, - kUsableFieldNumber = 7, - kForceuseFieldNumber = 8, - kMultiuseFieldNumber = 9, - kLiquidpoolFieldNumber = 12, - kUnpassFieldNumber = 13, - kUnmoveFieldNumber = 14, - kUnsightFieldNumber = 15, - kAvoidFieldNumber = 16, - kNoMovementAnimationFieldNumber = 17, - kTakeFieldNumber = 18, - kLiquidcontainerFieldNumber = 19, - kHangFieldNumber = 20, - kRotateFieldNumber = 22, - kDontHideFieldNumber = 24, - kTranslucentFieldNumber = 25, - kLyingObjectFieldNumber = 28, - kAnimateAlwaysFieldNumber = 29, - kFullbankFieldNumber = 32, - kIgnoreLookFieldNumber = 33, - kWrapFieldNumber = 37, - kUnwrapFieldNumber = 38, - kTopeffectFieldNumber = 39, - kCorpseFieldNumber = 42, - kPlayerCorpseFieldNumber = 43, - kAmmoFieldNumber = 45, - kShowOffSocketFieldNumber = 46, - kReportableFieldNumber = 47, - kReverseAddonsEastFieldNumber = 49, - kReverseAddonsWestFieldNumber = 50, - kReverseAddonsSouthFieldNumber = 51, - kReverseAddonsNorthFieldNumber = 52, - kWearoutFieldNumber = 53, - kClockexpireFieldNumber = 54, - kExpireFieldNumber = 55, - kExpirestopFieldNumber = 56, - kWrapkitFieldNumber = 57, - }; - // repeated .Canary.protobuf.appearances.AppearanceFlagNPC npcsaledata = 40; - int npcsaledata_size() const; - private: - int _internal_npcsaledata_size() const; - public: - void clear_npcsaledata(); - ::Canary::protobuf::appearances::AppearanceFlagNPC* mutable_npcsaledata(int index); - ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::AppearanceFlagNPC >* - mutable_npcsaledata(); - private: - const ::Canary::protobuf::appearances::AppearanceFlagNPC& _internal_npcsaledata(int index) const; - ::Canary::protobuf::appearances::AppearanceFlagNPC* _internal_add_npcsaledata(); - public: - const ::Canary::protobuf::appearances::AppearanceFlagNPC& npcsaledata(int index) const; - ::Canary::protobuf::appearances::AppearanceFlagNPC* add_npcsaledata(); - const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::AppearanceFlagNPC >& - npcsaledata() const; - - // optional .Canary.protobuf.appearances.AppearanceFlagBank bank = 1; - bool has_bank() const; - private: - bool _internal_has_bank() const; - public: - void clear_bank(); - const ::Canary::protobuf::appearances::AppearanceFlagBank& bank() const; - PROTOBUF_NODISCARD ::Canary::protobuf::appearances::AppearanceFlagBank* release_bank(); - ::Canary::protobuf::appearances::AppearanceFlagBank* mutable_bank(); - void set_allocated_bank(::Canary::protobuf::appearances::AppearanceFlagBank* bank); - private: - const ::Canary::protobuf::appearances::AppearanceFlagBank& _internal_bank() const; - ::Canary::protobuf::appearances::AppearanceFlagBank* _internal_mutable_bank(); - public: - void unsafe_arena_set_allocated_bank( - ::Canary::protobuf::appearances::AppearanceFlagBank* bank); - ::Canary::protobuf::appearances::AppearanceFlagBank* unsafe_arena_release_bank(); - - // optional .Canary.protobuf.appearances.AppearanceFlagWrite write = 10; - bool has_write() const; - private: - bool _internal_has_write() const; - public: - void clear_write(); - const ::Canary::protobuf::appearances::AppearanceFlagWrite& write() const; - PROTOBUF_NODISCARD ::Canary::protobuf::appearances::AppearanceFlagWrite* release_write(); - ::Canary::protobuf::appearances::AppearanceFlagWrite* mutable_write(); - void set_allocated_write(::Canary::protobuf::appearances::AppearanceFlagWrite* write); - private: - const ::Canary::protobuf::appearances::AppearanceFlagWrite& _internal_write() const; - ::Canary::protobuf::appearances::AppearanceFlagWrite* _internal_mutable_write(); - public: - void unsafe_arena_set_allocated_write( - ::Canary::protobuf::appearances::AppearanceFlagWrite* write); - ::Canary::protobuf::appearances::AppearanceFlagWrite* unsafe_arena_release_write(); - - // optional .Canary.protobuf.appearances.AppearanceFlagWriteOnce write_once = 11; - bool has_write_once() const; - private: - bool _internal_has_write_once() const; - public: - void clear_write_once(); - const ::Canary::protobuf::appearances::AppearanceFlagWriteOnce& write_once() const; - PROTOBUF_NODISCARD ::Canary::protobuf::appearances::AppearanceFlagWriteOnce* release_write_once(); - ::Canary::protobuf::appearances::AppearanceFlagWriteOnce* mutable_write_once(); - void set_allocated_write_once(::Canary::protobuf::appearances::AppearanceFlagWriteOnce* write_once); - private: - const ::Canary::protobuf::appearances::AppearanceFlagWriteOnce& _internal_write_once() const; - ::Canary::protobuf::appearances::AppearanceFlagWriteOnce* _internal_mutable_write_once(); - public: - void unsafe_arena_set_allocated_write_once( - ::Canary::protobuf::appearances::AppearanceFlagWriteOnce* write_once); - ::Canary::protobuf::appearances::AppearanceFlagWriteOnce* unsafe_arena_release_write_once(); - - // optional .Canary.protobuf.appearances.AppearanceFlagHook hook = 21; - bool has_hook() const; - private: - bool _internal_has_hook() const; - public: - void clear_hook(); - const ::Canary::protobuf::appearances::AppearanceFlagHook& hook() const; - PROTOBUF_NODISCARD ::Canary::protobuf::appearances::AppearanceFlagHook* release_hook(); - ::Canary::protobuf::appearances::AppearanceFlagHook* mutable_hook(); - void set_allocated_hook(::Canary::protobuf::appearances::AppearanceFlagHook* hook); - private: - const ::Canary::protobuf::appearances::AppearanceFlagHook& _internal_hook() const; - ::Canary::protobuf::appearances::AppearanceFlagHook* _internal_mutable_hook(); - public: - void unsafe_arena_set_allocated_hook( - ::Canary::protobuf::appearances::AppearanceFlagHook* hook); - ::Canary::protobuf::appearances::AppearanceFlagHook* unsafe_arena_release_hook(); - - // optional .Canary.protobuf.appearances.AppearanceFlagLight light = 23; - bool has_light() const; - private: - bool _internal_has_light() const; - public: - void clear_light(); - const ::Canary::protobuf::appearances::AppearanceFlagLight& light() const; - PROTOBUF_NODISCARD ::Canary::protobuf::appearances::AppearanceFlagLight* release_light(); - ::Canary::protobuf::appearances::AppearanceFlagLight* mutable_light(); - void set_allocated_light(::Canary::protobuf::appearances::AppearanceFlagLight* light); - private: - const ::Canary::protobuf::appearances::AppearanceFlagLight& _internal_light() const; - ::Canary::protobuf::appearances::AppearanceFlagLight* _internal_mutable_light(); - public: - void unsafe_arena_set_allocated_light( - ::Canary::protobuf::appearances::AppearanceFlagLight* light); - ::Canary::protobuf::appearances::AppearanceFlagLight* unsafe_arena_release_light(); - - // optional .Canary.protobuf.appearances.AppearanceFlagShift shift = 26; - bool has_shift() const; - private: - bool _internal_has_shift() const; - public: - void clear_shift(); - const ::Canary::protobuf::appearances::AppearanceFlagShift& shift() const; - PROTOBUF_NODISCARD ::Canary::protobuf::appearances::AppearanceFlagShift* release_shift(); - ::Canary::protobuf::appearances::AppearanceFlagShift* mutable_shift(); - void set_allocated_shift(::Canary::protobuf::appearances::AppearanceFlagShift* shift); - private: - const ::Canary::protobuf::appearances::AppearanceFlagShift& _internal_shift() const; - ::Canary::protobuf::appearances::AppearanceFlagShift* _internal_mutable_shift(); - public: - void unsafe_arena_set_allocated_shift( - ::Canary::protobuf::appearances::AppearanceFlagShift* shift); - ::Canary::protobuf::appearances::AppearanceFlagShift* unsafe_arena_release_shift(); - - // optional .Canary.protobuf.appearances.AppearanceFlagHeight height = 27; - bool has_height() const; - private: - bool _internal_has_height() const; - public: - void clear_height(); - const ::Canary::protobuf::appearances::AppearanceFlagHeight& height() const; - PROTOBUF_NODISCARD ::Canary::protobuf::appearances::AppearanceFlagHeight* release_height(); - ::Canary::protobuf::appearances::AppearanceFlagHeight* mutable_height(); - void set_allocated_height(::Canary::protobuf::appearances::AppearanceFlagHeight* height); - private: - const ::Canary::protobuf::appearances::AppearanceFlagHeight& _internal_height() const; - ::Canary::protobuf::appearances::AppearanceFlagHeight* _internal_mutable_height(); - public: - void unsafe_arena_set_allocated_height( - ::Canary::protobuf::appearances::AppearanceFlagHeight* height); - ::Canary::protobuf::appearances::AppearanceFlagHeight* unsafe_arena_release_height(); - - // optional .Canary.protobuf.appearances.AppearanceFlagAutomap automap = 30; - bool has_automap() const; - private: - bool _internal_has_automap() const; - public: - void clear_automap(); - const ::Canary::protobuf::appearances::AppearanceFlagAutomap& automap() const; - PROTOBUF_NODISCARD ::Canary::protobuf::appearances::AppearanceFlagAutomap* release_automap(); - ::Canary::protobuf::appearances::AppearanceFlagAutomap* mutable_automap(); - void set_allocated_automap(::Canary::protobuf::appearances::AppearanceFlagAutomap* automap); - private: - const ::Canary::protobuf::appearances::AppearanceFlagAutomap& _internal_automap() const; - ::Canary::protobuf::appearances::AppearanceFlagAutomap* _internal_mutable_automap(); - public: - void unsafe_arena_set_allocated_automap( - ::Canary::protobuf::appearances::AppearanceFlagAutomap* automap); - ::Canary::protobuf::appearances::AppearanceFlagAutomap* unsafe_arena_release_automap(); - - // optional .Canary.protobuf.appearances.AppearanceFlagLenshelp lenshelp = 31; - bool has_lenshelp() const; - private: - bool _internal_has_lenshelp() const; - public: - void clear_lenshelp(); - const ::Canary::protobuf::appearances::AppearanceFlagLenshelp& lenshelp() const; - PROTOBUF_NODISCARD ::Canary::protobuf::appearances::AppearanceFlagLenshelp* release_lenshelp(); - ::Canary::protobuf::appearances::AppearanceFlagLenshelp* mutable_lenshelp(); - void set_allocated_lenshelp(::Canary::protobuf::appearances::AppearanceFlagLenshelp* lenshelp); - private: - const ::Canary::protobuf::appearances::AppearanceFlagLenshelp& _internal_lenshelp() const; - ::Canary::protobuf::appearances::AppearanceFlagLenshelp* _internal_mutable_lenshelp(); - public: - void unsafe_arena_set_allocated_lenshelp( - ::Canary::protobuf::appearances::AppearanceFlagLenshelp* lenshelp); - ::Canary::protobuf::appearances::AppearanceFlagLenshelp* unsafe_arena_release_lenshelp(); - - // optional .Canary.protobuf.appearances.AppearanceFlagClothes clothes = 34; - bool has_clothes() const; - private: - bool _internal_has_clothes() const; - public: - void clear_clothes(); - const ::Canary::protobuf::appearances::AppearanceFlagClothes& clothes() const; - PROTOBUF_NODISCARD ::Canary::protobuf::appearances::AppearanceFlagClothes* release_clothes(); - ::Canary::protobuf::appearances::AppearanceFlagClothes* mutable_clothes(); - void set_allocated_clothes(::Canary::protobuf::appearances::AppearanceFlagClothes* clothes); - private: - const ::Canary::protobuf::appearances::AppearanceFlagClothes& _internal_clothes() const; - ::Canary::protobuf::appearances::AppearanceFlagClothes* _internal_mutable_clothes(); - public: - void unsafe_arena_set_allocated_clothes( - ::Canary::protobuf::appearances::AppearanceFlagClothes* clothes); - ::Canary::protobuf::appearances::AppearanceFlagClothes* unsafe_arena_release_clothes(); - - // optional .Canary.protobuf.appearances.AppearanceFlagDefaultAction default_action = 35; - bool has_default_action() const; - private: - bool _internal_has_default_action() const; - public: - void clear_default_action(); - const ::Canary::protobuf::appearances::AppearanceFlagDefaultAction& default_action() const; - PROTOBUF_NODISCARD ::Canary::protobuf::appearances::AppearanceFlagDefaultAction* release_default_action(); - ::Canary::protobuf::appearances::AppearanceFlagDefaultAction* mutable_default_action(); - void set_allocated_default_action(::Canary::protobuf::appearances::AppearanceFlagDefaultAction* default_action); - private: - const ::Canary::protobuf::appearances::AppearanceFlagDefaultAction& _internal_default_action() const; - ::Canary::protobuf::appearances::AppearanceFlagDefaultAction* _internal_mutable_default_action(); - public: - void unsafe_arena_set_allocated_default_action( - ::Canary::protobuf::appearances::AppearanceFlagDefaultAction* default_action); - ::Canary::protobuf::appearances::AppearanceFlagDefaultAction* unsafe_arena_release_default_action(); - - // optional .Canary.protobuf.appearances.AppearanceFlagMarket market = 36; - bool has_market() const; - private: - bool _internal_has_market() const; - public: - void clear_market(); - const ::Canary::protobuf::appearances::AppearanceFlagMarket& market() const; - PROTOBUF_NODISCARD ::Canary::protobuf::appearances::AppearanceFlagMarket* release_market(); - ::Canary::protobuf::appearances::AppearanceFlagMarket* mutable_market(); - void set_allocated_market(::Canary::protobuf::appearances::AppearanceFlagMarket* market); - private: - const ::Canary::protobuf::appearances::AppearanceFlagMarket& _internal_market() const; - ::Canary::protobuf::appearances::AppearanceFlagMarket* _internal_mutable_market(); - public: - void unsafe_arena_set_allocated_market( - ::Canary::protobuf::appearances::AppearanceFlagMarket* market); - ::Canary::protobuf::appearances::AppearanceFlagMarket* unsafe_arena_release_market(); - - // optional .Canary.protobuf.appearances.AppearanceFlagChangedToExpire changedtoexpire = 41; - bool has_changedtoexpire() const; - private: - bool _internal_has_changedtoexpire() const; - public: - void clear_changedtoexpire(); - const ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire& changedtoexpire() const; - PROTOBUF_NODISCARD ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire* release_changedtoexpire(); - ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire* mutable_changedtoexpire(); - void set_allocated_changedtoexpire(::Canary::protobuf::appearances::AppearanceFlagChangedToExpire* changedtoexpire); - private: - const ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire& _internal_changedtoexpire() const; - ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire* _internal_mutable_changedtoexpire(); - public: - void unsafe_arena_set_allocated_changedtoexpire( - ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire* changedtoexpire); - ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire* unsafe_arena_release_changedtoexpire(); - - // optional .Canary.protobuf.appearances.AppearanceFlagCyclopedia cyclopediaitem = 44; - bool has_cyclopediaitem() const; - private: - bool _internal_has_cyclopediaitem() const; - public: - void clear_cyclopediaitem(); - const ::Canary::protobuf::appearances::AppearanceFlagCyclopedia& cyclopediaitem() const; - PROTOBUF_NODISCARD ::Canary::protobuf::appearances::AppearanceFlagCyclopedia* release_cyclopediaitem(); - ::Canary::protobuf::appearances::AppearanceFlagCyclopedia* mutable_cyclopediaitem(); - void set_allocated_cyclopediaitem(::Canary::protobuf::appearances::AppearanceFlagCyclopedia* cyclopediaitem); - private: - const ::Canary::protobuf::appearances::AppearanceFlagCyclopedia& _internal_cyclopediaitem() const; - ::Canary::protobuf::appearances::AppearanceFlagCyclopedia* _internal_mutable_cyclopediaitem(); - public: - void unsafe_arena_set_allocated_cyclopediaitem( - ::Canary::protobuf::appearances::AppearanceFlagCyclopedia* cyclopediaitem); - ::Canary::protobuf::appearances::AppearanceFlagCyclopedia* unsafe_arena_release_cyclopediaitem(); - - // optional .Canary.protobuf.appearances.AppearanceFlagUpgradeClassification upgradeclassification = 48; - bool has_upgradeclassification() const; - private: - bool _internal_has_upgradeclassification() const; - public: - void clear_upgradeclassification(); - const ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification& upgradeclassification() const; - PROTOBUF_NODISCARD ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification* release_upgradeclassification(); - ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification* mutable_upgradeclassification(); - void set_allocated_upgradeclassification(::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification* upgradeclassification); - private: - const ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification& _internal_upgradeclassification() const; - ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification* _internal_mutable_upgradeclassification(); - public: - void unsafe_arena_set_allocated_upgradeclassification( - ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification* upgradeclassification); - ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification* unsafe_arena_release_upgradeclassification(); - - // optional bool clip = 2; - bool has_clip() const; - private: - bool _internal_has_clip() const; - public: - void clear_clip(); - bool clip() const; - void set_clip(bool value); - private: - bool _internal_clip() const; - void _internal_set_clip(bool value); - public: - - // optional bool bottom = 3; - bool has_bottom() const; - private: - bool _internal_has_bottom() const; - public: - void clear_bottom(); - bool bottom() const; - void set_bottom(bool value); - private: - bool _internal_bottom() const; - void _internal_set_bottom(bool value); - public: - - // optional bool top = 4; - bool has_top() const; - private: - bool _internal_has_top() const; - public: - void clear_top(); - bool top() const; - void set_top(bool value); - private: - bool _internal_top() const; - void _internal_set_top(bool value); - public: - - // optional bool container = 5; - bool has_container() const; - private: - bool _internal_has_container() const; - public: - void clear_container(); - bool container() const; - void set_container(bool value); - private: - bool _internal_container() const; - void _internal_set_container(bool value); - public: - - // optional bool cumulative = 6; - bool has_cumulative() const; - private: - bool _internal_has_cumulative() const; - public: - void clear_cumulative(); - bool cumulative() const; - void set_cumulative(bool value); - private: - bool _internal_cumulative() const; - void _internal_set_cumulative(bool value); - public: - - // optional bool usable = 7; - bool has_usable() const; - private: - bool _internal_has_usable() const; - public: - void clear_usable(); - bool usable() const; - void set_usable(bool value); - private: - bool _internal_usable() const; - void _internal_set_usable(bool value); - public: - - // optional bool forceuse = 8; - bool has_forceuse() const; - private: - bool _internal_has_forceuse() const; - public: - void clear_forceuse(); - bool forceuse() const; - void set_forceuse(bool value); - private: - bool _internal_forceuse() const; - void _internal_set_forceuse(bool value); - public: - - // optional bool multiuse = 9; - bool has_multiuse() const; - private: - bool _internal_has_multiuse() const; - public: - void clear_multiuse(); - bool multiuse() const; - void set_multiuse(bool value); - private: - bool _internal_multiuse() const; - void _internal_set_multiuse(bool value); - public: - - // optional bool liquidpool = 12; - bool has_liquidpool() const; - private: - bool _internal_has_liquidpool() const; - public: - void clear_liquidpool(); - bool liquidpool() const; - void set_liquidpool(bool value); - private: - bool _internal_liquidpool() const; - void _internal_set_liquidpool(bool value); - public: - - // optional bool unpass = 13; - bool has_unpass() const; - private: - bool _internal_has_unpass() const; - public: - void clear_unpass(); - bool unpass() const; - void set_unpass(bool value); - private: - bool _internal_unpass() const; - void _internal_set_unpass(bool value); - public: - - // optional bool unmove = 14; - bool has_unmove() const; - private: - bool _internal_has_unmove() const; - public: - void clear_unmove(); - bool unmove() const; - void set_unmove(bool value); - private: - bool _internal_unmove() const; - void _internal_set_unmove(bool value); - public: - - // optional bool unsight = 15; - bool has_unsight() const; - private: - bool _internal_has_unsight() const; - public: - void clear_unsight(); - bool unsight() const; - void set_unsight(bool value); - private: - bool _internal_unsight() const; - void _internal_set_unsight(bool value); - public: - - // optional bool avoid = 16; - bool has_avoid() const; - private: - bool _internal_has_avoid() const; - public: - void clear_avoid(); - bool avoid() const; - void set_avoid(bool value); - private: - bool _internal_avoid() const; - void _internal_set_avoid(bool value); - public: - - // optional bool no_movement_animation = 17; - bool has_no_movement_animation() const; - private: - bool _internal_has_no_movement_animation() const; - public: - void clear_no_movement_animation(); - bool no_movement_animation() const; - void set_no_movement_animation(bool value); - private: - bool _internal_no_movement_animation() const; - void _internal_set_no_movement_animation(bool value); - public: - - // optional bool take = 18; - bool has_take() const; - private: - bool _internal_has_take() const; - public: - void clear_take(); - bool take() const; - void set_take(bool value); - private: - bool _internal_take() const; - void _internal_set_take(bool value); - public: - - // optional bool liquidcontainer = 19; - bool has_liquidcontainer() const; - private: - bool _internal_has_liquidcontainer() const; - public: - void clear_liquidcontainer(); - bool liquidcontainer() const; - void set_liquidcontainer(bool value); - private: - bool _internal_liquidcontainer() const; - void _internal_set_liquidcontainer(bool value); - public: - - // optional bool hang = 20; - bool has_hang() const; - private: - bool _internal_has_hang() const; - public: - void clear_hang(); - bool hang() const; - void set_hang(bool value); - private: - bool _internal_hang() const; - void _internal_set_hang(bool value); - public: - - // optional bool rotate = 22; - bool has_rotate() const; - private: - bool _internal_has_rotate() const; - public: - void clear_rotate(); - bool rotate() const; - void set_rotate(bool value); - private: - bool _internal_rotate() const; - void _internal_set_rotate(bool value); - public: - - // optional bool dont_hide = 24; - bool has_dont_hide() const; - private: - bool _internal_has_dont_hide() const; - public: - void clear_dont_hide(); - bool dont_hide() const; - void set_dont_hide(bool value); - private: - bool _internal_dont_hide() const; - void _internal_set_dont_hide(bool value); - public: - - // optional bool translucent = 25; - bool has_translucent() const; - private: - bool _internal_has_translucent() const; - public: - void clear_translucent(); - bool translucent() const; - void set_translucent(bool value); - private: - bool _internal_translucent() const; - void _internal_set_translucent(bool value); - public: - - // optional bool lying_object = 28; - bool has_lying_object() const; - private: - bool _internal_has_lying_object() const; - public: - void clear_lying_object(); - bool lying_object() const; - void set_lying_object(bool value); - private: - bool _internal_lying_object() const; - void _internal_set_lying_object(bool value); - public: - - // optional bool animate_always = 29; - bool has_animate_always() const; - private: - bool _internal_has_animate_always() const; - public: - void clear_animate_always(); - bool animate_always() const; - void set_animate_always(bool value); - private: - bool _internal_animate_always() const; - void _internal_set_animate_always(bool value); - public: - - // optional bool fullbank = 32; - bool has_fullbank() const; - private: - bool _internal_has_fullbank() const; - public: - void clear_fullbank(); - bool fullbank() const; - void set_fullbank(bool value); - private: - bool _internal_fullbank() const; - void _internal_set_fullbank(bool value); - public: - - // optional bool ignore_look = 33; - bool has_ignore_look() const; - private: - bool _internal_has_ignore_look() const; - public: - void clear_ignore_look(); - bool ignore_look() const; - void set_ignore_look(bool value); - private: - bool _internal_ignore_look() const; - void _internal_set_ignore_look(bool value); - public: - - // optional bool wrap = 37; - bool has_wrap() const; - private: - bool _internal_has_wrap() const; - public: - void clear_wrap(); - bool wrap() const; - void set_wrap(bool value); - private: - bool _internal_wrap() const; - void _internal_set_wrap(bool value); - public: - - // optional bool unwrap = 38; - bool has_unwrap() const; - private: - bool _internal_has_unwrap() const; - public: - void clear_unwrap(); - bool unwrap() const; - void set_unwrap(bool value); - private: - bool _internal_unwrap() const; - void _internal_set_unwrap(bool value); - public: - - // optional bool topeffect = 39; - bool has_topeffect() const; - private: - bool _internal_has_topeffect() const; - public: - void clear_topeffect(); - bool topeffect() const; - void set_topeffect(bool value); - private: - bool _internal_topeffect() const; - void _internal_set_topeffect(bool value); - public: - - // optional bool corpse = 42; - bool has_corpse() const; - private: - bool _internal_has_corpse() const; - public: - void clear_corpse(); - bool corpse() const; - void set_corpse(bool value); - private: - bool _internal_corpse() const; - void _internal_set_corpse(bool value); - public: - - // optional bool player_corpse = 43; - bool has_player_corpse() const; - private: - bool _internal_has_player_corpse() const; - public: - void clear_player_corpse(); - bool player_corpse() const; - void set_player_corpse(bool value); - private: - bool _internal_player_corpse() const; - void _internal_set_player_corpse(bool value); - public: - - // optional bool ammo = 45; - bool has_ammo() const; - private: - bool _internal_has_ammo() const; - public: - void clear_ammo(); - bool ammo() const; - void set_ammo(bool value); - private: - bool _internal_ammo() const; - void _internal_set_ammo(bool value); - public: - - // optional bool show_off_socket = 46; - bool has_show_off_socket() const; - private: - bool _internal_has_show_off_socket() const; - public: - void clear_show_off_socket(); - bool show_off_socket() const; - void set_show_off_socket(bool value); - private: - bool _internal_show_off_socket() const; - void _internal_set_show_off_socket(bool value); - public: - - // optional bool reportable = 47; - bool has_reportable() const; - private: - bool _internal_has_reportable() const; - public: - void clear_reportable(); - bool reportable() const; - void set_reportable(bool value); - private: - bool _internal_reportable() const; - void _internal_set_reportable(bool value); - public: - - // optional bool reverse_addons_east = 49; - bool has_reverse_addons_east() const; - private: - bool _internal_has_reverse_addons_east() const; - public: - void clear_reverse_addons_east(); - bool reverse_addons_east() const; - void set_reverse_addons_east(bool value); - private: - bool _internal_reverse_addons_east() const; - void _internal_set_reverse_addons_east(bool value); - public: - - // optional bool reverse_addons_west = 50; - bool has_reverse_addons_west() const; - private: - bool _internal_has_reverse_addons_west() const; - public: - void clear_reverse_addons_west(); - bool reverse_addons_west() const; - void set_reverse_addons_west(bool value); - private: - bool _internal_reverse_addons_west() const; - void _internal_set_reverse_addons_west(bool value); - public: - - // optional bool reverse_addons_south = 51; - bool has_reverse_addons_south() const; - private: - bool _internal_has_reverse_addons_south() const; - public: - void clear_reverse_addons_south(); - bool reverse_addons_south() const; - void set_reverse_addons_south(bool value); - private: - bool _internal_reverse_addons_south() const; - void _internal_set_reverse_addons_south(bool value); - public: - - // optional bool reverse_addons_north = 52; - bool has_reverse_addons_north() const; - private: - bool _internal_has_reverse_addons_north() const; - public: - void clear_reverse_addons_north(); - bool reverse_addons_north() const; - void set_reverse_addons_north(bool value); - private: - bool _internal_reverse_addons_north() const; - void _internal_set_reverse_addons_north(bool value); - public: - - // optional bool wearout = 53; - bool has_wearout() const; - private: - bool _internal_has_wearout() const; - public: - void clear_wearout(); - bool wearout() const; - void set_wearout(bool value); - private: - bool _internal_wearout() const; - void _internal_set_wearout(bool value); - public: - - // optional bool clockexpire = 54; - bool has_clockexpire() const; - private: - bool _internal_has_clockexpire() const; - public: - void clear_clockexpire(); - bool clockexpire() const; - void set_clockexpire(bool value); - private: - bool _internal_clockexpire() const; - void _internal_set_clockexpire(bool value); - public: - - // optional bool expire = 55; - bool has_expire() const; - private: - bool _internal_has_expire() const; - public: - void clear_expire(); - bool expire() const; - void set_expire(bool value); - private: - bool _internal_expire() const; - void _internal_set_expire(bool value); - public: - - // optional bool expirestop = 56; - bool has_expirestop() const; - private: - bool _internal_has_expirestop() const; - public: - void clear_expirestop(); - bool expirestop() const; - void set_expirestop(bool value); - private: - bool _internal_expirestop() const; - void _internal_set_expirestop(bool value); - public: - - // optional bool wrapkit = 57; - bool has_wrapkit() const; - private: - bool _internal_has_wrapkit() const; - public: - void clear_wrapkit(); - bool wrapkit() const; - void set_wrapkit(bool value); - private: - bool _internal_wrapkit() const; - void _internal_set_wrapkit(bool value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.AppearanceFlags) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<2> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::AppearanceFlagNPC > npcsaledata_; - ::Canary::protobuf::appearances::AppearanceFlagBank* bank_; - ::Canary::protobuf::appearances::AppearanceFlagWrite* write_; - ::Canary::protobuf::appearances::AppearanceFlagWriteOnce* write_once_; - ::Canary::protobuf::appearances::AppearanceFlagHook* hook_; - ::Canary::protobuf::appearances::AppearanceFlagLight* light_; - ::Canary::protobuf::appearances::AppearanceFlagShift* shift_; - ::Canary::protobuf::appearances::AppearanceFlagHeight* height_; - ::Canary::protobuf::appearances::AppearanceFlagAutomap* automap_; - ::Canary::protobuf::appearances::AppearanceFlagLenshelp* lenshelp_; - ::Canary::protobuf::appearances::AppearanceFlagClothes* clothes_; - ::Canary::protobuf::appearances::AppearanceFlagDefaultAction* default_action_; - ::Canary::protobuf::appearances::AppearanceFlagMarket* market_; - ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire* changedtoexpire_; - ::Canary::protobuf::appearances::AppearanceFlagCyclopedia* cyclopediaitem_; - ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification* upgradeclassification_; - bool clip_; - bool bottom_; - bool top_; - bool container_; - bool cumulative_; - bool usable_; - bool forceuse_; - bool multiuse_; - bool liquidpool_; - bool unpass_; - bool unmove_; - bool unsight_; - bool avoid_; - bool no_movement_animation_; - bool take_; - bool liquidcontainer_; - bool hang_; - bool rotate_; - bool dont_hide_; - bool translucent_; - bool lying_object_; - bool animate_always_; - bool fullbank_; - bool ignore_look_; - bool wrap_; - bool unwrap_; - bool topeffect_; - bool corpse_; - bool player_corpse_; - bool ammo_; - bool show_off_socket_; - bool reportable_; - bool reverse_addons_east_; - bool reverse_addons_west_; - bool reverse_addons_south_; - bool reverse_addons_north_; - bool wearout_; - bool clockexpire_; - bool expire_; - bool expirestop_; - bool wrapkit_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class AppearanceFlagUpgradeClassification final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.AppearanceFlagUpgradeClassification) */ { - public: - inline AppearanceFlagUpgradeClassification() : AppearanceFlagUpgradeClassification(nullptr) {} - ~AppearanceFlagUpgradeClassification() override; - explicit PROTOBUF_CONSTEXPR AppearanceFlagUpgradeClassification(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - AppearanceFlagUpgradeClassification(const AppearanceFlagUpgradeClassification& from); - AppearanceFlagUpgradeClassification(AppearanceFlagUpgradeClassification&& from) noexcept - : AppearanceFlagUpgradeClassification() { - *this = ::std::move(from); - } - - inline AppearanceFlagUpgradeClassification& operator=(const AppearanceFlagUpgradeClassification& from) { - CopyFrom(from); - return *this; - } - inline AppearanceFlagUpgradeClassification& operator=(AppearanceFlagUpgradeClassification&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const AppearanceFlagUpgradeClassification& default_instance() { - return *internal_default_instance(); - } - static inline const AppearanceFlagUpgradeClassification* internal_default_instance() { - return reinterpret_cast( - &_AppearanceFlagUpgradeClassification_default_instance_); - } - static constexpr int kIndexInFileMessages = - 9; - - friend void swap(AppearanceFlagUpgradeClassification& a, AppearanceFlagUpgradeClassification& b) { - a.Swap(&b); - } - inline void Swap(AppearanceFlagUpgradeClassification* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(AppearanceFlagUpgradeClassification* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - AppearanceFlagUpgradeClassification* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const AppearanceFlagUpgradeClassification& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const AppearanceFlagUpgradeClassification& from) { - AppearanceFlagUpgradeClassification::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(AppearanceFlagUpgradeClassification* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.AppearanceFlagUpgradeClassification"; - } - protected: - explicit AppearanceFlagUpgradeClassification(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kUpgradeClassificationFieldNumber = 1, - }; - // optional uint32 upgrade_classification = 1; - bool has_upgrade_classification() const; - private: - bool _internal_has_upgrade_classification() const; - public: - void clear_upgrade_classification(); - uint32_t upgrade_classification() const; - void set_upgrade_classification(uint32_t value); - private: - uint32_t _internal_upgrade_classification() const; - void _internal_set_upgrade_classification(uint32_t value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.AppearanceFlagUpgradeClassification) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - uint32_t upgrade_classification_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class AppearanceFlagBank final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.AppearanceFlagBank) */ { - public: - inline AppearanceFlagBank() : AppearanceFlagBank(nullptr) {} - ~AppearanceFlagBank() override; - explicit PROTOBUF_CONSTEXPR AppearanceFlagBank(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - AppearanceFlagBank(const AppearanceFlagBank& from); - AppearanceFlagBank(AppearanceFlagBank&& from) noexcept - : AppearanceFlagBank() { - *this = ::std::move(from); - } - - inline AppearanceFlagBank& operator=(const AppearanceFlagBank& from) { - CopyFrom(from); - return *this; - } - inline AppearanceFlagBank& operator=(AppearanceFlagBank&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const AppearanceFlagBank& default_instance() { - return *internal_default_instance(); - } - static inline const AppearanceFlagBank* internal_default_instance() { - return reinterpret_cast( - &_AppearanceFlagBank_default_instance_); - } - static constexpr int kIndexInFileMessages = - 10; - - friend void swap(AppearanceFlagBank& a, AppearanceFlagBank& b) { - a.Swap(&b); - } - inline void Swap(AppearanceFlagBank* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(AppearanceFlagBank* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - AppearanceFlagBank* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const AppearanceFlagBank& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const AppearanceFlagBank& from) { - AppearanceFlagBank::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(AppearanceFlagBank* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.AppearanceFlagBank"; - } - protected: - explicit AppearanceFlagBank(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kWaypointsFieldNumber = 1, - }; - // optional uint32 waypoints = 1; - bool has_waypoints() const; - private: - bool _internal_has_waypoints() const; - public: - void clear_waypoints(); - uint32_t waypoints() const; - void set_waypoints(uint32_t value); - private: - uint32_t _internal_waypoints() const; - void _internal_set_waypoints(uint32_t value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.AppearanceFlagBank) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - uint32_t waypoints_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class AppearanceFlagWrite final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.AppearanceFlagWrite) */ { - public: - inline AppearanceFlagWrite() : AppearanceFlagWrite(nullptr) {} - ~AppearanceFlagWrite() override; - explicit PROTOBUF_CONSTEXPR AppearanceFlagWrite(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - AppearanceFlagWrite(const AppearanceFlagWrite& from); - AppearanceFlagWrite(AppearanceFlagWrite&& from) noexcept - : AppearanceFlagWrite() { - *this = ::std::move(from); - } - - inline AppearanceFlagWrite& operator=(const AppearanceFlagWrite& from) { - CopyFrom(from); - return *this; - } - inline AppearanceFlagWrite& operator=(AppearanceFlagWrite&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const AppearanceFlagWrite& default_instance() { - return *internal_default_instance(); - } - static inline const AppearanceFlagWrite* internal_default_instance() { - return reinterpret_cast( - &_AppearanceFlagWrite_default_instance_); - } - static constexpr int kIndexInFileMessages = - 11; - - friend void swap(AppearanceFlagWrite& a, AppearanceFlagWrite& b) { - a.Swap(&b); - } - inline void Swap(AppearanceFlagWrite* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(AppearanceFlagWrite* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - AppearanceFlagWrite* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const AppearanceFlagWrite& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const AppearanceFlagWrite& from) { - AppearanceFlagWrite::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(AppearanceFlagWrite* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.AppearanceFlagWrite"; - } - protected: - explicit AppearanceFlagWrite(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kMaxTextLengthFieldNumber = 1, - }; - // optional uint32 max_text_length = 1; - bool has_max_text_length() const; - private: - bool _internal_has_max_text_length() const; - public: - void clear_max_text_length(); - uint32_t max_text_length() const; - void set_max_text_length(uint32_t value); - private: - uint32_t _internal_max_text_length() const; - void _internal_set_max_text_length(uint32_t value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.AppearanceFlagWrite) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - uint32_t max_text_length_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class AppearanceFlagWriteOnce final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.AppearanceFlagWriteOnce) */ { - public: - inline AppearanceFlagWriteOnce() : AppearanceFlagWriteOnce(nullptr) {} - ~AppearanceFlagWriteOnce() override; - explicit PROTOBUF_CONSTEXPR AppearanceFlagWriteOnce(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - AppearanceFlagWriteOnce(const AppearanceFlagWriteOnce& from); - AppearanceFlagWriteOnce(AppearanceFlagWriteOnce&& from) noexcept - : AppearanceFlagWriteOnce() { - *this = ::std::move(from); - } - - inline AppearanceFlagWriteOnce& operator=(const AppearanceFlagWriteOnce& from) { - CopyFrom(from); - return *this; - } - inline AppearanceFlagWriteOnce& operator=(AppearanceFlagWriteOnce&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const AppearanceFlagWriteOnce& default_instance() { - return *internal_default_instance(); - } - static inline const AppearanceFlagWriteOnce* internal_default_instance() { - return reinterpret_cast( - &_AppearanceFlagWriteOnce_default_instance_); - } - static constexpr int kIndexInFileMessages = - 12; - - friend void swap(AppearanceFlagWriteOnce& a, AppearanceFlagWriteOnce& b) { - a.Swap(&b); - } - inline void Swap(AppearanceFlagWriteOnce* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(AppearanceFlagWriteOnce* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - AppearanceFlagWriteOnce* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const AppearanceFlagWriteOnce& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const AppearanceFlagWriteOnce& from) { - AppearanceFlagWriteOnce::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(AppearanceFlagWriteOnce* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.AppearanceFlagWriteOnce"; - } - protected: - explicit AppearanceFlagWriteOnce(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kMaxTextLengthOnceFieldNumber = 1, - }; - // optional uint32 max_text_length_once = 1; - bool has_max_text_length_once() const; - private: - bool _internal_has_max_text_length_once() const; - public: - void clear_max_text_length_once(); - uint32_t max_text_length_once() const; - void set_max_text_length_once(uint32_t value); - private: - uint32_t _internal_max_text_length_once() const; - void _internal_set_max_text_length_once(uint32_t value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.AppearanceFlagWriteOnce) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - uint32_t max_text_length_once_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class AppearanceFlagLight final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.AppearanceFlagLight) */ { - public: - inline AppearanceFlagLight() : AppearanceFlagLight(nullptr) {} - ~AppearanceFlagLight() override; - explicit PROTOBUF_CONSTEXPR AppearanceFlagLight(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - AppearanceFlagLight(const AppearanceFlagLight& from); - AppearanceFlagLight(AppearanceFlagLight&& from) noexcept - : AppearanceFlagLight() { - *this = ::std::move(from); - } - - inline AppearanceFlagLight& operator=(const AppearanceFlagLight& from) { - CopyFrom(from); - return *this; - } - inline AppearanceFlagLight& operator=(AppearanceFlagLight&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const AppearanceFlagLight& default_instance() { - return *internal_default_instance(); - } - static inline const AppearanceFlagLight* internal_default_instance() { - return reinterpret_cast( - &_AppearanceFlagLight_default_instance_); - } - static constexpr int kIndexInFileMessages = - 13; - - friend void swap(AppearanceFlagLight& a, AppearanceFlagLight& b) { - a.Swap(&b); - } - inline void Swap(AppearanceFlagLight* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(AppearanceFlagLight* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - AppearanceFlagLight* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const AppearanceFlagLight& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const AppearanceFlagLight& from) { - AppearanceFlagLight::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(AppearanceFlagLight* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.AppearanceFlagLight"; - } - protected: - explicit AppearanceFlagLight(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kBrightnessFieldNumber = 1, - kColorFieldNumber = 2, - }; - // optional uint32 brightness = 1; - bool has_brightness() const; - private: - bool _internal_has_brightness() const; - public: - void clear_brightness(); - uint32_t brightness() const; - void set_brightness(uint32_t value); - private: - uint32_t _internal_brightness() const; - void _internal_set_brightness(uint32_t value); - public: - - // optional uint32 color = 2; - bool has_color() const; - private: - bool _internal_has_color() const; - public: - void clear_color(); - uint32_t color() const; - void set_color(uint32_t value); - private: - uint32_t _internal_color() const; - void _internal_set_color(uint32_t value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.AppearanceFlagLight) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - uint32_t brightness_; - uint32_t color_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class AppearanceFlagHeight final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.AppearanceFlagHeight) */ { - public: - inline AppearanceFlagHeight() : AppearanceFlagHeight(nullptr) {} - ~AppearanceFlagHeight() override; - explicit PROTOBUF_CONSTEXPR AppearanceFlagHeight(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - AppearanceFlagHeight(const AppearanceFlagHeight& from); - AppearanceFlagHeight(AppearanceFlagHeight&& from) noexcept - : AppearanceFlagHeight() { - *this = ::std::move(from); - } - - inline AppearanceFlagHeight& operator=(const AppearanceFlagHeight& from) { - CopyFrom(from); - return *this; - } - inline AppearanceFlagHeight& operator=(AppearanceFlagHeight&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const AppearanceFlagHeight& default_instance() { - return *internal_default_instance(); - } - static inline const AppearanceFlagHeight* internal_default_instance() { - return reinterpret_cast( - &_AppearanceFlagHeight_default_instance_); - } - static constexpr int kIndexInFileMessages = - 14; - - friend void swap(AppearanceFlagHeight& a, AppearanceFlagHeight& b) { - a.Swap(&b); - } - inline void Swap(AppearanceFlagHeight* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(AppearanceFlagHeight* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - AppearanceFlagHeight* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const AppearanceFlagHeight& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const AppearanceFlagHeight& from) { - AppearanceFlagHeight::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(AppearanceFlagHeight* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.AppearanceFlagHeight"; - } - protected: - explicit AppearanceFlagHeight(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kElevationFieldNumber = 1, - }; - // optional uint32 elevation = 1; - bool has_elevation() const; - private: - bool _internal_has_elevation() const; - public: - void clear_elevation(); - uint32_t elevation() const; - void set_elevation(uint32_t value); - private: - uint32_t _internal_elevation() const; - void _internal_set_elevation(uint32_t value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.AppearanceFlagHeight) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - uint32_t elevation_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class AppearanceFlagShift final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.AppearanceFlagShift) */ { - public: - inline AppearanceFlagShift() : AppearanceFlagShift(nullptr) {} - ~AppearanceFlagShift() override; - explicit PROTOBUF_CONSTEXPR AppearanceFlagShift(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - AppearanceFlagShift(const AppearanceFlagShift& from); - AppearanceFlagShift(AppearanceFlagShift&& from) noexcept - : AppearanceFlagShift() { - *this = ::std::move(from); - } - - inline AppearanceFlagShift& operator=(const AppearanceFlagShift& from) { - CopyFrom(from); - return *this; - } - inline AppearanceFlagShift& operator=(AppearanceFlagShift&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const AppearanceFlagShift& default_instance() { - return *internal_default_instance(); - } - static inline const AppearanceFlagShift* internal_default_instance() { - return reinterpret_cast( - &_AppearanceFlagShift_default_instance_); - } - static constexpr int kIndexInFileMessages = - 15; - - friend void swap(AppearanceFlagShift& a, AppearanceFlagShift& b) { - a.Swap(&b); - } - inline void Swap(AppearanceFlagShift* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(AppearanceFlagShift* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - AppearanceFlagShift* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const AppearanceFlagShift& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const AppearanceFlagShift& from) { - AppearanceFlagShift::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(AppearanceFlagShift* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.AppearanceFlagShift"; - } - protected: - explicit AppearanceFlagShift(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kXFieldNumber = 1, - kYFieldNumber = 2, - }; - // optional uint32 x = 1; - bool has_x() const; - private: - bool _internal_has_x() const; - public: - void clear_x(); - uint32_t x() const; - void set_x(uint32_t value); - private: - uint32_t _internal_x() const; - void _internal_set_x(uint32_t value); - public: - - // optional uint32 y = 2; - bool has_y() const; - private: - bool _internal_has_y() const; - public: - void clear_y(); - uint32_t y() const; - void set_y(uint32_t value); - private: - uint32_t _internal_y() const; - void _internal_set_y(uint32_t value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.AppearanceFlagShift) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - uint32_t x_; - uint32_t y_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class AppearanceFlagClothes final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.AppearanceFlagClothes) */ { - public: - inline AppearanceFlagClothes() : AppearanceFlagClothes(nullptr) {} - ~AppearanceFlagClothes() override; - explicit PROTOBUF_CONSTEXPR AppearanceFlagClothes(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - AppearanceFlagClothes(const AppearanceFlagClothes& from); - AppearanceFlagClothes(AppearanceFlagClothes&& from) noexcept - : AppearanceFlagClothes() { - *this = ::std::move(from); - } - - inline AppearanceFlagClothes& operator=(const AppearanceFlagClothes& from) { - CopyFrom(from); - return *this; - } - inline AppearanceFlagClothes& operator=(AppearanceFlagClothes&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const AppearanceFlagClothes& default_instance() { - return *internal_default_instance(); - } - static inline const AppearanceFlagClothes* internal_default_instance() { - return reinterpret_cast( - &_AppearanceFlagClothes_default_instance_); - } - static constexpr int kIndexInFileMessages = - 16; - - friend void swap(AppearanceFlagClothes& a, AppearanceFlagClothes& b) { - a.Swap(&b); - } - inline void Swap(AppearanceFlagClothes* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(AppearanceFlagClothes* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - AppearanceFlagClothes* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const AppearanceFlagClothes& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const AppearanceFlagClothes& from) { - AppearanceFlagClothes::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(AppearanceFlagClothes* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.AppearanceFlagClothes"; - } - protected: - explicit AppearanceFlagClothes(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kSlotFieldNumber = 1, - }; - // optional uint32 slot = 1; - bool has_slot() const; - private: - bool _internal_has_slot() const; - public: - void clear_slot(); - uint32_t slot() const; - void set_slot(uint32_t value); - private: - uint32_t _internal_slot() const; - void _internal_set_slot(uint32_t value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.AppearanceFlagClothes) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - uint32_t slot_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class AppearanceFlagDefaultAction final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.AppearanceFlagDefaultAction) */ { - public: - inline AppearanceFlagDefaultAction() : AppearanceFlagDefaultAction(nullptr) {} - ~AppearanceFlagDefaultAction() override; - explicit PROTOBUF_CONSTEXPR AppearanceFlagDefaultAction(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - AppearanceFlagDefaultAction(const AppearanceFlagDefaultAction& from); - AppearanceFlagDefaultAction(AppearanceFlagDefaultAction&& from) noexcept - : AppearanceFlagDefaultAction() { - *this = ::std::move(from); - } - - inline AppearanceFlagDefaultAction& operator=(const AppearanceFlagDefaultAction& from) { - CopyFrom(from); - return *this; - } - inline AppearanceFlagDefaultAction& operator=(AppearanceFlagDefaultAction&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const AppearanceFlagDefaultAction& default_instance() { - return *internal_default_instance(); - } - static inline const AppearanceFlagDefaultAction* internal_default_instance() { - return reinterpret_cast( - &_AppearanceFlagDefaultAction_default_instance_); - } - static constexpr int kIndexInFileMessages = - 17; - - friend void swap(AppearanceFlagDefaultAction& a, AppearanceFlagDefaultAction& b) { - a.Swap(&b); - } - inline void Swap(AppearanceFlagDefaultAction* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(AppearanceFlagDefaultAction* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - AppearanceFlagDefaultAction* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const AppearanceFlagDefaultAction& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const AppearanceFlagDefaultAction& from) { - AppearanceFlagDefaultAction::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(AppearanceFlagDefaultAction* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.AppearanceFlagDefaultAction"; - } - protected: - explicit AppearanceFlagDefaultAction(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kActionFieldNumber = 1, - }; - // optional .Canary.protobuf.appearances.PLAYER_ACTION action = 1; - bool has_action() const; - private: - bool _internal_has_action() const; - public: - void clear_action(); - ::Canary::protobuf::appearances::PLAYER_ACTION action() const; - void set_action(::Canary::protobuf::appearances::PLAYER_ACTION value); - private: - ::Canary::protobuf::appearances::PLAYER_ACTION _internal_action() const; - void _internal_set_action(::Canary::protobuf::appearances::PLAYER_ACTION value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.AppearanceFlagDefaultAction) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - int action_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class AppearanceFlagMarket final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.AppearanceFlagMarket) */ { - public: - inline AppearanceFlagMarket() : AppearanceFlagMarket(nullptr) {} - ~AppearanceFlagMarket() override; - explicit PROTOBUF_CONSTEXPR AppearanceFlagMarket(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - AppearanceFlagMarket(const AppearanceFlagMarket& from); - AppearanceFlagMarket(AppearanceFlagMarket&& from) noexcept - : AppearanceFlagMarket() { - *this = ::std::move(from); - } - - inline AppearanceFlagMarket& operator=(const AppearanceFlagMarket& from) { - CopyFrom(from); - return *this; - } - inline AppearanceFlagMarket& operator=(AppearanceFlagMarket&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const AppearanceFlagMarket& default_instance() { - return *internal_default_instance(); - } - static inline const AppearanceFlagMarket* internal_default_instance() { - return reinterpret_cast( - &_AppearanceFlagMarket_default_instance_); - } - static constexpr int kIndexInFileMessages = - 18; - - friend void swap(AppearanceFlagMarket& a, AppearanceFlagMarket& b) { - a.Swap(&b); - } - inline void Swap(AppearanceFlagMarket* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(AppearanceFlagMarket* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - AppearanceFlagMarket* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const AppearanceFlagMarket& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const AppearanceFlagMarket& from) { - AppearanceFlagMarket::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(AppearanceFlagMarket* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.AppearanceFlagMarket"; - } - protected: - explicit AppearanceFlagMarket(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kRestrictToProfessionFieldNumber = 5, - kTradeAsObjectIdFieldNumber = 2, - kShowAsObjectIdFieldNumber = 3, - kMinimumLevelFieldNumber = 6, - kCategoryFieldNumber = 1, - }; - // repeated .Canary.protobuf.appearances.PLAYER_PROFESSION restrict_to_profession = 5; - int restrict_to_profession_size() const; - private: - int _internal_restrict_to_profession_size() const; - public: - void clear_restrict_to_profession(); - private: - ::Canary::protobuf::appearances::PLAYER_PROFESSION _internal_restrict_to_profession(int index) const; - void _internal_add_restrict_to_profession(::Canary::protobuf::appearances::PLAYER_PROFESSION value); - ::PROTOBUF_NAMESPACE_ID::RepeatedField* _internal_mutable_restrict_to_profession(); - public: - ::Canary::protobuf::appearances::PLAYER_PROFESSION restrict_to_profession(int index) const; - void set_restrict_to_profession(int index, ::Canary::protobuf::appearances::PLAYER_PROFESSION value); - void add_restrict_to_profession(::Canary::protobuf::appearances::PLAYER_PROFESSION value); - const ::PROTOBUF_NAMESPACE_ID::RepeatedField& restrict_to_profession() const; - ::PROTOBUF_NAMESPACE_ID::RepeatedField* mutable_restrict_to_profession(); - - // optional uint32 trade_as_object_id = 2; - bool has_trade_as_object_id() const; - private: - bool _internal_has_trade_as_object_id() const; - public: - void clear_trade_as_object_id(); - uint32_t trade_as_object_id() const; - void set_trade_as_object_id(uint32_t value); - private: - uint32_t _internal_trade_as_object_id() const; - void _internal_set_trade_as_object_id(uint32_t value); - public: - - // optional uint32 show_as_object_id = 3; - bool has_show_as_object_id() const; - private: - bool _internal_has_show_as_object_id() const; - public: - void clear_show_as_object_id(); - uint32_t show_as_object_id() const; - void set_show_as_object_id(uint32_t value); - private: - uint32_t _internal_show_as_object_id() const; - void _internal_set_show_as_object_id(uint32_t value); - public: - - // optional uint32 minimum_level = 6; - bool has_minimum_level() const; - private: - bool _internal_has_minimum_level() const; - public: - void clear_minimum_level(); - uint32_t minimum_level() const; - void set_minimum_level(uint32_t value); - private: - uint32_t _internal_minimum_level() const; - void _internal_set_minimum_level(uint32_t value); - public: - - // optional .Canary.protobuf.appearances.ITEM_CATEGORY category = 1; - bool has_category() const; - private: - bool _internal_has_category() const; - public: - void clear_category(); - ::Canary::protobuf::appearances::ITEM_CATEGORY category() const; - void set_category(::Canary::protobuf::appearances::ITEM_CATEGORY value); - private: - ::Canary::protobuf::appearances::ITEM_CATEGORY _internal_category() const; - void _internal_set_category(::Canary::protobuf::appearances::ITEM_CATEGORY value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.AppearanceFlagMarket) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - ::PROTOBUF_NAMESPACE_ID::RepeatedField restrict_to_profession_; - uint32_t trade_as_object_id_; - uint32_t show_as_object_id_; - uint32_t minimum_level_; - int category_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class AppearanceFlagNPC final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.AppearanceFlagNPC) */ { - public: - inline AppearanceFlagNPC() : AppearanceFlagNPC(nullptr) {} - ~AppearanceFlagNPC() override; - explicit PROTOBUF_CONSTEXPR AppearanceFlagNPC(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - AppearanceFlagNPC(const AppearanceFlagNPC& from); - AppearanceFlagNPC(AppearanceFlagNPC&& from) noexcept - : AppearanceFlagNPC() { - *this = ::std::move(from); - } - - inline AppearanceFlagNPC& operator=(const AppearanceFlagNPC& from) { - CopyFrom(from); - return *this; - } - inline AppearanceFlagNPC& operator=(AppearanceFlagNPC&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const AppearanceFlagNPC& default_instance() { - return *internal_default_instance(); - } - static inline const AppearanceFlagNPC* internal_default_instance() { - return reinterpret_cast( - &_AppearanceFlagNPC_default_instance_); - } - static constexpr int kIndexInFileMessages = - 19; - - friend void swap(AppearanceFlagNPC& a, AppearanceFlagNPC& b) { - a.Swap(&b); - } - inline void Swap(AppearanceFlagNPC* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(AppearanceFlagNPC* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - AppearanceFlagNPC* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const AppearanceFlagNPC& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const AppearanceFlagNPC& from) { - AppearanceFlagNPC::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(AppearanceFlagNPC* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.AppearanceFlagNPC"; - } - protected: - explicit AppearanceFlagNPC(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kNameFieldNumber = 1, - kLocationFieldNumber = 2, - kCurrencyQuestFlagDisplayNameFieldNumber = 6, - kSalePriceFieldNumber = 3, - kBuyPriceFieldNumber = 4, - kCurrencyObjectTypeIdFieldNumber = 5, - }; - // optional bytes name = 1; - bool has_name() const; - private: - bool _internal_has_name() const; - public: - void clear_name(); - const std::string& name() const; - template - void set_name(ArgT0&& arg0, ArgT... args); - std::string* mutable_name(); - PROTOBUF_NODISCARD std::string* release_name(); - void set_allocated_name(std::string* name); - private: - const std::string& _internal_name() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_name(const std::string& value); - std::string* _internal_mutable_name(); - public: - - // optional bytes location = 2; - bool has_location() const; - private: - bool _internal_has_location() const; - public: - void clear_location(); - const std::string& location() const; - template - void set_location(ArgT0&& arg0, ArgT... args); - std::string* mutable_location(); - PROTOBUF_NODISCARD std::string* release_location(); - void set_allocated_location(std::string* location); - private: - const std::string& _internal_location() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_location(const std::string& value); - std::string* _internal_mutable_location(); - public: - - // optional bytes currency_quest_flag_display_name = 6; - bool has_currency_quest_flag_display_name() const; - private: - bool _internal_has_currency_quest_flag_display_name() const; - public: - void clear_currency_quest_flag_display_name(); - const std::string& currency_quest_flag_display_name() const; - template - void set_currency_quest_flag_display_name(ArgT0&& arg0, ArgT... args); - std::string* mutable_currency_quest_flag_display_name(); - PROTOBUF_NODISCARD std::string* release_currency_quest_flag_display_name(); - void set_allocated_currency_quest_flag_display_name(std::string* currency_quest_flag_display_name); - private: - const std::string& _internal_currency_quest_flag_display_name() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_currency_quest_flag_display_name(const std::string& value); - std::string* _internal_mutable_currency_quest_flag_display_name(); - public: - - // optional uint32 sale_price = 3; - bool has_sale_price() const; - private: - bool _internal_has_sale_price() const; - public: - void clear_sale_price(); - uint32_t sale_price() const; - void set_sale_price(uint32_t value); - private: - uint32_t _internal_sale_price() const; - void _internal_set_sale_price(uint32_t value); - public: - - // optional uint32 buy_price = 4; - bool has_buy_price() const; - private: - bool _internal_has_buy_price() const; - public: - void clear_buy_price(); - uint32_t buy_price() const; - void set_buy_price(uint32_t value); - private: - uint32_t _internal_buy_price() const; - void _internal_set_buy_price(uint32_t value); - public: - - // optional uint32 currency_object_type_id = 5; - bool has_currency_object_type_id() const; - private: - bool _internal_has_currency_object_type_id() const; - public: - void clear_currency_object_type_id(); - uint32_t currency_object_type_id() const; - void set_currency_object_type_id(uint32_t value); - private: - uint32_t _internal_currency_object_type_id() const; - void _internal_set_currency_object_type_id(uint32_t value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.AppearanceFlagNPC) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr name_; - ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr location_; - ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr currency_quest_flag_display_name_; - uint32_t sale_price_; - uint32_t buy_price_; - uint32_t currency_object_type_id_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class AppearanceFlagAutomap final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.AppearanceFlagAutomap) */ { - public: - inline AppearanceFlagAutomap() : AppearanceFlagAutomap(nullptr) {} - ~AppearanceFlagAutomap() override; - explicit PROTOBUF_CONSTEXPR AppearanceFlagAutomap(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - AppearanceFlagAutomap(const AppearanceFlagAutomap& from); - AppearanceFlagAutomap(AppearanceFlagAutomap&& from) noexcept - : AppearanceFlagAutomap() { - *this = ::std::move(from); - } - - inline AppearanceFlagAutomap& operator=(const AppearanceFlagAutomap& from) { - CopyFrom(from); - return *this; - } - inline AppearanceFlagAutomap& operator=(AppearanceFlagAutomap&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const AppearanceFlagAutomap& default_instance() { - return *internal_default_instance(); - } - static inline const AppearanceFlagAutomap* internal_default_instance() { - return reinterpret_cast( - &_AppearanceFlagAutomap_default_instance_); - } - static constexpr int kIndexInFileMessages = - 20; - - friend void swap(AppearanceFlagAutomap& a, AppearanceFlagAutomap& b) { - a.Swap(&b); - } - inline void Swap(AppearanceFlagAutomap* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(AppearanceFlagAutomap* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - AppearanceFlagAutomap* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const AppearanceFlagAutomap& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const AppearanceFlagAutomap& from) { - AppearanceFlagAutomap::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(AppearanceFlagAutomap* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.AppearanceFlagAutomap"; - } - protected: - explicit AppearanceFlagAutomap(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kColorFieldNumber = 1, - }; - // optional uint32 color = 1; - bool has_color() const; - private: - bool _internal_has_color() const; - public: - void clear_color(); - uint32_t color() const; - void set_color(uint32_t value); - private: - uint32_t _internal_color() const; - void _internal_set_color(uint32_t value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.AppearanceFlagAutomap) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - uint32_t color_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class AppearanceFlagHook final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.AppearanceFlagHook) */ { - public: - inline AppearanceFlagHook() : AppearanceFlagHook(nullptr) {} - ~AppearanceFlagHook() override; - explicit PROTOBUF_CONSTEXPR AppearanceFlagHook(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - AppearanceFlagHook(const AppearanceFlagHook& from); - AppearanceFlagHook(AppearanceFlagHook&& from) noexcept - : AppearanceFlagHook() { - *this = ::std::move(from); - } - - inline AppearanceFlagHook& operator=(const AppearanceFlagHook& from) { - CopyFrom(from); - return *this; - } - inline AppearanceFlagHook& operator=(AppearanceFlagHook&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const AppearanceFlagHook& default_instance() { - return *internal_default_instance(); - } - static inline const AppearanceFlagHook* internal_default_instance() { - return reinterpret_cast( - &_AppearanceFlagHook_default_instance_); - } - static constexpr int kIndexInFileMessages = - 21; - - friend void swap(AppearanceFlagHook& a, AppearanceFlagHook& b) { - a.Swap(&b); - } - inline void Swap(AppearanceFlagHook* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(AppearanceFlagHook* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - AppearanceFlagHook* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const AppearanceFlagHook& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const AppearanceFlagHook& from) { - AppearanceFlagHook::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(AppearanceFlagHook* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.AppearanceFlagHook"; - } - protected: - explicit AppearanceFlagHook(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kDirectionFieldNumber = 1, - }; - // optional .Canary.protobuf.appearances.HOOK_TYPE direction = 1; - bool has_direction() const; - private: - bool _internal_has_direction() const; - public: - void clear_direction(); - ::Canary::protobuf::appearances::HOOK_TYPE direction() const; - void set_direction(::Canary::protobuf::appearances::HOOK_TYPE value); - private: - ::Canary::protobuf::appearances::HOOK_TYPE _internal_direction() const; - void _internal_set_direction(::Canary::protobuf::appearances::HOOK_TYPE value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.AppearanceFlagHook) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - int direction_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class AppearanceFlagLenshelp final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.AppearanceFlagLenshelp) */ { - public: - inline AppearanceFlagLenshelp() : AppearanceFlagLenshelp(nullptr) {} - ~AppearanceFlagLenshelp() override; - explicit PROTOBUF_CONSTEXPR AppearanceFlagLenshelp(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - AppearanceFlagLenshelp(const AppearanceFlagLenshelp& from); - AppearanceFlagLenshelp(AppearanceFlagLenshelp&& from) noexcept - : AppearanceFlagLenshelp() { - *this = ::std::move(from); - } - - inline AppearanceFlagLenshelp& operator=(const AppearanceFlagLenshelp& from) { - CopyFrom(from); - return *this; - } - inline AppearanceFlagLenshelp& operator=(AppearanceFlagLenshelp&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const AppearanceFlagLenshelp& default_instance() { - return *internal_default_instance(); - } - static inline const AppearanceFlagLenshelp* internal_default_instance() { - return reinterpret_cast( - &_AppearanceFlagLenshelp_default_instance_); - } - static constexpr int kIndexInFileMessages = - 22; - - friend void swap(AppearanceFlagLenshelp& a, AppearanceFlagLenshelp& b) { - a.Swap(&b); - } - inline void Swap(AppearanceFlagLenshelp* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(AppearanceFlagLenshelp* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - AppearanceFlagLenshelp* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const AppearanceFlagLenshelp& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const AppearanceFlagLenshelp& from) { - AppearanceFlagLenshelp::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(AppearanceFlagLenshelp* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.AppearanceFlagLenshelp"; - } - protected: - explicit AppearanceFlagLenshelp(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kIdFieldNumber = 1, - }; - // optional uint32 id = 1; - bool has_id() const; - private: - bool _internal_has_id() const; - public: - void clear_id(); - uint32_t id() const; - void set_id(uint32_t value); - private: - uint32_t _internal_id() const; - void _internal_set_id(uint32_t value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.AppearanceFlagLenshelp) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - uint32_t id_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class AppearanceFlagChangedToExpire final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.AppearanceFlagChangedToExpire) */ { - public: - inline AppearanceFlagChangedToExpire() : AppearanceFlagChangedToExpire(nullptr) {} - ~AppearanceFlagChangedToExpire() override; - explicit PROTOBUF_CONSTEXPR AppearanceFlagChangedToExpire(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - AppearanceFlagChangedToExpire(const AppearanceFlagChangedToExpire& from); - AppearanceFlagChangedToExpire(AppearanceFlagChangedToExpire&& from) noexcept - : AppearanceFlagChangedToExpire() { - *this = ::std::move(from); - } - - inline AppearanceFlagChangedToExpire& operator=(const AppearanceFlagChangedToExpire& from) { - CopyFrom(from); - return *this; - } - inline AppearanceFlagChangedToExpire& operator=(AppearanceFlagChangedToExpire&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const AppearanceFlagChangedToExpire& default_instance() { - return *internal_default_instance(); - } - static inline const AppearanceFlagChangedToExpire* internal_default_instance() { - return reinterpret_cast( - &_AppearanceFlagChangedToExpire_default_instance_); - } - static constexpr int kIndexInFileMessages = - 23; - - friend void swap(AppearanceFlagChangedToExpire& a, AppearanceFlagChangedToExpire& b) { - a.Swap(&b); - } - inline void Swap(AppearanceFlagChangedToExpire* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(AppearanceFlagChangedToExpire* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - AppearanceFlagChangedToExpire* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const AppearanceFlagChangedToExpire& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const AppearanceFlagChangedToExpire& from) { - AppearanceFlagChangedToExpire::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(AppearanceFlagChangedToExpire* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.AppearanceFlagChangedToExpire"; - } - protected: - explicit AppearanceFlagChangedToExpire(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kFormerObjectTypeidFieldNumber = 1, - }; - // optional uint32 former_object_typeid = 1; - bool has_former_object_typeid() const; - private: - bool _internal_has_former_object_typeid() const; - public: - void clear_former_object_typeid(); - uint32_t former_object_typeid() const; - void set_former_object_typeid(uint32_t value); - private: - uint32_t _internal_former_object_typeid() const; - void _internal_set_former_object_typeid(uint32_t value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.AppearanceFlagChangedToExpire) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - uint32_t former_object_typeid_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class AppearanceFlagCyclopedia final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.AppearanceFlagCyclopedia) */ { - public: - inline AppearanceFlagCyclopedia() : AppearanceFlagCyclopedia(nullptr) {} - ~AppearanceFlagCyclopedia() override; - explicit PROTOBUF_CONSTEXPR AppearanceFlagCyclopedia(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - AppearanceFlagCyclopedia(const AppearanceFlagCyclopedia& from); - AppearanceFlagCyclopedia(AppearanceFlagCyclopedia&& from) noexcept - : AppearanceFlagCyclopedia() { - *this = ::std::move(from); - } - - inline AppearanceFlagCyclopedia& operator=(const AppearanceFlagCyclopedia& from) { - CopyFrom(from); - return *this; - } - inline AppearanceFlagCyclopedia& operator=(AppearanceFlagCyclopedia&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const AppearanceFlagCyclopedia& default_instance() { - return *internal_default_instance(); - } - static inline const AppearanceFlagCyclopedia* internal_default_instance() { - return reinterpret_cast( - &_AppearanceFlagCyclopedia_default_instance_); - } - static constexpr int kIndexInFileMessages = - 24; - - friend void swap(AppearanceFlagCyclopedia& a, AppearanceFlagCyclopedia& b) { - a.Swap(&b); - } - inline void Swap(AppearanceFlagCyclopedia* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(AppearanceFlagCyclopedia* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - AppearanceFlagCyclopedia* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const AppearanceFlagCyclopedia& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const AppearanceFlagCyclopedia& from) { - AppearanceFlagCyclopedia::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(AppearanceFlagCyclopedia* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.AppearanceFlagCyclopedia"; - } - protected: - explicit AppearanceFlagCyclopedia(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kCyclopediaTypeFieldNumber = 1, - }; - // optional uint32 cyclopedia_type = 1; - bool has_cyclopedia_type() const; - private: - bool _internal_has_cyclopedia_type() const; - public: - void clear_cyclopedia_type(); - uint32_t cyclopedia_type() const; - void set_cyclopedia_type(uint32_t value); - private: - uint32_t _internal_cyclopedia_type() const; - void _internal_set_cyclopedia_type(uint32_t value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.AppearanceFlagCyclopedia) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - uint32_t cyclopedia_type_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// ------------------------------------------------------------------- - -class SpecialMeaningAppearanceIds final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.appearances.SpecialMeaningAppearanceIds) */ { - public: - inline SpecialMeaningAppearanceIds() : SpecialMeaningAppearanceIds(nullptr) {} - ~SpecialMeaningAppearanceIds() override; - explicit PROTOBUF_CONSTEXPR SpecialMeaningAppearanceIds(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - SpecialMeaningAppearanceIds(const SpecialMeaningAppearanceIds& from); - SpecialMeaningAppearanceIds(SpecialMeaningAppearanceIds&& from) noexcept - : SpecialMeaningAppearanceIds() { - *this = ::std::move(from); - } - - inline SpecialMeaningAppearanceIds& operator=(const SpecialMeaningAppearanceIds& from) { - CopyFrom(from); - return *this; - } - inline SpecialMeaningAppearanceIds& operator=(SpecialMeaningAppearanceIds&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - inline const ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet& unknown_fields() const { - return _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance); - } - inline ::PROTOBUF_NAMESPACE_ID::UnknownFieldSet* mutable_unknown_fields() { - return _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const SpecialMeaningAppearanceIds& default_instance() { - return *internal_default_instance(); - } - static inline const SpecialMeaningAppearanceIds* internal_default_instance() { - return reinterpret_cast( - &_SpecialMeaningAppearanceIds_default_instance_); - } - static constexpr int kIndexInFileMessages = - 25; - - friend void swap(SpecialMeaningAppearanceIds& a, SpecialMeaningAppearanceIds& b) { - a.Swap(&b); - } - inline void Swap(SpecialMeaningAppearanceIds* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(SpecialMeaningAppearanceIds* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - SpecialMeaningAppearanceIds* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const SpecialMeaningAppearanceIds& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const SpecialMeaningAppearanceIds& from) { - SpecialMeaningAppearanceIds::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(SpecialMeaningAppearanceIds* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.appearances.SpecialMeaningAppearanceIds"; - } - protected: - explicit SpecialMeaningAppearanceIds(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kGoldCoinIdFieldNumber = 1, - kPlatinumCoinIdFieldNumber = 2, - kCrystalCoinIdFieldNumber = 3, - kTibiaCoinIdFieldNumber = 4, - kStampedLetterIdFieldNumber = 5, - kSupplyStashIdFieldNumber = 6, - kRewardChestIdFieldNumber = 7, - }; - // optional uint32 gold_coin_id = 1; - bool has_gold_coin_id() const; - private: - bool _internal_has_gold_coin_id() const; - public: - void clear_gold_coin_id(); - uint32_t gold_coin_id() const; - void set_gold_coin_id(uint32_t value); - private: - uint32_t _internal_gold_coin_id() const; - void _internal_set_gold_coin_id(uint32_t value); - public: - - // optional uint32 platinum_coin_id = 2; - bool has_platinum_coin_id() const; - private: - bool _internal_has_platinum_coin_id() const; - public: - void clear_platinum_coin_id(); - uint32_t platinum_coin_id() const; - void set_platinum_coin_id(uint32_t value); - private: - uint32_t _internal_platinum_coin_id() const; - void _internal_set_platinum_coin_id(uint32_t value); - public: - - // optional uint32 crystal_coin_id = 3; - bool has_crystal_coin_id() const; - private: - bool _internal_has_crystal_coin_id() const; - public: - void clear_crystal_coin_id(); - uint32_t crystal_coin_id() const; - void set_crystal_coin_id(uint32_t value); - private: - uint32_t _internal_crystal_coin_id() const; - void _internal_set_crystal_coin_id(uint32_t value); - public: - - // optional uint32 tibia_coin_id = 4; - bool has_tibia_coin_id() const; - private: - bool _internal_has_tibia_coin_id() const; - public: - void clear_tibia_coin_id(); - uint32_t tibia_coin_id() const; - void set_tibia_coin_id(uint32_t value); - private: - uint32_t _internal_tibia_coin_id() const; - void _internal_set_tibia_coin_id(uint32_t value); - public: - - // optional uint32 stamped_letter_id = 5; - bool has_stamped_letter_id() const; - private: - bool _internal_has_stamped_letter_id() const; - public: - void clear_stamped_letter_id(); - uint32_t stamped_letter_id() const; - void set_stamped_letter_id(uint32_t value); - private: - uint32_t _internal_stamped_letter_id() const; - void _internal_set_stamped_letter_id(uint32_t value); - public: - - // optional uint32 supply_stash_id = 6; - bool has_supply_stash_id() const; - private: - bool _internal_has_supply_stash_id() const; - public: - void clear_supply_stash_id(); - uint32_t supply_stash_id() const; - void set_supply_stash_id(uint32_t value); - private: - uint32_t _internal_supply_stash_id() const; - void _internal_set_supply_stash_id(uint32_t value); - public: - - // optional uint32 reward_chest_id = 7; - bool has_reward_chest_id() const; - private: - bool _internal_has_reward_chest_id() const; - public: - void clear_reward_chest_id(); - uint32_t reward_chest_id() const; - void set_reward_chest_id(uint32_t value); - private: - uint32_t _internal_reward_chest_id() const; - void _internal_set_reward_chest_id(uint32_t value); - public: - - // @@protoc_insertion_point(class_scope:Canary.protobuf.appearances.SpecialMeaningAppearanceIds) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::HasBits<1> _has_bits_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - uint32_t gold_coin_id_; - uint32_t platinum_coin_id_; - uint32_t crystal_coin_id_; - uint32_t tibia_coin_id_; - uint32_t stamped_letter_id_; - uint32_t supply_stash_id_; - uint32_t reward_chest_id_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_appearances_2eproto; -}; -// =================================================================== - - -// =================================================================== - -#ifdef __GNUC__ - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wstrict-aliasing" -#endif // __GNUC__ -// Coordinate - -// optional uint32 x = 1; -inline bool Coordinate::_internal_has_x() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool Coordinate::has_x() const { - return _internal_has_x(); -} -inline void Coordinate::clear_x() { - _impl_.x_ = 0u; - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline uint32_t Coordinate::_internal_x() const { - return _impl_.x_; -} -inline uint32_t Coordinate::x() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.Coordinate.x) - return _internal_x(); -} -inline void Coordinate::_internal_set_x(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.x_ = value; -} -inline void Coordinate::set_x(uint32_t value) { - _internal_set_x(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.Coordinate.x) -} - -// optional uint32 y = 2; -inline bool Coordinate::_internal_has_y() const { - bool value = (_impl_._has_bits_[0] & 0x00000002u) != 0; - return value; -} -inline bool Coordinate::has_y() const { - return _internal_has_y(); -} -inline void Coordinate::clear_y() { - _impl_.y_ = 0u; - _impl_._has_bits_[0] &= ~0x00000002u; -} -inline uint32_t Coordinate::_internal_y() const { - return _impl_.y_; -} -inline uint32_t Coordinate::y() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.Coordinate.y) - return _internal_y(); -} -inline void Coordinate::_internal_set_y(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000002u; - _impl_.y_ = value; -} -inline void Coordinate::set_y(uint32_t value) { - _internal_set_y(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.Coordinate.y) -} - -// optional uint32 z = 3; -inline bool Coordinate::_internal_has_z() const { - bool value = (_impl_._has_bits_[0] & 0x00000004u) != 0; - return value; -} -inline bool Coordinate::has_z() const { - return _internal_has_z(); -} -inline void Coordinate::clear_z() { - _impl_.z_ = 0u; - _impl_._has_bits_[0] &= ~0x00000004u; -} -inline uint32_t Coordinate::_internal_z() const { - return _impl_.z_; -} -inline uint32_t Coordinate::z() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.Coordinate.z) - return _internal_z(); -} -inline void Coordinate::_internal_set_z(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000004u; - _impl_.z_ = value; -} -inline void Coordinate::set_z(uint32_t value) { - _internal_set_z(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.Coordinate.z) -} - -// ------------------------------------------------------------------- - -// Appearances - -// repeated .Canary.protobuf.appearances.Appearance object = 1; -inline int Appearances::_internal_object_size() const { - return _impl_.object_.size(); -} -inline int Appearances::object_size() const { - return _internal_object_size(); -} -inline void Appearances::clear_object() { - _impl_.object_.Clear(); -} -inline ::Canary::protobuf::appearances::Appearance* Appearances::mutable_object(int index) { - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.Appearances.object) - return _impl_.object_.Mutable(index); -} -inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Appearance >* -Appearances::mutable_object() { - // @@protoc_insertion_point(field_mutable_list:Canary.protobuf.appearances.Appearances.object) - return &_impl_.object_; -} -inline const ::Canary::protobuf::appearances::Appearance& Appearances::_internal_object(int index) const { - return _impl_.object_.Get(index); -} -inline const ::Canary::protobuf::appearances::Appearance& Appearances::object(int index) const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.Appearances.object) - return _internal_object(index); -} -inline ::Canary::protobuf::appearances::Appearance* Appearances::_internal_add_object() { - return _impl_.object_.Add(); -} -inline ::Canary::protobuf::appearances::Appearance* Appearances::add_object() { - ::Canary::protobuf::appearances::Appearance* _add = _internal_add_object(); - // @@protoc_insertion_point(field_add:Canary.protobuf.appearances.Appearances.object) - return _add; -} -inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Appearance >& -Appearances::object() const { - // @@protoc_insertion_point(field_list:Canary.protobuf.appearances.Appearances.object) - return _impl_.object_; -} - -// repeated .Canary.protobuf.appearances.Appearance outfit = 2; -inline int Appearances::_internal_outfit_size() const { - return _impl_.outfit_.size(); -} -inline int Appearances::outfit_size() const { - return _internal_outfit_size(); -} -inline void Appearances::clear_outfit() { - _impl_.outfit_.Clear(); -} -inline ::Canary::protobuf::appearances::Appearance* Appearances::mutable_outfit(int index) { - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.Appearances.outfit) - return _impl_.outfit_.Mutable(index); -} -inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Appearance >* -Appearances::mutable_outfit() { - // @@protoc_insertion_point(field_mutable_list:Canary.protobuf.appearances.Appearances.outfit) - return &_impl_.outfit_; -} -inline const ::Canary::protobuf::appearances::Appearance& Appearances::_internal_outfit(int index) const { - return _impl_.outfit_.Get(index); -} -inline const ::Canary::protobuf::appearances::Appearance& Appearances::outfit(int index) const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.Appearances.outfit) - return _internal_outfit(index); -} -inline ::Canary::protobuf::appearances::Appearance* Appearances::_internal_add_outfit() { - return _impl_.outfit_.Add(); -} -inline ::Canary::protobuf::appearances::Appearance* Appearances::add_outfit() { - ::Canary::protobuf::appearances::Appearance* _add = _internal_add_outfit(); - // @@protoc_insertion_point(field_add:Canary.protobuf.appearances.Appearances.outfit) - return _add; -} -inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Appearance >& -Appearances::outfit() const { - // @@protoc_insertion_point(field_list:Canary.protobuf.appearances.Appearances.outfit) - return _impl_.outfit_; -} - -// repeated .Canary.protobuf.appearances.Appearance effect = 3; -inline int Appearances::_internal_effect_size() const { - return _impl_.effect_.size(); -} -inline int Appearances::effect_size() const { - return _internal_effect_size(); -} -inline void Appearances::clear_effect() { - _impl_.effect_.Clear(); -} -inline ::Canary::protobuf::appearances::Appearance* Appearances::mutable_effect(int index) { - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.Appearances.effect) - return _impl_.effect_.Mutable(index); -} -inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Appearance >* -Appearances::mutable_effect() { - // @@protoc_insertion_point(field_mutable_list:Canary.protobuf.appearances.Appearances.effect) - return &_impl_.effect_; -} -inline const ::Canary::protobuf::appearances::Appearance& Appearances::_internal_effect(int index) const { - return _impl_.effect_.Get(index); -} -inline const ::Canary::protobuf::appearances::Appearance& Appearances::effect(int index) const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.Appearances.effect) - return _internal_effect(index); -} -inline ::Canary::protobuf::appearances::Appearance* Appearances::_internal_add_effect() { - return _impl_.effect_.Add(); -} -inline ::Canary::protobuf::appearances::Appearance* Appearances::add_effect() { - ::Canary::protobuf::appearances::Appearance* _add = _internal_add_effect(); - // @@protoc_insertion_point(field_add:Canary.protobuf.appearances.Appearances.effect) - return _add; -} -inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Appearance >& -Appearances::effect() const { - // @@protoc_insertion_point(field_list:Canary.protobuf.appearances.Appearances.effect) - return _impl_.effect_; -} - -// repeated .Canary.protobuf.appearances.Appearance missile = 4; -inline int Appearances::_internal_missile_size() const { - return _impl_.missile_.size(); -} -inline int Appearances::missile_size() const { - return _internal_missile_size(); -} -inline void Appearances::clear_missile() { - _impl_.missile_.Clear(); -} -inline ::Canary::protobuf::appearances::Appearance* Appearances::mutable_missile(int index) { - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.Appearances.missile) - return _impl_.missile_.Mutable(index); -} -inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Appearance >* -Appearances::mutable_missile() { - // @@protoc_insertion_point(field_mutable_list:Canary.protobuf.appearances.Appearances.missile) - return &_impl_.missile_; -} -inline const ::Canary::protobuf::appearances::Appearance& Appearances::_internal_missile(int index) const { - return _impl_.missile_.Get(index); -} -inline const ::Canary::protobuf::appearances::Appearance& Appearances::missile(int index) const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.Appearances.missile) - return _internal_missile(index); -} -inline ::Canary::protobuf::appearances::Appearance* Appearances::_internal_add_missile() { - return _impl_.missile_.Add(); -} -inline ::Canary::protobuf::appearances::Appearance* Appearances::add_missile() { - ::Canary::protobuf::appearances::Appearance* _add = _internal_add_missile(); - // @@protoc_insertion_point(field_add:Canary.protobuf.appearances.Appearances.missile) - return _add; -} -inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Appearance >& -Appearances::missile() const { - // @@protoc_insertion_point(field_list:Canary.protobuf.appearances.Appearances.missile) - return _impl_.missile_; -} - -// optional .Canary.protobuf.appearances.SpecialMeaningAppearanceIds special_meaning_appearance_ids = 5; -inline bool Appearances::_internal_has_special_meaning_appearance_ids() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - PROTOBUF_ASSUME(!value || _impl_.special_meaning_appearance_ids_ != nullptr); - return value; -} -inline bool Appearances::has_special_meaning_appearance_ids() const { - return _internal_has_special_meaning_appearance_ids(); -} -inline void Appearances::clear_special_meaning_appearance_ids() { - if (_impl_.special_meaning_appearance_ids_ != nullptr) _impl_.special_meaning_appearance_ids_->Clear(); - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline const ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds& Appearances::_internal_special_meaning_appearance_ids() const { - const ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds* p = _impl_.special_meaning_appearance_ids_; - return p != nullptr ? *p : reinterpret_cast( - ::Canary::protobuf::appearances::_SpecialMeaningAppearanceIds_default_instance_); -} -inline const ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds& Appearances::special_meaning_appearance_ids() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.Appearances.special_meaning_appearance_ids) - return _internal_special_meaning_appearance_ids(); -} -inline void Appearances::unsafe_arena_set_allocated_special_meaning_appearance_ids( - ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds* special_meaning_appearance_ids) { - if (GetArenaForAllocation() == nullptr) { - delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(_impl_.special_meaning_appearance_ids_); - } - _impl_.special_meaning_appearance_ids_ = special_meaning_appearance_ids; - if (special_meaning_appearance_ids) { - _impl_._has_bits_[0] |= 0x00000001u; - } else { - _impl_._has_bits_[0] &= ~0x00000001u; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.appearances.Appearances.special_meaning_appearance_ids) -} -inline ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds* Appearances::release_special_meaning_appearance_ids() { - _impl_._has_bits_[0] &= ~0x00000001u; - ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds* temp = _impl_.special_meaning_appearance_ids_; - _impl_.special_meaning_appearance_ids_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - if (GetArenaForAllocation() == nullptr) { delete old; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return temp; -} -inline ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds* Appearances::unsafe_arena_release_special_meaning_appearance_ids() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.Appearances.special_meaning_appearance_ids) - _impl_._has_bits_[0] &= ~0x00000001u; - ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds* temp = _impl_.special_meaning_appearance_ids_; - _impl_.special_meaning_appearance_ids_ = nullptr; - return temp; -} -inline ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds* Appearances::_internal_mutable_special_meaning_appearance_ids() { - _impl_._has_bits_[0] |= 0x00000001u; - if (_impl_.special_meaning_appearance_ids_ == nullptr) { - auto* p = CreateMaybeMessage<::Canary::protobuf::appearances::SpecialMeaningAppearanceIds>(GetArenaForAllocation()); - _impl_.special_meaning_appearance_ids_ = p; - } - return _impl_.special_meaning_appearance_ids_; -} -inline ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds* Appearances::mutable_special_meaning_appearance_ids() { - ::Canary::protobuf::appearances::SpecialMeaningAppearanceIds* _msg = _internal_mutable_special_meaning_appearance_ids(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.Appearances.special_meaning_appearance_ids) - return _msg; -} -inline void Appearances::set_allocated_special_meaning_appearance_ids(::Canary::protobuf::appearances::SpecialMeaningAppearanceIds* special_meaning_appearance_ids) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - if (message_arena == nullptr) { - delete _impl_.special_meaning_appearance_ids_; - } - if (special_meaning_appearance_ids) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(special_meaning_appearance_ids); - if (message_arena != submessage_arena) { - special_meaning_appearance_ids = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, special_meaning_appearance_ids, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00000001u; - } else { - _impl_._has_bits_[0] &= ~0x00000001u; - } - _impl_.special_meaning_appearance_ids_ = special_meaning_appearance_ids; - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.Appearances.special_meaning_appearance_ids) -} - -// ------------------------------------------------------------------- - -// SpritePhase - -// optional uint32 duration_min = 1; -inline bool SpritePhase::_internal_has_duration_min() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool SpritePhase::has_duration_min() const { - return _internal_has_duration_min(); -} -inline void SpritePhase::clear_duration_min() { - _impl_.duration_min_ = 0u; - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline uint32_t SpritePhase::_internal_duration_min() const { - return _impl_.duration_min_; -} -inline uint32_t SpritePhase::duration_min() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpritePhase.duration_min) - return _internal_duration_min(); -} -inline void SpritePhase::_internal_set_duration_min(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.duration_min_ = value; -} -inline void SpritePhase::set_duration_min(uint32_t value) { - _internal_set_duration_min(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpritePhase.duration_min) -} - -// optional uint32 duration_max = 2; -inline bool SpritePhase::_internal_has_duration_max() const { - bool value = (_impl_._has_bits_[0] & 0x00000002u) != 0; - return value; -} -inline bool SpritePhase::has_duration_max() const { - return _internal_has_duration_max(); -} -inline void SpritePhase::clear_duration_max() { - _impl_.duration_max_ = 0u; - _impl_._has_bits_[0] &= ~0x00000002u; -} -inline uint32_t SpritePhase::_internal_duration_max() const { - return _impl_.duration_max_; -} -inline uint32_t SpritePhase::duration_max() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpritePhase.duration_max) - return _internal_duration_max(); -} -inline void SpritePhase::_internal_set_duration_max(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000002u; - _impl_.duration_max_ = value; -} -inline void SpritePhase::set_duration_max(uint32_t value) { - _internal_set_duration_max(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpritePhase.duration_max) -} - -// ------------------------------------------------------------------- - -// SpriteAnimation - -// optional uint32 default_start_phase = 1; -inline bool SpriteAnimation::_internal_has_default_start_phase() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool SpriteAnimation::has_default_start_phase() const { - return _internal_has_default_start_phase(); -} -inline void SpriteAnimation::clear_default_start_phase() { - _impl_.default_start_phase_ = 0u; - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline uint32_t SpriteAnimation::_internal_default_start_phase() const { - return _impl_.default_start_phase_; -} -inline uint32_t SpriteAnimation::default_start_phase() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpriteAnimation.default_start_phase) - return _internal_default_start_phase(); -} -inline void SpriteAnimation::_internal_set_default_start_phase(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.default_start_phase_ = value; -} -inline void SpriteAnimation::set_default_start_phase(uint32_t value) { - _internal_set_default_start_phase(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpriteAnimation.default_start_phase) -} - -// optional bool synchronized = 2; -inline bool SpriteAnimation::_internal_has_synchronized() const { - bool value = (_impl_._has_bits_[0] & 0x00000002u) != 0; - return value; -} -inline bool SpriteAnimation::has_synchronized() const { - return _internal_has_synchronized(); -} -inline void SpriteAnimation::clear_synchronized() { - _impl_.synchronized_ = false; - _impl_._has_bits_[0] &= ~0x00000002u; -} -inline bool SpriteAnimation::_internal_synchronized() const { - return _impl_.synchronized_; -} -inline bool SpriteAnimation::synchronized() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpriteAnimation.synchronized) - return _internal_synchronized(); -} -inline void SpriteAnimation::_internal_set_synchronized(bool value) { - _impl_._has_bits_[0] |= 0x00000002u; - _impl_.synchronized_ = value; -} -inline void SpriteAnimation::set_synchronized(bool value) { - _internal_set_synchronized(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpriteAnimation.synchronized) -} - -// optional bool random_start_phase = 3; -inline bool SpriteAnimation::_internal_has_random_start_phase() const { - bool value = (_impl_._has_bits_[0] & 0x00000004u) != 0; - return value; -} -inline bool SpriteAnimation::has_random_start_phase() const { - return _internal_has_random_start_phase(); -} -inline void SpriteAnimation::clear_random_start_phase() { - _impl_.random_start_phase_ = false; - _impl_._has_bits_[0] &= ~0x00000004u; -} -inline bool SpriteAnimation::_internal_random_start_phase() const { - return _impl_.random_start_phase_; -} -inline bool SpriteAnimation::random_start_phase() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpriteAnimation.random_start_phase) - return _internal_random_start_phase(); -} -inline void SpriteAnimation::_internal_set_random_start_phase(bool value) { - _impl_._has_bits_[0] |= 0x00000004u; - _impl_.random_start_phase_ = value; -} -inline void SpriteAnimation::set_random_start_phase(bool value) { - _internal_set_random_start_phase(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpriteAnimation.random_start_phase) -} - -// optional .Canary.protobuf.appearances.ANIMATION_LOOP_TYPE loop_type = 4; -inline bool SpriteAnimation::_internal_has_loop_type() const { - bool value = (_impl_._has_bits_[0] & 0x00000010u) != 0; - return value; -} -inline bool SpriteAnimation::has_loop_type() const { - return _internal_has_loop_type(); -} -inline void SpriteAnimation::clear_loop_type() { - _impl_.loop_type_ = -1; - _impl_._has_bits_[0] &= ~0x00000010u; -} -inline ::Canary::protobuf::appearances::ANIMATION_LOOP_TYPE SpriteAnimation::_internal_loop_type() const { - return static_cast< ::Canary::protobuf::appearances::ANIMATION_LOOP_TYPE >(_impl_.loop_type_); -} -inline ::Canary::protobuf::appearances::ANIMATION_LOOP_TYPE SpriteAnimation::loop_type() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpriteAnimation.loop_type) - return _internal_loop_type(); -} -inline void SpriteAnimation::_internal_set_loop_type(::Canary::protobuf::appearances::ANIMATION_LOOP_TYPE value) { - assert(::Canary::protobuf::appearances::ANIMATION_LOOP_TYPE_IsValid(value)); - _impl_._has_bits_[0] |= 0x00000010u; - _impl_.loop_type_ = value; -} -inline void SpriteAnimation::set_loop_type(::Canary::protobuf::appearances::ANIMATION_LOOP_TYPE value) { - _internal_set_loop_type(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpriteAnimation.loop_type) -} - -// optional uint32 loop_count = 5; -inline bool SpriteAnimation::_internal_has_loop_count() const { - bool value = (_impl_._has_bits_[0] & 0x00000008u) != 0; - return value; -} -inline bool SpriteAnimation::has_loop_count() const { - return _internal_has_loop_count(); -} -inline void SpriteAnimation::clear_loop_count() { - _impl_.loop_count_ = 0u; - _impl_._has_bits_[0] &= ~0x00000008u; -} -inline uint32_t SpriteAnimation::_internal_loop_count() const { - return _impl_.loop_count_; -} -inline uint32_t SpriteAnimation::loop_count() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpriteAnimation.loop_count) - return _internal_loop_count(); -} -inline void SpriteAnimation::_internal_set_loop_count(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000008u; - _impl_.loop_count_ = value; -} -inline void SpriteAnimation::set_loop_count(uint32_t value) { - _internal_set_loop_count(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpriteAnimation.loop_count) -} - -// repeated .Canary.protobuf.appearances.SpritePhase sprite_phase = 6; -inline int SpriteAnimation::_internal_sprite_phase_size() const { - return _impl_.sprite_phase_.size(); -} -inline int SpriteAnimation::sprite_phase_size() const { - return _internal_sprite_phase_size(); -} -inline void SpriteAnimation::clear_sprite_phase() { - _impl_.sprite_phase_.Clear(); -} -inline ::Canary::protobuf::appearances::SpritePhase* SpriteAnimation::mutable_sprite_phase(int index) { - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.SpriteAnimation.sprite_phase) - return _impl_.sprite_phase_.Mutable(index); -} -inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::SpritePhase >* -SpriteAnimation::mutable_sprite_phase() { - // @@protoc_insertion_point(field_mutable_list:Canary.protobuf.appearances.SpriteAnimation.sprite_phase) - return &_impl_.sprite_phase_; -} -inline const ::Canary::protobuf::appearances::SpritePhase& SpriteAnimation::_internal_sprite_phase(int index) const { - return _impl_.sprite_phase_.Get(index); -} -inline const ::Canary::protobuf::appearances::SpritePhase& SpriteAnimation::sprite_phase(int index) const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpriteAnimation.sprite_phase) - return _internal_sprite_phase(index); -} -inline ::Canary::protobuf::appearances::SpritePhase* SpriteAnimation::_internal_add_sprite_phase() { - return _impl_.sprite_phase_.Add(); -} -inline ::Canary::protobuf::appearances::SpritePhase* SpriteAnimation::add_sprite_phase() { - ::Canary::protobuf::appearances::SpritePhase* _add = _internal_add_sprite_phase(); - // @@protoc_insertion_point(field_add:Canary.protobuf.appearances.SpriteAnimation.sprite_phase) - return _add; -} -inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::SpritePhase >& -SpriteAnimation::sprite_phase() const { - // @@protoc_insertion_point(field_list:Canary.protobuf.appearances.SpriteAnimation.sprite_phase) - return _impl_.sprite_phase_; -} - -// ------------------------------------------------------------------- - -// Box - -// optional uint32 x = 1; -inline bool Box::_internal_has_x() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool Box::has_x() const { - return _internal_has_x(); -} -inline void Box::clear_x() { - _impl_.x_ = 0u; - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline uint32_t Box::_internal_x() const { - return _impl_.x_; -} -inline uint32_t Box::x() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.Box.x) - return _internal_x(); -} -inline void Box::_internal_set_x(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.x_ = value; -} -inline void Box::set_x(uint32_t value) { - _internal_set_x(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.Box.x) -} - -// optional uint32 y = 2; -inline bool Box::_internal_has_y() const { - bool value = (_impl_._has_bits_[0] & 0x00000002u) != 0; - return value; -} -inline bool Box::has_y() const { - return _internal_has_y(); -} -inline void Box::clear_y() { - _impl_.y_ = 0u; - _impl_._has_bits_[0] &= ~0x00000002u; -} -inline uint32_t Box::_internal_y() const { - return _impl_.y_; -} -inline uint32_t Box::y() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.Box.y) - return _internal_y(); -} -inline void Box::_internal_set_y(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000002u; - _impl_.y_ = value; -} -inline void Box::set_y(uint32_t value) { - _internal_set_y(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.Box.y) -} - -// optional uint32 width = 3; -inline bool Box::_internal_has_width() const { - bool value = (_impl_._has_bits_[0] & 0x00000004u) != 0; - return value; -} -inline bool Box::has_width() const { - return _internal_has_width(); -} -inline void Box::clear_width() { - _impl_.width_ = 0u; - _impl_._has_bits_[0] &= ~0x00000004u; -} -inline uint32_t Box::_internal_width() const { - return _impl_.width_; -} -inline uint32_t Box::width() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.Box.width) - return _internal_width(); -} -inline void Box::_internal_set_width(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000004u; - _impl_.width_ = value; -} -inline void Box::set_width(uint32_t value) { - _internal_set_width(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.Box.width) -} - -// optional uint32 height = 4; -inline bool Box::_internal_has_height() const { - bool value = (_impl_._has_bits_[0] & 0x00000008u) != 0; - return value; -} -inline bool Box::has_height() const { - return _internal_has_height(); -} -inline void Box::clear_height() { - _impl_.height_ = 0u; - _impl_._has_bits_[0] &= ~0x00000008u; -} -inline uint32_t Box::_internal_height() const { - return _impl_.height_; -} -inline uint32_t Box::height() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.Box.height) - return _internal_height(); -} -inline void Box::_internal_set_height(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000008u; - _impl_.height_ = value; -} -inline void Box::set_height(uint32_t value) { - _internal_set_height(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.Box.height) -} - -// ------------------------------------------------------------------- - -// SpriteInfo - -// optional uint32 pattern_width = 1; -inline bool SpriteInfo::_internal_has_pattern_width() const { - bool value = (_impl_._has_bits_[0] & 0x00000002u) != 0; - return value; -} -inline bool SpriteInfo::has_pattern_width() const { - return _internal_has_pattern_width(); -} -inline void SpriteInfo::clear_pattern_width() { - _impl_.pattern_width_ = 0u; - _impl_._has_bits_[0] &= ~0x00000002u; -} -inline uint32_t SpriteInfo::_internal_pattern_width() const { - return _impl_.pattern_width_; -} -inline uint32_t SpriteInfo::pattern_width() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpriteInfo.pattern_width) - return _internal_pattern_width(); -} -inline void SpriteInfo::_internal_set_pattern_width(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000002u; - _impl_.pattern_width_ = value; -} -inline void SpriteInfo::set_pattern_width(uint32_t value) { - _internal_set_pattern_width(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpriteInfo.pattern_width) -} - -// optional uint32 pattern_height = 2; -inline bool SpriteInfo::_internal_has_pattern_height() const { - bool value = (_impl_._has_bits_[0] & 0x00000004u) != 0; - return value; -} -inline bool SpriteInfo::has_pattern_height() const { - return _internal_has_pattern_height(); -} -inline void SpriteInfo::clear_pattern_height() { - _impl_.pattern_height_ = 0u; - _impl_._has_bits_[0] &= ~0x00000004u; -} -inline uint32_t SpriteInfo::_internal_pattern_height() const { - return _impl_.pattern_height_; -} -inline uint32_t SpriteInfo::pattern_height() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpriteInfo.pattern_height) - return _internal_pattern_height(); -} -inline void SpriteInfo::_internal_set_pattern_height(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000004u; - _impl_.pattern_height_ = value; -} -inline void SpriteInfo::set_pattern_height(uint32_t value) { - _internal_set_pattern_height(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpriteInfo.pattern_height) -} - -// optional uint32 pattern_depth = 3; -inline bool SpriteInfo::_internal_has_pattern_depth() const { - bool value = (_impl_._has_bits_[0] & 0x00000008u) != 0; - return value; -} -inline bool SpriteInfo::has_pattern_depth() const { - return _internal_has_pattern_depth(); -} -inline void SpriteInfo::clear_pattern_depth() { - _impl_.pattern_depth_ = 0u; - _impl_._has_bits_[0] &= ~0x00000008u; -} -inline uint32_t SpriteInfo::_internal_pattern_depth() const { - return _impl_.pattern_depth_; -} -inline uint32_t SpriteInfo::pattern_depth() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpriteInfo.pattern_depth) - return _internal_pattern_depth(); -} -inline void SpriteInfo::_internal_set_pattern_depth(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000008u; - _impl_.pattern_depth_ = value; -} -inline void SpriteInfo::set_pattern_depth(uint32_t value) { - _internal_set_pattern_depth(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpriteInfo.pattern_depth) -} - -// optional uint32 layers = 4; -inline bool SpriteInfo::_internal_has_layers() const { - bool value = (_impl_._has_bits_[0] & 0x00000010u) != 0; - return value; -} -inline bool SpriteInfo::has_layers() const { - return _internal_has_layers(); -} -inline void SpriteInfo::clear_layers() { - _impl_.layers_ = 0u; - _impl_._has_bits_[0] &= ~0x00000010u; -} -inline uint32_t SpriteInfo::_internal_layers() const { - return _impl_.layers_; -} -inline uint32_t SpriteInfo::layers() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpriteInfo.layers) - return _internal_layers(); -} -inline void SpriteInfo::_internal_set_layers(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000010u; - _impl_.layers_ = value; -} -inline void SpriteInfo::set_layers(uint32_t value) { - _internal_set_layers(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpriteInfo.layers) -} - -// repeated uint32 sprite_id = 5; -inline int SpriteInfo::_internal_sprite_id_size() const { - return _impl_.sprite_id_.size(); -} -inline int SpriteInfo::sprite_id_size() const { - return _internal_sprite_id_size(); -} -inline void SpriteInfo::clear_sprite_id() { - _impl_.sprite_id_.Clear(); -} -inline uint32_t SpriteInfo::_internal_sprite_id(int index) const { - return _impl_.sprite_id_.Get(index); -} -inline uint32_t SpriteInfo::sprite_id(int index) const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpriteInfo.sprite_id) - return _internal_sprite_id(index); -} -inline void SpriteInfo::set_sprite_id(int index, uint32_t value) { - _impl_.sprite_id_.Set(index, value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpriteInfo.sprite_id) -} -inline void SpriteInfo::_internal_add_sprite_id(uint32_t value) { - _impl_.sprite_id_.Add(value); -} -inline void SpriteInfo::add_sprite_id(uint32_t value) { - _internal_add_sprite_id(value); - // @@protoc_insertion_point(field_add:Canary.protobuf.appearances.SpriteInfo.sprite_id) -} -inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< uint32_t >& -SpriteInfo::_internal_sprite_id() const { - return _impl_.sprite_id_; -} -inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField< uint32_t >& -SpriteInfo::sprite_id() const { - // @@protoc_insertion_point(field_list:Canary.protobuf.appearances.SpriteInfo.sprite_id) - return _internal_sprite_id(); -} -inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< uint32_t >* -SpriteInfo::_internal_mutable_sprite_id() { - return &_impl_.sprite_id_; -} -inline ::PROTOBUF_NAMESPACE_ID::RepeatedField< uint32_t >* -SpriteInfo::mutable_sprite_id() { - // @@protoc_insertion_point(field_mutable_list:Canary.protobuf.appearances.SpriteInfo.sprite_id) - return _internal_mutable_sprite_id(); -} - -// optional uint32 bounding_square = 7; -inline bool SpriteInfo::_internal_has_bounding_square() const { - bool value = (_impl_._has_bits_[0] & 0x00000020u) != 0; - return value; -} -inline bool SpriteInfo::has_bounding_square() const { - return _internal_has_bounding_square(); -} -inline void SpriteInfo::clear_bounding_square() { - _impl_.bounding_square_ = 0u; - _impl_._has_bits_[0] &= ~0x00000020u; -} -inline uint32_t SpriteInfo::_internal_bounding_square() const { - return _impl_.bounding_square_; -} -inline uint32_t SpriteInfo::bounding_square() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpriteInfo.bounding_square) - return _internal_bounding_square(); -} -inline void SpriteInfo::_internal_set_bounding_square(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000020u; - _impl_.bounding_square_ = value; -} -inline void SpriteInfo::set_bounding_square(uint32_t value) { - _internal_set_bounding_square(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpriteInfo.bounding_square) -} - -// optional .Canary.protobuf.appearances.SpriteAnimation animation = 6; -inline bool SpriteInfo::_internal_has_animation() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - PROTOBUF_ASSUME(!value || _impl_.animation_ != nullptr); - return value; -} -inline bool SpriteInfo::has_animation() const { - return _internal_has_animation(); -} -inline void SpriteInfo::clear_animation() { - if (_impl_.animation_ != nullptr) _impl_.animation_->Clear(); - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline const ::Canary::protobuf::appearances::SpriteAnimation& SpriteInfo::_internal_animation() const { - const ::Canary::protobuf::appearances::SpriteAnimation* p = _impl_.animation_; - return p != nullptr ? *p : reinterpret_cast( - ::Canary::protobuf::appearances::_SpriteAnimation_default_instance_); -} -inline const ::Canary::protobuf::appearances::SpriteAnimation& SpriteInfo::animation() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpriteInfo.animation) - return _internal_animation(); -} -inline void SpriteInfo::unsafe_arena_set_allocated_animation( - ::Canary::protobuf::appearances::SpriteAnimation* animation) { - if (GetArenaForAllocation() == nullptr) { - delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(_impl_.animation_); - } - _impl_.animation_ = animation; - if (animation) { - _impl_._has_bits_[0] |= 0x00000001u; - } else { - _impl_._has_bits_[0] &= ~0x00000001u; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.appearances.SpriteInfo.animation) -} -inline ::Canary::protobuf::appearances::SpriteAnimation* SpriteInfo::release_animation() { - _impl_._has_bits_[0] &= ~0x00000001u; - ::Canary::protobuf::appearances::SpriteAnimation* temp = _impl_.animation_; - _impl_.animation_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - if (GetArenaForAllocation() == nullptr) { delete old; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return temp; -} -inline ::Canary::protobuf::appearances::SpriteAnimation* SpriteInfo::unsafe_arena_release_animation() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.SpriteInfo.animation) - _impl_._has_bits_[0] &= ~0x00000001u; - ::Canary::protobuf::appearances::SpriteAnimation* temp = _impl_.animation_; - _impl_.animation_ = nullptr; - return temp; -} -inline ::Canary::protobuf::appearances::SpriteAnimation* SpriteInfo::_internal_mutable_animation() { - _impl_._has_bits_[0] |= 0x00000001u; - if (_impl_.animation_ == nullptr) { - auto* p = CreateMaybeMessage<::Canary::protobuf::appearances::SpriteAnimation>(GetArenaForAllocation()); - _impl_.animation_ = p; - } - return _impl_.animation_; -} -inline ::Canary::protobuf::appearances::SpriteAnimation* SpriteInfo::mutable_animation() { - ::Canary::protobuf::appearances::SpriteAnimation* _msg = _internal_mutable_animation(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.SpriteInfo.animation) - return _msg; -} -inline void SpriteInfo::set_allocated_animation(::Canary::protobuf::appearances::SpriteAnimation* animation) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - if (message_arena == nullptr) { - delete _impl_.animation_; - } - if (animation) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(animation); - if (message_arena != submessage_arena) { - animation = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, animation, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00000001u; - } else { - _impl_._has_bits_[0] &= ~0x00000001u; - } - _impl_.animation_ = animation; - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.SpriteInfo.animation) -} - -// optional bool is_opaque = 8; -inline bool SpriteInfo::_internal_has_is_opaque() const { - bool value = (_impl_._has_bits_[0] & 0x00000040u) != 0; - return value; -} -inline bool SpriteInfo::has_is_opaque() const { - return _internal_has_is_opaque(); -} -inline void SpriteInfo::clear_is_opaque() { - _impl_.is_opaque_ = false; - _impl_._has_bits_[0] &= ~0x00000040u; -} -inline bool SpriteInfo::_internal_is_opaque() const { - return _impl_.is_opaque_; -} -inline bool SpriteInfo::is_opaque() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpriteInfo.is_opaque) - return _internal_is_opaque(); -} -inline void SpriteInfo::_internal_set_is_opaque(bool value) { - _impl_._has_bits_[0] |= 0x00000040u; - _impl_.is_opaque_ = value; -} -inline void SpriteInfo::set_is_opaque(bool value) { - _internal_set_is_opaque(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpriteInfo.is_opaque) -} - -// repeated .Canary.protobuf.appearances.Box bounding_box_per_direction = 9; -inline int SpriteInfo::_internal_bounding_box_per_direction_size() const { - return _impl_.bounding_box_per_direction_.size(); -} -inline int SpriteInfo::bounding_box_per_direction_size() const { - return _internal_bounding_box_per_direction_size(); -} -inline void SpriteInfo::clear_bounding_box_per_direction() { - _impl_.bounding_box_per_direction_.Clear(); -} -inline ::Canary::protobuf::appearances::Box* SpriteInfo::mutable_bounding_box_per_direction(int index) { - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.SpriteInfo.bounding_box_per_direction) - return _impl_.bounding_box_per_direction_.Mutable(index); -} -inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Box >* -SpriteInfo::mutable_bounding_box_per_direction() { - // @@protoc_insertion_point(field_mutable_list:Canary.protobuf.appearances.SpriteInfo.bounding_box_per_direction) - return &_impl_.bounding_box_per_direction_; -} -inline const ::Canary::protobuf::appearances::Box& SpriteInfo::_internal_bounding_box_per_direction(int index) const { - return _impl_.bounding_box_per_direction_.Get(index); -} -inline const ::Canary::protobuf::appearances::Box& SpriteInfo::bounding_box_per_direction(int index) const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpriteInfo.bounding_box_per_direction) - return _internal_bounding_box_per_direction(index); -} -inline ::Canary::protobuf::appearances::Box* SpriteInfo::_internal_add_bounding_box_per_direction() { - return _impl_.bounding_box_per_direction_.Add(); -} -inline ::Canary::protobuf::appearances::Box* SpriteInfo::add_bounding_box_per_direction() { - ::Canary::protobuf::appearances::Box* _add = _internal_add_bounding_box_per_direction(); - // @@protoc_insertion_point(field_add:Canary.protobuf.appearances.SpriteInfo.bounding_box_per_direction) - return _add; -} -inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::Box >& -SpriteInfo::bounding_box_per_direction() const { - // @@protoc_insertion_point(field_list:Canary.protobuf.appearances.SpriteInfo.bounding_box_per_direction) - return _impl_.bounding_box_per_direction_; -} - -// ------------------------------------------------------------------- - -// FrameGroup - -// optional .Canary.protobuf.appearances.FIXED_FRAME_GROUP fixed_frame_group = 1; -inline bool FrameGroup::_internal_has_fixed_frame_group() const { - bool value = (_impl_._has_bits_[0] & 0x00000002u) != 0; - return value; -} -inline bool FrameGroup::has_fixed_frame_group() const { - return _internal_has_fixed_frame_group(); -} -inline void FrameGroup::clear_fixed_frame_group() { - _impl_.fixed_frame_group_ = 0; - _impl_._has_bits_[0] &= ~0x00000002u; -} -inline ::Canary::protobuf::appearances::FIXED_FRAME_GROUP FrameGroup::_internal_fixed_frame_group() const { - return static_cast< ::Canary::protobuf::appearances::FIXED_FRAME_GROUP >(_impl_.fixed_frame_group_); -} -inline ::Canary::protobuf::appearances::FIXED_FRAME_GROUP FrameGroup::fixed_frame_group() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.FrameGroup.fixed_frame_group) - return _internal_fixed_frame_group(); -} -inline void FrameGroup::_internal_set_fixed_frame_group(::Canary::protobuf::appearances::FIXED_FRAME_GROUP value) { - assert(::Canary::protobuf::appearances::FIXED_FRAME_GROUP_IsValid(value)); - _impl_._has_bits_[0] |= 0x00000002u; - _impl_.fixed_frame_group_ = value; -} -inline void FrameGroup::set_fixed_frame_group(::Canary::protobuf::appearances::FIXED_FRAME_GROUP value) { - _internal_set_fixed_frame_group(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.FrameGroup.fixed_frame_group) -} - -// optional uint32 id = 2; -inline bool FrameGroup::_internal_has_id() const { - bool value = (_impl_._has_bits_[0] & 0x00000004u) != 0; - return value; -} -inline bool FrameGroup::has_id() const { - return _internal_has_id(); -} -inline void FrameGroup::clear_id() { - _impl_.id_ = 0u; - _impl_._has_bits_[0] &= ~0x00000004u; -} -inline uint32_t FrameGroup::_internal_id() const { - return _impl_.id_; -} -inline uint32_t FrameGroup::id() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.FrameGroup.id) - return _internal_id(); -} -inline void FrameGroup::_internal_set_id(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000004u; - _impl_.id_ = value; -} -inline void FrameGroup::set_id(uint32_t value) { - _internal_set_id(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.FrameGroup.id) -} - -// optional .Canary.protobuf.appearances.SpriteInfo sprite_info = 3; -inline bool FrameGroup::_internal_has_sprite_info() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - PROTOBUF_ASSUME(!value || _impl_.sprite_info_ != nullptr); - return value; -} -inline bool FrameGroup::has_sprite_info() const { - return _internal_has_sprite_info(); -} -inline void FrameGroup::clear_sprite_info() { - if (_impl_.sprite_info_ != nullptr) _impl_.sprite_info_->Clear(); - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline const ::Canary::protobuf::appearances::SpriteInfo& FrameGroup::_internal_sprite_info() const { - const ::Canary::protobuf::appearances::SpriteInfo* p = _impl_.sprite_info_; - return p != nullptr ? *p : reinterpret_cast( - ::Canary::protobuf::appearances::_SpriteInfo_default_instance_); -} -inline const ::Canary::protobuf::appearances::SpriteInfo& FrameGroup::sprite_info() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.FrameGroup.sprite_info) - return _internal_sprite_info(); -} -inline void FrameGroup::unsafe_arena_set_allocated_sprite_info( - ::Canary::protobuf::appearances::SpriteInfo* sprite_info) { - if (GetArenaForAllocation() == nullptr) { - delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(_impl_.sprite_info_); - } - _impl_.sprite_info_ = sprite_info; - if (sprite_info) { - _impl_._has_bits_[0] |= 0x00000001u; - } else { - _impl_._has_bits_[0] &= ~0x00000001u; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.appearances.FrameGroup.sprite_info) -} -inline ::Canary::protobuf::appearances::SpriteInfo* FrameGroup::release_sprite_info() { - _impl_._has_bits_[0] &= ~0x00000001u; - ::Canary::protobuf::appearances::SpriteInfo* temp = _impl_.sprite_info_; - _impl_.sprite_info_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - if (GetArenaForAllocation() == nullptr) { delete old; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return temp; -} -inline ::Canary::protobuf::appearances::SpriteInfo* FrameGroup::unsafe_arena_release_sprite_info() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.FrameGroup.sprite_info) - _impl_._has_bits_[0] &= ~0x00000001u; - ::Canary::protobuf::appearances::SpriteInfo* temp = _impl_.sprite_info_; - _impl_.sprite_info_ = nullptr; - return temp; -} -inline ::Canary::protobuf::appearances::SpriteInfo* FrameGroup::_internal_mutable_sprite_info() { - _impl_._has_bits_[0] |= 0x00000001u; - if (_impl_.sprite_info_ == nullptr) { - auto* p = CreateMaybeMessage<::Canary::protobuf::appearances::SpriteInfo>(GetArenaForAllocation()); - _impl_.sprite_info_ = p; - } - return _impl_.sprite_info_; -} -inline ::Canary::protobuf::appearances::SpriteInfo* FrameGroup::mutable_sprite_info() { - ::Canary::protobuf::appearances::SpriteInfo* _msg = _internal_mutable_sprite_info(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.FrameGroup.sprite_info) - return _msg; -} -inline void FrameGroup::set_allocated_sprite_info(::Canary::protobuf::appearances::SpriteInfo* sprite_info) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - if (message_arena == nullptr) { - delete _impl_.sprite_info_; - } - if (sprite_info) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(sprite_info); - if (message_arena != submessage_arena) { - sprite_info = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, sprite_info, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00000001u; - } else { - _impl_._has_bits_[0] &= ~0x00000001u; - } - _impl_.sprite_info_ = sprite_info; - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.FrameGroup.sprite_info) -} - -// ------------------------------------------------------------------- - -// Appearance - -// optional uint32 id = 1; -inline bool Appearance::_internal_has_id() const { - bool value = (_impl_._has_bits_[0] & 0x00000008u) != 0; - return value; -} -inline bool Appearance::has_id() const { - return _internal_has_id(); -} -inline void Appearance::clear_id() { - _impl_.id_ = 0u; - _impl_._has_bits_[0] &= ~0x00000008u; -} -inline uint32_t Appearance::_internal_id() const { - return _impl_.id_; -} -inline uint32_t Appearance::id() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.Appearance.id) - return _internal_id(); -} -inline void Appearance::_internal_set_id(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000008u; - _impl_.id_ = value; -} -inline void Appearance::set_id(uint32_t value) { - _internal_set_id(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.Appearance.id) -} - -// repeated .Canary.protobuf.appearances.FrameGroup frame_group = 2; -inline int Appearance::_internal_frame_group_size() const { - return _impl_.frame_group_.size(); -} -inline int Appearance::frame_group_size() const { - return _internal_frame_group_size(); -} -inline void Appearance::clear_frame_group() { - _impl_.frame_group_.Clear(); -} -inline ::Canary::protobuf::appearances::FrameGroup* Appearance::mutable_frame_group(int index) { - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.Appearance.frame_group) - return _impl_.frame_group_.Mutable(index); -} -inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::FrameGroup >* -Appearance::mutable_frame_group() { - // @@protoc_insertion_point(field_mutable_list:Canary.protobuf.appearances.Appearance.frame_group) - return &_impl_.frame_group_; -} -inline const ::Canary::protobuf::appearances::FrameGroup& Appearance::_internal_frame_group(int index) const { - return _impl_.frame_group_.Get(index); -} -inline const ::Canary::protobuf::appearances::FrameGroup& Appearance::frame_group(int index) const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.Appearance.frame_group) - return _internal_frame_group(index); -} -inline ::Canary::protobuf::appearances::FrameGroup* Appearance::_internal_add_frame_group() { - return _impl_.frame_group_.Add(); -} -inline ::Canary::protobuf::appearances::FrameGroup* Appearance::add_frame_group() { - ::Canary::protobuf::appearances::FrameGroup* _add = _internal_add_frame_group(); - // @@protoc_insertion_point(field_add:Canary.protobuf.appearances.Appearance.frame_group) - return _add; -} -inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::FrameGroup >& -Appearance::frame_group() const { - // @@protoc_insertion_point(field_list:Canary.protobuf.appearances.Appearance.frame_group) - return _impl_.frame_group_; -} - -// optional .Canary.protobuf.appearances.AppearanceFlags flags = 3; -inline bool Appearance::_internal_has_flags() const { - bool value = (_impl_._has_bits_[0] & 0x00000004u) != 0; - PROTOBUF_ASSUME(!value || _impl_.flags_ != nullptr); - return value; -} -inline bool Appearance::has_flags() const { - return _internal_has_flags(); -} -inline void Appearance::clear_flags() { - if (_impl_.flags_ != nullptr) _impl_.flags_->Clear(); - _impl_._has_bits_[0] &= ~0x00000004u; -} -inline const ::Canary::protobuf::appearances::AppearanceFlags& Appearance::_internal_flags() const { - const ::Canary::protobuf::appearances::AppearanceFlags* p = _impl_.flags_; - return p != nullptr ? *p : reinterpret_cast( - ::Canary::protobuf::appearances::_AppearanceFlags_default_instance_); -} -inline const ::Canary::protobuf::appearances::AppearanceFlags& Appearance::flags() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.Appearance.flags) - return _internal_flags(); -} -inline void Appearance::unsafe_arena_set_allocated_flags( - ::Canary::protobuf::appearances::AppearanceFlags* flags) { - if (GetArenaForAllocation() == nullptr) { - delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(_impl_.flags_); - } - _impl_.flags_ = flags; - if (flags) { - _impl_._has_bits_[0] |= 0x00000004u; - } else { - _impl_._has_bits_[0] &= ~0x00000004u; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.appearances.Appearance.flags) -} -inline ::Canary::protobuf::appearances::AppearanceFlags* Appearance::release_flags() { - _impl_._has_bits_[0] &= ~0x00000004u; - ::Canary::protobuf::appearances::AppearanceFlags* temp = _impl_.flags_; - _impl_.flags_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - if (GetArenaForAllocation() == nullptr) { delete old; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlags* Appearance::unsafe_arena_release_flags() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.Appearance.flags) - _impl_._has_bits_[0] &= ~0x00000004u; - ::Canary::protobuf::appearances::AppearanceFlags* temp = _impl_.flags_; - _impl_.flags_ = nullptr; - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlags* Appearance::_internal_mutable_flags() { - _impl_._has_bits_[0] |= 0x00000004u; - if (_impl_.flags_ == nullptr) { - auto* p = CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlags>(GetArenaForAllocation()); - _impl_.flags_ = p; - } - return _impl_.flags_; -} -inline ::Canary::protobuf::appearances::AppearanceFlags* Appearance::mutable_flags() { - ::Canary::protobuf::appearances::AppearanceFlags* _msg = _internal_mutable_flags(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.Appearance.flags) - return _msg; -} -inline void Appearance::set_allocated_flags(::Canary::protobuf::appearances::AppearanceFlags* flags) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - if (message_arena == nullptr) { - delete _impl_.flags_; - } - if (flags) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(flags); - if (message_arena != submessage_arena) { - flags = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, flags, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00000004u; - } else { - _impl_._has_bits_[0] &= ~0x00000004u; - } - _impl_.flags_ = flags; - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.Appearance.flags) -} - -// optional bytes name = 4; -inline bool Appearance::_internal_has_name() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool Appearance::has_name() const { - return _internal_has_name(); -} -inline void Appearance::clear_name() { - _impl_.name_.ClearToEmpty(); - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline const std::string& Appearance::name() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.Appearance.name) - return _internal_name(); -} -template -inline PROTOBUF_ALWAYS_INLINE -void Appearance::set_name(ArgT0&& arg0, ArgT... args) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.name_.SetBytes(static_cast(arg0), args..., GetArenaForAllocation()); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.Appearance.name) -} -inline std::string* Appearance::mutable_name() { - std::string* _s = _internal_mutable_name(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.Appearance.name) - return _s; -} -inline const std::string& Appearance::_internal_name() const { - return _impl_.name_.Get(); -} -inline void Appearance::_internal_set_name(const std::string& value) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.name_.Set(value, GetArenaForAllocation()); -} -inline std::string* Appearance::_internal_mutable_name() { - _impl_._has_bits_[0] |= 0x00000001u; - return _impl_.name_.Mutable(GetArenaForAllocation()); -} -inline std::string* Appearance::release_name() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.Appearance.name) - if (!_internal_has_name()) { - return nullptr; - } - _impl_._has_bits_[0] &= ~0x00000001u; - auto* p = _impl_.name_.Release(); -#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.name_.IsDefault()) { - _impl_.name_.Set("", GetArenaForAllocation()); - } -#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - return p; -} -inline void Appearance::set_allocated_name(std::string* name) { - if (name != nullptr) { - _impl_._has_bits_[0] |= 0x00000001u; - } else { - _impl_._has_bits_[0] &= ~0x00000001u; - } - _impl_.name_.SetAllocated(name, GetArenaForAllocation()); -#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.name_.IsDefault()) { - _impl_.name_.Set("", GetArenaForAllocation()); - } -#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.Appearance.name) -} - -// optional bytes description = 5; -inline bool Appearance::_internal_has_description() const { - bool value = (_impl_._has_bits_[0] & 0x00000002u) != 0; - return value; -} -inline bool Appearance::has_description() const { - return _internal_has_description(); -} -inline void Appearance::clear_description() { - _impl_.description_.ClearToEmpty(); - _impl_._has_bits_[0] &= ~0x00000002u; -} -inline const std::string& Appearance::description() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.Appearance.description) - return _internal_description(); -} -template -inline PROTOBUF_ALWAYS_INLINE -void Appearance::set_description(ArgT0&& arg0, ArgT... args) { - _impl_._has_bits_[0] |= 0x00000002u; - _impl_.description_.SetBytes(static_cast(arg0), args..., GetArenaForAllocation()); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.Appearance.description) -} -inline std::string* Appearance::mutable_description() { - std::string* _s = _internal_mutable_description(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.Appearance.description) - return _s; -} -inline const std::string& Appearance::_internal_description() const { - return _impl_.description_.Get(); -} -inline void Appearance::_internal_set_description(const std::string& value) { - _impl_._has_bits_[0] |= 0x00000002u; - _impl_.description_.Set(value, GetArenaForAllocation()); -} -inline std::string* Appearance::_internal_mutable_description() { - _impl_._has_bits_[0] |= 0x00000002u; - return _impl_.description_.Mutable(GetArenaForAllocation()); -} -inline std::string* Appearance::release_description() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.Appearance.description) - if (!_internal_has_description()) { - return nullptr; - } - _impl_._has_bits_[0] &= ~0x00000002u; - auto* p = _impl_.description_.Release(); -#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.description_.IsDefault()) { - _impl_.description_.Set("", GetArenaForAllocation()); - } -#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - return p; -} -inline void Appearance::set_allocated_description(std::string* description) { - if (description != nullptr) { - _impl_._has_bits_[0] |= 0x00000002u; - } else { - _impl_._has_bits_[0] &= ~0x00000002u; - } - _impl_.description_.SetAllocated(description, GetArenaForAllocation()); -#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.description_.IsDefault()) { - _impl_.description_.Set("", GetArenaForAllocation()); - } -#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.Appearance.description) -} - -// ------------------------------------------------------------------- - -// AppearanceFlags - -// optional .Canary.protobuf.appearances.AppearanceFlagBank bank = 1; -inline bool AppearanceFlags::_internal_has_bank() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - PROTOBUF_ASSUME(!value || _impl_.bank_ != nullptr); - return value; -} -inline bool AppearanceFlags::has_bank() const { - return _internal_has_bank(); -} -inline void AppearanceFlags::clear_bank() { - if (_impl_.bank_ != nullptr) _impl_.bank_->Clear(); - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline const ::Canary::protobuf::appearances::AppearanceFlagBank& AppearanceFlags::_internal_bank() const { - const ::Canary::protobuf::appearances::AppearanceFlagBank* p = _impl_.bank_; - return p != nullptr ? *p : reinterpret_cast( - ::Canary::protobuf::appearances::_AppearanceFlagBank_default_instance_); -} -inline const ::Canary::protobuf::appearances::AppearanceFlagBank& AppearanceFlags::bank() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.bank) - return _internal_bank(); -} -inline void AppearanceFlags::unsafe_arena_set_allocated_bank( - ::Canary::protobuf::appearances::AppearanceFlagBank* bank) { - if (GetArenaForAllocation() == nullptr) { - delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(_impl_.bank_); - } - _impl_.bank_ = bank; - if (bank) { - _impl_._has_bits_[0] |= 0x00000001u; - } else { - _impl_._has_bits_[0] &= ~0x00000001u; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.appearances.AppearanceFlags.bank) -} -inline ::Canary::protobuf::appearances::AppearanceFlagBank* AppearanceFlags::release_bank() { - _impl_._has_bits_[0] &= ~0x00000001u; - ::Canary::protobuf::appearances::AppearanceFlagBank* temp = _impl_.bank_; - _impl_.bank_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - if (GetArenaForAllocation() == nullptr) { delete old; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagBank* AppearanceFlags::unsafe_arena_release_bank() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.AppearanceFlags.bank) - _impl_._has_bits_[0] &= ~0x00000001u; - ::Canary::protobuf::appearances::AppearanceFlagBank* temp = _impl_.bank_; - _impl_.bank_ = nullptr; - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagBank* AppearanceFlags::_internal_mutable_bank() { - _impl_._has_bits_[0] |= 0x00000001u; - if (_impl_.bank_ == nullptr) { - auto* p = CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagBank>(GetArenaForAllocation()); - _impl_.bank_ = p; - } - return _impl_.bank_; -} -inline ::Canary::protobuf::appearances::AppearanceFlagBank* AppearanceFlags::mutable_bank() { - ::Canary::protobuf::appearances::AppearanceFlagBank* _msg = _internal_mutable_bank(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.AppearanceFlags.bank) - return _msg; -} -inline void AppearanceFlags::set_allocated_bank(::Canary::protobuf::appearances::AppearanceFlagBank* bank) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - if (message_arena == nullptr) { - delete _impl_.bank_; - } - if (bank) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(bank); - if (message_arena != submessage_arena) { - bank = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, bank, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00000001u; - } else { - _impl_._has_bits_[0] &= ~0x00000001u; - } - _impl_.bank_ = bank; - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.AppearanceFlags.bank) -} - -// optional bool clip = 2; -inline bool AppearanceFlags::_internal_has_clip() const { - bool value = (_impl_._has_bits_[0] & 0x00008000u) != 0; - return value; -} -inline bool AppearanceFlags::has_clip() const { - return _internal_has_clip(); -} -inline void AppearanceFlags::clear_clip() { - _impl_.clip_ = false; - _impl_._has_bits_[0] &= ~0x00008000u; -} -inline bool AppearanceFlags::_internal_clip() const { - return _impl_.clip_; -} -inline bool AppearanceFlags::clip() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.clip) - return _internal_clip(); -} -inline void AppearanceFlags::_internal_set_clip(bool value) { - _impl_._has_bits_[0] |= 0x00008000u; - _impl_.clip_ = value; -} -inline void AppearanceFlags::set_clip(bool value) { - _internal_set_clip(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.clip) -} - -// optional bool bottom = 3; -inline bool AppearanceFlags::_internal_has_bottom() const { - bool value = (_impl_._has_bits_[0] & 0x00010000u) != 0; - return value; -} -inline bool AppearanceFlags::has_bottom() const { - return _internal_has_bottom(); -} -inline void AppearanceFlags::clear_bottom() { - _impl_.bottom_ = false; - _impl_._has_bits_[0] &= ~0x00010000u; -} -inline bool AppearanceFlags::_internal_bottom() const { - return _impl_.bottom_; -} -inline bool AppearanceFlags::bottom() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.bottom) - return _internal_bottom(); -} -inline void AppearanceFlags::_internal_set_bottom(bool value) { - _impl_._has_bits_[0] |= 0x00010000u; - _impl_.bottom_ = value; -} -inline void AppearanceFlags::set_bottom(bool value) { - _internal_set_bottom(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.bottom) -} - -// optional bool top = 4; -inline bool AppearanceFlags::_internal_has_top() const { - bool value = (_impl_._has_bits_[0] & 0x00020000u) != 0; - return value; -} -inline bool AppearanceFlags::has_top() const { - return _internal_has_top(); -} -inline void AppearanceFlags::clear_top() { - _impl_.top_ = false; - _impl_._has_bits_[0] &= ~0x00020000u; -} -inline bool AppearanceFlags::_internal_top() const { - return _impl_.top_; -} -inline bool AppearanceFlags::top() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.top) - return _internal_top(); -} -inline void AppearanceFlags::_internal_set_top(bool value) { - _impl_._has_bits_[0] |= 0x00020000u; - _impl_.top_ = value; -} -inline void AppearanceFlags::set_top(bool value) { - _internal_set_top(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.top) -} - -// optional bool container = 5; -inline bool AppearanceFlags::_internal_has_container() const { - bool value = (_impl_._has_bits_[0] & 0x00040000u) != 0; - return value; -} -inline bool AppearanceFlags::has_container() const { - return _internal_has_container(); -} -inline void AppearanceFlags::clear_container() { - _impl_.container_ = false; - _impl_._has_bits_[0] &= ~0x00040000u; -} -inline bool AppearanceFlags::_internal_container() const { - return _impl_.container_; -} -inline bool AppearanceFlags::container() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.container) - return _internal_container(); -} -inline void AppearanceFlags::_internal_set_container(bool value) { - _impl_._has_bits_[0] |= 0x00040000u; - _impl_.container_ = value; -} -inline void AppearanceFlags::set_container(bool value) { - _internal_set_container(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.container) -} - -// optional bool cumulative = 6; -inline bool AppearanceFlags::_internal_has_cumulative() const { - bool value = (_impl_._has_bits_[0] & 0x00080000u) != 0; - return value; -} -inline bool AppearanceFlags::has_cumulative() const { - return _internal_has_cumulative(); -} -inline void AppearanceFlags::clear_cumulative() { - _impl_.cumulative_ = false; - _impl_._has_bits_[0] &= ~0x00080000u; -} -inline bool AppearanceFlags::_internal_cumulative() const { - return _impl_.cumulative_; -} -inline bool AppearanceFlags::cumulative() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.cumulative) - return _internal_cumulative(); -} -inline void AppearanceFlags::_internal_set_cumulative(bool value) { - _impl_._has_bits_[0] |= 0x00080000u; - _impl_.cumulative_ = value; -} -inline void AppearanceFlags::set_cumulative(bool value) { - _internal_set_cumulative(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.cumulative) -} - -// optional bool usable = 7; -inline bool AppearanceFlags::_internal_has_usable() const { - bool value = (_impl_._has_bits_[0] & 0x00100000u) != 0; - return value; -} -inline bool AppearanceFlags::has_usable() const { - return _internal_has_usable(); -} -inline void AppearanceFlags::clear_usable() { - _impl_.usable_ = false; - _impl_._has_bits_[0] &= ~0x00100000u; -} -inline bool AppearanceFlags::_internal_usable() const { - return _impl_.usable_; -} -inline bool AppearanceFlags::usable() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.usable) - return _internal_usable(); -} -inline void AppearanceFlags::_internal_set_usable(bool value) { - _impl_._has_bits_[0] |= 0x00100000u; - _impl_.usable_ = value; -} -inline void AppearanceFlags::set_usable(bool value) { - _internal_set_usable(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.usable) -} - -// optional bool forceuse = 8; -inline bool AppearanceFlags::_internal_has_forceuse() const { - bool value = (_impl_._has_bits_[0] & 0x00200000u) != 0; - return value; -} -inline bool AppearanceFlags::has_forceuse() const { - return _internal_has_forceuse(); -} -inline void AppearanceFlags::clear_forceuse() { - _impl_.forceuse_ = false; - _impl_._has_bits_[0] &= ~0x00200000u; -} -inline bool AppearanceFlags::_internal_forceuse() const { - return _impl_.forceuse_; -} -inline bool AppearanceFlags::forceuse() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.forceuse) - return _internal_forceuse(); -} -inline void AppearanceFlags::_internal_set_forceuse(bool value) { - _impl_._has_bits_[0] |= 0x00200000u; - _impl_.forceuse_ = value; -} -inline void AppearanceFlags::set_forceuse(bool value) { - _internal_set_forceuse(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.forceuse) -} - -// optional bool multiuse = 9; -inline bool AppearanceFlags::_internal_has_multiuse() const { - bool value = (_impl_._has_bits_[0] & 0x00400000u) != 0; - return value; -} -inline bool AppearanceFlags::has_multiuse() const { - return _internal_has_multiuse(); -} -inline void AppearanceFlags::clear_multiuse() { - _impl_.multiuse_ = false; - _impl_._has_bits_[0] &= ~0x00400000u; -} -inline bool AppearanceFlags::_internal_multiuse() const { - return _impl_.multiuse_; -} -inline bool AppearanceFlags::multiuse() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.multiuse) - return _internal_multiuse(); -} -inline void AppearanceFlags::_internal_set_multiuse(bool value) { - _impl_._has_bits_[0] |= 0x00400000u; - _impl_.multiuse_ = value; -} -inline void AppearanceFlags::set_multiuse(bool value) { - _internal_set_multiuse(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.multiuse) -} - -// optional .Canary.protobuf.appearances.AppearanceFlagWrite write = 10; -inline bool AppearanceFlags::_internal_has_write() const { - bool value = (_impl_._has_bits_[0] & 0x00000002u) != 0; - PROTOBUF_ASSUME(!value || _impl_.write_ != nullptr); - return value; -} -inline bool AppearanceFlags::has_write() const { - return _internal_has_write(); -} -inline void AppearanceFlags::clear_write() { - if (_impl_.write_ != nullptr) _impl_.write_->Clear(); - _impl_._has_bits_[0] &= ~0x00000002u; -} -inline const ::Canary::protobuf::appearances::AppearanceFlagWrite& AppearanceFlags::_internal_write() const { - const ::Canary::protobuf::appearances::AppearanceFlagWrite* p = _impl_.write_; - return p != nullptr ? *p : reinterpret_cast( - ::Canary::protobuf::appearances::_AppearanceFlagWrite_default_instance_); -} -inline const ::Canary::protobuf::appearances::AppearanceFlagWrite& AppearanceFlags::write() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.write) - return _internal_write(); -} -inline void AppearanceFlags::unsafe_arena_set_allocated_write( - ::Canary::protobuf::appearances::AppearanceFlagWrite* write) { - if (GetArenaForAllocation() == nullptr) { - delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(_impl_.write_); - } - _impl_.write_ = write; - if (write) { - _impl_._has_bits_[0] |= 0x00000002u; - } else { - _impl_._has_bits_[0] &= ~0x00000002u; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.appearances.AppearanceFlags.write) -} -inline ::Canary::protobuf::appearances::AppearanceFlagWrite* AppearanceFlags::release_write() { - _impl_._has_bits_[0] &= ~0x00000002u; - ::Canary::protobuf::appearances::AppearanceFlagWrite* temp = _impl_.write_; - _impl_.write_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - if (GetArenaForAllocation() == nullptr) { delete old; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagWrite* AppearanceFlags::unsafe_arena_release_write() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.AppearanceFlags.write) - _impl_._has_bits_[0] &= ~0x00000002u; - ::Canary::protobuf::appearances::AppearanceFlagWrite* temp = _impl_.write_; - _impl_.write_ = nullptr; - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagWrite* AppearanceFlags::_internal_mutable_write() { - _impl_._has_bits_[0] |= 0x00000002u; - if (_impl_.write_ == nullptr) { - auto* p = CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagWrite>(GetArenaForAllocation()); - _impl_.write_ = p; - } - return _impl_.write_; -} -inline ::Canary::protobuf::appearances::AppearanceFlagWrite* AppearanceFlags::mutable_write() { - ::Canary::protobuf::appearances::AppearanceFlagWrite* _msg = _internal_mutable_write(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.AppearanceFlags.write) - return _msg; -} -inline void AppearanceFlags::set_allocated_write(::Canary::protobuf::appearances::AppearanceFlagWrite* write) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - if (message_arena == nullptr) { - delete _impl_.write_; - } - if (write) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(write); - if (message_arena != submessage_arena) { - write = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, write, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00000002u; - } else { - _impl_._has_bits_[0] &= ~0x00000002u; - } - _impl_.write_ = write; - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.AppearanceFlags.write) -} - -// optional .Canary.protobuf.appearances.AppearanceFlagWriteOnce write_once = 11; -inline bool AppearanceFlags::_internal_has_write_once() const { - bool value = (_impl_._has_bits_[0] & 0x00000004u) != 0; - PROTOBUF_ASSUME(!value || _impl_.write_once_ != nullptr); - return value; -} -inline bool AppearanceFlags::has_write_once() const { - return _internal_has_write_once(); -} -inline void AppearanceFlags::clear_write_once() { - if (_impl_.write_once_ != nullptr) _impl_.write_once_->Clear(); - _impl_._has_bits_[0] &= ~0x00000004u; -} -inline const ::Canary::protobuf::appearances::AppearanceFlagWriteOnce& AppearanceFlags::_internal_write_once() const { - const ::Canary::protobuf::appearances::AppearanceFlagWriteOnce* p = _impl_.write_once_; - return p != nullptr ? *p : reinterpret_cast( - ::Canary::protobuf::appearances::_AppearanceFlagWriteOnce_default_instance_); -} -inline const ::Canary::protobuf::appearances::AppearanceFlagWriteOnce& AppearanceFlags::write_once() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.write_once) - return _internal_write_once(); -} -inline void AppearanceFlags::unsafe_arena_set_allocated_write_once( - ::Canary::protobuf::appearances::AppearanceFlagWriteOnce* write_once) { - if (GetArenaForAllocation() == nullptr) { - delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(_impl_.write_once_); - } - _impl_.write_once_ = write_once; - if (write_once) { - _impl_._has_bits_[0] |= 0x00000004u; - } else { - _impl_._has_bits_[0] &= ~0x00000004u; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.appearances.AppearanceFlags.write_once) -} -inline ::Canary::protobuf::appearances::AppearanceFlagWriteOnce* AppearanceFlags::release_write_once() { - _impl_._has_bits_[0] &= ~0x00000004u; - ::Canary::protobuf::appearances::AppearanceFlagWriteOnce* temp = _impl_.write_once_; - _impl_.write_once_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - if (GetArenaForAllocation() == nullptr) { delete old; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagWriteOnce* AppearanceFlags::unsafe_arena_release_write_once() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.AppearanceFlags.write_once) - _impl_._has_bits_[0] &= ~0x00000004u; - ::Canary::protobuf::appearances::AppearanceFlagWriteOnce* temp = _impl_.write_once_; - _impl_.write_once_ = nullptr; - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagWriteOnce* AppearanceFlags::_internal_mutable_write_once() { - _impl_._has_bits_[0] |= 0x00000004u; - if (_impl_.write_once_ == nullptr) { - auto* p = CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagWriteOnce>(GetArenaForAllocation()); - _impl_.write_once_ = p; - } - return _impl_.write_once_; -} -inline ::Canary::protobuf::appearances::AppearanceFlagWriteOnce* AppearanceFlags::mutable_write_once() { - ::Canary::protobuf::appearances::AppearanceFlagWriteOnce* _msg = _internal_mutable_write_once(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.AppearanceFlags.write_once) - return _msg; -} -inline void AppearanceFlags::set_allocated_write_once(::Canary::protobuf::appearances::AppearanceFlagWriteOnce* write_once) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - if (message_arena == nullptr) { - delete _impl_.write_once_; - } - if (write_once) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(write_once); - if (message_arena != submessage_arena) { - write_once = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, write_once, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00000004u; - } else { - _impl_._has_bits_[0] &= ~0x00000004u; - } - _impl_.write_once_ = write_once; - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.AppearanceFlags.write_once) -} - -// optional bool liquidpool = 12; -inline bool AppearanceFlags::_internal_has_liquidpool() const { - bool value = (_impl_._has_bits_[0] & 0x00800000u) != 0; - return value; -} -inline bool AppearanceFlags::has_liquidpool() const { - return _internal_has_liquidpool(); -} -inline void AppearanceFlags::clear_liquidpool() { - _impl_.liquidpool_ = false; - _impl_._has_bits_[0] &= ~0x00800000u; -} -inline bool AppearanceFlags::_internal_liquidpool() const { - return _impl_.liquidpool_; -} -inline bool AppearanceFlags::liquidpool() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.liquidpool) - return _internal_liquidpool(); -} -inline void AppearanceFlags::_internal_set_liquidpool(bool value) { - _impl_._has_bits_[0] |= 0x00800000u; - _impl_.liquidpool_ = value; -} -inline void AppearanceFlags::set_liquidpool(bool value) { - _internal_set_liquidpool(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.liquidpool) -} - -// optional bool unpass = 13; -inline bool AppearanceFlags::_internal_has_unpass() const { - bool value = (_impl_._has_bits_[0] & 0x01000000u) != 0; - return value; -} -inline bool AppearanceFlags::has_unpass() const { - return _internal_has_unpass(); -} -inline void AppearanceFlags::clear_unpass() { - _impl_.unpass_ = false; - _impl_._has_bits_[0] &= ~0x01000000u; -} -inline bool AppearanceFlags::_internal_unpass() const { - return _impl_.unpass_; -} -inline bool AppearanceFlags::unpass() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.unpass) - return _internal_unpass(); -} -inline void AppearanceFlags::_internal_set_unpass(bool value) { - _impl_._has_bits_[0] |= 0x01000000u; - _impl_.unpass_ = value; -} -inline void AppearanceFlags::set_unpass(bool value) { - _internal_set_unpass(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.unpass) -} - -// optional bool unmove = 14; -inline bool AppearanceFlags::_internal_has_unmove() const { - bool value = (_impl_._has_bits_[0] & 0x02000000u) != 0; - return value; -} -inline bool AppearanceFlags::has_unmove() const { - return _internal_has_unmove(); -} -inline void AppearanceFlags::clear_unmove() { - _impl_.unmove_ = false; - _impl_._has_bits_[0] &= ~0x02000000u; -} -inline bool AppearanceFlags::_internal_unmove() const { - return _impl_.unmove_; -} -inline bool AppearanceFlags::unmove() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.unmove) - return _internal_unmove(); -} -inline void AppearanceFlags::_internal_set_unmove(bool value) { - _impl_._has_bits_[0] |= 0x02000000u; - _impl_.unmove_ = value; -} -inline void AppearanceFlags::set_unmove(bool value) { - _internal_set_unmove(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.unmove) -} - -// optional bool unsight = 15; -inline bool AppearanceFlags::_internal_has_unsight() const { - bool value = (_impl_._has_bits_[0] & 0x04000000u) != 0; - return value; -} -inline bool AppearanceFlags::has_unsight() const { - return _internal_has_unsight(); -} -inline void AppearanceFlags::clear_unsight() { - _impl_.unsight_ = false; - _impl_._has_bits_[0] &= ~0x04000000u; -} -inline bool AppearanceFlags::_internal_unsight() const { - return _impl_.unsight_; -} -inline bool AppearanceFlags::unsight() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.unsight) - return _internal_unsight(); -} -inline void AppearanceFlags::_internal_set_unsight(bool value) { - _impl_._has_bits_[0] |= 0x04000000u; - _impl_.unsight_ = value; -} -inline void AppearanceFlags::set_unsight(bool value) { - _internal_set_unsight(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.unsight) -} - -// optional bool avoid = 16; -inline bool AppearanceFlags::_internal_has_avoid() const { - bool value = (_impl_._has_bits_[0] & 0x08000000u) != 0; - return value; -} -inline bool AppearanceFlags::has_avoid() const { - return _internal_has_avoid(); -} -inline void AppearanceFlags::clear_avoid() { - _impl_.avoid_ = false; - _impl_._has_bits_[0] &= ~0x08000000u; -} -inline bool AppearanceFlags::_internal_avoid() const { - return _impl_.avoid_; -} -inline bool AppearanceFlags::avoid() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.avoid) - return _internal_avoid(); -} -inline void AppearanceFlags::_internal_set_avoid(bool value) { - _impl_._has_bits_[0] |= 0x08000000u; - _impl_.avoid_ = value; -} -inline void AppearanceFlags::set_avoid(bool value) { - _internal_set_avoid(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.avoid) -} - -// optional bool no_movement_animation = 17; -inline bool AppearanceFlags::_internal_has_no_movement_animation() const { - bool value = (_impl_._has_bits_[0] & 0x10000000u) != 0; - return value; -} -inline bool AppearanceFlags::has_no_movement_animation() const { - return _internal_has_no_movement_animation(); -} -inline void AppearanceFlags::clear_no_movement_animation() { - _impl_.no_movement_animation_ = false; - _impl_._has_bits_[0] &= ~0x10000000u; -} -inline bool AppearanceFlags::_internal_no_movement_animation() const { - return _impl_.no_movement_animation_; -} -inline bool AppearanceFlags::no_movement_animation() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.no_movement_animation) - return _internal_no_movement_animation(); -} -inline void AppearanceFlags::_internal_set_no_movement_animation(bool value) { - _impl_._has_bits_[0] |= 0x10000000u; - _impl_.no_movement_animation_ = value; -} -inline void AppearanceFlags::set_no_movement_animation(bool value) { - _internal_set_no_movement_animation(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.no_movement_animation) -} - -// optional bool take = 18; -inline bool AppearanceFlags::_internal_has_take() const { - bool value = (_impl_._has_bits_[0] & 0x20000000u) != 0; - return value; -} -inline bool AppearanceFlags::has_take() const { - return _internal_has_take(); -} -inline void AppearanceFlags::clear_take() { - _impl_.take_ = false; - _impl_._has_bits_[0] &= ~0x20000000u; -} -inline bool AppearanceFlags::_internal_take() const { - return _impl_.take_; -} -inline bool AppearanceFlags::take() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.take) - return _internal_take(); -} -inline void AppearanceFlags::_internal_set_take(bool value) { - _impl_._has_bits_[0] |= 0x20000000u; - _impl_.take_ = value; -} -inline void AppearanceFlags::set_take(bool value) { - _internal_set_take(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.take) -} - -// optional bool liquidcontainer = 19; -inline bool AppearanceFlags::_internal_has_liquidcontainer() const { - bool value = (_impl_._has_bits_[0] & 0x40000000u) != 0; - return value; -} -inline bool AppearanceFlags::has_liquidcontainer() const { - return _internal_has_liquidcontainer(); -} -inline void AppearanceFlags::clear_liquidcontainer() { - _impl_.liquidcontainer_ = false; - _impl_._has_bits_[0] &= ~0x40000000u; -} -inline bool AppearanceFlags::_internal_liquidcontainer() const { - return _impl_.liquidcontainer_; -} -inline bool AppearanceFlags::liquidcontainer() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.liquidcontainer) - return _internal_liquidcontainer(); -} -inline void AppearanceFlags::_internal_set_liquidcontainer(bool value) { - _impl_._has_bits_[0] |= 0x40000000u; - _impl_.liquidcontainer_ = value; -} -inline void AppearanceFlags::set_liquidcontainer(bool value) { - _internal_set_liquidcontainer(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.liquidcontainer) -} - -// optional bool hang = 20; -inline bool AppearanceFlags::_internal_has_hang() const { - bool value = (_impl_._has_bits_[0] & 0x80000000u) != 0; - return value; -} -inline bool AppearanceFlags::has_hang() const { - return _internal_has_hang(); -} -inline void AppearanceFlags::clear_hang() { - _impl_.hang_ = false; - _impl_._has_bits_[0] &= ~0x80000000u; -} -inline bool AppearanceFlags::_internal_hang() const { - return _impl_.hang_; -} -inline bool AppearanceFlags::hang() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.hang) - return _internal_hang(); -} -inline void AppearanceFlags::_internal_set_hang(bool value) { - _impl_._has_bits_[0] |= 0x80000000u; - _impl_.hang_ = value; -} -inline void AppearanceFlags::set_hang(bool value) { - _internal_set_hang(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.hang) -} - -// optional .Canary.protobuf.appearances.AppearanceFlagHook hook = 21; -inline bool AppearanceFlags::_internal_has_hook() const { - bool value = (_impl_._has_bits_[0] & 0x00000008u) != 0; - PROTOBUF_ASSUME(!value || _impl_.hook_ != nullptr); - return value; -} -inline bool AppearanceFlags::has_hook() const { - return _internal_has_hook(); -} -inline void AppearanceFlags::clear_hook() { - if (_impl_.hook_ != nullptr) _impl_.hook_->Clear(); - _impl_._has_bits_[0] &= ~0x00000008u; -} -inline const ::Canary::protobuf::appearances::AppearanceFlagHook& AppearanceFlags::_internal_hook() const { - const ::Canary::protobuf::appearances::AppearanceFlagHook* p = _impl_.hook_; - return p != nullptr ? *p : reinterpret_cast( - ::Canary::protobuf::appearances::_AppearanceFlagHook_default_instance_); -} -inline const ::Canary::protobuf::appearances::AppearanceFlagHook& AppearanceFlags::hook() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.hook) - return _internal_hook(); -} -inline void AppearanceFlags::unsafe_arena_set_allocated_hook( - ::Canary::protobuf::appearances::AppearanceFlagHook* hook) { - if (GetArenaForAllocation() == nullptr) { - delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(_impl_.hook_); - } - _impl_.hook_ = hook; - if (hook) { - _impl_._has_bits_[0] |= 0x00000008u; - } else { - _impl_._has_bits_[0] &= ~0x00000008u; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.appearances.AppearanceFlags.hook) -} -inline ::Canary::protobuf::appearances::AppearanceFlagHook* AppearanceFlags::release_hook() { - _impl_._has_bits_[0] &= ~0x00000008u; - ::Canary::protobuf::appearances::AppearanceFlagHook* temp = _impl_.hook_; - _impl_.hook_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - if (GetArenaForAllocation() == nullptr) { delete old; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagHook* AppearanceFlags::unsafe_arena_release_hook() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.AppearanceFlags.hook) - _impl_._has_bits_[0] &= ~0x00000008u; - ::Canary::protobuf::appearances::AppearanceFlagHook* temp = _impl_.hook_; - _impl_.hook_ = nullptr; - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagHook* AppearanceFlags::_internal_mutable_hook() { - _impl_._has_bits_[0] |= 0x00000008u; - if (_impl_.hook_ == nullptr) { - auto* p = CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagHook>(GetArenaForAllocation()); - _impl_.hook_ = p; - } - return _impl_.hook_; -} -inline ::Canary::protobuf::appearances::AppearanceFlagHook* AppearanceFlags::mutable_hook() { - ::Canary::protobuf::appearances::AppearanceFlagHook* _msg = _internal_mutable_hook(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.AppearanceFlags.hook) - return _msg; -} -inline void AppearanceFlags::set_allocated_hook(::Canary::protobuf::appearances::AppearanceFlagHook* hook) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - if (message_arena == nullptr) { - delete _impl_.hook_; - } - if (hook) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(hook); - if (message_arena != submessage_arena) { - hook = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, hook, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00000008u; - } else { - _impl_._has_bits_[0] &= ~0x00000008u; - } - _impl_.hook_ = hook; - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.AppearanceFlags.hook) -} - -// optional bool rotate = 22; -inline bool AppearanceFlags::_internal_has_rotate() const { - bool value = (_impl_._has_bits_[1] & 0x00000001u) != 0; - return value; -} -inline bool AppearanceFlags::has_rotate() const { - return _internal_has_rotate(); -} -inline void AppearanceFlags::clear_rotate() { - _impl_.rotate_ = false; - _impl_._has_bits_[1] &= ~0x00000001u; -} -inline bool AppearanceFlags::_internal_rotate() const { - return _impl_.rotate_; -} -inline bool AppearanceFlags::rotate() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.rotate) - return _internal_rotate(); -} -inline void AppearanceFlags::_internal_set_rotate(bool value) { - _impl_._has_bits_[1] |= 0x00000001u; - _impl_.rotate_ = value; -} -inline void AppearanceFlags::set_rotate(bool value) { - _internal_set_rotate(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.rotate) -} - -// optional .Canary.protobuf.appearances.AppearanceFlagLight light = 23; -inline bool AppearanceFlags::_internal_has_light() const { - bool value = (_impl_._has_bits_[0] & 0x00000010u) != 0; - PROTOBUF_ASSUME(!value || _impl_.light_ != nullptr); - return value; -} -inline bool AppearanceFlags::has_light() const { - return _internal_has_light(); -} -inline void AppearanceFlags::clear_light() { - if (_impl_.light_ != nullptr) _impl_.light_->Clear(); - _impl_._has_bits_[0] &= ~0x00000010u; -} -inline const ::Canary::protobuf::appearances::AppearanceFlagLight& AppearanceFlags::_internal_light() const { - const ::Canary::protobuf::appearances::AppearanceFlagLight* p = _impl_.light_; - return p != nullptr ? *p : reinterpret_cast( - ::Canary::protobuf::appearances::_AppearanceFlagLight_default_instance_); -} -inline const ::Canary::protobuf::appearances::AppearanceFlagLight& AppearanceFlags::light() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.light) - return _internal_light(); -} -inline void AppearanceFlags::unsafe_arena_set_allocated_light( - ::Canary::protobuf::appearances::AppearanceFlagLight* light) { - if (GetArenaForAllocation() == nullptr) { - delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(_impl_.light_); - } - _impl_.light_ = light; - if (light) { - _impl_._has_bits_[0] |= 0x00000010u; - } else { - _impl_._has_bits_[0] &= ~0x00000010u; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.appearances.AppearanceFlags.light) -} -inline ::Canary::protobuf::appearances::AppearanceFlagLight* AppearanceFlags::release_light() { - _impl_._has_bits_[0] &= ~0x00000010u; - ::Canary::protobuf::appearances::AppearanceFlagLight* temp = _impl_.light_; - _impl_.light_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - if (GetArenaForAllocation() == nullptr) { delete old; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagLight* AppearanceFlags::unsafe_arena_release_light() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.AppearanceFlags.light) - _impl_._has_bits_[0] &= ~0x00000010u; - ::Canary::protobuf::appearances::AppearanceFlagLight* temp = _impl_.light_; - _impl_.light_ = nullptr; - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagLight* AppearanceFlags::_internal_mutable_light() { - _impl_._has_bits_[0] |= 0x00000010u; - if (_impl_.light_ == nullptr) { - auto* p = CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagLight>(GetArenaForAllocation()); - _impl_.light_ = p; - } - return _impl_.light_; -} -inline ::Canary::protobuf::appearances::AppearanceFlagLight* AppearanceFlags::mutable_light() { - ::Canary::protobuf::appearances::AppearanceFlagLight* _msg = _internal_mutable_light(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.AppearanceFlags.light) - return _msg; -} -inline void AppearanceFlags::set_allocated_light(::Canary::protobuf::appearances::AppearanceFlagLight* light) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - if (message_arena == nullptr) { - delete _impl_.light_; - } - if (light) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(light); - if (message_arena != submessage_arena) { - light = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, light, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00000010u; - } else { - _impl_._has_bits_[0] &= ~0x00000010u; - } - _impl_.light_ = light; - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.AppearanceFlags.light) -} - -// optional bool dont_hide = 24; -inline bool AppearanceFlags::_internal_has_dont_hide() const { - bool value = (_impl_._has_bits_[1] & 0x00000002u) != 0; - return value; -} -inline bool AppearanceFlags::has_dont_hide() const { - return _internal_has_dont_hide(); -} -inline void AppearanceFlags::clear_dont_hide() { - _impl_.dont_hide_ = false; - _impl_._has_bits_[1] &= ~0x00000002u; -} -inline bool AppearanceFlags::_internal_dont_hide() const { - return _impl_.dont_hide_; -} -inline bool AppearanceFlags::dont_hide() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.dont_hide) - return _internal_dont_hide(); -} -inline void AppearanceFlags::_internal_set_dont_hide(bool value) { - _impl_._has_bits_[1] |= 0x00000002u; - _impl_.dont_hide_ = value; -} -inline void AppearanceFlags::set_dont_hide(bool value) { - _internal_set_dont_hide(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.dont_hide) -} - -// optional bool translucent = 25; -inline bool AppearanceFlags::_internal_has_translucent() const { - bool value = (_impl_._has_bits_[1] & 0x00000004u) != 0; - return value; -} -inline bool AppearanceFlags::has_translucent() const { - return _internal_has_translucent(); -} -inline void AppearanceFlags::clear_translucent() { - _impl_.translucent_ = false; - _impl_._has_bits_[1] &= ~0x00000004u; -} -inline bool AppearanceFlags::_internal_translucent() const { - return _impl_.translucent_; -} -inline bool AppearanceFlags::translucent() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.translucent) - return _internal_translucent(); -} -inline void AppearanceFlags::_internal_set_translucent(bool value) { - _impl_._has_bits_[1] |= 0x00000004u; - _impl_.translucent_ = value; -} -inline void AppearanceFlags::set_translucent(bool value) { - _internal_set_translucent(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.translucent) -} - -// optional .Canary.protobuf.appearances.AppearanceFlagShift shift = 26; -inline bool AppearanceFlags::_internal_has_shift() const { - bool value = (_impl_._has_bits_[0] & 0x00000020u) != 0; - PROTOBUF_ASSUME(!value || _impl_.shift_ != nullptr); - return value; -} -inline bool AppearanceFlags::has_shift() const { - return _internal_has_shift(); -} -inline void AppearanceFlags::clear_shift() { - if (_impl_.shift_ != nullptr) _impl_.shift_->Clear(); - _impl_._has_bits_[0] &= ~0x00000020u; -} -inline const ::Canary::protobuf::appearances::AppearanceFlagShift& AppearanceFlags::_internal_shift() const { - const ::Canary::protobuf::appearances::AppearanceFlagShift* p = _impl_.shift_; - return p != nullptr ? *p : reinterpret_cast( - ::Canary::protobuf::appearances::_AppearanceFlagShift_default_instance_); -} -inline const ::Canary::protobuf::appearances::AppearanceFlagShift& AppearanceFlags::shift() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.shift) - return _internal_shift(); -} -inline void AppearanceFlags::unsafe_arena_set_allocated_shift( - ::Canary::protobuf::appearances::AppearanceFlagShift* shift) { - if (GetArenaForAllocation() == nullptr) { - delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(_impl_.shift_); - } - _impl_.shift_ = shift; - if (shift) { - _impl_._has_bits_[0] |= 0x00000020u; - } else { - _impl_._has_bits_[0] &= ~0x00000020u; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.appearances.AppearanceFlags.shift) -} -inline ::Canary::protobuf::appearances::AppearanceFlagShift* AppearanceFlags::release_shift() { - _impl_._has_bits_[0] &= ~0x00000020u; - ::Canary::protobuf::appearances::AppearanceFlagShift* temp = _impl_.shift_; - _impl_.shift_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - if (GetArenaForAllocation() == nullptr) { delete old; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagShift* AppearanceFlags::unsafe_arena_release_shift() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.AppearanceFlags.shift) - _impl_._has_bits_[0] &= ~0x00000020u; - ::Canary::protobuf::appearances::AppearanceFlagShift* temp = _impl_.shift_; - _impl_.shift_ = nullptr; - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagShift* AppearanceFlags::_internal_mutable_shift() { - _impl_._has_bits_[0] |= 0x00000020u; - if (_impl_.shift_ == nullptr) { - auto* p = CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagShift>(GetArenaForAllocation()); - _impl_.shift_ = p; - } - return _impl_.shift_; -} -inline ::Canary::protobuf::appearances::AppearanceFlagShift* AppearanceFlags::mutable_shift() { - ::Canary::protobuf::appearances::AppearanceFlagShift* _msg = _internal_mutable_shift(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.AppearanceFlags.shift) - return _msg; -} -inline void AppearanceFlags::set_allocated_shift(::Canary::protobuf::appearances::AppearanceFlagShift* shift) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - if (message_arena == nullptr) { - delete _impl_.shift_; - } - if (shift) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(shift); - if (message_arena != submessage_arena) { - shift = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, shift, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00000020u; - } else { - _impl_._has_bits_[0] &= ~0x00000020u; - } - _impl_.shift_ = shift; - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.AppearanceFlags.shift) -} - -// optional .Canary.protobuf.appearances.AppearanceFlagHeight height = 27; -inline bool AppearanceFlags::_internal_has_height() const { - bool value = (_impl_._has_bits_[0] & 0x00000040u) != 0; - PROTOBUF_ASSUME(!value || _impl_.height_ != nullptr); - return value; -} -inline bool AppearanceFlags::has_height() const { - return _internal_has_height(); -} -inline void AppearanceFlags::clear_height() { - if (_impl_.height_ != nullptr) _impl_.height_->Clear(); - _impl_._has_bits_[0] &= ~0x00000040u; -} -inline const ::Canary::protobuf::appearances::AppearanceFlagHeight& AppearanceFlags::_internal_height() const { - const ::Canary::protobuf::appearances::AppearanceFlagHeight* p = _impl_.height_; - return p != nullptr ? *p : reinterpret_cast( - ::Canary::protobuf::appearances::_AppearanceFlagHeight_default_instance_); -} -inline const ::Canary::protobuf::appearances::AppearanceFlagHeight& AppearanceFlags::height() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.height) - return _internal_height(); -} -inline void AppearanceFlags::unsafe_arena_set_allocated_height( - ::Canary::protobuf::appearances::AppearanceFlagHeight* height) { - if (GetArenaForAllocation() == nullptr) { - delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(_impl_.height_); - } - _impl_.height_ = height; - if (height) { - _impl_._has_bits_[0] |= 0x00000040u; - } else { - _impl_._has_bits_[0] &= ~0x00000040u; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.appearances.AppearanceFlags.height) -} -inline ::Canary::protobuf::appearances::AppearanceFlagHeight* AppearanceFlags::release_height() { - _impl_._has_bits_[0] &= ~0x00000040u; - ::Canary::protobuf::appearances::AppearanceFlagHeight* temp = _impl_.height_; - _impl_.height_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - if (GetArenaForAllocation() == nullptr) { delete old; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagHeight* AppearanceFlags::unsafe_arena_release_height() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.AppearanceFlags.height) - _impl_._has_bits_[0] &= ~0x00000040u; - ::Canary::protobuf::appearances::AppearanceFlagHeight* temp = _impl_.height_; - _impl_.height_ = nullptr; - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagHeight* AppearanceFlags::_internal_mutable_height() { - _impl_._has_bits_[0] |= 0x00000040u; - if (_impl_.height_ == nullptr) { - auto* p = CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagHeight>(GetArenaForAllocation()); - _impl_.height_ = p; - } - return _impl_.height_; -} -inline ::Canary::protobuf::appearances::AppearanceFlagHeight* AppearanceFlags::mutable_height() { - ::Canary::protobuf::appearances::AppearanceFlagHeight* _msg = _internal_mutable_height(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.AppearanceFlags.height) - return _msg; -} -inline void AppearanceFlags::set_allocated_height(::Canary::protobuf::appearances::AppearanceFlagHeight* height) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - if (message_arena == nullptr) { - delete _impl_.height_; - } - if (height) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(height); - if (message_arena != submessage_arena) { - height = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, height, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00000040u; - } else { - _impl_._has_bits_[0] &= ~0x00000040u; - } - _impl_.height_ = height; - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.AppearanceFlags.height) -} - -// optional bool lying_object = 28; -inline bool AppearanceFlags::_internal_has_lying_object() const { - bool value = (_impl_._has_bits_[1] & 0x00000008u) != 0; - return value; -} -inline bool AppearanceFlags::has_lying_object() const { - return _internal_has_lying_object(); -} -inline void AppearanceFlags::clear_lying_object() { - _impl_.lying_object_ = false; - _impl_._has_bits_[1] &= ~0x00000008u; -} -inline bool AppearanceFlags::_internal_lying_object() const { - return _impl_.lying_object_; -} -inline bool AppearanceFlags::lying_object() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.lying_object) - return _internal_lying_object(); -} -inline void AppearanceFlags::_internal_set_lying_object(bool value) { - _impl_._has_bits_[1] |= 0x00000008u; - _impl_.lying_object_ = value; -} -inline void AppearanceFlags::set_lying_object(bool value) { - _internal_set_lying_object(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.lying_object) -} - -// optional bool animate_always = 29; -inline bool AppearanceFlags::_internal_has_animate_always() const { - bool value = (_impl_._has_bits_[1] & 0x00000010u) != 0; - return value; -} -inline bool AppearanceFlags::has_animate_always() const { - return _internal_has_animate_always(); -} -inline void AppearanceFlags::clear_animate_always() { - _impl_.animate_always_ = false; - _impl_._has_bits_[1] &= ~0x00000010u; -} -inline bool AppearanceFlags::_internal_animate_always() const { - return _impl_.animate_always_; -} -inline bool AppearanceFlags::animate_always() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.animate_always) - return _internal_animate_always(); -} -inline void AppearanceFlags::_internal_set_animate_always(bool value) { - _impl_._has_bits_[1] |= 0x00000010u; - _impl_.animate_always_ = value; -} -inline void AppearanceFlags::set_animate_always(bool value) { - _internal_set_animate_always(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.animate_always) -} - -// optional .Canary.protobuf.appearances.AppearanceFlagAutomap automap = 30; -inline bool AppearanceFlags::_internal_has_automap() const { - bool value = (_impl_._has_bits_[0] & 0x00000080u) != 0; - PROTOBUF_ASSUME(!value || _impl_.automap_ != nullptr); - return value; -} -inline bool AppearanceFlags::has_automap() const { - return _internal_has_automap(); -} -inline void AppearanceFlags::clear_automap() { - if (_impl_.automap_ != nullptr) _impl_.automap_->Clear(); - _impl_._has_bits_[0] &= ~0x00000080u; -} -inline const ::Canary::protobuf::appearances::AppearanceFlagAutomap& AppearanceFlags::_internal_automap() const { - const ::Canary::protobuf::appearances::AppearanceFlagAutomap* p = _impl_.automap_; - return p != nullptr ? *p : reinterpret_cast( - ::Canary::protobuf::appearances::_AppearanceFlagAutomap_default_instance_); -} -inline const ::Canary::protobuf::appearances::AppearanceFlagAutomap& AppearanceFlags::automap() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.automap) - return _internal_automap(); -} -inline void AppearanceFlags::unsafe_arena_set_allocated_automap( - ::Canary::protobuf::appearances::AppearanceFlagAutomap* automap) { - if (GetArenaForAllocation() == nullptr) { - delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(_impl_.automap_); - } - _impl_.automap_ = automap; - if (automap) { - _impl_._has_bits_[0] |= 0x00000080u; - } else { - _impl_._has_bits_[0] &= ~0x00000080u; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.appearances.AppearanceFlags.automap) -} -inline ::Canary::protobuf::appearances::AppearanceFlagAutomap* AppearanceFlags::release_automap() { - _impl_._has_bits_[0] &= ~0x00000080u; - ::Canary::protobuf::appearances::AppearanceFlagAutomap* temp = _impl_.automap_; - _impl_.automap_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - if (GetArenaForAllocation() == nullptr) { delete old; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagAutomap* AppearanceFlags::unsafe_arena_release_automap() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.AppearanceFlags.automap) - _impl_._has_bits_[0] &= ~0x00000080u; - ::Canary::protobuf::appearances::AppearanceFlagAutomap* temp = _impl_.automap_; - _impl_.automap_ = nullptr; - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagAutomap* AppearanceFlags::_internal_mutable_automap() { - _impl_._has_bits_[0] |= 0x00000080u; - if (_impl_.automap_ == nullptr) { - auto* p = CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagAutomap>(GetArenaForAllocation()); - _impl_.automap_ = p; - } - return _impl_.automap_; -} -inline ::Canary::protobuf::appearances::AppearanceFlagAutomap* AppearanceFlags::mutable_automap() { - ::Canary::protobuf::appearances::AppearanceFlagAutomap* _msg = _internal_mutable_automap(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.AppearanceFlags.automap) - return _msg; -} -inline void AppearanceFlags::set_allocated_automap(::Canary::protobuf::appearances::AppearanceFlagAutomap* automap) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - if (message_arena == nullptr) { - delete _impl_.automap_; - } - if (automap) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(automap); - if (message_arena != submessage_arena) { - automap = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, automap, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00000080u; - } else { - _impl_._has_bits_[0] &= ~0x00000080u; - } - _impl_.automap_ = automap; - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.AppearanceFlags.automap) -} - -// optional .Canary.protobuf.appearances.AppearanceFlagLenshelp lenshelp = 31; -inline bool AppearanceFlags::_internal_has_lenshelp() const { - bool value = (_impl_._has_bits_[0] & 0x00000100u) != 0; - PROTOBUF_ASSUME(!value || _impl_.lenshelp_ != nullptr); - return value; -} -inline bool AppearanceFlags::has_lenshelp() const { - return _internal_has_lenshelp(); -} -inline void AppearanceFlags::clear_lenshelp() { - if (_impl_.lenshelp_ != nullptr) _impl_.lenshelp_->Clear(); - _impl_._has_bits_[0] &= ~0x00000100u; -} -inline const ::Canary::protobuf::appearances::AppearanceFlagLenshelp& AppearanceFlags::_internal_lenshelp() const { - const ::Canary::protobuf::appearances::AppearanceFlagLenshelp* p = _impl_.lenshelp_; - return p != nullptr ? *p : reinterpret_cast( - ::Canary::protobuf::appearances::_AppearanceFlagLenshelp_default_instance_); -} -inline const ::Canary::protobuf::appearances::AppearanceFlagLenshelp& AppearanceFlags::lenshelp() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.lenshelp) - return _internal_lenshelp(); -} -inline void AppearanceFlags::unsafe_arena_set_allocated_lenshelp( - ::Canary::protobuf::appearances::AppearanceFlagLenshelp* lenshelp) { - if (GetArenaForAllocation() == nullptr) { - delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(_impl_.lenshelp_); - } - _impl_.lenshelp_ = lenshelp; - if (lenshelp) { - _impl_._has_bits_[0] |= 0x00000100u; - } else { - _impl_._has_bits_[0] &= ~0x00000100u; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.appearances.AppearanceFlags.lenshelp) -} -inline ::Canary::protobuf::appearances::AppearanceFlagLenshelp* AppearanceFlags::release_lenshelp() { - _impl_._has_bits_[0] &= ~0x00000100u; - ::Canary::protobuf::appearances::AppearanceFlagLenshelp* temp = _impl_.lenshelp_; - _impl_.lenshelp_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - if (GetArenaForAllocation() == nullptr) { delete old; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagLenshelp* AppearanceFlags::unsafe_arena_release_lenshelp() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.AppearanceFlags.lenshelp) - _impl_._has_bits_[0] &= ~0x00000100u; - ::Canary::protobuf::appearances::AppearanceFlagLenshelp* temp = _impl_.lenshelp_; - _impl_.lenshelp_ = nullptr; - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagLenshelp* AppearanceFlags::_internal_mutable_lenshelp() { - _impl_._has_bits_[0] |= 0x00000100u; - if (_impl_.lenshelp_ == nullptr) { - auto* p = CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagLenshelp>(GetArenaForAllocation()); - _impl_.lenshelp_ = p; - } - return _impl_.lenshelp_; -} -inline ::Canary::protobuf::appearances::AppearanceFlagLenshelp* AppearanceFlags::mutable_lenshelp() { - ::Canary::protobuf::appearances::AppearanceFlagLenshelp* _msg = _internal_mutable_lenshelp(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.AppearanceFlags.lenshelp) - return _msg; -} -inline void AppearanceFlags::set_allocated_lenshelp(::Canary::protobuf::appearances::AppearanceFlagLenshelp* lenshelp) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - if (message_arena == nullptr) { - delete _impl_.lenshelp_; - } - if (lenshelp) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(lenshelp); - if (message_arena != submessage_arena) { - lenshelp = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, lenshelp, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00000100u; - } else { - _impl_._has_bits_[0] &= ~0x00000100u; - } - _impl_.lenshelp_ = lenshelp; - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.AppearanceFlags.lenshelp) -} - -// optional bool fullbank = 32; -inline bool AppearanceFlags::_internal_has_fullbank() const { - bool value = (_impl_._has_bits_[1] & 0x00000020u) != 0; - return value; -} -inline bool AppearanceFlags::has_fullbank() const { - return _internal_has_fullbank(); -} -inline void AppearanceFlags::clear_fullbank() { - _impl_.fullbank_ = false; - _impl_._has_bits_[1] &= ~0x00000020u; -} -inline bool AppearanceFlags::_internal_fullbank() const { - return _impl_.fullbank_; -} -inline bool AppearanceFlags::fullbank() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.fullbank) - return _internal_fullbank(); -} -inline void AppearanceFlags::_internal_set_fullbank(bool value) { - _impl_._has_bits_[1] |= 0x00000020u; - _impl_.fullbank_ = value; -} -inline void AppearanceFlags::set_fullbank(bool value) { - _internal_set_fullbank(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.fullbank) -} - -// optional bool ignore_look = 33; -inline bool AppearanceFlags::_internal_has_ignore_look() const { - bool value = (_impl_._has_bits_[1] & 0x00000040u) != 0; - return value; -} -inline bool AppearanceFlags::has_ignore_look() const { - return _internal_has_ignore_look(); -} -inline void AppearanceFlags::clear_ignore_look() { - _impl_.ignore_look_ = false; - _impl_._has_bits_[1] &= ~0x00000040u; -} -inline bool AppearanceFlags::_internal_ignore_look() const { - return _impl_.ignore_look_; -} -inline bool AppearanceFlags::ignore_look() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.ignore_look) - return _internal_ignore_look(); -} -inline void AppearanceFlags::_internal_set_ignore_look(bool value) { - _impl_._has_bits_[1] |= 0x00000040u; - _impl_.ignore_look_ = value; -} -inline void AppearanceFlags::set_ignore_look(bool value) { - _internal_set_ignore_look(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.ignore_look) -} - -// optional .Canary.protobuf.appearances.AppearanceFlagClothes clothes = 34; -inline bool AppearanceFlags::_internal_has_clothes() const { - bool value = (_impl_._has_bits_[0] & 0x00000200u) != 0; - PROTOBUF_ASSUME(!value || _impl_.clothes_ != nullptr); - return value; -} -inline bool AppearanceFlags::has_clothes() const { - return _internal_has_clothes(); -} -inline void AppearanceFlags::clear_clothes() { - if (_impl_.clothes_ != nullptr) _impl_.clothes_->Clear(); - _impl_._has_bits_[0] &= ~0x00000200u; -} -inline const ::Canary::protobuf::appearances::AppearanceFlagClothes& AppearanceFlags::_internal_clothes() const { - const ::Canary::protobuf::appearances::AppearanceFlagClothes* p = _impl_.clothes_; - return p != nullptr ? *p : reinterpret_cast( - ::Canary::protobuf::appearances::_AppearanceFlagClothes_default_instance_); -} -inline const ::Canary::protobuf::appearances::AppearanceFlagClothes& AppearanceFlags::clothes() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.clothes) - return _internal_clothes(); -} -inline void AppearanceFlags::unsafe_arena_set_allocated_clothes( - ::Canary::protobuf::appearances::AppearanceFlagClothes* clothes) { - if (GetArenaForAllocation() == nullptr) { - delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(_impl_.clothes_); - } - _impl_.clothes_ = clothes; - if (clothes) { - _impl_._has_bits_[0] |= 0x00000200u; - } else { - _impl_._has_bits_[0] &= ~0x00000200u; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.appearances.AppearanceFlags.clothes) -} -inline ::Canary::protobuf::appearances::AppearanceFlagClothes* AppearanceFlags::release_clothes() { - _impl_._has_bits_[0] &= ~0x00000200u; - ::Canary::protobuf::appearances::AppearanceFlagClothes* temp = _impl_.clothes_; - _impl_.clothes_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - if (GetArenaForAllocation() == nullptr) { delete old; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagClothes* AppearanceFlags::unsafe_arena_release_clothes() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.AppearanceFlags.clothes) - _impl_._has_bits_[0] &= ~0x00000200u; - ::Canary::protobuf::appearances::AppearanceFlagClothes* temp = _impl_.clothes_; - _impl_.clothes_ = nullptr; - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagClothes* AppearanceFlags::_internal_mutable_clothes() { - _impl_._has_bits_[0] |= 0x00000200u; - if (_impl_.clothes_ == nullptr) { - auto* p = CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagClothes>(GetArenaForAllocation()); - _impl_.clothes_ = p; - } - return _impl_.clothes_; -} -inline ::Canary::protobuf::appearances::AppearanceFlagClothes* AppearanceFlags::mutable_clothes() { - ::Canary::protobuf::appearances::AppearanceFlagClothes* _msg = _internal_mutable_clothes(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.AppearanceFlags.clothes) - return _msg; -} -inline void AppearanceFlags::set_allocated_clothes(::Canary::protobuf::appearances::AppearanceFlagClothes* clothes) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - if (message_arena == nullptr) { - delete _impl_.clothes_; - } - if (clothes) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(clothes); - if (message_arena != submessage_arena) { - clothes = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, clothes, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00000200u; - } else { - _impl_._has_bits_[0] &= ~0x00000200u; - } - _impl_.clothes_ = clothes; - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.AppearanceFlags.clothes) -} - -// optional .Canary.protobuf.appearances.AppearanceFlagDefaultAction default_action = 35; -inline bool AppearanceFlags::_internal_has_default_action() const { - bool value = (_impl_._has_bits_[0] & 0x00000400u) != 0; - PROTOBUF_ASSUME(!value || _impl_.default_action_ != nullptr); - return value; -} -inline bool AppearanceFlags::has_default_action() const { - return _internal_has_default_action(); -} -inline void AppearanceFlags::clear_default_action() { - if (_impl_.default_action_ != nullptr) _impl_.default_action_->Clear(); - _impl_._has_bits_[0] &= ~0x00000400u; -} -inline const ::Canary::protobuf::appearances::AppearanceFlagDefaultAction& AppearanceFlags::_internal_default_action() const { - const ::Canary::protobuf::appearances::AppearanceFlagDefaultAction* p = _impl_.default_action_; - return p != nullptr ? *p : reinterpret_cast( - ::Canary::protobuf::appearances::_AppearanceFlagDefaultAction_default_instance_); -} -inline const ::Canary::protobuf::appearances::AppearanceFlagDefaultAction& AppearanceFlags::default_action() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.default_action) - return _internal_default_action(); -} -inline void AppearanceFlags::unsafe_arena_set_allocated_default_action( - ::Canary::protobuf::appearances::AppearanceFlagDefaultAction* default_action) { - if (GetArenaForAllocation() == nullptr) { - delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(_impl_.default_action_); - } - _impl_.default_action_ = default_action; - if (default_action) { - _impl_._has_bits_[0] |= 0x00000400u; - } else { - _impl_._has_bits_[0] &= ~0x00000400u; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.appearances.AppearanceFlags.default_action) -} -inline ::Canary::protobuf::appearances::AppearanceFlagDefaultAction* AppearanceFlags::release_default_action() { - _impl_._has_bits_[0] &= ~0x00000400u; - ::Canary::protobuf::appearances::AppearanceFlagDefaultAction* temp = _impl_.default_action_; - _impl_.default_action_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - if (GetArenaForAllocation() == nullptr) { delete old; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagDefaultAction* AppearanceFlags::unsafe_arena_release_default_action() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.AppearanceFlags.default_action) - _impl_._has_bits_[0] &= ~0x00000400u; - ::Canary::protobuf::appearances::AppearanceFlagDefaultAction* temp = _impl_.default_action_; - _impl_.default_action_ = nullptr; - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagDefaultAction* AppearanceFlags::_internal_mutable_default_action() { - _impl_._has_bits_[0] |= 0x00000400u; - if (_impl_.default_action_ == nullptr) { - auto* p = CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagDefaultAction>(GetArenaForAllocation()); - _impl_.default_action_ = p; - } - return _impl_.default_action_; -} -inline ::Canary::protobuf::appearances::AppearanceFlagDefaultAction* AppearanceFlags::mutable_default_action() { - ::Canary::protobuf::appearances::AppearanceFlagDefaultAction* _msg = _internal_mutable_default_action(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.AppearanceFlags.default_action) - return _msg; -} -inline void AppearanceFlags::set_allocated_default_action(::Canary::protobuf::appearances::AppearanceFlagDefaultAction* default_action) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - if (message_arena == nullptr) { - delete _impl_.default_action_; - } - if (default_action) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(default_action); - if (message_arena != submessage_arena) { - default_action = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, default_action, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00000400u; - } else { - _impl_._has_bits_[0] &= ~0x00000400u; - } - _impl_.default_action_ = default_action; - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.AppearanceFlags.default_action) -} - -// optional .Canary.protobuf.appearances.AppearanceFlagMarket market = 36; -inline bool AppearanceFlags::_internal_has_market() const { - bool value = (_impl_._has_bits_[0] & 0x00000800u) != 0; - PROTOBUF_ASSUME(!value || _impl_.market_ != nullptr); - return value; -} -inline bool AppearanceFlags::has_market() const { - return _internal_has_market(); -} -inline void AppearanceFlags::clear_market() { - if (_impl_.market_ != nullptr) _impl_.market_->Clear(); - _impl_._has_bits_[0] &= ~0x00000800u; -} -inline const ::Canary::protobuf::appearances::AppearanceFlagMarket& AppearanceFlags::_internal_market() const { - const ::Canary::protobuf::appearances::AppearanceFlagMarket* p = _impl_.market_; - return p != nullptr ? *p : reinterpret_cast( - ::Canary::protobuf::appearances::_AppearanceFlagMarket_default_instance_); -} -inline const ::Canary::protobuf::appearances::AppearanceFlagMarket& AppearanceFlags::market() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.market) - return _internal_market(); -} -inline void AppearanceFlags::unsafe_arena_set_allocated_market( - ::Canary::protobuf::appearances::AppearanceFlagMarket* market) { - if (GetArenaForAllocation() == nullptr) { - delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(_impl_.market_); - } - _impl_.market_ = market; - if (market) { - _impl_._has_bits_[0] |= 0x00000800u; - } else { - _impl_._has_bits_[0] &= ~0x00000800u; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.appearances.AppearanceFlags.market) -} -inline ::Canary::protobuf::appearances::AppearanceFlagMarket* AppearanceFlags::release_market() { - _impl_._has_bits_[0] &= ~0x00000800u; - ::Canary::protobuf::appearances::AppearanceFlagMarket* temp = _impl_.market_; - _impl_.market_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - if (GetArenaForAllocation() == nullptr) { delete old; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagMarket* AppearanceFlags::unsafe_arena_release_market() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.AppearanceFlags.market) - _impl_._has_bits_[0] &= ~0x00000800u; - ::Canary::protobuf::appearances::AppearanceFlagMarket* temp = _impl_.market_; - _impl_.market_ = nullptr; - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagMarket* AppearanceFlags::_internal_mutable_market() { - _impl_._has_bits_[0] |= 0x00000800u; - if (_impl_.market_ == nullptr) { - auto* p = CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagMarket>(GetArenaForAllocation()); - _impl_.market_ = p; - } - return _impl_.market_; -} -inline ::Canary::protobuf::appearances::AppearanceFlagMarket* AppearanceFlags::mutable_market() { - ::Canary::protobuf::appearances::AppearanceFlagMarket* _msg = _internal_mutable_market(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.AppearanceFlags.market) - return _msg; -} -inline void AppearanceFlags::set_allocated_market(::Canary::protobuf::appearances::AppearanceFlagMarket* market) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - if (message_arena == nullptr) { - delete _impl_.market_; - } - if (market) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(market); - if (message_arena != submessage_arena) { - market = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, market, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00000800u; - } else { - _impl_._has_bits_[0] &= ~0x00000800u; - } - _impl_.market_ = market; - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.AppearanceFlags.market) -} - -// optional bool wrap = 37; -inline bool AppearanceFlags::_internal_has_wrap() const { - bool value = (_impl_._has_bits_[1] & 0x00000080u) != 0; - return value; -} -inline bool AppearanceFlags::has_wrap() const { - return _internal_has_wrap(); -} -inline void AppearanceFlags::clear_wrap() { - _impl_.wrap_ = false; - _impl_._has_bits_[1] &= ~0x00000080u; -} -inline bool AppearanceFlags::_internal_wrap() const { - return _impl_.wrap_; -} -inline bool AppearanceFlags::wrap() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.wrap) - return _internal_wrap(); -} -inline void AppearanceFlags::_internal_set_wrap(bool value) { - _impl_._has_bits_[1] |= 0x00000080u; - _impl_.wrap_ = value; -} -inline void AppearanceFlags::set_wrap(bool value) { - _internal_set_wrap(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.wrap) -} - -// optional bool unwrap = 38; -inline bool AppearanceFlags::_internal_has_unwrap() const { - bool value = (_impl_._has_bits_[1] & 0x00000100u) != 0; - return value; -} -inline bool AppearanceFlags::has_unwrap() const { - return _internal_has_unwrap(); -} -inline void AppearanceFlags::clear_unwrap() { - _impl_.unwrap_ = false; - _impl_._has_bits_[1] &= ~0x00000100u; -} -inline bool AppearanceFlags::_internal_unwrap() const { - return _impl_.unwrap_; -} -inline bool AppearanceFlags::unwrap() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.unwrap) - return _internal_unwrap(); -} -inline void AppearanceFlags::_internal_set_unwrap(bool value) { - _impl_._has_bits_[1] |= 0x00000100u; - _impl_.unwrap_ = value; -} -inline void AppearanceFlags::set_unwrap(bool value) { - _internal_set_unwrap(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.unwrap) -} - -// optional bool topeffect = 39; -inline bool AppearanceFlags::_internal_has_topeffect() const { - bool value = (_impl_._has_bits_[1] & 0x00000200u) != 0; - return value; -} -inline bool AppearanceFlags::has_topeffect() const { - return _internal_has_topeffect(); -} -inline void AppearanceFlags::clear_topeffect() { - _impl_.topeffect_ = false; - _impl_._has_bits_[1] &= ~0x00000200u; -} -inline bool AppearanceFlags::_internal_topeffect() const { - return _impl_.topeffect_; -} -inline bool AppearanceFlags::topeffect() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.topeffect) - return _internal_topeffect(); -} -inline void AppearanceFlags::_internal_set_topeffect(bool value) { - _impl_._has_bits_[1] |= 0x00000200u; - _impl_.topeffect_ = value; -} -inline void AppearanceFlags::set_topeffect(bool value) { - _internal_set_topeffect(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.topeffect) -} - -// repeated .Canary.protobuf.appearances.AppearanceFlagNPC npcsaledata = 40; -inline int AppearanceFlags::_internal_npcsaledata_size() const { - return _impl_.npcsaledata_.size(); -} -inline int AppearanceFlags::npcsaledata_size() const { - return _internal_npcsaledata_size(); -} -inline void AppearanceFlags::clear_npcsaledata() { - _impl_.npcsaledata_.Clear(); -} -inline ::Canary::protobuf::appearances::AppearanceFlagNPC* AppearanceFlags::mutable_npcsaledata(int index) { - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.AppearanceFlags.npcsaledata) - return _impl_.npcsaledata_.Mutable(index); -} -inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::AppearanceFlagNPC >* -AppearanceFlags::mutable_npcsaledata() { - // @@protoc_insertion_point(field_mutable_list:Canary.protobuf.appearances.AppearanceFlags.npcsaledata) - return &_impl_.npcsaledata_; -} -inline const ::Canary::protobuf::appearances::AppearanceFlagNPC& AppearanceFlags::_internal_npcsaledata(int index) const { - return _impl_.npcsaledata_.Get(index); -} -inline const ::Canary::protobuf::appearances::AppearanceFlagNPC& AppearanceFlags::npcsaledata(int index) const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.npcsaledata) - return _internal_npcsaledata(index); -} -inline ::Canary::protobuf::appearances::AppearanceFlagNPC* AppearanceFlags::_internal_add_npcsaledata() { - return _impl_.npcsaledata_.Add(); -} -inline ::Canary::protobuf::appearances::AppearanceFlagNPC* AppearanceFlags::add_npcsaledata() { - ::Canary::protobuf::appearances::AppearanceFlagNPC* _add = _internal_add_npcsaledata(); - // @@protoc_insertion_point(field_add:Canary.protobuf.appearances.AppearanceFlags.npcsaledata) - return _add; -} -inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::appearances::AppearanceFlagNPC >& -AppearanceFlags::npcsaledata() const { - // @@protoc_insertion_point(field_list:Canary.protobuf.appearances.AppearanceFlags.npcsaledata) - return _impl_.npcsaledata_; -} - -// optional .Canary.protobuf.appearances.AppearanceFlagChangedToExpire changedtoexpire = 41; -inline bool AppearanceFlags::_internal_has_changedtoexpire() const { - bool value = (_impl_._has_bits_[0] & 0x00001000u) != 0; - PROTOBUF_ASSUME(!value || _impl_.changedtoexpire_ != nullptr); - return value; -} -inline bool AppearanceFlags::has_changedtoexpire() const { - return _internal_has_changedtoexpire(); -} -inline void AppearanceFlags::clear_changedtoexpire() { - if (_impl_.changedtoexpire_ != nullptr) _impl_.changedtoexpire_->Clear(); - _impl_._has_bits_[0] &= ~0x00001000u; -} -inline const ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire& AppearanceFlags::_internal_changedtoexpire() const { - const ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire* p = _impl_.changedtoexpire_; - return p != nullptr ? *p : reinterpret_cast( - ::Canary::protobuf::appearances::_AppearanceFlagChangedToExpire_default_instance_); -} -inline const ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire& AppearanceFlags::changedtoexpire() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.changedtoexpire) - return _internal_changedtoexpire(); -} -inline void AppearanceFlags::unsafe_arena_set_allocated_changedtoexpire( - ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire* changedtoexpire) { - if (GetArenaForAllocation() == nullptr) { - delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(_impl_.changedtoexpire_); - } - _impl_.changedtoexpire_ = changedtoexpire; - if (changedtoexpire) { - _impl_._has_bits_[0] |= 0x00001000u; - } else { - _impl_._has_bits_[0] &= ~0x00001000u; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.appearances.AppearanceFlags.changedtoexpire) -} -inline ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire* AppearanceFlags::release_changedtoexpire() { - _impl_._has_bits_[0] &= ~0x00001000u; - ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire* temp = _impl_.changedtoexpire_; - _impl_.changedtoexpire_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - if (GetArenaForAllocation() == nullptr) { delete old; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire* AppearanceFlags::unsafe_arena_release_changedtoexpire() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.AppearanceFlags.changedtoexpire) - _impl_._has_bits_[0] &= ~0x00001000u; - ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire* temp = _impl_.changedtoexpire_; - _impl_.changedtoexpire_ = nullptr; - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire* AppearanceFlags::_internal_mutable_changedtoexpire() { - _impl_._has_bits_[0] |= 0x00001000u; - if (_impl_.changedtoexpire_ == nullptr) { - auto* p = CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagChangedToExpire>(GetArenaForAllocation()); - _impl_.changedtoexpire_ = p; - } - return _impl_.changedtoexpire_; -} -inline ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire* AppearanceFlags::mutable_changedtoexpire() { - ::Canary::protobuf::appearances::AppearanceFlagChangedToExpire* _msg = _internal_mutable_changedtoexpire(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.AppearanceFlags.changedtoexpire) - return _msg; -} -inline void AppearanceFlags::set_allocated_changedtoexpire(::Canary::protobuf::appearances::AppearanceFlagChangedToExpire* changedtoexpire) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - if (message_arena == nullptr) { - delete _impl_.changedtoexpire_; - } - if (changedtoexpire) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(changedtoexpire); - if (message_arena != submessage_arena) { - changedtoexpire = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, changedtoexpire, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00001000u; - } else { - _impl_._has_bits_[0] &= ~0x00001000u; - } - _impl_.changedtoexpire_ = changedtoexpire; - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.AppearanceFlags.changedtoexpire) -} - -// optional bool corpse = 42; -inline bool AppearanceFlags::_internal_has_corpse() const { - bool value = (_impl_._has_bits_[1] & 0x00000400u) != 0; - return value; -} -inline bool AppearanceFlags::has_corpse() const { - return _internal_has_corpse(); -} -inline void AppearanceFlags::clear_corpse() { - _impl_.corpse_ = false; - _impl_._has_bits_[1] &= ~0x00000400u; -} -inline bool AppearanceFlags::_internal_corpse() const { - return _impl_.corpse_; -} -inline bool AppearanceFlags::corpse() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.corpse) - return _internal_corpse(); -} -inline void AppearanceFlags::_internal_set_corpse(bool value) { - _impl_._has_bits_[1] |= 0x00000400u; - _impl_.corpse_ = value; -} -inline void AppearanceFlags::set_corpse(bool value) { - _internal_set_corpse(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.corpse) -} - -// optional bool player_corpse = 43; -inline bool AppearanceFlags::_internal_has_player_corpse() const { - bool value = (_impl_._has_bits_[1] & 0x00000800u) != 0; - return value; -} -inline bool AppearanceFlags::has_player_corpse() const { - return _internal_has_player_corpse(); -} -inline void AppearanceFlags::clear_player_corpse() { - _impl_.player_corpse_ = false; - _impl_._has_bits_[1] &= ~0x00000800u; -} -inline bool AppearanceFlags::_internal_player_corpse() const { - return _impl_.player_corpse_; -} -inline bool AppearanceFlags::player_corpse() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.player_corpse) - return _internal_player_corpse(); -} -inline void AppearanceFlags::_internal_set_player_corpse(bool value) { - _impl_._has_bits_[1] |= 0x00000800u; - _impl_.player_corpse_ = value; -} -inline void AppearanceFlags::set_player_corpse(bool value) { - _internal_set_player_corpse(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.player_corpse) -} - -// optional .Canary.protobuf.appearances.AppearanceFlagCyclopedia cyclopediaitem = 44; -inline bool AppearanceFlags::_internal_has_cyclopediaitem() const { - bool value = (_impl_._has_bits_[0] & 0x00002000u) != 0; - PROTOBUF_ASSUME(!value || _impl_.cyclopediaitem_ != nullptr); - return value; -} -inline bool AppearanceFlags::has_cyclopediaitem() const { - return _internal_has_cyclopediaitem(); -} -inline void AppearanceFlags::clear_cyclopediaitem() { - if (_impl_.cyclopediaitem_ != nullptr) _impl_.cyclopediaitem_->Clear(); - _impl_._has_bits_[0] &= ~0x00002000u; -} -inline const ::Canary::protobuf::appearances::AppearanceFlagCyclopedia& AppearanceFlags::_internal_cyclopediaitem() const { - const ::Canary::protobuf::appearances::AppearanceFlagCyclopedia* p = _impl_.cyclopediaitem_; - return p != nullptr ? *p : reinterpret_cast( - ::Canary::protobuf::appearances::_AppearanceFlagCyclopedia_default_instance_); -} -inline const ::Canary::protobuf::appearances::AppearanceFlagCyclopedia& AppearanceFlags::cyclopediaitem() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.cyclopediaitem) - return _internal_cyclopediaitem(); -} -inline void AppearanceFlags::unsafe_arena_set_allocated_cyclopediaitem( - ::Canary::protobuf::appearances::AppearanceFlagCyclopedia* cyclopediaitem) { - if (GetArenaForAllocation() == nullptr) { - delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(_impl_.cyclopediaitem_); - } - _impl_.cyclopediaitem_ = cyclopediaitem; - if (cyclopediaitem) { - _impl_._has_bits_[0] |= 0x00002000u; - } else { - _impl_._has_bits_[0] &= ~0x00002000u; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.appearances.AppearanceFlags.cyclopediaitem) -} -inline ::Canary::protobuf::appearances::AppearanceFlagCyclopedia* AppearanceFlags::release_cyclopediaitem() { - _impl_._has_bits_[0] &= ~0x00002000u; - ::Canary::protobuf::appearances::AppearanceFlagCyclopedia* temp = _impl_.cyclopediaitem_; - _impl_.cyclopediaitem_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - if (GetArenaForAllocation() == nullptr) { delete old; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagCyclopedia* AppearanceFlags::unsafe_arena_release_cyclopediaitem() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.AppearanceFlags.cyclopediaitem) - _impl_._has_bits_[0] &= ~0x00002000u; - ::Canary::protobuf::appearances::AppearanceFlagCyclopedia* temp = _impl_.cyclopediaitem_; - _impl_.cyclopediaitem_ = nullptr; - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagCyclopedia* AppearanceFlags::_internal_mutable_cyclopediaitem() { - _impl_._has_bits_[0] |= 0x00002000u; - if (_impl_.cyclopediaitem_ == nullptr) { - auto* p = CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagCyclopedia>(GetArenaForAllocation()); - _impl_.cyclopediaitem_ = p; - } - return _impl_.cyclopediaitem_; -} -inline ::Canary::protobuf::appearances::AppearanceFlagCyclopedia* AppearanceFlags::mutable_cyclopediaitem() { - ::Canary::protobuf::appearances::AppearanceFlagCyclopedia* _msg = _internal_mutable_cyclopediaitem(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.AppearanceFlags.cyclopediaitem) - return _msg; -} -inline void AppearanceFlags::set_allocated_cyclopediaitem(::Canary::protobuf::appearances::AppearanceFlagCyclopedia* cyclopediaitem) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - if (message_arena == nullptr) { - delete _impl_.cyclopediaitem_; - } - if (cyclopediaitem) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(cyclopediaitem); - if (message_arena != submessage_arena) { - cyclopediaitem = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, cyclopediaitem, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00002000u; - } else { - _impl_._has_bits_[0] &= ~0x00002000u; - } - _impl_.cyclopediaitem_ = cyclopediaitem; - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.AppearanceFlags.cyclopediaitem) -} - -// optional bool ammo = 45; -inline bool AppearanceFlags::_internal_has_ammo() const { - bool value = (_impl_._has_bits_[1] & 0x00001000u) != 0; - return value; -} -inline bool AppearanceFlags::has_ammo() const { - return _internal_has_ammo(); -} -inline void AppearanceFlags::clear_ammo() { - _impl_.ammo_ = false; - _impl_._has_bits_[1] &= ~0x00001000u; -} -inline bool AppearanceFlags::_internal_ammo() const { - return _impl_.ammo_; -} -inline bool AppearanceFlags::ammo() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.ammo) - return _internal_ammo(); -} -inline void AppearanceFlags::_internal_set_ammo(bool value) { - _impl_._has_bits_[1] |= 0x00001000u; - _impl_.ammo_ = value; -} -inline void AppearanceFlags::set_ammo(bool value) { - _internal_set_ammo(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.ammo) -} - -// optional bool show_off_socket = 46; -inline bool AppearanceFlags::_internal_has_show_off_socket() const { - bool value = (_impl_._has_bits_[1] & 0x00002000u) != 0; - return value; -} -inline bool AppearanceFlags::has_show_off_socket() const { - return _internal_has_show_off_socket(); -} -inline void AppearanceFlags::clear_show_off_socket() { - _impl_.show_off_socket_ = false; - _impl_._has_bits_[1] &= ~0x00002000u; -} -inline bool AppearanceFlags::_internal_show_off_socket() const { - return _impl_.show_off_socket_; -} -inline bool AppearanceFlags::show_off_socket() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.show_off_socket) - return _internal_show_off_socket(); -} -inline void AppearanceFlags::_internal_set_show_off_socket(bool value) { - _impl_._has_bits_[1] |= 0x00002000u; - _impl_.show_off_socket_ = value; -} -inline void AppearanceFlags::set_show_off_socket(bool value) { - _internal_set_show_off_socket(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.show_off_socket) -} - -// optional bool reportable = 47; -inline bool AppearanceFlags::_internal_has_reportable() const { - bool value = (_impl_._has_bits_[1] & 0x00004000u) != 0; - return value; -} -inline bool AppearanceFlags::has_reportable() const { - return _internal_has_reportable(); -} -inline void AppearanceFlags::clear_reportable() { - _impl_.reportable_ = false; - _impl_._has_bits_[1] &= ~0x00004000u; -} -inline bool AppearanceFlags::_internal_reportable() const { - return _impl_.reportable_; -} -inline bool AppearanceFlags::reportable() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.reportable) - return _internal_reportable(); -} -inline void AppearanceFlags::_internal_set_reportable(bool value) { - _impl_._has_bits_[1] |= 0x00004000u; - _impl_.reportable_ = value; -} -inline void AppearanceFlags::set_reportable(bool value) { - _internal_set_reportable(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.reportable) -} - -// optional .Canary.protobuf.appearances.AppearanceFlagUpgradeClassification upgradeclassification = 48; -inline bool AppearanceFlags::_internal_has_upgradeclassification() const { - bool value = (_impl_._has_bits_[0] & 0x00004000u) != 0; - PROTOBUF_ASSUME(!value || _impl_.upgradeclassification_ != nullptr); - return value; -} -inline bool AppearanceFlags::has_upgradeclassification() const { - return _internal_has_upgradeclassification(); -} -inline void AppearanceFlags::clear_upgradeclassification() { - if (_impl_.upgradeclassification_ != nullptr) _impl_.upgradeclassification_->Clear(); - _impl_._has_bits_[0] &= ~0x00004000u; -} -inline const ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification& AppearanceFlags::_internal_upgradeclassification() const { - const ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification* p = _impl_.upgradeclassification_; - return p != nullptr ? *p : reinterpret_cast( - ::Canary::protobuf::appearances::_AppearanceFlagUpgradeClassification_default_instance_); -} -inline const ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification& AppearanceFlags::upgradeclassification() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.upgradeclassification) - return _internal_upgradeclassification(); -} -inline void AppearanceFlags::unsafe_arena_set_allocated_upgradeclassification( - ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification* upgradeclassification) { - if (GetArenaForAllocation() == nullptr) { - delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(_impl_.upgradeclassification_); - } - _impl_.upgradeclassification_ = upgradeclassification; - if (upgradeclassification) { - _impl_._has_bits_[0] |= 0x00004000u; - } else { - _impl_._has_bits_[0] &= ~0x00004000u; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.appearances.AppearanceFlags.upgradeclassification) -} -inline ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification* AppearanceFlags::release_upgradeclassification() { - _impl_._has_bits_[0] &= ~0x00004000u; - ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification* temp = _impl_.upgradeclassification_; - _impl_.upgradeclassification_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - if (GetArenaForAllocation() == nullptr) { delete old; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification* AppearanceFlags::unsafe_arena_release_upgradeclassification() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.AppearanceFlags.upgradeclassification) - _impl_._has_bits_[0] &= ~0x00004000u; - ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification* temp = _impl_.upgradeclassification_; - _impl_.upgradeclassification_ = nullptr; - return temp; -} -inline ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification* AppearanceFlags::_internal_mutable_upgradeclassification() { - _impl_._has_bits_[0] |= 0x00004000u; - if (_impl_.upgradeclassification_ == nullptr) { - auto* p = CreateMaybeMessage<::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification>(GetArenaForAllocation()); - _impl_.upgradeclassification_ = p; - } - return _impl_.upgradeclassification_; -} -inline ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification* AppearanceFlags::mutable_upgradeclassification() { - ::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification* _msg = _internal_mutable_upgradeclassification(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.AppearanceFlags.upgradeclassification) - return _msg; -} -inline void AppearanceFlags::set_allocated_upgradeclassification(::Canary::protobuf::appearances::AppearanceFlagUpgradeClassification* upgradeclassification) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - if (message_arena == nullptr) { - delete _impl_.upgradeclassification_; - } - if (upgradeclassification) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(upgradeclassification); - if (message_arena != submessage_arena) { - upgradeclassification = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, upgradeclassification, submessage_arena); - } - _impl_._has_bits_[0] |= 0x00004000u; - } else { - _impl_._has_bits_[0] &= ~0x00004000u; - } - _impl_.upgradeclassification_ = upgradeclassification; - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.AppearanceFlags.upgradeclassification) -} - -// optional bool reverse_addons_east = 49; -inline bool AppearanceFlags::_internal_has_reverse_addons_east() const { - bool value = (_impl_._has_bits_[1] & 0x00008000u) != 0; - return value; -} -inline bool AppearanceFlags::has_reverse_addons_east() const { - return _internal_has_reverse_addons_east(); -} -inline void AppearanceFlags::clear_reverse_addons_east() { - _impl_.reverse_addons_east_ = false; - _impl_._has_bits_[1] &= ~0x00008000u; -} -inline bool AppearanceFlags::_internal_reverse_addons_east() const { - return _impl_.reverse_addons_east_; -} -inline bool AppearanceFlags::reverse_addons_east() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.reverse_addons_east) - return _internal_reverse_addons_east(); -} -inline void AppearanceFlags::_internal_set_reverse_addons_east(bool value) { - _impl_._has_bits_[1] |= 0x00008000u; - _impl_.reverse_addons_east_ = value; -} -inline void AppearanceFlags::set_reverse_addons_east(bool value) { - _internal_set_reverse_addons_east(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.reverse_addons_east) -} - -// optional bool reverse_addons_west = 50; -inline bool AppearanceFlags::_internal_has_reverse_addons_west() const { - bool value = (_impl_._has_bits_[1] & 0x00010000u) != 0; - return value; -} -inline bool AppearanceFlags::has_reverse_addons_west() const { - return _internal_has_reverse_addons_west(); -} -inline void AppearanceFlags::clear_reverse_addons_west() { - _impl_.reverse_addons_west_ = false; - _impl_._has_bits_[1] &= ~0x00010000u; -} -inline bool AppearanceFlags::_internal_reverse_addons_west() const { - return _impl_.reverse_addons_west_; -} -inline bool AppearanceFlags::reverse_addons_west() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.reverse_addons_west) - return _internal_reverse_addons_west(); -} -inline void AppearanceFlags::_internal_set_reverse_addons_west(bool value) { - _impl_._has_bits_[1] |= 0x00010000u; - _impl_.reverse_addons_west_ = value; -} -inline void AppearanceFlags::set_reverse_addons_west(bool value) { - _internal_set_reverse_addons_west(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.reverse_addons_west) -} - -// optional bool reverse_addons_south = 51; -inline bool AppearanceFlags::_internal_has_reverse_addons_south() const { - bool value = (_impl_._has_bits_[1] & 0x00020000u) != 0; - return value; -} -inline bool AppearanceFlags::has_reverse_addons_south() const { - return _internal_has_reverse_addons_south(); -} -inline void AppearanceFlags::clear_reverse_addons_south() { - _impl_.reverse_addons_south_ = false; - _impl_._has_bits_[1] &= ~0x00020000u; -} -inline bool AppearanceFlags::_internal_reverse_addons_south() const { - return _impl_.reverse_addons_south_; -} -inline bool AppearanceFlags::reverse_addons_south() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.reverse_addons_south) - return _internal_reverse_addons_south(); -} -inline void AppearanceFlags::_internal_set_reverse_addons_south(bool value) { - _impl_._has_bits_[1] |= 0x00020000u; - _impl_.reverse_addons_south_ = value; -} -inline void AppearanceFlags::set_reverse_addons_south(bool value) { - _internal_set_reverse_addons_south(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.reverse_addons_south) -} - -// optional bool reverse_addons_north = 52; -inline bool AppearanceFlags::_internal_has_reverse_addons_north() const { - bool value = (_impl_._has_bits_[1] & 0x00040000u) != 0; - return value; -} -inline bool AppearanceFlags::has_reverse_addons_north() const { - return _internal_has_reverse_addons_north(); -} -inline void AppearanceFlags::clear_reverse_addons_north() { - _impl_.reverse_addons_north_ = false; - _impl_._has_bits_[1] &= ~0x00040000u; -} -inline bool AppearanceFlags::_internal_reverse_addons_north() const { - return _impl_.reverse_addons_north_; -} -inline bool AppearanceFlags::reverse_addons_north() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.reverse_addons_north) - return _internal_reverse_addons_north(); -} -inline void AppearanceFlags::_internal_set_reverse_addons_north(bool value) { - _impl_._has_bits_[1] |= 0x00040000u; - _impl_.reverse_addons_north_ = value; -} -inline void AppearanceFlags::set_reverse_addons_north(bool value) { - _internal_set_reverse_addons_north(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.reverse_addons_north) -} - -// optional bool wearout = 53; -inline bool AppearanceFlags::_internal_has_wearout() const { - bool value = (_impl_._has_bits_[1] & 0x00080000u) != 0; - return value; -} -inline bool AppearanceFlags::has_wearout() const { - return _internal_has_wearout(); -} -inline void AppearanceFlags::clear_wearout() { - _impl_.wearout_ = false; - _impl_._has_bits_[1] &= ~0x00080000u; -} -inline bool AppearanceFlags::_internal_wearout() const { - return _impl_.wearout_; -} -inline bool AppearanceFlags::wearout() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.wearout) - return _internal_wearout(); -} -inline void AppearanceFlags::_internal_set_wearout(bool value) { - _impl_._has_bits_[1] |= 0x00080000u; - _impl_.wearout_ = value; -} -inline void AppearanceFlags::set_wearout(bool value) { - _internal_set_wearout(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.wearout) -} - -// optional bool clockexpire = 54; -inline bool AppearanceFlags::_internal_has_clockexpire() const { - bool value = (_impl_._has_bits_[1] & 0x00100000u) != 0; - return value; -} -inline bool AppearanceFlags::has_clockexpire() const { - return _internal_has_clockexpire(); -} -inline void AppearanceFlags::clear_clockexpire() { - _impl_.clockexpire_ = false; - _impl_._has_bits_[1] &= ~0x00100000u; -} -inline bool AppearanceFlags::_internal_clockexpire() const { - return _impl_.clockexpire_; -} -inline bool AppearanceFlags::clockexpire() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.clockexpire) - return _internal_clockexpire(); -} -inline void AppearanceFlags::_internal_set_clockexpire(bool value) { - _impl_._has_bits_[1] |= 0x00100000u; - _impl_.clockexpire_ = value; -} -inline void AppearanceFlags::set_clockexpire(bool value) { - _internal_set_clockexpire(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.clockexpire) -} - -// optional bool expire = 55; -inline bool AppearanceFlags::_internal_has_expire() const { - bool value = (_impl_._has_bits_[1] & 0x00200000u) != 0; - return value; -} -inline bool AppearanceFlags::has_expire() const { - return _internal_has_expire(); -} -inline void AppearanceFlags::clear_expire() { - _impl_.expire_ = false; - _impl_._has_bits_[1] &= ~0x00200000u; -} -inline bool AppearanceFlags::_internal_expire() const { - return _impl_.expire_; -} -inline bool AppearanceFlags::expire() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.expire) - return _internal_expire(); -} -inline void AppearanceFlags::_internal_set_expire(bool value) { - _impl_._has_bits_[1] |= 0x00200000u; - _impl_.expire_ = value; -} -inline void AppearanceFlags::set_expire(bool value) { - _internal_set_expire(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.expire) -} - -// optional bool expirestop = 56; -inline bool AppearanceFlags::_internal_has_expirestop() const { - bool value = (_impl_._has_bits_[1] & 0x00400000u) != 0; - return value; -} -inline bool AppearanceFlags::has_expirestop() const { - return _internal_has_expirestop(); -} -inline void AppearanceFlags::clear_expirestop() { - _impl_.expirestop_ = false; - _impl_._has_bits_[1] &= ~0x00400000u; -} -inline bool AppearanceFlags::_internal_expirestop() const { - return _impl_.expirestop_; -} -inline bool AppearanceFlags::expirestop() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.expirestop) - return _internal_expirestop(); -} -inline void AppearanceFlags::_internal_set_expirestop(bool value) { - _impl_._has_bits_[1] |= 0x00400000u; - _impl_.expirestop_ = value; -} -inline void AppearanceFlags::set_expirestop(bool value) { - _internal_set_expirestop(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.expirestop) -} - -// optional bool wrapkit = 57; -inline bool AppearanceFlags::_internal_has_wrapkit() const { - bool value = (_impl_._has_bits_[1] & 0x00800000u) != 0; - return value; -} -inline bool AppearanceFlags::has_wrapkit() const { - return _internal_has_wrapkit(); -} -inline void AppearanceFlags::clear_wrapkit() { - _impl_.wrapkit_ = false; - _impl_._has_bits_[1] &= ~0x00800000u; -} -inline bool AppearanceFlags::_internal_wrapkit() const { - return _impl_.wrapkit_; -} -inline bool AppearanceFlags::wrapkit() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlags.wrapkit) - return _internal_wrapkit(); -} -inline void AppearanceFlags::_internal_set_wrapkit(bool value) { - _impl_._has_bits_[1] |= 0x00800000u; - _impl_.wrapkit_ = value; -} -inline void AppearanceFlags::set_wrapkit(bool value) { - _internal_set_wrapkit(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlags.wrapkit) -} - -// ------------------------------------------------------------------- - -// AppearanceFlagUpgradeClassification - -// optional uint32 upgrade_classification = 1; -inline bool AppearanceFlagUpgradeClassification::_internal_has_upgrade_classification() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool AppearanceFlagUpgradeClassification::has_upgrade_classification() const { - return _internal_has_upgrade_classification(); -} -inline void AppearanceFlagUpgradeClassification::clear_upgrade_classification() { - _impl_.upgrade_classification_ = 0u; - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline uint32_t AppearanceFlagUpgradeClassification::_internal_upgrade_classification() const { - return _impl_.upgrade_classification_; -} -inline uint32_t AppearanceFlagUpgradeClassification::upgrade_classification() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagUpgradeClassification.upgrade_classification) - return _internal_upgrade_classification(); -} -inline void AppearanceFlagUpgradeClassification::_internal_set_upgrade_classification(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.upgrade_classification_ = value; -} -inline void AppearanceFlagUpgradeClassification::set_upgrade_classification(uint32_t value) { - _internal_set_upgrade_classification(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagUpgradeClassification.upgrade_classification) -} - -// ------------------------------------------------------------------- - -// AppearanceFlagBank - -// optional uint32 waypoints = 1; -inline bool AppearanceFlagBank::_internal_has_waypoints() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool AppearanceFlagBank::has_waypoints() const { - return _internal_has_waypoints(); -} -inline void AppearanceFlagBank::clear_waypoints() { - _impl_.waypoints_ = 0u; - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline uint32_t AppearanceFlagBank::_internal_waypoints() const { - return _impl_.waypoints_; -} -inline uint32_t AppearanceFlagBank::waypoints() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagBank.waypoints) - return _internal_waypoints(); -} -inline void AppearanceFlagBank::_internal_set_waypoints(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.waypoints_ = value; -} -inline void AppearanceFlagBank::set_waypoints(uint32_t value) { - _internal_set_waypoints(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagBank.waypoints) -} - -// ------------------------------------------------------------------- - -// AppearanceFlagWrite - -// optional uint32 max_text_length = 1; -inline bool AppearanceFlagWrite::_internal_has_max_text_length() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool AppearanceFlagWrite::has_max_text_length() const { - return _internal_has_max_text_length(); -} -inline void AppearanceFlagWrite::clear_max_text_length() { - _impl_.max_text_length_ = 0u; - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline uint32_t AppearanceFlagWrite::_internal_max_text_length() const { - return _impl_.max_text_length_; -} -inline uint32_t AppearanceFlagWrite::max_text_length() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagWrite.max_text_length) - return _internal_max_text_length(); -} -inline void AppearanceFlagWrite::_internal_set_max_text_length(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.max_text_length_ = value; -} -inline void AppearanceFlagWrite::set_max_text_length(uint32_t value) { - _internal_set_max_text_length(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagWrite.max_text_length) -} - -// ------------------------------------------------------------------- - -// AppearanceFlagWriteOnce - -// optional uint32 max_text_length_once = 1; -inline bool AppearanceFlagWriteOnce::_internal_has_max_text_length_once() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool AppearanceFlagWriteOnce::has_max_text_length_once() const { - return _internal_has_max_text_length_once(); -} -inline void AppearanceFlagWriteOnce::clear_max_text_length_once() { - _impl_.max_text_length_once_ = 0u; - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline uint32_t AppearanceFlagWriteOnce::_internal_max_text_length_once() const { - return _impl_.max_text_length_once_; -} -inline uint32_t AppearanceFlagWriteOnce::max_text_length_once() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagWriteOnce.max_text_length_once) - return _internal_max_text_length_once(); -} -inline void AppearanceFlagWriteOnce::_internal_set_max_text_length_once(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.max_text_length_once_ = value; -} -inline void AppearanceFlagWriteOnce::set_max_text_length_once(uint32_t value) { - _internal_set_max_text_length_once(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagWriteOnce.max_text_length_once) -} - -// ------------------------------------------------------------------- - -// AppearanceFlagLight - -// optional uint32 brightness = 1; -inline bool AppearanceFlagLight::_internal_has_brightness() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool AppearanceFlagLight::has_brightness() const { - return _internal_has_brightness(); -} -inline void AppearanceFlagLight::clear_brightness() { - _impl_.brightness_ = 0u; - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline uint32_t AppearanceFlagLight::_internal_brightness() const { - return _impl_.brightness_; -} -inline uint32_t AppearanceFlagLight::brightness() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagLight.brightness) - return _internal_brightness(); -} -inline void AppearanceFlagLight::_internal_set_brightness(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.brightness_ = value; -} -inline void AppearanceFlagLight::set_brightness(uint32_t value) { - _internal_set_brightness(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagLight.brightness) -} - -// optional uint32 color = 2; -inline bool AppearanceFlagLight::_internal_has_color() const { - bool value = (_impl_._has_bits_[0] & 0x00000002u) != 0; - return value; -} -inline bool AppearanceFlagLight::has_color() const { - return _internal_has_color(); -} -inline void AppearanceFlagLight::clear_color() { - _impl_.color_ = 0u; - _impl_._has_bits_[0] &= ~0x00000002u; -} -inline uint32_t AppearanceFlagLight::_internal_color() const { - return _impl_.color_; -} -inline uint32_t AppearanceFlagLight::color() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagLight.color) - return _internal_color(); -} -inline void AppearanceFlagLight::_internal_set_color(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000002u; - _impl_.color_ = value; -} -inline void AppearanceFlagLight::set_color(uint32_t value) { - _internal_set_color(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagLight.color) -} - -// ------------------------------------------------------------------- - -// AppearanceFlagHeight - -// optional uint32 elevation = 1; -inline bool AppearanceFlagHeight::_internal_has_elevation() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool AppearanceFlagHeight::has_elevation() const { - return _internal_has_elevation(); -} -inline void AppearanceFlagHeight::clear_elevation() { - _impl_.elevation_ = 0u; - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline uint32_t AppearanceFlagHeight::_internal_elevation() const { - return _impl_.elevation_; -} -inline uint32_t AppearanceFlagHeight::elevation() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagHeight.elevation) - return _internal_elevation(); -} -inline void AppearanceFlagHeight::_internal_set_elevation(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.elevation_ = value; -} -inline void AppearanceFlagHeight::set_elevation(uint32_t value) { - _internal_set_elevation(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagHeight.elevation) -} - -// ------------------------------------------------------------------- - -// AppearanceFlagShift - -// optional uint32 x = 1; -inline bool AppearanceFlagShift::_internal_has_x() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool AppearanceFlagShift::has_x() const { - return _internal_has_x(); -} -inline void AppearanceFlagShift::clear_x() { - _impl_.x_ = 0u; - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline uint32_t AppearanceFlagShift::_internal_x() const { - return _impl_.x_; -} -inline uint32_t AppearanceFlagShift::x() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagShift.x) - return _internal_x(); -} -inline void AppearanceFlagShift::_internal_set_x(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.x_ = value; -} -inline void AppearanceFlagShift::set_x(uint32_t value) { - _internal_set_x(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagShift.x) -} - -// optional uint32 y = 2; -inline bool AppearanceFlagShift::_internal_has_y() const { - bool value = (_impl_._has_bits_[0] & 0x00000002u) != 0; - return value; -} -inline bool AppearanceFlagShift::has_y() const { - return _internal_has_y(); -} -inline void AppearanceFlagShift::clear_y() { - _impl_.y_ = 0u; - _impl_._has_bits_[0] &= ~0x00000002u; -} -inline uint32_t AppearanceFlagShift::_internal_y() const { - return _impl_.y_; -} -inline uint32_t AppearanceFlagShift::y() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagShift.y) - return _internal_y(); -} -inline void AppearanceFlagShift::_internal_set_y(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000002u; - _impl_.y_ = value; -} -inline void AppearanceFlagShift::set_y(uint32_t value) { - _internal_set_y(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagShift.y) -} - -// ------------------------------------------------------------------- - -// AppearanceFlagClothes - -// optional uint32 slot = 1; -inline bool AppearanceFlagClothes::_internal_has_slot() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool AppearanceFlagClothes::has_slot() const { - return _internal_has_slot(); -} -inline void AppearanceFlagClothes::clear_slot() { - _impl_.slot_ = 0u; - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline uint32_t AppearanceFlagClothes::_internal_slot() const { - return _impl_.slot_; -} -inline uint32_t AppearanceFlagClothes::slot() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagClothes.slot) - return _internal_slot(); -} -inline void AppearanceFlagClothes::_internal_set_slot(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.slot_ = value; -} -inline void AppearanceFlagClothes::set_slot(uint32_t value) { - _internal_set_slot(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagClothes.slot) -} - -// ------------------------------------------------------------------- - -// AppearanceFlagDefaultAction - -// optional .Canary.protobuf.appearances.PLAYER_ACTION action = 1; -inline bool AppearanceFlagDefaultAction::_internal_has_action() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool AppearanceFlagDefaultAction::has_action() const { - return _internal_has_action(); -} -inline void AppearanceFlagDefaultAction::clear_action() { - _impl_.action_ = 0; - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline ::Canary::protobuf::appearances::PLAYER_ACTION AppearanceFlagDefaultAction::_internal_action() const { - return static_cast< ::Canary::protobuf::appearances::PLAYER_ACTION >(_impl_.action_); -} -inline ::Canary::protobuf::appearances::PLAYER_ACTION AppearanceFlagDefaultAction::action() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagDefaultAction.action) - return _internal_action(); -} -inline void AppearanceFlagDefaultAction::_internal_set_action(::Canary::protobuf::appearances::PLAYER_ACTION value) { - assert(::Canary::protobuf::appearances::PLAYER_ACTION_IsValid(value)); - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.action_ = value; -} -inline void AppearanceFlagDefaultAction::set_action(::Canary::protobuf::appearances::PLAYER_ACTION value) { - _internal_set_action(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagDefaultAction.action) -} - -// ------------------------------------------------------------------- - -// AppearanceFlagMarket - -// optional .Canary.protobuf.appearances.ITEM_CATEGORY category = 1; -inline bool AppearanceFlagMarket::_internal_has_category() const { - bool value = (_impl_._has_bits_[0] & 0x00000008u) != 0; - return value; -} -inline bool AppearanceFlagMarket::has_category() const { - return _internal_has_category(); -} -inline void AppearanceFlagMarket::clear_category() { - _impl_.category_ = 1; - _impl_._has_bits_[0] &= ~0x00000008u; -} -inline ::Canary::protobuf::appearances::ITEM_CATEGORY AppearanceFlagMarket::_internal_category() const { - return static_cast< ::Canary::protobuf::appearances::ITEM_CATEGORY >(_impl_.category_); -} -inline ::Canary::protobuf::appearances::ITEM_CATEGORY AppearanceFlagMarket::category() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagMarket.category) - return _internal_category(); -} -inline void AppearanceFlagMarket::_internal_set_category(::Canary::protobuf::appearances::ITEM_CATEGORY value) { - assert(::Canary::protobuf::appearances::ITEM_CATEGORY_IsValid(value)); - _impl_._has_bits_[0] |= 0x00000008u; - _impl_.category_ = value; -} -inline void AppearanceFlagMarket::set_category(::Canary::protobuf::appearances::ITEM_CATEGORY value) { - _internal_set_category(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagMarket.category) -} - -// optional uint32 trade_as_object_id = 2; -inline bool AppearanceFlagMarket::_internal_has_trade_as_object_id() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool AppearanceFlagMarket::has_trade_as_object_id() const { - return _internal_has_trade_as_object_id(); -} -inline void AppearanceFlagMarket::clear_trade_as_object_id() { - _impl_.trade_as_object_id_ = 0u; - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline uint32_t AppearanceFlagMarket::_internal_trade_as_object_id() const { - return _impl_.trade_as_object_id_; -} -inline uint32_t AppearanceFlagMarket::trade_as_object_id() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagMarket.trade_as_object_id) - return _internal_trade_as_object_id(); -} -inline void AppearanceFlagMarket::_internal_set_trade_as_object_id(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.trade_as_object_id_ = value; -} -inline void AppearanceFlagMarket::set_trade_as_object_id(uint32_t value) { - _internal_set_trade_as_object_id(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagMarket.trade_as_object_id) -} - -// optional uint32 show_as_object_id = 3; -inline bool AppearanceFlagMarket::_internal_has_show_as_object_id() const { - bool value = (_impl_._has_bits_[0] & 0x00000002u) != 0; - return value; -} -inline bool AppearanceFlagMarket::has_show_as_object_id() const { - return _internal_has_show_as_object_id(); -} -inline void AppearanceFlagMarket::clear_show_as_object_id() { - _impl_.show_as_object_id_ = 0u; - _impl_._has_bits_[0] &= ~0x00000002u; -} -inline uint32_t AppearanceFlagMarket::_internal_show_as_object_id() const { - return _impl_.show_as_object_id_; -} -inline uint32_t AppearanceFlagMarket::show_as_object_id() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagMarket.show_as_object_id) - return _internal_show_as_object_id(); -} -inline void AppearanceFlagMarket::_internal_set_show_as_object_id(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000002u; - _impl_.show_as_object_id_ = value; -} -inline void AppearanceFlagMarket::set_show_as_object_id(uint32_t value) { - _internal_set_show_as_object_id(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagMarket.show_as_object_id) -} - -// repeated .Canary.protobuf.appearances.PLAYER_PROFESSION restrict_to_profession = 5; -inline int AppearanceFlagMarket::_internal_restrict_to_profession_size() const { - return _impl_.restrict_to_profession_.size(); -} -inline int AppearanceFlagMarket::restrict_to_profession_size() const { - return _internal_restrict_to_profession_size(); -} -inline void AppearanceFlagMarket::clear_restrict_to_profession() { - _impl_.restrict_to_profession_.Clear(); -} -inline ::Canary::protobuf::appearances::PLAYER_PROFESSION AppearanceFlagMarket::_internal_restrict_to_profession(int index) const { - return static_cast< ::Canary::protobuf::appearances::PLAYER_PROFESSION >(_impl_.restrict_to_profession_.Get(index)); -} -inline ::Canary::protobuf::appearances::PLAYER_PROFESSION AppearanceFlagMarket::restrict_to_profession(int index) const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagMarket.restrict_to_profession) - return _internal_restrict_to_profession(index); -} -inline void AppearanceFlagMarket::set_restrict_to_profession(int index, ::Canary::protobuf::appearances::PLAYER_PROFESSION value) { - assert(::Canary::protobuf::appearances::PLAYER_PROFESSION_IsValid(value)); - _impl_.restrict_to_profession_.Set(index, value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagMarket.restrict_to_profession) -} -inline void AppearanceFlagMarket::_internal_add_restrict_to_profession(::Canary::protobuf::appearances::PLAYER_PROFESSION value) { - assert(::Canary::protobuf::appearances::PLAYER_PROFESSION_IsValid(value)); - _impl_.restrict_to_profession_.Add(value); -} -inline void AppearanceFlagMarket::add_restrict_to_profession(::Canary::protobuf::appearances::PLAYER_PROFESSION value) { - _internal_add_restrict_to_profession(value); - // @@protoc_insertion_point(field_add:Canary.protobuf.appearances.AppearanceFlagMarket.restrict_to_profession) -} -inline const ::PROTOBUF_NAMESPACE_ID::RepeatedField& -AppearanceFlagMarket::restrict_to_profession() const { - // @@protoc_insertion_point(field_list:Canary.protobuf.appearances.AppearanceFlagMarket.restrict_to_profession) - return _impl_.restrict_to_profession_; -} -inline ::PROTOBUF_NAMESPACE_ID::RepeatedField* -AppearanceFlagMarket::_internal_mutable_restrict_to_profession() { - return &_impl_.restrict_to_profession_; -} -inline ::PROTOBUF_NAMESPACE_ID::RepeatedField* -AppearanceFlagMarket::mutable_restrict_to_profession() { - // @@protoc_insertion_point(field_mutable_list:Canary.protobuf.appearances.AppearanceFlagMarket.restrict_to_profession) - return _internal_mutable_restrict_to_profession(); -} - -// optional uint32 minimum_level = 6; -inline bool AppearanceFlagMarket::_internal_has_minimum_level() const { - bool value = (_impl_._has_bits_[0] & 0x00000004u) != 0; - return value; -} -inline bool AppearanceFlagMarket::has_minimum_level() const { - return _internal_has_minimum_level(); -} -inline void AppearanceFlagMarket::clear_minimum_level() { - _impl_.minimum_level_ = 0u; - _impl_._has_bits_[0] &= ~0x00000004u; -} -inline uint32_t AppearanceFlagMarket::_internal_minimum_level() const { - return _impl_.minimum_level_; -} -inline uint32_t AppearanceFlagMarket::minimum_level() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagMarket.minimum_level) - return _internal_minimum_level(); -} -inline void AppearanceFlagMarket::_internal_set_minimum_level(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000004u; - _impl_.minimum_level_ = value; -} -inline void AppearanceFlagMarket::set_minimum_level(uint32_t value) { - _internal_set_minimum_level(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagMarket.minimum_level) -} - -// ------------------------------------------------------------------- - -// AppearanceFlagNPC - -// optional bytes name = 1; -inline bool AppearanceFlagNPC::_internal_has_name() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool AppearanceFlagNPC::has_name() const { - return _internal_has_name(); -} -inline void AppearanceFlagNPC::clear_name() { - _impl_.name_.ClearToEmpty(); - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline const std::string& AppearanceFlagNPC::name() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagNPC.name) - return _internal_name(); -} -template -inline PROTOBUF_ALWAYS_INLINE -void AppearanceFlagNPC::set_name(ArgT0&& arg0, ArgT... args) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.name_.SetBytes(static_cast(arg0), args..., GetArenaForAllocation()); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagNPC.name) -} -inline std::string* AppearanceFlagNPC::mutable_name() { - std::string* _s = _internal_mutable_name(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.AppearanceFlagNPC.name) - return _s; -} -inline const std::string& AppearanceFlagNPC::_internal_name() const { - return _impl_.name_.Get(); -} -inline void AppearanceFlagNPC::_internal_set_name(const std::string& value) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.name_.Set(value, GetArenaForAllocation()); -} -inline std::string* AppearanceFlagNPC::_internal_mutable_name() { - _impl_._has_bits_[0] |= 0x00000001u; - return _impl_.name_.Mutable(GetArenaForAllocation()); -} -inline std::string* AppearanceFlagNPC::release_name() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.AppearanceFlagNPC.name) - if (!_internal_has_name()) { - return nullptr; - } - _impl_._has_bits_[0] &= ~0x00000001u; - auto* p = _impl_.name_.Release(); -#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.name_.IsDefault()) { - _impl_.name_.Set("", GetArenaForAllocation()); - } -#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - return p; -} -inline void AppearanceFlagNPC::set_allocated_name(std::string* name) { - if (name != nullptr) { - _impl_._has_bits_[0] |= 0x00000001u; - } else { - _impl_._has_bits_[0] &= ~0x00000001u; - } - _impl_.name_.SetAllocated(name, GetArenaForAllocation()); -#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.name_.IsDefault()) { - _impl_.name_.Set("", GetArenaForAllocation()); - } -#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.AppearanceFlagNPC.name) -} - -// optional bytes location = 2; -inline bool AppearanceFlagNPC::_internal_has_location() const { - bool value = (_impl_._has_bits_[0] & 0x00000002u) != 0; - return value; -} -inline bool AppearanceFlagNPC::has_location() const { - return _internal_has_location(); -} -inline void AppearanceFlagNPC::clear_location() { - _impl_.location_.ClearToEmpty(); - _impl_._has_bits_[0] &= ~0x00000002u; -} -inline const std::string& AppearanceFlagNPC::location() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagNPC.location) - return _internal_location(); -} -template -inline PROTOBUF_ALWAYS_INLINE -void AppearanceFlagNPC::set_location(ArgT0&& arg0, ArgT... args) { - _impl_._has_bits_[0] |= 0x00000002u; - _impl_.location_.SetBytes(static_cast(arg0), args..., GetArenaForAllocation()); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagNPC.location) -} -inline std::string* AppearanceFlagNPC::mutable_location() { - std::string* _s = _internal_mutable_location(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.AppearanceFlagNPC.location) - return _s; -} -inline const std::string& AppearanceFlagNPC::_internal_location() const { - return _impl_.location_.Get(); -} -inline void AppearanceFlagNPC::_internal_set_location(const std::string& value) { - _impl_._has_bits_[0] |= 0x00000002u; - _impl_.location_.Set(value, GetArenaForAllocation()); -} -inline std::string* AppearanceFlagNPC::_internal_mutable_location() { - _impl_._has_bits_[0] |= 0x00000002u; - return _impl_.location_.Mutable(GetArenaForAllocation()); -} -inline std::string* AppearanceFlagNPC::release_location() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.AppearanceFlagNPC.location) - if (!_internal_has_location()) { - return nullptr; - } - _impl_._has_bits_[0] &= ~0x00000002u; - auto* p = _impl_.location_.Release(); -#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.location_.IsDefault()) { - _impl_.location_.Set("", GetArenaForAllocation()); - } -#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - return p; -} -inline void AppearanceFlagNPC::set_allocated_location(std::string* location) { - if (location != nullptr) { - _impl_._has_bits_[0] |= 0x00000002u; - } else { - _impl_._has_bits_[0] &= ~0x00000002u; - } - _impl_.location_.SetAllocated(location, GetArenaForAllocation()); -#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.location_.IsDefault()) { - _impl_.location_.Set("", GetArenaForAllocation()); - } -#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.AppearanceFlagNPC.location) -} - -// optional uint32 sale_price = 3; -inline bool AppearanceFlagNPC::_internal_has_sale_price() const { - bool value = (_impl_._has_bits_[0] & 0x00000008u) != 0; - return value; -} -inline bool AppearanceFlagNPC::has_sale_price() const { - return _internal_has_sale_price(); -} -inline void AppearanceFlagNPC::clear_sale_price() { - _impl_.sale_price_ = 0u; - _impl_._has_bits_[0] &= ~0x00000008u; -} -inline uint32_t AppearanceFlagNPC::_internal_sale_price() const { - return _impl_.sale_price_; -} -inline uint32_t AppearanceFlagNPC::sale_price() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagNPC.sale_price) - return _internal_sale_price(); -} -inline void AppearanceFlagNPC::_internal_set_sale_price(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000008u; - _impl_.sale_price_ = value; -} -inline void AppearanceFlagNPC::set_sale_price(uint32_t value) { - _internal_set_sale_price(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagNPC.sale_price) -} - -// optional uint32 buy_price = 4; -inline bool AppearanceFlagNPC::_internal_has_buy_price() const { - bool value = (_impl_._has_bits_[0] & 0x00000010u) != 0; - return value; -} -inline bool AppearanceFlagNPC::has_buy_price() const { - return _internal_has_buy_price(); -} -inline void AppearanceFlagNPC::clear_buy_price() { - _impl_.buy_price_ = 0u; - _impl_._has_bits_[0] &= ~0x00000010u; -} -inline uint32_t AppearanceFlagNPC::_internal_buy_price() const { - return _impl_.buy_price_; -} -inline uint32_t AppearanceFlagNPC::buy_price() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagNPC.buy_price) - return _internal_buy_price(); -} -inline void AppearanceFlagNPC::_internal_set_buy_price(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000010u; - _impl_.buy_price_ = value; -} -inline void AppearanceFlagNPC::set_buy_price(uint32_t value) { - _internal_set_buy_price(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagNPC.buy_price) -} - -// optional uint32 currency_object_type_id = 5; -inline bool AppearanceFlagNPC::_internal_has_currency_object_type_id() const { - bool value = (_impl_._has_bits_[0] & 0x00000020u) != 0; - return value; -} -inline bool AppearanceFlagNPC::has_currency_object_type_id() const { - return _internal_has_currency_object_type_id(); -} -inline void AppearanceFlagNPC::clear_currency_object_type_id() { - _impl_.currency_object_type_id_ = 0u; - _impl_._has_bits_[0] &= ~0x00000020u; -} -inline uint32_t AppearanceFlagNPC::_internal_currency_object_type_id() const { - return _impl_.currency_object_type_id_; -} -inline uint32_t AppearanceFlagNPC::currency_object_type_id() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagNPC.currency_object_type_id) - return _internal_currency_object_type_id(); -} -inline void AppearanceFlagNPC::_internal_set_currency_object_type_id(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000020u; - _impl_.currency_object_type_id_ = value; -} -inline void AppearanceFlagNPC::set_currency_object_type_id(uint32_t value) { - _internal_set_currency_object_type_id(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagNPC.currency_object_type_id) -} - -// optional bytes currency_quest_flag_display_name = 6; -inline bool AppearanceFlagNPC::_internal_has_currency_quest_flag_display_name() const { - bool value = (_impl_._has_bits_[0] & 0x00000004u) != 0; - return value; -} -inline bool AppearanceFlagNPC::has_currency_quest_flag_display_name() const { - return _internal_has_currency_quest_flag_display_name(); -} -inline void AppearanceFlagNPC::clear_currency_quest_flag_display_name() { - _impl_.currency_quest_flag_display_name_.ClearToEmpty(); - _impl_._has_bits_[0] &= ~0x00000004u; -} -inline const std::string& AppearanceFlagNPC::currency_quest_flag_display_name() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagNPC.currency_quest_flag_display_name) - return _internal_currency_quest_flag_display_name(); -} -template -inline PROTOBUF_ALWAYS_INLINE -void AppearanceFlagNPC::set_currency_quest_flag_display_name(ArgT0&& arg0, ArgT... args) { - _impl_._has_bits_[0] |= 0x00000004u; - _impl_.currency_quest_flag_display_name_.SetBytes(static_cast(arg0), args..., GetArenaForAllocation()); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagNPC.currency_quest_flag_display_name) -} -inline std::string* AppearanceFlagNPC::mutable_currency_quest_flag_display_name() { - std::string* _s = _internal_mutable_currency_quest_flag_display_name(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.appearances.AppearanceFlagNPC.currency_quest_flag_display_name) - return _s; -} -inline const std::string& AppearanceFlagNPC::_internal_currency_quest_flag_display_name() const { - return _impl_.currency_quest_flag_display_name_.Get(); -} -inline void AppearanceFlagNPC::_internal_set_currency_quest_flag_display_name(const std::string& value) { - _impl_._has_bits_[0] |= 0x00000004u; - _impl_.currency_quest_flag_display_name_.Set(value, GetArenaForAllocation()); -} -inline std::string* AppearanceFlagNPC::_internal_mutable_currency_quest_flag_display_name() { - _impl_._has_bits_[0] |= 0x00000004u; - return _impl_.currency_quest_flag_display_name_.Mutable(GetArenaForAllocation()); -} -inline std::string* AppearanceFlagNPC::release_currency_quest_flag_display_name() { - // @@protoc_insertion_point(field_release:Canary.protobuf.appearances.AppearanceFlagNPC.currency_quest_flag_display_name) - if (!_internal_has_currency_quest_flag_display_name()) { - return nullptr; - } - _impl_._has_bits_[0] &= ~0x00000004u; - auto* p = _impl_.currency_quest_flag_display_name_.Release(); -#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.currency_quest_flag_display_name_.IsDefault()) { - _impl_.currency_quest_flag_display_name_.Set("", GetArenaForAllocation()); - } -#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - return p; -} -inline void AppearanceFlagNPC::set_allocated_currency_quest_flag_display_name(std::string* currency_quest_flag_display_name) { - if (currency_quest_flag_display_name != nullptr) { - _impl_._has_bits_[0] |= 0x00000004u; - } else { - _impl_._has_bits_[0] &= ~0x00000004u; - } - _impl_.currency_quest_flag_display_name_.SetAllocated(currency_quest_flag_display_name, GetArenaForAllocation()); -#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.currency_quest_flag_display_name_.IsDefault()) { - _impl_.currency_quest_flag_display_name_.Set("", GetArenaForAllocation()); - } -#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.appearances.AppearanceFlagNPC.currency_quest_flag_display_name) -} - -// ------------------------------------------------------------------- - -// AppearanceFlagAutomap - -// optional uint32 color = 1; -inline bool AppearanceFlagAutomap::_internal_has_color() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool AppearanceFlagAutomap::has_color() const { - return _internal_has_color(); -} -inline void AppearanceFlagAutomap::clear_color() { - _impl_.color_ = 0u; - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline uint32_t AppearanceFlagAutomap::_internal_color() const { - return _impl_.color_; -} -inline uint32_t AppearanceFlagAutomap::color() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagAutomap.color) - return _internal_color(); -} -inline void AppearanceFlagAutomap::_internal_set_color(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.color_ = value; -} -inline void AppearanceFlagAutomap::set_color(uint32_t value) { - _internal_set_color(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagAutomap.color) -} - -// ------------------------------------------------------------------- - -// AppearanceFlagHook - -// optional .Canary.protobuf.appearances.HOOK_TYPE direction = 1; -inline bool AppearanceFlagHook::_internal_has_direction() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool AppearanceFlagHook::has_direction() const { - return _internal_has_direction(); -} -inline void AppearanceFlagHook::clear_direction() { - _impl_.direction_ = 1; - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline ::Canary::protobuf::appearances::HOOK_TYPE AppearanceFlagHook::_internal_direction() const { - return static_cast< ::Canary::protobuf::appearances::HOOK_TYPE >(_impl_.direction_); -} -inline ::Canary::protobuf::appearances::HOOK_TYPE AppearanceFlagHook::direction() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagHook.direction) - return _internal_direction(); -} -inline void AppearanceFlagHook::_internal_set_direction(::Canary::protobuf::appearances::HOOK_TYPE value) { - assert(::Canary::protobuf::appearances::HOOK_TYPE_IsValid(value)); - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.direction_ = value; -} -inline void AppearanceFlagHook::set_direction(::Canary::protobuf::appearances::HOOK_TYPE value) { - _internal_set_direction(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagHook.direction) -} - -// ------------------------------------------------------------------- - -// AppearanceFlagLenshelp - -// optional uint32 id = 1; -inline bool AppearanceFlagLenshelp::_internal_has_id() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool AppearanceFlagLenshelp::has_id() const { - return _internal_has_id(); -} -inline void AppearanceFlagLenshelp::clear_id() { - _impl_.id_ = 0u; - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline uint32_t AppearanceFlagLenshelp::_internal_id() const { - return _impl_.id_; -} -inline uint32_t AppearanceFlagLenshelp::id() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagLenshelp.id) - return _internal_id(); -} -inline void AppearanceFlagLenshelp::_internal_set_id(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.id_ = value; -} -inline void AppearanceFlagLenshelp::set_id(uint32_t value) { - _internal_set_id(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagLenshelp.id) -} - -// ------------------------------------------------------------------- - -// AppearanceFlagChangedToExpire - -// optional uint32 former_object_typeid = 1; -inline bool AppearanceFlagChangedToExpire::_internal_has_former_object_typeid() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool AppearanceFlagChangedToExpire::has_former_object_typeid() const { - return _internal_has_former_object_typeid(); -} -inline void AppearanceFlagChangedToExpire::clear_former_object_typeid() { - _impl_.former_object_typeid_ = 0u; - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline uint32_t AppearanceFlagChangedToExpire::_internal_former_object_typeid() const { - return _impl_.former_object_typeid_; -} -inline uint32_t AppearanceFlagChangedToExpire::former_object_typeid() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagChangedToExpire.former_object_typeid) - return _internal_former_object_typeid(); -} -inline void AppearanceFlagChangedToExpire::_internal_set_former_object_typeid(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.former_object_typeid_ = value; -} -inline void AppearanceFlagChangedToExpire::set_former_object_typeid(uint32_t value) { - _internal_set_former_object_typeid(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagChangedToExpire.former_object_typeid) -} - -// ------------------------------------------------------------------- - -// AppearanceFlagCyclopedia - -// optional uint32 cyclopedia_type = 1; -inline bool AppearanceFlagCyclopedia::_internal_has_cyclopedia_type() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool AppearanceFlagCyclopedia::has_cyclopedia_type() const { - return _internal_has_cyclopedia_type(); -} -inline void AppearanceFlagCyclopedia::clear_cyclopedia_type() { - _impl_.cyclopedia_type_ = 0u; - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline uint32_t AppearanceFlagCyclopedia::_internal_cyclopedia_type() const { - return _impl_.cyclopedia_type_; -} -inline uint32_t AppearanceFlagCyclopedia::cyclopedia_type() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.AppearanceFlagCyclopedia.cyclopedia_type) - return _internal_cyclopedia_type(); -} -inline void AppearanceFlagCyclopedia::_internal_set_cyclopedia_type(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.cyclopedia_type_ = value; -} -inline void AppearanceFlagCyclopedia::set_cyclopedia_type(uint32_t value) { - _internal_set_cyclopedia_type(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.AppearanceFlagCyclopedia.cyclopedia_type) -} - -// ------------------------------------------------------------------- - -// SpecialMeaningAppearanceIds - -// optional uint32 gold_coin_id = 1; -inline bool SpecialMeaningAppearanceIds::_internal_has_gold_coin_id() const { - bool value = (_impl_._has_bits_[0] & 0x00000001u) != 0; - return value; -} -inline bool SpecialMeaningAppearanceIds::has_gold_coin_id() const { - return _internal_has_gold_coin_id(); -} -inline void SpecialMeaningAppearanceIds::clear_gold_coin_id() { - _impl_.gold_coin_id_ = 0u; - _impl_._has_bits_[0] &= ~0x00000001u; -} -inline uint32_t SpecialMeaningAppearanceIds::_internal_gold_coin_id() const { - return _impl_.gold_coin_id_; -} -inline uint32_t SpecialMeaningAppearanceIds::gold_coin_id() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpecialMeaningAppearanceIds.gold_coin_id) - return _internal_gold_coin_id(); -} -inline void SpecialMeaningAppearanceIds::_internal_set_gold_coin_id(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000001u; - _impl_.gold_coin_id_ = value; -} -inline void SpecialMeaningAppearanceIds::set_gold_coin_id(uint32_t value) { - _internal_set_gold_coin_id(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpecialMeaningAppearanceIds.gold_coin_id) -} - -// optional uint32 platinum_coin_id = 2; -inline bool SpecialMeaningAppearanceIds::_internal_has_platinum_coin_id() const { - bool value = (_impl_._has_bits_[0] & 0x00000002u) != 0; - return value; -} -inline bool SpecialMeaningAppearanceIds::has_platinum_coin_id() const { - return _internal_has_platinum_coin_id(); -} -inline void SpecialMeaningAppearanceIds::clear_platinum_coin_id() { - _impl_.platinum_coin_id_ = 0u; - _impl_._has_bits_[0] &= ~0x00000002u; -} -inline uint32_t SpecialMeaningAppearanceIds::_internal_platinum_coin_id() const { - return _impl_.platinum_coin_id_; -} -inline uint32_t SpecialMeaningAppearanceIds::platinum_coin_id() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpecialMeaningAppearanceIds.platinum_coin_id) - return _internal_platinum_coin_id(); -} -inline void SpecialMeaningAppearanceIds::_internal_set_platinum_coin_id(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000002u; - _impl_.platinum_coin_id_ = value; -} -inline void SpecialMeaningAppearanceIds::set_platinum_coin_id(uint32_t value) { - _internal_set_platinum_coin_id(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpecialMeaningAppearanceIds.platinum_coin_id) -} - -// optional uint32 crystal_coin_id = 3; -inline bool SpecialMeaningAppearanceIds::_internal_has_crystal_coin_id() const { - bool value = (_impl_._has_bits_[0] & 0x00000004u) != 0; - return value; -} -inline bool SpecialMeaningAppearanceIds::has_crystal_coin_id() const { - return _internal_has_crystal_coin_id(); -} -inline void SpecialMeaningAppearanceIds::clear_crystal_coin_id() { - _impl_.crystal_coin_id_ = 0u; - _impl_._has_bits_[0] &= ~0x00000004u; -} -inline uint32_t SpecialMeaningAppearanceIds::_internal_crystal_coin_id() const { - return _impl_.crystal_coin_id_; -} -inline uint32_t SpecialMeaningAppearanceIds::crystal_coin_id() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpecialMeaningAppearanceIds.crystal_coin_id) - return _internal_crystal_coin_id(); -} -inline void SpecialMeaningAppearanceIds::_internal_set_crystal_coin_id(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000004u; - _impl_.crystal_coin_id_ = value; -} -inline void SpecialMeaningAppearanceIds::set_crystal_coin_id(uint32_t value) { - _internal_set_crystal_coin_id(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpecialMeaningAppearanceIds.crystal_coin_id) -} - -// optional uint32 tibia_coin_id = 4; -inline bool SpecialMeaningAppearanceIds::_internal_has_tibia_coin_id() const { - bool value = (_impl_._has_bits_[0] & 0x00000008u) != 0; - return value; -} -inline bool SpecialMeaningAppearanceIds::has_tibia_coin_id() const { - return _internal_has_tibia_coin_id(); -} -inline void SpecialMeaningAppearanceIds::clear_tibia_coin_id() { - _impl_.tibia_coin_id_ = 0u; - _impl_._has_bits_[0] &= ~0x00000008u; -} -inline uint32_t SpecialMeaningAppearanceIds::_internal_tibia_coin_id() const { - return _impl_.tibia_coin_id_; -} -inline uint32_t SpecialMeaningAppearanceIds::tibia_coin_id() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpecialMeaningAppearanceIds.tibia_coin_id) - return _internal_tibia_coin_id(); -} -inline void SpecialMeaningAppearanceIds::_internal_set_tibia_coin_id(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000008u; - _impl_.tibia_coin_id_ = value; -} -inline void SpecialMeaningAppearanceIds::set_tibia_coin_id(uint32_t value) { - _internal_set_tibia_coin_id(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpecialMeaningAppearanceIds.tibia_coin_id) -} - -// optional uint32 stamped_letter_id = 5; -inline bool SpecialMeaningAppearanceIds::_internal_has_stamped_letter_id() const { - bool value = (_impl_._has_bits_[0] & 0x00000010u) != 0; - return value; -} -inline bool SpecialMeaningAppearanceIds::has_stamped_letter_id() const { - return _internal_has_stamped_letter_id(); -} -inline void SpecialMeaningAppearanceIds::clear_stamped_letter_id() { - _impl_.stamped_letter_id_ = 0u; - _impl_._has_bits_[0] &= ~0x00000010u; -} -inline uint32_t SpecialMeaningAppearanceIds::_internal_stamped_letter_id() const { - return _impl_.stamped_letter_id_; -} -inline uint32_t SpecialMeaningAppearanceIds::stamped_letter_id() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpecialMeaningAppearanceIds.stamped_letter_id) - return _internal_stamped_letter_id(); -} -inline void SpecialMeaningAppearanceIds::_internal_set_stamped_letter_id(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000010u; - _impl_.stamped_letter_id_ = value; -} -inline void SpecialMeaningAppearanceIds::set_stamped_letter_id(uint32_t value) { - _internal_set_stamped_letter_id(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpecialMeaningAppearanceIds.stamped_letter_id) -} - -// optional uint32 supply_stash_id = 6; -inline bool SpecialMeaningAppearanceIds::_internal_has_supply_stash_id() const { - bool value = (_impl_._has_bits_[0] & 0x00000020u) != 0; - return value; -} -inline bool SpecialMeaningAppearanceIds::has_supply_stash_id() const { - return _internal_has_supply_stash_id(); -} -inline void SpecialMeaningAppearanceIds::clear_supply_stash_id() { - _impl_.supply_stash_id_ = 0u; - _impl_._has_bits_[0] &= ~0x00000020u; -} -inline uint32_t SpecialMeaningAppearanceIds::_internal_supply_stash_id() const { - return _impl_.supply_stash_id_; -} -inline uint32_t SpecialMeaningAppearanceIds::supply_stash_id() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpecialMeaningAppearanceIds.supply_stash_id) - return _internal_supply_stash_id(); -} -inline void SpecialMeaningAppearanceIds::_internal_set_supply_stash_id(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000020u; - _impl_.supply_stash_id_ = value; -} -inline void SpecialMeaningAppearanceIds::set_supply_stash_id(uint32_t value) { - _internal_set_supply_stash_id(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpecialMeaningAppearanceIds.supply_stash_id) -} - -// optional uint32 reward_chest_id = 7; -inline bool SpecialMeaningAppearanceIds::_internal_has_reward_chest_id() const { - bool value = (_impl_._has_bits_[0] & 0x00000040u) != 0; - return value; -} -inline bool SpecialMeaningAppearanceIds::has_reward_chest_id() const { - return _internal_has_reward_chest_id(); -} -inline void SpecialMeaningAppearanceIds::clear_reward_chest_id() { - _impl_.reward_chest_id_ = 0u; - _impl_._has_bits_[0] &= ~0x00000040u; -} -inline uint32_t SpecialMeaningAppearanceIds::_internal_reward_chest_id() const { - return _impl_.reward_chest_id_; -} -inline uint32_t SpecialMeaningAppearanceIds::reward_chest_id() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.appearances.SpecialMeaningAppearanceIds.reward_chest_id) - return _internal_reward_chest_id(); -} -inline void SpecialMeaningAppearanceIds::_internal_set_reward_chest_id(uint32_t value) { - _impl_._has_bits_[0] |= 0x00000040u; - _impl_.reward_chest_id_ = value; -} -inline void SpecialMeaningAppearanceIds::set_reward_chest_id(uint32_t value) { - _internal_set_reward_chest_id(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.appearances.SpecialMeaningAppearanceIds.reward_chest_id) -} - -#ifdef __GNUC__ - #pragma GCC diagnostic pop -#endif // __GNUC__ -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - - -// @@protoc_insertion_point(namespace_scope) - -} // namespace appearances -} // namespace protobuf -} // namespace Canary - -PROTOBUF_NAMESPACE_OPEN - -template <> struct is_proto_enum< ::Canary::protobuf::appearances::PLAYER_ACTION> : ::std::true_type {}; -template <> -inline const EnumDescriptor* GetEnumDescriptor< ::Canary::protobuf::appearances::PLAYER_ACTION>() { - return ::Canary::protobuf::appearances::PLAYER_ACTION_descriptor(); -} -template <> struct is_proto_enum< ::Canary::protobuf::appearances::ITEM_CATEGORY> : ::std::true_type {}; -template <> -inline const EnumDescriptor* GetEnumDescriptor< ::Canary::protobuf::appearances::ITEM_CATEGORY>() { - return ::Canary::protobuf::appearances::ITEM_CATEGORY_descriptor(); -} -template <> struct is_proto_enum< ::Canary::protobuf::appearances::PLAYER_PROFESSION> : ::std::true_type {}; -template <> -inline const EnumDescriptor* GetEnumDescriptor< ::Canary::protobuf::appearances::PLAYER_PROFESSION>() { - return ::Canary::protobuf::appearances::PLAYER_PROFESSION_descriptor(); -} -template <> struct is_proto_enum< ::Canary::protobuf::appearances::ANIMATION_LOOP_TYPE> : ::std::true_type {}; -template <> -inline const EnumDescriptor* GetEnumDescriptor< ::Canary::protobuf::appearances::ANIMATION_LOOP_TYPE>() { - return ::Canary::protobuf::appearances::ANIMATION_LOOP_TYPE_descriptor(); -} -template <> struct is_proto_enum< ::Canary::protobuf::appearances::HOOK_TYPE> : ::std::true_type {}; -template <> -inline const EnumDescriptor* GetEnumDescriptor< ::Canary::protobuf::appearances::HOOK_TYPE>() { - return ::Canary::protobuf::appearances::HOOK_TYPE_descriptor(); -} -template <> struct is_proto_enum< ::Canary::protobuf::appearances::FIXED_FRAME_GROUP> : ::std::true_type {}; -template <> -inline const EnumDescriptor* GetEnumDescriptor< ::Canary::protobuf::appearances::FIXED_FRAME_GROUP>() { - return ::Canary::protobuf::appearances::FIXED_FRAME_GROUP_descriptor(); -} - -PROTOBUF_NAMESPACE_CLOSE - -// @@protoc_insertion_point(global_scope) - -#include -#endif // GOOGLE_PROTOBUF_INCLUDED_GOOGLE_PROTOBUF_INCLUDED_appearances_2eproto diff --git a/src/protobuf/kv.pb.cc b/src/protobuf/kv.pb.cc deleted file mode 100644 index 74cbaece407..00000000000 --- a/src/protobuf/kv.pb.cc +++ /dev/null @@ -1,1247 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: kv.proto - -#include "kv.pb.h" - -#include - -#include -#include -#include -#include -#include -#include -#include -// @@protoc_insertion_point(includes) -#include - -PROTOBUF_PRAGMA_INIT_SEG - -namespace _pb = ::PROTOBUF_NAMESPACE_ID; -namespace _pbi = _pb::internal; - -namespace Canary { -namespace protobuf { -namespace kv { -PROTOBUF_CONSTEXPR ValueWrapper::ValueWrapper( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_.value_)*/{} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_._oneof_case_)*/{}} {} -struct ValueWrapperDefaultTypeInternal { - PROTOBUF_CONSTEXPR ValueWrapperDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~ValueWrapperDefaultTypeInternal() {} - union { - ValueWrapper _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ValueWrapperDefaultTypeInternal _ValueWrapper_default_instance_; -PROTOBUF_CONSTEXPR ArrayType::ArrayType( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_.values_)*/{} - , /*decltype(_impl_._cached_size_)*/{}} {} -struct ArrayTypeDefaultTypeInternal { - PROTOBUF_CONSTEXPR ArrayTypeDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~ArrayTypeDefaultTypeInternal() {} - union { - ArrayType _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 ArrayTypeDefaultTypeInternal _ArrayType_default_instance_; -PROTOBUF_CONSTEXPR KeyValuePair::KeyValuePair( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_.key_)*/{&::_pbi::fixed_address_empty_string, ::_pbi::ConstantInitialized{}} - , /*decltype(_impl_.value_)*/nullptr - , /*decltype(_impl_._cached_size_)*/{}} {} -struct KeyValuePairDefaultTypeInternal { - PROTOBUF_CONSTEXPR KeyValuePairDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~KeyValuePairDefaultTypeInternal() {} - union { - KeyValuePair _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 KeyValuePairDefaultTypeInternal _KeyValuePair_default_instance_; -PROTOBUF_CONSTEXPR MapType::MapType( - ::_pbi::ConstantInitialized): _impl_{ - /*decltype(_impl_.items_)*/{} - , /*decltype(_impl_._cached_size_)*/{}} {} -struct MapTypeDefaultTypeInternal { - PROTOBUF_CONSTEXPR MapTypeDefaultTypeInternal() - : _instance(::_pbi::ConstantInitialized{}) {} - ~MapTypeDefaultTypeInternal() {} - union { - MapType _instance; - }; -}; -PROTOBUF_ATTRIBUTE_NO_DESTROY PROTOBUF_CONSTINIT PROTOBUF_ATTRIBUTE_INIT_PRIORITY1 MapTypeDefaultTypeInternal _MapType_default_instance_; -} // namespace kv -} // namespace protobuf -} // namespace Canary -static ::_pb::Metadata file_level_metadata_kv_2eproto[4]; -static constexpr ::_pb::EnumDescriptor const** file_level_enum_descriptors_kv_2eproto = nullptr; -static constexpr ::_pb::ServiceDescriptor const** file_level_service_descriptors_kv_2eproto = nullptr; - -const uint32_t TableStruct_kv_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { - ~0u, // no _has_bits_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::kv::ValueWrapper, _internal_metadata_), - ~0u, // no _extensions_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::kv::ValueWrapper, _impl_._oneof_case_[0]), - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - ::_pbi::kInvalidFieldOffsetTag, - ::_pbi::kInvalidFieldOffsetTag, - ::_pbi::kInvalidFieldOffsetTag, - ::_pbi::kInvalidFieldOffsetTag, - ::_pbi::kInvalidFieldOffsetTag, - ::_pbi::kInvalidFieldOffsetTag, - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::kv::ValueWrapper, _impl_.value_), - ~0u, // no _has_bits_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::kv::ArrayType, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::kv::ArrayType, _impl_.values_), - ~0u, // no _has_bits_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::kv::KeyValuePair, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::kv::KeyValuePair, _impl_.key_), - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::kv::KeyValuePair, _impl_.value_), - ~0u, // no _has_bits_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::kv::MapType, _internal_metadata_), - ~0u, // no _extensions_ - ~0u, // no _oneof_case_ - ~0u, // no _weak_field_map_ - ~0u, // no _inlined_string_donated_ - PROTOBUF_FIELD_OFFSET(::Canary::protobuf::kv::MapType, _impl_.items_), -}; -static const ::_pbi::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { - { 0, -1, -1, sizeof(::Canary::protobuf::kv::ValueWrapper)}, - { 13, -1, -1, sizeof(::Canary::protobuf::kv::ArrayType)}, - { 20, -1, -1, sizeof(::Canary::protobuf::kv::KeyValuePair)}, - { 28, -1, -1, sizeof(::Canary::protobuf::kv::MapType)}, -}; - -static const ::_pb::Message* const file_default_instances[] = { - &::Canary::protobuf::kv::_ValueWrapper_default_instance_._instance, - &::Canary::protobuf::kv::_ArrayType_default_instance_._instance, - &::Canary::protobuf::kv::_KeyValuePair_default_instance_._instance, - &::Canary::protobuf::kv::_MapType_default_instance_._instance, -}; - -const char descriptor_table_protodef_kv_2eproto[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = - "\n\010kv.proto\022\022Canary.protobuf.kv\"\327\001\n\014Value" - "Wrapper\022\023\n\tstr_value\030\001 \001(\tH\000\022\023\n\tint_valu" - "e\030\002 \001(\005H\000\022\026\n\014double_value\030\003 \001(\001H\000\0224\n\013arr" - "ay_value\030\004 \001(\0132\035.Canary.protobuf.kv.Arra" - "yTypeH\000\0220\n\tmap_value\030\005 \001(\0132\033.Canary.prot" - "obuf.kv.MapTypeH\000\022\024\n\nbool_value\030\006 \001(\010H\000B" - "\007\n\005value\"=\n\tArrayType\0220\n\006values\030\001 \003(\0132 ." - "Canary.protobuf.kv.ValueWrapper\"L\n\014KeyVa" - "luePair\022\013\n\003key\030\001 \001(\t\022/\n\005value\030\002 \001(\0132 .Ca" - "nary.protobuf.kv.ValueWrapper\":\n\007MapType" - "\022/\n\005items\030\001 \003(\0132 .Canary.protobuf.kv.Key" - "ValuePairb\006proto3" - ; -static ::_pbi::once_flag descriptor_table_kv_2eproto_once; -const ::_pbi::DescriptorTable descriptor_table_kv_2eproto = { - false, false, 457, descriptor_table_protodef_kv_2eproto, - "kv.proto", - &descriptor_table_kv_2eproto_once, nullptr, 0, 4, - schemas, file_default_instances, TableStruct_kv_2eproto::offsets, - file_level_metadata_kv_2eproto, file_level_enum_descriptors_kv_2eproto, - file_level_service_descriptors_kv_2eproto, -}; -PROTOBUF_ATTRIBUTE_WEAK const ::_pbi::DescriptorTable* descriptor_table_kv_2eproto_getter() { - return &descriptor_table_kv_2eproto; -} - -// Force running AddDescriptors() at dynamic initialization time. -PROTOBUF_ATTRIBUTE_INIT_PRIORITY2 static ::_pbi::AddDescriptorsRunner dynamic_init_dummy_kv_2eproto(&descriptor_table_kv_2eproto); -namespace Canary { -namespace protobuf { -namespace kv { - -// =================================================================== - -class ValueWrapper::_Internal { - public: - static const ::Canary::protobuf::kv::ArrayType& array_value(const ValueWrapper* msg); - static const ::Canary::protobuf::kv::MapType& map_value(const ValueWrapper* msg); -}; - -const ::Canary::protobuf::kv::ArrayType& -ValueWrapper::_Internal::array_value(const ValueWrapper* msg) { - return *msg->_impl_.value_.array_value_; -} -const ::Canary::protobuf::kv::MapType& -ValueWrapper::_Internal::map_value(const ValueWrapper* msg) { - return *msg->_impl_.value_.map_value_; -} -void ValueWrapper::set_allocated_array_value(::Canary::protobuf::kv::ArrayType* array_value) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - clear_value(); - if (array_value) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(array_value); - if (message_arena != submessage_arena) { - array_value = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, array_value, submessage_arena); - } - set_has_array_value(); - _impl_.value_.array_value_ = array_value; - } - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.kv.ValueWrapper.array_value) -} -void ValueWrapper::set_allocated_map_value(::Canary::protobuf::kv::MapType* map_value) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - clear_value(); - if (map_value) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(map_value); - if (message_arena != submessage_arena) { - map_value = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, map_value, submessage_arena); - } - set_has_map_value(); - _impl_.value_.map_value_ = map_value; - } - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.kv.ValueWrapper.map_value) -} -ValueWrapper::ValueWrapper(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.kv.ValueWrapper) -} -ValueWrapper::ValueWrapper(const ValueWrapper& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - ValueWrapper* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_.value_){} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_._oneof_case_)*/{}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - clear_has_value(); - switch (from.value_case()) { - case kStrValue: { - _this->_internal_set_str_value(from._internal_str_value()); - break; - } - case kIntValue: { - _this->_internal_set_int_value(from._internal_int_value()); - break; - } - case kDoubleValue: { - _this->_internal_set_double_value(from._internal_double_value()); - break; - } - case kArrayValue: { - _this->_internal_mutable_array_value()->::Canary::protobuf::kv::ArrayType::MergeFrom( - from._internal_array_value()); - break; - } - case kMapValue: { - _this->_internal_mutable_map_value()->::Canary::protobuf::kv::MapType::MergeFrom( - from._internal_map_value()); - break; - } - case kBoolValue: { - _this->_internal_set_bool_value(from._internal_bool_value()); - break; - } - case VALUE_NOT_SET: { - break; - } - } - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.kv.ValueWrapper) -} - -inline void ValueWrapper::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_.value_){} - , /*decltype(_impl_._cached_size_)*/{} - , /*decltype(_impl_._oneof_case_)*/{} - }; - clear_has_value(); -} - -ValueWrapper::~ValueWrapper() { - // @@protoc_insertion_point(destructor:Canary.protobuf.kv.ValueWrapper) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void ValueWrapper::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); - if (has_value()) { - clear_value(); - } -} - -void ValueWrapper::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void ValueWrapper::clear_value() { -// @@protoc_insertion_point(one_of_clear_start:Canary.protobuf.kv.ValueWrapper) - switch (value_case()) { - case kStrValue: { - _impl_.value_.str_value_.Destroy(); - break; - } - case kIntValue: { - // No need to clear - break; - } - case kDoubleValue: { - // No need to clear - break; - } - case kArrayValue: { - if (GetArenaForAllocation() == nullptr) { - delete _impl_.value_.array_value_; - } - break; - } - case kMapValue: { - if (GetArenaForAllocation() == nullptr) { - delete _impl_.value_.map_value_; - } - break; - } - case kBoolValue: { - // No need to clear - break; - } - case VALUE_NOT_SET: { - break; - } - } - _impl_._oneof_case_[0] = VALUE_NOT_SET; -} - - -void ValueWrapper::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.kv.ValueWrapper) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - clear_value(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* ValueWrapper::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // string str_value = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 10)) { - auto str = _internal_mutable_str_value(); - ptr = ::_pbi::InlineGreedyStringParser(str, ptr, ctx); - CHK_(ptr); - CHK_(::_pbi::VerifyUTF8(str, "Canary.protobuf.kv.ValueWrapper.str_value")); - } else - goto handle_unusual; - continue; - // int32 int_value = 2; - case 2: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 16)) { - _internal_set_int_value(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint32(&ptr)); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // double double_value = 3; - case 3: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 25)) { - _internal_set_double_value(::PROTOBUF_NAMESPACE_ID::internal::UnalignedLoad(ptr)); - ptr += sizeof(double); - } else - goto handle_unusual; - continue; - // .Canary.protobuf.kv.ArrayType array_value = 4; - case 4: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 34)) { - ptr = ctx->ParseMessage(_internal_mutable_array_value(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // .Canary.protobuf.kv.MapType map_value = 5; - case 5: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 42)) { - ptr = ctx->ParseMessage(_internal_mutable_map_value(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - // bool bool_value = 6; - case 6: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 48)) { - _internal_set_bool_value(::PROTOBUF_NAMESPACE_ID::internal::ReadVarint64(&ptr)); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* ValueWrapper::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.kv.ValueWrapper) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - // string str_value = 1; - if (_internal_has_str_value()) { - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( - this->_internal_str_value().data(), static_cast(this->_internal_str_value().length()), - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, - "Canary.protobuf.kv.ValueWrapper.str_value"); - target = stream->WriteStringMaybeAliased( - 1, this->_internal_str_value(), target); - } - - // int32 int_value = 2; - if (_internal_has_int_value()) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteInt32ToArray(2, this->_internal_int_value(), target); - } - - // double double_value = 3; - if (_internal_has_double_value()) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteDoubleToArray(3, this->_internal_double_value(), target); - } - - // .Canary.protobuf.kv.ArrayType array_value = 4; - if (_internal_has_array_value()) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(4, _Internal::array_value(this), - _Internal::array_value(this).GetCachedSize(), target, stream); - } - - // .Canary.protobuf.kv.MapType map_value = 5; - if (_internal_has_map_value()) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(5, _Internal::map_value(this), - _Internal::map_value(this).GetCachedSize(), target, stream); - } - - // bool bool_value = 6; - if (_internal_has_bool_value()) { - target = stream->EnsureSpace(target); - target = ::_pbi::WireFormatLite::WriteBoolToArray(6, this->_internal_bool_value(), target); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.kv.ValueWrapper) - return target; -} - -size_t ValueWrapper::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.kv.ValueWrapper) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - switch (value_case()) { - // string str_value = 1; - case kStrValue: { - total_size += 1 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( - this->_internal_str_value()); - break; - } - // int32 int_value = 2; - case kIntValue: { - total_size += ::_pbi::WireFormatLite::Int32SizePlusOne(this->_internal_int_value()); - break; - } - // double double_value = 3; - case kDoubleValue: { - total_size += 1 + 8; - break; - } - // .Canary.protobuf.kv.ArrayType array_value = 4; - case kArrayValue: { - total_size += 1 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.value_.array_value_); - break; - } - // .Canary.protobuf.kv.MapType map_value = 5; - case kMapValue: { - total_size += 1 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.value_.map_value_); - break; - } - // bool bool_value = 6; - case kBoolValue: { - total_size += 1 + 1; - break; - } - case VALUE_NOT_SET: { - break; - } - } - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ValueWrapper::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - ValueWrapper::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ValueWrapper::GetClassData() const { return &_class_data_; } - - -void ValueWrapper::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.kv.ValueWrapper) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - switch (from.value_case()) { - case kStrValue: { - _this->_internal_set_str_value(from._internal_str_value()); - break; - } - case kIntValue: { - _this->_internal_set_int_value(from._internal_int_value()); - break; - } - case kDoubleValue: { - _this->_internal_set_double_value(from._internal_double_value()); - break; - } - case kArrayValue: { - _this->_internal_mutable_array_value()->::Canary::protobuf::kv::ArrayType::MergeFrom( - from._internal_array_value()); - break; - } - case kMapValue: { - _this->_internal_mutable_map_value()->::Canary::protobuf::kv::MapType::MergeFrom( - from._internal_map_value()); - break; - } - case kBoolValue: { - _this->_internal_set_bool_value(from._internal_bool_value()); - break; - } - case VALUE_NOT_SET: { - break; - } - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void ValueWrapper::CopyFrom(const ValueWrapper& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.kv.ValueWrapper) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool ValueWrapper::IsInitialized() const { - return true; -} - -void ValueWrapper::InternalSwap(ValueWrapper* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - swap(_impl_.value_, other->_impl_.value_); - swap(_impl_._oneof_case_[0], other->_impl_._oneof_case_[0]); -} - -::PROTOBUF_NAMESPACE_ID::Metadata ValueWrapper::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_kv_2eproto_getter, &descriptor_table_kv_2eproto_once, - file_level_metadata_kv_2eproto[0]); -} - -// =================================================================== - -class ArrayType::_Internal { - public: -}; - -ArrayType::ArrayType(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.kv.ArrayType) -} -ArrayType::ArrayType(const ArrayType& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - ArrayType* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_.values_){from._impl_.values_} - , /*decltype(_impl_._cached_size_)*/{}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.kv.ArrayType) -} - -inline void ArrayType::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_.values_){arena} - , /*decltype(_impl_._cached_size_)*/{} - }; -} - -ArrayType::~ArrayType() { - // @@protoc_insertion_point(destructor:Canary.protobuf.kv.ArrayType) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void ArrayType::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); - _impl_.values_.~RepeatedPtrField(); -} - -void ArrayType::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void ArrayType::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.kv.ArrayType) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.values_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* ArrayType::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // repeated .Canary.protobuf.kv.ValueWrapper values = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 10)) { - ptr -= 1; - do { - ptr += 1; - ptr = ctx->ParseMessage(_internal_add_values(), ptr); - CHK_(ptr); - if (!ctx->DataAvailable(ptr)) break; - } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<10>(ptr)); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* ArrayType::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.kv.ArrayType) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - // repeated .Canary.protobuf.kv.ValueWrapper values = 1; - for (unsigned i = 0, - n = static_cast(this->_internal_values_size()); i < n; i++) { - const auto& repfield = this->_internal_values(i); - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(1, repfield, repfield.GetCachedSize(), target, stream); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.kv.ArrayType) - return target; -} - -size_t ArrayType::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.kv.ArrayType) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // repeated .Canary.protobuf.kv.ValueWrapper values = 1; - total_size += 1UL * this->_internal_values_size(); - for (const auto& msg : this->_impl_.values_) { - total_size += - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg); - } - - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData ArrayType::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - ArrayType::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*ArrayType::GetClassData() const { return &_class_data_; } - - -void ArrayType::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.kv.ArrayType) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - _this->_impl_.values_.MergeFrom(from._impl_.values_); - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void ArrayType::CopyFrom(const ArrayType& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.kv.ArrayType) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool ArrayType::IsInitialized() const { - return true; -} - -void ArrayType::InternalSwap(ArrayType* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - _impl_.values_.InternalSwap(&other->_impl_.values_); -} - -::PROTOBUF_NAMESPACE_ID::Metadata ArrayType::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_kv_2eproto_getter, &descriptor_table_kv_2eproto_once, - file_level_metadata_kv_2eproto[1]); -} - -// =================================================================== - -class KeyValuePair::_Internal { - public: - static const ::Canary::protobuf::kv::ValueWrapper& value(const KeyValuePair* msg); -}; - -const ::Canary::protobuf::kv::ValueWrapper& -KeyValuePair::_Internal::value(const KeyValuePair* msg) { - return *msg->_impl_.value_; -} -KeyValuePair::KeyValuePair(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.kv.KeyValuePair) -} -KeyValuePair::KeyValuePair(const KeyValuePair& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - KeyValuePair* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_.key_){} - , decltype(_impl_.value_){nullptr} - , /*decltype(_impl_._cached_size_)*/{}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - _impl_.key_.InitDefault(); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - _impl_.key_.Set("", GetArenaForAllocation()); - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (!from._internal_key().empty()) { - _this->_impl_.key_.Set(from._internal_key(), - _this->GetArenaForAllocation()); - } - if (from._internal_has_value()) { - _this->_impl_.value_ = new ::Canary::protobuf::kv::ValueWrapper(*from._impl_.value_); - } - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.kv.KeyValuePair) -} - -inline void KeyValuePair::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_.key_){} - , decltype(_impl_.value_){nullptr} - , /*decltype(_impl_._cached_size_)*/{} - }; - _impl_.key_.InitDefault(); - #ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - _impl_.key_.Set("", GetArenaForAllocation()); - #endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING -} - -KeyValuePair::~KeyValuePair() { - // @@protoc_insertion_point(destructor:Canary.protobuf.kv.KeyValuePair) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void KeyValuePair::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); - _impl_.key_.Destroy(); - if (this != internal_default_instance()) delete _impl_.value_; -} - -void KeyValuePair::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void KeyValuePair::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.kv.KeyValuePair) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.key_.ClearToEmpty(); - if (GetArenaForAllocation() == nullptr && _impl_.value_ != nullptr) { - delete _impl_.value_; - } - _impl_.value_ = nullptr; - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* KeyValuePair::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // string key = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 10)) { - auto str = _internal_mutable_key(); - ptr = ::_pbi::InlineGreedyStringParser(str, ptr, ctx); - CHK_(ptr); - CHK_(::_pbi::VerifyUTF8(str, "Canary.protobuf.kv.KeyValuePair.key")); - } else - goto handle_unusual; - continue; - // .Canary.protobuf.kv.ValueWrapper value = 2; - case 2: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 18)) { - ptr = ctx->ParseMessage(_internal_mutable_value(), ptr); - CHK_(ptr); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* KeyValuePair::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.kv.KeyValuePair) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - // string key = 1; - if (!this->_internal_key().empty()) { - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::VerifyUtf8String( - this->_internal_key().data(), static_cast(this->_internal_key().length()), - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::SERIALIZE, - "Canary.protobuf.kv.KeyValuePair.key"); - target = stream->WriteStringMaybeAliased( - 1, this->_internal_key(), target); - } - - // .Canary.protobuf.kv.ValueWrapper value = 2; - if (this->_internal_has_value()) { - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(2, _Internal::value(this), - _Internal::value(this).GetCachedSize(), target, stream); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.kv.KeyValuePair) - return target; -} - -size_t KeyValuePair::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.kv.KeyValuePair) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // string key = 1; - if (!this->_internal_key().empty()) { - total_size += 1 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::StringSize( - this->_internal_key()); - } - - // .Canary.protobuf.kv.ValueWrapper value = 2; - if (this->_internal_has_value()) { - total_size += 1 + - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize( - *_impl_.value_); - } - - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData KeyValuePair::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - KeyValuePair::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*KeyValuePair::GetClassData() const { return &_class_data_; } - - -void KeyValuePair::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.kv.KeyValuePair) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - if (!from._internal_key().empty()) { - _this->_internal_set_key(from._internal_key()); - } - if (from._internal_has_value()) { - _this->_internal_mutable_value()->::Canary::protobuf::kv::ValueWrapper::MergeFrom( - from._internal_value()); - } - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void KeyValuePair::CopyFrom(const KeyValuePair& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.kv.KeyValuePair) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool KeyValuePair::IsInitialized() const { - return true; -} - -void KeyValuePair::InternalSwap(KeyValuePair* other) { - using std::swap; - auto* lhs_arena = GetArenaForAllocation(); - auto* rhs_arena = other->GetArenaForAllocation(); - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr::InternalSwap( - &_impl_.key_, lhs_arena, - &other->_impl_.key_, rhs_arena - ); - swap(_impl_.value_, other->_impl_.value_); -} - -::PROTOBUF_NAMESPACE_ID::Metadata KeyValuePair::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_kv_2eproto_getter, &descriptor_table_kv_2eproto_once, - file_level_metadata_kv_2eproto[2]); -} - -// =================================================================== - -class MapType::_Internal { - public: -}; - -MapType::MapType(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned) - : ::PROTOBUF_NAMESPACE_ID::Message(arena, is_message_owned) { - SharedCtor(arena, is_message_owned); - // @@protoc_insertion_point(arena_constructor:Canary.protobuf.kv.MapType) -} -MapType::MapType(const MapType& from) - : ::PROTOBUF_NAMESPACE_ID::Message() { - MapType* const _this = this; (void)_this; - new (&_impl_) Impl_{ - decltype(_impl_.items_){from._impl_.items_} - , /*decltype(_impl_._cached_size_)*/{}}; - - _internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); - // @@protoc_insertion_point(copy_constructor:Canary.protobuf.kv.MapType) -} - -inline void MapType::SharedCtor( - ::_pb::Arena* arena, bool is_message_owned) { - (void)arena; - (void)is_message_owned; - new (&_impl_) Impl_{ - decltype(_impl_.items_){arena} - , /*decltype(_impl_._cached_size_)*/{} - }; -} - -MapType::~MapType() { - // @@protoc_insertion_point(destructor:Canary.protobuf.kv.MapType) - if (auto *arena = _internal_metadata_.DeleteReturnArena<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>()) { - (void)arena; - return; - } - SharedDtor(); -} - -inline void MapType::SharedDtor() { - GOOGLE_DCHECK(GetArenaForAllocation() == nullptr); - _impl_.items_.~RepeatedPtrField(); -} - -void MapType::SetCachedSize(int size) const { - _impl_._cached_size_.Set(size); -} - -void MapType::Clear() { -// @@protoc_insertion_point(message_clear_start:Canary.protobuf.kv.MapType) - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - _impl_.items_.Clear(); - _internal_metadata_.Clear<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(); -} - -const char* MapType::_InternalParse(const char* ptr, ::_pbi::ParseContext* ctx) { -#define CHK_(x) if (PROTOBUF_PREDICT_FALSE(!(x))) goto failure - while (!ctx->Done(&ptr)) { - uint32_t tag; - ptr = ::_pbi::ReadTag(ptr, &tag); - switch (tag >> 3) { - // repeated .Canary.protobuf.kv.KeyValuePair items = 1; - case 1: - if (PROTOBUF_PREDICT_TRUE(static_cast(tag) == 10)) { - ptr -= 1; - do { - ptr += 1; - ptr = ctx->ParseMessage(_internal_add_items(), ptr); - CHK_(ptr); - if (!ctx->DataAvailable(ptr)) break; - } while (::PROTOBUF_NAMESPACE_ID::internal::ExpectTag<10>(ptr)); - } else - goto handle_unusual; - continue; - default: - goto handle_unusual; - } // switch - handle_unusual: - if ((tag == 0) || ((tag & 7) == 4)) { - CHK_(ptr); - ctx->SetLastTag(tag); - goto message_done; - } - ptr = UnknownFieldParse( - tag, - _internal_metadata_.mutable_unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(), - ptr, ctx); - CHK_(ptr != nullptr); - } // while -message_done: - return ptr; -failure: - ptr = nullptr; - goto message_done; -#undef CHK_ -} - -uint8_t* MapType::_InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const { - // @@protoc_insertion_point(serialize_to_array_start:Canary.protobuf.kv.MapType) - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - // repeated .Canary.protobuf.kv.KeyValuePair items = 1; - for (unsigned i = 0, - n = static_cast(this->_internal_items_size()); i < n; i++) { - const auto& repfield = this->_internal_items(i); - target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite:: - InternalWriteMessage(1, repfield, repfield.GetCachedSize(), target, stream); - } - - if (PROTOBUF_PREDICT_FALSE(_internal_metadata_.have_unknown_fields())) { - target = ::_pbi::WireFormat::InternalSerializeUnknownFieldsToArray( - _internal_metadata_.unknown_fields<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(::PROTOBUF_NAMESPACE_ID::UnknownFieldSet::default_instance), target, stream); - } - // @@protoc_insertion_point(serialize_to_array_end:Canary.protobuf.kv.MapType) - return target; -} - -size_t MapType::ByteSizeLong() const { -// @@protoc_insertion_point(message_byte_size_start:Canary.protobuf.kv.MapType) - size_t total_size = 0; - - uint32_t cached_has_bits = 0; - // Prevent compiler warnings about cached_has_bits being unused - (void) cached_has_bits; - - // repeated .Canary.protobuf.kv.KeyValuePair items = 1; - total_size += 1UL * this->_internal_items_size(); - for (const auto& msg : this->_impl_.items_) { - total_size += - ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::MessageSize(msg); - } - - return MaybeComputeUnknownFieldsSize(total_size, &_impl_._cached_size_); -} - -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData MapType::_class_data_ = { - ::PROTOBUF_NAMESPACE_ID::Message::CopyWithSourceCheck, - MapType::MergeImpl -}; -const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*MapType::GetClassData() const { return &_class_data_; } - - -void MapType::MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg) { - auto* const _this = static_cast(&to_msg); - auto& from = static_cast(from_msg); - // @@protoc_insertion_point(class_specific_merge_from_start:Canary.protobuf.kv.MapType) - GOOGLE_DCHECK_NE(&from, _this); - uint32_t cached_has_bits = 0; - (void) cached_has_bits; - - _this->_impl_.items_.MergeFrom(from._impl_.items_); - _this->_internal_metadata_.MergeFrom<::PROTOBUF_NAMESPACE_ID::UnknownFieldSet>(from._internal_metadata_); -} - -void MapType::CopyFrom(const MapType& from) { -// @@protoc_insertion_point(class_specific_copy_from_start:Canary.protobuf.kv.MapType) - if (&from == this) return; - Clear(); - MergeFrom(from); -} - -bool MapType::IsInitialized() const { - return true; -} - -void MapType::InternalSwap(MapType* other) { - using std::swap; - _internal_metadata_.InternalSwap(&other->_internal_metadata_); - _impl_.items_.InternalSwap(&other->_impl_.items_); -} - -::PROTOBUF_NAMESPACE_ID::Metadata MapType::GetMetadata() const { - return ::_pbi::AssignDescriptors( - &descriptor_table_kv_2eproto_getter, &descriptor_table_kv_2eproto_once, - file_level_metadata_kv_2eproto[3]); -} - -// @@protoc_insertion_point(namespace_scope) -} // namespace kv -} // namespace protobuf -} // namespace Canary -PROTOBUF_NAMESPACE_OPEN -template<> PROTOBUF_NOINLINE ::Canary::protobuf::kv::ValueWrapper* -Arena::CreateMaybeMessage< ::Canary::protobuf::kv::ValueWrapper >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::kv::ValueWrapper >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::kv::ArrayType* -Arena::CreateMaybeMessage< ::Canary::protobuf::kv::ArrayType >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::kv::ArrayType >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::kv::KeyValuePair* -Arena::CreateMaybeMessage< ::Canary::protobuf::kv::KeyValuePair >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::kv::KeyValuePair >(arena); -} -template<> PROTOBUF_NOINLINE ::Canary::protobuf::kv::MapType* -Arena::CreateMaybeMessage< ::Canary::protobuf::kv::MapType >(Arena* arena) { - return Arena::CreateMessageInternal< ::Canary::protobuf::kv::MapType >(arena); -} -PROTOBUF_NAMESPACE_CLOSE - -// @@protoc_insertion_point(global_scope) -#include diff --git a/src/protobuf/kv.pb.h b/src/protobuf/kv.pb.h deleted file mode 100644 index c40c0a46502..00000000000 --- a/src/protobuf/kv.pb.h +++ /dev/null @@ -1,1441 +0,0 @@ -// Generated by the protocol buffer compiler. DO NOT EDIT! -// source: kv.proto - -#ifndef GOOGLE_PROTOBUF_INCLUDED_kv_2eproto -#define GOOGLE_PROTOBUF_INCLUDED_kv_2eproto - -#include -#include - -#include -#if PROTOBUF_VERSION < 3021000 -#error This file was generated by a newer version of protoc which is -#error incompatible with your Protocol Buffer headers. Please update -#error your headers. -#endif -#if 3021012 < PROTOBUF_MIN_PROTOC_VERSION -#error This file was generated by an older version of protoc which is -#error incompatible with your Protocol Buffer headers. Please -#error regenerate this file with a newer version of protoc. -#endif - -#include -#include -#include -#include -#include -#include -#include -#include -#include // IWYU pragma: export -#include // IWYU pragma: export -#include -// @@protoc_insertion_point(includes) -#include -#define PROTOBUF_INTERNAL_EXPORT_kv_2eproto -PROTOBUF_NAMESPACE_OPEN -namespace internal { -class AnyMetadata; -} // namespace internal -PROTOBUF_NAMESPACE_CLOSE - -// Internal implementation detail -- do not use these members. -struct TableStruct_kv_2eproto { - static const uint32_t offsets[]; -}; -extern const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_kv_2eproto; -namespace Canary { -namespace protobuf { -namespace kv { -class ArrayType; -struct ArrayTypeDefaultTypeInternal; -extern ArrayTypeDefaultTypeInternal _ArrayType_default_instance_; -class KeyValuePair; -struct KeyValuePairDefaultTypeInternal; -extern KeyValuePairDefaultTypeInternal _KeyValuePair_default_instance_; -class MapType; -struct MapTypeDefaultTypeInternal; -extern MapTypeDefaultTypeInternal _MapType_default_instance_; -class ValueWrapper; -struct ValueWrapperDefaultTypeInternal; -extern ValueWrapperDefaultTypeInternal _ValueWrapper_default_instance_; -} // namespace kv -} // namespace protobuf -} // namespace Canary -PROTOBUF_NAMESPACE_OPEN -template<> ::Canary::protobuf::kv::ArrayType* Arena::CreateMaybeMessage<::Canary::protobuf::kv::ArrayType>(Arena*); -template<> ::Canary::protobuf::kv::KeyValuePair* Arena::CreateMaybeMessage<::Canary::protobuf::kv::KeyValuePair>(Arena*); -template<> ::Canary::protobuf::kv::MapType* Arena::CreateMaybeMessage<::Canary::protobuf::kv::MapType>(Arena*); -template<> ::Canary::protobuf::kv::ValueWrapper* Arena::CreateMaybeMessage<::Canary::protobuf::kv::ValueWrapper>(Arena*); -PROTOBUF_NAMESPACE_CLOSE -namespace Canary { -namespace protobuf { -namespace kv { - -// =================================================================== - -class ValueWrapper final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.kv.ValueWrapper) */ { - public: - inline ValueWrapper() : ValueWrapper(nullptr) {} - ~ValueWrapper() override; - explicit PROTOBUF_CONSTEXPR ValueWrapper(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - ValueWrapper(const ValueWrapper& from); - ValueWrapper(ValueWrapper&& from) noexcept - : ValueWrapper() { - *this = ::std::move(from); - } - - inline ValueWrapper& operator=(const ValueWrapper& from) { - CopyFrom(from); - return *this; - } - inline ValueWrapper& operator=(ValueWrapper&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const ValueWrapper& default_instance() { - return *internal_default_instance(); - } - enum ValueCase { - kStrValue = 1, - kIntValue = 2, - kDoubleValue = 3, - kArrayValue = 4, - kMapValue = 5, - kBoolValue = 6, - VALUE_NOT_SET = 0, - }; - - static inline const ValueWrapper* internal_default_instance() { - return reinterpret_cast( - &_ValueWrapper_default_instance_); - } - static constexpr int kIndexInFileMessages = - 0; - - friend void swap(ValueWrapper& a, ValueWrapper& b) { - a.Swap(&b); - } - inline void Swap(ValueWrapper* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(ValueWrapper* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - ValueWrapper* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const ValueWrapper& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const ValueWrapper& from) { - ValueWrapper::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(ValueWrapper* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.kv.ValueWrapper"; - } - protected: - explicit ValueWrapper(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kStrValueFieldNumber = 1, - kIntValueFieldNumber = 2, - kDoubleValueFieldNumber = 3, - kArrayValueFieldNumber = 4, - kMapValueFieldNumber = 5, - kBoolValueFieldNumber = 6, - }; - // string str_value = 1; - bool has_str_value() const; - private: - bool _internal_has_str_value() const; - public: - void clear_str_value(); - const std::string& str_value() const; - template - void set_str_value(ArgT0&& arg0, ArgT... args); - std::string* mutable_str_value(); - PROTOBUF_NODISCARD std::string* release_str_value(); - void set_allocated_str_value(std::string* str_value); - private: - const std::string& _internal_str_value() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_str_value(const std::string& value); - std::string* _internal_mutable_str_value(); - public: - - // int32 int_value = 2; - bool has_int_value() const; - private: - bool _internal_has_int_value() const; - public: - void clear_int_value(); - int32_t int_value() const; - void set_int_value(int32_t value); - private: - int32_t _internal_int_value() const; - void _internal_set_int_value(int32_t value); - public: - - // double double_value = 3; - bool has_double_value() const; - private: - bool _internal_has_double_value() const; - public: - void clear_double_value(); - double double_value() const; - void set_double_value(double value); - private: - double _internal_double_value() const; - void _internal_set_double_value(double value); - public: - - // .Canary.protobuf.kv.ArrayType array_value = 4; - bool has_array_value() const; - private: - bool _internal_has_array_value() const; - public: - void clear_array_value(); - const ::Canary::protobuf::kv::ArrayType& array_value() const; - PROTOBUF_NODISCARD ::Canary::protobuf::kv::ArrayType* release_array_value(); - ::Canary::protobuf::kv::ArrayType* mutable_array_value(); - void set_allocated_array_value(::Canary::protobuf::kv::ArrayType* array_value); - private: - const ::Canary::protobuf::kv::ArrayType& _internal_array_value() const; - ::Canary::protobuf::kv::ArrayType* _internal_mutable_array_value(); - public: - void unsafe_arena_set_allocated_array_value( - ::Canary::protobuf::kv::ArrayType* array_value); - ::Canary::protobuf::kv::ArrayType* unsafe_arena_release_array_value(); - - // .Canary.protobuf.kv.MapType map_value = 5; - bool has_map_value() const; - private: - bool _internal_has_map_value() const; - public: - void clear_map_value(); - const ::Canary::protobuf::kv::MapType& map_value() const; - PROTOBUF_NODISCARD ::Canary::protobuf::kv::MapType* release_map_value(); - ::Canary::protobuf::kv::MapType* mutable_map_value(); - void set_allocated_map_value(::Canary::protobuf::kv::MapType* map_value); - private: - const ::Canary::protobuf::kv::MapType& _internal_map_value() const; - ::Canary::protobuf::kv::MapType* _internal_mutable_map_value(); - public: - void unsafe_arena_set_allocated_map_value( - ::Canary::protobuf::kv::MapType* map_value); - ::Canary::protobuf::kv::MapType* unsafe_arena_release_map_value(); - - // bool bool_value = 6; - bool has_bool_value() const; - private: - bool _internal_has_bool_value() const; - public: - void clear_bool_value(); - bool bool_value() const; - void set_bool_value(bool value); - private: - bool _internal_bool_value() const; - void _internal_set_bool_value(bool value); - public: - - void clear_value(); - ValueCase value_case() const; - // @@protoc_insertion_point(class_scope:Canary.protobuf.kv.ValueWrapper) - private: - class _Internal; - void set_has_str_value(); - void set_has_int_value(); - void set_has_double_value(); - void set_has_array_value(); - void set_has_map_value(); - void set_has_bool_value(); - - inline bool has_value() const; - inline void clear_has_value(); - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - union ValueUnion { - constexpr ValueUnion() : _constinit_{} {} - ::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized _constinit_; - ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr str_value_; - int32_t int_value_; - double double_value_; - ::Canary::protobuf::kv::ArrayType* array_value_; - ::Canary::protobuf::kv::MapType* map_value_; - bool bool_value_; - } value_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - uint32_t _oneof_case_[1]; - - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_kv_2eproto; -}; -// ------------------------------------------------------------------- - -class ArrayType final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.kv.ArrayType) */ { - public: - inline ArrayType() : ArrayType(nullptr) {} - ~ArrayType() override; - explicit PROTOBUF_CONSTEXPR ArrayType(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - ArrayType(const ArrayType& from); - ArrayType(ArrayType&& from) noexcept - : ArrayType() { - *this = ::std::move(from); - } - - inline ArrayType& operator=(const ArrayType& from) { - CopyFrom(from); - return *this; - } - inline ArrayType& operator=(ArrayType&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const ArrayType& default_instance() { - return *internal_default_instance(); - } - static inline const ArrayType* internal_default_instance() { - return reinterpret_cast( - &_ArrayType_default_instance_); - } - static constexpr int kIndexInFileMessages = - 1; - - friend void swap(ArrayType& a, ArrayType& b) { - a.Swap(&b); - } - inline void Swap(ArrayType* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(ArrayType* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - ArrayType* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const ArrayType& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const ArrayType& from) { - ArrayType::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(ArrayType* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.kv.ArrayType"; - } - protected: - explicit ArrayType(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kValuesFieldNumber = 1, - }; - // repeated .Canary.protobuf.kv.ValueWrapper values = 1; - int values_size() const; - private: - int _internal_values_size() const; - public: - void clear_values(); - ::Canary::protobuf::kv::ValueWrapper* mutable_values(int index); - ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::kv::ValueWrapper >* - mutable_values(); - private: - const ::Canary::protobuf::kv::ValueWrapper& _internal_values(int index) const; - ::Canary::protobuf::kv::ValueWrapper* _internal_add_values(); - public: - const ::Canary::protobuf::kv::ValueWrapper& values(int index) const; - ::Canary::protobuf::kv::ValueWrapper* add_values(); - const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::kv::ValueWrapper >& - values() const; - - // @@protoc_insertion_point(class_scope:Canary.protobuf.kv.ArrayType) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::kv::ValueWrapper > values_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_kv_2eproto; -}; -// ------------------------------------------------------------------- - -class KeyValuePair final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.kv.KeyValuePair) */ { - public: - inline KeyValuePair() : KeyValuePair(nullptr) {} - ~KeyValuePair() override; - explicit PROTOBUF_CONSTEXPR KeyValuePair(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - KeyValuePair(const KeyValuePair& from); - KeyValuePair(KeyValuePair&& from) noexcept - : KeyValuePair() { - *this = ::std::move(from); - } - - inline KeyValuePair& operator=(const KeyValuePair& from) { - CopyFrom(from); - return *this; - } - inline KeyValuePair& operator=(KeyValuePair&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const KeyValuePair& default_instance() { - return *internal_default_instance(); - } - static inline const KeyValuePair* internal_default_instance() { - return reinterpret_cast( - &_KeyValuePair_default_instance_); - } - static constexpr int kIndexInFileMessages = - 2; - - friend void swap(KeyValuePair& a, KeyValuePair& b) { - a.Swap(&b); - } - inline void Swap(KeyValuePair* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(KeyValuePair* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - KeyValuePair* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const KeyValuePair& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const KeyValuePair& from) { - KeyValuePair::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(KeyValuePair* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.kv.KeyValuePair"; - } - protected: - explicit KeyValuePair(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kKeyFieldNumber = 1, - kValueFieldNumber = 2, - }; - // string key = 1; - void clear_key(); - const std::string& key() const; - template - void set_key(ArgT0&& arg0, ArgT... args); - std::string* mutable_key(); - PROTOBUF_NODISCARD std::string* release_key(); - void set_allocated_key(std::string* key); - private: - const std::string& _internal_key() const; - inline PROTOBUF_ALWAYS_INLINE void _internal_set_key(const std::string& value); - std::string* _internal_mutable_key(); - public: - - // .Canary.protobuf.kv.ValueWrapper value = 2; - bool has_value() const; - private: - bool _internal_has_value() const; - public: - void clear_value(); - const ::Canary::protobuf::kv::ValueWrapper& value() const; - PROTOBUF_NODISCARD ::Canary::protobuf::kv::ValueWrapper* release_value(); - ::Canary::protobuf::kv::ValueWrapper* mutable_value(); - void set_allocated_value(::Canary::protobuf::kv::ValueWrapper* value); - private: - const ::Canary::protobuf::kv::ValueWrapper& _internal_value() const; - ::Canary::protobuf::kv::ValueWrapper* _internal_mutable_value(); - public: - void unsafe_arena_set_allocated_value( - ::Canary::protobuf::kv::ValueWrapper* value); - ::Canary::protobuf::kv::ValueWrapper* unsafe_arena_release_value(); - - // @@protoc_insertion_point(class_scope:Canary.protobuf.kv.KeyValuePair) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::internal::ArenaStringPtr key_; - ::Canary::protobuf::kv::ValueWrapper* value_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_kv_2eproto; -}; -// ------------------------------------------------------------------- - -class MapType final : - public ::PROTOBUF_NAMESPACE_ID::Message /* @@protoc_insertion_point(class_definition:Canary.protobuf.kv.MapType) */ { - public: - inline MapType() : MapType(nullptr) {} - ~MapType() override; - explicit PROTOBUF_CONSTEXPR MapType(::PROTOBUF_NAMESPACE_ID::internal::ConstantInitialized); - - MapType(const MapType& from); - MapType(MapType&& from) noexcept - : MapType() { - *this = ::std::move(from); - } - - inline MapType& operator=(const MapType& from) { - CopyFrom(from); - return *this; - } - inline MapType& operator=(MapType&& from) noexcept { - if (this == &from) return *this; - if (GetOwningArena() == from.GetOwningArena() - #ifdef PROTOBUF_FORCE_COPY_IN_MOVE - && GetOwningArena() != nullptr - #endif // !PROTOBUF_FORCE_COPY_IN_MOVE - ) { - InternalSwap(&from); - } else { - CopyFrom(from); - } - return *this; - } - - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* descriptor() { - return GetDescriptor(); - } - static const ::PROTOBUF_NAMESPACE_ID::Descriptor* GetDescriptor() { - return default_instance().GetMetadata().descriptor; - } - static const ::PROTOBUF_NAMESPACE_ID::Reflection* GetReflection() { - return default_instance().GetMetadata().reflection; - } - static const MapType& default_instance() { - return *internal_default_instance(); - } - static inline const MapType* internal_default_instance() { - return reinterpret_cast( - &_MapType_default_instance_); - } - static constexpr int kIndexInFileMessages = - 3; - - friend void swap(MapType& a, MapType& b) { - a.Swap(&b); - } - inline void Swap(MapType* other) { - if (other == this) return; - #ifdef PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() != nullptr && - GetOwningArena() == other->GetOwningArena()) { - #else // PROTOBUF_FORCE_COPY_IN_SWAP - if (GetOwningArena() == other->GetOwningArena()) { - #endif // !PROTOBUF_FORCE_COPY_IN_SWAP - InternalSwap(other); - } else { - ::PROTOBUF_NAMESPACE_ID::internal::GenericSwap(this, other); - } - } - void UnsafeArenaSwap(MapType* other) { - if (other == this) return; - GOOGLE_DCHECK(GetOwningArena() == other->GetOwningArena()); - InternalSwap(other); - } - - // implements Message ---------------------------------------------- - - MapType* New(::PROTOBUF_NAMESPACE_ID::Arena* arena = nullptr) const final { - return CreateMaybeMessage(arena); - } - using ::PROTOBUF_NAMESPACE_ID::Message::CopyFrom; - void CopyFrom(const MapType& from); - using ::PROTOBUF_NAMESPACE_ID::Message::MergeFrom; - void MergeFrom( const MapType& from) { - MapType::MergeImpl(*this, from); - } - private: - static void MergeImpl(::PROTOBUF_NAMESPACE_ID::Message& to_msg, const ::PROTOBUF_NAMESPACE_ID::Message& from_msg); - public: - PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final; - bool IsInitialized() const final; - - size_t ByteSizeLong() const final; - const char* _InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_ID::internal::ParseContext* ctx) final; - uint8_t* _InternalSerialize( - uint8_t* target, ::PROTOBUF_NAMESPACE_ID::io::EpsCopyOutputStream* stream) const final; - int GetCachedSize() const final { return _impl_._cached_size_.Get(); } - - private: - void SharedCtor(::PROTOBUF_NAMESPACE_ID::Arena* arena, bool is_message_owned); - void SharedDtor(); - void SetCachedSize(int size) const final; - void InternalSwap(MapType* other); - - private: - friend class ::PROTOBUF_NAMESPACE_ID::internal::AnyMetadata; - static ::PROTOBUF_NAMESPACE_ID::StringPiece FullMessageName() { - return "Canary.protobuf.kv.MapType"; - } - protected: - explicit MapType(::PROTOBUF_NAMESPACE_ID::Arena* arena, - bool is_message_owned = false); - public: - - static const ClassData _class_data_; - const ::PROTOBUF_NAMESPACE_ID::Message::ClassData*GetClassData() const final; - - ::PROTOBUF_NAMESPACE_ID::Metadata GetMetadata() const final; - - // nested types ---------------------------------------------------- - - // accessors ------------------------------------------------------- - - enum : int { - kItemsFieldNumber = 1, - }; - // repeated .Canary.protobuf.kv.KeyValuePair items = 1; - int items_size() const; - private: - int _internal_items_size() const; - public: - void clear_items(); - ::Canary::protobuf::kv::KeyValuePair* mutable_items(int index); - ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::kv::KeyValuePair >* - mutable_items(); - private: - const ::Canary::protobuf::kv::KeyValuePair& _internal_items(int index) const; - ::Canary::protobuf::kv::KeyValuePair* _internal_add_items(); - public: - const ::Canary::protobuf::kv::KeyValuePair& items(int index) const; - ::Canary::protobuf::kv::KeyValuePair* add_items(); - const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::kv::KeyValuePair >& - items() const; - - // @@protoc_insertion_point(class_scope:Canary.protobuf.kv.MapType) - private: - class _Internal; - - template friend class ::PROTOBUF_NAMESPACE_ID::Arena::InternalHelper; - typedef void InternalArenaConstructable_; - typedef void DestructorSkippable_; - struct Impl_ { - ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::kv::KeyValuePair > items_; - mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; - }; - union { Impl_ _impl_; }; - friend struct ::TableStruct_kv_2eproto; -}; -// =================================================================== - - -// =================================================================== - -#ifdef __GNUC__ - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wstrict-aliasing" -#endif // __GNUC__ -// ValueWrapper - -// string str_value = 1; -inline bool ValueWrapper::_internal_has_str_value() const { - return value_case() == kStrValue; -} -inline bool ValueWrapper::has_str_value() const { - return _internal_has_str_value(); -} -inline void ValueWrapper::set_has_str_value() { - _impl_._oneof_case_[0] = kStrValue; -} -inline void ValueWrapper::clear_str_value() { - if (_internal_has_str_value()) { - _impl_.value_.str_value_.Destroy(); - clear_has_value(); - } -} -inline const std::string& ValueWrapper::str_value() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.kv.ValueWrapper.str_value) - return _internal_str_value(); -} -template -inline void ValueWrapper::set_str_value(ArgT0&& arg0, ArgT... args) { - if (!_internal_has_str_value()) { - clear_value(); - set_has_str_value(); - _impl_.value_.str_value_.InitDefault(); - } - _impl_.value_.str_value_.Set( static_cast(arg0), args..., GetArenaForAllocation()); - // @@protoc_insertion_point(field_set:Canary.protobuf.kv.ValueWrapper.str_value) -} -inline std::string* ValueWrapper::mutable_str_value() { - std::string* _s = _internal_mutable_str_value(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.kv.ValueWrapper.str_value) - return _s; -} -inline const std::string& ValueWrapper::_internal_str_value() const { - if (_internal_has_str_value()) { - return _impl_.value_.str_value_.Get(); - } - return ::PROTOBUF_NAMESPACE_ID::internal::GetEmptyStringAlreadyInited(); -} -inline void ValueWrapper::_internal_set_str_value(const std::string& value) { - if (!_internal_has_str_value()) { - clear_value(); - set_has_str_value(); - _impl_.value_.str_value_.InitDefault(); - } - _impl_.value_.str_value_.Set(value, GetArenaForAllocation()); -} -inline std::string* ValueWrapper::_internal_mutable_str_value() { - if (!_internal_has_str_value()) { - clear_value(); - set_has_str_value(); - _impl_.value_.str_value_.InitDefault(); - } - return _impl_.value_.str_value_.Mutable( GetArenaForAllocation()); -} -inline std::string* ValueWrapper::release_str_value() { - // @@protoc_insertion_point(field_release:Canary.protobuf.kv.ValueWrapper.str_value) - if (_internal_has_str_value()) { - clear_has_value(); - return _impl_.value_.str_value_.Release(); - } else { - return nullptr; - } -} -inline void ValueWrapper::set_allocated_str_value(std::string* str_value) { - if (has_value()) { - clear_value(); - } - if (str_value != nullptr) { - set_has_str_value(); - _impl_.value_.str_value_.InitAllocated(str_value, GetArenaForAllocation()); - } - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.kv.ValueWrapper.str_value) -} - -// int32 int_value = 2; -inline bool ValueWrapper::_internal_has_int_value() const { - return value_case() == kIntValue; -} -inline bool ValueWrapper::has_int_value() const { - return _internal_has_int_value(); -} -inline void ValueWrapper::set_has_int_value() { - _impl_._oneof_case_[0] = kIntValue; -} -inline void ValueWrapper::clear_int_value() { - if (_internal_has_int_value()) { - _impl_.value_.int_value_ = 0; - clear_has_value(); - } -} -inline int32_t ValueWrapper::_internal_int_value() const { - if (_internal_has_int_value()) { - return _impl_.value_.int_value_; - } - return 0; -} -inline void ValueWrapper::_internal_set_int_value(int32_t value) { - if (!_internal_has_int_value()) { - clear_value(); - set_has_int_value(); - } - _impl_.value_.int_value_ = value; -} -inline int32_t ValueWrapper::int_value() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.kv.ValueWrapper.int_value) - return _internal_int_value(); -} -inline void ValueWrapper::set_int_value(int32_t value) { - _internal_set_int_value(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.kv.ValueWrapper.int_value) -} - -// double double_value = 3; -inline bool ValueWrapper::_internal_has_double_value() const { - return value_case() == kDoubleValue; -} -inline bool ValueWrapper::has_double_value() const { - return _internal_has_double_value(); -} -inline void ValueWrapper::set_has_double_value() { - _impl_._oneof_case_[0] = kDoubleValue; -} -inline void ValueWrapper::clear_double_value() { - if (_internal_has_double_value()) { - _impl_.value_.double_value_ = 0; - clear_has_value(); - } -} -inline double ValueWrapper::_internal_double_value() const { - if (_internal_has_double_value()) { - return _impl_.value_.double_value_; - } - return 0; -} -inline void ValueWrapper::_internal_set_double_value(double value) { - if (!_internal_has_double_value()) { - clear_value(); - set_has_double_value(); - } - _impl_.value_.double_value_ = value; -} -inline double ValueWrapper::double_value() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.kv.ValueWrapper.double_value) - return _internal_double_value(); -} -inline void ValueWrapper::set_double_value(double value) { - _internal_set_double_value(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.kv.ValueWrapper.double_value) -} - -// .Canary.protobuf.kv.ArrayType array_value = 4; -inline bool ValueWrapper::_internal_has_array_value() const { - return value_case() == kArrayValue; -} -inline bool ValueWrapper::has_array_value() const { - return _internal_has_array_value(); -} -inline void ValueWrapper::set_has_array_value() { - _impl_._oneof_case_[0] = kArrayValue; -} -inline void ValueWrapper::clear_array_value() { - if (_internal_has_array_value()) { - if (GetArenaForAllocation() == nullptr) { - delete _impl_.value_.array_value_; - } - clear_has_value(); - } -} -inline ::Canary::protobuf::kv::ArrayType* ValueWrapper::release_array_value() { - // @@protoc_insertion_point(field_release:Canary.protobuf.kv.ValueWrapper.array_value) - if (_internal_has_array_value()) { - clear_has_value(); - ::Canary::protobuf::kv::ArrayType* temp = _impl_.value_.array_value_; - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } - _impl_.value_.array_value_ = nullptr; - return temp; - } else { - return nullptr; - } -} -inline const ::Canary::protobuf::kv::ArrayType& ValueWrapper::_internal_array_value() const { - return _internal_has_array_value() - ? *_impl_.value_.array_value_ - : reinterpret_cast< ::Canary::protobuf::kv::ArrayType&>(::Canary::protobuf::kv::_ArrayType_default_instance_); -} -inline const ::Canary::protobuf::kv::ArrayType& ValueWrapper::array_value() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.kv.ValueWrapper.array_value) - return _internal_array_value(); -} -inline ::Canary::protobuf::kv::ArrayType* ValueWrapper::unsafe_arena_release_array_value() { - // @@protoc_insertion_point(field_unsafe_arena_release:Canary.protobuf.kv.ValueWrapper.array_value) - if (_internal_has_array_value()) { - clear_has_value(); - ::Canary::protobuf::kv::ArrayType* temp = _impl_.value_.array_value_; - _impl_.value_.array_value_ = nullptr; - return temp; - } else { - return nullptr; - } -} -inline void ValueWrapper::unsafe_arena_set_allocated_array_value(::Canary::protobuf::kv::ArrayType* array_value) { - clear_value(); - if (array_value) { - set_has_array_value(); - _impl_.value_.array_value_ = array_value; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.kv.ValueWrapper.array_value) -} -inline ::Canary::protobuf::kv::ArrayType* ValueWrapper::_internal_mutable_array_value() { - if (!_internal_has_array_value()) { - clear_value(); - set_has_array_value(); - _impl_.value_.array_value_ = CreateMaybeMessage< ::Canary::protobuf::kv::ArrayType >(GetArenaForAllocation()); - } - return _impl_.value_.array_value_; -} -inline ::Canary::protobuf::kv::ArrayType* ValueWrapper::mutable_array_value() { - ::Canary::protobuf::kv::ArrayType* _msg = _internal_mutable_array_value(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.kv.ValueWrapper.array_value) - return _msg; -} - -// .Canary.protobuf.kv.MapType map_value = 5; -inline bool ValueWrapper::_internal_has_map_value() const { - return value_case() == kMapValue; -} -inline bool ValueWrapper::has_map_value() const { - return _internal_has_map_value(); -} -inline void ValueWrapper::set_has_map_value() { - _impl_._oneof_case_[0] = kMapValue; -} -inline void ValueWrapper::clear_map_value() { - if (_internal_has_map_value()) { - if (GetArenaForAllocation() == nullptr) { - delete _impl_.value_.map_value_; - } - clear_has_value(); - } -} -inline ::Canary::protobuf::kv::MapType* ValueWrapper::release_map_value() { - // @@protoc_insertion_point(field_release:Canary.protobuf.kv.ValueWrapper.map_value) - if (_internal_has_map_value()) { - clear_has_value(); - ::Canary::protobuf::kv::MapType* temp = _impl_.value_.map_value_; - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } - _impl_.value_.map_value_ = nullptr; - return temp; - } else { - return nullptr; - } -} -inline const ::Canary::protobuf::kv::MapType& ValueWrapper::_internal_map_value() const { - return _internal_has_map_value() - ? *_impl_.value_.map_value_ - : reinterpret_cast< ::Canary::protobuf::kv::MapType&>(::Canary::protobuf::kv::_MapType_default_instance_); -} -inline const ::Canary::protobuf::kv::MapType& ValueWrapper::map_value() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.kv.ValueWrapper.map_value) - return _internal_map_value(); -} -inline ::Canary::protobuf::kv::MapType* ValueWrapper::unsafe_arena_release_map_value() { - // @@protoc_insertion_point(field_unsafe_arena_release:Canary.protobuf.kv.ValueWrapper.map_value) - if (_internal_has_map_value()) { - clear_has_value(); - ::Canary::protobuf::kv::MapType* temp = _impl_.value_.map_value_; - _impl_.value_.map_value_ = nullptr; - return temp; - } else { - return nullptr; - } -} -inline void ValueWrapper::unsafe_arena_set_allocated_map_value(::Canary::protobuf::kv::MapType* map_value) { - clear_value(); - if (map_value) { - set_has_map_value(); - _impl_.value_.map_value_ = map_value; - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.kv.ValueWrapper.map_value) -} -inline ::Canary::protobuf::kv::MapType* ValueWrapper::_internal_mutable_map_value() { - if (!_internal_has_map_value()) { - clear_value(); - set_has_map_value(); - _impl_.value_.map_value_ = CreateMaybeMessage< ::Canary::protobuf::kv::MapType >(GetArenaForAllocation()); - } - return _impl_.value_.map_value_; -} -inline ::Canary::protobuf::kv::MapType* ValueWrapper::mutable_map_value() { - ::Canary::protobuf::kv::MapType* _msg = _internal_mutable_map_value(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.kv.ValueWrapper.map_value) - return _msg; -} - -// bool bool_value = 6; -inline bool ValueWrapper::_internal_has_bool_value() const { - return value_case() == kBoolValue; -} -inline bool ValueWrapper::has_bool_value() const { - return _internal_has_bool_value(); -} -inline void ValueWrapper::set_has_bool_value() { - _impl_._oneof_case_[0] = kBoolValue; -} -inline void ValueWrapper::clear_bool_value() { - if (_internal_has_bool_value()) { - _impl_.value_.bool_value_ = false; - clear_has_value(); - } -} -inline bool ValueWrapper::_internal_bool_value() const { - if (_internal_has_bool_value()) { - return _impl_.value_.bool_value_; - } - return false; -} -inline void ValueWrapper::_internal_set_bool_value(bool value) { - if (!_internal_has_bool_value()) { - clear_value(); - set_has_bool_value(); - } - _impl_.value_.bool_value_ = value; -} -inline bool ValueWrapper::bool_value() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.kv.ValueWrapper.bool_value) - return _internal_bool_value(); -} -inline void ValueWrapper::set_bool_value(bool value) { - _internal_set_bool_value(value); - // @@protoc_insertion_point(field_set:Canary.protobuf.kv.ValueWrapper.bool_value) -} - -inline bool ValueWrapper::has_value() const { - return value_case() != VALUE_NOT_SET; -} -inline void ValueWrapper::clear_has_value() { - _impl_._oneof_case_[0] = VALUE_NOT_SET; -} -inline ValueWrapper::ValueCase ValueWrapper::value_case() const { - return ValueWrapper::ValueCase(_impl_._oneof_case_[0]); -} -// ------------------------------------------------------------------- - -// ArrayType - -// repeated .Canary.protobuf.kv.ValueWrapper values = 1; -inline int ArrayType::_internal_values_size() const { - return _impl_.values_.size(); -} -inline int ArrayType::values_size() const { - return _internal_values_size(); -} -inline void ArrayType::clear_values() { - _impl_.values_.Clear(); -} -inline ::Canary::protobuf::kv::ValueWrapper* ArrayType::mutable_values(int index) { - // @@protoc_insertion_point(field_mutable:Canary.protobuf.kv.ArrayType.values) - return _impl_.values_.Mutable(index); -} -inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::kv::ValueWrapper >* -ArrayType::mutable_values() { - // @@protoc_insertion_point(field_mutable_list:Canary.protobuf.kv.ArrayType.values) - return &_impl_.values_; -} -inline const ::Canary::protobuf::kv::ValueWrapper& ArrayType::_internal_values(int index) const { - return _impl_.values_.Get(index); -} -inline const ::Canary::protobuf::kv::ValueWrapper& ArrayType::values(int index) const { - // @@protoc_insertion_point(field_get:Canary.protobuf.kv.ArrayType.values) - return _internal_values(index); -} -inline ::Canary::protobuf::kv::ValueWrapper* ArrayType::_internal_add_values() { - return _impl_.values_.Add(); -} -inline ::Canary::protobuf::kv::ValueWrapper* ArrayType::add_values() { - ::Canary::protobuf::kv::ValueWrapper* _add = _internal_add_values(); - // @@protoc_insertion_point(field_add:Canary.protobuf.kv.ArrayType.values) - return _add; -} -inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::kv::ValueWrapper >& -ArrayType::values() const { - // @@protoc_insertion_point(field_list:Canary.protobuf.kv.ArrayType.values) - return _impl_.values_; -} - -// ------------------------------------------------------------------- - -// KeyValuePair - -// string key = 1; -inline void KeyValuePair::clear_key() { - _impl_.key_.ClearToEmpty(); -} -inline const std::string& KeyValuePair::key() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.kv.KeyValuePair.key) - return _internal_key(); -} -template -inline PROTOBUF_ALWAYS_INLINE -void KeyValuePair::set_key(ArgT0&& arg0, ArgT... args) { - - _impl_.key_.Set(static_cast(arg0), args..., GetArenaForAllocation()); - // @@protoc_insertion_point(field_set:Canary.protobuf.kv.KeyValuePair.key) -} -inline std::string* KeyValuePair::mutable_key() { - std::string* _s = _internal_mutable_key(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.kv.KeyValuePair.key) - return _s; -} -inline const std::string& KeyValuePair::_internal_key() const { - return _impl_.key_.Get(); -} -inline void KeyValuePair::_internal_set_key(const std::string& value) { - - _impl_.key_.Set(value, GetArenaForAllocation()); -} -inline std::string* KeyValuePair::_internal_mutable_key() { - - return _impl_.key_.Mutable(GetArenaForAllocation()); -} -inline std::string* KeyValuePair::release_key() { - // @@protoc_insertion_point(field_release:Canary.protobuf.kv.KeyValuePair.key) - return _impl_.key_.Release(); -} -inline void KeyValuePair::set_allocated_key(std::string* key) { - if (key != nullptr) { - - } else { - - } - _impl_.key_.SetAllocated(key, GetArenaForAllocation()); -#ifdef PROTOBUF_FORCE_COPY_DEFAULT_STRING - if (_impl_.key_.IsDefault()) { - _impl_.key_.Set("", GetArenaForAllocation()); - } -#endif // PROTOBUF_FORCE_COPY_DEFAULT_STRING - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.kv.KeyValuePair.key) -} - -// .Canary.protobuf.kv.ValueWrapper value = 2; -inline bool KeyValuePair::_internal_has_value() const { - return this != internal_default_instance() && _impl_.value_ != nullptr; -} -inline bool KeyValuePair::has_value() const { - return _internal_has_value(); -} -inline void KeyValuePair::clear_value() { - if (GetArenaForAllocation() == nullptr && _impl_.value_ != nullptr) { - delete _impl_.value_; - } - _impl_.value_ = nullptr; -} -inline const ::Canary::protobuf::kv::ValueWrapper& KeyValuePair::_internal_value() const { - const ::Canary::protobuf::kv::ValueWrapper* p = _impl_.value_; - return p != nullptr ? *p : reinterpret_cast( - ::Canary::protobuf::kv::_ValueWrapper_default_instance_); -} -inline const ::Canary::protobuf::kv::ValueWrapper& KeyValuePair::value() const { - // @@protoc_insertion_point(field_get:Canary.protobuf.kv.KeyValuePair.value) - return _internal_value(); -} -inline void KeyValuePair::unsafe_arena_set_allocated_value( - ::Canary::protobuf::kv::ValueWrapper* value) { - if (GetArenaForAllocation() == nullptr) { - delete reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(_impl_.value_); - } - _impl_.value_ = value; - if (value) { - - } else { - - } - // @@protoc_insertion_point(field_unsafe_arena_set_allocated:Canary.protobuf.kv.KeyValuePair.value) -} -inline ::Canary::protobuf::kv::ValueWrapper* KeyValuePair::release_value() { - - ::Canary::protobuf::kv::ValueWrapper* temp = _impl_.value_; - _impl_.value_ = nullptr; -#ifdef PROTOBUF_FORCE_COPY_IN_RELEASE - auto* old = reinterpret_cast<::PROTOBUF_NAMESPACE_ID::MessageLite*>(temp); - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - if (GetArenaForAllocation() == nullptr) { delete old; } -#else // PROTOBUF_FORCE_COPY_IN_RELEASE - if (GetArenaForAllocation() != nullptr) { - temp = ::PROTOBUF_NAMESPACE_ID::internal::DuplicateIfNonNull(temp); - } -#endif // !PROTOBUF_FORCE_COPY_IN_RELEASE - return temp; -} -inline ::Canary::protobuf::kv::ValueWrapper* KeyValuePair::unsafe_arena_release_value() { - // @@protoc_insertion_point(field_release:Canary.protobuf.kv.KeyValuePair.value) - - ::Canary::protobuf::kv::ValueWrapper* temp = _impl_.value_; - _impl_.value_ = nullptr; - return temp; -} -inline ::Canary::protobuf::kv::ValueWrapper* KeyValuePair::_internal_mutable_value() { - - if (_impl_.value_ == nullptr) { - auto* p = CreateMaybeMessage<::Canary::protobuf::kv::ValueWrapper>(GetArenaForAllocation()); - _impl_.value_ = p; - } - return _impl_.value_; -} -inline ::Canary::protobuf::kv::ValueWrapper* KeyValuePair::mutable_value() { - ::Canary::protobuf::kv::ValueWrapper* _msg = _internal_mutable_value(); - // @@protoc_insertion_point(field_mutable:Canary.protobuf.kv.KeyValuePair.value) - return _msg; -} -inline void KeyValuePair::set_allocated_value(::Canary::protobuf::kv::ValueWrapper* value) { - ::PROTOBUF_NAMESPACE_ID::Arena* message_arena = GetArenaForAllocation(); - if (message_arena == nullptr) { - delete _impl_.value_; - } - if (value) { - ::PROTOBUF_NAMESPACE_ID::Arena* submessage_arena = - ::PROTOBUF_NAMESPACE_ID::Arena::InternalGetOwningArena(value); - if (message_arena != submessage_arena) { - value = ::PROTOBUF_NAMESPACE_ID::internal::GetOwnedMessage( - message_arena, value, submessage_arena); - } - - } else { - - } - _impl_.value_ = value; - // @@protoc_insertion_point(field_set_allocated:Canary.protobuf.kv.KeyValuePair.value) -} - -// ------------------------------------------------------------------- - -// MapType - -// repeated .Canary.protobuf.kv.KeyValuePair items = 1; -inline int MapType::_internal_items_size() const { - return _impl_.items_.size(); -} -inline int MapType::items_size() const { - return _internal_items_size(); -} -inline void MapType::clear_items() { - _impl_.items_.Clear(); -} -inline ::Canary::protobuf::kv::KeyValuePair* MapType::mutable_items(int index) { - // @@protoc_insertion_point(field_mutable:Canary.protobuf.kv.MapType.items) - return _impl_.items_.Mutable(index); -} -inline ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::kv::KeyValuePair >* -MapType::mutable_items() { - // @@protoc_insertion_point(field_mutable_list:Canary.protobuf.kv.MapType.items) - return &_impl_.items_; -} -inline const ::Canary::protobuf::kv::KeyValuePair& MapType::_internal_items(int index) const { - return _impl_.items_.Get(index); -} -inline const ::Canary::protobuf::kv::KeyValuePair& MapType::items(int index) const { - // @@protoc_insertion_point(field_get:Canary.protobuf.kv.MapType.items) - return _internal_items(index); -} -inline ::Canary::protobuf::kv::KeyValuePair* MapType::_internal_add_items() { - return _impl_.items_.Add(); -} -inline ::Canary::protobuf::kv::KeyValuePair* MapType::add_items() { - ::Canary::protobuf::kv::KeyValuePair* _add = _internal_add_items(); - // @@protoc_insertion_point(field_add:Canary.protobuf.kv.MapType.items) - return _add; -} -inline const ::PROTOBUF_NAMESPACE_ID::RepeatedPtrField< ::Canary::protobuf::kv::KeyValuePair >& -MapType::items() const { - // @@protoc_insertion_point(field_list:Canary.protobuf.kv.MapType.items) - return _impl_.items_; -} - -#ifdef __GNUC__ - #pragma GCC diagnostic pop -#endif // __GNUC__ -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - -// ------------------------------------------------------------------- - - -// @@protoc_insertion_point(namespace_scope) - -} // namespace kv -} // namespace protobuf -} // namespace Canary - -// @@protoc_insertion_point(global_scope) - -#include -#endif // GOOGLE_PROTOBUF_INCLUDED_GOOGLE_PROTOBUF_INCLUDED_kv_2eproto diff --git a/src/security/argon.cpp b/src/security/argon.cpp index 7a869fc2a43..02079e70ca0 100644 --- a/src/security/argon.cpp +++ b/src/security/argon.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/security/argon.hpp b/src/security/argon.hpp index 03dea87f56f..ea09dcffccb 100644 --- a/src/security/argon.hpp +++ b/src/security/argon.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/security/rsa.cpp b/src/security/rsa.cpp index b5f64356d1d..fc28d931f66 100644 --- a/src/security/rsa.cpp +++ b/src/security/rsa.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/security/rsa.hpp b/src/security/rsa.hpp index 1ede77483c0..a6de23b4e13 100644 --- a/src/security/rsa.hpp +++ b/src/security/rsa.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/server/network/connection/connection.cpp b/src/server/network/connection/connection.cpp index 3ae209754d8..7d9de916263 100644 --- a/src/server/network/connection/connection.cpp +++ b/src/server/network/connection/connection.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/server/network/connection/connection.hpp b/src/server/network/connection/connection.hpp index 2054cf69f9e..76d9b1c1876 100644 --- a/src/server/network/connection/connection.hpp +++ b/src/server/network/connection/connection.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/server/network/message/networkmessage.cpp b/src/server/network/message/networkmessage.cpp index 9c10b4907df..15963135560 100644 --- a/src/server/network/message/networkmessage.cpp +++ b/src/server/network/message/networkmessage.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/server/network/message/networkmessage.hpp b/src/server/network/message/networkmessage.hpp index 3051e87bb22..72f0e69c3dc 100644 --- a/src/server/network/message/networkmessage.hpp +++ b/src/server/network/message/networkmessage.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/server/network/message/outputmessage.cpp b/src/server/network/message/outputmessage.cpp index d15cd4b3618..6ede36da406 100644 --- a/src/server/network/message/outputmessage.cpp +++ b/src/server/network/message/outputmessage.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/server/network/message/outputmessage.hpp b/src/server/network/message/outputmessage.hpp index 6cc6f067bfe..1f590fbd214 100644 --- a/src/server/network/message/outputmessage.hpp +++ b/src/server/network/message/outputmessage.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/server/network/protocol/protocol.cpp b/src/server/network/protocol/protocol.cpp index 686a8f7e4ec..6f6a1c8228e 100644 --- a/src/server/network/protocol/protocol.cpp +++ b/src/server/network/protocol/protocol.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/server/network/protocol/protocol.hpp b/src/server/network/protocol/protocol.hpp index 6e4b09c4697..c264f49bf01 100644 --- a/src/server/network/protocol/protocol.hpp +++ b/src/server/network/protocol/protocol.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/server/network/protocol/protocolgame.cpp b/src/server/network/protocol/protocolgame.cpp index dc01d1baf21..bdbf178f2b9 100644 --- a/src/server/network/protocol/protocolgame.cpp +++ b/src/server/network/protocol/protocolgame.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -26,6 +26,7 @@ #include "server/network/message/outputmessage.hpp" #include "creatures/players/player.hpp" #include "creatures/players/wheel/player_wheel.hpp" +#include "creatures/players/achievement/player_achievement.hpp" #include "creatures/players/grouping/familiars.hpp" #include "server/network/protocol/protocolgame.hpp" #include "game/scheduling/dispatcher.hpp" @@ -38,6 +39,8 @@ #include "enums/account_group_type.hpp" #include "enums/account_coins.hpp" +#include "creatures/players/highscore_category.hpp" + /* * NOTE: This namespace is used so that we can add functions without having to declare them in the ".hpp/.hpp" file * Do not use functions only in the .cpp scope without having a namespace, it may conflict with functions in other files of the same name @@ -2155,24 +2158,15 @@ void ProtocolGame::sendHighscores(const std::vector &charact } msg.add(selectedVocation); // Selected Vocation - HighscoreCategory highscoreCategories[] = { - { "Experience Points", HIGHSCORE_CATEGORY_EXPERIENCE }, - { "Fist Fighting", HIGHSCORE_CATEGORY_FIST_FIGHTING }, - { "Club Fighting", HIGHSCORE_CATEGORY_CLUB_FIGHTING }, - { "Sword Fighting", HIGHSCORE_CATEGORY_SWORD_FIGHTING }, - { "Axe Fighting", HIGHSCORE_CATEGORY_AXE_FIGHTING }, - { "Distance Fighting", HIGHSCORE_CATEGORY_DISTANCE_FIGHTING }, - { "Shielding", HIGHSCORE_CATEGORY_SHIELDING }, - { "Fishing", HIGHSCORE_CATEGORY_FISHING }, - { "Magic Level", HIGHSCORE_CATEGORY_MAGIC_LEVEL } - }; - uint8_t selectedCategory = 0; - msg.addByte(sizeof(highscoreCategories) / sizeof(HighscoreCategory)); // Category Count - for (HighscoreCategory &category : highscoreCategories) { - msg.addByte(category.id); // Category Id - msg.addString(category.name, "ProtocolGame::sendHighscores - category.name"); // Category Name - if (category.id == categoryId) { + const auto &highscoreCategories = g_game().getHighscoreCategories(); + msg.addByte(highscoreCategories.size()); // Category Count + g_logger().debug("[ProtocolGame::sendHighscores] - Category Count: {}", highscoreCategories.size()); + for (const HighscoreCategory &category : highscoreCategories) { + g_logger().debug("[ProtocolGame::sendHighscores] - Category: {} - Name: {}", category.m_id, category.m_name); + msg.addByte(category.m_id); // Category Id + msg.addString(category.m_name, "ProtocolGame::sendHighscores - category.name"); // Category Name + if (category.m_id == categoryId) { selectedCategory = categoryId; } } @@ -2340,10 +2334,10 @@ void ProtocolGame::parseBestiarysendMonsterData(NetworkMessage &msg) { break; } - newmsg.add(shouldAddItem == true ? loot.id : 0); + newmsg.add(g_configManager().getBoolean(SHOW_LOOTS_IN_BESTIARY, __FUNCTION__) || shouldAddItem == true ? loot.id : 0); newmsg.addByte(difficult); newmsg.addByte(0); // 1 if special event - 0 if regular loot (?) - if (shouldAddItem == true) { + if (g_configManager().getBoolean(SHOW_LOOTS_IN_BESTIARY, __FUNCTION__) || shouldAddItem == true) { newmsg.addString(loot.name, "ProtocolGame::parseBestiarysendMonsterData - loot.name"); newmsg.addByte(loot.countmax > 0 ? 0x1 : 0x0); } @@ -3649,7 +3643,7 @@ void ProtocolGame::sendCyclopediaCharacterRecentPvPKills(uint16_t page, uint16_t writeToOutputBuffer(msg); } -void ProtocolGame::sendCyclopediaCharacterAchievements() { +void ProtocolGame::sendCyclopediaCharacterAchievements(uint16_t secretsUnlocked, std::vector> achievementsUnlocked) { if (!player || oldProtocol) { return; } @@ -3657,10 +3651,24 @@ void ProtocolGame::sendCyclopediaCharacterAchievements() { NetworkMessage msg; msg.addByte(0xDA); msg.addByte(CYCLOPEDIA_CHARACTERINFO_ACHIEVEMENTS); - msg.addByte(0x00); - msg.add(0); - msg.add(0); - msg.add(0); + msg.addByte(0x00); // 0x00 Here means 'no error' + msg.add(player->achiev()->getPoints()); + msg.add(secretsUnlocked); + msg.add(static_cast(achievementsUnlocked.size())); + std::string messageAchievName = "ProtocolGame::sendCyclopediaCharacterAchievements - achievement.name"; + std::string messageAchievDesc = "ProtocolGame::sendCyclopediaCharacterAchievements - achievement.description"; + for (const auto &[achievement, addedTimestamp] : achievementsUnlocked) { + msg.add(achievement.id); + msg.add(addedTimestamp); + if (achievement.secret) { + msg.addByte(0x01); + msg.addString(achievement.name, messageAchievName); + msg.addString(achievement.description, messageAchievDesc); + msg.addByte(achievement.grade); + } else { + msg.addByte(0x00); + } + } writeToOutputBuffer(msg); } @@ -4054,7 +4062,7 @@ void ProtocolGame::sendPremiumTrigger() { void ProtocolGame::sendTextMessage(const TextMessage &message) { if (message.type == MESSAGE_NONE) { g_logger().error("[ProtocolGame::sendTextMessage] - Message type is wrong, missing or invalid for player with name {}, on position {}", player->getName(), player->getPosition().toString()); - player->sendTextMessage(MESSAGE_ADMINISTRADOR, "There was a problem requesting your message, please contact the administrator"); + player->sendTextMessage(MESSAGE_ADMINISTRATOR, "There was a problem requesting your message, please contact the administrator"); return; } @@ -4133,15 +4141,21 @@ void ProtocolGame::sendTextMessage(const TextMessage &message) { } case MESSAGE_HEALED: case MESSAGE_HEALED_OTHERS: { - msg.addPosition(message.position); - msg.add(message.primary.value); - msg.addByte(message.primary.color); + if (!oldProtocol) { + msg.addPosition(message.position); + msg.add(message.primary.value); + msg.addByte(message.primary.color); + } break; } case MESSAGE_EXPERIENCE: case MESSAGE_EXPERIENCE_OTHERS: { msg.addPosition(message.position); - msg.add(message.primary.value); + if (!oldProtocol) { + msg.add(message.primary.value); + } else { + msg.add(message.primary.value); + } msg.addByte(message.primary.color); break; } @@ -5018,7 +5032,6 @@ void ProtocolGame::sendOpenForge() { // Checking size of map to send in the addByte (total fusion items count) uint8_t fusionTotalItemsCount = 0; for (const auto &[itemId, tierAndCountMap] : fusionItemsMap) { - auto classification = Item::items[itemId].upgradeClassification; for (const auto [itemTier, itemCount] : tierAndCountMap) { if (itemCount >= 2) { fusionTotalItemsCount++; @@ -6596,17 +6609,6 @@ void ProtocolGame::sendOutfitWindow() { AddOutfit(msg, currentOutfit); std::vector protocolOutfits; - if (player->isAccessPlayer()) { - static const std::string gamemasterOutfitName = "Game Master"; - protocolOutfits.emplace_back(gamemasterOutfitName, 75, 0); - - static const std::string gmCustomerSupport = "Customer Support"; - protocolOutfits.emplace_back(gmCustomerSupport, 266, 0); - - static const std::string communityManager = "Community Manager"; - protocolOutfits.emplace_back(communityManager, 302, 0); - } - const auto outfits = Outfits::getInstance().getOutfits(player->getSex()); protocolOutfits.reserve(outfits.size()); for (const auto &outfit : outfits) { diff --git a/src/server/network/protocol/protocolgame.hpp b/src/server/network/protocol/protocolgame.hpp index 9dec5e3e1c2..65f7b0ffa83 100644 --- a/src/server/network/protocol/protocolgame.hpp +++ b/src/server/network/protocol/protocolgame.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -28,6 +28,7 @@ class TaskHuntingSlot; class TaskHuntingOption; struct ModalWindow; +struct Achievement; using ProtocolGame_ptr = std::shared_ptr; @@ -317,7 +318,7 @@ class ProtocolGame final : public Protocol { void sendCyclopediaCharacterCombatStats(); void sendCyclopediaCharacterRecentDeaths(uint16_t page, uint16_t pages, const std::vector &entries); void sendCyclopediaCharacterRecentPvPKills(uint16_t page, uint16_t pages, const std::vector &entries); - void sendCyclopediaCharacterAchievements(); + void sendCyclopediaCharacterAchievements(uint16_t secretsUnlocked, std::vector> achievementsUnlocked); void sendCyclopediaCharacterItemSummary(); void sendCyclopediaCharacterOutfitsMounts(); void sendCyclopediaCharacterStoreSummary(); diff --git a/src/server/network/protocol/protocollogin.cpp b/src/server/network/protocol/protocollogin.cpp index 9efd5f753c5..4e38a7503c7 100644 --- a/src/server/network/protocol/protocollogin.cpp +++ b/src/server/network/protocol/protocollogin.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/server/network/protocol/protocollogin.hpp b/src/server/network/protocol/protocollogin.hpp index 367c4ccf140..6652a85625e 100644 --- a/src/server/network/protocol/protocollogin.hpp +++ b/src/server/network/protocol/protocollogin.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/server/network/protocol/protocolstatus.cpp b/src/server/network/protocol/protocolstatus.cpp index 750c85fbbfc..8d9f245f5df 100644 --- a/src/server/network/protocol/protocolstatus.cpp +++ b/src/server/network/protocol/protocolstatus.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/server/network/protocol/protocolstatus.hpp b/src/server/network/protocol/protocolstatus.hpp index 36d83f77d65..78b03a74333 100644 --- a/src/server/network/protocol/protocolstatus.hpp +++ b/src/server/network/protocol/protocolstatus.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/server/network/webhook/webhook.cpp b/src/server/network/webhook/webhook.cpp index af801f55825..57d4f607aac 100644 --- a/src/server/network/webhook/webhook.cpp +++ b/src/server/network/webhook/webhook.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/server/network/webhook/webhook.hpp b/src/server/network/webhook/webhook.hpp index df414f24e1d..bae62a64c35 100644 --- a/src/server/network/webhook/webhook.hpp +++ b/src/server/network/webhook/webhook.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/server/server.cpp b/src/server/server.cpp index a2c6142931d..2968033bafa 100644 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/server/server.hpp b/src/server/server.hpp index ae6f805e4ff..054ec2607c8 100644 --- a/src/server/server.hpp +++ b/src/server/server.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/server/server_definitions.hpp b/src/server/server_definitions.hpp index 7b3c254e189..ad816b76b02 100644 --- a/src/server/server_definitions.hpp +++ b/src/server/server_definitions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -112,16 +112,6 @@ enum Supply_Stash_Actions_t : uint8_t { SUPPLY_STASH_ACTION_WITHDRAW = 3 }; -// Structs -struct HighscoreCategory { - HighscoreCategory(const char* name, uint8_t id) : - name(name), - id(id) { } - - const char* name; - uint8_t id; -}; - struct HighscoreCharacter { HighscoreCharacter(std::string name, uint64_t points, uint32_t id, uint32_t rank, uint16_t level, uint8_t vocation) : name(std::move(name)), diff --git a/src/server/signals.cpp b/src/server/signals.cpp index 149554d3b4f..978b589eb38 100644 --- a/src/server/signals.cpp +++ b/src/server/signals.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/server/signals.hpp b/src/server/signals.hpp index 88d7d037ef4..4d46e24e129 100644 --- a/src/server/signals.hpp +++ b/src/server/signals.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/utils/arraylist.hpp b/src/utils/arraylist.hpp index 94e05e2eb76..da507e68480 100644 --- a/src/utils/arraylist.hpp +++ b/src/utils/arraylist.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/utils/benchmark.hpp b/src/utils/benchmark.hpp index 7ec007ceaeb..961547efc94 100644 --- a/src/utils/benchmark.hpp +++ b/src/utils/benchmark.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/utils/const.hpp b/src/utils/const.hpp index c681d110c69..c3f82df7ff7 100644 --- a/src/utils/const.hpp +++ b/src/utils/const.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/utils/definitions.hpp b/src/utils/definitions.hpp index af53e58ba19..d557896f361 100644 --- a/src/utils/definitions.hpp +++ b/src/utils/definitions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/utils/pugicast.cpp b/src/utils/pugicast.cpp index 22c20f1e650..62717c33621 100644 --- a/src/utils/pugicast.cpp +++ b/src/utils/pugicast.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/utils/pugicast.hpp b/src/utils/pugicast.hpp index 7e1a1ce9973..d09532a2d5c 100644 --- a/src/utils/pugicast.hpp +++ b/src/utils/pugicast.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/utils/simd.hpp b/src/utils/simd.hpp index 9089fcfe03d..3961d51e708 100644 --- a/src/utils/simd.hpp +++ b/src/utils/simd.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/utils/tools.cpp b/src/utils/tools.cpp index c7bccf2afae..0d8b39a485d 100644 --- a/src/utils/tools.cpp +++ b/src/utils/tools.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -1077,6 +1077,47 @@ std::string getWeaponName(WeaponType_t weaponType) { } } +WeaponType_t getWeaponType(const std::string &name) { + static const std::unordered_map type_mapping = { + { "none", WeaponType_t::WEAPON_NONE }, + { "sword", WeaponType_t::WEAPON_SWORD }, + { "club", WeaponType_t::WEAPON_CLUB }, + { "axe", WeaponType_t::WEAPON_AXE }, + { "shield", WeaponType_t::WEAPON_SHIELD }, + { "distance", WeaponType_t::WEAPON_DISTANCE }, + { "wand", WeaponType_t::WEAPON_WAND }, + { "ammo", WeaponType_t::WEAPON_AMMO }, + { "missile", WeaponType_t::WEAPON_MISSILE } + }; + + auto it = type_mapping.find(name); + if (it != type_mapping.end()) { + return it->second; + } + + return WEAPON_NONE; +} + +MoveEvent_t getMoveEventType(const std::string &name) { + static const std::unordered_map move_event_type_mapping = { + { "stepin", MOVE_EVENT_STEP_IN }, + { "stepout", MOVE_EVENT_STEP_OUT }, + { "equip", MOVE_EVENT_EQUIP }, + { "deequip", MOVE_EVENT_DEEQUIP }, + { "additem", MOVE_EVENT_ADD_ITEM }, + { "removeitem", MOVE_EVENT_REMOVE_ITEM }, + { "additemitemtile", MOVE_EVENT_ADD_ITEM_ITEMTILE }, + { "removeitemitemtile", MOVE_EVENT_REMOVE_ITEM_ITEMTILE } + }; + + auto it = move_event_type_mapping.find(name); + if (it != move_event_type_mapping.end()) { + return it->second; + } + + return MOVE_EVENT_NONE; +} + std::string getCombatName(CombatType_t combatType) { auto combatName = combatTypeNames.find(combatType); if (combatName != combatTypeNames.end()) { @@ -1203,6 +1244,15 @@ const char* getReturnMessage(ReturnValue value) { case RETURNVALUE_NOERROR: return "No error."; + case RETURNVALUE_NOTBOUGHTINSTORE: + return "You cannot move this item into your store inbox as it was not bought in the store."; + + case RETURNVALUE_ITEMCANNOTBEMOVEDPOUCH: + return "This item cannot be moved there. You can only place gold, platinum and crystal coins in your gold pouch."; + + case RETURNVALUE_ITEMCANNOTBEMOVEDTHERE: + return "This item cannot be moved there."; + case RETURNVALUE_REWARDCHESTISEMPTY: return "The chest is currently empty. You did not take part in any battles in the last seven days or already claimed your reward."; @@ -1769,11 +1819,11 @@ std::string getVerbForPronoun(PlayerPronoun_t pronoun, bool pastTense) { return pastTense ? "was" : "is"; } -std::vector split(const std::string &str) { +std::vector split(const std::string &str, char delimiter /* = ','*/) { std::vector tokens; std::string token; std::istringstream tokenStream(str); - while (std::getline(tokenStream, token, ',')) { + while (std::getline(tokenStream, token, delimiter)) { auto trimedToken = token; trimString(trimedToken); tokens.push_back(trimedToken); diff --git a/src/utils/tools.hpp b/src/utils/tools.hpp index 654c9d73c19..769fb5d68d3 100644 --- a/src/utils/tools.hpp +++ b/src/utils/tools.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -108,6 +108,8 @@ std::string ucwords(std::string str); bool booleanString(const std::string &str); std::string getWeaponName(WeaponType_t weaponType); +WeaponType_t getWeaponType(const std::string &name); +MoveEvent_t getMoveEventType(const std::string &name); std::string getCombatName(CombatType_t combatType); CombatType_t getCombatTypeByName(const std::string &combatname); @@ -152,7 +154,7 @@ SpellGroup_t stringToSpellGroup(const std::string &value); uint8_t forgeBonus(int32_t number); std::string formatPrice(std::string price, bool space /* = false*/); -std::vector split(const std::string &str); +std::vector split(const std::string &str, char delimiter = ','); std::string getFormattedTimeRemaining(uint32_t time); unsigned int getNumberOfCores(); diff --git a/src/utils/utils_definitions.hpp b/src/utils/utils_definitions.hpp index d91aebe7a39..d7f4a543ec1 100644 --- a/src/utils/utils_definitions.hpp +++ b/src/utils/utils_definitions.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors @@ -340,7 +340,7 @@ enum MessageClasses : uint8_t { /* Red message in the console*/ /* TALKTYPE_BROADCAST */ MESSAGE_LOGIN = 17, /* White message at the bottom of the game window and in the console*/ - MESSAGE_ADMINISTRADOR = 18, /* Red message in game window and in the console*/ + MESSAGE_ADMINISTRATOR = 18, /* Red message in game window and in the console*/ MESSAGE_EVENT_ADVANCE = 19, /* White message in game window and in the console*/ MESSAGE_GAME_HIGHLIGHT = 20, /* Red message in game window and in the console*/ MESSAGE_FAILURE = 21, /* White message at the bottom of the game window"*/ diff --git a/src/utils/vectorset.hpp b/src/utils/vectorset.hpp index dab8901bfc5..0f81ce3960d 100644 --- a/src/utils/vectorset.hpp +++ b/src/utils/vectorset.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/utils/vectorsort.hpp b/src/utils/vectorsort.hpp index 7069e5463c8..0a3618b963f 100644 --- a/src/utils/vectorsort.hpp +++ b/src/utils/vectorsort.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/utils/wildcardtree.cpp b/src/utils/wildcardtree.cpp index 6ab174d7b95..1e91b9b4169 100644 --- a/src/utils/wildcardtree.cpp +++ b/src/utils/wildcardtree.cpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/src/utils/wildcardtree.hpp b/src/utils/wildcardtree.hpp index 1a614ede553..07728ae9849 100644 --- a/src/utils/wildcardtree.hpp +++ b/src/utils/wildcardtree.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/tests/fixture/account/in_memory_account_repository.hpp b/tests/fixture/account/in_memory_account_repository.hpp index e390cd46d47..40dbda38e08 100644 --- a/tests/fixture/account/in_memory_account_repository.hpp +++ b/tests/fixture/account/in_memory_account_repository.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/tests/fixture/kv/in_memory_kv.hpp b/tests/fixture/kv/in_memory_kv.hpp index 84a84ba8dff..60a99ed8920 100644 --- a/tests/fixture/kv/in_memory_kv.hpp +++ b/tests/fixture/kv/in_memory_kv.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/tests/fixture/lib/logging/in_memory_logger.hpp b/tests/fixture/lib/logging/in_memory_logger.hpp index a6767a446a7..76f0e7307d6 100644 --- a/tests/fixture/lib/logging/in_memory_logger.hpp +++ b/tests/fixture/lib/logging/in_memory_logger.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/tests/unit/lib/logging/in_memory_logger.hpp b/tests/unit/lib/logging/in_memory_logger.hpp index f97f2ad402b..0cfd0ef41d5 100644 --- a/tests/unit/lib/logging/in_memory_logger.hpp +++ b/tests/unit/lib/logging/in_memory_logger.hpp @@ -1,6 +1,6 @@ /** * Canary - A free and open-source MMORPG server emulator - * Copyright (©) 2019-2022 OpenTibiaBR + * Copyright (©) 2019-2024 OpenTibiaBR * Repository: https://github.com/opentibiabr/canary * License: https://github.com/opentibiabr/canary/blob/main/LICENSE * Contributors: https://github.com/opentibiabr/canary/graphs/contributors diff --git a/vcpkg.json b/vcpkg.json index 7201d4a5556..82f1058bd94 100644 --- a/vcpkg.json +++ b/vcpkg.json @@ -16,7 +16,10 @@ { "name": "opentelemetry-cpp", "default-features": true, - "features": ["otlp-http", "prometheus"] + "features": [ + "otlp-http", + "prometheus" + ] }, "parallel-hashmap", "protobuf", @@ -25,7 +28,9 @@ "zlib", { "name": "libmariadb", - "features": ["mariadbclient"] + "features": [ + "mariadbclient" + ] }, { "name": "gmp", @@ -36,5 +41,5 @@ "platform": "windows" } ], - "builtin-baseline": "98a562a04cd03728f399e79e1b37bcccb5a69b37" + "builtin-baseline": "095ee06e7f60dceef7d713e3f8b1c2eb10d650d7" } diff --git a/vcproj/canary.vcxproj b/vcproj/canary.vcxproj index 023ee148891..e31fdbad08a 100644 --- a/vcproj/canary.vcxproj +++ b/vcproj/canary.vcxproj @@ -44,6 +44,7 @@ + @@ -255,6 +256,7 @@ + @@ -483,7 +485,7 @@ vcpkg_installed x64-windows - true + false false diff --git a/vcproj/settings.props b/vcproj/settings.props index 1f7471f48c6..35625d790b9 100644 --- a/vcproj/settings.props +++ b/vcproj/settings.props @@ -24,15 +24,28 @@ jsoncpp.lib; abseil_dll.lib; argon2.lib; - opentelemetry_common.lib; - opentelemetry_resources.lib; - opentelemetry_metrics.lib; - opentelemetry_exporter_ostream_metrics.lib; - opentelemetry_exporter_prometheus.lib; - prometheus-cpp-core.lib; - prometheus-cpp-pull.lib; - civetweb.lib; - civetweb-cpp.lib + opentelemetry_common.lib; + opentelemetry_exporter_in_memory.lib; + opentelemetry_exporter_ostream_logs.lib; + opentelemetry_exporter_ostream_metrics.lib; + opentelemetry_exporter_ostream_span.lib; + opentelemetry_exporter_otlp_http.lib; + opentelemetry_exporter_otlp_http_client.lib; + opentelemetry_exporter_otlp_http_log.lib; + opentelemetry_exporter_otlp_http_metric.lib; + opentelemetry_exporter_prometheus.lib; + opentelemetry_http_client_curl.lib; + opentelemetry_logs.lib; + opentelemetry_metrics.lib; + opentelemetry_otlp_recordable.lib; + opentelemetry_proto.lib; + opentelemetry_resources.lib; + opentelemetry_trace.lib; + opentelemetry_version.lib; + prometheus-cpp-core.lib; + prometheus-cpp-pull.lib; + civetweb.lib; + civetweb-cpp.lib comctl32.lib; @@ -50,15 +63,26 @@ jsoncpp.lib; abseil_dll.lib; argon2.lib; - opentelemetry_common.lib; - opentelemetry_resources.lib; - opentelemetry_metrics.lib; - opentelemetry_exporter_ostream_metrics.lib; - opentelemetry_exporter_prometheus.lib; - prometheus-cpp-core.lib; - prometheus-cpp-pull.lib; - civetweb.lib; - civetweb-cpp.lib + opentelemetry_common.lib; + opentelemetry_exporter_in_memory.lib; + opentelemetry_exporter_ostream_logs.lib; + opentelemetry_exporter_ostream_metrics.lib; + opentelemetry_exporter_ostream_span.lib; + opentelemetry_exporter_otlp_http.lib; + opentelemetry_exporter_otlp_http_client.lib; + opentelemetry_exporter_otlp_http_log.lib; + opentelemetry_exporter_otlp_http_metric.lib; + opentelemetry_exporter_prometheus.lib; + opentelemetry_http_client_curl.lib; + opentelemetry_logs.lib; + opentelemetry_metrics.lib; + opentelemetry_otlp_recordable.lib; + opentelemetry_proto.lib; + opentelemetry_resources.lib; + opentelemetry_trace.lib; + opentelemetry_version.lib; + civetweb.lib; + civetweb-cpp.lib