diff --git a/data-otservbr-global/monster/amphibics/makara.lua b/data-otservbr-global/monster/amphibics/makara.lua
index 66bd91a17dd..a0da9573236 100644
--- a/data-otservbr-global/monster/amphibics/makara.lua
+++ b/data-otservbr-global/monster/amphibics/makara.lua
@@ -54,7 +54,7 @@ monster.flags = {
canPushCreatures = true,
staticAttackChance = 90,
targetDistance = 1,
- runHealth = 10,
+ runHealth = 0,
healthHidden = false,
isBlockable = false,
canWalkOnEnergy = false,
@@ -71,12 +71,13 @@ monster.voices = {
interval = 5000,
chance = 10,
{ text = "waddle waddle", yell = false },
+ { text = "Nihahaha!", yell = false },
}
monster.loot = {
- { name = "platinum coin", chance = 100000, maxCount = 13 },
+ { name = "platinum coin", chance = 100000, maxCount = 18 },
{ name = "makara tongue", chance = 10160 },
- { name = "makara fin", chance = 7420 },
+ { name = "makara fin", chance = 7420, maxCount = 2 },
{ name = "meat", chance = 7030, maxCount = 2 },
{ name = "cyan crystal fragment", chance = 4300 },
{ name = "yellow gem", chance = 4100 },
@@ -90,10 +91,10 @@ monster.loot = {
monster.attacks = {
{ name = "combat", interval = 2000, chance = 100, type = COMBAT_PHYSICALDAMAGE, minDamage = -145, maxDamage = -390, target = true }, -- basic_attack
- { name = "combat", interval = 2000, chance = 25, type = COMBAT_EARTHDAMAGE, minDamage = -305, maxDamage = -390, radius = 3, effect = CONST_ME_STONES, shootEffect = CONST_ANI_EARTH, target = true }, -- stone_shower_ball
- { name = "combat", interval = 2000, chance = 25, type = COMBAT_EARTHDAMAGE, minDamage = -305, maxDamage = -390, radius = 5, effect = CONST_ME_STONES, shootEffect = CONST_ANI_EARTH, target = true }, -- great_stone_shower_ball
- { name = "combat", interval = 2000, chance = 25, type = COMBAT_ICEDAMAGE, minDamage = -360, maxDamage = -390, range = 7, shootEffect = CONST_ANI_SMALLICE, effect = CONST_ME_ICEATTACK, target = true }, -- ice_strike
- { name = "makarawatersplash", interval = 2000, chance = 25, minDamage = -380, maxDamage = -455, target = false }, -- short_water_cone-wave
+ { name = "combat", interval = 2500, chance = 25, type = COMBAT_EARTHDAMAGE, minDamage = -305, maxDamage = -390, radius = 3, effect = CONST_ME_STONES, shootEffect = CONST_ANI_EARTH, target = true }, -- stone_shower_ball
+ { name = "combat", interval = 3000, chance = 20, type = COMBAT_EARTHDAMAGE, minDamage = -305, maxDamage = -390, radius = 5, effect = CONST_ME_STONES, shootEffect = CONST_ANI_EARTH, target = true }, -- great_stone_shower_ball
+ { name = "combat", interval = 3500, chance = 20, type = COMBAT_ICEDAMAGE, minDamage = -360, maxDamage = -390, range = 7, shootEffect = CONST_ANI_SMALLICE, effect = CONST_ME_ICEATTACK, target = true }, -- ice_strike
+ { name = "makarawatersplash", interval = 4000, chance = 25, minDamage = -380, maxDamage = -455, target = false }, -- short_water_cone-wave
}
monster.defenses = {
diff --git a/data-otservbr-global/monster/aquatics/deathling_scout.lua b/data-otservbr-global/monster/aquatics/deathling_scout.lua
index d0a54d6b17a..23b959b41fe 100644
--- a/data-otservbr-global/monster/aquatics/deathling_scout.lua
+++ b/data-otservbr-global/monster/aquatics/deathling_scout.lua
@@ -34,7 +34,7 @@ monster.speed = 155
monster.manaCost = 0
monster.faction = FACTION_DEATHLING
-monster.enemyFactions = { FACTION_DEEPLING, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_DEEPLING }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/aquatics/deathling_spellsinger.lua b/data-otservbr-global/monster/aquatics/deathling_spellsinger.lua
index 68d5df39ea4..a7fdf805bc8 100644
--- a/data-otservbr-global/monster/aquatics/deathling_spellsinger.lua
+++ b/data-otservbr-global/monster/aquatics/deathling_spellsinger.lua
@@ -34,7 +34,7 @@ monster.speed = 155
monster.manaCost = 0
monster.faction = FACTION_DEATHLING
-monster.enemyFactions = { FACTION_DEEPLING, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_DEEPLING }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/aquatics/deepling_brawler.lua b/data-otservbr-global/monster/aquatics/deepling_brawler.lua
index ed81778f449..bc44da075f9 100644
--- a/data-otservbr-global/monster/aquatics/deepling_brawler.lua
+++ b/data-otservbr-global/monster/aquatics/deepling_brawler.lua
@@ -34,7 +34,7 @@ monster.speed = 85
monster.manaCost = 0
monster.faction = FACTION_DEEPLING
-monster.enemyFactions = { FACTION_DEATHLING, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_DEATHLING }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/aquatics/deepling_elite.lua b/data-otservbr-global/monster/aquatics/deepling_elite.lua
index a80ee5575cb..c990f4b0447 100644
--- a/data-otservbr-global/monster/aquatics/deepling_elite.lua
+++ b/data-otservbr-global/monster/aquatics/deepling_elite.lua
@@ -34,7 +34,7 @@ monster.speed = 165
monster.manaCost = 0
monster.faction = FACTION_DEEPLING
-monster.enemyFactions = { FACTION_DEATHLING, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_DEATHLING }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/aquatics/deepling_guard.lua b/data-otservbr-global/monster/aquatics/deepling_guard.lua
index c77609e5964..23f87f55459 100644
--- a/data-otservbr-global/monster/aquatics/deepling_guard.lua
+++ b/data-otservbr-global/monster/aquatics/deepling_guard.lua
@@ -35,7 +35,7 @@ monster.speed = 135
monster.manaCost = 0
monster.faction = FACTION_DEEPLING
-monster.enemyFactions = { FACTION_DEATHLING, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_DEATHLING }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/aquatics/deepling_scout.lua b/data-otservbr-global/monster/aquatics/deepling_scout.lua
index d7ce0c2db19..dadb1d8a19a 100644
--- a/data-otservbr-global/monster/aquatics/deepling_scout.lua
+++ b/data-otservbr-global/monster/aquatics/deepling_scout.lua
@@ -34,7 +34,7 @@ monster.speed = 65
monster.manaCost = 0
monster.faction = FACTION_DEEPLING
-monster.enemyFactions = { FACTION_DEATHLING, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_DEATHLING }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/aquatics/deepling_spellsinger.lua b/data-otservbr-global/monster/aquatics/deepling_spellsinger.lua
index 56557793784..15efdb2cf87 100644
--- a/data-otservbr-global/monster/aquatics/deepling_spellsinger.lua
+++ b/data-otservbr-global/monster/aquatics/deepling_spellsinger.lua
@@ -34,7 +34,7 @@ monster.speed = 95
monster.manaCost = 0
monster.faction = FACTION_DEEPLING
-monster.enemyFactions = { FACTION_DEATHLING, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_DEATHLING }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/aquatics/deepling_tyrant.lua b/data-otservbr-global/monster/aquatics/deepling_tyrant.lua
index 290aeee78d2..59a2a2ca79d 100644
--- a/data-otservbr-global/monster/aquatics/deepling_tyrant.lua
+++ b/data-otservbr-global/monster/aquatics/deepling_tyrant.lua
@@ -34,7 +34,7 @@ monster.speed = 155
monster.manaCost = 0
monster.faction = FACTION_DEEPLING
-monster.enemyFactions = { FACTION_DEATHLING, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_DEATHLING }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/aquatics/deepling_warrior.lua b/data-otservbr-global/monster/aquatics/deepling_warrior.lua
index 7f31c9ae504..1da00f6c2a7 100644
--- a/data-otservbr-global/monster/aquatics/deepling_warrior.lua
+++ b/data-otservbr-global/monster/aquatics/deepling_warrior.lua
@@ -34,7 +34,7 @@ monster.speed = 145
monster.manaCost = 0
monster.faction = FACTION_DEEPLING
-monster.enemyFactions = { FACTION_DEATHLING, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_DEATHLING }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/aquatics/deepling_worker.lua b/data-otservbr-global/monster/aquatics/deepling_worker.lua
index cb958c11553..395f4ed57be 100644
--- a/data-otservbr-global/monster/aquatics/deepling_worker.lua
+++ b/data-otservbr-global/monster/aquatics/deepling_worker.lua
@@ -34,7 +34,7 @@ monster.speed = 65
monster.manaCost = 0
monster.faction = FACTION_DEEPLING
-monster.enemyFactions = { FACTION_DEATHLING, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_DEATHLING }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/birds/dire_penguin.lua b/data-otservbr-global/monster/birds/dire_penguin.lua
index 6eb73eff344..d0b70ec954a 100644
--- a/data-otservbr-global/monster/birds/dire_penguin.lua
+++ b/data-otservbr-global/monster/birds/dire_penguin.lua
@@ -17,10 +17,10 @@ monster.raceId = 335
monster.Bestiary = {
class = "Bird",
race = BESTY_RACE_BIRD,
- toKill = 500,
- FirstUnlock = 25,
- SecondUnlock = 250,
- CharmsPoints = 15,
+ toKill = 5,
+ FirstUnlock = 1,
+ SecondUnlock = 3,
+ CharmsPoints = 30,
Stars = 2,
Occurrence = 3,
Locations = "Any place with penguins like, Formorgar Glacier, Helheim, Tyrsung or Svargrond. \z
diff --git a/data-otservbr-global/monster/bosses/alchemist_container.lua b/data-otservbr-global/monster/bosses/alchemist_container.lua
new file mode 100644
index 00000000000..62905d5975e
--- /dev/null
+++ b/data-otservbr-global/monster/bosses/alchemist_container.lua
@@ -0,0 +1,96 @@
+local mType = Game.createMonsterType("Alchemist Container")
+local monster = {}
+
+monster.description = "Alchemist Container"
+monster.experience = 0
+monster.outfit = {
+ lookTypeEx = 39952,
+}
+
+monster.health = 1200
+monster.maxHealth = 1200
+monster.race = "undead"
+monster.corpse = 39949
+monster.speed = 0
+monster.manaCost = 0
+
+monster.changeTarget = {
+ interval = 4000,
+ chance = 15,
+}
+
+monster.strategiesTarget = {
+ nearest = 60,
+ health = 30,
+ damage = 10,
+}
+
+monster.flags = {
+ summonable = false,
+ attackable = true,
+ hostile = true,
+ convinceable = false,
+ pushable = false,
+ rewardBoss = false,
+ illusionable = false,
+ canPushItems = true,
+ canPushCreatures = true,
+ critChance = 10,
+ staticAttackChance = 90,
+ targetDistance = 1,
+ runHealth = 0,
+ healthHidden = false,
+ isBlockable = false,
+ canWalkOnEnergy = true,
+ canWalkOnFire = true,
+ canWalkOnPoison = true,
+}
+
+monster.light = {
+ level = 0,
+ color = 0,
+}
+
+monster.attacks = {}
+
+monster.defenses = {
+ defense = 54,
+ armor = 59,
+ mitigation = 3.7,
+}
+
+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 = true },
+ { type = "outfit", condition = false },
+ { type = "invisible", condition = true },
+ { 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/antenna.lua b/data-otservbr-global/monster/bosses/antenna.lua
new file mode 100644
index 00000000000..f1a165177cc
--- /dev/null
+++ b/data-otservbr-global/monster/bosses/antenna.lua
@@ -0,0 +1,96 @@
+local mType = Game.createMonsterType("Antenna")
+local monster = {}
+
+monster.description = "Antenna"
+monster.experience = 0
+monster.outfit = {
+ lookTypeEx = 850,
+}
+
+monster.health = 5000
+monster.maxHealth = 5000
+monster.race = "undead"
+monster.corpse = 0
+monster.speed = 0
+monster.manaCost = 0
+
+monster.changeTarget = {
+ interval = 4000,
+ chance = 15,
+}
+
+monster.strategiesTarget = {
+ nearest = 60,
+ health = 30,
+ damage = 10,
+}
+
+monster.flags = {
+ summonable = false,
+ attackable = true,
+ hostile = true,
+ convinceable = false,
+ pushable = false,
+ rewardBoss = false,
+ illusionable = false,
+ canPushItems = true,
+ canPushCreatures = true,
+ critChance = 10,
+ staticAttackChance = 90,
+ targetDistance = 1,
+ runHealth = 0,
+ healthHidden = false,
+ isBlockable = false,
+ canWalkOnEnergy = true,
+ canWalkOnFire = true,
+ canWalkOnPoison = true,
+}
+
+monster.light = {
+ level = 0,
+ color = 0,
+}
+
+monster.attacks = {}
+
+monster.defenses = {
+ defense = 54,
+ armor = 59,
+ mitigation = 3.7,
+}
+
+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 = true },
+ { type = "outfit", condition = false },
+ { type = "invisible", condition = true },
+ { 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/cerebellum.lua b/data-otservbr-global/monster/bosses/cerebellum.lua
new file mode 100644
index 00000000000..b83fcec8615
--- /dev/null
+++ b/data-otservbr-global/monster/bosses/cerebellum.lua
@@ -0,0 +1,94 @@
+local mType = Game.createMonsterType("Cerebellum")
+local monster = {}
+
+monster.description = "Cerebellum"
+monster.experience = 0
+monster.outfit = {
+ lookTypeEx = 32572,
+}
+
+monster.health = 20000
+monster.maxHealth = monster.health
+monster.race = "undead"
+monster.corpse = 32576
+monster.speed = 0
+
+monster.changeTarget = {
+ interval = 4000,
+ chance = 10,
+}
+
+monster.flags = {
+ summonable = false,
+ attackable = true,
+ hostile = true,
+ convinceable = false,
+ pushable = false,
+ rewardBoss = false,
+ illusionable = false,
+ canPushItems = true,
+ canPushCreatures = true,
+ staticAttackChance = 90,
+ targetDistance = 1,
+ runHealth = 0,
+ healthHidden = false,
+ canWalkOnEnergy = true,
+ canWalkOnFire = true,
+ canWalkOnPoison = true,
+}
+
+monster.loot = {}
+
+monster.attacks = {
+ { name = "combat", interval = 2000, chance = 50, type = COMBAT_ENERGYDAMAGE, minDamage = -90, maxDamage = -180, range = 7, shootEffect = CONST_ANI_ENERGY, target = true },
+ { name = "heal brain head", interval = 2000, chance = 10, target = false },
+}
+
+monster.defenses = {
+ defense = 78,
+ armor = 78,
+ mitigation = 3.27,
+ { name = "combat", type = COMBAT_HEALING, chance = 15, interval = 2000, minDamage = 50, maxDamage = 200, effect = CONST_ME_MAGIC_BLUE },
+}
+
+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 = -30 },
+ { type = COMBAT_HOLYDAMAGE, percent = 0 },
+ { type = COMBAT_DEATHDAMAGE, percent = 0 },
+}
+
+monster.immunities = {
+ { type = "paralyze", condition = true },
+ { type = "invisible", condition = true },
+}
+
+monster.voices = {
+ interval = 5000,
+ chance = 10,
+ { text = "Feel the power of death unleashed!", yell = false },
+ { text = "I will rule again and my realm of death will span the world!", yell = false },
+ { text = "My lich-knights will conquer this world for me!", yell = 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/doctor_marrow.lua b/data-otservbr-global/monster/bosses/doctor_marrow.lua
index 308ab14b27b..cccdd2e4d57 100644
--- a/data-otservbr-global/monster/bosses/doctor_marrow.lua
+++ b/data-otservbr-global/monster/bosses/doctor_marrow.lua
@@ -22,7 +22,7 @@ monster.manaCost = 0
monster.changeTarget = {
interval = 4000,
- chance = 15,
+ chance = 10,
}
monster.strategiesTarget = {
@@ -65,12 +65,17 @@ monster.voices = {
monster.attacks = {
{ name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -2800 },
+ { name = "combat", interval = 3000, chance = 20, type = COMBAT_LIFEDRAIN, minDamage = -50, maxDamage = -2800, effect = CONST_ME_MAGIC_RED, target = false, radius = 3 },
+ { name = "doctor marrow explosion", interval = 10000, chance = 25, target = true, range = 1 },
+ { name = "root", interval = 4000, chance = 10, target = true },
+ { name = "fear", interval = 3500, chance = 10, target = true },
}
monster.defenses = {
defense = 54,
armor = 59,
mitigation = 3.7,
+ { name = "combat", interval = 2000, chance = 25, type = COMBAT_HEALING, minDamage = 900, maxDamage = 2400, effect = CONST_ME_MAGIC_BLUE, target = false },
}
monster.elements = {
diff --git a/data-otservbr-global/monster/bosses/the_monster.lua b/data-otservbr-global/monster/bosses/the_monster.lua
new file mode 100644
index 00000000000..c7f84935b20
--- /dev/null
+++ b/data-otservbr-global/monster/bosses/the_monster.lua
@@ -0,0 +1,133 @@
+local mType = Game.createMonsterType("The Monster")
+local monster = {}
+
+monster.description = "The Monster"
+monster.experience = 30000
+monster.outfit = {
+ lookType = 1600,
+}
+
+monster.bosstiary = {
+ bossRaceId = 2299,
+ bossRace = RARITY_ARCHFOE,
+}
+
+monster.health = 450000
+monster.maxHealth = 450000
+monster.race = "blood"
+monster.corpse = 42247
+monster.speed = 180
+monster.manaCost = 0
+
+monster.changeTarget = {
+ interval = 4000,
+ chance = 15,
+}
+
+monster.strategiesTarget = {
+ nearest = 60,
+ health = 30,
+ damage = 10,
+}
+
+monster.flags = {
+ summonable = false,
+ attackable = true,
+ hostile = true,
+ convinceable = false,
+ pushable = false,
+ rewardBoss = true,
+ illusionable = false,
+ canPushItems = true,
+ canPushCreatures = true,
+ critChance = 10,
+ staticAttackChance = 90,
+ targetDistance = 1,
+ runHealth = 0,
+ healthHidden = false,
+ isBlockable = false,
+ canWalkOnEnergy = true,
+ canWalkOnFire = true,
+ canWalkOnPoison = true,
+}
+
+monster.light = {
+ level = 0,
+ color = 0,
+}
+
+monster.loot = {
+ { name = "platinum coin", chance = 100000, maxcount = 30 },
+ { id = 3039, chance = 35542, maxCount = 2 }, -- red gem
+ { name = "ultimate health potion", chance = 27000, maxcount = 7 },
+ { name = "ultimate mana potion", chance = 24300, maxcount = 5 },
+ { name = "ultimate spirit potion", chance = 25750, maxcount = 4 },
+ { name = "mastermind potion", chance = 23200, maxcount = 3 },
+ { name = "berserk potion", chance = 24800, maxcount = 3 },
+ { name = "bullseye potion", chance = 23500, maxcount = 3 },
+ { name = "yellow gem", chance = 26200, maxcount = 5 },
+ { name = "blue gem", chance = 25100 },
+ { name = "green gem", chance = 24600 },
+ { name = "violet gem", chance = 25350 },
+ { name = "giant amethyst", chance = 4300 },
+ { name = "giant topaz", chance = 4600 },
+ { name = "giant emerald", chance = 4500 },
+ { id = 33778, chance = 900 }, -- raw watermelon turmaline
+ { name = "alchemist's notepad", chance = 420 },
+ { name = "antler-horn helmet", chance = 390 },
+ { name = "mutant bone kilt", chance = 450 },
+ { name = "mutated skin armor", chance = 430 },
+ { name = "mutated skin legs", chance = 410 },
+ { name = "stitched mutant hide legs", chance = 440 },
+ { name = "alchemist's boots", chance = 460 },
+ { name = "mutant bone boots", chance = 400 },
+}
+
+monster.attacks = {
+ { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -2800 },
+ { name = "combat", interval = 2000, chance = 35, type = COMBAT_ENERGYDAMAGE, minDamage = -600, maxDamage = -1200, effect = CONST_ME_ENERGYAREA, target = true, radius = 5, range = 3 },
+ { name = "destroy magic walls", interval = 1000, chance = 50 },
+}
+
+monster.defenses = {
+ defense = 54,
+ armor = 59,
+ mitigation = 3.7,
+ { name = "combat", interval = 2000, chance = 25, type = COMBAT_HEALING, minDamage = 900, maxDamage = 2400, 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 = true },
+ { type = "outfit", condition = false },
+ { type = "invisible", condition = true },
+ { 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/demons/demon.lua b/data-otservbr-global/monster/demons/demon.lua
index 3a1208c210b..0839ae00b41 100644
--- a/data-otservbr-global/monster/demons/demon.lua
+++ b/data-otservbr-global/monster/demons/demon.lua
@@ -23,10 +23,7 @@ monster.Bestiary = {
CharmsPoints = 50,
Stars = 4,
Occurrence = 0,
- Locations = "Hero Cave, Ferumbras' Citadel, Goroma, Ghostlands Warlock area unreachable, \z
- Liberty Bay hidden underground passage unreachable, Razachai, deep in Pits of Inferno (found in every throneroom except Verminor's), \z
- deep Formorgar Mines, Demon Forge, Alchemist Quarter, Magician Quarter, Chyllfroest, Oramond Dungeon, \z
- Abandoned Sewers, Hell Hub and Halls of Ascension.",
+ Locations = "Hero Cave, Ferumbras' Citadel, Goroma, Ghostlands Warlock area unreachable, Liberty Bay hidden underground passage unreachable, Razachai, deep in Pits of Inferno (found in every throneroom except Verminor's), deep Formorgar Mines, Demon Forge, Alchemist Quarter, Magician Quarter, Chyllfroest, Oramond Dungeon, Abandoned Sewers, Hell Hub and Halls of Ascension.",
}
monster.health = 8200
diff --git a/data-otservbr-global/monster/giants/ogre_brute.lua b/data-otservbr-global/monster/giants/ogre_brute.lua
index 26272cc0716..10f479ce379 100644
--- a/data-otservbr-global/monster/giants/ogre_brute.lua
+++ b/data-otservbr-global/monster/giants/ogre_brute.lua
@@ -95,7 +95,7 @@ monster.loot = {
{ id = 7428, chance = 500 }, -- bonebreaker
{ id = 22171, chance = 800 }, -- ogre klubba
{ id = 3465, chance = 500 }, -- pot
- { id = 8906, chance = 200 }, -- heavily rusted helmet
+ { name = "rusted helmet", chance = 220 },
{ id = 22192, chance = 300 }, -- shamanic mask
}
diff --git a/data-otservbr-global/monster/giants/ogre_rowdy.lua b/data-otservbr-global/monster/giants/ogre_rowdy.lua
index c479a8f9c7b..70b45bedd2e 100644
--- a/data-otservbr-global/monster/giants/ogre_rowdy.lua
+++ b/data-otservbr-global/monster/giants/ogre_rowdy.lua
@@ -34,7 +34,7 @@ monster.speed = 210
monster.manaCost = 0
monster.faction = FACTION_ANUMA
-monster.enemyFactions = { FACTION_FAFNAR, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_FAFNAR }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/giants/ogre_ruffian.lua b/data-otservbr-global/monster/giants/ogre_ruffian.lua
index fd9ab8232f1..aa561883463 100644
--- a/data-otservbr-global/monster/giants/ogre_ruffian.lua
+++ b/data-otservbr-global/monster/giants/ogre_ruffian.lua
@@ -34,7 +34,7 @@ monster.speed = 215
monster.manaCost = 0
monster.faction = FACTION_ANUMA
-monster.enemyFactions = { FACTION_FAFNAR, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_FAFNAR }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/giants/ogre_sage.lua b/data-otservbr-global/monster/giants/ogre_sage.lua
index 83bb6ce0b71..5f619a75ce7 100644
--- a/data-otservbr-global/monster/giants/ogre_sage.lua
+++ b/data-otservbr-global/monster/giants/ogre_sage.lua
@@ -34,7 +34,7 @@ monster.speed = 230
monster.manaCost = 0
monster.faction = FACTION_ANUMA
-monster.enemyFactions = { FACTION_FAFNAR, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_FAFNAR }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/humanoids/crazed_summer_rearguard.lua b/data-otservbr-global/monster/humanoids/crazed_summer_rearguard.lua
index 03c8a6000c3..8e269d760c4 100644
--- a/data-otservbr-global/monster/humanoids/crazed_summer_rearguard.lua
+++ b/data-otservbr-global/monster/humanoids/crazed_summer_rearguard.lua
@@ -98,11 +98,9 @@ monster.loot = {
}
monster.attacks = {
- { name = "melee", interval = 2000, chance = 100, minDamage = -210, maxDamage = -530 },
- { name = "combat", interval = 2000, chance = 10, type = COMBAT_FIREDAMAGE, minDamage = -270, maxDamage = -710, length = 3, spread = 0, effect = CONST_ME_FIREAREA, target = false },
- { name = "combat", interval = 2000, chance = 10, type = COMBAT_FIREDAMAGE, minDamage = -250, maxDamage = -300, range = 7, shootEffect = CONST_ANI_FIRE, target = false },
- { name = "combat", interval = 2000, chance = 10, type = COMBAT_FIREDAMAGE, minDamage = -350, maxDamage = -380, radius = 5, effect = CONST_ME_EXPLOSIONHIT, target = true },
- { name = "combat", interval = 2000, chance = 10, type = COMBAT_FIREDAMAGE, minDamage = -200, maxDamage = -350, radius = 5, effect = CONST_ME_EXPLOSIONAREA, target = true },
+ { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -450 },
+ { name = "combat", interval = 2500, chance = 30, type = COMBAT_FIREDAMAGE, minDamage = -150, maxDamage = -300, range = 6, effect = CONST_ME_FIREATTACK, target = true },
+ { name = "combat", interval = 3000, chance = 30, type = COMBAT_FIREDAMAGE, minDamage = -200, maxDamage = -300, range = 6, radius = 2, effect = CONST_ME_FIREAREA, target = true },
}
monster.defenses = {
diff --git a/data-otservbr-global/monster/humanoids/troll_guard.lua b/data-otservbr-global/monster/humanoids/troll_guard.lua
index a796c9226dc..67887f566c4 100644
--- a/data-otservbr-global/monster/humanoids/troll_guard.lua
+++ b/data-otservbr-global/monster/humanoids/troll_guard.lua
@@ -17,13 +17,13 @@ monster.raceId = 745
monster.Bestiary = {
class = "Humanoid",
race = BESTY_RACE_HUMANOID,
- toKill = 500,
- FirstUnlock = 25,
- SecondUnlock = 250,
- CharmsPoints = 15,
+ toKill = 5,
+ FirstUnlock = 1,
+ SecondUnlock = 3,
+ CharmsPoints = 30,
Stars = 2,
Occurrence = 3,
- Locations = "Rookgaards central cave in the Mapper Coords125.64125.136104textnew western Troll tunnel, north-west of Carlin during raids and Thais Knights Guild arena during raids on Kingsday Mini World ChangeKingsday.",
+ Locations = "Rookgaard and in Thais during raids",
}
monster.health = 60
diff --git a/data-otservbr-global/monster/humans/black_sphinx_acolyte.lua b/data-otservbr-global/monster/humans/black_sphinx_acolyte.lua
index fc98bcab36d..924b18fd4f0 100644
--- a/data-otservbr-global/monster/humans/black_sphinx_acolyte.lua
+++ b/data-otservbr-global/monster/humans/black_sphinx_acolyte.lua
@@ -34,7 +34,7 @@ monster.speed = 155
monster.manaCost = 0
monster.faction = FACTION_FAFNAR
-monster.enemyFactions = { FACTION_ANUMA, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_ANUMA }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/humans/burning_gladiator.lua b/data-otservbr-global/monster/humans/burning_gladiator.lua
index 8923d0928cb..b2ba5ba4d9f 100644
--- a/data-otservbr-global/monster/humans/burning_gladiator.lua
+++ b/data-otservbr-global/monster/humans/burning_gladiator.lua
@@ -38,7 +38,7 @@ monster.speed = 145
monster.manaCost = 0
monster.faction = FACTION_FAFNAR
-monster.enemyFactions = { FACTION_ANUMA, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_ANUMA }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/humans/hardened_usurper_archer.lua b/data-otservbr-global/monster/humans/hardened_usurper_archer.lua
index cbfe82cd9eb..3da9570b2a1 100644
--- a/data-otservbr-global/monster/humans/hardened_usurper_archer.lua
+++ b/data-otservbr-global/monster/humans/hardened_usurper_archer.lua
@@ -21,7 +21,7 @@ monster.speed = 125
monster.manaCost = 0
monster.faction = FACTION_LIONUSURPERS
-monster.enemyFactions = { FACTION_LION, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_LION }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/humans/hardened_usurper_knight.lua b/data-otservbr-global/monster/humans/hardened_usurper_knight.lua
index 341b85f2de2..4ae4ae081e1 100644
--- a/data-otservbr-global/monster/humans/hardened_usurper_knight.lua
+++ b/data-otservbr-global/monster/humans/hardened_usurper_knight.lua
@@ -21,7 +21,7 @@ monster.speed = 130
monster.manaCost = 0
monster.faction = FACTION_LIONUSURPERS
-monster.enemyFactions = { FACTION_LION, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_LION }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/humans/hardened_usurper_warlock.lua b/data-otservbr-global/monster/humans/hardened_usurper_warlock.lua
index 04282653df3..6b25ce5ad76 100644
--- a/data-otservbr-global/monster/humans/hardened_usurper_warlock.lua
+++ b/data-otservbr-global/monster/humans/hardened_usurper_warlock.lua
@@ -21,7 +21,7 @@ monster.speed = 165
monster.manaCost = 0
monster.faction = FACTION_LIONUSURPERS
-monster.enemyFactions = { FACTION_LION, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_LION }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/humans/priestess_of_the_wild_sun.lua b/data-otservbr-global/monster/humans/priestess_of_the_wild_sun.lua
index a97c9a3c56d..b185ccbf11d 100644
--- a/data-otservbr-global/monster/humans/priestess_of_the_wild_sun.lua
+++ b/data-otservbr-global/monster/humans/priestess_of_the_wild_sun.lua
@@ -38,7 +38,7 @@ monster.speed = 160
monster.manaCost = 0
monster.faction = FACTION_FAFNAR
-monster.enemyFactions = { FACTION_ANUMA, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_ANUMA }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/humans/usurper_archer.lua b/data-otservbr-global/monster/humans/usurper_archer.lua
index 4f01920b395..88a4b3782f7 100644
--- a/data-otservbr-global/monster/humans/usurper_archer.lua
+++ b/data-otservbr-global/monster/humans/usurper_archer.lua
@@ -34,7 +34,7 @@ monster.speed = 125
monster.manaCost = 0
monster.faction = FACTION_LIONUSURPERS
-monster.enemyFactions = { FACTION_LION, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_LION }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/humans/usurper_knight.lua b/data-otservbr-global/monster/humans/usurper_knight.lua
index 7116b67fbfa..aada0828995 100644
--- a/data-otservbr-global/monster/humans/usurper_knight.lua
+++ b/data-otservbr-global/monster/humans/usurper_knight.lua
@@ -34,7 +34,7 @@ monster.speed = 130
monster.manaCost = 0
monster.faction = FACTION_LIONUSURPERS
-monster.enemyFactions = { FACTION_LION, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_LION }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/humans/usurper_warlock.lua b/data-otservbr-global/monster/humans/usurper_warlock.lua
index 86f582d8e2c..8a3672a9d90 100644
--- a/data-otservbr-global/monster/humans/usurper_warlock.lua
+++ b/data-otservbr-global/monster/humans/usurper_warlock.lua
@@ -34,7 +34,7 @@ monster.speed = 165
monster.manaCost = 0
monster.faction = FACTION_LIONUSURPERS
-monster.enemyFactions = { FACTION_LION, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_LION }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/lycanthropes/cunning_werepanther.lua b/data-otservbr-global/monster/lycanthropes/cunning_werepanther.lua
new file mode 100644
index 00000000000..b0e6c74131f
--- /dev/null
+++ b/data-otservbr-global/monster/lycanthropes/cunning_werepanther.lua
@@ -0,0 +1,131 @@
+local mType = Game.createMonsterType("Cunning Werepanther")
+local monster = {}
+
+monster.description = "a cunning werepanther"
+monster.experience = 3620
+monster.outfit = {
+ lookType = 1648,
+ lookHead = 18,
+ lookBody = 124,
+ lookLegs = 74,
+ lookFeet = 81,
+ lookAddons = 1,
+ lookMount = 0,
+}
+
+monster.raceId = 2403
+monster.Bestiary = {
+ class = "Lycanthrope",
+ race = BESTY_RACE_LYCANTHROPE,
+ toKill = 2500,
+ FirstUnlock = 100,
+ SecondUnlock = 1000,
+ CharmsPoints = 50,
+ Stars = 4,
+ Occurrence = 0,
+ Locations = "Murky Caverns, Oskayaat",
+}
+
+monster.health = 4300
+monster.maxHealth = 4300
+monster.race = "blood"
+monster.corpse = 43959
+monster.speed = 125
+monster.manaCost = 0
+
+monster.changeTarget = {
+ interval = 5000,
+ chance = 20,
+}
+
+monster.strategiesTarget = {
+ nearest = 70,
+ health = 10,
+ damage = 10,
+ random = 10,
+}
+
+monster.flags = {
+ summonable = false,
+ attackable = true,
+ hostile = true,
+ convinceable = false,
+ pushable = false,
+ rewardBoss = false,
+ illusionable = false,
+ canPushItems = true,
+ canPushCreatures = true,
+ staticAttackChance = 80,
+ targetDistance = 1,
+ 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 = "Grrr", yell = false },
+}
+
+monster.loot = {
+ { name = "gold coin", chance = 100000, maxCount = 80 },
+ { name = "platinum coin", chance = 100000, maxCount = 11 },
+ { name = "werepanther claw", chance = 12780 },
+ { name = "golden sickle", chance = 5120 },
+ { name = "meat", chance = 5500, maxCount = 2 },
+ { name = "small topaz", chance = 7120, maxCount = 4 },
+ { name = "moonlight crystals", chance = 2550 },
+ { id = 3037, chance = 5130 }, -- yellow gem
+ { name = "lightning headband", chance = 7200 },
+ { name = "ripper lance", chance = 850 },
+ { name = "gemmed figurine", chance = 1770 },
+ { id = 816, chance = 4710 }, -- lightning pendant
+ { name = "fur armor", chance = 2620 },
+ { id = 43917, chance = 600 }, -- werepanther trophy
+}
+
+monster.attacks = {
+ { name = "melee", interval = 2000, chance = 100, minDamage = -75, maxDamage = -540 },
+ { name = "combat", interval = 3300, chance = 20, type = COMBAT_ENERGYDAMAGE, minDamage = -175, maxDamage = -350, radius = 2, effect = CONST_ME_ENERGYAREA, shootEffect = CONST_ANI_ENERGY, range = 4, target = true },
+ { name = "combat", interval = 2300, chance = 15, type = COMBAT_ENERGYDAMAGE, minDamage = -250, maxDamage = -425, radius = 3, effect = CONST_ME_ENERGYAREA, target = false },
+ { name = "combat", interval = 2700, chance = 20, type = COMBAT_PHYSICALDAMAGE, minDamage = -225, maxDamage = -350, radius = 2, effect = CONST_ME_YELLOWSMOKE, shootEffect = CONST_ANI_LARGEROCK, range = 4, target = true },
+ { name = "combat", interval = 3700, chance = 35, type = COMBAT_PHYSICALDAMAGE, minDamage = -200, maxDamage = -375, radius = 3, effect = CONST_ME_STONE_STORM, target = false },
+}
+
+monster.defenses = {
+ defense = 30,
+ armor = 72,
+ mitigation = 2.05,
+ { name = "combat", interval = 2000, chance = 25, type = COMBAT_HEALING, minDamage = 50, maxDamage = 100, effect = CONST_ME_MAGIC_BLUE, target = false },
+}
+
+monster.elements = {
+ { type = COMBAT_PHYSICALDAMAGE, percent = 0 },
+ { type = COMBAT_ENERGYDAMAGE, percent = 20 },
+ { type = COMBAT_EARTHDAMAGE, percent = -25 },
+ { type = COMBAT_FIREDAMAGE, percent = -15 },
+ { type = COMBAT_LIFEDRAIN, percent = 0 },
+ { type = COMBAT_MANADRAIN, percent = 0 },
+ { type = COMBAT_DROWNDAMAGE, percent = 0 },
+ { type = COMBAT_ICEDAMAGE, percent = 20 },
+ { type = COMBAT_HOLYDAMAGE, percent = 10 },
+ { type = COMBAT_DEATHDAMAGE, percent = -10 },
+}
+
+monster.immunities = {
+ { type = "paralyze", condition = true },
+ { type = "outfit", condition = false },
+ { type = "invisible", condition = true },
+ { type = "bleed", condition = false },
+}
+
+mType:register(monster)
diff --git a/data-otservbr-global/monster/lycanthropes/feral_werecrocodile.lua b/data-otservbr-global/monster/lycanthropes/feral_werecrocodile.lua
new file mode 100644
index 00000000000..724e5bcced7
--- /dev/null
+++ b/data-otservbr-global/monster/lycanthropes/feral_werecrocodile.lua
@@ -0,0 +1,127 @@
+local mType = Game.createMonsterType("Feral Werecrocodile")
+local monster = {}
+
+monster.description = "a feral werecrocodile"
+monster.experience = 5430
+monster.outfit = {
+ lookType = 1647,
+ lookHead = 116,
+ lookBody = 95,
+ lookLegs = 19,
+ lookFeet = 21,
+ lookAddons = 0,
+ lookMount = 0,
+}
+
+monster.raceId = 2389
+monster.Bestiary = {
+ class = "Lycanthrope",
+ race = BESTY_RACE_LYCANTHROPE,
+ toKill = 2500,
+ FirstUnlock = 100,
+ SecondUnlock = 1000,
+ CharmsPoints = 50,
+ Stars = 4,
+ Occurrence = 0,
+ Locations = "Murky Caverns",
+}
+
+monster.health = 6400
+monster.maxHealth = 6400
+monster.race = "blood"
+monster.corpse = 43767
+monster.speed = 110
+monster.manaCost = 0
+
+monster.changeTarget = {
+ interval = 5000,
+ chance = 20,
+}
+
+monster.strategiesTarget = {
+ nearest = 70,
+ health = 10,
+ damage = 10,
+ random = 10,
+}
+
+monster.flags = {
+ summonable = false,
+ attackable = true,
+ hostile = true,
+ convinceable = false,
+ pushable = false,
+ rewardBoss = false,
+ illusionable = false,
+ canPushItems = true,
+ canPushCreatures = true,
+ staticAttackChance = 80,
+ targetDistance = 1,
+ runHealth = 0,
+ healthHidden = false,
+ isBlockable = false,
+ canWalkOnEnergy = true,
+ canWalkOnFire = true,
+ canWalkOnPoison = true,
+}
+
+monster.light = {
+ level = 0,
+ color = 0,
+}
+
+monster.voices = {}
+
+monster.loot = {
+ { name = "gold coin", chance = 100000, maxCount = 100 },
+ { name = "platinum coin", chance = 100000, maxCount = 21 },
+ { name = "werecrocodile tongue", chance = 10800 },
+ { name = "war hammer", chance = 5000 },
+ { name = "ham", chance = 5500, maxCount = 2 },
+ { name = "moonlight crystals", chance = 3000 },
+ { name = "violet gem", chance = 1370 },
+ { name = "green crystal shard", chance = 2800 },
+ { name = "ornate crossbow", chance = 680 },
+ { name = "terra mantle", chance = 2190 },
+ { name = "golden sun coin", chance = 1820 },
+ { name = "sun brooch", chance = 680 },
+ { name = "swamplair armor", chance = 230 },
+ { id = 43916, chance = 200 }, -- werecrocodile trophy
+}
+
+monster.attacks = {
+ { name = "melee", interval = 2000, chance = 100, minDamage = -50, maxDamage = -485 },
+ { name = "combat", interval = 3400, chance = 33, type = COMBAT_DEATHDAMAGE, minDamage = -300, maxDamage = -450, length = 7, spread = 3, effect = CONST_ME_MORTAREA, target = false },
+ { name = "combat", interval = 2700, chance = 20, type = COMBAT_DEATHDAMAGE, minDamage = -300, maxDamage = -450, radius = 3, effect = CONST_ME_MORTAREA, shootEffect = CONST_ANI_DEATH, range = 4, target = true },
+ { name = "combat", interval = 3300, chance = 30, type = COMBAT_LIFEDRAIN, minDamage = -175, maxDamage = -350, radius = 1, effect = CONST_ME_MAGIC_RED, range = 1, target = true },
+ { name = "werecrocodile fire ring", interval = 4100, chance = 25, minDamage = -275, maxDamage = -350, target = false },
+}
+
+monster.defenses = {
+ defense = 30,
+ armor = 82,
+ mitigation = 2.28,
+ { name = "combat", interval = 2000, chance = 25, type = COMBAT_HEALING, minDamage = 50, maxDamage = 100, effect = CONST_ME_MAGIC_BLUE, target = false },
+}
+
+monster.elements = {
+ { type = COMBAT_PHYSICALDAMAGE, percent = 25 },
+ { type = COMBAT_ENERGYDAMAGE, percent = -5 },
+ { type = COMBAT_EARTHDAMAGE, percent = 20 },
+ { type = COMBAT_FIREDAMAGE, percent = 35 },
+ { type = COMBAT_LIFEDRAIN, percent = 0 },
+ { type = COMBAT_MANADRAIN, percent = 0 },
+ { type = COMBAT_DROWNDAMAGE, percent = 0 },
+ { type = COMBAT_ICEDAMAGE, percent = -15 },
+ { type = COMBAT_HOLYDAMAGE, percent = -20 },
+ { type = COMBAT_DEATHDAMAGE, percent = 60 },
+}
+
+monster.immunities = {
+ { type = "paralyze", condition = true },
+ { type = "outfit", condition = false },
+ { type = "invisible", condition = true },
+ { type = "bleed", condition = false },
+}
+
+mType:register(monster)
diff --git a/data-otservbr-global/monster/lycanthropes/werecrocodile.lua b/data-otservbr-global/monster/lycanthropes/werecrocodile.lua
new file mode 100644
index 00000000000..125c25799c0
--- /dev/null
+++ b/data-otservbr-global/monster/lycanthropes/werecrocodile.lua
@@ -0,0 +1,126 @@
+local mType = Game.createMonsterType("Werecrocodile")
+local monster = {}
+
+monster.description = "a werecrocodile"
+monster.experience = 4140
+monster.outfit = {
+ lookType = 1647,
+ lookHead = 95,
+ lookBody = 117,
+ lookLegs = 4,
+ lookFeet = 116,
+ lookAddons = 0,
+ lookMount = 0,
+}
+
+monster.raceId = 2403
+monster.Bestiary = {
+ class = "Lycanthrope",
+ race = BESTY_RACE_LYCANTHROPE,
+ toKill = 2500,
+ FirstUnlock = 100,
+ SecondUnlock = 1000,
+ CharmsPoints = 50,
+ Stars = 4,
+ Occurrence = 0,
+ Locations = "Murky Caverns",
+}
+
+monster.health = 5280
+monster.maxHealth = 5280
+monster.race = "blood"
+monster.corpse = 43754
+monster.speed = 115
+monster.manaCost = 0
+
+monster.changeTarget = {
+ interval = 5000,
+ chance = 20,
+}
+
+monster.strategiesTarget = {
+ nearest = 70,
+ health = 10,
+ damage = 10,
+ random = 10,
+}
+
+monster.flags = {
+ summonable = false,
+ attackable = true,
+ hostile = true,
+ convinceable = false,
+ pushable = false,
+ rewardBoss = false,
+ illusionable = false,
+ canPushItems = true,
+ canPushCreatures = true,
+ staticAttackChance = 80,
+ targetDistance = 1,
+ runHealth = 0,
+ healthHidden = false,
+ isBlockable = false,
+ canWalkOnEnergy = true,
+ canWalkOnFire = true,
+ canWalkOnPoison = true,
+}
+
+monster.light = {
+ level = 0,
+ color = 0,
+}
+
+monster.voices = {}
+
+monster.loot = {
+ { name = "gold coin", chance = 100000, maxCount = 100 },
+ { name = "platinum coin", chance = 100000, maxCount = 13 },
+ { name = "werecrocodile tongue", chance = 10800 },
+ { name = "serpent sword", chance = 5910 },
+ { name = "crocodile boots", chance = 8530 },
+ { name = "meat", chance = 5500, maxCount = 4 },
+ { name = "small topaz", chance = 9120, maxCount = 4 },
+ { name = "moonlight crystals", chance = 3000 },
+ { id = 3039, chance = 5120 }, -- red gem
+ { name = "green crystal shard", chance = 2800 },
+ { name = "bonebreaker", chance = 500 },
+ { name = "glorious axe", chance = 2190 },
+ { name = "golden sun coin", chance = 1770 },
+ { id = 43916, chance = 200 }, -- werecrocodile trophy
+}
+
+monster.attacks = {
+ { name = "melee", interval = 2000, chance = 100, minDamage = -100, maxDamage = -575 },
+ { name = "combat", interval = 2700, chance = 37, type = COMBAT_PHYSICALDAMAGE, minDamage = -175, maxDamage = -325, radius = 1, effect = CONST_ME_BIG_SCRATCH, range = 1, target = true },
+ { name = "combat", interval = 3300, chance = 20, type = COMBAT_DEATHDAMAGE, minDamage = -200, maxDamage = -375, length = 6, spread = 3, effect = CONST_ME_BLACKSMOKE, target = false },
+ { name = "combat", interval = 3700, chance = 25, type = COMBAT_DEATHDAMAGE, minDamage = -250, maxDamage = -400, radius = 2, range = 4, effect = CONST_ME_MORTAREA, target = true },
+}
+
+monster.defenses = {
+ defense = 30,
+ armor = 82,
+ mitigation = 2.28,
+ { name = "combat", interval = 2000, chance = 25, type = COMBAT_HEALING, minDamage = 50, maxDamage = 100, effect = CONST_ME_MAGIC_BLUE, target = false },
+}
+
+monster.elements = {
+ { type = COMBAT_PHYSICALDAMAGE, percent = 10 },
+ { type = COMBAT_ENERGYDAMAGE, percent = -5 },
+ { type = COMBAT_EARTHDAMAGE, percent = 5 },
+ { type = COMBAT_FIREDAMAGE, percent = 25 },
+ { type = COMBAT_LIFEDRAIN, percent = 0 },
+ { type = COMBAT_MANADRAIN, percent = 0 },
+ { type = COMBAT_DROWNDAMAGE, percent = 0 },
+ { type = COMBAT_ICEDAMAGE, percent = -25 },
+ { type = COMBAT_HOLYDAMAGE, percent = -15 },
+ { type = COMBAT_DEATHDAMAGE, percent = 25 },
+}
+
+monster.immunities = {
+ { type = "paralyze", condition = true },
+ { type = "outfit", condition = false },
+ { type = "invisible", condition = true },
+ { type = "bleed", condition = false },
+}
+
+mType:register(monster)
diff --git a/data-otservbr-global/monster/lycanthropes/werepanther.lua b/data-otservbr-global/monster/lycanthropes/werepanther.lua
new file mode 100644
index 00000000000..fb351221cea
--- /dev/null
+++ b/data-otservbr-global/monster/lycanthropes/werepanther.lua
@@ -0,0 +1,131 @@
+local mType = Game.createMonsterType("Werepanther")
+local monster = {}
+
+monster.description = "a werepanther"
+monster.experience = 3550
+monster.outfit = {
+ lookType = 1648,
+ lookHead = 114,
+ lookBody = 114,
+ lookLegs = 67,
+ lookFeet = 122,
+ lookAddons = 1,
+ lookMount = 0,
+}
+
+monster.raceId = 2390
+monster.Bestiary = {
+ class = "Lycanthrope",
+ race = BESTY_RACE_LYCANTHROPE,
+ toKill = 2500,
+ FirstUnlock = 100,
+ SecondUnlock = 1000,
+ CharmsPoints = 50,
+ Stars = 4,
+ Occurrence = 0,
+ Locations = "Murky Caverns, Oskayaat",
+}
+
+monster.health = 4200
+monster.maxHealth = 4200
+monster.race = "blood"
+monster.corpse = 43758
+monster.speed = 125
+monster.manaCost = 0
+
+monster.changeTarget = {
+ interval = 5000,
+ chance = 20,
+}
+
+monster.strategiesTarget = {
+ nearest = 70,
+ health = 10,
+ damage = 10,
+ random = 10,
+}
+
+monster.flags = {
+ summonable = false,
+ attackable = true,
+ hostile = true,
+ convinceable = false,
+ pushable = false,
+ rewardBoss = false,
+ illusionable = false,
+ canPushItems = true,
+ canPushCreatures = true,
+ staticAttackChance = 80,
+ targetDistance = 1,
+ 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 = "Grrr", yell = false },
+}
+
+monster.loot = {
+ { name = "gold coin", chance = 100000, maxCount = 80 },
+ { name = "platinum coin", chance = 100000, maxCount = 11 },
+ { name = "werepanther claw", chance = 13820, maxCount = 2 },
+ { name = "golden sickle", chance = 6720 },
+ { name = "meat", chance = 5500, maxCount = 2 },
+ { name = "small ruby", chance = 8470, maxCount = 3 },
+ { name = "moonlight crystals", chance = 2550 },
+ { id = 3039, chance = 1240 }, -- red gem
+ { name = "magma monocle", chance = 3080 },
+ { name = "ripper lance", chance = 850 },
+ { name = "gemmed figurine", chance = 1770 },
+ { id = 817, chance = 2770 }, -- magma amulet
+ { name = "fur armor", chance = 2620 },
+ { id = 43917, chance = 650 }, -- werepanther trophy
+}
+
+monster.attacks = {
+ { name = "melee", interval = 2000, chance = 100, minDamage = -75, maxDamage = -525 },
+ { name = "combat", interval = 3700, chance = 40, type = COMBAT_FIREDAMAGE, minDamage = -265, maxDamage = -400, radius = 3, effect = CONST_ME_FIREATTACK, target = false },
+ { name = "combat", interval = 2700, chance = 20, type = COMBAT_PHYSICALDAMAGE, minDamage = -275, maxDamage = -375, radius = 3, effect = CONST_ME_GROUNDSHAKER, range = 4, target = true },
+ { name = "combat", interval = 2300, chance = 15, type = COMBAT_PHYSICALDAMAGE, minDamage = -200, maxDamage = -375, radius = 2, effect = CONST_ME_YELLOWSMOKE, target = false },
+ { name = "combat", interval = 3300, chance = 15, type = COMBAT_DEATHDAMAGE, minDamage = -175, maxDamage = -300, radius = 2, effect = CONST_ME_MORTAREA, range = 4, target = true },
+}
+
+monster.defenses = {
+ defense = 30,
+ armor = 72,
+ mitigation = 2.05,
+ { name = "combat", interval = 2000, chance = 25, type = COMBAT_HEALING, minDamage = 50, maxDamage = 100, effect = CONST_ME_MAGIC_BLUE, target = false },
+}
+
+monster.elements = {
+ { type = COMBAT_PHYSICALDAMAGE, percent = 0 },
+ { type = COMBAT_ENERGYDAMAGE, percent = -10 },
+ { type = COMBAT_EARTHDAMAGE, percent = 10 },
+ { type = COMBAT_FIREDAMAGE, percent = 20 },
+ { type = COMBAT_LIFEDRAIN, percent = 0 },
+ { type = COMBAT_MANADRAIN, percent = 0 },
+ { type = COMBAT_DROWNDAMAGE, percent = 0 },
+ { type = COMBAT_ICEDAMAGE, percent = -15 },
+ { type = COMBAT_HOLYDAMAGE, percent = -25 },
+ { type = COMBAT_DEATHDAMAGE, percent = 20 },
+}
+
+monster.immunities = {
+ { type = "paralyze", condition = true },
+ { type = "outfit", condition = false },
+ { type = "invisible", condition = true },
+ { type = "bleed", condition = false },
+}
+
+mType:register(monster)
diff --git a/data-otservbr-global/monster/lycanthropes/weretiger.lua b/data-otservbr-global/monster/lycanthropes/weretiger.lua
new file mode 100644
index 00000000000..6584860abb0
--- /dev/null
+++ b/data-otservbr-global/monster/lycanthropes/weretiger.lua
@@ -0,0 +1,126 @@
+local mType = Game.createMonsterType("Weretiger")
+local monster = {}
+
+monster.description = "a weretiger"
+monster.experience = 3920
+monster.outfit = {
+ lookType = 1646,
+ lookHead = 97,
+ lookBody = 114,
+ lookLegs = 113,
+ lookFeet = 94,
+ lookAddons = 1,
+ lookMount = 0,
+}
+
+monster.raceId = 2386
+monster.Bestiary = {
+ class = "Lycanthrope",
+ race = BESTY_RACE_LYCANTHROPE,
+ toKill = 2500,
+ FirstUnlock = 100,
+ SecondUnlock = 1000,
+ CharmsPoints = 50,
+ Stars = 4,
+ Occurrence = 0,
+ Locations = "Murky Caverns",
+}
+
+monster.health = 5000
+monster.maxHealth = 5000
+monster.race = "blood"
+monster.corpse = 43669
+monster.speed = 125
+monster.manaCost = 0
+
+monster.changeTarget = {
+ interval = 5000,
+ chance = 20,
+}
+
+monster.strategiesTarget = {
+ nearest = 70,
+ health = 10,
+ damage = 10,
+ random = 10,
+}
+
+monster.flags = {
+ summonable = false,
+ attackable = true,
+ hostile = true,
+ convinceable = false,
+ pushable = false,
+ rewardBoss = false,
+ illusionable = false,
+ canPushItems = true,
+ canPushCreatures = true,
+ staticAttackChance = 80,
+ targetDistance = 1,
+ runHealth = 0,
+ healthHidden = false,
+ isBlockable = false,
+ canWalkOnEnergy = true,
+ canWalkOnFire = true,
+ canWalkOnPoison = true,
+}
+
+monster.light = {
+ level = 0,
+ color = 0,
+}
+
+monster.voices = {}
+
+monster.loot = {
+ { name = "gold coin", chance = 100000, maxCount = 100 },
+ { name = "platinum coin", chance = 100000, maxCount = 13 },
+ { name = "weretiger tooth", chance = 10800 },
+ { name = "furry club", chance = 6230 },
+ { name = "meat", chance = 5500, maxCount = 4 },
+ { name = "violet crystal shard", chance = 3370 },
+ { name = "moonlight crystals", chance = 2550 },
+ { id = 3041, chance = 1200 }, -- blue gem
+ { name = "knight armor", chance = 3000 },
+ { name = "angelic axe", chance = 1430 },
+ { name = "gemmed figurine", chance = 1770 },
+ { id = 817, chance = 1770 }, -- magma amulet
+ { name = "silver moon coin", chance = 510 },
+ { id = 43915, chance = 610 }, -- weretiger trophy
+}
+
+monster.attacks = {
+ { name = "melee", interval = 2000, chance = 100, minDamage = -50, maxDamage = -625 },
+ { name = "energy chain", interval = 3300, chance = 20, minDamage = -175, maxDamage = -375, range = 3, target = true },
+ { name = "combat", interval = 3300, chance = 20, type = COMBAT_ENERGYDAMAGE, minDamage = -200, maxDamage = -375, length = 5, spread = 2, effect = CONST_ME_BLUE_ENERGY_SPARK, target = false },
+ { name = "combat", interval = 2700, chance = 37, type = COMBAT_PHYSICALDAMAGE, minDamage = -175, maxDamage = -325, radius = 1, effect = CONST_ME_BIG_SCRATCH, range = 1, target = true },
+}
+
+monster.defenses = {
+ defense = 30,
+ armor = 76,
+ mitigation = 2.16,
+ { name = "combat", interval = 2000, chance = 25, type = COMBAT_HEALING, minDamage = 50, maxDamage = 100, effect = CONST_ME_MAGIC_BLUE, target = false },
+}
+
+monster.elements = {
+ { type = COMBAT_PHYSICALDAMAGE, percent = -5 },
+ { type = COMBAT_ENERGYDAMAGE, percent = 25 },
+ { type = COMBAT_EARTHDAMAGE, percent = -15 },
+ { type = COMBAT_FIREDAMAGE, percent = -25 },
+ { type = COMBAT_LIFEDRAIN, percent = 0 },
+ { type = COMBAT_MANADRAIN, percent = 0 },
+ { type = COMBAT_DROWNDAMAGE, percent = 0 },
+ { type = COMBAT_ICEDAMAGE, percent = 30 },
+ { type = COMBAT_HOLYDAMAGE, percent = 10 },
+ { type = COMBAT_DEATHDAMAGE, percent = 0 },
+}
+
+monster.immunities = {
+ { type = "paralyze", condition = true },
+ { type = "outfit", condition = false },
+ { type = "invisible", condition = true },
+ { type = "bleed", condition = false },
+}
+
+mType:register(monster)
diff --git a/data-otservbr-global/monster/lycanthropes/white_weretiger.lua b/data-otservbr-global/monster/lycanthropes/white_weretiger.lua
new file mode 100644
index 00000000000..f892a60b117
--- /dev/null
+++ b/data-otservbr-global/monster/lycanthropes/white_weretiger.lua
@@ -0,0 +1,124 @@
+local mType = Game.createMonsterType("White Weretiger")
+local monster = {}
+
+monster.description = "a white weretiger"
+monster.experience = 5200
+monster.outfit = {
+ lookType = 1646,
+ lookHead = 19,
+ lookBody = 59,
+ lookLegs = 113,
+ lookFeet = 94,
+ lookAddons = 2,
+ lookMount = 0,
+}
+
+monster.raceId = 2387
+monster.Bestiary = {
+ class = "Lycanthrope",
+ race = BESTY_RACE_LYCANTHROPE,
+ toKill = 2500,
+ FirstUnlock = 100,
+ SecondUnlock = 1000,
+ CharmsPoints = 50,
+ Stars = 4,
+ Occurrence = 0,
+ Locations = "Murky Caverns",
+}
+
+monster.health = 6100
+monster.maxHealth = 6100
+monster.race = "blood"
+monster.corpse = 43762
+monster.speed = 120
+monster.manaCost = 0
+
+monster.changeTarget = {
+ interval = 5000,
+ chance = 20,
+}
+
+monster.strategiesTarget = {
+ nearest = 70,
+ health = 10,
+ damage = 10,
+ random = 10,
+}
+
+monster.flags = {
+ summonable = false,
+ attackable = true,
+ hostile = true,
+ convinceable = false,
+ pushable = false,
+ rewardBoss = false,
+ illusionable = false,
+ canPushItems = true,
+ canPushCreatures = true,
+ staticAttackChance = 80,
+ targetDistance = 1,
+ runHealth = 0,
+ healthHidden = false,
+ isBlockable = false,
+ canWalkOnEnergy = true,
+ canWalkOnFire = true,
+ canWalkOnPoison = true,
+}
+
+monster.light = {
+ level = 0,
+ color = 0,
+}
+
+monster.voices = {}
+
+monster.loot = {
+ { name = "gold coin", chance = 100000, maxCount = 100 },
+ { name = "platinum coin", chance = 100000, maxCount = 20 },
+ { name = "weretiger tooth", chance = 13400 },
+ { name = "beastslayer axe", chance = 3970 },
+ { name = "ham", chance = 5500, maxCount = 2 },
+ { name = "moonlight crystals", chance = 7000 },
+ { name = "white gem", chance = 1650 },
+ { name = "silver moon coin", chance = 2000 },
+ { name = "blue robe", chance = 1160 },
+ { name = "moon pin", chance = 660 },
+ { name = "crystal mace", chance = 500 },
+ { id = 43915, chance = 610 }, -- weretiger trophy
+}
+
+monster.attacks = {
+ { name = "melee", interval = 2000, chance = 100, minDamage = -100, maxDamage = -585 },
+ { name = "white weretiger ice ring", interval = 3700, chance = 20, minDamage = -300, maxDamage = -425 },
+ { name = "energy ring", interval = 4300, chance = 40, minDamage = -300, maxDamage = -425 },
+ { name = "combat", interval = 2300, chance = 15, type = COMBAT_ICEDAMAGE, minDamage = -200, maxDamage = -375, radius = 2, effect = CONST_ME_ICEAREA, target = false },
+}
+
+monster.defenses = {
+ defense = 30,
+ armor = 83,
+ mitigation = 2.25,
+ { name = "combat", interval = 2000, chance = 25, type = COMBAT_HEALING, minDamage = 50, maxDamage = 100, effect = CONST_ME_MAGIC_BLUE, target = false },
+}
+
+monster.elements = {
+ { type = COMBAT_PHYSICALDAMAGE, percent = -5 },
+ { type = COMBAT_ENERGYDAMAGE, percent = 25 },
+ { type = COMBAT_EARTHDAMAGE, percent = -20 },
+ { type = COMBAT_FIREDAMAGE, percent = -15 },
+ { type = COMBAT_LIFEDRAIN, percent = 0 },
+ { type = COMBAT_MANADRAIN, percent = 0 },
+ { type = COMBAT_DROWNDAMAGE, percent = 0 },
+ { type = COMBAT_ICEDAMAGE, percent = 40 },
+ { type = COMBAT_HOLYDAMAGE, percent = 25 },
+ { type = COMBAT_DEATHDAMAGE, percent = 0 },
+}
+
+monster.immunities = {
+ { type = "paralyze", condition = true },
+ { type = "outfit", condition = false },
+ { type = "invisible", condition = true },
+ { type = "bleed", condition = false },
+}
+
+mType:register(monster)
diff --git a/data-otservbr-global/monster/magicals/blue_djinn.lua b/data-otservbr-global/monster/magicals/blue_djinn.lua
index 627002e5469..c0a2985933f 100644
--- a/data-otservbr-global/monster/magicals/blue_djinn.lua
+++ b/data-otservbr-global/monster/magicals/blue_djinn.lua
@@ -34,7 +34,7 @@ monster.speed = 110
monster.manaCost = 0
monster.faction = FACTION_MARID
-monster.enemyFactions = { FACTION_EFREET, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_EFREET }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/magicals/crypt_warden.lua b/data-otservbr-global/monster/magicals/crypt_warden.lua
index e5a2db7ec77..7eedb1ff920 100644
--- a/data-otservbr-global/monster/magicals/crypt_warden.lua
+++ b/data-otservbr-global/monster/magicals/crypt_warden.lua
@@ -34,7 +34,7 @@ monster.speed = 145
monster.manaCost = 0
monster.faction = FACTION_ANUMA
-monster.enemyFactions = { FACTION_FAFNAR, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_FAFNAR }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/magicals/efreet.lua b/data-otservbr-global/monster/magicals/efreet.lua
index b0955162290..d20dd609a9f 100644
--- a/data-otservbr-global/monster/magicals/efreet.lua
+++ b/data-otservbr-global/monster/magicals/efreet.lua
@@ -34,7 +34,7 @@ monster.speed = 117
monster.manaCost = 0
monster.faction = FACTION_EFREET
-monster.enemyFactions = { FACTION_MARID, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_MARID }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/magicals/feral_sphinx.lua b/data-otservbr-global/monster/magicals/feral_sphinx.lua
index 481057d5654..376daa84443 100644
--- a/data-otservbr-global/monster/magicals/feral_sphinx.lua
+++ b/data-otservbr-global/monster/magicals/feral_sphinx.lua
@@ -75,21 +75,28 @@ monster.voices = {
monster.loot = {
{ name = "platinum coin", chance = 100000, maxCount = 3 },
- { name = "wand of draconia", chance = 4770 },
- { name = "sphinx feather", chance = 3450 },
- { name = "fire axe", chance = 2650 },
- { id = 31438, chance = 3450 }, -- sphinx tiara
- { name = "magma legs", chance = 1860 },
- { name = "magma monocle", chance = 1590 },
- { name = "magma boots", chance = 2120 },
- { name = "magma amulet", chance = 7160 },
- { name = "wand of inferno", chance = 7690 },
- { name = "dragon necklace", chance = 800 },
+ { name = "green crystal shard", chance = 8740 },
+ { name = "cyan crystal fragment", chance = 8620 },
+ { id = 3039, chance = 8390 }, -- red gem
+ { name = "magma amulet", chance = 6060 },
+ { name = "wand of inferno", chance = 5710 },
+ { name = "small sapphire", chance = 5590, maxCount = 2 },
+ { name = "dragon necklace", chance = 5590 },
+ { name = "blue gem", chance = 5480 },
+ { name = "sphinx feather", chance = 5480 },
+ { name = "sphinx tiara", chance = 5240 },
+ { name = "fire axe", chance = 4200 },
+ { name = "wand of draconia", chance = 2910 },
+ { name = "green gem", chance = 2680 },
+ { name = "magma monocle", chance = 1400 },
+ { name = "magma boots", chance = 1280 },
+ { name = "small enchanted emerald", chance = 1050, maxCount = 2 },
+ { name = "magma legs", chance = 930 },
}
monster.attacks = {
{ name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -450 },
- { name = "fire wave", interval = 2000, chance = 15, minDamage = -350, maxDamage = -500, length = 1, spread = 1, effect = CONST_ME_FIREAREA, target = true },
+ { name = "fire wave", interval = 2000, chance = 15, minDamage = -350, maxDamage = -500, length = 1, spread = 0, effect = CONST_ME_FIREAREA, target = true },
{ name = "combat", interval = 2000, chance = 25, type = COMBAT_ENERGYDAMAGE, minDamage = -300, maxDamage = -500, radius = 4, effect = CONST_ME_ENERGYAREA, target = false },
{ name = "combat", interval = 2000, chance = 20, type = COMBAT_FIREDAMAGE, minDamage = -350, maxDamage = -550, range = 1, shootEffect = CONST_ANI_FIRE, target = false },
{ name = "combat", interval = 2000, chance = 18, type = COMBAT_HOLYDAMAGE, minDamage = -400, maxDamage = -580, length = 6, spread = 3, effect = CONST_ME_HOLYAREA, target = false },
diff --git a/data-otservbr-global/monster/magicals/green_djinn.lua b/data-otservbr-global/monster/magicals/green_djinn.lua
index 3f7f6092068..31b13556cff 100644
--- a/data-otservbr-global/monster/magicals/green_djinn.lua
+++ b/data-otservbr-global/monster/magicals/green_djinn.lua
@@ -35,7 +35,7 @@ monster.speed = 110
monster.manaCost = 0
monster.faction = FACTION_EFREET
-monster.enemyFactions = { FACTION_MARID, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_MARID }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/magicals/guzzlemaw.lua b/data-otservbr-global/monster/magicals/guzzlemaw.lua
index d402a6921da..391a85118bc 100644
--- a/data-otservbr-global/monster/magicals/guzzlemaw.lua
+++ b/data-otservbr-global/monster/magicals/guzzlemaw.lua
@@ -23,8 +23,7 @@ monster.Bestiary = {
CharmsPoints = 50,
Stars = 4,
Occurrence = 0,
- Locations = "Guzzlemaw Valley, and a single spawn in a tower in Upper Roshamuul \z
- (south of the Depot and west of the entrance to Roshamuul Prison).",
+ Locations = "Guzzlemaw Valley, and a single spawn in a tower in Upper Roshamuul (south of the Depot and west of the entrance to Roshamuul Prison).",
}
monster.health = 6400
diff --git a/data-otservbr-global/monster/magicals/lamassu.lua b/data-otservbr-global/monster/magicals/lamassu.lua
index b59aa14c364..2d22d43c092 100644
--- a/data-otservbr-global/monster/magicals/lamassu.lua
+++ b/data-otservbr-global/monster/magicals/lamassu.lua
@@ -34,7 +34,7 @@ monster.speed = 160
monster.manaCost = 0
monster.faction = FACTION_ANUMA
-monster.enemyFactions = { FACTION_FAFNAR, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_FAFNAR }
monster.changeTarget = {
interval = 4000,
@@ -94,9 +94,10 @@ monster.loot = {
}
monster.attacks = {
- { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -600 },
- { name = "combat", interval = 2000, chance = 20, type = COMBAT_HOLYDAMAGE, minDamage = -200, maxDamage = -485, radius = 3, effect = CONST_ME_HOLYAREA, target = false },
- { name = "combat", interval = 2000, chance = 20, type = COMBAT_EARTHDAMAGE, minDamage = -100, maxDamage = -405, range = 5, radius = 3, shootEffect = CONST_ANI_SMALLEARTH, effect = CONST_ME_SMALLPLANTS, target = true },
+ { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -500 },
+ { name = "combat", interval = 2000, chance = 20, type = COMBAT_HOLYDAMAGE, minDamage = -400, maxDamage = -500, radius = 1, effect = CONST_ME_HOLYAREA, target = false },
+ { name = "combat", interval = 2000, chance = 20, type = COMBAT_HOLYDAMAGE, minDamage = -300, maxDamage = -500, radius = 3, effect = CONST_ME_HOLYAREA, target = false },
+ { name = "combat", interval = 2000, chance = 20, type = COMBAT_EARTHDAMAGE, minDamage = -300, maxDamage = -405, range = 5, radius = 2, shootEffect = CONST_ANI_SMALLEARTH, effect = CONST_ME_SMALLPLANTS, target = true },
}
monster.defenses = {
diff --git a/data-otservbr-global/monster/magicals/lumbering_carnivor.lua b/data-otservbr-global/monster/magicals/lumbering_carnivor.lua
index b6878c11e06..7eee6229eaa 100644
--- a/data-otservbr-global/monster/magicals/lumbering_carnivor.lua
+++ b/data-otservbr-global/monster/magicals/lumbering_carnivor.lua
@@ -76,21 +76,21 @@ monster.voices = {
}
monster.loot = {
- { name = "platinum coin", chance = 100000, maxCount = 5 },
- { name = "blue glass plate", chance = 100000, maxCount = 3 },
- { id = 3264, chance = 15000 }, -- sword
- { name = "axe", chance = 14000 },
- { name = "ice rapier", chance = 12000 },
- { name = "glorious axe", chance = 6100 },
- { name = "blue robe", chance = 4600 },
- { name = "two handed sword", chance = 13000 },
- { name = "fur armor", chance = 5400 },
- { id = 281, chance = 3200 }, -- giant shimmering pearl (green)
- { name = "green crystal shard", chance = 3100 },
- { name = "violet gem", chance = 4000 },
- { name = "green gem", chance = 4800 },
- { name = "blue gem", chance = 4000 },
- { name = "focus cape", chance = 3000 },
+ { name = "platinum coin", chance = 64770, maxCount = 3 },
+ { name = "blue glass plate", chance = 20840, maxCount = 3 },
+ { name = "axe", chance = 14620 },
+ { name = "ice rapier", chance = 7600 },
+ { id = 3264, chance = 5500 }, -- sword
+ { id = 281, chance = 1830 }, -- giant shimmering pearl (green)
+ { name = "green gem", chance = 1680 },
+ { name = "violet gem", chance = 1560 },
+ { name = "glorious axe", chance = 1530 },
+ { name = "two handed sword", chance = 1490 },
+ { name = "blue robe", chance = 760 },
+ { name = "blue gem", chance = 990 },
+ { name = "fur armor", chance = 950 },
+ { name = "green crystal shard", chance = 920 },
+ { name = "focus cape", chance = 80 },
}
monster.attacks = {
diff --git a/data-otservbr-global/monster/magicals/marid.lua b/data-otservbr-global/monster/magicals/marid.lua
index fa14fce413e..36340b8ccb9 100644
--- a/data-otservbr-global/monster/magicals/marid.lua
+++ b/data-otservbr-global/monster/magicals/marid.lua
@@ -34,7 +34,7 @@ monster.speed = 117
monster.manaCost = 0
monster.faction = FACTION_MARID
-monster.enemyFactions = { FACTION_EFREET, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_EFREET }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/magicals/menacing_carnivor.lua b/data-otservbr-global/monster/magicals/menacing_carnivor.lua
index fa314084b33..fed50464588 100644
--- a/data-otservbr-global/monster/magicals/menacing_carnivor.lua
+++ b/data-otservbr-global/monster/magicals/menacing_carnivor.lua
@@ -76,28 +76,28 @@ monster.voices = {
}
monster.loot = {
- { name = "platinum coin", chance = 100000, maxCount = 6 },
- { name = "morning star", chance = 100000 },
- { name = "terra rod", chance = 15550 },
- { name = "small ruby", chance = 15000 },
- { name = "crystal sword", chance = 25000 },
- { name = "ultimate mana potion", chance = 50000 },
- { name = "wand of dragonbreath", chance = 15000 },
- { name = "machete", chance = 30000 },
- { name = "iron helmet", chance = 20000 },
- { name = "serpent sword", chance = 18000 },
- { name = "heavy machete", chance = 17000 },
- { name = "terra legs", chance = 6000 },
- { name = "knight legs", chance = 4500 },
- { name = "wand of starstorm", chance = 8000 },
- { name = "wand of voodoo", chance = 7100 },
- { name = "violet glass plate", chance = 6200 },
- { name = "small enchanted ruby", chance = 1400 },
- { name = "green crystal fragment", chance = 1600 },
- { name = "onyx chip", chance = 9800 },
- { name = "opal", chance = 2000 },
- { name = "tiger eye", chance = 3000 },
- { name = "wand of decay", chance = 8700 },
+ { name = "platinum coin", chance = 65410, maxCount = 8 },
+ { name = "morning star", chance = 16730 },
+ { name = "ultimate mana potion", chance = 9820 },
+ { name = "violet glass plate", chance = 691 },
+ { name = "crystal sword", chance = 4750 },
+ { name = "terra rod", chance = 4480 },
+ { name = "small ruby", chance = 4000 },
+ { name = "onyx chip", chance = 3350 },
+ { name = "green crystal fragment", chance = 3180 },
+ { name = "small enchanted ruby", chance = 2050 },
+ { name = "terra legs", chance = 2000 },
+ { name = "knight legs", chance = 1780 },
+ { name = "machete", chance = 1730 },
+ { name = "wand of voodoo", chance = 1570 },
+ { name = "heavy machete", chance = 1240 },
+ { name = "wand of starstorm", chance = 1240 },
+ { name = "wand of dragonbreath", chance = 970 },
+ { name = "tiger eye", chance = 920 },
+ { name = "opal", chance = 810 },
+ { name = "iron helmet", chance = 760 },
+ { name = "serpent sword", chance = 700 },
+ { name = "wand of decay", chance = 490 },
}
monster.attacks = {
diff --git a/data-otservbr-global/monster/magicals/phantasm_summon.lua b/data-otservbr-global/monster/magicals/phantasm_summon.lua
index 152680243a9..4926c01aada 100644
--- a/data-otservbr-global/monster/magicals/phantasm_summon.lua
+++ b/data-otservbr-global/monster/magicals/phantasm_summon.lua
@@ -3,7 +3,7 @@ local monster = {}
monster.name = "Phantasm"
monster.description = "a phantasm"
-monster.experience = 4400
+monster.experience = 1
monster.outfit = {
lookType = 241,
lookHead = 0,
@@ -14,8 +14,8 @@ monster.outfit = {
lookMount = 0,
}
-monster.health = 3950
-monster.maxHealth = 3950
+monster.health = 65
+monster.maxHealth = 65
monster.race = "undead"
monster.corpse = 6343
monster.speed = 170
diff --git a/data-otservbr-global/monster/magicals/sphinx.lua b/data-otservbr-global/monster/magicals/sphinx.lua
index 2ca6c8f4dba..b7b305db787 100644
--- a/data-otservbr-global/monster/magicals/sphinx.lua
+++ b/data-otservbr-global/monster/magicals/sphinx.lua
@@ -34,7 +34,7 @@ monster.speed = 145
monster.manaCost = 0
monster.faction = FACTION_ANUMA
-monster.enemyFactions = { FACTION_FAFNAR, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_FAFNAR }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/magicals/spiky_carnivor.lua b/data-otservbr-global/monster/magicals/spiky_carnivor.lua
index e39750e556a..f8a29ef234f 100644
--- a/data-otservbr-global/monster/magicals/spiky_carnivor.lua
+++ b/data-otservbr-global/monster/magicals/spiky_carnivor.lua
@@ -76,24 +76,24 @@ monster.voices = {
}
monster.loot = {
- { name = "platinum coin", chance = 100000, maxCount = 6 },
- { name = "green glass plate", chance = 12000, maxCount = 17 },
- { name = "blue crystal splinter", chance = 11500 },
- { name = "brown crystal splinter", chance = 11000 },
- { name = "dark armor", chance = 10000 },
- { name = "guardian shield", chance = 9000 },
- { name = "rainbow quartz", chance = 8500 },
- { name = "blue robe", chance = 8000 },
- { name = "glacier amulet", chance = 7500 },
- { name = "lightning pendant", chance = 2200 },
- { name = "prismatic quartz", chance = 6500 },
- { name = "talon", chance = 6000 },
- { name = "terra amulet", chance = 5500 },
- { name = "warrior helmet", chance = 4000 },
- { name = "shockwave amulet", chance = 2550 },
- { name = "terra mantle", chance = 4050 },
- { name = "buckle", chance = 250 },
- { name = "doublet", chance = 250 },
+ { name = "platinum coin", chance = 66230, maxCount = 6 },
+ { name = "dark armor", chance = 13870 },
+ { name = "green glass plate", chance = 10490, maxCount = 2 },
+ { name = "blue crystal splinter", chance = 7590 },
+ { name = "brown crystal splinter", chance = 7330 },
+ { name = "guardian shield", chance = 5010 },
+ { name = "warrior helmet", chance = 2980 },
+ { name = "rainbow quartz", chance = 2540, maxCount = 2 },
+ { name = "talon", chance = 2000 },
+ { name = "glacier amulet", chance = 1920 },
+ { name = "terra amulet", chance = 1920 },
+ { name = "blue robe", chance = 1670 },
+ { name = "prismatic quartz", chance = 1380 },
+ { name = "lightning pendant", chance = 1270 },
+ { name = "doublet", chance = 360 },
+ { name = "terra mantle", chance = 330 },
+ { name = "buckle", chance = 180 },
+ { name = "shockwave amulet", chance = 150 },
}
monster.attacks = {
diff --git a/data-otservbr-global/monster/mammals/white_lion.lua b/data-otservbr-global/monster/mammals/white_lion.lua
index 9f47df6e6b9..0330aca13c0 100644
--- a/data-otservbr-global/monster/mammals/white_lion.lua
+++ b/data-otservbr-global/monster/mammals/white_lion.lua
@@ -16,7 +16,7 @@ monster.outfit = {
monster.raceId = 1967
monster.Bestiary = {
class = "Mammal",
-
+ race = BESTY_RACE_MAMMAL,
toKill = 2500,
FirstUnlock = 100,
SecondUnlock = 1000,
diff --git a/data-otservbr-global/monster/mammals/white_tiger.lua b/data-otservbr-global/monster/mammals/white_tiger.lua
new file mode 100644
index 00000000000..3d34267d2fb
--- /dev/null
+++ b/data-otservbr-global/monster/mammals/white_tiger.lua
@@ -0,0 +1,112 @@
+local mType = Game.createMonsterType("White Tiger")
+local monster = {}
+
+monster.description = "a white tiger"
+monster.experience = 40
+monster.outfit = {
+ lookType = 1649,
+ lookHead = 0,
+ lookBody = 0,
+ lookLegs = 0,
+ lookFeet = 0,
+ lookAddons = 0,
+ lookMount = 0,
+}
+
+monster.raceId = 2391
+monster.Bestiary = {
+ class = "Mammal",
+ race = BESTY_RACE_MAMMAL,
+ toKill = 500,
+ FirstUnlock = 25,
+ SecondUnlock = 250,
+ CharmsPoints = 15,
+ Stars = 2,
+ Occurrence = 0,
+ Locations = "Oskayaat",
+}
+
+monster.health = 75
+monster.maxHealth = 75
+monster.race = "blood"
+monster.corpse = 43771
+monster.speed = 110
+monster.manaCost = 420
+
+monster.changeTarget = {
+ interval = 4000,
+ chance = 0,
+}
+
+monster.strategiesTarget = {
+ nearest = 70,
+ damage = 30,
+}
+
+monster.flags = {
+ summonable = true,
+ attackable = true,
+ hostile = true,
+ convinceable = true,
+ pushable = false,
+ rewardBoss = false,
+ illusionable = true,
+ canPushItems = true,
+ canPushCreatures = true,
+ staticAttackChance = 70,
+ 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,
+}
+
+monster.loot = {
+ { name = "meat", chance = 35190, maxCount = 4 },
+ { name = "striped fur", chance = 10830 },
+}
+
+monster.attacks = {
+ { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -40 },
+}
+
+monster.defenses = {
+ defense = 15,
+ armor = 5,
+ mitigation = 0.38,
+ { name = "speed", interval = 2000, chance = 15, speedChange = 200, effect = CONST_ME_MAGIC_RED, target = false, duration = 5000 },
+}
+
+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 = -10 },
+ { type = COMBAT_HOLYDAMAGE, percent = 0 },
+ { type = COMBAT_DEATHDAMAGE, percent = -10 },
+}
+
+monster.immunities = {
+ { type = "paralyze", condition = false },
+ { type = "outfit", condition = false },
+ { type = "invisible", condition = false },
+ { type = "bleed", condition = false },
+}
+
+mType:register(monster)
diff --git a/data-otservbr-global/monster/quests/cults_of_tibia/animated_ogre_brute.lua b/data-otservbr-global/monster/quests/cults_of_tibia/animated_ogre_brute.lua
index f91e51a5793..56b2ed30216 100644
--- a/data-otservbr-global/monster/quests/cults_of_tibia/animated_ogre_brute.lua
+++ b/data-otservbr-global/monster/quests/cults_of_tibia/animated_ogre_brute.lua
@@ -80,7 +80,6 @@ monster.loot = {
{ id = 22172, chance = 600 }, -- ogre choppa
{ id = 22171, chance = 800 }, -- ogre klubba
{ id = 3465, chance = 500 }, -- pot
- { id = 8906, chance = 200 }, -- heavily rusted helmet
{ id = 22192, chance = 300 }, -- shamanic mask
}
diff --git a/data-otservbr-global/monster/quests/cults_of_tibia/bosses/ravenous_hunger.lua b/data-otservbr-global/monster/quests/cults_of_tibia/bosses/ravenous_hunger.lua
index ee9b5d37a66..e3eef7671c6 100644
--- a/data-otservbr-global/monster/quests/cults_of_tibia/bosses/ravenous_hunger.lua
+++ b/data-otservbr-global/monster/quests/cults_of_tibia/bosses/ravenous_hunger.lua
@@ -14,7 +14,6 @@ monster.outfit = {
}
monster.events = {
- "LeidenHeal",
"CultsOfTibiaBossDeath",
}
diff --git a/data-otservbr-global/monster/quests/ferumbras_ascendant/ferumbras_essence.lua b/data-otservbr-global/monster/quests/ferumbras_ascendant/ferumbras_essence.lua
index 973fa02afea..e3c0cd883c5 100644
--- a/data-otservbr-global/monster/quests/ferumbras_ascendant/ferumbras_essence.lua
+++ b/data-otservbr-global/monster/quests/ferumbras_ascendant/ferumbras_essence.lua
@@ -38,10 +38,10 @@ monster.strategiesTarget = {
monster.flags = {
summonable = false,
- attackable = true,
+ attackable = false,
hostile = true,
convinceable = false,
- pushable = false,
+ pushable = true,
rewardBoss = false,
illusionable = false,
canPushItems = true,
diff --git a/data-otservbr-global/monster/quests/grave_danger/bosses/sir_nictros.lua b/data-otservbr-global/monster/quests/grave_danger/bosses/sir_nictros.lua
index 8637363a949..921c63ad286 100644
--- a/data-otservbr-global/monster/quests/grave_danger/bosses/sir_nictros.lua
+++ b/data-otservbr-global/monster/quests/grave_danger/bosses/sir_nictros.lua
@@ -40,7 +40,7 @@ monster.flags = {
hostile = true,
convinceable = false,
pushable = false,
- rewardBoss = true,
+ rewardBoss = false,
illusionable = false,
canPushItems = true,
canPushCreatures = true,
@@ -122,18 +122,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/grave_danger/frozen_soul.lua b/data-otservbr-global/monster/quests/grave_danger/frozen_soul.lua
index 7c8c548d9e0..ba37eb8168e 100644
--- a/data-otservbr-global/monster/quests/grave_danger/frozen_soul.lua
+++ b/data-otservbr-global/monster/quests/grave_danger/frozen_soul.lua
@@ -62,8 +62,8 @@ monster.voices = {
monster.loot = {}
monster.attacks = {
- { name = "combat", interval = 2000, chance = 40, type = COMBAT_ICEDAMAGE, minDamage = -325, maxDamage = -450, range = 5, shootEffect = CONST_ANI_ICE, effect = CONST_ME_ICEAREA, target = true },
- { name = "combat", interval = 3500, chance = 30, type = COMBAT_LIFEDRAIN, minDamage = -275, maxDamage = -400, range = 5, shootEffect = CONST_ANI_EXPLOSION, effect = CONST_ME_MAGIC_RED, target = true },
+ { name = "combat", interval = 2000, chance = 35, type = COMBAT_ICEDAMAGE, minDamage = -225, maxDamage = -400, range = 5, shootEffect = CONST_ANI_ICE, effect = CONST_ME_ICEAREA, target = true },
+ { name = "combat", interval = 3500, chance = 25, type = COMBAT_LIFEDRAIN, minDamage = -175, maxDamage = -350, range = 5, shootEffect = CONST_ANI_EXPLOSION, effect = CONST_ME_MAGIC_RED, target = true },
}
monster.defenses = {
diff --git a/data-otservbr-global/monster/quests/grave_danger/soul_scourge.lua b/data-otservbr-global/monster/quests/grave_danger/soul_scourge.lua
index e2cff3e976d..34295fba4f9 100644
--- a/data-otservbr-global/monster/quests/grave_danger/soul_scourge.lua
+++ b/data-otservbr-global/monster/quests/grave_danger/soul_scourge.lua
@@ -62,8 +62,8 @@ monster.voices = {
monster.loot = {}
monster.attacks = {
- { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -700 },
- { name = "combat", interval = 2000, chance = 20, type = COMBAT_DEATHDAMAGE, minDamage = -500, maxDamage = -750, range = 5, shootEffect = CONST_ANI_SUDDENDEATH, target = true },
+ { name = "melee", interval = 2000, chance = 80, minDamage = 0, maxDamage = -500 },
+ { name = "combat", interval = 3500, chance = 20, type = COMBAT_DEATHDAMAGE, minDamage = -300, maxDamage = -500, range = 5, shootEffect = CONST_ANI_SUDDENDEATH, target = true },
}
monster.defenses = {
diff --git a/data-otservbr-global/monster/quests/in_service_of_yalahar/rift_lord.lua b/data-otservbr-global/monster/quests/in_service_of_yalahar/rift_lord.lua
index f49fa38af71..939c159e83e 100644
--- a/data-otservbr-global/monster/quests/in_service_of_yalahar/rift_lord.lua
+++ b/data-otservbr-global/monster/quests/in_service_of_yalahar/rift_lord.lua
@@ -64,9 +64,6 @@ monster.voices = {
monster.loot = {}
---monster.attacks = {
---}
-
monster.defenses = {
defense = 5,
armor = 10,
diff --git a/data-otservbr-global/monster/quests/in_service_of_yalahar/rift_phantom.lua b/data-otservbr-global/monster/quests/in_service_of_yalahar/rift_phantom.lua
index 3fd5039cc06..e0fc91bedb3 100644
--- a/data-otservbr-global/monster/quests/in_service_of_yalahar/rift_phantom.lua
+++ b/data-otservbr-global/monster/quests/in_service_of_yalahar/rift_phantom.lua
@@ -61,9 +61,6 @@ monster.voices = {
monster.loot = {}
---monster.attacks = {
---}
-
monster.defenses = {
defense = 5,
armor = 10,
diff --git a/data-otservbr-global/monster/quests/primal_ordeal_quest/the_primal_menace.lua b/data-otservbr-global/monster/quests/primal_ordeal_quest/the_primal_menace.lua
index f233c41680b..b0bc59364d6 100644
--- a/data-otservbr-global/monster/quests/primal_ordeal_quest/the_primal_menace.lua
+++ b/data-otservbr-global/monster/quests/primal_ordeal_quest/the_primal_menace.lua
@@ -111,17 +111,15 @@ monster.voices = {
chance = 10,
}
-monster.loot = {
- { name = "primal bag", chance = 50 },
-}
+monster.loot = {}
monster.attacks = {
- { name = "melee", interval = 2000, chance = 85, minDamage = -0, maxDamage = -763 },
- { name = "combat", interval = 4000, chance = 15, type = COMBAT_EARTHDAMAGE, minDamage = -1500, maxDamage = -2200, length = 10, spread = 3, effect = CONST_ME_CARNIPHILA, target = false },
- { name = "combat", interval = 2500, chance = 25, type = COMBAT_FIREDAMAGE, minDamage = -700, maxDamage = -1000, length = 10, spread = 3, effect = CONST_ME_HITBYFIRE, target = false },
- { name = "big death wave", interval = 3500, chance = 20, minDamage = -250, maxDamage = -300, target = false },
- { name = "combat", interval = 5000, chance = 15, type = COMBAT_ENERGYDAMAGE, effect = CONST_ME_ENERGYHIT, minDamage = -1200, maxDamage = -1300, range = 4, target = false },
- { name = "combat", interval = 2700, chance = 30, type = COMBAT_EARTHDAMAGE, shootEffect = CONST_ANI_POISON, effect = CONST_ANI_EARTH, minDamage = -600, maxDamage = -1800, range = 4, target = true },
+ { name = "melee", interval = 2000, chance = 100, minDamage = -0, maxDamage = -763 },
+ { name = "combat", interval = 4000, chance = 25, type = COMBAT_EARTHDAMAGE, minDamage = -1500, maxDamage = -2200, length = 10, spread = 3, effect = CONST_ME_CARNIPHILA, target = false },
+ { name = "combat", interval = 2500, chance = 35, type = COMBAT_FIREDAMAGE, minDamage = -700, maxDamage = -1000, length = 10, spread = 3, effect = CONST_ME_HITBYFIRE, target = false },
+ { name = "big death wave", interval = 3500, chance = 25, minDamage = -250, maxDamage = -300, target = false },
+ { name = "combat", interval = 5000, chance = 25, type = COMBAT_ENERGYDAMAGE, effect = CONST_ME_ENERGYHIT, minDamage = -1200, maxDamage = -1300, range = 4, target = false },
+ { name = "combat", interval = 2700, chance = 35, type = COMBAT_EARTHDAMAGE, shootEffect = CONST_ANI_POISON, effect = CONST_ANI_EARTH, minDamage = -600, maxDamage = -1800, range = 4, target = true },
}
monster.defenses = {
diff --git a/data-otservbr-global/monster/quests/the_explorer_society/blue_butterfly.lua b/data-otservbr-global/monster/quests/the_explorer_society/blue_butterfly.lua
index 87ef3250d85..3893adff8c4 100644
--- a/data-otservbr-global/monster/quests/the_explorer_society/blue_butterfly.lua
+++ b/data-otservbr-global/monster/quests/the_explorer_society/blue_butterfly.lua
@@ -14,6 +14,21 @@ monster.outfit = {
lookMount = 0,
}
+monster.raceId = 213
+monster.Bestiary = {
+ class = "Vermin",
+ race = BESTY_RACE_VERMIN,
+ toKill = 25,
+ FirstUnlock = 5,
+ SecondUnlock = 10,
+ CharmsPoints = 1,
+ Stars = 0,
+ Occurrence = 0,
+ Locations = "Ab'Dendriel, Ab'Dendriel Surroundings, Carlin, Cormaya, Edron Surroundings, \z
+ Feyrist Meadows, Fibula, Fields of Glory, Green Claw Swamp, Issavi, Kazordoon Surroundings, Meriana, \z
+ Outlaw Camp, Port Hope Surroundings, Stonehome, Thais Surroundings, Venore Southern Swamp, Venore Surroundings.",
+}
+
monster.health = 2
monster.maxHealth = 2
monster.race = "venom"
diff --git a/data-otservbr-global/monster/quests/the_explorer_society/pink_butterfly.lua b/data-otservbr-global/monster/quests/the_explorer_society/pink_butterfly.lua
index 7003fdd3878..1a8f0d8c2a0 100644
--- a/data-otservbr-global/monster/quests/the_explorer_society/pink_butterfly.lua
+++ b/data-otservbr-global/monster/quests/the_explorer_society/pink_butterfly.lua
@@ -14,6 +14,21 @@ monster.outfit = {
lookMount = 0,
}
+monster.raceId = 213
+monster.Bestiary = {
+ class = "Vermin",
+ race = BESTY_RACE_VERMIN,
+ toKill = 25,
+ FirstUnlock = 5,
+ SecondUnlock = 10,
+ CharmsPoints = 1,
+ Stars = 0,
+ Occurrence = 0,
+ Locations = "Ab'Dendriel, Ab'Dendriel Surroundings, Carlin, Cormaya, Edron Surroundings, \z
+ Feyrist Meadows, Fibula, Fields of Glory, Green Claw Swamp, Issavi, Kazordoon Surroundings, Meriana, \z
+ Outlaw Camp, Port Hope Surroundings, Stonehome, Thais Surroundings, Venore Southern Swamp, Venore Surroundings.",
+}
+
monster.health = 2
monster.maxHealth = 2
monster.race = "venom"
diff --git a/data-otservbr-global/monster/quests/the_explorer_society/purple_butterfly.lua b/data-otservbr-global/monster/quests/the_explorer_society/purple_butterfly.lua
index d2c42510683..4b71858189d 100644
--- a/data-otservbr-global/monster/quests/the_explorer_society/purple_butterfly.lua
+++ b/data-otservbr-global/monster/quests/the_explorer_society/purple_butterfly.lua
@@ -14,6 +14,21 @@ monster.outfit = {
lookMount = 0,
}
+monster.raceId = 213
+monster.Bestiary = {
+ class = "Vermin",
+ race = BESTY_RACE_VERMIN,
+ toKill = 25,
+ FirstUnlock = 5,
+ SecondUnlock = 10,
+ CharmsPoints = 1,
+ Stars = 0,
+ Occurrence = 0,
+ Locations = "Ab'Dendriel, Ab'Dendriel Surroundings, Carlin, Cormaya, Edron Surroundings, \z
+ Feyrist Meadows, Fibula, Fields of Glory, Green Claw Swamp, Issavi, Kazordoon Surroundings, Meriana, \z
+ Outlaw Camp, Port Hope Surroundings, Stonehome, Thais Surroundings, Venore Southern Swamp, Venore Surroundings.",
+}
+
monster.health = 2
monster.maxHealth = 2
monster.race = "venom"
diff --git a/data-otservbr-global/monster/quests/the_order_of_lion/bosses/ancient_lion_knight.lua b/data-otservbr-global/monster/quests/the_order_of_lion/bosses/ancient_lion_knight.lua
index 820931f81c0..aba0cc866b4 100644
--- a/data-otservbr-global/monster/quests/the_order_of_lion/bosses/ancient_lion_knight.lua
+++ b/data-otservbr-global/monster/quests/the_order_of_lion/bosses/ancient_lion_knight.lua
@@ -21,7 +21,7 @@ monster.speed = 130
monster.manaCost = 0
monster.faction = FACTION_LIONUSURPERS
-monster.enemyFactions = { FACTION_LION, FACTION_PLAYER }
+monster.enemyFactions = { FACTION_PLAYER, FACTION_LION }
monster.changeTarget = {
interval = 4000,
diff --git a/data-otservbr-global/monster/quests/the_secret_library/bosses/ghulosh.lua b/data-otservbr-global/monster/quests/the_secret_library/bosses/ghulosh.lua
index bd3a786b365..09d4abb0935 100644
--- a/data-otservbr-global/monster/quests/the_secret_library/bosses/ghulosh.lua
+++ b/data-otservbr-global/monster/quests/the_secret_library/bosses/ghulosh.lua
@@ -96,8 +96,8 @@ monster.loot = {
{ name = "dreaded cleaver", chance = 1000 },
{ name = "mercenary sword", chance = 1000 },
{ id = 28341, chance = 1000 }, -- tessellated wall
- { id = 8900, chance = 1000 }, -- heavily rusted shield
- { id = 8906, chance = 1000 }, -- heavily rusted helmet
+ { name = "slightly rusted shield", chance = 5880 },
+ { name = "slightly rusted helmet", chance = 35290 },
{ name = "epaulette", chance = 500 },
{ name = "giant emerald", chance = 500 },
{ name = "unliving demonbone", chance = 500 },
diff --git a/data-otservbr-global/monster/quests/the_secret_library/bosses/gorzindel.lua b/data-otservbr-global/monster/quests/the_secret_library/bosses/gorzindel.lua
index b00bffd6d60..e5a1e3d6424 100644
--- a/data-otservbr-global/monster/quests/the_secret_library/bosses/gorzindel.lua
+++ b/data-otservbr-global/monster/quests/the_secret_library/bosses/gorzindel.lua
@@ -98,8 +98,7 @@ monster.loot = {
{ name = "magic sulphur", chance = 1000, maxCount = 2 },
{ name = "muck rod", chance = 1000 },
{ id = 3039, chance = 1000 }, -- red gem
- { id = 8906, chance = 1000 }, -- heavily rusted helmet
- { id = 8900, chance = 1000 }, -- heavily rusted shield
+ { name = "slightly rusted shield", chance = 11760 },
{ name = "silver Token", chance = 1000, maxCount = 6 },
{ name = "sinister book", chance = 1000 },
{ name = "spellbook of warding", chance = 1000 },
diff --git a/data-otservbr-global/monster/quests/the_secret_library/lokathmor.lua b/data-otservbr-global/monster/quests/the_secret_library/lokathmor.lua
index be0e44216a9..621717cd277 100644
--- a/data-otservbr-global/monster/quests/the_secret_library/lokathmor.lua
+++ b/data-otservbr-global/monster/quests/the_secret_library/lokathmor.lua
@@ -98,7 +98,7 @@ monster.loot = {
{ name = "silver token", chance = 30000, maxCount = 4 },
{ name = "blue robe", chance = 30000 },
{ name = "dreaded cleaver", chance = 30000 },
- { id = 8900, chance = 30000 }, -- heavily rusted shield
+ { name = "slightly rusted shield", chance = 26670 },
{ name = "wand of inferno", chance = 30000 },
{ id = 28341, chance = 1000 }, -- tessellated wall
{ name = "sturdy book", chance = 1000 },
diff --git a/data-otservbr-global/monster/reptiles/adult_goanna.lua b/data-otservbr-global/monster/reptiles/adult_goanna.lua
index da07033e656..956af1034a1 100644
--- a/data-otservbr-global/monster/reptiles/adult_goanna.lua
+++ b/data-otservbr-global/monster/reptiles/adult_goanna.lua
@@ -74,35 +74,49 @@ monster.voices = {
monster.loot = {
{ name = "platinum coin", chance = 100000, maxCount = 3 },
- { name = "envenomed arrow", chance = 55360, maxCount = 8 },
- { name = "earth arrow", chance = 16800, maxCount = 29 },
- { name = "terra rod", chance = 11000 },
- { name = "goanna meat", chance = 12140 },
- { name = "goanna claw", chance = 4290 },
- { name = "lizard heart", chance = 1400 },
- { name = "red goanna scale", chance = 10000 },
- { name = "fur armor", chance = 3200 },
- { name = "serpent sword", chance = 3600 },
- { name = "terra amulet", chance = 4650 },
- { name = "terra hood", chance = 7100 },
- { name = "wood cape", chance = 1800 },
- { name = "scared frog", chance = 2100 },
- { name = "sacred tree amulet", chance = 2500 },
- { name = "small tortoise", chance = 1800 },
+ { name = "envenomed arrow", chance = 60120, maxCount = 8 },
+ { name = "earth arrow", chance = 13180, maxCount = 30 },
+ { name = "emerald bangle", chance = 12240 },
+ { name = "goanna meat", chance = 11650 },
+ { name = "small enchanted emerald", chance = 10030 },
+ { name = "green crystal splinter", chance = 9100 },
+ { name = "terra rod", chance = 8250 },
+ { name = "red goanna scale", chance = 7910 },
+ { name = "blue crystal shard", chance = 7820 },
+ { name = "small sapphire", chance = 6890, maxCount = 2 },
+ { name = "terra hood", chance = 6630 },
+ { name = "goanna claw", chance = 6210 },
+ { name = "terra amulet", chance = 6040 },
+ { name = "yellow gem", chance = 4250 },
+ { name = "silver brooch", chance = 4000 },
+ { name = "green gem", chance = 3150 },
+ { name = "serpent sword", chance = 2810 },
+ { name = "scared frog", chance = 2720 },
+ { name = "opal", chance = 2640, maxCount = 2 },
+ { name = "onyx chip", chance = 2640 },
+ { name = "gemmed figurine", chance = 1530 },
+ { name = "small amethyst", chance = 1360 },
+ { name = "fur armor", chance = 1360 },
+ { name = "wood cape", chance = 1280 },
+ { name = "white pearl", chance = 1280 },
+ { name = "small tortoise", chance = 1190 },
+ { name = "sacred tree amulet", chance = 1020 },
+ { name = "coral brooch", chance = 770 },
+ { name = "lizard heart", chance = 770 },
}
monster.attacks = {
- { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -350, condition = { type = CONDITION_POISON, totalDamage = 19, interval = 4000 } },
- { name = "wave t", interval = 2000, chance = 10, minDamage = -250, maxDamage = -380, target = false },
- { name = "combat", interval = 2000, chance = 12, type = COMBAT_EARTHDAMAGE, minDamage = -450, maxDamage = -550, range = 3, radius = 1, shootEffect = CONST_ANI_EARTH, effect = CONST_ME_EXPLOSIONHIT, target = true },
- { name = "combat", interval = 2000, chance = 15, type = COMBAT_EARTHDAMAGE, minDamage = -210, maxDamage = -300, radius = 5, effect = CONST_ME_GROUNDSHAKER, target = false },
+ { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -400, condition = { type = CONDITION_POISON, totalDamage = 200, interval = 4000 } },
+ { name = "combat", interval = 2500, chance = 30, type = COMBAT_EARTHDAMAGE, minDamage = -300, maxDamage = -600, range = 3, shootEffect = CONST_ANI_EARTH, effect = CONST_ME_HITBYPOISON, target = true },
+ { name = "combat", interval = 3000, chance = 30, type = COMBAT_EARTHDAMAGE, minDamage = -300, maxDamage = -380, radius = 2, effect = CONST_ME_GROUNDSHAKER, target = false },
+ { name = "combat", interval = 3600, chance = 40, type = COMBAT_EARTHDAMAGE, minDamage = -300, maxDamage = -390, length = 8, spread = 3, effect = CONST_ME_GREEN_RINGS, target = false },
}
monster.defenses = {
defense = 84,
armor = 84,
- mitigation = 2.60,
- { name = "speed", interval = 2000, chance = 5, speedChange = 500, effect = CONST_ME_MAGIC_RED, target = false, duration = 5000 },
+ mitigation = 2.6,
+ { name = "speed", interval = 2000, chance = 15, speedChange = 420, effect = CONST_ME_MAGIC_RED, target = false, duration = 5000 },
}
monster.elements = {
diff --git a/data-otservbr-global/monster/reptiles/boar_man.lua b/data-otservbr-global/monster/reptiles/boar_man.lua
index 53ec742ca22..0d142e332d4 100644
--- a/data-otservbr-global/monster/reptiles/boar_man.lua
+++ b/data-otservbr-global/monster/reptiles/boar_man.lua
@@ -90,10 +90,10 @@ monster.loot = {
monster.attacks = {
{ name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -498 },
- { name = "combat", interval = 2000, chance = 10, type = COMBAT_PHYSICALDAMAGE, minDamage = -375, maxDamage = -392, range = 7, shootEffect = CONST_ANI_THROWINGKNIFE, target = true },
- { name = "combat", interval = 2000, chance = 25, type = COMBAT_DEATHDAMAGE, minDamage = -386, maxDamage = -480, range = 7, shootEffect = CONST_ANI_SUDDENDEATH, target = true },
- { name = "combat", interval = 2000, chance = 20, type = COMBAT_PHYSICALDAMAGE, minDamage = -60, maxDamage = -140, range = 1, radius = 4, effect = CONST_ME_EXPLOSIONAREA, target = false },
- { name = "combat", interval = 2000, chance = 10, type = COMBAT_ENERGYDAMAGE, minDamage = -311, maxDamage = -400, length = 8, spread = 3, effect = CONST_ME_ENERGYHIT, target = false },
+ { name = "combat", interval = 2300, chance = 30, type = COMBAT_PHYSICALDAMAGE, minDamage = -375, maxDamage = -392, range = 7, shootEffect = CONST_ANI_THROWINGKNIFE, target = true },
+ { name = "combat", interval = 2600, chance = 40, type = COMBAT_DEATHDAMAGE, minDamage = -386, maxDamage = -480, range = 7, shootEffect = CONST_ANI_SUDDENDEATH, target = true },
+ { name = "combat", interval = 2900, chance = 30, type = COMBAT_PHYSICALDAMAGE, minDamage = -60, maxDamage = -140, range = 1, radius = 4, effect = CONST_ME_EXPLOSIONAREA, target = false },
+ { name = "combat", interval = 3200, chance = 35, type = COMBAT_ENERGYDAMAGE, minDamage = -311, maxDamage = -400, length = 8, spread = 3, effect = CONST_ME_ENERGYHIT, target = false },
}
monster.defenses = {
diff --git a/data-otservbr-global/monster/reptiles/carnivostrich.lua b/data-otservbr-global/monster/reptiles/carnivostrich.lua
index e0e0e362573..e0ebbb811ed 100644
--- a/data-otservbr-global/monster/reptiles/carnivostrich.lua
+++ b/data-otservbr-global/monster/reptiles/carnivostrich.lua
@@ -77,7 +77,7 @@ monster.voices = {
}
monster.loot = {
- { name = "platinum coin", chance = 80450, maxCount = 22 },
+ { name = "platinum coin", chance = 80450, maxCount = 28 },
{ name = "small ruby", chance = 16390, maxCount = 8 },
{ name = "small emerald", chance = 8330, maxCount = 8 },
{ name = "strong mana potion", chance = 4910, maxCount = 4 },
diff --git a/data-otservbr-global/monster/reptiles/crape_man.lua b/data-otservbr-global/monster/reptiles/crape_man.lua
index 99d2db01f34..83097403b9c 100644
--- a/data-otservbr-global/monster/reptiles/crape_man.lua
+++ b/data-otservbr-global/monster/reptiles/crape_man.lua
@@ -76,25 +76,25 @@ monster.voices = {
}
monster.loot = {
- { name = "platinum coin", chance = 71540, maxCount = 26 },
- { name = "guardian halberd", chance = 5310 },
+ { name = "platinum coin", chance = 71540, maxCount = 28 },
{ name = "crab man claws", chance = 5210, maxCount = 2 },
{ name = "green gem", chance = 3010 },
{ name = "great health potion", chance = 2000, maxCount = 5 },
{ id = 281, chance = 1700 }, -- giant shimmering pearl (green)
- { name = "lightning legs", chance = 1200 },
- { name = "warrior's shield", chance = 1200 },
- { name = "glacier kilt", chance = 1000 },
- { name = "noble axe", chance = 900 },
- { name = "hammer of wrath", chance = 600 },
+ { name = "guardian halberd", chance = 2400 },
+ { name = "lightning legs", chance = 900 },
+ { name = "warrior's shield", chance = 900 },
+ { name = "glacier kilt", chance = 750 },
+ { name = "noble axe", chance = 700 },
+ { name = "hammer of wrath", chance = 400 },
{ name = "ring of the sky", chance = 300 },
}
monster.attacks = {
{ name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -498 },
- { name = "combat", interval = 2000, chance = 20, type = COMBAT_PHYSICALDAMAGE, minDamage = -120, maxDamage = -320, range = 7, shootEffect = CONST_ANI_SUDDENDEATH, target = true },
- { name = "combat", interval = 2000, chance = 30, type = COMBAT_ENERGYDAMAGE, minDamage = -330, maxDamage = -380, range = 7, radius = 4, shootEffect = CONST_ANI_ENERGYBALL, effect = CONST_ME_PURPLEENERGY, target = true },
- { name = "combat", interval = 2000, chance = 10, type = COMBAT_ENERGYDAMAGE, minDamage = -311, maxDamage = -370, length = 3, spread = 3, effect = CONST_ME_ENERGYHIT, target = false },
+ { name = "combat", interval = 3500, chance = 40, type = COMBAT_PHYSICALDAMAGE, minDamage = -120, maxDamage = -320, range = 7, shootEffect = CONST_ANI_SUDDENDEATH, target = true },
+ { name = "combat", interval = 2500, chance = 50, type = COMBAT_ENERGYDAMAGE, minDamage = -330, maxDamage = -380, range = 7, radius = 4, shootEffect = CONST_ANI_ENERGYBALL, effect = CONST_ME_PURPLEENERGY, target = true },
+ { name = "combat", interval = 3000, chance = 65, type = COMBAT_ENERGYDAMAGE, minDamage = -311, maxDamage = -370, length = 3, spread = 3, effect = CONST_ME_ENERGYHIT, target = false },
}
monster.defenses = {
diff --git a/data-otservbr-global/monster/reptiles/fungosaurus.lua b/data-otservbr-global/monster/reptiles/fungosaurus.lua
index d97e91d200d..f7e65e7eb9d 100644
--- a/data-otservbr-global/monster/reptiles/fungosaurus.lua
+++ b/data-otservbr-global/monster/reptiles/fungosaurus.lua
@@ -65,8 +65,8 @@ monster.attacks = {
{ name = "melee", interval = 2000, chance = 100, minDamage = 300, maxDamage = -801 },
{ name = "combat", interval = 3000, chance = 47, type = COMBAT_PHYSICALDAMAGE, minDamage = -800, maxDamage = -1500, effect = CONST_ME_YELLOWSMOKE, target = true },
{ name = "combat", interval = 4000, chance = 31, type = COMBAT_LIFEDRAIN, minDamage = -800, maxDamage = -1500, radius = 4, effect = CONST_ME_DRAWBLOOD, target = false },
- { name = "root", interval = 2000, chance = 1, target = true },
- { name = "fear", interval = 2000, chance = 1, target = true },
+ { name = "root", interval = 2000, chance = 3, target = true },
+ { name = "fear", interval = 2000, chance = 3, target = true },
}
monster.defenses = {
diff --git a/data-otservbr-global/monster/reptiles/harpy.lua b/data-otservbr-global/monster/reptiles/harpy.lua
index 01108f33336..cf146658994 100644
--- a/data-otservbr-global/monster/reptiles/harpy.lua
+++ b/data-otservbr-global/monster/reptiles/harpy.lua
@@ -76,18 +76,18 @@ monster.voices = {
}
monster.loot = {
- { name = "platinum coin", chance = 73130, maxCount = 30 },
+ { name = "platinum coin", chance = 73130, maxCount = 25 },
{ name = "harpy feathers", chance = 6720 },
{ name = "violet crystal shard", chance = 4690 },
{ name = "blue crystal shard", chance = 4530 },
{ name = "great spirit potion", chance = 2970, maxCount = 3 },
- { name = "violet gem", chance = 2500 },
{ name = "gold ring", chance = 1720 },
{ name = "wand of defiance", chance = 1720 },
{ name = "focus cape", chance = 1560 },
- { name = "ornate crossbow", chance = 1410 },
- { name = "magic plate armor", chance = 940 },
+ { name = "violet gem", chance = 1200 },
+ { name = "ornate crossbow", chance = 500 },
{ name = "shockwave amulet", chance = 470 },
+ { name = "magic plate armor", chance = 440 },
}
monster.attacks = {
diff --git a/data-otservbr-global/monster/reptiles/liodile.lua b/data-otservbr-global/monster/reptiles/liodile.lua
index d7f79621679..b8021eea69b 100644
--- a/data-otservbr-global/monster/reptiles/liodile.lua
+++ b/data-otservbr-global/monster/reptiles/liodile.lua
@@ -75,7 +75,7 @@ monster.voices = {
}
monster.loot = {
- { name = "platinum coin", chance = 80540, maxCount = 18 },
+ { name = "platinum coin", chance = 80540, maxCount = 23 },
{ name = "small sapphire", chance = 9790, maxCount = 4 },
{ name = "green crystal shard", chance = 5360 },
{ name = "liodile fang", chance = 4030, maxCount = 3 },
@@ -89,8 +89,8 @@ monster.loot = {
monster.attacks = {
{ name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -500 },
- { name = "combat", interval = 2000, chance = 30, type = COMBAT_EARTHDAMAGE, minDamage = -325, maxDamage = -400, range = 7, shootEffect = CONST_ANI_POISONARROW, target = true },
- { name = "combat", interval = 2000, chance = 20, type = COMBAT_PHYSICALDAMAGE, minDamage = -300, maxDamage = -400, range = 2, effect = CONST_ME_GROUNDSHAKER, target = true },
+ { name = "combat", interval = 2000, chance = 50, type = COMBAT_EARTHDAMAGE, minDamage = -325, maxDamage = -400, range = 7, shootEffect = CONST_ANI_POISONARROW, target = true },
+ { name = "combat", interval = 2000, chance = 34, type = COMBAT_PHYSICALDAMAGE, minDamage = -300, maxDamage = -400, range = 2, effect = CONST_ME_GROUNDSHAKER, target = true },
}
monster.defenses = {
diff --git a/data-otservbr-global/monster/reptiles/naga_archer.lua b/data-otservbr-global/monster/reptiles/naga_archer.lua
index d105ddbb0fc..e8665ed210a 100644
--- a/data-otservbr-global/monster/reptiles/naga_archer.lua
+++ b/data-otservbr-global/monster/reptiles/naga_archer.lua
@@ -53,7 +53,7 @@ monster.flags = {
canPushItems = true,
canPushCreatures = true,
staticAttackChance = 90,
- targetDistance = 4,
+ targetDistance = 3,
runHealth = 0,
healthHidden = false,
isBlockable = false,
@@ -74,28 +74,29 @@ monster.voices = {
}
monster.loot = {
- { name = "platinum coin", chance = 100000, maxCount = 13 },
+ { name = "platinum coin", chance = 100000, maxCount = 17 },
{ name = "naga archer scales", chance = 15050, maxCount = 3 },
- { name = "naga earring", chance = 12850 },
- { name = "naga armring", chance = 5960 },
+ { name = "naga earring", chance = 12850, maxCount = 3 },
+ { name = "naga armring", chance = 5960, maxCount = 3 },
{ id = 3007, chance = 5330 }, -- crystal ring
{ name = "hunting spear", chance = 3760 },
{ name = "crossbow", chance = 3130 },
{ name = "blue crystal shard", chance = 1880 },
{ name = "bow", chance = 1570 },
- { name = "elvish bow", chance = 1250 },
+ { name = "elvish bow", chance = 750 },
{ name = "ornate crossbow", chance = 630 },
+ { name = "crystal crossbow", chance = 420 },
{ id = 7441, chance = 630 }, -- ice cube
- { name = "emerald bangle", chance = 630 },
+ { name = "emerald bangle", chance = 930 },
{ name = "silver brooch", chance = 310 },
}
monster.attacks = {
- { name = "combat", interval = 2000, chance = 100, type = COMBAT_PHYSICALDAMAGE, minDamage = -95, maxDamage = -390, shootEffect = CONST_ANI_EXPLOSION, effect = CONST_ME_PURPLEENERGY, range = 6, target = true }, -- basic_attack
- { name = "nagadeathattack", interval = 2000, chance = 25, minDamage = -430, maxDamage = -505, range = 6, target = true }, -- death_strike
- { name = "nagadeath", interval = 2000, chance = 25, minDamage = -380, maxDamage = -470, target = false }, -- short_death_wave
- { name = "death chain", interval = 2000, chance = 25, minDamage = -460, maxDamage = -520, range = 6, target = true }, -- death_chain
- { name = "combat", interval = 2000, chance = 25, type = COMBAT_PHYSICALDAMAGE, minDamage = -85, maxDamage = -190, shootEffect = CONST_ANI_EXPLOSION, effect = CONST_ME_PURPLEENERGY, range = 6, target = true }, -- explosion_strike
+ { name = "combat", interval = 2000, chance = 50, type = COMBAT_PHYSICALDAMAGE, minDamage = -95, maxDamage = -390, shootEffect = CONST_ANI_EXPLOSION, effect = CONST_ME_PURPLEENERGY, range = 6, target = true }, -- basic_attack
+ { name = "nagadeathattack", interval = 2500, chance = 20, minDamage = -430, maxDamage = -505, range = 6, target = true }, -- death_strike
+ { name = "nagadeath", interval = 3000, chance = 20, minDamage = -380, maxDamage = -470, target = false }, -- short_death_wave
+ { name = "death chain", interval = 3500, chance = 20, minDamage = -460, maxDamage = -520, range = 6, target = true }, -- death_chain
+ { name = "combat", interval = 4000, chance = 20, type = COMBAT_PHYSICALDAMAGE, minDamage = -85, maxDamage = -190, shootEffect = CONST_ANI_EXPLOSION, effect = CONST_ME_PURPLEENERGY, range = 6, target = true }, -- explosion_strike
}
monster.defenses = {
diff --git a/data-otservbr-global/monster/reptiles/naga_warrior.lua b/data-otservbr-global/monster/reptiles/naga_warrior.lua
index 32e24e4bb53..485e345c74d 100644
--- a/data-otservbr-global/monster/reptiles/naga_warrior.lua
+++ b/data-otservbr-global/monster/reptiles/naga_warrior.lua
@@ -74,28 +74,28 @@ monster.voices = {
}
monster.loot = {
- { name = "platinum coin", chance = 100000, maxCount = 12 },
+ { name = "platinum coin", chance = 100000, maxCount = 20 },
{ name = "dagger", chance = 38810 },
{ name = "strong health potion", chance = 14930, maxCount = 2 },
- { name = "naga warrior scales", chance = 10600, maxCount = 4 },
- { name = "naga earring", chance = 6420, maxCount = 2 },
+ { name = "naga warrior scales", chance = 10600, maxCount = 3 },
+ { name = "naga earring", chance = 6420, maxCount = 3 },
{ id = 3307, chance = 5520 }, -- scimitar
{ name = "naga armring", chance = 3730 },
{ name = "plate armor", chance = 2990 },
{ name = "spiky club", chance = 2090 },
{ name = "serpent sword", chance = 1940 },
- { name = "violet crystal shard", chance = 1640 },
+ { name = "violet crystal shard", chance = 2640 },
{ name = "katana", chance = 1490 },
- { name = "relic sword", chance = 1190 },
- { name = "knight armor", chance = 450 },
+ { name = "relic sword", chance = 600 },
+ { name = "knight armor", chance = 1100 },
{ id = 7441, chance = 300 }, -- ice cube
}
monster.attacks = {
{ name = "combat", interval = 2000, chance = 100, type = COMBAT_PHYSICALDAMAGE, minDamage = -120, maxDamage = -340, target = true }, -- basic_attack
- { name = "combat", interval = 2000, chance = 25, type = COMBAT_PHYSICALDAMAGE, minDamage = -320, maxDamage = -430, effect = CONST_ME_YELLOWSMOKE, range = 3, target = true }, -- eruption_strike
- { name = "nagadeathattack", interval = 2000, chance = 25, minDamage = -360, maxDamage = -415, target = true }, -- death_strike
- { name = "combat", interval = 4000, chance = 31, type = COMBAT_LIFEDRAIN, minDamage = -360, maxDamage = -386, radius = 4, effect = CONST_ME_DRAWBLOOD, target = false }, -- great_blood_ball
+ { name = "combat", interval = 2500, chance = 30, type = COMBAT_PHYSICALDAMAGE, minDamage = -320, maxDamage = -430, effect = CONST_ME_YELLOWSMOKE, range = 3, target = true }, -- eruption_strike
+ { name = "nagadeathattack", interval = 3000, chance = 35, minDamage = -360, maxDamage = -415, target = true }, -- death_strike
+ { name = "combat", interval = 3500, chance = 35, type = COMBAT_LIFEDRAIN, minDamage = -360, maxDamage = -386, radius = 4, effect = CONST_ME_DRAWBLOOD, target = false }, -- great_blood_ball
}
monster.defenses = {
diff --git a/data-otservbr-global/monster/reptiles/rhindeer.lua b/data-otservbr-global/monster/reptiles/rhindeer.lua
index 743d9fb492a..4cd428e94f1 100644
--- a/data-otservbr-global/monster/reptiles/rhindeer.lua
+++ b/data-otservbr-global/monster/reptiles/rhindeer.lua
@@ -76,18 +76,18 @@ monster.voices = {
}
monster.loot = {
- { name = "platinum coin", chance = 72260, maxCount = 31 },
- { name = "brown crystal splinter", chance = 11550, maxCount = 7 },
+ { name = "platinum coin", chance = 72260, maxCount = 30 },
+ { name = "brown crystal splinter", chance = 11550, maxCount = 4 },
{ name = "rhindeer antlers", chance = 6020 },
{ name = "rainbow quartz", chance = 4940, maxCount = 2 },
- { name = "violet gem", chance = 4050 },
{ name = "great mana potion", chance = 2670, maxCount = 4 },
{ name = "titan axe", chance = 2470 },
{ name = "yellow gem", chance = 1880 },
{ name = "knight armor", chance = 1380 },
+ { name = "violet gem", chance = 1200 },
{ id = 23543, chance = 890 }, -- collar of green plasma
- { name = "heavy mace", chance = 890 },
- { name = "mastermind shield", chance = 690 },
+ { name = "heavy mace", chance = 300 },
+ { name = "mastermind shield", chance = 400 },
{ id = 3053, chance = 690 }, -- time ring
}
diff --git a/data-otservbr-global/monster/reptiles/two-headed_turtle.lua b/data-otservbr-global/monster/reptiles/two-headed_turtle.lua
index 6ae829f08da..2d1c2090b37 100644
--- a/data-otservbr-global/monster/reptiles/two-headed_turtle.lua
+++ b/data-otservbr-global/monster/reptiles/two-headed_turtle.lua
@@ -65,24 +65,24 @@ monster.voices = {
}
monster.loot = {
- { name = "platinum coin", chance = 100000, maxCount = 80 },
+ { name = "platinum coin", chance = 100000, maxCount = 8 },
{ name = "great health potion", chance = 15701 },
- { name = "two-headed turtle heads", chance = 15000 },
+ { name = "two-headed turtle heads", chance = 8700 },
{ name = "strong mana potion", chance = 13373 },
- { name = "hydrophytes", chance = 9552 },
+ { name = "hydrophytes", chance = 11000 },
{ id = 1047, chance = 6388 }, -- bone
- { name = "glacier shoes", chance = 6239 },
+ { name = "glacier shoes", chance = 4650 },
{ id = 281, chance = 3582 }, -- giant shimmering pearl (green)
{ name = "small tropical fish", chance = 3582 },
- { name = "coral brooch", chance = 3343 },
+ { name = "coral brooch", chance = 2600 },
{ name = "silver brooch", chance = 2507 },
- { name = "lightning headband", chance = 6448 },
- { name = "knight legs", chance = 7269 },
+ { name = "lightning headband", chance = 2110 },
+ { name = "knight legs", chance = 2000 },
{ name = "gemmed figurine", chance = 2090 },
{ name = "emerald bangle", chance = 1373 },
{ name = "terra amulet", chance = 1373 },
{ id = 3040, chance = 1313 }, -- "gold nugget"
- { name = "spellbook of enlightenment", chance = 6134 },
+ { name = "spellbook of enlightenment", chance = 1300 },
{ id = 3565, chance = 1015 }, -- "cape"
{ id = 10422, chance = 657 }, -- "clay lump"
{ name = "white gem", chance = 418 },
@@ -91,7 +91,7 @@ monster.loot = {
monster.attacks = {
{ name = "melee", interval = 2000, chance = 100, minDamage = -100, maxDamage = -300 },
{ name = "combat", interval = 2500, chance = 35, type = COMBAT_ENERGYDAMAGE, minDamage = -100, maxDamage = -300, radius = 4, target = false, effect = CONST_ME_ENERGYHIT },
- { name = "combat", interval = 2000, chance = 35, type = COMBAT_LIFEDRAIN, minDamage = -100, maxDamage = -300, radius = 3, target = true, effect = CONST_ME_GHOSTLYBITE },
+ { name = "combat", interval = 2000, chance = 35, type = COMBAT_LIFEDRAIN, minDamage = -100, maxDamage = -300, radius = 3, target = true, effect = CONST_ME_GHOSTLY_BITE },
{ name = "combat", interval = 3000, chance = 45, type = COMBAT_PHYSICALDAMAGE, minDamage = -100, maxDamage = -300, range = 1, radius = 1, target = true, effect = CONST_ME_EXPLOSIONAREA },
}
diff --git a/data-otservbr-global/monster/reptiles/young_goanna.lua b/data-otservbr-global/monster/reptiles/young_goanna.lua
index 5f68752fb46..ad4b0c01128 100644
--- a/data-otservbr-global/monster/reptiles/young_goanna.lua
+++ b/data-otservbr-global/monster/reptiles/young_goanna.lua
@@ -74,23 +74,33 @@ monster.voices = {
monster.loot = {
{ name = "platinum coin", chance = 100000, maxCount = 3 },
- { name = "envenomed arrow", chance = 68000, maxCount = 35 },
- { name = "terra rod", chance = 10900 },
- { name = "goanna meat", chance = 9800 },
- { name = "snakebite rod", chance = 9000 },
- { name = "blue goanna scale", chance = 7900 },
- { name = "goanna claw", chance = 4300 },
- { name = "serpent sword", chance = 4000 },
- { name = "leaf star", chance = 3800, maxCount = 3 },
- { name = "silver amulet", chance = 3800 },
- { name = "springsprout rod", chance = 2700 },
- { name = "scared frog", chance = 2100 },
- { name = "terra amulet", chance = 1100 },
- { name = "lizard heart", chance = 800 },
- { name = "sacred tree amulet", chance = 800 },
- { name = "small tortoise", chance = 550 },
- { name = "fur armor", chance = 270 },
- { name = "terra hood", chance = 250 },
+ { name = "envenomed arrow", chance = 70400, maxCount = 35 },
+ { name = "snakebite rod", chance = 10620 },
+ { name = "goanna meat", chance = 10030 },
+ { name = "blue crystal shard", chance = 9110 },
+ { name = "terra rod", chance = 8940 },
+ { name = "blue goanna scale", chance = 8260 },
+ { name = "small enchanted emerald", chance = 4890 },
+ { name = "leaf star", chance = 4550, maxCount = 3 },
+ { name = "rainbow quartz", chance = 4050, maxCount = 3 },
+ { name = "onyx chip", chance = 4050 },
+ { name = "goanna claw", chance = 3880 },
+ { name = "violet gem", chance = 3540 },
+ { name = "serpent sword", chance = 3370 },
+ { name = "springsprout rod", chance = 3370 },
+ { name = "green crystal shard", chance = 2950 },
+ { name = "scared frog", chance = 2610 },
+ { name = "yellow gem", chance = 2530 },
+ { name = "silver amulet", chance = 2280 },
+ { name = "terra amulet", chance = 1430 },
+ { name = "blue gem", chance = 1180 },
+ { name = "terra hood", chance = 1100 },
+ { name = "blue crystal splinter", chance = 1010 },
+ { name = "sacred tree amulet", chance = 840 },
+ { name = "small tortoise", chance = 670 },
+ { name = "lizard heart", chance = 590 },
+ { name = "wooden spellbook", chance = 170 },
+ { name = "fur armor", chance = 80 },
}
monster.attacks = {
@@ -104,7 +114,7 @@ monster.defenses = {
defense = 78,
armor = 78,
mitigation = 2.16,
- { name = "speed", interval = 2000, chance = 5, speedChange = 350, effect = CONST_ME_MAGIC_RED, target = false, duration = 5000 },
+ { name = "speed", interval = 2000, chance = 15, speedChange = 420, effect = CONST_ME_MAGIC_RED, target = false, duration = 5000 },
}
monster.elements = {
diff --git a/data-otservbr-global/monster/trainers/training_machine.lua b/data-otservbr-global/monster/trainers/training_machine.lua
index cb50c0a4532..93d042efa5e 100644
--- a/data-otservbr-global/monster/trainers/training_machine.lua
+++ b/data-otservbr-global/monster/trainers/training_machine.lua
@@ -58,7 +58,18 @@ monster.defenses = {
{ name = "combat", type = COMBAT_HEALING, chance = 15, interval = 2000, minDamage = 10000, maxDamage = 50000, effect = CONST_ME_MAGIC_BLUE },
}
-monster.elements = {}
+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 = {}
diff --git a/data-otservbr-global/monster/vermins/diremaw.lua b/data-otservbr-global/monster/vermins/diremaw.lua
index 1e3accb0fd3..b89c47c99e7 100644
--- a/data-otservbr-global/monster/vermins/diremaw.lua
+++ b/data-otservbr-global/monster/vermins/diremaw.lua
@@ -93,7 +93,7 @@ monster.loot = {
{ name = "gold ingot", chance = 2970 },
{ id = 281, chance = 3100 }, -- giant shimmering pearl (green)
{ name = "suspicious device", chance = 600 },
- { name = "mycological bow", chance = 1200 },
+ { name = "mycological bow", chance = 200 },
{ name = "mushroom backpack", chance = 1500 },
}
diff --git a/data-otservbr-global/scripts/actions/quests/adventures_of_galthen/ahau_lever.lua b/data-otservbr-global/scripts/actions/quests/adventures_of_galthen/ahau_lever.lua
new file mode 100644
index 00000000000..a5300abb8f3
--- /dev/null
+++ b/data-otservbr-global/scripts/actions/quests/adventures_of_galthen/ahau_lever.lua
@@ -0,0 +1,24 @@
+local config = {
+ boss = {
+ name = "Ahau",
+ position = Position(34008, 31696, 10),
+ },
+ timeAfterKill = 60,
+ playerPositions = {
+ { pos = Position(34037, 31714, 10), teleport = Position(34008, 31703, 10) },
+ { pos = Position(34036, 31714, 10), teleport = Position(34008, 31703, 10) },
+ { pos = Position(34035, 31714, 10), teleport = Position(34008, 31703, 10) },
+ { pos = Position(34034, 31714, 10), teleport = Position(34008, 31703, 10) },
+ { pos = Position(34033, 31714, 10), teleport = Position(34008, 31703, 10) },
+ },
+ specPos = {
+ from = Position(33999, 31692, 10),
+ to = Position(34018, 31705, 10),
+ },
+ exit = Position(34036, 31717, 10),
+ exitTeleporter = Position(34002, 31706, 10),
+}
+
+local lever = BossLever(config)
+lever:position(Position(34038, 31714, 10))
+lever:register()
diff --git a/data-otservbr-global/scripts/actions/quests/adventures_of_galthen/idol_of_tukh.lua b/data-otservbr-global/scripts/actions/quests/adventures_of_galthen/idol_of_tukh.lua
new file mode 100644
index 00000000000..e48a5a477d4
--- /dev/null
+++ b/data-otservbr-global/scripts/actions/quests/adventures_of_galthen/idol_of_tukh.lua
@@ -0,0 +1,31 @@
+local config = {
+ [40578] = {
+ female = 1598,
+ male = 1597,
+ msg = "ancient aucar",
+ },
+}
+
+local idol = Action()
+function idol.onUse(player, item, fromPosition, target, toPosition, isHotkey)
+ local choice = config[item.itemid]
+ if not choice then
+ return true
+ end
+
+ if not player:hasOutfit(player:getSex() == PLAYERSEX_FEMALE and choice.female or choice.male) then
+ player:addOutfit(choice.female)
+ player:addOutfit(choice.male)
+ player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have received the " .. choice.msg .. " outfit!")
+ player:getPosition():sendMagicEffect(CONST_ME_MAGIC_GREEN)
+ item:remove(1)
+ else
+ player:sendCancelMessage("You have already obtained this outfit!")
+ end
+ return true
+end
+
+for k, v in pairs(config) do
+ idol:id(k)
+end
+idol:register()
diff --git a/data-otservbr-global/scripts/actions/quests/feaster_of_souls/portal_brain_head.lua b/data-otservbr-global/scripts/actions/quests/feaster_of_souls/portal_brain_head.lua
new file mode 100644
index 00000000000..d76538b4236
--- /dev/null
+++ b/data-otservbr-global/scripts/actions/quests/feaster_of_souls/portal_brain_head.lua
@@ -0,0 +1,106 @@
+local config = {
+ bossName = "Brain Head",
+ requiredLevel = 250,
+ timeToFightAgain = 10, -- In hour
+ destination = Position(31963, 32324, 10),
+ exitPosition = Position(31971, 32325, 10),
+}
+
+local zone = Zone("boss." .. toKey(config.bossName))
+local encounter = Encounter("Brain Head", {
+ zone = zone,
+ timeToSpawnMonsters = "50ms",
+})
+
+zone:blockFamiliars()
+zone:setRemoveDestination(config.exitPosition)
+
+local locked = false
+
+function encounter:onReset()
+ locked = false
+ encounter:removeMonsters()
+end
+
+encounter:addRemoveMonsters():autoAdvance()
+encounter:addBroadcast("You've entered the Brain Head's lair."):autoAdvance()
+encounter
+ :addSpawnMonsters({
+ {
+ name = "Brain Head",
+ positions = {
+ Position(31954, 32325, 10),
+ },
+ },
+ {
+ name = "Cerebellum",
+ positions = {
+ Position(31953, 32324, 10),
+ Position(31955, 32324, 10),
+ Position(31953, 32326, 10),
+ Position(31955, 32326, 10),
+ Position(31960, 32320, 10),
+ Position(31960, 32330, 10),
+ Position(31947, 32320, 10),
+ Position(31947, 32330, 10),
+ },
+ },
+ })
+ :autoAdvance("30s")
+
+encounter
+ :addStage({
+ start = function()
+ locked = true
+ end,
+ })
+ :autoAdvance("270s")
+
+encounter:addRemovePlayers():autoAdvance()
+
+encounter:startOnEnter()
+encounter:register()
+
+local teleportBoss = MoveEvent()
+function teleportBoss.onStepIn(creature, item, position, fromPosition)
+ if not creature or not creature:isPlayer() then
+ return false
+ end
+ local player = creature
+ if player:getLevel() < config.requiredLevel then
+ player:teleportTo(fromPosition, true)
+ player:getPosition():sendMagicEffect(CONST_ME_TELEPORT)
+ player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You need to be level " .. config.requiredLevel .. " or higher.")
+ return true
+ end
+ if locked then
+ player:teleportTo(fromPosition, true)
+ player:getPosition():sendMagicEffect(CONST_ME_TELEPORT)
+ player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "There's already someone fighting with " .. config.bossName .. ".")
+ return false
+ end
+ if zone:countPlayers(IgnoredByMonsters) >= 5 then
+ player:teleportTo(fromPosition, true)
+ player:getPosition():sendMagicEffect(CONST_ME_TELEPORT)
+ player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "The boss room is full.")
+ return false
+ end
+ local timeLeft = player:getBossCooldown(config.bossName) - os.time()
+ if timeLeft > 0 then
+ player:teleportTo(fromPosition, true)
+ player:getPosition():sendMagicEffect(CONST_ME_TELEPORT)
+ player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You have to wait " .. getTimeInWords(timeLeft) .. " to face " .. config.bossName .. " again!")
+ player:getPosition():sendMagicEffect(CONST_ME_POFF)
+ return false
+ end
+ player:teleportTo(config.destination)
+ player:getPosition():sendMagicEffect(CONST_ME_TELEPORT)
+ player:setBossCooldown(config.bossName, os.time() + config.timeToFightAgain * 3600)
+ player:sendBosstiaryCooldownTimer()
+end
+
+teleportBoss:aid(30407)
+teleportBoss:type("stepin")
+teleportBoss:register()
+
+SimpleTeleport(Position(31946, 32334, 10), config.exitPosition)
diff --git a/data-otservbr-global/scripts/creaturescripts/monster/invulnerable.lua b/data-otservbr-global/scripts/creaturescripts/monster/invulnerable.lua
new file mode 100644
index 00000000000..070b46054a6
--- /dev/null
+++ b/data-otservbr-global/scripts/creaturescripts/monster/invulnerable.lua
@@ -0,0 +1,18 @@
+local invulnerable = CreatureEvent("monster.invulnerable")
+function invulnerable.onHealthChange(creature, attacker, primaryDamage, primaryType, secondaryDamage, secondaryType)
+ if not creature then
+ return primaryDamage, primaryType, secondaryDamage, secondaryType
+ end
+ return false
+end
+invulnerable:register()
+
+function Monster:setInvulnerable()
+ self:registerEvent("monster.invulnerable")
+ return true
+end
+
+function Monster:removeInvulnerable()
+ self:unregisterEvent("monster.invulnerable")
+ return true
+end
diff --git a/data-otservbr-global/scripts/spells/monster/death_barrage.lua b/data-otservbr-global/scripts/spells/monster/death_barrage.lua
new file mode 100644
index 00000000000..2657bcc12e3
--- /dev/null
+++ b/data-otservbr-global/scripts/spells/monster/death_barrage.lua
@@ -0,0 +1,29 @@
+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)
+
+local spell = Spell("instant")
+
+function spell.onCastSpell(creature, var)
+ combat:execute(creature, var)
+ addEvent(castDeathMissile, 150, creature:getId(), var)
+ addEvent(castDeathMissile, 300, creature:getId(), var)
+ addEvent(castDeathMissile, 450, creature:getId(), var)
+ return
+end
+
+function castDeathMissile(cid, var)
+ local creature = Creature(cid)
+ if creature and var then
+ combat:execute(creature, var)
+ end
+end
+
+spell:name("death barrage")
+spell:words("###6042")
+spell:needLearn(true)
+spell:cooldown("2000")
+spell:isSelfTarget(false)
+spell:needTarget(true)
+spell:register()
diff --git a/data-otservbr-global/scripts/spells/monster/destroy_magic_walls.lua b/data-otservbr-global/scripts/spells/monster/destroy_magic_walls.lua
new file mode 100644
index 00000000000..662f2fd108c
--- /dev/null
+++ b/data-otservbr-global/scripts/spells/monster/destroy_magic_walls.lua
@@ -0,0 +1,33 @@
+local magicWallIds = {
+ ITEM_MAGICWALL_SAFE,
+ ITEM_MAGICWALL,
+ ITEM_WILDGROWTH_SAFE,
+ ITEM_WILDGROWTH,
+}
+
+local spell = Spell("instant")
+function spell.onCastSpell(creature, var)
+ -- check tiles around the caster
+ local position = creature:getPosition()
+ for x = -2, 2 do
+ for y = -2, 2 do
+ local tile = Tile(position.x + x, position.y + y, position.z)
+ if tile then
+ local item = tile:getTopVisibleThing()
+ if item and table.contains(magicWallIds, item:getId()) then
+ item:remove()
+ position:sendMagicEffect(CONST_ME_POFF)
+ return true -- only one magic wall per cast
+ end
+ end
+ end
+ end
+ return true
+end
+
+spell:name("destroy magic walls")
+spell:words("###6045")
+spell:needLearn(true)
+spell:cooldown("2000")
+spell:isSelfTarget(true)
+spell:register()
diff --git a/data-otservbr-global/scripts/spells/monster/diabolic_imp_fireball.lua b/data-otservbr-global/scripts/spells/monster/diabolic_imp_fireball.lua
new file mode 100644
index 00000000000..59948c3f0c2
--- /dev/null
+++ b/data-otservbr-global/scripts/spells/monster/diabolic_imp_fireball.lua
@@ -0,0 +1,26 @@
+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)
+arr_small = {
+ { 0, 1, 0 },
+ { 1, 3, 1 },
+ { 0, 1, 0 },
+}
+
+local area = createCombatArea(arr_small)
+combat:setArea(area)
+
+local spell = Spell("instant")
+
+function spell.onCastSpell(creature, var)
+ return combat:execute(creature, var)
+end
+
+spell:name("diabolic imp fireball")
+spell:words("###6035")
+spell:needLearn(true)
+spell:cooldown("2000")
+spell:isSelfTarget(false)
+spell:needTarget(true)
+spell:register()
diff --git a/data-otservbr-global/scripts/spells/monster/doctor_marrow_explosion.lua b/data-otservbr-global/scripts/spells/monster/doctor_marrow_explosion.lua
new file mode 100644
index 00000000000..f616e8b8cee
--- /dev/null
+++ b/data-otservbr-global/scripts/spells/monster/doctor_marrow_explosion.lua
@@ -0,0 +1,90 @@
+local spellCombat = Combat()
+spellCombat:setParameter(COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE)
+spellCombat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ORANGETELEPORT)
+
+spellCombat:setArea(createCombatArea(AREA_CIRCLE6X6))
+
+local damage = 0
+local crit = false
+
+local function paralyze(player)
+ if not player then
+ return true
+ end
+
+ local condition = Condition(CONDITION_PARALYZE)
+ condition:setParameter(CONDITION_PARAM_TICKS, 500)
+ condition:setFormula(-0.94, 0, -0.97, 0)
+ player:addCondition(condition)
+ return true
+end
+
+local spell = Spell("instant")
+function onTargetCreature(creature, target)
+ if not targetPos then
+ return true
+ end
+ local master = target:getMaster()
+ if not target:isPlayer() and not (master or master:isPlayer()) then
+ return true
+ end
+
+ local distance = math.floor(targetPos:getDistance(target:getPosition()))
+ local actualDamage = damage / (2 ^ distance)
+ doTargetCombatHealth(0, target, COMBAT_EARTHDAMAGE, actualDamage, actualDamage, CONST_ME_NONE)
+ if crit then
+ target:getPosition():sendMagicEffect(CONST_ME_CRITICAL_DAMAGE)
+ end
+ return true
+end
+
+spellCombat:setCallback(CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature")
+
+function spell.onCastSpell(creature, var)
+ local target = Creature(var:getNumber())
+ if not target then
+ return false
+ end
+ local targetPos = target:getPosition()
+ target:say("You are being targeted by Doctor Marrow's explosion!", TALKTYPE_MONSTER_SAY, false, target)
+ creature:getPosition():sendMagicEffect(CONST_ME_ORANGE_ENERGY_SPARK)
+ targetPos:sendMagicEffect(CONST_ME_ORANGETELEPORT)
+
+ local totalDelay = 4000
+
+ for i = 0, totalDelay / 100 do
+ addEvent(function(pos)
+ local spectators = Game.getSpectators(pos, false, true, 6, 6, 6, 6)
+ for _, spectator in ipairs(spectators) do
+ if spectator:isPlayer() then
+ paralyze(spectator)
+ end
+ end
+ end, i * 100, targetPos)
+ end
+
+ addEvent(function(cid)
+ local creature = Creature(cid)
+ creature:getPosition():sendMagicEffect(CONST_ME_ORANGE_ENERGY_SPARK)
+ targetPos:sendMagicEffect(CONST_ME_ORANGETELEPORT)
+ end, 2000, creature:getId())
+
+ addEvent(function(cid, pos)
+ damage = -math.random(3500, 7000)
+ if math.random(1, 100) <= 10 then
+ crit = true
+ damage = damage * 1.5
+ else
+ crit = false
+ end
+ spellCombat:execute(creature, Variant(pos))
+ end, totalDelay, creature:getId(), targetPos)
+ return true
+end
+
+spell:name("doctor marrow explosion")
+spell:words("###6044")
+spell:needLearn(true)
+spell:needTarget(true)
+spell:cooldown(10000)
+spell:register()
diff --git a/data-otservbr-global/scripts/spells/monster/earth_barrage.lua b/data-otservbr-global/scripts/spells/monster/earth_barrage.lua
new file mode 100644
index 00000000000..727db77f8ca
--- /dev/null
+++ b/data-otservbr-global/scripts/spells/monster/earth_barrage.lua
@@ -0,0 +1,29 @@
+local combat = Combat()
+combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE)
+combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITBYPOISON)
+combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_SMALLEARTH)
+
+local spell = Spell("instant")
+
+function spell.onCastSpell(creature, var)
+ combat:execute(creature, var)
+ addEvent(castEarthMissile, 150, creature:getId(), var)
+ addEvent(castEarthMissile, 300, creature:getId(), var)
+ addEvent(castEarthMissile, 450, creature:getId(), var)
+ return
+end
+
+function castEarthMissile(cid, var)
+ local creature = Creature(cid)
+ if creature and var then
+ combat:execute(creature, var)
+ end
+end
+
+spell:name("earth barrage")
+spell:words("###6039")
+spell:needLearn(true)
+spell:cooldown("2000")
+spell:isSelfTarget(false)
+spell:needTarget(true)
+spell:register()
diff --git a/data-otservbr-global/scripts/spells/monster/energy_barrage.lua b/data-otservbr-global/scripts/spells/monster/energy_barrage.lua
new file mode 100644
index 00000000000..1b36296fa35
--- /dev/null
+++ b/data-otservbr-global/scripts/spells/monster/energy_barrage.lua
@@ -0,0 +1,29 @@
+local combat = Combat()
+combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
+combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_PURPLEENERGY)
+combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY)
+
+local spell = Spell("instant")
+
+function spell.onCastSpell(creature, var)
+ combat:execute(creature, var)
+ addEvent(castEnergyMissile, 150, creature:getId(), var)
+ addEvent(castEnergyMissile, 300, creature:getId(), var)
+ addEvent(castEnergyMissile, 450, creature:getId(), var)
+ return
+end
+
+function castEnergyMissile(cid, var)
+ local creature = Creature(cid)
+ if creature and var then
+ combat:execute(creature, var)
+ end
+end
+
+spell:name("energy barrage")
+spell:words("###6038")
+spell:needLearn(true)
+spell:cooldown("2000")
+spell:isSelfTarget(false)
+spell:needTarget(true)
+spell:register()
diff --git a/data-otservbr-global/scripts/spells/monster/exploding_cask.lua b/data-otservbr-global/scripts/spells/monster/exploding_cask.lua
new file mode 100644
index 00000000000..5448d0733ff
--- /dev/null
+++ b/data-otservbr-global/scripts/spells/monster/exploding_cask.lua
@@ -0,0 +1,106 @@
+local combat = Combat()
+combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
+combat:setArea(createCombatArea(AREA_CIRCLE2X2))
+combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA)
+
+local combatCast = Combat()
+
+local barrelId = 23485
+local bombArea = {
+ { 0, 1, 1, 1, 0 },
+ { 1, 1, 1, 1, 1 },
+ { 1, 1, 3, 1, 1 },
+ { 1, 1, 1, 1, 1 },
+ { 0, 1, 1, 1, 0 },
+}
+
+function onTargetCreature(creature, target)
+ local min = -800
+ local max = -1100
+
+ if target:isPlayer() or (target:getMaster() and target:getMaster():isPlayer()) then
+ doTargetCombatHealth(0, target, COMBAT_FIREDAMAGE, min, max, CONST_ME_NONE)
+ end
+
+ return true
+end
+
+combat:setCallback(CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature")
+
+local function createBarrel()
+ local template = Game.createItem(barrelId, 1)
+
+ template:setDuration(3)
+ template:stopDecay()
+
+ return template
+end
+
+createBarrel()
+
+local function explodeBomb(position, creatureId)
+ local var = {}
+
+ var.instantName = "Cask Explode"
+ var.runeName = ""
+ var.type = 2 -- VARIANT_POSITION
+ var.pos = position
+
+ combat:execute(Creature(creatureId), var)
+end
+
+local function bombTimer(seconds, pos)
+ local spectators = Game.getSpectators(pos, false, true, 11, 11, 9, 9)
+
+ if #spectators > 0 then
+ for i = 1, #spectators do
+ spectators[i]:say(seconds, TALKTYPE_MONSTER_SAY, false, spectators[i], pos)
+ end
+ end
+end
+
+function onTargetCreature(creature, target)
+ if not creature or not target then
+ return false
+ end
+
+ local position = target:getPosition()
+ local template = createBarrel()
+ template:setOwner(creature:getId())
+
+ local tile = Tile(position)
+ local item = template:clone()
+ tile:addItemEx(item)
+ item:setDuration(3)
+ item:decay()
+ item:setActionId(IMMOVABLE_ACTION_ID)
+
+ addEvent(explodeBomb, 3000, position, creature:getId())
+ bombTimer(3, position)
+ addEvent(bombTimer, 1000, 2, position, creature:getId())
+ addEvent(bombTimer, 2000, 1, position, creature:getId())
+
+ return true
+end
+
+combatCast:setCallback(CALLBACK_PARAM_TARGETCREATURE, "onTargetCreature")
+
+local spell = Spell("instant")
+
+function spell.onCastSpell(creature, var)
+ if not creature or not var then
+ return false
+ end
+
+ var.instantName = "Exploding Cask Cast"
+ return combatCast:execute(creature, var)
+end
+
+spell:name("exploding cask")
+spell:words("###6049")
+spell:range(6)
+spell:needLearn(true)
+spell:cooldown("2000")
+spell:isSelfTarget(false)
+spell:needTarget(true)
+spell:register()
diff --git a/data-otservbr-global/scripts/spells/monster/fire_barrage.lua b/data-otservbr-global/scripts/spells/monster/fire_barrage.lua
new file mode 100644
index 00000000000..5fefadee483
--- /dev/null
+++ b/data-otservbr-global/scripts/spells/monster/fire_barrage.lua
@@ -0,0 +1,29 @@
+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)
+
+local spell = Spell("instant")
+
+function spell.onCastSpell(creature, var)
+ combat:execute(creature, var)
+ addEvent(castFireMissile, 150, creature:getId(), var)
+ addEvent(castFireMissile, 300, creature:getId(), var)
+ addEvent(castFireMissile, 450, creature:getId(), var)
+ return
+end
+
+function castFireMissile(cid, var)
+ local creature = Creature(cid)
+ if creature and var then
+ combat:execute(creature, var)
+ end
+end
+
+spell:name("fire barrage")
+spell:words("###6037")
+spell:needLearn(true)
+spell:cooldown("2000")
+spell:isSelfTarget(false)
+spell:needTarget(true)
+spell:register()
diff --git a/data-otservbr-global/scripts/spells/monster/fire_wave_delayed.lua b/data-otservbr-global/scripts/spells/monster/fire_wave_delayed.lua
new file mode 100644
index 00000000000..98e14ec7985
--- /dev/null
+++ b/data-otservbr-global/scripts/spells/monster/fire_wave_delayed.lua
@@ -0,0 +1,144 @@
+local combatWarn = Combat()
+combatWarn:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE)
+combatWarn:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_RED)
+
+local combat1, combat2, combat3, combat4, combat5, combat6 = Combat(), Combat(), Combat(), Combat(), Combat(), Combat()
+
+local combats = { combat1, combat2, combat3, combat4, combat5, combat6 }
+
+for _, combat in pairs(combats) do
+ combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
+ combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA)
+ combat:setFormula(COMBAT_FORMULA_DAMAGE, 0, 700, 1500, 0)
+end
+
+arr = {
+ { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
+ { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
+ { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
+ { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
+ { 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+}
+
+arr1 = {
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 1, 3, 1, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+}
+
+arr2 = {
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+}
+
+arr3 = {
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+}
+
+arr4 = {
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+}
+
+arr5 = {
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+}
+
+arr6 = {
+ { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+}
+
+local area = createCombatArea(arr)
+combatWarn:setArea(area)
+combat1:setArea(createCombatArea(arr1))
+combat2:setArea(createCombatArea(arr2))
+combat3:setArea(createCombatArea(arr3))
+combat4:setArea(createCombatArea(arr4))
+combat5:setArea(createCombatArea(arr5))
+combat6:setArea(createCombatArea(arr6))
+
+local spell = Spell("instant")
+
+local function eventRemoveFreeze(creatureid)
+ local creature = Creature(creatureid)
+ if not creature then
+ return
+ end
+
+ if creature:isMoveLocked() then
+ creature:setMoveLocked(false)
+ end
+
+ if creature:isDirectionLocked() then
+ creature:setDirectionLocked(false)
+ end
+end
+
+local function doCombat(combat, creatureId, var)
+ local creature = Creature(creatureId)
+ if not creature then
+ return false
+ end
+
+ combat:execute(creature, var)
+end
+
+function spell.onCastSpell(creature, var)
+ creature:setMoveLocked(true)
+ creature:setDirectionLocked(true)
+
+ combatWarn:execute(creature, var)
+ addEvent(doCombat, 1000, combatWarn, creature:getId(), var)
+ addEvent(doCombat, 2000, combatWarn, creature:getId(), var)
+ addEvent(doCombat, 3000, combat1, creature:getId(), var)
+ addEvent(doCombat, 3100, combat2, creature:getId(), var)
+ addEvent(doCombat, 3200, combat3, creature:getId(), var)
+ addEvent(doCombat, 3300, combat4, creature:getId(), var)
+ addEvent(doCombat, 3400, combat5, creature:getId(), var)
+ addEvent(doCombat, 3500, combat6, creature:getId(), var)
+
+ addEvent(eventRemoveFreeze, 3800, creature:getId())
+ return true
+end
+
+spell:name("fire wave delayed")
+spell:words("###6050")
+spell:isAggressive(true)
+spell:blockWalls(true)
+spell:needLearn(true)
+spell:needDirection(true)
+spell:register()
diff --git a/data-otservbr-global/scripts/spells/monster/half_circle_wave_earth.lua b/data-otservbr-global/scripts/spells/monster/half_circle_wave_earth.lua
new file mode 100644
index 00000000000..24db5e641cb
--- /dev/null
+++ b/data-otservbr-global/scripts/spells/monster/half_circle_wave_earth.lua
@@ -0,0 +1,30 @@
+local combat = Combat()
+combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE)
+combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITBYPOISON)
+
+arr = {
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
+ { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
+ { 0, 0, 0, 1, 1, 1, 3, 1, 1, 1, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+}
+
+local area = createCombatArea(arr)
+combat:setArea(area)
+
+local spell = Spell("instant")
+
+function spell.onCastSpell(creature, var)
+ return combat:execute(creature, var)
+end
+
+spell:name("half circle wave earth")
+spell:words("###6047")
+spell:isAggressive(true)
+spell:blockWalls(true)
+spell:needLearn(true)
+spell:needDirection(true)
+spell:register()
diff --git a/data-otservbr-global/scripts/spells/monster/heal_brain_head.lua b/data-otservbr-global/scripts/spells/monster/heal_brain_head.lua
new file mode 100644
index 00000000000..1e9547177d8
--- /dev/null
+++ b/data-otservbr-global/scripts/spells/monster/heal_brain_head.lua
@@ -0,0 +1,27 @@
+local spell = Spell("instant")
+local brainHeadPosition = Position(31954, 32325, 10)
+
+function spell.onCastSpell(creature, var)
+ local tile = Tile(brainHeadPosition)
+ local origin = creature:getPosition()
+ if not tile then
+ return false
+ end
+
+ origin:sendDistanceEffect(brainHeadPosition, CONST_ANI_HOLY)
+ brainHeadPosition:sendMagicEffect(CONST_ME_MAGIC_BLUE)
+ if tile:getTopCreature() and tile:getTopCreature():isMonster() then
+ if tile:getTopCreature():getName():lower() == "brain head" then
+ tile:getTopCreature():addHealth(math.random(300, 500))
+ end
+ end
+ return true
+end
+
+spell:name("heal brain head")
+spell:words("###6051")
+spell:isAggressive(true)
+spell:blockWalls(true)
+spell:needTarget(false)
+spell:needLearn(true)
+spell:register()
diff --git a/data-otservbr-global/scripts/spells/monster/holy_barrage.lua b/data-otservbr-global/scripts/spells/monster/holy_barrage.lua
new file mode 100644
index 00000000000..2ca5761dd8d
--- /dev/null
+++ b/data-otservbr-global/scripts/spells/monster/holy_barrage.lua
@@ -0,0 +1,29 @@
+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)
+
+local spell = Spell("instant")
+
+function spell.onCastSpell(creature, var)
+ combat:execute(creature, var)
+ addEvent(castHolyMissile, 150, creature:getId(), var)
+ addEvent(castHolyMissile, 300, creature:getId(), var)
+ addEvent(castHolyMissile, 450, creature:getId(), var)
+ return
+end
+
+function castHolyMissile(cid, var)
+ local creature = Creature(cid)
+ if creature and var then
+ combat:execute(creature, var)
+ end
+end
+
+spell:name("holy barrage")
+spell:words("###6041")
+spell:needLearn(true)
+spell:cooldown("2000")
+spell:isSelfTarget(false)
+spell:needTarget(true)
+spell:register()
diff --git a/data-otservbr-global/scripts/spells/monster/ice_barrage.lua b/data-otservbr-global/scripts/spells/monster/ice_barrage.lua
new file mode 100644
index 00000000000..dc4b9500c14
--- /dev/null
+++ b/data-otservbr-global/scripts/spells/monster/ice_barrage.lua
@@ -0,0 +1,29 @@
+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_SMALLICE)
+
+local spell = Spell("instant")
+
+function spell.onCastSpell(creature, var)
+ combat:execute(creature, var)
+ addEvent(castIceMissile, 150, creature:getId(), var)
+ addEvent(castIceMissile, 300, creature:getId(), var)
+ addEvent(castIceMissile, 450, creature:getId(), var)
+ return
+end
+
+function castIceMissile(cid, var)
+ local creature = Creature(cid)
+ if creature and var then
+ combat:execute(creature, var)
+ end
+end
+
+spell:name("ice barrage")
+spell:words("###6040")
+spell:needLearn(true)
+spell:cooldown("2000")
+spell:isSelfTarget(false)
+spell:needTarget(true)
+spell:register()
diff --git a/data-otservbr-global/scripts/spells/monster/mort_ring.lua b/data-otservbr-global/scripts/spells/monster/mort_ring.lua
new file mode 100644
index 00000000000..c65c2b63c5d
--- /dev/null
+++ b/data-otservbr-global/scripts/spells/monster/mort_ring.lua
@@ -0,0 +1,17 @@
+local combat = Combat()
+combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE)
+combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA)
+combat:setArea(createCombatArea(AREA_RING1_BURST3))
+
+local spell = Spell("instant")
+
+function spell.onCastSpell(creature, var)
+ return combat:execute(creature, var)
+end
+
+spell:name("mort ring")
+spell:words("###6036")
+spell:needLearn(true)
+spell:cooldown("2000")
+spell:isSelfTarget(true)
+spell:register()
diff --git a/data-otservbr-global/scripts/spells/monster/physical_barrage.lua b/data-otservbr-global/scripts/spells/monster/physical_barrage.lua
new file mode 100644
index 00000000000..68b9c629887
--- /dev/null
+++ b/data-otservbr-global/scripts/spells/monster/physical_barrage.lua
@@ -0,0 +1,29 @@
+local combat = Combat()
+combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE)
+combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_DRAWBLOOD)
+combat:setParameter(COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_THROWINGSTAR)
+
+local spell = Spell("instant")
+
+function spell.onCastSpell(creature, var)
+ combat:execute(creature, var)
+ addEvent(castPhysicalMissile, 150, creature:getId(), var)
+ addEvent(castPhysicalMissile, 300, creature:getId(), var)
+ addEvent(castPhysicalMissile, 450, creature:getId(), var)
+ return
+end
+
+function castPhysicalMissile(cid, var)
+ local creature = Creature(cid)
+ if creature and var then
+ combat:execute(creature, var)
+ end
+end
+
+spell:name("physical barrage")
+spell:words("###6043")
+spell:needLearn(true)
+spell:cooldown("2000")
+spell:isSelfTarget(false)
+spell:needTarget(true)
+spell:register()
diff --git a/data-otservbr-global/scripts/spells/monster/sparks_chain.lua b/data-otservbr-global/scripts/spells/monster/sparks_chain.lua
new file mode 100644
index 00000000000..2134252d9f2
--- /dev/null
+++ b/data-otservbr-global/scripts/spells/monster/sparks_chain.lua
@@ -0,0 +1,22 @@
+local combat = Combat()
+combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_LIFEDRAIN)
+combat:setParameter(COMBAT_PARAM_CHAIN_EFFECT, CONST_ME_MAGIC_RED)
+
+function getChainValue(creature)
+ return 2, 3, false
+end
+
+combat:setCallback(CALLBACK_PARAM_CHAINVALUE, "getChainValue")
+
+local spell = Spell("instant")
+
+function spell.onCastSpell(creature, var)
+ return combat:execute(creature, var)
+end
+
+spell:name("sparks chain")
+spell:words("###6054")
+spell:needLearn(true)
+spell:cooldown("2000")
+spell:isSelfTarget(true)
+spell:register()
diff --git a/data-otservbr-global/scripts/spells/monster/teleport_strike.lua b/data-otservbr-global/scripts/spells/monster/teleport_strike.lua
new file mode 100644
index 00000000000..5e073675e61
--- /dev/null
+++ b/data-otservbr-global/scripts/spells/monster/teleport_strike.lua
@@ -0,0 +1,64 @@
+local spell = Spell("instant")
+
+local smokeArray = {
+ { 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 1, 0, 0, 0 },
+ { 0, 0, 1, 3, 1, 0, 0 },
+ { 0, 0, 0, 1, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0 },
+}
+
+local smokeCombat = Combat()
+smokeCombat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_GREENSMOKE)
+smokeCombat:setArea(createCombatArea(smokeArray))
+
+function spell.onCastSpell(creature, var)
+ local pos = creature:getPosition()
+
+ local target = Creature(var:getNumber())
+ local tarPos = target:getPosition()
+ local direction = target:getDirection()
+ local pos1
+ local pos2
+ local pos3
+ if direction == 0 then
+ pos1 = Position(tarPos.x, tarPos.y + 1, tarPos.z)
+ pos2 = Position(tarPos.x + 1, tarPos.y + 1, tarPos.z)
+ pos3 = Position(tarPos.x - 1, tarPos.y + 1, tarPos.z)
+ elseif direction == 1 then
+ pos1 = Position(tarPos.x - 1, tarPos.y, tarPos.z)
+ pos2 = Position(tarPos.x - 1, tarPos.y + 1, tarPos.z)
+ pos3 = Position(tarPos.x - 1, tarPos.y - 1, tarPos.z)
+ elseif direction == 2 then
+ pos1 = Position(tarPos.x, tarPos.y - 1, tarPos.z)
+ pos2 = Position(tarPos.x - 1, tarPos.y - 1, tarPos.z)
+ pos3 = Position(tarPos.x + 1, tarPos.y - 1, tarPos.z)
+ elseif direction == 3 then
+ pos1 = Position(tarPos.x + 1, tarPos.y, tarPos.z)
+ pos2 = Position(tarPos.x + 1, tarPos.y - 1, tarPos.z)
+ pos3 = Position(tarPos.x + 1, tarPos.y + 1, tarPos.z)
+ end
+
+ if Tile(pos1) and Tile(pos1):isWalkable(true, true, true, true) then
+ smokeCombat:execute(creature, Variant(pos))
+ creature:teleportTo(pos1)
+ elseif Tile(pos2) and Tile(pos2):isWalkable(true, true, true, true) then
+ smokeCombat:execute(creature, Variant(pos))
+ creature:teleportTo(pos2)
+ elseif Tile(pos3) and Tile(pos3):isWalkable(true, true, true, true) then
+ smokeCombat:execute(creature, Variant(pos))
+ creature:teleportTo(pos3)
+ end
+
+ return
+end
+
+spell:name("teleport strike")
+spell:words("###6048")
+spell:needLearn(true)
+spell:cooldown("2000")
+spell:isSelfTarget(false)
+spell:needTarget(true)
+spell:register()
diff --git a/data-otservbr-global/scripts/spells/monster/werecrocodile_fire_ring.lua b/data-otservbr-global/scripts/spells/monster/werecrocodile_fire_ring.lua
new file mode 100644
index 00000000000..6bcf412cad2
--- /dev/null
+++ b/data-otservbr-global/scripts/spells/monster/werecrocodile_fire_ring.lua
@@ -0,0 +1,33 @@
+local arrLarge = {
+ { 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
+ { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
+ { 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0 },
+ { 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0 },
+ { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 },
+ { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 },
+ { 1, 1, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1 },
+ { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 },
+ { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 },
+ { 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0 },
+ { 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0 },
+ { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
+ { 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
+}
+
+local combat = Combat()
+combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE)
+combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HITBYFIRE)
+combat:setArea(createCombatArea(arrLarge))
+
+local spell = Spell("instant")
+
+function spell.onCastSpell(creature, var)
+ return combat:execute(creature, var)
+end
+
+spell:name("werecrocodile fire ring")
+spell:words("###6052")
+spell:needLearn(true)
+spell:cooldown("2000")
+spell:isSelfTarget(true)
+spell:register()
diff --git a/data-otservbr-global/scripts/spells/monster/white_weretiger_ice_ring.lua b/data-otservbr-global/scripts/spells/monster/white_weretiger_ice_ring.lua
new file mode 100644
index 00000000000..d027c32c11f
--- /dev/null
+++ b/data-otservbr-global/scripts/spells/monster/white_weretiger_ice_ring.lua
@@ -0,0 +1,78 @@
+local arrLarge = {
+ { 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
+ { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
+ { 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0 },
+ { 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0 },
+ { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 },
+ { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 },
+ { 1, 1, 0, 0, 0, 0, 3, 0, 0, 0, 0, 1, 1 },
+ { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1 },
+ { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1 },
+ { 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0 },
+ { 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0 },
+ { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
+ { 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
+}
+
+local arrMedium = {
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
+ { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
+ { 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0 },
+ { 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0 },
+ { 0, 0, 1, 1, 0, 0, 3, 0, 0, 1, 1, 0, 0 },
+ { 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0 },
+ { 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0 },
+ { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
+ { 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+}
+
+local arrSmall = {
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
+ { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
+ { 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
+ { 0, 0, 0, 1, 1, 0, 3, 0, 1, 1, 0, 0, 0 },
+ { 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0 },
+ { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 },
+ { 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
+}
+
+local combatSmallRing = Combat()
+combatSmallRing:setParameter(COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)
+combatSmallRing:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA)
+combatSmallRing:setArea(createCombatArea(arrSmall))
+
+local combatMediumRing = Combat()
+combatMediumRing:setParameter(COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)
+combatMediumRing:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA)
+combatMediumRing:setArea(createCombatArea(arrMedium))
+
+local combatLargeRing = Combat()
+combatLargeRing:setParameter(COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE)
+combatLargeRing:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA)
+combatLargeRing:setArea(createCombatArea(arrLarge))
+
+local spell = Spell("instant")
+
+local combats = { combatSmallRing, combatMediumRing, combatLargeRing }
+
+function spell.onCastSpell(creature, var)
+ local randomCombat = combats[math.random(#combats)]
+ return randomCombat:execute(creature, var)
+end
+
+spell:name("white weretiger ice ring")
+spell:words("###6053")
+spell:needLearn(true)
+spell:cooldown("2000")
+spell:isSelfTarget(true)
+spell:register()
diff --git a/data-otservbr-global/world/otservbr-zones.xml b/data-otservbr-global/world/otservbr-zones.xml
index a9224bd3c2d..4740d50385c 100644
--- a/data-otservbr-global/world/otservbr-zones.xml
+++ b/data-otservbr-global/world/otservbr-zones.xml
@@ -1,2 +1,4 @@
-
+
+
+