Você está desconectado.

Conecte-se e veja nossos conteúdos exclusivos!
 

  


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

Compartilhe
avatar
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 9/10/2016, 13:26

*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


________________________________________
avatar
GOD Vitor
Administrador
Administrador

King Coin(s) King Coin(s) : 33
Reputação : 13015
Facebook : Facebook.com/Vitor.Eduardo.5567
OTServ Favorito : otPokémonImeprium
Meu Char : Zoom
Seção Favorita : Spriting
Eu sou : Scripter
Tópicos : 256
Data de Cadastro : 26/09/2015
Idade : 19
Localização : Florianópolis

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

Mensagem por GOD Vitor em 9/10/2016, 13:28

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


________________________________________
Meu Servidor Online:

JOGAR AGORA!

Clique aqui para doar.

    Data/hora atual: 24/8/2017, 07:45