Olá pessoal, venho hoje aqui para postar um sistema de pokemon muito procurado, o famoso, Tm System. Siga o tutorial a risca ou seu trabalho será invão.
Quote
Seu Funcionameto: Basícamente funciona assim; ele adiciona um "Attack" novo a um pokemon ou substitui um existente, dependendo da vontado do player.
Versões testadas: Qualquer derivado do PDA
http://www.havencrest.co.uk/images/page-divider 2.jpg
Vamos ao que interessa, vá em actions.xml e cole a seguinte tag:
<action itemid="id do item que será usado" event="script" value="tmSystem.lua"/>
Atenção o item que será usado no system, não deve ter o attributo "Usable" ou você terá erros.
Agora crie um arquivo em {data/actions/scripts} chamado tmSystem.lua e cole o seguinte script dentro:
function onUse(cid, item, frompos, item2, topos)
local tm = tmabilities
local pokemon = getCreatureSummons(cid)[1]
local slotball = getPlayerSlotItem(cid, 8).uid
local tmname = getItemNameById(item2.itemid)
local i = item2.itemid
if #getCreatureSummons(cid) == 0 then
return doPlayerSendCancel(cid, "Need pokemon to learn a "..tmname..".")
end
if getItemAttribute(slotball, "TM") == tmname then
return doPlayerSendCancel(cid, "Your pokemon was learned this TM.")
end
if isInArray(tm[""..tmname..""], getPokemonName(pokemon)) then
doPlayerSetVocation(cid, 49)
openChannelDialog(cid)
else
doPlayerSendCancel(cid, "This TM not compatible in your pokemon.")
end
return true
end
http://www.havencrest.co.uk/images/page-divider 2.jpg Agora vamos em {creaturescripts.xml} e colaremos a seguinte tag:
<event type="joinchannel" name="TmChoose" event="script" value="tmsys.lua"/>
Agora crie o arquivo tmsys.lua em {creaturescripts/scripts} e cole isso dentro:
[CODE]
function onJoinChannel(cid, channelId, users, isTv)
if getPlayerVocation(cid) == 49 then
else return true end
local summon = getCreatureSummons(cid)[1]
local moves = movestable[getCreatureName(summon)]
local n = 1
for a = 1, 12 do
local b = getNewMoveTable(moves, a)
if b then
n = n + 1
end
end
for b = 13, 23 do
if channelId == b then
local tm = tmabilities
local pokemon = getCreatureSummons(cid)[1]
local slotball = getPlayerSlotItem(cid, 8).uid
local slotm = getPlayerSlotItem(cid, 9)
local tmname = getItemNameById(slotm.itemid)
if n >= channelId - 11 then
doPlayerSendTextMessage(cid, 27, "Congralutions! Your "..getPokemonName(pokemon).." learn a new TM ("..tmname..").")
doItemSetAttribute(slotball, "TM", tmname)
doItemSetAttribute(slotball, "TMN", channelId - 11)
doSendMagicEffect(getThingPosition(pokemon), 28)
doSendMagicEffect(getThingPosition(pokemon), 29)
doRemoveItem(slotm.uid)
if useKpdoDlls then
doUpdateMoves(cid)
end
else doPlayerSendCancel(cid, "Put tm on at last empty slot.")
end
return false
end
end
return true
end
http://www.havencrest.co.uk/images/page-divider 2.jpgNesta parte você precisa de muita atenção, você terá que criar 10 channels como no modelo abaixo:
<channel id="13" name="[Put on M1]">
<vocation id="49"/>
</channel>
<channel id="14" name="[Put on M2]">
<vocation id="49"/>
</channel>
Em channel id você seguira a ordem 13 a 23, em vocations id pode deixar do jeito que esta. Agora crie uma vocation com o id 49 ou cole a seguinte tag no vocations.xml:
<vocation id="49" name="TM" description="pokemon trainer" needpremium="0" gaincap="0" gainhp="55" gainmana="0" gainhpticks="0" gainhpamount="0" gainmanaticks="0" gainmanaamount="0" manamultiplier="1.1" attackspeed="-1" soulmax="251" gainsoulticks="-1" fromvoc="1" lessloss="0">
<formula meleeDamage="1.0" distDamage="1.0" wandDamage="1.0" magDamage="1.0" magHealingDamage="1.0" defense="1.0" magDefense="1.0" armor="1.0"/>
<skill fist="2" club="2" sword="2" axe="2" distance="2" shielding="2" fishing="2" experience="1.1"/>
</vocation>
Imagem Postada
http://www.havencrest.co.uk/images/page-divider 2.jpgAgora vamos em {data/lib} e crie um arquivo chamado tmSystem.lua e cole as seguintes linhas nele:
tmabilities = {
["Solar Beam"] = {"Blastoise", "Venusaur", "Charizard"},
["Fire Blast"] = {"Blastoise", "Venusaur", "Charizard"},
}
Nesta parte você edita, para cada magia[""] = nome dos pokemons que poderam ter essa magia por tm. Tipo do jeito que esta ai, se você for tentar colocar um fire blast em um bulba não vai pegar.. Para adicionar mais magias, basta copiar a linha e colocar o nome da magia nova e seus respectivos pokemons. http://www.havencrest.co.uk/images/page-divider 2.jpg Preste atenção, para cada magia feita, terá que haver um item com o nome da magia. E o id deste item deve ser colocado na tag da actions. ou seja(exemplo): abra o item.xml pegue o item que deseje usar e coloque o nome "Solar Beam"(do mesmo jeito da lib), pegue o id dele e cole na tag da actions. Espero que tenham intendido está parte. http://www.havencrest.co.uk/images/page-divider 2.jpg A ultima parte da instalção, vamos em {data/talkactions/scripts} e abra o arquivo move1.lua e substitua a parte de "if it = 1" até o ultimo "end" antes da parte "if not move then":
local msgs = {"use ", ""}
function doAlertReady(cid, id, movename, n, cd)
if not isCreature(cid) then return true end
local myball = getPlayerSlotItem(cid, 8)
if myball.itemid > 0 and getItemAttribute(myball.uid, cd) == "cd:"..id.."" then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, getPokeballName(myball.uid).." - "..movename.." (m"..n..") is ready!")
return true
end
local p = getPokeballsInContainer(getPlayerSlotItem(cid, 3).uid)
if not p or #p <= 0 then return true end
for a = 1, #p do
if getItemAttribute(p[a], cd) == "cd:"..id.."" then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, getPokeballName(p[a]).." - "..movename.." (m"..n..") is ready!")
return true
end
end
end
function onSay(cid, words, param, channel)
if param ~= "" then return true end
if string.len(words) > 3 then return true end
if #getCreatureSummons(cid) == 0 then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You need a pokemon to use moves.")
return 0
end
--alterado v1.5
local mypoke = getCreatureSummons(cid)[1]
if getCreatureCondition(cid, CONDITION_EXHAUST) then return true end
if getCreatureName(mypoke) == "Evolution" then return true end
if getCreatureName(mypoke) == "Ditto" or getCreatureName(mypoke) == "Shiny Ditto" then
name = getPlayerStorageValue(mypoke, 1010) --edited
else
name = getCreatureName(mypoke)
end
--local name = getCreatureName(mypoke) == "Ditto" and getPlayerStorageValue(mypoke, 1010) or getCreatureName(mypoke)
local it = string.sub(words, 2, 3)
local move = movestable[name].move1
local cdzin = "move"..it..""
local slotball = getPlayerSlotItem(cid, 8).uid
local tmname = getItemAttribute(slotball, "TM")
if it == "2" then
if getItemAttribute(slotball, "TMN") == 2 then
move = {name = ""..tmname.."", level = 0, cd = 12, dist = 0, target = 0}
else
move = movestable[name].move2
end
elseif it == "3" then
if getItemAttribute(slotball, "TMN") == 3 then
move = {name = ""..tmname.."", level = 0, cd = 12, dist = 0, target = 0}
else
move = movestable[name].move3
end
elseif it == "4" then
if getItemAttribute(slotball, "TMN") == 4 then
move = {name = ""..tmname.."", level = 0, cd = 12, dist = 0, target = 0}
else
move = movestable[name].move4
end
elseif it == "5" then
if getItemAttribute(slotball, "TMN") == 5 then
move = {name = ""..tmname.."", level = 0, cd = 12, dist = 0, target = 0}
else
move = movestable[name].move5
end
elseif it == "6" then
if getItemAttribute(slotball, "TMN") == 6 then
move = {name = ""..tmname.."", level = 0, cd = 12, dist = 0, target = 0}
else
move = movestable[name].move6
end
elseif it == "7" then
if getItemAttribute(slotball, "TMN") == 7 then
move = {name = ""..tmname.."", level = 0, cd = 12, dist = 0, target = 0}
else
move = movestable[name].move7
end
elseif it == "8" then
if getItemAttribute(slotball, "TMN") == 8 then
move = {name = ""..tmname.."", level = 0, cd =15, dist = 0, target = 0}
else
move = movestable[name].move8
end
elseif it == "9" then
if getItemAttribute(slotball, "TMN") == 9 then
move = {name = ""..tmname.."", level = 0, cd = 12, dist = 0, target = 0}
else
move = movestable[name].move9
end
elseif it == "10" then
if getItemAttribute(slotball, "TMN") == 10 then
move = {name = ""..tmname.."", level = 0, cd = 12, dist = 0, target = 0}
else
move = movestable[name].move10
end
elseif it == "11" then
if getItemAttribute(slotball, "TMN") == 11 then
move = {name = ""..tmname.."", level = 0, cd = 12, dist = 0, target = 0}
else
move = movestable[name].move11
end
elseif it == "12" then
if getItemAttribute(slotball, "TMN") == 12 then
move = {name = ""..tmname.."", level = 0, cd = 12, dist = 0, target = 0}
else
move = movestable[name].move12
end
end
if not move then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your pokemon doesn't recognize this move.")
return true
end
if getPlayerLevel(cid) < move.level then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You need be atleast level "..move.level.." to use this move.")
return true
end
if getCD(getPlayerSlotItem(cid, 8).uid, cdzin) > 0 and getCD(getPlayerSlotItem(cid, 8).uid, cdzin) < (move.cd + 2) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You have to wait "..getCD(getPlayerSlotItem(cid, 8).uid, cdzin).." seconds to use "..move.name.." again.")
return true
end
if getTileInfo(getThingPos(mypoke)).protection then
doPlayerSendCancel(cid, "Your pokemon cannot use moves while in protection zone.")
return true
end
if getPlayerStorageValue(mypoke, 3894) >= 1 then
return doPlayerSendCancel(cid, "You can't attack because you is with fear") --alterado v1.3
end
--alterado v1.6
if (move.name == "Team Slice" or move.name == "Team Claw") and #getCreatureSummons(cid) < 2 then
doPlayerSendCancel(cid, "Your pokemon need be in a team for use this move!")
return true
end
--alterado v1.6
if isCreature(getCreatureTarget(cid)) and isInArray(specialabilities["evasion"], getCreatureName(getCreatureTarget(cid))) and math.random(1, 100) <= 10 then
local target = getCreatureTarget(cid)
if isCreature(getMasterTarget(target)) then --alterado v1.6
doSendMagicEffect(getThingPos(target), 211)
doSendAnimatedText(getThingPos(target), "TOO BAD", 215)
doTeleportThing(target, getClosestFreeTile(target, getThingPos(mypoke)), false)
doSendMagicEffect(getThingPos(target), 211)
doFaceCreature(target, getThingPos(mypoke))
return true --alterado v1.6
end
end
if move.target == 1 then
if not isCreature(getCreatureTarget(cid)) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You don\'t have any targets.")
return 0
end
if getCreatureCondition(getCreatureTarget(cid), CONDITION_INVISIBLE) then
return 0
end
if getCreatureHealth(getCreatureTarget(cid)) <= 0 then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your have already defeated your target.")
return 0
end
if not isCreature(getCreatureSummons(cid)[1]) then
return true
end
if getDistanceBetween(getThingPos(getCreatureSummons(cid)[1]), getThingPos(getCreatureTarget(cid))) > move.dist then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Get closer to the target to use this move.")
return 0
end
if not isSightClear(getThingPos(getCreatureSummons(cid)[1]), getThingPos(getCreatureTarget(cid)), false) then
return 0
end
end
local newid = 0
if isSleeping(mypoke) or isSilence(mypoke) then --alterado v1.5
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry you can't do that right now.")
return 0
else
newid = setCD(getPlayerSlotItem(cid, 8).uid, cdzin, move.cd)
end
doCreatureSay(cid, ""..getPokeName(mypoke)..", "..msgs[math.random(#msgs)]..""..move.name.."!", TALKTYPE_SAY)
local summons = getCreatureSummons(cid) --alterado v1.6
addEvent(doAlertReady, move.cd * 1000, cid, newid, move.name, it, cdzin)
for i = 2, #summons do
if isCreature(summons[i]) and getPlayerStorageValue(cid, 637501) >= 1 then
docastspell(summons[i], move.name) --alterado v1.6
end
end
docastspell(mypoke, move.name)
doCreatureAddCondition(cid, playerexhaust)
if useKpdoDlls then
doUpdateCooldowns(cid)
end
return 0
end
Até que enfim.. Se fizeram tudo certo o sistema vai funcionar se não.... Caso não itendam alguma parte da explicação podem me perguntar por aqui...
Creditos
Smix