Ir para conteúdo
  • Cadastre-se

Posts Recomendados

Hoje estarei postando 3 scripts diferentes onde ao clicar na alavanca o player pode comprar itens. Antes que perguntem são 3 scripts porque o funcionamento é diferente, andei pesquisando bastante e perguntando a alguns no TibiaKing e vi que muitos disseram que era fácil, mas apenas dois conseguiram me ajudar. Um foi o @Lyu que explicou um detalhe de como "puxar" a charges para o item do items.xml ao invés de configurar no próprio script. Já o restante dos scripts foram desenvolvidos pelo @luanluciano93
 

Neste primeiro script é possível comprar uma quantidade de itens (count), que vão vir dentro de um container (containerId) e caso eles tenham "charges", a carga que o item virá é a que está configurada no items.xml

local items = {
    [1520] = {containerId = 2003, itemId = 2197, count = 20, price = 100000}, -- stone skin amulet
    [1521] = {containerId = 1992, itemId = 2164, count = 8, price = 40000}, -- might ring
    [1522] = {containerId = 1996, itemId = 2169, count = 8, price = 16000}, -- time ring
    [1523] = {containerId = 1991, itemId = 2167, count = 8, price = 16000}, -- energy ring
    [1524] = {containerId = 1993, itemId = 2214, count = 8, price = 16000} -- ring of healing
}
 
function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    local tabela = items[item.actionid]
    if not tabela then
        return false
    end
 
    local itemTypeContainer = ItemType(tabela.containerId)
    local itemTypeItem = ItemType(tabela.itemId)
    local containerWeight = itemTypeContainer:getWeight()
    local itemWeight = itemTypeItem:getWeight()
    local playerCap = player:getFreeCapacity()
    local totalWeight = (containerWeight + (itemWeight * tabela.count))
 
    if playerCap < totalWeight then
        itemWeight = itemWeight / 100
        player:sendTextMessage(MESSAGE_STATUS_CONSOLE_RED, "You have found a " .. itemTypeContainer:getName() .. " with " .. tabela.count .. " " .. itemTypeItem:getName() .. " weighing " .. totalWeight .. " oz it's too heavy.")
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
 
    local backpack = player:getSlotItem(CONST_SLOT_BACKPACK)
    if not backpack or backpack:getEmptySlots(false) < 1 then
        player:sendTextMessage(MESSAGE_STATUS_CONSOLE_RED, "Your main backpack is full. You need to free up 1 available slots.")
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
 
    local container = Game.createItem(tabela.containerId)
 
    if not container then
        return false
    end
 
    for i = 1, tabela.count do
        local itemContainer = Game.createItem(tabela.itemId)
        if itemTypeItem:getCharges() > 0 then
            itemContainer:setAttribute(ITEM_ATTRIBUTE_CHARGES, itemTypeItem:getCharges())
        end
        container:addItemEx(itemContainer)
    end
 
    if not container then
        return false
    end
 
    if player:getTotalMoney() > tabela.price then
        if player:removeTotalMoney(tabela.price) and player:addItemEx(container) then
            player:getPosition():sendMagicEffect(CONST_ME_DRAWBLOOD)
        end
    else        
        player:sendTextMessage(MESSAGE_STATUS_CONSOLE_RED, "You don't have ".. tabela.price .." gold coins to buy a ".. itemTypeContainer:getName() .." with ".. tabela.count .." ".. itemTypeItem:getName() ..".")
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
    end 
 
    item:transform(item.itemid == 1945 and 1946 or 1945)
 
    return true
end

 

Nesse segundo script, é possível comprar itens soltos (sem estar dentro de containers) mas que podem ser agrupados, como por exemplo, potions

local potions = {
	[1515] = {id = 7620, charges = 100, value = 5600}, -- mana potion
	[1516] = {id = 7589, charges = 100, value = 9300}, -- strong mana potion
	[1517] = {id = 7590, charges = 100, value = 14400}, -- great mana potion
	[1518] = {id = 8472, charges = 100, value = 22800}, -- spirit potion	
	[1519] = {id = 8473, charges = 100, value = 37900}, -- ultimate health potion
}

function onUse(player, item, fromPosition, target, toPosition, isHotkey)
	local potion = potions[item.actionid]
	if not potion then
		return false
	end

	local potionId = ItemType(potion.id)
	local itemWeight = potionId:getWeight() * potion.charges
	if player:getFreeCapacity() >= itemWeight then
		if not player:removeMoney(potion.value) then
			player:sendCancelMessage("You don't have ".. potion.value .." gold coins to buy ".. potion.charges .." ".. potionId:getName() ..".")
		else
			player:getPosition():sendMagicEffect(CONST_ME_DRAWBLOOD)
			player:addItem(potion.id, potion.charges)
		end
		
	else
		player:sendCancelMessage("You don't have capacity.")
		player:getPosition():sendMagicEffect(CONST_ME_POFF)
	end

	item:transform(item.itemid == 1945 and 1946 or 1945)
	return true
end

 

Nesse terceiro script, é possivel comprar apenas um item solto, não estacavel e sem charges, como uma wand, axe, etcs..

local items = {
    [2378] = {itemId = 2197, price = 100000}, -- battle axe
}
 
function onUse(player, item, fromPosition, target, toPosition, isHotkey)
    local tabela = items[item.actionid]
    if not tabela then
        return false
    end
 
    local itemTypeItem = ItemType(tabela.itemId)
    local itemWeight = itemTypeItem:getWeight()
    local playerCap = player:getFreeCapacity()
    if playerCap < itemWeight then
        itemWeight = itemWeight / 100
        player:sendTextMessage(MESSAGE_STATUS_CONSOLE_RED, "You have found a " .. itemTypeItem:getName() .. " weighing " .. itemWeight .. " oz it's too heavy.")
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
 
    local backpack = player:getSlotItem(CONST_SLOT_BACKPACK)
    if not backpack or backpack:getEmptySlots(false) < 1 then
        player:sendTextMessage(MESSAGE_STATUS_CONSOLE_RED, "Your main backpack is full. You need to free up 1 available slots.")
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
        return false
    end
 
    local itemAdd = Game.createItem(tabela.itemId)
    if not itemAdd then
        return false
    end
 
    if player:getTotalMoney() > tabela.price then
        if player:removeTotalMoney(tabela.price) and player:addItemEx(itemAdd) then
            player:getPosition():sendMagicEffect(CONST_ME_DRAWBLOOD)
        end
    else        
        player:sendTextMessage(MESSAGE_STATUS_CONSOLE_RED, "You don't have ".. tabela.price .." gold coins to buy a ".. itemTypeItem:getName() ..".")
        player:getPosition():sendMagicEffect(CONST_ME_POFF)
    end 
 
    item:transform(item.itemid == 1945 and 1946 or 1945)
 
    return true
