Ir para conteúdo
  • Pesquisar por Tags

    Digite tags separadas por vírgulas
  • Pesquisar por Autor

Tipo de Conteúdo

Fóruns

  • Portal Tibiaking
    • Portal
    • Server Oficial TibiaKing
    • Sobre o Fórum
    • Projetos Open Source
    • Regras
  • OTServer Tibia & Derivados
    • Suporte & Pedidos
    • OTServer Downloads
    • OTServer Scripts
    • Ferramentas OpenTibia
    • Linguagens de Programação
    • Mapas
    • Websites
    • Show Off
    • Gráficos e Design
    • Divulgações
  • Tibia e Bots
    • Tibia
    • Bots & Macro
  • Diversos
    • Playground (Off-topic)

Calendários

  • Calendário Oficial
  • Calendário de OTServs
  • Calendários Diversos

Categorias

  • Oficial TibiaKing
    • Premium Forgottenserver
  • Conteúdo da Comunidade
    • Sprites

Categorias

  • Articles

Blogs

Não há resultados

Product Groups

  • Advertisement

Encontrar resultados em...

Encontrar resultados que contenham...

Data de Criação

  • Início

    FIM

Data de Atualização

  • Início

    FIM


Filtrar pelo número de...

Encontrado 1284 registros

  1. [TESTADO EM OTX 2.1+] 8.60 [TESTADO EM TFS 0.3.6] 8.54 ~ 8.60 Créditos: ~Mathias Kenfi
  2. .Qual servidor ou website você utiliza como base? TIBIA 8.60, OTX. Qual o motivo deste tópico? Queria saber se é possível colocar que o espectador dê look nos itens e ver os detalhes (dos que o cara que esta transmitindo estiver em seu inventário ou usando). Desta maneira: 00:49 You see a lucky clover amulet. It weighs 1.50 oz. It is rumoured to bring you good luck! Luck sponsored by TibiaLottery. Resumindo: Se possível, quero que o espectador consiga dar LOOK nos itens igual o rapaz que esta transmitindo (player normal) e consiga ver todos os detalhes. @Vodkart, caso possa ajudar, serei imensamente grato. Está surgindo algum erro? Se sim coloque-o aqui. Você tem o código disponível? Se tiver publique-o aqui: <?xml version="1.0" encoding="UTF-8"?> <mod name="Mod Cast" version="1.0" author="Martyx" contact="[email protected]" enabled="yes"> <event type="logout" name="cast-log-out" event="script"><![CDATA[ function onLogout(cid, forceLogout) if(getCreatureNoMove(cid)) then return false end if(not hasPlayerClient(cid)) then db.executeQuery("UPDATE `players` SET `broadcasting` = 0, `viewers` = 0 WHERE `id` = " .. getPlayerGUID(cid) .. " LIMIT 1") else db.executeQuery("UPDATE `players` SET `broadcasting` = 0, `viewers` = 0 WHERE `id` = " .. getPlayerGUID(cid) .. " LIMIT 1") end setPlayerStorageValue(cid, 45503, 0) -- set cast off command setPlayerStorageValue(cid, 45504, 0) -- set cast password off command doCreatureSetStorage(cid, "save") return true end ]]></event> <globalevent name="viewers" interval="10000" event="script"><![CDATA[ function onThink(interval) local players = getPlayersOnline() for _, pid in ipairs(players) do local data = getPlayerSpectators(pid) if(data.broadcast) then db.executeQuery("UPDATE `players` SET `viewers` = " .. table.maxn(data.names) .. " WHERE `id` = " .. getPlayerGUID(pid) .. ";") end end return true end ]]></globalevent> <talkaction words="/cast;!cast" event="script"><![CDATA[ function onSay(cid, words, param, channelId) local t, data = string.explode(param, " ", 1), getPlayerSpectators(cid) if(isInArray({'off', 'no', 'disable'}, t[1])) then if getPlayerStorageValue(cid, 45503) > 0 then data.mutes = {} data.broadcast = false doPlayerSetSpectators(cid, data) setPlayerStorageValue(cid, 45503, 0) db.executeQuery("UPDATE `players` SET `broadcasting` = 0, `viewers` = 0 WHERE `id` = " .. getPlayerGUID(cid)) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You have disabled your cast stream.") local rates = getPlayerRates(cid) if getPlayerStorageValue(cid, 45504) <= 0 then -- Check cast Password doPlayerSetExperienceRate(cid, rates[SKILL__LEVEL]-0.05) end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your cast stream already disabled.") return true end elseif(isInArray({'on', 'yes', 'enable'}, t[1])) then if getPlayerStorageValue(cid, 45503) <= 0 then data.broadcast = true doPlayerSetSpectators(cid, data) doPlayerOpenPrivateChannel(cid) setPlayerStorageValue(cid, 45503, 1) db.executeQuery("UPDATE `players` SET `broadcasting` = 1 WHERE `id` = " .. getPlayerGUID(cid)) local rates = getPlayerRates(cid) if getPlayerStorageValue(cid, 45504) <= 0 then -- Check cast Password doPlayerSetExperienceRate(cid, rates[SKILL__LEVEL]+0.05) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You have enabled your cast stream and are getting +5% monsters experience.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You have enabled your cast stream. Remove the password to gain +5% monsters experience.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your cast stream already enabled.") return true end elseif(isInArray({'show', 'count', 'see'}, t[1])) then if(data.broadcast) then local count = table.maxn(data.names) if(count > 0) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You are currently watched by " .. count .. " people.") local str = "" for _, name in ipairs(data.names) do str = str .. (str:len() > 0 and ", " or "") .. name end doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, str .. ".") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "None is watching your stream right now.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You are not streaming right now.") end elseif(isInArray({'kick', 'remove'}, t[1])) then if(data.broadcast) then if(t[2]) then if(t[2] ~= "all") then local found = false for _, name in ipairs(data.names) do if(t[2]:lower() == name:lower()) then found = true break end end if(found) then table.insert(data.kick, t[2]) doPlayerSetSpectators(cid, data) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Spectator " .. t[2] .. " has been kicked.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Spectator " .. t[2] .. " not found.") end else data.kick = data.names doPlayerSetSpectators(cid, data) end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You need to type a name.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You are not streaming right now.") end elseif(isInArray({'ban', 'block'}, t[1])) then if(data.broadcast) then if(t[2]) then local found = false for _, name in ipairs(data.names) do if(t[2]:lower() == name:lower()) then found = true break end end if(found) then table.insert(data.bans, t[2]) doPlayerSetSpectators(cid, data) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Spectator " .. t[2] .. " has been banned.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Spectator " .. t[2] .. " not found.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You need to type a name.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You are not streaming right now.") end elseif(isInArray({'unban', 'unblock'}, t[1])) then if(data.broadcast) then if(t[2]) then local found, i = 0, 1 for _, name in ipairs(data.bans) do if(t[2]:lower() == name:lower()) then found = i break end i = i + 1 end if(found > 0) then table.remove(data.bans, found) doPlayerSetSpectators(cid, data) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Spectator " .. t[2] .. " has been unbanned.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Spectator " .. t[2] .. " not found.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You need to type a name.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You are not streaming right now.") end elseif(isInArray({'bans', 'banlist'}, t[1])) then if(table.maxn(data.bans)) then local str = "" for _, name in ipairs(data.bans) do str = str .. (str:len() > 0 and ", " or "") .. name end doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Currently banned spectators: " .. str .. ".") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your ban list is empty.") end elseif(isInArray({'mute', 'squelch'}, t[1])) then if(data.broadcast) then if(t[2]) then local found = false for _, name in ipairs(data.names) do if(t[2]:lower() == name:lower()) then found = true break end end if(found) then table.insert(data.mutes, t[2]) doPlayerSetSpectators(cid, data) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Spectator " .. t[2] .. " has been muted.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Spectator " .. t[2] .. " not found.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You need to type a name.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You are not streaming right now.") end elseif(isInArray({'unmute', 'unsquelch'}, t[1])) then if(data.broadcast) then if(t[2]) then local found, i = 0, 1 for _, name in ipairs(data.mutes) do if(t[2]:lower() == name:lower()) then found = i break end i = i + 1 end if(found > 0) then table.remove(data.mutes, found) doPlayerSetSpectators(cid, data) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Spectator " .. t[2] .. " has been unmuted.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Spectator " .. t[2] .. " not found.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You need to type a name.") end else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You are not streaming right now.") end elseif(isInArray({'mutes', 'mutelist'}, t[1])) then if(table.maxn(data.mutes)) then local str = "" for _, name in ipairs(data.mutes) do str = str .. (str:len() > 0 and ", " or "") .. name end doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Currently muted spectators: " .. str .. ".") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your mute list is empty.") end elseif(isInArray({'auth', 'protect', 'protection', 'protected'}, t[1])) then if(isInArray({'off', 'no', 'disable'}, t[2])) then data.auth = false doPlayerSetSpectators(cid, data) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your chat is now unprotected, all spectators can chat without authentication.") elseif(isInArray({'on', 'yes', 'enable'}, t[2])) then data.auth = true doPlayerSetSpectators(cid, data) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your chat is now protected, all spectators have to authenticate before they can talk.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your chat is currently " .. (data.auth and "protected" or "unprotected") .. " from guests.") end elseif(isInArray({'password', 'guard'}, t[1])) then if(t[2]) then if(isInArray({'off', 'no', 'disable'}, t[2])) then if(data.password:len() ~= 0) then db.executeQuery("UPDATE `players` SET `broadcasting` = `broadcasting` - 2 WHERE `id` = " .. getPlayerGUID(cid)) end data.password = "" doPlayerSetSpectators(cid, data) local rates = getPlayerRates(cid) if getPlayerStorageValue(cid, 45503) > 0 and getPlayerStorageValue(cid, 45504) > 0 then -- Check Cast On and password doPlayerSetExperienceRate(cid, rates[SKILL__LEVEL]+0.05) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You have removed password for your cast stream and getting +5% monsters experience.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You have removed password for your cast stream.") end setPlayerStorageValue(cid, 45504, 0) else if(data.password:len() ~= 0) then db.executeQuery("UPDATE `players` SET `broadcasting` = `broadcasting` + 2 WHERE `id` = " .. getPlayerGUID(cid)) end data.password = string.trim(t[2]) doPlayerSetSpectators(cid, data) local rates = getPlayerRates(cid) if getPlayerStorageValue(cid, 45503) > 0 and getPlayerStorageValue(cid, 45504) <= 0 then -- Check Cast On and password off doPlayerSetExperienceRate(cid, rates[SKILL__LEVEL]-0.05) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You have set new password for your stream. Remove the password to gain +5% monsters experience.") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "You have set new password for your stream.") end setPlayerStorageValue(cid, 45504, 1) end elseif(data.password ~= "") then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your stream is currently protected with password: " .. data.password .. ".") else doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your stream is currently not protected.") end elseif(isInArray({'status', 'info'}, t[1])) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Your stream is currently " .. (data.broadcast and "enabled" or "disabled") .. ".") else doPlayerPopupFYI(cid, "Available commands:\n\n/cast on - enables the stream\n/cast off - disables the stream\n/cast password {password} - sets a password on the stream\n/cast password off - disables the password protection\n/cast auth on - enables requirement of authentication on chat\n/cast auth off - disables requirement of authentication on chat\n/cast kick {name} - kick a spectator from your stream\n/cast ban {name} - locks spectator IP from joining your stream\n/cast unban {name} - removes banishment lock\n/cast bans - shows banished spectators list\n/cast mute {name} - mutes selected spectator from chat\n/cast unmute {name} - removes mute\n/cast mutes - shows muted spectators list\n/cast show - displays the amount and nicknames of current spectators\n/cast status - displays stream status") end return true end ]]></talkaction> </mod> Você tem alguma imagem que possa auxiliar no problema? Se sim, coloque-a aqui.
  3. Bom galera, o Tópico já diz tudo, irei explicar como mudar para Uint16 dessa vez nas Source, para quem não sabe. Irei explicar como aumentar em Magic Effects, para assim você seu Server usar mais de 255, e ShootEffects para usar mais de 41 Distance efeitos(muito mais). Existe Tópicos no Tk, porém não é a mesma coisa, esse é diferente pois você irá alterá o valor dos uint's disparados para o Client, para assim então usar além do Padrão! Abaixo umas informações essenciais ! Esse Tópico é especifico para TFS 0.4, para que assim você possa aumentar o limite de efeitos no Client, e usar mais de 255 efeitos, e mais de 41 efeitos em Distância. Vale lembra também que você não é obrigado a mudar em ambos, se você quiser apenas aumentar o Limite de Efeitos para mais de 255, então mude apenas ele, caso queria aumentar apenas os Efeitos que são lançados a distância(ShootEffects ou Distance Effects), caso queria os dois, use ambos. Vamos começar primeiramente com os Magic Effects: Agora vamos mudar o ShootEffects para uint16. Bom não adianta mudar isso se não fizer alteração no Client, então deixarei aqui, dois Tópicos de como mudar de uint8 para uint16 no Client em em ShootEffects e MagicEffect. Mudando os Efeitos de uint8 a 16 para Magic Effects Mudando os Efeitos de uint8 a 16 para Shoot Effects Então é isso ae, qualquer erro só comentar para que eu possar tentar ajudar. Tópico exclusivo do Tk, proibido posta em outro site, blog ou fórum! xD
  4. Alguem tem anti-nuker igual a esse
  5. Olá a todos! Estou aqui para ajudar no desenvolvimento de scripts para servidores de jogos baseados em OTS (Open Tibia Server). Se você precisa de algum script para o seu servidor e quer exercitar suas habilidades de programação, fique à vontade para enviar seus pedidos. Vou tentar ajudar da melhor forma possível. Para facilitar a comunicação, por favor, siga as diretrizes abaixo ao fazer seu pedido de script: Título do pedido: Comece seu pedido de script com um título claro e descritivo que resuma o que você está procurando. Por exemplo: "[Pedido de script - DataPackArea - Actions] Sistema de eventos automatizados". Descrição do script: Forneça uma descrição detalhada do que você deseja alcançar com o script. Explique o propósito do script, a funcionalidade desejada e como você gostaria que ele interagisse com o servidor de jogo. Quanto mais informações você fornecer, melhor poderei entender seus requisitos e oferecer uma solução adequada. Requisitos específicos: Liste quaisquer requisitos específicos que o script deve atender. Isso pode incluir restrições de tempo, recursos específicos do servidor, integrações com outros sistemas, etc. Certifique-se de fornecer detalhes claros sobre esses requisitos para que eu possa fornecer uma solução adequada. Exemplos e referências: Se você tiver exemplos de outros scripts semelhantes ou referências que possam ajudar a entender melhor o que você está procurando, inclua-os na sua solicitação. Isso pode ser um código existente, links para recursos relevantes ou descrições detalhadas de funcionalidades em outros servidores. Contexto do servidor: Forneça informações sobre o servidor em que o script será implementado. Isso pode incluir detalhes sobre a versão do servidor, as bibliotecas e sistemas utilizados, e qualquer outra informação relevante. Isso ajudará a adaptar a solução conforme o ambiente em que o script será executado. Prazo e orçamento: Se você tiver um prazo específico para a entrega do script ou um orçamento limitado para o trabalho, mencione essas restrições na sua solicitação. Isso ajudará a avaliar a viabilidade do projeto e ajustar as expectativas, scripts podem ser entregues mais rápidos se doações forem feitas. Por favor, seja educado e respeitoso ao fazer seu pedido. Lembre-se de que estou oferecendo meu tempo e esforço gratuitamente para ajudar a comunidade. Farei o possível para atender aos pedidos, mas esteja ciente de que nem todas as solicitações podem ser atendidas. Estou ansioso para colaborar com vocês e ajudar no desenvolvimento de scripts para seus servidores. Vamos tornar o ambiente de jogo ainda mais interessante e divertido juntos! Atenciosamente, Underewar
  6. Bom já faz 2 dias que estou tentando arrumar esse quando vou compilar minha tfs no ubuntu, já troquei do 16.04 pro 20 e mesmo assim o erro persiste, nunca tinha passado pros problemas assim no ubuntu quando usava um processador intel ( ao que entendi isso só está acontecendo esse problema por meu processador ser amd ), já rodei varios e varios comandos e nada de conseguir arrumar esse bendito erro, não manjo quase nada de mexer em ubuntu/linux. O erro seria esse: g++: error: /usr/lib/libtcmalloc_minimal.so.4: No such file or directory, e não consegue compilar o tfs, se alguem já passou por esse problema e consegiu arrumar por favor help. EDIT: Resolvido.
  7. Usando o script do Cjaker como base (e a descrição do tópico dele, na cara dura mesmo!), otimizei as operações no banco de dados (tava muito zuado) e adicionei um range de accounts protegidas pra evitar apagar os gms/samples/contas de spoofers do otservlist/etc... ; Salve galera, mais um script para quem está precisando dar aquela limpada no banco de dados e otimizar o Servidor. -- Especificações -- TFS 1.1+ Objetivo é limpar as contas inativas/vazias e os players Inativos assim removendo os usuários que estão inativos e ocupando espaço no banco de dados. -- Instruções -- Em globalevents.xml insira essa linha <globalevent type="startup" name="CleanDatabases" script="cleandatabase.lua" /> Crie um script chamado cleandatabase.lua na pasta globalevents/scripts e cole isso dentro dele. --- --- Generated by EmmyLua(https://github.com/EmmyLua) --- Created by leu. --- DateTime: 04/04/18 18:42 --- --[[ Clean Database by Cjaker | Refactor and SQL Optimizations by Leu ]]-- local inactiveMonths = 1 --> Quantos meses o player ficou inativo local createdMonths = 1 --> Quantos meses a conta foi criada e não possui character criado. local protectedAccIdEnd = 20 --ignorar accounts com id <= 20 local function clearInactivePlayers() local inactiveTimestamp = os.time() - (86400 * (inactiveMonths*30)) local totalClear=0 local fromClause = "`players` WHERE `account_id` > ".. protectedAccIdEnd .." AND lastlogin <= "..inactiveTimestamp local resultId = db.storeQuery("SELECT COUNT(*) as num_inativos FROM "..fromClause) if resultId ~= false then totalClear = result.getDataInt(resultId, 'num_inativos') result.free(resultId) if totalClear > 0 then db.query("DELETE FROM "..fromClause) end end return totalClear end local function clearEmptyAccounts() local totalClear = 0 local createdTimestamp = os.time() - (86400 * (createdMonths*30)) local fromClause = "`accounts` ACCS WHERE `id` > ".. protectedAccIdEnd .." AND `creation` <= "..createdTimestamp.." AND (SELECT COUNT(*) from `players` WHERE `account_id` = ACCS.`id`) > 0" local resultId = db.storeQuery("SELECT COUNT(*) as num_inativas FROM "..fromClause) if resultId~= false then totalClear = result.getDataInt(resultId,'num_inativas') result.free(resultId) if totalClear > 0 then db.query("DELETE ACCS FROM "..fromClause) end end return totalClear end function onStartup() print('>> ' ..clearInactivePlayers().. " players inativos deletados.") print('>> ' ..clearEmptyAccounts().. " contas vazias deletadas.") end é isso senhores, paganois, flw! EDIT 24-04-2018: correção DELETE accs QUERY
  8. olá galera, estou começando agora a mexer com otservers e queria saber qual é a diferença entre usar windows ou linux pra compilar etc... ouvi falar que o linux é melhor, mas como sou iniciante creio que não devo me preocupar tanto com isso agora, mas ainda sim gostaria de saber o pq preferem linux vlw pela atenção
  9. Desenvolvemos um BOT para o Discord que é integrado 100% com o servidor, tendo não só um sistema de Cadastro no Servidor para dar recompensar de eventos Pelo Discord, da para você informar quem te indicou(caso alguém tenha te indicado) e quando o player pegar level 50, ele automaticamente vai dar a recompensa para quem você indicou, o Bot pode dar itens para players, mandar mensagens no Servidor, e avisar algum evento que esteja tendo no servidor pelo discord
  10. [SQLite] -=[TFS]=- 0.4 8.60 Alguem faz apk mobile pra mim ip: dexsoft.ddns.net pra mim https://www.mediafire.com/file/5klqnyy6k7jda0u/OTClientV8.rar/file TA TUDO AI
  11. Esse sistema foi feito utilizando a source disponibilizada neste link Pode funcionar em TFS 0.4, OTX 2.X e, talvez, em TFS 0.4 só que a probabilidade erros é maior por ter diferentes nomes de funções e variáveis. Fiz um vídeo seguindo o passo a passo abaixo para facilitar o processo de instalação do sistema. Hoje estarei ensinando a instalar os seguintes novos atributos/sistemas em sua source CriticalHitChance e DodgeChance -- (Funciona da mesma maneira que o critical básico de script, porém sem bugs de callstack) Life e Mana Absorb -- (Regenera, de acordo com a % atribuida, a partir de dano recebido) Life e Mana Leech -- (Regenera, de acordo com a % atribuida, a partir do dano causado) Exemplo de como vai ficar Primeiro e antes de tudo, você terá de desativar o critical padrão do Tibia (Você pode pular essa parte se quiser) Vamos lá! Vá em items.cpp e procure por: attackSpeed = 0; Abaixo coloque: criticalHitChance = dodgeChance = lifeAbsorb = manaAbsorb = lifeLeech = manaLeech = 0; Depois, ainda em items.cpp, procure por: else if(tmpStrValue == "extradefense" || tmpStrValue == "extradef") { if(readXMLInteger(itemAttributesNode, "chance", intValue)) it.extraDefenseChance = intValue; if(readXMLInteger(itemAttributesNode, "value", intValue)) it.extraDefense = intValue; if(readXMLInteger(itemAttributesNode, "random_min", intValue)) it.extraDefenseRndMin = intValue; if(readXMLInteger(itemAttributesNode, "random_max", intValue)) it.extraDefenseRndMax = intValue; } Abaixo coloque: else if(tmpStrValue == "criticalhitchance") { if(readXMLInteger(itemAttributesNode, "value", intValue)) it.criticalHitChance = intValue; } else if(tmpStrValue == "dodgechance") { if(readXMLInteger(itemAttributesNode, "value", intValue)) it.dodgeChance = intValue; } else if(tmpStrValue == "lifeabsorb") { if(readXMLInteger(itemAttributesNode, "value", intValue)) it.lifeAbsorb = intValue; } else if(tmpStrValue == "manaabsorb") { if(readXMLInteger(itemAttributesNode, "value", intValue)) it.manaAbsorb = intValue; } else if(tmpStrValue == "lifeleech") { if(readXMLInteger(itemAttributesNode, "value", intValue)) it.lifeLeech = intValue; } else if(tmpStrValue == "manaleech") { if(readXMLInteger(itemAttributesNode, "value", intValue)) it.manaLeech = intValue; } Agora vá em items.h e procure por: int32_t attack, extraAttack, defense, extraDefense, armor, breakChance, hitChance, maxHitChance, runeLevel, runeMagLevel, lightLevel, lightColor, decayTo, rotateTo, alwaysOnTopOrder; Abaixo coloque: int32_t criticalHitChance, dodgeChance, lifeAbsorb, manaAbsorb, lifeLeech, manaLeech; Agora vá em item.cpp e procure por: case ATTR_ATTACK: { int32_t attack; if(!propStream.getLong((uint32_t&)attack)) return ATTR_READ_ERROR; setAttribute("attack", attack); break; } Acima coloque: case ATTR_CRITICALHITCHANCE: { int32_t criticalHitChance; if(!propStream.getLong((uint32_t&)criticalHitChance)) return ATTR_READ_ERROR; setAttribute("criticalhitchance", criticalHitChance); break; } case ATTR_DODGECHANCE: { int32_t dodgeChance; if(!propStream.getLong((uint32_t&)dodgeChance)) return ATTR_READ_ERROR; setAttribute("dodgechance", dodgeChance); break; } case ATTR_LIFEABSORB: { int32_t lifeAbsorb; if(!propStream.getLong((uint32_t&)lifeAbsorb)) return ATTR_READ_ERROR; setAttribute("lifeabsorb", lifeAbsorb); break; } case ATTR_MANAABSORB: { int32_t manaAbsorb; if(!propStream.getLong((uint32_t&)manaAbsorb)) return ATTR_READ_ERROR; setAttribute("manaabsorb", manaAbsorb); break; } case ATTR_LIFELEECH: { int32_t lifeLeech; if(!propStream.getLong((uint32_t&)lifeLeech)) return ATTR_READ_ERROR; setAttribute("lifeleech", lifeLeech); break; } case ATTR_MANALEECH: { int32_t manaLeech; if(!propStream.getLong((uint32_t&)manaLeech)) return ATTR_READ_ERROR; setAttribute("manaleech", manaLeech); break; } Procure por: if(it.weaponType == WEAPON_DIST && it.ammoType != AMMO_NONE) { begin = false; s << " (Range:" << int32_t(item ? item->getShootRange() : it.shootRange); if(it.attack || it.extraAttack || (item && (item->getAttack() || item->getExtraAttack()))) { s << ", Atk " << std::showpos << int32_t(item ? item->getAttack() : it.attack); if(it.extraAttack || (item && item->getExtraAttack())) s << " " << std::showpos << int32_t(item ? item->getExtraAttack() : it.extraAttack) << std::noshowpos; } if(it.hitChance != -1 || (item && item->getHitChance() != -1)) s << ", Hit% " << std::showpos << (item ? item->getHitChance() : it.hitChance) << std::noshowpos; } else if(it.weaponType != WEAPON_AMMO && it.weaponType != WEAPON_WAND) { if(it.attack || it.extraAttack || (item && (item->getAttack() || item->getExtraAttack()))) { begin = false; s << " (Atk:"; if(it.abilities.elementType != COMBAT_NONE && it.decayTo < 1) { s << std::max((int32_t)0, int32_t((item ? item->getAttack() : it.attack) - it.abilities.elementDamage)); if(it.extraAttack || (item && item->getExtraAttack())) s << " " << std::showpos << int32_t(item ? item->getExtraAttack() : it.extraAttack) << std::noshowpos; s << " physical + " << it.abilities.elementDamage << " " << getCombatName(it.abilities.elementType); } else { s << int32_t(item ? item->getAttack() : it.attack); if(it.extraAttack || (item && item->getExtraAttack())) s << " " << std::showpos << int32_t(item ? item->getExtraAttack() : it.extraAttack) << std::noshowpos; } } if(it.defense || it.extraDefense || (item && (item->getDefense() || item->getExtraDefense()))) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Def:" << int32_t(item ? item->getDefense() : it.defense); if(it.extraDefense || (item && item->getExtraDefense())) s << " " << std::showpos << int32_t(item ? item->getExtraDefense() : it.extraDefense) << std::noshowpos; } } Abaixo coloque: if(it.criticalHitChance || (item && item->getCriticalHitChance())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Crit Chance:" << std::showpos << int32_t(item ? item->getCriticalHitChance() : it.criticalHitChance) << "%"<< std::noshowpos; } if(it.dodgeChance || (item && item->getDodgeChance())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Dodge Chance:" << std::showpos << int32_t(item ? item->getDodgeChance() : it.dodgeChance) << "%"<< std::noshowpos; } if(it.lifeAbsorb || (item && item->getLifeAbsorb())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Life Absorb:" << std::showpos << int32_t(item ? item->getLifeAbsorb() : it.lifeAbsorb) << "%"<< std::noshowpos; } if(it.manaAbsorb || (item && item->getManaAbsorb())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Mana Absorb:" << std::showpos << int32_t(item ? item->getManaAbsorb() : it.manaAbsorb) << "%"<< std::noshowpos; } if(it.lifeLeech || (item && item->getLifeLeech())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Life Leech:" << std::showpos << int32_t(item ? item->getLifeLeech() : it.lifeLeech) << "%"<< std::noshowpos; } if(it.manaLeech || (item && item->getManaLeech())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Mana Leech:" << std::showpos << int32_t(item ? item->getManaLeech() : it.manaLeech) << "%"<< std::noshowpos; } Procure por: int32_t tmp = it.armor; if(item) tmp = item->getArmor(); bool begin = true; if(tmp) { s << " (Arm:" << tmp; begin = false; } Abaixo coloque: if(it.criticalHitChance || (item && item->getCriticalHitChance())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Crit Chance:" << std::showpos << int32_t(item ? item->getCriticalHitChance() : it.criticalHitChance) << "%"<< std::noshowpos; } if(it.dodgeChance || (item && item->getDodgeChance())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Dodge Chance:" << std::showpos << int32_t(item ? item->getDodgeChance() : it.dodgeChance) << "%"<< std::noshowpos; } if(it.lifeAbsorb || (item && item->getLifeAbsorb())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Life Absorb:" << std::showpos << int32_t(item ? item->getLifeAbsorb() : it.lifeAbsorb) << "%"<< std::noshowpos; } if(it.manaAbsorb || (item && item->getManaAbsorb())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Mana Absorb:" << std::showpos << int32_t(item ? item->getManaAbsorb() : it.manaAbsorb) << "%"<< std::noshowpos; } if(it.lifeLeech || (item && item->getLifeLeech())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Life Leech:" << std::showpos << int32_t(item ? item->getLifeLeech() : it.lifeLeech) << "%"<< std::noshowpos; } if(it.manaLeech || (item && item->getManaLeech())) { if(begin) { begin = false; s << " ("; } else s << ", "; s << "Mana Leech:" << std::showpos << int32_t(item ? item->getManaLeech() : it.manaLeech) << "%"<< std::noshowpos; } Agora vá em item.h e procure por: ATTR_DUALWIELD = 43, Abaixo coloque: ATTR_CRITICALHITCHANCE = 44, ATTR_DODGECHANCE = 45, ATTR_LIFEABSORB = 46, ATTR_MANAABSORB = 47, ATTR_LIFELEECH = 48, ATTR_MANALEECH = 49, Procure por: int32_t getExtraDefense() const; Abaixo coloque: int32_t getCriticalHitChance() const; int32_t getDodgeChance() const; int32_t getLifeAbsorb() const; int32_t getManaAbsorb() const; int32_t getLifeLeech() const; int32_t getManaLeech() const; Procure por: inline int32_t Item::getExtraDefense() const { bool ok; int32_t v = getIntegerAttribute("extradefense", ok); if(ok) return v; return items[id].extraDefense; } Abaixo coloque: inline int32_t Item::getCriticalHitChance() const { bool ok; int32_t v = getIntegerAttribute("criticalhitchance", ok); if(ok) return v; return items[id].criticalHitChance; } inline int32_t Item::getDodgeChance() const { bool ok; int32_t v = getIntegerAttribute("dodgechance", ok); if(ok) return v; return items[id].dodgeChance; } inline int32_t Item::getLifeAbsorb() const { bool ok; int32_t v = getIntegerAttribute("lifeabsorb", ok); if(ok) return v; return items[id].lifeAbsorb; } inline int32_t Item::getManaAbsorb() const { bool ok; int32_t v = getIntegerAttribute("manaabsorb", ok); if(ok) return v; return items[id].manaAbsorb; } inline int32_t Item::getLifeLeech() const { bool ok; int32_t v = getIntegerAttribute("lifeleech", ok); if(ok) return v; return items[id].lifeLeech; } inline int32_t Item::getManaLeech() const { bool ok; int32_t v = getIntegerAttribute("manaleech", ok); if(ok) return v; return items[id].manaLeech; } Agora vá em player.cpp e procure por: int32_t Player::getArmor() const { int32_t i = SLOT_FIRST, armor = 0; for(; i < SLOT_LAST; ++i) { if(Item* item = getInventoryItem((slots_t)i)) armor += item->getArmor(); } if(vocation->getMultiplier(MULTIPLIER_ARMOR) != 1.0) return int32_t(armor * vocation->getMultiplier(MULTIPLIER_ARMOR)); return armor; } Abaixo coloque: int32_t Player::getCriticalHitChance() const { int32_t i = SLOT_FIRST, crit = 0; for(; i < SLOT_LAST; ++i) { if(Item* item = getInventoryItem((slots_t)i)) crit += item->getCriticalHitChance(); } return crit; } int32_t Player::getDodgeChance() const { int32_t i = SLOT_FIRST, dodge = 0; for(; i < SLOT_LAST; ++i) { if(Item* item = getInventoryItem((slots_t)i)) dodge += item->getDodgeChance(); } return dodge; } int32_t Player::getLifeAbsorb() const { int32_t i = SLOT_FIRST, life = 0; for(; i < SLOT_LAST; ++i) { if(Item* item = getInventoryItem((slots_t)i)) life += item->getLifeAbsorb(); } return life; } int32_t Player::getManaAbsorb() const { int32_t i = SLOT_FIRST, mana = 0; for(; i < SLOT_LAST; ++i) { if(Item* item = getInventoryItem((slots_t)i)) mana += item->getManaAbsorb(); } return mana; } int32_t Player::getLifeLeech() const { int32_t i = SLOT_FIRST, life = 0; for(; i < SLOT_LAST; ++i) { if(Item* item = getInventoryItem((slots_t)i)) life += item->getLifeLeech(); } return life; } int32_t Player::getManaLeech() const { int32_t i = SLOT_FIRST, mana = 0; for(; i < SLOT_LAST; ++i) { if(Item* item = getInventoryItem((slots_t)i)) mana += item->getManaLeech(); } return mana; } Agora vá em player.h e procure por: virtual int32_t getDefense() const; Abaixo coloque: virtual int32_t getCriticalHitChance() const; virtual int32_t getDodgeChance() const; virtual int32_t getLifeAbsorb() const; virtual int32_t getManaAbsorb() const; virtual int32_t getLifeLeech() const; virtual int32_t getManaLeech() const; Agora vá em luascript.cpp e procure por: //getCreatureHealth(cid) lua_register(m_luaState, "getCreatureHealth", LuaInterface::luaGetCreatureHealth); Abaixo coloque: //getPlayerCriticalHitChance(cid) lua_register(m_luaState, "getPlayerCriticalHitChance", LuaInterface::luaGetPlayerCriticalHitChance); //getPlayerDodgeChance(cid) lua_register(m_luaState, "getPlayerDodgeChance", LuaInterface::luaGetPlayerDodgeChance); //getPlayerLifeAbsorb(cid) lua_register(m_luaState, "getPlayerLifeAbsorb", LuaInterface::luaGetPlayerLifeAbsorb); //getPlayerManaAbsorb(cid) lua_register(m_luaState, "getPlayerManaAbsorb", LuaInterface::luaGetPlayerManaAbsorb); //getPlayerLifeLeech(cid) lua_register(m_luaState, "getPlayerLifeLeech", LuaInterface::luaGetPlayerLifeLeech); //getPlayerManaLeech(cid) lua_register(m_luaState, "getPlayerManaLeech", LuaInterface::luaGetPlayerManaLeech); Procure por: int32_t LuaInterface::luaGetCreatureMaxHealth(lua_State* L) { //getCreatureMaxHealth(cid[, ignoreModifiers = false]) bool ignoreModifiers = false; if(lua_gettop(L) > 1) ignoreModifiers = popBoolean(L); ScriptEnviroment* env = getEnv(); if(Creature* creature = env->getCreatureByUID(popNumber(L))) lua_pushnumber(L, creature->getPlayer() && ignoreModifiers ? creature->healthMax : creature->getMaxHealth()); else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1; } Abaixo coloque: int32_t LuaInterface::luaGetPlayerCriticalHitChance(lua_State* L) { //getPlayerCriticalHitChance(cid) ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(popNumber(L))) lua_pushnumber(L, player->getCriticalHitChance()); else { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); } return 1; } int32_t LuaInterface::luaGetPlayerDodgeChance(lua_State* L) { //getPlayerDodgeChance(cid) ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(popNumber(L))) lua_pushnumber(L, player->getDodgeChance()); else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1; } int32_t LuaInterface::luaGetPlayerLifeAbsorb(lua_State* L) { //getPlayerLifeAbsorb(cid) ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(popNumber(L))) lua_pushnumber(L, player->getLifeAbsorb()); else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1; } int32_t LuaInterface::luaGetPlayerManaAbsorb(lua_State* L) { //getPlayerManaAbsorb(cid) ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(popNumber(L))) lua_pushnumber(L, player->getManaAbsorb()); else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1; } int32_t LuaInterface::luaGetPlayerLifeLeech(lua_State* L) { //getPlayerLifeLeech(cid) ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(popNumber(L))) lua_pushnumber(L, player->getLifeLeech()); else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1; } int32_t LuaInterface::luaGetPlayerManaLeech(lua_State* L) { //getPlayerManaLeech(cid) ScriptEnviroment* env = getEnv(); if(Player* player = env->getPlayerByUID(popNumber(L))) lua_pushnumber(L, player->getManaLeech()); else { errorEx(getError(LUA_ERROR_CREATURE_NOT_FOUND)); lua_pushboolean(L, false); } return 1; } Agora vá em luascript.h e procure por: static int32_t luaGetPlayerSpentMana(lua_State* L); Abaixo coloque: static int32_t luaGetPlayerCriticalHitChance(lua_State* L); static int32_t luaGetPlayerDodgeChance(lua_State* L); static int32_t luaGetPlayerLifeAbsorb(lua_State* L); static int32_t luaGetPlayerManaAbsorb(lua_State* L); static int32_t luaGetPlayerLifeLeech(lua_State* L); static int32_t luaGetPlayerManaLeech(lua_State* L); As funções Lua adicionadas foram getPlayerCriticalHitChance(cid) getPlayerDodgeChance(cid) getPlayerLifeAbsorb(cid) getPlayerManaAbsorb(cid) getPlayerLifeLeech(cid) getPlayerManaLeech(cid) Agora a parte do game.cpp. (Esta é uma parte opcional, você pode optar por não adicioná-la) Créditos: ~Mathias Kenfi
  12. Salve rapazes, estou precisando de um client próprio para o meu servidor 7.4, preciso que algum programador experiente e com referências faça um client do jeito que eu procuro. Responda aqui para fazermos um orçamento, obrigado! Não sei se estou no lugar certo, se não me desculpem e peço que movam por gentileza!
  13. Pessoal to com um grande problema, estou com um servidor TFS 1.4x 10.98, recentemente começou dar um problema, sempre quando falava "trade" com o npc dava um erros, com qual quer npc, o erro e o seguinte. me falaram que o problema e nas sourcer que precisava mudar umas coisas me passaram um link no github esse aqui https://github.com/otland/forgottenserver/pull/3996/files porem eu vi vídeos no youtube ensinando a compilar, já vi muitos tópicos como compilar a sourcer, ai quando vou compilar da esse erro já tentei instalar, desinstala muitas coisas, alterar também não vai, minha sourcer e essa https://github.com/otland/forgottenserver Alguém poderia me ajuda com esse erro, ou ate compilar 100% as sourcer. os Tópicos que eu tentei para compilar e esse daqui, se não poder o link me desculpe. https://forums.otserv.com.br/index.php?/forums/topic/169234-windowsvc2019-compilando-sources-tfs-14-vcpkg/ alguém me da uma luz por favor kkk
  14. Uso tfs 0.4 trunk3884 bem simples. Queria acrescentar magic effects para 255 pois o meu só vai até 69. Encontrei um tópico que falava sobre porém parece ter sido removido, não consigo acessar!
  15. .Qual servidor ou website você utiliza como base? NTO HARD Qual o motivo deste tópico? TENHO ERROR Está surgindo algum erro? Se sim coloque-o aqui. Você tem o código disponível? Se tiver publique-o aqui: local storages = {13002} -- storages que ser�o verificadas local message = [[ ( Guia Nto Hard ) Des�a no subsolo de Konoha e procure por criaturas para batalhar ! 1� Utilize Jutsus para Curar ( Regeneration ) e Atacar ( Throw Kunai ). 2� Utilize a palavra ( skip ) para subir e sair do calabou�o ! ]] function onStepIn(cid, item, position, fromPosition) for _, v in ipairs(storages) do if getPlayerStorageValue(cid, v) <= 0 then doPlayerPopupFYI(cid, message) setPlayerStorageValue(cid, 13002, 1) return doTeleportThing(cid, fromPosition) end end end Você tem alguma imagem que possa auxiliar no problema? Se sim, coloque-a aqui.
  16. Alguem que trabalhe com desenvolvimentos de modulos de otclient como freelance preciso de alguns novos modulos. Vou deixa o discord para contato caso alguem se interesse Felippetattoo#9630
  17. Salve, pessoal, to procurando algo bem específico.... A muito tempo atras, uns 10 a 12 anos kkk rolava muito dbo 8.0, os famosos biancos, derivados e tal Tenho alguns servidores compilados aqui, porém são cheios de bugs e outras coisas complicadas de corrigir sem a source Alguem tem contato, ou tenha alguma source desses servidores? estou querendo iniciar um projeto retro dbo
  18. .Qual servidor ou website você utiliza como base? Qual o motivo deste tópico? Está surgindo algum erro? Se sim coloque-o aqui. Você tem o código disponível? Se tiver publique-o aqui: Você tem alguma imagem que possa auxiliar no problema? Se sim, coloque-a aqui.
  19. tonkz postou uma resposta no tópico em Suporte Tibia OTServer
    Pessoal beleza? eu consigo logar no meu site em outro pc mas no cliente ele abre a tela de personagens mas nao conecta no servidor,eu estou usando o hamachi sera que pode ser a conexão com o hamachi?
  20. .Qual servidor ou website você utiliza como base? RadBR Qual o motivo deste tópico? estou tentando entrar no servidor que tenho aqui, no tfs ele dá como servidor online. Tento entrar em um Client de versao diferente e ele diz que so aceita a versao 10.00 e 11.32 (até ai tudo bem). O problema é que quando eu tento entrar no cliente 10.00 ele nao aponta nem a mensagem do client errado, apenas a mensagem basica de servidor offline! Está surgindo algum erro? Se sim coloque-o aqui. erro basico de servidor off Você tem o código disponível? Se tiver publique-o aqui: Você tem alguma imagem que possa auxiliar no problema? Se sim, coloque-a aqui.
  21. .Qual servidor ou website você utiliza como base? TFS 1.3 Qual o motivo deste tópico? AJUDAR A RESOLVER A ACTION Está surgindo algum erro? Se sim coloque-o aqui. Você tem o código disponível? Se tiver publique-o aqui: function onUse(cid, item, fromPosition, itemEx, toPosition) local config = { minLevel = 200, -- Level mínimo para adquirir a gema. gems = 2154, 2155, 2156, 2158, -- id gemas storage = {5001, 5002, 5003, 5004, 5005, 5006, 5007, 5008}, interval = {600, 600, 600, 600, 600, 600, 600}, -- Intervalo dos efeitos efeito = {"' . ,", ". ' ,", "` . ,", ", ' ."}, colorDruid = {182,213}, colorSorcerer = {215,215}, colorPaladin = {89,89}, colorKnight = {210,210}, colorMajesticDruid = {182,213}, colorSupremeSorcerer = {215,215}, colorLordPaladin = {89,89}, colorMonsterKnight = {210,210} } local vocations = { -- Vocation id 1 gonna upgrade to vocation id 2 -- Easy, huh? [5] = 9, [6] = 10, [7] = 11, [8] = 12, } local player = Player(cid) if getPlayerLevel(cid) >= config.minLevel then local vocation = player:getVocation() local vocID = vocation:getId() local vocationName = vocation:getName() if vocation[vocID] then player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, 'You have succesfully upgraded from a '..vocationName..' to a '..Vocation(vocations[vocID]):getName()..'. ') player:getPosition():sendMagicEffect(28) player:setVocation(Vocation(vocations[vocID])) Item(gems.uid):remove() else doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Voce ja adquiriu sua gema espiritual.") doSendMagicEffect(getCreaturePosition(cid), 3) end else doPlayerSendCancel(cid, "Voce precisa ser level "..config.minLevel.." para adquirir a gema espiritual.") end return TRUE end function doUseGems(cid, item) local vocation = player:getVocation() local interval = gems.interval[vocID] if gems.itemid ~= gems.id[vocID] or getPlayerStorageValue(cid, gems.storage[vocID]) > 0 then return FALSE end setPlayerStorageValue(cid, config.storage[voc], 1) sendMagicEffect(cid, config.storage[voc], gems.interval[voc]) doRemoveItem(item.uid, 1) return TRUE end function sendGemEffect(cid, storage, interval) local pos = getThingPos(cid) local vocation = player:getVocation() local color = 1 if voc == 5 then color = efeito.colorDruid[math.random(1,#efeito.colorDruid)] elseif voc == 6 then color = efeito.colorSorcerer[math.random(1,#efeito.colorSorcerer)] elseif voc == 7 then color = efeito.colorPaladin[math.random(1,#efeito.colorPaladin)] elseif voc == 8 then color = efeito.colorKnight[math.random(1,#efeito.colorKnight)] elseif voc == 9 then color = efeito.colorDruid[math.random(1,#efeito.colorMajesticDruid)] elseif voc == 10 then color = efeito.colorSorcerer[math.random(1,#efeito.colorSupremeSorcerer)] elseif voc == 11 then color = efeito.colorPaladin[math.random(1,#efeito.colorLordPaladin)] elseif voc == 12 then color = efeito.colorKnight[math.random(1,#efeito.colorMonsterKnight)] end doSendAnimatedText(pos, config.efeito[math.random(1,#gemMsg.efeito)], color) if getPlayerStorageValue(cid, config.storage[getPlayerVocation(cid)]) >= 1 then addEvent(sendMagicEffect, interval, cid, storage, interval) end end function doRemoveMagicEffect(cid) if getPlayerStorageValue(cid, config.storage[getPlayerVocation(cid)]) < 1 then return FALSE end setPlayerStorageValue(cid, config.storage[getPlayerVocation(cid)], 0) return TRUE end function doRemoveAllGemEffect(cid) for i = 1, table.maxn(config.storage) do setPlayerStorageValue(cid, config.storage[i], 0) end return TRUE end function isGemActivated(cid) if getPlayerStorageValue(cid, config.storage[getPlayerVocation(cid)]) > 0 then return TRUE end return FALSE end Você tem alguma imagem que possa auxiliar no problema? Se sim, coloque-a aqui.
  22. Olá pessoal, Há alguns dias venho procurando e me informando mas até agora sem sucesso, é possivel existir duas versões em um mesmo servidor? por exemplo: 8.6 e a versão 12.
  23. meu server possui reset siystem, e recentemente eu troquei pra OTX2, (eu tinha tfs 0.4 antes) e quando converti pra otx, percebi que o OTX que peguei, tem um limite maximo de HP nos monstros em comparação ao tfs 0.4 que eu tinha, como posso expandir esse limite? 10:09 You see a frazzlemaw. Health: [81168174 / 204400000]. 10:10 You see Midnight. Health: [-211761446/ -211761446]. os monstros simplesmente ficam sem HP em cima deles
  24. Boa noite! alguem pode me ajudar com os codigos do quiver para TFS 0.4? o link da page do @fireelement ta off.
  25. .Qual servidor ou website você utiliza como base? Qual o motivo deste tópico? Está surgindo algum erro? Se sim coloque-o aqui. Você tem o código disponível? Se tiver publique-o aqui: function onUse(cid, item, fromPosition, itemEx, toPosition) local config = { minLevel = 200, -- Level mínimo para adquirir a gema. gems = 2154, 2155, 2156, 2158, -- id gemas storage = {5001, 5002, 5003, 5004, 5005, 5006, 5007, 5008}, interval = {600, 600, 600, 600, 600, 600, 600}, -- Intervalo dos efeitos efeito = {"' . ,", ". ' ,", "` . ,", ", ' ."}, colorDruid = {182,213}, colorSorcerer = {215,215}, colorPaladin = {89,89}, colorKnight = {210,210}, colorMajesticDruid = {182,213}, colorSupremeSorcerer = {215,215}, colorLordPaladin = {89,89}, colorMonsterKnight = {210,210} } local vocations = { -- Vocation id 1 gonna upgrade to vocation id 2 -- Easy, huh? [5] = 9, [6] = 10, [7] = 11, [8] = 12, } local player = Player(cid) if getPlayerLevel(cid) >= config.minLevel then local vocation = player:getVocation() local vocID = vocation:getId() local vocationName = vocation:getName() if vocation[vocID] then player:sendTextMessage(MESSAGE_STATUS_CONSOLE_BLUE, 'You have succesfully upgraded from a '..vocationName..' to a '..Vocation(vocations[vocID]):getName()..'. ') player:getPosition():sendMagicEffect(28) player:setVocation(Vocation(vocations[vocID])) Item(gems.uid😞remove() else doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Voce ja adquiriu sua gema espiritual.") doSendMagicEffect(getCreaturePosition(cid), 3) end else doPlayerSendCancel(cid, "Voce precisa ser level "..config.minLevel.." para adquirir a gema espiritual.") end return TRUE end function doUseGems(cid, item) local vocation = player:getVocation() local interval = gems.interval[vocID] if gems.itemid ~= gems.id[vocID] or getPlayerStorageValue(cid, gems.storage[vocID]) > 0 then return FALSE end setPlayerStorageValue(cid, config.storage[voc], 1) sendMagicEffect(cid, config.storage[voc], gems.interval[voc]) doRemoveItem(item.uid, 1) return TRUE end function sendGemEffect(cid, storage, interval) local pos = getThingPos(cid) local vocation = player:getVocation() local color = 1 if voc == 5 then color = efeito.colorDruid[math.random(1,#efeito.colorDruid)] elseif voc == 6 then color = efeito.colorSorcerer[math.random(1,#efeito.colorSorcerer)] elseif voc == 7 then color = efeito.colorPaladin[math.random(1,#efeito.colorPaladin)] elseif voc == 8 then color = efeito.colorKnight[math.random(1,#efeito.colorKnight)] elseif voc == 9 then color = efeito.colorDruid[math.random(1,#efeito.colorMajesticDruid)] elseif voc == 10 then color = efeito.colorSorcerer[math.random(1,#efeito.colorSupremeSorcerer)] elseif voc == 11 then color = efeito.colorPaladin[math.random(1,#efeito.colorLordPaladin)] elseif voc == 12 then color = efeito.colorKnight[math.random(1,#efeito.colorMonsterKnight)] end doSendAnimatedText(pos, config.efeito[math.random(1,#gemMsg.efeito)], color) if getPlayerStorageValue(cid, config.storage[getPlayerVocation(cid)]) >= 1 then addEvent(sendMagicEffect, interval, cid, storage, interval) end end function doRemoveMagicEffect(cid) if getPlayerStorageValue(cid, config.storage[getPlayerVocation(cid)]) < 1 then return FALSE end setPlayerStorageValue(cid, config.storage[getPlayerVocation(cid)], 0) return TRUE end function doRemoveAllGemEffect(cid) for i = 1, table.maxn(config.storage) do setPlayerStorageValue(cid, config.storage[i], 0) end return TRUE end function isGemActivated(cid) if getPlayerStorageValue(cid, config.storage[getPlayerVocation(cid)]) > 0 then return TRUE end return FALSE end Você tem alguma imagem que possa auxiliar no problema? Se sim, coloque-a aqui.

Informação Importante

Confirmação de Termo