Ir para conteúdo

Frenesy

Membro
  • Registro em

  • Última visita

Histórico de Curtidas

  1. Gostei
    Frenesy deu reputação a Natanael Beckman em Auto-Backup Database   
    Galera esse script é um auto backup da sua database, quem gosta de prevenir vamos ao tutorial.
     
    Backup.sh
     
    Criei uma pasta em qualquer local no linux, no meu caso eu fiz uma pasta com o nome database que está localizada na pasta home.
    home/database/backup.sh Certo vamos configura o arquivo, dentro dele já vem tudo explicado mais vou dar um reforço, dentro do arquivo backup.sh contém:
    #!/bin/bash CAMINHO="/home/database/" <--- local onde vai ficar salvo os backups NOMEBACKUP="server-backup" <--- nome do backup USER="root" <--- não mexe SENHA="nitendo64" <--- senha da database BANCO="casa_blanca" <--- nome da database #Nao mexer daqui pra baixo TEMPO="$(date +'%d-%m-%Y-%H-%M')" ##### #Rodando o backup ##### if [[ -z "$USER" || -z "$SENHA" || -z "$BANCO" ]]; then     echo "Por favor preencha o usuário, senha e banco de dados nas configurações." else     mysqldump -u$USER -p$SENHA $BANCO > $CAMINHO"/"$NOMEBACKUP"-"$TEMPO".sql" fi Certo configurado né, vamos fazer um teste:
    Acessa a pasta:
    cd /home/database Da permissão pros arquivos dentro dela, no caso o backup.sh:
    chmod 777 -R * Roda o script pra um teste:
    ./backup.sh Veja na imagem do meu teste, já aparece ali a database, então ta ok deu certo as configurações:
     

     
    Tudo bem, agora vamos configura pra ficar automático, pra todos os dias o script executar o backup em um certo horário:
    crontab -e Se aparecer algo tipo seleciona alguma opção, selecione Nano, que provavelmente seja numero 2...
     

    ----------------------------------------------------------------------------------
     
    Se não aparecer vai direto pra isso:
     

     
    Digite isso dentro do nano, como você ver na imagem acima já tem adicionado:
    0 6,21 * * * sh /home/database/backup.sh ctrl+x y da ENTER No meu caso botei pro script ser executado as 06:00hrs e 21:00hrs, então todo os dias nesse horário o script vai fazer o backup pra essa pasta que configurei, caso queria mudar o horário a logica do comado é clara né.
     
    Caso queria deixar de minutos em minutos abaixo observe um exemplo de 5 em 5 minutos:
    */5 * * * * sh /home/database/backup.sh Caso queria deixar de horas em horas abaixo observe um exemplo de 1 em 1 hora:
    0 */1 * * * sh /home/database/backup.sh Qualquer duvida postem, clica em GOSTEI, valeu.
     
    Créditos total:
    Joffily Ferreira
  2. Gostei
    Frenesy deu reputação a Cat em Árvores do Tibia - Variações By Nolis   
    Fiz essas peças para deixar a natureza Tibiana mais variada, recomendado uso de pattern + peças individuais para melhor efeito.
    Créditos: Cipsoft
     
    Amostra:

     
    Download:
    arvores_tibia.rar
     

     
  3. Curtir
    Frenesy deu reputação a koete em AJUDA "disconnected for exceeding packet per second limit."   
    Percebi que ninguém respondeu, e sei que já fazem 30 dias. Mas encontrei pelo google esse post e não vou deixar de responder pois há vários players que não sabem como resolver. Vai no config.lua e modifica "maxPacketsPerSecond = 25" para mais pacotes por segundos.
  4. Gostei
    Frenesy deu reputação a GamerGoiano em TFS 1.3 8.60 by Nekiro (Tela Extendida)   
    Download: https://www.mediafire.com/file/8phk1r3z9i9ye61/tfs+1.3+8.60+by+nekiro.rar/file
    Scan: https://www.virustotal.com/gui/file/3513f18d45c9109f62fa6d1b4de9c21c2297d920fb09947972cd3a190919749c/detection
    Conteúdo: Otclient Com Sources, TFS com Sources, Site Znote, Tudo Configurado.
     
    Como usar:
    Basta baixar, extrair, criar um banco de dados no xampp mais atualizado com o nome: Tibia e importar os 2 banco de dados que estão na pasta do TFS
    Copiar a pasta htdocs e colocar em C:\Xampp substituir a pasta Htdocs que tem lá.
    Abrir o Servidor e Abrir o cliente e jogar. (Crie a conta no site)
     
    Descrição:
    Esse é o TFS 1.3 que o Nekiro passou pra 8.60, eu apenas extendi a tela pra ficar melhor.
    Deixei TFS em x64 bits pq eu compilei pelo vcpkg, se quiser pode compilar vc mesmo em x86.

    Alterações:
    1. Tela Extendida (Aumentei a tela pra 20)
    2. Adicionado X Y Z no Minimap
    3. Removi os Painéis como Padrão
    4. Atalho pra aumentar e diminuir zoom CTRL + e CTRL -


  5. Gostei
    Frenesy deu reputação a marcoshps11 em [otcv8] Como utilizar - Ip fixo, spr, encrypt, auto update   
    * Áudio de saudação *
     
    Neste tutorial, irei ensinar alguns passos inicias para utilizar o OTClientV8
     
    1º Passo: Como fixar ip e colocar a spr no local correto
     
    - Faço o download no link: https://github.com/OTCv8/otclientv8
    - Extraia o arquivo
    - Dentro da pasta principal, vá até o arquivo init.lua
     
    Neste trecho, precisará remover os comentários --[[ e ]]:
    Servers = { --[[ OTClientV8 = "http://otclient.ovh/api/login.php", OTClientV8c = "otclient.ovh:7171", OTClientV8Test = "http://otclient.ovh/api/login2.php", LocalTestServ = "127.0.0.1:7171:1098:110:30:93" ]] }  
    Ficando assim:
    Servers = { Meuserver = "127.0.0.1:7171:1098" } ficando na seguinte configuração NOME = "IP:PORTA:VERSÃO"
     
     
    Para fixar e não aparecer a lista de servers, basta alterar:
    ALLOW_CUSTOM_SERVERS = true -- if true it shows option ANOTHER on server list  
    Para:
    ALLOW_CUSTOM_SERVERS = false -- if true it shows option ANOTHER on server list  
     
    Caso queira trocar o nome do aplicativo é só mudar
    g_app.setName("OTCv8") trocando o "OTCv8" para o nome desejado, lembrando que isto irá alterar apenas o nome da janela do aplicativo
     
     
    Incluir a SPR/Dat:

    Para incluir, basta ir na pasta data, criar uma nova pasta e renomear com o nome "things" e depois criar uma outra pasta dentro dela com o nome da versão que desejar utilizar, exemplos:
    * 800
    * 860
    * 910
    * 1100
    dentro desta pasta, incluir as respectivas spr/dat da versão correspondente 

    Um vídeo objetivo do conteúdo citado acima:
     
     
     

     
    2º Passo: Remover campo "Token" da tela inicial
     
    Apesar de ser algo simples, vejo muitos perguntarem como remover este campo, vamos lá:

    - Vá até a pasta modules -> client_entergame
    - Abra o arquivo entergame.lua
    - Na linha 380 remova ou comente o trecho:
    enterGame:getChildById('accountTokenTextEdit'):clearText()  
    - Na linha 412 remova ou comente o trecho:
    G.authenticatorToken = enterGame:getChildById('accountTokenTextEdit'):getText()  
    - salve o arquivo
    - na mesma pasta, abra o arquivo entergame.otui
    - da linha 32 a 44 remova ou comente o seguinte trecho:
    MenuLabel !text: tr('Token') anchors.left: prev.left anchors.top: prev.bottom text-auto-resize: true margin-top: 8 TextEdit id: accountTokenTextEdit anchors.left: parent.left anchors.right: parent.right anchors.top: prev.bottom margin-top: 2  
    Um vídeo objetivo do conteúdo citado acima:
     
     

    3º Passo: como encriptar os arquivos
     
    - Recomendo inicialmente criar uma cópia da pasta que ira encriptar, pois não é reversivo
    - Copie o endereço da pasta onde estão os arquivos
    - Abra o cmd e navegue até esta pasta utilizando o comando cd (link do endereço da pasta)
    - utilize o comando otclient_dx.exe --encrypt
    - Aguarde o sistema sinalizar que os arquivos foram encriptados 
     
    PS: a pasta do modulo bot ( modules -> game_bot ) não pode ser encriptado, remova ela antes deste processo.
     
    Um vídeo objetivo do conteúdo citado acima:
     
     

    4º Passo: Utilizando o auto update
     
    IMPORTANTE:
    Este processo precisa ser feito exatamente como demonstrado, qualquer link errado o sistema não irá funcionar.
     
    - Dentro da pasta API, abra o arquivo updater_advanced.php
     
    em $files_dir = "/var/www/otclient/files"; é a pasta onde conterá os arquivos do otclient para download, lembrando que o caminho precisa estar especificada desde a pasta inicial
    em $files_url = "http://otclient.ovh/files"; é o link que você pode utilizar o navegador para acessar a pasta "files" a mesma pasta do processo anterior.
    em $checksum_update_interval = 60; é o tempo em segundos, que o update levará para checkar se há alguma atualização ( não é necesário alterar )
     
    - Na sua vps, dentro da pasta do SITE, cria uma pasta chamada API e outra pasta dentro dela chamada FILES
    - Envie o arquivo updater_advanced.php para a pasta API
    - De permissão 777 para pasta e subpasta API
     
    * voltando aos arquivos do otclient * 
     
    - Abra o arquivo init.lua
     
    aconselho alterar o "APP_NAME = "otclientv8", pois é o nome da pasta que ficará salva nos arquivos temporários, isso evitará conflitos com versões já existe no pc
    altere o campo updater, colocando o endereço apontado para o arquivo updater_advanced.php enviado para o seu site nos passos anteriores.
     
    - Após as edições anteriores, salve o arquivo 
    - Compacte os arquivos data, layout, modules e init.lua, renomeando para data.zip ( obrigatoriamente precisa ser zip )
    - Exclua os arquivos zipados e os demais desnecessários para os jogadores.
     
    Atenção: o auto update só funcionará se os arquivos estiverem zipado conforme descrito.
     
    - Envie todos os arquivos para a pasta files em sua vps ( recomendo zipar para enviar, poupara processamento e tempo de envio )
    - Após enviar, extraia os arquivos NA VPS, os arquivos no pc devem continuar zipado
    - Atenção nesta parte, as pastas e arquivo data / layout / modules / init.lua necessáriamente precisam estar na mesma pasta do executáveis, conforme time 4:20 no vídeo que deixarei disponível no final.
     
    lembrando: o update só aceitará arquivos editados após o tempo estipulado em checksum_update_interval , se fizer edições antes deste tempo, o sistema não irá considerar
     
     
    Um vídeo objetivo do conteúdo citado acima:
     
     
     
  6. Gostei
    Frenesy deu reputação a marcoshps11 em OTCv8-Mobile   
    vai utilizar APK editor como no video, no final falto uma parte, porém o procedimento seria:
    clique em open contentes -> assets, unzip "data.zip", adicione o dat/spr em data/things/ (crie a pasta da versao que vai usar), zip os arquivos novamente e salve o apk
     
     
  7. Gostei
    Frenesy recebeu reputação de premii em [TFS 0.4] EXP por HIT   
    Adaptação do Script do membro: @Apocalypse.
    Tópico Oficial com instruções de instalação: CLIQUE AQUI.
     
     
    -- CONFIGURAÇÕES DE EXPERIENCIA -- useStages = false -- Usar sistema de Stages , true/false premiumMultipliqueExp = 2 -- Players Premiums terão exp multiplicada, caso não querer deixe 1. rateExp = 300 -- Exp caso não for usar stages. local stages = { -- ["DELEVEL-ATELEVEL"] = EXP, (OBS: NUNCA REPETIR O MSM NUMERO, SEMPRE COLOCAR UM A MAIS.) ["1-50"] = 300, ["51-100"] = 250, ["101-150"] = 200, ["151-200"] = 150, ["201-250"] = 100, ["251-300"] = 50, ["351-400"] = 25, } ultimateExp = 15 -- exp que vai usar caso o level do player não tiver mais na tabela . -- CONFIGURAÇÕES DA PARTY partyPorcent = 40 -- Quantos Porcento da exp vai para os membros da party levelBlockParty = 1000 -- Diferença Maxima de Level permitida para membro da party ganhar exp. expShareRadiusX = 30 -- Distancia maxima permitida no eixo X para membro da party ganhar exp. expShareRadiusY = 30 -- Distancia maxima permitida no eixo Y para membro da party ganhar exp. expShareRadiusZ = 1 -- Distancia maxima permitida no eixo Z para membro da party ganhar exp. -- CONFIGURAÇÕES DE RINGS -- local rings = { -- [ID DO ANEL] = EXP MULTIPLICADA POR X EXP. [3048] = 2, [3049] = 4, [3050] = 6, } -- FIM DAS CONFIGURAÇÕES -- function CalculeExp(monsterhp, exptotal, hit) hit = hit <= monsterhp and math.ceil(exptotal * hit / monsterhp) or 0 return hit < 0 and 0 or hit end function isSummon(cid) return getCreatureMaster(cid) end function onStatsChange(cid, attacker, type, combat, value) if isPlayer(attacker) and isMonster(cid) then if getCreatureStorage(cid, 50001) ~= 1 then doCreatureSetStorage(cid, 50002, getMonsterInfo(getCreatureName(cid)).experience * rateExp) doCreatureSetStorage(cid, 50001, 1) end end if type == STATSCHANGE_HEALTHLOSS then if isMonster(cid) then if isCreature(attacker) then local _cid = isSummon(attacker) and getCreatureMaster(attacker) or attacker if isPlayer(_cid) then if useStages then for strstage, experience in pairs(stages) do tabstage = string.explode(strstage, "-") if getPlayerLevel(_cid) >= tonumber(tabstage[1]) and getPlayerLevel(_cid) <= tonumber(tabstage[2]) then ultimateExp = experience end end experienceRate = ultimateExp else experienceRate = rateExp end local expgain = CalculeExp(getCreatureMaxHealth(cid), getMonsterInfo(getCreatureName(cid)).experience * experienceRate, value) if getCreatureStorage(cid, 50002) > 0 then if getCreatureStorage(cid, 50002) - expgain < 0 then expgain = getCreatureStorage(cid, 50002) end doCreatureSetStorage(cid, 50002, getCreatureStorage(cid, 50002) - expgain) local ringexp = 1 for idring, expring in pairs(rings) do if getPlayerSlotItem(_cid, 9).itemid == idring then ringexp = expring break end end local premiumMultipliqueExp = isPremium(_cid) and premiumMultipliqueExp or 1 expgain = expgain * ringexp * premiumMultipliqueExp local party = false if isInParty(_cid) then local partyMembers, expParty = getPartyMembers(getPartyLeader(_cid)), expgain / 100 * partyPorcent for indice, partyMember in pairs(partyMembers) do attackerLevel, partyLevel = getPlayerLevel(_cid), getPlayerLevel(partyMember) attackerPos, partyPos = getThingPos(_cid), getThingPos(partyMember) x = false if math.abs(attackerLevel - partyLevel) > levelBlockParty then x = true elseif math.abs(attackerPos.x - partyPos.x) > expShareRadiusX then x = true elseif math.abs(attackerPos.y - partyPos.y) > expShareRadiusY then x = true elseif attackerPos.z ~= partyPos.z then x = true elseif _cid == partyMember then x = true end if x then partyMembers[indice] = nil end end if #partyMembers ~= 0 then expParty = math.ceil(expgain / 100 * partyPorcent) expmember = math.ceil(expParty / #partyMembers) for _, member in pairs(partyMembers) do if member ~= _cid then doPlayerSendTextMessage(member, 12, "You received "..expmember.." party exp.") doPlayerAddExp(member, expmember) end end doPlayerSendTextMessage(_cid, 12, "You gain "..expgain.." exp. (" ..partyPorcent.."% send to party)") doPlayerAddExp(_cid, expgain - expParty) party = true else party = false end end if not party then doPlayerAddExp(_cid, expgain) doSendAnimatedText(getThingPos(_cid), expgain, 215) end end end end end end return true end function onCombat(cid, target) if isMonster(target) and not isSummon(target) and not isPlayer(target) then registerCreatureEvent(target, "ExpGain") end return true end  
    Créditos:

    @Frenesy
    @Apocalypse
     
     
  8. Curtir
    Frenesy deu reputação a marcoshps11 em OTCv8-Mobile   
    Hoje, a nova versão do Android foi lançada.

    Registro de alterações:
    - Adicionado suporte multitoque
    - Adicionado teclado (joystick) para caminhada manual
    - Barra de ação aprimorada
    - Painel de ação esquerdo aprimorado, ação extra adicionada ao clicar duas vezes
    - Outras pequenas correções de bugs
     
    Dicas para usuários mobile:

    - Clique duas vezes em Usar no painel esquerdo para usar o item em você
    - Clique duas vezes em Atacar / Seguir no painel esquerdo para atacar / seguir a primeira criatura da lista de batalhas
    - Clique duas vezes em Olhar no painel esquerdo para ver a primeira criatura na lista de batalhas.
    - Mantenha o dedo por 0,5s para clicar com o botão direito
    - Você pode ampliar / reduzir o mapa usando bot (guia Ferramentas)
    - Você pode ligar teclas de aumentar / diminuir volume como teclas de atalho
    - O botão de navegação traseira funciona como escape, você pode usá-lo para fechar as janelas
     
    O link para download é o mesmo de sempre: http://otclient.ovh/otclientv8.apk
     

    link suporte br: https://discord.gg/PXuzQ5P

    Mais atualizações estão chegando em breve!
    Divirta-se
     
  9. Curtir
    Frenesy deu reputação a L3K0T em AUMENTANDO TELA DE VISÃO OTCLIENTE EM REV3884 8.60 0.4   
    REV3884 TFS 0.4 OTC 0.6.6

     
    OBSERVAÇÃO:
    Bom galera hoje vim trazer um código de expansão de visão para o otclient alterado por mim,  usado somente para rev3884 e então se você usa um tfs 0.3.6 ou tfs 1.0 não vai dar certo,
    *Esse código foi alterado por mim para ser usado apenas para rev3884, procolo 8.60 e TFS 0.4 que no caso não achei e resolvi compartilhar essas alterações.
     
     
     
    1° TUTORIAL 1 SOURCE DO SEU SERVIDOR.
     
    Abra Protocollgame.cpp 
     
    1 Ache
    ((x >= myPos.x - 8 + offsetz) && (x <= myPos.x + 9 + offsetz) && //(y >= myPos.y - 6 + offsetz) && (y <= myPos.y + 7 + offsetz)); ALTERE PARA:
     
    ((x >= myPos.x - Map::maxClientViewportX + offsetz) && (x <= myPos.x + (Map::maxClientViewportX+1) + offsetz) && (y >= myPos.y - Map::maxClientViewportY + offsetz) && (y <= myPos.y + (Map::maxClientViewportY+1) + offsetz));  
     
    2 Ache:
     
    GetMapDescription(pos.x - 8, pos.y - 6, pos.z, 18, 14, msg);  
    ALTERE PARA:
     
    GetMapDescription(pos.x - Map::maxClientViewportX, pos.y - Map::maxClientViewportY, pos.z, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, msg);  
     
    3 Ache:
     
    if(oldPos.y > newPos.y) // north, for old x { msg->put<char>(0x65); GetMapDescription(oldPos.x - 8, newPos.y - 6, newPos.z, 18, 1, msg); } else if(oldPos.y < newPos.y) // south, for old x { msg->put<char>(0x67); GetMapDescription(oldPos.x - 8, newPos.y + 7, newPos.z, 18, 1, msg); } if(oldPos.x < newPos.x) // east, [with new y] { msg->put<char>(0x66); GetMapDescription(newPos.x + 9, newPos.y - 6, newPos.z, 1, 14, msg); } else if(oldPos.x > newPos.x) // west, [with new y] { msg->put<char>(0x68); GetMapDescription(newPos.x - 8, newPos.y - 6, newPos.z, 1, 14, msg); } ALTERE PARA:
     
    if (oldPos.y > newPos.y) { // north, for old x msg->put<char>(0x65); GetMapDescription(oldPos.x - Map::maxClientViewportX, newPos.y - Map::maxClientViewportY, newPos.z, (Map::maxClientViewportX+1)*2, 1, msg); } else if (oldPos.y < newPos.y) { // south, for old x msg->put<char>(0x67); GetMapDescription(oldPos.x - Map::maxClientViewportX, newPos.y + (Map::maxClientViewportY+1), newPos.z, (Map::maxClientViewportX+1)*2, 1, msg); } if (oldPos.x < newPos.x) { // east, [with new y] msg->put<char>(0x66); GetMapDescription(newPos.x + (Map::maxClientViewportX+1), newPos.y - Map::maxClientViewportY, newPos.z, 1, (Map::maxClientViewportY+1)*2, msg); } else if (oldPos.x > newPos.x) { // west, [with new y] msg->put<char>(0x68); GetMapDescription(newPos.x - Map::maxClientViewportX, newPos.y - Map::maxClientViewportY, newPos.z, 1, (Map::maxClientViewportY+1)*2, msg); }  
     
    4 ache
     
    GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 5, 18, 14, 3, skip); //(floor 7 and 6 already set) GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 4, 18, 14, 4, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 3, 18, 14, 5, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 2, 18, 14, 6, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 1, 18, 14, 7, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, 0, 18, 14, 8, skip);  
    Altere para
     
    GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 5, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 3, skip); //(floor 7 and 6 already set) GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 4, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 4, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 3, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 5, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 2, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 6, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 1, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 7, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, 0, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 8, skip);  
     
    5 ache
     
    GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, oldPos.z - 3, 18, 14, 3, skip);  
    ALTERE PARA
     
    GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, oldPos.z - 3, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, 3, skip);  
     
    6 ACHE
     
    GetMapDescription(oldPos.x - 8, oldPos.y + 1 - 6, newPos.z, 1, 14, msg);  
    ALTERE PARA
     
    GetMapDescription(oldPos.x - Map::maxClientViewportX, oldPos.y - (Map::maxClientViewportY-1), newPos.z, 1, (Map::maxClientViewportY+1)*2, msg);  
     
    7 ACHE
     
    GetMapDescription(oldPos.x - 8, oldPos.y - 6, newPos.z, 18, 1, msg); ALTERE PARA
     
    GetMapDescription(oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z, (Map::maxClientViewportX+1)*2, 1, msg);  
     
    8 Ache
     
    GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z, 18, 14, -1, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z + 1, 18, 14, -2, skip); GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z + 2, 18, 14, -3, skip);  
    Altere para
     
    GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -1, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z + 1, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -2, skip); GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z + 2, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -3, skip);  
     
    9 ache
     
    GetFloorDescription(msg, oldPos.x - 8, oldPos.y - 6, newPos.z + 2, 18, 14, -3, skip);  
    Altere para
     
    GetFloorDescription(msg, oldPos.x - Map::maxClientViewportX, oldPos.y - Map::maxClientViewportY, newPos.z + 2, (Map::maxClientViewportX+1)*2, (Map::maxClientViewportY+1)*2, -3, skip);  
     
    10 ache
     
    GetMapDescription(oldPos.x + 9, oldPos.y - 1 - 6, newPos.z, 1, 14, msg);  
    Altere para
     
    GetMapDescription(oldPos.x + Map::maxClientViewportX+1, oldPos.y - (Map::maxClientViewportY+1), newPos.z, 1, ((Map::maxClientViewportY+1)*2), msg);  
     
    AGORA EM MAP.H
     
     
    ache
     
    static const int32_t maxViewportX = 11; //min value: maxClientViewportX + 1 static const int32_t maxViewportY = 11; //min value: maxClientViewportY + 1 static const int32_t maxClientViewportX = 8; static const int32_t maxClientViewportY = 6; altere para:
     
    static const int32_t maxViewportX = 18; //min value: maxClientViewportX + 1 static const int32_t maxViewportY = 18; //min value: maxClientViewportY + 1 static const int32_t maxClientViewportX = 14; static const int32_t maxClientViewportY = 12;  
    Pronto agora é só compilar a source do seu servidor 8.60 rev3884
     
     
    PARTE 2 OTCLIENT 0.6.6
     
    abra o map.cpp da source do otclient 
     
    ache
     
    void Map::resetAwareRange() { AwareRange range; range.left = 8; range.top = 6; range.bottom = 7; range.right = 9; setAwareRange(range); } ALTERE PARA
     
    void Map::resetAwareRange() { AwareRange range; range.left = 14; //Change this to = maxClientViewportX range.top = 12; //Change this to = maxClientViewportY range.bottom = range.top+1; range.right = range.left+1; setAwareRange(range); } COMPILE A SOURCE DO OTCLIENT E PRONTO!!! ESPERO TER SANADO VÁRIAS DÚVIDAS DE AUMENTAR TELA DO OTCLIENT EM REV3884.
    CRÉDITOS: Pra mim pela alterações funcionais. e pelo Flatlander por disponibilizar para tfs 0.3.6 e 1.0 pois esse está alterado pra tfs 0.4
     
     
     
  10. Curtir
    Frenesy deu reputação a Cat em Atualização Tk 2020 - Novo Fórum, Menus, Layout e Medalhões!   
    Votações Encerradas! Com mais de 90% de aprovação dos membros da comunidade, agora colocamos nossas ideias em prática. Obrigado a todos que votaram na nossa enquete e contribuíram com sugestões! Veja a seguir o que mudou no Tibia King.

     
    Novo Fórum!
     
    Os fóruns do Tibia King agora são divididos nas seguintes categorias:
    - Tibia King: Assuntos da comunidade, notícias, eventos e atendimento aos membros.
    - Open Tibia: Distribuições de conteúdos, downloads de servidores, ferramentas e recursos, códigos, websites, mapas, clients e sprites.
    - Gerenciamento de Otserv: Interação entre membros, show offs, divulgação de servidores, formação de equipe, pesquisas, tutoriais e suporte aos membros.
    - Tibia & Bots: Tudo sobre Tibia (galerias e tutoriais) e Bots (downloads, tutoriais e suporte).
    - Diversos: Design geral, outras linguagens de programação, divulgações & classificados e área off-topic para confraternização e outros jogos.
     

    Novo Menu!
     
    Nossos menus foram modificados para facilitar a sua busca por conteúdos no Tibia King:
    - Portal: Regras do Tk, Rankings, Medalhões, Staff, Nossos destaques, Usuários Online.
    - Fóruns: Lista de fóruns, onde você encontra todos os conteúdos da comunidade.
    - Otserv: Baixar Ots, ferramentas & recursos, códigos & sistemas, mapas, clients & gráficos, websites & layouts.
    - Recursos: Custom flags, Funções .lua, Magic/Distance Effects, Monster/Looktypes, Gerador de Outfits/Addons, Baixar Tibia Clients.
    - Projetos: Item Editor, Object Builder, Remere's Map Editor, The Forgotten Server, Otservbr Global.
    - Otservlist: Lista de servidores para você jogar ou anunciar!
    - Anuncie: Divulgue um banner de seu projeto no nosso site e obtenha + acessos!
     

    Novo Layout!
     
    Após a redução de propagandas no fórum fizemos uma redução de espaços, alguma falhas e poluição visual. O novo layout responsivo também trás melhorias para navegação em seu aparelho móvel!
     
     

    Sistema de Medalhões!
     
    Está oficialmente lançado o sistema de medalhões do Tibia King, compondo as categorias Posts, Reputação, Seguidores, Tempo de Registro, Cargos Obtidos e Eventos, você poderá ter até 6 medalhões compatíveis com o seu perfil.
     
    • Veja a lista de medalhões disponíveis!
    • Solicite um medalhão clicando aqui!
     

     
    Mais atualizações por vir!
     
    - Os classificados foram removidos do Tibia King, não permitiremos mais vendas de conteúdos na comunidade. Você pode divulgar ou contratar serviços na seção de freelancers (classificados).
    - Os clubes foram removidos!
    - Nossa seção de códigos está sofrendo alterações, os tópicos antigos serão movidos para suas respectivas áreas conforme o tempo.
    - Os prefixos e tags dos fóruns serão revisados, sabemos que muitos membros pediram prefixos melhores (incluindo informações sobre tfs, etc) e trabalharemos para melhorar isso também.
    - Sugestões? Bugs? Nos informe, ajude-nos a melhorar o Tibia King cada vez mais, comente!
     
     
  11. Curtir
    Frenesy deu reputação a MatteusDeli em (Resolvido)Boosted Creature   
    @bellatrikz Boa noite, veja se é isso que voce quer 
     
    data/lib crie um arquivo chamado boostedMonster.lua e cole isto dentro:
    monster_name_backup = 74812 -- nao mexer monster_exp_backup = 74813 -- nao mexer monster_loot_backup = 74814 -- nao mexer config_boosted = { ["00:00:00"] = { -- Horario de cada dia que irá ocorrer a troca dos monstros pos_monster = {x=161,y=58,z=7, stackpos = 253}, -- a posição aonde ficara o monstro informando a quantidade de exp e loot time_effects = 2 -- tempo em segundos que ficará saindo os efeitos } } monsters_boosteds = { -- Configuracao dos monstros que irão ter exp e loot aumentados [1] = {monster_name = "Dwarf", exp = 5, loot = 7}, [2] = {monster_name = "Goblin", exp = 15, loot = 5}, [3] = {monster_name = "Orc", exp = 25, loot = 15}, [4] = {monster_name = "Dwarf Soldier", exp = 35, loot = 10}, --[5] = {monster_name = "NOME DO MONSTRO", exp = "PORCENTAGEM DE EXP", loot = "PORCENTAGEM DO LOOT"}, }  
    agora em data/globalevents/scripts crie um arquivo chamado boosted.lua e cole isto dentro:
    function onThink(interval, lastExecution) local current_hour = os.date("%X") if config_boosted[current_hour] then local time = config_boosted[current_hour] local monster = getTopCreature(time.pos_monster).uid local random_monster = monsters_boosteds[math.random(1, #monsters_boosteds)] if (monster >= 1) then doRemoveCreature(monster) end SummonMonster(time, random_monster) setGlobalStorageValue(monster_name_backup, random_monster.monster_name) setGlobalStorageValue(monster_exp_backup, random_monster.exp) setGlobalStorageValue(monster_loot_backup, random_monster.loot) end return true end function SummonMonster(time, monster) doCreateMonster(monster.monster_name, time.pos_monster) effectsMonster(time, monster) end function effectsMonster(time, monster) effectLoot(time.pos_monster, monster) effectExp(time.pos_monster, monster) doSendMagicEffect(time.pos_monster, 30) doSendAnimatedText(time.pos_monster, "Boosted", COLOR_DARKYELLOW) addEvent(function() effectsMonster(time, monster) end, time.time_effects * 1000) end function effectLoot(pos, monster) local pos_effect = {x=pos.x, y=pos.y-1, z=pos.z} doSendMagicEffect(pos_effect, 29) doSendAnimatedText(pos_effect, "Loot +"..monster.loot.."%", COLOR_DARKYELLOW) end function effectExp(pos, monster) local pos_effect = {x=pos.x, y=pos.y+1, z=pos.z} doSendMagicEffect(pos_effect, 29) doSendAnimatedText(pos_effect, "EXP +"..monster.exp.."%", COLOR_DARKYELLOW) end Em globalevents.xml registre esta tag:
    <globalevent name="boosted" interval="1000" event="script" value="boosted.lua"/>  
    Agora em data/creatureevents/scripts crie um arquivo chamado boosted.lua e cole isto dentro:
    function onKill(cid, target, damage, flags) if not (isMonster(target)) then return true end if (string.lower(getCreatureName(target)) == string.lower(getGlobalStorageValue(monster_name_backup))) then local exp = tonumber(getGlobalStorageValue(74813)) doPlayerSetRate(cid, SKILL__LEVEL, getExperienceStage(getPlayerLevel(cid))*(getGlobalStorageValue(monster_exp_backup) / 1000)) addLoot(getCreaturePosition(target), getCreatureName(target), {}) else doPlayerSetRate(cid, SKILL__LEVEL, 1) end return true end function addLoot(position, name, ignoredList) local check = false for i = 0, 255 do position.stackpos = i corpse = getTileThingByPos(position) if corpse.uid > 0 and isCorpse(corpse.uid) then check = true break end end if check == true then local newRate = (1 + (getGlobalStorageValue(monster_loot_backup)/100)) * getConfigValue("rateLoot") local mainbp = doCreateItemEx(1987, 1) local monsterLoot = getMonsterLootList(name) for i, loot in pairs(monsterLoot) do if math.random(1, 100000) <= newRate * loot.chance then if #ignoredList > 0 then if (not isInArray(ignoredList, loot.id)) then doAddContainerItem(mainbp, loot.id, loot.countmax and math.random(1, loot.countmax) or 1) end else doAddContainerItem(mainbp, loot.id, loot.countmax and math.random(1, loot.countmax) or 1) end end end doAddContainerItemEx(corpse.uid, mainbp) end end  
    Em creatureevent.xml registre esta tag:
    <event type="kill" name="BoostedMonster" event="script" value="boosted.lua"/>  
    Por ultimo abra o arquivo login.lua na mesma pasta (creatureevents/scripts) e cole esta linha antes do ultimo return true:
    registerCreatureEvent(cid, "BoostedMonster")  
    OBS: A explicação de como adicionar os monstros etc.. Esta no arquivo boostedMonster.lua em data/lib.
  12. Obrigado
    Frenesy recebeu reputação de Cat em Cargos, Ranks e a volta do sistema de Medalhas!   
    Gostei muito do novo estilo. Acho que ficou mais "clean", sabe? Eu curti.
    Minha sugestão seria mudar um pouco as cores do TK. Assim, na hora da mudança, a sensação de novidade fica maior. Mas é só uma sugestão boba.
    Estão fazendo um ótimo trabalho. Parabéns a toda a equipe.
  13. Curtir
    Que show!
    Aguardo ansioso por eventos e coisas que tornam o fórum mais animado.
    Ansioso pra vê o novo layout do site.
  14. Curtir
    Que show!
    Aguardo ansioso por eventos e coisas que tornam o fórum mais animado.
    Ansioso pra vê o novo layout do site.
  15. Curtir
    Que show!
    Aguardo ansioso por eventos e coisas que tornam o fórum mais animado.
    Ansioso pra vê o novo layout do site.
  16. Obrigado
    Frenesy recebeu reputação de Spooky Ghost em (Resolvido)[Ajuda] Recompensas   
    Que tal assim? Não tentei, hein. Estou no trabalho. kkkk
     
    local dias = 1 function onLogin(cid) -- Monday = Segunda -- Tuesday = Terça -- Wednesday = Quarta -- Thursday = Quinta -- Friday = Sexta -- Saturday = Sabado -- Sunday = Domingo DoubleXP = {"Friday", "Saturday", "Sunday", "Thursday"} storage = 2883123 storage_loot = 289991 items = { item_ID = 11505, stamina_potion = 11644, critical_stone = 11752, } qtdes = { qtde = 1, qtde_stone = 2, } if isInArray(DoubleXP, os.date("%A")) then if getStorageAccount(cid, storage_loot, 2) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "--[Double XP ]--\n --[Double Loot ]--\nHoje Estamos em evento Double XP e Loot aproveite!!") return doPlayerSendCancel(cid, "voce ja recebeu a skin box.") end setPlayerStorageValue(cid, storage_loot, 1) if getPlayerStorageValue(cid, storage_loot) == 1 then doPlayerSendTextMessage(cid,22,"Voce logou no periodo em que o Evento de Fim de Semana estava ativo, voce recebeu 1 Critical Stone, 1 Stamina Potion, 1 Dia Premium, Parabens") doPlayerAddItem(cid, items.item_ID, qtdes.qtde) doPlayerAddItem(cid, items.stamina_potion, qtdes.qtde) doPlayerAddItem(cid, items.critical_stone, qtdes.qtde_stone) doPlayerAddPremiumDays(cid, dias) setPlayerStorageValue(cid, storage_loot, 2) doPlayerSendMailByName(getCreatureName(cid), doCreateItemEx(items.item_ID, qtde), getPlayerTown(cid)) doSendMagicEffect(getThingPos(cid), effectChest) end setPlayerStorageValue(cid, storage, 1) doPlayerSetRate(cid, SKILL__LEVEL, 2.0) doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "--[Double XP ]--\n --[Double Loot ]--\nHoje Estamos em evento Double XP e Loot aproveite!!") else doSendMagicEffect(getCreaturePosition(cid), 358) setPlayerStorageValue(cid, storage, 2) setPlayerStorageValue(cid, storage_loot, 3) end return true end function getStorageAccount(cid, key, value) local chars = {} local query = db.getResult("SELECT `id` FROM `players` WHERE `account_id` = '"..getPlayerAccountId(cid).."';") if query:getID() == -1 then return true end repeat local player = query:getDataString("id") table.insert(chars, player) until not query:next() query:free() for i = 1, #chars do local check = db.getResult("SELECT * FROM `player_storage` WHERE `player_id` = '"..chars[i].."' and `key` = '"..key.."' and `value` = '"..value.."';") if check:getID() == 0 then return true end end return false end  
  17. Curtir
    Frenesy recebeu reputação de adrianok em Como alterar/Add uma nova font no Otserver ?   
    Em tempos remotos, consegui uma vez seguindo esse tutorial, usando o GIMP.
    https://otland.net/threads/otclient-font-creator.257389/
     
  18. Gostei
    Frenesy deu reputação a Killua em Armazenar Tabelas em Storages (setGlobalTableStorage)   
    Introdução:

    Esses dias eu estava fazendo um sistema e senti a necessidade de armazenar várias informações (por player) em um só lugar. Porém, todos nós sabemos que não é possível colocar uma tabela como valor de um storage. Por conta disso, decidi tornar possível esse armazenamento.

    Tenho certeza de que essa biblioteca será uma ferramenta extremamente útil para todos os scripters. Ela abre muitas portas e vai permitir a criação de muitos sistemas interessantes.

    Instalação:

    Simplesmente crie o arquivo tableStorage.lua em data/lib e coloque esse código:





    Utilização:

    Para armazenar uma tabela em um storage de um player, use:
    setPlayerTableStorage(cid, key, tabela) Exemplo:
    setPlayerTableStorage(cid, 199991, {["primeiro"] = 4, [8] = "Killua", [3] = 22}) Para armazenar uma tabela em um storage global, use:
    setGlobalTableStorage(key, tabela) Exemplo:
    setGlobalStorageValue(123412, {1, 55, "c", 3}) Para retornar as tabelas, use:
    getGlobalTableStorage(key) ou
    getPlayerTableStorage(cid, key) Esclarecimento:

    As tabelas retornadas pelas funções getGlobalTableStorage e getPlayerTableStorage são tabelas normais e podem ser manipuladas como qualquer outra, por exemplo:
    for t, k in pairs(getPlayerTableStorage(cid, 123444)) do print("["..t.."] "..v) end Observações:

    As tabelas não armazenam valores booleanos, outras tabelas e nem funções, apenas strings e números. No entanto é claro que ela pode armazenar valores recebidos de funções, por exemplo:
    setPlayerTableStorage(cid, 17271, {["level"] = getPlayerLevel(cid), ["sex"] = getPlayerSex(cid) == 1 and "female" or "male"}) Funcionará perfeitamente.


    Mas:
    setPlayerTableStorage(cid, 17271, {returnDouble = function(value) return value*2 end, try = 11, [2] = 10}) Não irá funcionar.

    As tabelas podem ser preenchidas com ou sem index definido, de forma que os não definidos serão definidos automaticamente numa sequencia (Como qualquer tabela). Sendo assim:
    setPlayerTableStorage(cid, 12344, {1,3,23,1999,"test"})setPlayerTableStorage(cid, 12344, {[5] = "hi", ["mia"] = 32, c = 18})setPlayerTableStorage(cid, 12344, {1, "c", 6, ["test"] = 18, b = "c", "hello world"}) São todas válidas.
     
    Cuidado com com tabelas muito grandes! Elas podem acabar pesando bastante e consumindo bastante de sua database. Eu aconselho não ultrapassar 4 elementos. É claro que apenas um storage com uma tabela bem grande não vai causar problema mas, em um servidor com muitos jogadores, pode ser perigoso adicionar muitas tabelas grandes (1 por jogador).

    Considerações:

    Eu realmente acho que essa biblioteca vai abrir várias possibilidades para todos vocês, scripters. E espero que criem muitos sistemas legais a partir dela. Se tiverem dúvidas ou sugestões, podem dizer.

    Abraços.
  19. Gostei
    Frenesy recebeu reputação de P11Mefus em [TFS 0.4] EXP por HIT   
    Adaptação do Script do membro: @Apocalypse.
    Tópico Oficial com instruções de instalação: CLIQUE AQUI.
     
     
    -- CONFIGURAÇÕES DE EXPERIENCIA -- useStages = false -- Usar sistema de Stages , true/false premiumMultipliqueExp = 2 -- Players Premiums terão exp multiplicada, caso não querer deixe 1. rateExp = 300 -- Exp caso não for usar stages. local stages = { -- ["DELEVEL-ATELEVEL"] = EXP, (OBS: NUNCA REPETIR O MSM NUMERO, SEMPRE COLOCAR UM A MAIS.) ["1-50"] = 300, ["51-100"] = 250, ["101-150"] = 200, ["151-200"] = 150, ["201-250"] = 100, ["251-300"] = 50, ["351-400"] = 25, } ultimateExp = 15 -- exp que vai usar caso o level do player não tiver mais na tabela . -- CONFIGURAÇÕES DA PARTY partyPorcent = 40 -- Quantos Porcento da exp vai para os membros da party levelBlockParty = 1000 -- Diferença Maxima de Level permitida para membro da party ganhar exp. expShareRadiusX = 30 -- Distancia maxima permitida no eixo X para membro da party ganhar exp. expShareRadiusY = 30 -- Distancia maxima permitida no eixo Y para membro da party ganhar exp. expShareRadiusZ = 1 -- Distancia maxima permitida no eixo Z para membro da party ganhar exp. -- CONFIGURAÇÕES DE RINGS -- local rings = { -- [ID DO ANEL] = EXP MULTIPLICADA POR X EXP. [3048] = 2, [3049] = 4, [3050] = 6, } -- FIM DAS CONFIGURAÇÕES -- function CalculeExp(monsterhp, exptotal, hit) hit = hit <= monsterhp and math.ceil(exptotal * hit / monsterhp) or 0 return hit < 0 and 0 or hit end function isSummon(cid) return getCreatureMaster(cid) end function onStatsChange(cid, attacker, type, combat, value) if isPlayer(attacker) and isMonster(cid) then if getCreatureStorage(cid, 50001) ~= 1 then doCreatureSetStorage(cid, 50002, getMonsterInfo(getCreatureName(cid)).experience * rateExp) doCreatureSetStorage(cid, 50001, 1) end end if type == STATSCHANGE_HEALTHLOSS then if isMonster(cid) then if isCreature(attacker) then local _cid = isSummon(attacker) and getCreatureMaster(attacker) or attacker if isPlayer(_cid) then if useStages then for strstage, experience in pairs(stages) do tabstage = string.explode(strstage, "-") if getPlayerLevel(_cid) >= tonumber(tabstage[1]) and getPlayerLevel(_cid) <= tonumber(tabstage[2]) then ultimateExp = experience end end experienceRate = ultimateExp else experienceRate = rateExp end local expgain = CalculeExp(getCreatureMaxHealth(cid), getMonsterInfo(getCreatureName(cid)).experience * experienceRate, value) if getCreatureStorage(cid, 50002) > 0 then if getCreatureStorage(cid, 50002) - expgain < 0 then expgain = getCreatureStorage(cid, 50002) end doCreatureSetStorage(cid, 50002, getCreatureStorage(cid, 50002) - expgain) local ringexp = 1 for idring, expring in pairs(rings) do if getPlayerSlotItem(_cid, 9).itemid == idring then ringexp = expring break end end local premiumMultipliqueExp = isPremium(_cid) and premiumMultipliqueExp or 1 expgain = expgain * ringexp * premiumMultipliqueExp local party = false if isInParty(_cid) then local partyMembers, expParty = getPartyMembers(getPartyLeader(_cid)), expgain / 100 * partyPorcent for indice, partyMember in pairs(partyMembers) do attackerLevel, partyLevel = getPlayerLevel(_cid), getPlayerLevel(partyMember) attackerPos, partyPos = getThingPos(_cid), getThingPos(partyMember) x = false if math.abs(attackerLevel - partyLevel) > levelBlockParty then x = true elseif math.abs(attackerPos.x - partyPos.x) > expShareRadiusX then x = true elseif math.abs(attackerPos.y - partyPos.y) > expShareRadiusY then x = true elseif attackerPos.z ~= partyPos.z then x = true elseif _cid == partyMember then x = true end if x then partyMembers[indice] = nil end end if #partyMembers ~= 0 then expParty = math.ceil(expgain / 100 * partyPorcent) expmember = math.ceil(expParty / #partyMembers) for _, member in pairs(partyMembers) do if member ~= _cid then doPlayerSendTextMessage(member, 12, "You received "..expmember.." party exp.") doPlayerAddExp(member, expmember) end end doPlayerSendTextMessage(_cid, 12, "You gain "..expgain.." exp. (" ..partyPorcent.."% send to party)") doPlayerAddExp(_cid, expgain - expParty) party = true else party = false end end if not party then doPlayerAddExp(_cid, expgain) doSendAnimatedText(getThingPos(_cid), expgain, 215) end end end end end end return true end function onCombat(cid, target) if isMonster(target) and not isSummon(target) and not isPlayer(target) then registerCreatureEvent(target, "ExpGain") end return true end  
    Créditos:

    @Frenesy
    @Apocalypse
     
     
  20. Curtir
    Frenesy deu reputação a Azzus22 em Trade OFF - Shop Offline   
    Fala galera tudo certinho?
     
    Eu sei que estou um pouco atrasado, e nem sei se posso estar ressuscitando esse tópico, mas eu notei que no 8.6 existem alguns pontos que podiam ser melhorados no script então eu dei uma atualizada aqui no meu e trouxe para compartilhar aqui com vocês.
     
    Agora quando o player disser:
              !offer my - Vai ser listado somente as coisas que ele colocou para negociar, assim fica mais fácil de remover.
              !offer info - Vai mostrar as opções e como utilizar os comandos.
              !offer list, NomeItem - Vai mostrar os 10 itens mais baratos pelo nome que foi procurado.
    Lembrando que essa alteração no Script é válida apenas para pessoas que como eu não vão usar Web Site.
    Todos os avisos de retorno em caso de erro foram traduzidos para português também, fiz isso pensando na galera que ainda não ta fera no inglês.
     
    Bom sem mais, só gostaria de pedir uma ajuda com o método: getItemNameById()
    Alguém saberia me dizer como evitar que ele retorne um erro no Console do Ot server caso alguém digite o nome de um item errado?
    A solução paliativa que eu coloquei para evitar que ficasse imprimindo muitos erros no console, foi dar um mute de 10 segundos no jogador que digita-se o nome do item errado.
     
    Valeu ai, obrigado ?
  21. Curtir
    Frenesy deu reputação a Orochi Elf em (Resolvido)Monstros/Players Attack   
    Não testei. o Statschange voce registra no login.lua, e o target voce registra no xml do monstro.
     

    function onStatsChange(cid, attacker, type, combat, value)     if isPlayer(cid) and type == STATSCHANGE_HEALTHLOSS then         if getPlayerStorageValue(cid, 12345) >= 1 then             return false         end     end     return true end function onTarget(cid, target)     if isPlayer(target) and getPlayerStorageValue(target, 12345) >= 1 then         return false     end     return true end
  22. Curtir
    Frenesy recebeu reputação de Marco Oliveira em NPC Trade/Storage   
    Falaa pessoal do TK!
    Trouxe um script que fiz aqui para o meu servidor e gostaria de compartilhar com vocês:
     
    A idéia é bem simples: É apenas um NPC que só vende items para você se você tiver tal storage.
     
    Testado em: 8.60
    local keywordHandler = KeywordHandler:new()local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() end local choose = {} local cancel = {} local available = {} --== Configurar storage e Items a venda aqui. local stor = 1500 -- configurar storage aqui local Trade = {             {id=15646, buy=200, sell=0, name='buggy backpack'},             {id=10522, buy=200, sell=0, name='crown backpack'},             {id=10518, buy=200, sell=0, name='demon backpack'},             {id=11243, buy=200, sell=0, name='dragon backpack'}, } --== Fim das Configurações. local function setNewTradeTable(table) local items = {}       for _, v in ipairs(table) do       items[v.id] = {itemId = v.id, buyPrice = v.buy, sellPrice = v.sell, subType = 0, realName = v.name}       end return items end local function setNewLineTable(oldTable, newTable)       for k, v in pairs(oldTable) do       table.insert(newTable, k, v)       end return true end function creatureSayCallback(cid, type, msg)          if(not npcHandler:isFocused(cid)) then          return false end local talkUser = NPCHANDLER_CONVBEHAVIOR == CONVERSATION_DEFAULT and 0 or cid     if(msgcontains(msg, 'Trade') or msgcontains(msg, 'trade')) and getPlayerStorageValue(cid, stor) == 1 then     selfSay('Essas são minhas ofertas!', cid)     tradeRank = Trade     local items = setNewTradeTable(tradeRank)     local function onBuy(cid, item, subType, amount, ignoreCap, inBackpacks)     if items[item].buyPrice then     doPlayerAddItem(cid, items[item].itemId, amount)     doPlayerRemoveMoney(cid, items[item].buyPrice * amount)     return true     end return true end    local function onSell(cid, item, subType, amount, ignoreCap, inBackpacks)    if items[item].sellPrice then    doPlayerAddMoney(cid, items[item].sellPrice * amount)    doPlayerRemoveItem(cid, items[item].itemId, amount)    return true    end     return true end openShopWindow(cid, tradeRank, onBuy, onSell)    else    selfSay('Desculpe, mas você não tem o que é necessário para negociar comigo.', cid)    end return TRUE end npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback) npcHandler:addModule(FocusModule:new())  Esse é meu primeiro script para a galera do TK.
    Espero que gostem!
     
    Abraços! 
  23. Curtir
    Frenesy deu reputação a Fir3element em (Resolvido)Erro ao compilar TFS 0.4 rev3884 no Dev c++   
    Deleta todos os dev do seu pc (se tiver instalado mingw, deleta tbm).
    Depois baixa o dev do stian (http://www.4shared.com/archive/jxytO4M5ba/Stians_Repack_Dev-Cpp_02_64bit.htm) e instala o pacote openssl.
     
    Acho que vai aparecer uma coisa relacionado ao cache quando abrir o dev, aperta em "yes".
  24. Gostei
    Frenesy deu reputação a Adriano SwaTT em (Resolvido)Ajuda Simples [doPlayerAddMana(cid, -mana)]   
    Boa noite galera, estou com um probleminha chato aqui que é o seguinte:
    Estou usando um script que remove mana do player de tempo em tempo (segundos)...
    Porém, quando ele remove a mana, ele deixa o player com "Battle" [condition infight], dito isso, gostaria de saber como faço para que remova a mana, mas sem deixar INFIGHT.
     
    Estou usando a seguinte tag:

    doPlayerAddMana(cid, -mana) .
    A solução foi add "false" a tag:

    doPlayerAddMana(cid, -mana, false) Pois existe um bool que é confirmado sempre como verdadeiro caso não use o parâmetro indiciado a ele ( 3 ), caso verdadeiro, o script irá executar a removação de mana como combat, ou seja, toda a funcionalidade em relação ao combate será executada, caso falso, ele irá retorna apenas a mudança de mana. - Null (Usuário)
     
     
    Fico aguardando resposta.
     
    Desde já, muito obrigado.
  25. Gostei
    Frenesy deu reputação a Dean183 em Aumentando attackspeed por fist(sem usar sources)   
    Olá criançada do tibiaking.
     
            Durante muito tempo, várias pessoas vieram me perguntar como colocar o attackspeed por fist fighting e a resposta sempre foi a mesma:
     
    "Tendo as sources é só dar uma procurada no tibiaking que lá tem(Jabá)"
     
            Mas parando para pensar um pouco e sendo criativo, elaborei 1 jeito(incrivelmente fácil) de imitar esse sistema apenas em LUA.
     
     
     
    Nota1: Como a estrutura lua apresenta certas limitações infelizmente o sistema também, será necessário um item na mão para se treinar o fist (se você bater em algum target sem items, a velocidade do ataque ira parecer a original mesmo tendo 5k de fist fighting.
     
    Nota2: Caso você tenha acesso as sources do seu ot e saiba como compilar etc, é melhor que você use o sistema nas sources vide: Attackspeed por Fist
     
    Nota3: Se você não tiver acesso as sources(elas são sempre um problema não é mesmo)e a velocidade de ataque aumente muito, a mudança no attackspeed só será visível se o player estiver usando bot.
     
     
     
     
           Então vamos logo ao que interessa a todos:
     
     
                    Primeiro: criei um arquivo lua em data\creaturescripts\scripts como o nome de  attackspeed.lua  e coloque o seguinte dentro:
     
    function onAttack(cid, target) --------Fist fighting decreasing/increasing attackspeed in lua by MMF--------     local skill = getPlayerSkill(cid, 0)     local velocidade = math.floor(20000/(1.35*skill)) -- altere aqui para aumentar/diminuir a quantidade de ataques por segundo!     local item = getPlayerWeapon(cid)     if item.itemid == 0 then         doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Você precisa ter uma arma em sua mão para atacar!")     return false     end         doItemSetAttribute(item.uid,'attackspeed', velocidade)      return true end Lembre-se que para aumentar a quantidade de ataques por segundo a variável velocidade tem de ficar MENOR e o contrário para diminuir a velocidade.
     
     
     Adicione a seguinte tag no XML:
    <event type="attack" name="attackspeed" script="attackspeed.lua"/>  
     
    Agora vá em  data\creaturescripts\scripts, encontre o login.lua e adicione:
    registerCreatureEvent(cid, "attackspeed") Agora vá em data\items, encontre o items.xml e escolha o item que será usado para treinar o fist no meu caso escolhi uma blue rose.
     
    no item que você escolher adicione os seguintes atributos:
    <attribute key="attack" value="1" /> <attribute key="weaponType" value="fist" />  
     
    no meu caso a blue rose ficou assim, mas você pode fazer com qualquer item que possa ser colocado na mão do personagem.
        </item>     <item id="2745" article="a" name="blue rose">         <attribute key="weight" value="80" />         <attribute key="attack" value="1" />         <attribute key="weaponType" value="fist" />     </item>  
    E é isso(se eu não me esqueci de nada). Se você for utilizar esse sistema em seu servidor lembre-se de avisar aos players que precisa de 1 item para treinar o fist!
     
    Dúvidas/edições é só postar nos comentários ou me chamar nos comentários que farei o possível para ajudar!
     
    meu skype: john.winchester8

Informação Importante

Confirmação de Termo