Olá a todos. É o seguinte, estou abrindo um ot 10.98 ok TFS 1.3.
A situação é essa, eu tirei a vocação Sorc e coloquei a do druid como Mage.
O mage pode ter 2 promos, o knight 2 promos e o pally 2 promos.
Segue o vocations.xml
<?xml version="1.0" encoding="UTF-8"?>
<vocations>
<vocation id="0" clientid="0" name="None" description="none" gaincap="10" gainhp="5" gainmana="5" gainhpticks="6" gainhpamount="1" gainmanaticks="6" gainmanaamount="1" manamultiplier="4.0" attackspeed="2000" basespeed="220" soulmax="100" gainsoulticks="120" fromvoc="0">
<formula meleeDamage="1.0" distDamage="1.0" defense="1.0" armor="1.0" />
<skill id="0" multiplier="1.5" />
<skill id="1" multiplier="2.0" />
<skill id="2" multiplier="2.0" />
<skill id="3" multiplier="2.0" />
<skill id="4" multiplier="2.0" />
<skill id="5" multiplier="1.5" />
<skill id="6" multiplier="1.1" />
</vocation>
<vocation id="2" name="Mage" clientid="4" description="a mage" gaincap="10" gainhp="5" gainmana="30" gainhpticks="6" gainhpamount="5" gainmanaticks="3" gainmanaamount="5" manamultiplier="1.1" attackspeed="2000" basespeed="220" soulmax="100" gainsoulticks="120" fromvoc="2">
<formula meleeDamage="1.0" distDamage="1.0" defense="1.0" armor="1.0" />
<skill id="0" multiplier="1.5" />
<skill id="1" multiplier="1.8" />
<skill id="2" multiplier="1.8" />
<skill id="3" multiplier="1.8" />
<skill id="4" multiplier="1.8" />
<skill id="5" multiplier="1.5" />
<skill id="6" multiplier="1.1" />
</vocation>
<vocation id="3" clientid="2" name="Paladin" description="a paladin" gaincap="20" gainhp="10" gainmana="15" gainhpticks="4" gainhpamount="5" gainmanaticks="4" gainmanaamount="5" manamultiplier="1.4" attackspeed="2000" basespeed="220" soulmax="100" gainsoulticks="120" fromvoc="3">
<formula meleeDamage="1.0" distDamage="1.0" defense="1.0" armor="1.0" />
<skill id="0" multiplier="1.2" />
<skill id="1" multiplier="1.2" />
<skill id="2" multiplier="1.2" />
<skill id="3" multiplier="1.2" />
<skill id="4" multiplier="1.1" />
<skill id="5" multiplier="1.1" />
<skill id="6" multiplier="1.1" />
</vocation>
<vocation id="4" clientid="1" name="Knight" description="a knight" gaincap="25" gainhp="15" gainmana="5" gainhpticks="3" gainhpamount="5" gainmanaticks="6" gainmanaamount="5" manamultiplier="3.0" attackspeed="2000" basespeed="220" soulmax="100" gainsoulticks="120" fromvoc="4">
<formula meleeDamage="1.0" distDamage="1.0" defense="1.0" armor="1.0" />
<skill id="0" multiplier="1.1" />
<skill id="1" multiplier="1.1" />
<skill id="2" multiplier="1.1" />
<skill id="3" multiplier="1.1" />
<skill id="4" multiplier="1.4" />
<skill id="5" multiplier="1.1" />
<skill id="6" multiplier="1.1" />
</vocation>
<vocation id="5" clientid="4" name="Master Wizard" description="a master wizard" gaincap="10" gainhp="5" gainmana="30" gainhpticks="4" gainhpamount="10" gainmanaticks="2" gainmanaamount="10" manamultiplier="1.1" attackspeed="2000" basespeed="220" soulmax="200" gainsoulticks="15" fromvoc="2">
<formula meleeDamage="1.0" distDamage="1.0" defense="1.0" armor="1.0" />
<skill id="0" multiplier="1.5" />
<skill id="1" multiplier="2.0" />
<skill id="2" multiplier="2.0" />
<skill id="3" multiplier="2.0" />
<skill id="4" multiplier="2.0" />
<skill id="5" multiplier="1.5" />
<skill id="6" multiplier="1.1" />
</vocation>
<vocation id="6" clientid="4" name="Elder Wizard" description="an elder druid" gaincap="10" gainhp="5" gainmana="30" gainhpticks="4" gainhpamount="10" gainmanaticks="2" gainmanaamount="10" manamultiplier="1.1" attackspeed="2000" basespeed="220" soulmax="200" gainsoulticks="15" fromvoc="2">
<formula meleeDamage="1.0" distDamage="1.0" defense="1.0" armor="1.0" />
<skill id="0" multiplier="1.5" />
<skill id="1" multiplier="1.8" />
<skill id="2" multiplier="1.8" />
<skill id="3" multiplier="1.8" />
<skill id="4" multiplier="1.8" />
<skill id="5" multiplier="1.5" />
<skill id="6" multiplier="1.1" />
</vocation>
<vocation id="7" clientid="2" name="Swift Paladin" description="a swift paladin" gaincap="20" gainhp="10" gainmana="15" gainhpticks="3" gainhpamount="10" gainmanaticks="3" gainmanaamount="10" manamultiplier="1.4" attackspeed="2000" basespeed="220" soulmax="200" gainsoulticks="15" fromvoc="3">
<formula meleeDamage="1.0" distDamage="1.0" defense="1.0" armor="1.0" />
<skill id="0" multiplier="1.2" />
<skill id="1" multiplier="1.2" />
<skill id="2" multiplier="1.2" />
<skill id="3" multiplier="1.2" />
<skill id="4" multiplier="1.1" />
<skill id="5" multiplier="1.1" />
<skill id="6" multiplier="1.1" />
</vocation>
<vocation id="8" clientid="1" name="Guardian Knight" description="an guardian knight" gaincap="25" gainhp="15" gainmana="5" gainhpticks="2" gainhpamount="10" gainmanaticks="4" gainmanaamount="10" manamultiplier="3.0" attackspeed="2000" basespeed="220" soulmax="200" gainsoulticks="15" fromvoc="4">
<formula meleeDamage="1.0" distDamage="1.0" defense="1.0" armor="1.0" />
<skill id="0" multiplier="1.1" />
<skill id="1" multiplier="1.1" />
<skill id="2" multiplier="1.1" />
<skill id="3" multiplier="1.1" />
<skill id="4" multiplier="1.4" />
<skill id="5" multiplier="1.1" />
<skill id="6" multiplier="1.1" />
</vocation>
<vocation id="9" clientid="2" name="Heavy Paladin" description="a heavy paladin" gaincap="20" gainhp="10" gainmana="15" gainhpticks="3" gainhpamount="10" gainmanaticks="3" gainmanaamount="10" manamultiplier="1.4" attackspeed="2000" basespeed="220" soulmax="200" gainsoulticks="15" fromvoc="3">
<formula meleeDamage="1.0" distDamage="1.0" defense="1.0" armor="1.0" />
<skill id="0" multiplier="1.2" />
<skill id="1" multiplier="1.2" />
<skill id="2" multiplier="1.2" />
<skill id="3" multiplier="1.2" />
<skill id="4" multiplier="1.1" />
<skill id="5" multiplier="1.1" />
<skill id="6" multiplier="1.1" />
</vocation>
<vocation id="10" clientid="1" name="Berserk Knight" description="an berserk knight" gaincap="25" gainhp="15" gainmana="5" gainhpticks="2" gainhpamount="10" gainmanaticks="4" gainmanaamount="10" manamultiplier="3.0" attackspeed="2000" basespeed="220" soulmax="200" gainsoulticks="15" fromvoc="4">
<formula meleeDamage="1.0" distDamage="1.0" defense="1.0" armor="1.0" />
<skill id="0" multiplier="1.1" />
<skill id="1" multiplier="1.1" />
<skill id="2" multiplier="1.1" />
<skill id="3" multiplier="1.1" />
<skill id="4" multiplier="1.4" />
<skill id="5" multiplier="1.1" />
<skill id="6" multiplier="1.1" />
</vocation>
</vocations>
Certo. Ai para cada vocação (Mage, Knight e Paladin) criei um NPC, no qual apenas funcionou para o Knight ter as 2 promos
King warrior.xml
<?xml version="1.0" encoding="UTF-8"?>
<npc name="King Warrior" script="promotionKina.lua" walkinterval="2000" floorchange="0">
<health now="100" max="100" />
<look type="133" head="20" body="39" legs="45" feet="7" addons="0" />
<parameters>
<parameter key="module_travel" value="1"/>
<parameter key="message_greet" value="Olá |PLAYERNAME|. Eu Vendo Promotions Quer comprar alguma {promotion} ?" />
</parameters>
</npc>
promotionKina.lua
-- config by uotl£
config = {[4] = { -- [coloca vocation que tem que ser antes de escolher]
lvl = 35, -- level tem que ser maior que 50
id_da_vocation = 8,nome_da_vocation = "Guardian Knight", -- id da primeira vocation que pode compra e o nome dela
id_da_vocation2 = 10,nome_da_vocation2 = "Berserk Knight"} -- id da segunda vocation que pode compra e o nome dela
}
local fala_do_npc = "Desculpe, mas voce esta falando com a pessoa errada." -- fala do npc se ja tiver comprado e se não for vocation certa
local preco = 0 -- preço por platinum 100 que e igual 1 crystal
-- config by uotl£
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
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
voc = config[getPlayerVocation(cid)]
if(msgcontains(msg, 'promotion') or msgcontains(msg, 'promotions')) then
check (cid,talkUser)
elseif (msgcontains(msg, voc.nome_da_vocation) and talkState[talkUser] == 1) then
talkState[talkUser] = 2
selfSay("tem certeza que voce quer ser [ "..voc.nome_da_vocation.." ] ? [yes] ou [no]", cid)
elseif (msgcontains(msg, 'yes') and talkState[talkUser] == 2) then
v1_check (cid,talkUser,numero_s)
elseif (msgcontains(msg, 'no') and talkState[talkUser] == 2) then
talkState[talkUser] = 0
selfSay("ate mais volte quando decidir", cid)
elseif (msgcontains(msg, voc.nome_da_vocation2) and talkState[talkUser] == 1) then
talkState[talkUser] = 3
selfSay("tem certeza que voce quer ser ["..voc.nome_da_vocation2.."] ? [yes] ou [no]", cid)
elseif (msgcontains(msg, 'yes') and talkState[talkUser] == 3) then
v2_check (cid,talkUser,numero_s)
talkState[talkUser] = 0
elseif (msgcontains(msg, 'no') and talkState[talkUser] == 3) then
talkState[talkUser] = 0
selfSay("ate mais volte quando decidir", cid)
end
end
function check (cid,talkUser)
if voc then
if getPlayerLevel(cid) >= voc.lvl then
talkState[talkUser] = 1
selfSay('Posso lhe conceder a promocao [ '..voc.nome_da_vocation..' ] OU ['..voc.nome_da_vocation2..'] ao atingir level 35', cid)
else
selfSay('volta aqui quando pegar level '..voc.lvl..'', cid)
talkState[talkUser] = 0
end
else
selfSay(fala_do_npc, cid)
talkState[talkUser] = 0
return true
end
end
function v1_check (cid,talkUser)
if(doPlayerRemoveMoney(cid, (preco*100)) == true) then
doPlayerSetVocation(cid, voc.id_da_vocation)
selfSay("parabens agora voce e "..voc.nome_da_vocation.."", cid)
talkState[talkUser] = 0
else
selfSay('volta aqui quando tiver dinheiro '..preco..' moedas de platinum', cid)
talkState[talkUser] = 0
end
return true
end
function v2_check (cid,talkUser)
if(doPlayerRemoveMoney(cid, (preco*100)) == true) then
doPlayerSetVocation(cid, voc.id_da_vocation2)
selfSay("parabens agora voce e "..voc.nome_da_vocation2.."", cid)
talkState[talkUser] = 0
else
selfSay('volta aqui quando tiver dinheiro '..preco..' moedas de platinum', cid)
talkState[talkUser] = 0
end
return true
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
Já testei e está funcionando. Tive que tirar do login.lua uma parte do script de promotion para funcionar.
login.lua
function onLogin(player)
local loginStr = "Welcome to " .. configManager.getString(configKeys.SERVER_NAME) .. "!"
if player:getLastLoginSaved() <= 0 then
loginStr = loginStr .. " Please choose your outfit."
player:sendOutfitWindow()
else
if loginStr ~= "" then
player:sendTextMessage(MESSAGE_STATUS_DEFAULT, loginStr)
end
loginStr = string.format("Your last visit was on %s.", os.date("%a %b %d %X %Y", player:getLastLoginSaved()))
end
player:sendTextMessage(MESSAGE_STATUS_DEFAULT, loginStr)
-- Stamina
nextUseStaminaTime[player.uid] = 0
-- Promotion
local vocation = player:getVocation()
--local promotion = vocation:getPromotion()
--if player:isPremium() then
-- local value = player:getStorageValue(STORAGEVALUE_PROMOTION)
-- if not promotion and value ~= 1 then
-- player:setStorageValue(STORAGEVALUE_PROMOTION, 1)
-- elseif value == 1 then
-- player:setVocation(promotion)
-- end
--elseif not promotion then
-- player:setVocation(vocation:getDemotion())
--end -->
-- Events
player:registerEvent("PlayerDeath")
player:registerEvent("DropLoot")
return true
end
Porém com ou sem essa alteração no login.lua
O NPC para promoções de pally e mage não estão reconhecendo a vocação do personagem... quero dizer, eles falam a parte do script como se não fosse a voc correta.
Segue
NPC King Wizard.xml
<?xml version="1.0" encoding="UTF-8"?>
<npc name="King Wizard" script="promotionMage.lua" walkinterval="2000" floorchange="0">
<health now="100" max="100" />
<look type="133" head="20" body="39" legs="45" feet="7" addons="0" />
<parameters>
<parameter key="module_travel" value="1"/>
<parameter key="message_greet" value="Olá |PLAYERNAME|. Eu Vendo Promotions Quer comprar alguma {promotion} ?" />
</parameters>
</npc>
promotionMage.lua
-- config by uotl£
config = {[2] = { -- [coloca vocation que tem que ser antes de escolher]
lvl = 35, -- level tem que ser maior que 50
id_da_vocation = 5,nome_da_vocation = "Master Wizard", -- id da primeira vocation que pode compra e o nome dela
id_da_vocation2 = 6,nome_da_vocation2 = "Elder Wizard"} -- id da segunda vocation que pode compra e o nome dela
}
local fala_do_npc = "Desculpe, mas voce esta falando com a pessoa errada." -- fala do npc se ja tiver comprado e se não for vocation certa
local preco = 0 -- preço por platinum 100 que e igual 1 crystal
-- config by uotl£
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
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
voc = config[getPlayerVocation(cid)]
if(msgcontains(msg, 'promotion') or msgcontains(msg, 'promotions')) then
check (cid,talkUser)
elseif (msgcontains(msg, voc.nome_da_vocation) and talkState[talkUser] == 1) then
talkState[talkUser] = 2
selfSay("tem certeza que voce quer ser [ "..voc.nome_da_vocation.." ] ? [yes] ou [no]", cid)
elseif (msgcontains(msg, 'yes') and talkState[talkUser] == 2) then
v1_check (cid,talkUser,numero_s)
elseif (msgcontains(msg, 'no') and talkState[talkUser] == 2) then
talkState[talkUser] = 0
selfSay("ate mais volte quando decidir", cid)
elseif (msgcontains(msg, voc.nome_da_vocation2) and talkState[talkUser] == 1) then
talkState[talkUser] = 3
selfSay("tem certeza que voce quer ser ["..voc.nome_da_vocation2.."] ? [yes] ou [no]", cid)
elseif (msgcontains(msg, 'yes') and talkState[talkUser] == 3) then
v2_check (cid,talkUser,numero_s)
talkState[talkUser] = 0
elseif (msgcontains(msg, 'no') and talkState[talkUser] == 3) then
talkState[talkUser] = 0
selfSay("ate mais volte quando decidir", cid)
end
end
function check (cid,talkUser)
if voc then
if getPlayerLevel(cid) >= voc.lvl then
talkState[talkUser] = 1
selfSay('Posso lhe conceder a promocao [ '..voc.nome_da_vocation..' ] OU ['..voc.nome_da_vocation2..'] ao atingir level 35', cid)
else
selfSay('volta aqui quando pegar level '..voc.lvl..'', cid)
talkState[talkUser] = 0
end
else
selfSay(fala_do_npc, cid)
talkState[talkUser] = 0
return true
end
end
function v1_check (cid,talkUser)
if(doPlayerRemoveMoney(cid, (preco*100)) == true) then
doPlayerSetVocation(cid, voc.id_da_vocation)
selfSay("parabens agora voce e "..voc.nome_da_vocation.."", cid)
talkState[talkUser] = 0
else
selfSay('volta aqui quando tiver dinheiro '..preco..' moedas de platinum', cid)
talkState[talkUser] = 0
end
return true
end
function v2_check (cid,talkUser)
if(doPlayerRemoveMoney(cid, (preco*100)) == true) then
doPlayerSetVocation(cid, voc.id_da_vocation2)
selfSay("parabens agora voce e "..voc.nome_da_vocation2.."", cid)
talkState[talkUser] = 0
else
selfSay('volta aqui quando tiver dinheiro '..preco..' moedas de platinum', cid)
talkState[talkUser] = 0
end
return true
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
NPC King Archer.xml
<?xml version="1.0" encoding="UTF-8"?>
<npc name="King Archer" script="promotionPally.lua" walkinterval="2000" floorchange="0">
<health now="100" max="100" />
<look type="133" head="20" body="39" legs="45" feet="7" addons="0" />
<parameters>
<parameter key="module_travel" value="1"/>
<parameter key="message_greet" value="Olá |PLAYERNAME|. Eu Vendo Promotions Quer comprar alguma {promotion} ?" />
</parameters>
</npc>
promotionPally.lua
-- config by uotl£
config = {[3] = { -- [coloca vocation que tem que ser antes de escolher]
lvl = 35, -- level tem que ser maior que 50
id_da_vocation = 7,nome_da_vocation = "Swift Paladin", -- id da primeira vocation que pode compra e o nome dela
id_da_vocation2 = 9,nome_da_vocation2 = "Heavy Paladin"} -- id da segunda vocation que pode compra e o nome dela
}
local fala_do_npc = "Desculpe, mas voce esta falando com a pessoa errada." -- fala do npc se ja tiver comprado e se não for vocation certa
local preco = 0 -- preço por platinum 100 que e igual 1 crystal
-- config by uotl£
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
local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid
voc = config[getPlayerVocation(cid)]
if(msgcontains(msg, 'promotion') or msgcontains(msg, 'promotions')) then
check (cid,talkUser)
elseif (msgcontains(msg, voc.nome_da_vocation) and talkState[talkUser] == 1) then
talkState[talkUser] = 2
selfSay("tem certeza que voce quer ser [ "..voc.nome_da_vocation.." ] ? [yes] ou [no]", cid)
elseif (msgcontains(msg, 'yes') and talkState[talkUser] == 2) then
v1_check (cid,talkUser,numero_s)
elseif (msgcontains(msg, 'no') and talkState[talkUser] == 2) then
talkState[talkUser] = 0
selfSay("ate mais volte quando decidir", cid)
elseif (msgcontains(msg, voc.nome_da_vocation2) and talkState[talkUser] == 1) then
talkState[talkUser] = 3
selfSay("tem certeza que voce quer ser ["..voc.nome_da_vocation2.."] ? [yes] ou [no]", cid)
elseif (msgcontains(msg, 'yes') and talkState[talkUser] == 3) then
v2_check (cid,talkUser,numero_s)
talkState[talkUser] = 0
elseif (msgcontains(msg, 'no') and talkState[talkUser] == 3) then
talkState[talkUser] = 0
selfSay("ate mais volte quando decidir", cid)
end
end
function check (cid,talkUser)
if voc then
if getPlayerLevel(cid) >= voc.lvl then
talkState[talkUser] = 1
selfSay('Posso lhe conceder a promocao [ '..voc.nome_da_vocation..' ] OU ['..voc.nome_da_vocation2..'] ao atingir level 35', cid)
else
selfSay('volta aqui quando pegar level '..voc.lvl..'', cid)
talkState[talkUser] = 0
end
else
selfSay(fala_do_npc, cid)
talkState[talkUser] = 0
return true
end
end
function v1_check (cid,talkUser)
if(doPlayerRemoveMoney(cid, (preco*100)) == true) then
doPlayerSetVocation(cid, voc.id_da_vocation)
selfSay("parabens agora voce e "..voc.nome_da_vocation.."", cid)
talkState[talkUser] = 0
else
selfSay('volta aqui quando tiver dinheiro '..preco..' moedas de platinum', cid)
talkState[talkUser] = 0
end
return true
end
function v2_check (cid,talkUser)
if(doPlayerRemoveMoney(cid, (preco*100)) == true) then
doPlayerSetVocation(cid, voc.id_da_vocation2)
selfSay("parabens agora voce e "..voc.nome_da_vocation2.."", cid)
talkState[talkUser] = 0
else
selfSay('volta aqui quando tiver dinheiro '..preco..' moedas de platinum', cid)
talkState[talkUser] = 0
end
return true
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
Obrigado desde já! é de grande importância arrumar isso, não sei pq o Knight consegue promover para Berserk ou Guardian mas quando falo sendo Mage no NPC King Mage ou Paladin no NPC King Archer aparece a frase do script "Desculpe, mas voce esta falando com a pessoa errada."
Segue uma imagem que da na distro quando sou Mage Voc 2 e tento comprar promotion