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.
-## Project supported by [TNT Cloud](https://tntcloudbr.com.br/)
-
-Thanks for supporting our open-source project with your game cloud hosting services.
-
-
-
-
-
### 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