Ir para conteúdo
  • Cadastre-se

[Resolvido] com npc de batalha.


Posts Recomendados

Boooom dia Galera do TK.

 

Estou tendo um simples probleminhas com meus npc's de batalha.

Para batalhar com eles, estou tendo que dialogar duas vezes.

 

Hi /Battle /Battle /"Quantidade de pokes"

 

Como mostra no vídeo, ele diz que me ganhou na primeira tentativa, sem ao menos batalhar kkkk

 

Além disso se não for incomodar, queria 2 Npcs com essa base de script.

E que o dialogo fosse Hi/ Battle/ "Quantidade de poke".   Retirando um "Battle".

 

-Npc que só batalha uma vez, caso o player ganhe.

-Npc de batalha diária, após 24 horas posso lutar com ele novamente.

 

É isso ai, Rep+ a quem puder me ajudar \o/

Abri um beta fechado com amigos do meu servidor ontem, e tive pouquissimos bugs, então to feliz bagarai :v

 

Segue o Script e o Vídeo abaixo.

 

local focus = 0


local max_distance = 8
local talk_start = 0
local conv = 0
local fighting = false
local challenger = 0
local afk_limit_time = 30 -- seconds
local afk_time = 0 -- don't change
local battle_turn = 1 -- don't change
local challenger_turn = 0 -- don't change
local masterpos = {}
local time_to_fight_again = 30 -- seconds, not ms (so 30 * 60 means 30 minutes)

local can_walk = true -- true to make this npc walks randomly
local max_distance = 5 -- maximum distance this npc can get far (sqms)
local walk_delay = 7 -- every seconds make this npc walk

local cooldown_table = {}

local min_pokemons_to_battle = 1-- change to whatever you want
local number_of_pokemons = 0 -- don't change

local prizes = {
[1] = {{itemid = 2148, count = 50}, {itemid = 12213, count = 20}}} -- Mega bit e Oran Berry

local pokemons = {
{name = "Caterpie", level = 10, extralevel = 5, sex = SEX_MALE, nick = "Caterpie", ball = "normal"},
{name = "Weedle", level = 10, extralevel = 5, sex = SEX_FEMALE, nick = "Weedle", ball = "normal"},
{name = "Metapod", level = 15, extralevel = 5, sex = SEX_FEMALE, nick = "Metapod", ball = "normal"},
{name = "Kakuna", level = 15, extralevel = 5, sex = SEX_FEMALE, nick = "Kakuna", ball = "normal"},
}


