Oi.
Antes de tudo, este sistema foi escrito para o servidor PDA by Slicer, versão 1.9. A adaptação para outras bases pode ser bem simples, dependendo do seu conhecimento em Lua (que na verdade nem precisa ser grande).
Resolvi escrever este simples sistema porque me deu um certo desgosto ver vários servidores onde a mega evolução é literalmente uma evolução (inclusive o que estive jogando, onde alguns jogadores também concordaram com minha opinião). Quero dizer, o pokémon fica transformado direto, para sempre, forever, algo que contraria a ideia original.
Optei por fazer o sistema igual (ou semelhante, já que me baseei apenas nas informações disponíveis no Blog PxG, que aliás são poucas) ao da PokeXGames. Mais futuramente, no entanto, posso fazer uma outra versão voltada a ideia de uma mega evolução temporária.
Para quem não conhece o sistema, bem, estou com preguiça de explicar, logo recomendo acessar este link. A diferença é que a pedra (mega stone) não ocupa o espaço de um Held Item tier Y (visto que não são todos os servidores que possuem este sistema).
O sistema, como poderão notar, possui muitos detalhes. O motivo é que tenho a tendência de deixar a configuração o menor possível. Ou seja, basta configurar o efeito no código da spell e a tabela das mega evoluções.
Nossa, que textão.
TL;DR: Igual ao sistema da PxG; PDA; muitos detalhes mas pouquíssima configuração.
data/lib:
cooldown bar.lua:
Troque o código da função getNewMoveTable(table, n) por este:
function getNewMoveTable(table, n)
if table == nil then
return false
end
local moves = {table.move1, table.move2, table.move3, table.move4, table.move5, table.move6, table.move7, table.move8, table.move9, table.move10, table.move11, table.move12}
local returnValue = moves
if n then
returnValue = moves[n]
end
return returnValue
end
No código da função doUpdateMoves(cid), troque o segundo:
table.insert(ret, "n/n,")
Por:
local mEvolve
if not getCreatureName(summon):find("Mega") and getItemAttribute(getPlayerSlotItem(cid, 8).uid, "megaStone") then
if not isInArray(ret, "Mega Evolution,") then
table.insert(ret, "Mega Evolution,")
mEvolve = true
end
end
if not mEvolve then
table.insert(ret, "n/n,")
end
Depois, em pokemon moves.lua:
Troque:
min = getSpecialAttack(cid) * table.f * 0.1 --alterado v1.6
por:
min = getSpecialAttack(cid) * (table and table.f or 0) * 0.1 --alterado v1.6
Código da spell:
elseif spell == "Mega Evolution" then
local effect = xxx --Efeito de mega evolução.
if isSummon(cid) then
local pid = getCreatureMaster(cid)
if isPlayer(pid) then
local ball = getPlayerSlotItem(pid, 8).uid
if ball > 0 then
local attr = getItemAttribute(ball, "megaStone")
if attr and megaEvolutions[attr] then
local oldPosition, oldLookdir = getThingPos(cid), getCreatureLookDir(cid)
doItemSetAttribute(ball, "poke", megaEvolutions[attr][2])
doSendMagicEffect(getThingPos(cid), effect)
doRemoveCreature(cid)
doSummonMonster(pid, megaEvolutions[attr][2])
local newPoke = getCreatureSummons(pid)[1]
doTeleportThing(newPoke, oldPosition, false)
doCreatureSetLookDir(newPoke, oldLookdir)
adjustStatus(newPoke, ball, true, false)
if useKpdoDlls then
addEvent(doUpdateMoves, 5, pid)
end
end
end
end
end
Depois, em configuration.lua:
megaEvolutions = {
--[itemid] = {"poke_name", "mega_evolution"},
[11638] = {"Charizard", "Mega Charizard X"},
[11639] = {"Charizard", "Mega Charizard Y"},
}
Agora, em data/actions/scripts, código da mega stone:
function onUse(cid, item)
local mEvolution, ball = megaEvolutions[item.itemid], getPlayerSlotItem(cid, 8).uid
if not mEvolution then
return doPlayerSendCancel(cid, "Sorry, this isn't a mega stone.")
elseif ball < 1 then
return doPlayerSendCancel(cid, "Put a pokeball in the pokeball slot.")
elseif #getCreatureSummons(cid) > 0 then
return doPlayerSendCancel(cid, "Return your pokemon.")
elseif getItemAttribute(ball, "poke") ~= mEvolution[1] then
return doPlayerSendCancel(cid, "Put a pokeball with a(n) "..mEvolution[1].." in the pokeball slot.")
elseif getItemAttribute(ball, "megaStone") then
return doPlayerSendCancel(cid, "Your pokemon is already holding a mega stone.")
end
doItemSetAttribute(ball, "megaStone", item.itemid)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Now your "..getItemAttribute(ball, "poke").." is holding a(n) "..getItemNameById(item.itemid)..".")
doRemoveItem(item.uid)
return true
end
Depois, em goback.lua:
Abaixo de:
if not pokes[pokemon] then
return true
end
coloque:
if pokemon:find("Mega") then
local normalPoke = megaEvolutions[getItemAttribute(item.uid, "megaStone")][1]
if normalPoke then
doItemSetAttribute(item.uid, "poke", normalPoke)
pokemon = normalPoke
end
end
Depois, em data/creaturescripts/scripts, look.lua:
Abaixo de:
local boost = getItemAttribute(thing.uid, "boost") or 0
coloque:
local extraInfo, megaStone = "", getItemAttribute(thing.uid, "megaStone")
if megaStone then
extraInfo = getItemNameById(megaStone)
if pokename:find("Mega") then
pokename = megaEvolutions[megaStone][1]
end
end
Depois, acima de:
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, table.concat(str))
coloque:
if extraInfo ~= "" then
table.insert(str, "\nIt's holding a(n) "..extraInfo..".")
end
Já em data/talkactions/scripts, move1.lua:
Troque:
if not move then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your pokemon doesn't recognize this move.")
return true
end
por:
if not move then
local isMega = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "megaStone")
if not isMega or name:find("Mega") then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your pokemon doesn't recognize this move.")
return true
end
local moveTable, index = getNewMoveTable(movestable[name]), 0
for i = 1, 12 do
if not moveTable[i] then
index = i
break
end
end
if tonumber(it) ~= index then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your pokemon doesn't recognize this move.")
return true
end
local needCds = true --Coloque false se o pokémon puder mega evoluir mesmo com spells em cooldown.
if needCds then
for i = 1, 12 do
if getCD(getPlayerSlotItem(cid, 8).uid, "move"..i) > 0 then
return doPlayerSendCancel(cid, "To mega evolve, all the spells of your pokemon need to be ready.")
end
end
end
move = {name = "Mega Evolution", level = 0, cd = 0, dist = 1, target = 0, f = 0, t = "?"}
end
E troque:
doCreatureSay(cid, ""..getPokeName(mypoke)..", "..msgs[math.random(#msgs)]..""..move.name.."!", TALKTYPE_SAY)
por:
local spellMessage = msgs[math.random(#msgs)]..""..move.name.."!"
if move.name == "Mega Evolution" then
spellMessage = "Mega Evolve!"
end
doCreatureSay(cid, getPokeName(mypoke)..", "..spellMessage, TALKTYPE_SAY)
Se quiser que o "Mega" não apareça no nome do pokémon, vá em data/lib, level system.lua:
Acima de:
if getItemAttribute(item, "nick") then
nick = getItemAttribute(item, "nick")
end
coloque:
if nick:find("Mega") then
nick = nick:match("Mega (.*)")
if not pokes[nick] then
nick = nick:explode(" ")[1]
end
end
E, caso o seu servidor possua pokémons evoluídos permanentemente na forma mega, em data/actions/scripts, goback.lua:
Troque:
if pokemon:find("Mega") then
local normalPoke = megaEvolutions[getItemAttribute(item.uid, "megaStone")][1]
if normalPoke then
doItemSetAttribute(item.uid, "poke", normalPoke)
pokemon = normalPoke
end
end
por:
if pokemon:find("Mega") then
local normalPoke = megaEvolutions[getItemAttribute(item.uid, "megaStone")][1]
if not normalPoke then
local megaStone
for itemid, table in pairs(megaEvolutions) do
if table[2] == pokemon then
megaStone = itemid
break
end
end
if not megaStone then
return doPlayerSendTextMessage(cid, 27, "Your pokemon is bugged. Please, talk to the administrator.")
end
doItemSetAttribute(item.uid, "megaStone", megaStone)
normalPoke = megaEvolutions[megaStone][1]
end
doItemSetAttribute(item.uid, "poke", normalPoke)
pokemon = normalPoke
end
Bom pessoal é isso!
Espero que ajude !
Creditos:
zipter98 (Pela criação)
Eu Lango Rullez (Por Divulgar ^_^)