Ir para conteúdo
  • Cadastre-se

Posts Recomendados

  • Respostas 50
  • Created
  • Última resposta

Top Posters In This Topic

Top Posters In This Topic

Popular Posts

Olá amigos, membros, visitantes, papagaios, enfim... Depois de muito me pedirem o evento SNOWBAL WAR EVENT, trago ele 100% pra vocês. Como funciona? Os jogadores irão se divertir em uma emociona

Testa esse aqui. O meu estava dando o mesmo erro, fui la e configurei uma linha, mais nao me recordo qual! kkkkk, ja faz um tempinho que modifiquei. Testa esse e me fala se funcionou.    

Qual versão do TFS? Se for 0.4 abre o arquivo e mude onTimer para onTime

Posted Images

Parabéns, seu tópico de conteúdo foi aprovado!
Muito obrigado pela sua contribuição, nós do Tibia King agradecemos.
Seu conteúdo com certeza ajudará à muitos outros, você recebeu +1 REP.

Spoiler

Congratulations, your content has been approved!
Thank you for your contribution, we of Tibia King we are grateful.
Your content will help many other users, you received +1 REP.

 

Link para o post
Compartilhar em outros sites

Perfeito o Evento. Rep++

 

Erro que pode confundir algumas pessoas sem experiência, 

Em data/talkactions abra o seu talkactions.xml e insira a seguinte linha:

Em data/actions/scripts crie um arquivo com o nome de snowballtalk.lua e insira o seguinte conteúdo:

 

Deveria se na mesma pasta certo ? Hehe! 

 

xD

 

                                                              ezgif-1-98aab239f3.gif.1a897c9c3225228909e7b356a5cfb8e4.gif

Link para o post
Compartilhar em outros sites
1 hora atrás, KotZletY disse:

Perfeito o Evento. Rep++

 

Erro que pode confundir algumas pessoas sem experiência, 

Em data/talkactions abra o seu talkactions.xml e insira a seguinte linha:

Em data/actions/scripts crie um arquivo com o nome de snowballtalk.lua e insira o seguinte conteúdo:

 

Deveria se na mesma pasta certo ? Hehe! 

 

xD

 

 

Bem notado, foi uma falta de atenção minha, obrigado, corrigido.

 

1 hora atrás, Matk disse:

@Absolute este evento é para TFS 0.4 ou 1.x?

Está pra 0_4 as funções, caso queira adapto pra 1.0 tb.

YDmXTU2.png

 

Entenda tudo sobre VPS, DEDICADOS & HOSPEDAGENS. => Clique aqui

Global Full Download 10.9x - TFS 1.2/FERUMBRAS/KRAILOS. => Clique aqui

 

Muitos querem aquilo que você tem, 
mas vão desistir quando souberem o preço que você pagou.

 

skype-favicon.png lu.lukinha

message-16.png [email protected]

Link para o post
Compartilhar em outros sites

é obrigatorio fazer a parte do phpmyadmin pra funcionar o evento ? é que uso um servidor sem site e queria colocar ese evento no meu server

Editado por bismarkzika
Pq quero (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
5 horas atrás, bismarkzika disse:

é obrigatorio fazer a parte do phpmyadmin pra funcionar o evento ? é que uso um servidor sem site e queria colocar ese evento no meu server

 Sim

Link para o post
Compartilhar em outros sites

usando mesmo mapa, nem mudei as posições so coloquei o mapa nas mesmas coordenadas o.O:hum:

aaaaaaaaaaaa.png

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.

Link para o post
Compartilhar em outros sites
Em 18/11/2016 ás 16:00, pablobion disse:

usando mesmo mapa, nem mudei as posições so coloquei o mapa nas mesmas coordenadas o.O:hum:

aaaaaaaaaaaa.png

Estou com o mesmo problema... Alguém ajuda ?

 

Link para o post
Compartilhar em outros sites
Em 20/11/2016 ás 19:56, Reconnect disse:

Estou com o mesmo problema... Alguém ajuda ?

 


nem sei a solução :/

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.

Link para o post
Compartilhar em outros sites

Tem um erro aqui:

posti = Position(math.random(t_l.x,b_r.x), math.random(t_l.y, b_r.y), 7)

Não entendi também, ele chamou "Position" como se fosse uma função, mas enfim, essa variável tem que estar no método de coordenadas do TFS (x,y,z) pois ele irá fazer uma verificação do "isInWallArray" depois, e eu acredito que tem ser em "{x,y,z}", portanto fiz essa alteração:

posti = {math.random(t_l.x,b_r.x), math.random(t_l.y, b_r.y), t_l.z}

Atenção para mudar a coordenada Z porque no script está padrão 7 e isso não está correto.

Link para o post
Compartilhar em outros sites
Em 29/11/2016 ás 03:50, Chiitus disse:

Tem um erro aqui:


posti = Position(math.random(t_l.x,b_r.x), math.random(t_l.y, b_r.y), 7)

Não entendi também, ele chamou "Position" como se fosse uma função, mas enfim, essa variável tem que estar no método de coordenadas do TFS (x,y,z) pois ele irá fazer uma verificação do "isInWallArray" depois, e eu acredito que tem ser em "{x,y,z}", portanto fiz essa alteração:


posti = {math.random(t_l.x,b_r.x), math.random(t_l.y, b_r.y), t_l.z}

Atenção para mudar a coordenada Z porque no script está padrão 7 e isso não está correto.

Eu entendi o motivo dos erros, o position parece ser uma função de outro TSF... Essa alteração que vc fez deu certo ? Irei testar, heuehueheuhueu

Link para o post
Compartilhar em outros sites
  • 2 weeks later...
Em 01/12/2016 ás 07:43, Reconnect disse:

Eu entendi o motivo dos erros, o position parece ser uma função de outro TSF... Essa alteração que vc fez deu certo ? Irei testar, heuehueheuhueu

funcionou?

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.

Link para o post
Compartilhar em outros sites
  • 4 weeks later...
Em 14/11/2016 ás 20:15, Absolute disse:

Ap2pbop.png

Olá amigos, membros, visitantes, papagaios, enfim...

Depois de muito me pedirem o evento SNOWBAL WAR EVENT, trago ele 100% pra vocês.

Como funciona?
Os jogadores irão se divertir em uma emocionante partida de guerra de bolas de neve. O objetivo principal do evento é derrubar o número máximo de jogadores durante uma partida - atirando bolas de neve contra seus inimigos. O jogador que mais pontos fizer até o termino do evento será o vencedor (recompensa pode ser configurada).

Sem delongas, vamos ao que interessa...

 

 


 

 


Em data/actions abra o seu actions.xml e insira a seguinte linha:

 

 


<action actionid="7900" event="script" value="snowballaction.lua" />



Em data/actions/scripts crie um arquivo com o nome de snowballaction.lua e insira o seguinte conteúdo:


function onUse(cid, item, frompos, item2, topos)
if item.actionid == 7900 then
	if(SBW_AMMOINFI) then
		doPlayerSendTextMessage(cid, 27, "as bolas de neve sao infinitas, nao ha necessidade que voce compre-as.")
	else
		if (getPlayerStorageValue(cid, SBW_SCORE) > 0) and (getPlayerStorageValue(cid, SBW_AMMO) < 30) then
			doPlayerSetStorageValue(cid, SBW_SCORE, getPlayerStorageValue(cid, SBW_SCORE)-1)
			doPlayerSetStorageValue(cid, SBW_AMMO, getPlayerStorageValue(cid, SBW_AMMO)+SBW_AMMOBUY)
			doPlayerSendTextMessage(cid, 27, "Voce trocou " .. SBW_AMMOBUY .. "x bolas de neve por 1 ponto de placar.")
			doSendMagicEffect(getCreaturePosition(cid),4)
		else
			doPlayerSendTextMessage(cid, 27, "Voce nao possui pontos de jogo o suficiente ou ja esta carregando muitas bolas de neve.")                      
		end
	end
end
end

 


 


 

 


Em data/talkactions abra o seu talkactions.xml e insira a seguinte linha:

 


<talkaction words="!snowball" event="script" value="snowballtalk.lua"/>



Em data/talkactions/scripts crie um arquivo com o nome de snowballtalk.lua e insira o seguinte conteúdo:


function onSay(cid, words, param, channel)
local k = string.explode(param, ",")
if(k[1] ~= nil) then
		if(string.upper(k[1]) == 'INFO') then
			local score = {}
			local output =  "Voce tem " .. getPlayerStorageValue(cid, SBW_SCORE) .. " pontos.\nVoce tem "..getPlayerStorageValue(cid, SBW_AMMO).."x municoes.\n------------------\nO maior matador:\n"
			for _, pid in ipairs(getPlayersOnline()) do
				if getPlayerStorageValue(pid, SBW_INEVENT) then
					table.insert(score, {getCreatureName(pid), getPlayerStorageValue(pid, SBW_SCORE)})
				end
			end
			local lx = table.getn(score)
			if(lx > 3) then lx = 3 end
				table.sort(score, function(a, b) return a[2] > b[2] end)
				for k = 1,lx do
					output = output .. k..". "..score[k][1] .." [".. score[k][2] .."].\n"
				end
				doPlayerPopupFYI(cid, output)
			end
if (string.upper(k[1]) == 'ATIRAR') then
	if(getPlayerStorageValue(cid, SBW_INEVENT) == 1) and not getTileInfo(getThingPos(cid)).protection then
		if getPlayerStorageValue(cid, SBW_EXAUSTHED) <= 1 then
			if(getPlayerStorageValue(cid, SBW_AMMO) > 0) then
				if SBW_STATUS == 'on' then
					if(SBW_AMMOINFI == false) then
						doPlayerSetStorageValue(cid, SBW_AMMO, getPlayerStorageValue(cid, SBW_AMMO)-1)
					end
					doPlayerSetStorageValue(cid, SBW_EXAUSTHED, 2)
					lineAnimation(getPlayerLookDirection(cid),getCreaturePosition(cid),12,cid,1,0,1,0,0,0,1,0)
					addEvent(doPlayerSetStorageValue, SBW_SHOOTEXAUSTHED, cid, SBW_EXAUSTHED, 1)
					if (getPlayerStorageValue(cid, SBW_AMMO) ~= 1) then
						doPlayerSendTextMessage(cid, 27, "Restam "..getPlayerStorageValue(cid, SBW_AMMO).."x bolas de neve.")
					else
						doPlayerSendTextMessage(cid, 27, "Usando sua ultima bola de neve, recarregue.")
					end
				end
			else
				doPlayerSendCancel(cid, "Voce esta sem bolas de neve, recarregue no centro do campo ou mate um inimigo.")
				doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)     
			end
		else
			doPlayerPopupFYI(cid, "Acalme-se voce deve esperar para atirar novamente.") 
			doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
			return false
		end
	else
		doPlayerPopupFYI(cid, "Voce precisa estar dentro evento ou fora da pz.") 
		doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
	end
end
end
return true
end
 
 
                function lineAnimation(lookDir,playerPos,effect,cid,fvar,fpos,ffound,fposV,fcheck,fvcid,floopCounter,fvpid, name)
                local var = fvar
                local pos = fpos
                local found = ffound
                local posV = fposV
                local check = fcheck
                local vcid = fvcid
                local loopCounter = floopCounter
                local vpid = fvpid
                local storage = SBW_EXAUSTHED
                        if var < 2 then
                                vcid = cid
                        end
                        pos = playerPos
                        if not isInWallArray(convert(lookDir,pos)) then--isInWallArray({x=convert(lookDir,pos).x, y=convert(lookDir,pos).y,z=convert(lookDir,pos).z}) then --isInArray(t.onShoot.misc.walls_id, getThingfromPos({x=convert(lookDir,pos).x, y=convert(lookDir,pos).y,z=convert(lookDir,pos).z, stackpos=0}).itemid) then
                                doSendDistanceShoot(pos, convert(lookDir,pos),effect)
                                pos = convert(lookDir,pos)
                                var=var+1
                                posV = convertV(lookDir,playerPos)
                                for _, pid in ipairs(getPlayersOnline()) do
                                        if (getCreaturePosition(pid).x == pos.x and getCreaturePosition(pid).y == pos.y and getCreaturePosition(pid).z == pos.z) then
                                                --if loopCounter > 2 then
                                                vpid = pid
                                                --end
                                                if (vpid ~= vcid) then
                                                        if var > 2 then
                                                                if (getCreaturePosition(pid).x == posV.x and getCreaturePosition(pid).y == posV.y and getCreaturePosition(pid).z == posV.z) then
                                                                        killPlayer(pid,pos,getCreatureName(vcid))
                                                                        if (lookDir == 0) or (lookDir == 2) then
                                                                                var = 6
                                                                        else
                                                                                var = 8
                                                                        end
                                                                end
                                                        end
                                                        killPlayer(pid,pos,vcid)
                                                        if (lookDir == 0) or (lookDir == 2) then
                                                                var = 6
                                                        else
                                                                var = 8
                                                        end
                                                end
                                        end
                                        loopCounter = loopCounter +1
                                end    
                                if (lookDir == 0) or (lookDir == 2) then
                                        if var ~= 6 then
                                                addEvent(lineAnimation, SBW_BALLSPEED, lookDir,pos,effect,nil,var,pos,found,posV,check,vcid,loopCounter,vpid)
                                        else
                                                var = 1
                                        end
                                else
                                        if var ~= 8 then
                                                addEvent(lineAnimation,  SBW_BALLSPEED, lookDir,pos,effect,nil,var,pos,found,posV,check,vcid,loopCounter,vpid)
                                        else
                                                var = 1
                                        end
                                end
                        else
                                doSendMagicEffect(convert(lookDir,pos),2)
                                var = 1
                        end
                end
 
                local ret = {}
                function convert(lookDir,pos)
                local positions = {
                        [0] = {x = pos.x, y = pos.y-1, z = pos.z},
                        [1] = {x = pos.x+1, y = pos.y, z = pos.z},
                        [2] = {x = pos.x, y = pos.y+1, z = pos.z},
                        [3] = {x = pos.x-1, y = pos.y, z = pos.z}
                        }
                        ret = positions[lookDir]
                return ret
                end
 
 
                local ret = {}
                function convertV(lookDir,pos)
                local positions = {
                        [0] = {x = pos.x, y = pos.y+1, z = pos.z},
                        [1] = {x = pos.x-1, y = pos.y, z = pos.z},
                        [2] = {x = pos.x, y = pos.y-1, z = pos.z},
                        [3] = {x = pos.x+1, y = pos.y, z = pos.z}
                        }
                        ret = positions[lookDir]
                return ret
                end
				
				function isInWallArray(pos)
                        for k = 0, table.getn(SBW_WALLSID) do
                                if getTileItemById(pos, SBW_WALLSID[k]).itemid == SBW_WALLSID[k] then --this doesn't even make sense but tried other ways and it gave errors, so meh 2lazy2search
									return true    
                                end
                        end
                        return false
                end
                               
                function killPlayer(cid, pos, killer)
                    local t_l = SBW_AREA[1]
					local b_r = SBW_AREA[2]
					local posti = {}
					local isPossibleToTeleportPlayer = false
					while (isPossibleToTeleportPlayer == FALSE) do
						posti = Position(math.random(t_l.x,b_r.x), math.random(t_l.y, b_r.y), 7)
						if isInWallArray(posti) == FALSE then
							isPossibleToTeleportPlayer = TRUE
						end
					end
					doTeleportThing(cid, posti)
					doSendMagicEffect(pos,2)
					doSendMagicEffect(posti,6)
					doSendAnimatedText(pos, ""..getCreatureName(killer).." ", 55)
					doPlayerSendTextMessage(cid, 27, "Voce morreu para "..getCreatureName(killer)..".")
					doPlayerSetStorageValue(killer, SBW_SCORE, getPlayerStorageValue(killer, SBW_SCORE)+SBW_POINTSKILL)				
					doPlayerSendTextMessage(killer, 27, "You've killed "..getCreatureName(cid)..".")
					if SBW_LOSTSCORE then
						doPlayerSetStorageValue(cid, SBW_SCORE, getPlayerStorageValue(cid, SBW_SCORE)-1)
					end
					if SBW_RESETAMMO then
						doPlayerSetStorageValue(cid, SBW_AMMO, SBW_MINAMMO)
					end
                end
                                               
                

 


 

 

 

 

Em data/globalevents abra o seu globalevents.xml e insira a seguinte linha:


<globalevent name="StartSBW" time="19:00" event="script" value="events/snowballglobalevent.lua"/>


Em data/globalevents/scripts crie um arquivo com o nome de snowballglobalevent.lua e insira o seguinte conteúdo:


function onTime()
				
function isInWallArray(pos)
    for k = 0, table.getn(SBW_WALLSID) do
        if (getTileItemById(pos, SBW_WALLSID[k]).itemid == SBW_WALLSID[k]) then
			return true    
        end	
    end
 return false