local function doSummonGymPokemon(npc)
local this = npc
if not isCreature(this) then return true end
if #getCreatureSummons(this) >= 1 or focus == 0 then return true end
local it = pokemons[battle_turn]
doSummonMonster(this, it.name)
local summon = getCreatureSummons(this)[1]
local balleffect = pokeballs["normal"].effect
if it.ball and pokeballs[it.ball] then
balleffect = pokeballs[it.ball].effect
end
doSendMagicEffect(getThingPos(summon), balleffect)
setPlayerStorageValue(summon, 10000, balleffect)
setPlayerStorageValue(summon, 10001, gobackmsgs[math.random(#gobackmsgs)].back:gsub("doka", it.nick ~= "" and it.nick or it.name))
setPlayerStorageValue(summon, 1007, it.nick ~= "" and it.nick or it.name)
doSetMonsterGym(summon, focus)
local name = it.nick ~= "" and it.nick or getCreatureName(this).."s "..it.name
setWildPokemonLevel(summon, it.level, getPokemonStatus(it.name, (it.extralevel + it.level)), name, 1.5)
doCreatureSay(this, gobackmsgs[math.random(#gobackmsgs)].go:gsub("doka", getPlayerStorageValue(summon, 1007)), 1)
fighting = true
battle_turn = battle_turn + 1
end

local function doWinDuel(cid, npc)
if not isCreature(cid) then return true end
local this = npc
local x = prizes[number_of_pokemons]
for n = 1, #x do
doPlayerAddItem(cid, x[n].itemid, x[n].count)
end
doCreatureSay(npc, "Ooh nao, como pode me vencer? Aqui esta o seu premio.", 1)
cooldown_table[getCreatureName(cid)] = os.clock() + time_to_fight_again
return true
end

function onCreatureSay(cid, type, msg)

local msg = string.lower(msg)

if focus == cid then
talk_start = os.clock()
end

if msgcontains(msg, 'hi') and focus == 0 and getDistanceToCreature(cid) <= 4 then

if cooldown_table[getCreatureName(cid)] and cooldown_table[getCreatureName(cid)] - os.clock() > 0 then
selfSay("Eae "..getCreatureName(cid)..", Eu realmente gostei da nossa ultima batalha!")
conv = 10
else
selfSay("Ola "..getCreatureName(cid)..", Oque voce quer?")
conv = 1
end

focus = cid
talk_start = os.clock()
return true
end

if (isDuelMsg(msg) or isConfirmMsg(msg)) and (conv == 1 or conv == 10) and focus == cid then

if conv == 10 then
selfSay("Nos ja batalhamos! Espere meus Pokemon's se recuperarem da ultima batalha!")
focus = 0
return true
end

if not hasPokemon(cid) then
selfSay("Voce precisa de Pokemon's para batalhar!")
return true
end

selfSay("Okay, entao vamos la...")
conv = 2

return true
end

if conv == 2 and focus == cid then

if not tonumber(msg) then
selfSay("Me diga quantos Pokemon's voce quer usar em batalha.")
return true
elseif tonumber(msg) > #pokemons then
selfSay("Eu so tenho "..#pokemons..", pode ser? "..#pokemons.."!")
return true
elseif tonumber(msg) < min_pokemons_to_battle or tonumber(msg) < 1 then
selfSay("It has to be more than "..min_pokemons_to_battle..".")
return true
else
number_of_pokemons = tonumber(msg)
selfSay("Okay, vamos a batalha "..number_of_pokemons.." Boa sorte!")
challenger = focus
setPlayerStorageValue(cid, 990, 1)
addEvent(doSummonGymPokemon, 850, getThis())
conv = 3
return true
end


return true
end

if isNegMsg(msg) and conv == 1 and focus == cid then

focus = 0
selfSay("E melhor para voce recusar uma batalha contra mim!")

return true
end

if msgcontains(msg, 'bye') and focus == cid then
selfSay('Ate logo!')
setPlayerStorageValue(focus, 990, -1)
focus = 0
return true
end
end

local afk_warning = false
local change = false
local walkdelay = 0

function onThink()

if not masterpos.x then
masterpos = getThingPos(getThis())
end

if focus == 0 then
selfTurn(2)
fighting = false
challenger = 0
change = false
challenger_turn = 0
battle_turn = 1
afk_time = 0
afk_warning = false

if #getCreatureSummons(getThis()) >= 1 then
setPlayerStorageValue(getCreatureSummons(getThis())[1], 1006, 0)
doCreatureAddHealth(getCreatureSummons(getThis())[1], -getCreatureMaxHealth(getCreatureSummons(getThis())[1]))
end

walkdelay = walkdelay - 0.5

if walkdelay <= 0 then
walkdelay = walk_delay
local pos = getThingPos(getThis())
local npos = {}
for a = 0, 3 do
if getDistanceBetween(getPosByDir(pos, a), masterpos) <= max_distance and canWalkOnPos(getPosByDir(pos, a), true, false, true, true, false) then
table.insert(npos, getPosByDir(pos, a))
end
end

if npos and #npos > 0 then
doTeleportThing(getThis(), npos[math.random(#npos)])
end
end

return true
else

if not isCreature(focus) then
focus = 0
return true
end

if fighting then

talk_start = os.clock()

if not isCreature(getCreatureTarget(getThis())) then
if #getCreatureSummons(challenger) >= 1 then
if getCreatureOutfit(getCreatureSummons(challenger)[1]).lookType ~= 2 then --alterado v2.6
selfAttackCreature(getCreatureSummons(challenger)[1])
challenger_turn = challenger_turn + 1
afk_time = 0
end
else
afk_time = afk_time + 0.5
if change then
change = false
challenger_turn = challenger_turn + 1
end
end
end

if afk_time > afk_limit_time then
setPlayerStorageValue(focus, 990, -1)
focus = 0
selfSay("Eu esperei muito tempo, volte quando estiver pronto!")
return true
end

if not afk_warning and afk_time > afk_limit_time / 2 then
selfSay("Cade seu Pokemon? vamos logo!")
afk_warning = true
end


if #getCreatureSummons(getThis()) == 0 then
if battle_turn > number_of_pokemons then
addEvent(doWinDuel, 1000, focus, getThis())
setPlayerStorageValue(focus, 990, -1)
focus = 0
return true
end
addEvent(doSummonGymPokemon, 1000, getThis())
end

if not hasPokemon(challenger) or challenger_turn > 6 or challenger_turn >= number_of_pokemons then
selfSay("Voce perdeu hahahaha! Talvez voce possa me ganhar um dia.")
setPlayerStorageValue(focus, 990, -1)
focus = 0
return true
end

end

local npcpos = getThingPos(getThis())
local focpos = getThingPos(focus)

if npcpos.z ~= focpos.z then
setPlayerStorageValue(focus, 990, -1)
focus = 0
selfSay("entao tchau.")
return true
end

if (os.clock() - talk_start) > 30 then
selfSay("Ate logo e continue treinando!")
setPlayerStorageValue(focus, 990, -1)
focus = 0
end

if getDistanceToCreature(focus) > max_distance then
setPlayerStorageValue(focus, 990, -1)
focus = 0
return true
end

local dir = doRedirectDirection(getDirectionTo(npcpos, focpos))
selfTurn(dir)
end
return true
end

 

 

Vídeo :

 

https://www.youtube.com/watch?v=MTLQybWo3PE&feature=youtu.be

Editado por eliaspalermo (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

local focus = 0
local max_distance = 8
local talk_start = 0
local conv = 0
local fighting = false
local challenger = 0
local afk_limit_time = 30 -- seconds
local afk_time = 0 -- don't change
local battle_turn = 1 -- don't change
local challenger_turn = 0 -- don't change
local masterpos = {}
local time_to_fight_again = 86400 -- seconds, not ms (so 30 * 60 means 30 minutes)
 
local can_walk = true -- true to make this npc walks randomly
local max_distance = 5 -- maximum distance this npc can get far (sqms)
local walk_delay = 5 -- every seconds make this npc walk
 
local cooldown_table = {}
 
local min_pokemons_to_battle = 1-- change to whatever you want
local number_of_pokemons = 0 -- don't change
 
local prizes = {
[1] = {{itemid = 2148, count = 50}, {itemid = 12213, count = 20}}} -- Mega bit e Oran Berry
 
local pokemons = {
{name = "Ivysaur", level = 70, extralevel = 20, sex = SEX_MALE, nick = "Hiv", ball = "super"},
{name = "Grotle", level = 80, extralevel = 15, sex = SEX_FEMALE, nick = "Grot", ball = "normal"},
{name = "Grovyle", level = 95, extralevel = 20, sex = SEX_MALE, nick = "Grov", ball = "great"},
{name = "Carnivine", level = 80, extralevel = 30, sex = SEX_MALE, nick = "Carne", ball = "normal"},
{name = "Victreebel", level = 95, extralevel = 37, sex = SEX_FEMALE, nick = "Vic", ball = "ultra"},
{name = "Tropius", level = 95, extralevel = 2, sex = SEX_FEMALE, nick = "Trop", ball = "ultra"},
}
 
 
local function doSummonGymPokemon(npc)
local this = npc
if not isCreature(this) then return true end
if #getCreatureSummons(this) >= 1 or focus == 0 then return true end
local it = pokemons[battle_turn]
doSummonMonster(this, it.name)
local summon = getCreatureSummons(this)[1]
local balleffect = pokeballs["normal"].effect
if it.ball and pokeballs[it.ball] then
balleffect = pokeballs[it.ball].effect
end
doSendMagicEffect(getThingPos(summon), balleffect)
setPlayerStorageValue(summon, 10000, balleffect)
setPlayerStorageValue(summon, 10001, gobackmsgs[math.random(#gobackmsgs)].back:gsub("doka", it.nick ~= "" and it.nick or it.name))
setPlayerStorageValue(summon, 1007, it.nick ~= "" and it.nick or it.name)
doSetMonsterGym(summon, focus)
local name = it.nick ~= "" and it.nick or getCreatureName(this).."s "..it.name
setWildPokemonLevel(summon, it.level, getPokemonStatus(it.name, (it.extralevel + it.level)), name, 1.5)
doCreatureSay(this, gobackmsgs[math.random(#gobackmsgs)].go:gsub("doka", getPlayerStorageValue(summon, 1007)), 1)
fighting = true
battle_turn = battle_turn + 1
end
 
local function doWinDuel(cid, npc)
if not isCreature(cid) then return true end
local this = npc
local x = prizes[number_of_pokemons]
for n = 1, #x do
doPlayerAddItem(cid, x[n].itemid, x[n].count)
end
doCreatureSay(npc, "Parabéns! Você ganhou, aqui é o seu prêmio.", 1)
cooldown_table[getCreatureName(cid)] = os.clock() + time_to_fight_again
return true
end
 
function onCreatureSay(cid, type, msg)
 
local msg = string.lower(msg)
 
if focus == cid then
talk_start = os.clock()
end
 
if msgcontains(msg, 'hi') and focus == 0 and getDistanceToCreature(cid) <= 4 then
 
if cooldown_table[getCreatureName(cid)] and cooldown_table[getCreatureName(cid)] - os.clock() > 0 then
selfSay("Hello "..getCreatureName(cid)..", I really enjoyed our last battle!")
conv = 10
else
selfSay("Olá "..getCreatureName(cid)..", voçê deseja duelar comigo? Eu posso dar prêmios se você ganhar, fale Duel para batalha")
conv = 1
end
 
focus = cid
talk_start = os.clock()
return true
end
 
if (isDuelMsg(msg) or isConfirmMsg(msg)) and (conv == 1 or conv == 10) and focus == cid then
 
if conv == 10 then
selfSay("Acabamos de lutar! Por favor, espere um tempo para me recuperar da última batalha!")
focus = 0
return true
end
 
if not hasPokemon(cid) then
selfSay("Você precisa pokemons para a batalha!")
return true
end
 
selfSay("Ok, me diga com quantos pokemons voçê vai lutar.")
conv = 2
 
return true
end
 
if conv == 2 and focus == cid then
 
if not tonumber(msg) then
selfSay("Diga-me o número de pokemons que que nós vamos batalhar.")
return true
elseif tonumber(msg) > #pokemons then
selfSay("Só tenho "..#pokemons..",de modo que o máximo é de "..#pokemons.."!")
return true
elseif tonumber(msg) < min_pokemons_to_battle or tonumber(msg) < 1 then
selfSay("Tem que ser mais do que "..min_pokemons_to_battle..".")
return true
else
number_of_pokemons = tonumber(msg)
selfSay("Ok, o primeiro que vencer "..number_of_pokemons.." leva-rá a vitória, vamos começar!")
challenger = focus
setPlayerStorageValue(cid, 990, 1)
addEvent(doSummonGymPokemon, 850, getThis())
conv = 3
return true
end
 
 
return true
end
 
if isNegMsg(msg) and conv == 1 and focus == cid then
 
focus = 0
selfSay("É melhor para você recusar uma batalha contra mim!")
 
return true
end
 
if msgcontains(msg, 'bye') and focus == cid then
selfSay('Tchau e acredito que fiz de voçê um melhor treinador!')
setPlayerStorageValue(focus, 990, -1)
focus = 0
return true
end
end
 
local afk_warning = false
local change = false
local walkdelay = 0
 
function onThink()
 
if not masterpos.x then
masterpos = getThingPos(getThis())
end
 
if focus == 0 then
selfTurn(2)
fighting = false
challenger = 0
change = false
challenger_turn = 0
battle_turn = 1
afk_time = 0
afk_warning = false
 
if #getCreatureSummons(getThis()) >= 1 then
setPlayerStorageValue(getCreatureSummons(getThis())[1], 1006, 0)
doCreatureAddHealth(getCreatureSummons(getThis())[1], -getCreatureMaxHealth(getCreatureSummons(getThis())[1]))
end
 
walkdelay = walkdelay - 0.5
 
if walkdelay <= 0 then
walkdelay = walk_delay
local pos = getThingPos(getThis())
local npos = {}
for a = 0, 3 do
if getDistanceBetween(getPosByDir(pos, a), masterpos) <= max_distance and canWalkOnPos(getPosByDir(pos, a), true, false, true, true, false) then
table.insert(npos, getPosByDir(pos, a))
end
end
 
if npos and #npos > 0 then
doTeleportThing(getThis(), npos[math.random(#npos)])
end
end
 
return true
else
 
if not isCreature(focus) then
focus = 0
return true
end
 
if fighting then
 
talk_start = os.clock()
 
if not isCreature(getCreatureTarget(getThis())) then
if #getCreatureSummons(challenger) >= 1 then
selfAttackCreature(getCreatureSummons(challenger)[1])
change = true
afk_time = 0
else
afk_time = afk_time + 0.5
if change then
change = false
challenger_turn = challenger_turn + 1
end
end
end
 
if afk_time > afk_limit_time then
setPlayerStorageValue(focus, 990, -1)
focus = 0
selfSay("Eu esperei muito tempo, voltar quando estiver pronto!")
return true
end
 
if not afk_warning and afk_time > afk_limit_time / 2 then
selfSay("Onde está seu pokemon? Vamos lutar!")
afk_warning = true
end
 
 
if #getCreatureSummons(getThis()) == 0 then
if battle_turn > number_of_pokemons then
addEvent(doWinDuel, 1000, focus, getThis())
setPlayerStorageValue(focus, 990, -1)
focus = 0
return true
end
addEvent(doSummonGymPokemon, 1000, getThis())
end
 
if not hasPokemon(challenger) or challenger_turn > 6 or challenger_turn >= number_of_pokemons then
selfSay("Você perdeu o nosso duelo! Talvez algum outro momento você vai me derrotar.")
setPlayerStorageValue(focus, 990, -1)
focus = 0
return true
end
 
end
 
local npcpos = getThingPos(getThis())
local focpos = getThingPos(focus)
 
if npcpos.z ~= focpos.z then
setPlayerStorageValue(focus, 990, -1)
focus = 0
selfSay("Flw Parceiro.")
return true
end
 
if (os.clock() - talk_start) > 30 then
selfSay("Adeus e mantenha a formação!")
setPlayerStorageValue(focus, 990, -1)
focus = 0
end
 
if getDistanceToCreature(focus) > max_distance then
setPlayerStorageValue(focus, 990, -1)
focus = 0
return true
end
 
local dir = doRedirectDirection(getDirectionTo(npcpos, focpos))
selfTurn(dir)
end
return true
end

Pronto ele só pode ser usado a cada 24 horas e teste ai creio que vá funcionar apenas edite as mensagens a seu gosto

Ando devagar, porque já tive pressa. E levo esse sorriso, porque já chorei demais...

________________________________________________________________________________

Minhas Sprites:

Mega Metagross

Mega Abomasnow

Pack de Shinys

[Posso atualizá-lo com novos shinys a qualquer momento]

Tutoriais:

[Completo] Criando e adicionando um novo Pokémon

[Actions] Criando quest no RME

Editores Lua/Xml/Sync Entre outros:

Editores Win/Mac/Linux

Link para o post
Compartilhar em outros sites

Segura meu Rep+ ae fera. Muito obrigado, funcionou perfeitamente ^^

 

E quanto ao npc de batalhar apenas um vez caso vencer, tu sabe fazer man?

Preciso deles pra alguns npcs da historia do game xD

Link para o post
Compartilhar em outros sites

@eliaspalermo

local focus = 0
local max_distance = 8
local talk_start = 0
local conv = 0
local fighting = false
local challenger = 0
local afk_limit_time = 30 -- seconds
local afk_time = 0 -- don't change
local battle_turn = 1 -- don't change
local challenger_turn = 0 -- don't change
local masterpos = {}
local time_to_fight_again = 86400 -- seconds, not ms (so 30 * 60 means 30 minutes)
 
local can_walk = true -- true to make this npc walks randomly
local max_distance = 5 -- maximum distance this npc can get far (sqms)
local walk_delay = 5 -- every seconds make this npc walk
 
local cooldown_table = {}
 
local min_pokemons_to_battle = 1-- change to whatever you want
local number_of_pokemons = 0 -- don't change
 
local prizes = {
[1] = {{itemid = 2148, count = 50}, {itemid = 12213, count = 20}}} -- Mega bit e Oran Berry
 
local pokemons = {
{name = "Ivysaur", level = 70, extralevel = 20, sex = SEX_MALE, nick = "Hiv", ball = "super"},
{name = "Grotle", level = 80, extralevel = 15, sex = SEX_FEMALE, nick = "Grot", ball = "normal"},
{name = "Grovyle", level = 95, extralevel = 20, sex = SEX_MALE, nick = "Grov", ball = "great"},
{name = "Carnivine", level = 80, extralevel = 30, sex = SEX_MALE, nick = "Carne", ball = "normal"},
{name = "Victreebel", level = 95, extralevel = 37, sex = SEX_FEMALE, nick = "Vic", ball = "ultra"},
{name = "Tropius", level = 95, extralevel = 2, sex = SEX_FEMALE, nick = "Trop", ball = "ultra"},
}
 
 
local function doSummonGymPokemon(npc)
local this = npc
if not isCreature(this) then return true end
if #getCreatureSummons(this) >= 1 or focus == 0 then return true end
local it = pokemons[battle_turn]
doSummonMonster(this, it.name)
local summon = getCreatureSummons(this)[1]
local balleffect = pokeballs["normal"].effect
if it.ball and pokeballs[it.ball] then
balleffect = pokeballs[it.ball].effect
end
doSendMagicEffect(getThingPos(summon), balleffect)
setPlayerStorageValue(summon, 10000, balleffect)
setPlayerStorageValue(summon, 10001, gobackmsgs[math.random(#gobackmsgs)].back:gsub("doka", it.nick ~= "" and it.nick or it.name))
setPlayerStorageValue(summon, 1007, it.nick ~= "" and it.nick or it.name)
doSetMonsterGym(summon, focus)
local name = it.nick ~= "" and it.nick or getCreatureName(this).."s "..it.name
setWildPokemonLevel(summon, it.level, getPokemonStatus(it.name, (it.extralevel + it.level)), name, 1.5)
doCreatureSay(this, gobackmsgs[math.random(#gobackmsgs)].go:gsub("doka", getPlayerStorageValue(summon, 1007)), 1)
fighting = true
battle_turn = battle_turn + 1
end
 
local function doWinDuel(cid, npc)
if not isCreature(cid) then return true end
local this = npc
local x = prizes[number_of_pokemons]
for n = 1, #x do
doPlayerAddItem(cid, x[n].itemid, x[n].count)
end
doCreatureSay(npc, "Parabéns! Você ganhou, aqui é o seu prêmio.", 1)
setPlayerStorageValue(cid, 974, 1)
cooldown_table[getCreatureName(cid)] = os.clock() + time_to_fight_again
return true
end
 
function onCreatureSay(cid, type, msg)
 
local msg = string.lower(msg)
 
if focus == cid then
talk_start = os.clock()
end
 
if msgcontains(msg, 'hi') and focus == 0 and getDistanceToCreature(cid) <= 4 then
 
if cooldown_table[getCreatureName(cid)] and cooldown_table[getCreatureName(cid)] - os.clock() > 0 then
selfSay("Hello "..getCreatureName(cid)..", I really enjoyed our last battle!")
conv = 10
else
selfSay("Olá "..getCreatureName(cid)..", voçê deseja duelar comigo? Eu posso dar prêmios se você ganhar, fale Duel para batalha")
conv = 1
end
 
focus = cid
talk_start = os.clock()
return true
end
 
if (isDuelMsg(msg) or isConfirmMsg(msg)) and (conv == 1 or conv == 10) and focus == cid then
 
if conv == 10 then
selfSay("Acabamos de lutar! Por favor, espere um tempo para me recuperar da última batalha!")
focus = 0
return true
end
 
if getPlayerStorageValue(cid, 974) >= 1 then
selfSay("You have already won my fight.")
focus = 0
return true
end
 
if not hasPokemon(cid) then
selfSay("Você precisa pokemons para a batalha!")
return true
end
 
selfSay("Ok, me diga com quantos pokemons voçê vai lutar.")
conv = 2
 
return true
end
 
if conv == 2 and focus == cid then
 
if not tonumber(msg) then
selfSay("Diga-me o número de pokemons que que nós vamos batalhar.")
return true
elseif tonumber(msg) > #pokemons then
selfSay("Só tenho "..#pokemons..",de modo que o máximo é de "..#pokemons.."!")
return true
elseif tonumber(msg) < min_pokemons_to_battle or tonumber(msg) < 1 then
selfSay("Tem que ser mais do que "..min_pokemons_to_battle..".")
return true
else
number_of_pokemons = tonumber(msg)
selfSay("Ok, o primeiro que vencer "..number_of_pokemons.." leva-rá a vitória, vamos começar!")
challenger = focus
setPlayerStorageValue(cid, 990, 1)
addEvent(doSummonGymPokemon, 850, getThis())
conv = 3
return true
end
 
 
return true
end
 
if isNegMsg(msg) and conv == 1 and focus == cid then
 
focus = 0
selfSay("É melhor para você recusar uma batalha contra mim!")
 
return true
end
 
if msgcontains(msg, 'bye') and focus == cid then
selfSay('Tchau e acredito que fiz de voçê um melhor treinador!')
setPlayerStorageValue(focus, 990, -1)
focus = 0
return true
end
end
 
local afk_warning = false
local change = false
local walkdelay = 0
 
function onThink()
 
if not masterpos.x then
masterpos = getThingPos(getThis())
end
 
if focus == 0 then
selfTurn(2)
fighting = false
challenger = 0
change = false
challenger_turn = 0
battle_turn = 1
afk_time = 0
afk_warning = false
 
if #getCreatureSummons(getThis()) >= 1 then
setPlayerStorageValue(getCreatureSummons(getThis())[1], 1006, 0)
doCreatureAddHealth(getCreatureSummons(getThis())[1], -getCreatureMaxHealth(getCreatureSummons(getThis())[1]))
end
 
walkdelay = walkdelay - 0.5
 
if walkdelay <= 0 then
walkdelay = walk_delay
local pos = getThingPos(getThis())
local npos = {}
for a = 0, 3 do
if getDistanceBetween(getPosByDir(pos, a), masterpos) <= max_distance and canWalkOnPos(getPosByDir(pos, a), true, false, true, true, false) then
table.insert(npos, getPosByDir(pos, a))
end
end
 
if npos and #npos > 0 then
doTeleportThing(getThis(), npos[math.random(#npos)])
end
end
 
return true
else
 
if not isCreature(focus) then
focus = 0
return true
end
 
if fighting then
 
talk_start = os.clock()
 
if not isCreature(getCreatureTarget(getThis())) then
if #getCreatureSummons(challenger) >= 1 then
selfAttackCreature(getCreatureSummons(challenger)[1])
change = true
afk_time = 0
else
afk_time = afk_time + 0.5
if change then
change = false
challenger_turn = challenger_turn + 1
end
end
end
 
if afk_time > afk_limit_time then
setPlayerStorageValue(focus, 990, -1)
focus = 0
selfSay("Eu esperei muito tempo, voltar quando estiver pronto!")
return true
end
 
if not afk_warning and afk_time > afk_limit_time / 2 then
selfSay("Onde está seu pokemon? Vamos lutar!")
afk_warning = true
end
 
 
if #getCreatureSummons(getThis()) == 0 then
if battle_turn > number_of_pokemons then
addEvent(doWinDuel, 1000, focus, getThis())
setPlayerStorageValue(focus, 990, -1)
focus = 0
return true
end
addEvent(doSummonGymPokemon, 1000, getThis())
end
 
if not hasPokemon(challenger) or challenger_turn > 6 or challenger_turn >= number_of_pokemons then
selfSay("Você perdeu o nosso duelo! Talvez algum outro momento você vai me derrotar.")
setPlayerStorageValue(focus, 990, -1)
focus = 0
return true
end
 
end
 
local npcpos = getThingPos(getThis())
local focpos = getThingPos(focus)
 
if npcpos.z ~= focpos.z then
setPlayerStorageValue(focus, 990, -1)
focus = 0
selfSay("Flw Parceiro.")
return true
end
 
if (os.clock() - talk_start) > 30 then
selfSay("Adeus e mantenha a formação!")
setPlayerStorageValue(focus, 990, -1)
focus = 0
end
 
if getDistanceToCreature(focus) > max_distance then
setPlayerStorageValue(focus, 990, -1)
focus = 0
return true
end
 
local dir = doRedirectDirection(getDirectionTo(npcpos, focpos))
selfTurn(dir)
end
return true
end

Ando devagar, porque já tive pressa. E levo esse sorriso, porque já chorei demais...

________________________________________________________________________________

Minhas Sprites:

Mega Metagross

Mega Abomasnow

Pack de Shinys

[Posso atualizá-lo com novos shinys a qualquer momento]

Tutoriais:

[Completo] Criando e adicionando um novo Pokémon

[Actions] Criando quest no RME

Editores Lua/Xml/Sync Entre outros:

Editores Win/Mac/Linux

Link para o post
Compartilhar em outros sites

Beleza, muito obrigado mano, só me tira uma dúvida. Esse script do npc que só batalha apenas uma vez. Quando eu for fazer mais de um npc eu tenho que mudar o storage ou algo do tipo? se sim, em qual linha seria?

E uma outra coisa que eu já ia esquecendo, tem como remover a parte de escolher quantos pokes o player quer batalhar? para ele ser obrigado a batalhar com todos os pokes que este npc tem. Rep++


Aee man o script ta com um bug xD

 

Se eu batalho com apenas 1 pokémon, o sistema salva e eu só poderei batalhar com ele novamente após as 24 horas. Tudo certinho.

 

Mas caso eu lute com 2 ou mais, não salva e eu posso lutar com ele continuamente.

Além dele não me dar o prêmio. 

post-74390-0-10204900-1429970224_thumb.p

Editado por eliaspalermo (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

local focus = 0
local max_distance = 8
local talk_start = 0
local conv = 0
local fighting = false
local challenger = 0
local afk_limit_time = 30 -- seconds
local afk_time = 0 -- don't change
local battle_turn = 1 -- don't change
local challenger_turn = 0 -- don't change
local masterpos = {}
local time_to_fight_again = 86400 -- seconds, not ms (so 30 * 60 means 30 minutes)
 
local can_walk = true -- true to make this npc walks randomly
local max_distance = 5 -- maximum distance this npc can get far (sqms)
local walk_delay = 5 -- every seconds make this npc walk
 
local cooldown_table = {}
 
local min_pokemons_to_battle = 1-- change to whatever you want
local number_of_pokemons = 0 -- don't change
 
local prizes = {
[1] = {{itemid = 2148, count = 50}, {itemid = 12213, count = 20}}} -- Mega bit e Oran Berry
 
local pokemons = {
{name = "Ivysaur", level = 70, extralevel = 20, sex = SEX_MALE, nick = "Hiv", ball = "super"},
{name = "Grotle", level = 80, extralevel = 15, sex = SEX_FEMALE, nick = "Grot", ball = "normal"},
{name = "Grovyle", level = 95, extralevel = 20, sex = SEX_MALE, nick = "Grov", ball = "great"},
{name = "Carnivine", level = 80, extralevel = 30, sex = SEX_MALE, nick = "Carne", ball = "normal"},
{name = "Victreebel", level = 95, extralevel = 37, sex = SEX_FEMALE, nick = "Vic", ball = "ultra"},
{name = "Tropius", level = 95, extralevel = 2, sex = SEX_FEMALE, nick = "Trop", ball = "ultra"},
}
 
 
local function doSummonGymPokemon(npc)
local this = npc
if not isCreature(this) then return true end
if #getCreatureSummons(this) >= 1 or focus == 0 then return true end
local it = pokemons[battle_turn]
doSummonMonster(this, it.name)
local summon = getCreatureSummons(this)[1]
local balleffect = pokeballs["normal"].effect
if it.ball and pokeballs[it.ball] then
balleffect = pokeballs[it.ball].effect
end
doSendMagicEffect(getThingPos(summon), balleffect)
setPlayerStorageValue(summon, 10000, balleffect)
setPlayerStorageValue(summon, 10001, gobackmsgs[math.random(#gobackmsgs)].back:gsub("doka", it.nick ~= "" and it.nick or it.name))
setPlayerStorageValue(summon, 1007, it.nick ~= "" and it.nick or it.name)
doSetMonsterGym(summon, focus)
local name = it.nick ~= "" and it.nick or getCreatureName(this).."s "..it.name
setWildPokemonLevel(summon, it.level, getPokemonStatus(it.name, (it.extralevel + it.level)), name, 1.5)
doCreatureSay(this, gobackmsgs[math.random(#gobackmsgs)].go:gsub("doka", getPlayerStorageValue(summon, 1007)), 1)
fighting = true
battle_turn = battle_turn + 1
end
 
local function doWinDuel(cid, npc)
if not isCreature(cid) then return true end
local this = npc
local x = prizes[number_of_pokemons]
for n = 1, #x do
doPlayerAddItem(cid, x[n].itemid, x[n].count)
end
doCreatureSay(npc, "Parabéns! Você ganhou, aqui é o seu prêmio.", 1)
setPlayerStorageValue(cid, 974, 1)
cooldown_table[getCreatureName(cid)] = os.clock() + time_to_fight_again
return true
end
 
function onCreatureSay(cid, type, msg)
 
local msg = string.lower(msg)
 
if focus == cid then
talk_start = os.clock()
end
 
if msgcontains(msg, 'hi') and focus == 0 and getDistanceToCreature(cid) <= 4 then
 
if cooldown_table[getCreatureName(cid)] and cooldown_table[getCreatureName(cid)] - os.clock() > 0 then
selfSay("Hello "..getCreatureName(cid)..", I really enjoyed our last battle!")
conv = 10
else
selfSay("Olá "..getCreatureName(cid)..", voçê deseja duelar comigo? Eu posso dar prêmios se você ganhar, fale Duel para batalha")
conv = 1
end
 
focus = cid
talk_start = os.clock()
return true
end
 
if (isDuelMsg(msg) or isConfirmMsg(msg)) and (conv == 1 or conv == 10) and focus == cid then
 
if conv == 10 then
selfSay("Acabamos de lutar! Por favor, espere um tempo para me recuperar da última batalha!")
focus = 0
return true
end
 
if getPlayerStorageValue(cid, 974) >= 1 then
selfSay("You have already won my fight.")
focus = 0
return true
end
 
if not hasPokemon(cid) then
selfSay("Você precisa pokemons para a batalha!")
return true
end
 
selfSay("Ok, me diga com quantos pokemons voçê vai lutar.")
conv = 2
 
return true
end
 
if conv == 2 and focus == cid then
 
if not tonumber(msg) then
selfSay("Diga-me o número de pokemons que que nós vamos batalhar.")
return true
elseif tonumber(msg) < #pokemons then
selfSay("Só podemos batalhar com "..#pokemons.." pokemons!")
return true
elseif tonumber(msg) < min_pokemons_to_battle or tonumber(msg) < 6 then
selfSay("Tem que ser mais do que "..min_pokemons_to_battle..".")
return true
else
number_of_pokemons = tonumber(msg)
selfSay("Ok, o primeiro que vencer "..number_of_pokemons.." leva-rá a vitória, vamos começar!")
challenger = focus
setPlayerStorageValue(cid, 990, 1)
addEvent(doSummonGymPokemon, 850, getThis())
conv = 3
return true
end
 
 
return true
end
 
if isNegMsg(msg) and conv == 1 and focus == cid then
 
focus = 0
selfSay("É melhor para você recusar uma batalha contra mim!")
 
return true
end
 
if msgcontains(msg, 'bye') and focus == cid then
selfSay('Tchau e acredito que fiz de voçê um melhor treinador!')
setPlayerStorageValue(focus, 990, -1)
focus = 0
return true
end
end
 
local afk_warning = false
local change = false
local walkdelay = 0
 
function onThink()
 
if not masterpos.x then
masterpos = getThingPos(getThis())
end
 
if focus == 0 then
selfTurn(2)
fighting = false
challenger = 0
change = false
challenger_turn = 0
battle_turn = 1
afk_time = 0
afk_warning = false
 
if #getCreatureSummons(getThis()) >= 1 then
setPlayerStorageValue(getCreatureSummons(getThis())[1], 1006, 0)
doCreatureAddHealth(getCreatureSummons(getThis())[1], -getCreatureMaxHealth(getCreatureSummons(getThis())[1]))
end
 
walkdelay = walkdelay - 0.5
 
if walkdelay <= 0 then
walkdelay = walk_delay
local pos = getThingPos(getThis())
local npos = {}
for a = 0, 3 do
if getDistanceBetween(getPosByDir(pos, a), masterpos) <= max_distance and canWalkOnPos(getPosByDir(pos, a), true, false, true, true, false) then
table.insert(npos, getPosByDir(pos, a))
end
end
 
if npos and #npos > 0 then
doTeleportThing(getThis(), npos[math.random(#npos)])
end
end
 
return true
else
 
if not isCreature(focus) then
focus = 0
return true
end
 
if fighting then
 
talk_start = os.clock()
 
if not isCreature(getCreatureTarget(getThis())) then
if #getCreatureSummons(challenger) >= 1 then
selfAttackCreature(getCreatureSummons(challenger)[1])
change = true
afk_time = 0
else
afk_time = afk_time + 0.5
if change then
change = false
challenger_turn = challenger_turn + 1
end
end
end
 
if afk_time > afk_limit_time then
setPlayerStorageValue(focus, 990, -1)
focus = 0
selfSay("Eu esperei muito tempo, voltar quando estiver pronto!")
return true
end
 
if not afk_warning and afk_time > afk_limit_time / 2 then
selfSay("Onde está seu pokemon? Vamos lutar!")
afk_warning = true
end
 
 
if #getCreatureSummons(getThis()) == 0 then
if battle_turn > number_of_pokemons then
addEvent(doWinDuel, 1000, focus, getThis())
setPlayerStorageValue(focus, 990, -1)
focus = 0
return true
end
addEvent(doSummonGymPokemon, 1000, getThis())
end
 
if not hasPokemon(challenger) or challenger_turn > 6 or challenger_turn >= number_of_pokemons then
selfSay("Você perdeu o nosso duelo! Talvez algum outro momento você vai me derrotar.")
setPlayerStorageValue(focus, 990, -1)
focus = 0
return true
end
 
end
 
local npcpos = getThingPos(getThis())
local focpos = getThingPos(focus)
 
if npcpos.z ~= focpos.z then
setPlayerStorageValue(focus, 990, -1)
focus = 0
selfSay("Flw Parceiro.")
return true
end
 
if (os.clock() - talk_start) > 30 then
selfSay("Adeus e mantenha a formação!")
setPlayerStorageValue(focus, 990, -1)
focus = 0
end
 
if getDistanceToCreature(focus) > max_distance then
setPlayerStorageValue(focus, 990, -1)
focus = 0
return true
end
 
local dir = doRedirectDirection(getDirectionTo(npcpos, focpos))
selfTurn(dir)
end
return true
end

Não retirei a linha apenas coloquei para duelar somente com 6 pokémons.

Ando devagar, porque já tive pressa. E levo esse sorriso, porque já chorei demais...

________________________________________________________________________________

Minhas Sprites:

Mega Metagross

Mega Abomasnow

Pack de Shinys

[Posso atualizá-lo com novos shinys a qualquer momento]

Tutoriais:

[Completo] Criando e adicionando um novo Pokémon

[Actions] Criando quest no RME

Editores Lua/Xml/Sync Entre outros:

Editores Win/Mac/Linux

Link para o post
Compartilhar em outros sites

Vinicius desculpe incomoda-lo novamente, mas a pedido dos meus players preciso mudar uma coisa no npc.

 

Em vez de escolher a quantidade de pokémon's para a batalha, queria que fosse obrigatória a batalha de acordo com quantos pokémon's estiver no script.

 

Exemplo, se o npc tiver 4 pokémon's, eu terei de derrotar os 4 sem ter escolha, assim ficando o dialogo : Hi/ Battle/ sim(para a confirmação de que irá iniciar a batalha)

 

Mantém o valor de 24 horas para um npc.

E para o outro se possível adicionar uma tag que contenha uma storage para não batalhar novamente...

 

Se puder poste os dois scripts em spoilers separados para que eu não possa vir a confundir. obrigado desde já. Rep++

Editado por eliaspalermo (veja o histórico de edições)
Link para o post
Compartilhar em outros sites

Participe da conversa

Você pode postar agora e se cadastrar mais tarde. Se você tem uma conta, faça o login para postar com sua conta.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emojis são permitidos.

×   Seu link foi automaticamente incorporado.   Mostrar como link

×   Seu conteúdo anterior foi restaurado.   Limpar o editor

×   Não é possível colar imagens diretamente. Carregar ou inserir imagens do URL.

  • Quem Está Navegando   0 membros estão online

    Nenhum usuário registrado visualizando esta página.

×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo