Ir para conteúdo

Featured Replies

Postado
  • Este é um post popular.

Olá meus caros do Tibia King, hoje vim trazer pra vocês um sistema que bolei pra um concurso em outro fórum mas acabei ficando descontente e nunca cheguei a disponibilizar.
Eu gostaria de agradecer inicialmente à três acontecimentos que sem eles não seriam possíveis a criação desse sistema.
- A otlist obrigar que os servidores utilizem anti idle 
- Os mages do meu servidor reclamarem que não dava pra treinar ml nos trainers
- Ao @Storm Night, que embora tenha me irritado muito nesse tópico aqui , botou a sementinha dessa idéia na minha cabeça. :hum:

 


 

  • Explicação

É a combinação de dois sistemas que eu ja havia feito, o primeiro escolhe entre todas as salas de treiner aquela que está vazia pra te alocar e o segundo te mantém alimentado e rodando pra simular o anti idle. (Nota: ele não impede o anti idle de fato, se vc quiser fazer isso vc vai precisar editar o script de anti idle que vc utiliza pra ignorar players com determinado storage e adicionar o storage no player quando ele entrar na sala e tirar ao sair.. mas não sei até que ponto isso pode provocar ban da OTservlist por isso decidi não ensinar isso aqui.)


Sem mais delongas, talk is cheap, show me the code. 
 

  • Idéia

Basicamente dá pra reduzir toda a idéia do código nessa foto aqui:
 

Spoiler

94rO57T.png


Você tem diversas salas com trainers nesse formato (pode ser em linha reta horizontal ou vertical tb, mas assim fica melhor distribuído). Você inclusive pode criar salas no meio do void  de forma que a distancia de uma vc nao consiga ver a outra e vai ser uma experiencia muito amigável para o player ver que está treinando sozinho na paz. Ao entrar no tp ele te aloca na primeira sala vazia, se não houverem salas vazias ele retorna que não tem posições livres

 

  • Instalação

Você precisa criar as salinhas dos trainers equidistantemente, ou seja, tendo a mesma distância A em X e mesma distância B em Y. Sério, se vc errar nessa parte é porque vc não sabe oque significa equidistante. Vai pesquisar preguiçoso!! Já aviso que não vou dar suporte quanto à isso.

Você vai precisar criar salas parecidas com isso daqui:
 

Spoiler

Tiu1SWK.png


Perceba que não tem como ter acesso a essa sala, não tem como ser puxado pra fora do trainer, não tem dor de cabeça nenhuma e quando o player quiser sair ele só entra no tp e volta pro templo ou pra onde vc definir.

Nesse teleport da sala vc adiciona o actionid 14877 e não bota nenhuma posição nele.
Naquele tile que o player irá ficar que inclusive tem id diferente vc bota actionid 14878.

Agora seleciona a area dessa sala no rme e vai copiando e colando percebendo sempre se vc tá criando as salas com mesma distância em X. Se o ponto inicial de uma sala é 140 e vc quer que todas tenham 12 sqm de distancia vc cria em 152, 164, 178.. por aí vai. 

Quando terminar as salas que quiser e tiver montado as linhas e colunas da forma que desejou, vc vai criar um tp principal pra alocar os players nessa sala:
dPSjOns.png

Lembrando que ele não deve ter posição no rme, vc só bota o actionID 14876 e deixa a toPos dele 0, 0, 0. Ele não tem q te teleportar pra nenhum lugar pois a posição será decidida por script.

Se você fez tudo certo até agora vc deve ter algo +- assim:
 

Spoiler

yWxGakX.png



O importante é manter a distancia certinha entre cada sala. Aí no caso eu fiz rX = 11 e rY = 8 (é a terceira ou quarta vez q eu to falando isso, se vcs errarem pqp eu vou ficar muito irritado);

Vc não bota os trainers, e ali embaixo do spawn vc tem que botar um outro obstáculo pra impedir que o player ande pra baixo e dê a sala como livre.



Feito isso só adicionar os scripts abaixo:
movements.xml

    <movevent type="StepIn" actionid="14876" event="script" value="trainertp.lua"/>
    <movevent type="StepIn" actionid="14877" event="script" value="trainertp2.lua"/>
    <movevent type="StepIn" actionid="14878" event="script" value="foodtrainer.lua"/>


movements/scripts/trainertp.lua:

Spoiler

local position = {x = 156, y = 45, z = 6} -- posicao da primeira pos (linha 1 coluna 1)

local config = {
	distX= 12, -- distancia em X entre cada sala (de uma mesma linha)
	distY= 9, -- distancia em Y entre cada sala (de uma mesma coluna)
	rX= 2, -- numero de colunas
	rY= 2 -- numero de linhas
}

local storage = 18481 -- storage que salva a ultima vez que o player entrou (pra evitar spams)

local function isWalkable(pos, creature, proj, pz)-- by Nord -- só adicione se vc já não tiver ela
    if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
    if getTopCreature(pos).uid > 0 and creature then return false end
    if getTileInfo(pos).protection and pz then return false, true end
    local n = not proj and 3 or 2
    for i = 0, 255 do
        pos.stackpos = i
        local tile = getTileThingByPos(pos)
        if tile.itemid ~= 0 and not isCreature(tile.uid) then
            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
                return false
            end
        end
    end
    return true
end  

local function check_disponivel(npos)
	if isWalkable(npos, true, true) then
		return true
	end
return false
end

local function countdown(pos, Arraypos)
	if not check_disponivel(pos) then
		for lugares = 1, #Arraypos do				
			creature = getTopCreature(Arraypos[lugares]).uid	
			if not isCreature(creature)then 					
				doCreateMonster("Trainer", Arraypos[lugares])
				doSendAnimatedText(Arraypos[lugares], "GO!!", TEXTCOLOR_ORANGE)
				doSendMagicEffect(Arraypos[lugares], 10)
			end
		end
	end
end

local function fazQualquerCoisa(cid, pos, i, j) -- isso é o coração do nosso script, nao mexa nisso
	j = j or 0
	p = i or 0
	if p >= config.rX then
		p = 0
		j = j < config.rY -1 and j + 1 or false
	end
	if j then
		posi = {x = pos.x + ( p * config.distX), y = pos.y + (j * config.distY), z = pos.z}
		if check_disponivel(posi) then
			doTeleportThing(cid, posi)
			doSendMagicEffect(posi, 10)
			countdown(posi, {{x = posi.x - 1, y = posi.y + 1, z = posi.z}, {x = posi.x + 1 , y = posi.y + 1, z = posi.z}})
		else
			fazQualquerCoisa(cid, pos, p + 1, j)
		end
	else
		doPlayerSendCancel(cid, "Couldn't find any position for you right now.")
	end
end

function onStepIn(cid, item, pos, lastPos, fromPos, toPos, actor)
	if getPlayerStorageValue(cid, storage) - os.time() <= 0 then
		fazQualquerCoisa(cid, position)
	else
		doTeleportThing(cid, fromPos)
		doPlayerSendCancel(cid, "You gotta wait a few seconds before you can enter trainning room again")
	end
return true
end 

 


movements/scripts/trainertp2.lua:
 

Spoiler

local npos = {x = 161, y = 50, z = 6} -- posição que ele vai ao sair da sala
local storage = 18481 -- storage que salva a ultima vez que o player entrou (pra evitar spams)

function onStepIn(cid, item, pos, lastPos, fromPos, toPos, actor)
	ArrayPos = {{x = fromPos.x - 1, y = fromPos.y + 1, z = fromPos.z}, {x = fromPos.x + 1 , y = fromPos.y + 1, z = fromPos.z}}
	for _, pos in ipairs(ArrayPos) do
		creature = getTopCreature(pos).uid	
		if isMonster(creature)then
			doSendMagicEffect(getThingPos(creature), 14)
			doRemoveCreature(creature)
		end	
	end
	doTeleportThing(cid, npos)
	doPlayerSetStorageValue(cid, storage, os.time() + 5)
return true
end 

 



movements/scripts/foodtrainer.lua:
 

Spoiler

local config = {
eff = 12, -- efeito que sai
food = 100, -- quanto de food vai dar (use 100 no maximo)
timespin = 10 -- tempo pra dar uma volta (quanto menor mais checagens a função vai fazer e mais pesado vai ficar o sistema)
}

function helpTrainer(uid, pos)
	if not isPlayer(uid) then return false end
	look = getCreatureLookDirection(uid)
	look = look < 3 and look + 1 or 0
	doCreatureSetLookDirection(uid, look)
	doSendMagicEffect(pos, config.eff)
	
	if getPlayerFood(uid) < config.food then
		doPlayerFeed(uid, config.food)
		doCreatureSay(uid, "+ Food", TALKTYPE_MONSTER)
	end
	
	addEvent(function()
		if isPlayer(uid) and getCreaturePosition(uid).x == pos.x and getCreaturePosition(uid).y == pos.y and getCreaturePosition(uid).z == pos.z then
			helpTrainer(uid, pos)
		end
	end, config.timespin * 1000)
