Histórico de Curtidas
-
MarceLoko recebeu reputação de 139 em Básico de SQL via LuaBoa noite!
Trago ao fórum um simples porém útil tutorial de manipulação dos valores da database.
O uso da database me garante melhor organização das minhas variáveis, em comparação a storages.
Por storages você está preso a valores numéricos. Via database, você pode atribuir nomes, utilizar strings, e organizar as variáveis em grupos.
Responderei dúvidas conforme for possível.
Para inserir uma linha nova em uma tabela
db.executeQuery("INSERT INTO `accounts` (`id` ,`name` ,`password`)VALUES ('5', 'marcelo', 'druida');") Neste exemplo, será adicionado na tabela accounts, uma nova conta marcelo/druida. (na verdade a senha é encriptada, mas serve como exemplo).
Para alterar valores na database
db.executeQuery("UPDATE players SET level = 1 WHERE id = 1 ;") Neste exemplo, o valor do level do player com ID 1 será alterado.
players representa a tabela que será mudada
level representa a coluna
WHERE id representa a restrição, para que seja modificado apenas o player 1
Você pode alterar várias colunas ao mesmo tempo e usar várias restrições:
db.executeQuery("UPDATE players SET level = 1, experience = 0, lookType = 128 WHERE vocation = 1, town_id = 2 ;") Neste exemplo, apenas o players Sorcerer que residem na town 2, terão o level, experience e outfit alterados.
Devo-lhes lembrar, que qualquer alteração nos players deve ser com o player offline.
Para isso, use: doRemoveCreature(cid) antes de alterar itens, mana, skills, etc. Sempre que o player sai os valores são atualizados, e a modificação será perdida!
Para deletar valores
db.executeQuery("DELETE FROM accounts WHERE id = 50 ;") Remove a conta id 50 da tabela.
Você pode usar mais que uma restrição:
WHERE premdays = 0, group_id = 1 Para pegar valores
Em uma única linha de valores
id = getPlayerGUIDByName(getPlayerName(cid)) local info = db.getResult("SELECT lastlogin, description FROM players WHERE id = " .. id .. " ;") local lastlogin = info:getDataInt("lastlogin") local description = info:getDataString("description") info:free() Explicação:
Em info é armazenada a consulta à database.
Para transformar a consulta em valores, você usa os métodos getDataInt e getDataString.
Após adquirir os valores, use o método free() para fechar a consulta.
Lembrando que você pode usar múltiplas restrições.
Múltiplas linhas
local player = db.getResult("SELECT * FROM `players` WHERE level = 50;") tabela = {} if player:getID() ~= -1 then while(true) do table.insert(tabela, {player:getDataInt("id"), player:getDataInt("cap"), player:getDataInt("balance")}) if not(player:next())then break end end player:free() else print("No database!") end return tabela Explicação:
Todos os players serão selecionados nesta consulta. O asterisco * representa que todas as colunas da tabela serão selecionados. Portanto, você pode pegar qualquer coluna que quiser.
O método getID() garante que a consulta foi bem sucedida. Caso contrário já retorna um erro.
O laço de repetição while(true) do garante que todas as linhas da consulta serão vistas.
Dentro do laço de repetição, será inserido na tabela = {} os valores da id, cap e balance.
if not(player:next())then break end garante que na ultima linha da consulta o laço de repetição chega ao fim.
Se por exemplo houver 3 players level 50, a tabela retornada terá o formato:
tabela = {{id1,cap1,balance1},{id2,cap2,balance2},{id3,cap3,balance3}}
------
Como complemento, deixo link para tópico do administrador Matheus
http://www.tibiaking.com/forum/topic/2023-phpmyadmin-comandos-uteis/
Bons estudos!
Abraços!
-
MarceLoko recebeu reputação de gtms em Monstros PassivosBoa noite!
Requerido
TFS 1.x
http://www.tibiaking.com/forum/topic/60768-monster-onselecttargetself-target/
Segue dois códigos de monstro passivo:
Monstro que ataca ao ser atacado:
function onSelectTarget(self, target) if target:getTarget() == self then return true end return false end
Monstro que só atacam jogadores fortes:
function onSelectTarget(self, target) if target:getLevel() >= 100 then return true end return false end Coloque um desses códigos em um arquivo lua em data/monster/scripts
Abra o xml do monstro e insira após manacost:
script="arquivo.lua"
Abraço!
-
MarceLoko recebeu reputação de gtms em [TFS 1.2] Monster onSelectTarget(self, target)Boa noite!
Este código torna possível incluir algum script quando o monstro escolhe um alvo.
Testado em TFS 1.2
monster.cpp
ache:
bool Monster::selectTarget(Creature* creature)
substitua:
bool Monster::selectTarget(Creature* creature) { if (!isTarget(creature)) { return false; } auto it = std::find(targetList.begin(), targetList.end(), creature); if (it == targetList.end()) { //Target not found in our target list. return false; } if (isHostile() || isSummon()) { if (executeOnSelectTarget(creature) == 1){ if (setAttackedCreature(creature) && !isSummon()) { g_dispatcher.addTask(createTask(std::bind(&Game::checkCreatureAttack, &g_game, getID()))); } } else return false; } return setFollowCreature(creature); } bool Monster::executeOnSelectTarget(Creature* creature){ // onSelectTarget(self, target) if (mType->targetEvent != -1) { LuaScriptInterface* scriptInterface = mType->scriptInterface; if (!scriptInterface->reserveScriptEnv()) { std::cout << "[Error - Monster::onSelectTarget] Call stack overflow" << std::endl; return true; } ScriptEnvironment* env = scriptInterface->getScriptEnv(); env->setScriptId(mType->targetEvent, scriptInterface); lua_State* L = scriptInterface->getLuaState(); scriptInterface->pushFunction(mType->targetEvent); LuaScriptInterface::pushUserdata<Monster>(L, this); LuaScriptInterface::setMetatable(L, -1, "Monster"); LuaScriptInterface::pushUserdata(L, creature); LuaScriptInterface::setCreatureMetatable(L, -1, creature); return (scriptInterface->callFunction(2)); } return true; } monster.hache:
bool selectTarget(Creature* creature);
inclua:
bool executeOnSelectTarget(Creature* creature);
monsters.cpp:
ache:
scriptInterface = nullptr; creatureAppearEvent = -1; creatureDisappearEvent = -1; creatureMoveEvent = -1; creatureSayEvent = -1; thinkEvent = -1; inclua:targetEvent = -1;
ache:
mType->thinkEvent = scriptInterface->getEvent("onThink");
inclua:
mType->targetEvent = scriptInterface->getEvent("onSelectTarget");
Em breve:
Player onSelectTarget
-
MarceLoko recebeu reputação de tirso em (Resolvido)Duplicate uniqueId HelpCara, entra no RME, Edit->Find->Find Unique.
Vai aparecer uma lista de todos os itens que utilizam uniqueID.
Como o nome já diz, é um valor ÚNICO, por isso o console apresenta erro.
Abraço.
-
MarceLoko recebeu reputação de Drazyn1291 em Monstros PassivosBoa noite!
Requerido
TFS 1.x
http://www.tibiaking.com/forum/topic/60768-monster-onselecttargetself-target/
Segue dois códigos de monstro passivo:
Monstro que ataca ao ser atacado:
function onSelectTarget(self, target) if target:getTarget() == self then return true end return false end
Monstro que só atacam jogadores fortes:
function onSelectTarget(self, target) if target:getLevel() >= 100 then return true end return false end Coloque um desses códigos em um arquivo lua em data/monster/scripts
Abra o xml do monstro e insira após manacost:
script="arquivo.lua"
Abraço!
-
MarceLoko deu reputação a lolupgeneral em Os PrimordiosTava fazendo uma limpeza no meu pc, meu antigo server 6.5 :D funcionando, lembranças quando tibia era um jogo de evolução (mesmo com aqueles gráficos de crianças de 10 anos), começava matando ratos, depois trolls, ai minotauros, orcs, cyclops, giants, demons, que a media de players era 30-50 os foda e mitos era 100 algo incrível, hoje lv 10 já vai hunt em demon , 1 semana já pega lv 100, as mecânicas mudaram melhorou o desempenho que não existia antigamente entre o servidor e cliente, mas teve muitas adições desnecessárias também e tornou-se uma facilidade jogar Tibia hoje, além do PTW, mas ai umas prints pra quem tem curiosidade e pra quem curtia essa época:
Thais a primeira cidade:
Update 6.2 adição de Ab'Dendriel, Kazordoon e Carlin (Não tenho Kazordoon no mapa :/)
Dungeons e Monstros:
Armas e Equipamentos:
-
MarceLoko recebeu reputação de MaTTch em creature:moveTo(position)Boa noite!!
Esse método faz a criatura ir andando até a posição passada no parametro.
Testado em TFS 1.2
Reportem bugs.
Adicione em:
luascript.cpp:
registerMethod("Creature", "moveTo", LuaScriptInterface::luaCreatureMoveTo);
int32_t LuaScriptInterface::luaCreatureMoveTo(lua_State* L) { //creature:moveTo(pos) Creature* creature = getUserdata<Creature>(L, 1); if (!creature) { lua_pushnil(L); return 1; } const Position& position = getPosition(L, 2); FindPathParams fpp; fpp.minTargetDist = getNumber<int32_t>(L, 3, 0); fpp.maxTargetDist = getNumber<int32_t>(L, 4, 1); fpp.fullPathSearch = getBoolean(L, 5, fpp.fullPathSearch); fpp.clearSight = getBoolean(L, 6, fpp.clearSight); fpp.maxSearchDist = getNumber<int32_t>(L, 7, 150); std::forward_list<Direction> dirList; if (creature->getPathTo(position, dirList, fpp)) { creature->hasFollowPath = true; creature->startAutoWalk(dirList); pushBoolean(L, true); } else { pushBoolean(L, false); } return 1; }
luascript.h:
static int luaMoveCreatureTo(lua_State* L);
Substitua a função original em:
creature.cpp
bool Creature::setFollowCreature(Creature* creature) { if (creature) { if (followCreature == creature) { return true; } const Position& creaturePos = creature->getPosition(); FindPathParams fpp; fpp.minTargetDist = 0; fpp.maxTargetDist = 1; fpp.fullPathSearch = true; fpp.clearSight = true; fpp.maxSearchDist = 150; std::forward_list<Direction> dirList; if (creaturePos.z != getPosition().z || !canSee(creaturePos) || !getPathTo(creaturePos, dirList, fpp)) { followCreature = nullptr; return false; } if (!listWalkDir.empty()) { listWalkDir.clear(); onWalkAborted(); } hasFollowPath = false; forceUpdateFollowPath = false; followCreature = creature; isUpdatingPath = true; } else { isUpdatingPath = false; followCreature = nullptr; } onFollowCreature(creature); return true; }
monster.cpp
bool Monster::getNextStep(Direction& dir, uint32_t& flags) { if (getHealth() <= 0) { //we dont have anyone watching might aswell stop walking eventWalk = 0; return false; } bool result = false; if (hasFollowPath) return Creature::getNextStep(dir, flags); else if ((!followCreature || !hasFollowPath) && !isSummon()) { if ((followCreature || getTimeSinceLastMove() > 1000) && !hasFollowPath && !isIdle) { //choose a random direction result = getRandomStep(getPosition(), dir); } } else if (isSummon() || followCreature) { result = Creature::getNextStep(dir, flags); if (result) { flags |= FLAG_PATHFINDING; } else { //target dancing if (attackedCreature && attackedCreature == followCreature) { if (isFleeing()) { result = getDanceStep(getPosition(), dir, false, false); } else if (mType->staticAttackChance < static_cast<uint32_t>(uniform_random(1, 100))) { result = getDanceStep(getPosition(), dir); } } } } if (result && (canPushItems() || canPushCreatures())) { const Position& pos = Spells::getCasterPosition(this, dir); Tile* tile = g_game.map.getTile(pos); if (tile) { if (canPushItems()) { Monster::pushItems(tile); } if (canPushCreatures()) { Monster::pushCreatures(tile); } } } return result; }
Bom uso!
Abraço!
-
MarceLoko deu reputação a Zazeros em Cygnus ServerEae pessoal, tudo suave ?
Gente, estou fazendo um projeto solo de um servidor completo e queria a sincera opinião de voces.
MAPA:
-> O mapa é proprio, grande e não tem tp pra hunts, os players tem que procurar os lugares.
-> 90% das hunts possuem baus escondidos com dinheiros, potions, equips raras, food, entre outros....
-> Ja que o mapa é grande e original, quando divulgar o server, tambem divulgarei o mapa completo, mas não mostrando lugares secretos e que monstros tem por lá
MONSTERS:
-> Monstros editados, com sprites editadas, ou seja, tera que usar o client proprio do servidor, ou causara debug
-> Uma variedade gigantescas de monstros, com varios nomes, forças e drops diferentes.
-> Existe monstros incrivelmente fortes chamados de Boss, eles sempre irão possuir uma cavera preta no nome.
-> Todos esses bosses dropam itens raros, e provavelmente no lugar que ele esta tbm possui quest com mais itens raros
-> Existe monstros com respawn raro e aleatório, esses monstros droparão itens muito bons e itens de criaturas muito caras para vender para os npcs
ITEM:
-> Imagina muitos itens... agora, multiplica por 10... Voce chegou na metade de itens que o servidor possui, ou seja, uma variedade GIGAENORME de itens, tais como, itens de criaturas raras, equips, poções de todos os tipos, entre outros.
-> Estou trabalhando para que quase todas as armaduras, escudos, capacetes, legs, botas e alguns colares tenham um sistema de adição de vida, ou seja, um dwarven shield te da +15 de vida.
-> Itens mais raros e fortes, darão mais vida e mana tbm, por exemplo, um iten editado que fica na sala de um boss extremamente forte, chega a dar 1k de vida a mais para quem equipar.
-> Esses itens que dão bastante vida só poderão ser usados por personagens de lvl muito alto, onde possui monstros tão fortes, que seja necessario a utilização desses itens para não morrer.
-> DICA: sempre de look nos itens do servidor, varios deles estão com seus atributos diferentes do original, tudo para aumentar a utilização de varios diferentes. Por exemplo, chega uma hora que knights sempre vão usar golden legs, boh, mms, etc... Trocando os atributos dos itens, eu garanto uma maior variabilidade de sets.
-> Existe tambem itens com sprites editadas, então, reforço a ideia de cliente proprio.
CLIENTE:
-> Trabalharei para que quem não goste de otclient, possa jogar tambem no old client. Mas no otclient possuira varias vantagens, postarei um tutoria de como ele funciona para quem não sabe no site do servidor, quando eu for abrir.
GERAL:
-> O servidor é focado no RPG extremo, quase todos os npc possuem historias e dicas para lhe contar, fora os npcs guardas.
-> Esses Npcs Guardas estão localizados onde geralmente ficam os npcs do alto escalão do exercito, ou quando for um npc muito importante, como um imperador. Esses guardas atacarão quando haver criaturas por perto, protegendo a cidade, e atacá tambem pks que chegarem perto deles. Isso da uma maior segurança para os players dentro da cidade, mas não uma total, ja que esses npc só estao perto do templo e em lugares importantes.
-> Existe muito mais coisas nessa categoria, mas que vcs descobrirão jogando o ot e falando com npcs. Ou seja, sempre fale com todos eles.
VOCAÇÕES:
-> Atualmente, existe 7 vocações no servidor:
Knight: Todo muno conhece o knight, mas para que não sabe, ele é um guerreiro que utiliza armaduras pesadas e eficientes. Ataca usando espada/clava/machado e tem pouca variabilidade de spells.
Druid: Como o knight, todo mundo conhece. O druid utiliza a magia (branca) da natureza, ou seja, gelo e terra. Utiliza armaduras leves e pouco eficientes para a proteção, mas que ajuda em ml e proteção contra elementos.
Sorcerer: Igual ao druid, mas utiliza magias de destruição, como o fogo e raio, até a propria morte. As armaduras são igual a do druid.
Paladin: Armaduras pesadas ou leve (exclusividade do servidor, veja mais em baixo em PROMOTION), utiliza armas de longo alcance.
Invoker: Agora que começa a novidade, o invoker é um mago que utiliza magias muito rapido, o cooldown das magias dele é bem baixa e tem ataques multiplos (veja em SPELLS). Possui tambem uma grande quantidades de magias em area.
Necromante: Utiliza a necromancia (avá), ou seja, tem a capacidade de invocar criaturas undead, possui magias de morte, de proteção e de drain life, que é o sugamento da vida do inimigo para o proprio necromante.
Assassin: Uma vocação nova que possui poucas magias, mas o diferencial dele é a utilizaçao de 2 adagas como arma atacando mais rapido que qualquer outra vocação, possui tambem magia de clone para lutar ao seu lado, confundindo os adversarios. Pode ficar inv e corre muito rapido.
SPELLS:
-> Todas as vocações possuem magias editadas:
O knight possui magias de ataque e de defesa, sendo que essa de defesa ele se transforma em um verdadeiro tank, aumentando sua vida maxima e sua defesa, a troco de sua velocidade de movimento.
O druid possui algumas magias de invocação de cura, ou seja, pode invocar criaturas que o ajudará a curar alguem em alguma quest ou hunt. E tambem magia de trap, utilizando a propria natureza para encurralar quem ele quiser, de um jeito nunca visto. Mais pra frente posso postar um gif dessa magia.
Sorcerer possui mais magias em area
Paladin possui uma magia de invocação, na qual ele invoca um cachorro para lutar ao seu lado. (não, não é igual o dog do tibia, lembre-se que as sprites dos monstros estão bem editadas).
O invoker possui magias de golpes multiplos, como falado mais acima. Essas magias são de ataque que, quando utilizada, varias rajadas acertam o alvo, dando dano varias vezes.
Necromante, como ja dito, suas magias são de drain life, summon de undeads ( esses undead tambem são editados.)
O assassin possui magia de clone e tambem uma magia que ele se transforma em um verdadeiro assassino, aumentando sua velocidade de ataque, movimento e regeneração.
PROMOTION:
-> Isso pode ser só uma ideia, mas eu gostaria de colocar mais que um promotion para paladins. Eles já começam Royal Paladin, ai essas 2 promotions seriam diferenciadas entre elas.
Exemplo, o paladin pode seguir uma promotion de guard, ou seja, um guarda leal, que possui armaduras pesadas, lanças e crossbows com simbolos dos reinos do servidor; Ou ele pode ser um paladin de arco e flecha caçador, que suas armaduras são menos resistentes que as do guard, mas possuem atributos para ajudar ele a sobreviver nas hunts, podendo tambem utilizar spells de invocação de criaturas feras para ajudar. Estilo caçador do World of Warcraft.
Mas como eu disse, é só uma ideia, não sei ainda se ficaria legal, postem ai nos comentarios o que vcs acham sobre essa promotion e se deveria existir para as outras vocações tambem.
SISTEMAS:
-> O servidor possui uma variedade grande de sistemas, os mais basicos (como clicar numa arvore de frutas e colher elas), até algumas mais complexos, como sistema de forja de itens (traga 5 gold ingot, 10 madeiras e 5 pedaços de ferro para forjar uma sword editada. Isso é só um exemplo, essas receitas estarão espalhadas pelo mundo, converse com os npcs e tambem leia os livros que estarei disponibilizando em algumas hunts.)
-> Esse sistema de forja trabalha junto com o sistema de mineração, para pegar minerios pra produzir os itens, e tambem o sistema de cortar arvores, para pegar a madeira.
-> (IDEIA) Um sistema de votação para eleger representantes npcs para mudanças nas cidades. (Exemplo: tinham 5 candidatos, o mais votado foi o candidato x. Todas(?) sua propostas entrarão em vigor no server save. Esse candidato pode ter prometido um aumento no templo e na diminuição no preço das pots das cidades. Mas ele não podera tirar dinheiro do nada, então, ele aumentaria o preço das casas e do aluguel delas). Lembrando que é só uma ideia, não sei se funcionaria, mas particularmente, acho bacana a ideia dos players poderem interfirir tanto no server, como a manipulaçao de mapas e preço de itens.
Galera, eu acho que é isso, o servidor possui MUITO MAIS COISAS, mas que não caberia aqui, por exemplo, aquelas não são as unicas magias editadas das vocaçoes.
Por favor, falem aqui se vcs jogariam um servidor assim e tambem se quiser me dar algumas ideias, seria bem legal
Eu diria que o Server está uns 50% completo, talvez um pouco mais. Só que como estou trabalhando sozinho (fazendo mapa, scritps, sprites... Tudo)
Enfim, eu vo atualizando o post caso eu adicione algo ou tire.
Vlw galera, espero que vcs gostem desse novo projeto. Não se esqueça de comentar oq achou.
Flws.
-
MarceLoko deu reputação a Ocrux em [MOBA] Why Not?Olá pessoas; meu nome é Vinicius Simões, vulgo Ocrux aqui do TK.
Infelizmente não vim apresentar um projeto de moba; mas sim vim pedir um.
Tá; vamos começar de novo, depois disso fica meio difícil.
Pra começar: Oque é um MOBA?
Multiplayer Online Battle Arena, abreviado de MOBA, também conhecido como Action Real-Time Strategy, abreviado ARTS, é um subgênero de jogos de estratégia em tempo real, caracterizado por sua semelhança ao jogo Defense of the Ancients (DotA); popularizado nos últimos tempos com o Legue Of Legends.
Agora que já sabemos oque é um MOBA, vamos aos fatos...
[X] Em 23 de Janeiro de 2013, foi apresentado ao mundo o Projeto X, um projeto que eu esperei ansioso pra jogar, se trata exatamente de um MOBA no Tibia.
-Tomei a liberdade de anexar algumas fotos e informações do projeto (Não sei se eu podia fazer isso; qualquer coisa eu apago).
Projeto X foi apresentado por Printer, uma pessoa já muito conhecida entre o mundo de OTservers. O projeto tinha tudo pra ir pra frente; quase tudo estava completo; o mapa, os sistemas, enfim - quase tudo. Só; que sem mais e sem menos, o projeto acabou e puff; se vai um sonho por ralo a baixo.
O servidor já contava com os principais sistemas
-Monstros se atacavam.
-Itens dando os atributos.
-Monstros da jungle.
-Torres na lane.
-Match Making.
-Tela de seleção.
-Ficar invisível no matinho.
Algumas fotos de que citei
[X] 30 de julho de 2013, o Project 43 foi apresentado aqui mesmo no Tibia King. Postado por @Henriqueberro, no post (Link aqui) não tinha muita coisa a ser "apreciada"; mas tudo escrito era, pra quem espera com um servidor desses, um tanto quanto satisfatório. Era explicado tudo oque precisava ser feito, oque já tinha feito; enfim - tudo vocês podem conferir no link.
O projeto não foi pra frente.
[X] 16 de novembro de 2014, League Of Champions é o servidor da vez. Apresentado também no TK (Link aqui), @Dayglow prometia um servidor baseado no League Of Legends, algo que não me agradou muito, mas ainda eu esperava ansioso pelo resultado. Querendo ou não, ainda era algo promissor; tinha até uma página no Facebook sobre o servidor; enfim, algo que ia pra frente.
O projeto não foi pra frente.
[X] 3 de janeiro de 2015; Jose Almeida postou em seu canal do Youtube um vídeo; com o seguinte título "MOBA + Tibia Part 1". O vídeo tratava-se, como diz na própria descrição: Demonstração do Sistema de Batalha MOBA. Então, assim como a parte 1 do vídeo, tivemos uma continuação até a parte 3; e tendo outros vídeos em relação ao suposto servidor desenvolvido pelo ShayKful.
Jose Almeida é uma pessoa ativa no Youtube, mas nunca consegui contato com o mesmo.
Não tenho informações sobre o servidor.
-Segue os vídeos citados.
Tá, agora que já sabemos de tudo isso; aonde eu quero chegar? A uma única e simples pergunta...
Por que não fazemos um servidor desses!?
Digo, sei que é difícil, muito difícil; mas pelo oque percebemos, seremos capazes. Se em 2013 uns caras conseguiram, porque em 2016 um fórum todo não irá conseguir?
Pelas minhas informações, o @MarceloLoko tem um servidor, incompleto; não tenho muitas informações sobre.
Mas e se nos juntarmos para fazer? Digo, uma pessoa doa isso, outra doa aquilo, seja uma ideia apenas, ou até mesmo um script de minions se atacarem; enfim é só um sonho, mas é um sonho que muitos de nós temos.
Oque temos até agora? Um mapa - Lembra do Projeto X? O mapa dele foi uma doação que ainda ta pra download. É; apenas o mapa...
Mas com o sonho e o mapa apresento a vocês o...
[X] Mapa 0%
[X] Scripts 0%
[X] Tudo 0%
Enfim - é apenas uma ideia, uma ideia que flui que é uma beleza.
Eu fiz o primeiro campeão; apenas o conceito dele...
Se você tem uma ideia, não deixe de comentar ela ai.
Se se interessa tanto quanto eu num servidor desses, comente.
Se você acha mesmo que tem futuro, comente.
Se arroz e feijão é uma boa refeição, comente...
Apoio - @HeberPcL.
-
MarceLoko recebeu reputação de Wolven em creature:moveTo(position)Boa noite!!
Esse método faz a criatura ir andando até a posição passada no parametro.
Testado em TFS 1.2
Reportem bugs.
Adicione em:
luascript.cpp:
registerMethod("Creature", "moveTo", LuaScriptInterface::luaCreatureMoveTo);
int32_t LuaScriptInterface::luaCreatureMoveTo(lua_State* L) { //creature:moveTo(pos) Creature* creature = getUserdata<Creature>(L, 1); if (!creature) { lua_pushnil(L); return 1; } const Position& position = getPosition(L, 2); FindPathParams fpp; fpp.minTargetDist = getNumber<int32_t>(L, 3, 0); fpp.maxTargetDist = getNumber<int32_t>(L, 4, 1); fpp.fullPathSearch = getBoolean(L, 5, fpp.fullPathSearch); fpp.clearSight = getBoolean(L, 6, fpp.clearSight); fpp.maxSearchDist = getNumber<int32_t>(L, 7, 150); std::forward_list<Direction> dirList; if (creature->getPathTo(position, dirList, fpp)) { creature->hasFollowPath = true; creature->startAutoWalk(dirList); pushBoolean(L, true); } else { pushBoolean(L, false); } return 1; }
luascript.h:
static int luaMoveCreatureTo(lua_State* L);
Substitua a função original em:
creature.cpp
bool Creature::setFollowCreature(Creature* creature) { if (creature) { if (followCreature == creature) { return true; } const Position& creaturePos = creature->getPosition(); FindPathParams fpp; fpp.minTargetDist = 0; fpp.maxTargetDist = 1; fpp.fullPathSearch = true; fpp.clearSight = true; fpp.maxSearchDist = 150; std::forward_list<Direction> dirList; if (creaturePos.z != getPosition().z || !canSee(creaturePos) || !getPathTo(creaturePos, dirList, fpp)) { followCreature = nullptr; return false; } if (!listWalkDir.empty()) { listWalkDir.clear(); onWalkAborted(); } hasFollowPath = false; forceUpdateFollowPath = false; followCreature = creature; isUpdatingPath = true; } else { isUpdatingPath = false; followCreature = nullptr; } onFollowCreature(creature); return true; }
monster.cpp
bool Monster::getNextStep(Direction& dir, uint32_t& flags) { if (getHealth() <= 0) { //we dont have anyone watching might aswell stop walking eventWalk = 0; return false; } bool result = false; if (hasFollowPath) return Creature::getNextStep(dir, flags); else if ((!followCreature || !hasFollowPath) && !isSummon()) { if ((followCreature || getTimeSinceLastMove() > 1000) && !hasFollowPath && !isIdle) { //choose a random direction result = getRandomStep(getPosition(), dir); } } else if (isSummon() || followCreature) { result = Creature::getNextStep(dir, flags); if (result) { flags |= FLAG_PATHFINDING; } else { //target dancing if (attackedCreature && attackedCreature == followCreature) { if (isFleeing()) { result = getDanceStep(getPosition(), dir, false, false); } else if (mType->staticAttackChance < static_cast<uint32_t>(uniform_random(1, 100))) { result = getDanceStep(getPosition(), dir); } } } } if (result && (canPushItems() || canPushCreatures())) { const Position& pos = Spells::getCasterPosition(this, dir); Tile* tile = g_game.map.getTile(pos); if (tile) { if (canPushItems()) { Monster::pushItems(tile); } if (canPushCreatures()) { Monster::pushCreatures(tile); } } } return result; }
Bom uso!
Abraço!
-
MarceLoko recebeu reputação de thelifeofpbion em CMS #01 - Goof Troop PuzzleBom dia!
Construi o script usando TFS 0.4, tibia 8.6
A quest tem duas etapas.
Na primeira, você deve posicionar os Deathslicers na posição certa, e então a passagem se abre.
Na segunda etapa, é um puzzle que existia no jogo Goof Troop de Super Nintendo.
Você deve "chutar" (usar) os trens até a posição correta, usar a alavanca para que a pedra desaparece e você possa pegar sua recompensa.
Poderia ter usado outro item, mas o trem está sem utilidade no meu servidor.
Utilizei movements para os deathslicers e actions para o puzzle.
O puzzle foi escrito de forma que possa ser criado a sala da forma que a pessoa imaginar, e apenas as dimensões da sala, a posição da pedra, a posição inicial dos trenzinhos e os itemid que o trem irá colidir devem ser configurados.
Os arquivos estão anexados.
https://www.virustotal.com/pt/file/2d71a16bd0103037f0c5b355796e191536184d42808f00292ba4b0cac2bed5c1/analysis/1422720612/
(o tema do jogo não sai da minha cabeça hehehhe)
Abraço!!
nas restrições da colisão, faltam os IDs 1945 e 1946, da alavanca.
Creio que ainda é tempo de corrigir, nãoo é mesmo? hehe
Concurso de Scripting.rar
-
MarceLoko recebeu reputação de Hayashii em Comunidade de Open Tibia precisa de mudanças JÁ!Com tudo que foi dito, eu simplesmente nao creio que o cenário seja revertido. Porém, como minha assinatura indica, eu nado contra a corrente.
Mantenho desde MAIO um servidor em SÃO PAULO (ping n passa de 50 aqui em MG) sem nenhum tipo de vip ou itens. Poucos dão valor.
Se vocês gostam de jogar casualmente, conheçam o Evolutions do Comedinha.
-
MarceLoko deu reputação a fezeRa em Reward Chestjá existe esse codigo no forum?
-
MarceLoko deu reputação a budamunky em Mega Pack Sprites [+39,000] RPG Server.Mega Pack Sprites [+39,000] RPG Server.
Inclui:
Sprites ... (.bmp)
( Monstro ) .
( Conjuntos ).
(Itens diversos. )
( Armas e armaduras. )
( Paredes e pisos. )
Créditos: altaron
Spritespack.rar (34.4 MB) (128 MB UN-ZIP)
Download
https://mega.nz/#!rk51lIAJ!WH5gTlc1HeZ0lIZOI6M-MGdyQK4Iw_yFOd-_UlvHTXo
http://www.mediafire.com/file/6l64wfdy7hpp77k/Sprites+pack.rar
Scan
https://www.virustotal.com/pt/file/3bbb8c6030abd2d41bb33abf9a4453817cd31de5421030ccd26343044992f96c/analysis/
Creditos Altaron
REUPLOAD!
-
MarceLoko recebeu reputação de Milbradt em getPlayerNameById, getPlayerIdByName e getPlayerIDBom dia!
Trago estas três funções .lua que utiliza o player ID da database para retornar o Nome, vice-versa e o próprio ID
Não consigo lhes dar exemplos de utilização, entretanto eu as utilizo. Estou certo que pode servir para alguém.
• getPlayerNameById(id)
• getPlayerIdByName(name)
• getPlayerID(cid)
Créditos a mim mesmo.
Abraço!
-
MarceLoko recebeu reputação de Snowsz em creature:moveTo(position)Boa noite!!
Esse método faz a criatura ir andando até a posição passada no parametro.
Testado em TFS 1.2
Reportem bugs.
Adicione em:
luascript.cpp:
registerMethod("Creature", "moveTo", LuaScriptInterface::luaCreatureMoveTo);
int32_t LuaScriptInterface::luaCreatureMoveTo(lua_State* L) { //creature:moveTo(pos) Creature* creature = getUserdata<Creature>(L, 1); if (!creature) { lua_pushnil(L); return 1; } const Position& position = getPosition(L, 2); FindPathParams fpp; fpp.minTargetDist = getNumber<int32_t>(L, 3, 0); fpp.maxTargetDist = getNumber<int32_t>(L, 4, 1); fpp.fullPathSearch = getBoolean(L, 5, fpp.fullPathSearch); fpp.clearSight = getBoolean(L, 6, fpp.clearSight); fpp.maxSearchDist = getNumber<int32_t>(L, 7, 150); std::forward_list<Direction> dirList; if (creature->getPathTo(position, dirList, fpp)) { creature->hasFollowPath = true; creature->startAutoWalk(dirList); pushBoolean(L, true); } else { pushBoolean(L, false); } return 1; }
luascript.h:
static int luaMoveCreatureTo(lua_State* L);
Substitua a função original em:
creature.cpp
bool Creature::setFollowCreature(Creature* creature) { if (creature) { if (followCreature == creature) { return true; } const Position& creaturePos = creature->getPosition(); FindPathParams fpp; fpp.minTargetDist = 0; fpp.maxTargetDist = 1; fpp.fullPathSearch = true; fpp.clearSight = true; fpp.maxSearchDist = 150; std::forward_list<Direction> dirList; if (creaturePos.z != getPosition().z || !canSee(creaturePos) || !getPathTo(creaturePos, dirList, fpp)) { followCreature = nullptr; return false; } if (!listWalkDir.empty()) { listWalkDir.clear(); onWalkAborted(); } hasFollowPath = false; forceUpdateFollowPath = false; followCreature = creature; isUpdatingPath = true; } else { isUpdatingPath = false; followCreature = nullptr; } onFollowCreature(creature); return true; }
monster.cpp
bool Monster::getNextStep(Direction& dir, uint32_t& flags) { if (getHealth() <= 0) { //we dont have anyone watching might aswell stop walking eventWalk = 0; return false; } bool result = false; if (hasFollowPath) return Creature::getNextStep(dir, flags); else if ((!followCreature || !hasFollowPath) && !isSummon()) { if ((followCreature || getTimeSinceLastMove() > 1000) && !hasFollowPath && !isIdle) { //choose a random direction result = getRandomStep(getPosition(), dir); } } else if (isSummon() || followCreature) { result = Creature::getNextStep(dir, flags); if (result) { flags |= FLAG_PATHFINDING; } else { //target dancing if (attackedCreature && attackedCreature == followCreature) { if (isFleeing()) { result = getDanceStep(getPosition(), dir, false, false); } else if (mType->staticAttackChance < static_cast<uint32_t>(uniform_random(1, 100))) { result = getDanceStep(getPosition(), dir); } } } } if (result && (canPushItems() || canPushCreatures())) { const Position& pos = Spells::getCasterPosition(this, dir); Tile* tile = g_game.map.getTile(pos); if (tile) { if (canPushItems()) { Monster::pushItems(tile); } if (canPushCreatures()) { Monster::pushCreatures(tile); } } } return result; }
Bom uso!
Abraço!
-
MarceLoko recebeu reputação de Sommer em PVP DEDINHO, Foxworld, with crosshairfunction onCastSpell(cid, var) if isPlayer(getCreatureTarget(cid)) == TRUE and getCreatureTarget(cid) ~= getTopCreature(variantToPosition(var)).uid then doPlayerSendCancel(cid, "You can not shoot this directly on players.") return FALSE end return doCombat(cid, combat, var) end
me parece ser o mais adequado... de qualquer forma, vc nunca poderá atirar a sd pela tela se o player estiver marcado como seu target
desculpa nao testar, pois nem ao menos tenho servidor que nao seja 1.x aqui
o ideal é realmente mexer na source, e é bem melhor e simples -
MarceLoko recebeu reputação de luanluciano93 em Monstros PassivosBoa noite!
Requerido
TFS 1.x
http://www.tibiaking.com/forum/topic/60768-monster-onselecttargetself-target/
Segue dois códigos de monstro passivo:
Monstro que ataca ao ser atacado:
function onSelectTarget(self, target) if target:getTarget() == self then return true end return false end
Monstro que só atacam jogadores fortes:
function onSelectTarget(self, target) if target:getLevel() >= 100 then return true end return false end Coloque um desses códigos em um arquivo lua em data/monster/scripts
Abra o xml do monstro e insira após manacost:
script="arquivo.lua"
Abraço!
-
MarceLoko recebeu reputação de RigBy em Monstros PassivosBoa noite!
Requerido
TFS 1.x
http://www.tibiaking.com/forum/topic/60768-monster-onselecttargetself-target/
Segue dois códigos de monstro passivo:
Monstro que ataca ao ser atacado:
function onSelectTarget(self, target) if target:getTarget() == self then return true end return false end
Monstro que só atacam jogadores fortes:
function onSelectTarget(self, target) if target:getLevel() >= 100 then return true end return false end Coloque um desses códigos em um arquivo lua em data/monster/scripts
Abra o xml do monstro e insira após manacost:
script="arquivo.lua"
Abraço!
-
MarceLoko recebeu reputação de Wakon em Monstros PassivosBoa noite!
Requerido
TFS 1.x
http://www.tibiaking.com/forum/topic/60768-monster-onselecttargetself-target/
Segue dois códigos de monstro passivo:
Monstro que ataca ao ser atacado:
function onSelectTarget(self, target) if target:getTarget() == self then return true end return false end
Monstro que só atacam jogadores fortes:
function onSelectTarget(self, target) if target:getLevel() >= 100 then return true end return false end Coloque um desses códigos em um arquivo lua em data/monster/scripts
Abra o xml do monstro e insira após manacost:
script="arquivo.lua"
Abraço!
-
MarceLoko recebeu reputação de RigBy em [TFS 1.2] Monster onSelectTarget(self, target)Boa noite!
Este código torna possível incluir algum script quando o monstro escolhe um alvo.
Testado em TFS 1.2
monster.cpp
ache:
bool Monster::selectTarget(Creature* creature)
substitua:
bool Monster::selectTarget(Creature* creature) { if (!isTarget(creature)) { return false; } auto it = std::find(targetList.begin(), targetList.end(), creature); if (it == targetList.end()) { //Target not found in our target list. return false; } if (isHostile() || isSummon()) { if (executeOnSelectTarget(creature) == 1){ if (setAttackedCreature(creature) && !isSummon()) { g_dispatcher.addTask(createTask(std::bind(&Game::checkCreatureAttack, &g_game, getID()))); } } else return false; } return setFollowCreature(creature); } bool Monster::executeOnSelectTarget(Creature* creature){ // onSelectTarget(self, target) if (mType->targetEvent != -1) { LuaScriptInterface* scriptInterface = mType->scriptInterface; if (!scriptInterface->reserveScriptEnv()) { std::cout << "[Error - Monster::onSelectTarget] Call stack overflow" << std::endl; return true; } ScriptEnvironment* env = scriptInterface->getScriptEnv(); env->setScriptId(mType->targetEvent, scriptInterface); lua_State* L = scriptInterface->getLuaState(); scriptInterface->pushFunction(mType->targetEvent); LuaScriptInterface::pushUserdata<Monster>(L, this); LuaScriptInterface::setMetatable(L, -1, "Monster"); LuaScriptInterface::pushUserdata(L, creature); LuaScriptInterface::setCreatureMetatable(L, -1, creature); return (scriptInterface->callFunction(2)); } return true; } monster.hache:
bool selectTarget(Creature* creature);
inclua:
bool executeOnSelectTarget(Creature* creature);
monsters.cpp:
ache:
scriptInterface = nullptr; creatureAppearEvent = -1; creatureDisappearEvent = -1; creatureMoveEvent = -1; creatureSayEvent = -1; thinkEvent = -1; inclua:targetEvent = -1;
ache:
mType->thinkEvent = scriptInterface->getEvent("onThink");
inclua:
mType->targetEvent = scriptInterface->getEvent("onSelectTarget");
Em breve:
Player onSelectTarget
-
MarceLoko recebeu reputação de luanluciano93 em [TFS 1.2] Monster onSelectTarget(self, target)Boa noite!
Este código torna possível incluir algum script quando o monstro escolhe um alvo.
Testado em TFS 1.2
monster.cpp
ache:
bool Monster::selectTarget(Creature* creature)
substitua:
bool Monster::selectTarget(Creature* creature) { if (!isTarget(creature)) { return false; } auto it = std::find(targetList.begin(), targetList.end(), creature); if (it == targetList.end()) { //Target not found in our target list. return false; } if (isHostile() || isSummon()) { if (executeOnSelectTarget(creature) == 1){ if (setAttackedCreature(creature) && !isSummon()) { g_dispatcher.addTask(createTask(std::bind(&Game::checkCreatureAttack, &g_game, getID()))); } } else return false; } return setFollowCreature(creature); } bool Monster::executeOnSelectTarget(Creature* creature){ // onSelectTarget(self, target) if (mType->targetEvent != -1) { LuaScriptInterface* scriptInterface = mType->scriptInterface; if (!scriptInterface->reserveScriptEnv()) { std::cout << "[Error - Monster::onSelectTarget] Call stack overflow" << std::endl; return true; } ScriptEnvironment* env = scriptInterface->getScriptEnv(); env->setScriptId(mType->targetEvent, scriptInterface); lua_State* L = scriptInterface->getLuaState(); scriptInterface->pushFunction(mType->targetEvent); LuaScriptInterface::pushUserdata<Monster>(L, this); LuaScriptInterface::setMetatable(L, -1, "Monster"); LuaScriptInterface::pushUserdata(L, creature); LuaScriptInterface::setCreatureMetatable(L, -1, creature); return (scriptInterface->callFunction(2)); } return true; } monster.hache:
bool selectTarget(Creature* creature);
inclua:
bool executeOnSelectTarget(Creature* creature);
monsters.cpp:
ache:
scriptInterface = nullptr; creatureAppearEvent = -1; creatureDisappearEvent = -1; creatureMoveEvent = -1; creatureSayEvent = -1; thinkEvent = -1; inclua:targetEvent = -1;
ache:
mType->thinkEvent = scriptInterface->getEvent("onThink");
inclua:
mType->targetEvent = scriptInterface->getEvent("onSelectTarget");
Em breve:
Player onSelectTarget
-
MarceLoko recebeu reputação de Nextbr em [TFS 1.2] Monster onSelectTarget(self, target)Boa noite!
Este código torna possível incluir algum script quando o monstro escolhe um alvo.
Testado em TFS 1.2
monster.cpp
ache:
bool Monster::selectTarget(Creature* creature)
substitua:
bool Monster::selectTarget(Creature* creature) { if (!isTarget(creature)) { return false; } auto it = std::find(targetList.begin(), targetList.end(), creature); if (it == targetList.end()) { //Target not found in our target list. return false; } if (isHostile() || isSummon()) { if (executeOnSelectTarget(creature) == 1){ if (setAttackedCreature(creature) && !isSummon()) { g_dispatcher.addTask(createTask(std::bind(&Game::checkCreatureAttack, &g_game, getID()))); } } else return false; } return setFollowCreature(creature); } bool Monster::executeOnSelectTarget(Creature* creature){ // onSelectTarget(self, target) if (mType->targetEvent != -1) { LuaScriptInterface* scriptInterface = mType->scriptInterface; if (!scriptInterface->reserveScriptEnv()) { std::cout << "[Error - Monster::onSelectTarget] Call stack overflow" << std::endl; return true; } ScriptEnvironment* env = scriptInterface->getScriptEnv(); env->setScriptId(mType->targetEvent, scriptInterface); lua_State* L = scriptInterface->getLuaState(); scriptInterface->pushFunction(mType->targetEvent); LuaScriptInterface::pushUserdata<Monster>(L, this); LuaScriptInterface::setMetatable(L, -1, "Monster"); LuaScriptInterface::pushUserdata(L, creature); LuaScriptInterface::setCreatureMetatable(L, -1, creature); return (scriptInterface->callFunction(2)); } return true; } monster.hache:
bool selectTarget(Creature* creature);
inclua:
bool executeOnSelectTarget(Creature* creature);
monsters.cpp:
ache:
scriptInterface = nullptr; creatureAppearEvent = -1; creatureDisappearEvent = -1; creatureMoveEvent = -1; creatureSayEvent = -1; thinkEvent = -1; inclua:targetEvent = -1;
ache:
mType->thinkEvent = scriptInterface->getEvent("onThink");
inclua:
mType->targetEvent = scriptInterface->getEvent("onSelectTarget");
Em breve:
Player onSelectTarget
-
MarceLoko recebeu reputação de Caronte em [TFS 1.2] Monster onSelectTarget(self, target)Boa noite!
Este código torna possível incluir algum script quando o monstro escolhe um alvo.
Testado em TFS 1.2
monster.cpp
ache:
bool Monster::selectTarget(Creature* creature)
substitua:
bool Monster::selectTarget(Creature* creature) { if (!isTarget(creature)) { return false; } auto it = std::find(targetList.begin(), targetList.end(), creature); if (it == targetList.end()) { //Target not found in our target list. return false; } if (isHostile() || isSummon()) { if (executeOnSelectTarget(creature) == 1){ if (setAttackedCreature(creature) && !isSummon()) { g_dispatcher.addTask(createTask(std::bind(&Game::checkCreatureAttack, &g_game, getID()))); } } else return false; } return setFollowCreature(creature); } bool Monster::executeOnSelectTarget(Creature* creature){ // onSelectTarget(self, target) if (mType->targetEvent != -1) { LuaScriptInterface* scriptInterface = mType->scriptInterface; if (!scriptInterface->reserveScriptEnv()) { std::cout << "[Error - Monster::onSelectTarget] Call stack overflow" << std::endl; return true; } ScriptEnvironment* env = scriptInterface->getScriptEnv(); env->setScriptId(mType->targetEvent, scriptInterface); lua_State* L = scriptInterface->getLuaState(); scriptInterface->pushFunction(mType->targetEvent); LuaScriptInterface::pushUserdata<Monster>(L, this); LuaScriptInterface::setMetatable(L, -1, "Monster"); LuaScriptInterface::pushUserdata(L, creature); LuaScriptInterface::setCreatureMetatable(L, -1, creature); return (scriptInterface->callFunction(2)); } return true; } monster.hache:
bool selectTarget(Creature* creature);
inclua:
bool executeOnSelectTarget(Creature* creature);
monsters.cpp:
ache:
scriptInterface = nullptr; creatureAppearEvent = -1; creatureDisappearEvent = -1; creatureMoveEvent = -1; creatureSayEvent = -1; thinkEvent = -1; inclua:targetEvent = -1;
ache:
mType->thinkEvent = scriptInterface->getEvent("onThink");
inclua:
mType->targetEvent = scriptInterface->getEvent("onSelectTarget");
Em breve:
Player onSelectTarget
-
MarceLoko deu reputação a tgar em Servidor já online procura MAPPERPosso ajudar, gostaria de mappear mas também estaria interessado em fazer suporte in-game.
Meu mapping é interessante, não possuo tanta experiência mas tenho bom senso.
Skype: zergnaticus.
Abraço.