Fazendo NPCS
-Mudando Falas
-Vender Runas
-Vender Items
-Comprar Items
-**NPC DE BARCO**
Nós vamos começar este Tutorial com um Script basico de NPC.
Na maioria dos servers há um npc chamado Mad.Eu vou mostrar agora seu script e os vários jeitos de modifica-lo.
Se você for até : data/npc/scripts/loot.lua vc terá isso :
function onCreatureDisappear(cid, pos)if focus == cid then
selfSay('Good bye then.')
focus = 0
talk_start = 0
end
end
function onCreatureTurn(creature)
end
function msgcontains(txt, str)
return (string.find(txt, str) and not string.find(txt, '(%w+)' .. str) and not string.find(txt, str .. '(%w+)'))
end
function onCreatureSay(cid, type, msg)
msg = string.lower(msg)
if ((string.find(msg, '(%a*)hi(%a*)')) and (focus == 0)) and getDistanceToCreature(cid) < 4 then
selfSay('Hello ' .. creatureGetName(cid) .. '! I buy swords, clubs, axes, helmets, boots, legs, shields and armors.')
focus = cid
talk_start = os.clock()
elseif string.find(msg, '(%a*)hi(%a*)') and (focus ~= cid) and getDistanceToCreature(cid) < 4 then
selfSay('Sorry, ' .. creatureGetName(cid) .. '! I talk to you in a minute.')
elseif focus == cid then
talk_start = os.clock()
if msgcontains(msg, 'royal helmet') then
sell(cid,3330,1,20000)
elseif msgcontains(msg, 'warrior helmet') then
sell(cid,3307,1,3000)
elseif msgcontains(msg, 'crusader helmet') then
sell(cid,3329,1,3000)
elseif msgcontains(msg, 'crown helmet') then
sell(cid,3323,1,2000)
elseif msgcontains(msg, 'devil helmet') then
sell(cid,3294,1,2000)
elseif msgcontains(msg, 'mystic turban') then
sell(cid,3512,1,500)
elseif msgcontains(msg, 'chain helmet') then
sell(cid,3290,1,35)
elseif msgcontains(msg, 'iron helmet') then
sell(cid,3291,1,30)
elseif msgcontains(msg, 'helmets') then
selfSay('I buy royal (20k), warrior (3k), crusader (3k), crown (2k), devil (2k), chain (35gp) and iron helmets (30gp), also mystic turbans (500gp).')
elseif msgcontains(msg, 'steel boots') and focus == cid then
sell(cid,3492,1,20000)
elseif msgcontains(msg, 'boh') or msgcontains(msg, 'boots of haste') and focus == cid then
sell(cid,3017,1,4000)
elseif msgcontains(msg, 'boots') then
selfSay('I buy steel boots (20k) and boots of haste (4k).')
elseif msgcontains(msg, 'magic plate armor') or msgcontains(msg, 'mpa') then
sell(cid,3304,1,100000)
elseif msgcontains(msg, 'dragon scale mail') or msgcontains(msg, 'dsm') then
sell(cid,3324,1,30000)
elseif msgcontains(msg, 'golden armor') then
sell(cid,3298,1,10000)
elseif msgcontains(msg, 'crown armor') then
sell(cid,3319,1,5000)
elseif msgcontains(msg, 'knight armor') then
sell(cid,3308,1,3000)
elseif msgcontains(msg, 'blue robe') then
sell(cid,3505,1,3000)
elseif msgcontains(msg, 'lady armor') then
sell(cid,3332,1,1000)
elseif msgcontains(msg, 'plate armor') then
sell(cid,3295,1,300)
elseif msgcontains(msg, 'brass armor') then
sell(cid,3297,1,200)
elseif msgcontains(msg, 'chain armor') then
sell(cid,3296,1,100)
elseif msgcontains(msg, 'armors') then
selfSay('I buy golden (10k), crown (5k), knight (3k), lady (1k), plate (300gp), brass (200gp) and chain armors (100gp), also mpa (100k), dsm (30k) and blue robes (3k).')
elseif msgcontains(msg, 'golden legs') then
sell(cid,3302,1,80000)
elseif msgcontains(msg, 'crown legs') then
sell(cid,3320,1,5000)
elseif msgcontains(msg, 'knight legs') then
sell(cid,3309,1,3000)
elseif msgcontains(msg, 'plate legs') then
sell(cid,3495,1,500)
elseif msgcontains(msg, 'brass legs') then
sell(cid,3310,1,100)
elseif msgcontains(msg, 'chain legs') then
sell(cid,3310,1,50)
elseif msgcontains(msg, 'legs') then
selfSay('I buy golden (80k), crown (5k), knight (3k), plate (500gp), brass (100gp) and chain legs (50gp).')
elseif msgcontains(msg, 'shield of the mastermind') or msgcontains(msg, 'mms') then
sell(cid,3352,1,80000)
elseif msgcontains(msg, 'demon shield') then
sell(cid,3358,1,40000)
elseif msgcontains(msg, 'vampire shield') then
sell(cid,3372,1,4000)
elseif msgcontains(msg, 'medusa shield') then
sell(cid,3374,1,3500)
elseif msgcontains(msg, 'amazon shield') then
sell(cid,3375,1,3000)
elseif msgcontains(msg, 'crown shield') then
sell(cid,3357,1,2000)
elseif msgcontains(msg, 'tower shield') then
sell(cid,3366,1,2000)
elseif msgcontains(msg, 'dragon shield') then
sell(cid,3354,1,1500)
elseif msgcontains(msg, 'guardian shield') then
sell(cid,3353,1,1200)
elseif msgcontains(msg, 'beholder shield') then
sell(cid,3356,1,1000)
elseif msgcontains(msg, 'dwarven shield') then
sell(cid,3363,1,100)
elseif msgcontains(msg, 'shields') then
selfSay('I buy demon (40k), vampire (4k), medusa (3.5k), amazon (3k), crown (2k), tower (2k), dragon (1.5k), guardian (1.2k), beholder (1k), and dwarven shields (100gp), also mms (80k)')
elseif msgcontains(msg, 'giant sword') then
sell(cid,3219,1,10000)
elseif msgcontains(msg, 'bright sword') then
sell(cid,3233,1,6000)
elseif msgcontains(msg, 'ice rapier') then
sell(cid,3222,1,4000)
elseif msgcontains(msg, 'fire sword') then
sell(cid,3218,1,3000)
elseif msgcontains(msg, 'serpent sword') then
sell(cid,3235,1,1500)
elseif msgcontains(msg, 'spike sword') then
sell(cid,3209,1,800)
elseif msgcontains(msg, 'two handed sword') then
sell(cid,3203,1,400)
elseif msgcontains(msg, 'sabre') then
sell(cid,3211,1,25)
elseif msgcontains(msg, 'sword') then
sell(cid,3202,1,25)
elseif msgcontains(msg, 'swords') then
selfSay('I buy giant (10k), bright (6k), fire (3k) serpent (1.5k), spike (800gp) and two handed swords (400gp), also ice rapiers (4k), sabres (25gp) and swords (25gp).')
elseif msgcontains(msg, 'dragon lance') then
sell(cid,3240,1,10000)
elseif msgcontains(msg, 'fire axe') then
sell(cid,3258,1,10000)
elseif msgcontains(msg, 'knight axe') then
sell(cid,3256,1,2000)
elseif msgcontains(msg, 'double axe') then
sell(cid,3213,1,200)
elseif msgcontains(msg, 'halberd') then
sell(cid,3207,1,200)
elseif msgcontains(msg, 'battle axe') then
sell(cid,3204,1,100)
elseif msgcontains(msg, 'hatchet') then
sell(cid,3214,1,20)
elseif msgcontains(msg, 'axes') then
selfSay('I buy fire (10k), knight (2k), double (200gp) and battle axes (100gp), also dragon lances (10k), halberds (200gp) and hatchets (20gp).')
elseif msgcontains(msg, 'war hammer') then
sell(cid,3217,1,4000)
elseif msgcontains(msg, 'skull staff') then
sell(cid,3262,1,4000)
elseif msgcontains(msg, 'dragon hammer') then
sell(cid,3260,1,2000)
elseif msgcontains(msg, 'clerical mace') then
sell(cid,3249,1,200)
elseif msgcontains(msg, 'battle hammer') then
sell(cid,3243,1,60)
elseif msgcontains(msg, 'mace') then
sell(cid,3224,1,30)
elseif msgcontains(msg, 'clubs') then
selfSay('I buy war (4k), dragon (2k) and battle hammers (60gp), also skull staffs (4k) and clerical maces (200gp).')
elseif msgcontains(msg, 'platinum amulet') then
sell(cid,2993,1,2000)
elseif msgcontains(msg, 'scarf') then
sell(cid,3510,1,500)
elseif msgcontains(msg, 'amulets') then
selfSay('I buy platinum amulets (2k) and scarfs (500gp).')
elseif string.find(msg, '(%a*)bye(%a*)') and getDistanceToCreature(cid) < 4 then
selfSay('Good bye, ' .. creatureGetName(cid) .. '!')
focus = 0
talk_start = 0
end
end
end
function onCreatureChangeOutfit(creature)
end
function onThink()
if (os.clock() - talk_start) > 30 then
if focus > 0 then
selfSay('Next Please...')
end
focus = 0
end
if focus ~= 0 then
if getDistanceToCreature(focus) > 5 then
selfSay('Good bye then.')
focus = 0
end
end
endFirst of we will start with
MUDANDO AS FALAS
if ((string.find(msg, '(%a*)hi(%a*)')) and (focus == 0)) and getDistanceToCreature(cid) < 4 thenselfSay('Hello ' .. creatureGetName(cid) ..
Onde fala "hi" é oq o player terá q falar para o NPC responder.Eu sugiro nao mudar isto
Onde diz :
selfSay('Hello ' .. creatureGetName(cid) .. '! I buy swords, clubs, axes, helmets, boots, legs, shields and armors.')
Depois de selfSay(' Você pode mudar oque vc deseja q o npc responda ao player.TENHA CERTEZA QUE VC NAO ESQUECEU DE COLOCAR
depois de selfSay.('
Para acabar ..Sempre quando vc tem apostrofes ( ' ) na sua sentença vc sempre adiciona "\" depois disto.
Exemplo:
Hello, I'm a Npc
Ficará assim:
Hello, I\'m a Npc
Agora como você ja aprendeu isso, nós iremos avançar um pouco.
NPC COMPRANDO ITEMS
Agora aqui um exemplo de como vender um item:
elseif msgcontains(msg, 'crusader helmet') thensell(cid,3329,1,3000)
Depois onde diz :
(msg, '[ITEM HERE]')
Vc põe oque o player tem q dizer para vender determinado item, como em cima, onde tem [iTEM HERE] vc poderia por Mpa, Crusader Helmet, Boh , etc...
Onde diz :
(cid,3329,1,3000)
O 3229 é o ID do Item q vc vai vender .
Mude isto para o item q vc deseja vender.
O numero 1 eu aconselho nao mexer..Pois ira causar confusão na hora de vender ,por exemplo: O Player fala Sell Boh, e só tem 1 boh, o NPC quer 2, ou outro numero q vc colocar ai.
E o numero 3000 é a quantidade de gold q o item custará, 3000=3k, 10000=10k e por ai vai..
Próximo tópico :
VENDENDO RUNES
Agora é um pouco mais dificil mexer com este script.
Agora irei pegar outro npc, o Dark Rodo, em alguns servers pode variar para Malak.
Em data/npcs/scripts/rune.lua obterá isso:
talk_start = 0 target = 0 following = false attacking = false function onThingMove(creature, thing, oldpos, oldstackpos) end function onCreatureAppear(creature) end function onCreatureDisappear(cid, pos) if focus == cid then selfSay('Good bye then.') focus = 0 talk_start = 0 end end function onCreatureTurn(creature) end function msgcontains(txt, str) return (string.find(txt, str) and not string.find(txt, '(%w+)' .. str) and not string.find(txt, str .. '(%w+)')) end function onCreatureSay(cid, type, msg) msg = string.lower(msg) if ((string.find(msg, '(%a*)hi(%a*)')) and (focus == 0)) and getDistanceToCreature(cid) < 4 then selfSay('Hello ' .. creatureGetName(cid) .. '! I sell hmms (40gps), uhs (40gps), gfbs (60gps), explosions (60gps), sds (90gps) and blank runes (5gps). You can also buy more runes, just say "10 uh" or "100 sd".') focus = cid talk_start = os.clock() elseif string.find(msg, '(%a*)hi(%a*)') and (focus ~= cid) and getDistanceToCreature(cid) < 4 then selfSay('Sorry, ' .. creatureGetName(cid) .. '! I talk to you in a minute.') elseif msgcontains(msg, '100 hmm') and focus == cid then buy(cid,3136,100,800) talk_start = os.clock() elseif msgcontains(msg, '10 hmm') and focus == cid then buy(cid,3136,10,80) talk_start = os.clock() elseif msgcontains(msg, 'hmm') and focus == cid then buy(cid,3136,5,40) talk_start = os.clock() elseif msgcontains(msg, '100 uh') and focus == cid then buy(cid,3098,100,4000) talk_start = os.clock() elseif msgcontains(msg, '10 uh') and focus == cid then buy(cid,3098,10,400) talk_start = os.clock() elseif msgcontains(msg, 'uh') and focus == cid then buy(cid,3098,1,40) talk_start = os.clock() elseif msgcontains(msg, '100 gfb') and focus == cid then buy(cid,3129,100,2000) talk_start = os.clock() elseif msgcontains(msg, '10 gfb') and focus == cid then buy(cid,3129,10,200) talk_start = os.clock() elseif msgcontains(msg, 'gfb') and focus == cid then buy(cid,3129,3,60) talk_start = os.clock() elseif msgcontains(msg, '100 explosion') and focus == cid then buy(cid,3138,100,2000) talk_start = os.clock() elseif msgcontains(msg, '10 explosion') and focus == cid then buy(cid,3138,10,200) talk_start = os.clock() elseif msgcontains(msg, 'explosion') and focus == cid then buy(cid,3138,3,60) talk_start = os.clock() elseif msgcontains(msg, '100 sd') and focus == cid then buy(cid,3093,100,9000) talk_start = os.clock() elseif msgcontains(msg, '10 sd') and focus == cid then buy(cid,3093,10,900) talk_start = os.clock() elseif msgcontains(msg, 'sd') and focus == cid then buy(cid,3093,1,90) talk_start = os.clock() elseif msgcontains(msg, 'restoration') and focus == cid then buy(cid,3095,1,100) talk_start = os.clock() elseif msgcontains(msg, 'blank') and focus == cid then buy(cid,3085,1,5) talk_start = os.clock() elseif string.find(msg, '(%a*)bye(%a*)') and focus == cid and getDistanceToCreature(cid) < 4 then selfSay('Good bye, ' .. creatureGetName(cid) .. '!') focus = 0 talk_start = 0 end end function onCreatureChangeOutfit(creature) end function onThink() if (os.clock() - talk_start) > 30 then if focus > 0 then selfSay('Next Please...') end focus = 0 end if focus ~= 0 then if getDistanceToCreature(focus) > 5 then selfSay('Good bye then.') focus = 0 end end end
Agora onde tem isso:
elseif msgcontains(msg, 'hmm') and focus == cid thenbuy(cid,3136,5,40)
talk_start = os.clock()
Onde diz "hmm" é oq o player tem q dizer para compra uma hmm
Agora onde diz :
buy(cid,3136,5,40)
O numero 3136 obviamente é o ID da HMM,o numero 5 é o numero de cargas por runa e o 40 é o preço q ira custar cada.
Agora :
elseif msgcontains(msg, '100 hmm') and focus == cid thenbuy(cid,3136,100,800)
talk_start = os.clock()
elseif msgcontains(msg, '10 hmm') and focus == cid then
buy(cid,3136,10,80)
talk_start = os.clock()
Se o Player dizer 100 hmm , o NPC venderá uma runa com 100 cargas, como se pode ver no numero 100 >>
buy(cid,3136,100,800)
Se dizer 10, comprará uma runa de 10 cargas.
e quantos mais ele quiser..
Agora avançamos mais um pouquinho
Vendendo Items
Se você quer um NPC pra vender items, é bem parecido com o de Runas..
Acompanhe:
elseif msgcontains(msg, 'hmm') and focus == cid thenbuy(cid,3136,5,40)
talk_start = os.clock()
Eu irei mostrar tudo que vc tem q fazer para arruma-lo :
1. Mude :
(msg, 'hmm')
Para o ID do item
buy(cid,3136,5,40)
2. O numero "5" que equivalia para o numero de cargas mude para a quantidade do item q será vendida, eu sugiro 1.
3. E por ultimo mude o numero "40" para quanto ira custar cada item.
finalmente...
NPC DO BARCO !!!!
No padrão o NPC do boat é o Fargum... mas É so procurar os scripts do barcom em data/npc/scripts/boat.lua..
Esse é o script q vc verá :
focus = 0talk_start = 0
target = 0
following = false
attacking = false
function onThingMove(creature, thing, oldpos, oldstackpos)
end
function onCreatureAppear(creature)
end
function onCreatureDisappear(cid, pos)
if focus == cid then
selfSay('Good bye then.')
focus = 0
talk_start = 0
end
end
function onCreatureTurn(creature)
end
function msgcontains(txt, str)
return (string.find(txt, str) and not string.find(txt, '(%w+)' .. str) and not string.find(txt, str .. '(%w+)'))
end
function onCreatureSay(cid, type, msg)
msg = string.lower(msg)
if (msgcontains(msg, 'hi') and (focus == 0)) and getDistanceToCreature(cid) < 4 then
if isPremium(cid) then
selfSay('Hello ' .. creatureGetName(cid) .. '! I can take you to the The City (20gp) or Dragon Land (50gp). Where do you want to go?')
focus = cid
talk_start = os.clock()
else
selfSay('Sorry, only premium players can travel by boat.')
focus = 0
talk_start = 0
end
elseif msgcontains(msg, 'hi') and (focus ~= cid) and getDistanceToCreature(cid) < 4 then
selfSay('Sorry, ' .. creatureGetName(cid) .. '! I talk to you in a minute.')
elseif focus == cid then
talk_start = os.clock()
if msgcontains(msg, 'dragon land') then
if pay(cid,50) then
selfSay('Let\'s go!')
selfSay('/send ' .. creatureGetName(cid) .. ', 122 119 7')
focus = 0
talk_start = 0
else
selfSay('Sorry, you don\'t have enough money.')
end
elseif msgcontains(msg, 'city') then
if pay(cid,20) then
selfSay('Let\'s go!')
selfSay('/send ' .. creatureGetName(cid) .. ', 171 65 7')
focus = 0
talk_start = 0
else
selfSay('Sorry, you don\'t have enough money.')
end
elseif msgcontains(msg, 'bye') and getDistanceToCreature(cid) < 4 then
selfSay('Good bye, ' .. creatureGetName(cid) .. '!')
focus = 0
talk_start = 0
end
end
end
function onCreatureChangeOutfit(creature)
end
function onThink()
if (os.clock() - talk_start) > 30 then
if focus > 0 then
selfSay('Next Please...')
end
focus = 0
end
if focus ~= 0 then
if getDistanceToCreature(focus) > 5 then
selfSay('Good bye then.')
focus = 0
end
end
end
_______________________________________
if msgcontains(msg, 'dragon land') thenif pay(cid,50) then
selfSay('Let\'s go!')
selfSay('/send ' .. creatureGetName(cid) .. ', 122 119 7')
focus = 0
talk_start = 0
else
selfSay('Sorry, you don\'t have enough money.')
end
Aki é onde vai para diferentes cidades..
Como mandar o player para diferentes cidades ?
Onde diz:
selfSay('/send ' .. creatureGetName(cid) .. ', 122 119 7')
Mude as coordenadas (122 119 7) pras cordenadas de onde vc ker q o npc mande o player e PRONTO ! Fácil não?
Como mudar oque o NPC diz ?
Aki nada muuuuito importante, mas vc pode mudar
selfSay('Let\'s go!')
Mude onde esta escrito (Let\'s go! ) para oque vc ker q ele diga.
Como mudar o preço das passagens ?
if pay(cid,50) then
É só mudar o numero 50 para o preço da nova passagem.
Espero ter ajudado eu sei q fico meio grandinho , mais eu kis faze completo, eu nunca escrevo aki mais vo começa a escreve de agora em diante =))
Obrigado pela atençao e postem suas opiniões por favor =)
Credits: Saporaf (OTFANS) --> Fez o tutorial.
Renanzinhoou --> Traduzi 100% do tutorial para o XTIBIA e adicionei scripts que faltavam e algumas perguntas úteis.
Thanks
CYA