Ir para conteúdo

Elwyn

Membro
  • Registro em

  • Última visita

Tudo que Elwyn postou

  1. Elwyn postou uma resposta no tópico em Suporte Tibia OTServer
    Só aplica os 20s de cd se o tile que você usar a runa tiver uma mw existente.
  2. local horas = { {"16:00:00", "16:10:00"}, {"19:00:00", "19:10:00"} } local time_now = os.date("%X") for _, hour in pairs(horas) do if time_now < hour[1] or time_now > hour[2] then return true end end
  3. Elwyn postou uma resposta no tópico em Suporte Tibia OTServer
    Troca stopEvent(granEffect[cid]) por stopEvent(events[cid])
  4. Elwyn postou uma resposta no tópico em Suporte Tibia OTServer
    Posta a função granEffect junto com onde é definido uma tabela com nome granEffect também
  5. function getNots(cid) local accountId = getAccountNumberByPlayerName(cid) local nots = db.storeQuery("SELECT `qntnot` FROM `accounts` WHERE `id` = " .. accountId) local return_value = 0 if nots then return_value = result.getDataInt(nots, 'qntnot') result.free(nots) end return return_value end
  6. Tem certeza que você está usando TFS 1.0? TFS 1.1 compilando as sources do repositório, o script funciona: https://github.com/otland/forgottenserver/ TFS 1.0 compilando as sources do branch, o script funciona: https://github.com/otland/forgottenserver/tree/1.0
  7. Você tem a source, certo? Veja em creaturescripts.cpp ou creatureevents.cpp e procure por onDeath, vai ter junto de onDeath outras callbacks. Copie todas elas aqui. Crie o hábito de procurar como funciona tal coisa no OT, mesmo que você não entenda muito de programação. Leia o básico de Lua e C++ e procure terra firme, se não você vai ficar perdido (por mais de 2 semanas) sempre que tiver uma dúvida.
  8. Copia exatamente desse jeito: local condition = Condition(CONDITION_ATTRIBUTES) condition:setParameter(CONDITION_PARAM_TICKS, 10000) condition:setParameter(CONDITION_PARAM_BUFF_SPELL, true) local combat = Combat() combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_GREEN) combat:setParameter(COMBAT_PARAM_AGGRESSIVE, 0) combat:setCondition(condition) function onCastSpell(creature, var) creature:registerEvent("CustomSpell") local cid = creature:getId() addEvent( function() local player = Player(cid) if player then player:unregisterEvent("CustomSpell") end end, 10*1000 ) return combat:execute(creature, var) end Acabei de testar no TFS 1.0, deveria estar funcionando corretamente. Tem certeza que está usando o script que eu postei?
  9. Não deveria dar esse erro. Copie e cole o script aqui.
  10. Existe alguma callback que chama ao trocar de outfit, ou dar mount?
  11. Você adicionou a parte que eu destaquei no seu código? Ela não está adicionada normalmente, eu adicionei para mostrar. Depois de adicionar você tem que compilar também. E detalhe, se sua source não for do TFS 1.0 pra cima, é capaz de dar erro nessa linha porque houveram muitas mudanças de 0.3.6 até 1.0
  12. https://books.google.com.br/books?id=lWTEnQEACAAJ&dq=C%2B%2B+how+to+program&hl=en&sa=X&ei=IXSIVKD2CceeNovDg-AB&ved=0CB4Q6AEwAA http://www.lua.org/manual/5.2/ https://github.com/otland/forgottenserver/ http://learnpixelart.com/ http://otland.net/threads/10-50-remeres-map-editor.211040/ https://github.com/edubart/otclient Pra começar do 0 você vai ter que aprender Lua, C++, Pixel Art e como mapear. Tudo que você precisa pra começar do zero estão nesses links, mas se você está começando a aprender do 0 também vai demorar um pouco.
  13. TFS 1.1: Em Player::toggleMount(bool): bool Player::toggleMount(bool mount) { if ((OTSYS_TIME() - lastToggleMount) < 3000) { sendCancelMessage(RETURNVALUE_YOUAREEXHAUSTED); return false; } if (mount) { if (isMounted()) { return false; } if (!group->access && _tile->hasFlag(TILESTATE_PROTECTIONZONE)) { sendCancelMessage(RETURNVALUE_ACTIONNOTPERMITTEDINPROTECTIONZONE); return false; } uint8_t currentMountId = getCurrentMount(); if (currentMountId == 0) { sendOutfitWindow(); return false; } Mount* currentMount = Mounts::getInstance()->getMountByID(currentMountId); if (!currentMount) { return false; } if (!hasMount(currentMount)) { setCurrentMount(0); sendOutfitWindow(); return false; } if (currentMount->premium && !isPremium()) { sendCancelMessage(RETURNVALUE_YOUNEEDPREMIUMACCOUNT); return false; } if (hasCondition(CONDITION_OUTFIT)) { sendCancelMessage(RETURNVALUE_NOTPOSSIBLE); return false; } if (defaultOutfit.lookType == 266) { sendCancelMessage(RETURNVALUE_NOTPOSSIBLE); return false; } defaultOutfit.lookMount = currentMount->clientId; if (currentMount->speed != 0) { g_game.changeSpeed(this, currentMount->speed); } } else { if (!isMounted()) { return false; } dismount(); } g_game.internalCreatureChangeOutfit(this, defaultOutfit); lastToggleMount = OTSYS_TIME(); return true; } Como você pode ver em: if (defaultOutfit.lookType == 266) { sendCancelMessage(RETURNVALUE_NOTPOSSIBLE); return false; } Player com lookType 266 não pode usar mount. Nesse caso lookType 266 é outfit de CM
  14. Elwyn postou uma resposta no tópico em Suporte Tibia OTServer
    https://github.com/
  15. Não que possa dar errado, ela só não vai ser exata. E ela não é uma boa fórmula de exp http://www.wolframalpha.com/input/?i=%281.6180339^x+-+%28-0.6180339^x%29%29%2F%285^%281%2F2%29%29 Veja o gráfico no wolframalpha. Veja como a exp do level 5 ao 10 aumenta rápidamente. A partir do 10, o crescimento vai ficando cada vez maior. Aqui o gráfico da taxa de crescimento: http://www.wolframalpha.com/input/?i=derivate+%281.6180339^x+-+%28-0.6180339^x%29%29%2F%285^%281%2F2%29%29 Com essa fórmula, o nível máximo que alguém pode ter é algo próximo de 100. Um pouco antes de 100 a exp é tão grande que não tem como você guardar em uma variável de 64bits. Detalhe, uma variável de 64bits pode guardar até no máximo esse número: 1,844674407×10¹⁹ Experiencia necessária pro nível 100: 3.54223 × 10^20
  16. São números quebrados, toda a iteração com exp do player foi feita pensando em números inteiros então não recomendo usar essa fórmula, mas ficaria assim: static uint64_t getExpForLevel(int32_t lv) { lv--; return static_cast<uint64_t>(std::ceil(std::pow(1.6180339, lv) - std::pow(-0.6180339, lv))/std::sqrt(5)); } Esse cálculo tem bastante arredondamento. Dois na potencia, outro no resultado da subtração, outro no resultado da raiz de 5, outro no resultado da divisão e outro para dar cast de double para uint64_t
  17. Editei la, esqueci desse detalhe.
  18. Tem como mudar. static uint64_t getExpForLevel(int32_t lv) { lv--; return ((50ULL * lv * lv * lv) - (150ULL * lv * lv) + (400ULL * lv)) / 3ULL; } Essa é a fórmula para calcular experiencia pro próximo nível. [(50 * level³) - (150 * level²) + (400 * level)] / 3 Se quiser mudar, isso fica em player.h
  19. Elwyn postou uma resposta no tópico em Suporte & Pedidos
    Funciona com qualquer versão. https://pip.pypa.io/en/latest/installing.html depois roda: # pip3 install python-ptrace Creio que PyGtk já vem com quase todas distribuições linux, então é só tentar rodar.
  20. Se eu entendi corretamente a spell... Quando você anda sua outfit é uma, quando para volta para antiga, essa é a spell? Se for, então o script é esse: local config = { tempo = 10, -- tempo de uso da spell, é a duração que ela vai ter storage = 32710, -- storage em que vai ser salvo o tempo outfit = 137, --- lookType da outfit que irá ser modificada ao andar cooldown = 12 -- tempo entre 1 uso e outro (sempre deixar maior que tempo de uso da spell) } local combat = Combat() combat:setParameter(COMBAT_PARAM_EFFECT, CONST_ME_MAGIC_BLUE) combat:setParameter(COMBAT_PARAM_AGGRESSIVE, false) local condition = Condition(CONDITION_ATTRIBUTES) condition:setParameter(CONDITION_PARAM_TICKS, config.tempo * 1000) condition:setParameter(CONDITION_PARAM_SKILL_MELEEPERCENT, 135) condition:setParameter(CONDITION_PARAM_SKILL_SHIELDPERCENT, -100) condition:setParameter(CONDITION_PARAM_BUFF_SPELL, true) combat:setCondition(condition) function outfit(cid, key, id, tempo, lastPos, oldOutfit) local player = Creature(cid) if not player then return end if player:getStorageValue(key) - os.time() >= 0 then lastPos = lastPos or player:getPosition() if player:getPosition().x ~= lastPos.x or player:getPosition().y ~= lastPos.y or player:getPosition().z ~= lastPos.z then lastPos = player:getPosition() local atual = player:getOutfit() atual.lookType = id player:setOutfit(atual) else player:setOutfit(oldOutfit) end addEvent(function() outfit(cid, key, id, tempo, lastPos, oldOutfit) end , tempo) else return end end function onCastSpell(creature, var) if creature:getStorageValue(cid, config.storage) - os.time() >= (config.tempo - config.cooldown) then creature:sendCancelMessage(cid, "Your spell is in cooldown") return end creature:setStorageValue(config.storage, os.time() + config.tempo) outfit(creature:getId(), config.storage, config.outfit, 150, nil, creature:getOutfit()) return combat:execute(creature, var) end
  21. Elwyn postou uma resposta no tópico em Suporte Tibia OTServer
    Cria um novo arquivo lua na para creaturescripts/scripts e bota lá. Não esqueça de adicionar no XML também. Acabei de perceber um erro, ele cancela heal também. Editei, agora não cancela heal, consertei também um erro que dava seg fault no servidor. A propósito, a tag no .xml do creaturescripts é: <event type="healthchange" name="CustomSpell" script="custom.lua" /> troca custom.lua pelo nome do arquivo que você criou.
  22. Elwyn postou uma resposta no tópico em Suporte & Pedidos
    Eu demorei de achar o botão de "Jogar". Tenta diferenciar os botões de links com o botão de "Jogar", assim ele chama mais atenção e fica mais fácil de notar ele. Achei também que a distribuição ficou meio estranha. Se você pega outros launchers como exemplo: http://criography.com/_assets/portfolio/web/tlbb-game-launcher.jpg http://eq2wire.com/wp-content/uploads/2011/11/launcher4.jpg http://i.ytimg.com/vi/lLSBQaVhg5U/maxresdefault.jpg Você vê que as noticias ficam em uma caixa no meio do launcher. Em cima ou embaixo ficar a barra de progresso da atualização e o botão de "Jogar". Como você tem também botões para links úteis, você pode por eles no lugar contrário a barra de progresso com o botão "Jogar". Por exemplo, barra de progresso + "Jogar" em baixo, caixa de noticias no meio, botões com links úteis em cima. Ou botões com links uteis em baixo e barra de progresso e botão de Jogar em cima.
  23. Elwyn postou uma resposta no tópico em Suporte & Pedidos
    É necessário instalar python-ptrace para python3, e as libs Gtk também.

Informação Importante

Confirmação de Termo