KH

Script de pedir item para um npc

Por Kheus Andrade, 26 de ago. de 2019 em Scripts

6
2k
Kheus AndradeK
26 de agosto de 2019 às 11:29

estou precisando de um script de pedir um item para um npc e ele entrega, após entregar o player recebe uma mensagem nesse tipo doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Você recebeu nome do item do npc", manda o player para uma posição específica e sai um efeito de número 10, quem puder ajudar com isso seria muito bom! tinha esse script mas perdi há um bom tempo

1 mês depois...
Yan OliveiraY
05 de setembro de 2019 às 18:25

Esse item que o player irá pedir item para o NPC é um item específico? Ele vai ter que digitar o nome ou responder perguntas do NPC? Explique como vai funcionar a entrega do item.

Kheus AndradeK
06 de setembro de 2019 às 20:08
Em 05/09/2019 em 18:25, Yan18 disse:

Esse item que o player irá pedir item para o NPC é um item específico? Ele vai ter que digitar o nome ou responder perguntas do NPC? Explique como vai funcionar a entrega do item.

o npc oferece a lista com o item e o player escolhe

Yan OliveiraY
07 de setembro de 2019 às 09:45
13 horas atrás, Kheus Andrade disse:

o npc oferece a lista com o item e o player escolhe

Mas esse NPC será um mercador? Tipo o Mark que você pode voltar e pegar item novamente ou só poderá fazer uma vez essa quest?

 

O player só poderá escolher 1 item?

 

Terá algum custo para o player escolher o item? (No caso levar algum item para ele ou comprar?)

Kheus AndradeK
08 de setembro de 2019 às 09:33
23 horas atrás, Yan18 disse:

Mas esse NPC será um mercador? Tipo o Mark que você pode voltar e pegar item novamente ou só poderá fazer uma vez essa quest?

 

O player só poderá escolher 1 item?

 

Terá algum custo para o player escolher o item? (No caso levar algum item para ele ou comprar?)

pode pegar quantas vezes quiser os itens que o npc oferece, mas sempre que pegar ele vai pra uma posicão específica

1 mês depois...
Yan OliveiraY
16 de outubro de 2019 às 00:51

Desculpe pela demora amigo. Bom, eu não sei se seu servidor é Tibia ou Poketibia, mas eu fiz para Poketibia TFS 0.3.6.

 

E eu não sei trabalhar ainda com janelas do OTClient, então não conseguir fazer com janela (igual o Mark) mas fiz um npc que fala o nome dos itens (por enquanto manualmente, se for assim que quer eu adapto para falar o nome dos itens de uma tabela) e da o item que o player escolher pelo nome, e depois é teleportado e exibe a mensagem. Vê se é assim que você quer, se for, avisa que irei melhorar o código e deixar melhor.

 

Crie um arquivo em data/npc/distribuidor.lua e adicione o código dentro:

<?xml version="1.0" encoding="UTF-8"?>
<npc name="John" script="ganha_item.lua" walkinterval="3000" floorchange="0" speed="150" lookdir="2">
<health now="150" max="150"/>
<look type="510" head="115" body="148" legs="39" feet="41"/>

	<parameters>
		<parameter key="message_greet" value="Welcome |PLAYERNAME|, say {item} or {trade} to choose item and receive it if you are level 50 or more."/>
	</parameters>

</npc>

E depois crie um arquivo em data/npc/scripts/ganha_item.lua e adicione o código dentro:

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
msg = string.lower(msg)

local level = 50

        if msgcontains(msg, 'item') or msgcontains(msg, 'trade') then
		   if getPlayerLevel(cid) < level then -- NÃO EXECUTA SE FOR MENOR QUE LEVEL 50, SÓ TROCAR O LEVEL CASO QUEIRA UM DIFERENTE
		      selfSay("you need to be level "..level.." to receive this item.", cid)
			  talkState[talkUser] = 0
		   return true
           end

	        selfSay("What item do you want? You can choose Great Ball e Ultra Ball.", cid)
	 		talkState[talkUser] = 2
		return true

        elseif (msgcontains(msg, 'Great Ball')) and talkState[talkUser] == 2 then
            doTeleportThing(cid, {x= 2560, y= 2520, z= 7}) -- COORDENADA A SER TELEPORTADO
            doSendMagicEffect(getThingPos(cid), 27)	-- EFEITO AO GANHAR O ITEM
            doPlayerAddItem(cid, 2391, 100) --ID DO ITEM | QUANTIDADE    
	    doSendAnimatedText(getThingPos(cid), "Voce ganhou 100 Great Balls!", 10) 	
            talkState[talkUser] = 0

	elseif (msgcontains(msg, 'Ultra Ball')) and talkState[talkUser] == 2 then
            doTeleportThing(cid, {x= 2558, y= 2534, z= 7}) -- COORDENADA A SER TELEPORTADO
            doSendMagicEffect(getThingPos(cid), 27)	-- EFEITO AO GANHAR O ITEM
            doPlayerAddItem(cid, 2392, 100) --ID DO ITEM | QUANTIDADE  
	    doSendAnimatedText(getThingPos(cid), "Voce ganhou 100 Ultra Balls!", 10)     
            talkState[talkUser] = 0
            		   
	return true	
	end
	end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

Se não quiser que tenha validação de nível, remova o "local level = 50" e essa parte do código:

if getPlayerLevel(cid) < level then
   selfSay("you need to be level "..level.." to receive this item.", cid)
   talkState[talkUser] = 0
return true
end

A mensagem está saindo com o efeito 10 como pediu, testa e me diga se é isso que quer.