• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Lua NPC Duel System (POKEMON TIBIA)

jededias

Member
Joined
Jan 21, 2019
Messages
66
Solutions
1
Reaction score
12
My NPC System don't work fine.
Bugs:
If I talk with NPC and say hi/duel he say: "You need a pokemon to do this" but if I remove this function in script, the NPC summon the First Pokemon, but The Pokemon don't attack my pokemon. He is "Passive". And when Dead, I can catch the Pokemon, I need remove this. And the NPC don't summon another pokemon...

I am using Huatson Datapack (DXP) My pokemons have levels.

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 = 15 -- seconds, not ms (so 30 * 60 means 30 minutes)

local can_walk = false -- 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 = 2152, count = 40}, {itemid = 2392, count = 20}},
[2] = {{itemid = 2152, count = 50}, {itemid = 2392, count = 30}},
[3] = {{itemid = 2152, count = 60}, {itemid = 2392, count = 40}},
[4] = {{itemid = 2152, count = 70}, {itemid = 2392, count = 50}},
[5] = {{itemid = 2152, count = 80}, {itemid = 2392, count = 60}},
[6] = {{itemid = 2160, count = 1}, {itemid = 2392, count = 70}}}

local pokemons = {
{name = "Nidoking", optionalLevel = 375, sex = SEX_MALE, nick = "", ball = "normal"},
{name = "Lapras", optionalLevel = 375, sex = SEX_FEMALE, nick = "", ball = "ultra"},
{name = "Electabuzz", optionalLevel = 375, sex = SEX_MALE, nick = "", ball = "ultra"},
{name = "Slowbro", optionalLevel = 375, sex = SEX_MALE, nick = "", ball = "super"},
{name = "Dragonair", optionalLevel = 375, sex = SEX_FEMALE, nick = "", ball = "ultra"},
{name = "Onix", optionalLevel = 375, sex = SEX_MALE, nick = "", 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
addEvent(adjustWildPoke, 15, summon, it.optionalLevel)
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, "Congratulations! You won, here is your prize.", 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("Hello "..getCreatureName(cid)..", do you want to duel me for prizes?")
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("We have just battled! Please wait for me to recover from out last battle!")
focus = 0
return true
end

if not hasPokemon(cid) then
selfSay("You need pokemons to battle!")
return true
end

selfSay("Ok, tell me how many pokemons will fight.")
conv = 2

return true
end

if conv == 2 and focus == cid then

if not tonumber(msg) then
selfSay("Tell me the number of pokemons that will battle.")
return true
elseif tonumber(msg) > #pokemons then
selfSay("I have only "..#pokemons..", so the maximum is "..#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("Ok, the first that defeats "..number_of_pokemons.." wins, let's start!")
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("It is better for you to refuse a battle against me!")

return true
end

if msgcontains(msg, 'bye') and focus == cid then
selfSay('Bye and do your best trainer!')
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 v1.6
selfAttackCreature(getCreatureSummons(challenger)[1])
change = true
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("I have waited too long, come back when you are ready!")
return true
end

if not afk_warning and afk_time > afk_limit_time / 2 then
selfSay("Where's your pokemon? Let's fight!")
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("You lost our duel! Maybe some other time you'll defeat me.")
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("Bye then.")
return true
end

if (os.clock() - talk_start) > 30 then
selfSay("Good bye and keep training!")
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
 
Back
Top