Jump to content
Close

Wakon

Hero
  • Content Count

    3073
  • Joined

  • Last visited

  • Days Won

    22

Reputation Activity

  1. Like
    Wakon reacted to Vodkart in Ajuda alguem porfavor   
    @isac001 de boa, vamos por por actionID então!!
     
    function doTpTime(cid, delay, pos, msg) if not isCreature(cid) then return LUA_ERROR end if delay > 0 then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "{Teleport} "..delay.." segundos para se teletransportar para "..msg..".") addEvent(doTpTime, 1000, cid, delay-1, pos, msg) else doTeleportThing(cid, pos) doSendMagicEffect(getPlayerPosition(cid), 10) doPlayerSendTextMessage(cid, 22, "Voce foi teleportado para "..msg.."! DBO EVOLUTION") end end local store,exhausted = 756841,10 function onUse(cid, item, fromPosition, item2, toPosition) local items = { -- [actionID] [15872] = {pos = {x = 433, y = 992, z = 15}, msg = "Earth"}, [15873] = {pos = {x = 478, y = 992, z = 15}, msg = "Namek Planet"}, [15874] = {pos = {x = 500, y = 992, z = 15}, msg = "Vegeta Planet"} } local var = items[item.actionid] if not var then return true end if getPlayerStorageValue(cid, store) >= os.time() then doPlayerSendCancel(cid, "wait " .. getPlayerStorageValue(cid, store) - os.time() .. " seconds to use this item.") return true end setPlayerStorageValue(cid, store, os.time()+exhausted) doTpTime(cid, 5, var.pos, var.msg) return true end  
    FAVOR TROCAR O ACTIONID QUE ESTÃO DENTRO DAS CHAVES []
        local items = { -- [ACTIONID]         [15872] = {pos = {x = 433, y = 992, z = 15}, msg = "Earth"},          [15873] = {pos = {x = 478, y = 992, z = 15}, msg = "Namek Planet"},         [15874] = {pos = {x = 500, y = 992, z = 15}, msg = "Vegeta Planet"}     } ai no actions.xml coloca assim por exemplo:
     
    <action actionid="15872;15873;15874" script="nome do seu script.lua"/>
     

    ou se forem tudo em ordem os actionID, tbm pode ser assim:
     
    <action actionid="15872-15874" script="nome do seu script.lua"/>  
  2. Upvote
    Wakon reacted to DdJs in [12x+] Babylon Teleports Room   
    Baylon Teleports Room
    V 12.20+
     
    Download:
    TeleportsRoom_V12.otbm
    Position [X: 1089 Y: 1034 Z: 5]
     
     
    RME + Client:
    Remere's Map Editor (11-12+) + Client.rar
     
     
    Imagens:
     
  3. Upvote
    Wakon reacted to Pedriinz in Auto Loot Sytem for TFS 1.3 + revscripts   
    Depois de milhões de anos sem programar porcaria nenhuma... Eu desenvolvi este sistema como um método de estudo. (C++)
    Este sistema foi inspirado no Auto Loot System por @psychonaut. (OTland)
    Criei o mesmo na versão mais recente do tfs. 
     
    Auto Loot System for TFS 1.3

     
    Como funciona?
    Simples, quando você mata um monstro e abre o corpo (você precisa clicar no corpo), os itens vão para o seu personagem.

     
    Instalando
    em actions.cpp, encontre:
    if (corpseOwner != 0 && !player->canOpenCorpse(corpseOwner)) { return RETURNVALUE_YOUARENOTTHEOWNER; } e mude isso para:
     
    if (corpseOwner != 0 && !player->canOpenCorpse(corpseOwner)) { return RETURNVALUE_YOUARENOTTHEOWNER; } else { if (player->canOpenCorpse(corpseOwner) && player->autoLootList.size() != 0) { if (player->getCapacity() > 100 * 100) { //Minimum of Capacity for autoloot works. (100 CAP) for (Item* item : container->getItemList()) { if (player->getItemFromAutoLoot(item->getID())) { std::ostringstream msgAutoLoot; msgAutoLoot << "You looted a " << item->getItemCount() << "x " << item->getName() << "."; g_game.internalMoveItem(container, player, CONST_SLOT_WHEREEVER, item, item->getItemCount(), nullptr); player->sendTextMessage(MESSAGE_INFO_DESCR, msgAutoLoot.str()); } } } else { player->sendTextMessage(MESSAGE_INFO_DESCR, "Sorry, you don't have enough capacity to use auto loot, so it has been disabled. (100+ capacity is required)"); } } } em player.h, abaixo de:
    std::unordered_set<uint32_t> VIPList; adicione isso:
    std::set<uint32_t> autoLootList; ainda em player.h encontre:
    bool hasLearnedInstantSpell(const std::string& spellName) const; adicione em baixo:
    void addItemToAutoLoot(uint16_t itemId); void removeItemFromAutoLoot(uint16_t itemId); bool getItemFromAutoLoot(uint16_t itemId); em player.cpp no final do arquivo, adicione:
    void Player::addItemToAutoLoot(uint16_t itemId) { autoLootList.insert(itemId); } void Player::removeItemFromAutoLoot(uint16_t itemId) { autoLootList.erase(itemId); } bool Player::getItemFromAutoLoot(const uint16_t itemId) { return autoLootList.find(itemId) != autoLootList.end(); } em luascript.cpp encontre:
    registerMethod("Player", "getFightMode", LuaScriptInterface::luaPlayerGetFightMode); e adicione em baixo:
    registerMethod("Player", "addItemToAutoLoot", LuaScriptInterface::luaPlayerAddItemToAutoLoot); registerMethod("Player", "removeItemFromAutoLoot", LuaScriptInterface::luaPlayerRemoveItemFromAutoLoot); registerMethod("Player", "getItemFromAutoLoot", LuaScriptInterface::luaPlayerGetItemFromAutoLoot); registerMethod("Player", "getAutoLootList", LuaScriptInterface::luaPlayerGetAutoLootList); ainda em luascript.cpp encontre essa função:
    int LuaScriptInterface::luaPlayerGetFightMode(lua_State* L) { // player:getFightMode() Player* player = getUserdata<Player>(L, 1); if (player) { lua_pushnumber(L, player->fightMode); } else { lua_pushnil(L); } return 1; }  
    abaixo dela, adicione:
    int LuaScriptInterface::luaPlayerAddItemToAutoLoot(lua_State* L) { // player:addItemToAutoLoot(itemId) Player* player = getUserdata<Player>(L, 1); if (!player) { lua_pushnil(L); return 1; } uint16_t itemId; if (isNumber(L, 2)) { itemId = getNumber<uint16_t>(L, 2); } else { itemId = Item::items.getItemIdByName(getString(L, 2)); if (itemId == 0) { lua_pushnil(L); return 1; } } player->addItemToAutoLoot(itemId); pushBoolean(L, true); return 1; } int LuaScriptInterface::luaPlayerRemoveItemFromAutoLoot(lua_State* L) { // player:removeItemFromAutoLoot(itemId) Player* player = getUserdata<Player>(L, 1); if (!player) { lua_pushnil(L); return 1; } uint16_t itemId; if (isNumber(L, 2)) { itemId = getNumber<uint16_t>(L, 2); } else { itemId = Item::items.getItemIdByName(getString(L, 2)); if (itemId == 0) { lua_pushnil(L); return 1; } } player->removeItemFromAutoLoot(itemId); pushBoolean(L, true); return 1; } int LuaScriptInterface::luaPlayerGetItemFromAutoLoot(lua_State* L) { // player:getItemFromAutoLoot(itemId) Player* player = getUserdata<Player>(L, 1); if (!player) { lua_pushnil(L); return 1; } uint16_t itemId; if (isNumber(L, 2)) { itemId = getNumber<uint16_t>(L, 2); } else { itemId = Item::items.getItemIdByName(getString(L, 2)); if (itemId == 0) { lua_pushnil(L); return 1; } } if (player->getItemFromAutoLoot(itemId)) { pushBoolean(L, true); } else { pushBoolean(L, false); } return 1; } int LuaScriptInterface::luaPlayerGetAutoLootList(lua_State* L) { // player:getAutoLootList() Player* player = getUserdata<Player>(L, 1); if (player) { std::set<uint32_t> value = player->autoLootList; if (value.size() == 0) { lua_pushnil(L); return 1; } int index = 0; lua_createtable(L, value.size(), 0); for(auto i : value) { lua_pushnumber(L, i); lua_rawseti(L, -2, ++index); } } else { lua_pushnil(L); } return 1; }  
    em luascript.h encontre:
    static int luaPlayerGetFightMode(lua_State* L);  
    adicione a baixo:
    static int luaPlayerAddItemToAutoLoot(lua_State* L); static int luaPlayerRemoveItemFromAutoLoot(lua_State* L); static int luaPlayerGetItemFromAutoLoot(lua_State* L); static int luaPlayerGetAutoLootList(lua_State* L);  
    em iologindata.cpp encontre:
    //load storage map query.str(std::string()); query << "SELECT `key`, `value` FROM `player_storage` WHERE `player_id` = " << player->getGUID(); if ((result = db.storeQuery(query.str()))) { do { player->addStorageValue(result->getNumber<uint32_t>("key"), result->getNumber<int32_t>("value"), true); } while (result->next()); }  
    e adicione em baixo:
    query.str(std::string()); query << "SELECT `autoloot_list` FROM `player_autoloot` WHERE `player_id` = " << player->getGUID(); if ((result = db.storeQuery(query.str()))) { unsigned long lootlistSize; const char* autolootlist = result->getStream("autoloot_list", lootlistSize); PropStream propStreamList; propStreamList.init(autolootlist, lootlistSize); int16_t value; int16_t item = propStreamList.read<int16_t>(value); while (item) { player->addItemToAutoLoot(value); item = propStreamList.read<int16_t>(value); } }  
    acima de:
    //save inbox items adicione:
    query.str(std::string()); query << "DELETE FROM `player_autoloot` WHERE `player_id` = " << player->getGUID(); if (!db.executeQuery(query.str())) { return false; } PropWriteStream propWriteStreamAutoLoot; for (auto i : player->autoLootList) { propWriteStreamAutoLoot.write<uint16_t>(i); } size_t lootlistSize; const char* autolootlist = propWriteStreamAutoLoot.getStream(lootlistSize); query.str(std::string()); DBInsert autolootQuery("INSERT INTO `player_autoloot` (`player_id`, `autoloot_list`) VALUES "); query << player->getGUID() << ',' << db.escapeBlob(autolootlist, lootlistSize); if (!autolootQuery.addRow(query)) { return false; } if (!autolootQuery.execute()) { return false; }  
    em sua database, execute esta query
    CREATE TABLE player_autoloot ( id int NOT NULL AUTO_INCREMENT, player_id int NOT NULL, autoloot_list blob, PRIMARY KEY (id) );  
    agora vá em data/scripts/talkactions e crie esse arquivo LUA
     
    autoloot.lua
    local talk = TalkAction("!autoloot") function talk.onSay(player, words, param) local i = player:getAutoLootList() local cache = "Check your loot list: " local split = param:split(",") local action = split[1] if param == "list" then if i then for _, item in ipairs(i) do cache = cache .. (ItemType(item)):getName() .. ", " end else player:sendTextMessage(MESSAGE_INFO_DESCR, "Your list is empty! Add some item and try again.") return false end player:sendTextMessage(MESSAGE_INFO_DESCR, cache:sub(1, -3)) return false end if action == "add" then local item = split[2]:gsub("%s+", "", 1) local itemType = ItemType(item) if itemType:getId() == 0 then itemType = ItemType(tonumber(item)) if itemType:getName() == '' then player:sendCancelMessage("There is no item with that id or name.") return false end end if player:getItemFromAutoLoot(itemType:getId()) then player:sendCancelMessage("You're already autolooting this item.") return false end player:addItemToAutoLoot(itemType:getId()) player:sendTextMessage(MESSAGE_INFO_DESCR, "You're now auto looting " .. itemType:getName()) return false elseif action == "remove" then local item = split[2]:gsub("%s+", "", 1) local itemType = ItemType(item) if itemType:getId() == 0 then itemType = ItemType(tonumber(item)) if itemType:getName() == '' then player:sendCancelMessage("There is no item with that id or name.") return false end end if player:getItemFromAutoLoot(itemType:getId()) then player:removeItemFromAutoLoot(itemType:getId()) player:sendTextMessage(MESSAGE_INFO_DESCR, "You removed the " .. itemType:getName() .. " from your loot list.") else player:sendCancelMessage("This item does not exist in your loot list.") end return false end player:sendTextMessage(MESSAGE_EVENT_ORANGE, "Auto Loot commands (items are automatically moved to your bp if you open monster corpse):"..'\n'.."!addloot add, nameItem - add item to auto loot by name"..'\n'.."!autoloot remove, itemName - remove item from auto loot by name"..'\n'.."!autoloot list - list your current auto loot items") return false end talk:separator(" ") talk:register()  
     
    É isso, espero que gostem do sisteminha
    Se você encontrar algum bug, deixe-me saber.

    Falta fazer:
    Optimizar a mensagem de loot.
    Adicionar ModalWindow.
     
    Cheers~
     

  4. Upvote
    Wakon reacted to Yinz in Aldora Layout 1x   
    Olá, tava olhando aqui um antigo HD que por acaso não estava funcionando e acabei conseguindo recuperar algumas coisas, então como estou afastado do forum estarei disponibilizando aqui. 
     
     
    Version: TFS 1x+
     
    Download:
    Aldora
     
    Virustotal:
    AQUI
    Images:
     
     
     
     
     
  5. Upvote
    Wakon reacted to DdJs in [8.60] Mining Cave   
    Mining Cave
    V 8.60
     
    [pequena area para evento mining]
     
    Download:
    Mining_Cave8.60.rar
     
    Position: [X: 1010 Y: 1031 Z: 8]
     
    Imagens:
     
  6. Upvote
    Wakon reacted to DdJs in [8.60] Pumin Seal (Cave)   
    Pumin Seal (Cave)
    V 8.60
     
    [Cave inspirada no selo de Pumin da Ferumbras' Ascendant Quest]
    *Não se trata de uma réplica fiel do seal original.
     
    Download:
    Pumin_Seal8.60.rar
    Position: [X: 1006 Y: 1022 Z: 9]
     
    Imagens:
     
     
     
  7. Upvote
    Wakon reacted to WooX in Tutorial - Push cruzado e sua história   
    Push Cruzado

    Como prometido, hoje eu vou ensinar como implementar o push cruzado. Este tutorial é feito especificamente para a versão 2 do OTX, porem, devido a simplicidade do código (sério, é muito simples, você vai se surpreender), acredito que possa ser implementado em qualquer source code disponível atualmente.
    Antes do tutorial vou falar sobre como surgiu o "sistema" e de como o mesmo ficou popular entre os jogadores de Baiak, então senta que lá vem história.
    Se você não tem interesse na história de como surgiu e se popularizou e só está aqui pelo tutorial de como implementar, pule para o final do tópico.
     
    História

    Familiar para alguns e desconhecido para muitos outros, o que afinal é esse tal de push cruzado que alguns tanto falam?
    Para entender como surgiu, teremos que voltar alguns anos no tempo, em uma época que OTX não existia e o TFS 1.x ainda era um sonho distante, época essa em que a maioria dos servidores com protocolo 8.60 utilizavam como engine a velha TFS 0.3.6. Foi neste período que alguns jogadores de enforced descobriram este bug, isso mesmo que você leu, o push cruzado é na verdade um bug!
    Mas calma! é apenas um bug inofensivo, mesmo assim, não deixa de ser um bug, que hoje em dia é divulgado como feature nos servidores. Antes de entrar mais a fundo nessa questão, vou terminar de explicar como ele foi descoberto, como ele pode ser utilizado e as vantagens que ele concede aos jogadores que sabem como utiliza-lo.
     
    Nos saudosos dias em que o protocolo 8.60 estava no seu auge na comunidade OpenTibia (70% da Otserv List era composta por servidores 8.60), poucos tinham acesso para a até então recente TFS 0.4 (nesta época TFS 0.4 não era pública, e só podia ser obtida doando uma quantia aos desenvolvedores). Até então, era raro encontrar servidores rodando com TFS 0.4, mais raro ainda um servidor enforced/war, mas assim como uma agulha no palheiro, ele estava lá, Mega-War, o que eu acredito que tenha sido o primeiro servidor de war 8.60 a usar a recente distro.
     
    OTServList em 2011
     
    E foi neste servidor que o push cruzado foi descoberto, por jogadores dedicados a se aperfeiçoarem no PvP, estes foram os primeiros e os que deram origem ao que hoje se conhece como enforcedeiros (jogadores assíduos de servidores de war, com uma habilidade surreal no PvP). Mas algumas questões ficam no ar, TFS 0.4 era realmente recente, porem o protocolo 8.60 já existia há um bom tempo no TFS 0.3, então porque este bug não foi descoberto antes? porque neste servidor em especifico se outros servidores de war 8.60 já existiam?
     
    A resposta é: este bug surgiu justamente no TFS 0.4, para ser mais especifico na rev 3777, tanto é que a versão anterior do TFS (0.3) não continha este bug e nas revisões seguintes do TFS 0.4 ele foi corrigido, com isto o push cruzado se "perdeu", existindo somente no TFS 0.4 (Rev 3777). Devido a isto, os servidores privados de enforced (onde se encontra a maioria dos enforcedeiros hoje em dia) e alguns servidores baiaks utilizam TFS 0.4 até hoje, mesmo existindo opções excelentes em comparação, como TFS 1.x e OTX, tudo devido a este bugzinho que se popularizou muito entre alguns jogadores ao longo do anos. Mas como o push cruzado se popularizou tanto a ponto de chegar ao que é hoje?
     
    Os enforcedeiros tinham um estilo único de PvP, fazendo jogadas que para muitos até hoje não é possível sem o uso de bot. Com o tempo, estes jogadores foram gravando e postando vídeos no Youtube de suas jogadas, para muitos dos que assistiam, tal nível de habilidade só podia ser atingido com auxílio do bot, os mais humildes, aqueles que aceitavam que aquilo era possível sem o uso de bot, entravam nestes servidores de war com a intenção de aprender, não só o push cruzado, mas o push a distancia, a velocidade para realizar jogadas e a visão de jogo num geral.
     
    Alguns dos vídeos antigos da época do Mega-War.
     
    Neste ultimo vídeo em especial, é possivel ver o push cruzado sendo realizado por volta de 1:22 e 3:20 de vídeo.
     
    No inicio de 2013, sem motivo aparente o Mega-War simplesmente fechou. Mas onde há demanda, sempre haverá oferta, com isso surge o ainda mais famoso Total-War.
    O Mega-War foi o inicio para essas estrelas do PvP, mas foi no Total-War que a coisa realmente cresceu. Com cada vez mais vídeos de jogadores exibindo jogadas espetaculares, mais aparecia os chamados novatos (jogadores que admiravam os enforcedeiros e tinham interesse em aprender e praticar as técnicas usadas), na época do Mega-War, dava pra contar nos dedos a quantidade de pessoas que sabiam fazer o push cruzado, afinal, era uma coisa totalmente nova, com poucos meses do Total-War online esse numero cresceu exponencialmente, o servidor ficou no seu auge por cerca de 1 ano e alguns meses.
     
    Alguns vídeos de enforcedeiros no Total-War (incluindo o meu 😊).

    Poucos sabem disso, mas eu era GM no Total-War, ajudei no servidor por alguns meses até ter um desentendimento com o dono, nesse momento eu decidi abrir o meu próprio servidor enforced. Eu acompanho a comunidade brasileira de OpenTibia desde 2010, mas nunca tinha levado a sério a ideia de ter meu próprio servidor até então, foi nessa época que eu criei a minha conta aqui no TibiaKing, pois o antigo XTibia (lugar onde eu conheci o que era OpenTibia) havia fechado.
     
    No ano de 2014 encontrar as sources do TFS 0.4 já não era mais problema, estavam por todo lugar. Eu peguei um datapack com mapa de venore (assim como o Mega e Total-War) e coloquei online, nesse período eu comecei a estudar a fundo como funcionava OTServers. Devido a testes de diversas versões diferentes de source, já na época eu percebi que push cruzado era algo exclusivo do TFS 0.4 (isso explica porque o dono do Total-War se recusava a fazer um upgrade), era também tempo do inicio do repositório do OTX que se mostrava promissor em relação ao TFS 0.4.
     
    Cerca de 1 ano depois da abertura do meu servidor eu decidi tentar adicionar o cruzado nas sources do OTX2, uma pessoa dedicada com um objetivo, mas sem saber de nada, por semanas eu comparei o código de ambas as sources, arquivo por arquivo (haja dedicação), e por fim consegui adicionar ao OTX (quando eu descobri o que era, eu confesso que de imediato me arrependi de ter gasto tanto tempo com isso). Com essa alteração eu resetei e reinaugurei meu servidor, o servidor era chamado de Ultra-War, mas ficou mais conhecido por todos como Sv2 porque o servidor era hosteado em 3 locais diferentes, e 1 dos locais era aqui no Brasil, este era conhecido como Sv2.
     
    O Ultra-War foi o primeiro servidor a ter o push cruzado sem utilizar do TFS 0.4, na época OTX já estava se tornando muito popular pois dava uma sensação de ping menor ao jogar, rodando o servidor com OTX e em 3 hosts diferentes, os poucos players que sobraram no Total-War migraram para o Ultra-War, e assim como o Total-War ocupou o lugar do Mega-War no seu fim, o Sv2 passou a segurar esta tocha. Alem dos já antigos enforcedeiros, jogadores novos não paravam de vir de todos os lugares, muitos deles quando aprendiam e aperfeiçoavam as técnicas iam logo aplicar em servidores UP Level (principalmente Baiaks), foi ai que o push cruzado se popularizou fora do enforced, com os jogadores pedindo aos administradores para adicionarem algo que eles sequer tinham noção do que era.
     
    Vídeos do jogador que eu acredito ser o maior responsável pela popularidade do PvP no estilo enforced nos Baiaks.
     
    Enfim... a história acaba por aqui (até porque ficou longa pra kct), no final das contas a história não foi sobre o push cruzado em si, mas sobre o enforced e os enforcedeiros num geral. Agora vamos para a parte que todos querem ver.
     
    O que é e como utilizar

    O push cruzado nada mais é do que permitir que o jogador empurre (push) outros jogadores e criaturas enquanto se movimenta ao mesmo tempo, basicamente é apenas isso. O que isso proporciona ao jogador, ai já é outra historia (brincadeira, depois dessa ultima, chega de história), isso permite ao jogador executar jogadas que sem o push cruzado seriam executadas de maneira bem mais lenta, e até mesmo jogadas que seriam impossíveis de serem realizadas sem o uso do famoso cruzado.
     
    Veja abaixo alguns exemplos.
     
    Tutorial

    Como eu mencionei antes, o push cruzado é na verdade um bug, caso implementado, isso possibilita aos jogadores realizarem jogadas que sem ele seriam impossíveis. Se mesmo ciente disto você deseja seguir em frente, basta seguir os passos abaixo.
     
     
     
    Pronto, com isso você pode habilitar ou desabilitar o push cruzado diretamente pelo config.lua, sem a necessidade de recompilar a source.
     
    Créditos

    Me, myself and I.
  8. Upvote
    Wakon reacted to luanluciano93 in Atualizações projeto Styller   
    Tópico do Projeto: 
     
    Version 1.0
    Substituído sistema de vip para premium. Reformulado todas as quests do mapa. Reformulado para novo sistema de trainers. Reformulado todas as houses do mapa. Adicionado auction system. Adicionado server save. Adicionado battlefield evento. Adicionado duca evento. Adicionado zumbi evento. Adicionado event coin e troféus para zumbi evento e duca evento. Adicionado trainer offline. Adicionado a função eventActive(). Adicionado achievements. Adicionado task system com boss room. Removido arquivo compat.lua. Adicionado castelo e a Queen Catarine na premium city. Adicionado templo de Tiquanda. Adicionado daily quest (prêmios ainda não configurados). Reformulado o save para cada 3 horas na função onTimer (retirado função onThink). Adicionado NPC que vende items por event coins. Fixado vários bugs no mapa e no datapack.
  9. Upvote
    Wakon reacted to LeoTK in [Sistema 0.3.6 - 8.54] Chuva Editado por LeoTK & NightWolf   
    Salve galera bom tinha uns membros do fórum atrás do sistema de chuva porém estava confuso e totalmente configuravel apenas por math.random então com ajuda do @xWhiteWolf agora o script esta totalmente sem math.random e eu detalhei tudo dentro do script como configurar etc...
     
    tópico original
     
    Aviso 1º: Mude a tag do globalevents.xml para interval=1
    Aviso 2º: Todas as explicações estão dentro do script basta ler
     
    Vídeo demonstrativo

    2019-10-04 01-44-37.mp4  
     
    Vamos as modificações basicamente substitua o arquivo que fica em data/globalevents/scripts/rain.lua abra ele e cole esse código dentro
     
     
    Aproveitando fiz uma modificação na direção que a chuva cai caso quiser a modificação vá em data/globalevents/scripts/lib e abra o arquivo rain.lua e substitua tudo que tiver lá por esse código
     
     
     
    Créditos:
    @Guilherme.
    @xWhiteWolf
    @LeoTK
    Elexonic (Otland)
  10. Upvote
    Wakon reacted to Dwarfer in Barbarian Test Quest   
    MARAVILHOOOOOOSOS, como vocês estão? Espero que estejam bem. 😍
    Esses dias fuçando as profundezas sombrias do meu computador encontrei essa quest, a Barbarian Test Quest, do tibia global e agora compartilho-a com vocês. Para quem não conhece, é aquela quest que dá alguns acessos na cidade de Svargrond do tibia global.
    Mais informações, visite o link: https://www.tibiawiki.com.br/wiki/Barbarian_Test_Quest
    As falas do NPC estão 99% iguais ao do tibia global, salvo algumas pequenas modificações/adaptações feitas por mim dando o meu toque, é claro 🤗. (todos gostam do meu toque) Obviamente, a quest se aplica melhor para servidores de tibia clássico, mas deixei os id's dos itens facilmente editáveis para você adaptar para o seu servidor, seja ele de qual tipo for, para TFS 0.4 ou OTX 2.x.
     
    Configuração:
     
    1) Em data/lib, crie um arquivo chamado Barbarian Test Quest.lua e cole isto dentro:
     
     
    2) Em data/npc/scripts, crie um arquivo chamado Sven.lua e cole isto dentro:
     
     
    O arquivo.xml do NPC Sven, em data/npc é o seguinte:
    <?xml version="1.0" encoding="UTF-8"?> <npc name="Sven" script="Sven.lua" walkinterval="2000" floorchange="0"> <health now="100" max="100"/> <look type="143" head="76" body="100" legs="132" feet="97" addons="3" mount="0"/> </npc> 3) Em data/actions/scripts, aconselho criar uma pasta chamada barbarian_test para colocar os arquivos referentes à quest. Dentro dessa pasta, um por um, coloque os arquivos com os nomes abaixo:
     
    bucketmead.lua
     
    meadhorn.lua
     
    mammothpushing.lua
     
    Em data/actions.xml adicione as tags abaixo: (caso altere os ids dos itens para adaptar ao seu servidor, lembre de alterá-los nas tags também)
    <action actionid="8952" script="barbarian_test/bucketmead.lua" /> <action itemid="7140;7141" script="barbarian_test/meadhorn.lua" /> <action itemid="7176" script="barbarian_test/mammothpushing.lua" /> Coloque o actionid 8952 (ou o valor que desejar, lembrando de modificar na tag no actions.xml) no balde de rum localizado próximo ao NPC.
     

     
    Lembre de colocar um NPC adicional ao lado do NPC Sven que venda "rum" para que o jogador possa ficar bêbado e realizar a última missão (missão do mammoth).
        
     
    OBS: Ao finalizar a quest, o jogador receberá a storage 87345 igual a 1. Essa informação pode ser útil para dar acesso a determinadas áreas somente após terminar a quest, por exemplo.
     
    É isso. Espero que seja útil ao servidores que desejam ter um pouquinho mais de RPG. GRANDE ABRAÇO! 😉
     
    Esse script faz parte de um conjunto de quests do tibia global que pretendo ir fazendo aos poucos a depender do feedback do pessoal.
    Veja também:
     
  11. Upvote
    Wakon reacted to Vodkart in [8.6] Task System 4.0! (Task system + Daily Task System)   
    Removido:
     
    *Boss Room
    *Rank Task
    *Prêmios para os 10 primeiros a terminar todas as tasks
     
    Adicionado:
     
    *Daily Task System (Sistema exclusivo de Task diario, podendo pegar 1x a cada 24 hrs, irei explicar mais depois.)
    *Task agora é por progresso, você não pode sair e voltar, terá que terminar a task 1 para avançar para a task  2, assim sucessivamente.
    *Task Points
    *Level para realizar a task
    *Nova talkaction que mostra uma janela de informações sobre o level da task, premios que irá receber, progresso, etc...
    *Items para entrega(Se o jogador deverá levar algum item junto com a quantidade de monstro morta) para finalizar a task
    *Sistema de look Task (Varia de acordo com a sua quantidade de Task Points, podendo ficar por exemplo como "Huntsman", "Ranger", etc...(alterável)
    *Mods e npc mais "clean", várias linhas removidas e o sistema está mais rápido
    *Vou Adicionar "scripts extras" Como:
    --> Tile que só passa quem tiver permissão depois de finalizar determinada quest
     --> Npc de Boss Room para entrar e enfrentar o monstro quem fez determinada quest
     
     
    [+] Resumo do Task system + Daily Task System [+]
     
    Task System: É o sistema de task "original", onde consiste em matar determinada quantidade de monstros(E entregar certo itens <- é configurável), para receber recompensas como Exp, Money e Items.
     
    Algumas mudanças do simple task 3.0 para o 4.0 foram:
     
    [+] O sistema agora é por progresso, isso quer dizer que você terá que ir terminando a quest para avançar para a seguinte.
    [+] O sistema Também recebeu uma alteração, fazendo com que as Tasks precisem que o jogador tenha um level determinado
    [+] A tabela para edição está mais fácil, fazendo com que você adicione ou remova monstros com mais tranquilidade, inclusive alterações das Rewards da Task.
     
    Daily Task System: É um sistema que desenvolvi para que os jogadores sempre estejam se comunicando com o npc de Task, no caso da Task Diaria, vária de acordo com o level do jogador, por exemplo:
     
    Jogadores entre level 6 ao 49 poderá cair em uma dessas 3 Task Diarias: Orcs, Tarantulas ou Wyverns
    Jogadores entre level 50 ao 79 poderá cair em uma dessas 3 Task Diarias: Dragons, Wailing Widows ou Ancient Scarabs
     
    E por ai vai, claro que você poderá aumentar as Task Diarias dependendo do level, eu fiz 3 para cada level que é pra postar, mas tudo isso você pode aumentar! Dependendo do seu servidor.
     
    E sim, você pode fazer a TASK "ORIGINAL" e a TASK "DIARIA" ao mesmo tempo! Ambas são distintas e possuem Rewards diferenciadas!
     
    No caso da Task diaria, levando em conta que você começou a fazer ela no dia 08/01 ás 20:00 Hrs, você tem até o dia 09/01 ás 20:00Hrs para termina-la e receber a recompensa, caso termine antes, a Task diaria só irá ficar disponível para repetição a partir desta mesma data 09/01 20:00 Hrs;
     
    [+] Caso você não termine a tempo, não tem problema, basta esperar este horário e começar uma nova Task.
    [+] Caso você começou a Daily Task e terminou antes desta data. mas por algum motivo esqueceu de entregar e a mesma passou do prazo, não tem importância, caso você tenha matado todos os monstros até 09/01 20:00 Hrs, você poderá entregar está Task em qualquer horário para receber suas Rewards e começar uma task a partir do momento em que você entregou! (INJUSTIÇA AQUI NÃO CARALHO).
     
    [+] Comandos Adicionais [+]
     
    /task -- Mostra as informações da sua Task Atual, como Nome da Task, Level, Rewards, Monstros que você poderá matar, Se tem que entregar algum Item junto, etc...
    /task daily -- É basicamente mostra a mesma informação da Task Principal, porém mostra também qual o prazo limite para entrega da task.
    /task counter -- É um comando que ATIVA ou DESATIVA o contador de monstros mortos na task no seu Channel.
     
    [+] Imagens [+]
     
    Cline neste link para ver algumas imagens da Task : http://imgur.com/a/eLIY3
     
     
     
    ------------------------------------------------ // --------------------------------------------------------------
     
    [+] Instalação do Sistema [+]
     
    Requisitos: Nível Médio de conhecimento em scripting LUA
     
    Pasta Mods
     
    Simple Task.xml
     
    https://pastebin.com/raw/P5hqMC3j
     
    NPC:
     
     
    Ludger.xml
     
    https://pastebin.com/raw/R56yLWHw
     
    simple_task.lua
     
    https://pastebin.com/raw/1mRzJ6aJ
     
    ---------------------------------------------- // ----------------------------------
     
    [+] configuração [+ ]
     
    Task System Principal
     
    task_sys = { [1] = {name = "Trolls", start = 176201, monsters_list = {"Troll","Troll champion"}, level = 8, count = 40, points = 0, items = {}, reward = {}, exp = 2000, money = 2000} }  
    [1]  --> O número entre os colchetes [] significa a ordem da Task, como a Task é por progresso sempre começará no 1 e irá pro [2], assim sucessivamente.
    name --> É o nome da task que o jogador irá fazer.
    start --> é a storage que indicará se o jogador começou a Task
    monster_list ={} --> É o nome dos monstros em que o jogador deverá caçar para completar a Task
    level --> É o level necessário para dar inicio á Task
    count --> É o número de monstros que o jogador tem que matar para completar a Task
    points --> Aqui determinada quantos Task points o jogador irá receber ao completar a Task
    items = {} --> Aqui determinada se além de matar os monstros, o jogador terá que entregar item também! Caso tenha só colocar o {ITEM_ID, QUANTIDADE} EX:
    items = {{2173,1}{2160,10},{2493,2}} rewad --> Aqui determinada se o jogador irá receber itens ao terminar a Task, mesma formula do items /\
    reward = {{2520,1},{2173,1}} exp --> Se o jogador irá receber Exp ao terminar a task. 0 ou quantidade de exp
    Money --> Se o jogador irá receber dinheiro ao terminar a task. 0 ou quantidade de dinheiro
     
     
    Daily Task System
     
    daily_task = { [1] = {name = "Orcs" ,monsters_list = {"Orc Berserker","Orc Rider","Orc Leader","Orc Warlord"}, count = 100, points = 0, reward = {}, exp = 5000, money = 10000} }  
    Segue o padrão da Task original, exceto que não precisa entregar items para o npc!
     
    Como funciona A randomização de level de acordo com a Daily task?
     
    Procure por está tabela em MODS
     
    local t = { [{6,49}] = {1,3}, [{50,79}] = {4,6}, [{80,129}] = {7,9}, [{130,math.huge}] = {10,12} }  
    entre as chaves e colchetes é o level do jogador para as Daily Task, Você pode adicionar quantas você quiser!
     
    Digamos que:
     
    [{6,49}] = {1,3}  --> Quer dizer que entre o level 6 ao 49 o jogador poderá cair na Daily Task número 1(Orcs), 2(Tarantulas) ou 3(Wyvern)!
    [{50,79}] = {4,6} --> Quer dizer que entre o level 50 ao 79 o jogador poderá cair na Daily Task número 4(Dragons), 5(Wailing Widows) ou 6(Ancient Scarabs)!
    ...
    [{130,math.huge}] = {10,12} --> Quer dizer que o jogador level 130 ou MAIS poderá cair na Daily Task número 10(Undead Dragons), 11(HydraS) ou 12(Ghastly Dragons)!
     
     
    Look Rank System
    Procure por está tabela em MODS
     
    local ranks = { [{1, 20}] = "Huntsman", [{21, 50}] = "Ranger", [{51, 100}] = "Big Game Hunter", [{101, 200}] = "Trophy Hunter", [{201, math.huge}] = "Elite Hunter" }  
    Entre 1-20 Task points o Rank será Huntsman
    Entre 21-50 Task posints o Rank será Ranger
    Entre 51-100 Task Points o rank será Big Game Hunter
    etc...
    Altere como quiser!
     
     
  12. Upvote
    Wakon got a reaction from Micael Pk in Sistema de Addon   
    Pra quem não entendeu a parte do goback.lua:
    Vá até o final do script, lá vocês encontrarão doPlayerSendCancel(cid, "This pokemon is fainted.") e logo acima um "else", ai é só colar o código acima do "else".
    local pk = getCreatureSummons(cid)[1] local pb = getPlayerSlotItem(cid, 8).uid local look = getItemAttribute(pb,"addon") if not look then doSetItemAttribute(pb,"addon",0) return false end if look > 0 then doSetCreatureOutfit(pk, {lookType = look}, -1) return true end  
  13. Like
    Wakon got a reaction from ericles in Modificar Client, Ajuda!   
    A única maneira de customizar o client do Tibia é editando pelo Hex Editor, creio eu.
    Para isso você pode utilizar o XVI32: 
    http://www.handshake.de/user/chmaas/delphi/download/xvi32.zip
     
    1 - Abra o XVI32, clique em File/Open... e selecione o executável do Tibia.
    2 - Aperte CTRL + F, selecione Text String e coloque o que você quer editar ( Exemplo: Magic Level )
    3 - Ai quando encontrar você tem que substituir as letras (Exemplo: Magia Level), para apagar o Level você deve apertar espaço, ou trocar o valor da esquerda na tabela de Hexadecimal por 00.
     
    Cuidados:
    Não pode deletar NADA, absolutamente NADA, se você apertar backspace e deletar algum character, vai bugar e o cliente não vai abrir mais!
    Você só pode substituir as letras, não pode dar um tamanho a mais, como não pode deletar não pode aumentar também!
    Exemplo: Magic Level para Magia do Personagem, vai bugar o cliente!
     
    É isso, tem um Tibia 8.60 meu que eu traduzi, se quiser tirar algumas ideias, apesar que as novas versões tem certas limitações se não me engano!
    http://www.tibiaking.com/forum/topic/51473-cliente-860-traduzido/
  14. Like
    Wakon got a reaction from ericles in Modificar Client, Ajuda!   
    A única maneira de customizar o client do Tibia é editando pelo Hex Editor, creio eu.
    Para isso você pode utilizar o XVI32: 
    http://www.handshake.de/user/chmaas/delphi/download/xvi32.zip
     
    1 - Abra o XVI32, clique em File/Open... e selecione o executável do Tibia.
    2 - Aperte CTRL + F, selecione Text String e coloque o que você quer editar ( Exemplo: Magic Level )
    3 - Ai quando encontrar você tem que substituir as letras (Exemplo: Magia Level), para apagar o Level você deve apertar espaço, ou trocar o valor da esquerda na tabela de Hexadecimal por 00.
     
    Cuidados:
    Não pode deletar NADA, absolutamente NADA, se você apertar backspace e deletar algum character, vai bugar e o cliente não vai abrir mais!
    Você só pode substituir as letras, não pode dar um tamanho a mais, como não pode deletar não pode aumentar também!
    Exemplo: Magic Level para Magia do Personagem, vai bugar o cliente!
     
    É isso, tem um Tibia 8.60 meu que eu traduzi, se quiser tirar algumas ideias, apesar que as novas versões tem certas limitações se não me engano!
    http://www.tibiaking.com/forum/topic/51473-cliente-860-traduzido/
  15. Upvote
    Wakon reacted to Nother in Spell Buff que da Outfit   
    FALA GALERA, VIM AQUI TRAZER UM SCRIPT QUE EDITEI,
    É UM BUFF QUE MUDA SUA OUTFIT POR UM CERTO TEMPO COM UM COOLDOWN PARA USAR DE NOVO.
    NA SCRIPT EDITEI UM KAIOKEN NO DBO
    NÃO SOU SCRIPTER APENAS FUI PEGANDO VÁRIOS SCRIPTS DO TK E TESTANDO ATÉ ENCONTRAR O ERRO
    DELES, LEVEI MUITO TEMPO PRA AJUSTAR ISSO NO MEU SERVER, SE CONSEGUIREM USAR ELE TAI AI PARA VOCÊS
    local outfit = {lookType = 3} -- outfit local tempo = 30 -- tempo em segundos. local effect = {41} -- effect no player, caso queira apenas 1, basta remover os outros numeros. local config = { storage = 112005, cooldown = 90, --- tempo entre um uso e outro } local ml = 20 -- quantos ira aumentar o skill de ML local skillfist = 20 -- quantos ira aumentar o skill de Fist local skillsword = 20 -- quantos ira aumentar o skill de Sword local skillaxe = 20 -- quantos ira aumentar o skill de Axe local skillclub = 20 -- quantos ira aumentar o skill de Club local skilldistance = 20 -- quantos ira aumentar o skill de Distance local skillshield = 20 -- quantos ira aumentar o skill de Shield local health = 0 -- A cada 1 segundo quantos aumentar de vida local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, 0) local condition = createConditionObject(CONDITION_ATTRIBUTES) setConditionParam(condition, CONDITION_PARAM_TICKS, tempo*1000) setConditionParam(condition, CONDITION_PARAM_STAT_MAGICLEVEL, ml) setConditionParam(condition, CONDITION_PARAM_SKILL_FIST, skillfist) setConditionParam(condition, CONDITION_PARAM_SKILL_SWORD, skillsword) setConditionParam(condition, CONDITION_PARAM_SKILL_AXE, skillaxe) setConditionParam(condition, CONDITION_PARAM_SKILL_CLUB, skillclub) setConditionParam(condition, CONDITION_PARAM_SKILL_DISTANCE, skilldistance) setConditionParam(condition, CONDITION_PARAM_SKILL_SHIELD, skillshield) setConditionParam(condition, CONDITION_PARAM_OUTFIT, outfit) setCombatCondition(combat, condition) local condition = createConditionObject(CONDITION_HASTE) setConditionParam(condition, CONDITION_PARAM_SPEED, 250) setConditionParam(condition, CONDITION_PARAM_TICKS, tempo*1000) setConditionParam(condition, CONDITION_PARAM_BUFF, TRUE) setCombatCondition(combat, condition) local condition = createConditionObject(CONDITION_REGENERATION) setConditionParam(condition, CONDITION_PARAM_SUBID, 1) setConditionParam(condition, CONDITION_PARAM_BUFF, TRUE) setConditionParam(condition, CONDITION_PARAM_TICKS, tempo*1000) setConditionParam(condition, CONDITION_PARAM_HEALTHGAIN, health) setConditionParam(condition, CONDITION_PARAM_HEALTHTICKS, 1000) setCombatCondition(combat, condition) local sys = createConditionObject(CONDITION_OUTFIT) setConditionParam(sys, CONDITION_PARAM_TICKS, tempo) addOutfitCondition(sys, outfit) setCombatCondition(combat, sys) function magicEffect41(tempo2,tempo3,cid) if (isCreature(cid)) then if getPlayerStorageValue(cid, 102053) > 0 and getCreatureCondition(cid, CONDITION_REGENERATION, 1) then for i=1, #effect do local position = {x=getPlayerPosition(cid).x, y=getPlayerPosition(cid).y, z=getPlayerPosition(cid).z} doSendMagicEffect(position, effect[i]) end end end end local sys = createConditionObject(CONDITION_OUTFIT) setConditionParam(sys, CONDITION_PARAM_TICKS, tempo*1000) addOutfitCondition(sys, outfit) setCombatCondition(combat, sys) function onCastSpell(cid, var) local pos = getCreaturePosition(cid) if isPlayer(cid) then if os.time() - getPlayerStorageValue(cid, config.storage) >= config.cooldown then setPlayerStorageValue(cid, config.storage, os.time()) else doPlayerSendCancel(cid, "Voce deve aguardar "..(config.cooldown - (os.time() - getPlayerStorageValue(cid, config.storage))).." segundos, para usar o Kaioken novamente!") doSendMagicEffect(pos, 2) return false end end local position129 = {x=getPlayerPosition(cid).x, y=getPlayerPosition(cid).y, z=getPlayerPosition(cid).z} if getPlayerStorageValue(cid, 102053) ~= 1 or getCreatureCondition(cid, CONDITION_REGENERATION, 1) == false then doCombat(cid, combat, var) tempo2 = 0 while (tempo2 ~= (tempo*1000)) do addEvent(magicEffect41, tempo2, tempo2, tempo*1000, cid) tempo2 = tempo2 + 300 end setPlayerStorageValue(cid, 102053,1) -- storage verifica transformado, quando = 1 player esta transformado. doCreatureSay(cid, "KAIOKEEEEEEN!", TALKTYPE_MONSTER) doSendMagicEffect(position129, 41) -- id do effect que vai aparecer quando usar a habilidade else doPlayerSendCancel(cid, "Desculpe, voce ja esta transformado.") end return true end O SEGREDO E SÓ NÃO DESISTIR CASO ENCONTRE UM SCRIPT QUE NÃO FUNCIONE 😉
     
  16. Thanks
    Wakon got a reaction from LeoTK in {Ajuda} Colocar storage em spell.   
    Tenta ai:
    -- SpellCreator generated. -- =============== COMBAT VARS =============== -- Areas/Combat for 0ms local combat0_Brush_2 = createCombatObject() setCombatParam(combat0_Brush_2, COMBAT_PARAM_EFFECT, CONST_ME_ICETORNADO) setCombatParam(combat0_Brush_2, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) setCombatArea(combat0_Brush_2,createCombatArea({{2}})) function getDmg_Brush_2(cid, level, maglevel)     return (1500)*-1,(3000)*-1 end setCombatCallback(combat0_Brush_2, CALLBACK_PARAM_LEVELMAGICVALUE, "getDmg_Brush_2") local dfcombat0_Brush_2 = {CONST_ANI_SMALLICE}local combat0_Brush_2 = createCombatObject() setCombatParam(combat0_Brush_2, COMBAT_PARAM_EFFECT, CONST_ME_FIREATTACK) setCombatParam(combat0_Brush_2, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatArea(combat0_Brush_2,createCombatArea({{2}})) function getDmg_Brush_2(cid, level, maglevel)     return (1600)*-1,(3200)*-1 end setCombatCallback(combat0_Brush_2, CALLBACK_PARAM_LEVELMAGICVALUE, "getDmg_Brush_2") local dfcombat0_Brush_2 = {CONST_ANI_EXPLOSION}local combat0_Brush = createCombatObject() setCombatParam(combat0_Brush, COMBAT_PARAM_EFFECT, CONST_ME_SOUND_BLUE) setCombatParam(combat0_Brush, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatArea(combat0_Brush,createCombatArea({{2}})) function getDmg_Brush(cid, level, maglevel)     return (1700)*-1,(3400)*-1 end setCombatCallback(combat0_Brush, CALLBACK_PARAM_LEVELMAGICVALUE, "getDmg_Brush") local dfcombat0_Brush = {CONST_ANI_POWERBOLT}local combat0_Brush = createCombatObject() setCombatParam(combat0_Brush, COMBAT_PARAM_EFFECT, CONST_ME_DRAWBLOOD) setCombatParam(combat0_Brush, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatArea(combat0_Brush,createCombatArea({{0, 0, 2, 0, 0}, {0, 1, 1, 1, 0}, {1, 1, 1, 1, 1}})) function getDmg_Brush(cid, level, maglevel)     return (1800)*-1,(3500)*-1 end setCombatCallback(combat0_Brush, CALLBACK_PARAM_LEVELMAGICVALUE, "getDmg_Brush") local dfcombat0_Brush = {CONST_ANI_WHIRLWINDAXE,0,1,1,2,0,2,-1,2,-2,2,-1,1,2,2,1,1} -- Areas/Combat for 100ms local combat1_Brush = createCombatObject() setCombatParam(combat1_Brush, COMBAT_PARAM_EFFECT, CONST_ME_GIANTICE) setCombatParam(combat1_Brush, COMBAT_PARAM_TYPE, COMBAT_ICEDAMAGE) setCombatArea(combat1_Brush,createCombatArea({{2}})) function getDmg_Brush(cid, level, maglevel)     return (1500)*-1,(3000)*-1 end setCombatCallback(combat1_Brush, CALLBACK_PARAM_LEVELMAGICVALUE, "getDmg_Brush") local dfcombat1_Brush = {CONST_ANI_ICE}local combat1_Brush = createCombatObject() setCombatParam(combat1_Brush, COMBAT_PARAM_EFFECT, CONST_ME_FIREAREA) setCombatParam(combat1_Brush, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatArea(combat1_Brush,createCombatArea({{2}})) function getDmg_Brush(cid, level, maglevel)     return (1600)*-1,(3200)*-1 end setCombatCallback(combat1_Brush, CALLBACK_PARAM_LEVELMAGICVALUE, "getDmg_Brush") local dfcombat1_Brush = {CONST_ANI_FIRE}local combat1_Brush_2 = createCombatObject() setCombatParam(combat1_Brush_2, COMBAT_PARAM_EFFECT, CONST_ME_HOLYAREA) setCombatParam(combat1_Brush_2, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatArea(combat1_Brush_2,createCombatArea({{2}})) function getDmg_Brush_2(cid, level, maglevel)     return (1700)*-1,(3400)*-1 end setCombatCallback(combat1_Brush_2, CALLBACK_PARAM_LEVELMAGICVALUE, "getDmg_Brush_2") local dfcombat1_Brush_2 = {CONST_ANI_HOLY}local combat1_Brush_2 = createCombatObject() setCombatParam(combat1_Brush_2, COMBAT_PARAM_EFFECT, CONST_ME_CRAPS) setCombatParam(combat1_Brush_2, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatArea(combat1_Brush_2,createCombatArea({{1, 1, 1, 1, 1}, {0, 1, 1, 1, 0}, {0, 0, 2, 0, 0}})) function getDmg_Brush_2(cid, level, maglevel)     return (1800)*-1,(3500)*-1 end setCombatCallback(combat1_Brush_2, CALLBACK_PARAM_LEVELMAGICVALUE, "getDmg_Brush_2") local dfcombat1_Brush_2 = {CONST_ANI_WHIRLWINDSWORD,2,-2,1,-2,0,-2,-1,-2,-2,-2,0,-1,-1,-1,1,-1} -- Areas/Combat for 200ms local combat2_Brush_2 = createCombatObject() setCombatParam(combat2_Brush_2, COMBAT_PARAM_EFFECT, CONST_ME_FIREATTACK) setCombatParam(combat2_Brush_2, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) setCombatArea(combat2_Brush_2,createCombatArea({{2}})) function getDmg_Brush_2(cid, level, maglevel)     return (1600)*-1,(3200)*-1 end setCombatCallback(combat2_Brush_2, CALLBACK_PARAM_LEVELMAGICVALUE, "getDmg_Brush_2") local dfcombat2_Brush_2 = {CONST_ANI_EXPLOSION}local combat2_Brush_3 = createCombatObject() setCombatParam(combat2_Brush_3, COMBAT_PARAM_EFFECT, CONST_ME_YALAHARIGHOST) setCombatParam(combat2_Brush_3, COMBAT_PARAM_TYPE, COMBAT_HOLYDAMAGE) setCombatArea(combat2_Brush_3,createCombatArea({{2}})) function getDmg_Brush_3(cid, level, maglevel)     return (1700)*-1,(3400)*-1 end setCombatCallback(combat2_Brush_3, CALLBACK_PARAM_LEVELMAGICVALUE, "getDmg_Brush_3") local dfcombat2_Brush_3 = {CONST_ANI_SMALLHOLY}local combat2_Brush_3 = createCombatObject() setCombatParam(combat2_Brush_3, COMBAT_PARAM_EFFECT, CONST_ME_GROUNDSHAKER) setCombatParam(combat2_Brush_3, COMBAT_PARAM_TYPE, COMBAT_PHYSICALDAMAGE) setCombatArea(combat2_Brush_3,createCombatArea({{1, 0, 0, 0, 1}, {1, 1, 2, 1, 1}, {1, 0, 0, 0, 1}})) function getDmg_Brush_3(cid, level, maglevel)     return (1800)*-1,(3500)*-1 end setCombatCallback(combat2_Brush_3, CALLBACK_PARAM_LEVELMAGICVALUE, "getDmg_Brush_3") local dfcombat2_Brush_3 = {CONST_ANI_WHIRLWINDCLUB,-2,-1,-2,1,-2,0,-1,0,2,1,2,-1,2,0,1,0} -- =============== CORE FUNCTIONS =============== local function RunPart(c,cid,var,dirList,dirEmitPos) -- Part     if (isCreature(cid)) then         doCombat(cid, c, var)         if (dirList ~= nil) then -- Emit distance effects             local i = 2;             while (i < #dirList) do                 doSendDistanceShoot(dirEmitPos,{x=dirEmitPos.x-dirList[i],y=dirEmitPos.y-dirList[i+1],z=dirEmitPos.z},dirList[1])                 i = i + 2             end                 end     end end function onCastSpell(cid, var)     local storage = 21203     if getPlayerStorageValue(cid, storage) <= 0 then     doPlayerSendCancel(cid, "Blocked.")     return true     end     local startPos = getCreaturePosition(cid)     RunPart(combat0_Brush_2,cid,var,dfcombat0_Brush_2,startPos)     RunPart(combat0_Brush_2,cid,var,dfcombat0_Brush_2,startPos)     RunPart(combat0_Brush,cid,var,dfcombat0_Brush,startPos)     RunPart(combat0_Brush,cid,var,dfcombat0_Brush,startPos)     addEvent(RunPart,100,combat1_Brush,cid,var,dfcombat1_Brush,startPos)     addEvent(RunPart,100,combat1_Brush,cid,var,dfcombat1_Brush,startPos)     addEvent(RunPart,100,combat1_Brush_2,cid,var,dfcombat1_Brush_2,startPos)     addEvent(RunPart,100,combat1_Brush_2,cid,var,dfcombat1_Brush_2,startPos)     addEvent(RunPart,200,combat2_Brush_2,cid,var,dfcombat2_Brush_2,startPos)     addEvent(RunPart,200,combat2_Brush_3,cid,var,dfcombat2_Brush_3,startPos)     addEvent(RunPart,200,combat2_Brush_3,cid,var,dfcombat2_Brush_3,startPos)     return true end
  17. Upvote
    Wakon got a reaction from niltinho10 in Atributo de item que aumente velocidade de ataque   
    Esta é uma mensagem automática! Este tópico foi movido para a área correta.
    Pedimos que você leia as regras do fórum.
     
  18. Upvote
    Wakon reacted to Coltera in [Show OFF] - Shopping Modal   
    Novo Shopping in-game usando Modal via Banco de Dados!
    Será que fica bom? Oque vocês acham?

     
     
     
     
  19. Like
    Wakon got a reaction from pedrockk in Quero script de ao matar pokemon aparecer teleport   
    Em "Data/creaturescripts/scripts", copie e cole um arquivo.lua e renomeie para deathTP.lua, apague tudo e cole:
    local t = { tpId = 1387, -- ID do teleport. tpNew = {x = 1057, y = 1057, z = 7}, -- Local onde irá aparecer o teleport. tpPos = {x = 1059, y = 1059, z = 7}, -- Local para onde o teleport irá levar. monster = "rattata", -- Nome do monstro(pokémon/normal), coloque em letra minúscula. timeRemove = 5 -- Tempo para remover o teleport em segundos. } function onKill(cid, target) local function removeTeleport(position) position.stackpos = 1 if (getThingfromPos(position).itemid == t.tpId) then doRemoveItem(getThingfromPos(position).uid) doSendMagicEffect(t.tpNew, 13) end return true end if (isMonster(target) and string.lower(getCreatureName(target)) == t.monster) then doCreateTeleport(t.tpId, t.tpPos, t.tpNew) doCreatureSay(target, "Você tem ".. t.timeRemove .." segundos para entrar no teleport.", TALKTYPE_ORANGE_1, 0, 0, t.tpNew) addEvent(removeTeleport, t.timeRemove * 1000, t.tpNew) end return true end Em "Data/creaturescripts", abra o creaturescripts.xml e adicione:
    <event type="kill" name="deathTP" script="deathTP.lua"/> Novamente em "Data/creaturescripts/scripts", no arquivo login.lua, adicione:
    registerCreatureEvent(cid, "deathTP") Se der algum problema, me avise.
  20. Like
    Wakon got a reaction from Brunoxz in Me mostrem conteudo para estudar script.lua   
    @UsToOliNN, leia esses tópicos, irá te ajudar a ter uma boa base, depois é só treinar e treinar:
    http://www.tibiaking.com/forum/forums/topic/18196-aulas-de-scripting-lua
     
    Quando eu iniciei, o que mais me ajudou foi ajudar, como me faltava criatividade(e falta até hj ;/), eu ficava sempre de olho na seção de scripts esperando alguém pedir algum script pra eu tentar fazer, então você pode tentar isso também, talvez lhe ajude.
  21. Like
    Wakon got a reaction from Ackerzin in Script de level maximo com storage.   
    Em "Data/creaturescripts/scripts", copie e cole um arquivo.LUA e renomeie para maxLevel.lua, apague tudo e cole:
    local t = {     storage = {44440, 4}, -- Storage e valor necessário. maxLevel = 25 -- Level máximo. } function onAdvance(cid, skill, oldLevel, newLevel)     if skill == SKILL__LEVEL then     if getPlayerStorageValue(cid, t.storage[1]) ~= t.storage[2] then     if newLevel >= t.maxLevel then     doPlayerAddExp(cid, getExperienceForLevel(t.maxLevel)-getPlayerExperience(cid)) doPlayerSendCancel(cid, "Você atingiu o level máximo, faça a quest para continuar upando.")     end end end   return true end Agora em "Data/creaturescripts", abra o arquivo creaturescripts.xml e adicione a tag:
    <event type="advance" name="maxLevel" event="script" value="maxLevel.lua"/> Novamente em "Data/creaturescripts/scripts", abra o arquivo login.lua e adicione:
    registerCreatureEvent(cid, "maxLevel") Caso dê algum problema ou falte algo, me avise.
  22. Like
    Wakon reacted to underewarr in Fix TFS 0.4 Slots   
    Se precisar deste conteudo atualizado mande um email para
    underewar@gmail.com
  23. Upvote
    Wakon reacted to SuggestName in Paper Doll System   
    Fala galera, só gostaria de compartilhar a minha ultima criação, um paper doll para tibia global.
     

     
    Video demonstração
     
     
    Por enquanto é isso pessoal, conforme eu atualizar o código eu mostro para vocês...
  24. Like
    Wakon reacted to underewarr in getPlayerSecureMode (cid) / getPlayerFightMode (cid)   
    Em luascript.cpp 
     
    Em luascript.cpp 
    getPlayerSecureMode (CID) Vamos criar esse comando
    Código C++:

    getPlayerFightMode (CID) Vamos criar esse comando
    Código C++:
    Simples e fácil vou deixar um exemplo para os leigos.
    Exemplo em lua:
    qual quer duvida poste aqui ,script é bem simples.
  25. Like
    Wakon reacted to Natanael Beckman in DEV C++ Compilando TFS no Windows   
    DEV C++,  aprenda a compila uma source TFS!
     
    Downloads(Baixe de acordo as configurações do seu windows):
    DEV C++ CONFIGURADO PARA 32BITS
    DEV C++ CONFIGURADO PARA 64BITS
    REV 3884 TFS 0.4
     
    Certo, feitos os downloads, extrai DEV C++ no Disco C e REV 3884 em Documentos.
    ======================================
    Abra o DEV C++:
    ======================================

    ======================================
    Abra a Source:
    ======================================

    ======================================
    Localize a pasta da Source e abra o arquivo TheForgottenServer.dev, Documentos> trunk.r3884> dev-cpp> TheForgottenServer.dev:
    ======================================

    =============================================================

    ======================================
    Aguarde carregar todos os arquivos:
    ======================================

    ======================================
    Vamos adicionar o parâmetro -D__CONSOLE__ no teclado digita ALT + P, clique em parameters e adicione o parâmetro... Feito? clique em OK:
    ======================================

    ======================================
    Vamos compilar Source, no teclado digite CTRL+F9 e aguarde finalizar o processo:
    ======================================

    ======================================
    Se der tudo certo em Log vai estar como mostra a imagem abaixo:
    ======================================

    ======================================
    Verifique na pasta Documentos> trunk.r3884> dev-cpp você vai encontrar o arquivo TheForgottenServer.exe e pronto meu parabéns você compilou!
    ======================================

    ===========================================
    Só isso galera tutorial rápido resumido e útil!
    Créditos Natanael Beckman!    
    ===========================================     
     
    Caso você adquira uma source com apenas os arquivos .cpp e .h e não sabe como compilar o projeto, abaixo vamos explicar:
    Na pasta onde está localizado os arquivos .cpp e .h crie uma pasta chamada dev-cpp, e dentro dela adicione uma imagem icone.
     

     
    Abra o DEV-C++, clique em  File> New> Project:
     

     
    Logo em seguida selecione Empty Project, em name terá o nome Project1 altere utilize o nome quer quiser, após isso clique em OK e em seguida selecione a pasta dev-cpp que criamos:
     

     
    Agora selecione a opção Win32GUI caso use source OTX ou TFS selecione Win32Console ao lado << Browse selecione a imagem do icone que está na pasta Dev-Cpp.
     

     
    No mesmo menu na aba Parameters em C++ compiler adicione os seguintes parâmetros:
    -D__ENABLE_SERVER_DIAGNOSTIC__ -D__ROOT_PERMISSION__ -D__GROUND_CACHE__ -D__USE_SQLITE__ -D__USE_MYSQL__ -D__CONSOLE__ -D__WAR_SYSTEM__ E em Linker adicione as seguintes libs:
    -lboost_filesystem -lboost_thread -lboost_system -lboost_regex -lsqlite3 -lwsock32 -llua5.1 -lws2_32 -leay32 -lmysql -lxml2 -lgmp -lz -s   No mesmo Menu na aba Build Option escreva na segunda coluna horizontal escreva Obj e dê OK.     Na lateral terá o nome do seu projeto o meu no caso é The Forgotten Server, clique com o botão direito do mouse em cima do nome e clique na opção Add Project:      Selecione na pasta da sua source todos os arquivos .cpp e .h após isso salva o projeto e já pode compilar CTRL+F9:         OpenSSL 0.9.8   1º baixe http://devpaks.org/details.php?devpak=73 2° abra Dev-Cpp > Tools > Packager Manager > Install > Seleciona o arquivo baixado e instala, fecha abre e testa!
      Clica aqui \/

Open Tibia Server

Quer aprender a criar seu próprio servidor de Tibia? Então está no lugar certo, aqui você encontrará milhares de tutorias, scripts, códigos, mapas e utilitários para que você possa fazer o seu próprio servidor de Tibia começando do zero.

Redes Sociais

Anuncie no Tibia King

Precisa de mais visibilidade em seus projetos? Quer fazer um plano publicitário para o seu servidor? Anuncie no Tibia King e faça sua divulgação, possuímos centenas de acessos simultâneos e milhares diários, com certeza será a sua solução!

×
×
  • Create New...