Histórico de Curtidas
-
williamcgv recebeu reputação de KiraConquest em NPC que troca um item por um item aleatório-O NPC funciona realmente só que apresenta 2 problemas que preciso resolver, espero que entendam..
É um NPC que troca um item "A, B ou C" por um item aleatório "X, Y ou Z".
PROBLEMA:
1º MENSAGEM DO NPC: Após falar o tipo de troféu (bronze/prata/ouro), o "NPC" não fala se deseja confirmar a troca do troféu pela gema, ou seja ele já faz a troca após escreve a opção de troféu.
2º FALA DO NPC: O "NPC" está repetindo algumas frases de outros NPC's, por exemplo tenho um npc chamado "Mary", e ela tem uma fala que é "Venda seus gold ingot aqui!" e esse "NPC" de troca, fala a mesma frase mesmo não sendo programado na script.
_________________________________________________________________________________________________________________________
SOLUÇÃO:
1º MENSAGEM DO NPC: Quero que mande uma mensagem de confirmação após escolher a opção de troféu (bronze/prata/ouro)
Exemplo:
#Player: Hi
#NPC: Ola |PLAYERNAME|. Seja Bem-Vindo a Sala de Trocas. Eu coleciono {trofeus} de ouro, prata e bronze. E para garantir que todos troquem comigo, eu retribuo dando gemas aleatorias.
#Player: troféu
#NPC: Acho que você pretende trocar algum troféu por gemas. Qual troféu você pretende trocar comigo: {ouro}, {prata} ou {bronze}
_________________________________________________________________________________________________________________________
#Player: bronze
#NPC: Você tem certeza que quer trocar 1 troféu de bronze por 1 gema aleatória? <<< A MENSAGEM DE CONFIRMAÇÃO
#Player: sim
#NPC: Obrigado, aqui estão suas gemas.
________________________________________________________________________________
#Player: prata
#NPC: Você tem certeza que quer trocar 1 troféu de prata por 2 gema aleatória? <<< A MENSAGEM DE CONFIRMAÇÃO
#Player: sim
#NPC: Obrigado, aqui estão suas gemas.
________________________________________________________________________________
#Player: ouro
#NPC: Você tem certeza que quer trocar 1 troféu de ouro por 3 gema aleatória? <<< A MENSAGEM DE CONFIRMAÇÃO
#Player: sim
#NPC: Obrigado, aqui estão suas gemas.
_________________________________________________________________________________________________________________________
2º FALA DO NPC: Quero que fale as frases que foi programado na script, ou seja não fale de outros NPC's.
Exemplo:
#Troque o seu troféu aqui.
#Só entendo português, diga oi. #Oi! Troco gemas por troféus! _________________________________________________________________________________________________________________________ Data/npc: <npc name="Josue" script="data/npc/scripts/trofeu.lua" walkinterval="2000" floorchange="0"> <health now="100" max="100"/> <look type="133" head="79" body="0" legs="128" feet="128" addons="1"/> <parameters> <parameter key="message_greet" value="Ola |PLAYERNAME|. Seja Bem-Vindo a Sala de Trocas. Eu coleciono {trofeus} de ouro, prata e bronze. E para garantir que todos troquem comigo, eu retribuo dando gemas aleatorias."/> </parameters> </npc> Data/npc/scripts:
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 function thinkCallback(cid) local rand = math.random(1,100) if rand == 10 then selfSay('Troque o seu troféu aqui.') -- msg que vai sair do npc end if rand == 11 then selfSay ('Só entendo português, diga oi.') end if rand == 12 then selfSay ('Oi! Troco gemas por trofeús!') end return true end function greetCallback(cid) return true end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid local trophy = { ["ouro"] = {3, 5805}, --{Quantidade de items aleatórios, ID do troféu}, ["prata"] = {2, 5806}, ["bronze"] = {1, 5807}, } local items = {2154, 2156, 2158} if msgcontains(msg, "trophy") or msgcontains(msg, "trofeu") then selfSay("Acho que você pretende trocar algum troféu por gemas. Qual troféu você pretende trocar comigo: {ouro}, {prata} ou {bronze}?", cid) talkState[talkUser] = 1 return true elseif talkState[talkUser] == 1 then if trophy[msg:lower()] then local trofeu = trophy[msg:lower()] local id = trofeu[2] if getPlayerItemCount(cid, id) > 0 then for i = 1, trofeu[1] do doPlayerAddItem(cid, items[math.random(#items)], 1) end doPlayerRemoveItem(cid, id, 1) selfSay("Obrigado, aqui estão suas gemas.", cid) talkState[talkUser] = 0 return true else selfSay("Você não possui este troféu.", cid) talkState[talkUser] = 0 return true end else selfSay("Este troféu não existe.", cid) talkState[talkUser] = 0 return true end end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:setCallback(CALLBACK_ONTHINK, thinkCallback) npcHandler:setCallback(CALLBACK_GREET, greetCallback) npcHandler:addModule(FocusModule:new()) Espero que alguém me ajude necessito muito desse NPC, agradeço quem puder ajudar!
-
williamcgv recebeu reputação de Ekr em Trainer Offline17:09 Voce upou de level/magic_level/shielding -1 para o nivel: [126] de magic level: [70] e level [31] de shielding em [0] minutos.
Waat? mano você entendeu pelo menos? a mensagem ainda continua tudo errado!
-
williamcgv deu reputação a olokomeu em [Tutorial] Bug "Temple position is wrong" (MySql)Bem, quebrei muita cabeça um dia desses com esse maldito Bug, porém, com umas dicas do amigo "danihcv" e eu mexendo, acabei resolvendo e quis dividir esse tutorial com o povo do TibiaKing. Lembrando que esse erro acontece quem usa Mysql e possue website "Gesior"( Não sei se todas as versões dão esse erro, mas a versão 0.3.8 deu). Vamos deixar e papo e mão na massa .
O erro é o seguinte:
- Quando loga a conta no tibia ele abre a janela normalmente do char, porém, quando tenta logar dar esse erro:
(Esse erro é um conflito que há entre as coordenadas (x,y e z) do config.lua + database).
1- Para retirar esse bug, a primeira coisa será entrar no config.lua e achar essa tag:
Caso ela estiver em "1", não altere nada. Mas se tiver outro numero, coloque "1".
2 - Abra o arquivo accountmanagement.php, que se encontra na pasta htdocs procure essa tag:
Dentro do (), coloque "1", se dentro do () tiver algo parecido com "$newchar_town", apague e coloque "1".
3- Verifique ainda no mesmo arquivo accountmanagement.php essa tag:
As coordenadas (PosX,PosY e PosZ) varia de otserver para otserver e tem que estar igual ao que tem no config.lua:
4- Va na sua DataBase (phpadmin), procure uma "aba" acima que diz "SQL", clique nela, coloque essa tag e aperte em "executar":
Lembrando mais uma vez, as coordenadas (PosX,PosY e PosZ) variam de otserver para otserver e devem está iguais, ao do Config.lua + accountmanagement.php .
Pronto. Depois disso entre normalmente que o char ira logar nas coordenadas configuradas.
Gostou? não esquece do REP+!
Tutorial feito por:
70% Eu
30% danihcv
-
williamcgv deu reputação a MaTTch em (Resolvido)Level e Vocação na Tela de Login
-
williamcgv deu reputação a MaTTch em (Resolvido)Level e Vocação na Tela de LoginVá em iologindata.cpp e lá no final adicione isso:
Agora em iologindata.h procure por:
bool getGuidByNameEx(uint32_t& guid, bool& specialVip, std::string& name); E adicione logo abaixo:
std::string getPlayerLevelAndVocation(const std::string& name) const; Em protocollogin.cpp procure por:
if(g_config.getBool(ConfigManager::ON_OR_OFF_CHARLIST)) { if(g_game.getPlayerByName((*it))) output->putString("Online"); else output->putString("Offline"); } else output->putString(g_config.getString(ConfigManager::SERVER_NAME)); E substitua por:
if(g_config.getBool(ConfigManager::ON_OR_OFF_CHARLIST)) { if(g_game.getPlayerByName((*it))) output->putString("Online"); else output->putString("Offline"); } else { if((*it) != "Account Manager") { output->putString(IOLoginData::getInstance()->getPlayerLevelAndVocation((*it))); } else output->putString(g_config.getString(ConfigManager::SERVER_NAME)); } Compile e pronto.
Lembrando que em config.lua a opção displayOnOrOffAtCharlist precisa estar false.
-
williamcgv deu reputação a Peemello em (Resolvido)Account Manager Invalid PasswordNada ve esses bagui ai de trocar a distro, tudo vocês querem trocar mesmo.
Se sabe compilar ?
é em protocolgame.cpp da sua source - procure por:
if(!IOLoginData::getInstance()->getPassword(id, hash, salt, character) || !encryptTest(salt + password, hash))
{
ConnectionManager::getInstance()->addAttempt(getIP(), protocolId, false);
disconnectClient(0x14, "Invalid password.");
return false;
}
e apague tudo.
pronto!, feche e compile.
Créditos: Caronte
Te Ajudei? +REP
-
williamcgv deu reputação a Wakon em (Resolvido)Healing CollorTenta colocar false nessas duas opções encontradas no config.lua:
showHealingDamage = showHealingDamageForMonsters = -
williamcgv deu reputação a Caronte em (Resolvido)mensagem na scriptlocal formulas = { {2433,2433,2433,id=7424,count=1}, -- enchanted staff = lunar staff {8931,8931,8931,id=8930,count=1},-- ephinnyc sword = emerald sword {8927,8927,8927,id=8928,count=1}, -- dark trinity mace = obsidian truncheon {8926,8926,8926,id=8924,count=1}, -- demonwing axe = hellforged axe {{2389,1},{2389,1},{2389,1},id=3965,count=1}, -- spear = hunting spear {8854,8854,8854,id=8857,count=1}, -- warsinger bow = silkweaver bow {2523,2523,2523,id=8905,count=1}, -- blessed shield = rainbow shield {8901,8901,8901,id=8900,count=1}, -- spellbook of warding = spellbook of enlightenment {2138,2138,2138,id=2131,count=1}, -- sapphire amulet = star amulet } function isInArraya(a, v,i1,i2)--- script By mock i1 = i1 or 0 i2 = i2 or 0 for i=1,#a do if i ~= i1 and i ~= i2 then if a[i] == v then return a[i], i elseif type(a[i]) == 'table' and a[i][1] == v then return a[i][1], i end end end return false end function getForm(n1,n2,n3,n1cnt,n2cnt,n3cnt)--- script By mock n1 = n1 or 0 n2 = n2 or 0 n3 = n3 or 0 n2cnt = n2cnt or 1 n1cnt = n1cnt or 1 n3cnt = n3cnt or 1 if not n1 then return 'nil' end local fnd = {} local ret = {} for i=1,#formulas do local find1, p1 = isInArraya(formulas[i], n1,0) local find2, p2 = isInArraya(formulas[i], n2,p1) local find3, p3 = isInArraya(formulas[i], n3,p1,p2) if (find1 == formulas[i][p1] or (type(formulas[i][p1]) == 'table' and formulas[i][p1][1] == find1 )) and (find2 == formulas[i][p2] or (type(formulas[i][p2]) == 'table' and formulas[i][p2][1] == find2 )) and (find3 == formulas[i][p3] or (type(formulas[i][p3]) == 'table' and formulas[i][p3][1] == find3 )) then if (type(formulas[i][1]) ~= 'table' or formulas[i][1][2] <= n1cnt) and (type(formulas[i][2]) ~= 'table' or formulas[i][2][2] <= n2cnt) and (type(formulas[i][3]) ~= 'table' or formulas[i][3][2] <= n3cnt) then if type(formulas[i][1]) == 'table' then n1 = formulas[i][1][1] n1cnt = formulas[i][1][2] end if type(formulas[i][2]) == 'table' then n2 = formulas[i][2][1] n2cnt = formulas[i][2][2] end if type(formulas[i][3]) == 'table' then n3 = formulas[i][3][1] n3cnt = formulas[i][3][2] end return {id=formulas[i].id,{n1,n1cnt},{n2,n2cnt},{n3,n3cnt},count=formulas[i].count,form=formulas[i]} end end end return n1..'-'..n2..'-'..n3 end function onUse(cid, item, frompos, item2, topos) --- script By mock if getPlayerStorageValue(cid, 10906) < os.time() then setPlayerStorageValue(cid,10906, os.time()+5) doTransformItem(item.uid, 9562) addEvent(function() for stackpos=1,255 do topos.stackpos = stackpos item = getThingfromPos(topos) if item.itemid == 9562 then doTransformItem(item.uid, 9563) break end end end,1500) local posittions = { {x=1081,y=1085,z=9,stackpos=255}, --- pos de um item {x=1082,y=1085,z=9,stackpos=255}, --- pos de um item {x=1083,y=1085,z=9,stackpos=255}, --- pos de um item {x=1081,y=1084,z=9,stackpos=255}, --- pos do resultado. } local tb = {} local k for i=1,#posittions do if i == 4 then break end; k = getThingfromPos(posittions[i]) if k.itemid ~= 0 then table.insert(tb,1,k) doSendMagicEffect(posittions[i],14) else doSendMagicEffect(posittions[i],13) end end local n1 = tb[1] or {temid=0,type=0} local n2 = tb[2] or {temid=0,type=0} local n3 = tb[3] or {temid=0,type=0} doPlayerSendTextMessage(cid, 25,"Verificando.") local ret = getForm(n1.itemid,n2.itemid,n3.itemid,n1.type,n2.type,n3.type) if type(ret) == 'table' then for i=1,#posittions do if i == 4 then break end; k = getThingfromPos(posittions[i]) for e=1,#ret do if type(ret[e]) == 'table' then if ret[e][1] == k.itemid and k.itemid ~= 0 then local del = ret[e][2] if del == 0 then del = 1 end doRemoveItem(k.uid,del) break end end end end addEvent(function() for stackpos=1,255 do topos.stackpos = stackpos item = getThingfromPos(topos) if item.itemid == 9563 then doTransformItem(item.uid, 9565) break end end doCreateItem(ret.id,ret.count, posittions[4]) if ret.count ~= 1 then fnsh = 's' end fnsh = fnsh or '' if getItemNameById == nil then getItemNameById = getItemName end doBroadcastMessage("[SISTEMA DE FUSÃO] O jogador (" .. getPlayerName(cid).. ") fundiu 3 ".. getItemNameById(k.itemid) .." e criou "..ret.count.." ".. getItemNameById(ret.id) ..fnsh..".", 22) end,3000) else addEvent(function() for stackpos=1,255 do topos.stackpos = stackpos item = getThingfromPos(topos) if item.itemid == 9563 then doTransformItem(item.uid, 9565) break end end doPlayerSendTextMessage(cid, 25,"Não existe esta combinação.") end,3000) end return TRUE else doPlayerSendCancel(cid,"Aguarde") doSendMagicEffect(topos, 2) return FALSE end end
-
williamcgv deu reputação a Caronte em (Resolvido)mensagem na scriptTenta de novo...
editei lá.
-
williamcgv deu reputação a zipter98 em NPC que troca um item por um item aleatórioWoops, my bad hehe. Já mudei.
-
williamcgv deu reputação a Wise em (Resolvido)Annihilator QuestDetesto refazer um script a partir de códigos imensos de outra pessoa.
Então eu apenas apliquei a tabulação e algumas funções (um pouco modificadas) da New Library v. 1.2 de @xWhiteWolf.
function isOnSameFloor(fromPos, toPos) return fromPos.z == toPos.z and true or false end function isEven(arg) return arg % 2 == 0 and true or false end function getMiddlePos(fromPos, toPos) if not isOnSameFloor(fromPos, toPos) then return false end local middle = {x = 0, y = 0, z = 0} middle.x = isEven(fromPos.x + toPos.x) and (fromPos.x + toPos.x)/2 or math.floor((fromPos.x + toPos.x)/2) + 1 middle.y = isEven(fromPos.y + toPos.y) and (fromPos.y + toPos.y)/2 or math.floor((fromPos.y + toPos.y)/2) + 1 middle.z = fromPos.z or toPos.z return middle end function getDistanceRadius(fromPos, toPos) if not isOnSameFloor(fromPos, toPos) then return false end local distance = getDistanceBetween(fromPos, toPos) return isEven(distance) and (distance/2) or math.floor(distance/2) + 1 end function clearArea(middlePos, rangex, rangey) local final = {x=1126, y=1152, z=7} -- Posição onde será teleportado quando acabar o tempo for i = -rangex, rangex do for j = -rangey, rangey do pos = {x = middlePos.x + i, y = middlePos.y + j, z = middlePos.z} creature = getTopCreature(pos).uid if isMonster(creature) then doSendMagicEffect(getThingPos(creature), 14) doRemoveCreature(creature) elseif isPlayer(creature) then doSendMagicEffect(getThingPos(creature), 10) doTeleportThing(creature, final) end end end setGlobalStorageValue(sto, -1) return true end local t = { lvl = 100, entrada = { {x = 1125, y = 1152, z = 7} -- pos players }, saida = { {x = 1125, y = 1153, z = 8} -- pos para onde eles irão }, monstros = { {{x = 1121, y = 1153, z = 8}, "Demon"} -- defina pos dos montros e nomes } } function onUse(cid, item, fromPosition, itemEx, toPosition) local configure = { fromPos = {x=1121, y=1150, z=8}, -- posição superior esquerda do mapa, da area em que esta mapeado a area. toPos = {x=1129, y=1156, z=8}, -- posição inferior direita do mapa, da area em que esta mapeado a area. boss = "Demon" -- Aqui você bota o nome do monstro que você quer remover } local config = { position = {x=1126, y=1152, z=7}, -- Contagem position1 = {x=1121, y=1150, z=8}, -- Contagem position2 = {x=1121, y=1156, z=8}, -- Contagem position3 = {x=1129, y=1150, z=8}, -- Contagem position4 = {x=1129, y=1156, z=8}, -- Contagem fromPosition = {x=1121, y=1150, z=8}, toPosition = {x=1129, y=1156, z=8}, id = 1498, time = 1 -- tempo que o teleport ira sumir em minutos } local time = 60 local sto = 5973 local check = {} for _, k in ipairs(t.entrada) do local x = getTopCreature(k).uid if(x == 0 or not isPlayer(x) or getPlayerLevel(x) < t.lvl) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Não tem 5 jogadores para quest.") return true end if getGlobalStorageValue(sto) == 1 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Annihilaton está bloqueada. Aguarde até que seja liberada.") return true end table.insert(check, x) end for _, summon in pairs(t.monstros) do local creature = getTopCreature(summon[1]).uid doCreateMonster(summon[2], summon[1]) end for i, tid in ipairs(check) do doTeleportThing(tid, t.saida[i], false) doSendMagicEffect(t.saida[i], 10) doTransformItem(item.uid, item.itemid == 1945 and 1946 or 1945) end for i = 1,time do formula = time - 1*i addEvent(doSendAnimatedText, i*1000, config.position, formula, TEXTCOLOR_RED) addEvent(doSendAnimatedText, i*1000, config.position1, formula, TEXTCOLOR_RED) addEvent(doSendAnimatedText, i*1000, config.position2, formula, TEXTCOLOR_RED) addEvent(doSendAnimatedText, i*1000, config.position3, formula, TEXTCOLOR_RED) addEvent(doSendAnimatedText, i*1000, config.position4, formula, TEXTCOLOR_RED) end setGlobalStorageValue(sto, 1) local rx = getDistanceRadius(configure.fromPos, configure.toPos) addEvent(clearArea, config.time * 60 * 1000, getMiddlePos(configure.fromPos, configure.toPos), rx, rx) return true end -
williamcgv deu reputação a Wise em AleatórioJá que no script padrão do membro haviam outros valores a serem configurados, eu ia simplificar tudo em uma única tabela. Mas depois eu notei que o item era removido, então não tinha a necessidade daqueles outros valores, mas daí esqueci de fazer da tabela uma única variável. Obrigado por avisar.
Agora, falando do seu script (já que falou do meu). Qual a necessidade de haver uma checagem de remoção de um item que dará ao player de 3 à 5, dentre 20 itens? Não é óbvio que ele deve ser removido? Ou será que tem alguma lógica receber de 3 à 5 itens a qualquer hora?
Isso sim é desnecessário.
Agora sim você explicou melhor..
local items = {2183, 8920, 2181, 8912, 8921, 2187, 8910, 8922, 7764, 7773, 7770, 7855, 7864, 7861, 7745, 7754, 7751, 7748, 7755, 7753} function onUse(cid, item, frompos, item2, topos) local bbp = doPlayerAddItem(cid, 2002, 1) for i = 1, math.random(3, 5) do doAddContainerItem(bbp, items[math.random(1, #items)], 1) end doRemoveItem(item.uid, 1) doSendAnimatedText(getThingPos(cid), "SURPRESA!", 5) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Você abriu a mochila surpresa azul e recebeu uma backpack com alguns itens.") return true end -
williamcgv deu reputação a Orochi Elf em AleatórioBom.. eu vi algumas coisas desnecessárias no seu código.
tab = { items = {...}, } Isso é realmente necessário?
Enfim... bom trabalho
@EDIT
local cfg = { remove = true, -- Irá remover ao ser usado? max = 5, -- Máximo de items min = 3, -- Minimo de items } local items = {2183, 8920, 2181, 8912, 8921, 2187, 8910, 8922, 7764, 7773, 7770, 7855, 7864, 7861, 7745, 7754, 7751, 7748, 7755, 7753} function onUse(cid) local bp = doPlayerAddItem(cid, 2002) for r = 1, #items do doAddContainerItem(bp, items[r], math.random(cfg.min, cfg.max)) end if cfg.remove then doRemoveItem(item.uid, 1) end doPlayerSendTextMessage(cid, 27, "Voce ganhou uma backpack com items.") return true end
Pronto, agora a quantidade aleatória de items, irá funcionar.
-
williamcgv deu reputação a Wise em AleatórioJá que no seu script padrão o item é removido, então eu o simplifiquei.
Não testei
local items = {2183, 8920, 2181, 8912, 8921, 2187, 8910, 8922, 7764, 7773, 7770, 7855, 7864, 7861, 7745, 7754, 7751, 7748, 7755, 7753} function onUse(cid, item, frompos, item2, topos) local bbp, chances = doPlayerAddItem(cid, 2002, 1), math.random(3, 5) for x = 1, table.maxn(items) do doRemoveItem(item.uid, 1) doAddContainerItem(bbp, items[x], chances) doSendAnimatedText(getThingPos(cid), "SURPRESA!", 5) end doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Você abriu a mochila surpresa azul e recebeu uma backpack com alguns equipamentos.") return true end