28 #include "../clib/passert.h" 29 #include "../clib/rawtypes.h" 30 #include "../plib/realmdescriptor.h" 46 unsigned short newy, Multi::UMulti* multi, Realms::Realm* oldrealm );
51 unsigned short newy, Mobile::Character* chr,
52 Realms::Realm* oldrealm );
57 Realms::Realm* oldrealm );
76 inline void zone_convert(
unsigned short x,
unsigned short y,
unsigned short* wx,
93 if ( (
unsigned)x >= realm->
width() )
94 x = realm->
width() - 1;
95 if ( (
unsigned)y >= realm->
height() )
105 passert( y < realm->height() );
122 template <
class Filter>
125 template <
typename F>
127 template <
typename F>
128 static void InVisualRange(
const UObject* obj,
F&& f );
129 template <
typename F>
133 template <
typename F>
134 static void _forEach(
const CoordsArea& coords,
const Realms::Realm* realm,
F&& f );
149 template <FilterType T>
155 template <
typename F>
156 static void call(
Core::Zone& zone,
const CoordsArea& coords,
F&& f );
175 bool inRange(
const UObject* obj )
const;
184 void convert(
int xL,
int yL,
int xH,
int yH,
const Realms::Realm* realm );
197 CoordsArea::CoordsArea(
u16 x,
u16 y,
const Realms::Realm* realm,
unsigned range )
199 convert( x - range, y - range, x + range, y + range, realm );
210 CoordsArea::CoordsArea(
u16 x1,
u16 y1,
u16 x2,
u16 y2,
const Realms::Realm* realm )
212 convert( x1, y1, x2, y2, realm );
219 bool CoordsArea::inRange(
const UObject* obj )
const 221 return ( obj->x >=
_xL && obj->x <=
_xH && obj->y >=
_yL && obj->y <=
_yH );
224 void CoordsArea::convert(
int xL,
int yL,
int xH,
int yH,
const Realms::Realm* realm )
233 template <
class Filter>
234 template <
typename F>
238 if ( realm ==
nullptr )
240 CoordsArea coords( x, y, realm, range );
241 _forEach( coords, realm, std::forward<F>( f ) );
243 template <
class Filter>
244 template <
typename F>
250 template <
class Filter>
251 template <
typename F>
255 if ( realm ==
nullptr )
257 CoordsArea coords( x1, y1, x2, y2, realm );
258 _forEach( coords, realm, std::forward<F>( f ) );
261 template <
class Filter>
262 template <
typename F>
265 for (
u16 wx = coords.wxL; wx <= coords.wxH; ++wx )
267 for (
u16 wy = coords.wyL; wy <= coords.wyH; ++wy )
269 Filter::call( realm->
zone[wx][wy], coords, f );
277 template <
typename F>
282 if ( coords.inRange( chr ) )
285 for (
auto& npc : zone.
npcs )
287 if ( coords.inRange( npc ) )
293 template <
typename F>
298 if ( coords.inRange( chr ) )
304 template <
typename F>
309 if ( chr->has_active_client() )
311 if ( coords.inRange( chr ) )
318 template <
typename F>
321 for (
auto& npc : zone.
npcs )
323 if ( coords.inRange( npc ) )
329 template <
typename F>
332 for (
auto& item : zone.
items )
334 if ( coords.inRange( item ) )
340 template <
typename F>
343 for (
auto& multi : zone.
multis )
345 if ( coords.inRange( multi ) )
void SetItemWorldPosition(Items::Item *item)
int get_toplevel_item_count()
void ClrItemWorldPosition(Items::Item *item)
static void call(Core::Zone &zone, const CoordsArea &coords, F &&f)
void add_item_to_world(Items::Item *item)
FilterImp< FilterType::OnlinePlayer > OnlinePlayerFilter
void SetCharacterWorldPosition(Mobile::Character *chr, Realms::WorldChangeReason reason)
const unsigned WGRID_SHIFT
FilterImp< FilterType::Mobile > MobileFilter
static void InRange(u16 x, u16 y, const Realms::Realm *realm, unsigned range, F &&f)
void remove_item_from_world(Items::Item *item)
void add_multi_to_world(Multi::UMulti *multi)
ZoneCharacters characters
std::vector< Items::Item * > ZoneItems
void zone_convert_clip(int x, int y, const Realms::Realm *realm, unsigned short *wx, unsigned short *wy)
FilterImp< FilterType::NPC > NPCFilter
static void _forEach(const CoordsArea &coords, const Realms::Realm *realm, F &&f)
FilterImp< FilterType::Multi > MultiFilter
std::vector< Multi::UMulti * > ZoneMultis
unsigned short height() const
virtual UObject * toplevel_owner()
void ClrCharacterWorldPosition(Mobile::Character *chr, Realms::WorldChangeReason reason)
Zone & getzone(unsigned short x, unsigned short y, Realms::Realm *realm)
FilterImp< FilterType::Player > PlayerFilter
static void InVisualRange(const UObject *obj, F &&f)
std::vector< Mobile::Character * > ZoneCharacters
void MoveCharacterWorldPosition(unsigned short oldx, unsigned short oldy, unsigned short newx, unsigned short newy, Mobile::Character *chr, Realms::Realm *oldrealm)
void zone_convert(unsigned short x, unsigned short y, unsigned short *wx, unsigned short *wy, const Realms::Realm *realm)
FilterImp< FilterType::Item > ItemFilter
unsigned short width() const
void move_multi_in_world(unsigned short oldx, unsigned short oldy, unsigned short newx, unsigned short newy, Multi::UMulti *multi, Realms::Realm *oldrealm)
void remove_multi_from_world(Multi::UMulti *multi)
void MoveItemWorldPosition(unsigned short oldx, unsigned short oldy, Items::Item *item, Realms::Realm *oldrealm)
static void InBox(u16 x1, u16 y1, u16 x2, u16 y2, const Realms::Realm *realm, F &&f)