Tudo que Elwyn postou
-
Bug MW
Só aplica os 20s de cd se o tile que você usar a runa tiver uma mw existente.
-
[DUVIDA] Looping em Os.date
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
-
[Dúvida] stopEvent
Troca stopEvent(granEffect[cid]) por stopEvent(events[cid])
-
[Dúvida] stopEvent
Posta a função granEffect junto com onde é definido uma tabela com nome granEffect também
-
(Resolvido)[Pedido] Se o player não comer um food a cada 20 minutos ele começa a perder vida!
Serve em TFS 1.1?
-
(Resolvido)[PROBLEMA] FUNÇÕES DO SISTEMA DE NOTIFICAÇÃO -- TFS 1.0
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
- (Resolvido)[AJUDA] Spell de imortalidade tfs 1.0
-
(Resolvido)[Pedido] Não usar mount com certo outfit
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.
-
(Resolvido)[AJUDA] Spell de imortalidade tfs 1.0
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?
- (Resolvido)[AJUDA] Spell de imortalidade tfs 1.0
- (Resolvido)[AJUDA] Spell de imortalidade tfs 1.0
-
(Resolvido)[Pedido] Não usar mount com certo outfit
Existe alguma callback que chama ao trocar de outfit, ou dar mount?
-
(Resolvido)[Pedido] Não usar mount com certo outfit
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
-
Como Criar um Serve de Sword Art online do inicio?
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.
-
(Resolvido)[Pedido] Não usar mount com certo outfit
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
-
OT Com equipe.
https://github.com/
-
(Resolvido)[Duvida] Como funciona o exp?
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
-
(Resolvido)[Duvida] Como funciona o exp?
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
-
(Resolvido)Alterar outfit ao andar depois de usar spell
Editei la, esqueci desse detalhe.
-
(Resolvido)[Duvida] Como funciona o exp?
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
- Python IPChanger
-
(Resolvido)Alterar outfit ao andar depois de usar spell
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
-
Magia de imunidade
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.
-
Launcher AutoUpdate - Show
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.
- Python IPChanger