Você está desconectado.

Conecte-se e veja nossos conteúdos exclusivos!
 

  



Curta-nos: Curtir

Código que faz a creature (NPC, monster ou player) andar até a posição desejada.

Compartilhe

GOD Andre
Membro
Membro

King Coin(s) King Coin(s) : 52
Reputação : 24
Tópicos : 4
Data de Cadastro : 09/10/2016

Código que faz a creature (NPC, monster ou player) andar até a posição desejada.

Mensagem por GOD Andre em Dom Out 09, 2016 6:26 pm

*Notas:
Não use para longas distâncias. Crie um sistema de waypoints para isso.
A creature não para exatamente na posição desejada. (caso alguém se interesse em corrigir, eu anexarei ao tópico)
Utiliza grande poder de processamento. Use de forma sábia.
Testado apenas em TFS 1.2

Coloque em luascript.cpp
Spoiler:
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;
}

Coloque em luascript.h
Spoiler:
static int luaCreatureMoveTo(lua_State* L);

Substitua a função original em creature.cpp
Spoiler:
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;
}

Substitua a função original em monster.cpp
Spoiler:
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;
}

Aproveitem! Abraço.

Créditos
*Marce Loko


________________________________________

GOD Vitor
Administrador
Administrador

King Coin(s) King Coin(s) : 32
Reputação : 13014
Facebook : Facebook.com/Vitor.Eduardo.5567
OTServ Favorito : Pokémon Paraíso V3 - O Retorno
Meu Char : Zed Stars
Seção Favorita : Spriting
Eu sou : Scripter
Tópicos : 250
Data de Cadastro : 27/09/2015
Idade : 18
Localização : Florianópolis - SC

Re: Código que faz a creature (NPC, monster ou player) andar até a posição desejada.

Mensagem por GOD Vitor em Dom Out 09, 2016 6:28 pm

Opa, ótimo conteúdo.
Obrigado por contribuir!
Você recebeu 1 REP+.


________________________________________



Dicas Importantes:
- Respeite as Regras.
- Não peça suporte por MP

    Data/hora atual: Qua Jan 18, 2017 5:13 am