[Resolvido] Mestre de ginasio que da Storage (NPC)

felipenchagas
em Resolvidos

felipenchagas

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 17/03/14Posts: 9

Oi boa noite!

 

Eu gostaria se possível de uma ajuda, para um OT de pokemon... Tentei, tentei e nao consegui fazer.

 

Um NPC com o mesmo sistema dos mestres de ginásio porem que ao invés de dar insignia dar storage, Ex: storage == 9991. Eu gostaria que soh depois que o player derrote o NPC X possa passar por um tile. O qual tem o seguinte script que a principio está funcionando como deveria.

 

 

 

<movevent type="StepIn" actionid="9991" event="script" value="script/npcx.lua"/>

 

function onStepIn(cid, item, position, fromPosition)

if getPlayerStorageValue(cid, 9991) <= 0 then
doTeleportThing(cid, fromPosition, true)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, 'Voce ainda nao derrotou o NPC X')
doSendMagicEffect(getThingPos(cid), CONST_ME_MAGIC_BLUE)
return TRUE
end
return TRUE
end

GYM: BROCK.LUA (NPC)

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 pokemons = {
{name = "Geodude", optionalLevel = 50, sex = SEX_MALE, nick = "", ball = "normal"},
{name = "Rhyhorn", optionalLevel = 80, sex = SEX_MALE, nick = "", ball = "normal"}, --alterado v1.3
{name = "Graveler", optionalLevel = 80, sex = SEX_MALE, nick = "", ball = "normal"},
{name = "Onix", optionalLevel = 100, sex = SEX_MALE, nick = "", ball = "normal"},
{name = "Golem", optionalLevel = 100, sex = SEX_MALE, nick = "", 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)
    addEvent(adjustWildPoke, 15, summon, it.optionalLevel)
    local name = it.nick ~= "" and it.nick or getCreatureName(this).."s "..it.name --alterado v1.3
    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 a = gymbadges[getCreatureName(this)] + 8
    doCreatureSay(npc, "Por vencer esse duelo pegue a "..getItemNameById(a - 8)..".", 1)
    local b = getPlayerItemById(cid, true, a)
    if b.uid > 0 then doTransformItem(b.uid, b.itemid - 8) end
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
        focus = cid
        talk_start = os.clock()
        conv = 1
        selfSay("Oi sou Brock e sou lider do ginásio Pewter's. Minha especialidade? Pokemons do tipo pedra, os mais poderosos de todos os tipos.")
    return true
    end

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

        --if getPlayerItemCount(cid, gymbadges[getCreatureName(getThis())]) >= 1 then
        --    selfSay("You have already won my Boulder Badge, maybe some other day we can fight.")
        --    focus = 0
        --return true
        --end

        if not hasPokemon(cid) then
            selfSay("Você viu a enfermeira joy por ai? Elá é uma gata.")
        return true
        end

        selfSay("Na nossa batalha serão permitidos até "..#pokemons.." pokemons, está pronto??")
        conv = 2

    return true
    end

    if isConfirmMsg(msg) and conv == 2 and focus == cid then

        challenger = focus
        setPlayerStorageValue(cid, 990, 1)
        selfSay("Sim vamos lutar!")
        talk_start = os.clock()
        addEvent(doSummonGymPokemon, 850, getThis())
        conv = 3

    return true
    end

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

        focus = 0
        selfSay("Recusou? hmm... acho que a policia Jenny está afim de mim.")

    return true
    end

    if msgcontains(msg, 'bye') and focus == cid then
        selfSay('Vá e dê seu melhor!')
        setPlayerStorageValue(focus, 990, -1)
        focus = 0
    return true
    end
end

local afk_warning = false
local change = false

function onThink()

    if focus == 0 then
        selfTurn(2)
        fighting = false
        challenger = 0
        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

    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])
                 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("Está demorando muito... tenho um encontro com a Enfermeira Joy hoje!")
        return true
        end

        if not afk_warning and afk_time > afk_limit_time / 2 then
            selfSay("Sem pokemons?!")
            afk_warning = true
        end


        if #getCreatureSummons(getThis()) == 0 then
            if battle_turn > #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 >= 7 or challenger_turn > #pokemons then
            selfSay("Você perdeu, acho que vou até o centro pokemon com você a enfermeira Joy está por lá.")
            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("Até mais.")
        return true
        end

        if (os.clock() - talk_start) > 30 then
            selfSay("Treine mais e lembre-se, os Pokemons de pedra são os melhores!")
            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


GYM.LUA (LIB)

gymbadges = {
["Brock"] = 12252,
["Misty"] = 12253,
["Surge"] = 12254,
["Erika"] = 12255,
["Sabrina"] = 12256,
["Koga"] = 12257,
["Blaine"] = 12258,
["Kira"] = 12259,
["Zeper"] = setPlayerStorageValue(cid,9991,1)} --alterado v1.5

assinatura.jpg

www.pokemonline.com.br

facebook.com.br/pokemonlinebr

[twitter]pokemonline1[/twitter]

zipter98

avatar
Herói
Herói

INFOS

Grupo: HeróiRegistrado: 20/09/12Posts: 2553Gênero: Masculino

Área incorreta, movido para derivados. Mais cuidado da próxima vez.

@pedido

Pelo pouco que vi, você pode alterar:

 

local b = getPlayerItemById(cid, true, a)
    if b.uid > 0 then doTransformItem(b.uid, b.itemid - 8) end

Por:

setPlayerStorageValue(cid, key, value)
E sério, tira isso da tabela:
["Zeper"] = setPlayerStorageValue(cid,9991,1)} --alterado v1.5

Não respondo PMs solicitando suporte. Já existem seções no fórum para isto.

felipenchagas

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 17/03/14Posts: 9

Ahhh tem como dar 10 de reputação!!

 

Muito obrigado, deixei assim e funcionou perfeito.

 

local function doWinDuel(cid, npc)
if not isCreature(cid) then return true end
local this = npc


doCreatureSay(npc, "Venceu o duelo, avance para a proxima sala... ")
setPlayerStorageValue(cid, 9991, 1)


end

Espero não estar passando dos limites mas.

Aproveitando tem um outro npc que também de duel, ele te da a opção de escolher contra quantos pokes você quer lutar, porem apenas funciona caso escolha a opção 1, se escolher lutar contra 2 ou mais pokemons no final do duelo ao vencer da o seguinte erro:

 

[26/03/2014 16:26:07] [Error - Npc interface] 
[26/03/2014 16:26:07] In a timer event called from: 
[26/03/2014 16:26:07] data/npc/scripts/duel1.lua:onThink
[26/03/2014 16:26:07] Description: 
[26/03/2014 16:26:07] data/npc/scripts/duel1.lua:62: attempt to get length of local 'x' (a nil value)
[26/03/2014 16:26:07] stack traceback:
[26/03/2014 16:26:07]  data/npc/scripts/duel1.lua:62: in function <data/npc/scripts/duel1.lua:58>

O script eh esse:

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 = 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] = {{setPlayerStorageValue(cid, 9991, 1)},
[2] = {{itemid = 2393, count = 40}, {itemid = 2392, count = 30}},
[3] = {{itemid = 2393, count = 50}, {itemid = 2392, count = 40}},
[4] = {{itemid = 2393, count = 60}, {itemid = 2392, count = 50}},
[5] = {{itemid = 2393, count = 70}, {itemid = 2392, count = 60}},
[6] = {{itemid = 2393, count = 80}, {itemid = 2392, count = 70}}}

local pokemons = {
{name = "Cloyster", optionalLevel = 50, sex = SEX_MALE, nick = "Crusher", ball = "super"},
{name = "Lapras", optionalLevel = 50, sex = SEX_FEMALE, nick = "Laura", ball = "normal"},
{name = "Electabuzz", optionalLevel = 50, sex = SEX_MALE, nick = "Eletron", ball = "great"},
{name = "Pinsir", optionalLevel = 50, sex = SEX_MALE, nick = "Headcutter", ball = "normal"},
{name = "Dragonair", optionalLevel = 50, sex = SEX_FEMALE, nick = "Dragonix", 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)..", are you up to a duel? I can give prizes if you win!")
			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

 

assinatura.jpg

www.pokemonline.com.br

facebook.com.br/pokemonlinebr

[twitter]pokemonline1[/twitter]

zipter98

avatar
Herói
Herói

INFOS

Grupo: HeróiRegistrado: 20/09/12Posts: 2553Gênero: Masculino

Você quer que o prêmio de todas as opções seja alteração do value de determinada key do jogador?

Não respondo PMs solicitando suporte. Já existem seções no fórum para isto.

felipenchagas

avatar
Campones
Campones

INFOS

Grupo: CamponesRegistrado: 17/03/14Posts: 9

Você quer que o prêmio de todas as opções seja alteração do value de determinada key do jogador?

 

 

 

Sim isso mesmo!!!

 

selfSay("Tell me the number of pokemons that will battle.")

 

eu escolho 1 o premio vem tudo certo.

 

mas quando eu escolho para batalhar com 2 ou mais da o erro acima.

assinatura.jpg

www.pokemonline.com.br

facebook.com.br/pokemonlinebr

[twitter]pokemonline1[/twitter]

Frenvius

~ Fairy Tail Online ~
avatar
Administrador
Administrador

INFOS

Grupo: AdministradorRegistrado: 26/02/07Posts: 254Gênero: MasculinoChar no Tibia: Frenvius
A questão neste tópico de suporte foi respondida e/ou o autor do tópico resolveu o problema. Este tópico está fechado e foi movido para Suporte - Resolvidos. Se você tiver outras dúvidas, crie um novo tópico.

Utilize botão @UP, no topo de seu tópico, para atualizar o destaque em "Tópicos Recentes" na página inicial do fórum, fará com que mais pessoas o vejam.

 

aJEhRjZ.png


Te ajudei? +REP (: