Ir para conteúdo
  • Cadastre-se

Posts Recomendados

Olá! Fiz uma adaptação no evento "SafeZone" criado e disponibilizado aqui no TK por @Movie e @luanluciano93.

 

 

Agora o evento é compatível para TFS 0.4.

 

IMPORTANTE:  Como mencionado anteriormente, o evento foi criado por "Movie" e "LuanLuciano93". Eu (imperius) APENAS ADAPTEI para funcionar em TFS 0.4. Todos os créditos do evento vão para os criadores originais. Além disso, é importante alertar que esta adaptação não está 100%.

 

Abaixo está todo o processo explicando como configurar e rodar o evento em seu servidor!

 

 

Vídeo demonstrativo:

 

 

 

em data > lib > crie um arquivo chamado safeZone.lua

 

Spoiler

--[[
    Evento criado por LuanLuciano93 e Movie (Movie#4361)
--]]

SAFEZONE_CONFIG = {
    effectArea       = CONST_ME_SMALLPLANTS,
    tileActionId     = 69241,
    protectionTileId = {9562, 9563, 9564, 9565}, -- ID dos pisos que serão criados
    minPlayers       = 2,  -- Limite minimo de jogadores.
    maxPlayers       = 14, -- Limite maximo de jogadores.
    levelMin         = 1,  -- Level  minimo para participar.
    days = {
        ["Monday"]    = {"19:30"}, -- Segunda
		["Tuesday"]   = {"19:30"}, -- Terça
		["Wednesday"] = {"19:30"}, -- Quarta
		["Thursday"]  = {"19:30"}, -- Quinta
		["Friday"]    = {"19:30"}, -- Sexta
		["Saturday"]  = {"19:30"}, -- Sábado
		["Sunday"]    = {"19:30"}  -- Domingo
    },
    broadcast = {      -- NÃO ALTERE |totalParticipants|, |position|, |playerName| e |minutesToStart|.
        prefix         = "[SafeZone]",
        start          = "O evento ira comecar agora com |totalParticipants| participantes! Boa sorte!",
        noParticipants = "O evento nao foi iniciado por falta de participantes!",
        open           = "O evento foi aberto, voce tem |minutesToStart| minuto(s) para entrar no portal do evento que se encontra no templo!",
        finish         = "O evento foi finalizado e o ganhador foi |playerName|! Parabens!",
        winner         = "|playerName| terminou o evento em |position| lugar!"
    },
    reward = {
    -- [colocacao] = {{itemID, quantidade}, etc...}
       [1] = {{2160, 80}, {2520, 1}},
       [2] = {{2160, 50}},
       [3] = {{2160, 25}}
    },
    position = {
        openTeleport   = {x = 32365, y = 32236, z = 7}, -- Posição onde o teleport será aberto para participar do evento.
        leaveEvent     = {x = 32369, y = 32241, z = 7}, -- Posição onde o jogador será teleportado ao perder / ganhar o evento.
        arenaCenter    = {x = 32337, y = 31934, z = 7}, -- Posição do centro da arena do evento.
        arenaLeftTop   = {x = 32332, y = 31930, z = 7}, -- Posição do canto superior esquerdo da arena.
        arenaRightDown = {x = 32342, y = 31939, z = 7}  -- Posição do canto inferior direito  da arena.
    },
    lifeColor = { -- cores do outfit
        [1] = 94, -- red
        [2] = 77, -- orange
        [3] = 79  -- yellow
    },
    timeInMinutes = {
        closeTP = 1 -- Tempo em que o TP fechará após o evento ser anunciado.
    }
}

-- == [ RECOMENDO NÃO MEXER NAS FUNÇÕES ABAIXO ] == --

-- Responsável por inserir o jogador como um participante do evento.
function insertPlayerInSafeZone(playerId)
    local query = db.query or db.executeQuery
    query("INSERT INTO safezone_participants (cid, life) VALUES ('"..playerId.."', 3) LIMIT 1")
end

-- Retorna a quantidade de jogadores que estão participando do evento.
function totalPlayersInSafeZone()
    local queryResult = db.storeQuery("SELECT COUNT(id) as total FROM safezone_participants")
    return result.getDataInt(queryResult, "total")
end

-- Retorna todos os "cid" dos jogadores que estão participando do evento.
function getPlayersIdInSafeZone() 
    local queryResult = db.storeQuery("SELECT cid FROM safezone_participants")
    local players = {}
    if not queryResult then
        return players
    else
        table.insert(players, result.getDataInt(queryResult, "cid"))
        while result.next(queryResult) do
          local result = result.getDataInt(queryResult, "cid")
          table.insert(players, result)
        end
        return players
    end
end

 

 

 

data > globalevents > globalevents.xml

 

Spoiler

<!-- SafeZone -->
<globalevent name="safeZone" interval="60000" event="script" value="safeZoneEvent.lua"/>

 

 

 

em data > globalevents > scripts > crie um arquivo chamado safeZoneEvent.lua

 

Spoiler

--[[
    Evento criado por LuanLuciano93 e Movie (Movie#4361)
--]]

function onThink(interval)

	local hrs = tostring(os.date("%X")):sub(1, 5)

	if SAFEZONE_CONFIG.days[os.date("%A")] and isInArray(SAFEZONE_CONFIG.days[os.date("%A")], hrs) then

		local from = SAFEZONE_CONFIG.position.arenaLeftTop
		local to   = SAFEZONE_CONFIG.position.arenaRightDown

		-- função para converter minutos em milissegundos
		function minutesToMillis(minutes)
			return minutes * 1000 * 60
		end

		-- responsável por atualizar o outfit do jogador de acordo com a quantidade vidas restantes.
		function changeOutfitLifeInSafeZone(playerId, qntLife)
			local color  = SAFEZONE_CONFIG.lifeColor[qntLife]
			local outfit = getPlayerSex(playerId) == 0 and 136 or 128
							  
			local conditionOutfitLife = createConditionObject(CONDITION_OUTFIT)
			setConditionParam(conditionOutfitLife, CONDITION_PARAM_TICKS, -1)
			addOutfitCondition(conditionOutfitLife, {lookType = outfit, lookHead = color, lookBody = color, lookLegs = color, lookFeet = color})
			doAddCondition(playerId, conditionOutfitLife)
		end

		
		-- Remove uma vida do jogador, se ele não tiver mais vidas, é removido do evento.
		function removeLifePlayerInSafeZone(playerId)
			local lifePlayer = getPlayerLifeInSafeZone(playerId) - 1
			if lifePlayer >= 1 then
				changeOutfitLifeInSafeZone(playerId, lifePlayer)
				db.executeQuery("UPDATE safezone_participants SET life = life - 1 WHERE cid = " ..playerId.. " LIMIT 1")
			else
				removePlayerInSafeZone(playerId)
			end
		end

		-- Retorna a quantidade de pisos que serão criados na rodada.
		function totalProtectionTileInSafeZone()
			local totalPlayers = totalPlayersInSafeZone()
			if totalPlayers >= 10 then
				return totalPlayers - 3
			else
				return totalPlayers - 1
			end
		end

		-- Remove um jogador do evento.
		function removePlayerInSafeZone(playerId) 
			if checkToRewardPlayerInSafeZone(playerId, totalPlayersInSafeZone()) then
				db.query("DELETE FROM safezone_participants WHERE cid = '"..playerId.."' LIMIT 1")
				doTeleportThing(playerId, SAFEZONE_CONFIG.position.leaveEvent, true)
				checkAndSetWinnerInSafeZone()
				doRemoveCondition(playerId, CONDITION_OUTFIT)
				return true
			end
		end

		-- Verifica se o jogador ficou em "primeiro", "segundo" ou "terceiro" lugador.
		-- Se sim, receberá as recompensas correspondentes a sua colocação.
		function checkToRewardPlayerInSafeZone(playerId, placement)
			if placement > 0 and placement <= 3 then

				if placement > 1 then
					local placementName = (placement == 2) and "segundo" or "terceiro"
		
					local broadcast = string.gsub(SAFEZONE_CONFIG.broadcast.winner, "|playerName|", getCreatureName(playerId))
					local broadcast = string.gsub(broadcast, "|position|", placementName)
					doBroadcastMessage(SAFEZONE_CONFIG.broadcast.prefix.." "..broadcast)
					insertWinnerInSafeZone(playerId, placement)
				end
		
				local bagReward = doCreateItemEx(1992)
				for _, reward in pairs(SAFEZONE_CONFIG.reward[placement]) do
					doAddContainerItemEx(bagReward, doCreateItemEx(reward[1], reward[2]))
				end
				doPlayerAddItemEx(playerId, bagReward)

			end
			return true
		end

		-- Responsável por verificar se o evento possui um vencedor do primeiro lugar.
		function checkAndSetWinnerInSafeZone()
			if totalPlayersInSafeZone() == 1 then
				local playerId = selectWinnerInSafeZone()
				doBroadcastMessage(SAFEZONE_CONFIG.broadcast.prefix.." "..string.gsub(SAFEZONE_CONFIG.broadcast.finish, "|playerName|", getCreatureName(playerId)))
				insertWinnerInSafeZone(playerId, 1)
				removePlayerInSafeZone(playerId)
			end
		end

		-- Responsável por inserir o jogador vencedor na tabela.
		function insertWinnerInSafeZone(playerId, placement)
			local date  = os.date("%Y-%m-%d %H:%M:%S")
			local query = db.query or db.executeQuery
			db.executeQuery("INSERT INTO safezone_winners (player_id, placement, date) VALUES ('"..getPlayerGUID(playerId).."', '"..tonumber(placement).."', '"..date.."') LIMIT 1")
			return true
		end

		-- Responsável por selecionar o jogador, vencedor do evento.
		function selectWinnerInSafeZone()
			local queryResult = db.storeQuery("SELECT cid FROM safezone_participants LIMIT 1")
			return result.getDataInt(queryResult, "cid")
		end

		-- Responsável por retornar a quantidade de vidas restantes de um jogador.
		function getPlayerLifeInSafeZone(playerId) 
			local queryResult = db.storeQuery("SELECT life FROM safezone_participants WHERE cid = '"..playerId.."' LIMIT 1")
			return (queryResult) and result.getDataInt(queryResult, "life") or 0
		end

		-- Remove todos os jogadores do evento.
		-- Utilizado em caso de não houver jogadores suficientes para começar o evento.
		function removeAllPlayersInSafeZone() 
			for _, playerId in pairs(getPlayersIdInSafeZone()) do
				doTeleportThing(playerId, SAFEZONE_CONFIG.position.leaveEvent, true)
			end
			db.query("DELETE FROM safezone_participants")
		end

		-- Atualiza os outfits de todos os participantes de acordo com a vida inicial "3".
		function changeOutfitStartInSafeZone()
			for _, playerId in pairs(getPlayersIdInSafeZone()) do
				changeOutfitLifeInSafeZone(playerId, 3)
			end
		end

		-- Responsável por verificar se o jogador está ou não pisando no protection tile.
		function moveToEventSafeTile(playerId, tileID)
			local tilePlayer = getTileItemById(getCreaturePosition(playerId), tileID)
			if tilePlayer.actionid ~= SAFEZONE_CONFIG.tileActionId then
			  removeLifePlayerInSafeZone(playerId)
			end
		end
		
		-- Responsável por criar o efeito em área somente aonde não tiver os protection tile.
		function createEffectAreaInSafeZone(playerId, tileID)
			for x = from.x, to.x do
			for y = from.y, to.y do
			for z = from.z, to.z do
				pos = {x = x, y = y, z = z, stackpos = 253}
				local effect = (getTileItemById(pos, tileID).actionid == SAFEZONE_CONFIG.tileActionId) and "" or doSendMagicEffect(pos, CONST_ME_SMALLPLANTS)
			end
			end
			end
			 moveToEventSafeTile(playerId, tileID)
		  end		

		-- Responsável por remover todos os protections tiles da arena.
		function removeProtectTilesInSafeZone(tileID, positionTile)
			local tile = getTileItemById(positionTile, tileID)
			if tile.uid > 0 then
				doRemoveItem(tile.uid, 1)
			end
		end

		-- Responsável por criar novos protections tiles em posições aleatorias da arena.
		function createProtectTileInSafeZone()
			local randomTileId = SAFEZONE_CONFIG.protectionTileId[math.random(1, #SAFEZONE_CONFIG.protectionTileId)]
			for i, playerId in pairs(getPlayersIdInSafeZone()) do
				local randomPositionTile = {x=math.random(from.x,to.x), y=math.random(from.y,to.y), z=math.random(from.z,to.z)}
				doItemSetAttribute(doCreateItem(randomTileId, 1, randomPositionTile), "aid", SAFEZONE_CONFIG.tileActionId)
				if i >= totalPlayersInSafeZone() then
					doRemoveItem(getTileItemById(randomPositionTile, randomTileId).uid)
				end
				addEvent(createEffectAreaInSafeZone, 8700, playerId, randomTileId)
				addEvent(removeProtectTilesInSafeZone, 9000, randomTileId, randomPositionTile)
			end
			addEvent(createProtectTileInSafeZone, 16000)
		end
			
		-- responsável por verificar se há ou não jogadores suficientes para começar.
		function checkToStartSafeZone()
			doRemoveItem(getTileItemById(SAFEZONE_CONFIG.position.openTeleport, 1387).uid)
			
			if totalPlayersInSafeZone() >= SAFEZONE_CONFIG.minPlayers then
				doBroadcastMessage(SAFEZONE_CONFIG.broadcast.prefix.." "..string.gsub(SAFEZONE_CONFIG.broadcast.start, "|totalParticipants|", totalPlayersInSafeZone()))
				changeOutfitStartInSafeZone()
				addEvent(createProtectTileInSafeZone, 10000)
			else
				removeAllPlayersInSafeZone()
				doBroadcastMessage(SAFEZONE_CONFIG.broadcast.prefix.." "..SAFEZONE_CONFIG.broadcast.noParticipants)
			end
		end

		-- abre o teleport do evento.
		function openTeleportInSafeZone()
			local openTeleport = doCreateItem(1387, 1, SAFEZONE_CONFIG.position.openTeleport)
			doItemSetAttribute(openTeleport, "aid", 6925)
			doBroadcastMessage(SAFEZONE_CONFIG.broadcast.prefix.." "..string.gsub(SAFEZONE_CONFIG.broadcast.open, "|minutesToStart|", SAFEZONE_CONFIG.timeInMinutes.closeTP))
			addEvent(checkToStartSafeZone, minutesToMillis(SAFEZONE_CONFIG.timeInMinutes.closeTP))
		end
		
		openTeleportInSafeZone()
	end
	return true
end

 

 

 

data > movements > movements.xml

 

Spoiler

<!-- SafeZone -->
<movevent type="StepIn" actionid="6925" event="script" value="safeZoneMovement.lua"/>

 

 

 

em data > movements > scripts > crie um arquivo chamado safeZoneMovement.lua

 

Spoiler

--[[
    Evento criado por LuanLuciano93 e Movie (Movie#4361)
--]]

function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor)

    -- Verifica se o jogador possui o level minimo para participar do evento.
    if getPlayerLevel(cid) < SAFEZONE_CONFIG.levelMin then
        doPlayerSendCancel(cid, SAFEZONE_CONFIG.broadcast.prefix.." Voce precisa ser level "..SAFEZONE_CONFIG.levelMin.." ou maior para entrar no evento.")
        doTeleportThing(cid, fromPosition, true)
        doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
        return true
    end

    -- Verifica se o limite máximo de jogadores foi ultrapassado.
    if totalPlayersInSafeZone() == SAFEZONE_CONFIG.maxPlayers then
        doPlayerSendCancel(cid, SAFEZONE_CONFIG.broadcast.prefix.." o evento alcancou o limite maximo de jogadores.")
        doTeleportThing(cid, fromPosition, true)
        doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
        return true
    end

    -- Se o jogador estiver usando "stealth ring" não poderá entrar no evento.
    local ring = getPlayerSlotItem(cid, CONST_SLOT_RING)
    if ring and ring.itemid == 2202 then
      doPlayerSendCancel(cid, SAFEZONE_CONFIG.broadcast.prefix.." Voce nao pode entrar com um stealth ring no evento.")
      doTeleportThing(cid, fromPosition, true)
      doSendMagicEffect(getCreaturePosition(cid), CONST_ME_POFF)
      return true
  end

    doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, SAFEZONE_CONFIG.broadcast.prefix.." Voce entrou no evento. Boa sorte!")
    doTeleportThing(cid, SAFEZONE_CONFIG.position.arenaCenter, true)
    doSendMagicEffect(getCreaturePosition(cid), CONST_ME_TELEPORT)
    insertPlayerInSafeZone(cid)

  return true
end

 

 

 

por fim, vá até o banco de dados do seu servidor e adicione o seguinte código em "SQL"

 

Spoiler

CREATE TABLE safezone_participants (
  id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  cid varchar(255) NOT NULL,
  life tinyint(1) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;


CREATE TABLE safezone_winners (
  id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
  player_id INT(11) NOT NULL,
  placement TINYINT(1) NOT NULL,
  date DATETIME NOT NULL
) CHARSET=utf8mb4;

 

 

É isso! Espero ter ajudado o pessoal do TFS 0.4 :)

Link para o post
Compartilhar em outros sites
  • 4 months later...

Quando um player tenta entrar no evento da esse erro:

Spoiler

mysql_real_query(): INSERT INTO safezone_participants (cid, life) VALUES ('268453441', 3) LIMIT 1 - MYSQL ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'LIMIT 1' at line 1 (1064)



Consegue dar suporte?

Edit: Consegui arrumar o problema retirando o LIMIT 1 do final da linha, e adicionei `safezone_participants` e `safezone_winners` em todos as menções do mesmo em que se encontravam como safezone_participants e safezone_winners.

Editado por King Laker
Achei o problema e o corrigi. (veja o histórico de edições)

VlVKQKC.png&key=d5c17620ae9567a1f898dd7a

 

 

 

  • 532144234_Logo_NTO_BLOOD_Finish_HIM_By_Antonio_Luckas(3).png.fd58d1af125a7e82ccdd751637e9ca93.png
Link para o post
Compartilhar em outros sites
21 horas atrás, King Laker disse:

Quando um player tenta entrar no evento da esse erro:

  Ocultar conteúdo

mysql_real_query(): INSERT INTO safezone_participants (cid, life) VALUES ('268453441', 3) LIMIT 1 - MYSQL ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'LIMIT 1' at line 1 (1064)



Consegue dar suporte?

Edit: Consegui arrumar o problema retirando o LIMIT 1 do final da linha, e adicionei `safezone_participants` e `safezone_winners` em todos as menções do mesmo em que se encontravam como safezone_participants e safezone_winners.

 

retira o limit 1 que deve funcionar.

Link para o post
Compartilhar em outros sites
Em 19/08/2023 em 19:43, Celulose disse:

 

retira o limit 1 que deve funcionar.

Eu ja tinha resolvido o problema, inclusive adicionei um comentário em como resolvi.

VlVKQKC.png&key=d5c17620ae9567a1f898dd7a

 

 

 

  • 532144234_Logo_NTO_BLOOD_Finish_HIM_By_Antonio_Luckas(3).png.fd58d1af125a7e82ccdd751637e9ca93.png
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 Imperius
      O propósito é criar uma nova função em creaturescripts que será acionada toda vez que um novo report (CTRL + R) for aberto.
       
      Eu implementei para enviar uma notificação no grupo do Telegram, contendo os dados do report.
       
      Isso garantirá que os GMs tenham acesso aos reports dos jogadores mesmo quando não estiverem logados, e também evitará que algum report seja perdido caso o jogador saia do servidor.
      A parte do Telegram é apenas um exemplo. Você pode ajustar o script para executar outras ações desejadas.
       
      creatureevent.cpp:
      Dentro deste arquivo, localize a função:
       
      uint32_t CreatureEvent::executeChannelLeave(Player* player, uint16_t channelId, UsersMap usersMap)  
      abaixo dela, adicione:
       
      uint32_t CreatureEvent::executeOpenRuleViolation(Player* player, std::string message) { if (!m_interface->reserveEnv()) { std::clog << "[Error - CreatureEvent::executeOpenRuleViolation] Call stack overflow." << std::endl; return 0; } ScriptEnviroment* env = m_interface->getEnv(); env->setScriptId(m_scriptId, m_interface); lua_State* L = m_interface->getState(); m_interface->pushFunction(m_scriptId); lua_pushnumber(L, env->addThing(player)); lua_pushstring(L, message.c_str()); bool result = m_interface->callFunction(2); m_interface->releaseEnv(); return result; }  
      Após, procure por:
       
      std::string CreatureEvent::getScriptEventName() const  
      abaixo de:
       
      case CREATURE_EVENT_CHANNEL_LEAVE: return "onLeaveChannel";  
      adicione:
       
      case CREATURE_EVENT_OPEN_RULE_VIOLATION: return "onOpenRuleViolation";  
      Agora, procure por:
       
      std::string CreatureEvent::getScriptEventParams() const  
      abaixo de:
       
      case CREATURE_EVENT_CHANNEL_LEAVE: return "cid, channel, users";  
      adicione:
       
      case CREATURE_EVENT_OPEN_RULE_VIOLATION: return "cid, message";  
      Procure por:
       
      bool CreatureEvent::configureEvent(xmlNodePtr p)  
      abaixo de:
       
      else if(tmpStr == "leavechannel") m_type = CREATURE_EVENT_CHANNEL_LEAVE;  
      adicione:
       
      else if(tmpStr == "openruleviolation") m_type = CREATURE_EVENT_OPEN_RULE_VIOLATION;  
       
      creatureevent.h:
      Dentro deste arquivo, localize:
       
      enum CreatureEventType_t  
      adicione "CREATURE_EVENT_OPEN_RULE_VIOLATION" como o último item de enum CreatureEventType_t
       
      Exemplo:
       
      enum CreatureEventType_t { // ... CREATURE_EVENT_OPEN_RULE_VIOLATION };  
      Agora, procure por:
       
      uint32_t executeChannelLeave(Player* player, uint16_t channelId, UsersMap usersMap);  
      abaixo dela, adicione:
       
      uint32_t executeOpenRuleViolation(Player* player, std::string message);  
      game.cpp:
      Dentro deste arquivo, localize:
       
      bool Game::playerReportRuleViolation(Player* player, const std::string& text)  
      e substitua por:
       
      bool Game::playerReportRuleViolation(Player* player, const std::string& text) { //Do not allow reports on multiclones worlds since reports are name-based if(g_config.getNumber(ConfigManager::ALLOW_CLONES)) { player->sendTextMessage(MSG_INFO_DESCR, "Rule violation reports are disabled."); return false; } cancelRuleViolation(player); boost::shared_ptr<RuleViolation> rvr(new RuleViolation(player, text, time(NULL))); ruleViolations[player->getID()] = rvr; ChatChannel* channel = g_chat.getChannelById(CHANNEL_RVR); if(!channel) return false; for(UsersMap::const_iterator it = channel->getUsers().begin(); it != channel->getUsers().end(); ++it) it->second->sendToChannel(player, SPEAK_RVR_CHANNEL, text, CHANNEL_RVR, rvr->time); CreatureEventList joinEvents = player->getCreatureEvents(CREATURE_EVENT_OPEN_RULE_VIOLATION); for(CreatureEventList::iterator it = joinEvents.begin(); it != joinEvents.end(); ++it) (*it)->executeOpenRuleViolation(player, text); return true; }  
      Agora é só compilar a source.
       
      depois em "data > creaturescripts > creaturescripts.xml", adicione:
       
      <event type="login" name="loginNotifyRuleViolation" script="notifyRuleViolation.lua"/> <event type="openruleviolation" name="openNotifyRuleViolation" script="notifyRuleViolation.lua"/>  
      em "data > creaturescripts > scripts", crie um arquivo notifyRuleViolation.lua e adicione:
       
      function onOpenRuleViolation(cid, message) local config = { token = "", -- Token do seu BOT no Telegram chatId = "" -- ID do chat do Telegram que será enviado a notificação. } local message = "Player: "..getCreatureName(cid).."\n\nReport:\n"..message.."" message = string.gsub(message, "\n", "%%0A") local url = "https://api.telegram.org/bot"..config.token.."/sendMessage" local data = "chat_id="..config.chatId.."&text="..message.."" local curl = io.popen('curl -d "'..data..'" "'..url..'"'):read("*a") return true end function onLogin(cid) registerCreatureEvent(cid, "openNotifyRuleViolation") return true end  
       
      Demonstração:
      1. Jogador abre um novo report (CTRL + R)

      2. notifyRuleViolation.lua, definido em creaturescripts.xml, é acionado para enviar uma notificação ao grupo do Telegram.
       

       
    • Por Imperius
      Olá, pessoal! Acabei encontrando um script que tinha feito a um tempo atrás. Estou compartilhando aqui para quem quiser usar ou melhorar.
       
      É bem parecido com os outros sistemas de roleta, igual deste tópico: https://tibiaking.com/forums/topic/101557-action-cassino-roleta-de-items/
       
      Como funciona?
       
      O "Treasure Chest" é um item custom, onde o jogador têm a possibilidade de ganhar itens raros ou bem meia boca. Tudo dependerá da sorte.
       
      O jogador precisa tacar o treasure chest na bancada e acionar a alavanca. O treasure chest irá se transformar em vários itens de forma randômica no qual o jogador poderá ou não ganhar. No final, apenas um item é entregue ao jogador.
       
      Para entender melhor o seu funcionamento, segue o GIF abaixo:
       

       
       
      em data > actions > actions.xml
       
       
      em data > actions > scripts > crie um arquivo chamado leverTreasureChest.lua
       
       
      no banco de dados do servidor, adicione o seguinte código em "SQL":
       
       
       

      Também estou disponibilizando uma página PHP, para quem quiser usar no site do servidor. Na página tem informações sobre o funcionamento, quais são os possíveis prêmios e a lista de jogadores que ganharam os itens raros.
       

       
       
      Espero ter ajudado de alguma forma! : )
       
      treasure_chest.php
    • Por ILex WilL
      Olá, Alguém poderia me ajudar com uns Scripts? nem que seja cobrando, dependendo eu pago para me ajudar...
    • Por Diego Rosa
      Bom Dia, Alguem Poderia me Ajudar a Coloca a Caveira da Guild war em Um Evento de PVP. Quando vc Entra no Evento tem o Time Azul Vs Time Vermelho
      ex: Time azul Cai com a caverinha azul, e Time Vermelho cai com a Caverinha Vermelha
      Quando Entra no Evento Fica Assim
      Queria que Ficasse Assim 
      Alguem Poderia me da Uma Ajuda?
       
       
      Script (TVT
       
      Vai Na Pasta Lib e Copia o Script BattleLib.lua
       
      2- Vai Na Pasta Globalevents e Cole o Script TVTEvent
       
      3- Registrando em GlobalEvents.xml
      4- Agora em Movements Cole o Script BattleMovements
      5- Registrando em Movimentes.xml
       
    • Por marvadon
      Bom Dia pessoal do TK
       
      estou com problemas com o npc xodet.
      ele não entrega e nem vende a wand of dragonbreath, aparece na lista de compra mas não ocorre nehuma ação referente a entrega e cobrança de gold.
       
      todos os outros itens ele entrega normalmente.
       
      alguém poderia me ajudar.
       
       
      Obrigado
      local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end local shopModule = ShopModule:new() npcHandler:addModule(shopModule) shopModule:addBuyableItem({'spellbook'}, 2175, 150, 1, 'spellbook') shopModule:addBuyableItem({'small health'}, 8704, 20, 1, 'small health potion') shopModule:addBuyableItem({'health potion'}, 7618, 45, 1, 'health potion') shopModule:addBuyableItem({'mana potion'}, 7620, 50, 1, 'mana potion') shopModule:addBuyableItem({'strong health'}, 7588, 100, 1, 'strong health potion') shopModule:addBuyableItem({'strong mana'}, 7589, 80, 1, 'strong mana potion') shopModule:addBuyableItem({'great health'}, 7591, 190, 1, 'great health potion') shopModule:addBuyableItem({'great mana'}, 7590, 120, 1, 'great mana potion') shopModule:addBuyableItem({'great spirit'}, 8472, 190, 1, 'great spirit potion') shopModule:addBuyableItem({'ultimate health'}, 8473, 310, 1, 'ultimate health potion') shopModule:addSellableItem({'normal potion flask', 'normal flask'}, 7636, 5, 'empty small potion flask') shopModule:addSellableItem({'strong potion flask', 'strong flask'}, 7634, 10, 'empty strong potion flask') shopModule:addSellableItem({'great potion flask', 'great flask'}, 7635, 15, 'empty great potion flask') shopModule:addBuyableItem({'instense healing'}, 2265, 95, 1, 'intense healing rune') shopModule:addBuyableItem({'ultimate healing'}, 2273, 100, 1, 'ultimate healing rune') shopModule:addBuyableItem({'fire bomb'}, 2305, 117, 1, 'fire bomb') shopModule:addBuyableItem({'destroy field'}, 2261, 15, 1, 'destroy field rune') shopModule:addBuyableItem({'light magic missile'}, 2287, 4, 1, 'light magic missile rune') shopModule:addBuyableItem({'heavy magic missile'}, 2311, 12, 1, 'heavy magic missile rune') shopModule:addBuyableItem({'great fireball'}, 2304, 45, 1, 'great fireball rune') shopModule:addBuyableItem({'explosion'}, 2313, 31, 1, 'explosion rune') shopModule:addBuyableItem({'sudden death'}, 2268, 40, 1, 'sudden death rune') shopModule:addBuyableItem({'convince creature'}, 2290, 80, 1, 'convince creature rune') shopModule:addBuyableItem({'chameleon'}, 2291, 210, 1, 'chameleon rune') shopModule:addBuyableItem({'desintegrate'}, 2310, 80, 1, 'desintegreate rune') shopModule:addBuyableItem({'fire field'}, 2301, 28, 1, 'fire field rune') shopModule:addBuyableItem({'energy field'}, 2301, 38, 1, 'energy field rune') shopModule:addBuyableItem({'avalanche rune'}, 2274, 45, 1, 'avalanche rune') shopModule:addBuyableItem({'antidote rune'}, 2266, 65, 1, 'antidote rune') shopModule:addBuyableItem({'energy wall'}, 2279, 85, 1, 'energy wall rune') shopModule:addBuyableItem({'icicle'}, 2271, 30, 1, 'icicle rune') shopModule:addBuyableItem({'magic wall rune'}, 2293, 30, 1, 'magic wall rune') shopModule:addBuyableItem({'wild growth rune'}, 2269, 15, 1, 'wild growth rune') shopModule:addBuyableItem({'poison field'}, 2285, 21, 1, 'poison field rune') shopModule:addBuyableItem({'poison wall'}, 2289, 52, 1, 'poison wall rune') shopModule:addBuyableItem({'blank'}, 2260, 10, 1, 'blank rune') shopModule:addBuyableItem({'paralyze rune'}, 2278, 5, 1, 'paralyze rune') shopModule:addBuyableItem({'fire ball'}, 2302, 30, 1, 'fire ball rune') shopModule:addBuyableItem({'wand of vortex', 'vortex'}, 2190, 500, 'wand of vortex') shopModule:addBuyableItem({'wand of dragonbreath', 'dragonbreath'}, 2191, 1000, 1, 'wand of dragonbreath') shopModule:addBuyableItem({'wand of decay', 'decay'}, 2188, 5000, 'wand of decay') shopModule:addBuyableItem({'wand of draconia', 'draconia'}, 8921, 7500, 'wand of draconia') shopModule:addBuyableItem({'wand of cosmic energy', 'cosmic energy'}, 2189, 10000, 'wand of cosmic energy') shopModule:addBuyableItem({'wand of inferno', 'inferno'}, 2187, 15000, 'wand of inferno') shopModule:addBuyableItem({'wand of starstorm', 'starstorm'}, 8920, 18000, 'wand of starstorm') shopModule:addBuyableItem({'wand of voodoo', 'voodoo'}, 8922, 22000, 'wand of voodoo') shopModule:addSellableItem({'normal potion flask', 'normal flask'}, 7636, 5, 'empty small potion flask') shopModule:addSellableItem({'strong potion flask', 'strong flask'}, 7634, 10, 'empty strong potion flask') shopModule:addSellableItem({'great potion flask', 'great flask'}, 7635, 15, 'empty great potion flask') shopModule:addSellableItem({'wand of vortex', 'vortex'}, 2190, 250, 'wand of vortex') shopModule:addSellableItem({'wand of dragonbreath', 'dragonbreath'}, 2191, 500, 'wand of dragonbreath') shopModule:addSellableItem({'wand of decay', 'decay'}, 2188, 2500, 'wand of decay') shopModule:addSellableItem({'wand of draconia', 'draconia'}, 8921, 3750, 'wand of draconia') shopModule:addSellableItem({'wand of cosmic energy', 'cosmic energy'}, 2189, 5000, 'wand of cosmic energy') shopModule:addSellableItem({'wand of inferno', 'inferno'},2187, 7500, 'wand of inferno') shopModule:addSellableItem({'wand of starstorm', 'starstorm'}, 8920, 9000, 'wand of starstorm') shopModule:addSellableItem({'wand of voodoo', 'voodoo'}, 8922, 11000, 'wand of voodoo') shopModule:addSellableItem({'snakebite rod', 'snakebite'}, 2182, 250, 1, 'snakebite rod') shopModule:addSellableItem({'moonlight rod', 'moonlight'}, 2186, 500, 1, 'moonlight rod') shopModule:addSellableItem({'necrotic rod', 'necrotic'}, 2185, 2500, 1, 'necrotic rod') shopModule:addSellableItem({'northwind rod', 'northwind'}, 8911, 3750, 1, 'northwind rod') shopModule:addSellableItem({'terra rod', 'terra'}, 2181, 5000, 1, 'terra rod') shopModule:addSellableItem({'hailstorm rod', 'hailstorm'}, 2183, 7500, 1, 'hailstorm rod') shopModule:addSellableItem({'springsprout rod', 'springsprout'}, 8912, 9000, 1, 'springsprout rod') shopModule:addSellableItem({'underworld rod', 'underworld'}, 8910, 11000, 1, 'underworld rod') shopModule:addBuyableItem({'snakebite rod', 'snakebite'}, 2182, 500, 'snakebite rod') shopModule:addBuyableItem({'moonlight rod', 'moonlight'}, 2186, 1000, 'moonlight rod') shopModule:addBuyableItem({'necrotic rod', 'necrotic'}, 2185, 5000, 'necrotic rod') shopModule:addBuyableItem({'northwind rod', 'northwind'}, 8911, 7500, 'northwind rod') shopModule:addBuyableItem({'terra rod', 'terra'}, 2181, 10000, 'terra rod') shopModule:addBuyableItem({'hailstorm rod', 'hailstorm'}, 2183, 15000, 'hailstorm rod') shopModule:addBuyableItem({'springsprout rod', 'springsprout'}, 8912, 18000, 'springsprout rod') shopModule:addBuyableItem({'underworld rod', 'underworld'}, 8910, 22000, 'underworld rod') npcHandler:addModule(FocusModule:new())
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo