diff --git a/data-otservbr-global/lib/others/soulpit.lua b/data-otservbr-global/lib/others/soulpit.lua index b677b10fd9c..33d615ce92e 100644 --- a/data-otservbr-global/lib/others/soulpit.lua +++ b/data-otservbr-global/lib/others/soulpit.lua @@ -153,20 +153,25 @@ SoulPit = { return name:match("^(.-) soul core") end, onFuseSoulCores = function(player, item, target) - local itemName = item:getName() - local targetItemName = target:getName() + local itemCount = item:getCount(item:getId()) + if item:getId() == target:getId() and itemCount <= 1 then + return false + end - if SoulPit.getSoulCoreMonster(itemName) and SoulPit.getSoulCoreMonster(targetItemName) then - local randomSoulCore = SoulPit.soulCores[math.random(#SoulPit.soulCores)] - player:addItem(randomSoulCore:getId(), 1) - player:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) - player:sendTextMessage(MESSAGE_EVENT_ADVANCE, string.format("You have received a %s soul core.", randomSoulCore:getName())) - item:remove(1) - target:remove(1) - return true + local itemSoulCore = SoulPit.getSoulCoreMonster(item:getName()) + local targetSoulCore = SoulPit.getSoulCoreMonster(target:getName()) + if not itemSoulCore or not targetSoulCore then + return false end - return false + local randomSoulCore = SoulPit.soulCores[math.random(#SoulPit.soulCores)] + player:addItem(randomSoulCore:getId(), 1) + player:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) + player:sendTextMessage(MESSAGE_EVENT_ADVANCE, string.format("You have received a %s soul core.", randomSoulCore:getName())) + + item:remove(1) + target:remove(1) + return true end, } diff --git a/data-otservbr-global/monster/aquatics/quara_looter.lua b/data-otservbr-global/monster/aquatics/quara_looter.lua new file mode 100644 index 00000000000..aef7335d076 --- /dev/null +++ b/data-otservbr-global/monster/aquatics/quara_looter.lua @@ -0,0 +1,129 @@ +local mType = Game.createMonsterType("Quara Looter") +local monster = {} + +monster.description = "a quara looter" +monster.experience = 8650 +monster.outfit = { + lookType = 1741, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2543 +monster.Bestiary = { + class = "Aquatic", + race = BESTY_RACE_AQUATIC, + toKill = 2500, + FirstUnlock = 100, + SecondUnlock = 1000, + CharmsPoints = 50, + Stars = 4, + Occurrence = 1, + Locations = "Podzilla Bottom, Podzilla Underwater ", +} + +monster.health = 11500 +monster.maxHealth = 11500 +monster.race = "undead" +monster.corpse = 48276 +monster.speed = 210 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 2000, + chance = 11, +} + +monster.strategiesTarget = { + nearest = 100, +} + +monster.flags = { + summonable = false, + attackable = true, + hostile = true, + convinceable = false, + pushable = false, + rewardBoss = false, + illusionable = false, + canPushItems = true, + canPushCreatures = true, + staticAttackChance = 90, + targetDistance = 3, + 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 = "Krrrck!", yell = false }, + { text = "Tchky!", yell = false }, + { text = "", yell = false }, +} + +monster.loot = { + { name = "Amber Souvenir", chance = 7040 }, + { name = "Resinous Fish Fin", chance = 6460 }, + { id = 3039, chance = 4340 }, -- red gem + { id = 3041, chance = 2700 }, -- blue gem + { name = "Glacier Kilt", chance = 940 }, + { name = "Necklace of the Deep", chance = 820 }, + { name = "Crystal Crossbow", chance = 470 }, + { name = "Rift Lance", chance = 350 }, + { name = "Mantassin Tail", chance = 230 }, + { name = "platinum coin", chance = 10000, maxCount = 25 }, + { name = "Glacier Robe", chance = 1000 }, + { name = "Preserved Light Blue Seed", chance = 110 }, + { name = "Preserved Purple Seed", chance = 110 }, + { name = "Preserved Violet Seed", chance = 110 }, +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, type = COMBAT_DEATHDAMAGE, minDamage = -150, maxDamage = -450 }, + { name = "combat", interval = 2000, chance = 35, type = COMBAT_ICEDAMAGE, minDamage = -400, maxDamage = -750, range = 7, shootEffect = CONST_ANI_SHIVERARROW, effect = CONST_ME_ICEATTACK, target = true }, + { name = "quarasmallicering", interval = 2000, chance = 16 }, + { name = "podzillaphyschain", interval = 2000, chance = 15 }, +} + +monster.defenses = { + defense = 95, + armor = 95, + mitigation = 2.75, + { name = "combat", interval = 2000, chance = 7, type = COMBAT_HEALING, minDamage = 600, maxDamage = 800, effect = CONST_ME_MAGIC_BLUE, target = false }, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 5 }, + { type = COMBAT_ENERGYDAMAGE, percent = -15 }, + { 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 = 0 }, + { type = COMBAT_HOLYDAMAGE, percent = 10 }, + { type = COMBAT_DEATHDAMAGE, percent = 5 }, +} + +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/aquatics/quara_plunderer.lua b/data-otservbr-global/monster/aquatics/quara_plunderer.lua new file mode 100644 index 00000000000..4402aeedcbe --- /dev/null +++ b/data-otservbr-global/monster/aquatics/quara_plunderer.lua @@ -0,0 +1,120 @@ +local mType = Game.createMonsterType("Quara Plunderer") +local monster = {} + +monster.description = "a quara plunderer" +monster.experience = 10800 +monster.outfit = { + lookType = 1758, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2542 +monster.Bestiary = { + class = "Aquatic", + race = BESTY_RACE_AQUATIC, + toKill = 2500, + FirstUnlock = 100, + SecondUnlock = 1000, + CharmsPoints = 50, + Stars = 4, + Occurrence = 1, + Locations = "Podzilla Bottom, Podzilla Underwater ", +} + +monster.health = 13500 +monster.maxHealth = 13500 +monster.race = "undead" +monster.corpse = 48388 +monster.speed = 205 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 2000, + chance = 10, +} + +monster.strategiesTarget = { + nearest = 100, +} + +monster.flags = { + summonable = false, + attackable = true, + hostile = true, + convinceable = false, + pushable = false, + rewardBoss = false, + illusionable = false, + canPushItems = true, + canPushCreatures = true, + staticAttackChance = 90, + 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 = "Tssssh!!!", yell = false }, + { text = "BLUP! BLUP!", yell = false }, + { text = "Burp!", yell = false }, +} + +monster.loot = { + { name = "Amber Souvenir", chance = 7040 }, + { name = "Resinous Fish Fin", chance = 6460 }, + { id = 3039, chance = 4940 }, -- red gem + { id = 3041, chance = 4900 }, -- blue gem + { name = "Haunted Blade", chance = 350 }, + { name = "platinum coin", chance = 10000, maxCount = 25 }, +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, type = COMBAT_PHYSICALDAMAGE, minDamage = -350, maxDamage = -500 }, + { name = "combat", interval = 2000, chance = 25, type = COMBAT_ICEDAMAGE, minDamage = -800, maxDamage = -1100, range = 7, radius = 4, shootEffect = CONST_ANI_ICE, effect = CONST_ME_ICEAREA, target = false }, + { name = "quaracrossdeath", interval = 2000, chance = 20, minDamage = -1100, maxDamage = -1700, target = false }, + { name = "quarasmokedeath", interval = 2000, chance = 20, minDamage = -850, maxDamage = -1150, target = false }, +} + +monster.defenses = { + defense = 95, + armor = 90, + mitigation = 2.75, +} + +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 = 0 }, + { type = COMBAT_HOLYDAMAGE, percent = 15 }, + { 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/aquatics/quara_raider.lua b/data-otservbr-global/monster/aquatics/quara_raider.lua new file mode 100644 index 00000000000..d6eaeeec178 --- /dev/null +++ b/data-otservbr-global/monster/aquatics/quara_raider.lua @@ -0,0 +1,128 @@ +local mType = Game.createMonsterType("Quara Raider") +local monster = {} + +monster.description = "a quara raider" +monster.experience = 8150 +monster.outfit = { + lookType = 1759, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2541 +monster.Bestiary = { + class = "Aquatic", + race = BESTY_RACE_AQUATIC, + toKill = 2500, + FirstUnlock = 100, + SecondUnlock = 1000, + CharmsPoints = 50, + Stars = 4, + Occurrence = 1, + Locations = "Podzilla Bottom, Podzilla Underwater ", +} + +monster.health = 12500 +monster.maxHealth = 12500 +monster.race = "undead" +monster.corpse = 48392 +monster.speed = 215 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 2000, + chance = 11, +} + +monster.strategiesTarget = { + nearest = 100, +} + +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, + isBlockable = false, + canWalkOnEnergy = true, + canWalkOnFire = true, + canWalkOnPoison = true, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "", yell = false }, + { text = "Gloh! Gloooh!", yell = false }, + { text = "Boohacha!!!", yell = false }, +} + +monster.loot = { + { name = "Amber Souvenir", chance = 7330 }, + { id = 3039, chance = 5340 }, -- red gem + { name = "Resinous Fish Fin", chance = 4090 }, + { name = "Skull Staff", chance = 1480 }, + { id = 3041, chance = 1140 }, -- blue gem + { name = "Glacier Robe", chance = 910 }, + { name = "Crystalline Armor", chance = 510 }, + { name = "Quara Pincers", chance = 510 }, + { name = "Abyss Hammer", chance = 170 }, + { name = "Preserved Light Blue Seed", chance = 110 }, + { name = "Preserved Purple Seed", chance = 110 }, + { name = "platinum coin", chance = 10000, maxCount = 25 }, +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, type = COMBAT_PHYSICALDAMAGE, minDamage = -250, maxDamage = -320 }, + { name = "quaralargeicering", interval = 2000, chance = 20, minDamage = -1250, maxDamage = -1400, target = false }, + { name = "quararaidershoot", interval = 2000, chance = 35, minDamage = -650, maxDamage = -900, range = 7, target = true }, + { name = "quarawatersplash", interval = 2000, chance = 18, minDamage = -1350, maxDamage = -1600, target = false }, + { name = "quaraseamonster", interval = 2000, chance = 18, minDamage = -1350, maxDamage = -1600, target = false }, +} + +monster.defenses = { + defense = 95, + armor = 95, + mitigation = 2.75, + { name = "combat", interval = 2000, chance = 7, type = COMBAT_HEALING, minDamage = 800, maxDamage = 1000, effect = CONST_ME_MAGIC_BLUE, target = false }, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 10 }, + { type = COMBAT_ENERGYDAMAGE, percent = -10 }, + { type = COMBAT_EARTHDAMAGE, percent = -15 }, + { type = COMBAT_FIREDAMAGE, percent = 20 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = 0 }, + { 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/bosses/mitmah_vanguard.lua b/data-otservbr-global/monster/bosses/mitmah_vanguard.lua new file mode 100644 index 00000000000..540bc195b98 --- /dev/null +++ b/data-otservbr-global/monster/bosses/mitmah_vanguard.lua @@ -0,0 +1,145 @@ +local mType = Game.createMonsterType("Mitmah Vanguard") +local monster = {} + +monster.description = "Mitmah Vanguard" +monster.experience = 300000 +monster.outfit = { + lookType = 1716, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.bosstiary = { + bossRaceId = 2464, + bossRace = RARITY_ARCHFOE, +} + +monster.health = 250000 +monster.maxHealth = 250000 +monster.race = "blood" +monster.corpse = 44687 +monster.speed = 450 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 10000, + 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 = true, + illusionable = false, + canPushItems = true, + canPushCreatures = true, + staticAttackChance = 95, + 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 = "Die, human. Now!", yell = true }, + { text = "FEAR THE CURSE!", yell = true }, + { text = "You're the intruder.", yell = true }, + { text = "The Iks have always been ours.", yell = true }, + { text = "NOW TREMBLE!", "GOT YOU NOW!", yell = true }, +} + +monster.loot = { + { name = "gold coin", chance = 895000, maxCount = 400 }, + { name = "platinum coin", chance = 655000, maxCount = 15 }, + { name = "crystal coin", chance = 325000, maxCount = 5 }, + { name = "great health potion", chance = 288900, maxCount = 15 }, + { name = "great mana potion", chance = 281500 }, + { name = "great spirit potion", chance = 65337, maxCount = 45 }, + { name = "ultimate health potion", chance = 214800, maxCount = 12 }, + { name = "ultimate mana potion", chance = 155600, maxCount = 15 }, + { name = "supreme health potion", chance = 33385, maxCount = 23 }, + { name = "yellow gem", chance = 11604, maxCount = 5 }, + { name = "blue gem", chance = 14144, maxCount = 5 }, + { name = "green gem", chance = 11221, maxCount = 4 }, + { name = "giant topaz", chance = 11191, maxCount = 1 }, + { name = "giant emerald", chance = 11191, maxCount = 1 }, + { name = "giant sapphire", chance = 11191, maxCount = 1 }, + { name = "giant amethyst", chance = 12527, maxCount = 1 }, + { name = "white gem", chance = 311100 }, + { name = "yellow gem", chance = 251900 }, + { name = "blue gem", chance = 222200 }, + { name = "crystal of the mitmah", chance = 451900 }, + { name = "broken mitmah necklace", chance = 548100 }, + { name = "broken mitmah chestplate", chance = 44400 }, + { name = "splintered mitmah gem", chance = 3700 }, + { name = "stoic iks boots", chance = 500 }, + { name = "stoic iks faulds", chance = 500 }, + { name = "stoic iks casque", chance = 500 }, + { name = "stoic iks cuirass", chance = 500 }, + { name = "stoic iks chestplate", chance = 500 }, + { name = "stoic iks sandals", chance = 500 }, + { name = "stoic iks headpiece", chance = 500 }, + { name = "stoic iks culet", chance = 500 }, +} + +monster.attacks = { + { name = "melee", interval = 1700, chance = 100, minDamage = -400, maxDamage = -856 }, + { name = "melee", interval = 2500, chance = 100, minDamage = -500, maxDamage = -1256 }, + { name = "hugeblackring", interval = 3500, chance = 20, minDamage = -700, maxDamage = -1500, target = false }, + { name = "combat", interval = 3000, chance = 20, type = COMBAT_ENERGYDAMAGE, minDamage = -4500, maxDamage = -6000, radius = 9, effect = CONST_ME_SLASH, target = false }, + { name = "combat", interval = 2500, chance = 33, type = COMBAT_ENERGYDAMAGE, minDamage = -500, maxDamage = -1500, length = 8, spread = 0, effect = CONST_ME_PURPLEENERGY, target = false }, + { name = "combat", interval = 2000, chance = 50, type = COMBAT_FIREDAMAGE, minDamage = -600, maxDamage = -1000, length = 8, spread = 2, effect = CONST_ME_HITBYFIRE, target = false }, + { name = "combat", interval = 1000, chance = 30, type = COMBAT_ENERGYDAMAGE, minDamage = -400, maxDamage = -600, range = 7, radius = 2, shootEffect = CONST_ANI_BOLT, effect = CONST_ME_ENERGYHIT, target = true }, +} + +monster.defenses = { + defense = 64, + armor = 0, + -- mitigation = ???, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 0 }, + { type = COMBAT_ENERGYDAMAGE, percent = 5 }, + { type = COMBAT_EARTHDAMAGE, percent = 100 }, + { type = COMBAT_FIREDAMAGE, percent = 5 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = 0 }, + { type = COMBAT_HOLYDAMAGE, percent = 0 }, + { type = COMBAT_DEATHDAMAGE, percent = 100 }, +} + +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/bosses/sugar_daddy.lua b/data-otservbr-global/monster/bosses/sugar_daddy.lua new file mode 100644 index 00000000000..dbbdf99dbb0 --- /dev/null +++ b/data-otservbr-global/monster/bosses/sugar_daddy.lua @@ -0,0 +1,132 @@ +local mType = Game.createMonsterType("Sugar Daddy") +local monster = {} + +monster.description = "Sugar Daddy" +monster.experience = 15550 +monster.outfit = { + lookType = 1764, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 2, + lookMount = 0, +} + +monster.bosstiary = { + bossRaceId = 2562, + bossRace = RARITY_BANE, +} + +monster.health = 9500 +monster.maxHealth = 9500 +monster.race = "blood" +monster.corpse = 48416 +monster.speed = 250 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 2000, + 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 = true, + illusionable = false, + canPushItems = true, + canPushCreatures = true, + staticAttackChance = 98, + 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 = "SUGAR!!!", yell = false }, + { text = "Sweet vengeance!", yell = false }, + { text = "Let me have a bite!", yell = false }, + { text = "YOU HAVE BAD BREATH, TAKE A MINT!!!", yell = false }, + { text = "I LOOOOOOVE CHOCOLATE TRUFFLES!!!", yell = false }, + { text = "Yummy!", yell = false }, +} + +monster.loot = { + { name = "gold coin", chance = 100000, maxCount = 95 }, + { name = "platinum coin", chance = 100000, maxCount = 11 }, + { name = "small enchanted sapphire", chance = 8900 }, + { id = 3039, chance = 94465, maxCount = 1 }, -- red gem + { name = "white gem", chance = 5600, maxCount = 1 }, + { id = 48114, chance = 1000 }, -- peppermint backpack + { id = 45643, chance = 555 }, -- biscuit barrier + { id = 45644, chance = 1009 }, -- candy-coated quiver + { id = 45639, chance = 555 }, -- cocoa grimoire + { id = 45640, chance = 555 }, -- creamy grimoire + { id = 45641, chance = 2300 }, -- candy necklace + { id = 45642, chance = 7650 }, -- ring of temptation + { id = 48254, chance = 11655, maxCount = 1 }, -- churro heart + { id = 48250, chance = 46555, maxCount = 1 }, -- dark chocolate coin + { id = 48252, chance = 15300, maxCount = 1 }, -- beijinho + { id = 45642, chance = 14650, maxCount = 1 }, -- brigadeiro + { id = 48249, chance = 54465, maxCount = 1 }, -- milk chocolate coin + { id = 48256, chance = 2367, maxCount = 1 }, -- pastry dragon +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 20, minDamage = 0, maxDamage = -550 }, + { name = "combat", interval = 2000, chance = 20, type = COMBAT_DEATHDAMAGE, minDamage = -300, maxDamage = -500, range = 6, effect = CONST_ME_MORTAREA, target = true }, + { name = "combat", interval = 2000, chance = 18, type = COMBAT_ENERGYDAMAGE, minDamage = -200, maxDamage = -300, radius = 12, effect = CONST_ME_PIXIE_EXPLOSION, target = false }, + { name = "combat", interval = 2000, chance = 18, type = COMBAT_EARTHDAMAGE, minDamage = -250, maxDamage = -410, radius = 12, effect = CONST_ME_HEARTS, target = false }, +} + +monster.defenses = { + defense = 65, + armor = 55, + -- mitigation = ???, + { name = "combat", interval = 3000, chance = 25, type = COMBAT_HEALING, minDamage = 400, maxDamage = 1500, effect = CONST_ME_MAGIC_BLUE, target = false }, + { name = "speed", interval = 2000, chance = 15, speedChange = 320, effect = CONST_ME_MAGIC_RED, target = false, duration = 5000 }, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 0 }, + { type = COMBAT_ENERGYDAMAGE, percent = 25 }, + { type = COMBAT_EARTHDAMAGE, percent = 20 }, + { type = COMBAT_FIREDAMAGE, percent = -5 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = 0 }, + { type = COMBAT_HOLYDAMAGE, percent = 0 }, + { type = COMBAT_DEATHDAMAGE, percent = 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/bosses/sugar_mommy.lua b/data-otservbr-global/monster/bosses/sugar_mommy.lua new file mode 100644 index 00000000000..9c484b60220 --- /dev/null +++ b/data-otservbr-global/monster/bosses/sugar_mommy.lua @@ -0,0 +1,116 @@ +local mType = Game.createMonsterType("Sugar Mommy") +local monster = {} + +monster.description = "Sugar Mommy" +monster.experience = 6800 +monster.outfit = { + lookType = 1764, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 1, + lookMount = 0, +} + +monster.bosstiary = { + bossRaceId = 2580, + bossRace = RARITY_BANE, +} + +monster.health = 6000 +monster.maxHealth = 6000 +monster.race = "blood" +monster.corpse = 48414 +monster.speed = 250 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 2000, + 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 = true, + illusionable = false, + canPushItems = true, + canPushCreatures = true, + staticAttackChance = 98, + targetDistance = 3, + runHealth = 0, + healthHidden = false, + isBlockable = false, + canWalkOnEnergy = true, + canWalkOnFire = false, + canWalkOnPoison = false, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "SUGAR!!!", yell = false }, +} + +monster.loot = { + { name = "platinum coin", chance = 100000, maxCount = 11 }, + { name = "cherry", chance = 100000, maxCount = 2 }, + { id = 3039, chance = 11465, maxCount = 1 }, -- red gem + { id = 3037, chance = 9500 }, -- yellow gem + { id = 3038, chance = 4760 }, -- green gem + { id = 48250, chance = 28555, maxCount = 11 }, -- dark chocolate coin + { id = 48249, chance = 26465, maxCount = 12 }, -- milk chocolate coin + { id = 48273, chance = 16465, maxCount = 1 }, -- taiyaki ice cream +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 20, minDamage = 0, maxDamage = -350 }, + { name = "combat", interval = 2000, chance = 50, type = COMBAT_ENERGYDAMAGE, minDamage = -70, maxDamage = -180, range = 6, shootEffect = CONST_ANI_CHERRYBOMB, target = true }, + { name = "combat", interval = 2000, chance = 25, type = COMBAT_ENERGYDAMAGE, minDamage = -170, maxDamage = -280, radius = 6, effect = CONST_ME_PURPLEENERGY, target = false }, + { name = "combat", interval = 2000, chance = 25, type = COMBAT_ENERGYDAMAGE, minDamage = -250, maxDamage = -310, radius = 4, effect = CONST_ME_POWERFUL_HEARTS, target = false }, +} + +monster.defenses = { + defense = 65, + armor = 55, + -- mitigation = ???, + { name = "combat", interval = 3000, chance = 25, type = COMBAT_HEALING, minDamage = 400, maxDamage = 600, effect = CONST_ME_MAGIC_BLUE, target = false }, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 0 }, + { type = COMBAT_ENERGYDAMAGE, percent = 10 }, + { type = COMBAT_EARTHDAMAGE, percent = -5 }, + { type = COMBAT_FIREDAMAGE, percent = -5 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = 15 }, + { 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:register(monster) diff --git a/data-otservbr-global/monster/bosses/the_rootkraken.lua b/data-otservbr-global/monster/bosses/the_rootkraken.lua new file mode 100644 index 00000000000..eadd0e33a3e --- /dev/null +++ b/data-otservbr-global/monster/bosses/the_rootkraken.lua @@ -0,0 +1,130 @@ +local mType = Game.createMonsterType("The Rootkraken") +local monster = {} + +monster.description = "the rootkraken" +monster.experience = 700000 +monster.outfit = { + lookType = 1765, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} +monster.events = {} + +monster.bosstiary = { + bossRaceId = 2528, + bossRace = RARITY_ARCHFOE, +} + +monster.health = 350000 +monster.maxHealth = 350000 +monster.race = "blood" +monster.corpse = 49120 +monster.speed = 170 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 10, +} + +monster.strategiesTarget = { + nearest = 70, + health = 10, + damage = 10, + random = 10, +} + +monster.flags = { + summonable = false, + attackable = true, + hostile = true, + convinceable = false, + pushable = false, + rewardBoss = true, + illusionable = false, + canPushItems = true, + canPushCreatures = true, + staticAttackChance = 95, + 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 = "Chrrrk!", yell = false }, +} + +monster.loot = { + { name = "crystal coin", chance = 100000, maxCount = 3 }, + { name = "platinum coin", chance = 100000, maxCount = 93 }, + { name = "ultimate health potion", chance = 42590, maxCount = 19 }, + { name = "great spirit potion", chance = 42590, maxCount = 7 }, + { name = "great mana potion", chance = 31480, maxCount = 14 }, + { name = "supreme health potion", chance = 31480, maxCount = 4 }, + { name = "ultimate spirit potion", chance = 25930, maxCount = 14 }, + { id = 3037, chance = 24070 }, -- yellow gem + { name = "amber with a bug", chance = 18520 }, + { name = "giant topaz", chance = 7410 }, + { name = "amber crusher", chance = 1850 }, + { id = 47375, chance = 300 }, -- amber axe + { id = 47369, chance = 200 }, -- amber greataxe + { id = 47368, chance = 200 }, -- amber slayer + { id = 47374, chance = 300 }, -- amber sabre + { id = 47376, chance = 300 }, -- amber cudgel + { id = 47370, chance = 200 }, -- amber bludgeon + { id = 47371, chance = 200 }, -- amber bow + { id = 47377, chance = 300 }, -- amber crossbow + { id = 47372, chance = 300 }, -- amber wand + { id = 47373, chance = 300 }, -- amber rod + { id = 48514, chance = 250 }, -- strange inedible fruit +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = -650, maxDamage = -1650 }, + { name = "rootkraken", interval = 2500, chance = 20 }, + { name = "combat", interval = 2500, chance = 23, type = COMBAT_DEATHDAMAGE, minDamage = -700, maxDamage = -1390, range = 5, effect = CONST_ME_REAPER, target = true }, + { name = "rootkrakentwo", interval = 2000, chance = 20 }, +} + +monster.defenses = { + defense = 76, + armor = 76, + mitigation = 2.02, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 0 }, + { type = COMBAT_ENERGYDAMAGE, percent = 15 }, + { type = COMBAT_EARTHDAMAGE, percent = -10 }, + { type = COMBAT_FIREDAMAGE, percent = -15 }, + { 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:register(monster) diff --git a/data-otservbr-global/monster/constructs/gingerbread_men.lua b/data-otservbr-global/monster/constructs/gingerbread_men.lua new file mode 100644 index 00000000000..71a34ad2fc8 --- /dev/null +++ b/data-otservbr-global/monster/constructs/gingerbread_men.lua @@ -0,0 +1,110 @@ +local mType = Game.createMonsterType("Gingerbread Man") +local monster = {} + +monster.description = "a gingerbread man" +monster.experience = 22 +monster.outfit = { + lookType = 1738, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2549 +monster.Bestiary = { + class = "Construct", + race = BESTY_RACE_CONSTRUCT, + toKill = 25, + FirstUnlock = 5, + SecondUnlock = 10, + CharmsPoints = 1, + Stars = 1, + Occurrence = 0, + Locations = "Candia", +} + +monster.health = 85 +monster.maxHealth = 85 +monster.race = "undead" +monster.corpse = 48263 +monster.speed = 115 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 20, +} + +monster.strategiesTarget = { + nearest = 100, +} + +monster.flags = { + summonable = false, + attackable = true, + hostile = false, + convinceable = false, + pushable = true, + rewardBoss = false, + illusionable = true, + canPushItems = false, + canPushCreatures = false, + staticAttackChance = 90, + targetDistance = 1, + runHealth = 85, + healthHidden = false, + isBlockable = false, + canWalkOnEnergy = true, + canWalkOnFire = true, + canWalkOnPoison = true, + isPreyExclusive = true, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "I was baked just a few days ago. So much to discover here!", yell = false }, + { text = "Have you seen my truffle baker?", yell = false }, + { text = "I should visit the Candy Carnival.", yell = false }, +} +monster.loot = {} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -1 }, +} + +monster.defenses = { + defense = 5, + armor = 13, + mitigation = 0.41, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 20 }, + { type = COMBAT_ENERGYDAMAGE, percent = 0 }, + { type = COMBAT_EARTHDAMAGE, percent = 40 }, + { type = COMBAT_FIREDAMAGE, percent = -10 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = 0 }, + { type = COMBAT_HOLYDAMAGE, percent = 10 }, + { type = COMBAT_DEATHDAMAGE, percent = 20 }, +} + +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/constructs/goggle_cake.lua b/data-otservbr-global/monster/constructs/goggle_cake.lua new file mode 100644 index 00000000000..0bd153b5b3f --- /dev/null +++ b/data-otservbr-global/monster/constructs/goggle_cake.lua @@ -0,0 +1,136 @@ +local mType = Game.createMonsterType("Goggle Cake") +local monster = {} + +monster.description = "a goggle cake" +monster.experience = 2700 +monster.outfit = { + lookType = 1740, + lookHead = 0, + lookBody = 10, + lookLegs = 115, + lookFeet = 54, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2534 +monster.Bestiary = { + class = "Construct", + race = BESTY_RACE_CONSTRUCT, + toKill = 2500, + FirstUnlock = 100, + SecondUnlock = 1000, + CharmsPoints = 50, + Stars = 4, + Occurrence = 0, + Locations = "Dessert Dungeons.", +} + +monster.health = 2700 +monster.maxHealth = 2700 +monster.race = "undead" +monster.corpse = 48271 +monster.speed = 122 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 10, +} + +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 = false, + staticAttackChance = 90, + targetDistance = 4, + runHealth = 0, + healthHidden = false, + isBlockable = false, + canWalkOnEnergy = true, + canWalkOnFire = true, + canWalkOnPoison = true, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "Give me your sweets! They are mine to devour!", yell = false }, + { text = "Hm? Where ... where are you now?", yell = false }, + { text = "Hunger!", yell = false }, +} + +monster.loot = { + { name = "gold coin", chance = 100000, maxCount = 100 }, + { name = "platinum coin", chance = 80540, maxCount = 10 }, + { name = "small enchanted sapphire", chance = 6730, maxCount = 5 }, + { name = "combat knife", chance = 5710 }, + { name = "great mana potion", chance = 5690 }, + { name = "rainbow quartz", chance = 3810, maxCount = 3 }, + { name = "small sapphire", chance = 3590, maxCount = 2 }, + { id = 3039, chance = 2660 }, -- red gem + { name = "spirit cloak", chance = 1740 }, + { name = "gummy rotworm", chance = 1690 }, + { name = "churro heart", chance = 1520 }, + { name = "glacier amulet", chance = 1020 }, + { id = 3606, chance = 1000 }, -- egg + { name = "milk chocolate coin", chance = 780, maxCount = 15 }, + { name = "flour", chance = 690 }, + { name = "cookie", chance = 520, maxCount = 2 }, + { name = "glacier robe", chance = 500 }, + { name = "epee", chance = 400 }, + { name = "ice rapier", chance = 210 }, + { name = "cream cake", chance = 140 }, +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -350 }, + { name = "combat", interval = 2000, chance = 20, type = COMBAT_ENERGYDAMAGE, minDamage = -170, maxDamage = -300, range = 7, shootEffect = CONST_ANI_CHERRYBOMB, effect = CONST_ME_STARBURST, target = true }, + { name = "combat", interval = 2000, chance = 20, type = COMBAT_ICEDAMAGE, minDamage = -120, maxDamage = -260, range = 6, shootEffect = CONST_ANI_CHERRYBOMB, effect = CONST_ME_CREAM, target = true }, +} + +monster.defenses = { + defense = 38, + armor = 38, + mitigation = 0.99, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = -5 }, + { type = COMBAT_ENERGYDAMAGE, percent = -15 }, + { type = COMBAT_EARTHDAMAGE, percent = 105 }, + { type = COMBAT_FIREDAMAGE, percent = 110 }, + { type = COMBAT_LIFEDRAIN, percent = 100 }, + { type = COMBAT_MANADRAIN, percent = 100 }, + { type = COMBAT_DROWNDAMAGE, percent = 100 }, + { type = COMBAT_ICEDAMAGE, percent = -15 }, + { type = COMBAT_HOLYDAMAGE, percent = -5 }, + { type = COMBAT_DEATHDAMAGE, percent = -15 }, +} + +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/elementals/candy_floss_elemental.lua b/data-otservbr-global/monster/elementals/candy_floss_elemental.lua new file mode 100644 index 00000000000..8d7593a858e --- /dev/null +++ b/data-otservbr-global/monster/elementals/candy_floss_elemental.lua @@ -0,0 +1,131 @@ +local mType = Game.createMonsterType("Candy Floss Elemental") +local monster = {} + +monster.description = "a candy floss elemental" +monster.experience = 3850 +monster.outfit = { + lookType = 1749, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2533 +monster.Bestiary = { + class = "Elemental", + race = BESTY_RACE_ELEMENTAL, + toKill = 2500, + FirstUnlock = 100, + SecondUnlock = 1000, + CharmsPoints = 50, + Stars = 4, + Occurrence = 0, + Locations = "Dessert Dungeons.", +} + +monster.health = 3700 +monster.maxHealth = 3700 +monster.race = "undead" +monster.corpse = 48345 +monster.speed = 105 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 10, +} + +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 = false, + staticAttackChance = 90, + targetDistance = 4, + runHealth = 0, + healthHidden = false, + isBlockable = false, + canWalkOnEnergy = true, + canWalkOnFire = true, + canWalkOnPoison = true, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "Come into my fluffy embrace!", yell = false }, + { text = "Want fairy floss? I will feed you up.", yell = false }, + { text = "Did you have to come here, little one? I just wanted to lay around and take it easy.", yell = false }, +} + +monster.loot = { + { name = "gold coin", chance = 95860, maxCount = 149 }, + { name = "platinum coin", chance = 86660, maxCount = 11 }, + { name = "fairy wings", chance = 6400 }, + { name = "energy bar", chance = 4100 }, + { name = "gummy rotworm", chance = 3410, maxCount = 3 }, + { name = "opal", chance = 3260 }, + { name = "rainbow quartz", chance = 3030, maxCount = 2 }, + { name = "violet crystal shard", chance = 2450 }, + { name = "wad of fairy floss", chance = 1690 }, + { name = "violet gem", chance = 1500 }, + { name = "milk chocolate coin", chance = 920, maxCount = 10 }, + { name = "springsprout rod", chance = 650 }, + { id = 3093, chance = 310 }, + { name = "silver amulet", chance = 120 }, +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -350 }, + { name = "combat", interval = 2000, chance = 20, type = COMBAT_ENERGYDAMAGE, minDamage = -150, maxDamage = -250, range = 7, shootEffect = CONST_ANI_CHERRYBOMB, effect = CONST_ME_STARBURST, target = true }, + { name = "combat", interval = 2000, chance = 20, type = COMBAT_ICEDAMAGE, minDamage = -160, maxDamage = -300, range = 6, shootEffect = CONST_ANI_SMALLICE, effect = CONST_ME_ICEATTACK, target = true }, + { name = "combat", interval = 2000, chance = 20, type = COMBAT_ENERGYDAMAGE, minDamage = -160, maxDamage = -300, range = 6, radius = 2, shootEffect = CONST_ANI_SMALLICE, effect = CONST_ME_PIXIE_EXPLOSION, target = true }, +} + +monster.defenses = { + defense = 45, + armor = 45, + mitigation = 1.26, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 40 }, + { type = COMBAT_ENERGYDAMAGE, percent = 15 }, + { type = COMBAT_EARTHDAMAGE, percent = -10 }, + { type = COMBAT_FIREDAMAGE, percent = -15 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = 15 }, + { type = COMBAT_HOLYDAMAGE, percent = 0 }, + { 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/elementals/honey_elemental.lua b/data-otservbr-global/monster/elementals/honey_elemental.lua new file mode 100644 index 00000000000..a243efe959a --- /dev/null +++ b/data-otservbr-global/monster/elementals/honey_elemental.lua @@ -0,0 +1,126 @@ +local mType = Game.createMonsterType("Honey Elemental") +local monster = {} + +monster.description = "a honey elemental" +monster.experience = 2400 +monster.outfit = { + lookType = 1733, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2551 +monster.Bestiary = { + class = "Elemental", + race = BESTY_RACE_ELEMENTAL, + toKill = 1000, + FirstUnlock = 50, + SecondUnlock = 500, + CharmsPoints = 25, + Stars = 3, + Occurrence = 0, + Locations = "Chocolate Mines", +} + +monster.health = 2560 +monster.maxHealth = 2560 +monster.race = "undead" +monster.corpse = 48112 +monster.speed = 100 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 10, +} + +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 = true, + canPushItems = true, + canPushCreatures = true, + staticAttackChance = 90, + targetDistance = 1, + runHealth = 0, + healthHidden = false, + isBlockable = false, + canWalkOnEnergy = false, + canWalkOnFire = true, + canWalkOnPoison = true, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "*Squelch*", yell = false }, + { text = "**Slurp**", yell = false }, +} + +monster.loot = { + { name = "small diamond", chance = 3010 }, + { name = "gold coin", chance = 100000, maxCount = 100 }, + { name = "small emerald", chance = 3760, maxCount = 2 }, + { name = "platinum coin", chance = 85000, maxCount = 6 }, + { id = 5902, chance = 3870 }, -- honeycomb + { id = 48253, chance = 1180 }, -- beijinho + { id = 818, chance = 1070 }, -- magma boots + { id = 821, chance = 756 }, -- magma legs + { name = "strong health potion", chance = 4620 }, + { id = 3280, chance = 430 }, -- fire sword + { name = "terra amulet", chance = 540 }, + { id = 48250, chance = 433, maxCount = 6 }, -- dark chocolate coin +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -260 }, + { name = "combat", interval = 2000, chance = 20, type = COMBAT_FIREDAMAGE, minDamage = -125, maxDamage = -235, radius = 4, effect = CONST_ME_YELLOW_RINGS, target = false }, +} + +monster.defenses = { + defense = 20, + armor = 34, + mitigation = 1.02, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 30 }, + { type = COMBAT_ENERGYDAMAGE, percent = -10 }, + { type = COMBAT_EARTHDAMAGE, percent = 20 }, + { type = COMBAT_FIREDAMAGE, percent = 20 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = -5 }, + { type = COMBAT_HOLYDAMAGE, percent = 5 }, + { type = COMBAT_DEATHDAMAGE, percent = 30 }, +} + +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/extra_dimensional/mitmah_scout.lua b/data-otservbr-global/monster/extra_dimensional/mitmah_scout.lua new file mode 100644 index 00000000000..9d5d32f0a03 --- /dev/null +++ b/data-otservbr-global/monster/extra_dimensional/mitmah_scout.lua @@ -0,0 +1,134 @@ +local mType = Game.createMonsterType("Mitmah Scout") +local monster = {} + +monster.description = "a mitmah scout" +monster.experience = 3230 +monster.outfit = { + lookType = 1709, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2460 +monster.Bestiary = { + class = "Extra Dimensional", + race = BESTY_RACE_EXTRA_DIMENSIONAL, + toKill = 2500, + FirstUnlock = 100, + SecondUnlock = 1000, + CharmsPoints = 50, + Stars = 4, + Occurrence = 0, + Locations = "Iksupan Waterways", +} + +monster.health = 3940 +monster.maxHealth = 3940 +monster.race = "venom" +monster.corpse = 44666 +monster.speed = 140 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 2000, + chance = 15, +} + +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, + critChance = 3, + staticAttackChance = 90, + targetDistance = 4, + runHealth = 0, + healthHidden = false, + isBlockable = false, + canWalkOnEnergy = true, + canWalkOnFire = true, + canWalkOnPoison = true, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "Die for us!", yell = false }, + { text = "Humans ought to be extinct!", yell = false }, + { text = "This belongs to us now!", yell = false }, +} + +monster.loot = { + { name = "platinum coin", chance = 100000, maxCount = 10 }, + { name = "broken mitmah necklace", chance = 17180 }, + { name = "brown crystal splinter", chance = 7620 }, + { id = 281, chance = 7400 }, -- giant shimmering pearl + { name = "green crystal splinter", chance = 6890 }, + { name = "strong health potion", chance = 6170, maxCount = 3 }, + { name = "opal", chance = 4080 }, + { name = "onyx chip", chance = 3670 }, + { name = "gold ingot", chance = 2880 }, + { id = 3037, chance = 2450 }, -- yellow gem + { name = "prismatic quartz", chance = 2410 }, + { name = "ruby necklace", chance = 1810 }, + { name = "gold-brocaded cloth", chance = 1340 }, + { name = "drill bolt", chance = 1270, maxCount = 10 }, + { id = 3040, chance = 320 }, -- gold nugget + { name = "ornate crossbow", chance = 140 }, +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -200 }, + { name = "combat", interval = 2000, chance = 20, type = COMBAT_PHYSICALDAMAGE, minDamage = -250, maxDamage = -400, radius = 4, effect = CONST_ME_POFF, target = false }, + { name = "combat", interval = 2000, chance = 25, type = COMBAT_ENERGYDAMAGE, minDamage = -200, maxDamage = -400, range = 5, shootEffect = CONST_ANI_POWERBOLT, effect = CONST_ME_ENERGYAREA, target = true }, +} + +monster.defenses = { + defense = 40, + armor = 45, + mitigation = 2.02, + { name = "combat", interval = 2000, chance = 5, type = COMBAT_HEALING, minDamage = 50, maxDamage = 180, effect = CONST_ME_MAGIC_BLUE, target = false }, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 5 }, + { type = COMBAT_ENERGYDAMAGE, percent = -5 }, + { type = COMBAT_EARTHDAMAGE, percent = -15 }, + { type = COMBAT_FIREDAMAGE, percent = 10 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = 15 }, + { type = COMBAT_HOLYDAMAGE, percent = -10 }, + { type = COMBAT_DEATHDAMAGE, percent = 15 }, +} + +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/extra_dimensional/mitmah_seer.lua b/data-otservbr-global/monster/extra_dimensional/mitmah_seer.lua new file mode 100644 index 00000000000..5002d9c8e7d --- /dev/null +++ b/data-otservbr-global/monster/extra_dimensional/mitmah_seer.lua @@ -0,0 +1,132 @@ +local mType = Game.createMonsterType("Mitmah Seer") +local monster = {} + +monster.description = "a mitmah seer" +monster.experience = 4580 +monster.outfit = { + lookType = 1710, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2461 +monster.Bestiary = { + class = "Extra Dimensional", + race = BESTY_RACE_EXTRA_DIMENSIONAL, + toKill = 2500, + FirstUnlock = 100, + SecondUnlock = 1000, + CharmsPoints = 50, + Stars = 4, + Occurrence = 0, + Locations = "Iksupan Waterways", +} + +monster.health = 4620 +monster.maxHealth = 4620 +monster.race = "venom" +monster.corpse = 44670 +monster.speed = 140 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 2000, + chance = 15, +} + +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, + critChance = 3, + staticAttackChance = 90, + 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 = "This dimension reeks!!", yell = false }, + { text = "Pamphlets at the exit only! Only one per person!", yell = false }, + { text = "This is the end of you!", yell = false }, +} + +monster.loot = { + { name = "platinum coin", chance = 100000, maxCount = 15 }, + { name = "great mana potion", chance = 11880 }, + { name = "crystal of the mitmah", chance = 11410 }, -- 280gp yasir + { name = "strong health potion", chance = 5810, maxCount = 3 }, + { name = "opal", chance = 4990 }, + { name = "wand of cosmic energy", chance = 3920 }, + { id = 3039, chance = 2280 }, -- red gem + { name = "gold-brocaded cloth", chance = 1450 }, + { name = "gold ring", chance = 1190 }, + { name = "ruby necklace", chance = 1100 }, + { id = 3038, chance = 570 }, -- green gem + { id = 3040, chance = 470 }, -- gold nugget + { name = "wooden spellbook", chance = 280 }, +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -200 }, + { name = "combat", interval = 2000, chance = 20, type = COMBAT_DEATHDAMAGE, minDamage = -250, maxDamage = -400, radius = 4, effect = CONST_ME_BLACKSMOKE, target = false }, + { name = "combat", interval = 2000, chance = 20, type = COMBAT_DEATHDAMAGE, minDamage = -200, maxDamage = -400, range = 5, radius = 3, effect = CONST_ME_MORTAREA, target = true }, + { name = "mitmahseekwave", interval = 2000, chance = 20, minDamage = -200, maxDamage = -400 }, +} + +monster.defenses = { + defense = 40, + armor = 45, + mitigation = 2.02, + { name = "combat", interval = 2000, chance = 5, type = COMBAT_HEALING, minDamage = 130, maxDamage = 210, effect = CONST_ME_MAGIC_BLUE, target = false }, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 0 }, + { type = COMBAT_ENERGYDAMAGE, percent = -20 }, + { type = COMBAT_EARTHDAMAGE, percent = -5 }, + { type = COMBAT_FIREDAMAGE, percent = 15 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = 5 }, + { type = COMBAT_HOLYDAMAGE, percent = 0 }, + { type = COMBAT_DEATHDAMAGE, percent = 15 }, +} + +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/fey/angry_sugar_fairy.lua b/data-otservbr-global/monster/fey/angry_sugar_fairy.lua new file mode 100644 index 00000000000..5d02043fac1 --- /dev/null +++ b/data-otservbr-global/monster/fey/angry_sugar_fairy.lua @@ -0,0 +1,135 @@ +local mType = Game.createMonsterType("Angry Sugar Fairy") +local monster = {} + +monster.description = "an angry sugar fairy" +monster.experience = 3100 +monster.outfit = { + lookType = 1747, + lookHead = 16, + lookBody = 5, + lookLegs = 54, + lookFeet = 93, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2552 +monster.Bestiary = { + class = "Fey", + race = BESTY_RACE_FEY, + toKill = 2500, + FirstUnlock = 100, + SecondUnlock = 1000, + CharmsPoints = 50, + Stars = 4, + Occurrence = 0, + Locations = "Dessert Dungeons, Candy Carnival.", +} + +monster.health = 3000 +monster.maxHealth = 3000 +monster.race = "undead" +monster.corpse = 48340 +monster.speed = 120 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 10, +} + +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 = false, + staticAttackChance = 90, + targetDistance = 4, + runHealth = 0, + healthHidden = false, + isBlockable = false, + canWalkOnEnergy = true, + canWalkOnFire = false, + canWalkOnPoison = true, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "Don't trample the beautiful sprinkles! That makes me angry!", yell = false }, + { text = "No sweet sugar jewellery for you, intruder!", yell = false }, + { text = "This is not the Candy Carnival! You should leave!", yell = false }, +} + +monster.loot = { + { name = "platinum coin", chance = 93020, maxCount = 11 }, + { name = "small enchanted emerald", chance = 8830, maxCount = 4 }, + { name = "wild flowers", chance = 7410 }, + { name = "small enchanted sapphire", chance = 5860, maxCount = 4 }, + { name = "green crystal splinter", chance = 5820 }, + { name = "violet crystal shard", chance = 4040 }, + { name = "small enchanted ruby", chance = 3840, maxCount = 3 }, + { name = "wand of cosmic energy", chance = 3770 }, + { name = "white pearl", chance = 2710, maxCount = 3 }, + { name = "prismatic quartz", chance = 2320 }, + { name = "ruby necklace", chance = 1890 }, + { name = "wafer paper flower", chance = 1650 }, + { name = "spellbook of enlightenment", chance = 960 }, + { name = "butterfly ring", chance = 760 }, + { name = "milk chocolate coin", chance = 760, maxCount = 10 }, + { id = 3098, chance = 730 }, -- ring of healing + { name = "hibiscus dress", chance = 360 }, + { id = 3040, chance = 230 }, -- gold nugget +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -110 }, + { name = "combat", interval = 2000, chance = 20, minDamage = -100, maxDamage = -230, range = 6, shootEffect = CONST_ANI_SMALLICE, effect = CONST_ME_ICEATTACK, target = true }, + { name = "combat", interval = 2000, chance = 20, minDamage = -130, maxDamage = -280, range = 5, radius = 3, shootEffect = CONST_ANI_ENERGY, effect = CONST_ME_ELECTRICALSPARK, target = true }, +} + +monster.defenses = { + defense = 37, + armor = 37, + mitigation = 1.10, + { name = "combat", interval = 2000, chance = 25, type = COMBAT_HEALING, minDamage = 100, maxDamage = 200, effect = CONST_ME_CACAO, target = false }, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 0 }, + { type = COMBAT_ENERGYDAMAGE, percent = 40 }, + { type = COMBAT_EARTHDAMAGE, percent = -10 }, + { type = COMBAT_FIREDAMAGE, percent = -5 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = 10 }, + { type = COMBAT_HOLYDAMAGE, percent = 10 }, + { type = COMBAT_DEATHDAMAGE, percent = 40 }, +} + +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/fey/cream_blob.lua b/data-otservbr-global/monster/fey/cream_blob.lua new file mode 100644 index 00000000000..e59d8dae3b7 --- /dev/null +++ b/data-otservbr-global/monster/fey/cream_blob.lua @@ -0,0 +1,110 @@ +local mType = Game.createMonsterType("Cream Blob") +local monster = {} + +monster.description = "a cream blob" +monster.experience = 21 +monster.outfit = { + lookType = 1757, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2568 +monster.Bestiary = { + class = "Fey", + race = BESTY_RACE_FEY, + toKill = 25, + FirstUnlock = 5, + SecondUnlock = 10, + CharmsPoints = 1, + Stars = 1, + Occurrence = 0, + Locations = "Candia", +} + +monster.health = 76 +monster.maxHealth = 76 +monster.race = "undead" +monster.corpse = 48382 +monster.speed = 140 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 20, +} + +monster.strategiesTarget = { + nearest = 100, +} + +monster.flags = { + summonable = false, + attackable = true, + hostile = false, + convinceable = false, + pushable = true, + rewardBoss = false, + illusionable = true, + canPushItems = false, + canPushCreatures = false, + staticAttackChance = 90, + targetDistance = 1, + runHealth = 76, + healthHidden = false, + isBlockable = false, + canWalkOnEnergy = true, + canWalkOnFire = true, + canWalkOnPoison = true, + isPreyExclusive = true, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "Just taking a walk, friend.", yell = false }, + { text = "Work in the Chocolate Mines? No, no, leave it to the sugar cubes.", yell = false }, + { text = "Nothing better than to lie on the vanilla sugar beach on a sunny day.", yell = false }, +} +monster.loot = {} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -1 }, +} + +monster.defenses = { + defense = 5, + armor = 7, + mitigation = 0.36, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 0 }, + { type = COMBAT_ENERGYDAMAGE, percent = 0 }, + { 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 = 15 }, + { type = COMBAT_HOLYDAMAGE, percent = 10 }, + { 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/fey/fruit_drop.lua b/data-otservbr-global/monster/fey/fruit_drop.lua new file mode 100644 index 00000000000..f62758df495 --- /dev/null +++ b/data-otservbr-global/monster/fey/fruit_drop.lua @@ -0,0 +1,110 @@ +local mType = Game.createMonsterType("Fruit Drop") +local monster = {} + +monster.description = "a fruit drop" +monster.experience = 18 +monster.outfit = { + lookType = 1754, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2565 +monster.Bestiary = { + class = "Fey", + race = BESTY_RACE_FEY, + toKill = 25, + FirstUnlock = 5, + SecondUnlock = 10, + CharmsPoints = 1, + Stars = 1, + Occurrence = 0, + Locations = "Candia", +} + +monster.health = 63 +monster.maxHealth = 63 +monster.race = "undead" +monster.corpse = 48366 +monster.speed = 140 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 20, +} + +monster.strategiesTarget = { + nearest = 100, +} + +monster.flags = { + summonable = false, + attackable = true, + hostile = false, + convinceable = false, + pushable = true, + rewardBoss = false, + illusionable = true, + canPushItems = false, + canPushCreatures = false, + staticAttackChance = 90, + targetDistance = 1, + runHealth = 63, + healthHidden = false, + isBlockable = false, + canWalkOnEnergy = true, + canWalkOnFire = true, + canWalkOnPoison = true, + isPreyExclusive = true, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "You're very sweet!", yell = false }, + { text = "Have you ever seen the Big Ice Cream Machine?", yell = false }, + { text = "Hello, sweetie!", yell = false }, +} +monster.loot = {} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -1 }, +} + +monster.defenses = { + defense = 5, + armor = 8, + mitigation = 0.36, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 20 }, + { type = COMBAT_ENERGYDAMAGE, percent = 0 }, + { type = COMBAT_EARTHDAMAGE, percent = 40 }, + { type = COMBAT_FIREDAMAGE, percent = -10 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = 0 }, + { type = COMBAT_HOLYDAMAGE, percent = 10 }, + { type = COMBAT_DEATHDAMAGE, percent = 20 }, +} + +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/fey/sugar_cube.lua b/data-otservbr-global/monster/fey/sugar_cube.lua new file mode 100644 index 00000000000..d426c0531ee --- /dev/null +++ b/data-otservbr-global/monster/fey/sugar_cube.lua @@ -0,0 +1,110 @@ +local mType = Game.createMonsterType("Sugar Cube") +local monster = {} + +monster.description = "a sugar cube" +monster.experience = 19 +monster.outfit = { + lookType = 1753, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2548 +monster.Bestiary = { + class = "Fey", + race = BESTY_RACE_FEY, + toKill = 25, + FirstUnlock = 5, + SecondUnlock = 10, + CharmsPoints = 1, + Stars = 1, + Occurrence = 0, + Locations = "Candia", +} + +monster.health = 28 +monster.maxHealth = 28 +monster.race = "undead" +monster.corpse = 48362 +monster.speed = 240 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 20, +} + +monster.strategiesTarget = { + nearest = 100, +} + +monster.flags = { + summonable = false, + attackable = true, + hostile = false, + convinceable = false, + pushable = true, + rewardBoss = false, + illusionable = true, + canPushItems = false, + canPushCreatures = false, + staticAttackChance = 90, + targetDistance = 1, + runHealth = 28, + healthHidden = false, + isBlockable = false, + canWalkOnEnergy = true, + canWalkOnFire = true, + canWalkOnPoison = true, + isPreyExclusive = true, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "No I don't work in the mines right now. That's my day off.", yell = false }, + { text = "Catch me if you can!", yell = false }, + { text = "No touching please.", yell = false }, +} +monster.loot = {} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -1 }, +} + +monster.defenses = { + defense = 5, + armor = 8, + mitigation = 0.36, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 0 }, + { type = COMBAT_ENERGYDAMAGE, percent = -10 }, + { type = COMBAT_EARTHDAMAGE, percent = 20 }, + { type = COMBAT_FIREDAMAGE, percent = -10 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = 5 }, + { type = COMBAT_HOLYDAMAGE, percent = 0 }, + { type = COMBAT_DEATHDAMAGE, percent = 0 }, +} + +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/fey/sugar_cube_worker.lua b/data-otservbr-global/monster/fey/sugar_cube_worker.lua new file mode 100644 index 00000000000..58510148b79 --- /dev/null +++ b/data-otservbr-global/monster/fey/sugar_cube_worker.lua @@ -0,0 +1,110 @@ +local mType = Game.createMonsterType("Sugar Cube Worker") +local monster = {} + +monster.description = "a sugar cube worker" +monster.experience = 20 +monster.outfit = { + lookType = 1756, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2567 +monster.Bestiary = { + class = "Fey", + race = BESTY_RACE_FEY, + toKill = 25, + FirstUnlock = 5, + SecondUnlock = 10, + CharmsPoints = 1, + Stars = 1, + Occurrence = 0, + Locations = "Candia", +} + +monster.health = 65 +monster.maxHealth = 65 +monster.race = "undead" +monster.corpse = 48378 +monster.speed = 240 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 20, +} + +monster.strategiesTarget = { + nearest = 100, +} + +monster.flags = { + summonable = false, + attackable = true, + hostile = false, + convinceable = false, + pushable = true, + rewardBoss = false, + illusionable = true, + canPushItems = false, + canPushCreatures = false, + staticAttackChance = 90, + targetDistance = 1, + runHealth = 65, + healthHidden = false, + isBlockable = false, + canWalkOnEnergy = true, + canWalkOnFire = true, + canWalkOnPoison = true, + isPreyExclusive = true, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "Please do not obstruct our work.", yell = false }, + { text = "So much work in the Chocolate Mines!", yell = false }, + { text = "Petulant sugar balls ...", yell = false }, +} +monster.loot = {} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -1 }, +} + +monster.defenses = { + defense = 5, + armor = 8, + mitigation = 0.30, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 0 }, + { type = COMBAT_ENERGYDAMAGE, percent = -5 }, + { type = COMBAT_EARTHDAMAGE, percent = 30 }, + { type = COMBAT_FIREDAMAGE, percent = -5 }, + { 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 = 0 }, +} + +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/fey/truffle.lua b/data-otservbr-global/monster/fey/truffle.lua new file mode 100644 index 00000000000..a77d9b36c54 --- /dev/null +++ b/data-otservbr-global/monster/fey/truffle.lua @@ -0,0 +1,111 @@ +local mType = Game.createMonsterType("Truffle") +local monster = {} + +monster.description = "a Truffle" +monster.experience = 15 +monster.outfit = { + lookType = 1750, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2547 +monster.Bestiary = { + class = "Fey", + race = BESTY_RACE_FEY, + toKill = 25, + FirstUnlock = 5, + SecondUnlock = 10, + CharmsPoints = 1, + Stars = 1, + Occurrence = 0, + Locations = "Candia", +} + +monster.health = 70 +monster.maxHealth = 70 +monster.race = "undead" +monster.corpse = 48349 +monster.speed = 145 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 20, +} + +monster.strategiesTarget = { + nearest = 100, +} + +monster.flags = { + summonable = false, + attackable = true, + hostile = false, + convinceable = false, + pushable = true, + rewardBoss = false, + illusionable = true, + canPushItems = false, + canPushCreatures = false, + staticAttackChance = 90, + targetDistance = 1, + runHealth = 70, + healthHidden = false, + isBlockable = false, + canWalkOnEnergy = true, + canWalkOnFire = true, + canWalkOnPoison = true, + isPreyExclusive = true, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "What a beautiful day in Candia.", yell = false }, + { text = "Time for a bath in the Hot Milk Springs, I guess.", yell = false }, + { text = "What should I bake next?", yell = false }, +} + +monster.loot = {} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -1 }, +} + +monster.defenses = { + defense = 5, + armor = 13, + mitigation = 0.38, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 0 }, + { type = COMBAT_ENERGYDAMAGE, percent = 0 }, + { type = COMBAT_EARTHDAMAGE, percent = 30 }, + { type = COMBAT_FIREDAMAGE, percent = -10 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = -5 }, + { type = COMBAT_HOLYDAMAGE, percent = -5 }, + { 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/fey/truffle_cook.lua b/data-otservbr-global/monster/fey/truffle_cook.lua new file mode 100644 index 00000000000..77b1cbc24ee --- /dev/null +++ b/data-otservbr-global/monster/fey/truffle_cook.lua @@ -0,0 +1,111 @@ +local mType = Game.createMonsterType("Truffle Cook") +local monster = {} + +monster.description = "a truffle cook" +monster.experience = 13 +monster.outfit = { + lookType = 1751, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2563 +monster.Bestiary = { + class = "Fey", + race = BESTY_RACE_FEY, + toKill = 25, + FirstUnlock = 5, + SecondUnlock = 10, + CharmsPoints = 1, + Stars = 1, + Occurrence = 0, + Locations = "Candia", +} + +monster.health = 54 +monster.maxHealth = 54 +monster.race = "undead" +monster.corpse = 48353 +monster.speed = 160 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 20, +} + +monster.strategiesTarget = { + nearest = 100, +} + +monster.flags = { + summonable = false, + attackable = true, + hostile = false, + convinceable = false, + pushable = true, + rewardBoss = false, + illusionable = true, + canPushItems = false, + canPushCreatures = false, + staticAttackChance = 90, + targetDistance = 1, + runHealth = 54, + healthHidden = false, + isBlockable = false, + canWalkOnEnergy = true, + canWalkOnFire = true, + canWalkOnPoison = true, + isPreyExclusive = true, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "You have to taste my latest creation!", yell = false }, + { text = "Please stand still and try my newest creation.", yell = false }, + { text = "Delicious!", yell = false }, +} + +monster.loot = {} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -1 }, +} + +monster.defenses = { + defense = 5, + armor = 13, + mitigation = 0.30, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 0 }, + { type = COMBAT_ENERGYDAMAGE, percent = 0 }, + { type = COMBAT_EARTHDAMAGE, percent = 25 }, + { type = COMBAT_FIREDAMAGE, percent = 5 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = -5 }, + { type = COMBAT_HOLYDAMAGE, percent = -5 }, + { type = COMBAT_DEATHDAMAGE, percent = 5 }, +} + +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/humanoids/bulltaur_alchemist.lua b/data-otservbr-global/monster/humanoids/bulltaur_alchemist.lua new file mode 100644 index 00000000000..4653371bf21 --- /dev/null +++ b/data-otservbr-global/monster/humanoids/bulltaur_alchemist.lua @@ -0,0 +1,132 @@ +local mType = Game.createMonsterType("Bulltaur Alchemist") +local monster = {} + +monster.description = "a Bulltaur Alchemist" +monster.experience = 4500 +monster.outfit = { + lookType = 1718, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.health = 5690 +monster.maxHealth = 5690 +monster.race = "blood" +monster.corpse = 44713 +monster.speed = 160 +monster.manaCost = 0 + +monster.raceId = 2448 +monster.Bestiary = { + class = "Humanoid", + race = BESTY_RACE_HUMANOID, + toKill = 2500, + FirstUnlock = 100, + SecondUnlock = 1000, + CharmsPoints = 50, + Stars = 4, + Occurrence = 0, + Locations = "Bulltaurs Lair.", +} + +monster.changeTarget = { + interval = 2000, + chance = 10, +} + +monster.strategiesTarget = { + nearest = 80, + health = 10, + damage = 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, + isBlockable = false, + canWalkOnEnergy = true, + canWalkOnFire = true, + canWalkOnPoison = true, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "Your misfortune is setteled!", yell = false }, + { text = "Soon I will harvest you for ingredients!", yell = false }, + { text = "I have just the solution for this problem!", yell = false }, +} + +monster.loot = { + { id = 3035, chance = 51528, maxCount = 30 }, + { id = 44736, chance = 15234 }, + { id = 44739, chance = 9169 }, + { id = 44740, chance = 6256 }, + { id = 239, chance = 5540 }, + { id = 9058, chance = 3534 }, + { id = 7643, chance = 2722 }, + { id = 238, chance = 2006 }, + { id = 3036, chance = 1862 }, + { id = 23373, chance = 1385 }, + { id = 3041, chance = 1003 }, + { id = 3063, chance = 1003 }, + { id = 21168, chance = 1003 }, + { id = 32769, chance = 669 }, + { id = 10438, chance = 621 }, +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = -120, maxDamage = -270 }, + { name = "combat", interval = 2000, chance = 20, type = COMBAT_ENERGYDAMAGE, minDamage = -300, maxDamage = -420, radius = 3, effect = CONST_ME_REDSMOKE, target = true }, + { name = "combat", interval = 2000, chance = 20, type = COMBAT_ENERGYDAMAGE, minDamage = -280, maxDamage = -400, range = 4, radius = 4, shootEffect = CONST_ANI_ENERGYBALL, effect = CONST_ME_PURPLESMOKE, target = true }, + { name = "bulltaur avalanche", interval = 2000, chance = 20, minDamage = -350, maxDamage = -450 }, +} + +monster.defenses = { + defense = 67, + armor = 67, + mitigation = 2.11, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 30 }, + { type = COMBAT_ENERGYDAMAGE, percent = 0 }, + { type = COMBAT_EARTHDAMAGE, percent = -20 }, + { type = COMBAT_FIREDAMAGE, percent = 0 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = 15 }, + { type = COMBAT_HOLYDAMAGE, percent = -5 }, + { type = COMBAT_DEATHDAMAGE, percent = -5 }, +} + +monster.immunities = { + { type = "paralyze", condition = true }, + { type = "outfit", condition = false }, + { type = "invisible", condition = true }, + { type = "drunk", condition = true }, + { type = "bleed", condition = false }, +} + +mType:register(monster) diff --git a/data-otservbr-global/monster/humanoids/bulltaur_brute.lua b/data-otservbr-global/monster/humanoids/bulltaur_brute.lua new file mode 100644 index 00000000000..4924a9114f8 --- /dev/null +++ b/data-otservbr-global/monster/humanoids/bulltaur_brute.lua @@ -0,0 +1,129 @@ +local mType = Game.createMonsterType("Bulltaur Brute") +local monster = {} + +monster.description = "a Bulltaur Brute" +monster.experience = 4700 +monster.outfit = { + lookType = 1717, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.health = 6560 +monster.maxHealth = 6560 +monster.race = "blood" +monster.corpse = 44709 +monster.speed = 170 +monster.manaCost = 0 + +monster.raceId = 2447 +monster.Bestiary = { + class = "Humanoid", + race = BESTY_RACE_HUMANOID, + toKill = 2500, + FirstUnlock = 100, + SecondUnlock = 1000, + CharmsPoints = 50, + Stars = 4, + Occurrence = 0, + Locations = "Bulltaurs Lair.", +} + +monster.changeTarget = { + interval = 2000, + chance = 10, +} + +monster.strategiesTarget = { + nearest = 80, + health = 10, + damage = 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, + isBlockable = false, + canWalkOnEnergy = true, + canWalkOnFire = true, + canWalkOnPoison = true, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "It's hammer time!", yell = false }, + { text = "I'll do some downsizing!", yell = false }, + { text = "This will be a smash hit!!", yell = false }, +} + +monster.loot = { + { id = 3035, chance = 53709, maxCount = 33 }, + { id = 44736, chance = 16095 }, + { id = 44738, chance = 13883 }, + { id = 9057, chance = 10239, maxCount = 3 }, + { id = 44737, chance = 9718 }, + { id = 21175, chance = 2950 }, + { id = 3097, chance = 2516 }, + { id = 3048, chance = 1432 }, + { id = 3036, chance = 1258 }, + { id = 3041, chance = 954 }, + { id = 3040, chance = 824 }, + { id = 3322, chance = 694 }, + { id = 32769, chance = 607 }, +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = -170, maxDamage = -300 }, + { name = "combat", interval = 2000, chance = 15, type = COMBAT_PHYSICALDAMAGE, minDamage = -450, maxDamage = -600, range = 3, radius = 1, target = true, effect = CONST_ME_SLASH }, + { name = "combat", interval = 2000, chance = 15, type = COMBAT_DEATHDAMAGE, minDamage = -400, maxDamage = -500, range = 3, radius = 1, target = true, effect = CONST_ME_MORTAREA }, +} + +monster.defenses = { + defense = 100, + armor = 78, + mitigation = 2.22, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 30 }, + { type = COMBAT_ENERGYDAMAGE, percent = -5 }, + { type = COMBAT_EARTHDAMAGE, percent = -20 }, + { type = COMBAT_FIREDAMAGE, percent = 10 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = 10 }, + { 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 = "drunk", condition = true }, + { type = "bleed", condition = false }, +} + +mType:register(monster) diff --git a/data-otservbr-global/monster/humanoids/bulltaur_forgepriest.lua b/data-otservbr-global/monster/humanoids/bulltaur_forgepriest.lua new file mode 100644 index 00000000000..d7a5475ee6d --- /dev/null +++ b/data-otservbr-global/monster/humanoids/bulltaur_forgepriest.lua @@ -0,0 +1,135 @@ +local mType = Game.createMonsterType("Bulltaur Forgepriest") +local monster = {} + +monster.description = "a Bulltaur Forgepriest" +monster.experience = 6400 +monster.outfit = { + lookType = 1719, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.health = 6840 +monster.maxHealth = 6840 +monster.race = "blood" +monster.corpse = 44717 +monster.speed = 73 +monster.manaCost = 0 + +monster.raceId = 2449 +monster.Bestiary = { + class = "Humanoid", + race = BESTY_RACE_HUMANOID, + toKill = 2500, + FirstUnlock = 100, + SecondUnlock = 1000, + CharmsPoints = 50, + Stars = 4, + Occurrence = 0, + Locations = "Bulltaurs Lair.", +} + +monster.changeTarget = { + interval = 2000, + chance = 10, +} + +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 = 90, + targetDistance = 3, + 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 = "What a chance to try out my latest work!", yell = false }, + { text = "May the forge be with me!", yell = false }, + { text = "The forge-fire will cleanse you!", yell = false }, +} + +monster.loot = { + { id = 3035, chance = 52410, maxCount = 45 }, + { id = 44736, chance = 16131 }, + { id = 9057, chance = 9889, maxCount = 3 }, + { id = 44741, chance = 8035 }, + { id = 44742, chance = 3832 }, + { id = 9058, chance = 2719 }, + { id = 5944, chance = 1669 }, + { id = 3041, chance = 1236 }, + { id = 16096, chance = 1236 }, + { id = 825, chance = 989 }, + { id = 3040, chance = 803 }, + { id = 8074, chance = 742 }, + { id = 32769, chance = 618 }, + { id = 3081, chance = 556 }, + { id = 3036, chance = 433 }, +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = -270, maxDamage = -300 }, + { name = "bulltaurewave", interval = 2000, chance = 20, minDamage = -350, maxDamage = -500 }, + { name = "bulltaur explosion", interval = 2000, chance = 20, minDamage = -550, maxDamage = -650 }, + { name = "combat", interval = 2000, chance = 20, type = COMBAT_ENERGYDAMAGE, minDamage = -280, maxDamage = -380, radius = 4, shootEffect = CONST_ANI_ENERGY, effect = CONST_ME_PURPLESMOKE, target = true }, + { name = "combat", interval = 2000, chance = 20, type = COMBAT_ENERGYDAMAGE, minDamage = -300, maxDamage = -420, shootEffect = CONST_ANI_ENERGY, target = true }, + { name = "combat", interval = 2000, chance = 20, type = COMBAT_ENERGYDAMAGE, minDamage = -300, maxDamage = -450, range = 4, radius = 3, shootEffect = CONST_ANI_ENERGY, effect = CONST_ME_SOUND_RED, target = true }, +} + +monster.defenses = { + defense = 73, + armor = 73, + mitigation = 2.05, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 20 }, + { type = COMBAT_ENERGYDAMAGE, percent = 0 }, + { type = COMBAT_EARTHDAMAGE, percent = 0 }, + { type = COMBAT_FIREDAMAGE, percent = 15 }, + { 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 = true }, + { type = "outfit", condition = false }, + { type = "invisible", condition = true }, + { type = "drunk", condition = true }, + { type = "bleed", condition = false }, +} + +mType:register(monster) diff --git a/data-otservbr-global/monster/magicals/candy_horror.lua b/data-otservbr-global/monster/magicals/candy_horror.lua new file mode 100644 index 00000000000..ea60e5ba2a4 --- /dev/null +++ b/data-otservbr-global/monster/magicals/candy_horror.lua @@ -0,0 +1,132 @@ +local mType = Game.createMonsterType("Candy Horror") +local monster = {} + +monster.description = "a candy horror" +monster.experience = 3000 +monster.outfit = { + lookType = 1739, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.events = {} + +monster.raceId = 2535 +monster.Bestiary = { + class = "Magical", + race = BESTY_RACE_MAGICAL, + toKill = 2500, + FirstUnlock = 100, + SecondUnlock = 1000, + CharmsPoints = 50, + Stars = 4, + Occurrence = 0, + Locations = "Chocolate Mines.", +} + +monster.health = 3100 +monster.maxHealth = 3100 +monster.race = "blood" +monster.corpse = 48267 +monster.speed = 115 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 10, +} + +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 = 90, + targetDistance = 1, + runHealth = 0, + healthHidden = false, + isBlockable = false, + canWalkOnEnergy = false, + canWalkOnFire = true, + canWalkOnPoison = true, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "We will devour you ...", yell = false }, + { text = "Wait for us, little treat ...", yell = false }, + { text = "*Horrraa!", yell = false }, +} + +monster.loot = { + { name = "gold coin", chance = 100000, maxCount = 30 }, + { name = "platinum coin", chance = 82000, maxCount = 6 }, + { id = 281, chance = 6510 }, -- giant shimmering pearl (green) + { id = 3591, chance = 1400, maxCount = 2 }, -- stawberries + { id = 48250, chance = 440, maxCount = 11 }, -- dark chocolate coin + { id = 48116, chance = 2490, maxCount = 2 }, -- gummy rotworm + { id = 3036, chance = 1550 }, -- violet gem + { id = 48252, chance = 1250 }, -- brigadeiro + { id = 23535, chance = 5550 }, -- energy bar + { id = 8012, chance = 1240, maxCount = 2 }, -- raspberry + { id = 7419, chance = 502 }, -- dreaded cleaver + { id = 3072, chance = 1840 }, -- wand of decay + { id = 3429, chance = 2830 }, -- black shield +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -200 }, + { name = "combat", interval = 2000, chance = 20, type = COMBAT_EARTHDAMAGE, minDamage = -120, maxDamage = -300, range = 6, radius = 3, effect = CONST_ME_CAKE, target = true }, + { name = "combat", interval = 2000, chance = 15, type = COMBAT_DEATHDAMAGE, minDamage = -120, maxDamage = -350, radius = 6, effect = CONST_ME_CACAO, target = false }, + { name = "combat", interval = 2000, chance = 15, type = COMBAT_PHYSICALDAMAGE, minDamage = -120, maxDamage = -350, effect = CONST_ME_BIG_SCRATCH, target = false }, +} + +monster.defenses = { + defense = 24, + armor = 43, + mitigation = 1.21, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 5 }, + { type = COMBAT_ENERGYDAMAGE, percent = -10 }, + { type = COMBAT_EARTHDAMAGE, percent = 10 }, + { type = COMBAT_FIREDAMAGE, percent = 5 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = 0 }, + { type = COMBAT_HOLYDAMAGE, percent = -15 }, + { type = COMBAT_DEATHDAMAGE, percent = 50 }, +} + +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/nibblemaw.lua b/data-otservbr-global/monster/magicals/nibblemaw.lua new file mode 100644 index 00000000000..051240c99b4 --- /dev/null +++ b/data-otservbr-global/monster/magicals/nibblemaw.lua @@ -0,0 +1,133 @@ +local mType = Game.createMonsterType("Nibblemaw") +local monster = {} + +monster.description = "a nibblemaw" +monster.experience = 2700 +monster.outfit = { + lookType = 1737, + lookHead = 0, + lookBody = 0, + lookLegs = 94, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.events = {} + +monster.raceId = 2531 +monster.Bestiary = { + class = "Magical", + race = BESTY_RACE_MAGICAL, + toKill = 2500, + FirstUnlock = 100, + SecondUnlock = 1000, + CharmsPoints = 50, + Stars = 4, + Occurrence = 0, + Locations = "Chocolate Mines.", +} + +monster.health = 2900 +monster.maxHealth = 2900 +monster.race = "blood" +monster.corpse = 48259 +monster.speed = 118 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 10, +} + +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 = 90, + targetDistance = 1, + runHealth = 0, + healthHidden = false, + isBlockable = false, + canWalkOnEnergy = false, + canWalkOnFire = true, + canWalkOnPoison = true, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "*chomp* Mmmoh! *chomp*", yell = false }, + { text = "Mwaaahgod! Overmwaaaaah", yell = false }, + { text = "*gurgle*", yell = false }, + { text = "Mmmwahmwahmwhah, mwaaah!", yell = false }, +} + +monster.loot = { + { name = "gold coin", chance = 100000, maxCount = 100 }, + { name = "platinum coin", chance = 75000, maxCount = 6 }, + { id = 3037, chance = 6000 }, -- yellow gem + { id = 48255, chance = 1090 }, -- lime tart + { id = 48250, chance = 940, maxCount = 64 }, -- dark chocolate coin + { id = 48116, chance = 4590, maxCount = 2 }, -- gummy rotworm + { id = 3593, chance = 1550 }, -- melon + { id = 8012, chance = 1240, maxCount = 2 }, -- raspberry + { name = "assassin dagger", chance = 400 }, + { name = "red crystal fragment", chance = 3400 }, + { name = "frazzle tongue", chance = 10430 }, + { name = "frazzle skin", chance = 7700 }, +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -200 }, + { name = "combat", interval = 2000, chance = 10, type = COMBAT_DEATHDAMAGE, minDamage = -70, maxDamage = -150, range = 6, shootEffect = CONST_ANI_SUDDENDEATH, effect = CONST_ME_MORTAREA, target = true }, + { name = "combat", interval = 2000, chance = 15, type = COMBAT_EARTHDAMAGE, minDamage = -20, maxDamage = -250, length = 5, spread = 5, effect = CONST_ME_SIURP }, + { name = "combat", interval = 2000, chance = 15, type = COMBAT_EARTHDAMAGE, minDamage = -60, maxDamage = -250, radius = 4, effect = CONST_ME_STONES, target = false }, +} + +monster.defenses = { + defense = 30, + armor = 48, + mitigation = 1.10, + { name = "combat", interval = 2000, chance = 15, type = COMBAT_HEALING, minDamage = 250, maxDamage = 225, effect = CONST_ME_HITBYPOISON, target = false }, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 10 }, + { type = COMBAT_ENERGYDAMAGE, percent = -15 }, + { type = COMBAT_EARTHDAMAGE, percent = -10 }, + { 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 = -5 }, + { type = COMBAT_DEATHDAMAGE, percent = 40 }, +} + +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/plants/rootthing_amber_shaper.lua b/data-otservbr-global/monster/plants/rootthing_amber_shaper.lua new file mode 100644 index 00000000000..fba1a58c166 --- /dev/null +++ b/data-otservbr-global/monster/plants/rootthing_amber_shaper.lua @@ -0,0 +1,136 @@ +local mType = Game.createMonsterType("Rootthing Amber Shaper") +local monster = {} + +monster.description = "a rootthing amber shaper" +monster.experience = 12400 +monster.outfit = { + lookType = 1762, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2539 +monster.Bestiary = { + class = "Plant", + race = BESTY_RACE_PLANT, + toKill = 2500, + FirstUnlock = 100, + SecondUnlock = 1000, + CharmsPoints = 50, + Stars = 4, + Occurrence = 0, + Locations = "Podzilla Stalk.", +} + +monster.health = 15000 +monster.maxHealth = 15000 +monster.race = "venom" +monster.corpse = 48401 +monster.speed = 185 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 10, +} + +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 = false, + staticAttackChance = 90, + 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 = "KNARR!", yell = false }, + { text = "RATTLE!", yell = false }, + { text = "CROAK!", yell = false }, +} + +monster.loot = { + { name = "gold coin", chance = 100000, maxCount = 200 }, + { name = "platinum coin", chance = 88010, maxCount = 37 }, + { name = "demon root", chance = 6840 }, + { name = "amber sickle", chance = 5980 }, + { name = "resin parasite", chance = 5980 }, + { name = "crystal coin", chance = 2560 }, + { name = "wooden spellbook", chance = 2560 }, + { name = "amber", chance = 1710 }, + { name = "amber staff", chance = 850 }, + { name = "jade hammer", chance = 850 }, + { name = "skull helmet", chance = 1310 }, + { name = "amber with a bug", chance = 1110 }, + { name = "amber with a dragonfly", chance = 1110 }, + { name = "Preserved Pink Seed", chance = 110 }, + { name = "Preserved Red Seed", chance = 110 }, + { name = "Preserved Yellow Seed", chance = 110 }, + { name = "Preserved Dark Seed", chance = 110 }, +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -450 }, + { name = "combat", interval = 2000, chance = 20, type = COMBAT_EARTHDAMAGE, minDamage = -550, maxDamage = -750, effect = CONST_ME_SMALLPLANTS, target = true }, + { name = "combat", interval = 2500, chance = 17, type = COMBAT_PHYSICALDAMAGE, minDamage = -600, maxDamage = -800, radius = 2, effect = CONST_ME_STONES, target = true }, + { name = "rotthingshaper", interval = 2000, chance = 18, target = false }, + { name = "poison chain", interval = 2000, chance = 15, minDamage = -600, maxDamage = -900 }, +} + +monster.defenses = { + defense = 100, + armor = 100, + mitigation = 2.75, + { name = "combat", interval = 2000, chance = 15, type = COMBAT_HEALING, minDamage = 500, maxDamage = 800, effect = CONST_ME_MAGIC_GREEN, target = false }, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 5 }, + { type = COMBAT_ENERGYDAMAGE, percent = 25 }, + { type = COMBAT_EARTHDAMAGE, percent = 100 }, + { type = COMBAT_FIREDAMAGE, percent = -5 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = -5 }, + { type = COMBAT_HOLYDAMAGE, percent = -5 }, + { 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/plants/rootthing_bug_tracker.lua b/data-otservbr-global/monster/plants/rootthing_bug_tracker.lua new file mode 100644 index 00000000000..826c0e98722 --- /dev/null +++ b/data-otservbr-global/monster/plants/rootthing_bug_tracker.lua @@ -0,0 +1,131 @@ +local mType = Game.createMonsterType("Rootthing Bug Tracker") +local monster = {} + +monster.description = "a rootthing bug tracker" +monster.experience = 9650 +monster.outfit = { + lookType = 1763, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2538 +monster.Bestiary = { + class = "Plant", + race = BESTY_RACE_PLANT, + toKill = 2500, + FirstUnlock = 100, + SecondUnlock = 1000, + CharmsPoints = 50, + Stars = 4, + Occurrence = 0, + Locations = "Podzilla Stalk.", +} + +monster.health = 12500 +monster.maxHealth = 12500 +monster.race = "venom" +monster.corpse = 48405 +monster.speed = 195 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 10, +} + +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 = false, + staticAttackChance = 90, + targetDistance = 4, + runHealth = 0, + healthHidden = false, + isBlockable = false, + canWalkOnEnergy = true, + canWalkOnFire = true, + canWalkOnPoison = true, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "Ktsktskts!", yell = false }, + { text = "BRRRRN!!!", yell = true }, + { text = "FRRRRR!!!", yell = true }, +} + +monster.loot = { + { name = "platinum coin", chance = 74620, maxCount = 44 }, + { name = "small emerald", chance = 6180 }, + { name = "resin parasite", chance = 4840 }, + { name = "demon root", chance = 4510 }, + { name = "springsprout rod", chance = 3170 }, + { name = "wood cape", chance = 1170 }, + { name = "green gem", chance = 1170 }, + { name = "golden legs", chance = 170 }, + { name = "composite hornbow", chance = 170 }, + { name = "Preserved Pink Seed", chance = 110 }, + { name = "Preserved Red Seed", chance = 110 }, + { name = "Preserved Yellow Seed", chance = 110 }, +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -300 }, + { name = "rotthligholyulus", interval = 2000, chance = 14, minDamage = -630, maxDamage = -840 }, + { name = "combat", interval = 2000, chance = 20, type = COMBAT_PHYSICALDAMAGE, minDamage = -530, maxDamage = -720, radius = 4, effect = CONST_ME_EXPLOSIONHIT, target = true }, + { name = "combat", interval = 2000, chance = 20, type = COMBAT_EARTHDAMAGE, minDamage = -460, maxDamage = -740, range = 6, radius = 2, shootEffect = CONST_ANI_POISON, effect = CONST_ME_POISONAREA, target = true }, + { name = "podzillaphyschain", interval = 2000, chance = 16 }, + { name = "rotthligexplo", interval = 2000, chance = 18, minDamage = -400, maxDamage = -625 }, +} + +monster.defenses = { + defense = 92, + armor = 92, + mitigation = 2.51, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 15 }, + { type = COMBAT_ENERGYDAMAGE, percent = 25 }, + { type = COMBAT_EARTHDAMAGE, percent = 100 }, + { type = COMBAT_FIREDAMAGE, percent = -15 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = -5 }, + { type = COMBAT_HOLYDAMAGE, percent = 0 }, + { type = COMBAT_DEATHDAMAGE, percent = -5 }, +} + +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/plants/rootthing_nutshell.lua b/data-otservbr-global/monster/plants/rootthing_nutshell.lua new file mode 100644 index 00000000000..d6ba10bea3c --- /dev/null +++ b/data-otservbr-global/monster/plants/rootthing_nutshell.lua @@ -0,0 +1,129 @@ +local mType = Game.createMonsterType("Rootthing Nutshell") +local monster = {} + +monster.description = "a rootthing nutshell" +monster.experience = 9200 +monster.outfit = { + lookType = 1760, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2540 +monster.Bestiary = { + class = "Plant", + race = BESTY_RACE_PLANT, + toKill = 2500, + FirstUnlock = 100, + SecondUnlock = 1000, + CharmsPoints = 50, + Stars = 4, + Occurrence = 0, + Locations = "Podzilla Stalk.", +} + +monster.health = 13500 +monster.maxHealth = 13500 +monster.race = "venom" +monster.corpse = 48396 +monster.speed = 190 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 10, +} + +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 = false, + staticAttackChance = 90, + 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 = "", yell = true }, + { text = "", yell = true }, + { text = "", yell = true }, +} + +monster.loot = { + { name = "platinum coin", chance = 88000, maxCount = 41 }, + { name = "demon root", chance = 7160 }, + { name = "resin parasite", chance = 3940 }, + { name = "small emerald", chance = 3030 }, + { name = "epee", chance = 830 }, + { name = "green gem", chance = 730 }, + { name = "swamplair armor", chance = 550 }, + { name = "ruthless axe", chance = 90 }, + { name = "terra helmet", chance = 30 }, + { name = "Preserved Pink Seed", chance = 110 }, + { name = "Preserved Red Seed", chance = 110 }, + { name = "Preserved Yellow Seed", chance = 110 }, +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = -150, maxDamage = -670 }, + { name = "rotthligulus", interval = 2000, chance = 20, minDamage = -750, maxDamage = -1100 }, + { name = "rotthingwave", interval = 2000, chance = 20 }, + { name = "combat", interval = 2000, chance = 17, type = COMBAT_PHYSICALDAMAGE, minDamage = -400, maxDamage = -700, range = 6, effect = CONST_ME_BITE, target = true }, +} + +monster.defenses = { + defense = 85, + armor = 85, + mitigation = 2.31, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 25 }, + { type = COMBAT_ENERGYDAMAGE, percent = 15 }, + { type = COMBAT_EARTHDAMAGE, percent = 100 }, + { type = COMBAT_FIREDAMAGE, percent = -15 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = -5 }, + { type = COMBAT_HOLYDAMAGE, percent = 5 }, + { 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/slimes/chocolate_blob.lua b/data-otservbr-global/monster/slimes/chocolate_blob.lua new file mode 100644 index 00000000000..21bd9f9e6e7 --- /dev/null +++ b/data-otservbr-global/monster/slimes/chocolate_blob.lua @@ -0,0 +1,109 @@ +local mType = Game.createMonsterType("Chocolate Blob") +local monster = {} + +monster.description = "a chocolate blob" +monster.experience = 17 +monster.outfit = { + lookType = 1732, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2550 +monster.Bestiary = { + class = "Slime", + race = BESTY_RACE_SLIME, + toKill = 25, + FirstUnlock = 5, + SecondUnlock = 10, + CharmsPoints = 1, + Stars = 1, + Occurrence = 0, + Locations = "Candia", +} + +monster.health = 70 +monster.maxHealth = 70 +monster.race = "undead" +monster.corpse = 48108 +monster.speed = 80 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 20, +} + +monster.strategiesTarget = { + nearest = 100, +} + +monster.flags = { + summonable = false, + attackable = true, + hostile = false, + convinceable = false, + pushable = true, + rewardBoss = false, + illusionable = true, + canPushItems = false, + canPushCreatures = false, + staticAttackChance = 90, + targetDistance = 1, + runHealth = 70, + healthHidden = false, + isBlockable = false, + canWalkOnEnergy = true, + canWalkOnFire = true, + canWalkOnPoison = true, + isPreyExclusive = true, +} + +monster.light = { + level = 0, + color = 0, +} + +monster.voices = { + interval = 5000, + chance = 10, + { text = "*Splotch*", yell = false }, + { text = "Smudge", yell = false }, +} +monster.loot = {} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -1 }, +} + +monster.defenses = { + defense = 5, + armor = 11, + mitigation = 0.36, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 30 }, + { type = COMBAT_ENERGYDAMAGE, percent = 0 }, + { type = COMBAT_EARTHDAMAGE, percent = 35 }, + { type = COMBAT_FIREDAMAGE, percent = 40 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = -5 }, + { type = COMBAT_HOLYDAMAGE, percent = 10 }, + { type = COMBAT_DEATHDAMAGE, percent = 25 }, +} + +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/undeads/iks_yapunac.lua b/data-otservbr-global/monster/undeads/iks_yapunac.lua new file mode 100644 index 00000000000..f479867c8a6 --- /dev/null +++ b/data-otservbr-global/monster/undeads/iks_yapunac.lua @@ -0,0 +1,126 @@ +local mType = Game.createMonsterType("Iks Yapunac") +local monster = {} + +monster.description = "an iks yapunac" +monster.experience = 3125 +monster.outfit = { + lookType = 1702, + lookHead = 0, + lookBody = 0, + lookLegs = 0, + lookFeet = 0, + lookAddons = 0, + lookMount = 0, +} + +monster.raceId = 2437 +monster.Bestiary = { + class = "Undead", + race = BESTY_RACE_UNDEAD, + toKill = 2500, + FirstUnlock = 100, + SecondUnlock = 500, + CharmsPoints = 50, + Stars = 4, + Occurrence = 1, + Locations = "Iksupan Waterways", +} + +monster.health = 3125 +monster.maxHealth = 3125 +monster.race = "blood" +monster.corpse = 44447 +monster.speed = 120 +monster.manaCost = 0 + +monster.changeTarget = { + interval = 4000, + chance = 10, +} + +monster.strategiesTarget = { + nearest = 100, +} + +monster.flags = { + summonable = false, + attackable = true, + hostile = true, + convinceable = false, + pushable = false, + rewardBoss = false, + illusionable = false, + canPushItems = true, + canPushCreatures = true, + staticAttackChance = 90, + 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 = "MIT-MAH!", yell = false }, + { text = "Grrrmh...", yell = false }, + { text = "CHAHAAAR!!!", yell = false }, +} + +monster.loot = { + { name = "platinum coin", chance = 100000, maxCount = 10 }, + { name = "gold coin", chance = 100000, maxCount = 50 }, + { id = 281, chance = 14830 }, -- giant shimmering pearl + { name = "great health potion", chance = 14530 }, + { name = "tiger eye", chance = 4820 }, + { name = "green crystal splinter", chance = 4190 }, + { name = "brown crystal splinter", chance = 4160 }, + { name = "opal", chance = 3450, maxCount = 2 }, + { name = "gearwheel chain", chance = 3150 }, + { name = "onyx chip", chance = 2490 }, + { name = "ritual tooth", chance = 2410 }, + { name = "spiked squelcher", chance = 1700 }, + { id = 11514, chance = 1500 }, -- colorful feather +} + +monster.attacks = { + { name = "melee", interval = 2000, chance = 100, minDamage = 0, maxDamage = -250, effect = CONST_ME_PURPLEENERGY }, + { name = "iksyapunacwave", interval = 2000, chance = 20, minDamage = -175, maxDamage = -300 }, + { name = "combat", interval = 2000, chance = 17, type = COMBAT_DEATHDAMAGE, minDamage = -140, maxDamage = -260, range = 5, effect = CONST_ME_MORTAREA, target = true }, +} + +monster.defenses = { + defense = 45, + armor = 45, + mitigation = 2.02, +} + +monster.elements = { + { type = COMBAT_PHYSICALDAMAGE, percent = 15 }, + { type = COMBAT_ENERGYDAMAGE, percent = -10 }, + { type = COMBAT_EARTHDAMAGE, percent = 10 }, + { type = COMBAT_FIREDAMAGE, percent = 10 }, + { type = COMBAT_LIFEDRAIN, percent = 0 }, + { type = COMBAT_MANADRAIN, percent = 0 }, + { type = COMBAT_DROWNDAMAGE, percent = 0 }, + { type = COMBAT_ICEDAMAGE, percent = -5 }, + { type = COMBAT_HOLYDAMAGE, percent = 15 }, + { 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/npc/yasir.lua b/data-otservbr-global/npc/yasir.lua index a197cae33d5..f39123390fb 100644 --- a/data-otservbr-global/npc/yasir.lua +++ b/data-otservbr-global/npc/yasir.lua @@ -657,6 +657,33 @@ npcConfig.shop = { { itemName = "young lich worm", clientId = 31590, sell = 25000 }, { itemName = "zaogun flag", clientId = 10413, sell = 600 }, { itemName = "zaogun shoulderplates", clientId = 10414, sell = 150 }, + { itemName = "strange substance", clientId = 44740, sell = 810 }, + { itemName = "encrypted notes", clientId = 44739, sell = 620 }, + { itemName = "staff piece", clientId = 44741, sell = 560 }, + { itemName = "idol of the forge", clientId = 44742, sell = 950 }, + { itemName = "bulltaur hoof", clientId = 44737, sell = 540 }, + { itemName = "bulltaur armor scrap", clientId = 44738, sell = 480 }, + { itemName = "bulltaur horn", clientId = 44736, sell = 385 }, + { itemName = "crystal of the Mitmah", clientId = 44439, sell = 280 }, + { itemName = "gold-brocaded cloth", clientId = 40529, sell = 175 }, + { itemName = "broken Mitmah necklace", clientId = 44438, sell = 210 }, + { itemName = "ritual tooth", clientId = 40528, sell = 135 }, + { itemName = "broken Mitmah chestplate", clientId = 44727, sell = 85000 }, + { itemName = "splintered Mitmah gem", clientId = 44728, sell = 225000 }, + { itemName = "taiyaki ice cream", clientId = 48273, sell = 6750 }, + { itemName = "wad of fairy floss", clientId = 48544, sell = 2910 }, + { itemName = "wafer paper flower", clientId = 48251, sell = 2350 }, + { itemName = "resinous fish fin", clientId = 48509, sell = 1250 }, + { itemName = "resin parasite", clientId = 48511, sell = 1450 }, + { itemName = "root tentacle", clientId = 48516, sell = 300000 }, + { itemName = "fish eye", clientId = 48517, sell = 500000 }, + { itemName = "amber souvenir", clientId = 48508, sell = 850 }, + { itemName = "beijinho", clientId = 48253, sell = 2780 }, + { itemName = "brigadeiro", clientId = 48252, sell = 2640 }, + { itemName = "churro heart", clientId = 48254, sell = 2680 }, + { itemName = "lime tart", clientId = 48255, sell = 1870 }, + { itemName = "pastry dragon", clientId = 48256, sell = 95000 }, + { itemName = "demon root", clientId = 48510, sell = 950 }, } -- On buy npc shop message npcType.onBuyItem = function(npc, player, itemId, subType, amount, ignore, inBackpacks, totalCost) diff --git a/data-otservbr-global/scripts/quests/adventures_of_galthen/actions_mitmah_vanguard.lua b/data-otservbr-global/scripts/quests/adventures_of_galthen/actions_mitmah_vanguard.lua new file mode 100644 index 00000000000..abc8f387714 --- /dev/null +++ b/data-otservbr-global/scripts/quests/adventures_of_galthen/actions_mitmah_vanguard.lua @@ -0,0 +1,23 @@ +local config = { + boss = { + name = "Mitmah Vanguard", + position = Position(34067, 31409, 11), + }, + timeAfterKill = 60, + playerPositions = { + { pos = Position(34048, 31431, 11), teleport = Position(34067, 31415, 11) }, + { pos = Position(34049, 31431, 11), teleport = Position(34067, 31415, 11) }, + { pos = Position(34050, 31431, 11), teleport = Position(34067, 31415, 11) }, + { pos = Position(34051, 31431, 11), teleport = Position(34067, 31415, 11) }, + { pos = Position(34052, 31431, 11), teleport = Position(34067, 31415, 11) }, + }, + specPos = { + from = Position(34054, 31400, 11), + to = Position(34081, 31419, 11), + }, + exit = Position(34060, 31432, 11), +} + +local lever = BossLever(config) +lever:position(Position(34047, 31431, 11)) +lever:register() diff --git a/data-otservbr-global/scripts/quests/adventures_of_galthen/actions_mitmah_vanguard_exit.lua b/data-otservbr-global/scripts/quests/adventures_of_galthen/actions_mitmah_vanguard_exit.lua new file mode 100644 index 00000000000..93e3a7d43d9 --- /dev/null +++ b/data-otservbr-global/scripts/quests/adventures_of_galthen/actions_mitmah_vanguard_exit.lua @@ -0,0 +1,17 @@ +local mitmahVanguardExitConfig = { + arenaExit = Position(34068, 31418, 11), + destination = Position(34053, 31431, 11), +} + +local mitmahVanguardExit = Action() + +function mitmahVanguardExit.onUse(player, item, fromPosition, target, toPosition, isHotkey) + if not player then + return false + end + player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) + player:teleportTo(mitmahVanguardExitConfig.destination) +end + +mitmahVanguardExit:position(mitmahVanguardExitConfig.arenaExit) +mitmahVanguardExit:register() diff --git a/data-otservbr-global/scripts/quests/soulpit/ondroploot_soul_core.lua b/data-otservbr-global/scripts/quests/soulpit/ondroploot_soul_core.lua index 9ddb479c117..beac3b3b9e2 100644 --- a/data-otservbr-global/scripts/quests/soulpit/ondroploot_soul_core.lua +++ b/data-otservbr-global/scripts/quests/soulpit/ondroploot_soul_core.lua @@ -4,23 +4,24 @@ function callback.monsterOnDropLoot(monster, corpse) if not monster or not corpse then return end + local player = Player(corpse:getCorpseOwner()) if not player or not player:canReceiveLoot() then return end + if monster:getMonsterForgeClassification() ~= FORGE_FIENDISH_MONSTER then return end - local soulCoreId = nil local trySameMonsterSoulCore = math.random(100) <= SoulPit.SoulCoresConfiguration.chanceToGetSameMonsterSoulCore local mType = monster:getType() local lootTable = {} if math.random(100) < SoulPit.SoulCoresConfiguration.chanceToDropSoulCore then + local soulCoreId if trySameMonsterSoulCore then - local itemName = monster:getName():lower() .. " soul core" - soulCoreId = getItemIdByName(itemName) + soulCoreId = getItemIdByName(string.format("%s soul core", monster:getName():lower())) end if not soulCoreId and not trySameMonsterSoulCore then @@ -29,16 +30,13 @@ function callback.monsterOnDropLoot(monster, corpse) if monstersInCategory and #monstersInCategory > 0 then local randomMonster = monstersInCategory[math.random(#monstersInCategory)] - local itemName = randomMonster:name():lower() .. " soul core" - soulCoreId = getItemIdByName(itemName) - logger.info("soulcoreId: " .. soulCoreId) + soulCoreId = getItemIdByName(string.format("%s soul core", randomMonster:name():lower())) end end if soulCoreId then - lootTable[soulCoreId] = { - count = 1, - } + lootTable[soulCoreId] = { count = 1 } + logger.debug("[monsterOnDropLoot.MonsterOnDropLootSoulCore] {} dropped {} for {}.", monster:getName(), ItemType(soulCoreId):getName(), player:getName()) else return {} end @@ -47,11 +45,11 @@ function callback.monsterOnDropLoot(monster, corpse) if math.random(100) < SoulPit.SoulCoresConfiguration.chanceToDropSoulPrism then local soulPrismId = getItemIdByName("soul prism") if soulPrismId then - lootTable[soulPrismId] = { - count = 1, - } + lootTable[soulPrismId] = { count = 1 } + logger.debug("[monsterOnDropLoot.MonsterOnDropLootSoulCore] {} dropped {} for {}.", monster:getName(), ItemType(soulPrismId):getName(), player:getName()) end end + corpse:addLoot(mType:generateLootRoll({}, lootTable, player)) end diff --git a/data-otservbr-global/scripts/quests/the_ancient_tombs/action_morguthis_wall.lua b/data-otservbr-global/scripts/quests/the_ancient_tombs/action_morguthis_wall.lua index 420a2f3fbc2..811efdd4b33 100644 --- a/data-otservbr-global/scripts/quests/the_ancient_tombs/action_morguthis_wall.lua +++ b/data-otservbr-global/scripts/quests/the_ancient_tombs/action_morguthis_wall.lua @@ -14,7 +14,7 @@ function morguthisWall.onUse(player, item, fromPosition, target, toPosition) wall:remove() else local creatures = tile:getCreatures() - if creatures then + if #creatures > 0 then for _, creature in ipairs(creatures) do local newPosition = Position(wallPosition.x, wallPosition.y + 1, wallPosition.z) creature:teleportTo(newPosition) @@ -22,7 +22,7 @@ function morguthisWall.onUse(player, item, fromPosition, target, toPosition) end local items = tile:getItems() - if items then + if #items > 0 then for _, tileItem in ipairs(items) do local newPosition = Position(wallPosition.x, wallPosition.y + 1, wallPosition.z) tileItem:moveTo(newPosition) @@ -36,4 +36,5 @@ function morguthisWall.onUse(player, item, fromPosition, target, toPosition) end morguthisWall:position(Position(33212, 32693, 13)) +morguthisWall:position(Position(33209, 32701, 13)) morguthisWall:register() diff --git a/data-otservbr-global/scripts/spells/monster/bulltaur_alchemist_avalanche.lua b/data-otservbr-global/scripts/spells/monster/bulltaur_alchemist_avalanche.lua new file mode 100644 index 00000000000..2fd31e3588e --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/bulltaur_alchemist_avalanche.lua @@ -0,0 +1,30 @@ +local combat = Combat() +combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) +combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA) +arr = { + { 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 1, 1, 1, 0, 0, 0 }, + { 0, 0, 1, 1, 1, 1, 1, 0, 0 }, + { 0, 1, 1, 1, 1, 1, 1, 1, 0 }, + { 0, 1, 1, 1, 3, 1, 1, 1, 0 }, + { 0, 1, 1, 1, 1, 1, 1, 1, 0 }, + { 0, 0, 1, 1, 1, 1, 1, 0, 0 }, + { 0, 0, 0, 1, 1, 1, 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("bulltaur avalanche") +spell:words("###7000") +spell:needLearn(true) +spell:cooldown("2000") +spell:isSelfTarget(true) +spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/bulltaur_ewave.lua b/data-otservbr-global/scripts/spells/monster/bulltaur_ewave.lua new file mode 100644 index 00000000000..df3a8719bdb --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/bulltaur_ewave.lua @@ -0,0 +1,28 @@ +local combat = Combat() +combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) +combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_PURPLEENERGY) +arr = { + { 0, 0, 0, 0, 0, 0, 0 }, + { 0, 1, 1, 1, 1, 1, 0 }, + { 0, 1, 1, 1, 1, 1, 0 }, + { 0, 0, 1, 1, 1, 0, 0 }, + { 0, 0, 0, 1, 0, 0, 0 }, + { 0, 0, 0, 3, 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("bulltaurewave") +spell:words("#446431") +spell:isAggressive(true) +spell:blockWalls(true) +spell:needLearn(true) +spell:needDirection(true) +spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/bulltaur_forge_priest_explosion.lua b/data-otservbr-global/scripts/spells/monster/bulltaur_forge_priest_explosion.lua new file mode 100644 index 00000000000..95b18a4d28b --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/bulltaur_forge_priest_explosion.lua @@ -0,0 +1,26 @@ +local combat = Combat() +combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) +combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HOLYDAMAGE) +arr = { + { 0, 0, 0, 1, 1, 1, 0, 0, 0 }, + { 0, 0, 1, 1, 1, 1, 1, 0, 0 }, + { 0, 0, 1, 1, 3, 1, 1, 0, 0 }, + { 0, 0, 1, 1, 1, 1, 1, 0, 0 }, + { 0, 0, 0, 1, 1, 1, 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("bulltaur explosion") +spell:words("###7001") +spell:needLearn(true) +spell:cooldown("2000") +spell:isSelfTarget(true) +spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/iksyapunac_wave.lua b/data-otservbr-global/scripts/spells/monster/iksyapunac_wave.lua new file mode 100644 index 00000000000..20d6ffef61f --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/iksyapunac_wave.lua @@ -0,0 +1,29 @@ +local combat = Combat() +combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) +combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_GROUNDSHAKER) +arr = { + { 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 1, 1, 1, 0, 0 }, + { 0, 0, 1, 1, 1, 0, 0 }, + { 0, 0, 1, 1, 1, 0, 0 }, + { 0, 0, 0, 1, 0, 0, 0 }, + { 0, 0, 0, 1, 0, 0, 0 }, + { 0, 0, 0, 3, 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("iksyapunacwave") +spell:words("#446191") +spell:isAggressive(true) +spell:blockWalls(true) +spell:needLearn(true) +spell:needDirection(true) +spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/mitmah_vanguard_hugeblackring.lua b/data-otservbr-global/scripts/spells/monster/mitmah_vanguard_hugeblackring.lua new file mode 100644 index 00000000000..e698797c506 --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/mitmah_vanguard_hugeblackring.lua @@ -0,0 +1,36 @@ +local spell = Spell("instant") + +local aLarge = { + { 0, 0, 0, 0, 0, 0, 0, 0, 1, 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, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 }, + { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 }, + { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 }, + { 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0 }, + { 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0 }, + { 1, 1, 1, 1, 1, 1, 0, 0, 3, 0, 0, 1, 1, 1, 1, 1, 1 }, + { 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0 }, + { 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0 }, + { 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0 }, + { 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0 }, + { 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 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, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 }, +} + +local combatLargeRing = Combat() +combatLargeRing:setParameter(COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE) +combatLargeRing:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA) +combatLargeRing:setArea(createCombatArea(aLarge)) + +function spell.onCastSpell(creature, var) + return combatLargeRing:execute(creature, var) +end + +spell:name("hugeblackring") +spell:words("###huge_black_ring") +spell:needLearn(true) +spell:isSelfTarget(true) +spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/mitmahseer_wave.lua b/data-otservbr-global/scripts/spells/monster/mitmahseer_wave.lua new file mode 100644 index 00000000000..3869e078fa0 --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/mitmahseer_wave.lua @@ -0,0 +1,30 @@ +local combat = Combat() +combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ENERGYDAMAGE) +combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_PURPLESMOKE) +arr = { + { 0, 0, 0, 0, 0, 0, 0 }, + { 0, 1, 1, 1, 1, 1, 0 }, + { 0, 0, 1, 1, 1, 0, 0 }, + { 0, 0, 1, 1, 1, 0, 0 }, + { 0, 0, 1, 1, 1, 0, 0 }, + { 0, 0, 0, 1, 0, 0, 0 }, + { 0, 0, 0, 1, 0, 0, 0 }, + { 0, 0, 0, 3, 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("mitmahseekwave") +spell:words("#446031") +spell:isAggressive(true) +spell:blockWalls(true) +spell:needLearn(true) +spell:needDirection(true) +spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/podzillaphys_chain.lua b/data-otservbr-global/scripts/spells/monster/podzillaphys_chain.lua new file mode 100644 index 00000000000..44264be89a6 --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/podzillaphys_chain.lua @@ -0,0 +1,34 @@ +local combat = Combat() +combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) +combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ORANGE_ENERGY_SPARK) +combat:setParameter(COMBAT_PARAM_CHAIN_EFFECT, CONST_ME_ORANGE_ENERGY_SPARK) + +function getChainValue(creature) + return 2, 3, false +end + +function canChain(creature, target) + if target:isPlayer() then + if target:getPosition():isProtectionZoneTile() then + return false + end + return true + end + return false +end + +combat:setCallback(CALLBACK_PARAM_CHAINVALUE, "getChainValue") +combat:setCallback(CALLBACK_PARAM_CHAINPICKER, "canChain") + +local spell = Spell("instant") + +function spell.onCastSpell(creature, var) + return combat:execute(creature, var) +end + +spell:name("podzillaphyschain") +spell:words("#876011") +spell:needLearn(true) +spell:cooldown("2000") +spell:isSelfTarget(true) +spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/poison_chain.lua b/data-otservbr-global/scripts/spells/monster/poison_chain.lua index e7de16d3932..c142f410727 100644 --- a/data-otservbr-global/scripts/spells/monster/poison_chain.lua +++ b/data-otservbr-global/scripts/spells/monster/poison_chain.lua @@ -7,7 +7,18 @@ function getChainValue(creature) return 2, 3, false end +function canChain(creature, target) + if target:isPlayer() then + if target:getPosition():isProtectionZoneTile() then + return false + end + return true + end + return false +end + combat:setCallback(CALLBACK_PARAM_CHAINVALUE, "getChainValue") +combat:setCallback(CALLBACK_PARAM_CHAINPICKER, "canChain") local spell = Spell("instant") diff --git a/data-otservbr-global/scripts/spells/monster/quara_looter_small_icering.lua b/data-otservbr-global/scripts/spells/monster/quara_looter_small_icering.lua new file mode 100644 index 00000000000..0d0ec42ea04 --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/quara_looter_small_icering.lua @@ -0,0 +1,33 @@ +local spell = Spell("instant") + +local aLarge = { + { 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, 0, 0, 0, 0 }, + { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0 }, + { 0, 0, 0, 1, 1, 2, 1, 1, 0, 0, 0 }, + { 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0 }, + { 0, 0, 0, 0, 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 }, +} + +local combatLargeRing = Combat() +combatLargeRing:setParameter(COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) +combatLargeRing:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA) +combatLargeRing:setArea(createCombatArea(aLarge)) + +local combats = { combatLargeRing } + +function spell.onCastSpell(creature, var) + local randomCombat = combats[math.random(#combats)] + return randomCombat:execute(creature, var) +end + +spell:name("quarasmallicering") +spell:words("###quara_small_ice_ring") +spell:needLearn(true) +spell:isSelfTarget(true) +spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/quara_plunderer_cross.lua b/data-otservbr-global/scripts/spells/monster/quara_plunderer_cross.lua new file mode 100644 index 00000000000..6a2eee0b73b --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/quara_plunderer_cross.lua @@ -0,0 +1,27 @@ +local combat = Combat() +combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_LIFEDRAIN) +combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA) +arr = { + { 0, 0, 0, 1, 0, 0, 0 }, + { 0, 0, 0, 1, 0, 0, 0 }, + { 0, 0, 0, 1, 0, 0, 0 }, + { 1, 1, 1, 2, 1, 1, 1 }, + { 0, 0, 0, 1, 0, 0, 0 }, + { 0, 0, 0, 1, 0, 0, 0 }, + { 0, 0, 0, 1, 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("quaracrossdeath") +spell:words("###quara_cross_death") +spell:needLearn(true) +spell:isSelfTarget(true) +spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/quara_plunderer_smoke.lua b/data-otservbr-global/scripts/spells/monster/quara_plunderer_smoke.lua new file mode 100644 index 00000000000..7659a230acb --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/quara_plunderer_smoke.lua @@ -0,0 +1,27 @@ +local combat = Combat() +combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE) +combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_BLACKSMOKE) +arr = { + { 0, 0, 1, 1, 1, 0, 0 }, + { 0, 1, 1, 1, 1, 1, 0 }, + { 1, 1, 1, 1, 1, 1, 1 }, + { 1, 1, 1, 3, 1, 1, 1 }, + { 1, 1, 1, 1, 1, 1, 1 }, + { 0, 1, 1, 1, 1, 1, 0 }, + { 0, 0, 1, 1, 1, 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("quarasmokedeath") +spell:words("###quara_smoke_death") +spell:needLearn(true) +spell:isSelfTarget(true) +spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/quara_raider_icering.lua b/data-otservbr-global/scripts/spells/monster/quara_raider_icering.lua new file mode 100644 index 00000000000..4cd598759f2 --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/quara_raider_icering.lua @@ -0,0 +1,35 @@ +local spell = Spell("instant") + +local aLarge = { + { 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, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0 }, + { 0, 0, 1, 1, 1, 0, 3, 0, 1, 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, 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 }, +} + +local combatLargeRing = Combat() +combatLargeRing:setParameter(COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) +combatLargeRing:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ICEAREA) +combatLargeRing:setArea(createCombatArea(aLarge)) + +local combats = { combatLargeRing } + +function spell.onCastSpell(creature, var) + local randomCombat = combats[math.random(#combats)] + return randomCombat:execute(creature, var) +end + +spell:name("quaralargeicering") +spell:words("###quara_large_ice_ring") +spell:needLearn(true) +spell:isSelfTarget(true) +spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/quara_raider_shoot.lua b/data-otservbr-global/scripts/spells/monster/quara_raider_shoot.lua new file mode 100644 index 00000000000..53a06b4f807 --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/quara_raider_shoot.lua @@ -0,0 +1,17 @@ +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_SNOWBALL) +combat:setArea(createCombatArea(AREA_CIRCLE1X1)) + +local spell = Spell("instant") + +function spell.onCastSpell(creature, var) + return combat:execute(creature, var) +end + +spell:name("quararaidershoot") +spell:words("###raider_shoot") +spell:needLearn(true) +spell:needTarget(true) +spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/quara_raider_watercreature.lua b/data-otservbr-global/scripts/spells/monster/quara_raider_watercreature.lua new file mode 100644 index 00000000000..36bfda029e3 --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/quara_raider_watercreature.lua @@ -0,0 +1,24 @@ +local combat = Combat() +combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) +combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_WATERCREATURE) +arr = { + { 1, 0, 1 }, + { 0, 0, 0 }, + { 0, 1, 0 }, + { 0, 2, 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("quaraseamonster") +spell:words("###quara_sea_monster") +spell:needLearn(true) +spell:isSelfTarget(false) +spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/quara_raider_watersplash.lua b/data-otservbr-global/scripts/spells/monster/quara_raider_watersplash.lua new file mode 100644 index 00000000000..ef1233a360f --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/quara_raider_watersplash.lua @@ -0,0 +1,24 @@ +local combat = Combat() +combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) +combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_WATERSPLASH) +arr = { + { 0, 0, 1, 0 }, + { 1, 0, 2, 0 }, + { 0, 0, 0, 1 }, + { 0, 1, 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("quarawatersplash") +spell:words("###quara_water_splash") +spell:needLearn(true) +spell:isSelfTarget(false) +spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/rootkraken_deathholy.lua b/data-otservbr-global/scripts/spells/monster/rootkraken_deathholy.lua new file mode 100644 index 00000000000..2d71d96443c --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/rootkraken_deathholy.lua @@ -0,0 +1,66 @@ +local combat1 = Combat() +combat1:setParameter(COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE) +combat1:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA) +combat1:setFormula(COMBAT_FORMULA_DAMAGE, 0, 2000, 3000, 0) + +local combat2 = Combat() +combat2:setParameter(COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) +combat2:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HOLYDAMAGE) +combat2:setFormula(COMBAT_FORMULA_DAMAGE, 0, 2500, 4500, 0) + +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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, + { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 1, 1, 1, 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, 1, 1, 1, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, + { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 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 }, +} + +arr1 = { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 1, 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, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0 }, + { 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0 }, + { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 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, 3, 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, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0 }, + { 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0 }, + { 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, +} + +local area = createCombatArea(arr) +combat1:setArea(createCombatArea(arr)) +combat2:setArea(createCombatArea(arr1)) + +local spell = Spell("instant") + +local combats = { combat1, combat2 } + +function spell.onCastSpell(creature, var) + for _, combat in pairs(combats) do + combat:execute(creature, var) + end + return true +end + +spell:name("rootkraken") +spell:words("#773333") +spell:needLearn(true) +spell:isSelfTarget(true) +spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/rootkraken_rootearth.lua b/data-otservbr-global/scripts/spells/monster/rootkraken_rootearth.lua new file mode 100644 index 00000000000..3d094d5a597 --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/rootkraken_rootearth.lua @@ -0,0 +1,68 @@ +local combatRoot = Combat() +combatRoot:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_ROOTS) +local condition = Condition(CONDITION_ROOTED) +condition:setParameter(CONDITION_PARAM_TICKS, 3000) +combatRoot:addCondition(condition) + +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, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 1, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 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 }, +} + +local combat1 = Combat() +combat1:setParameter(COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE) +combat1:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_PLANTATTACK) +combat1:setFormula(COMBAT_FORMULA_DAMAGE, 0, 2500, 3500, 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, 1, 0, 1, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 1, 1, 1, 1, 0, 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, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 1, 0, 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 }, +} + +local area = createCombatArea(arr) +combatRoot:setArea(createCombatArea(arr)) +combat1:setArea(createCombatArea(arr1)) + +local spell = Spell("instant") + +local combats = { combatRoot, combat1 } + +function spell.onCastSpell(creature, var) + for _, combat in pairs(combats) do + combat:execute(creature, var) + end + + return true +end + +spell:name("rootkrakentwo") +spell:words("#773334") +spell:needLearn(true) +spell:isSelfTarget(true) +spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/rotthing_explo.lua b/data-otservbr-global/scripts/spells/monster/rotthing_explo.lua new file mode 100644 index 00000000000..892c54ed3c1 --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/rotthing_explo.lua @@ -0,0 +1,24 @@ +local spell = Spell("instant") + +local arr = { + { 0, 0, 0, 0, 0 }, + { 0, 1, 1, 1, 0 }, + { 0, 1, 3, 1, 0 }, + { 0, 1, 1, 1, 0 }, + { 0, 0, 0, 0, 0 }, +} + +local combat = Combat() +combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) +combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_EXPLOSIONAREA) +combat:setArea(createCombatArea(arr)) + +function spell.onCastSpell(creature, var) + return combat:execute(creature, var) +end + +spell:name("rotthligexplo") +spell:words("###rotth_explo") +spell:needLearn(true) +spell:isSelfTarget(true) +spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/rotthing_shaper.lua b/data-otservbr-global/scripts/spells/monster/rotthing_shaper.lua new file mode 100644 index 00000000000..d81aa32e7b2 --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/rotthing_shaper.lua @@ -0,0 +1,55 @@ +local combat1 = Combat() +combat1:setParameter(COMBAT_PARAM_TYPE, COMBAT_EARTHDAMAGE) +combat1:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_SMALLPLANTS) +combat1:setFormula(COMBAT_FORMULA_DAMAGE, 0, 700, 900, 0) + +local combat2 = Combat() +combat2:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) +combat2:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_FIREATTACK) +combat2:setFormula(COMBAT_FORMULA_DAMAGE, 0, 800, 1000, 0) + +arr = { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 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, 1, 0, 2, 0, 0, 0, 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, 1, 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, 1, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0 }, + { 0, 1, 0, 1, 2, 0, 0, 1, 0, 1, 0 }, + { 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0 }, + { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, +} + +local area = createCombatArea(arr) +combat1:setArea(createCombatArea(arr)) +combat2:setArea(createCombatArea(arr1)) + +local spell = Spell("instant") + +local combats = { combat1, combat2 } + +function spell.onCastSpell(creature, var) + for _, combat in pairs(combats) do + combat:execute(creature, var) + end + return true +end + +spell:name("rotthingshaper") +spell:words("#773373") +spell:needLearn(true) +spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/rotthing_ulus.lua b/data-otservbr-global/scripts/spells/monster/rotthing_ulus.lua new file mode 100644 index 00000000000..6861ccee6ee --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/rotthing_ulus.lua @@ -0,0 +1,32 @@ +local spell = Spell("instant") + +local aLarge = { + { 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, 0, 0, 0, 1, 1, 0, 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, 0, 1, 1, 0, 0, 0, 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, 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 combat = Combat() +combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) +combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_BLOCKHIT) +combat:setArea(createCombatArea(aLarge)) + +function spell.onCastSpell(creature, var) + return combat:execute(creature, var) +end + +spell:name("rotthligulus") +spell:words("###rotth_ulus") +spell:needLearn(true) +spell:isSelfTarget(true) +spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/rotthing_wave.lua b/data-otservbr-global/scripts/spells/monster/rotthing_wave.lua new file mode 100644 index 00000000000..59b61ea219a --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/rotthing_wave.lua @@ -0,0 +1,50 @@ +local combat1 = Combat() +combat1:setParameter(COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) +combat1:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HOLYDAMAGE) +combat1:setFormula(COMBAT_FORMULA_DAMAGE, 0, 700, 900, 0) + +local combat2 = Combat() +combat2:setParameter(COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) +combat2:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_GROUNDSHAKER) +combat2:setFormula(COMBAT_FORMULA_DAMAGE, 0, 800, 1200, 0) + +arr = { + { 0, 0, 0, 0, 0 }, + { 0, 0, 1, 0, 0 }, + { 0, 0, 1, 0, 0 }, + { 0, 0, 1, 0, 0 }, + { 0, 0, 1, 0, 0 }, + { 0, 0, 1, 0, 0 }, + { 0, 0, 3, 0, 0 }, +} + +arr1 = { + { 0, 0, 0, 0, 0, 0, 0 }, + { 0, 1, 1, 1, 1, 1, 0 }, + { 0, 0, 1, 1, 1, 0, 0 }, + { 0, 0, 1, 1, 1, 0, 0 }, + { 0, 0, 0, 1, 0, 0, 0 }, + { 0, 0, 0, 1, 0, 0, 0 }, + { 0, 0, 0, 3, 0, 0, 0 }, +} + +local area = createCombatArea(arr) +combat1:setArea(createCombatArea(arr)) +combat2:setArea(createCombatArea(arr1)) + +local spell = Spell("instant") + +local combats = { combat1, combat2 } + +function spell.onCastSpell(creature, var) + for _, combat in pairs(combats) do + combat:execute(creature, var) + end + return true +end + +spell:name("rotthingwave") +spell:words("#776373") +spell:needLearn(true) +spell:needDirection(true) +spell:register() diff --git a/data-otservbr-global/scripts/spells/monster/rotthingholy_ulus.lua b/data-otservbr-global/scripts/spells/monster/rotthingholy_ulus.lua new file mode 100644 index 00000000000..78c3909d3f0 --- /dev/null +++ b/data-otservbr-global/scripts/spells/monster/rotthingholy_ulus.lua @@ -0,0 +1,32 @@ +local spell = Spell("instant") + +local aLarge = { + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 1, 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, 1, 1, 1, 0, 0, 3, 0, 0, 1, 1, 1, 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, 1, 0, 0, 0, 0, 0, 0 }, + { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, +} + +local combat = Combat() +combat:setParameter(COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) +combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA) +combat:setArea(createCombatArea(aLarge)) + +function spell.onCastSpell(creature, var) + return combat:execute(creature, var) +end + +spell:name("rotthligholyulus") +spell:words("###rotth_holy_ulus") +spell:needLearn(true) +spell:isSelfTarget(true) +spell:register() diff --git a/data/items/items.xml b/data/items/items.xml index 9b228d3882a..9f2526bb5b1 100644 --- a/data/items/items.xml +++ b/data/items/items.xml @@ -76806,6 +76806,57 @@ Granted by TibiaGoals.com"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -76942,6 +76993,172 @@ Granted by TibiaGoals.com"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -76952,6 +77169,305 @@ Granted by TibiaGoals.com"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -79637,6 +80153,76 @@ Granted by TibiaGoals.com"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -79671,6 +80257,48 @@ Granted by TibiaGoals.com"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -79713,6 +80341,11 @@ Granted by TibiaGoals.com"/> + + + + + diff --git a/data/scripts/actions/items/foods.lua b/data/scripts/actions/items/foods.lua index 4a8072d163e..0fe60761fc0 100644 --- a/data/scripts/actions/items/foods.lua +++ b/data/scripts/actions/items/foods.lua @@ -120,6 +120,18 @@ local foods = { [37531] = { 5, "Mmmm." }, -- candy floss [37532] = { 15, "Mmmm." }, -- ice cream cone [37533] = { 60, "Mmmm." }, -- birthday layer cake + [48116] = { 35, "Yum." }, -- gummy rotworms + [48251] = { 25, "Yum." }, -- wafer paper flower + [48252] = { 45, "Yum." }, -- brigadeiro + [48253] = { 45, "Yum." }, -- beijinho + [48254] = { 65, "Yum." }, -- churro heart + [48255] = { 125, "Yum." }, -- lime tart + [48256] = { 605, "Yum." }, -- pastry dragon + [48273] = { 185, "Yum." }, -- taiyaki ice cream + [48508] = { 125, "Yum." }, -- amber souvenir + [48509] = { 120, "Yum." }, -- resinous fish fin + [48511] = { 120, "Yum." }, -- resin parasite + [48544] = { 124, "Yum." }, -- wad of fairy floss } local food = Action() diff --git a/schema.sql b/schema.sql index 9d8f3522f69..10efc5dce00 100644 --- a/schema.sql +++ b/schema.sql @@ -7,7 +7,7 @@ CREATE TABLE IF NOT EXISTS `server_config` ( CONSTRAINT `server_config_pk` PRIMARY KEY (`config`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -INSERT INTO `server_config` (`config`, `value`) VALUES ('db_version', '48'), ('motd_hash', ''), ('motd_num', '0'), ('players_record', '0'); +INSERT INTO `server_config` (`config`, `value`) VALUES ('db_version', '49'), ('motd_hash', ''), ('motd_num', '0'), ('players_record', '0'); -- Table structure `accounts` CREATE TABLE IF NOT EXISTS `accounts` ( diff --git a/src/lua/functions/core/game/lua_enums.cpp b/src/lua/functions/core/game/lua_enums.cpp index 8bff425808e..4254c09eb38 100644 --- a/src/lua/functions/core/game/lua_enums.cpp +++ b/src/lua/functions/core/game/lua_enums.cpp @@ -609,6 +609,15 @@ void LuaEnums::initConstMeEnums(lua_State* L) { registerEnum(L, CONST_ME_DIVINE_EMPOWERMENT); registerEnum(L, CONST_ME_WATER_FLOATING_THRASH); registerEnum(L, CONST_ME_AGONY); + registerEnum(L, CONST_ME_MELTING_CREAM); + registerEnum(L, CONST_ME_REAPER); + registerEnum(L, CONST_ME_POWERFUL_HEARTS); + registerEnum(L, CONST_ME_CREAM); + registerEnum(L, CONST_ME_GENTLE_BUBBLE); + registerEnum(L, CONST_ME_STARBURST); + registerEnum(L, CONST_ME_SIURP); + registerEnum(L, CONST_ME_CACAO); + registerEnum(L, CONST_ME_CANDY_FLOSS); } void LuaEnums::initConstAniEnums(lua_State* L) { @@ -667,6 +676,8 @@ void LuaEnums::initConstAniEnums(lua_State* L) { registerEnum(L, CONST_ANI_DIAMONDARROW); registerEnum(L, CONST_ANI_SPECTRALBOLT); registerEnum(L, CONST_ANI_ROYALSTAR); + registerEnum(L, CONST_ANI_CANDYCANE); + registerEnum(L, CONST_ANI_CHERRYBOMB); registerEnum(L, CONST_ANI_WEAPONTYPE); } diff --git a/src/utils/utils_definitions.hpp b/src/utils/utils_definitions.hpp index 6eae663daca..90dbf09f5eb 100644 --- a/src/utils/utils_definitions.hpp +++ b/src/utils/utils_definitions.hpp @@ -207,6 +207,17 @@ enum MagicEffectClasses : uint16_t { CONST_ME_LOOT_HIGHLIGHT = 252, + // 13.40 + CONST_ME_MELTING_CREAM = 263, + CONST_ME_REAPER = 264, + CONST_ME_POWERFUL_HEARTS = 265, + CONST_ME_CREAM = 266, + CONST_ME_GENTLE_BUBBLE = 267, + CONST_ME_STARBURST = 268, + CONST_ME_SIURP = 269, + CONST_ME_CACAO = 270, + CONST_ME_CANDY_FLOSS = 271, + CONST_ME_LAST }; @@ -272,7 +283,11 @@ enum ShootType_t : uint8_t { CONST_ANI_SPECTRALBOLT = 58, CONST_ANI_ROYALSTAR = 59, - CONST_ANI_LAST = CONST_ANI_ROYALSTAR, + // 13.40 + CONST_ANI_CANDYCANE = 61, + CONST_ANI_CHERRYBOMB = 62, + + CONST_ANI_LAST = CONST_ANI_CHERRYBOMB, // for internal use, don't send to client CONST_ANI_WEAPONTYPE = 0xFE, // 254