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 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


________________________________________
avatar
Death Gun
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 : 253
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 Death Gun em Dom Out 09, 2016 6:28 pm

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


________________________________________
Não sou dono do mundo, mas sou filho do dono.

    Data/hora atual: Sab Abr 29, 2017 7:26 pm