forked from opentibiabr/canary
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'live' of https://github.com/Jonyrewind/canary into live
- Loading branch information
Showing
5 changed files
with
167 additions
and
193 deletions.
There are no files selected for viewing
169 changes: 39 additions & 130 deletions
169
data-otservbr-global/scripts/actions/quests/heart_of_destruction/quake_lever.lua
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,133 +1,42 @@ | ||
-- FUNCTIONS | ||
local function doCheckArea() | ||
local upConer = { x = 32197, y = 31236, z = 14 } -- upLeftCorner | ||
local downConer = { x = 32220, y = 31260, z = 14 } -- downRightCorner | ||
|
||
for i = upConer.x, downConer.x do | ||
for j = upConer.y, downConer.y do | ||
for k = upConer.z, downConer.z do | ||
local room = { x = i, y = j, z = k } | ||
local tile = Tile(room) | ||
if tile then | ||
local creatures = tile:getCreatures() | ||
if creatures and #creatures > 0 then | ||
for _, creature in pairs(creatures) do | ||
local player = Player(creature) | ||
if player then | ||
return true | ||
end | ||
end | ||
end | ||
end | ||
end | ||
end | ||
end | ||
return false | ||
end | ||
|
||
local function clearArea() | ||
local upConer = { x = 32197, y = 31236, z = 14 } -- upLeftCorner | ||
local downConer = { x = 32220, y = 31260, z = 14 } -- downRightCorner | ||
|
||
for i = upConer.x, downConer.x do | ||
for j = upConer.y, downConer.y do | ||
for k = upConer.z, downConer.z do | ||
local room = { x = i, y = j, z = k } | ||
local tile = Tile(room) | ||
if tile then | ||
local creatures = tile:getCreatures() | ||
if creatures and #creatures > 0 then | ||
for _, creatureUid in pairs(creatures) do | ||
local creature = Creature(creatureUid) | ||
if creature then | ||
if creature:isPlayer() then | ||
creature:teleportTo({ x = 32230, y = 31358, z = 11 }) | ||
elseif creature:isMonster() then | ||
creature:remove() | ||
end | ||
end | ||
end | ||
end | ||
end | ||
end | ||
end | ||
end | ||
stopEvent(areaQuake1) | ||
end | ||
-- FUNCTIONS END | ||
|
||
local heartDestructionQuake = Action() | ||
function heartDestructionQuake.onUse(player, item, fromPosition, itemEx, toPosition) | ||
local config = { | ||
playerPositions = { | ||
Position(32182, 31244, 14), | ||
Position(32182, 31245, 14), | ||
Position(32182, 31246, 14), | ||
Position(32182, 31247, 14), | ||
Position(32182, 31248, 14), | ||
}, | ||
|
||
newPos = { x = 32208, y = 31256, z = 14 }, | ||
} | ||
|
||
local pushPos = { x = 32182, y = 31244, z = 14 } | ||
|
||
if item.actionid == 14329 then | ||
if item.itemid == 8911 then | ||
if player:getPosition().x == pushPos.x and player:getPosition().y == pushPos.y and player:getPosition().z == pushPos.z then | ||
local storePlayers = {} | ||
for i = 1, #config.playerPositions do | ||
local tile = Tile(Position(config.playerPositions[i])) | ||
if tile then | ||
local playerTile = tile:getTopCreature() | ||
if playerTile and playerTile:isPlayer() then | ||
storePlayers[#storePlayers + 1] = playerTile | ||
end | ||
end | ||
end | ||
|
||
if doCheckArea() == false then | ||
clearArea() | ||
|
||
local players | ||
|
||
for i = 1, #storePlayers do | ||
players = storePlayers[i] | ||
config.playerPositions[i]:sendMagicEffect(CONST_ME_POFF) | ||
players:teleportTo(config.newPos) | ||
players:setBossCooldown("Realityquake", os.time() + configManager.getNumber(configKeys.BOSS_DEFAULT_TIME_TO_FIGHT_AGAIN)) | ||
end | ||
Position(config.newPos):sendMagicEffect(11) | ||
|
||
areaQuake1 = addEvent(clearArea, 15 * 60000) | ||
|
||
Game.createMonster("Spark of Destruction", { x = 32203, y = 31246, z = 14 }, false, true) | ||
Game.createMonster("Spark of Destruction", { x = 32205, y = 31251, z = 14 }, false, true) | ||
Game.createMonster("Spark of Destruction", { x = 32210, y = 31251, z = 14 }, false, true) | ||
Game.createMonster("Spark of Destruction", { x = 32212, y = 31246, z = 14 }, false, true) | ||
Game.createMonster("Foreshock", { x = 32208, y = 31248, z = 14 }, false, true) | ||
|
||
foreshockHealth = 105000 | ||
aftershockHealth = 105000 | ||
foreshockStage = 0 | ||
aftershockStage = 0 | ||
|
||
local vortex = Tile({ x = 32199, y = 31248, z = 14 }):getItemById(23482) | ||
if vortex then | ||
vortex:transform(23483) | ||
vortex:setActionId(14345) | ||
end | ||
else | ||
player:sendTextMessage(19, "Someone is in the area.") | ||
end | ||
else | ||
return true | ||
local config = { | ||
boss = { | ||
name = "Foreshock", | ||
position = Position(32208, 31248, 14), | ||
}, | ||
playerPositions = { | ||
{ pos = Position(32182, 31244, 14), teleport = Position(32208, 31256, 14), effect = CONST_ME_TELEPORT }, | ||
{ pos = Position(32182, 31245, 14), teleport = Position(32208, 31256, 14), effect = CONST_ME_TELEPORT }, | ||
{ pos = Position(32182, 31246, 14), teleport = Position(32208, 31256, 14), effect = CONST_ME_TELEPORT }, | ||
{ pos = Position(32182, 31247, 14), teleport = Position(32208, 31256, 14), effect = CONST_ME_TELEPORT }, | ||
{ pos = Position(32182, 31248, 14), teleport = Position(32208, 31256, 14), effect = CONST_ME_TELEPORT }, | ||
}, | ||
specPos = { | ||
from = Position(32197, 31236, 14), | ||
to = Position(32220, 31260, 14), | ||
}, | ||
monsters = { | ||
{ name = "Spark of Destruction", pos = Position(32203, 31246, 14) }, | ||
{ name = "Spark of Destruction", pos = Position(32205, 31251, 14) }, | ||
{ name = "Spark of Destruction", pos = Position(32210, 31251, 14) }, | ||
{ name = "Spark of Destruction", pos = Position(32212, 31246, 14) }, | ||
}, | ||
onUseExtra = function() | ||
Game.setStorageValue(GlobalStorage.HeartOfDestruction.ForeshockHealth, 105000) | ||
Game.setStorageValue(GlobalStorage.HeartOfDestruction.AftershockHealth, 105000) | ||
Game.setStorageValue(GlobalStorage.HeartOfDestruction.ForeshockStage, -1) | ||
Game.setStorageValue(GlobalStorage.HeartOfDestruction.AftershockStage, -1) | ||
local tile = Tile(Position(32199, 31248, 14)) | ||
if tile then | ||
local vortex = tile:getItemById(23482) | ||
if vortex then | ||
vortex:transform(23483) | ||
vortex:setActionId(14345) | ||
end | ||
end | ||
item:transform(item.itemid == 8911 and 8912 or 8911) | ||
end | ||
return true | ||
end | ||
end, | ||
exit = Position(32230, 31358, 11), | ||
} | ||
|
||
heartDestructionQuake:aid(14329) | ||
heartDestructionQuake:register() | ||
local lever = BossLever(config) | ||
lever:aid(14329) | ||
lever:register() |
54 changes: 31 additions & 23 deletions
54
...ervbr-global/scripts/creaturescripts/quests/heart_of_destruction/aftershock_transform.lua
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
54 changes: 31 additions & 23 deletions
54
...servbr-global/scripts/creaturescripts/quests/heart_of_destruction/foreshock_transform.lua
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
39 changes: 22 additions & 17 deletions
39
data-otservbr-global/scripts/creaturescripts/quests/heart_of_destruction/shocks_death.lua
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,27 +1,32 @@ | ||
local function createSparksOfDestruction() | ||
Game.createMonster("Spark Of Destruction", Position(32203, 31246, 14), false, true) | ||
Game.createMonster("Spark Of Destruction", Position(32205, 31251, 14), false, true) | ||
Game.createMonster("Spark Of Destruction", Position(32210, 31251, 14), false, true) | ||
Game.createMonster("Spark Of Destruction", Position(32212, 31246, 14), false, true) | ||
end | ||
|
||
local shocksDeath = CreatureEvent("ShocksDeath") | ||
|
||
function shocksDeath.onDeath(creature) | ||
if not creature or not creature:isMonster() then | ||
return true | ||
end | ||
|
||
local name = creature:getName():lower() | ||
if name == "foreshock" then | ||
local pos = creature:getPosition() | ||
local monster = Game.createMonster("realityquake", pos, false, true) | ||
Game.createMonster("spark of destruction", { x = 32203, y = 31246, z = 14 }, false, true) | ||
Game.createMonster("spark of destruction", { x = 32205, y = 31251, z = 14 }, false, true) | ||
Game.createMonster("spark of destruction", { x = 32210, y = 31251, z = 14 }, false, true) | ||
Game.createMonster("spark of destruction", { x = 32212, y = 31246, z = 14 }, false, true) | ||
end | ||
|
||
if name == "aftershock" then | ||
local pos = creature:getPosition() | ||
local monster = Game.createMonster("realityquake", pos, false, true) | ||
Game.createMonster("spark of destruction", { x = 32203, y = 31246, z = 14 }, false, true) | ||
Game.createMonster("spark of destruction", { x = 32205, y = 31251, z = 14 }, false, true) | ||
Game.createMonster("spark of destruction", { x = 32210, y = 31251, z = 14 }, false, true) | ||
Game.createMonster("spark of destruction", { x = 32212, y = 31246, z = 14 }, false, true) | ||
local creatureName = creature:getName():lower() | ||
if creatureName == "foreshock" then | ||
local monster = Game.createMonster("Aftershock", Position(32208, 31248, 14), false, true) | ||
if monster then | ||
local aftershockHealth = Game.getStorageValue(GlobalStorage.HeartOfDestruction.AftershockHealth) > 0 and Game.getStorageValue(GlobalStorage.HeartOfDestruction.AftershockHealth) or 0 | ||
monster:addHealth(-monster:getHealth() + aftershockHealth, COMBAT_PHYSICALDAMAGE) | ||
createSparksOfDestruction() | ||
end | ||
elseif creatureName == "aftershock" then | ||
local monster = Game.createMonster("Realityquake", creature:getPosition(), false, true) | ||
if monster then | ||
createSparksOfDestruction() | ||
end | ||
end | ||
return true | ||
end | ||
|
||
shocksDeath:register() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
-- Usage talkaction: "!refill will refill all your amulets and rings for silver tokens" | ||
local refill = TalkAction("!refill") | ||
|
||
local chargeItem = { | ||
["pendulet"] = { noChargeID = 29429, ChargeID = 30344, cost = 2 }, | ||
["sleep shawl"] = { noChargeID = 29428, ChargeID = 30342, cost = 2 }, | ||
["blister ring"] = { noChargeID = 31621, ChargeID = 31557, cost = 2 }, | ||
["theurgic amulet"] = { noChargeID = 30401, ChargeID = 30403, cost = 2 }, | ||
["ring of souls"] = { noChargeID = 32636, ChargeID = 32621, cost = 2 }, | ||
["turtle amulet"] = { noChargeID = 39235, ChargeID = 39233, cost = 2 }, | ||
["spiritthorn ring"] = { noChargeID = 39179, ChargeID = 39177, cost = 5 }, | ||
["alicorn ring"] = { noChargeID = 39182, ChargeID = 39180, cost = 5 }, | ||
["arcanomancer sigil"] = { noChargeID = 39185, ChargeID = 39183, cost = 5 }, | ||
["arboreal ring"] = { noChargeID = 39188, ChargeID = 39187, cost = 5 }, | ||
} | ||
local silverTokenID = 22516 | ||
|
||
function refill.onSay(player, words, param) | ||
logger.debug("!refill executed") | ||
local refilledItems = {} | ||
local totalCost = 0 | ||
for itemName, itemData in pairs(chargeItem) do | ||
local chargeableCount = player:getItemCount(itemData.noChargeID) | ||
local silverTokensCount = player:getItemCount(silverTokenID) | ||
if chargeableCount >= 1 and silverTokensCount >= itemData.cost then | ||
totalCost = totalCost + itemData.cost | ||
table.insert(refilledItems, itemName) | ||
player:removeItem(silverTokenID, itemData.cost) | ||
player:removeItem(itemData.noChargeID, 1) | ||
player:addItem(itemData.ChargeID, 1) | ||
end | ||
end | ||
if #refilledItems == 0 then | ||
player:sendTextMessage(MESSAGE_INFO_DESCR, "You do not have any items to refill or lack silver tokens.") | ||
else | ||
local itemList = table.concat(refilledItems, ", ") | ||
player:sendTextMessage(MESSAGE_INFO_DESCR, "Refilled " .. itemList .. " for a total of " .. totalCost .. " silver tokens.") | ||
end | ||
return true | ||
end | ||
|
||
refill:separator(" ") | ||
refill:groupType("normal") | ||
refill:register() |