Ir para conteúdo

Doria Louro

Membro
  • Registro em

  • Última visita

Tudo que Doria Louro postou

  1. .Qual servidor ou website você utiliza como base? TFS 0.3884 Boa tarde senhores Estou com uma duvida sobre uma solicitação do OtserverList onde o mesmo me pede uma implementação na source para obtenção de informações de jogadores online. Porém estou utilizado a versão TFS 0.3884 e o arquivo solicitado "protocolstatus.cpp" para a alteração não existe, alguém poderia me dar um norte de onde implementar esse code nessa versão do TFS? Atualização exigida: Minha Source: Desde já agradeço
  2. Doria Louro postou uma resposta no tópico em Anuncie seu OTServer
    Emperator 8.60 Mapa Custom Venha ser um dos primeiros a entrar no Reino, nesta sexta-feira 17/05/2024 as 19:00 horas Servidor com várias mecânicas próprias, acesso nosso site e conheça mais sobre o nosso servidor. Site: https://www.emperator.com.br/index.php
  3. Olá compatriotas. Estou passando por uma situação inusitada, possui um TFS 0.4 (8.60) e as vezes meu distro simplesmente não deixa ninguém mais autenticar Notei que esse comportamento ocorria quando eu manuseava o Distro, sendo para mover ele na tela do PC, ou para copiar alguma informação nele mesmo: Notem que no cabeçalho do Distro fica "Selecionar The Forgotten Server", quando fica dessa forma o servidor para Ao dar um ESC o servidor retorna normal, essa situação é frustante pois dependendo da situação ele não retorna mesmo apertando ESC. Minha pergunta seria: Há alguma forma de bloquear o Distro para que eu não possa selecionar ele igual na imagem? Utilizo o Windows 10
  4. A Solução que encontrei foi essa: Em movements/scripts/ crie um arquivo com o nome de fullset.lua -- Ao Equipar um equipamento function onEquip(cid, item, slot, boolean) if not boolean then --Aqui será chamado o seu script personalizado, no meu caso ele verifica todos os itens --equipados no personagem e verifica se são do msm set, caso seja adiciona o buff ao jogador, --caso a contagem de itens do set seja melhor que o minimo para o buff do set ele remove o buff --caso esteja ativo no personagem --(OBS)Dessa forma os itens mantem seu atributos originais e é chamado o script personalizado também end if item.uid > 0 then return callFunction(cid, item.uid, slot, boolean) end return true end -- Ao desequipar um equipamento function onDeEquip(cid, item, slot, boolean) if boolean then --Aqui será chamado o seu script personalizado, no meu caso ele verifica todos os itens --equipados no personagem e verifica se são do msm set, caso seja adiciona o buff ao jogador, --caso a contagem de itens do set seja melhor que o minimo para o buff do set ele remove o buff --caso esteja ativo no personagem --(OBS)Dessa forma os itens mantem seu atributos originais e é chamado o script personalizado também end if item.uid > 0 then return callFunction(cid, item.uid, slot, boolean) end return true end Em movements/movements.xml será preciso renomear todos os movimentos envolvendo os equipamentos, ex: <!-- Ao equipar essa armadura é atribui ao personagem os atributos padrões do item (+10% proteção ice) e executado seu script personalizado --> <movevent type="Equip" level="100" itemid="8884" slot="armor" event="script" value="custom/fullSet.lua"> <vocation id="4" /> <vocation id="8" /> </movevent> <!-- Mesma coisa aqui, porém remove os atributos do item (-10% proteção ice) e executa novamente seu script personalizado --> <movevent type="DeEquip" itemid="8884" slot="armor" event="script" value="custom/fullSet.lua" /> Eu alterei todo meu movements.xml para poder estar constantemente verificando se o jogador está com a quantidade minima de equipamentos equipados para poder assim adicionar o bonus de fullSet. Lembrando que apenas descrevi a solução do problema que postei anteriormente, o script de fullSet foi desenvolvido por mim e no futuro estarei disponibilizando para a comunidade. Att Manoel Louro
  5. Notei que ao maximizar o console os jogadores voltam a logar, e se o console já estiver maximizado ele minimizo e maximizo novamente e o problema se resolve, como programador e tanto tempo essa situação me frusta pois o que maximizar o console tem haver, alguém já passou por essa situação?
  6. Bom dia senhores. (Moderadores não sei se postei no local correto) Gostaria que alguém me ajudasse a entender porque meu TFS 0.4 de repente não deixa jogadores logarem, no distro não é apresentando nenhum erro, continua rodando normalmente, ao efetuar o login na conta a lista de personagem é exibida normalmente porém ao tentar entrar com o personagem no jogo o cliente fica nesta tela para sempre: Sei que há versões do TFS 1.X mais estáveis, porém tenho muitos scripts próprio e seria uma carga enorme refatorar todos para a versão do TFS 1.X Quem puder me ajudar estarei enviando um PIX em forma de gratidão, já que esse problema veem me assombrando a algumas semanas. Att Doria
  7. Olá senhores. Gostaria de uma ajuda com um script de summon que venho trabalhando no momento, gostaria que o summon andasse do lado do jogador, entretanto o mesmo sempre fica para trás ou a frente do jogador. Efetuei a alteração na source creature.cpp: void Creature::getPathSearchParams(const Creature* creature, FindPathParams& fpp) const { fpp.fullPathSearch = !hasFollowPath; fpp.clearSight = true; if(creature->isPlayerSummon()) { if(creature->getName() == "Summon Name") fpp.clearSight = false; } fpp.maxSearchDist = 12; fpp.minTargetDist = fpp.maxTargetDist = 1; } fpp.maxTargetDist = 1; Porém ele sempre mantem 1 de distancia do jogador, alterando para zero o "Zero" summon nem segue o jogador. Resultado: Agradeço desde já.
  8. Doria Louro postou uma resposta no tópico em Anuncie seu OTServer
    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
  9. 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 😄
  10. Olá nobre senhores, tudo bem com vocês? Servidor: TFS 0.3.6 Cliente: 8.60 Estou com a seguinte ideia, criar conjuntos de equipamentos em meu servidor, que aumente os atributos do player ao utilizar o conjunto/set completo, exemplo: Um exemplo dos itens contidos no meu itens.xml: <item id="2487" article="a" name="warrior armor"> <attribute key="weight" value="9000" /> <attribute key="armor" value="13" /> <attribute key="skillSword" value="1" /> <attribute key="skillAxe" value="1" /> <attribute key="skillClub" value="1" /> <attribute key="slotType" value="body" /> <attribute key="healthGain" value="2" /> <attribute key="healthTicks" value="3000" /> <attribute key="description" value="+2 HP every 3s, Sale value: $5000" /> </item> Em meu movements.xml: <movevent type="Equip" itemid="2487" level="30" slot="armor" event="function" value="onEquipItem"> <vocation id="8" /> </movevent> <movevent type="DeEquip" itemid="2487" slot="armor" event="function" value="onDeEquipItem" /> Entretanto eu fico limitado aos eventos de Equip default, se eu altero para meu script full_set.lua: <movevent type="Equip" itemid="2487" level="30" slot="armor" event="script" value="full_set.lua"> <vocation id="8" /> </movevent> Executando meu script eu perco os atributos contidos no itens.xml, tais como o aumento de skill, ganho de HP por segundo e também qualquer vocação pode utilizar o equipamento. Simplificando, é possível utilizar os recursos padrões de Equip do movements e adicionar um/mais scripts personalizáveis sem perder as funcionalidades da function onEquipItem? Meu objetivo é quanto mais partes do set o jogador possuir, mais bônus ele obterá, um exemplo: Warrior Set [2 peças] - Aumenta em 100 HP total [4 peças] - Aumenta em 2 shielding Eu tenho uma ideia de colocar essa verificação no creaturescripts, entretanto não gostaria de tomar esse rumo pois acredito que poderia sobrecarregar meu servidor com as verificações por thing. Efetuei consultas pela internet e geralmente o pessoa que tem essa duvida utiliza itens que não tem status, tipo um ring, no meu caso é diferente. Possível solução: Seria utilizar o código Equip padrão no meu script e depois aplicar meu código, entretanto eu não encontrei em nenhum local esse script de Equip, Quem puder me ajudar eu ficaria eternamente grato já que esse é um sistema chave no meu projeto, agradeço desde já
  11. 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.
  12. Boa noite Vodkart, obrigado por se dispor a me ajudar, entretanto acredito que a forma como você sugeriu seria fazer um loop que fica virando o cid de tempo em tempo atravez do comando addEvent e vira ele para o SOUTH, essa é minha spell atualmente: local conf = { stunTime = 6000, minDamage = 80, maxDamage = 120, textColorDanage = TEXTCOLOR_ORANGE, magicEffectPreparation = CONST_ME_POFF, magicEffectCid = CONST_ME_FIREATTACK, magicEffectArea = CONST_ME_FIREAREA, magicEffectTarget = CONST_ME_HITBYFIRE, delayCast = 800, scream = "EXPLOSION" } local s = 0 -- Combat local combat = createCombatObject() setCombatParam(combat, COMBAT_PARAM_TYPE, COMBAT_FIREDAMAGE) -- 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) doSendMagicEffect(getThingPos(cid), conf.magicEffectCid) doCreatureSetLookDir(cid, SOUTH) doCreatureSay(cid, conf.scream, TALKTYPE_MONSTER_YELL) end end local function setDamageCreature(cid, target) if not isCreature(cid) then return false end local targetID = target.uid if targetID == 0 or not isCreature(targetID) then return false end local danage = math.random(conf.minDamage, conf.maxDamage) if getCreatureHealth(targetID) < danage then danage = getCreatureHealth(targetID) end doCreatureAddHealth(targetID, -(danage)) doSendAnimatedText(getThingPos(targetID), danage, conf.textColorDanage) doSendMagicEffect(getThingPos(targetID), conf.magicEffectTarget) doCreatureAddHealth(cid, danage) return true end local function setCastSpell(cid, danage, radius, center, length) if isCreature(cid) then local pos, posY = getThingPos(cid), 0 posY = pos.y - center pos.x, posY, pos.y = pos.x - center, pos.y - center, pos.y - center for x = 1, radius do pos.x, pos.y = (pos.x + 1), posY for y = 1, radius do pos.y = (pos.y + 1) if x == center and y == center then elseif length ~= nill and length >= 1 then if x == 1 or x == radius or y == 1 or y == radius then if danage then if not setDamageCreature(cid, getThingfromPos(pos)) then doSendMagicEffect(pos, conf.magicEffectArea) end else doSendMagicEffect(pos, conf.magicEffectPreparation) end elseif length > 1 then if x <= length or x > radius - length or y <= length or y > radius - length then if danage then if not setDamageCreature(cid, getThingfromPos(pos)) then doSendMagicEffect(pos, conf.magicEffectArea) end else doSendMagicEffect(pos, conf.magicEffectPreparation) end end end else if danage then if not setDamageCreature(cid, getThingfromPos(pos)) then doSendMagicEffect(pos, conf.magicEffectArea) end else doSendMagicEffect(pos, conf.magicEffectPreparation) end end end end end return true 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) addEvent(setCastSpell, conf.delayCast * 3, cid, false, 3, 2) addEvent(setCastSpell, conf.delayCast * 4, cid, true, 3, 2) addEvent(setCastSpell, conf.delayCast * 5, cid, false, 5, 3, 1) addEvent(setCastSpell, conf.delayCast * 6, cid, true, 5, 3, 1) addEvent(setCastSpell, conf.delayCast * 6, cid, false, 7, 4, 1) addEvent(setCastSpell, conf.delayCast * 7, cid, true, 7, 4, 1) return doCombat(cid, combat, var) end Estou utilizando a versão 8.60 no meu projetinho e esse está sendo o meu primeiro mês com LUA e com o TFS, mas voltando, durante o teste o cid vira para o sul e volta a face novamente para o player, amanha estarei efetuando um loop e corrigindo, entretanto vou adicionar muitos eventos durante uma unica spell apenas para virar a criatura para o sul, não sobrecarregaria o servidor? entretanto achei bem engenhoso sua solução, parabéns e obrigado pela atenção 😄
  13. Durante minhas codificações decidi criar spells para mini bosses em meu servidor, onde o mesmo pararia de se movimentar e virasse a face para o sul onde ele executaria uma determinada magia, minha solução foi essa: local conf = { stunTime = 4500, delayCast = 600, scream = "EXPLOSION FIRE", speakChance = 5, speakList = {"Did you get burned?", "I like well-done meat"} } -- 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) . . . return doCombat(cid, combat, var) end Entretanto logo apos ele voltar a face para o sul ele já retorna imediatamente o target no player, ou seja vira a face para onde o jogador está, enquanto ele continua castando a spell. Gostaria que ele continuasse olhando para o sul até finalizar o cast da spell.
  14. Obrigado Ryzor estava com um problema em spells onde em determinado lugar o dano da spell não ocorria no player, sua explicação detalhada e cirúrgica me tirou uma dor de cabeça e consegui corrigir os problemas do meu projeto, parabéns 😄
  15. Estava precisando dessa mesma função e tomei a liberdade de melhorá-la e poder adicionar novos monstros ao script e até mesmo executar novas funções ao derrotar um monstro, como abrir uma porta da sala, criar baus de recompensa, etc. Em data/creaturescripts/scripts crie um arquivo lua kill_boss.lua function onDeath(cid, corpse, deathList, target) -- Lista de monstros e storages local tab = { ["Monstro1"] = 35000, ["Monstro2"] = 35001, ["Monstro3"] = 35002 } local effectMagic = CONST_ME_FIREWORK_YELLOW -- Efeito magico que será executado no player local consoleTypeText = MESSAGE_STATUS_CONSOLE_BLUE -- Tipo de texto que sera ilustrado no chat local storage = tab[getCreatureName(cid)] -- Verifica se monstro está na e obtem seu respectivo storage local playerID = deathList[1] -- ID do player primeiro player da lista de player que matou a criatura if isPlayer(cid) then return true end if storage ~= nil and storage > 1 then if getPlayerStorageValue(playerID, storage) > 0 then return true end doSendMagicEffect(getThingPos(playerID), effectMagic) doPlayerSendTextMessage(playerID, consoleTypeText, "[PT] Parabens, voce derrotou " .. getCreatureName(cid)) setPlayerStorageValue(playerID, storage, 1) end return true end Em data/creaturescripts/creaturescripts.xml edite esse arquivo XML adicionando a seguinte tag: <event type="death" name="killBoss" script="kill_boss.lua"/> Em data/creaturescripts/scripts/login.lua registerCreatureEvent(cid, "killBoss") No arquivo XML do monstro desejado adicione a seguinte tag para apontar nosso script: <script> <event name="killBoss" /> </script> OBS: Notei que ao declarar return false ou haver qualquer erro no script kill_boss.lua o corpo do monstro sumia quando o mesmo era morto, isso causava vários problemas em outros scripts que estava utilizando em meu TFS como de autoLoot, apenas compartilhando os problemas que tive.
  16. Estava com o mesmo problema no meu TFS 8.60, estava achando que teria que fazer gambiarra no codigo, me ajudou demais cara 😄

Informação Importante

Confirmação de Termo