Mobii nu intra in safezone.
*Poze / Video:
https://gyazo.com/47b2c8ea9d719ca92335d771fd6b4997
*Link download / Code:
Code:
/// CommonDefines.h
#define METGUIDE_ENABLE_MOB_NO_SAFEZONE_ENTRY // Prevents mobs and bosses from walking into ATTR_BANPK safezones; stops lure into villages
==================================================================================================
==================================================================================================
==================================================================================================
/// sectree_manager.cpp
// Cauta:
bool SECTREE_MANAGER::IsMovablePosition(long lMapIndex, long x, long y)
{
LPSECTREE tree = SECTREE_MANAGER::instance().Get(lMapIndex, x, y);
if (!tree)
return false;
return (!tree->IsAttr(x, y, ATTR_BLOCK | ATTR_OBJECT));
}
// Adauga:
#ifdef METGUIDE_ENABLE_MOB_NO_SAFEZONE_ENTRY
bool SECTREE_MANAGER::IsMobWalkablePosition(long lMapIndex, long x, long y)
{
if (!IsMovablePosition(lMapIndex, x, y))
return false;
LPSECTREE tree = SECTREE_MANAGER::instance().Get(lMapIndex, x, y);
if (!tree)
return false;
return !tree->IsAttr(x, y, ATTR_BANPK);
}
#endif
===================================================================================================
==================================================================================================
==================================================================================================
/// sectree_manager.h
// Cauta:
bool GetMovablePosition(long lMapIndex, long x, long y, PIXEL_POSITION & pos);
bool IsAttackablePosition(long lMapIndex, long x, long y);
// Adauga:
#ifdef METGUIDE_ENABLE_MOB_NO_SAFEZONE_ENTRY
bool IsMobWalkablePosition(long lMapIndex, long x, long y);
#endif
==================================================================================================
==================================================================================================
==================================================================================================
/// char.cpp
// Cauta:
bool CHARACTER::Goto(long x, long y)
{
// Adauga:
#ifdef METGUIDE_ENABLE_MOB_NO_SAFEZONE_ENTRY
if (IsMonster() && !SECTREE_MANAGER::instance().IsMobWalkablePosition(GetMapIndex(), x, y))
return false;
#endif
// Cauta:
bool CHARACTER::Move(long x, long y)
{
if (GetX() == x && GetY() == y)
return true;
// Adauga:
#ifdef METGUIDE_ENABLE_MOB_NO_SAFEZONE_ENTRY
if (IsMonster())
{
if (!SECTREE_MANAGER::instance().IsMobWalkablePosition(GetMapIndex(), x, y))
{
Stop();
Return();
return false;
}
}
#endif
// Cauta:
}
// END_OF_TRENT_MONSTER
long x = pkChr->GetX();
long y = pkChr->GetY();
// Adauga:
#ifdef METGUIDE_ENABLE_MOB_NO_SAFEZONE_ENTRY
if (IsMonster())
{
LPSECTREE pkTargetTree = pkChr->GetSectree();
if (pkTargetTree && pkTargetTree->IsAttr(x, y, ATTR_BANPK))
{
SetVictim(NULL);
Return();
return true;
}
}
#endif
// Cauta:
if (0 == (tree->GetAttribute(dx, dy) & (ATTR_BLOCK | ATTR_OBJECT)))
break;
// Modifica:
if (0 == (tree->GetAttribute(dx, dy) & (ATTR_BLOCK | ATTR_OBJECT
#ifdef METGUIDE_ENABLE_MOB_NO_SAFEZONE_ENTRY
| ATTR_BANPK
#endif
)))
break;
==================================================================================================
==================================================================================================
==================================================================================================
/// char_state.cpp
// Cauta:
if (!SECTREE_MANAGER::instance().IsMovablePosition(GetMapIndex(), GetX() + (int) fx*j/100, GetY() + (int) fy*j/100))
// Modifica:
#ifdef METGUIDE_ENABLE_MOB_NO_SAFEZONE_ENTRY
if (!SECTREE_MANAGER::instance().IsMobWalkablePosition(GetMapIndex(), GetX() + (int) fx*j/100, GetY() + (int) fy*j/100))
#else
if (!SECTREE_MANAGER::instance().IsMovablePosition(GetMapIndex(), GetX() + (int) fx*j/100, GetY() + (int) fy*j/100))
#endif
// Cauta:
if (!(SECTREE_MANAGER::instance().IsMovablePosition(GetMapIndex(), GetX() + (int) fx, GetY() + (int) fy)
&& SECTREE_MANAGER::instance().IsMovablePosition(GetMapIndex(), GetX() + (int) fx / 2, GetY() + (int) fy / 2)))
// Modifica:
#ifdef METGUIDE_ENABLE_MOB_NO_SAFEZONE_ENTRY
if (!(SECTREE_MANAGER::instance().IsMobWalkablePosition(GetMapIndex(), GetX() + (int) fx, GetY() + (int) fy)
&& SECTREE_MANAGER::instance().IsMobWalkablePosition(GetMapIndex(), GetX() + (int) fx / 2, GetY() + (int) fy / 2)))
#else
if (!(SECTREE_MANAGER::instance().IsMovablePosition(GetMapIndex(), GetX() + (int) fx, GetY() + (int) fy)
&& SECTREE_MANAGER::instance().IsMovablePosition(GetMapIndex(), GetX() + (int) fx / 2, GetY() + (int) fy / 2)))
#endif
// Cauta:
if (!(SECTREE_MANAGER::instance().IsMovablePosition(GetMapIndex(), GetX() + (int) fx, GetY() + (int) fy)
&& SECTREE_MANAGER::instance().IsMovablePosition(GetMapIndex(), GetX() + (int) fx/2, GetY() + (int) fy/2)))
// Modifica:
#ifdef METGUIDE_ENABLE_MOB_NO_SAFEZONE_ENTRY
if (!(SECTREE_MANAGER::instance().IsMobWalkablePosition(GetMapIndex(), GetX() + (int) fx, GetY() + (int) fy)
&& SECTREE_MANAGER::instance().IsMobWalkablePosition(GetMapIndex(), GetX() + (int) fx/2, GetY() + (int) fy/2)))
#else
if (!(SECTREE_MANAGER::instance().IsMovablePosition(GetMapIndex(), GetX() + (int) fx, GetY() + (int) fy)
&& SECTREE_MANAGER::instance().IsMovablePosition(GetMapIndex(), GetX() + (int) fx/2, GetY() + (int) fy/2)))
#endif
// Cauta:
if (GetRaceNum() == 2191 && number(1, 20) == 1 && get_dword_time() - m_pkMobInst->m_dwLastWarpTime > 1000)
{
float fx, fy;
GetDeltaByDegree(victim->GetRotation(), 400, &fx, &fy);
long new_x = victim->GetX() + (long)fx;
long new_y = victim->GetY() + (long)fy;
// Adauga:
#ifdef METGUIDE_ENABLE_MOB_NO_SAFEZONE_ENTRY
if (!SECTREE_MANAGER::instance().IsMobWalkablePosition(victim->GetMapIndex(), new_x, new_y))
return;
#endif
// Cauta: in void CHARACTER::StateBattle()
if (IsStun())
return;
LPCHARACTER victim = GetVictim();
// Adauga:
#ifdef METGUIDE_ENABLE_MOB_NO_SAFEZONE_ENTRY
if (victim)
{
LPSECTREE pkVictimTree = victim->GetSectree();
if (pkVictimTree && pkVictimTree->IsAttr(victim->GetX(), victim->GetY(), ATTR_BANPK))
{
SetVictim(NULL);
Return();
m_dwStateDuration = PASSES_PER_SEC(1);
return;
}
}
if (IsMonster() && GetSectree() && GetSectree()->IsAttr(GetX(), GetY(), ATTR_BANPK))
{
SetVictim(NULL);
Return();
m_dwStateDuration = PASSES_PER_SEC(1);
return;
}
#endif
==================================================================================================
==================================================================================================
==================================================================================================
/// trigger.cpp
// Cauta: class FuncFindMobVictim in bool operator () (LPENTITY ent)
if (pkChr->IsNPC())
{
if ( !pkChr->IsMonster() || !m_pkChr->IsAttackMob() || m_pkChr->IsAggressive() )
return false;
}
if (pkChr->IsDead())
return false;
// Adauga:
#ifdef METGUIDE_ENABLE_MOB_NO_SAFEZONE_ENTRY
{
LPSECTREE pkVictimTree = pkChr->GetSectree();
if (pkVictimTree && pkVictimTree->IsAttr(pkChr->GetX(), pkChr->GetY(), ATTR_BANPK))
return false;
}
#endif

