Ir para conteúdo
  • Cadastre-se

Wakon

Héroi
  • Total de itens

    3181
  • Registro em

  • Última visita

  • Dias Ganhos

    26

Histórico de Curtidas

  1. Curtir
    Wakon recebeu reputação de Celulose em (Resolvido)Creature not found Magia   
    @Dragon Ball Hiper, você adicionou check nas funções onCastSpell e os addEvent estão chamando as funções "sew", e essas funções não tem o check, por isso está dando erro.
     
  2. Gostei
    Wakon deu reputação a Yota em [C ]Level System in monster [0.3.6]   
    Boa noite, venho compartilhar o código feito por @Oneshot/ @Garou, com adaptação para tfs 0.3.6 (854) por mim. Bem, ele postou para atfs 0.4 (860), dai eu só mexi em umas linhas parar funcionar no tfs 0.3.6(854), dai vou compartilhar com vocês.
    Com o monster level system, o monstro passa a ter level e ganha mais HP, dá mais dano, tem mais defesa, dependendo dele. monsters.h
    procure por:
    bool isSummonable, isIllusionable, isConvinceable, isAttackable, isHostile, isLureable, isWalkable, canPushItems, canPushCreatures, pushable, hideName, hideHealth; Substitua por:
    bool isSummonable, isIllusionable, isConvinceable, isAttackable, isHostile, isLureable, isWalkable, canPushItems, canPushCreatures, pushable, hideName, hideHealth, hideLevel; Procure por:
    int32_t defense, armor, health, healthMax, baseSpeed, lookCorpse, corpseUnique, corpseAction, maxSummons, targetDistance, runAwayHealth, conditionImmunities, damageImmunities, lightLevel, lightColor, changeTargetSpeed, changeTargetChance; Substitua por:
    int32_t defense, armor, health, healthMax, baseSpeed, lookCorpse, corpseUnique, corpseAction, maxSummons, targetDistance, runAwayHealth, conditionImmunities, damageImmunities, lightLevel, lightColor, changeTargetSpeed, changeTargetChance, levelMin, levelMax; monsters.cpp
     
    Procure por:
    canPushItems = canPushCreatures = isSummonable = isIllusionable = isConvinceable = isLureable = isWalkable = hideName = hideHealth = false; Substitua por:
    canPushItems = canPushCreatures = isSummonable = isIllusionable = isConvinceable = isLureable = isWalkable = hideName = hideHealth = hideLevel = false; Procure por:
    baseSpeed = 200; Logo abaixo, adicione:
    levelMin = levelMax = 1; Localize:
    if(readXMLInteger(p, "max", intValue)) mType->healthMax = intValue; else { SHOW_XML_ERROR("Missing health.max"); monsterLoad = false; } } abaixo adicione:
    else if(!xmlStrcmp(p->name, (const xmlChar*)"level")) { if(!readXMLInteger(p, "max", intValue)) mType->levelMax = 1; else mType->levelMax = intValue; if(!readXMLInteger(p, "min", intValue)) mType->levelMin = mType->levelMax; else mType->levelMin = intValue; } procure por:
    if(readXMLString(tmpNode, "shield", strValue)) mType->partyShield = getPartyShield(strValue); logo baixo adicione:
    if(readXMLString(tmpNode, "hidelevel", strValue)) mType->hideLevel = booleanString(strValue); Monster.h
    Procure:
    virtual ~Monster(); std::string name, nameDescription; abaixo adicione:
    std::string name, nameDescription; int32_t level; double bonusAttack, bonusDefense; Procure:
    virtual const std::string& getName() const {return mType->name;} virtual const std::string& getNameDescription() const {return mType->nameDescription;} virtual std::string getDescription(int32_t) const {return mType->nameDescription + ".";} Substitua por:
    virtual const std::string& getName() const {return name;} virtual const std::string& getNameDescription() const {return nameDescription;} virtual std::string getDescription(int32_t) const {return nameDescription + ".";} Monster.cpp
     
    Logo abaixo de:
    isIdle = true; Adicione:
    name = _mType->name; nameDescription = _mType->nameDescription; level = (int32_t)random_range(_mType->levelMin, _mType->levelMax, DISTRO_NORMAL); bonusAttack = 1.0; bonusDefense = 1.0; Procure por está função:
    Monster::onCreatureAppear Apague e coloque está função:
    void Monster::onCreatureAppear(const Creature* creature) { Creature::onCreatureAppear(creature); if(creature == this) { //We just spawned lets look around to see who is there. if(isSummon()) { std::string value; // this->master->getStorage((uint32_t)"1996", value); this->master->getStorage((uint32_t)"1996", value); uint8_t intValue = atoi(value.c_str()); if(intValue || value == "0") level = intValue; else level = 1; isMasterInRange = canSee(master->getPosition()); } if(g_config.getBool(ConfigManager::MONSTER_HAS_LEVEL)) { this->healthMax = std::floor(this->getMaxHealth() * (1. + (0.1 * (level - 1)))); this->health = this->healthMax; this->bonusAttack += (0.01 * (level - 1)); this->bonusDefense += (0.005 * (level - 1)); } updateTargetList(); updateIdleStatus(); } else onCreatureEnter(const_cast<Creature*>(creature)); } Substitua todos:
    g_config.getDouble(ConfigManager::RATE_MONSTER_DEFENSE) Por:
    g_config.getDouble(ConfigManager::RATE_MONSTER_DEFENSE) * bonusDefense Substitua todos:
    g_config.getDouble(ConfigManager::RATE_MONSTER_ATTACK) Por:
    g_config.getDouble(ConfigManager::RATE_MONSTER_ATTACK) * bonusAttack Map.cpp
     
    Procure por:
    #include "game.h" Adicione em baixo:
    #include "configmanager.h"  Procure por:
    extern Game g_game; Adicione em baixo:
    extern ConfigManager g_config; Procure por está função:
    bool Map::placeCreature(const Position& centerPos, Creature* creature, bool extendedPos /*= false*/, bool forced /*= false*/) { Abaixo do " { " adicione:
    Monster* monster = creature->getMonster(); if(monster && g_config.getBool(ConfigManager::MONSTER_HAS_LEVEL)) { uint8_t level; if(!monster->getMonsterType()->hideLevel) { if(monster->isSummon()) { std::string value; // monster->getMaster()->getStorage((uint32_t)"1996", value); monster->getMaster()->getStorage((uint32_t)"1996", value); uint8_t intValue = atoi(value.c_str()); if(intValue || value == "0") level = intValue; else level = 1; } else level = monster->level; char buffer [10]; monster->name = monster->getName() + " [" + itoa(level, buffer, 10) + "]"; } } configmanager.h
     
    Procure por:
    ADDONS_PREMIUM, e abaixo adicione logo em baixo:
    MONSTER_HAS_LEVEL, configmanager.cpp
    procure por:
    m_confBool[ADDONS_PREMIUM] = getGlobalBool("addonsOnlyPremium", true); e logo em baixo adicione:
    m_confBool[MONSTER_HAS_LEVEL] = getGlobalBool("monsterHasLevel", true); no Config.lua adicione:
    monsterHasLevel = true -- true para monstros nascerem com level, false para não nascerem com level São muitas modificações para fazer, mas o resultado é garantido e é uma funcionalidade a mais para seu servidor.
    Como está programado, a cada level, monstros ganham 10% de HP, 1% de dano e 0.5% de defesa.
     
    Para configurar level mínimo e máximo, é só adicionar no XML do monstro:
    <level min="1" max="10"/> -- level minimo, level maximo E alterar a seu gosto.
    Se você fizer certo irá ficar assim:

     
    Créditos:
    @Oneshot
  3. Gostei
    Wakon deu reputação a tataboy67 em Programando em .Lua   
    Olha não sou um Expert nem nada no assunto... Mas o pouco que aprendi foi na base de tentativas e de procurar saber um pouco mais sobre o assunto.

    O que eu recomendo para você?
    - Veja uma vídeo-aula inteira sobre Lua
    - Procure scripts aqui no FÓRUM e entenda um pouco mais sobre as funções dentro do Tibia
  4. Curtir
    Wakon deu reputação a Vodkart em (Resolvido)Sistema De Teleporte Para Baiak 8.60   
    function doTeleportWithDelay(cid, pos, delay) if not isCreature(cid) then return LUA_ERROR end if delay > 0 then if getCreatureCondition(cid, CONDITION_INFIGHT) or not getTilePzInfo(getCreaturePosition(cid)) then setPlayerStorageValue(cid, 548745, 0) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "{Teleport} O teletransporte foi desativado pois você entrou em estado de combate, ou em zonas especiais.") return true end doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "{Teleport} "..delay.." segundos para se teletransportar.") addEvent(doTeleportWithDelay, 1000, cid, pos, delay-1) else doTeleportThing(cid, pos) doSendMagicEffect(getPlayerPosition(cid),pos) end end function onSay(cid, words, param) local param = param:lower() local time, t = 5, { ["depot"] = {x=129, y=54, z=6}, ["templo"] = {x=160, y=54, z=7}, ["arena"] = {x=125, y=351, z=9} } if not t[param] then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "{Teleport} Desculpe, este lugar não existe.") return true elseif getCreatureCondition(cid, CONDITION_INFIGHT) or not getTilePzInfo(getCreaturePosition(cid)) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "{Teleport} Este comando só pode ser usado fora de áreas de combate ou pz lock.") return true elseif getPlayerStorageValue(cid, 548745) - os.time() > 0 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "{Teleport} aguarde, você está em processo de teletransporte.") return true end setPlayerStorageValue(cid, 548745, os.time()+time) return doTeleportWithDelay(cid, t[param], time) end  
     
    no onLogin adc isso antes do ultimo return true
     
    setPlayerStorageValue(cid, 548745, 0) -- TP SYSTEM  
  5. Curtir
    Wakon deu reputação a Dwarfer em (Resolvido)Quest por Tempo   
    Caso seja tfs 0.4:

    Em talkactions/scripts crie um arquivo.lua:
    local quests = { ["demon"] = { min_level = 10, enter_pos = {x = 1, y = 1, z = 1}, area = {fromPos = {x = 1, y = 1, z = 1}, toPos = {x = 1, y = 1, z = 1}}, time_to_finish = {10, "min"}, time_to_make_again = {1, "hour"} }, ["dragon"] = { min_level = 10, enter_pos = {x = 1, y = 1, z = 1}, area = {fromPos = {x = 1, y = 1, z = 1}, toPos = {x = 1, y = 1, z = 1}}, time_to_finish = {10, "min"}, time_to_make_again = {1, "hour"} } } local time_storage = 87870 -- só modifique se necessário function onSay(cid, words, param, channel) local param, p, check = param:lower(), getPlayerPosition(cid), false if not param or param == "" then local str, n = '~~ [Available Quests] ~~\n\n', 1 for quest, info in pairs(quests) do str = str .. n .. " - " .. Fupper(quest) .. " (Level: "..info.min_level..")\n" n = n + 1 end doShowTextDialog(cid, 1955, str) return true end local t = quests[param] if not t then return doPlayerSendCancel(cid, "Quest not found.") end if getPlayerLevel(cid) < t.min_level then return doPlayerSendCancel(cid, "Only players level "..t.min_level.." or higher can go the "..param.." quest.") end if isInRange(p, t.area.fromPos, t.area.toPos) then return doPlayerSendCancel(cid, "You are already inside the "..param.." quest area.") end for quest, info in pairs(quests) do if isInRange(p, info.area.fromPos, info.area.toPos) then check = true end end if check then return doPlayerSendCancel(cid, "You cannot go to another quest inside a quest.") end local stor = getPlayerStorageValue(cid, time_storage) if stor > os.time() then return doPlayerSendCancel(cid, "You can go to a quest again at "..os.date("%d %B %Y %X", stor)..".") end doSendMagicEffect(p, CONST_ME_POFF) local destination = t.enter_pos doTeleportThing(cid, destination) doSendMagicEffect(destination, CONST_ME_TELEPORT) doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Good luck in "..param.." quest! You have "..getStrTime(t.time_to_finish).." to finish or you will be kicked.") setPlayerStorageValue(cid, time_storage, mathtime(t.time_to_make_again) + os.time()) addEvent(function() if isPlayer(cid) then if isInRange(getPlayerPosition(cid), t.area.fromPos, t.area.toPos) then doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) local temple = getTownTemplePosition(getPlayerTown(cid)) doTeleportThing(cid, temple) doSendMagicEffect(temple, CONST_ME_TELEPORT) doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Your time is over!") end end end, mathtime(t.time_to_finish) * 1000) return true end function mathtime(table) -- by dwarfer local unit = {"sec", "min", "hour", "day"} for i, v in pairs(unit) do if v == table[2] then return table[1]*(60^(v == unit[4] and 2 or i-1))*(v == unit[4] and 24 or 1) end end return error("Bad declaration in mathtime function.") end function getStrTime(table) -- by dwarfer local unit = {["sec"] = "second",["min"] = "minute",["hour"] = "hour",["day"] = "day"} return tostring(table[1].." "..unit[table[2]]..(table[1] > 1 and "s" or "")) end function Fupper(str) return (str:gsub("^%l", string.upper)) end Em talkactions.xml, adicione a tag:
     
    <talkaction words="!quest" event="script" value="NOMEDOARQUIVO.lua"/>  
    Configuração:
     
    ["demon"] = { -- nome da quest min_level = 10, -- level mínimo para ir para a quest enter_pos = {x = 1, y = 1, z = 1}, -- posição de entrada na quest area = { fromPos = {x = 1, y = 1, z = 1}, -- posição do canto superior esquerdo da área toPos = {x = 1, y = 1, z = 1} -- posição do canto inferior direito da área }, time_to_finish = {10, "min"}, -- tempo que o player terá para finalizar a quest ("sec", "min", "hour", "day") time_to_make_again = {1, "hour"} -- tempo para poder fazer uma quest novamente },  
    Utilização:
    !quest -> mostra as quests disponíveis !quest nome da quest -> leva o player para a quest Ex.: !quest demon
  6. Obrigado
    Wakon recebeu reputação de Viitim242 em SCRIPT TALKACTIONS BAN   
    Testa ai:
    "Data/talkactions/scripts/banned.lua"
    function onSay(cid, words, param, channel)   local t = param:explode(",") local name, days = t[1], tonumber(t[2]) local player = getPlayerByName(t[1])    if isPlayer(getPlayerByName(name)) == false then return doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"O jogador "..name.." não esta online ou não existe.") end if name then if days then   local acc = getAccountIdByName(name) if acc ~= 0 then local tempo = days * 24 * 3600   doAddAccountBanishment(acc, target, os.time() + tempo, 5, 2, 'Você foi banido pelo administrador' , 0) doRemoveCreature(player) else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Este player não existe.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você não pode adicionar essa quantidade de dia(s) de dias de banimento.") end end return TRUE end Tag em "Data/talkactions/talkactions.xml":
    <talkaction words="/ban" acess="5" event="script" value="banned.lua"/>
  7. Curtir
    Wakon deu reputação a Vodkart em (Resolvido)[BUG] Script de Healar o Boss   
    local config = { life_ative = 500000, life_add = 300000, seconds_ative = 20, gStorage = 90702, monster = "Gaz'Haragoth" -- nome do monstro } function AddHealth(cid) setGlobalStorageValue(config.gStorage, 0) if not isCreature(cid) then return false end doCreatureAddHealth(cid, config.life_add) doCreatureSay(cid, "Gaz'Haragoth HEALS himself!", TALKTYPE_MONSTER) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_MAGIC_RED) end function onStatsChange(cid, attacker, type, combat, value) if (getGlobalStorageValue(config.gStorage) < 1 and type == STATSCHANGE_HEALTHLOSS and getCreatureName(cid) == config.monster and getCreatureHealth(cid) < config.life_ative) then doCreatureSay(cid, "Gaz'Haragoth beginns to draw on the miniums to HEAL himself!", TALKTYPE_MONSTER) addEvent(AddHealth, config.seconds_ative * 1000, cid) setGlobalStorageValue(config.gStorage, 1) end return true end  
  8. Gostei
    Wakon recebeu reputação de Vodkart em (Resolvido)TFS 0.4 Gaz'Haragoth (Heal + Magia + Teleport) ???   
    @ADM Mayk on BaiakME, isso provavelmente é na configuração do item no items.otb, faz muito tempo mesmo que eu não abro um editor de items, então não sei qual opção marcar/desmarcar pra arrumar isso, você pode tentar alterar ele para as opções de outro piso do seu items.otb.
  9. Gostei
    Wakon recebeu reputação de Vodkart em (Resolvido)TFS 0.4 Gaz'Haragoth (Heal + Magia + Teleport) ???   
    @ADM Mayk on BaiakME, é assim que funciona, achei que você quisesse fazer algo diferente.
    Pra fazer parecido com o global, você pode configurar o strange vortex no items.xml para sumir após um tempo, exemplo(irá sumir em 5 segundos):
    <item id="id_do_vortex" article="a" name="strange vortex"> <attribute key="decayTo" value="0" /> <attribute key="duration" value="5" /> </item> Colocar ele como corpse do minion e usar esse movement:
    <movevent type="StepIn" itemid="id_do_vortex" event="script" value="script.lua"/> local room_pos = {x = 0, y = 0, z = 0} -- posição do nightmare room function onStepIn(cid, item, position, fromPosition) if not isPlayer(cid) then return false end doTeleportThing(cid, room_pos) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_TELEPORT) return true end Ai no nightmare room, você coloca um portal para voltar próximo ao local do Gaz'haragoth, isso pode ser feito pelo RME mesmo.
  10. Gostei
    Wakon recebeu reputação de ADM Mayk on BaiakME em (Resolvido)TFS 0.4 Gaz'Haragoth (Heal + Magia + Teleport) ???   
    @ADM Mayk on BaiakME, na real não é pra criar um teleport e sim teleportar ao passar em cima do corpo, isso que o script que você pediu para adaptar faz.
    Colocou a tag no arquivo movements.xml com o corpo do bixo?
    <movevent type="StepIn" itemid="22455" event="script" value="teleport_gaz.lua"/>  
  11. Gostei
    Wakon recebeu reputação de ADM Mayk on BaiakME em [DUVIDA] Bless apenas para premium   
    local bless = {1, 2, 3, 4, 5} local cost = 50000 function onSay(cid, words, param) if not isPremium(cid) then   doPlayerSendCancel(cid, 'Only premium players can buy blessings.') return true end for i = 1, table.maxn(bless) do if(getPlayerBlessing(cid, bless[i])) then doPlayerSendCancel(cid, "You have already all blessings.") return TRUE end end if(doPlayerRemoveMoney(cid, cost) == TRUE) then for i = 1, table.maxn(bless) do doPlayerAddBlessing(cid, bless[i]) end doCreatureSay(cid, "You are now blessed!" ,19) doSendMagicEffect(getPlayerPosition(cid), 49) else doPlayerSendCancel(cid, "You don\'t have enough money.") end return true end
  12. Gostei
    Wakon recebeu reputação de ADM Mayk on BaiakME em (Resolvido)TFS 0.4 Gaz'Haragoth (Heal + Magia + Teleport) ???   
    @ADM Mayk on BaiakME, testa assim:
    local config = { life_ative = 50000, life_add = 300000, seconds_ative = 5, gStorage = 90702, } function AddHealth(cid) setGlobalStorageValue(config.gStorage, 0) if not isCreature(cid) then return false end doCreatureAddHealth(cid, config.life_add) doCreatureSay(cid, "Gaz'haragoth HEALS himself!", TALKTYPE_MONSTER) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_MAGIC_RED) end function onStatsChange(cid, attacker, type, combat, value) if (getGlobalStorageValue(config.gStorage) < 1 and type == STATSCHANGE_HEALTHLOSS and getCreatureHealth(cid) < config.life_ative) then doCreatureSay(cid, "Gaz'haragoth beginns to draw on the nightmares to HEAL himself!", TALKTYPE_MONSTER) addEvent(AddHealth, config.seconds_ative * 1000, cid) setGlobalStorageValue(config.gStorage, 1) end return true end  
  13. Curtir
    Wakon deu reputação a DdJs em War Golem's Cave | Cave Hunt | 8.60   
    Cave hunt - War Golem Cave.
     
    Download: Here
     
    Scan: Here
     
    Imagens:
     

     

     

     
     
  14. Curtir
    Wakon deu reputação a tataboy67 em Guild Dungeon Lever (Com tempo)   
    Opa boa noite rapaziada, tudo bom?
     
    Eu estou treinando um pouco scripts e acabei que tendo a ideia de fazer algo relacionado com as Guilds.
    Então resolvi trazer 1 sistema de Guild Dungeon Lever para mim treinar  

    Estou em fase de treinamento, então por favor, deem dicas e criticas ao sistema ! Obrigado ...

    Como o sistema funciona?

    Terá uma alavanca com local para os jogadores de sua Guild ficarem... O jogador que estiver na posição principal e próxima a alavanca irá clicar na alavanca que fará com que todos entrem na Dungeon. Os jogadores terão um tempo "x" para terminar, porém se o tempo acabar, o jogador será teleportado de volta para a posição principal da alavanca (Aonde o jogador clicou).



    Como configurar o script?
    local config = { time = 10, -- 1 Second. (1*60 To Minutes) level = 100, -- Level Necessary. dungeonPos = Position(1454, 909, 7), -- Dungeon Pos. needPos = { [1] = Position(1447, 915, 7), -- Position (where the player will click on the lever) and back position. [2] = Position(1449, 914, 7) }, fromPos = {x = 1449, y = 904, z = 7}, -- Position /\ < from the dungeon toPos = {x = 1456, y = 911, z = 7}, -- Position \/ > from the dungeon Storagetime = 39320, -- Storage Time. StorageDay = 39321, -- Storage Day. Timer = 24*60*60 -- To re-enter in the dungeon. (24hours) } time ------------------ Tempo que os jogadores ficarão dentro da Dungeon.
    level ----------------- Nível que todos precisam ser para entrar.
    dungeonPos ------ Posição que todos os jogadores serão teleportados.
    needPos ------------ Posição que os jogadores devem estar para serem teleportados.
    fromPos ------------- Posição SUPERIOR ESQUERDO da sala.
    toPos ----------------- Posição INFERIOR DIREITO da sala.
    Storagetime -------- Não mexer se não souber.
    StorageDay ----------- Não mexer se não souber.
    Timer ------------------ Tempo que o jogador terá que esperar para entrar novamente na Dungeon.
     
     

    Sem mais delongas, vamos ao script:
    Adicione a linha em:
    (data/actions/actions.xml)
    <!-- Script GUILD --> <action actionid="29305" script="Dungeon_Guild.lua" />  
    Adicione a linha em:
    (data/actions/scripts/Dungeon_Guild.lua)
    local config = { time = 5, -- 1 Second. (1*60 To Minutes) inside the dungeon. level = 100, -- Level Necessary. dungeonPos = Position(1454, 909, 7), -- Dungeon Pos. needPos = { [1] = Position(1447, 915, 7), -- Position (where the player will click on the lever) and back position. [2] = Position(1449, 914, 7) }, fromPos = {x = 1449, y = 904, z = 7}, -- Position /\ < from the dungeon toPos = {x = 1456, y = 911, z = 7}, -- Position \/ > from the dungeon Storagetime = 39320, -- Storage Time. StorageDay = 39321, -- Storage Day. Timer = 24*60*60 -- To re-enter in the dungeon. (24hrs) } function onUse(player, item, fromPosition, itemEx, toPosition, isHotkey) local guild = player:getGuild() for i = 1, #config.needPos do local playerTile = Tile(config.needPos[i]):getTopCreature() if not playerTile or not playerTile:isPlayer() then player:getPosition():sendMagicEffect(CONST_ME_POFF) player:sendTextMessage(MESSAGE_STATUS_DEFAULT, "You need 2 players and stay on the orange floor.") return true end if not playerTile:getGuild() and not player:getGuild() then player:getPosition():sendMagicEffect(CONST_ME_POFF) return player:sendTextMessage(MESSAGE_STATUS_SMALL, "One of the members does not have guild.") end if playerTile:getLevel() < config.level then player:getPosition():sendMagicEffect(CONST_ME_POFF) return player:sendTextMessage(MESSAGE_STATUS_SMALL, "All the players need to be level "..config.level.." or higher.") end if player:getGuild():getId() ~= playerTile:getGuild():getId() then player:getPosition():sendMagicEffect(CONST_ME_POFF) return player:sendTextMessage(MESSAGE_STATUS_SMALL, "Only players in your guild can join you.") end if player:getStorageValue(config.Storagetime) - os.time() > 0 and playerTile:getStorageValue(config.Storagetime) - os.time() > 0 then player:getPosition():sendMagicEffect(CONST_ME_POFF) return false end if player:getStorageValue(config.StorageDay) - os.time() > 0 and playerTile:getStorageValue(config.StorageDay) - os.time() > 0 then player:getPosition():sendMagicEffect(CONST_ME_POFF) player:sendTextMessage(MESSAGE_EVENT_ADVANCE, string.format("You're in cooldown to enter in a dungeon again. Cooldown: %s.", string.diff(player:getStorageValue(config.StorageDay)-os.time()))) return false end local players = {} for x = config.fromPos.x, config.toPos.x do for y = config.fromPos.y, config.toPos.y do for z = config.fromPos.z, config.toPos.z do local tile = Tile(x, y, z) local creature = tile:getTopCreature() if creature and creature:isPlayer() then players[#players+1] = creature end end end end if #players > 0 then player:getPosition():sendMagicEffect(CONST_ME_POFF) return player:sendTextMessage(MESSAGE_STATUS_SMALL, "Already has a guild inside.") end player:teleportTo(config.dungeonPos) playerTile:teleportTo(config.dungeonPos) playerTile:getPosition():sendMagicEffect(50) addEvent(function() player:teleportTo(config.needPos[i]) playerTile:teleportTo(config.needPos[i]) player:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) playerTile:getPosition():sendMagicEffect(CONST_ME_MAGIC_BLUE) player:setStorageValue(config.StorageDay, os.time() + config.Timer) playerTile:setStorageValue(config.StorageDay, os.time() + config.Timer) end, config.time*1000) return false end return true end
    Créditos:
    @KotZletY
    E eu  

    Espero que gostem ? ...

    Edit* Adicionado Tempo para que você possa entrar novamente na Dungeon:


    Rep+
  15. Curtir
    Wakon deu reputação a vankk em Coach OT   
    Olá, eu estou querendo dar Coach para servidores, explicar como as coisas funcionam na programação, melhorar a comunidade de Open Tibia e também ajudar, caso você esteja interessado entre em contato comigo via Discord.
     
    Tem algumas regras:
    - Só usaremos Discord.
    - Respeito acima de tudo.
    - Só entrar em contato caso você já possua um servidor online.
    - Já saiba sobre a lógica de programação (porque se não, se torna MUITO difícil de ajudar)
    - Eu tentarei te responder o mais rápido possível, não seja uma criança mimada.
    - Você querer aprender.
    - Se eu perceber que você está sendo Leecher, e não está querendo aprender, eu não vou responder mais.

    No primeiro contato você responderá algumas perguntas minhas para saber quem que você é - e nos conhecermos melhor, claro.
    E não, eu não vou fazer um script para você, vou tentar te explicar a lógica do que você quer! E você vai tentar fazer! Sim, você vai aprender!

    Tá, .. mas quem eu sou? Me conhecem como vankk, e sou dono do AuraOT.  Eu jogo Tibia a 14 anos, e programo OTS a 9 anos. Atualmente eu sou um contribuidor do The Forgotten Server, e também faço trabalhos para diversos servidores com bastante jogadores online. Possuo conhecimentos em PHP, Lua, Python, Java, JavaScript.

    Resumidamente é isso, não gosto de enrolar muito, gosto de ser direito.
    Meu discord é vankk#7765
     
  16. Curtir
    Wakon deu reputação a Zoakly em ⓑⓛⓔⓐⓒⓗ ⓢⓟⓡⓘⓣⓔⓢ   
    Sprites de Bleach ai pra quem ta querendo começar um projeto! ( peguei de um ot pl )
    ⓟⓡⓘⓝⓣⓢ
    ⓓⓞⓦⓝⓛⓞⓐⓓ
     
    ⓒⓡⓔⓓⓘⓣⓞⓢ - wos-ots.pl
  17. Negativo
    Wakon deu reputação a KR3 em DEBUG SHOOT EFFECT (AJUDA)   
    Esses caras aqui do tk na real são tudo uns troxa o cara pedi o bagulho na humildade ninguém apoia,tendo e podendo apoia.
    varios nego com dll estender client 860 e ninguem se presta pra posta na moral.
    dps querem REP. Se fuder to com o jogo offline faz 9 dias e ninguem pra pelo menos tentar ajudar.
  18. Curtir
    Wakon deu reputação a Snowsz em Creature Information Offset   
    Faz tempo que não posto nada, então deu vontade, tava brincando um pouco ai fiz esse sisteminha básico.
     
    • Gifs
     
    Nesse primeiro Gif, ao trocar a direção da Outfit, o nome e as barras de informações como Health, Mana, mudam de posição, isso é bom para ajustar as Outfits de acordo com o seu tamanho, como o Demon, ficar com as informações logo em cima da cabeça, ou Hydra, todos estão com o local padrão.

     
    Aqui era como as informações ficavam com essa Outfit originalmente, no padrão de sempre dos clients.

     
     
    Comparativo em imagem estática:
     
    Tibia Outfit antes e depois:

     
    Aqui estão algumas outfits que meu primo @Fae1z fez, apliquei o sistema de offset nelas, uma do Graves, uma do Ekko, ambos são personagens do game League of Legends, e uma baseada Uganda Knuckle:
     
    Ekko antes:

     
    Ekko depois:

     
    Graves antes e depois:

     
    Uganda Knuckle antes e depois:

     
    Aqui eu estava brincando de por as informações da Outfit de anão de modo drogado kkk.

     
     
    • Código
     
    Em Creature.h modifique nesta linha:
    void Creature::drawInformation(const Point& point, bool useGray, const Rect& parentRect, int drawFlags) Mude "const Point& point" para "Point& point".
    Ficando:
    void Creature::drawInformation(Point& point, bool useGray, const Rect& parentRect, int drawFlags)  
    Embaixo de:
     
    std::string getName() { return m_name; } Adicione:
     
    Point getInformationOffset() { return m_informationOffset; } void setInformationOffset(int x, int y) { m_informationOffset.x = x; m_informationOffset.y = y; }  
    Embaixo de:
    Position m_oldPosition; Adicione:
     
    Point m_informationOffset;  
     
    Agora, em Creature.cpp procure por:
    void Creature::drawInformation(const Point& point, bool useGray, const Rect& parentRect, int drawFlags) Mude "const Point& point" para "Point& point".
    Ficando:
    void Creature::drawInformation(Point& point, bool useGray, const Rect& parentRect, int drawFlags) Sim, isso está repetido, é assim mesmo, o processo é necessário em Creature.h e Creature.cpp, nessa função a variável point tem seu tipo alterado de Const para normal.
     
    Ainda em Creature.cpp procure por:
    if(!useGray) fillColor = m_informationColor; Pule duas linhas e adicione:
    point.x += m_informationOffset.x; point.y += m_informationOffset.y;  
    Agora, em Luafunctions.cpp procure por:
    g_lua.bindClassMemberFunction<Creature>("jump", &Creature::jump); Embaixo adicione:
    g_lua.bindClassMemberFunction<Creature>("setInformationOffset", &Creature::setInformationOffset); g_lua.bindClassMemberFunction<Creature>("getInformationOffset", &Creature::getInformationOffset);  
    A parte da source é só isso.
     
    Foi criada uma variável do tipo Point na classe Creature, que pode armazenar dois valores do tipo Int, sendo eles X & Y, assim detendo uma posição de offset, para ajustar a posição das informações(Health Bar, Mana Bar e Name) da criatura, essa variável é usada na função Creature::drawInformation, onde ocorre todo o desenho de informações das criaturas, lá o offset criado altera a posição de um Point usado como posição base das informações, alterando esse Point todo o resto segue aquela posição,  você pode setar o offset diretamente na criatura, as funções podem ser usadas tanto na source usando C++ quanto nos scripts usando Lua, em Lua o uso das funções é o seguinte:
     
    Essa função retorna uma tabela com X & Y, algo como "table = {x = 10, y = 20}", são as posições do offset.
    Creature:getInformationOffset() Exemplo de uso:
     
    local Offset = Creature:getInformationOffset() print(Offset.x) print(Offset.y) Isso vai printar no client_terminal do OTClient os valores de X & Y.
     
    Enquanto esta altera as posições usando os valores X & Y.
    Creature:setInformationOffset(x, y) Exemplo:
    Creature:setInformationOffset(10, -5)  
    Essa configuração de offset vai aumentar X em 10 Pixels e diminuir Y em 5 Pixels, no meu primeiro gif, na direção Sul do Char, eu usei X diminuindo 13 Pixels e Y diminuindo 8 Pixels, algo como isso:
    Creature:setInformationOffset(-13, -8)  
     
    Para tudo isso funcionar igual os gifs acima eu fiz um módulo especial, onde dependendo da Outfit e da direção que a criatura está olhando, ele vai alterar o offset de acordo.
     
    Para criar o módulo, siga estes passos:
     
    Na pasta do OTClient em modules/ crie uma pasta chamada game_creatureinformation, dentro crie um arquivo com o mesmo nome e a extensão .otmod, algo como "game_creatureinformation.otmod", o conteúdo do arquivo é este:
    Module name: game_creatureinformation description: Changes the position of the informations point to correctly draw names and creature bars. author: Snowsz website: tibiaking.com autoload: true reloadable: true sandboxed: true version: 1.0 scripts: [ game_creatureinformation ] @onLoad: init() @onUnload: terminate()  
    Crie um arquivo com o mesmo nome e a extensão .lua, algo como "game_creatureinformation.lua", o conteúdo do arquivo é este:
    --[[ Directions: North /\ East > South \/ West < Structure: [OutfitID] = { [Direction] = {x = OFFSETX, y = OFFSETY}, } ]] --Lista de offsets para cada Outfit. local OutfitOffsets = { [143] = { --Outfit do primeiro gif [North] = {x = -13, y = -8}, [East] = {x = -17, y = -8}, [South] = {x = -13, y = -8}, [West] = {x = -15, y = -8}, }, [160] = { --Outfit de anão com o nome full drogado. [North] = {x = 0, y = 0}, [East] = {x = 0, y = 0}, [South] = {x = -13, y = -80}, [West] = {x = 0, y = 0}, } } local function translateDir(dir) if dir == NorthEast or dir == SouthEast then return East elseif dir == NorthWest or dir == SouthWest then return West end return dir end local function getOutfitInformationOffset(outfit, dir) if OutfitOffsets[outfit] then return OutfitOffsets[outfit][translateDir(dir)] end return {x = 0, y = 0} end local function onCreatureAppear(creature) local Offset = getOutfitInformationOffset(creature:getOutfit().type, creature:getDirection()) creature:setInformationOffset(Offset.x, Offset.y) end local function onCreatureDirectionChange(creature, oldDirection, newDirection) local Offset = getOutfitInformationOffset(creature:getOutfit().type, newDirection) creature:setInformationOffset(Offset.x, Offset.y) end local function onCreatureOutfitChange(creature, newOutfit, oldOutfit) local Offset = getOutfitInformationOffset(newOutfit.type, creature:getDirection()) creature:setInformationOffset(Offset.x, Offset.y) end function init() connect(LocalPlayer, {onOutfitChange = onCreatureOutfitChange}) connect(Creature, { onAppear = onCreatureAppear, onDirectionChange = onCreatureDirectionChange, onOutfitChange = onCreatureOutfitChange }) end function terminate() disconnect(LocalPlayer, {onOutfitChange = onCreatureOutfitChange}) disconnect(Creature, { onAppear = onCreatureAppear, onDirectionChange = onCreatureDirectionChange, onOutfitChange = onCreatureOutfitChange }) end  
    A parte do módulo está finalizada, o que resta agora é configurar as Outfits na tabela com seus determinados Offsets, e não se preocupe, se a outfit não estiver configurada, ela vai seguir o padrão normal, o módulo só altera algo quando determinada Outfit está configurada.
     
    Para configurar o módulo é simples, basta seguir o padrão:
    [ID DA OUTFIT AQUI] = { [North] = {x = 0, y = 0}, [East] = {x = 0, y = 0}, [South] = {x = 0, y = 0}, [West] = {x = -0, y = 0}, }, Nos primeiros colchetes coloque o ID da sua Outfit para ter o offset modificado, os colchetes restantes são as direções, não é necessário mexer neles, dentro de cada índice da tabela tem os offsets X & Y, basta modificar o valor de acordo, sendo ele positivo ou negativo. NÃO SE ESQUEÇA DA VÍRGULA NO FINAL "},".
  19. Curtir
    Wakon recebeu reputação de DaPYuumii em (Resolvido)Me ajuda Vodkart   
    @Deepweb, comentários não relacionados ao tópico são considerados flood! Leia as regras:
    https://tibiaking.com/forums/topic/1281-regras-gerais-do-tibiaking/
     
  20. Gostei
    Wakon recebeu reputação de Apache em Editar SD   
    @victor4312, assim?
    local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TARGETCASTERORTOPMOST, true) setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_DEATHDAMAGE) setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_MORTAREA) setCombatFormula(combat, COMBAT_FORMULA_LEVELMAGIC, -1, -60, -1, -60, 5, 5, 4, 7) function onCastSpell(cid, var) local pos = getCreaturePosition(cid) local positions = { {x = pos.x + 1, y = pos.y, z = pos.z}, {x = pos.x - 1, y = pos.y, z = pos.z} } for i = 1, #positions do doSendDistanceShoot(positions[i], getCreaturePosition(var.number), CONST_ANI_SUDDENDEATH) end return doCombat(cid, combat, var) end  
  21. Gostei
    Wakon recebeu reputação de Vodkart em (Resolvido)[AJUDA] npc entrega storage varias vezes   
    local cfg = { item = {5943, 15}, storage = 32100, hp_bonus = 1000, skills_bonus = { [SKILL__MAGLEVEL] = 10, [SKILL_FIST] = 10, } } 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 function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid if (msgcontains(msg, 'yes')) then if (getPlayerStorageValue(cid, cfg.storage) < 1) then if (doPlayerRemoveItem(cid, cfg.item[1], cfg.item[2])) then for v, k in pairs (cfg.skills_bonus) do doPlayerAddSkill(cid, v, k) end setCreatureMaxHealth(cid, getCreatureMaxHealth(cid) + cfg.hp_bonus) doCreatureAddHealth(cid, getCreatureMaxHealth(cid)) setPlayerStorageValue(cid, cfg.storage, 1) selfSay('Parabéns agora você faz parte da Akatsuki, utilize o comando !akatsuki.', cid) else selfSay('Não adianta me enganar, você não tem '.. cfg.item[2] ..' {'.. (cfg.item[2] == 1 and getItemNameById(cfg.item[1]) or getItemPluralNameById(cfg.item[1])) ..'}, vai atrás, e só volte com eles.', cid) end else selfSay('Você já faz parte da Akatsuki.', cid) end end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) @OinomedRellik
  22. Curtir
    Wakon recebeu reputação de OinomedRellik em (Resolvido)[AJUDA] npc entrega storage varias vezes   
    local cfg = { item = {5943, 15}, storage = 32100, hp_bonus = 1000, skills_bonus = { [SKILL__MAGLEVEL] = 10, [SKILL_FIST] = 10, } } 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 function creatureSayCallback(cid, type, msg) if(not npcHandler:isFocused(cid)) then return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid if (msgcontains(msg, 'yes')) then if (getPlayerStorageValue(cid, cfg.storage) < 1) then if (doPlayerRemoveItem(cid, cfg.item[1], cfg.item[2])) then for v, k in pairs (cfg.skills_bonus) do doPlayerAddSkill(cid, v, k) end setCreatureMaxHealth(cid, getCreatureMaxHealth(cid) + cfg.hp_bonus) doCreatureAddHealth(cid, getCreatureMaxHealth(cid)) setPlayerStorageValue(cid, cfg.storage, 1) selfSay('Parabéns agora você faz parte da Akatsuki, utilize o comando !akatsuki.', cid) else selfSay('Não adianta me enganar, você não tem '.. cfg.item[2] ..' {'.. (cfg.item[2] == 1 and getItemNameById(cfg.item[1]) or getItemPluralNameById(cfg.item[1])) ..'}, vai atrás, e só volte com eles.', cid) end else selfSay('Você já faz parte da Akatsuki.', cid) end end return true end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new()) @OinomedRellik
  23. Curtir
    Wakon deu reputação a tataboy67 em [TFS 1.1+] Tile Party   
    Opa galera beleza? Como prometido eu tentei fazer 1 script e vim posta-lo no TibiaKing...

    O script é simples e com uma boa configuração:
    Numero de membros da Party Nível necessário Se precisa de PZ para entrarem Se precisa que todos estejam perto Se só o Leader poderá entrar Teleporte que os jogadores irão Items necessários
    Como o script funciona?
                  O script ele serve como uma forma de o jogador poder entrar em 1 Sala com a necessidade de uma Party, nível necessário e alguns Items.

    Meu intuito em fazer esses tipos de scripts: 
                   Estou cada vez mais tentando aprender um pouco mais em relação a scripts Lua... Sou um pouco leigo nessa parte, mas vou continuar treinando e estudando para alimentar meu conhecimento na linguagem e o conteúdo no Fórum. Espero que vocês me apoiem no que estou tentando fazer, e agradeço a todos que estão me ajudando a entender um pouco do assunto.

    Sem mais delongas, vamos ao Script:

    Adicione a linha em:
    (data/movements/movements.xml)
    <movevent event="StepIn" actionid="5900" script="Tile_Party.lua"/>
    Crie um arquivo em:
    (data/movements/scripts/Tile_Party.lua)
    local config = { members = 2, -- membros ou +. level = 300, -- nivel que todos os membros devem ter para entrar. leader = false, -- somente o leader pode entrar no teleport. pz = true, -- só irá funcionar se todos os membros tiverem em PZ area. pos_to = {x = 1143, y = 1064, z = 7}, -- posição que os jogadores serão teleportados. other = { pert = true, -- só poderá entrar se os membros tiverem na quant_sqm de distancia. quant_sqm = 7 -- jogadores tem que estar a 7 sqm de distancia do jogador que entrou no TP. }, items = { -- itens necessários para que os players entrem. [1] = {item = 2160, count = 1}, [2] = {item = 2159, count = 1} -- [3] = {item = ItemID, count = Quantidade} }, } function onStepIn(player, item, position, fromPosition) local party = player:getParty() if not party then player:teleportTo(fromPosition) player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) position:sendMagicEffect(CONST_ME_MAGIC_RED) return player:sendCancelMessage("You don't have a party.") end local leader = party:getLeader() local member = party:getMembers() if config.leader and player ~= leader then player:teleportTo(fromPosition) player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) position:sendMagicEffect(CONST_ME_MAGIC_RED) player:sendCancelMessage("Somente o leader pode entrar por aqui.") return false end table.insert(member, leader) local ready = {} if #member >= config.members-1 then for _, var in pairs(member) do if var:getLevel() > config.level then if config.other.pert then if player:getPosition():getDistance(var:getPosition()) >= config.other.quant_sqm then player:teleportTo(fromPosition) player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) player:sendCancelMessage("Seu time tem que esta proximo de voce.") return end end if config.pz then if not getTileInfo(getThingPos(var)).protection then player:teleportTo(fromPosition) player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) return player:sendCancelMessage("Seu time tem que estar em protection zone.") end end for k, v in pairs(config.items) do if var:getItemCount(v.item) < v.count then player:teleportTo(fromPosition) player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) player:sendTextMessage(22,string.format("O membro (corno) %s não possui %sx %s.", var:getName(), v.count, ItemType(v.item):getName())) return false end end table.insert(ready, var) else player:sendTextMessage(22,"Um dos membros da party não possui nivel superior a "..config.level..".") player:teleportTo(fromPosition) player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) return false end end if rawequal(#ready, #member) then for _, var in pairs(member) do for k, v in pairs(config.items) do var:removeItem(v.item, v.count) end var:sendTextMessage(22,"Your team join the room.") var:teleportTo(config.pos_to) var:getPosition():sendMagicEffect(CONST_ME_TELEPORT) end end else player:teleportTo(fromPosition) player:getPosition():sendMagicEffect(CONST_ME_TELEPORT) position:sendMagicEffect(CONST_ME_MAGIC_RED) player:sendTextMessage(20,"Somente party's com " .. config.members-1 .. " ou mais jogadores, poderão passar.") end return true end Deixe seu REP+ Para me motivar ainda mais a postar novos scripts para vocês.

    Créditos:
    @Snowsz
    @KotZletY
    @Vodkart
    @Lyu

    Está atualizado o script...
    Algumas configurações foram adicionadas !
    local config = { members = 2, -- membros ou +. level = 300, -- nivel que todos os membros devem ter para entrar. leader = false, -- somente o leader pode entrar no teleport. pz = true, -- só irá funcionar se todos os membros tiverem em PZ area. pos_to = {x = 1143, y = 1064, z = 7}, -- posição que os jogadores serão teleportados. other = { pert = true, -- só poderá entrar se os membros tiverem na quant_sqm de distancia. quant_sqm = 7 -- jogadores tem que estar a 7 sqm de distancia do jogador que entrou no TP. }, items = { -- itens necessários para que os players entrem. [1] = {item = 2160, count = 1}, [2] = {item = 2159, count = 1} -- [3] = {item = ItemID, count = Quantidade} }, }  
  24. Curtir
    Wakon deu reputação a vyctor17 em Renomear o Summon   
    o cliente tem uma limitação, se a criatura já apareceu em sua tela ela não troca o nome, você tem que summonar ela longe do player, e depois teleportar ela para perto do player.
  25. Gostei
    Wakon recebeu reputação de Mr Spoiller em Ajuda Hotkeys Combo   
    Esta é uma mensagem automática! Este tópico foi movido para a área correta.
    Pedimos que você leia as regras do fórum.
     
×
×
  • Criar Novo...

Informação Importante

Confirmação de Termo