Se você tem curiosidade sobre casos de uso, aqui está algumas features que foram desenvolvidas utilizando o Zone System: https://github.com/lyuz1n/zone-system-features/tree/main
Zone System é um ferramenta revolucionária que possibilita determinar zonas específicas para ações específicas, sendo possível manipular dentro da zona, todas as criaturas, tiles e posições.
Além da facilidade de manipular tudo o que acontece dentro das zonas, o seu código, consequentemente, se torna mais minimalista e abstrato, descartando iterações de área, getSpectators e outros meios que podem dar gargalo.
Uma zona não precisa necessariamente ser quadrada, pode ser uma linha reta, um círculo, um triângulo, pode ser uma zona separada em pedaços, pode ser o que você quiser, basta usar o Zone Brush no Remeres Map Editor e definir como deseja sua zona e qual será o id.
Zone System tem uma estrutura de dados otimizada, fazendo com que performe melhor do que os meios citados acima (em ocasiões onde é necessário varrer as criaturas dentro de uma área). Para termos uma ideia, veja a implementação do método que obtém todos os monstros dentro de uma zona específica:
const std::unordered_map<uint32_t, Monster*>& getMonsters() const {
return monsters;
};Como podemos ver, é um método constante. Os outros métodos getPlayers, getNpcs, getTiles e getPositions também seguem essa mesma regra.
Podemos trabalhar no C++, mas o Zone System foi especialmente desenvolvido para trabalhar no Lua. Estes são alguns métodos e eventos disponíveis:
local allZones = Game.getZones()
local zone = tile:getZone()
local zone = creature:getZone()
local zone = Zone(4598)
local id = zone:getId()
local tiles = zone:getTiles()
local players = zone:getPlayers()
local monsters = zone:getMonsters()
local npcs = zone:getNpcs()
local positions = zone:getPositions()
local playersCount = zone:getPlayersCount()
local monstersCount = zone:getMonstersCount()
local npcsCount = zone:getNpcsCount()
zone:clean()
zone:removeMonsters()
zone:removeNpcs()
local zoneEvent = ZoneEvent(4598)
function zoneEvent.onPlayerEnter(player, zone)
print('player entered the zone with id 4598')
return true
end
function zoneEvent.onMonsterEnter(monster, zone)
print('monster entered the zone with id 4598')
return true
end
function zoneEvent.onNpcEnter(npc, zone)
print('npc entered the zone with id 4598')
return true
end
zoneEvent:register()Se selecionarmos uma área ou mapa de quest com um id de zona, podemos monitorar todos os jogadores, monstros, npcs, tiles e posições em tempo real. Veja abaixo um exemplo de como podemos fazer isso:
Após utilizar o Zone Brush em toda a área desejada (como na imagem acima), podemos monitorar da seguinte forma:
local zone = Zone(7285)
local players = zone:getPlayers()
local monsters = zone:getMonsters()
local npcs = zone:getNpcs()
local tiles = zone:getTiles()
local positions = zone:getPositions()Podemos fazer incontáveis condições baseado na zona em que a criatura está. Veja este exemplo onde uma zona específica não permite o uso da spell exani hur:
local zoneId = 4567
function onCastSpell(creature, variant)
local zone = creature:getZone()
if zone and zone:getId() == zoneId then
player:sendCancelMessage('You cannot use this spell in this zone.')
return false
end
local returnValue = levitate(creature, variant:getString())
if returnValue ~= RETURNVALUE_NOERROR then
creature:sendCancelMessage(returnValue)
creature:getPosition():sendMagicEffect(CONST_ME_POFF)
return false
end
return true
endPara implementar o Zone System, recomendamos TFS (otland/forgottenserver) e RME (hampusborgos/rme).
se você não usa estes repositórios, é necessário algumas adaptações.
Zone System é excelente para eventos, boss rooms, quests, sistemas envolvendo grandes áreas, verificações de zona, bloqueio de entrada em áreas e outros.
Próxima atualização: fazer o Zone System servir café, porque todo o resto ele já faz :D



