Ir para conteúdo
  • Cadastre-se

Posts Recomendados

  • Administrador
Em 11/11/2023 em 14:51, Eazy E Mapp disse:

El enlace  -  DESCARGAR LIBS Y APLICACIÓN EXE x64 - rev79  está fuera de línea, ¿pueden agregarlo nuevamente para descargar y probar este servidor?

@luanluciano93

Link para o post
Compartilhar em outros sites
  • Respostas 128
  • Created
  • Última resposta

Top Posters In This Topic

Top Posters In This Topic

Popular Posts

STYLLER OT - 2023 - TFS 1.5 (8.60)   Olá pessoal, hoje venho apresentar meu projeto open para vocês. Sou muito fã do mapa STYLLER, sempre em horas vagas procurava joga-lo, para quem não conhece: é um servidor estilo baiak com mais RPG, e como tenho me interessado pelas engines 1.X, resolvi criar um projeto de servidor Styller usando o TFS 1.5 para versão 8.60. O projeto está sendo desenvolvido no github (projeto github) onde posto atualizações diárias (changelog). Vocês podem postar dú

Se tiver erros é só mandar aqui que resolvo! E se quiser contribuir com o projeto com novas áreas ou scripts é só mandar pra mim ou fazer um PULL REQUEST pelo github.

voce provavelmente criou um char com group id 6, porem a acc também deve ter o type 6 ... https://github.com/luanluciano93/styller/blob/master/schema.sql#L6

Posted Images

Projeto atualizado, mudança na engine (código fonte) e adicionado ao projeto as libs e exe para quem usa em windows.

