Ir para conteúdo

[Pedido] Npc Que Vende 4 Vocações Novas.


teteusinhu

Posts Recomendados

Tipo do script: NPC

Protocolo (versão do Tibia):8.60

Servidor utilizado:JogaTerra ou Styller Yurotz

Nível de experiência: Intermediário

Adicionais/Informações: Bom gostaria de um scripts no qual eu conseguisse que o npc vendesse as 4 vocações novas. No caso adicionem 4 novas vocações : Terra Knight, Terra Paladin, Terra Sorcerer e Terra Druid. Tentei de tudo aqui e não consegui por faovr gostaria de um script bem detalhado explicando certinho. Pois ja adcionei as vocações.

no data\XML\vocations.xml

<vocation id="9" name="Terra Sorcerer" description="um terra sorcerer" needpremium="0" gaincap="10" gainhp="5" gainmana="30" gainhpticks="4" gainhpamount="10" gainmanaticks="2" gainmanaamount="10" manamultiplier="1.1" attackspeed="2000" soulmax="200" gainsoulticks="15" fromvoc="5" lessloss="50">
	<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.5" club="2.0" sword="2.0" axe="2.0" distance="2.0" shielding="1.5" fishing="1.1" experience="1.0"/>
</vocation>
<vocation id="10" name="Terra Druid" description="um terra druid" needpremium="0" gaincap="10" gainhp="5" gainmana="30" gainhpticks="4" gainhpamount="10" gainmanaticks="2" gainmanaamount="10" manamultiplier="1.1" attackspeed="2000" soulmax="200" gainsoulticks="15" fromvoc="6" lessloss="50">
	<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.5" club="1.8" sword="1.8" axe="1.8" distance="1.8" shielding="1.5" fishing="1.1" experience="1.0"/>
</vocation>
<vocation id="11" name="Terra Paladin" description="um terra paladin" needpremium="0" gaincap="20" gainhp="10" gainmana="15" gainhpticks="3" gainhpamount="10" gainmanaticks="3" gainmanaamount="10" manamultiplier="1.4" attackspeed="2000" soulmax="200" gainsoulticks="15" fromvoc="7" lessloss="50">
	<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.2" club="1.2" sword="1.2" axe="1.2" distance="1.1" shielding="1.1" fishing="1.1" experience="1.0"/>
</vocation>
<vocation id="12" name="Terra Knight" description="um terra knight" needpremium="0" gaincap="25" gainhp="15" gainmana="5" gainhpticks="8" gainhpamount="10" gainmanaticks="4" gainmanaamount="10" manamultiplier="3.0" attackspeed="2000" soulmax="200" gainsoulticks="15" fromvoc="8" lessloss="50">
	<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="1.1" club="1.1" sword="1.1" axe="1.1" distance="1.4" shielding="1.1" fishing="1.1" experience="1.0"/>
</vocation>

 

Agora queria criar o npc que venda tais vocações... Me ajuda por favor =DDDD

 

Att,

teteusinhu.

Link para o comentário
Compartilhar em outros sites

Vo te manda o script de NPC que vende as 4 promotions novas:

 

1º - Va na pasta data/npc/scripts/

Cria um arquivo chamado promotion, se ja tiver so colocar o code abaixo por cima:

OBS: Arrumar Preço, leias as linhas:

 

local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)

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



local node1 = keywordHandler:addKeyword({'promot'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'Posso promove-lo para Primeira Promotion por 20k. Voce quer?'})
node1:addChildKeyword({'yes'}, StdModule.promotePlayer, {npcHandler = npcHandler, cost = 20000, level = 20, promotion = 1, text = 'Agora voce tem a primeira promotion.'})
node1:addChildKeyword({'no'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'Tudo bem, volte quando estiver pronto.', reset = true})




local node2 = keywordHandler:addKeyword({'vip'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'Posso promove-lo para Promotion VIP por 500k. Voce quer?'})
node2:addChildKeyword({'yes'}, StdModule.promotePlayer, {npcHandler = npcHandler, cost = 500000, level = 10, promotion = 2, text = 'Agora voce tem a VIP promotion.'})
node2:addChildKeyword({'no'}, StdModule.say, {npcHandler = npcHandler, onlyFocus = true, text = 'Tudo bem, volte quando estiver pronto.', reset = true})

npcHandler:addModule(FocusModule:new())

 

Credits ----- É muito bom para ser meu!

 

NPC agora:

2º - Va data/npc

Copie um arquivo Xml, apague tudo e cole isso:

Para mudar nome:

Para mudar roupa:

 

<?xml version="1.0"?>

<npc name="Grand johnny" script="data/npc/scripts/promotion.lua" access="3" lookdir="2">
<mana now="800" max="800"/>
<health now="200" max="200"/>
<look type="133" head="114" body="119" legs="132" feet="114"/>
</npc>

 

Boa, se não der me avisa aqui mesmo!! Ou me reporte o erro!

Editado por romera
Link para o comentário
Compartilhar em outros sites

Seguinte deu tudo certo no NPC mas tem um erro, não sie pq ja fiz de tudo tirei Uma Print aqui para você ver o que acontece logo após a Promotion:

 

Repare bem, quando dou look no meu Char , Não aparece a Promotion e Consecutivamente o char buga, não podendo usar nenhuma magia. Bugando todo o char.

 

Veja:

ajudaq.jpg

 

 

Me ajude POR FAVOR =((((

Link para o comentário
Compartilhar em outros sites

uahsuahs, denovo, esse mesmo erro

 

facil:

 

copia esse code e passa em cima do seu function, mas primeiro faz um backup do seu, depois passa oq que ta na pasta data/lib/function:

 

--EDIT--

 

 

Cara envez de copiar olha no seu function primeiro se tem alguma parte igual a essa:

 

return (isInArray({1,5}, getPlayerVocation(cid)) == TRUE)

 

n exatamente igual mas que tenha os dois numeros...? se tiver é so adicionar a ID da proxima promotion tendeu? é so colocar 9,10,11,12 porque seu promotion e igual ao meu: vai ficar assim:

 

return (isInArray({1,5,9}, getPlayerVocation(cid)) == TRUE)

 

 

function doPlayerGiveItem(cid, itemid, amount, subType)

local item = 0

if(isItemStackable(itemid) == TRUE) then

item = doCreateItemEx(itemid, amount)

if(doPlayerAddItemEx(cid, item, TRUE) ~= RETURNVALUE_NOERROR) then

return LUA_ERROR

end

else

for i = 1, amount do

item = doCreateItemEx(itemid, subType)

if(doPlayerAddItemEx(cid, item, TRUE) ~= RETURNVALUE_NOERROR) then

return LUA_ERROR

end

end

end

 

return LUA_NO_ERROR

end

 

function doPlayerTakeItem(cid, itemid, amount)

if(getPlayerItemCount(cid, itemid) < amount or doPlayerRemoveItem(cid, itemid, amount) ~= TRUE) then

return LUA_ERROR

end

 

return LUA_NO_ERROR

end

 

function doPlayerBuyItem(cid, itemid, count, cost, charges)

if(doPlayerRemoveMoney(cid, cost) ~= TRUE) then

return LUA_ERROR

end

 

return doPlayerGiveItem(cid, itemid, count, charges)

end

 

function doPlayerBuyItemContainer(cid, containerid, itemid, count, cost, charges)

if(doPlayerRemoveMoney(cid, cost) ~= TRUE) then

return LUA_ERROR

end

 

for i = 1, count do

local container = doCreateItemEx(containerid, 1)

for x = 1, getContainerCapById(containerid) do

doAddContainerItem(container, itemid, charges)

end

 

if(doPlayerAddItemEx(cid, container, TRUE) ~= RETURNVALUE_NOERROR) then

return LUA_ERROR

end

end

 

return LUA_NO_ERROR

end

 

function doPlayerSellItem(cid, itemid, count, cost)

if(doPlayerTakeItem(cid, itemid, count) ~= LUA_NO_ERROR) then

return LUA_ERROR

end

 

if(doPlayerAddMoney(cid, cost) ~= TRUE) then

error('Could not add money to: ' .. getPlayerName(cid) .. ' (' .. cost .. 'gp).')

end

 

return LUA_NO_ERROR

end

 

function isInRange(pos, fromPos, toPos)

return (pos.x >= fromPos.x and pos.y >= fromPos.y and pos.z >= fromPos.z and pos.x <= toPos.x and pos.y <= toPos.y and pos.z <= toPos.z) and TRUE or FALSE

end

 

function isPremium(cid)

return (isPlayer(cid) == TRUE and (getPlayerPremiumDays(cid) > 0 or getConfigInfo('freePremium') == "yes")) and TRUE or FALSE

end

 

function getMonthDayEnding(day)

if day == "01" or day == "21" or day == "31" then

return "st"

elseif day == "02" or day == "22" then

return "nd"

elseif day == "03" or day == "23" then

return "rd"

else

return "th"

end

end

 

function getMonthString(m)

return os.date("%B", os.time{year = 1970, month = m, day = 1})

end

 

function getArticle(str)

return str:find("[AaEeIiOoUuYy]") == 1 and "an" or "a"

end

 

function isNumber(str)

return tonumber(str) ~= nil and TRUE or FALSE

end

 

function getDistanceBetween(firstPosition, secondPosition)

local xDif = math.abs(firstPosition.x - secondPosition.x)

local yDif = math.abs(firstPosition.y - secondPosition.y)

 

local posDif = math.max(xDif, yDif)

if(firstPosition.z ~= secondPosition.z) then

posDif = posDif + 9 + 6

end

return posDif

end

 

function doPlayerAddAddons(cid, addon)

for i = 0, table.maxn(maleOutfits) do

doPlayerAddOutfit(cid, maleOutfits, addon)

end

 

for i = 0, table.maxn(femaleOutfits) do

doPlayerAddOutfit(cid, femaleOutfits, addon)

end

end

 

function isSorcerer(cid)

if(isPlayer(cid) == FALSE) then

debugPrint("isSorcerer: Jogador nao encontrado.")

return false

end

 

return (isInArray({1,5,9}, getPlayerVocation(cid)) == TRUE)

end

 

function isDruid(cid)

if(isPlayer(cid) == FALSE) then

debugPrint("isDruid: Jogador nao encontrado.")

return false

end

 

return (isInArray({2,6,10}, getPlayerVocation(cid)) == TRUE)

end

 

function isPaladin(cid)

if(isPlayer(cid) == FALSE) then

debugPrint("isPaladin: Jogador nao encontrado.")

return false

end

 

return (isInArray({3,7,11}, getPlayerVocation(cid)) == TRUE)

end

 

function isKnight(cid)

if(isPlayer(cid) == FALSE) then

debugPrint("isKnight: Jogador nao encontrado.")

return false

end

 

return (isInArray({4,8,12}, getPlayerVocation(cid)) == TRUE)

end

 

function isRookie(cid)

if(isPlayer(cid) == FALSE) then

debugPrint("isRookie: Jogador nao encontrado.")

return false

end

 

return (isInArray({0}, getPlayerVocation(cid)) == TRUE)

end

 

function getDirectionTo(pos1, pos2)

local dir = NORTH

if(pos1.x > pos2.x) then

dir = WEST

if(pos1.y > pos2.y) then

dir = NORTHWEST

elseif(pos1.y < pos2.y) then

dir = SOUTHWEST

end

elseif(pos1.x < pos2.x) then

dir = EAST

if(pos1.y > pos2.y) then

dir = NORTHEAST

elseif(pos1.y < pos2.y) then

dir = SOUTHEAST

end

else

if(pos1.y > pos2.y) then

dir = NORTH

elseif(pos1.y < pos2.y) then

dir = SOUTH

end

end

return dir

end

 

function getPlayerLookPos(cid)

return getPosByDir(getThingPos(cid), getPlayerLookDir(cid))

end

 

function getPosByDir(fromPosition, direction, size)

local n = size or 1

 

local pos = fromPosition

if(direction == NORTH) then

pos.y = pos.y - n

elseif(direction == SOUTH) then

pos.y = pos.y + n

elseif(direction == WEST) then

pos.x = pos.x - n

elseif(direction == EAST) then

pos.x = pos.x + n

elseif(direction == NORTHWEST) then

pos.y = pos.y - n

pos.x = pos.x - n

elseif(direction == NORTHEAST) then

pos.y = pos.y - n

pos.x = pos.x + n

elseif(direction == SOUTHWEST) then

pos.y = pos.y + n

pos.x = pos.x - n

elseif(direction == SOUTHEAST) then

pos.y = pos.y + n

pos.x = pos.x + n

end

 

return pos

end

 

function getPlayerMoney(cid)

return ((getPlayerItemCount(cid, ITEM_CRYSTAL_COIN) * 10000) + (getPlayerItemCount(cid, ITEM_PLATINUM_COIN) * 100) + getPlayerItemCount(cid, ITEM_GOLD_COIN))

end

 

function doPlayerWithdrawAllMoney(cid)

return doPlayerWithdrawMoney(cid, getPlayerBalance(cid))

end

 

function doPlayerDepositAllMoney(cid)

return doPlayerDepositMoney(cid, getPlayerMoney(cid))

end

 

function doPlayerTransferAllMoneyTo(cid, target)

return doPlayerTransferMoneyTo(cid, target, getPlayerBalance(cid))

end

 

function playerExists(name)

return getPlayerGUIDByName(name) ~= 0

end

 

function getTibiaTime()

local minutes = getWorldTime()

local hours = 0

while (minutes > 60) do

hours = hours + 1

minutes = minutes - 60

end

 

return {hours = hours, minutes = minutes}

end

 

function doWriteLogFile(file, text)

local file = io.open(file, "a+")

file:write("[" .. os.date("%d/%m/%Y %H:%M:%S") .. "] " .. text .. "\n")

file:close()

end

 

function getExperienceForLevel(lv)

lv = lv - 1

return ((50 * lv * lv * lv) - (150 * lv * lv) + (400 * lv)) / 3

end

 

function doMutePlayer(cid, time)

local condition = createConditionObject(CONDITION_MUTED)

setConditionParam(condition, CONDITION_PARAM_TICKS, time * 1000)

return doAddCondition(cid, condition)

end

 

function getPlayerVocationName(cid)

return getVocationInfo(getPlayerVocation(cid)).name

end

 

function getPromotedVocation(vid)

return getVocationInfo(vid).promotedVocation

end

 

function doPlayerRemovePremiumDays(cid, days)

return doPlayerAddPremiumDays(cid, -days)

end

 

function getPlayerMasterPos(cid)

return getTownTemplePosition(getPlayerTown(cid))

end

 

function getItemNameById(itemid)

return getItemDescriptionsById(itemid).name

end

 

function getItemPluralNameById(itemid)

return getItemDescriptionsById(itemid).plural

end

 

function getItemArticleById(itemid)

return getItemDescriptionsById(itemid).article

end

 

function getItemName(uid)

return getItemDescriptions(uid).name

end

 

function getItemPluralName(uid)

return getItemDescriptions(uid).plural

end

 

function getItemArticle(uid)

return getItemDescriptions(uid).article

end

 

function getItemText(uid)

return getItemDescriptions(uid).text

end

 

function getItemWriter(uid)

return getItemDescriptions(uid).writer

end

 

function getItemDate(uid)

return getItemDescriptions(uid).date

end

 

function getTilePzInfo(pos)

return getTileInfo(pos).protection and TRUE or FALSE

end

 

function getTileZoneInfo(pos)

local tmp = getTileInfo(pos)

if(tmp.pvp) then

return 2

end

 

if(tmp.nopvp) then

return 1

end

 

return 0

end

 

function debugPrint(text)

return io.stdout:write(text)

end

 

function doShutdown()

return doSetGameState(GAMESTATE_SHUTDOWN)

end

 

function doSummonCreature(name, pos)

local cid = doCreateMonster(name, pos)

if(cid ~= LUA_ERROR) then

return cid

end

 

cid = doCreateNpc(name, pos)

return cid

end

 

function getOnlinePlayers()

local tmp = getPlayersOnline()

local players = {}

for i, cid in ipairs(tmp) do

table.insert(players, getCreatureName(cid))

end

 

return players

end

 

function getPlayerByName(name)

local cid = getCreatureByName(name)

return isPlayer(cid) == TRUE and cid or nil

end

 

function isPlayerGhost(cid)

return isPlayer(cid) == TRUE and getCreatureCondition(cid, CONDITION_GAMEMASTER, GAMEMASTER_INVISIBLE) or FALSE

end

 

function doPlayerSetExperienceRate(cid, value)

return doPlayerSetRate(cid, SKILL__LEVEL, value)

end

 

function doPlayerSetMagicRate(cid, value)

return doPlayerSetRate(cid, SKILL__MAGLEVEL, value)

end

 

function getPlayerFrags(cid)

return math.ceil((getPlayerRedSkullTicks(cid) / getConfigInfo('timeToDecreaseFrags')) + 1)

end

 

function getPartyLeader(cid)

local party = getPartyMembers(cid)

if(type(party) ~= 'table') then

return 0

end

 

return party[1]

end

 

function isInParty(cid)

return type(getPartyMembers(cid)) == 'table' and TRUE or FALSE

end

 

function isPrivateChannel(channelId)

for i = CHANNEL_GUILD, CHANNEL_HELP do

if(channelId == i) then

return FALSE

end

end

 

return TRUE

end

 

function doConvertIntegerToIp(int, mask)

local b4 = bit.urshift(bit.uband(int, 4278190080), 24)

local b3 = bit.urshift(bit.uband(int, 16711680), 16)

local b2 = bit.urshift(bit.uband(int, 65280), 8)

local b1 = bit.urshift(bit.uband(int, 255), 0)

if(mask ~= nil) then

local m4 = bit.urshift(bit.uband(mask, 4278190080), 24)

local m3 = bit.urshift(bit.uband(mask, 16711680), 16)

local m2 = bit.urshift(bit.uband(mask, 65280), 8)

local m1 = bit.urshift(bit.uband(mask, 255), 0)

if((m1 == 255 or m1 == 0) and (m2 == 255 or m2 == 0) and (m3 == 255 or m3 == 0) and (m4 == 255 or m4 == 0)) then

if m1 == 0 then b1 = "x" end

if m2 == 0 then b2 = "x" end

if m3 == 0 then b3 = "x" end

if m4 == 0 then b4 = "x" end

elseif(m1 ~= 255 or m2 ~= 255 or m3 ~= 255 or m4 ~= 255) then

return b1 .. "." .. b2 .. "." .. b3 .. "." .. b4 .. " : " .. m1 .. "." .. m2 .. "." .. m3 .. "." .. m4

end

end

 

return b1 .. "." .. b2 .. "." .. b3 .. "." .. b4

end

 

function doConvertIpToInteger(str)

local maskindex = str:find(":")

if(maskindex == nil) then

local ipint = 0

local maskint = 0

 

local index = 24

for b in str:gmatch("([x%d]+)%.?") do

if(b ~= "x") then

if(b:find("x") ~= nil) then

return 0, 0

end

 

if(tonumber(b) > 255 or tonumber(b) < 0) then

return 0, 0

end

 

maskint = bit.ubor(maskint, bit.ulshift(255, index))

ipint = bit.ubor(ipint, bit.ulshift(b, index))

end

 

index = index - 8

if(index < 0) then

break

end

end

 

if(index ~= -8) then

return 0, 0

end

 

return ipint, maskint

end

 

if(maskindex <= 1) then

return 0, 0

end

 

local ipstring = str:sub(1, maskindex - 1)

local maskstring = str:sub(maskindex)

 

local ipint = 0

local maskint = 0

 

local index = 0

for b in ipstring:gmatch("(%d+).?") do

if(tonumber(b) > 255 or tonumber(b) < 0) then

return 0, 0

end

 

ipint = bit.ubor(ipint, bit.ulshift(b, index))

index = index + 8

if(index > 24) then

break

end

end

 

if(index ~= 32) then

return 0, 0

end

 

index = 0

for b in maskstring:gmatch("(%d+)%.?") do

if(tonumber(b) > 255 or tonumber(b) < 0) then

return 0, 0

end

 

maskint = bit.ubor(maskint, bit.ulshift(b, index))

index = index + 8

if(index > 24) then

break

end

end

 

if(index ~= 32) then

return 0, 0

end

 

return ipint, maskint

end

 

function getBooleanFromString(str)

return (str:lower() == "yes" or str:lower() == "true" or (tonumber(str) and tonumber(str) > 0)) and TRUE or FALSE

end

 

function doCopyItem(item, attributes)

local attributes = attributes or FALSE

 

local ret = doCreateItemEx(item.itemid, item.type)

if(attributes == TRUE) then

if(item.actionid > 0) then

doSetItemActionId(ret, item.actionid)

end

end

 

if(isContainer(item.uid) == TRUE) then

for i = (getContainerSize(item.uid) - 1), 0, -1 do

local tmp = getContainerItem(item.uid, i)

if(tmp.itemid > 0) then

doAddContainerItemEx(ret, doCopyItem(tmp, TRUE).uid)

end

end

end

 

return getThing(ret)

end

 

table.find = function (table, value)

for i, v in pairs(table) do

if(v == value) then

return i

end

end

 

return nil

end

 

table.isStrIn = function (txt, str)

for i, v in pairs(str) do

if(txt:find(v) and not txt:find('(%w+)' .. v) and not txt:find(v .. '(%w+)')) then

return true

end

end

 

return false

end

 

table.countElements = function (table, item)

local count = 0

for i, n in pairs(table) do

if(item == n) then

count = count + 1

end

end

 

return count

end

 

table.getCombinations = function (table, num)

local a, number, select, newlist = {}, #table, num, {}

for i = 1, select do

a[#a + 1] = i

end

 

local newthing = {}

while(true) do

local newrow = {}

for i = 1, select do

newrow[#newrow + 1] = table[a]

end

 

newlist[#newlist + 1] = newrow

i = select

while(a == (number - select + i)) do

i = i - 1

end

 

if(i < 1) then

break

end

 

a = a + 1

for j = i, select do

a[j] = a + j - i

end

end

 

return newlist

end

 

string.split = function (str)

local t = {}

local function helper(word)

table.insert(t, word)

return ""

end

 

if(not str:gsub("%w+", helper):find("%S")) then

return t

end

end

 

string.trim = function (str)

return (string.gsub(str, "^%s*(.-)%s*{:content:}quot;, "%1"))

end

 

string.explode = function (str, sep)

local pos, t = 1, {}

if #sep == 0 or #str == 0 then

return

end

 

for s, e in function() return str:find(sep, pos) end do

table.insert(t, str:sub(pos, s - 1):trim())

pos = e + 1

end

 

table.insert(t, str:sub(pos):trim())

return t

end

Editado por romera
Link para o comentário
Compartilhar em outros sites

  • 6 months later...

ainda tenho uma duvida, o NPC tá vendendo normal a promote vip, mas o nome novo não ta aparecendo, já dei logout e nada continua o mesmo nome da vocação,dá uma luz ae. valendo REP ++

Editado por kevonus
Link para o comentário
Compartilhar em outros sites

×
×
  • Criar Novo...