return true
end	

function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor)
	helpTrainer(cid, position)
return true
end

 


FIM, qualquer dúvida ou comentário ou sugestão coloquem abaixo. Se gostou REP+, se não gostou REP+ pq deu trabalho e vai ser útil pra alguém, mesmo que de estudo. :accept:
Abraços do Lobo. 8-|

E ao cara do outro fórum que ficou falando que ia dar erro e quis ficar me corrigindo e mandando scripts sem noção pra "mostrar" que sabia de lua: :laugh:

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

  • Respostas 65
  • Visualizações 11.6k
  • Created
  • Última resposta

Top Posters In This Topic

Most Popular Posts

  • isso que vc quer é exatamente o que é o sistema. Se você separar bem as salas os players sempre vão achar que estão na mesma sala isolados dos outros. A diferença é que nesse aqui vc ainda precisa faz

  • 1- Não, a menos que vc edite a função isWalkable 2- a distancia é a partir da posição que o player irá ficar até a outra posição que o player irá ficar. Pensa assim: se não houvessem obstáculos, qn

  • local position = {x = 156, y = 45, z = 6} -- posicao da primeira pos (linha 1 coluna 1) local config = { distX= 12, -- distancia em X entre cada sala (de uma mesma linha) distY= 9, -- distancia em

Posted Images

Postado

já vi algo parecido mas não era bem um script, e sim tudo feito a mao ai a pessoa só ia dandando > ate achar algum que não tinha gente, era meio cansativo mas foi uma boa ideia...

sobre o script, to meio ocupado ultimamente mas achei bem interessante e pretendo testar/usar, obrigado por contribuir.

Otimo trabalho :D

Scriptszinhos:

 

Não abandone seu tópico, quando você tiver a dúvida resolvida sozinho tente ensinar aos outros como resolve-la (você pode não ser o único com o problema) e quando ela for resolvida por outra pessoa não se esqueça de marcar como melhor resposta e deixar o gostei.

Postado

Aee como sempre xWhiteWolf mandando vê nos script, estava esperando mesmo você postar ele HAHA. Muito obrigado concerteza vai ajudar muitas pessoas com este belo script REP +

════ҳ̸Ҳ̸ҳஜ۩۞۩ஜҳ̸Ҳ̸ҳ═══╗

Te Ajudei? Rep + e ficamos Quits

166420979_logoyanliimaornight.png.33f822b8970081a5b3646e85dbfd5934.png

Precisando de ajuda?

discord.png.1ecd188791d0141f74d99db371a2e0a4.png.890d5a38d7bcde75543c72b624a65de1.pngDiscord: Yan Liima #3702

Programador Júnior de LUA, PHP e JavaScript

Juntos somos lendas, separados somos Mitos!

╚══════════════════════════ҳ̸Ҳ̸ҳஜ۩۞۩ஜҳ̸Ҳ̸ҳ═════════════════════════════╝

Postado
  • Autor

eu tinha feito ele com algumas features a mais, antes qnd vc entrava no tp ele fazia um countdown pra te teleportar até a sala e ao entrar ele fazia um countdown de 3 segundos pra criar os npcs, ficou bem bonito esteticamente mas depois de alguns usos o player ficava de saco cheio de ter que esperar. Aí fiz assim, acabou que ficou bem legal e decidi compartilhar ^^ 

Fico feliz que vcs tenham curtido

Todos os meus trabalhos importantes estão na seção "Sobre mim" no meu perfil; Dá uma passada lá!

"Há três caminhos para o fracasso: não ensinar o que se sabe, não praticar o que se ensina, e não perguntar o que se ignora." - São Beda

I7Pm6ih.png

(obg ao @Beeny por fazer essa linda sign <3)

Postado

Iae Wolf u.u então o scrip ficou sensacional, é obvio q eu pretendo utilizá-lo (mesmo tendo uma gambiarra no meu ot q adiciona e tira o trainer quando entra e sai da sala).. Vc fez minha gambiarra parecer um brinquedo infantil '-'
Enfim, logo menos eu volto pra dar umas ideias loucas pra esse script ai t.t

 

 

                                                                                                230x230.jpg

 

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

Quem Está Navegando 0

  • Nenhum usuário registrado visualizando esta página.

Estatísticas dos Fóruns

  • Tópicos 96.9k
  • Posts 519.7k

Informação Importante

Confirmação de Termo