┌──────────────────────────────────────────────────┐
│Nome: Sign of Zodiac
│Versão do script: 1.0.0
│Tipo do script: Sistema (Creature Script, Talkaction e Lib)
│Servidor Testado: The Forgotten Server 0.4.0 Doomed Elderberry
│Autor: Lwkass
└──────────────────────────────────────────────────┘
- Características:
~ Bônus em experiencia (Todos recebem 10% a mais)
~ Bônus na defesa contra elemento (Todos absorvem 5%)
~ Cada signo possui um elemento (Fire, Ice, Lighting ou Earth)
~ Signos de Fogo: Aries, Leo e Sagittarius
~ Signos da Terra: Taurus, Virgo e Capricorn
~ Signos da Eletricidade (Ar): Gemini, Libra e Aquarius
~ Signos de Agua: Cancer, Scorpio e Pisces
- Explicando:
Para escolher o signo o player deve colocar o dia e o mês do aniversário e o sistema automaticamente coloca o signo, comando:
!zodiac dia/mês
Só para deixar claro como o sistema funciona, usando de exemplo o signo de Leão (Leo) que é do elemento Fire:
* Se receber um dano do elemento Fire, absorve 5% (modificável) do dano total, ou seja, o dano seria igual a 95% do que seria (dano absorvido indicado por animatedText).
* Se matar um monstro que tenha uma defesa contra Fire maior que 0% ganha bônus de 10% (modificável) da exp total, ou seja, ganha-se 110% (exp extra indicada por animatedText).
Se o signo fosse do elemento Earth, então seria a mesma coisa só que com o elemento Earth, se fosse Ice ou Lighting a mesma coisa.
Pode-se usar o comando !zodiac info para informações.
- Script:
Primeiro, na pasta data/lib (caso a pasta não exista, crie) do seu servidor crie um arquivo Lua com o nome zodiac-Lib.lua (Lib com maiúscula) e salve com isso dentro:
--[[
Sign of Zodiac System
v1.0.0
by: Lwkass (
[email protected])
]]
Zodiac = {
constant = {
OPTION_PERCENT_BLOCK = 5, -- In Percent
OPTION_EXTRA_EXP_RATE = 10, -- In Percent
STORAGE_SIGN = 16161,
elements = {
["Fire"] = { combat = COMBAT_FIREDAMAGE, color = COLOR_ORANGE },
["Earth"] = { combat = COMBAT_EARTHDAMAGE, color = COLOR_LIGHTGREEN },
["Lighting"] = { combat = COMBAT_ENERGYDAMAGE, color = COLOR_TEAL },
["Ice"] = { combat = COMBAT_ICEDAMAGE, color = COLOR_LIGHTBLUE }
}
},
signs = {
["Aries"] = {
date = {"21/03", "20/04"},
element = "Fire"
},
["Taurus"] = {
date = {"21/04", "20/05"},
element = "Earth"
},
["Gemini"] = {
date = {"21/05", "20/06"},
element = "Lighting"
},
["Cancer"] = {
date = {"21/06", "21/07"},
element = "Ice"
},
["Leo"] = {
date = {"22/07", "22/08"},
element = "Fire"
},
["Virgo"] = {
date = {"23/08", "22/09"},
element = "Earth"
},
["Libra"] = {
date = {"23/09", "22/10"},
element = "Lighting"
},
["Scorpio"] = {
date = {"23/10", "21/11"},
element = "Ice"
},
["Sagittarius"] = {
date = {"22/11", "21/12"},
element = "Fire"
},
["Capricorn"] = {
date = {"22/12", "20/01"},
element = "Earth"
},
["Aquarius"] = {
date = {"21/01", "19/02"},
element = "Lighting"
},
["Pisces"] = {
date = {"20/02", "20/03"},
element = "Ice"
}
},
getSignInfo = function (signName)
return Zodiac.signs[signName]
end,
set = function (cid, signName)
setPlayerStorageValue(cid, Zodiac.constant.STORAGE_SIGN, signName)
end,
get = function (cid)
return getPlayerStorageValue(cid, Zodiac.constant.STORAGE_SIGN), Zodiac.getSignInfo(getPlayerStorageValue(cid, Zodiac.constant.STORAGE_SIGN)) or 0
end,
getElement = function (cid)
return Zodiac.getSignInfo(getPlayerStorageValue(cid, Zodiac.constant.STORAGE_SIGN)).element
end,
getSign = function (cid, day, month)
for sign, info in pairs(Zodiac.signs) do
_, _, beginDay, beginMonth = info.date[1]:find("(%d+)/(%d+)")
_, _, endDay, endMonth = info.date[2]:find("(%d+)/(%d+)")
beginDay, beginMonth, endDay, endMonth = tonumber(beginDay), tonumber(beginMonth), tonumber(endDay), tonumber(endMonth)
if ((month == beginMonth and day >= beginDay) or (month == endMonth and day <= endDay)) then
return sign, info
end
end
end
}
Agora na pasta data/creaturescripts/scripts:
No arquivo login.lua adicione isso antes do return:
-- Zodiac
registerCreatureEvent(cid, "zodiacKill")
registerCreatureEvent(cid, "zodiacStats")
if (getPlayerLastLogin(cid) <= 0 or getPlayerStorageValue(cid, 16160) == 1) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Please, when is your birthday date ? (Example: !zodiac day/month = !zodiac 1/2, !zodiac 23/7,...)")
setPlayerStorageValue(cid, 16160, 1) -- Talk state
else
doPlayerSetSpecialDescription(cid, ", sign of " .. getPlayerStorageValue(cid, 16161))
end
E crie esses arquivos:
zodiacKill.lua
dofile('data/lib/zodiac-Lib.lua')
function getMonsterPath(monstername)
f = io.open ("data/monster/monsters.xml", 'r')
for line in f:lines() do
_, _, name, path, file_name = string.find(line, '<monster name="(.+)" file="(.+)/(.+).xml"/>')
if (name and path and file_name and name:lower() == monstername:lower()) then
f:close()
return path .. "/" .. file_name .. ".xml"
end
end
end
function getMonsterElementDefense(monstername, element)
f = io.open ("data/monster/" .. getMonsterPath(monstername), 'r')
for line in f:lines() do
if (string.find(line, '</elements>')) then break end
_, _, n = string.find(line, '<element '.. element:lower() ..'Percent="([-%d]+)"/>')
if (n) then
f:close()
return tonumber(n)
end
end
f:close()
return 0
end
-------
function onKill(cid, target, lastHit)
if (isMonster(target) and getMonsterElementDefense(getCreatureName(target), (Zodiac.getElement(cid) == "Lighting" and "Energy" or Zodiac.getElement(cid))) > 0) then
local exp_bonus = math.ceil(getMonsterInfo(getCreatureName(target)).experience * (Zodiac.constant.OPTION_EXTRA_EXP_RATE/100))
doSendAnimatedText(getThingPos(cid), exp_bonus, COLOR_GREY)
doPlayerAddExperience(cid, exp_bonus)
end
return true
end
zodiacStats.lua
dofile('data/lib/zodiac-Lib.lua')
function onStatsChange(cid, attacker, type, combat, value)
playerSign = Zodiac.get(cid)
if (combat == Zodiac.constant.elements[Zodiac.getElement(cid)].combat) then
valuem = math.ceil(value*(Zodiac.constant.OPTION_PERCENT_BLOCK/100))
doCreatureAddHealth(cid, valuem)
doSendAnimatedText(getThingPos(cid), "+"..valuem, Zodiac.constant.elements[Zodiac.getElement(cid)].color)
end
return true
end
Certo, agora no arquivo data/creaturescripts/creaturescripts.xml, adicione isso:
<event type="statschange" name="zodiacStats" event="script" value="zodiacStats.lua"/>
<event type="kill" name="zodiacKill" event="script" value="zodiacKill.lua"/>
Na pasta data/talkactions/scripts, adicione um arquivo Lua com o nome de zodiacTalk.lua:
dofile('data/lib/zodiac-Lib.lua')
function onSay(cid, words, param, channel)
if (param:len() == 0) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You can use '!zodiac day/month' or '!zodiac info'")
return true
end
playerSign, Info = Zodiac.get(cid)
if (type(playerSign) == "string" and param:lower() == "info") then
doPlayerPopupFYI(cid, [[ Zodiac Informations ~
-------------------------------
* Sign: ]] .. playerSign .. [[
* Element: ]] .. Info.element .. [[
* Bonus:
+]] .. Zodiac.constant.OPTION_EXTRA_EXP_RATE .. [[% experience of ]] .. Zodiac.getElement(cid) .. [[ monsters
+]] .. Zodiac.constant.OPTION_PERCENT_BLOCK .. [[% of defense in attacks with ]] .. Zodiac.getElement(cid) .. [[ element ]])
elseif (getPlayerStorageValue(cid, 16160) == 1) then
_, _, day, month = string.find(param, "(%d+)/(%d+)")
day, month = tonumber(day), tonumber(month)
if (day and month and day > 0 and day <= 31 and month > 0 and month <= 12) then
Zodiac.set(cid, Zodiac.getSign(cid, day, month))
playerSign = Zodiac.get(cid)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, param)
doSendMagicEffect(getThingPos(cid), math.random(28, 30))
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You sign of zodiac is " .. playerSign .. " which is of element " .. Zodiac.getElement(cid) .. " !")
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You can see more information saying '!zodiac info', remember this...")
setPlayerStorageValue(cid, 16160, -1)
else
doPlayerSendCancel(cid, "You put a invalid date.")
end
end
return true
end
Coloque essa tag no arquivo data/talkactions/talkactions.xml
<talkaction words="!zodiac" event="script" value="zodiacTalk.lua"/>