Antes de qualquer coisa, vou deixar dito aqui que eu posso ter entendido alguma coisa errada (tanto na sua explicação quanto no funcionamento do script). Mas vamos lá.
DadoCWB comentou:
3) O problema é que $dataMap.events.length me da um valor como ser aqueles eventos ainda estivessem ali. Diferentemente de $gameMap.events().length .
1.
$dataMap.events e
$gameMap._events são duas coisas diferentes. Pelo que vi no código do
rpg_objects.js, o primeiro é usado pra popular o segundo, o segundo então sendo acessado pela função
events() da
$gameMap;
O primeiro (dataMap.events) começa a contagem dos eventos a partir do 1, ou seja, o primeiro valor (index 0) vai ser sempre null. Além disso, aparentemente os ultimos 2 valores serão null também.
Num mapa com 2 eventos, a estrutura da array será mais ou menos
Código:
$dataMap.events = (5) [
]?
0: null?
1: Object { id: 1, name: "EV001", x: 8,
}?
2: Object { id: 2, name: "EV002", x: 5,
}?
3: null?
4: null?
length: 5
No retorno do segundo ($gameMap.events()), a contagem começa normalmente do 0 e acaba no ultimo evento do mapa, ou seja, se o mapa tiver 2 eventos, ele terá 2 entradas.
Outra diferença do
$gameMap.events() é ele não ser mapeado pelo ID do evento.
Num mapa com 2 eventos, a estrutura da array que a função retorna será mais ou menos
Código:
$dataMap.events() = (2) [
]?
0: Object { _x: 8, _y: 4, _realX: 8,
}?
1: Object { _x: 5, _y: 4, _realX: 5,
}?
length: 2
Um extra: A variável
$gameMap tem uma propriedade chamada
_events que é uma array com os eventos do mapa (a mesma retornada pela função ai de cima), porém, algo curioso em relação à essa array, é que se você acessar ela direto você terá acesso à mesma estrutura de cima
porém ordenada pelo ID do evento.
Num mapa com 2 eventos, a estrutura dessa propriedade será mais ou menos
Código:
$gameMap._events = (3) [
]?
1: Object { _x: 8, _y: 4, _realX: 8,
}?
2: Object { _x: 5, _y: 4, _realX: 5,
}?
length: 3
Percebe que a propriedade
length dessa array é 3 mesmo que ela só liste 2 itens?
PS: O valor na posição 0 é igual a
undefined.
DadoCWB comentou:
4) Se eu voltar a copiar um evento para este mesmo mapa.. A nova ID dele será uma ID "irreal" que não reflete o numero de eventos que possui no mapa. A ID toma por base TODOS os eventos que já foram copiados para o mapa.
Eu não sei como funciona o código do plugin dele porém essa ID "irreral" que você se refere na verdade parece ser a ID real do evento. Se o plugin não apaga os eventos da
gameMap, eles continuarão sendo incluídos no mapa.
Aparentemente não tem como apagar um evento da
dataMap. A
gameMap tem uma função
eraseEvent() mas ela na verdade só muda o pageIndex do evento pra -1 e muda algumas de suas propriedades (remove imagem, torna o evento "passável", etc...). Com esse pageIndex de -1, o evento de torna inútil mas aparentemente continua nas arrays citadas acima.
Resumo:
gameMap.events() reflete realmente a quantidade de eventos no mapa, visíveis ou não.
gameMap._events retorna os eventos do mapa com o index incrementado em 1 (na mesma ordem de seus IDs).
dataMap.events reflete a quantidade de eventos do mapa (criados ou não) e é usado na hora de criar os eventos do mapa (então armazenados em
gameMap._events). Tem o seu primeiro valor nulo pra compensar o ID dos eventos além de outros dois valores nulos no final, por algum motivo ¯\_(?)_/¯
DadoCWB comentou:
5) Minha duvida então é:
a) Como que posso dar respawn nesses eventos ao voltar pro mapa?
b) Como deletar esses eventos do $dataMap quando eu "saio" do mapa.
a) Utilize a função
setupEvents() da
$gameMap e recarrega o mapa. Qualquer evento apagado porém ainda listado entre os eventos do mapa será "respawnado".
b)
Aparentemente não existe uma forma nativa de se apagar um evento do
$dataMap. É possível apagar o evento do mapa (
$gameMap) porém ele ainda seria listado entre os eventos, só não seria interagível.
No final, falei, falei, e não devo ter ajudado em nada kkkkk.
Enfim, se algo ajudou, de nada. Do contrário, perdão.