end

               
function endsnowball()
	local score = {}
	if not SBW_USEWAIT then
		doRemoveItem(getTileItemById(SBW_TP, 1387).uid)
	end
	for _, pid in ipairs(getPlayersOnline()) do
		if getPlayerStorageValue(pid, SBW_INEVENT) > 0 then
			table.insert(score, {getCreatureName(pid), getPlayerStorageValue(pid, SBW_SCORE)})
			doPlayerSetStorageValue(pid, SBW_INEVENT, 0)
			doPlayerSetStorageValue(pid, SBW_SCORE, 0)
			doPlayerSetStorageValue(pid, SBW_AMMO, 0)
			doTeleportThing(pid, SBW_TPEND)
		end
	end
	table.sort(score, function(a, b) return a[2] > b[2] end)
	--local random_item = SBW_REWARDS[math.random(1, #SBW_REWARDS)]
	local hora = os.date("%X")
	local data = os.date("%x")	
	if table.getn(score) > 0 then
		if SBW_ADDREWARD then
			for _, pid in ipairs(getPlayersOnline()) do
				if getCreatureName(pid) == score[1][1] then
					for op,ad in pairs(SBW_REWARDS) do
						doPlayerAddItem(pid, ad[1], ad[2])
					end
					break
                end
            end
        end
		db.query("INSERT INTO `snowballwar`  VALUES ('', ".. db.escapeString(score[1][1]) ..  ",".. score[1][2] ..", ".. db.escapeString(data) ..", ".. db.escapeString(hora) ..");")  
		db.query("UPDATE `players` SET `sbw_points`=`sbw_points`+".. score[1][2] .." WHERE `name` = " .. db.escapeString(score[1][1]) .. ";") 
        doBroadcastMessage("[SNOWBALL EVENT] encerrou-se, parabens ao jogador "..score[1][1].." que venceu o SnowBall Event com "..score[1][2].." pontos.")
    end
	return true
end

local t_l = SBW_AREA[1]
local b_r = SBW_AREA[2]

function moveToEvent()
for _, pid in ipairs(getPlayersOnline()) do
	if isInRange(getCreaturePosition(pid), SBW_WAITROOM[1], SBW_WAITROOM[2]) then
		local posti = {}
		local isPossibleToTeleportPlayer = false
		while (isPossibleToTeleportPlayer == FALSE) do
			posti = Position(math.random(t_l.x,b_r.x), math.random(t_l.y, b_r.y), 7)
			if (isInWallArray(posti) == FALSE) then
				isPossibleToTeleportPlayer = TRUE
			end
		end
		doTeleportThing(pid, posti)
		doPlayerSetStorageValue(pid, SBW_INEVENT, 1)
		doPlayerSetStorageValue(pid, SBW_AMMO, SBW_MINAMMO)
		doPlayerSetStorageValue(pid, SBW_SCORE, 0)
		doPlayerSendTextMessage(pid, 27, "[SNOWBALL WAR] Seja bem vindo, aqui estao os comandos que voce vai usar durante o evento\n!snowball atirar --Atirar uma bola de neve.\n!snowball info --Isso mostra seus pontos de jogos e a quantia de bolas de neve que voce tem. Tambem mostra o ranking de pontos do evento.\n Recarregue suas bolas de neve clicando em frente ao gerador no centro do campo.\nAltamente recomendado adicionar estes comandos a sua hotkeys.")               														
	end
end
doRemoveItem(getTileItemById(SBW_TP, 1387).uid)
addEvent(endsnowball, SBW_DURATION*1000*60)
doBroadcastMessage(SBW_MSGSTART)
end

local time = os.date("*t")
local timeopen1 = math.ceil(SBW_TIMEWAIT / 4)
local timeopen2 = math.ceil(SBW_TIMEWAIT / 2)
if (SBW_STARTAUTO) and (isInArray(SBW_DAYS,time.wday)) then
	doBroadcastMessage(SBW_MSGWARNING)
	if SBW_USEWAIT then
		addEvent(doBroadcastMessage, timeopen1*1000*60, "[SNOWBALL WAR] - Resta(m) ".. timeopen2 .." minuto(s) para iniciar o evento!")
		if (timeopen2 ~= timeopen1) then
			addEvent(doBroadcastMessage, timeopen2*1000*60, "[SNOWBALL WAR] - Resta(m) ".. timeopen1 .." minuto(s) para iniciar o evento!")
		end
        addEvent(moveToEvent, SBW_TIMEWAIT*1000*60)
        doCreateTeleport(1387, SBW_TPGO, SBW_TP)
    else
		if SBW_TFS == "0.3" then
			doItemSetAttribute(doCreateItem(1387, SBW_TP), "aid", 2880)
		else
			doSetItemActionId(doCreateItem(1387, SBW_TP), 2880)
        end
        if(SBW_DURATION > 0) then
            addEvent(endsnowball, SBW_DURATION*1000*60)
        end
    end
end
return true
end

 


 

 

 

 

Em data/movements abra o seu movements.xml e insira a seguinte linha:


<movevent type="StepIn" actionid ="2880" event="script" value="snowballmovement.lua"/>

 

Em data/movements/scripts crie um arquivo com o nome de snowballglobalmovement.lua e insira o seguinte conteúdo:


function onStepIn(cid, item, pos)
	doTeleportThing(cid, SBW_TPGO)
	doBroadcastMessage("[SNOWBALL WAR] O " ..getCreatureName(cid).. " player esta participando do evento snowball.", MESSAGE_STATUS_CONSOLE_ORANGE)					
	doPlayerSetStorageValue(cid, SBW_INEVENT, 1)
	doPlayerSetStorageValue(cid, SBW_AMMO, SBW_MINAMMO)
	doPlayerSetStorageValue(cid, SBW_SCORE, 0)           														
end

 


 

 

 

 

Já estamos quase terminando!
Agora em data/lib crie um arquivo com o nome de SBW.lua com o seguinte conteúdo:
 


-- This script is part of Snow Ball War Event Tibiaking Absolute
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program.  If not, see <http://www.gnu.org/licenses/>.

-- //

-- POSIÇÕES IMPORTANTES
SBW_AREA = {{x = 1214, y = 1205, z = 7}, {x = 1251, y = 1242, z = 7}}-- AREA DO EVENTO | Canto superior esquerdo / inferior direito
SBW_WAITROOM = {{x = 1229, y = 1220, z = 6}, {x = 1235, y = 1226, z = 6}} -- AREA DE ESPERA | Canto superior esquerdo / inferior direito
SBW_TP = {x = 165, y = 45, z = 7} -- local onde teleport sera criado (entrada de jogadores)
SBW_TPGO = {x = 1232, y = 1223, z = 6} -- local onde teleport vai levar (saida de jogadores)
SBW_TPEND = {x = 155, y = 54, z = 7} -- local onde serao teleport ao final do evento
SBW_GERADOR = {x = 1232, y = 1223, z = 7} -- local onde gerador vai ficar

-- CONFIGURAÇÕES DO EVENTO
SBW_DAYS = {1,2,3,4,5,6,7} -- dias de semana que vai abrir
SBW_DURATION = 10 -- duração do evento em minutos
SBW_POINTSKILL = 1 -- pontos de jogo por morte
SBW_AMMOBUY = 20 -- quantia de munições compradas por cada ponto
SBW_MINAMMO = 50 -- munição inicial dos jogadores
SBW_TIMEWAIT = 3 -- tempo na sala de espera em minutos
SBW_AMMOINFI = false
SBW_LOSTSCORE = true
SBW_RANDOMIZE = true
SBW_RESETAMMO = true
SBW_STARTAUTO = true
SBW_USEWAIT = true

--PREMIO DO EVENTO
SBW_ADDREWARD = true
SBW_REWARDS = {
				{6527,500},
				{2345,1}
			}


-- // Não mexa daqui para baixo
SBW_TFS = "0.4" 

-- STORAGES
SBW_EXAUSTHED = 2455 
SBW_INEVENT = 2460 
SBW_SCORE = 2465
SBW_AMMO = 2400


SBW_WALLSID = {5324,7003,7021,6712,7023,7002,6713,6714,6869,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6707,6708,6709,6710,6711,2698,2697,7020,6719,6720,6721,6722,6723,6724,6725,6726,6727,6761,6762,6768,6769,4608,4609,4610,4611,4612,4613,4614,4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4664,4665,4666,7008,7009,7010,7011,8239,7004,7005,7006,7007,6627,6628,6629,6630,6631,6632,6633,6634,6635,6636,6637,6638,7022}
SBW_BALLSPEED = 150
SBW_SHOOTEXAUSTHED = 1000
SBW_SHOOTDIR = 0                             
SBW_STATUS = 'on' 

-- MENSAGENS
SBW_MSGWARNING = "[SNOWBALL WAR] Abriu o teleport de ingresso para o evento, para participar se dirija ate o templo do servidor."
SBW_MSGSTART = "[SNOWBALL WAR] O teleport foi removido e o evento foi iniciado, boa sorte a todos participantes."

A frente das configuração solicitadas explica onde devem ser modificados.


 


 

 

 

 

E por fim, vá até o seu banco de dados (phpmyadmin) e insira a seguinte query:


CREATE TABLE IF NOT EXISTS `snowballwar` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `score` int(11) NOT NULL,
  `data` varchar(255) NOT NULL,
  `hora` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

 

Ainda no phpmyadmin execute:


ALTER TABLE `players` ADD `sbw_points` int(11);


 

 

Importe o arquivo SNOWBALL.otbm em seu mapa!
Imagem do mapa:
YmMrwkx.png

Download do mapa: https://www.sendspace.com/file/mae37z
Scan do mapa: https://www.virustotal.com/pt/file/94a507c71ef4cc241e415f2a8290441f7fa77809d804e24be18e9581a85c4740/analysis/1479161634/

 




 



É importante lembrar que peguei o script de um autor e realizei as modificações o tornando público para a comunidade exclusiva do TIBIAKING.

Espero que façam um ótimo proveito.

See you later.

Teria como colocar pra SQLiteStudio pf ?!

Em 14/11/2016 ás 20:15, Absolute disse:

Ap2pbop.png

Olá amigos, membros, visitantes, papagaios, enfim...

Depois de muito me pedirem o evento SNOWBAL WAR EVENT, trago ele 100% pra vocês.

Como funciona?
Os jogadores irão se divertir em uma emocionante partida de guerra de bolas de neve. O objetivo principal do evento é derrubar o número máximo de jogadores durante uma partida - atirando bolas de neve contra seus inimigos. O jogador que mais pontos fizer até o termino do evento será o vencedor (recompensa pode ser configurada).

Sem delongas, vamos ao que interessa...

 

 


 

 


Em data/actions abra o seu actions.xml e insira a seguinte linha:

 

 


<action actionid="7900" event="script" value="snowballaction.lua" />



Em data/actions/scripts crie um arquivo com o nome de snowballaction.lua e insira o seguinte conteúdo:


function onUse(cid, item, frompos, item2, topos)
if item.actionid == 7900 then
	if(SBW_AMMOINFI) then
		doPlayerSendTextMessage(cid, 27, "as bolas de neve sao infinitas, nao ha necessidade que voce compre-as.")
	else
		if (getPlayerStorageValue(cid, SBW_SCORE) > 0) and (getPlayerStorageValue(cid, SBW_AMMO) < 30) then
			doPlayerSetStorageValue(cid, SBW_SCORE, getPlayerStorageValue(cid, SBW_SCORE)-1)
			doPlayerSetStorageValue(cid, SBW_AMMO, getPlayerStorageValue(cid, SBW_AMMO)+SBW_AMMOBUY)
			doPlayerSendTextMessage(cid, 27, "Voce trocou " .. SBW_AMMOBUY .. "x bolas de neve por 1 ponto de placar.")
			doSendMagicEffect(getCreaturePosition(cid),4)
		else
			doPlayerSendTextMessage(cid, 27, "Voce nao possui pontos de jogo o suficiente ou ja esta carregando muitas bolas de neve.")                      
		end
	end
end
end

 


 


 

 


Em data/talkactions abra o seu talkactions.xml e insira a seguinte linha:

 


<talkaction words="!snowball" event="script" value="snowballtalk.lua"/>



Em data/talkactions/scripts crie um arquivo com o nome de snowballtalk.lua e insira o seguinte conteúdo:


function onSay(cid, words, param, channel)
local k = string.explode(param, ",")
if(k[1] ~= nil) then
		if(string.upper(k[1]) == 'INFO') then
			local score = {}
			local output =  "Voce tem " .. getPlayerStorageValue(cid, SBW_SCORE) .. " pontos.\nVoce tem "..getPlayerStorageValue(cid, SBW_AMMO).."x municoes.\n------------------\nO maior matador:\n"
			for _, pid in ipairs(getPlayersOnline()) do
				if getPlayerStorageValue(pid, SBW_INEVENT) then
					table.insert(score, {getCreatureName(pid), getPlayerStorageValue(pid, SBW_SCORE)})
				end
			end
			local lx = table.getn(score)
			if(lx > 3) then lx = 3 end
				table.sort(score, function(a, b) return a[2] > b[2] end)
				for k = 1,lx do
					output = output .. k..". "..score[k][1] .." [".. score[k][2] .."].\n"
				end
				doPlayerPopupFYI(cid, output)
			end
if (string.upper(k[1]) == 'ATIRAR') then
	if(getPlayerStorageValue(cid, SBW_INEVENT) == 1) and not getTileInfo(getThingPos(cid)).protection then
		if getPlayerStorageValue(cid, SBW_EXAUSTHED) <= 1 then
			if(getPlayerStorageValue(cid, SBW_AMMO) > 0) then
				if SBW_STATUS == 'on' then
					if(SBW_AMMOINFI == false) then
						doPlayerSetStorageValue(cid, SBW_AMMO, getPlayerStorageValue(cid, SBW_AMMO)-1)
					end
					doPlayerSetStorageValue(cid, SBW_EXAUSTHED, 2)
					lineAnimation(getPlayerLookDirection(cid),getCreaturePosition(cid),12,cid,1,0,1,0,0,0,1,0)
					addEvent(doPlayerSetStorageValue, SBW_SHOOTEXAUSTHED, cid, SBW_EXAUSTHED, 1)
					if (getPlayerStorageValue(cid, SBW_AMMO) ~= 1) then
						doPlayerSendTextMessage(cid, 27, "Restam "..getPlayerStorageValue(cid, SBW_AMMO).."x bolas de neve.")
					else
						doPlayerSendTextMessage(cid, 27, "Usando sua ultima bola de neve, recarregue.")
					end
				end
			else
				doPlayerSendCancel(cid, "Voce esta sem bolas de neve, recarregue no centro do campo ou mate um inimigo.")
				doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)     
			end
		else
			doPlayerPopupFYI(cid, "Acalme-se voce deve esperar para atirar novamente.") 
			doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
			return false
		end
	else
		doPlayerPopupFYI(cid, "Voce precisa estar dentro evento ou fora da pz.") 
		doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
	end
end
end
return true
end
 
 
                function lineAnimation(lookDir,playerPos,effect,cid,fvar,fpos,ffound,fposV,fcheck,fvcid,floopCounter,fvpid, name)
                local var = fvar
                local pos = fpos
                local found = ffound
                local posV = fposV
                local check = fcheck
                local vcid = fvcid
                local loopCounter = floopCounter
                local vpid = fvpid
                local storage = SBW_EXAUSTHED
                        if var < 2 then
                                vcid = cid
                        end
                        pos = playerPos
                        if not isInWallArray(convert(lookDir,pos)) then--isInWallArray({x=convert(lookDir,pos).x, y=convert(lookDir,pos).y,z=convert(lookDir,pos).z}) then --isInArray(t.onShoot.misc.walls_id, getThingfromPos({x=convert(lookDir,pos).x, y=convert(lookDir,pos).y,z=convert(lookDir,pos).z, stackpos=0}).itemid) then
                                doSendDistanceShoot(pos, convert(lookDir,pos),effect)
                                pos = convert(lookDir,pos)
                                var=var+1
                                posV = convertV(lookDir,playerPos)
                                for _, pid in ipairs(getPlayersOnline()) do
                                        if (getCreaturePosition(pid).x == pos.x and getCreaturePosition(pid).y == pos.y and getCreaturePosition(pid).z == pos.z) then
                                                --if loopCounter > 2 then
                                                vpid = pid
                                                --end
                                                if (vpid ~= vcid) then
                                                        if var > 2 then
                                                                if (getCreaturePosition(pid).x == posV.x and getCreaturePosition(pid).y == posV.y and getCreaturePosition(pid).z == posV.z) then
                                                                        killPlayer(pid,pos,getCreatureName(vcid))
                                                                        if (lookDir == 0) or (lookDir == 2) then
                                                                                var = 6
                                                                        else
                                                                                var = 8
                                                                        end
                                                                end
                                                        end
                                                        killPlayer(pid,pos,vcid)
                                                        if (lookDir == 0) or (lookDir == 2) then
                                                                var = 6
                                                        else
                                                                var = 8
                                                        end
                                                end
                                        end
                                        loopCounter = loopCounter +1
                                end    
                                if (lookDir == 0) or (lookDir == 2) then
                                        if var ~= 6 then
                                                addEvent(lineAnimation, SBW_BALLSPEED, lookDir,pos,effect,nil,var,pos,found,posV,check,vcid,loopCounter,vpid)
                                        else
                                                var = 1
                                        end
                                else
                                        if var ~= 8 then
                                                addEvent(lineAnimation,  SBW_BALLSPEED, lookDir,pos,effect,nil,var,pos,found,posV,check,vcid,loopCounter,vpid)
                                        else
                                                var = 1
                                        end
                                end
                        else
                                doSendMagicEffect(convert(lookDir,pos),2)
                                var = 1
                        end
                end
 
                local ret = {}
                function convert(lookDir,pos)
                local positions = {
                        [0] = {x = pos.x, y = pos.y-1, z = pos.z},
                        [1] = {x = pos.x+1, y = pos.y, z = pos.z},
                        [2] = {x = pos.x, y = pos.y+1, z = pos.z},
                        [3] = {x = pos.x-1, y = pos.y, z = pos.z}
                        }
                        ret = positions[lookDir]
                return ret
                end
 
 
                local ret = {}
                function convertV(lookDir,pos)
                local positions = {
                        [0] = {x = pos.x, y = pos.y+1, z = pos.z},
                        [1] = {x = pos.x-1, y = pos.y, z = pos.z},
                        [2] = {x = pos.x, y = pos.y-1, z = pos.z},
                        [3] = {x = pos.x+1, y = pos.y, z = pos.z}
                        }
                        ret = positions[lookDir]
                return ret
                end
				
				function isInWallArray(pos)
                        for k = 0, table.getn(SBW_WALLSID) do
                                if getTileItemById(pos, SBW_WALLSID[k]).itemid == SBW_WALLSID[k] then --this doesn't even make sense but tried other ways and it gave errors, so meh 2lazy2search
									return true    
                                end
                        end
                        return false
                end
                               
                function killPlayer(cid, pos, killer)
                    local t_l = SBW_AREA[1]
					local b_r = SBW_AREA[2]
					local posti = {}
					local isPossibleToTeleportPlayer = false
					while (isPossibleToTeleportPlayer == FALSE) do
						posti = Position(math.random(t_l.x,b_r.x), math.random(t_l.y, b_r.y), 7)
						if isInWallArray(posti) == FALSE then
							isPossibleToTeleportPlayer = TRUE
						end
					end
					doTeleportThing(cid, posti)
					doSendMagicEffect(pos,2)
					doSendMagicEffect(posti,6)
					doSendAnimatedText(pos, ""..getCreatureName(killer).." ", 55)
					doPlayerSendTextMessage(cid, 27, "Voce morreu para "..getCreatureName(killer)..".")
					doPlayerSetStorageValue(killer, SBW_SCORE, getPlayerStorageValue(killer, SBW_SCORE)+SBW_POINTSKILL)				
					doPlayerSendTextMessage(killer, 27, "You've killed "..getCreatureName(cid)..".")
					if SBW_LOSTSCORE then
						doPlayerSetStorageValue(cid, SBW_SCORE, getPlayerStorageValue(cid, SBW_SCORE)-1)
					end
					if SBW_RESETAMMO then
						doPlayerSetStorageValue(cid, SBW_AMMO, SBW_MINAMMO)
					end
                end
                                               
                

 


 

 

 

 

Em data/globalevents abra o seu globalevents.xml e insira a seguinte linha:


<globalevent name="StartSBW" time="19:00" event="script" value="events/snowballglobalevent.lua"/>


Em data/globalevents/scripts crie um arquivo com o nome de snowballglobalevent.lua e insira o seguinte conteúdo:


function onTime()
				
function isInWallArray(pos)
    for k = 0, table.getn(SBW_WALLSID) do
        if (getTileItemById(pos, SBW_WALLSID[k]).itemid == SBW_WALLSID[k]) then
			return true    
        end	
    end
 return false
end

               
function endsnowball()
	local score = {}
	if not SBW_USEWAIT then
		doRemoveItem(getTileItemById(SBW_TP, 1387).uid)
	end
	for _, pid in ipairs(getPlayersOnline()) do
		if getPlayerStorageValue(pid, SBW_INEVENT) > 0 then
			table.insert(score, {getCreatureName(pid), getPlayerStorageValue(pid, SBW_SCORE)})
			doPlayerSetStorageValue(pid, SBW_INEVENT, 0)
			doPlayerSetStorageValue(pid, SBW_SCORE, 0)
			doPlayerSetStorageValue(pid, SBW_AMMO, 0)
			doTeleportThing(pid, SBW_TPEND)
		end
	end
	table.sort(score, function(a, b) return a[2] > b[2] end)
	--local random_item = SBW_REWARDS[math.random(1, #SBW_REWARDS)]
	local hora = os.date("%X")
	local data = os.date("%x")	
	if table.getn(score) > 0 then
		if SBW_ADDREWARD then
			for _, pid in ipairs(getPlayersOnline()) do
				if getCreatureName(pid) == score[1][1] then
					for op,ad in pairs(SBW_REWARDS) do
						doPlayerAddItem(pid, ad[1], ad[2])
					end
					break
                end
            end
        end
		db.query("INSERT INTO `snowballwar`  VALUES ('', ".. db.escapeString(score[1][1]) ..  ",".. score[1][2] ..", ".. db.escapeString(data) ..", ".. db.escapeString(hora) ..");")  
		db.query("UPDATE `players` SET `sbw_points`=`sbw_points`+".. score[1][2] .." WHERE `name` = " .. db.escapeString(score[1][1]) .. ";") 
        doBroadcastMessage("[SNOWBALL EVENT] encerrou-se, parabens ao jogador "..score[1][1].." que venceu o SnowBall Event com "..score[1][2].." pontos.")
    end
	return true
end

local t_l = SBW_AREA[1]
local b_r = SBW_AREA[2]

function moveToEvent()
for _, pid in ipairs(getPlayersOnline()) do
	if isInRange(getCreaturePosition(pid), SBW_WAITROOM[1], SBW_WAITROOM[2]) then
		local posti = {}
		local isPossibleToTeleportPlayer = false
		while (isPossibleToTeleportPlayer == FALSE) do
			posti = Position(math.random(t_l.x,b_r.x), math.random(t_l.y, b_r.y), 7)
			if (isInWallArray(posti) == FALSE) then
				isPossibleToTeleportPlayer = TRUE
			end
		end
		doTeleportThing(pid, posti)
		doPlayerSetStorageValue(pid, SBW_INEVENT, 1)
		doPlayerSetStorageValue(pid, SBW_AMMO, SBW_MINAMMO)
		doPlayerSetStorageValue(pid, SBW_SCORE, 0)
		doPlayerSendTextMessage(pid, 27, "[SNOWBALL WAR] Seja bem vindo, aqui estao os comandos que voce vai usar durante o evento\n!snowball atirar --Atirar uma bola de neve.\n!snowball info --Isso mostra seus pontos de jogos e a quantia de bolas de neve que voce tem. Tambem mostra o ranking de pontos do evento.\n Recarregue suas bolas de neve clicando em frente ao gerador no centro do campo.\nAltamente recomendado adicionar estes comandos a sua hotkeys.")               														
	end
end
doRemoveItem(getTileItemById(SBW_TP, 1387).uid)
addEvent(endsnowball, SBW_DURATION*1000*60)
doBroadcastMessage(SBW_MSGSTART)
end

local time = os.date("*t")
local timeopen1 = math.ceil(SBW_TIMEWAIT / 4)
local timeopen2 = math.ceil(SBW_TIMEWAIT / 2)
if (SBW_STARTAUTO) and (isInArray(SBW_DAYS,time.wday)) then
	doBroadcastMessage(SBW_MSGWARNING)
	if SBW_USEWAIT then
		addEvent(doBroadcastMessage, timeopen1*1000*60, "[SNOWBALL WAR] - Resta(m) ".. timeopen2 .." minuto(s) para iniciar o evento!")
		if (timeopen2 ~= timeopen1) then
			addEvent(doBroadcastMessage, timeopen2*1000*60, "[SNOWBALL WAR] - Resta(m) ".. timeopen1 .." minuto(s) para iniciar o evento!")
		end
        addEvent(moveToEvent, SBW_TIMEWAIT*1000*60)
        doCreateTeleport(1387, SBW_TPGO, SBW_TP)
    else
		if SBW_TFS == "0.3" then
			doItemSetAttribute(doCreateItem(1387, SBW_TP), "aid", 2880)
		else
			doSetItemActionId(doCreateItem(1387, SBW_TP), 2880)
        end
        if(SBW_DURATION > 0) then
            addEvent(endsnowball, SBW_DURATION*1000*60)
        end
    end
end
return true
end

 


 

 

 

 

Em data/movements abra o seu movements.xml e insira a seguinte linha:


<movevent type="StepIn" actionid ="2880" event="script" value="snowballmovement.lua"/>

 

Em data/movements/scripts crie um arquivo com o nome de snowballglobalmovement.lua e insira o seguinte conteúdo:


function onStepIn(cid, item, pos)
	doTeleportThing(cid, SBW_TPGO)
	doBroadcastMessage("[SNOWBALL WAR] O " ..getCreatureName(cid).. " player esta participando do evento snowball.", MESSAGE_STATUS_CONSOLE_ORANGE)					
	doPlayerSetStorageValue(cid, SBW_INEVENT, 1)
	doPlayerSetStorageValue(cid, SBW_AMMO, SBW_MINAMMO)
	doPlayerSetStorageValue(cid, SBW_SCORE, 0)           														
end

 


 

 

 

 

Já estamos quase terminando!
Agora em data/lib crie um arquivo com o nome de SBW.lua com o seguinte conteúdo:
 


-- This script is part of Snow Ball War Event Tibiaking Absolute
--
-- This program is free software: you can redistribute it and/or modify
-- it under the terms of the GNU General Public License as published by
-- the Free Software Foundation, either version 3 of the License, or
-- (at your option) any later version.
--
-- This program is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-- GNU General Public License for more details.
--
-- You should have received a copy of the GNU General Public License
-- along with this program.  If not, see <http://www.gnu.org/licenses/>.

-- //

-- POSIÇÕES IMPORTANTES
SBW_AREA = {{x = 1214, y = 1205, z = 7}, {x = 1251, y = 1242, z = 7}}-- AREA DO EVENTO | Canto superior esquerdo / inferior direito
SBW_WAITROOM = {{x = 1229, y = 1220, z = 6}, {x = 1235, y = 1226, z = 6}} -- AREA DE ESPERA | Canto superior esquerdo / inferior direito
SBW_TP = {x = 165, y = 45, z = 7} -- local onde teleport sera criado (entrada de jogadores)
SBW_TPGO = {x = 1232, y = 1223, z = 6} -- local onde teleport vai levar (saida de jogadores)
SBW_TPEND = {x = 155, y = 54, z = 7} -- local onde serao teleport ao final do evento
SBW_GERADOR = {x = 1232, y = 1223, z = 7} -- local onde gerador vai ficar

-- CONFIGURAÇÕES DO EVENTO
SBW_DAYS = {1,2,3,4,5,6,7} -- dias de semana que vai abrir
SBW_DURATION = 10 -- duração do evento em minutos
SBW_POINTSKILL = 1 -- pontos de jogo por morte
SBW_AMMOBUY = 20 -- quantia de munições compradas por cada ponto
SBW_MINAMMO = 50 -- munição inicial dos jogadores
SBW_TIMEWAIT = 3 -- tempo na sala de espera em minutos
SBW_AMMOINFI = false
SBW_LOSTSCORE = true
SBW_RANDOMIZE = true
SBW_RESETAMMO = true
SBW_STARTAUTO = true
SBW_USEWAIT = true

--PREMIO DO EVENTO
SBW_ADDREWARD = true
SBW_REWARDS = {
				{6527,500},
				{2345,1}
			}


-- // Não mexa daqui para baixo
SBW_TFS = "0.4" 

-- STORAGES
SBW_EXAUSTHED = 2455 
SBW_INEVENT = 2460 
SBW_SCORE = 2465
SBW_AMMO = 2400


SBW_WALLSID = {5324,7003,7021,6712,7023,7002,6713,6714,6869,6822,6823,6824,6825,6826,6827,6828,6829,6830,6831,6832,6833,6707,6708,6709,6710,6711,2698,2697,7020,6719,6720,6721,6722,6723,6724,6725,6726,6727,6761,6762,6768,6769,4608,4609,4610,4611,4612,4613,4614,4615,4616,4617,4618,4619,4620,4621,4622,4623,4624,4625,4664,4665,4666,7008,7009,7010,7011,8239,7004,7005,7006,7007,6627,6628,6629,6630,6631,6632,6633,6634,6635,6636,6637,6638,7022}
SBW_BALLSPEED = 150
SBW_SHOOTEXAUSTHED = 1000
SBW_SHOOTDIR = 0                             
SBW_STATUS = 'on' 

-- MENSAGENS
SBW_MSGWARNING = "[SNOWBALL WAR] Abriu o teleport de ingresso para o evento, para participar se dirija ate o templo do servidor."
SBW_MSGSTART = "[SNOWBALL WAR] O teleport foi removido e o evento foi iniciado, boa sorte a todos participantes."

A frente das configuração solicitadas explica onde devem ser modificados.


 


 

 

 

 

E por fim, vá até o seu banco de dados (phpmyadmin) e insira a seguinte query:


CREATE TABLE IF NOT EXISTS `snowballwar` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `score` int(11) NOT NULL,
  `data` varchar(255) NOT NULL,
  `hora` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

 

Ainda no phpmyadmin execute:


ALTER TABLE `players` ADD `sbw_points` int(11);


 

 

Importe o arquivo SNOWBALL.otbm em seu mapa!
Imagem do mapa:
YmMrwkx.png

Download do mapa: https://www.sendspace.com/file/mae37z
Scan do mapa: https://www.virustotal.com/pt/file/94a507c71ef4cc241e415f2a8290441f7fa77809d804e24be18e9581a85c4740/analysis/1479161634/

 




 



É importante lembrar que peguei o script de um autor e realizei as modificações o tornando público para a comunidade exclusiva do TIBIAKING.

Espero que façam um ótimo proveito.

See you later.

Teria como colocar pra SQLiteStudio pf ?!

Link para o post
Compartilhar em outros sites
  • 5 weeks later...

@tirso é proibido dar up cara.

Em quanto ao erro, o erro foi do absolute, mais será que devemos ser capaz de enxerga ele ?

Olha o nome do erro, diretório snowballmovement não foi encontrado, deve ser porque o arquivo com esse nome não existe. Ué ? Mais eu adicionei esse arquivo. Sim, você adicionou mais com nome errado. Preste atenção também. Eu tinha visto esses erros quando ele postou o script, mas resolvi não comentar, alias, comentei um, da talkactions.

Em fim, quando for adicionar algo, custa nada prestar atenção, é algo besta! 

Spoiler

589921fd1118c_seuerro.thumb.png.b030b2d8897a3dbe295bbb550d982e5d.png

 

                                                              ezgif-1-98aab239f3.gif.1a897c9c3225228909e7b356a5cfb8e4.gif

Link para o post
Compartilhar em outros sites
13 minutos atrás, KotZletY disse:

@tirso é proibido dar up cara.

Em quanto ao erro, o erro foi do absolute, mais será que devemos ser capaz de enxerga ele ?

Olha o nome do erro, diretório snowballmovement não foi encontrado, deve ser porque o arquivo com esse nome não existe. Ué ? Mais eu adicionei esse arquivo. Sim, você adicionou mais com nome errado. Preste atenção também. Eu tinha visto esses erros quando ele postou o script, mas resolvi não comentar, alias, comentei um, da talkactions.

Em fim, quando for adicionar algo, custa nada prestar atenção, é algo besta! 

  Mostrar conteúdo oculto

589921fd1118c_seuerro.thumb.png.b030b2d8897a3dbe295bbb550d982e5d.png

 

Fera, esse erro ai, eu ja tinha visto, meu erro agora é outro.

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.

  • Conteúdo Similar

    • Por Under
      ATENÇÃO, DESENVOLVEDORES DE OTSERV! 
      Uma nova era está chegando — e você vai fazer parte dela desde o começo! 
       Ferramentas de IA + Formação Completa
      Estamos finalizando ferramentas exclusivas de inteligência artificial que vão revolucionar a forma como você cria e gerencia servidores de Tibia.
      E pra abrir com estilo, chegou a primeira etapa da nossa formação completa:
       Curso de Pixel Art para Tibia e Derivados


      Instrutor: Brendon Nogard, fundador da Pixel Art School
      Uma das maiores referências em arte para servidores de tibia no Brasil!
       Quem é o Nogard? @Nogard
      video-de-apresent.mp4
       
      Criador das primeiras remakes gráficas da PXG
      Mais de 10 anos de experiência com Pixel Art
      Conduziu a evolução da perspectiva GBA para um visual moderno e imersivo
      Influenciou uma geração inteira de criadores na comunidade OTServer no Brasil.
       O que você vai aprender nesse curso?
      Compre Aqui!
       Perspectiva 45° para Tibia e derivados
       Criação de itens: pokébolas, loots, mochilas, poções
       Personagens animados com variações de cabelo
       Criaturas como Wolf, Werewolf, Snake, Horse e Centauro
       Cenários: paredes, cortinas, troféus
       Texturas: folhas, rochas
       Fundamentos de estilo, coerência e construção de sprites profissionais
        Duração: 12 horas
        VALOR : R$250,00
       BÔNUS POR R$50,00
      Também está disponível o Curso de Pixel Art Top Down, ideal pra quem quer começar do zero absoluto:
      Crie personagens, inimigos, chefes
      Monte todo o ambiente do seu jogo
         Duração: 3 horas
       Por que isso é importante pra você?
      Esse é o primeiro passo pra criar um OTServer com:
       Identidade visual única
       Alto nível gráfico
       Suporte de ferramentas de IA exclusivas
       E um método claro, testado e acessível!
       Nas próximas 4 semanas...
      Vamos liberar novos cursos sobre:
       Criação de mapas
       Desenvolvimento de sistemas e scripts
       IA aplicada ao design de jogo (desenvolvimento)
       Balanceamento, mecânicas e muito mais!
       Garanta sua vaga agora!
      Comece hoje mesmo com o pé direito.
      Compre Aqui!
    • Por Under
      A CipSoft acaba de anunciar uma grande novidade: a empresa agora também será responsável pelo desenvolvimento e operação do clássico The Settlers Online! 
      O time que já cuidava do jogo seguirá dedicado ao projeto, mas agora diretamente do novo escritório da CipSoft em Düsseldorf, na Alemanha.
       
      Pra quem não conhece, The Settlers Online é um jogo com uma base de jogadores muito fiel e engajada — algo que a CipSoft conhece bem graças à comunidade Tibiana que, há décadas, mostra paixão, comprometimento e amor pelo jogo. 
      O mais importante:
      É incrível ver a CipSoft crescendo e levando seu espírito de comunidade para novos horizontes, sem esquecer de onde veio e quem está com ela há tantos anos. 
      Anúncio oficial no fórum do Tibia
      Site oficial de The Settlers Online (Brasil)
       
    • Por Under
      Apresentando o Tibia-IA: A IA para Desenvolvimento de Servidores Tibia! 
       O que é o Tibia-IA?
      Um modelo de IA especializado para Tibia! Ele está atualmente em teste gratuito, e eu adoraria que vocês o experimentassem. Basta acessar https://ai.tibiaking.com, criar uma conta e começar a usar totalmente de graça! 
       Versão Experimental Fechada
      Atualmente, algumas funcionalidades ainda estão em desenvolvimento. No momento, apenas a geração de scripts está disponível para o público.
      Se encontrarem qualquer problema nos scripts gerados, me avisem! Vamos juntos construir a IA mais poderosa para ajudar no desenvolvimento de servidores Tibia!  
      Contato direto discord : underewar
       Acesse agora: https://ai.tibiaking.com
       Como funciona?
       Geração automática de scripts LUA para TFS  Suporte a diferentes eventos, criaturas, NPCs, magias, etc.  Ferramenta em constante evolução para aprimorar o desenvolvimento Novidades em breve confira no site. O acesso ao Tibia-IA está disponível para testes GRATUITOS! 
      Basta criar uma conta em: https://ai.tibiaking.com
      Utilize a IA para gerar seus scripts de forma simples e rápida
      Envie feedbacks para ajudarmos a tornar a ferramenta ainda melhor!

      Problemas relatar diretamente no meu discord pessoal : underewar
       
       
    • Por Neutraz
      Advanced Roulette System (TFS 0.3.6)
       
      Hi everyone! This is my first contribution to the Tibia community, and I hope you find it very useful. It's a gacha-style roulette system with dynamic speed mechanics and multi-key functionality.
       
      What's it about?
      This script adds a roulette (Tested on: Tibia 8.6 -- TFS 0.3.6) where players can use keys to spin the roulette and win rewards. The system includes:
      Multi-key support: using 1 to 4 keys per spin, increasing the chances of winning. Dynamic speed: The roulette gradually accelerates during the spin to make it more exciting. Configurable rewards: You can define which items can be won and with what probability. You can even add "reroll" value to increase the difficulty! Visual effects: Includes simple effects and text animations to make the experience more engaging. Activity log: Keeps a record of which players won which items.  
      Demo Video (x1.5 Speed)
      Roulette2.mp4
       
       
      Installation
      Copy the `Roulette.lua` file to the `data/actions/scripts` folder of your TFS server. --[[ ================================================================================ = ROULETTE SYSTEM FOR TFS = = = = Author: Neutras = = Version: 2.1 = = Description: Gacha-style roulette system with dynamic speed mechanics = = and multi-key feature. = = = = Features: = = - Multi-key support (1-4 keys per spin). = = - Dynamic speed animation with configurable initial and final speeds. = = - Persistent "Winner Slot" effects and animated texts. = = - Configurable rewards with reroll chances. = = - Logging system to track player rewards. = = = = Compatible with TFS 0.3.7 (Tibia 8.6). = ================================================================================ --]] -- ================= LOGGING SYSTEM ================= -- local logPath = "data/logs/" local logFileName = "roulette.log" -- Logs player rewards to a file. -- @param cid: Player ID. -- @param keyName: Name of the key used. -- @param items: Table of items won. -- @param keyCount: Number of keys used. local function logEntry(cid, keyName, items, keyCount) local file = io.open(logPath .. logFileName, "a") if file then local itemStrings = {} for _, item in ipairs(items) do table.insert(itemStrings, string.format("x%d %s", item.count, getItemNameById(item.id))) end file:write(string.format("[%s] %s used %d '%s' and won: %s\n", os.date("%Y-%m-%d %H:%M:%S"), getPlayerName(cid), keyCount, keyName, table.concat(itemStrings, ", "))) file:close() end end -- ================= BASE CONFIGURATION ================= -- -- Levers Action IDs to key item IDs. local keyByAid = { [1354] = 9971, -- Key for reward level 1 (Copper) [1355] = 9972, -- Key for reward level 2 (Silver) [1356] = 9973 -- Key for reward level 3 (Golden) } -- Levers Action IDs to reward levels. local rewardByAid = { [1354] = 1, -- Reward level 1 (Copper) [1355] = 2, -- Reward level 2 (Silver) [1356] = 3 -- Reward level 3 (Golden) } -- Relative positions of the slots in the roulette. local rouletteSpinOffset = { {1, -4}, {2, -4}, {3, -4}, {3, -3}, {4, -3}, {4, -2}, {4, -1}, {5, -1}, {5, 0}, {5, 1}, {4, 1}, {4, 2}, {4, 3}, {3, 3}, {3, 4}, {2, 4}, {1, 4}, {0, 4}, {-1, 4}, {-2, 4}, {-3, 4}, {-3, 3}, {-4, 3}, {-4, 2}, {-4, 1}, {-5, 1}, {-5, 0}, {-5, -1},{-4, -1},{-4, -2}, {-4, -3},{-3, -3},{-3, -4},{-2, -4},{-1, -4}, {0, -4} } -- ================= MAIN CONFIGURATION ================= -- local config = { rouletteCD = 30, -- Global cooldown in seconds. globalStoCd = 22600, -- Storage ID for cooldown. globalStoKeyCount = 22601, -- Storage ID for key count. maxLoops = 100, -- Maximum iterations per spin. initialSpeed = 50, -- Initial speed in milliseconds. finalSpeed = 400, -- Final speed in milliseconds. effectLever = 35, -- Effect when activating the lever. effectRewardPlayer = 28, -- Effect on the player when winning. effectReward = 28, -- Effect on the winning slot. -- Reward table by level. -- Formula: Real Probability = (Item Chance / Total Chances) * (1 - (Reroll % / 100)) items = { [1] = { {id = 1, chance = 80, count = 5}, }, [2] = { {id = 2, chance = 70, count = 1, porc_cambio = 30}, }, [3] = { {id = 3, chance = 25, count = 1, porc_cambio = 70} } } } -- ================= PROBABILITY CACHING ================= -- -- Precalculates cumulative probabilities for each reward level. local cumulativeChanceCache = {} for rewardId, items in pairs(config.items) do local total = 0 local cumulative = {} for _, item in ipairs(items) do total = total + item.chance table.insert(cumulative, {item = item, threshold = total}) end cumulativeChanceCache[rewardId] = {total = total, items = cumulative} end -- ================= UTILITY FUNCTIONS ================= -- -- Calculates the speed of the roulette animation based on progress. -- @param progress: Current progress (0 to 1). -- @return: Speed in milliseconds. local function calculateSpeed(progress) return config.initialSpeed + (config.finalSpeed - config.initialSpeed) * progress^3 end -- Selects a random item from the reward table, considering reroll chances. -- @param rewardId: Reward level ID. -- @return: Selected item. local function chooseRouletteItem(rewardId) local cache = cumulativeChanceCache[rewardId] local roll = math.random(cache.total) for _, entry in ipairs(cache.items) do if roll <= entry.threshold then if entry.item.porc_cambio and math.random(100) <= entry.item.porc_cambio then return chooseRouletteItem(rewardId) end return entry.item end end return cache.items[#cache.items].item end -- Rotates the slots in the roulette. -- @param slots: Table of slots. local function rotateSlots(slots) local last = slots[36] for i = 36, 2, -1 do slots[i] = slots[i-1] end slots[1] = last end -- Updates the visual display of the roulette. -- @param cpos: Center position of the roulette. -- @param slots: Table of slots. -- @param isFillingPhase: Whether the slots are being filled for the first time. local function updateRouletteDisplay(cpos, slots, isFillingPhase) for i = 1, 36 do local pos = { x = cpos.x + rouletteSpinOffset[i][1], y = cpos.y + rouletteSpinOffset[i][2], z = cpos.z } doCleanTile(pos) if slots[i] then doCreateItem(slots[i].id, slots[i].count, pos) -- Show puff effect only during the initial filling phase. if isFillingPhase then doSendMagicEffect(pos, 14) end end end end -- ================= WINNER SLOTS AND EFFECTS ================= -- -- Shows "Winner Slot" animated text on winning slots. -- @param cpos: Center position of the roulette. -- @param keyCount: Number of keys used. local function showWinnerSlots(cpos, keyCount) local winningSlots = {} if keyCount == 1 then winningSlots = {36} elseif keyCount == 2 then winningSlots = {36, 18} elseif keyCount == 3 then winningSlots = {36, 18, 9} elseif keyCount == 4 then winningSlots = {36, 18, 9, 27} else winningSlots = {36} -- Default to one winning slot if keyCount is invalid. end for _, slot in ipairs(winningSlots) do local pos = { x = cpos.x + rouletteSpinOffset[slot][1], y = cpos.y + rouletteSpinOffset[slot][2], z = cpos.z } doSendAnimatedText(pos, "Winner Slot", TEXTCOLOR_YELLOW) end end -- Shows the number of keys in use. -- @param cpos: Center position of the roulette. local function showKeyCount(cpos) local keyCount = getGlobalStorageValue(config.globalStoKeyCount) keyCount = (keyCount < 1 or keyCount > 4) and 1 or keyCount local pos = {x = 1013, y = 995, z = 7} doSendAnimatedText(pos, string.format("Keys: %d", keyCount), TEXTCOLOR_LIGHTBLUE) end -- ================= MAIN ROULETTE LOGIC ================= -- -- Main animation function, recursively called to simulate the roulette spin. -- @param cid: Player ID. -- @param cpos: Center position of the roulette. -- @param rewardId: ID of the reward level. -- @param nloop: Current iteration number. -- @param slots: Table of slots (items). -- @param keyName: Name of the key used. -- @param keyCount: Number of keys used. local function shuffle(cid, cpos, rewardId, nloop, slots, keyName, keyCount) if nloop > config.maxLoops then if isPlayer(cid) then -- Determine winning slots based on the number of keys used. local winningSlots = {} if keyCount == 1 then winningSlots = {36} elseif keyCount == 2 then winningSlots = {36, 18} elseif keyCount == 3 then winningSlots = {36, 18, 9} elseif keyCount == 4 then winningSlots = {36, 18, 9, 27} else winningSlots = {36} -- Default to one winning slot if keyCount is invalid. end -- Get the winning items and their positions. local wonItems = {} local winPositions = {} for _, slot in ipairs(winningSlots) do if slots[slot] then table.insert(wonItems, slots[slot]) local pos = { x = cpos.x + rouletteSpinOffset[slot][1], y = cpos.y + rouletteSpinOffset[slot][2], z = cpos.z } table.insert(winPositions, pos) end end -- Award the items and display visual effects. if #wonItems > 0 then for _, pos in ipairs(winPositions) do doSendAnimatedText(pos, "Winner Slot", TEXTCOLOR_YELLOW) doSendMagicEffect(pos, config.effectReward) end for _, item in ipairs(wonItems) do doPlayerAddItem(cid, item.id, item.count) end doSendMagicEffect(getCreaturePosition(cid), config.effectRewardPlayer) -- Display a message to the player with all the rewards. local itemList = {} for _, item in ipairs(wonItems) do table.insert(itemList, string.format("x%d %s", item.count, getItemNameById(item.id))) end doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "[ROULETTE] You won: " .. table.concat(itemList, ", ")) -- Log the player's rewards. logEntry(cid, keyName, wonItems, keyCount) else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "[ROULETTE] No items won.") end setGlobalStorageValue(config.globalStoCd, 0) end return end -- Initial filling phase of the roulette slots. if nloop <= 36 then slots[nloop] = chooseRouletteItem(rewardId) updateRouletteDisplay(cpos, slots, true) else -- Rotate the slots and update the display. rotateSlots(slots) updateRouletteDisplay(cpos, slots, false) -- Show effects on the winning slots every 5 iterations. if nloop % 5 == 0 then local winningSlots = {} if keyCount == 1 then winningSlots = {36} elseif keyCount == 2 then winningSlots = {36, 18} elseif keyCount == 3 then winningSlots = {36, 18, 9} elseif keyCount == 4 then winningSlots = {36, 18, 9, 27} else winningSlots = {36} -- Default to one winning slot if keyCount is invalid. end for _, slot in ipairs(winningSlots) do local pos = { x = cpos.x + rouletteSpinOffset[slot][1], y = cpos.y + rouletteSpinOffset[slot][2], z = cpos.z } doSendMagicEffect(pos, config.effectReward) end end end -- Schedule the next iteration with dynamic speed. local progress = nloop / config.maxLoops addEvent(shuffle, calculateSpeed(progress), cid, cpos, rewardId, nloop + 1, slots, keyName, keyCount) end -- ================= PERIODIC EFFECTS AND TEXTS ================= -- -- Shows effects and texts periodically. -- @param cpos: Center position of the roulette. local function showEffectsAndTexts(cpos) local keyCount = getGlobalStorageValue(config.globalStoKeyCount) keyCount = (keyCount < 1 or keyCount > 4) and 1 or keyCount -- Ensure keyCount is within range. -- Show "Winner Slot" on the winning slots. showWinnerSlots(cpos, keyCount) -- Show the number of keys in use. showKeyCount(cpos) -- Schedule the next execution. addEvent(showEffectsAndTexts, 1500, cpos) end -- ================= EFFECT SCRIPT INITIALIZATION ================= -- -- Start the periodic effects and texts when the script is loaded. local cpos = {x = 1012, y = 994, z = 7} -- Center position of the roulette. addEvent(function() showEffectsAndTexts(cpos) end, 5000) -- 5 seconds delay since server start. -- ================= MAIN OBJECT USE FUNCTION ================= -- -- Called when the roulette object is used. function onUse(cid, item, frompos, item2, topos) -- Handle the key change lever. if item.aid == 1360 then local current = getGlobalStorageValue(config.globalStoKeyCount) current = (current < 1 or current > 4) and 1 or (current % 4) + 1 setGlobalStorageValue(config.globalStoKeyCount, current) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, string.format("Now using %d keys per spin.", current)) doSendMagicEffect(getThingPos(item.uid), CONST_ME_MAGIC_GREEN) return true end -- Handle the roulette levers. if not keyByAid[item.aid] then return false end local key = keyByAid[item.aid] local keyName = getItemNameById(key) local requiredKeys = getGlobalStorageValue(config.globalStoKeyCount) requiredKeys = (requiredKeys < 1 or requiredKeys > 4) and 1 or requiredKeys if getPlayerAccess(cid) < 5 and getPlayerItemCount(cid, key) < requiredKeys then doPlayerSendCancel(cid, string.format("You need %d %s to play!", requiredKeys, keyName)) doSendMagicEffect(topos, 14) return true end local rewardId = rewardByAid[item.aid] or 1 -- Get the reward level based on the lever. Default to 1 if not found. local pos = {x = 1012, y = 994, z = 7} -- Center position of the roulette. if getGlobalStorageValue(config.globalStoCd) > os.time() and getPlayerAccess(cid) < 5 then local remaining = getGlobalStorageValue(config.globalStoCd) - os.time() doPlayerSendCancel(cid, "Wait " .. remaining .. " seconds to play again.") return true end setGlobalStorageValue(config.globalStoCd, os.time() + config.rouletteCD) -- Set the cooldown. doTransformItem(item.uid, item.itemid == 9825 and 9826 or 9825) -- Change the lever's appearance. -- Clear the tiles around the roulette and add magic effects. for i = 1, 36 do local rpos = { x = pos.x + rouletteSpinOffset[i][1], y = pos.y + rouletteSpinOffset[i][2], z = pos.z } doCleanTile(rpos) doSendMagicEffect(rpos, config.effectReward) end if key > 0 then doPlayerRemoveItem(cid, key, requiredKeys) end -- Remove the keys from the player's inventory. doSendMagicEffect(pos, config.effectLever) -- Play the lever activation effect. math.randomseed(os.time() + getPlayerGUID(cid)) -- Seed the random number generator. addEvent(shuffle, config.initialSpeed, cid, pos, rewardId, 1, {}, keyName, requiredKeys) -- Start the roulette animation. return true end  
      Add the following lines within the `<actions>` tag in your `data/actions/actions.xml` file: <action actionid="XXX;YYYY;ZZZZ;AAAA" event="script" value="Roulette.lua"/> Replace `XXXX`, `YYYY`, and `ZZZZ` with the unique IDs of the levers that will activate the roulette (make sure they are not in use!).
      The ID `AAAA` is for the lever that changes the number of keys to use.
       
      Open the `Roulette.lua` file and adjust the `config.items` table with the items you want players to be able to win. Remember to balance the probabilities.  
       
      Code Explanation
      The script is divided into several sections to facilitate understanding:
      LOGGING SYSTEM: Handles logging the rewards obtained by players. BASE CONFIGURATION: Defines object IDs and reward levels. MAIN CONFIGURATION: Contains the main options of the system, such as the wait time between spins, the speed of the roulette, and the rewards. PROBABILITY CACHING: Optimizes the calculation of probabilities so that the system runs smoothly. UTILITY FUNCTIONS: Helper functions to calculate speed, choose items randomly, and update the roulette display. WINNER SLOTS AND EFFECTS: Displays the "Winner Slot" text and other visual effects in the winning spaces. MAIN ROULETTE LOGIC: The main function that controls the roulette animation and the delivery of rewards. PERIODIC EFFECTS AND TEXTS: Displays effects and texts periodically. SCRIPT INITIALIZATION: Initializes the effect system when the script is loaded. MAIN OBJECT USE FUNCTION: The function that is executed when a player interacts with a lever.

      I hope this roulette system is a great addition to your server! If you have any questions or suggestions, please feel free to leave a comment. Thank you for your support!  
       
  • Estatísticas dos Fóruns

    96836
    Tópicos
    519581
    Posts



×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo