Jump to content
×
×
  • Create New...

PoRaI

Administrador
  • Posts

    121
  • Joined

  • Last visited

  • Days Won

    18

Everything posted by PoRaI

  1. Como tinha dito em outro tópico, estou aqui postando, até pq eu acabei que fiz pra usar em um servidor meu também, rs. De qualquer forma, esse é um código para reposicionar o nome quando uma criatura está com X outfit de forma fácil pelo arquivo OTML. É necessário editar as sources do otclient e compila-lo. No arquivo thingtype.cpp, adicione abaixo de: if(node2->tag() == "opacity") m_opacity = node2->value<float>(); isso: else if(node2->tag() == "name-displacement") m_name_displacement = node2->value<Point>(); No arquivo thingtype.h, adicione acima de: float getOpacity() { return m_opacity; } adicione isso: Point getNameDisplacement() { return m_name_displacement; } acima de: float m_opacity; adicione isso: Point m_name_displacement; No arquivo creatures.cpp, troque isso: // calculate main rects Rect backgroundRect = Rect(point.x-(13.5), point.y, 27, 4); backgroundRect.bind(parentRect); Size nameSize = m_nameCache.getTextSize(); Rect textRect = Rect(point.x - nameSize.width() / 2.0, point.y-12, nameSize); textRect.bind(parentRect); por isso: // calculate main rects const ThingTypePtr& thingType = getThingType(); Rect backgroundRect = Rect(point.x - (13.5) + thingType->getNameDisplacement().x, point.y + thingType->getNameDisplacement().y, 27, 4); backgroundRect.bind(parentRect); Size nameSize = m_nameCache.getTextSize(); Rect textRect = Rect(point.x - (nameSize.width() / 2.0) + thingType->getNameDisplacement().x, point.y - 12 + thingType->getNameDisplacement().y, nameSize); textRect.bind(parentRect); Pronto. Para configurar, basta editar o arquivo .otml do seu otclient, exemplo: creatures 10 name-displacement: 2 -12 11 name-displacement: 5 10 12 name-displacement: -4 3 No caso, alterei a outfit 10 para um displacement no eixo X + 2 e no eixo Y - 12, a outfit 11 para um displacement no eixo X + 5 e no eixo Y + 10 e a outfit 12 para um displacement no eixo X - 4 e no eixo Y + 3. O código foi testado e está funcionando perfeitamente.
  2. Vai testando ué, só testando que você vai descobrir se funciona ou não. Copia um NPC e testa. Teu pc não vai explodir tentando.
  3. E qual o problema? Copia um script pronto ou substitui ele e testa. De qualquer forma, um exemplo: Crie um arquivo em actions/scripts/test.lua com isso: function onUse(cid, item, fromPosition, itemEx, toPosition) print("Hello World") end Em actions/actions.xml adicione a linha em algum lugar: <action itemid="2402" event="script" value="test.lua" /> 2402 é o Item, quando você der use nele, vai executar o código. Recomendo por um item que não seja multiuse (que não seja item de Use With). Se deu tudo certo, quando você der use no item, vai aparecer no terminal do seu servidor a mensagem "Hello World".
  4. Você pelo visto nem abriu né? Você não precisa ler. Principalmente nesse manual, eu nunca o li. Ninguém aprende a programar lendo um livro (no máximo em linguagens de baixo nível), as pessoas aprendem com prática/experiência. É só você ir procurando oq você precisa. Você precisa no minimo entender: "COMO PROGRAMAR" o resto são apenas funções que você testa ou vai no manual que ele explica melhor oq cada uma faz, afinal, É UM MANUAL DE COMO PROGRAMAR EM LUA, não um livro de historinha. Os "LONGOS" textos desse manual são apenas explicações do que cada coisa faz na teoria, se você não entender na prática.
  5. Antes de tudo: Lua é Lua, ponto. A única coisa que pode mudar é a versão do Lua. Recomendo você estudar a linguagem. https://www.lua.org/manual/5.2/pt/ Esse é o maior tutorial disponível na internet, rs. Se você quiser aprender a programar, é só ler isso e depois usar Lua com as funções do Tibia. Todas as funções que você pode usar estão no arquivo luascript.cpp da sua source. No caso do sistema de NPC, se você quiser entender ele a fundo, você precisa ler o código dele que foi parcialmente escrito em Lua na pasta data/npcs/lib.
  6. std::regex pattern("Shiny (.*)"); std::cmatch result; if(std::regex_match(getName().c_str(), result, pattern)) { std::cout << result[1] << std::endl; }
  7. Certeza que esse é o erro na linha 513? Tá falando que a string é nula.
  8. Como é algo simples, não muda nada. Na minha opinião, por na source só dificulta pra dar manutenção. A vantagem de programar em C++ puro é que no geral, em códigos complexos, o desempenho será melhor dependendo da maneira que você programa utilizando os ponteiros, variáveis, loops e afins. Códigos complexos que digo é tipo: se imagine criando um algoritmo A* em Lua puro para o servidor, você não vai conseguir a não ser que carregue todo o mapa e passe ele através de uma função Lua. -- Correção só pra que não entenda errado: não é que você não vai conseguir carregar o mapa usando Lua puro, mas em questão de desempenho, o C++ é muito mais rápido.
  9. Quando um GM etc fala no Help não fica colorido? Além disso, me passe o arquivo: XML/groups.xml
  10. 0.4: local pokemons = {"Zapdos", "Moltres", "Articuno","Entei","Lugia","Ho-oh"} function onKill(cid, target, lastHit) if isInArray(pokemons, getCreatureName(target)) then for _, pid in pairs(getPlayersOnline()) do doPlayerSendTextMessage(pid, MESSAGE_TYPES["blue"], "O jogador "..getCreatureName(cid).." derrotou o passáro lendario "..getCreatureName(target).."!") end end return true end 1.2: local pokemons = {"Zapdos", "Moltres", "Articuno","Entei","Lugia","Ho-oh"} function onKill(creature, target) if isInArray(pokemons, target:getName()) then for _, player in pairs(Game.getPlayers()) do player:sendTextMessage(MESSAGE_TYPES["blue"], "O jogador "..player:getName().." derrotou o passáro lendario "..target:getName().."!") end end return true end Caso dê algum erro de MESSAGE_TYPES (provavelmente na 1.2), adicione ao final do arquivo constant, na pasta data/lib do seu servidor, isso: local MESSAGE_TYPES = { ["advance"] = MESSAGE_EVENT_ADVANCE, ["event"] = MESSAGE_EVENT_DEFAULT, ["white"] = MESSAGE_EVENT_DEFAULT, ["orange"] = MESSAGE_STATUS_CONSOLE_ORANGE, ["info"] = MESSAGE_INFO_DESCR, ["green"] = MESSAGE_INFO_DESCR, ["small"] = MESSAGE_STATUS_SMALL, ["blue"] = MESSAGE_STATUS_CONSOLE_BLUE, ["red"] = MESSAGE_STATUS_CONSOLE_RED, ["warning"] = MESSAGE_STATUS_WARNING, ["status"] = MESSAGE_STATUS_DEFAULT } Qualquer alteração, basta trocar no script "blue" para qualquer outro valor dessa tabela.
  11. function onSay(cid, words, param) doCreatureSay(cid, "pisa aqui por favor.", 1) doSendMagicEffect(getThingPos(cid), 55) return true end
  12. atualizei ambos os scripts, testa aí e me fala.
  13. Ah sim, nem tinha analisado o código, só o gif, rs. Pensei que você tava arrastando ele pra testar, awoejawei. Enfim, a função internalMoveCreature é usada para mover criaturas (quase igual a função internalTeleport) sem usar o algoritmo de Path Finding. Em C++: int LuaScriptInterface::luaGamePlayerMovePokemon(lua_State* L) { // Game.playerMovePokemon(pokemon, toPosition) Creature* pokemon = getCreature(L, 1); const Position& position = getPosition(L, 2); if (pokemon->getMonster()) { std::forward_list<Direction> dirList; if(pokemon->getPathTo(position, dirList, 0, 0, true, true)) pokemon->startAutoWalk(dirList); } return 1; } Lua: (Esse código ta mais elaborado do que o C++) local pokemonsMoveTo = {} function Player:movePokemonByList(pokemon, dirList, index) if self and pokemon and #dirList >= index then local speed = pokemon:getSpeed() * 3 pokemon:move(dirList[index], 16) index = index + 1 pokemonsMoveTo[self:getId()] = addEvent(function() self:movePokemonByList(pokemon, dirList, index) end, speed) end end function Player:movePokemon(pos) local pokemon = self:getSummons() if #pokemon == 0 then return false end if pokemonsMoveTo[self:getId()] then stopEvent(pokemonsMoveTo[self:getId()]) pokemonsMoveTo[self:getId()] = nil end local dirList = pokemon[1]:getPathTo(pos, 0, 0, true, true) self:movePokemonByList(pokemon[1], dirList, 1) return true end
  14. Alguma configuração do config.lua ou na source para teleportar summons para perto quando tiver longe em X sqms.
  15. Funcionou ou não? aweuihaewu. Qualquer coisa, adiciona no discord que é mais fácil: Porai#4377 E ai eu posto o problema resolvido.
  16. Você precisa fazer uma action pra isso e não colocar o item dentro do bau. Uma Action pra quando clicar, adicionar o item no player e não no container.
  17. Blacklist pro erro sumir só recompilando a source pq ela não tá mais no ar.
  18. Oq exatamente quer fazer? Não é mais fácil spawnar por posição?
  19. Posta o arquivo login.lua do seu servidor.
  20. Coloca a versão quando for postar coisas do gênero. 1.0. local TELEPORTED_CREATURES = {} local TELEPORT_LOW_HEALTH = { {name = "Demon", to = {x=1,y=1,z=7}, percent=80}, {name = "Demon", to = {x=1,y=1,z=7}, percent=60}, {name = "Demon", to = {x=1,y=1,z=7}, percent=40}, } function onHealthChange(creature, attacker, primaryDamage, primaryType, secondaryDamage, secondaryType, origin) if creature:isMonster() then for n, m in pairs(TELEPORT_LOW_HEALTH) do if m.name == creature:getName() and creature:getHealth() <= (creature:getMaxHealth() / 100) * m.percent then local mid = creature:getId() if not TELEPORTED_CREATURES[mid] or Position(TELEPORTED_CREATURES[mid]) ~= Position(m.to) then TELEPORTED_CREATURES[mid] = m.to creature:teleportTo(m.to, false) break end end end end return primaryDamage, primaryType, -secondaryDamage, secondaryType end 0.3.6pl1. local TELEPORTED_CREATURES = {} local TELEPORT_LOW_HEALTH = { {name = "Demon", to = {x=1,y=1,z=7}, percent=80}, {name = "Demon", to = {x=1,y=1,z=7}, percent=60}, {name = "Demon", to = {x=1,y=1,z=7}, percent=40}, } function onStatsChange(cid, attacker, type, combat, value) if isMonster(cid) then for n, m in pairs(TELEPORT_LOW_HEALTH) do if m.name == getCreatureName(cid) and getCreatureHealth(cid) <= (getCreatureMaxHealth(cid) / 100) * m.percent then local pos = m.to.x..","..m.to.y..","..m.to.z if not TELEPORTED_CREATURES[cid] or TELEPORTED_CREATURES[cid] ~= pos then TELEPORTED_CREATURES[cid] = pos doTeleportThing(cid, m.to, false) break end end end end return true end São creaturescripts. Basta configurar o script no creaturescripts.xml e colocar no xml da criatura: <script> <event name="nome_do_evento_q_vc_configurou"/> </script>
  • Recently Browsing   0 members

    • No registered users viewing this page.