Ir para conteúdo

Doria Louro

Membro
  • Registro em

  • Última visita

Histórico de Curtidas

  1. Gostei
    Doria Louro recebeu reputação de Rodrigo94 em (Resolvido)Npc Comprar 100 unidades   
    Olá nobres amigos, eu novamente.
    Servidor: TFS 0.3.6
    Cliente: 8.60
     
    Durante o desenvolvimento de meu servidor notei que os itens que possui cargas/charges, exemplo: amuletos, estavam todos sendo vendidos/comprados apenas com uma carga pelo NPC, mesmo que no itens.xml estivesse declarado a tag com o numero de cargas/charges desejado, através das minhas efetuei a seguinte correção:
     
    Em npc/lib/npcsystem/modules.lua localize a seguinte função addBuyableItem e substitua por:
    function ShopModule:addBuyableItem(names, itemid, cost, subType, realName) if (type(subType) == 'string' and realName == nil) then realName = subType subType = nil end local v = getItemInfo(itemid) if (SHOPMODULE_MODE ~= SHOPMODULE_MODE_TALK) then if (self.npcHandler.shopItems[itemid] == nil) then self.npcHandler.shopItems[itemid] = { buyPrice = -1, sellPrice = -1, subType = tonumber(subType) or (v.charges > 0 and v.charges or 0), realName = "" } end self.npcHandler.shopItems[itemid].buyPrice = cost self.npcHandler.shopItems[itemid].realName = realName or getItemNameById(itemid) self.npcHandler.shopItems[itemid].subType = tonumber(subType) or (v.charges > 0 and v.charges or 1) end if (names ~= nil and SHOPMODULE_MODE ~= SHOPMODULE_MODE_TRADE) then local parameters = { itemid = itemid, cost = cost, eventType = SHOPMODULE_BUY_ITEM, module = self, realName = realName or v.name, subType = tonumber(subType) or (v.charges > 0 and v.charges or 1) } for i, name in pairs(names) do local keywords = {} table.insert(keywords, 'buy') table.insert(keywords, name) local node = self.npcHandler.keywordHandler:addKeyword(keywords, ShopModule.tradeItem, parameters) node:addChildKeywordNode(self.yesNode) node:addChildKeywordNode(self.noNode) end end end  
    No mesmo arquivo altere também a função addSellableItem:
    function ShopModule:addSellableItem(names, itemid, cost, realName) local v = getItemInfo(itemid) if (SHOPMODULE_MODE ~= SHOPMODULE_MODE_TALK) then if (self.npcHandler.shopItems[itemid] == nil) then self.npcHandler.shopItems[itemid] = { buyPrice = -1, sellPrice = -1, subType = ((v.charges > 0 and v.stackable) and v.charges or 0), realName = "" } end self.npcHandler.shopItems[itemid].sellPrice = cost self.npcHandler.shopItems[itemid].realName = realName or v.name end if (names ~= nil and SHOPMODULE_MODE ~= SHOPMODULE_MODE_TRADE) then local parameters = { itemid = itemid, cost = cost, eventType = SHOPMODULE_SELL_ITEM, module = self, realName = realName or v.name } for i, name in pairs(names) do local keywords = {} table.insert(keywords, 'sell') table.insert(keywords, name) local node = self.npcHandler.keywordHandler:addKeyword(keywords, ShopModule.tradeItem, parameters) node:addChildKeywordNode(self.yesNode) node:addChildKeywordNode(self.noNode) end end end  
    Aqui funcionou perfeitamente, venda dos agrupáveis e compra de itens com charges.
    Vida de desenvolvedor é resolver um bug e criar outro
     
    Espero ter ajudado 😄
  2. Curtir
    Doria Louro deu reputação a L3K0T em Distro TFS 0.4 - Bloquear edição   
    se vc selecionar alguma coisa no distro aberto o servidor congela no windows, isso é normal, mais é só aperta 1 vez o boão direito do mouse dentro da distro que ele volta ao normal
  3. Curtir
    Doria Louro deu reputação a Sphynx1 em [MoveMent] Emboscada dos Trolls   
    Olá galera, vocês conhecem as lendas dos Trolls de baixo da ponte? Eles estão sempre na espreita, aguardando alguém para roubar, assassinar, estuprar e comer suas almas (as últimas partes são brincadeira). Me baseando nessa lenda eu fiz esse simples script, é um dos primeiros códigos que consigo desenvolver sozinho(tive ajuda), eu espero que ajude alguém em algum lugar do tempoespaço, é um script ótimo se você assim como eu gosta de pontes e também sempre teve a vontade de incrementar alguns de seus mapas com scripts.




     
    1º. Acesse a pasta raiz do seu servidor, logo após siga o seguinte caminho: data/movements e abra o arquivo movements.xml. O código que você devera adicionar dentro deste arquivo está listado abaixo.
    <movevent type="StepIn" actionid="DigiteONumeroDeUmaActionAqui" event="script" value="ponte.lua"/>  
    2º. Dentro de data/movements abra a pasta 'scripts' e crie um arquivo .lua nomeado de 'ponte', dentro deste adicione o seguinte código.
    function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor) local configuration = { monstrosTime = 1*5*1000, -- tempo até a criatura aparecer tempoDeStorage = 1*20*1000, -- em quanto tempo será removido a storage e se tornará possivel as criaturas resurgirem storage = 987459, -- numero da storage monsters = { [1] = {name = "Troll Champion", pos = {x = 1001, y = 1110, z = 9}}, -- Nome, quantidade e posição dos monstros, altere a vontade [2] = {name = "Troll", pos = {x = 1000, y = 1107, z = 9}}, [3] = {name = "Troll", pos = {x = 1007, y = 1109, z = 9}} } } if isPlayer(cid) == true then if getPlayerStorageValue(cid, configuration.storage) < 1 then doCreatureSay(cid, "A ponte não parece segura e quando você dá o primeiro passo ouve um grunhido e nota a presença de um ser estranho.", TALKTYPE_ORANGE_1) -- MSG que você quer exibir addEvent(function() for k, v in pairs(configuration.monsters) do doCreateMonster(v.name, v.pos) end end, configuration.monstrosTime) setPlayerStorageValue(cid, configuration.storage, 1) addEvent(function() setPlayerStorageValue(cid, configuration.storage, 0) end, configuration.tempoDeStorage) end end return true end  
    3º. Inicie o seu servidor e adicione o número da 'ActionID' que você inseriu em 'movements.xml' a algum piso de sua preferência, no caso eu adicionei no meio da ponte. Seja criativo.
  4. Curtir
    Doria Louro deu reputação a L3K0T em TFS 0.4 Jogadores não logam   
    Meio q pausa o console, parece tipo aquele negócio de segundo plano, tente ver na propriedade do console algo que bloqueia ao minimizar saca? 
  5. Curtir
    Doria Louro deu reputação a L3K0T em TFS 0.4 Jogadores não logam   
    Pode ser o banco de dados caindo e voltando aí da erro ninguém entra 🤔
  6. Curtir
    Doria Louro deu reputação a Imperius em TFS 0.4 Jogadores não logam   
    Dá uma olhada se o problema está em creaturescripts. Talvez um "return false" em vez de "return true" em algum script com callback "onLogin".
  7. Gostei
    Ei amigo! Só passando pra informar que finalizei a primeira parte do seu pedido. Peço desculpas pela demora, conforme lhe expliquei, minha faculdade é realmente puxada, agora mesmo estou virando a noite estudando, mas dei uma pausa e resolvi trabalhar no que você pediu pra esfriar a cabeça.
     
    Enfim, fiz a parte sobre o summon seguir o jogador. Vamos lá.
     
    Vá na pasta data/globalevents/scripts e crie um novo arquivo chamado summonseguir.lua e cole o seguinte conteúdo nele:
    function onThink(cid, interval) for _, pid in ipairs(getPlayersOnline()) do local distmax = 3 local efeito = CONST_ME_TELEPORT if #getCreatureSummons(pid) > 0 then local tmp = #getCreatureSummons(pid) if getTilePzInfo(getCreaturePosition(pid)) then return true else while tmp > 0 do if getDistanceBetween(getCreaturePosition(pid), getCreaturePosition(getCreatureSummons(pid)[tmp])) > distmax then doTeleportThing(getCreatureSummons(pid)[tmp], getCreaturePosition(pid), false) doSendMagicEffect(getCreaturePosition(getCreatureSummons(pid)[tmp]), efeito) end tmp = tmp - 1 end end end end return true end  
    Logo no início do script você vê algumas variáveis locais. O valor da variável distmax representa, logicamente, a distância máxima que pode existir entre o summon e o jogador para que o summon seja teleportado. No caso eu coloquei 3, mas no script que você pegou tinha 7, então acho que é a melhor escolha usar igual aos de Pokémon. Por outro lado, a variável efeito foi criada mesmo só pra você conseguir alterar facilmente o efeito que aparecerá no summon quando ele for teleportado. Enfim, é basicamente isso de configuração. Continuemos.
     
    Após ter criado o arquivo do script, vá no seu globalevents.xml e adicione a seguinte tag:
    <globalevent name="Summon Seguir" interval="????" event="script" value="summonseguir.lua"/>  
    Perceba que no parâmetro interval eu coloquei interrogações. No lugar dessas interrogações, você deve colocar o tempo em milissegundos que leva para ocorrer a checagem de posição. Em outras palavras, é o delay pra que o summon seja teleportado. Quanto mais tempo, mais demorará a checagem, e maior é a probabilidade de o summon ficar muito distante. Eu realmente não faço ideia de quanto tempo eles usam nos OTs pokémon, mas acredito que seja uns 1000ms. Como eu te disse por MP, o problema da função onThink é que ela deixa o servidor muito pesado, então é bom não abusar. Contudo, pelos scripts que você postou, os próprios servidores de Pokémon usam desse jeito, então acho que não há problema.
     
    O script que você passou dos servidores de pokémon teleportava apenas o primeiro summon do jogador. No caso de Poketibias, isso não atrapalha, pois cada jogador pode summonar no máximo uma criatura. Contudo, como seu servidor não é um Poketibia, fiz o script pensando em teleportar todos os summons que o jogador invocou, independentemente de qual a quantidade máxima de summons que seu servidor permite (aquela que você configura no config.lua). Porém, fique avisado que quanto maior for o número máximo de summons, mais pesado ficará o script, pois maior será a checagem. De um pra dois summons máximos parece coisa pouca, mas entenda que não é simplesmente "um" summon a mais, e sim um summon a mais por jogador. Dependendo de quantos jogadores online seu servidor tenha, isso é bastante coisa. Por isso, recomendo que deixe no máximo 2 summons por vez.
     
    Enfim, é isso cara. Consegui arranjar um tempo pra fazer essa primeira parte, vou tentar não demorar muito pra concluir a segunda, mas como já te disse por MP meu tempo é apertado. Qualquer novidade posto nesse tópico e te aviso por MP.
     
    Abraço.
     
    @EDIT: Para quem tiver a mesma necessidade do dono do tópico, desenvolvi uma base para a magia Summon Creature na forma de MOD. Essa magia no TFS 0.4 é uma função pré-definida, impedindo que se faça algum tipo de alteração nela via script. Porém, como o que o autor do tópico queria era justamente uma personalização da Summon Creature, fez-se necessário reescrever a magia por completo na forma de script, e deixarei aqui para quem tiver interesse. Para utilizar, basta desativar a Summon Creature original no arquivo spells.xml e adicionar a seguinte mod ao seu servidor:
     
    <?xml version="1.0" encoding="UTF-8"?> <mod name="Summon Monster Personalizado" version="1.0" author="Tiago Melo Juca" contact="TibiaKing" enabled="yes"> <talkaction words="utevo res" filter="word-spaced" event="script"><![CDATA[ -- General Configuration local lvlmin = 25 local exhaustion = 2000 local needlearn = 0 local learnstorage = 77890 local vocations = {1, 2, 5, 6} local maxsummons = getConfigValue("maxPlayerSummons") summonlist = { [1] = {'rat', 50}, [2] = {'wolf', 100}, [3] = {'demon skeleton', 300} } -- Player Info local lvl = getPlayerLevel(cid) local vocp = getPlayerVocation(cid) local mana = getCreatureMana(cid) local pos = getCreaturePosition(cid) -- Statements local learned = 0 local voccan = 0 local cansummon = 0 local manacost = 0 local exhaustorage = 77889 -- Loop Control local vocs = #vocations local slistn = #summonlist -- Conversions param = string.lower(param) param = string.gsub(param, '\"', '') exhaustion = exhaustion/1000 -- Initial Verification if needlearn == 0 then learned = 1 end if needlearn == 1 and getPlayerStorageValue(cid, learnstorage) > 0 then learned = 1 end while vocs > 0 do if vocp == vocations[vocs] then voccan = 1 end vocs = vocs - 1 end while slistn > 0 do if param == summonlist[slistn][1] then cansummon = 1 manacost = summonlist[slistn][2] end slistn = slistn - 1 end -- Summon Monster if getTilePzInfo(pos) then doPlayerSendCancel(cid, 'This action is not permitted in a protection zone.') else if lvl < lvlmin then doSendMagicEffect(pos, CONST_ME_POFF) doPlayerSendCancel(cid, 'You do not have enough level.') else if learned == 1 then if voccan == 1 then if getPlayerStorageValue(cid, exhaustorage) >= os.time() then doSendMagicEffect(pos, CONST_ME_POFF) doPlayerSendCancel(cid, 'You are exhausted.') else if cansummon == 1 then if mana >= manacost then if #getCreatureSummons(cid) < maxsummons then doSendMagicEffect(pos, CONST_ME_MAGIC_BLUE) doCreatureAddMana(cid, 0-manacost, false) local summon = doCreateMonster(param, pos) doConvinceCreature(cid, summon) doSendMagicEffect(getCreaturePosition(summon), CONST_ME_TELEPORT) setPlayerStorageValue(cid, exhaustorage, os.time()+exhaustion) else doSendMagicEffect(pos, CONST_ME_POFF) doPlayerSendCancel(cid, 'You cannot summon more creatures.') end else doSendMagicEffect(pos, CONST_ME_POFF) doPlayerSendCancel(cid, 'You do not have enough mana.') end else doSendMagicEffect(pos, CONST_ME_POFF) doPlayerSendCancel(cid, 'Sorry, not possible.') end end else doSendMagicEffect(pos, CONST_ME_POFF) doPlayerSendCancel(cid, 'Your vocation cannot use this spell.') end else doSendMagicEffect(pos, CONST_ME_POFF) doPlayerSendCancel(cid, 'You need to learn this spell first.') end end end return ]]></talkaction> </mod> A MOD acima nada mais é do que a magia Summon Creature do próprio Tibia reescrita na forma de script, a fim de poder fazer personalizações nela (no caso do autor do tópico, deixar os summons mais fortes de acordo com Level e Magic Level). Através dessa base, é possível fazer variações mais elaboradas da magia Summon Creature.
     
    Lembrando que, por motivos de limitação do próprio TFS, monstros summonados por essa MOD devem, obrigatoriamente, apresentar a flag convinceable ligada em seu arquivo XML. Contudo, não é necessário que a flag summonable seja ligada; na realidade, pouco importa se ela está ligada ou desligada, pois a MOD trabalha com a flag convinceable e não summonable (uma vez que o TFS trabalha com doCreateMonster + doConvinceCreature). Outra ressalva é que todos os monstros que podem ser summonados devem ser adicionados naquela listinha no início do script, mas isso por incompetência minha mesmo, não arranjei uma forma mais fácil de fazer isso. Qualquer monstro que não esteja naquela listinha (nome e custo de mana para invocá-lo), não poderá ser summonado (será a mesma coisa de tentar summonar um Demon no tibia global, por ex, ele vai dizer que não é possível).
     
    Bem, é isso. Espero que essa base para a magia ajude quem precisar de uma Summon Creature customizada! Por motivos éticos, não disponibilizarei a versão final adaptada para a necessidade do rheyn, já que é do projeto dele. Porém com a MOD que eu passei vocês facilmente incrementam a magia sozinhos.
     
    Abraço.
  8. Gostei
    Doria Louro deu reputação a Underewar em Emperator 8.6 Beta   
    Boa! Gostei das spells muito criativo!
  9. Gostei
    Doria Louro recebeu reputação de Underewar em Emperator 8.6 Beta   
    Bem-vindos a Emperator 
    Preparados para embarcar em uma jornada épica repleta de aventura, mistério e desafio? Se sim, você está no lugar certo! Emperator é um mundo totalmente novo e emersivo, pronto para receber jogadores corajosos como você para explorar suas terras vastas e perigosas.
     
    Neste primeiro momento estaremos testando e verificando se estamos no caminho certo, onde será testados todos os recursos dentro do jogo, Emperator foi pensado para ser prático e imersivo trazendo uma experiência única nunca vista antes, veja abaixo alguns de novos sistemas:
     
    Chefes com mecânicas 

     
    AutoCast

     
    AutoLoot

     
    Balanceamento de Hunts

     
    Alteração de Elemento das Armas

     
    Dentre outras mecânicas, confira em nossa página: https://emperator.com.br/info.php
    Cliente: 8.60 próprio com áudio
    Site: https://emperator.com.br
    Discord: https://discord.gg/4HfJExN6
  10. Gostei
    Doria Louro deu reputação a L3K0T em Função DoSetCreatureLight C++ TFS 0.4   
    L3K0Ttfs 0.4
     
    Bom galera hoje vim trazer para aqueles que não tem em seu tfs a função DoSetCreatureLight, é uma função de LUZ, alguns tfs tem e outros não tem então resolvi compartilhar.
     
    abra seu luascript.cpp e procure por:
     
    lua_register(m_luaState, "getCreatureHealth", LuaInterface::luaGetCreatureHealth); em baixo add
    //doSetCreatureLight(cid, lightLevel, lightColor, time) lua_register(m_luaState, "doSetCreatureLight", LuaInterface::luaDoSetCreatureLight); Procure;;
    int32_t LuaInterface::luaGetThingFromPos(lua_State* L) { //getThingFromPos(pos[, displayError = true]) //Note: // stackpos = 255- top thing (movable item or creature) // stackpos = 254- magic field // stackpos = 253- top creature bool displayError = true; if(lua_gettop(L) > 1) displayError = popNumber(L); PositionEx pos; popPosition(L, pos); ScriptEnviroment* env = getEnv(); Thing* thing = NULL; if(Tile* tile = g_game.getMap()->getTile(pos)) { if(pos.stackpos == 255) { if(!(thing = tile->getTopCreature())) { Item* item = tile->getTopDownItem(); if(item && item->isMovable()) thing = item; } } else if(pos.stackpos == 254) thing = tile->getFieldItem(); else if(pos.stackpos == 253) thing = tile->getTopCreature(); else thing = tile->__getThing(pos.stackpos); if(thing) pushThing(L, thing, env->addThing(thing)); else pushThing(L, NULL, 0); return 1; } if(displayError) errorEx(getError(LUA_ERROR_TILE_NOT_FOUND)); pushThing(L, NULL, 0); return 1; } em baixo add;;
     
    int32_t LuaInterface::luaDoSetCreatureLight(lua_State* L) { //doSetCreatureLight(cid, lightLevel, lightColor, time) uint32_t time = popNumber(L); uint8_t color = (uint8_t)popNumber(L); uint8_t level = (uint8_t)popNumber(L); uint32_t cid = popNumber(L); ScriptEnviroment* env = getEnv(); Creature* creature = env->getCreatureByUID(cid); if(creature) { Condition* condition = Condition::createCondition(CONDITIONID_COMBAT, CONDITION_LIGHT, time, level | (color << 8)); creature->addCondition(condition); lua_pushboolean(L, true); } else { errorEx(getError(LUA_ERROR_PLAYER_NOT_FOUND)); lua_pushboolean(L, false); } return 1; }  
    Agora em Luascript.h procure por:;;
    static int32_t luaCanPlayerWearOutfit(lua_State* L); em baixo add;;
    static int32_t luaDoSetCreatureLight(lua_State *L);  
    salva tudo em compila no modo rebuild.
     
     
    Usando em Summons;;
    doSetCreatureLight(getCreatureSummons(cid)[1], 10, 215, 60*1000) Usando em players;;
    doSetCreatureLight(cid, 9, 65, 10*60*1000) usando em Equipe;;
    function onEquip(cid, item, slot) doSetCreatureLight(cid, 9, 65, 10*60*1000) end function onDeEquip(cid, item, slot) doSetCreatureLight(cid, 7, 215, 1*1000) end Espero que gostem  
  11. Gostei
    * Á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:
     
     
     
  12. Gostei
    Doria Louro deu reputação a SlowK em [8.6] Tibia Dark Skin   
    DARK SKIN 8.6
     
    Fala galera, beleza?! Tô postando pois não vi nada parecido por aqui, é uma darkskin do Tibia 8.6 que eu uso, pois acho aquela cor cinza do original meio chato!
    Tem dois tipos, uma de um client de um ot antigo que joguei, e outra que achei em um fórum gringo...
     
    1 - Nesse foi mudado alguns ícones:
     
    Download
    Scan
     
    2 - Esse é o original mesmo, só que com a cor preta:
     
    Download
    Scan
    
    (Para usar basta substituir o arquivo pelo tibia.pic na pasta do client 8.6).
     
    • Créditos •
    Kazied
    VipOT
  13. Gostei
    tem como distribuir pra gente nao ? xD
  14. Gostei
    pra isso seria necessário criar os atributos na source com um map de atributos a serem adicionados, caso vc add na source os atributos do item, eles automaticamente contam com o Equip e DeEquip, eu fiz esse sistemas pro baiak-hells, um pouco diferente pois dava dano e def
  15. Curtir
    Doria Louro recebeu reputação de Lion em [Spell] Como fazer monstro perde o target durante o cast   
    Bom hoje acordei e efetuei as alterações na spell, o jeito foi efetuar um loop com frequência de 15 milissegundos executando a function de virar o bendito para o sul, dessa forma funcionou perfeitamente, sendo essa spell com castTime de 6 segundos, esse evento ocorrerá 400x kkkk, mas por hora essa solução está muito boa.
    function onCastSpell(cid, var) local confLookDir = { frequency = 15, i = 1, timeTotal = 0 } while confLookDir.timeTotal <= conf.stunTime do addEvent(function() if isCreature(cid) then doCreatureSetLookDir(cid, SOUTH) end end, (confLookDir.frequency * confLookDir.i)) confLookDir.i = confLookDir.i + 1 confLookDir.timeTotal = confLookDir.frequency * confLookDir.i end setInitCast(cid) . . . return doCombat(cid, combat, var) end Agradeço a você Vodkart pela prestatividade e me mostrar o caminho, te desejo sucesso meu amigo.
    Vlw.
  16. Curtir
    Doria Louro deu reputação a Lion em [Spell] Como fazer monstro perde o target durante o cast   
    Este tópico foi movido para a seção de Suporte Otserv.
  17. Obrigado
    Doria Louro recebeu reputação de Vodkart em [Spell] Como fazer monstro perde o target durante o cast   
    Bom hoje acordei e efetuei as alterações na spell, o jeito foi efetuar um loop com frequência de 15 milissegundos executando a function de virar o bendito para o sul, dessa forma funcionou perfeitamente, sendo essa spell com castTime de 6 segundos, esse evento ocorrerá 400x kkkk, mas por hora essa solução está muito boa.
    function onCastSpell(cid, var) local confLookDir = { frequency = 15, i = 1, timeTotal = 0 } while confLookDir.timeTotal <= conf.stunTime do addEvent(function() if isCreature(cid) then doCreatureSetLookDir(cid, SOUTH) end end, (confLookDir.frequency * confLookDir.i)) confLookDir.i = confLookDir.i + 1 confLookDir.timeTotal = confLookDir.frequency * confLookDir.i end setInitCast(cid) . . . return doCombat(cid, combat, var) end Agradeço a você Vodkart pela prestatividade e me mostrar o caminho, te desejo sucesso meu amigo.
    Vlw.
  18. Curtir
    Doria Louro deu reputação a Vodkart em [Spell] Como fazer monstro perde o target durante o cast   
    tenta usar addEvent, +ou- assim:
     
    local conf = { stunTime = 4500, delayCast = 600, scream = "EXPLOSION FIRE", speakChance = 5, speakList = {"Did you get burned?", "I like well-done meat"} } local s = 0 -- Combat local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_LIFEDRAIN) -- Stun local stun = createConditionObject(CONDITION_PARALYZE) setConditionParam(stun, CONDITION_PARAM_TICKS, conf.stunTime) setConditionFormula(stun, -1, 0, -1, 0) local function setInitCast(cid) if isCreature(cid) then doAddCondition(cid, stun) doCreatureSetLookDir(cid, SOUTH) doCreatureSay(cid, conf.scream, TALKTYPE_MONSTER_YELL) end end function onCastSpell(cid, var) setInitCast(cid) addEvent(function() if not isCreature(cid) then return true elseif s > conf.stunTime then return true end doCreatureSetLookDir(cid, SOUTH) s = s + 250 end, 250) return doCombat(cid, combat, var) end  
  19. Gostei
    Doria Louro deu reputação a Ryzor em Entendendo o Stackpos!   
    Faaaaala galerinha! A pedido de alguns usúarios estou aqui para postar este tutorial.

    Espero que seja útil para todos que tem alguma dúvida quanto ao Stackpos.

    Eu sinceramente não domino completamente a magia dos stackpos, mas espero poder tirar algumas dúvidas de quem sabe e ensinar quem ainda não sabe. Vamos logo ao tutorial:

    Stackpos


    • Introdução

    Stackpos é um dos index da tabela que guarda posições. Toda posição é uma tabela, exemplo: {x=160, y=50, z=7}, mas o que pouca gente sabe, é que o stackpos também faz parte desta tabela. Todos sabem que em uma unica posição podem haver vários itens, formando uma pilha de itens, portanto, para diferenciar a posição de um item da pilha para o outro foi criado o stackpos, que é o número que diz em qual lugar da pilha está o item.


    • Descobrindo o Stackpos

    O stackpos segue um padrão, ou seja, uma ordem. Vou mostrar primeiramente os stackpos especiais:



    0 - O stackpos 0 de uma posição é sempre o tile, ou seja, o chão. 253 - Este número refere-se ao stackpos das criaturas que estão na posição, sejam monstros, players ou npcs. 255 - O item mais alto de um pilha tem o stackpos 255, além do stackpos normal dela. Agora vou mostrar como descobrir o stackpos de um item apenas olhando para a pilha. Considere a seguinte pilha: Tile sempre terá o stackpos 0. Agora os outros recebem o stackpos contrário da ordem deles acima do chão. Coin receberá o stackpos 1 e 255. Chair receberá o stackpos 2. Table receberá o stackpos 3. Simples não? É sempre ao contrário da ordem deles acima do chão. Vamos a mais um exemplo para ficar bem claro, considere a seguinte pilha:







    Para pegar o stackpos pelo uid do item, usamos a função getThingPos(uid), a qual já retorna uma tabela com o stackpos do item.


    É isso galera, qualquer dúvida só perguntar. Até mais.










    Creditos :




    Shoeei

    Primeiro vamos contar quantos itens tem a pilha. Neste caso, em um total de 4 itens (tile, table, chair, coin). Tile receberá o stackpos 0. Ring receberá o stackpos 1 e 255. Hammer receberá o stackpos 2. Coin receberá o stackpos 3. Chair receberá o stackpos 4. Table receberá o stackpos 5. • Montando uma Tabela com Stackpos Eu havia tido anteriormente que toda posição é uma tabela. Para montarmos uma posição com o index stackpos, simplesmente adicionamos ele no final, exemplo: {x=160, y=50, z=7, stackpos=253} Simples, não é mesmo? • Funções Auxiliares Sempre que preciso descobrir o stackpos através de um script, uso as seguintes funções: Pegar o stackpos pela posição e id do item. function getItemStackpos(position, id) if getTileItemById(position, id).itemid == 0 then return nil end for i = 0, 255 do local pos = getThingFromPos({x=position.x, y=position.y, z=position.z, stackpos=i}) if pos.itemid == id then return i end end end end
  20. Gostei
    Doria Louro deu reputação a r0bert0lol em (Resolvido)Npc Comprar 100 unidades   
    Esse bug chat eu descobri como corrigir, o problema é que alguns servidores para download aqui vem com o modules do shop todo bugado, fiquei um tempao para corrigir esse bug no meu servidor, encontrei um modules em um forum gringo hoje e testei e com ele funcionou tudo certinho...
     
    O bug não é por causa de atributos errados nos items, realmente o seu modules não le items stackable.
     
    Para corrigir esse bug, acesse  data/npc/lib/npcsystem/ e substitua seu arquivo modules.lua por este aqui.
    de nada :D

Informação Importante

Confirmação de Termo