Skip to content

Instantly share code, notes, and snippets.

@lyuz1n
Last active July 20, 2023 21:10
Show Gist options
  • Select an option

  • Save lyuz1n/ed86de18164047f3e1ff2c7110d18913 to your computer and use it in GitHub Desktop.

Select an option

Save lyuz1n/ed86de18164047f3e1ff2c7110d18913 to your computer and use it in GitHub Desktop.

Zone System

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

011


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.


Lua Métodos e Eventos

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

Podemos usar para grandes Áreas e Quests

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:

009

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

Criaturas e Condições

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
end

010 002


Para 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

Discord: lyu07

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment