Ir para conteúdo

Biinhow

Membro
  • Registro em

Histórico de Curtidas

  1. Gostei
    Biinhow recebeu reputação de Gabrielx17 em (Resolvido)Cor Azul no Heal da potion.   
    @ElizeuAlmeida, vê se funciona esse:
    local config = { removeOnUse = "no", usableOnTarget = "yes", -- can be used on target? (fe. healing friend) splashable = "no", realAnimation = "no", -- make text effect visible only for players in range 1x1 healthMultiplier = 1.0, manaMultiplier = 1.0 } config.removeOnUse = getBooleanFromString(config.removeOnUse) config.usableOnTarget = getBooleanFromString(config.usableOnTarget) config.splashable = getBooleanFromString(config.splashable) config.realAnimation = getBooleanFromString(config.realAnimation) local POTIONS = { [8704] = {empty = 7636, splash = 2, health = {50, 100}}, -- small health potion [7618] = {empty = 7636, splash = 2, health = {100, 200}}, -- health potion [7588] = {empty = 7634, splash = 2, health = {200, 400}, level = 50, vocations = {3, 4, 7, 8}, vocStr = "knights and paladins"}, -- strong health potion [7591] = {empty = 7635, splash = 2, health = {500, 700}, level = 80, vocations = {4, 8}, vocStr = "knights"}, -- great health potion [8473] = {empty = 7635, splash = 2, health = {1450, 1500}, level = 130, vocations = {4, 8}, vocStr = "knights"}, -- ultimate health potion [7620] = {empty = 7636, splash = 7, mana = {100, 200}}, -- mana potion [7589] = {empty = 7634, splash = 7, mana = {110, 190}, level = 50, vocations = {1, 2, 3, 5, 6, 7}, vocStr = "sorcerers, druids and paladins"}, -- strong mana potion [7590] = {empty = 7635, splash = 7, mana = {1050, 1200}, level = 80, vocations = {1, 2, 5, 6}, vocStr = "sorcerers and druids"}, -- great mana potion [8472] = {empty = 7635, splash = 3, health = {1300, 1360}, mana = {230, 380}, level = 80, vocations = {3, 7}, vocStr = "paladins"} -- great spirit potion } local exhaust = createConditionObject(CONDITION_EXHAUST) setConditionParam(exhaust, CONDITION_PARAM_TICKS, (getConfigInfo('timeBetweenExActions') - 100)) function onUse(cid, item, fromPosition, itemEx, toPosition) local potion = POTIONS[item.itemid] if(not potion) then return false end if(not isPlayer(itemEx.uid) or (not config.usableOnTarget and cid ~= itemEx.uid)) then if(not config.splashable) then return false end if(toPosition.x == CONTAINER_POSITION) then toPosition = getThingPos(item.uid) end doDecayItem(doCreateItem(2016, potion.splash, toPosition)) doTransformItem(item.uid, potion.empty) return TRUE end if(hasCondition(cid, CONDITION_EXHAUST_HEAL)) then doPlayerSendDefaultCancel(cid, RETURNVALUE_YOUAREEXHAUSTED) return TRUE end if(((potion.level and getPlayerLevel(cid) < potion.level) or (potion.vocations and not isInArray(potion.vocations, getPlayerVocation(cid)))) and not getPlayerCustomFlagValue(cid, PLAYERCUSTOMFLAG_GAMEMASTERPRIVILEGES)) then doCreatureSay(itemEx.uid, "Only " .. potion.vocStr .. (potion.level and (" of level " .. potion.level) or "") .. " or above may drink this fluid.", TALKTYPE_ORANGE_1) return TRUE end local health = potion.health if(health and not doCreatureAddHealth(itemEx.uid, math.ceil(math.random(health[1], health[2]) * config.healthMultiplier))) then return false end local mana = potion.mana if(mana and not doPlayerAddMana(itemEx.uid, math.ceil(math.random(mana[1], mana[2]) * config.manaMultiplier))) then return false end doAddCondition(cid, exhaust) doSendMagicEffect(getThingPos(itemEx.uid), 30) doSendAnimatedText(fromPosition, "Aaaah...", 17) if(not potion.empty or config.removeOnUse) then doRemoveItem(item.uid, 1) return TRUE end doRemoveItem(item.uid, 0) doPlayerAddItem(cid, potion.empty, 0) doPlayerRemoveItem(cid, potion.empty, getPlayerItemCount(cid, potion.empty)) doPlayerAddItem(cid, potion.empty, getPlayerItemCount(cid, potion.empty)) return TRUE end  
  2. Gostei
    Biinhow deu reputação a Vodkart em Script de permitir apenas 1 player   
    já sei porque está acontecendo isso e é bem simples, o seu script já veio com a função errada.
     
    sabe essa linha:
     
    doTeleportThing(cid, fromPosition, false) vc tem que colocar true.
     
    doTeleportThing(cid, fromPosition, true)  
    ai ai, nem reparei nisso.
    local tp_mineracao = {x = 2848, y = 2871, z = 8} local areasMineracao = { {{x = 2803, y = 2861, z = 8}, {x = 2864, y = 2896, z = 8}}, {{x = 2799, y = 2864, z = 9}, {x = 2869, y = 2903, z = 9}}, {{x = 2802, y = 2876, z = 10}, {x = 2894, y = 2923, z = 10}} } function onStepIn(cid, item, position, fromPosition, toPosition) local max, ret = 3,0 -- 3 por account if not isPlayer(cid) then return true end for _, v in pairs(areasMineracao) do for _, pid in pairs(getPlayersOnline()) do if (getPlayerIp(pid) == getPlayerIp(cid) and isInRange(getThingPos(pid), v[1], v[2])) then ret = ret+1 end end end if ret > max then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"Só é permitido "..max.." jogadores por IP na mineração.") doTeleportThing(cid, fromPosition, true) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_TELEPORT) return true end doTeleportThing(cid, tp_mineracao, false) doSendMagicEffect(getCreaturePosition(cid), CONST_ME_TELEPORT) setPlayerStorageValue(cid, 45393, 1) return true end  
  3. Curtir
    Biinhow deu reputação a WooX em Field owner onLook (Magic Wall, Fire Bombs, etc)   
    Algumas pessoas vieram me pedir esse código, então hoje eu tirei um tempinho pra trazer pra vocês.
     
    O que faz

    Este código faz com que seja possivel ver através do look, quem jogou uma Magic Wall ou um Fire Bomb, isso é útil quando aquele amigo noob taca uma Magic Wall onde não deveria e diz que não foi ele, com esse código não tem como se esconder.

     
    Como implementar

     
    Este código foi testado apenas em TFS 0.x e OTX2, mas acredito que pode facilmente ser adaptado para TFS 1.x.
    Originalmente eu fiz este código para ser usado com a Magic Wall, mas ele pode ser implementado em qualquer spell que utilize COMBAT_PARAM_CREATEITEM.
     
    Script original da Magic Wall
    local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) setCombatParam(combat, COMBAT_PARAM_CREATEITEM, 1497) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) function onCastSpell(cid, var) return doCombat(cid, combat, var) end Basta substituir o return doCombat pelo código abaixo.
    ret = doCombat(cid, combat, var) if ret then local mWall = getTileItemById(variantToPosition(var), 1497).uid doItemSetAttribute(mWall, "description", string.format("It was cast by: %s.", getCreatureName(cid))) end return ret O código completo deve ficar parecido com este.
    local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGY) setCombatParam(combat, COMBAT_PARAM_CREATEITEM, 1497) setCombatParam(combat, COMBAT_PARAM_AGGRESSIVE, false) function onCastSpell(cid, var) ret = doCombat(cid, combat, var) if ret then local mWall = getTileItemById(variantToPosition(var), 1497).uid doItemSetAttribute(mWall, "description", string.format("It was shot by: %s.", getCreatureName(cid))) end return ret end Note que 1497 é o ID da Magic Wall, para items como Fire Field e outros, o ID deve ser substituído.
     
    Créditos


  4. Gostei
    Biinhow deu reputação a WooX em DarkTheme e AutoComplete para Notepad++   
    Atualização 05/05/2019:
     
    Olá a todos, acredito que muitos além de mim utilizam o Notepad++ para trabalhar com códigos, é por isso que hoje venho trazer um tema que eu mesmo fiz e um AutoComplete atualizado para o Notepad++.
     
    AutoComplete.
    Para quem não está familiarizado, o AutoComplete é uma função do Notepad++ que completa funções ou palavras assim que você começa digita-las. Neste AutoComplete que estou disponibilizando, possui todas as funções existentes no TFS 0.3.7 e 0.4.
     

     
    Para instalar o AutoComplete, primeiro você deve ativar a função no seu Notepad++. Para isso vá em Configurações -> Preferencias -> Autocompletar e deixa as configurações como mostra a seguir.

     
    Em seguida, basta colocar o arquivo lua.xml no seguinte diretório do Notepad++.
    Notepad++\plugins\APIs
    Atualização:
     
    Dark Theme.
    Eu fiz este tema porque detesto o tema original do Notepad++, todo aquele branco chega a arder os olhos e é muito cansativo ficar olhando pra quem programa muito tempo utilizando a ferramenta. Este tema não traz consigo somente a alteração da cor do fundo, mas um destaque de cor verde a cada função existente no AutoComplete.
     
    Um código Lua utilizando o tema, fica assim.

     
    Além disso, o tema não dá suporte apenas para a Linguagem Lua, mas também para C++, PHP, MySQL, Javascript, XML, HTML, CSS e INI.
     
    Para realizar a instalação do tema, basta ir em Configurações -> Importar -> Importar Tema(s) e escolher o arquivo DarkCode.xml.
    Atualização:
     

     
    Pronto!
    Após realizado todos os procedimentos, basta reiniciar seu Notepad++ que todas as alterações terão efeito. É isso, acredito que possa ser útil no dia a dia de quem desenvolve em Lua.
     
    Ultima atualização: 05/05/2019.
  5. Gostei
    Biinhow deu reputação a Killua em Como usar addEvent   
    Usando addEvent
     
    O uso do addEvent tem inúmeras utilidades e pode ser complicado para algumas pessoas, inclusive era para mim quando eu estava começando a aprender LUA.
     
    Para que serve o addEvent?
    Para "chamar" uma função após um periodo de tempo, ou seja, executar uma função após um tempo estipulado. 
     
    O addEvent tem como parâmetros: callback, delay e ...
    addEvent(callback, delay, ...)
     
    Onde callback é a função que será chamada, delay é o tempo (em milissegundos) até que se chame essa função e ... são os parâmetros que a função chamada utiliza. Exemplo:
    addEvent(doBroadcastMessage, 1000, "Bom dia", 23) Aqui, após 1 segundo (1000 ms), a função doBroadcastMessage(message, type) será executada com os parâmetros message = "Bom dia" e type = 23.
     
    O addEvent pode ser usado de duas maneiras:
    Chamando uma função existente ou criando uma nova função.
     
    Para chamar uma função existente, basta usar como acima, para usá-lo para criar uma nova função, usa-se assim, por exemplo:
    addEvent(function()      if isCreature(cid) then           doPlayerAddItem(cid, 2160, 10)           doPlayerSendTextMessage(cid, 25, "Voce ganhou 10k.")      end end, 1000) Assim é basicamente a mesma coisa, mas pude colocar várias funções dentro de um único addEvent e mantive o delay 1000 (1 segundo).
    Obs: Precisei usar 2 ends, um para fechar function() e outro para fechar o if.
     
    Atenção! Além disso, existe uma outra diferença entre as duas formas de uso, vou tentar explicar da melhor maneira possível:
    Quando usamos o addEvent com uma função já existente (1o exemplo), as informações usadas serão as geradas no momento em que o evento foi chamado, por exemplo:
    function onUse(cid, item, fromPosition, itemEx, toPosition)      if getPlayerLevel(cid) > 10 then           doPlayerSendTextMessage(cid, 25, "Uma pedra sera criada na sua posiçao dentro de 2 segundos.")           addEvent(doCreateItem, 2000, 1308, 1, getThingPos(cid))      end      return true end Se usarmos assim, a pedra será criada na posição onde o jogador se encontrava no momento em que "deu use" e não onde ele estará 2 segundos depois. Se você quiser que a pedra seja criada na nova posição do jogador (pos de 2 segundos depois), você deve fazer uma nova checagem, criando uma função:
    function onUse(cid, item, fromPosition, itemEx, toPosition)      if getPlayerLevel(cid) > 10 then           doPlayerSendTextMessage(cid, 25, "Uma pedra sera criada na sua posiçao dentro de 2 segundos.")           addEvent(function()                if isCreature(cid) then                     doCreateItem(1308, 1, getThingPos(cid))                end           end, 2000)      end      return true end Atenção novamente: A checagem if isCreature(cid) que utilizei, é muito importante para um addEvent que envolva criaturas. Se você executasse o addEvent sem a checagem e o player logasse ou morresse antes desses 2 segundos se passarem, daria um erro na distro e interromperia o resto do script.
     
     
    Recursão
    Uma outra ótima funcionalidade dos addEvents é a recursão, ou seja, criar um evento que fica se repetindo. É simplesmente um addEvent chamando a sí mesmo.
    Para usar, crie uma função, exemplo:
    function respawnMonster(name, pos)      if doCreateMonster(name, pos) then           doBroadcastMessage(name.." nasceu!")      end      addEvent(respawnMonster, 10000, name, pos) end Quando chamada, esta função ficará criando um monstro e uma determinada área a cada 10 segundos, sem nunca parar.
    Para chamar a função, seria assim:
    respawnMonster("Demon", {x = 123, y = 123, z = 5}) Considerações
    Reloads param os addEvents. Se um script talkaction executou um addEvent programado para acontecer depois de 5 minutos e se dentro deste intervalo de tempo, você usar /reload talkactions, o addEvent será interrompido.
     
    Erros no código podem fazer o evento ser interrompido, preste sempre atenção.
     
    Se ainda ficou com alguma dúvida, poste aqui.
     
     
        
  6. Gostei
    Biinhow recebeu reputação de hrubesch em GESIOR - OUTFIT QUE O CHARACTER POSSUI - CHARACTER.PHP   
    @hrubesch
     Cara, você precisa colocar essa storage no script de addon doll ou no npc addoner do seu ot, aí quando você obter a storage dentro do jogo irá aparecer em seu inventário do site.
  7. Gostei
    Biinhow recebeu reputação de DboHere em GESIOR - OUTFIT QUE O CHARACTER POSSUI - CHARACTER.PHP   
    @hrubesch
     Cara, você precisa colocar essa storage no script de addon doll ou no npc addoner do seu ot, aí quando você obter a storage dentro do jogo irá aparecer em seu inventário do site.
  8. Curtir
    Biinhow deu reputação a Danyel Varejao em Save player and House   
    Fala galerinha do TK, aqui vai um script muito útil para vários servidores. O script serve para salvar o player e a house do mesmo, utilizando o comando !save.
    O script foi testado em OTXServer 2.
    local Configs = { Exhausted = 180, Storage_Exhausted = 5000001, Messages = { SALVED = "You character has been salved.", EXHAUST = "You need wait %d seconds to save again.", }, } local function doSavePlayerAndHouse(cid) doPlayerSave(cid) if getHouseByPlayerGUID(getPlayerGUID(cid)) then doSaveHouse(getHouseByPlayerGUID(getPlayerGUID(cid))) end return true end function onSay(cid, words, param) if getPlayerStorageValue(cid, Configs.Storage_Exhausted) >= os.time() then doPlayerSendCancel(cid, string.format(Configs.Messages.EXHAUST, getPlayerStorageValue(cid, Configs.Storage_Exhausted) - os.time())) return true end doSavePlayerAndHouse(cid) doPlayerSendTextMessage(cid, MESSAGE_EVENT_ORANGE, Configs.Messages.SALVED) setPlayerStorageValue(cid, Configs.Storage_Exhausted, os.time() + Configs.Exhausted) return true end Tag do talkactions.xml
    <talkaction words="/save;!save" event="script" value="SavePlayers.lua"/>  
  9. Gostei
    Biinhow deu reputação a Cat em Encontrar itens e códigos escondidos no Mapa   
    Existe a possibilidade de você baixar um mapa com algumas "manhas", e alguns players sabendo disso podem se beneficiar em seu servidor. Por exemplo, uma bag com crystal coins, uma action numa parede que te teleporte até a sala de recompensas da POI, etc.
    Abaixo mostrarei como encontrar itens e códigos escondidos no mapa:
     
    No menu superior, Edit - Find Item (CTRL + F). No quadro de pesquisa CTRL + F (Search for item), selecione o item clique em OK, você será teleportado até a posição em que o item está e poderá removê-lo. Se ele estiver atrás de uma árvore por exemplo, você pode usar a tecla de atalho G (ghost loose items), que deixa as sprites transparentes.
     
     
     
     
    No menu superior, Edit - Find Unique / Action. Também é possível cadastrar action/unique ids e criar quests escondidas no mapa. Essa opção te mostra todos os uniqueids e actionids que existem. Clique nas opções da lista para ir até a posição.
     
     
     
    No menu superior, Edit - Find Containers Esta opção mostra os containers que existem no mapa. Chests e bookcases, bags e backpacks, corpses e coffins, boxes,  barrels e tudo que da pra clicar, abrir e pegar um item dentro. Clique nas opções da lista para ser teleportado até o item.
     

     
    ______________________________________________________
     
     
     
     
  10. Gostei
    Biinhow deu reputação a Danyel Varejao em [System] Auto Loot Perfect   
    ~~~~~ * Auto Loot System 100% * ~~~~~ TFS 0.4 / TFS 0.3.7
    Fala galerinha do Tibiaking, então, várias pessoas estão tendo problema com o sistema de autoloot, aqui vai um sistema que eu editei para melhorar o uso do mesmo. Sem muita enrolação vamos ao que interessa.
     
    1° - Acesse a pasta data/lib e crie um arquivo chamado Auto_Loot.lua, coloque isso dentro do arquivo:
     
     
    2° - Abra a pasta data/actions/scripts e crie um arquivo chamado Auto_Loot_Boost.lua, dentro dele adicione:
     
     
    3° - Abra a pasta data/creaturescripts/scripts e crie um arquivo chamado Auto_Loot.lua, dentro dele adicione:
     
     
    4° - Abra a pasta data/talkactions/scripts e crie um arquivo chamado Auto_Loot.lua, dentro dele adicione:
     
     
    5° - Em data/actions/actions.xml adicione a seguinte tag:
     
    <!-- Auto Loot --> <action itemid="7443" event="script" value="Auto_Loot_Boost.lua"/> Altere o numero 7443 caso queira mudar o id do item do seu auto loot boost.
     
    6° - Em data/creaturescripts/creaturescripts.xml adicione a seguinte tag:
     
    <!-- Auto Loot --> <event type="login" name="Auto_Loot_Login" event="script" value="Auto_Loot.lua"/> <event type="kill" name="Auto_Loot_Kill" event="script" value="Auto_Loot.lua"/> 7° - Em data/talkactions/talkactions.xml adicione a seguinte tag:
     
    <!-- Auto Loot --> <talkaction access="0-4" words="/autoloot;!autoloot" event="script" value="Auto_Loot.lua"/>  
    Créditos
    50% Killua(Vitor Bertolucci)
    50% Danyel Varejão
     
  11. Gostei
    Biinhow recebeu reputação de BangxD em Vocação ter imunidade contra elemento X   
    <vocation id="4" name="Knight" description="a knight" needpremium="0" gaincap="25" gainhp="15" gainmana="5" gainhpticks="6" gainhpamount="1" gainmanaticks="6" gainmanaamount="2" manamultiplier="3.0" attackspeed="2000" soulmax="100" gainsoulticks="120" fromvoc="4"> <formula meleeDamage="1.0" distDamage="1.0" wandDamage="1.0" magDamage="1.0" magHealingDamage="1.0" defense="1.0" magDefense="1.0" armor="1.0"/> <skill fist="1.1" club="1.1" sword="1.1" axe="1.1" distance="1.4" shielding="1.1" fishing="1.1" experience="1.0"/> <absorb percentEnergy="12"/> <absorb percentFire="14"/> <absorb percentPoison="10"/> <absorb percentice="8"/> <absorb percentHoly="-7"/> <absorb percentPhysical="-7"/> <absorb percentDeath="5"/> <absorb percentLifeDrain="0"/> <absorb percentManaDrain="15"/> <absorb percentDrown="0"/> </vocation>  
  12. Gostei
    Biinhow recebeu reputação de LeoTK em Vocação ter imunidade contra elemento X   
    <vocation id="4" name="Knight" description="a knight" needpremium="0" gaincap="25" gainhp="15" gainmana="5" gainhpticks="6" gainhpamount="1" gainmanaticks="6" gainmanaamount="2" manamultiplier="3.0" attackspeed="2000" soulmax="100" gainsoulticks="120" fromvoc="4"> <formula meleeDamage="1.0" distDamage="1.0" wandDamage="1.0" magDamage="1.0" magHealingDamage="1.0" defense="1.0" magDefense="1.0" armor="1.0"/> <skill fist="1.1" club="1.1" sword="1.1" axe="1.1" distance="1.4" shielding="1.1" fishing="1.1" experience="1.0"/> <absorb percentEnergy="12"/> <absorb percentFire="14"/> <absorb percentPoison="10"/> <absorb percentice="8"/> <absorb percentHoly="-7"/> <absorb percentPhysical="-7"/> <absorb percentDeath="5"/> <absorb percentLifeDrain="0"/> <absorb percentManaDrain="15"/> <absorb percentDrown="0"/> </vocation>  
  13. Gostei
    Biinhow deu reputação a Natanael Beckman em GesiorACC 2019 8.60 UPDATE 29/06/2019   
    Atualização de 29/06/2019.
     
    Olá meus amigos, essa é a minha última contribuição free que faço na área de OTserver, fiz uma atualização bem completa do Gesior comparando com os que existem disponíveis, não vou falar muito pois grande parte já conhecem... Vou apenas posta algumas imagem das mudanças feitas.
    Sempre gostei de evoluir e de oferecer aos demais uma facilidade de obter um material grátis e de qualidade, nunca utilizei meu pouco conhecimento para prejudicar os demais, pelo o contrario sempre foi na intenção de ajudar e se em algum momento falhei, falhei inconscientemente.
     
    - Foi mudado algumas imagens de layout para renovar a estrutura.

     
    - Server Info + Most Power Ful Guilds na mesma estrura.

     
    - Create Account exigindo senhas com letras minusculas, maiúsculas e números, fortalecendo
    a segurança do seu cliente e dificultando futuras dores de cabeças.

     
    - Adicionado o mecanismo que identifica os valores de Premuim Points e Backup Points.
    - Algumas mudanças de layout.
    - Nome do player abaixo linkado.

     
    - Adicionado um Box de doação, com a intenção apenas de complementar
    o layout enriquecendo a pagina.

     
    - Fixado o bug edit town, e melhorado o layout.

     
    - Characters.php refeito, nesta imagem é uma visão de uma conta com access admin.

     
    - Visão normal.

     
    - Inventário completo.
    - Guilds com visão ampliada.

     
    - Detalhes...

     
    - Novo SHOP com as estrutura de layout melhorada e modernizada.
    - Sem BUGs lembre-se do CTRL + F5 para atualizar os cookies nesta pagina.

     
    - Detalhes...

     
    - Detalhes...

     
    - Detalhes...

     
    - Histórico do SHOP...

     
    DOWNLOAD SITE
    SHOP.LUA XAMPP 1.7.3 DATABASE LIMPA MYSQL DATABASE COMPLETA MYSQL   TUTORIAIS ÚTEIS E COMPATÍVEIS PARA O SITE: PAGSEGURO AUTOMATICO SHOPGUILD BACKUP_POINTS SISTEMA VIP_TIME   Créditos: Gesior.pl(WEBMaster) Felipe Monteiro(WEBMaster, WEBDesigner) Natanael Beckman(WEBNada) Nailan (WEBMaster) Ivens Pontes (WEBMaster) Marcio Porto (WEBMaster) Danyel Varejão (Programmer LUA, C++)
  14. Gostei
    Biinhow recebeu reputação de helix758 em Como tirar a paradinha de look que todos veem?   
    deve ser em mods, procura em mods um arquivo chamado lookingatyou.xml e apaga ele!
  15. Gostei
    Biinhow recebeu reputação de helix758 em Como tirar a paradinha de look que todos veem?   
    a um tempo atrás eu encontrei isso na pasta mods de um servidor de "test", retirei o arquivo e parou de aparecer a mensagem
  16. Gostei
    Biinhow recebeu reputação de Diego Rulez em Backpack com Atributo   
    tenta com esse aqui:
    <item id="2365" article="a" name="backpack of holding"> <attribute key="weight" value="1800"/> <attribute key="containerSize" value="20"/> <attribute key="slotType" value="backpack"/> <attribute key="showattributes" value="1" /> <attribute key="magiclevelpoints" value="3"/> </item>  
  17. Gostei
    Biinhow recebeu reputação de thelifeofpbion em Backpack com Atributo   
    tenta com esse aqui:
    <item id="2365" article="a" name="backpack of holding"> <attribute key="weight" value="1800"/> <attribute key="containerSize" value="20"/> <attribute key="slotType" value="backpack"/> <attribute key="showattributes" value="1" /> <attribute key="magiclevelpoints" value="3"/> </item>  
  18. Gostei
    Biinhow deu reputação a davidguimaraesdrum em (Resolvido)[Resolvido] - Background Fixada   
    SOLUÇÃO:
    Adicione essa linha dentro do LAYOUT do site:
     
    <style> body{ background-image:url(LINK DA IMG.png); background-size: cover; width:100%; height:100%; background-repeat: no-repeat; background-attachment: fixed; overflow-y:scroll; overflow-x:hidden; } </style>  
  19. Gostei
    Biinhow deu reputação a Vodkart em Alteração em Script da Annihilator   
    local config = { daily = "no", -- allow only one enter per day? (like in global Tibia) level = 450, storage = 30015, entry = { {x = 4464, y = 1288, z = 6}, {x = 4466, y = 1288, z = 6}, {x = 4465, y = 1289, z = 6}, {x = 4464, y = 1290, z = 6}, {x = 4466, y = 1290, z = 6} }, destination = { {x = 189, y = 650, z = 13}, {x = 189, y = 651, z = 13}, {x = 189, y = 652, z = 13}, {x = 189, y = 653, z = 13} } } local money = 15000 config.daily = getBooleanFromString(config.daily) function onUse(cid, item, fromPosition, itemEx, toPosition) if(item.itemid == 1946) then if(config.daily) then doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTPOSSIBLE) else doTransformItem(item.uid, item.itemid - 1) end return true end if(item.itemid ~= 1945) then return true end local players = {} for _, position in ipairs(config.entry) do local pid = getTopCreature(position).uid if(pid == 0 or not isPlayer(pid) or getCreatureStorage(pid, config.storage) > 0 or getPlayerLevel(pid) < config.level or getPlayerMoney(pid) < money) then doPlayerSendDefaultCancel(cid, RETURNVALUE_NOTPOSSIBLE) return true end table.insert(players, pid) end for i, pid in ipairs(players) do doPlayerRemoveMoney(pid, money) doSendMagicEffect(config.entry, CONST_ME_POFF) doTeleportThing(pid, config.destination, false) doSendMagicEffect(config.destination, CONST_ME_ENERGYAREA) end doTransformItem(item.uid, item.itemid + 1) return true end  
    obs: Faltou uma pos para onde o jogador vai depois de puxar a alavanca! Não esqueça de adicionar no código.
  20. Gostei
    Nesse tutorial você vai aprender a trocar essa borda horrorosa, agradeço ao @Forgiven2012 que manja de extensions e me ajudou a trocar ela.
     
    Você vai precisar ir na pasta do Remeres que fica em arquivos de programa, escolha a pasta da versão que vai modifcar (7.60, 8.60 e etc), em seguida vá em grounds.xml, faça um backup (cópia) do arquivo por segurança, procure por todas as linhas que tiverem
     
    <border align="inner" to="none" id="1"/>  
    e troque por 
     
    <border align="inner" to="none" id="10"/> Pronto, está terminado. 
     
     
    Você escolhe quais grounds vai querer alterar a borda id 1 (rocks) pela outra borda id 10.
     
     
    Exemplo, aqui você iria modificar o ground de grama verde claro, esse que aparece na imagem.
        <brush name="grass" type="ground" server_lookid="4526" z-order="3500">         <item id="4526" chance="2500"/>         <item id="4527" chance="10"/>         <item id="4528" chance="25"/>         <item id="4529" chance="25"/>         <item id="4530" chance="25"/>         <item id="4531" chance="25"/>         <item id="4532" chance="25"/>         <item id="4533" chance="25"/>         <item id="4534" chance="15"/>         <item id="4535" chance="25"/>         <item id="4536" chance="25"/>         <item id="4537" chance="25"/>         <item id="4538" chance="20"/>         <item id="4539" chance="20"/>         <item id="4540" chance="20"/>         <item id="4541" chance="20"/>         <item id="470" chance="0"/>                  <border align="outer" id="2"/>         <border align="inner" to="none" id="10"/>     </brush>  
    Espero que tenham gostado, flw.
     
  21. Gostei
    Biinhow deu reputação a Pedriinz em [TFS 1.x] Anti Bot   
    Como o nome do tópico diz, eu trouxe para vocês um sistema de anti bot.
    Minha intenção é atualizar este código ao máximo, deixando o mesmo bastante customizável.
     
    Quaisquer erros ou problemas por favor me deixe saber.
     


     
    Como ele funciona?
    Após um jogador matar uma quantidade x de monstros, o sistema irá realizar uma verificação com ele para saber se o mesmo está ou não 100% afk.
    Essa verificação é feita através de um channel que se abre após o jogador matar a quantidade de monstros, realizando uma pergunta para o jogador.
     
    O que é possível configurar?
    Praticamente tudo! Você também pode adicionar quantas perguntas desejar! Organizei o script para que qualquer um possa realizar as configurações que desejar. Confira:
    ANTI_BOT_SYSTEM = { config = { minMonstersToCheck = 2, -- O sistema irá escolher aleatoriamente um número de monstros entre esses dois valores para verificar. maxMonstersToCheck = 4, channelId = 10, -- Id do channel que será aberto para realizar a verificação. timeToAnswer = 10, -- Quanto tempo em segundos o jogador tem para responder a verificação. monstersForNotCheck = {'rat', 'bug', 'tiger'}, -- Monstros que não serão verificados pelo sistema. notations = 3, -- Quantas notificações o jogador pode receber antes de ser banido. banDays = 1, -- Quantidade de dias o personagem vai ficar banido por utilizar bot. storageForNotations = 1222, -- Storage onde ficará salvo as notations. storageForOpenChat = 10383, -- Storage que permitira o chat ser aberto. (Aconselho não mudar). }, questions = { [1] = {question = 'Digite quantas letras possui a palavra: Carro', answer = '5'}, [2] = {question = 'O que significa Ying e Yang?', answer = 'bem e o mal'}, [3] = {question = 'Qual é a cor do sol?', answer = 'amarelo'}, --[numero seguinte] = {question = 'pergunta', answer = 'resposta'}, }, cache = { players = { --[player:getId()] = {count = 1} }, question = 0, }, messages = { reason = {msg = 'Você foi banido por utilizar bot 100% AFK.'}, notation = {msg = 'Você foi penalizado e recebeu um notificação. Lembre-se que após receber 3 notificações você será banido. Você possui %d notificações no momento.', type = MESSAGE_EVENT_ADVANCE}, attention = {msg = '[Anti-Bot] Atenção! Você só possui %d segundos para responder a verificação.', type = TALKTYPE_CHANNEL_O}, channel_enter = {msg = '[Anti-Bot] Você está sobre suspeitas de uso aplicativos não autorizados.\nPor favor, confirme a verificação a seguir, você possui %d segundos para isso.', type = TALKTYPE_CHANNEL_O}, channel_close = {msg = '[Anti-Bot] Para sua segurança, não é possivel fechar este channel antes da verificação. Por favor responda o que lhe foi perguntado para que não seja penalizado.', type = TALKTYPE_CHANNEL_O}, wrong_answer = {msg = '[Anti-Bot] Resposta errada, por favor tente novamente.', type = TALKTYPE_CHANNEL_O}, correct_answer = {msg = '[Anti-Bot] Você respondeu corretamente, obrigado e bom jogo! Você já pode fechar este channel.', type = TALKTYPE_CHANNEL_O}, unconfirmed = {msg = 'Você não realizou a verificação corretamente, por isso você foi penalizado. Este channel já pode ser fechado.', type = TALKTYPE_CHANNEL_O}, } }  
    Tudo dentro desses espaços pode ser configurado sem nenhuma complicação!
     
    Instalação:
     
    Vá na pasta creaturescript/scripts do seu servidor e crie um arquivo com o nome de antibot.lua e adicione o seguinte conteúdo:
    --[[ ## SCRIPT BY: Pedriinz ## ## CONTACT SKYPE: pedrosz4 ## ]] ANTI_BOT_SYSTEM = { config = { minMonstersToCheck = 2, -- O sistema irá escolher aleatoriamente um número de monstros entre esses dois valores para verificar. maxMonstersToCheck = 4, channelId = 10, -- Id do channel que será aberto para realizar a verificação. timeToAnswer = 10, -- Quanto tempo em segundos o jogador tem para responder a verificação. monstersForNotCheck = {'rat', 'bug', 'tiger'}, -- Monstros que não serão verificados pelo sistema. notations = 3, -- Quantas notificações o jogador pode receber antes de ser banido. banDays = 1, -- Quantidade de dias o personagem vai ficar banido por utilizar bot. storageForNotations = 1222, -- Storage onde ficará salvo as notations. storageForOpenChat = 10383, -- Storage que permitira o chat ser aberto. (Aconselho não mudar). }, questions = { [1] = {question = 'Digite quantas letras possui a palavra: Carro', answer = '5'}, [2] = {question = 'O que significa Ying e Yang?', answer = 'bem e o mal'}, [3] = {question = 'Qual é a cor do sol?', answer = 'amarelo'}, --[numero seguinte] = {question = 'pergunta', answer = 'resposta'}, }, cache = { players = { --[player:getId()] = {count = 1} }, question = 0, }, messages = { reason = {msg = 'Você foi banido por utilizar bot 100% AFK.'}, notation = {msg = 'Você foi penalizado e recebeu um notificação. Lembre-se que após receber 3 notificações você será banido. Você possui %d notificações no momento.', type = MESSAGE_EVENT_ADVANCE}, attention = {msg = '[Anti-Bot] Atenção! Você só possui %d segundos para responder a verificação.', type = TALKTYPE_CHANNEL_O}, channel_enter = {msg = '[Anti-Bot] Você está sobre suspeitas de uso aplicativos não autorizados.\nPor favor, confirme a verificação a seguir, você possui %d segundos para isso.', type = TALKTYPE_CHANNEL_O}, channel_close = {msg = '[Anti-Bot] Para sua segurança, não é possivel fechar este channel antes da verificação. Por favor responda o que lhe foi perguntado para que não seja penalizado.', type = TALKTYPE_CHANNEL_O}, wrong_answer = {msg = '[Anti-Bot] Resposta errada, por favor tente novamente.', type = TALKTYPE_CHANNEL_O}, correct_answer = {msg = '[Anti-Bot] Você respondeu corretamente, obrigado e bom jogo! Você já pode fechar este channel.', type = TALKTYPE_CHANNEL_O}, unconfirmed = {msg = 'Você não realizou a verificação corretamente, por isso você foi penalizado. Este channel já pode ser fechado.', type = TALKTYPE_CHANNEL_O}, } } function vericationBot(cid) local player = Player(cid) local timeNow = os.time() if not player then return true end if not ANTI_BOT_SYSTEM.cache.players[player:getId()] or ANTI_BOT_SYSTEM.cache.players[player:getId()].verified == false then return true else player:sendChannelMessage("", ANTI_BOT_SYSTEM.messages.unconfirmed.msg, ANTI_BOT_SYSTEM.messages.unconfirmed.type, ANTI_BOT_SYSTEM.config.channelId) ANTI_BOT_SYSTEM.cache.players[player:getId()] = nil if player:getStorageValue(ANTI_BOT_SYSTEM.config.storageForNotations) < ANTI_BOT_SYSTEM.config.notations then if player:getStorageValue(ANTI_BOT_SYSTEM.config.storageForNotations) ~= -1 then player:setStorageValue(ANTI_BOT_SYSTEM.config.storageForNotations, math.max(player:getStorageValue(ANTI_BOT_SYSTEM.config.storageForNotations) + 1)) else player:setStorageValue(ANTI_BOT_SYSTEM.config.storageForNotations, 1) end player:teleportTo(player:getTown():getTemplePosition()) player:sendTextMessage(ANTI_BOT_SYSTEM.messages.notation.type, string.format(ANTI_BOT_SYSTEM.messages.notation.msg, math.max(player:getStorageValue(ANTI_BOT_SYSTEM.config.storageForNotations)))) else player:teleportTo(player:getTown():getTemplePosition()) db.query("INSERT INTO `account_bans` (`account_id`, `reason`, `banned_at`, `expires_at`, `banned_by`) VALUES (" ..getAccountNumberByPlayerName(player:getName())..", "..db.escapeString(ANTI_BOT_SYSTEM.messages.reason.msg)..", "..timeNow..", "..timeNow + (ANTI_BOT_SYSTEM.config.banDays * 86400) ..", 1)") player:remove() end end return true end function onKill(creature, target) local targetMonster = target:getMonster() local player = creature:getPlayer() local random = math.random(ANTI_BOT_SYSTEM.config.minMonstersToCheck, ANTI_BOT_SYSTEM.config.maxMonstersToCheck) if not targetMonster then return true end if isInArray(ANTI_BOT_SYSTEM.config.monstersForNotCheck, targetMonster:getName():lower()) then return true end if not ANTI_BOT_SYSTEM.cache.players[player:getId()] then ANTI_BOT_SYSTEM.cache.players[player:getId()] = {count = 1, verified = false} else if ANTI_BOT_SYSTEM.cache.players[player:getId()].count >= random then ANTI_BOT_SYSTEM.cache.players[player:getId()] = {count = math.max(ANTI_BOT_SYSTEM.cache.players[player:getId()].count), verified = true} player:openChannel(ANTI_BOT_SYSTEM.config.channelId) player:getPosition():sendMagicEffect(CONST_ME_TUTORIALSQUARE) else ANTI_BOT_SYSTEM.cache.players[player:getId()] = {count = math.max(ANTI_BOT_SYSTEM.cache.players[player:getId()].count) + 1, verified = false} end end return true end Após feito isso, abre o arquivo creaturescript/creaturescript.xml e adicione esta linha:
     
    <!-- Anti Bot by Pedriinz --> <event type="kill" name="AntiBot" script="antibot.lua" /> Feito isso, abra o arquivo: creaturescript/scripts/others/login.lua e registre o script com a tag:
    'AntiBot', Exemplo:
    local events = { 'ElementalSpheresOverlords', 'BigfootBurdenVersperoth', 'Razzagorn', 'Shatterer', 'Zamulosh', 'The Hunger', 'AntiBot', } Agora, abre o arquivo chatchannels/chatchannels.xml e adicione a seguinte tag:
    <channel id="10" name="Anti Bot" public="1" script="antibot.lua" /> Lembre-se que o ID deve ser o mesmo que você configurou no script principal lá em cima.
     
    Agora abra a pasta chatchannels/scripts/ crie um script chamado antibot.lua e adicione:
    function onJoin(player) if not player then return true end if not ANTI_BOT_SYSTEM.cache.players[player:getId()] or ANTI_BOT_SYSTEM.cache.players[player:getId()].verified == false then player:popupFYI('You can\'t open this channel.') return false end addEvent(function() player:sendChannelMessage("", string.format(ANTI_BOT_SYSTEM.messages.channel_enter.msg, ANTI_BOT_SYSTEM.config.timeToAnswer), ANTI_BOT_SYSTEM.messages.channel_enter.type, ANTI_BOT_SYSTEM.config.channelId) end, 300) addEvent(function() local random = math.random(#ANTI_BOT_SYSTEM.questions) player:sendChannelMessage("", ANTI_BOT_SYSTEM.questions[random].question, TALKTYPE_CHANNEL_R1, ANTI_BOT_SYSTEM.config.channelId) ANTI_BOT_SYSTEM.cache.question = random end, 2000) addEvent(vericationBot, ANTI_BOT_SYSTEM.config.timeToAnswer * 1000, player:getId()) return true end function onLeave(player) if not player then return true end if ANTI_BOT_SYSTEM.cache.players[player:getId()] then player:openChannel(ANTI_BOT_SYSTEM.config.channelId) addEvent(function() player:sendChannelMessage("", ANTI_BOT_SYSTEM.messages.channel_close.msg, ANTI_BOT_SYSTEM.messages.channel_close.type, ANTI_BOT_SYSTEM.config.channelId) end, 300) end end function onSpeak(player, type, message) player:sendChannelMessage(player:getName(), message, TALKTYPE_CHANNEL_Y, ANTI_BOT_SYSTEM.config.channelId) if message ~= ANTI_BOT_SYSTEM.questions[ANTI_BOT_SYSTEM.cache.question].answer then addEvent(function() player:sendChannelMessage("", ANTI_BOT_SYSTEM.messages.wrong_answer.msg, ANTI_BOT_SYSTEM.messages.wrong_answer.type, ANTI_BOT_SYSTEM.config.channelId) end, 300) else addEvent(function() player:sendChannelMessage("", ANTI_BOT_SYSTEM.messages.correct_answer.msg, ANTI_BOT_SYSTEM.messages.correct_answer.type, ANTI_BOT_SYSTEM.config.channelId) end, 300) ANTI_BOT_SYSTEM.cache.players[player:getId()] = nil end return false end Pronto! O seu antibot foi instalado com sucesso!
    O código foi totalmente feito por mim, então os créditos são meus.
     
    Qualquer sugestão para melhorias, por favor poste para que eu possa fazer
    Abraços! 
  22. Gostei
    Boa galera estamos mais uma vez trazendo o que a de melhor pra todos e esse sistema é muito top pra qualquer administrador de OTserver.
    Um parceiro meu Felipe Funck administrador do ImperialOT chegou pra mim com essa ideia de fazer um backup de point me explicou como deveria ser, achei uma ideia muito interessante e fui atrás de fazer o sistema.
    Esse sistema tem a função de registrar todos os pontos adquiridos por uma ACC em outras palavras ele faz um backup de todos os pontos que essa ACC recebe, sim mais e dai? As vezes temos a obrigação de resetar a database e eu confesso não tem nada mais chato do que devolver os pontos, simplesmente porque é muito trabalhoso você devolver pontos.
    Veja abaixo como adicionar o sistema no seu server:

    Acesse sua database e na tabela accounts execute está query:
    ALTER TABLE `accounts` ADD `backup_points` INT NOT NULL AFTER `premium_points`; Feito né? Essa query é a coluna backup_points nela vai ficar registrado todos os pontos que serão adicionados na ACC.
     
    Agora abra o seu retpagseguro.php e na linha 151 vai ter esse code:
    mysql_query("UPDATE accounts SET premium_points = premium_points + '$NumItens' WHERE name = '".htmlspecialchars($accname)."'"); Adicione abaixo o seguinte code:
    mysql_query("UPDATE accounts SET backup_points = backup_points + '$NumItens' WHERE name = '".htmlspecialchars($accname)."'"); Quem não tiver o sistema de pagseguro automático veja esse TUTORIAL.
    Cuidado a você que utiliza o double points pra não esquecer da multiplicação * 2.
     
    Certo, pra você que ainda não utiliza o sistema pagseguro utilize este shopadmin abaixo que já está configurado pra adicionar os pontos nas duas colunas.
    shopadmin.php
    Serve para todos os Gesior ACC.
    Pronto dessa forma todos os pontos adicionados em premium_points vai ficar registrado em backup_points.
     
    Bom galera o sistema está feito, beleza, quando você for resetar você vai executar a query abaixo. Mais qual a função dela?
    A função dessa query é limpar a coluna premium_points e leva os pontos que tiverem na coluna backup_points pra coluna premium_points, assim todos os pontos que entraram naquela ACC estaram de volta e corretamente.
    Nunca apague os registros do backup_points.
    Cuidado antes de usa a query faça um backup da sua database, só pra precaver nada de mais!
    UPDATE `accounts` SET `premium_points` = `accounts`.`backup_points` WHERE `backup_points` > 0; Query feita por, Raphael Luiz.
     
    Galera quem gostar clica em GOSTEI e valeu!
  23. Gostei
    function onSay(cid, words, param, channel) local paramm = string.upper(param) if (param == '') then doPlayerSendCancel(cid, "Você deve adicionar um code.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) else local resultado = db.getResult("SELECT * FROM redeemcodes WHERE `code` = '" .. paramm .. "';") if(resultado:getID() ~= -1) then doPlayerSendTextMessage(cid,MESSAGE_STATUS_WARNING, "Você resgatou com sucesso o código: " .. paramm ..".") doPlayerAddItem(cid, ID, QUANTIDADE) db.query("DELETE FROM `redeemcodes` WHERE `code` = '" .. paramm .. "';") else doPlayerSendCancel(cid, "Código invalido.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) end end end Mesma coisa do outro... Agora vai.
  24. Gostei
    Cara, como o @Vodkart falou fica mais bonito e talvez fácil e avançado, mas fiz aqui mais ou menos o que pediu.
    Se você ou ele estiverem dispostos a fazer de outro jeito fiquem a vontade.
    Fiz duas talkactions, mas da pra fazer algo como "!code redeem, código" e no mesmo comando "!code add, código".
    Mas acho mais simples (para os jogadores) botar direto.
     
    (Não tenho 0.4 para testar)

    mysql:
    CREATE TABLE IF NOT EXISTS `redeemcodes` ( `id` int(11) NOT NULL AUTO_INCREMENT, `code` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;  
    resgatarcode.lua
    function onSay(cid, words, param, channel) local paramm = string.upper(param) if (param == '') then doPlayerSendCancel(cid, "Você deve adicionar um code.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) else local resultado = db.getResult("SELECT * FROM redeemcodes WHERE `code` = '" .. paramm .. "';") if(resultado:getID() ~= -1) then doPlayerSendTextMessage(cid,MESSAGE_STATUS_WARNING, "Você resgatou com sucesso o código: " .. paramm ..".") doPlayerAddItem(cid, ID, QUANTIDADE) db.query("DELETE FROM `redeemcodes` WHERE `code` = '" .. paramm .. "';") else doPlayerSendCancel(cid, "Código invalido.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) end end end  
    registrarcode.lua
    function onSay(cid, words, param, channel) local paramm = string.upper(param) if (param == '') then doPlayerSendCancel(cid, "Você deve preencher o code para ser adicionado.") doSendMagicEffect(getPlayerPosition(cid), CONST_ME_POFF) else db.executeQuery("INSERT INTO `redeemcodes` (`id`, `code`) VALUES (NULL, '" .. paramm .. "');") doPlayerSendTextMessage(cid,MESSAGE_STATUS_WARNING, "Você adicionou o código: " .. paramm .." para ser validado.") end end  
  25. Gostei
    Biinhow deu reputação a luanluciano93 em [AJUDA] Erro de IP no install.txt do Gesior   
    remove essa parte do código .. 
     
    if($installIP != $_SERVER['REMOTE_ADDR']) { echo('In file <b>install.txt</b> must be your IP!<br />In file is:<br /><b>' . $installIP . '</b><br />Your IP is:<br /><b>' . $_SERVER['REMOTE_ADDR'] . '</b>'); exit; }

Informação Importante

Confirmação de Termo