end

 

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

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 PokemonXdemon
      [Quest System]
       
       
      Estava ontem analisando minha base, aonde tinha várias quests em arquivos separados.
      Então, pq não organizar tudo em apenas um arquivo exemplo:
      Então fiz esse script, meio simples mas útil para organizar tudo.
       
       
      Agora vamos entender oq precisamos fazer!
       
       Uma pequena atualização,  agora fica em um lugar separado a configuração para ficar mais  fácil modificar.
      Agora pode adicionar o boost que voce deseja no pokemon.
       
      Bem é isso.
    • Por Anderson Sacani
      Venho publicar uma alteração que eu e minha equipe fizemos no script já existente do Canary.
      O arquivo do script se chama quest_system1.lua.
      Fizemos essa alteração, porque o sistema original não entregava chave com actionid ao jogador. A chave vinha com o código 0000, ou seja, não abria nenhuma porta.
      A alteração que fizemos foi justamente para arrumar esse bug, por tanto, agora quando o quest ter uma chave com actionid dentro do baú, o jogador receberá essa mesma chave com o actionid definido.
       
      local specialQuests = { -- {x = 32752, y = 32343, z = 14} [52167] = Storage.DreamersChallenge.Reward, -- {x = 32806, y = 32230, z = 11} [52003] = Storage.PitsOfInferno.WeaponReward, -- {x = 32311, y = 32211, z = 8} [51400] = Storage.ThievesGuild.Reward, [51324] = Storage.WrathoftheEmperor.mainReward, -- {x = 32232, y = 31066, z = 7} [51715] = Storage.SvargrondArena.RewardGreenhorn, -- {x = 32232, y = 31059, z = 7} [51716] = Storage.SvargrondArena.RewardScrapper, -- {x = 32232, y = 31052, z = 7} [51717] = Storage.SvargrondArena.RewardWarlord } local questsExperience = { [3101] = 1 -- dummy values } local questLog = { [8213] = Storage.HiddenCityOfBeregar.DefaultStart } local tutorialIds = { [50080] = 5, [50082] = 6, [50084] = 10, [50086] = 11 } local hotaQuest = { 50950, 50951, 50952, 50953, 50954, 50955 } local questSystem1 = Action() function questSystem1.onUse(player, item, fromPosition, target, toPosition, isHotkey) local storage = specialQuests[item.actionid] if not storage then storage = item.uid if storage > 65535 then return false end end if storage == 23644 or storage == 24632 or storage == 14338 then player:setStorageValue(Storage.SvargrondArena.PitDoor, -1) end if player:getStorageValue(storage) > 0 and player:getAccountType() < ACCOUNT_TYPE_GOD then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'The ' .. ItemType(item.itemid):getName() .. ' is empty.') return true end local function copyContainer(originalContainer, newContainer) for i = 0, originalContainer:getSize() - 1 do local originalItem = originalContainer:getItem(i) local newItem = Game.createItem(originalItem.itemid, originalItem.type) newItem:setActionId(originalItem:getActionId()) newItem:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, originalItem:getAttribute(ITEM_ATTRIBUTE_DESCRIPTION)) if originalItem:isContainer() then copyContainer(Container(originalItem.uid), Container(newItem.uid)) end newContainer:addItemEx(newItem) end end local items, reward = {} local size = item:isContainer() and item:getSize() or 0 if size == 0 then local actionId = item:getActionId() reward = Game.createItem(item.itemid, item.type) reward:setActionId(actionId) reward:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, item:getAttribute(ITEM_ATTRIBUTE_DESCRIPTION)) else local container = Container(item.uid) for i = 0, container:getSize() - 1 do local originalItem = container:getItem(i) local newItem = Game.createItem(originalItem.itemid, originalItem.type) newItem:setActionId(originalItem:getActionId()) newItem:setAttribute(ITEM_ATTRIBUTE_DESCRIPTION, originalItem:getAttribute(ITEM_ATTRIBUTE_DESCRIPTION)) if originalItem:isContainer() then copyContainer(Container(originalItem.uid), Container(newItem.uid)) end items[#items + 1] = newItem end if size == 1 then reward = items[1] end end local result = '' if reward then local ret = ItemType(reward.itemid) if ret:isRune() then result = ret:getArticle() .. ' ' .. ret:getName() .. ' (' .. reward.type .. ' charges)' elseif ret:isStackable() and reward:getCount() > 1 then result = reward:getCount() .. ' ' .. ret:getPluralName() elseif ret:getArticle() ~= '' then result = ret:getArticle() .. ' ' .. ret:getName() else result = ret:getName() end else if size > 20 then reward = Game.createItem(item.itemid, 1) elseif size > 8 then reward = Game.createItem(2854, 1) else reward = Game.createItem(2853, 1) end for i = 1, size do local tmp = items[i] if reward:addItemEx(tmp) ~= RETURNVALUE_NOERROR then Spdlog.warn("[questSystem1.onUse] - Could not add quest reward to container") end end local ret = ItemType(reward.itemid) result = ret:getArticle() .. ' ' .. ret:getName() end if player:addItemEx(reward) ~= RETURNVALUE_NOERROR then local weight = reward:getWeight() if player:getFreeCapacity() < weight then player:sendCancelMessage(string.format('You have found %s weighing %.2f oz. You have no capacity.', result, (weight / 100))) else player:sendCancelMessage('You have found ' .. result .. ', but you have no room to take it.') end return true end if questsExperience[storage] then player:addExperience(questsExperience[storage], true) end if questLog[storage] then player:setStorageValue(questLog[storage], 1) end if tutorialIds[storage] then player:sendTutorial(tutorialIds[storage]) if item.uid == 50080 then player:setStorageValue(Storage.RookgaardTutorialIsland.SantiagoNpcGreetStorage, 3) end end if isInArray(hotaQuest, item.uid) then if player:getStorageValue(Storage.TheAncientTombs.DefaultStart) ~= 1 then player:setStorageValue(Storage.TheAncientTombs.DefaultStart, 1) end end player:sendTextMessage(MESSAGE_EVENT_ADVANCE, 'You have found ' .. result .. '.') player:setStorageValue(storage, 1) return true end for index, value in pairs(specialQuests) do questSystem1:aid(index) end questSystem1:aid(2000) questSystem1:register()  
    • Por Anderson Sacani
      local config = { scrollId = 14758, premiumDays = 30, } local days = config.premiumDays local premiumScroll = Action() function premiumScroll.onUse(player, item, fromPosition, target, toPosition, isHotkey) player:addPremiumDays(days) player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "Voce recebeu " .. days .. " dias de conta premium.") item:remove(1) addEvent(function() if player:isPlayer() then player:sendTextMessage(MESSAGE_EVENT_ADVANCE, "No total voce tem " .. player:getPremiumDays() .. " dias de conta premium.") end end, 2500) return true end premiumScroll:id(config.scrollId) premiumScroll:register() Percebi que alguns servidores estão vindo sem o script do premium scroll, então criei esse script para adicionar 30 dias de premium na conta do jogador que usar o premium scroll.
    • Por amoxicilina
      Action: Remover skull
       
       
    • Por ArielZeRah
      Salve, gostaria de ajuda com Função Outfits.gif em meu SCRIPT de Characters.PHP, Função que eu quero é seguinte vou deixar videio.gif abaixo pra mas informação!

      Vou deixar meu Characters.php
      characters.php 
       
      ABS; Acho que linha em questão pra editar é essa abaixo vou deixar em spooler!
       
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo