mirror of
https://github.com/otland/forgottenserver
synced 2026-08-15 16:32:07 -04:00
* Move runes to dedicated folder * Redirect old XML and lib folder to new location * Drop unused custom spells
325 lines
6.5 KiB
Lua
325 lines
6.5 KiB
Lua
-- Pre-made areas
|
|
|
|
-- Waves
|
|
AREA_WAVE3 = {
|
|
{1, 1, 1},
|
|
{1, 1, 1},
|
|
{0, 3, 0}
|
|
}
|
|
|
|
AREA_WAVE4 = {
|
|
{1, 1, 1, 1, 1},
|
|
{0, 1, 1, 1, 0},
|
|
{0, 1, 1, 1, 0},
|
|
{0, 0, 3, 0, 0}
|
|
}
|
|
|
|
AREA_WAVE6 = {
|
|
{0, 0, 0, 0, 0},
|
|
{0, 1, 3, 1, 0},
|
|
{0, 0, 0, 0, 0}
|
|
}
|
|
|
|
AREA_WAVE7 = {
|
|
{1, 1, 1, 1, 1},
|
|
{1, 1, 1, 1, 1},
|
|
{0, 1, 1, 1, 0},
|
|
{0, 1, 1, 1, 0},
|
|
{0, 0, 3, 0, 0}
|
|
}
|
|
|
|
AREA_SQUAREWAVE5 = {
|
|
{1, 1, 1},
|
|
{1, 1, 1},
|
|
{1, 1, 1},
|
|
{0, 1, 0},
|
|
{0, 3, 0}
|
|
}
|
|
|
|
AREA_SQUAREWAVE6 = {
|
|
{0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
|
|
{0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
|
|
{0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
|
|
{0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0},
|
|
{0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0},
|
|
{0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0},
|
|
{0, 0, 0, 1, 1, 1, 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, 1, 1, 1, 0, 0, 0, 0},
|
|
{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
|
|
{0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0}
|
|
}
|
|
|
|
AREA_SQUAREWAVE7 = {
|
|
{0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0},
|
|
{0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0},
|
|
{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},
|
|
{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},
|
|
{0, 0, 0, 1, 1, 1, 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, 1, 1, 1, 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, 3, 0, 0, 0, 0, 0}
|
|
}
|
|
|
|
-- Diagonal waves
|
|
AREADIAGONAL_WAVE4 = {
|
|
{0, 0, 0, 0, 1, 0},
|
|
{0, 0, 0, 1, 1, 0},
|
|
{0, 0, 1, 1, 1, 0},
|
|
{0, 1, 1, 1, 1, 0},
|
|
{1, 1, 1, 1, 1, 0},
|
|
{0, 0, 0, 0, 0, 3}
|
|
}
|
|
|
|
AREADIAGONAL_SQUAREWAVE5 = {
|
|
{1, 1, 1, 0, 0},
|
|
{1, 1, 1, 0, 0},
|
|
{1, 1, 1, 0, 0},
|
|
{0, 0, 0, 1, 0},
|
|
{0, 0, 0, 0, 3}
|
|
}
|
|
|
|
AREADIAGONAL_WAVE6 = {
|
|
{0, 0, 1},
|
|
{0, 3, 0},
|
|
{1, 0, 0}
|
|
}
|
|
|
|
AREADIAGONAL_WAVE7 = {
|
|
{0, 0, 0, 0, 0, 1, 0},
|
|
{0, 0, 0, 0, 1, 1, 0},
|
|
{0, 0, 0, 1, 1, 1, 0},
|
|
{0, 0, 1, 1, 1, 1, 0},
|
|
{0, 1, 1, 1, 1, 1, 0},
|
|
{1, 1, 1, 1, 1, 1, 0},
|
|
{0, 0, 0, 0, 0, 0, 3}
|
|
}
|
|
|
|
-- Beams
|
|
AREA_BEAM1 = {
|
|
{3}
|
|
}
|
|
|
|
AREA_BEAM5 = {
|
|
{1},
|
|
{1},
|
|
{1},
|
|
{1},
|
|
{3}
|
|
}
|
|
|
|
AREA_BEAM7 = {
|
|
{1},
|
|
{1},
|
|
{1},
|
|
{1},
|
|
{1},
|
|
{1},
|
|
{3}
|
|
}
|
|
|
|
AREA_BEAM8 = {
|
|
{1},
|
|
{1},
|
|
{1},
|
|
{1},
|
|
{1},
|
|
{1},
|
|
{1},
|
|
{3}
|
|
}
|
|
|
|
-- Diagonal Beams
|
|
AREADIAGONAL_BEAM5 = {
|
|
{1, 0, 0, 0, 0},
|
|
{0, 1, 0, 0, 0},
|
|
{0, 0, 1, 0, 0},
|
|
{0, 0, 0, 1, 0},
|
|
{0, 0, 0, 0, 3}
|
|
}
|
|
|
|
AREADIAGONAL_BEAM7 = {
|
|
{1, 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, 0, 0, 1, 0, 0},
|
|
{0, 0, 0, 0, 0, 1, 0},
|
|
{0, 0, 0, 0, 0, 0, 3}
|
|
}
|
|
|
|
-- Circles
|
|
AREA_CIRCLE2X2 = {
|
|
{0, 1, 1, 1, 0},
|
|
{1, 1, 1, 1, 1},
|
|
{1, 1, 3, 1, 1},
|
|
{1, 1, 1, 1, 1},
|
|
{0, 1, 1, 1, 0}
|
|
}
|
|
|
|
AREA_CIRCLE3X3 = {
|
|
{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}
|
|
}
|
|
|
|
-- Crosses
|
|
AREA_CROSS1X1 = {
|
|
{0, 1, 0},
|
|
{1, 3, 1},
|
|
{0, 1, 0}
|
|
}
|
|
|
|
AREA_CIRCLE5X5 = {
|
|
{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0},
|
|
{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},
|
|
{0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0},
|
|
{0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
|
|
{0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
|
|
{1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1},
|
|
{0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
|
|
{0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
|
|
{0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0},
|
|
{0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0},
|
|
{0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0}
|
|
}
|
|
|
|
AREA_CIRCLE6X6 = {
|
|
{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, 1, 1, 1, 1, 1, 1, 0, 0},
|
|
{0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
|
|
{0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
|
|
{1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1},
|
|
{0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
|
|
{0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
|
|
{0, 0, 1, 1, 1, 1, 1, 1, 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}
|
|
}
|
|
|
|
-- Squares
|
|
AREA_SQUARE1X1 = {
|
|
{1, 1, 1},
|
|
{1, 3, 1},
|
|
{1, 1, 1}
|
|
}
|
|
|
|
-- Walls
|
|
AREA_WALLFIELD = {
|
|
{1, 1, 3, 1, 1}
|
|
}
|
|
|
|
AREADIAGONAL_WALLFIELD = {
|
|
{0, 0, 0, 0, 1},
|
|
{0, 0, 0, 1, 1},
|
|
{0, 1, 3, 1, 0},
|
|
{1, 1, 0, 0, 0},
|
|
{1, 0, 0, 0, 0},
|
|
}
|
|
|
|
-- This array contains all destroyable field items
|
|
FIELDS = {1487, 1488, 1489, 1490, 1491, 1492, 1493, 1494, 1495, 1496, 1500, 1501, 1502, 1503, 1504}
|
|
|
|
function Player:addPartyCondition(combat, variant, condition, baseMana)
|
|
local party = self:getParty()
|
|
if not party then
|
|
self:sendCancelMessage(RETURNVALUE_NOPARTYMEMBERSINRANGE)
|
|
self:getPosition():sendMagicEffect(CONST_ME_POFF)
|
|
return false
|
|
end
|
|
|
|
local positions = combat:getPositions(self, variant)
|
|
local members = party:getMembers()
|
|
members[#members + 1] = party:getLeader()
|
|
|
|
local affectedMembers = {}
|
|
for _, member in ipairs(members) do
|
|
local memberPosition = member:getPosition()
|
|
for _, position in ipairs(positions) do
|
|
if memberPosition == position then
|
|
affectedMembers[#affectedMembers + 1] = member
|
|
end
|
|
end
|
|
end
|
|
|
|
if #affectedMembers <= 1 then
|
|
self:sendCancelMessage(RETURNVALUE_NOPARTYMEMBERSINRANGE)
|
|
self:getPosition():sendMagicEffect(CONST_ME_POFF)
|
|
return false
|
|
end
|
|
|
|
local mana = math.ceil(#affectedMembers * math.pow(0.9, #affectedMembers - 1) * baseMana)
|
|
if self:getMana() < mana then
|
|
self:sendCancelMessage(RETURNVALUE_NOTENOUGHMANA)
|
|
self:getPosition():sendMagicEffect(CONST_ME_POFF)
|
|
return false
|
|
end
|
|
|
|
self:addMana(-mana)
|
|
self:addManaSpent(mana)
|
|
|
|
for _, member in ipairs(affectedMembers) do
|
|
member:addCondition(condition)
|
|
end
|
|
|
|
for _, position in ipairs(positions) do
|
|
position:sendMagicEffect(CONST_ME_MAGIC_BLUE)
|
|
end
|
|
return true
|
|
end
|
|
|
|
function Player:conjureItem(reagentId, conjureId, conjureCount, effect)
|
|
if not conjureCount and conjureId ~= 0 then
|
|
local itemType = ItemType(conjureId)
|
|
if itemType:getId() == 0 then
|
|
return false
|
|
end
|
|
|
|
local charges = itemType:getCharges()
|
|
if charges ~= 0 then
|
|
conjureCount = charges
|
|
end
|
|
end
|
|
|
|
if reagentId ~= 0 and not self:removeItem(reagentId, 1, -1) then
|
|
self:sendCancelMessage(RETURNVALUE_YOUNEEDAMAGICITEMTOCASTSPELL)
|
|
self:getPosition():sendMagicEffect(CONST_ME_POFF)
|
|
return false
|
|
end
|
|
|
|
local item = self:addItem(conjureId, conjureCount)
|
|
if not item then
|
|
self:sendCancelMessage(RETURNVALUE_NOTPOSSIBLE)
|
|
self:getPosition():sendMagicEffect(CONST_ME_POFF)
|
|
return false
|
|
end
|
|
|
|
if item:hasAttribute(ITEM_ATTRIBUTE_DURATION) then
|
|
item:decay()
|
|
end
|
|
|
|
self:getPosition():sendMagicEffect(item:getType():isRune() and CONST_ME_MAGIC_RED or effect)
|
|
return true
|
|
end
|
|
|
|
function Creature:addAttributeCondition(parameters)
|
|
local condition = Condition(CONDITION_ATTRIBUTES)
|
|
for _, parameter in ipairs(parameters) do
|
|
if parameter.key and parameter.value then
|
|
condition:setParameter(parameter.key, parameter.value)
|
|
end
|
|
end
|
|
|
|
self:addCondition(condition)
|
|
end
|