Boa VodKart, u.u Vo testa aki Mais Ja tem me REP+
- Fórum
- OTServ
- Recursos
- Scripting
- Mods, funções e outros
- [Mod] Automatic Raids [Dia E Hora Marcada]
[Mod] Automatic Raids [Dia E Hora Marcada]
Por Vodkart, 29 de mai. de 2012 em Mods, funções e outros
info
Grupo: Herói
Registrado: 25/10/11
Posts: 2.2k
Reputação: +862
Gênero: Masculino
Char no Tibia: Sociopata

info
Grupo: Banidos
Registrado: 21/01/12
Posts: 842
Reputação: +234
Char no Tibia: Stephan

assim fica extremamente melhor porque é muito mais facil de configurar e da pra entender facil, reputado.
Muito bom vodkart, ira melhorar muito a vida dos criadores de otserver
rep+
info
Grupo: Artesão
Registrado: 03/08/07
Posts: 129
Reputação: +12
Gênero: Masculino

O Mod ocorre um erro quando é adicionado todos os dias da semana...
Meu Script
<?xml version="1.0" encoding="UTF-8"?>
<mod name="Automatic Raids" version="1.0" author="Vodkart And xotservx"
contact="xtibia.com" enabled="yes">
<config name="raids_func"><![CDATA[
days = {
["Monday"] = {
["21:45"] = {nome = "Pirate", pos = {fromPosition = {x=1909, y=598,
z=4},toPosition = {x=1911, y=599, z=4}},m = {"1 Deadeye Devious","1 Ron the
Ripper","1 Brutus Bloodbeard","1 Lethal Lissy","1 Captain Jones"}, Time = 300},
["01:00"] = {nome = "The Plasmother", pos = {fromPosition = {x=1175, y=986,
z=8},toPosition = {x=1180, y=991, z=8}}, m = {"1 The Plasmother"}, Time = 300}
},
["Tuesday"] = {
["10:30"] = {nome = "The old Window", pos = {fromPosition = {x=1697, y=867,
z=9},toPosition = {x=1696, y=867, z=9}}, m = {"1 The old Window "}, Time = 300},
["22:00"] = {nome = "Massacre", pos = {fromPosition = {x=1149, y=1047,
z=4},toPosition = {x=1150, y=1048, z=4}}, m = {"1 Massacre"}, Time = 300},
["17:39"] = {nome = "Massacre", pos = {fromPosition = {x=1435, y=1096,
z=7},toPosition = {x=1436, y=1096, z=7}}, m = {"1 Massacre"}, Time = 300}
},
["Wednesday"] = {
["20:30"] = {nome = "Morgaroth", pos = {fromPosition = {x=1685, y=1291,
z=15},toPosition = {x=1684, y=1291, z=15}},m = {"1 Morgaroth"}, Time = 300},
["00:00"] = {nome = "Necropharus", pos = {fromPosition = {x=1932, y=1136,
z=7},toPosition = {x=1931, y=1136, z=7}}, m = {"1 Necropharus"}, Time = 300}
},
["Thursday"] = {
["23:00"] = {nome = "Ghazbaran", pos = {fromPosition = {x=1724, y=1428,
z=9},toPosition = {x=1723, y=1428, z=9}},m = {"1 Ghazbaran"}, Time = 300},
["00:00"] = {nome = "Mr. Punish", pos = {fromPosition = {x=1238, y=1046,
z=11},toPosition = {x=1240, y=1047, z=11}}, m = {"1 Mr. Punish"}, Time = 300}
},
["Friday"] = {
["19:45"] = {nome = "Dracola", pos = {fromPosition = {x=1303, y=1001,
z=9},toPosition = {x=1306, y=1002, z=9}},m = {"1 Dracola"}, Time = 300},
["00:00"] = {nome = "Mr. Punish", pos = {fromPosition = {x=1238, y=1046,
z=11},toPosition = {x=1240, y=1047, z=11}}, m = {"1 Mr. Punish"}, Time = 300},
["21:00"] = {nome = "Ferumbras", pos = {fromPosition = {x=184, y=55,
z=7},toPosition = {x=188, y=58, z=7}}, m = {"1 Ferumbras", "8 Fire Devil"}, Time =
300}
},
["Saturday"] = {
["23:00"] = {nome = "Ghazbaran", pos = {fromPosition = {x=1724, y=1428,
z=9},toPosition = {x=1725, y=1428, z=9}},m = {"1 Ghazbaran"}, Time = 300},
["19:00"] = {nome = "Orshabaal", pos = {fromPosition = {x=1687, y=1006,
z=8},toPosition = {x=1689, y=1006, z=8}}, m = {"1 Orshabaal"}, Time = 300},
["19:00"] = {nome = "Necropharus", pos = {fromPosition = {x=1932, y=1136,
z=7},toPosition = {x=1931, y=1136, z=7}}, m = {"1 Necropharus, "4 Necromancer"},
Time = 300}
},
["Sunday"] = {
["21:00"] = {nome = "Ferumbras", pos = {fromPosition = {x=184, y=55,
z=7},toPosition = {x=188, y=58, z=7}}, m = {"1 Ferumbras", "8 Fire Devil"}, Time =
300},
["23:00"] = {nome = "Morgaroth", pos = {fromPosition = {x=1844, y=1332,
z=13},toPosition = {x=1845, y=1332, z=13}}, m = {"1 Morgaroth"}, Time = 300},
["15:00"] = {nome = "Tiquandas Revenge", pos = {fromPosition = {x=1731, y=987,
z=7},toPosition = {x=1751, y=999, z=7}}, m = {"2 Tiquandas Revenge"}, Time = 300}
}
}
]]></config>
<globalevent name="AutomaticRaids" interval="60000" event="script"><![CDATA[
domodlib('raids_func')
function onThink(interval, lastExecution)
hours = tostring(os.date("%X")):sub(1, 5)
tb = days[os.date("%A")][hours]
if days[os.date("%A")] and tb then
function removeCreature(tb)
for x = ((tb.pos.fromPosition.x)-10), ((tb.pos.toPosition.x)+10) do
for y = ((tb.pos.fromPosition.y)-10), ((tb.pos.toPosition.y)+10) do
local m = getTopCreature({x=x, y=y, z= tb.pos.fromPosition.z}).uid
if m ~= 0 and isMonster(m) then
doRemoveCreature(m)
end
end
end
end
doBroadcastMessage("The invasion of " .. tb.nome .. " started")
for _,x in pairs(tb.m) do
for s = 1, tonumber(x:match("%d+")) do
pos = {x = math.random(tb.pos.fromPosition.x, tb.pos.toPosition.x), y =
math.random(tb.pos.fromPosition.y, tb.pos.toPosition.y), z =
tb.pos.fromPosition.z}
doSummonCreature(x:match("%s(.+)"), pos)
end
end
addEvent(removeCreature, tb.Time*60*1000, tb)
end
return true
end
]]></globalevent>
</mod>
Editado Maio 29 por adolfuu
Vod, me diz uma coisa... se eu FECHO o servidor e REABRO depois, as invasão ocorrerão nos mesmos dias nas horas marcadas, ou interfere no espaço de tempo?
info
Grupo: Herói
Registrado: 20/05/10
Posts: 3.4k
Reputação: +1.5k
Gênero: Masculino

@up
não interfere, relaxa,
@adolfuu
o erro ali diz que não pode criar o monstro "Fire Devil", com o /m ele cria?
da uma olhada pra mim
info
Grupo: Artesão
Registrado: 03/08/07
Posts: 129
Reputação: +12
Gênero: Masculino

Sim, ele cria sim com o /m
info
Grupo: Herói
Registrado: 20/05/10
Posts: 3.4k
Reputação: +1.5k
Gênero: Masculino

Sim, ele cria sim com o /m
já vi seu erro, olha nessa parte
["21:00"] = {nome = "Ferumbras", pos = {fromPosition = {x=184, y=55,z=7},toPosition = {x=188, y=58, z=7}}, m = {"1 Ferumbras", "8 Fire Devil"}, Time =300}
esqueceu de mudar as pos.
e outra você tem que usar diferentes horarios
["19:00"] = {nome = "Orshabaal", pos = {fromPosition = {x=1687, y=1006,z=8},toPosition = {x=1689, y=1006, z=8}}, m = {"1 Orshabaal"}, Time = 300},
["19:00"] = {nome = "Necropharus", pos = {fromPosition = {x=1932, y=1136,z=7},toPosition = {x=1931, y=1136, z=7}}, m = {"1 Necropharus, "4 Necromancer"},Time = 300}
ex:
19:00
19:01
nunca igual
tirei os que estavam bugando no seu, aqui está:
só revisar os que estavam errados e adiconar
obs: não esquece de mudar a tag ali no global events, deixei 60
Editado Maio 29 por Vodkart
info
Grupo: Artesão
Registrado: 03/08/07
Posts: 129
Reputação: +12
Gênero: Masculino

Arrumei tudo que você falou.. Mas ainda assim está dando outro erro :S
<?xml version="1.0" encoding="UTF-8"?>
<mod name="Automatic Raids" version="1.0" author="Vodkart And xotservx"
contact="xtibia.com" enabled="yes">
<config name="raids_func"><![CDATA[
days = {
["Monday"] = {
["21:41"] = {nome = "Pirate", pos = {fromPosition = {x=1909, y=598,z=4},toPosition
= {x=1911, y=599, z=4}},m = {"1 Deadeye Devious","1 Ron the Ripper","1 Brutus
Bloodbeard","1 Lethal Lissy","1 Captain Jones"}, Time = 300},
["01:01"] = {nome = "The Plasmother", pos = {fromPosition = {x=1175,
y=986,z=8},toPosition = {x=1180, y=991, z=8}}, m = {"1 The Plasmother"}, Time =
300}
},
["Tuesday"] = {
["10:31"] = {nome = "The old Window", pos = {fromPosition = {x=1697,
y=867,z=9},toPosition = {x=1696, y=867, z=9}}, m = {"1 The old Window "}, Time =
300},
["22:01"] = {nome = "Massacre", pos = {fromPosition = {x=1149,
y=1047,z=4},toPosition = {x=1150, y=1048, z=4}}, m = {"1 Massacre"}, Time = 300},
["17:39"] = {nome = "Massacre", pos = {fromPosition = {x=1435,
y=1096,z=7},toPosition = {x=1436, y=1096, z=7}}, m = {"1 Massacre"}, Time = 300}
},
["Wednesday"] = {
["02:12"] = {nome = "Morgaroth", pos = {fromPosition = {x=1685,
y=1291,z=15},toPosition = {x=1684, y=1291, z=15}},m = {"1 Morgaroth"}, Time =
300},
["00:01"] = {nome = "Necropharus", pos = {fromPosition = {x=1932,
y=1136,z=7},toPosition = {x=1931, y=1136, z=7}}, m = {"1 Necropharus"}, Time =
300}
},
["Thursday"] = {
["23:00"] = {nome = "Ghazbaran", pos = {fromPosition = {x=1724,
y=1428,z=9},toPosition = {x=1723, y=1428, z=9}},m = {"1 Ghazbaran"}, Time = 300},
["00:00"] = {nome = "Mr. Punish", pos = {fromPosition = {x=1238,
y=1046,z=11},toPosition = {x=1240, y=1047, z=11}}, m = {"1 Mr. Punish"}, Time =
300}
},
["Friday"] = {
["19:45"] = {nome = "Dracola", pos = {fromPosition = {x=1303,
y=1001,z=9},toPosition = {x=1306, y=1002, z=9}},m = {"1 Dracola"}, Time = 300},
["00:00"] = {nome = "Mr. Punish", pos = {fromPosition = {x=1238,
y=1046,z=11},toPosition = {x=1240, y=1047, z=11}}, m = {"1 Mr. Punish"}, Time =
300},
},
["Saturday"] = {
["23:00"] = {nome = "Ghazbaran", pos = {fromPosition = {x=1724,
y=1428,z=9},toPosition = {x=1725, y=1428, z=9}},m = {"1 Ghazbaran"}, Time = 300},
["19:02"] = {nome = "Orshabaal", pos = {fromPosition = {x=1687,
y=1006,z=8},toPosition = {x=1689, y=1006, z=8}}, m = {"1 Orshabaal"}, Time = 300},
},
["Sunday"] = {
["21:00"] = {nome = "Ferumbras", pos = {fromPosition = {x=184,
y=55,z=7},toPosition = {x=188, y=58, z=7}}, m = {"1 Ferumbras"}, Time =300},
["23:02"] = {nome = "Morgaroth", pos = {fromPosition = {x=1844,
y=1332,z=13},toPosition = {x=1845, y=1332, z=13}}, m = {"1 Morgaroth"}, Time =
300},
["15:00"] = {nome = "Tiquandas Revenge", pos = {fromPosition = {x=1731,
y=987,z=7},toPosition = {x=1751, y=999, z=7}}, m = {"2 Tiquandas Revenge"}, Time =
300}
}
}
]]></config>
<globalevent name="AutomaticRaids" interval="60000" event="script"><![CDATA[
domodlib('raids_func')
function onThink(interval, lastExecution)
hours = tostring(os.date("%X")):sub(1, 5)
tb = days[os.date("%A")][hours]
if days[os.date("%A")] and tb then
function removeCreature(tb)
for x = ((tb.pos.fromPosition.x)-10), ((tb.pos.toPosition.x)+10) do
for y = ((tb.pos.fromPosition.y)-10), ((tb.pos.toPosition.y)+10) do
local m = getTopCreature({x=x, y=y, z= tb.pos.fromPosition.z}).uid
if m ~= 0 and isMonster(m) then
doRemoveCreature(m)
end
end
end
end
doBroadcastMessage("The invasion of " .. tb.nome .. " started")
for _,x in pairs(tb.m) do
for s = 1, tonumber(x:match("%d+")) do
pos = {x = math.random(tb.pos.fromPosition.x, tb.pos.toPosition.x), y =
math.random(tb.pos.fromPosition.y, tb.pos.toPosition.y), z =tb.pos.fromPosition.z}
doSummonCreature(x:match("%s(.+)"), pos)
end
end
addEvent(removeCreature, tb.Time*60*1000, tb)
end
return true
end
]]></globalevent>
</mod>
info
Grupo: Herói
Registrado: 20/05/10
Posts: 3.4k
Reputação: +1.5k
Gênero: Masculino

@TOPIC
galera tinha um bug, mas já foi removido, usem o novo.
@adolfuu, cara vc tem que identar o script, não pode ter quebra de linha como você me mandou
<?xml version="1.0" encoding="UTF-8"?>
<mod name="Automatic Raids" version="1.0" author="Vodkart And xotservx" contact="xtibia.com" enabled="yes">
<config name="raids_func"><![CDATA[
days = {
["Monday"] = {
["21:41"] = {nome = "Pirate", pos = {fromPosition = {x=1909, y=598,z=4},toPosition = {x=1911, y=599, z=4}},m = {"1 Deadeye Devious","1 Ron the Ripper","1 Brutus Bloodbeard","1 Lethal Lissy","1 Captain Jones"}, Time = 300},
["01:01"] = {nome = "The Plasmother", pos = {fromPosition = {x=1175, y=986,z=8},toPosition = {x=1180, y=991, z=8}}, m = {"1 The Plasmother"}, Time = 300}
},
["Tuesday"] = {
["10:31"] = {nome = "The old Window", pos = {fromPosition = {x=1697, y=867,z=9},toPosition = {x=1696, y=867, z=9}}, m = {"1 The old Window "}, Time = 300},
["22:01"] = {nome = "Massacre", pos = {fromPosition = {x=1149, y=1047,z=4},toPosition = {x=1150, y=1048, z=4}}, m = {"1 Massacre"}, Time = 300},
["17:39"] = {nome = "Massacre", pos = {fromPosition = {x=1435, y=1096,z=7},toPosition = {x=1436, y=1096, z=7}}, m = {"1 Massacre"}, Time = 300}
},
["Wednesday"] = {
["02:12"] = {nome = "Morgaroth", pos = {fromPosition = {x=1685, y=1291,z=15},toPosition = {x=1684, y=1291, z=15}},m = {"1 Morgaroth"}, Time = 300},
["00:01"] = {nome = "Necropharus", pos = {fromPosition = {x=1932, y=1136,z=7},toPosition = {x=1931, y=1136, z=7}}, m = {"1 Necropharus"}, Time = 300}
},
["Thursday"] = {
["23:00"] = {nome = "Ghazbaran", pos = {fromPosition = {x=1724, y=1428,z=9},toPosition = {x=1723, y=1428, z=9}},m = {"1 Ghazbaran"}, Time = 300},
["00:00"] = {nome = "Mr. Punish", pos = {fromPosition = {x=1238, y=1046,z=11},toPosition = {x=1240, y=1047, z=11}}, m = {"1 Mr. Punish"}, Time = 300}
},
["Friday"] = {
["19:45"] = {nome = "Dracola", pos = {fromPosition = {x=1303, y=1001,z=9},toPosition = {x=1306, y=1002, z=9}},m = {"1 Dracola"}, Time = 300},
["00:00"] = {nome = "Mr. Punish", pos = {fromPosition = {x=1238, y=1046,z=11},toPosition = {x=1240, y=1047, z=11}}, m = {"1 Mr. Punish"}, Time = 300},
},
["Saturday"] = {
["23:00"] = {nome = "Ghazbaran", pos = {fromPosition = {x=1724, y=1428,z=9},toPosition = {x=1725, y=1428, z=9}},m = {"1 Ghazbaran"}, Time = 300},
["19:02"] = {nome = "Orshabaal", pos = {fromPosition = {x=1687, y=1006,z=8},toPosition = {x=1689, y=1006, z=8}}, m = {"1 Orshabaal"}, Time = 300},
},
["Sunday"] = {
["21:00"] = {nome = "Ferumbras", pos = {fromPosition = {x=184, y=55,z=7},toPosition = {x=188, y=58, z=7}}, m = {"1 Ferumbras"}, Time =300},
["23:02"] = {nome = "Morgaroth", pos = {fromPosition = {x=1844, y=1332,z=13},toPosition = {x=1845, y=1332, z=13}}, m = {"1 Morgaroth"}, Time = 300},
["15:00"] = {nome = "Tiquandas Revenge", pos = {fromPosition = {x=1731, y=987,z=7},toPosition = {x=1751, y=999, z=7}}, m = {"2 Tiquandas Revenge"}, Time = 300}
}
}
]]></config>
<globalevent name="AutomaticRaids" interval="60000" event="script"><![CDATA[
domodlib('raids_func')
function onThink(interval, lastExecution)
if days[os.date("%A")] then
hours = tostring(os.date("%X")):sub(1, 5)
tb = days[os.date("%A")][hours]
if tb then
function removeCreature(tb)
for x = ((tb.pos.fromPosition.x)-10), ((tb.pos.toPosition.x)+10) do
for y = ((tb.pos.fromPosition.y)-10), ((tb.pos.toPosition.y)+10) do
local m = getTopCreature({x=x, y=y, z= tb.pos.fromPosition.z}).uid
if m ~= 0 and isMonster(m) then
doRemoveCreature(m)
end
end
end
end
doBroadcastMessage("The invasion of " .. tb.nome .. " started")
for _,x in pairs(tb.m) do
for s = 1, tonumber(x:match("%d+")) do
pos = {x = math.random(tb.pos.fromPosition.x, tb.pos.toPosition.x), y = math.random(tb.pos.fromPosition.y, tb.pos.toPosition.y), z = tb.pos.fromPosition.z}
doSummonCreature(x:match("%s(.+)"), pos)
end
end
addEvent(removeCreature, tb.Time*60*1000, tb)
end
end
return true
end
]]></globalevent>
</mod>
outra coisa, da uma olhada na área, as vezes você colocou a pos errada
Editado Maio 30 por Vodkart
info
Grupo: Artesão
Registrado: 03/08/07
Posts: 129
Reputação: +12
Gênero: Masculino

Vodkat, tentei fazer do zero. Peguei seu script novo e mudei certinho, botei pos corretas e a data Wednesday. O estranho é que quando eu tentei a primeira vez com Tuesday funciou. Será que não é algo errado na data Wednesday?
info
Grupo: Herói
Registrado: 20/05/10
Posts: 3.4k
Reputação: +1.5k
Gênero: Masculino

me manda seu msn que eu vou dar uma olhada
info
Grupo: Artesão
Registrado: 03/08/07
Posts: 129
Reputação: +12
Gênero: Masculino

adolfohrq@live.com







info
Grupo: Herói
Registrado: 20/05/10
Posts: 3.4k
Reputação: +1.5k
Gênero: Masculino
Automatic Raids.xml
<?xml version="1.0" encoding="UTF-8"?> <mod name="Automatic Raids" version="1.0" author="Vodkart And xotservx" contact="xtibia.com" enabled="yes"> <config name="raids_func"><![CDATA[ days = { ["Monday"] = { ["21:30"] = {nome = "Orshabaal", pos = {fromPosition = {x=184, y=55, z=7},toPosition = {x=188, y=58, z=7}},m = {"5 Fire Devil", "2 Orshabaal"}, Time = 15}, ["21:33"] = {nome = "Dragon", pos = {fromPosition = {x=197, y=57, z=7},toPosition = {x=203, y=60, z=7}},m = {"100 Dragon"}, Time = 20} }, ["Sunday"] = { ["10:08"] = {nome = "Demon", pos = {fromPosition = {x=202, y=11, z=7},toPosition = {x=204, y=12, z=7}}, m = {"1 Demon"}, Time = 15}, ["10:46"] = {nome = "Hydra", pos = {fromPosition = {x=197, y=57, z=7},toPosition = {x=203, y=60, z=7}}, m = {"7 Hydra", "4 Cyclops"}, Time = 20} } } ]]></config> <globalevent name="AutomaticRaids" interval="60" event="script"><![CDATA[ domodlib('raids_func') function onThink(interval, lastExecution) if days[os.date("%A")] then hours = tostring(os.date("%X")):sub(1, 5) tb = days[os.date("%A")][hours] if tb then function removeCreature(tb) for x = ((tb.pos.fromPosition.x)-10), ((tb.pos.toPosition.x)+10) do for y = ((tb.pos.fromPosition.y)-10), ((tb.pos.toPosition.y)+10) do local m = getTopCreature({x=x, y=y, z= tb.pos.fromPosition.z}).uid if m ~= 0 and isMonster(m) then doRemoveCreature(m) end end end end doBroadcastMessage("The invasion of " .. tb.nome .. " started") for _,x in pairs(tb.m) do for s = 1, tonumber(x:match("%d+")) do pos = {x = math.random(tb.pos.fromPosition.x, tb.pos.toPosition.x), y = math.random(tb.pos.fromPosition.y, tb.pos.toPosition.y), z = tb.pos.fromPosition.z} doSummonCreature(x:match("%s(.+)"), pos) end end addEvent(removeCreature, tb.Time*60*1000, tb) end end return true end ]]></globalevent> </mod>Configuração:
days = { ["Monday"] = { ["21:30"] = {nome = "Orshabaal", pos = {fromPosition = {x=184, y=55, z=7},toPosition = {x=188, y=58, z=7}},m = {"5 Fire Devil", "2 Orshabaal"}, Time = 1}, ["21:33"] = {nome = "Dragon", pos = {fromPosition = {x=197, y=57, z=7},toPosition = {x=203, y=60, z=7}},m = {"100 Dragon"}, Time = 2} }, ["Tuesday"] = { ["10:44"] = {nome = "Demon", pos = {fromPosition = {x=184, y=55, z=7},toPosition = {x=188, y=58, z=7}}, m = {"5 Demon", "8 Fire Devil"}, Time = 1}, ["10:46"] = {nome = "Hydra", pos = {fromPosition = {x=197, y=57, z=7},toPosition = {x=203, y=60, z=7}}, m = {"7 Hydra", "4 Cyclops"}, Time = 2} } }["DIA"] = { ["HORA DA INVASÃO"] = {nome = "NOME DA INVASÃO", pos = {começo e final da área}, monster = {"MONSTROS"}, Time = para remover os monstro} }O dia da invasão é colocada entre " " e somente dia em inglês e a primeira letra maiúscula, exemplo:
Depois são as hora da invasão, que é colocada entre " " e somente a hora e minuto, segundos não precisa exemplo:
As Posições estão entre { } adicionando as posições x, y e z, é o começo e final da área exemplo:
pos = {fromPosition = {x=197, y=57, z=7},toPosition = {x=203, y=60, z=7}}fromPosition -- começo da área onde vai acontecer a raid
toPosition -- final da área onde vai acontecer a raid
Os monters tem um modo especial de configurar, vc coloca entre { }, e cada monstro entre " ", e entre as " " vc adiciona "QUANTIDADE MONSTRO", e para adicionar mais tipos de monstro se separa por virgulas, exemplo:
{"40 Water Elemental", "5 Cyclops"}Time é uma função extra, é para caso ninguém participe do evento os monstros não fiquem pelo mapa, e é em minutos, exemplo:
Editado Junho 4 por Vodkart