Scripts para TFS 0.3.6pl1 NAO FOI TESTADO EM OUTRA!
Preview:
Antes de tudo, va na pasta data/lib e adicione um script.lua com o nome de pokeLib e adicione isso:
--[[
This file is part of Pokemon Systems by Mkalo.
Pokemon Systems by Mkalo is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Pokemon System By Mkalo is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Pokemon System By Mkalo. If not, see <http://www.gnu.org/licenses/>.
]]--
pokein, pokeout = 2222,2223
function doRemoveTile(pos)-- Script by mock
pos.stackpos = 0
local sqm = getTileThingByPos(pos)
doRemoveItem(sqm.uid,1)
end
function doCreateTile(id,pos) -- By mock
doAreaCombatHealth(0,0,pos,0,0,0,CONST_ME_NONE)
doCreateItem(id,1,pos)
end
function getPosDirs(p, dir) -- By MatheusMkalo
return dir == 1 and {x=p.x-1, y=p.y, z=p.z} or dir == 2 and {x=p.x-1, y=p.y+1, z=p.z} or dir == 3 and {x=p.x, y=p.y+1, z=p.z} or dir == 4 and {x=p.x+1, y=p.y+1, z=p.z} or dir == 5 and {x=p.x+1, y=p.y, z=p.z} or dir == 6 and {x=p.x+1, y=p.y-1, z=p.z} or dir == 7 and {x=p.x, y=p.y-1, z=p.z} or dir == 8 and {x=p.x-1, y=p.y-1, z=p.z}
end
function doItem(pos,a,d)-- Script by mock
doCreateTile(460,pos)
pos.stackpos = 0
local c = getTileThingByPos(pos)
doItemSetAttribute(c.uid, "aid", a)
end
function getDescription(uid)
for i,x in pairs(getItemDescriptions(uid)) do
if i == "special" then
return x
end
end
end
function findLetter(string, letter)
for i = 1, #string do
if string:sub(i, i) == letter then
return i
end
end
end
function isWalkable(pos, creature, proj, pz)-- by Nord
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
if getTopCreature(pos).uid > 0 and creature then return false end
if getTileInfo(pos).protection and pz then return false, true end
local n = not proj and 3 or 2
for i = 0, 255 do
pos.stackpos = i
local tile = getTileThingByPos(pos)
if tile.itemid ~= 0 and not isCreature(tile.uid) then
if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
return false
end
end
end
return true
end
function getPosDirs(p, dir)
return dir == 1 and {x=p.x-1, y=p.y, z=p.z} or dir == 2 and {x=p.x-1, y=p.y+1, z=p.z} or dir == 3 and {x=p.x, y=p.y+1, z=p.z} or dir == 4 and {x=p.x+1, y=p.y+1, z=p.z} or dir == 5 and {x=p.x+1, y=p.y, z=p.z} or dir == 6 and {x=p.x+1, y=p.y-1, z=p.z} or dir == 7 and {x=p.x, y=p.y-1, z=p.z} or dir == 8 and {x=p.x-1, y=p.y-1, z=p.z}
end
function canSummon(cid)
local pos = getCreaturePosition(cid)
local state = false
for i = 1, 8 do
if isWalkable(getPosDirs(getCreaturePosition(cid), i)) then
state = true
end
end
return state
end
function isPlayerSummon(cid, uid)
if getCreatureMaster(uid) == cid then
return TRUE
end
return FALSE
end
function getSummonLifes(cid)
for _,x in pairs(getCreatureSummons(cid)) do
return getCreatureHealth(x), getCreatureMaxHealth(x)
end
end
function getItemsInContainerById(container, itemid) -- Function By Kydrai
local items = {}
if isContainer(container) and getContainerSize(container) > 0 then
for slot=0, (getContainerSize(container)-1) do
local item = getContainerItem(container, slot)
if isContainer(item.uid) then
local itemsbag = getItemsInContainerById(item.uid, itemid)
for i=0, #itemsbag do
table.insert(items, itemsbag[i])
end
else
if itemid == item.itemid then
table.insert(items, item.uid)
end
end
end
end
return items
end
function addPokeball(cid, pokename, maxh)
local s = doPlayerAddItem(cid, pokein)
doItemSetAttribute(s, "poke", "This is "..pokename.."'s pokeball. HP = ["..maxh.."/"..maxh.."]")
doItemSetAttribute(s, "description", "Contains a " .. pokename)
end
function getPokeOutLive(cid)
dat = {}
for slot = CONST_SLOT_FIRST, CONST_SLOT_LAST do
local item = getPlayerSlotItem(cid, slot)
if isContainer(item.uid) then
local items = getItemsInContainerById(item.uid, pokeout)
for _, ui in pairs(items) do
if getItemAttribute(ui, "poke"):sub(#getItemAttribute(ui, "poke")) == "." then
table.insert(dat, ui)
end
end
end
if item.itemid == pokeout then
if getItemAttribute(item.uid, "poke"):sub(#getItemAttribute(item.uid, "poke")) == "." then
table.insert(dat, item.uid)
end
end
end
return dat
end
Go/Back Pokeball System
By: MatheusMkalo
Vá em data/actions/scripts e adicione um arquivo.lua com o nome de goback.lua
Depois de ter feito isso, adicione o seguinte script no arquivo goback.lua:
--[[
This file is part of Pokemon Systems by Mkalo.
Pokemon Systems by Mkalo is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Pokemon System By Mkalo is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Pokemon System By Mkalo. If not, see <http://www.gnu.org/licenses/>.
]]--
local pokes = {
["Dragon"] = {level = 1, go = "Vai Dragon", back = "Volte Dragon."},
["Demon"] = {level = 8, go = "Vai Demon", back = "Volte Demon."},
["Dragon Lord"] = {level = 8, go = "Vai Dragon Lord", back = "Volte Dragon Lord."},
["Rat"] = {level = 8, go = "Vai Rat", back = "Volte Rat."},
}
local msgunica = false
function onUse(cid, item, frompos, item2, topos)
local maxh = tonumber(getItemAttribute(item.uid, "poke"):match("/(.+)]"))
local health = tonumber(getItemAttribute(item.uid, "poke"):match("%[(.-)/"))
if item.itemid == pokeout then
if health ~= nil and health <= 0 then
return doPlayerSendCancel(cid, "This pokemon is dead.")
end
if #getCreatureSummons(cid) >= 1 then
for _,z in pairs(getCreatureSummons(cid)) do
if getItemAttribute(item.uid, "poke"):find(getCreatureName(z)) then
doTransformItem(item.uid, pokein)
if msgunica then
doCreatureSay(cid, "Back, " .. getCreatureName(z), TALKTYPE_SAY)
else
doCreatureSay(cid, pokes[getCreatureName(z)].back, TALKTYPE_SAY)
end
doItemSetAttribute(item.uid, "poke", getItemAttribute(item.uid, "poke"):sub(1, findLetter(getItemAttribute(item.uid, "poke"), ".")) .. " HP = ["..getCreatureHealth(z).."/"..getCreatureMaxHealth(z).."]")
setPlayerStorageValue(cid, 61204, 0)
doSendMagicEffect(getCreaturePosition(z), 10)
return doRemoveCreature(z)
end
end
end
elseif item.itemid == pokein then
if getTilePzInfo(getCreaturePosition(cid)) then
return doPlayerSendCancel(cid, "You can't use pokeball in Protection Zones.")
end
if not canSummon(cid) then
return doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTENOUGHROOM)
end
if getPlayerStorageValue(cid, 63215) >= 1 then
return doPlayerSendCancel(cid, "You can't use pokeball while surfing.")
end
if getPlayerStorageValue(cid, 62314) >= 1 then
return doPlayerSendCancel(cid, "You can't use pokeball while flying.")
end
if getPlayerStorageValue(cid, 59987) >= 1 then
return doPlayerSendCancel(cid, "You can't use pokeball while riding.")
end
for i,x in pairs(pokes) do
if #getCreatureSummons(cid) >= 1 then
return doPlayerSendCancel(cid, "You already summoned a pokemon.")
end
if i == getItemAttribute(item.uid, "poke"):sub(9, findLetter(getItemAttribute(item.uid, "poke"), "'")-1) then
if getPlayerLevel(cid) >= x.level then
pk = doSummonCreature(i, getThingPosition(cid))
doConvinceCreature(cid, pk)
setCreatureMaxHealth(pk, tonumber(getItemAttribute(item.uid, "poke"):match("/(.+)]")))
doCreatureAddHealth(pk, maxh)
doCreatureAddHealth(pk, health-maxh)
doTransformItem(item.uid, pokeout)
if msgunica then
doCreatureSay(cid, "Go, " .. i, TALKTYPE_SAY)
else
doCreatureSay(cid, x.go, TALKTYPE_SAY)
end
doItemSetAttribute(item.uid, "poke", getItemAttribute(item.uid, "poke"):sub(1, findLetter(getItemAttribute(item.uid, "poke"), ".")))
doSendMagicEffect(getCreaturePosition(pk), 10)
setPlayerStorageValue(cid, 61204, 1)
registerCreatureEvent(pk, "DiePoke")
registerCreatureEvent(cid, "PlayerPokeDeath")
registerCreatureEvent(cid, "LogoutPoke")
break
else
doPlayerSendCancel(cid, "Only players level "..x.level.." or higher can use this pokemon.")
end
end
end
end
return TRUE
end
Depois, va em actions.xml e adicione a seguinte tag:
<action itemid="2222;2223" event="script" value="goback.lua"/>
Sendo que 2222 e 2223 são, respectivamente, o id da pokeball que ira "chamar" o pokemon, e o outro o id da pokeball que ira retirar o pokemon. (Seriam as pokebolas acesas e apagadas do PO)
Agora, para evitar alguns bugs, va em data/creaturescripts/scripts e crie um arquivo.lua com o nome goback.lua e bote o seguinte script dentro:
--[[
This file is part of Pokemon Systems by Mkalo.
Pokemon Systems by Mkalo is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Pokemon System By Mkalo is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Pokemon System By Mkalo. If not, see <http://www.gnu.org/licenses/>.
]]--
function onLogout(cid)
local health,maxhealth = getSummonLifes(cid)
if getPlayerStorageValue(cid, 61204) >= 1 and getPlayerStorageValue(cid, 63215) <= 0 and getPlayerStorageValue(cid, 62314) <= 0 and getPlayerStorageValue(cid, 59987) <= 0 then
setPlayerStorageValue(cid, 61205, health)
setPlayerStorageValue(cid, 61206, maxhealth)
setPlayerStorageValue(cid, 61204, 0)
setPlayerStorageValue(cid, 61207, 1)
end
if getPlayerStorageValue(cid, 62314) >= 1 then
pos = getCreaturePosition(cid)
for i = 1,8 do
doRemoveTile(getPosDirs(getCreaturePosition(cid), i))
end
doRemoveTile(getCreaturePosition(cid))
setPlayerStorageValue(cid, 61941, pos.x)
setPlayerStorageValue(cid, 61942, pos.y)
setPlayerStorageValue(cid, 61943, pos.z)
end
return TRUE
end
function onLogin(cid)
local pokes = {
["Dragon"] = {lookType=267, speed = 1500},
["Rat"] = {lookType=267, speed = 500},
}
local pokesfly = {
["Dragon"] = {lookType = 216, speed = 500},
}
local pokesride = {
["Dragon Lord"] = {lookType=4, speed = 3000},
["Dragon"] = {lookType=4, speed = 500},
}
if getPlayerStorageValue(cid, 62314) >= 1 then
doCreateTile(460, {x=getPlayerStorageValue(cid, 61941), y=getPlayerStorageValue(cid, 61942), z=getPlayerStorageValue(cid, 61943)})
doTeleportThing(cid, {x=getPlayerStorageValue(cid, 61941), y=getPlayerStorageValue(cid, 61942), z=getPlayerStorageValue(cid, 61943)})
for i = 1,8 do
doItem(getPosDirs(getCreaturePosition(cid), i), 65119+i)
end
local item = getPokeOutLive(cid)[1]
local a = getItemAttribute(item, "poke"):match("This is (.-)'s pokeball.")
doSetCreatureOutfit(cid, pokesfly[tostring(a)], -1)
doChangeSpeed(cid, pokesfly[tostring(a)].speed)
registerCreatureEvent(cid, "PlayerPokeDeath")
end
if getPlayerStorageValue(cid, 63215) >= 1 then
local item = getPokeOutLive(cid)[1]
local a = getItemAttribute(item, "poke"):match("This is (.-)'s pokeball.")
doSetCreatureOutfit(cid, pokes[tostring(a)], -1)
doChangeSpeed(cid, pokes[tostring(a)].speed)
registerCreatureEvent(cid, "PlayerPokeDeath")
end
if getPlayerStorageValue(cid, 59987) >= 1 then
local item = getPokeOutLive(cid)[1]
local a = getItemAttribute(item, "poke"):match("This is (.-)'s pokeball.")
doSetCreatureOutfit(cid, pokesride[tostring(a)], -1)
doChangeSpeed(cid, pokesride[tostring(a)].speed)
registerCreatureEvent(cid, "PlayerPokeDeath")
end
if getPlayerStorageValue(cid, 61207) >= 1 then
local item = getPokeOutLive(cid)[1]
doTransformItem(item, pokein)
doRemoveCondition(cid, CONDITION_OUTFIT)
doItemSetAttribute(item, "poke", getItemAttribute(item, "poke"):sub(#getItemAttribute(item, "poke")) ~= "]" and getItemAttribute(item, "poke") .. " HP = ["..getPlayerStorageValue(cid, 61205).."/"..getPlayerStorageValue(cid, 61206).."]" or getItemAttribute(item, "poke"))
setPlayerStorageValue(cid, 61207, 0)
end
return TRUE
end
function onDeath(cid, deathList)
local owner = getCreatureMaster(cid)
doPlayerSendTextMessage(owner, 22, "Your pokemon died.")
for slot = CONST_SLOT_FIRST, CONST_SLOT_LAST do
local item = getPlayerSlotItem(owner, slot)
if isContainer(item.uid) then
local items = getItemsInContainerById(item.uid, pokeout)
for _, ui in pairs(items) do
if getItemAttribute(ui, "poke"):sub(#getItemAttribute(ui, "poke")) == "." then
local maxh = tonumber(getItemAttribute(ui, "poke"):match("/(.+)]"))
doItemSetAttribute(ui, "poke", getItemAttribute(ui, "poke"):sub(1, findLetter(getItemAttribute(ui, "poke"), ".")) .. " HP = [0/"..getCreatureMaxHealth(cid).."]")
end
end
end
if item.itemid == pokeout then
if getItemAttribute(item.uid, "poke"):sub(#getItemAttribute(item.uid, "poke")) == "." then
local maxh = tonumber(getItemAttribute(item.uid, "poke"):match("/(.+)]"))
doItemSetAttribute(item.uid, "poke", getItemAttribute(item.uid, "poke"):sub(1, findLetter(getItemAttribute(item.uid, "poke"), ".")) .. " HP = [0/"..getCreatureMaxHealth(cid).."]")
end
end
end
doRemoveCreature(cid)
setPlayerStorageValue(owner, 61207, 0)
setPlayerStorageValue(owner, 61204, 0)
return FALSE
end
Agora adicione outro arquivo.lua na pasta data/creaturescripts/scripts com o nome de playerpdeath e bote esse script:
--[[
This file is part of Pokemon Systems by Mkalo.
Pokemon Systems by Mkalo is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Pokemon System By Mkalo is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Pokemon System By Mkalo. If not, see <http://www.gnu.org/licenses/>.
]]--
function onDeath(cid)
local health,maxhealth = getSummonLifes(cid)
if #getCreatureSummons(cid) >= 1 then
setPlayerStorageValue(cid, 61205, health)
setPlayerStorageValue(cid, 61206, maxhealth)
setPlayerStorageValue(cid, 61204, 0)
setPlayerStorageValue(cid, 61207, 1)
end
if getPlayerStorageValue(cid, 63215) >= 1 then
setPlayerStorageValue(cid, 61205, getPlayerStorageValue(cid, 61210))
setPlayerStorageValue(cid, 61206, getPlayerStorageValue(cid, 61209))
setPlayerStorageValue(cid, 61204, 0)
setPlayerStorageValue(cid, 63215, 0)
setPlayerStorageValue(cid, 61207, 1)
end
if getPlayerStorageValue(cid, 62314) >= 1 then
setPlayerStorageValue(cid, 61205, getPlayerStorageValue(cid, 61262))
setPlayerStorageValue(cid, 61206, getPlayerStorageValue(cid, 61263))
setPlayerStorageValue(cid, 61204, 0)
setPlayerStorageValue(cid, 62314, 0)
setPlayerStorageValue(cid, 61207, 1)
end
if getPlayerStorageValue(cid, 59987) >=1 then
setPlayerStorageValue(cid, 61205, getPlayerStorageValue(cid, 59988))
setPlayerStorageValue(cid, 61206, getPlayerStorageValue(cid, 59989))
setPlayerStorageValue(cid, 61204, 0)
setPlayerStorageValue(cid, 59987, 0)
setPlayerStorageValue(cid, 61207, 1)
end
return TRUE
end
Depois va em creaturescripts.xml e adicione as seguintes TAGS:
Vá em data/actions/scripts e adicione um arquivo.lua com o nome de catch.lua
Depois adicione o seguinte script dentro dele:
--[[
This file is part of Pokemon Systems by Mkalo.
Pokemon Systems by Mkalo is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Pokemon System By Mkalo is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Pokemon System By Mkalo. If not, see <http://www.gnu.org/licenses/>.
]]--
local pokes = {
["Dragon"] = {corpseid = 5973, chance = 100, health = 12200, maxhealth = 12200},
["Dragon Lord"] = {corpseid = 5984, chance = 100, health = 12200, maxhealth = 12200},
["Demon"] = {corpseid = 5995, chance = 100, health = 12200, maxhealth = 12200},
}
local time = 4 -- Tempo para mandar as mensagens e adiciona item
function onUse(cid, item, frompos, item2, topos)
for i,x in pairs(pokes) do
if item2.itemid == x.corpseid then
doRemoveItem(item.uid, 1)
doRemoveItem(item2.uid, 1)
if math.random(1,100) <= x.chance then
function add()
local s = doPlayerAddItem(cid, pokein)
doItemSetAttribute(s, "poke", "This is "..i.."'s pokeball. HP = ["..x.health.."/"..x.maxhealth.."]")
doItemSetAttribute(s, "description", "Contains a " .. i)
end
doSendMagicEffect(topos, 24)
addEvent(add, time*1000)
return addEvent(doPlayerSendTextMessage, time*1000, cid, 27, "You catch a " .. i .. ".")
else
addEvent(doPlayerSendTextMessage, time*1000, cid, 27, "Your pokeball broke.")
return doSendMagicEffect(topos, 23)
end
end
end
return TRUE
end
Sendo 2147, o id da sua pokebola para capturar pokemons (NAO A DE CHAMAR O POKEMON)
Npc Healler
By: MatheusMkalo
Vá em data/npc/scripts e adicione um arquivo.lua com o seguinte script:
--[[
This file is part of Pokemon Systems by Mkalo.
Pokemon Systems by Mkalo is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Pokemon System By Mkalo is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Pokemon System By Mkalo. If not, see <http://www.gnu.org/licenses/>.
]]--
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}
function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end
function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end
function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end
function onThink() npcHandler:onThink() end
function creatureSayCallback(cid, type, msg)
if(not npcHandler:isFocused(cid)) then
return false
end
if msgcontains(msg, 'heal') then
if #getCreatureSummons(cid) >= 1 then
return selfSay('Voce precisa botar seus pokemons dentro da pokebola.', cid)
end
for slo = CONST_SLOT_FIRST, CONST_SLOT_LAST do
local item = getPlayerSlotItem(cid, slo)
if isContainer(item.uid) then
local items = getItemsInContainerById(item.uid, pokeout)
for i,x in pairs(items) do
local maxh = tonumber(getItemAttribute(x, "poke"):match("/(.+)]"))
doItemSetAttribute(x, "poke", getItemAttribute(x, "poke"):sub(1, findLetter(getItemAttribute(x, "poke"), ".")) .. " HP = ["..maxh.."/"..maxh.."]")
doTransformItem(x, pokein)
end
local items2 = getItemsInContainerById(item.uid, pokein)
for i,x in pairs(items2) do
local maxh = tonumber(getItemAttribute(x, "poke"):match("/(.+)]"))
doItemSetAttribute(x, "poke", getItemAttribute(x, "poke"):sub(1, findLetter(getItemAttribute(x, "poke"), ".")) .. " HP = ["..maxh.."/"..maxh.."]")
end
elseif item.itemid == pokeout or item.itemid == pokein then
local maxh = tonumber(getItemAttribute(item.uid, "poke"):match("/(.+)]"))
doItemSetAttribute(item.uid, "poke", getItemAttribute(item.uid, "poke"):sub(1, findLetter(getItemAttribute(item.uid, "poke"), ".")) .. " HP = ["..maxh.."/"..maxh.."]")
doTransformItem(item.uid, pokein)
end
end
selfSay('Pronto, voce e seus pokemons estao com a life maxima.', cid)
end
return true
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
Depois va ate a pasta data/npc e adicione um arquivo.xml e bote isso dentro:
<?xml version="1.0" encoding="UTF-8"?>
<npc name="Pokemon Healer" script="pokehealer.lua" walkinterval="2000" floorchange="0">
<health now="100" max="100"/>
<look type="128" head="17" body="54" legs="114" feet="0" addons="2"/>
<parameters>
<parameter key="message_greet" value="Ola, diga {heal} para recuperar sua vida e a vida dos seus pokemons."/>
</parameters>
</npc>
Surf System
By: MatheusMkalo
Vá em data/actions/scripts e crie um arquivo.lua com o nome de surf e bote esse script dentro:
--[[
This file is part of Pokemon Systems by Mkalo.
Pokemon Systems by Mkalo is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Pokemon System By Mkalo is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Pokemon System By Mkalo. If not, see <http://www.gnu.org/licenses/>.
]]--
function onUse(cid, item, frompos, item2, topos)
local configs = {
[4647] = {x = -2, y = 0}, -- 4647 é o id da borda oeste (lado esquerdo do player)
[4645] = {x = 2, y = 0}, -- 4645 é o id da borda leste (lado direito do player)
[4646] = {x = 0, y = 2}, -- 4646 é o id da borda sul (abaixo do player)
[4644] = {x = 0, y = -2}, -- 4644 é o id da borda norte (acima do player)
}
local playerpos = getCreaturePosition(cid)
local pokes = {
["Dragon"] = {lookType=267, speed = 1500},
["Rat"] = {lookType=267, speed = 500},
}
if #getCreatureSummons(cid) <= 0 and getPlayerStorageValue(cid, 63215) <= 0 then
return doPlayerSendCancel(cid, "You need a pokemon to surf.")
end
l = false
for i,x in pairs(pokes) do
if getPlayerStorageValue(cid, 63215) <= 0 and i:lower() == getCreatureName(getCreatureSummons(cid)[1]):lower() then
l = true
end
end
if not l and getPlayerStorageValue(cid, 63215) <= 0 then
return doPlayerSendCancel(cid, "This pokemon can't surf.")
end
if getPlayerStorageValue(cid, 63215) <= 0 then
doTeleportThing(cid, {x=playerpos.x+configs[item2.itemid].x, y=playerpos.y+configs[item2.itemid].y, z=playerpos.z})
setPlayerStorageValue(cid, 63215, 1)
doSetCreatureOutfit(cid, pokes[getCreatureName(getCreatureSummons(cid)[1])], -1)
doCreatureSay(cid, "Let's surf, "..getCreatureName(getCreatureSummons(cid)[1]), 1)
setPlayerStorageValue(cid, 61209, getCreatureMaxHealth(getCreatureSummons(cid)[1]))
setPlayerStorageValue(cid, 61210, getCreatureHealth(getCreatureSummons(cid)[1]))
doChangeSpeed(cid, pokes[getCreatureName(getCreatureSummons(cid)[1])].speed)
doRemoveCreature(getCreatureSummons(cid)[1])
else
doTeleportThing(cid, {x=playerpos.x-configs[item2.itemid].x, y=playerpos.y-configs[item2.itemid].y, z=playerpos.z})
setPlayerStorageValue(cid, 63215, 0)
doRemoveCondition(cid, CONDITION_OUTFIT)
local item = getPokeOutLive(cid)[1]
doCreatureSay(cid, "Im tired of surf, " .. getItemAttribute(item, "poke"):match("This is (.-)'s pokeball."), 1)
pk = doSummonCreature(getItemAttribute(item, "poke"):match("This is (.-)'s pokeball."), getThingPosition(cid))
doConvinceCreature(cid, pk)
registerCreatureEvent(pk, "DiePoke")
registerCreatureEvent(cid, "PlayerPokeDeath")
registerCreatureEvent(cid, "LogoutPoke")
setCreatureMaxHealth(pk, getPlayerStorageValue(cid, 61209))
doCreatureAddHealth(pk, getPlayerStorageValue(cid, 61209))
doCreatureAddHealth(pk, getPlayerStorageValue(cid, 61210)-getPlayerStorageValue(cid, 61209))
doChangeSpeed(cid, getCreatureBaseSpeed(cid)-getCreatureSpeed(cid))
end
return TRUE
end
Ensinarei nos tutorias como adicionar novas bordas e botar cada pokemon com seu proprio outfit na agua.
OBS:Todos os scripts mudaram para implementar o surf, atualize-os
OBS2: Para funcionar o id da agua tem que ser 4820.
Para usar basta clicar na borda da agua.
Evolution System
By: MatheusMkalo
Vá em data/actions/scripts e adicione um script.lua com o nome de evolution.lua e bote esse script:
--[[
This file is part of Pokemon Systems by Mkalo.
Pokemon Systems by Mkalo is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Pokemon System By Mkalo is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Pokemon System By Mkalo. If not, see <http://www.gnu.org/licenses/>.
]]--
local pokes = {
["Dragon"] = {level = 1, evolution = "Dragon Lord", maxh = 2000},
}
local types = {
["Water"] = {itemid = 2277, "Horsea", "Goldeen", "Magikarp"},
["Venom"] = {itemid = 2278, "Zubat", "Ekans"},
["Thunder"] = {itemid = 2279, "Magnemite", "Pikachu"},
["Rock"] = {itemid = 2280, "Geodude", "Graveler"},
["Punch"] = {itemid = 2281, "Machop", "Machoke"},
["Leaf"] = {itemid = 2276, "Ivysaur"},
["Fire"] = {itemid = 2283, "Charmander", "Charmeleon", "Dragon"},
["Coccon"] = {itemid = 2284, "Caterpie", "Metapod"},
["Crystal"] = {itemid = 2285, "Dratini", "Dragonair"},
["Darkness"] = {itemid = 2286, "Gastly", "Haunter"},
["Earth"] = {itemid = 2287, "Cubone"},
["Enigma"] = {itemid = 2288, "Abra", "Kadabra"},
["Heart"] = {itemid = 2289, "Rattata", "Pidgey"},
["Ice"] = {itemid = 2290, "Seel"},
}
function onUse(cid, item, frompos, item2, topos)
for i,x in pairs(types) do
if item.itemid == x.itemid then
if isCreature(item2.uid) then
if isPlayerSummon(cid, item2.uid) then
if table.find(x, getCreatureName(item2.uid)) then
if getPlayerLevel(cid) >= pokes[getCreatureName(item2.uid)].level then
local pokeball = getPokeOutLive(cid)[1]
local slo = pokes[getCreatureName(item2.uid)].maxh
local sle = pokes[getCreatureName(item2.uid)].evolution
doItemSetAttribute(pokeball, "description", "Contains a " .. pokes[getCreatureName(item2.uid)].evolution)
doPlayerSendTextMessage(cid, 27, "Your "..getCreatureName(item2.uid).." evolued to a "..pokes[getCreatureName(item2.uid)].evolution)
doSendMagicEffect(topos, 18)
doItemSetAttribute(pokeball, "poke", "")
doItemSetAttribute(pokeball, "poke", "This is "..pokes[getCreatureName(item2.uid)].evolution.."'s pokeball. HP = ["..pokes[getCreatureName(item2.uid)].maxh.."/"..pokes[getCreatureName(item2.uid)].maxh.."]")
doRemoveCreature(item2.uid)
local pk = doSummonCreature(sle, topos)
registerCreatureEvent(pk, "DiePoke")
registerCreatureEvent(cid, "PlayerPokeDeath")
registerCreatureEvent(cid, "LogoutPoke")
doConvinceCreature(cid, pk)
setCreatureMaxHealth(pk, slo)
setPlayerStorageValue(cid, 61204, 1)
doCreatureAddHealth(pk, slo)
doRemoveItem(item.uid, 1)
break
else
return doPlayerSendCancel(cid, "You need to be level "..pokes[getCreatureName(item2.uid)].level.." or higher to use this stone in this pokemon.")
end
end
end
end
end
end
return TRUE
end
Vá em data/talkactions/scripts e adicione um arquivo.lua com o nome de fly e bote esse script:
--[[
This file is part of Pokemon Systems by Mkalo.
Pokemon Systems by Mkalo is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Pokemon Systems by Mkalo is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Pokemon Systems by Mkalo. If not, see <http://www.gnu.org/licenses/>.
]]--
function onSay(cid, words, param)
local pokes = {
["Dragon"] = {lookType = 216, speed = 500},
}
if #getCreatureSummons(cid) <= 0 and getPlayerStorageValue(cid, 62314) <= 0 then
doPlayerSendCancel(cid, "You need a pokemon to fly.")
end
if getPlayerStorageValue(cid, 62314) <= 0 and not pokes[getCreatureName(getCreatureSummons(cid)[1])] then
return doPlayerSendCancel(cid, "This pokemon can't fly.")
end
if getPlayerStorageValue(cid, 62314) <= 0 then
doSetCreatureOutfit(cid, pokes[getCreatureName(getCreatureSummons(cid)[1])], -1)
doChangeSpeed(cid, pokes[getCreatureName(getCreatureSummons(cid)[1])].speed)
setPlayerStorageValue(cid, 61263, getCreatureMaxHealth(getCreatureSummons(cid)[1]))
setPlayerStorageValue(cid, 61262, getCreatureHealth(getCreatureSummons(cid)[1]))
setPlayerStorageValue(cid, 62314, 1)
registerCreatureEvent(cid, "LogoutPoke")
doCreatureSay(cid, "Let's fly, "..getCreatureName(getCreatureSummons(cid)[1]), 1)
doRemoveCreature(getCreatureSummons(cid)[1])
local ppos = getCreaturePos(cid)
local newpos = {x=ppos.x, y=ppos.y, z = 0}
doCreateTile(460, newpos)
doTeleportThing(cid, newpos)
for i = 1,8 do
doItem(getPosDirs(getCreaturePosition(cid), i), 65119+i)
end
elseif getPlayerStorageValue(cid, 62314) >= 1 then
local ppos = getCreaturePosition(cid)
p = true
for i = 1,17 do
if getTileThingByPos({x=ppos.x, y=ppos.y, z=ppos.z+i}).itemid ~= 0 and not isWalkable({x=ppos.x, y=ppos.y, z=ppos.z+i}) then
p = false
break
end
if isWalkable({x=ppos.x, y=ppos.y, z=ppos.z+i}) then
l = ppos.z + i
break
end
end
if not p or getTileThingByPos({x=ppos.x, y=ppos.y, z=l}).itemid == 4820 then
return doPlayerSendCancel(cid, "You can't down in there.")
end
for i = 1,8 do
doRemoveTile(getPosDirs(getCreaturePosition(cid), i))
end
setPlayerStorageValue(cid, 62314, 0)
doTeleportThing(cid, {x=ppos.x, y=ppos.y, z=l})
doRemoveTile(ppos)
local item = getPokeOutLive(cid)[1]
pk = doSummonCreature(getItemAttribute(item, "poke"):match("This is (.-)'s pokeball."), getThingPosition(cid))
doConvinceCreature(cid, pk)
doCreatureSay(cid, "I'm tired of fly, "..getItemAttribute(item, "poke"):match("This is (.-)'s pokeball."), 1)
registerCreatureEvent(pk, "DiePoke")
registerCreatureEvent(cid, "PlayerPokeDeath")
setCreatureMaxHealth(pk, getPlayerStorageValue(cid, 61263))
doCreatureAddHealth(pk, getPlayerStorageValue(cid, 61263))
doCreatureAddHealth(pk, getPlayerStorageValue(cid, 61262)-getPlayerStorageValue(cid, 61263))
doChangeSpeed(cid, getCreatureBaseSpeed(cid)-getCreatureSpeed(cid))
doRemoveCondition(cid, CONDITION_OUTFIT)
end
return TRUE
end
Va em data/movements/scripts e crie um arquivo.lua com o nome de fly.lua e bote:
--[[
This file is part of Pokemon Systems by Mkalo.
Pokemon Systems by Mkalo is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Pokemon Systems by Mkalo is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Pokemon Systems by Mkalo. If not, see <http://www.gnu.org/licenses/>.
]]--
function onStepIn(cid, item, position, fromPosition)
local actions = {
[65120] = {del = {4,5,6}, add = {1,2,8}},
[65121] = {del = {8,7,6,5,4}, add = {8,1,2,3,4}},
[65122] = {del = {8,7,6}, add = {2,3,4}},
[65123] = {del = {2,1,8,7,6}, add = {6,5,4,3,2}},
[65124] = {del = {2,1,8}, add = {4,5,6}},
[65125] = {del = {8,1,2,3,4}, add = {8,7,6,5,4}},
[65126] = {del = {2,3,4}, add = {8,7,6}},
[65127] = {del = {6,5,4,3,2}, add = {6,7,8,1,2}},
}
local configs = actions[item.actionid]
for i = 1,8 do
if table.find(configs.del, i) then
doRemoveTile(getPosDirs(fromPosition, i))
end
doItem(getPosDirs(getCreaturePosition(cid), i), 65119+i)
end
return TRUE
end
Vá em talkactions/scripts e crie um arquivo.lua com o nome de ride e bote esse script:
--[[
This file is part of Pokemon Systems by Mkalo.
Pokemon Systems by Mkalo is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Pokemon Systems by Mkalo is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Pokemon Systems by Mkalo. If not, see <http://www.gnu.org/licenses/>.
]]--
function onSay(cid, words)
local pokesride = {
["Dragon Lord"] = {lookType=4, speed = 3000},
["Dragon"] = {lookType=4, speed = 500},
}
if #getCreatureSummons(cid) <= 0 and getPlayerStorageValue(cid, 59987) <= 0 then
return doPlayerSendCancel(cid, "You need a pokemon to ride.")
end
if not canSummon(cid) and getPlayerStorageValue(cid, 59987) >= 1 then
return doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTENOUGHROOM)
end
local sname = #getCreatureSummons(cid) >= 1 and getCreatureName(getCreatureSummons(cid)[1]) or nil
if sname ~= nil and pokesride[sname] and getPlayerStorageValue(cid, 59987) <= 0 then
doSetCreatureOutfit(cid, pokesride[sname], -1)
doChangeSpeed(cid, pokesride[sname].speed)
doCreatureSay(cid, "Let's ride, " .. sname, 1)
setPlayerStorageValue(cid, 59987, 1)
setPlayerStorageValue(cid, 59988, getCreatureHealth(getCreatureSummons(cid)[1]))
setPlayerStorageValue(cid, 59989, getCreatureMaxHealth(getCreatureSummons(cid)[1]))
doRemoveCreature(getCreatureSummons(cid)[1])
elseif getPlayerStorageValue(cid, 59987) >= 1 then
setPlayerStorageValue(cid, 59987, 0)
doRemoveCondition(cid, CONDITION_OUTFIT)
local item = getPokeOutLive(cid)[1]
doCreatureSay(cid, "Im tired of ride, " .. getItemAttribute(item, "poke"):match("This is (.-)'s pokeball."), 1)
pk = doSummonCreature(getItemAttribute(item, "poke"):match("This is (.-)'s pokeball."), getThingPosition(cid))
doConvinceCreature(cid, pk)
registerCreatureEvent(pk, "DiePoke")
registerCreatureEvent(cid, "PlayerPokeDeath")
registerCreatureEvent(cid, "LogoutPoke")
setCreatureMaxHealth(pk, getPlayerStorageValue(cid, 59989))
doCreatureAddHealth(pk, getPlayerStorageValue(cid, 59989))
doCreatureAddHealth(pk, getPlayerStorageValue(cid, 59988)-getPlayerStorageValue(cid, 59989))
doChangeSpeed(cid, getCreatureBaseSpeed(cid)-getCreatureSpeed(cid))
end
return TRUE
end
Pra usar o ride é so falar !ride. Para configurar os pokemons é praticamente igual ao surf.
Configurando os scripts
Como adicionar mais pokemons no go/back:
No inicio do script, tem essa tabela com as informaçoes:
Copie a ultima linha (vermelha) e cole logo abaixo, editando os nomes e as mensagens ficando assim:
Voce pode configurar o level para usar o poke mudando o valor de level.
Configurando pokemons para o catch:[/b]
Olhe a tabela no inicio do script:
Faça o mesmo processo do acima de copiar e colar embaixo e editar:
Aonde as informaçoes corpseid, chance, health, maxhealth serao, respectivamente: Id do corpo do monstro, Chance de capturar em %, health que o pokemon iria ir pro player, e health maxima que o poke iria ir para o player.
Como trocar os ids das pokebolas, acesas e apagadas.
Para trocar o id da pokebola "acesa" e "apagada" basta mudar os ids 2222,2223 na lib sendo que 2222 eh o da acesa e o 2223 eh o id da apagada
Mude tambem na tag do action.xml que seu script ira funcionar perfeitamente.
Como adicionar mais bordas ao surf.
Primeiramente va em actions.xml e adicione os ids das bordas na tag do surf: (Eu fiz com a borda de areia)
Depois va no script surf.lua em actions e repare nessa parte:
Copie todas as 4 bordas e cole abaixo ficando:
Depois mude os ids das bordas do lado << conforme as informaçoes do lado >>, ficando:
Como adicionar mais pokes ao surf:
Va no script surf.lua em actions e repare nessa parte:
Ai voce pode adicionar o pokemon pra surf e o outfit que ele vai te dar na agua copiando o de cima e colando logo abaixo e editando algumas coisas:
Lembre-se de depois que acabar de editar toda a tabela no surf.lua, va no goback.lua em creaturescripts e substitua a tabela pokes, pela que esta na actions surf.lua:
Como adicionar mais pokes no evolution:
Repare nessa parte do script evolution.lua em actions:
Bem voce deve copiar o primeiro monstro da tabela "pokes", e adicionar no final e mudar as configuraçoes:
Sendo level,evolution,maxh respectivamente, o level pra evoluir o poke, o nome da evoluçao, e a health maxima do pokemon evoluido.
Depois eh so adicionar o Nome do monstro que foi adicionado a tabela "pokes" na tabela "types", no lugar do type dele:
Como adicionar mais pokes no fly:
Repare nas partes iguais no fly.lua (talkaction) e no goback.lua(creaturescripts):
fly.lua:
goback.lua:
A unica coisa que mudou foi o nome da tabela, "pokes" e "pokesfly", para adicionar mais pokes no fly basta adicionar no fly.lua e botar igual no goback.lua.
Informaçoes Importantes!!!
Para testar o script de catch que esta no topico, voce deve deletar as tags de encantamento de armas.
Para poder summonar os pokemons com o go/back, voce precisa ir no arquivo.xml do monstro e editar essa linha:
Se estiver convinceable="0", mude para convinceable="1" ficando:
Creditos Especiais:
Kydrai pela funçao "getItemsInContainerById"
MarcelloMkez
Mock por algumas funçoes do fly system dele.
Agradecimentos:
D3rs00n (Me ajudou a fazer sumir o corpo do pokemon)
Julio Cezar (Ajudou reportando bugs e testando scripts)
Miih (Ajudou reportando bugs e testando scripts)
Arth3miS (Ajudou reportando bugs e testando scripts)
@Gabisaoo
Pow cara como eu disse no começo do topic, eu sou novo no xtibia, n conheço as regras e tals(nem sabia da de double post=s) dai tpw, fiquei com medo de editar um post antigo, dai nem editei. Mas na verdade eu estou en 2 EQUIPES (o,o)
@Topic
ATUALIZAÇÃO: Mais um humanoide bicudo pra galera do xtibia vota em n gostei (brinks pelo amor de deus n façam isso =s)
toma ai é só vc configurar certinho, que vai funfa de boua, fui
local area = createCombatArea{
{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}
}
function onUse(cid, item, frompos, itemEx, toPosition)
local configs = {
sec = 5, -- segundos para explodir
typex = COMBAT_FIREDAMAGE, -- tipo da explosão
min = 100, -- dano minimo da explosão
max = 1000, -- dano maximo da explosão
ef = 6, -- efeito da explosão
item = 2501, -- item ki vai criar no chão
level = 10, -- level para usar o item
}
if getPlayerLevel(cid) >= configs.level then
doCreateItem(configs.item, toPosition)
for i = 1, configs.sec do
local x = configs.sec - i
local n = math.random(256)
if i == 1 and x ~= 0 then
doSendAnimatedText(toPosition, x .. " sec", n)
elseif i <= configs.sec and i ~= 1 and x ~= 0 then
addEvent(doSendAnimatedText, i*1000, toPosition, x .. " sec", n)
end
end
addEvent(doCleanTile, 1000*configs.sec, toPosition, false)
addEvent(doAreaCombatHealth, 1000*configs.sec, cid, configs.typex, toPosition, area, -configs.min, -configs.max, configs.ef)
doRemoveItem(item.uid, 1)
else
doPlayerSendCancel(cid, "You need level ".. configs.level .." to use this item.")
end
return true
end
function onSay(cid, words, param)
local configs = {
level = 10 -- level para usar
efeitodistance = 3 -- efeito de distancia
typedamage = COMBAT_FIREDAMAGE -- tipo de dano
min = 10 -- atk minino
max = 20 -- atk maximo
exhausted = 1 -- exaustão em segundos
}
local summonuse = {"Dragon", "Dragon Lord", "Demon"} -- summons ki pode usar
if #getCreatureSummons(cid) == 0 then
return doPlayerSendCancel(cid, "You do not have any summon.")
end
if not isInArray(summonuse, getCreatureName(getCreatureSummons(cid)[1])) then
return doPlayerSendCancel(cid, "This summon not use fire ball.")
end
if getCreatureTarget(cid) == 0 then
return doPlayerSendTextMessage(cid, 19, "This Attack need any target.")
end
if getPlayerLevel(cid) < configs.level then
return doPlayerSendTextMessage(cid, 19, "You need level "..configs.level.." to use fire ball.")
end
function getTime(s)
local n = math.floor(s / 60)
s = s - (60 * n)
return n, s
end
if os.time()-getPlayerStorageValue(cid, 23231) <= configs.exhausted then
minutes,seconds = getTime(configs.exhausted-(os.time()-getPlayerStorageValue(cid, 23231)))
return doPlayerSendCancel(cid, "Summon exhausted")
end
doSendDistanceShoot(getCreaturePosition(getCreatureSummons(cid)[1]), getCreaturePosition(getCreatureTarget(cid)), configs.efeitodistance)
doAreaCombatHealth(getCreatureSummons(cid)[1], configs.typedamage, getThingPos(getCreatureTarget(cid)), 0, -configs.min, -configs.max, 3)
doPlayerSay(cid, getCreatureName(getCreatureSummons(cid)[1])..", Fireball", 1)
setPlayerStorageValue(cid, 23231, os.time()+configs.exhausted)
return true
end
Creditos:Apocarai,Lucasatak
Versao: 8.50 e 8.54
Tipo:Movements
Explicaçao:Você tem que ter 100 gps (COLD COINS) na mao,depois disso,bote a bp of holding e depois ela irá começar a andar,para controla-lá aperte ctrl+setas!
vamo aos scripts,
vá em data/movements/scripts copie qualquer arquivo e renomeio para jetpack.lua e cole isto:
1º, procure antes de postar...
2º, fiz um tópico sobre uma coisa parecida, não teve muita repercussão )
3º esse é o meu
esse é de um outro cara, peguei na área de design, aqui
4º a parte de descobrir como ficará o ID do novo item, acho q n tem no fórum, mas sei q tem em outro.
ae acho q não pode postar links de outros fórums, ae te mando por PM.
duvidas, poste novamente.