Editado por luanluciano93 (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • luanluciano93 mudou o título para [TFS 1.5 - 8.60] STYLLER OT - 2023
3 horas atrás, luanluciano93 disse:

Projeto atualizado, mudança na engine (código fonte) e adicionado ao projeto as libs e exe para quem usa em windows.

 

Link da Engine está indo pra do Nekiro e não da MillhioreBT.

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

Olá luciano, estou usando seu servidor como base para o meu, fui colocar ele online agora para testar o mapa que estou trabalhando e encontrei alguns erros, consegue me ajudar?? Estou utilizando a nova base da Milhiore

 


Lua Script Error: [CreatureScript Interface]
data/creaturescripts/scripts/login.lua:onLogin
data/lib/core/player.lua:341: attempt to index a nil value (global 'ExperienceRateType')
stack traceback:
        [C]: in metamethod 'index'
        data/lib/core/player.lua:341: in method 'updateStamina'
        data/creaturescripts/scripts/login.lua:28: in function <data/creaturescripts/scripts/login.lua:1>


segue abaixo o player.lua

 

local foodCondition = Condition(CONDITION_REGENERATION, CONDITIONID_DEFAULT)

function Player.feed(self, food)
	local condition = self:getCondition(CONDITION_REGENERATION, CONDITIONID_DEFAULT)
	if condition then
		condition:setTicks(condition:getTicks() + (food * 1000))
	else
		local vocation = self:getVocation()
		if not vocation then return nil end

		foodCondition:setTicks(food * 1000)
		foodCondition:setParameter(CONDITION_PARAM_HEALTHGAIN, vocation:getHealthGainAmount())
		foodCondition:setParameter(CONDITION_PARAM_HEALTHTICKS, vocation:getHealthGainTicks() * 1000)
		foodCondition:setParameter(CONDITION_PARAM_MANAGAIN, vocation:getManaGainAmount())
		foodCondition:setParameter(CONDITION_PARAM_MANATICKS, vocation:getManaGainTicks() * 1000)

		self:addCondition(foodCondition)
	end
	return true
end

function Player.getClosestFreePosition(self, position, extended)
	if self:getGroup():getAccess() and self:getAccountType() >= ACCOUNT_TYPE_GOD then return position end
	return Creature.getClosestFreePosition(self, position, extended)
end

function Player.getDepotItems(self, depotId)
	return self:getDepotChest(depotId, true):getItemHoldingCount()
end

function Player.hasFlag(self, flag) return self:getGroup():hasFlag(flag) end

function Player.getLossPercent(self)
	local blessings = 0
	local lossPercent = {[0] = 100, [1] = 70, [2] = 45, [3] = 25, [4] = 10, [5] = 0}

	for i = 1, 5 do if self:hasBlessing(i) then blessings = blessings + 1 end end
	return lossPercent[blessings]
end

function Player.getPremiumTime(self) return math.max(0, self:getPremiumEndsAt() - os.time()) end

function Player.setPremiumTime(self, seconds)
	self:setPremiumEndsAt(os.time() + seconds)
	return true
end

function Player.addPremiumTime(self, seconds)
	self:setPremiumTime(self:getPremiumTime() + seconds)
	return true
end

function Player.removePremiumTime(self, seconds)
	local currentTime = self:getPremiumTime()
	if currentTime < seconds then return false end

	self:setPremiumTime(currentTime - seconds)
	return true
end

function Player.getPremiumDays(self) return math.floor(self:getPremiumTime() / 86400) end

function Player.addPremiumDays(self, days) return self:addPremiumTime(days * 86400) end

function Player.removePremiumDays(self, days) return self:removePremiumTime(days * 86400) end

function Player.isPremium(self)
	return self:getPremiumTime() > 0 or configManager.getBoolean(configKeys.FREE_PREMIUM) or
		       self:hasFlag(PlayerFlag_IsAlwaysPremium)
end

---@param message string|number
function Player.sendCancelMessage(self, message)
	if type(message) == "number" then message = Game.getReturnMessage(message) end
	return self:sendTextMessage(MESSAGE_STATUS_SMALL, message)
end

function Player.isUsingOtClient(self) return self:getClient().os >= CLIENTOS_OTCLIENT_LINUX end

function Player.sendExtendedOpcode(self, opcode, buffer)
	if not self:isUsingOtcV8() then return false end

	local networkMessage<close> = NetworkMessage()
	networkMessage:addByte(0x32)
	networkMessage:addByte(opcode)
	networkMessage:addString(buffer)
	networkMessage:sendToPlayer(self)
	return true
end

-- Always pass the number through the isValidMoney function first before using the transferMoneyTo
function Player.transferMoneyTo(self, target, amount)
	if not target then return false end

	-- See if you can afford this transfer
	local balance = self:getBankBalance()
	if amount > balance then return false end

	-- See if player is online
	local targetPlayer = Player(target.guid)
	if targetPlayer then
		targetPlayer:setBankBalance(targetPlayer:getBankBalance() + amount)
	else
		db.query("UPDATE `players` SET `balance` = `balance` + " .. amount .. " WHERE `id` = '" ..
			         target.guid .. "'")
	end

	self:setBankBalance(self:getBankBalance() - amount)
	return true
end

function Player.canCarryMoney(self, amount)
	-- Anyone can carry as much imaginary money as they desire
	if amount == 0 then return true end

	-- The 3 below loops will populate these local variables
	local totalWeight = 0
	local inventorySlots = 0

	local currencyItems = Game.getCurrencyItems()
	for index = #currencyItems, 1, -1 do
		local currency = currencyItems[index]
		-- Add currency coins to totalWeight and inventorySlots
		local worth = currency:getWorth()
		local currencyCoins = math.floor(amount / worth)
		if currencyCoins > 0 then
			amount = amount - (currencyCoins * worth)
			while currencyCoins > 0 do
				local count = math.min(100, currencyCoins)
				totalWeight = totalWeight + currency:getWeight(count)
				currencyCoins = currencyCoins - count
				inventorySlots = inventorySlots + 1
			end
		end
	end

	-- If player don't have enough capacity to carry this money
	if self:getFreeCapacity() < totalWeight then return false end

	-- If player don't have enough available inventory slots to carry this money
	local backpack = self:getSlotItem(CONST_SLOT_BACKPACK) --[[@as Container]]
	if not backpack or backpack:getEmptySlots(true) < inventorySlots then return false end
	return true
end

function Player.withdrawMoney(self, amount)
	local balance = self:getBankBalance()
	if amount > balance or not self:addMoney(amount) then return false end

	self:setBankBalance(balance - amount)
	return true
end

function Player.depositMoney(self, amount)
	if not self:removeMoney(amount) then return false end

	self:setBankBalance(self:getBankBalance() + amount)
	return true
end

function Player.removeTotalMoney(self, amount)
	local moneyCount = self:getMoney()
	local bankCount = self:getBankBalance()
	if amount <= moneyCount then
		self:removeMoney(amount)
		return true
	elseif amount <= (moneyCount + bankCount) then
		if moneyCount ~= 0 then
			self:removeMoney(moneyCount)
			local remains = amount - moneyCount
			self:setBankBalance(bankCount - remains)
			self:sendTextMessage(MESSAGE_INFO_DESCR,
			                     ("Paid %d from inventory and %d gold from bank account. Your account balance is now %d gold."):format(
				                     moneyCount, amount - moneyCount, self:getBankBalance()))
			return true
		else
			self:setBankBalance(bankCount - amount)
			self:sendTextMessage(MESSAGE_INFO_DESCR,
			                     ("Paid %d gold from bank account. Your account balance is now %d gold."):format(
				                     amount, self:getBankBalance()))
			return true
		end
	end
	return false
end

function Player.addLevel(self, amount, round)
	round = round or false
	local level, amount = self:getLevel(), amount or 1
	if amount > 0 then
		return self:addExperience(Game.getExperienceForLevel(level + amount) -
			                          (round and self:getExperience() or Game.getExperienceForLevel(level)))
	else
		return self:removeExperience(
			       ((round and self:getExperience() or Game.getExperienceForLevel(level)) -
				       Game.getExperienceForLevel(level + amount)))
	end
end

function Player.addMagicLevel(self, value)
	local currentMagLevel = self:getBaseMagicLevel()
	local sum = 0

	if value > 0 then
		while value > 0 do
			sum = sum + self:getVocation():getRequiredManaSpent(currentMagLevel + value)
			value = value - 1
		end

		return self:addManaSpent(sum - self:getManaSpent())
	else
		value = math.min(currentMagLevel, math.abs(value))
		while value > 0 do
			sum = sum + self:getVocation():getRequiredManaSpent(currentMagLevel - value + 1)
			value = value - 1
		end

		return self:removeManaSpent(sum + self:getManaSpent())
	end
end

function Player.addSkillLevel(self, skillId, value)
	local currentSkillLevel = self:getSkillLevel(skillId)
	local sum = 0

	if value > 0 then
		while value > 0 do
			sum = sum + self:getVocation():getRequiredSkillTries(skillId, currentSkillLevel + value)
			value = value - 1
		end

		return self:addSkillTries(skillId, sum - self:getSkillTries(skillId))
	else
		value = math.min(currentSkillLevel, math.abs(value))
		while value > 0 do
			sum = sum + self:getVocation():getRequiredSkillTries(skillId, currentSkillLevel - value + 1)
			value = value - 1
		end

		return self:removeSkillTries(skillId, sum + self:getSkillTries(skillId), true)
	end
end

function Player.addSkill(self, skillId, value, round)
	if skillId == SKILL_LEVEL then
		return self:addLevel(value, round or false)
	elseif skillId == SKILL_MAGLEVEL then
		return self:addMagicLevel(value)
	end
	return self:addSkillLevel(skillId, value)
end

function Player.getWeaponType(self)
	local weapon = self:getSlotItem(CONST_SLOT_LEFT)
	if weapon then return weapon:getType():getWeaponType() end
	return WEAPON_NONE
end

function Player.addTibiaCoins(self, tibiaCoins)
	return self:setTibiaCoins(self:getTibiaCoins() + tibiaCoins)
end

function Player.removeTibiaCoins(self, removeCoins)
	local tibiaCoins = self:getTibiaCoins()
	if tibiaCoins < removeCoins then return false end
	return self:setTibiaCoins(tibiaCoins - removeCoins)
end

function Player.sendWorldLight(self, color, level)
	local msg<close> = NetworkMessage()
	msg:addByte(0x82)
	msg:addByte(self:getGroup():getAccess() and 0xFF or level)
	msg:addByte(color)
	msg:sendToPlayer(self)
	return true
end

function Player.sendWorldTime(self, time)
	if self:getClient().version < 1272 then return false end
	local msg<close> = NetworkMessage()
	msg:addByte(0xEF)
	msg:addByte(time / 60) -- hour
	msg:addByte(time % 60) -- min
	msg:sendToPlayer(self)
	return true
end

function Player.setExhaustion(self, key, milliseconds)
	return self:setStorageValue(key, os.mtime() + milliseconds)
end

function Player.getExhaustion(self, key)
	local milliseconds = self:getStorageValue(key)
	if not milliseconds then return 0 end
	return math.max(0, os.mtime() - milliseconds)
end

function Player.hasExhaustion(self, key) return self:getExhaustion(key) > 0 end

---@param type ExperienceRateType
---@param value integer
function Player:addExperienceRate(type, value)
	return self:setExperienceRate(type, self:getExperienceRate(type) + value)
end

do
	if not nextUseStaminaTime then nextUseStaminaTime = {} end

	local function useStamina(player)
		local staminaMinutes = player:getStamina()
		if staminaMinutes == 0 then return end

		local playerId = player:getId()
		if not nextUseStaminaTime[playerId] then nextUseStaminaTime[playerId] = 0 end

		local currentTime = os.time()
		local timePassed = currentTime - nextUseStaminaTime[playerId]
		if timePassed <= 0 then return end

		if timePassed > 60 then
			if staminaMinutes > 2 then
				staminaMinutes = staminaMinutes - 2
			else
				staminaMinutes = 0
			end
			nextUseStaminaTime[playerId] = currentTime + 120
		else
			staminaMinutes = staminaMinutes - 1
			nextUseStaminaTime[playerId] = currentTime + 60
		end
		player:setStamina(math.floor(staminaMinutes))
	end

	function Player:updateStamina()
		if not configManager.getBoolean(configKeys.STAMINA_SYSTEM) then return false end

		useStamina(self)

		local staminaMinutes = self:getStamina()
		if staminaMinutes > 2400 and self:isPremium() then
			self:setExperienceRate(ExperienceRateType.STAMINA, 150)
		elseif staminaMinutes <= 840 then
			self:setExperienceRate(ExperienceRateType.STAMINA, 100)
		end
		return true
	end
end


e o login.lua

 

function onLogin(player)
	local serverName = configManager.getString(configKeys.SERVER_NAME)
	local loginStr = "Welcome to " .. serverName .. "!"
	if player:getLastLoginSaved() <= 0 then
		loginStr = loginStr .. " Please choose your outfit."
		player:sendOutfitWindow()
	else
		loginStr = string.format("Your last visit in %s: %s.", serverName,
		                         os.date("%d %b %Y %X", player:getLastLoginSaved()))
	end
	player:sendTextMessage(MESSAGE_STATUS_DEFAULT, loginStr)

	-- Promotion
	local vocation = player:getVocation()
	local promotion = vocation:getPromotion()
	if player:isPremium() then
		local value = player:getStorageValue(PlayerStorageKeys.promotion)
		if value and value == 1 then player:setVocation(promotion) end
	elseif not promotion then
		player:setVocation(vocation:getDemotion())
	end

	-- Events
	player:registerEvent("PlayerDeath")
	player:registerEvent("DropLoot")

	-- Update Experience Rate Stamina
	player:updateStamina()
	return true
end

 

Editado por denysmenetix (veja o histórico de edições)
Link para o post
Compartilhar em outros sites
  • Under featured e pinned this tópico

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 MasterteoxBr
      Vi muita gente vendendo essa base então resolvi postar ela aqui.
       
      Alguns sistemas que o ot possuí:
       » CastSystem com xp;
       » WarSystem;
       » RaidSystem;
       » BattleField;
       » Snowball;
       » Campo Minado;
       » Castle 24hrs;
       » Offline Trainers;
       » Sala de Trainers;
       » Stamina Refil;
       » Itens Donate;

      Algumas Prints:




      Download:
      Google Drive: Clique aqui.
      Mega: Clique aqui.
      Mediafire: Clique aqui.
      Scan do .exe:
      Clique aqui.
       
      Créditos:
      Não faço ideia de quem seja o dono/desenvolvedor mas creio que seja esses dois
      order-global e removido
    • Por Deletera
      Atenção! Os arquivos disponibilizados abaixo são da versão 12.64!
      Para obter otserv 12.64+ atualizado com novas áreas e novos gráficos acesse o github oficial do projeto OTX: https://github.com/opentibiabr/otservbr-global
       
      Servidor feito especialmente para jogadores que gostam do Tibia Oldstyle,
      mas colocado na versao 12 com novas funcionalidades, mounts, outfits e itens.  
       
      Todos Outfits sao frees & Addons coletando itens
       
      PVP clássico, old school times
       
      Spells adaptadas a versao 8.60
       
      Mais de 50 quests na Teleport Room
       
      Tasks e Missions para explorar o mapa
       
      Raids automáticas com novos bosses
       
      Reward System desabilitado, loot tradicional (bem melhor assim, certo?)
       
      Áreas custom e inovadoras como Hogwarts
       
      Em resumo, o OT busca ser simples, resgatando a naturalidade do que era o baiak da versão 8.60 em 2009, mas com implementações 12x+
       
      ◄IMAGENS►
      ◄DATAPACK & DLLS►
      » OTX Baiak Styller 12.64 MediaFire (Scan)
       » OtservBR Dlls & Executável (Windows 64x)
      (Antes de rodar o OT verifique de usar a mesma database e configurar o login no config.lua)
       
      ◄CLIENTS►
      » Tibia Client 12.64 MediaFire (Scan)
      (Para conectar ao cliente 12 (localhost), acesse usando 127.0.0.1_client.exe, localizado na pasta bin.)
       
      ◄WEB►
      » [GesiorAcc] para Tibia 12.64 MediaFire (Scan)
      Instale o XAMP para rodar com a data base e site disponíveis
      (não se esquece de alterar o login e senha no config.lua, para o atual a senha do mysql está como "XIPA2")
       
      » [Data base] acc/email e senha: god/god MediaFire (Scan)
      O OT está configurado para aceitar acc no lugar de email (opcional) para usar as acc de testes é senha 123123
       
      ◄Créditos►
      Waldir Teixeira (Saruman/Deletera) &
       
    • Por .HuRRiKaNe
      Informações:
      Alissow 0.4.1;
      12 Armas Novas;
      3 Runas Novas;
      Now Ring;
      25 Outfits (Todas mudam a cor);
      Novos Monstros;
      Templo Editado;
      5 Quests Novas;
      Vocações Equilibradas;
      Novo Set;
      Imagens:


      Download:
      http://www.4shared.c...nowserv_v1.html
      Scan:
      https://www.virustot...sis/1358425217/
      Créditos:
      Subwat
      Afeez
      Delaks
      marciks
      Kung San
      Animal Pak
       
    • Por Mateus Robeerto
      Vi que muitas pessoas estão reclamando e que não funciona, bugs, erros no console, etc. Então, resolvi baixar a base do Thunder feita por MovieBr, atualizei do TFS 1.3 para o TFS 1.5 e corrigi cerca de 80% dos problemas. No entanto, ainda não consigo encontrar alguns bugs. Quem encontrar os bugs pode me relatar pelo Discord: 82mateusroberto. Dependendo do meu dia, pode levar alguns dias para eu responder e corrigir ou não. Acredito que vocês conseguem corrigir os erros, apenas precisam aprender a consertá-los. Não é difícil. Aproveitem para usar como base do seu mapa ou mesmo do projeto Thunder futuramente! Seguem as imagens que mostram a implementação de montaria e modal widow.
       
      Obs: Alguns mapas/cavernas podem estar vazios por falta de adição. Eu não tinha boas ideias para adicionar, mas vocês podem adicionar ao seu gosto. Tenham uma boa utilização e sucesso com o projeto no futuro!
       
      https://www.mediafire.com/file/0jtn2slt2j67666/baiakthunder-master.rar/file
      https://www.mediafire.com/file/bougg0q6dlpu2fq/tfs+1.5+source.rar/file
      https://www.mediafire.com/file/yq1s63xo6np9v53/860.rar/file
       
      Este servidor só usa o OtClient. Abra o arquivo otclient/modules/game_feature/feature.lua e procure por esta linha.
      if (versão >= 860) then adicione abaixo e salve.. pronto
      g_game.enableFeature(GamePlayerMounts)  
       
      Aqui estão os GIFs
      https://imgur.com/UGdQoSS
      https://imgur.com/OwJ4hpp
      https://imgur.com/7sN1MaJ
       
       
       
      Para quem deseja usar uma gamestore personalizada, há uma disponível para TFS 1.5 e 8.6. Já a compartilhei há alguns dias. Dê uma olhada aqui.
       
       
    • Por Mateus Robeerto
      Este sistema é baseado em Reward Chests. Confira o Tibia Wiki para saber mais sobre como funciona. É simples!
       
       
      Em relação à Reward, ela será enviada para o depósito designado. Basta localizar a linha 'depotId' e especificar o numero que você deseja enviar para a cidade correspondente; isso garantirá a entrega direta ao depósito. Por exemplo, atribuir o número 1 para a cidade principal e 2 para Thais, e assim por diante, facilita esse processo.
      Confira o GIF aqui, basta clicar para ver.
      https://imgur.com/wNtfnS4
       
      Este script está configurado para ativar um temporizador de 5 minutos após a expiração, removendo automaticamente o Reward Chest Id 21584. Caso deseje estender a duração ou ajustá-la com base nas diretrizes do Tibia Wiki, ele oferece versatilidade. Este sistema é particularmente adequado para salas de chefes onde a derrota do chefe resulta na transformação de seu cadáver no RewardChestId. Os jogadores interagem com ele e, após um período designado, o baú se dissipa.
       
      Quando você mata o chefe, ele morre e se transforma em um Baú de Recompensa com ID 21584.

      Siga o guia de instalação passo a passo fornecido aqui.
       
      Registre o evento no arquivo XML do monstro fornecido:  <script> <event name="BossDeath"/> </script> Defina o cadáver do chefe como 0, caso contrário você receberá uma mensagem de loot adicional.  
      <look type="201" corpse="0" />  
      Este é o RevScripts. Coloque o script em qualquer lugar na pasta data/scripts, seja em uma subpasta ou em sua localização preferida.
      local bossesList = { { name = "Orshabaal", storage = 6655, expirationTime = 5 * 60, loot = { {item = 2160, count = 5, chance = 100000}, {item = 2494, count = 1, chance = 50000}, }, RewardChestId = 21584, depotID = 1 }, { name = "Cave Rat", storage = 6656, expirationTime = 5 * 60, loot = { {item = 2160, count = 10, chance = 100000}, {item = 2498, count = 1, chance = 75000}, }, RewardChestId = 21584, depotID = 1 }, -- Add more bosses as needed } local STORAGE_KEYS = { bossData = "boss_data", } local function createRewardChest(bossPosition, rewardChestId, expirationTime) local rewardItem = Game.createItem(rewardChestId, 1, bossPosition) if rewardItem then rewardItem:setAttribute(ITEM_ATTRIBUTE_ACTIONID, ACTION_ID) addEvent(function() if rewardItem and rewardItem:getPosition() then rewardItem:remove() local players = Game.getPlayers() for _, player in ipairs(players) do player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "The reward chest has disappeared!") end end end, expirationTime * 1000) else print("Error creating reward chest.") end end local function hasRewardExpired(player, storageKey) local expirationTime = player:getStorageValue(storageKey) return expirationTime ~= -1 and expirationTime <= os.time() end local creatureEvent = CreatureEvent("BossDeath") function creatureEvent.onDeath(creature, corpse) local bossPosition = creature:getPosition() local rewardChestId = 0 local depotID = 0 local bossName = "" for _, boss in ipairs(bossesList) do if creature:getName():lower() == boss.name:lower() then rewardChestId = boss.RewardChestId depotID = boss.depotID bossName = boss.name break end end if rewardChestId ~= 0 then createRewardChest(bossPosition, rewardChestId, bossesList[1].expirationTime) creature:say("The reward chest will disappear in 5 minutes!", TALKTYPE_MONSTER_SAY) else print("Reward chest ID not found.") end for _, player in ipairs(Game.getPlayers()) do if player:isPlayer() then for _, boss in ipairs(bossesList) do if creature:getName():lower() == boss.name:lower() then player:setStorageValue(boss.storage, 1) local expirationTime = os.time() + boss.expirationTime player:setStorageValue(STORAGE_KEYS.bossData, expirationTime) local message = "You contributed to defeating " .. boss.name .. ". Now go to the chest to claim your reward! Expiration time: " .. os.date("%c", expirationTime) player:sendTextMessage(MESSAGE_EVENT_ADVANCE, message) end end end end end creatureEvent:register() local function sendRewardMessage(player, bossName, receivedItems) local message if #receivedItems > 0 then message = "From " .. bossName .. ": " .. table.concat(receivedItems, ", ") player:sendTextMessage(MESSAGE_EVENT_ADVANCE, message) player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your reward has been sent to your depot.") else message = "From " .. bossName .. ": Unfortunately, you did not receive any items." player:sendTextMessage(MESSAGE_EVENT_ADVANCE, message) end end local rewardAction = Action() function rewardAction.onUse(player, item, fromPosition, target, toPosition, isHotkey) if not player or not player:isPlayer() or not item then return false end local depotID = 0 for _, boss in ipairs(bossesList) do if item:getId() == boss.RewardChestId and player:getStorageValue(boss.storage) == 1 then depotID = boss.depotID local storageKey = "boss_reward_time" if hasRewardExpired(player, storageKey) then player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, "Your reward from " .. boss.name .. " has expired.") else local depot = player:getDepotChest(depotID, true) -- Using depotID from the boss configuration if not depot then return false end local bag = depot:addItem(7343, 1) if not bag then print("Failed to add the reward bag to the player's depot.") return false end local receivedItems = {} for _, lootItem in ipairs(boss.loot) do if math.random(100000) <= lootItem.chance then local itemAdded = bag:addItem(lootItem.item, lootItem.count or 1) if itemAdded then local itemName = ItemType(lootItem.item):getPluralName() or ItemType(lootItem.item):getName() table.insert(receivedItems, (lootItem.count or 1) .. "x " .. itemName) end end end sendRewardMessage(player, boss.name, receivedItems) end player:setStorageValue(boss.storage, 0) player:setStorageValue(storageKey, -1) break end end return true end rewardAction:aid(ACTION_ID) rewardAction:register()  
       
      Este script é a segunda versão.
      No Baú de Recompensa (por exemplo, no templo ou na sala do chefe), você deve configurá-lo usando o ID de Ação conforme mostrado na imagem.

       
      Confira o GIF aqui, basta clicar para ver.
      https://imgur.com/B9EezSM
      O indivíduo que infligiu o maior dano e outro que infligiu uma quantidade menor ambos recebem uma recompensa. Por outro lado, aqueles que não contribuíram com nenhum dano não recebem nenhuma recompensa. Este sistema opera de forma direta. Espero que você tenha achado esta explicação satisfatória.
      data/scripts.
      -- Define a table listing the bosses and their respective properties local bossesList = { { name = "Orshabaal", storage = 6655, expirationTime = 7 * 24 * 60 * 60, -- 7 days loot = { {item = 2160, count = 5, chance = 100000}, -- 100% chance {item = 2494, count = 1, chance = 50000}, -- 50% chance }, rewardChestId = 21584, -- Reward chest ID depotId = 1, -- Depot ID of the main city where the items will be sent }, { name = "Cave Rat", storage = 6656, expirationTime = 7 * 24 * 60 * 60, loot = { {item = 2160, count = 10, chance = 100000}, -- 100% chance {item = 2498, count = 1, chance = 75000}, -- 75% chance }, rewardChestId = 21584, -- Reward chest ID depotId = 1, -- Depot ID of the main city where the items will be sent }, -- Add more bosses as needed } local ACTION_ID = 2550 -- You need to open the RME Editor and set it to 2550, then save. local STORAGE_KEYS = { bossData = "boss_data" } -- Function to check if a reward has expired local function hasRewardExpired(player, storageKey) local expirationTime = player:getStorageValue(storageKey) return expirationTime ~= -1 and expirationTime <= os.time() end local creatureEvent = CreatureEvent("BossDeath") function creatureEvent.onDeath(creature, corpse, killer, mostDamageKiller) if killer and killer:isPlayer() then local creatureName = creature:getName():lower() for _, boss in ipairs(bossesList) do if creatureName == boss.name:lower() then -- Set reward data for the killer killer:setStorageValue(boss.storage, 1) local expirationTime = os.time() + boss.expirationTime killer:setStorageValue(STORAGE_KEYS.bossData, expirationTime) local message = "You contributed to defeating " .. boss.name .. ". Now go to the chest to claim your reward! Expiration time: " .. os.date("%c", expirationTime) killer:sendTextMessage(MESSAGE_EVENT_ADVANCE, message) -- Check if there's a most damage killer if mostDamageKiller and mostDamageKiller:isPlayer() and mostDamageKiller:getId() ~= killer:getId() then mostDamageKiller:setStorageValue(boss.storage, 1) mostDamageKiller:setStorageValue(STORAGE_KEYS.bossData, expirationTime) local messageMostDamage = "You dealt the most damage to " .. boss.name .. ". Now go to the chest to claim your reward! Expiration time: " .. os.date("%c", expirationTime) mostDamageKiller:sendTextMessage(MESSAGE_EVENT_ADVANCE, messageMostDamage) end break end end end end creatureEvent:register() -- Function to send reward message to player local function sendRewardMessage(player, bossName, receivedItems) if #receivedItems > 0 then local message = "From " .. bossName .. ": " .. table.concat(receivedItems, ", ") player:sendTextMessage(MESSAGE_EVENT_ADVANCE, message) player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your reward has been sent to your depot.") else local message = "From " .. bossName .. ": Unfortunately, you did not receive any items." player:sendTextMessage(MESSAGE_EVENT_ADVANCE, message) end end local rewardAction = Action() function rewardAction.onUse(player, item, fromPosition, target, toPosition, isHotkey) if not player or not player:isPlayer() or not item then return false end local rewardsClaimed = false for _, boss in ipairs(bossesList) do if item:getId() == boss.rewardChestId and player:getStorageValue(boss.storage) == 1 then local storageKey = STORAGE_KEYS.bossData if hasRewardExpired(player, storageKey) then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Your reward from " .. boss.name .. " has expired.") else local depot = player:getDepotChest(boss.depotId, true) if not depot then return false end local bag = depot:addItem(7343, 1) if not bag then print("Failed to add the reward bag to the player's depot.") return false end local receivedItems = {} for _, lootItem in ipairs(boss.loot) do if math.random(100000) <= lootItem.chance then local itemAdded = bag:addItem(lootItem.item, lootItem.count or 1) if itemAdded then local itemName = ItemType(lootItem.item):getPluralName() or ItemType(lootItem.item):getName() table.insert(receivedItems, (lootItem.count or 1) .. "x " .. itemName) end end end if #receivedItems > 0 then sendRewardMessage(player, boss.name, receivedItems) player:setStorageValue(boss.storage, 0) player:setStorageValue(storageKey, -1) rewardsClaimed = true else player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You did not receive any items from " .. boss.name .. ".") end end end end if not rewardsClaimed then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "You need to defeat the corresponding boss first to receive the reward.") return false end return true end rewardAction:aid(ACTION_ID) rewardAction:register() O que eu fiz foi reescrever o script do zero, créditos para mim mesmo. Espero que gostem deste conteúdo!  
  • Estatísticas dos Fóruns

    96843
    Tópicos
    519594
    Posts



×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo