/* * This file is part of aion-unique <aion-unique.org>. * * aion-unique is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * aion-unique is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with aion-unique. If not, see <http://www.gnu.org/licenses/>. */ package com.aionemu.gameserver.dataholders; import gnu.trove.TIntObjectHashMap; import java.util.ArrayList; import java.util.List; import javax.xml.bind.Unmarshaller; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlTransient; import com.aionemu.gameserver.model.templates.spawn.SpawnGroup; import com.aionemu.gameserver.model.templates.spawn.SpawnTemplate; /** * @author ATracer * */ @XmlRootElement(name = "spawns") @XmlAccessorType(XmlAccessType.FIELD) public class SpawnsData { @XmlElement(name = "spawn") protected List<SpawnGroup> spawnGroups; //key is mapid @XmlTransient private TIntObjectHashMap<ArrayList<SpawnGroup>> spawnsByMapId = new TIntObjectHashMap<ArrayList<SpawnGroup>>(); //key is npcid @XmlTransient private TIntObjectHashMap<ArrayList<SpawnGroup>> spawnsByNpcID = new TIntObjectHashMap<ArrayList<SpawnGroup>>(); //key is mapid @XmlTransient private TIntObjectHashMap<ArrayList<SpawnGroup>> spawnsByMapIdNew = new TIntObjectHashMap<ArrayList<SpawnGroup>>(); @XmlTransient private int counter = 0; void afterUnmarshal(Unmarshaller u, Object parent) { spawnsByMapId.clear(); spawnsByMapIdNew.clear(); spawnsByNpcID.clear(); for(SpawnGroup spawnGroup : spawnGroups) { //set parent spawnGroup for each spawn object for(SpawnTemplate template : spawnGroup.getObjects()) { template.setSpawnGroup(spawnGroup); } addNewSpawnGroup(spawnGroup, spawnGroup.getMapid(), spawnGroup.getNpcid(), false); counter += spawnGroup.getObjects().size(); } spawnGroups = null; } /** * Will return one of possible spawns for this npcid * Used in quick location of objects * * @param npcId * @return SpawnTemplate */ public SpawnTemplate getFirstSpawnByNpcId(int npcId) { List<SpawnGroup> spawnGroups = spawnsByNpcID.get(npcId); if(spawnGroups == null) return null; for(SpawnGroup spawnGroup : spawnGroups) { if(spawnGroup.getObjects() != null) { return spawnGroup.getObjects().get(0); } } return null; } public List<SpawnGroup> getSpawnsForWorld(int worldId) { return spawnsByMapId.get(worldId); } public List<SpawnGroup> getNewSpawnsForWorld(int worldId) { return spawnsByMapIdNew.get(worldId); } /** * @return counter */ public int size() { return counter; } /** * All new spawns have following structure : 1 SpawnGroup with 1 Object (pool=1) * Used only with admin command * * @param spawnTemplate * @param worldId */ public void addNewSpawnGroup(SpawnGroup spawnGroup, int worldId, int npcId, boolean isNew) { //put to map spawns ArrayList<SpawnGroup> mapSpawnGroups = spawnsByMapId.get(worldId); if(mapSpawnGroups == null) { mapSpawnGroups = new ArrayList<SpawnGroup>(); spawnsByMapId.put(worldId, mapSpawnGroups); } mapSpawnGroups.add(spawnGroup); //put to npcid spawns ArrayList<SpawnGroup> npcIdSpawnGroups = spawnsByNpcID.get(npcId); if(npcIdSpawnGroups == null) { npcIdSpawnGroups = new ArrayList<SpawnGroup>(); spawnsByNpcID.put(npcId, npcIdSpawnGroups); } npcIdSpawnGroups.add(spawnGroup); //put to new map spawns if(isNew) { //put to map spawns ArrayList<SpawnGroup> mapNewSpawnGroups = spawnsByMapIdNew.get(worldId); if(mapNewSpawnGroups == null) { mapNewSpawnGroups = new ArrayList<SpawnGroup>(); spawnsByMapIdNew.put(worldId, mapNewSpawnGroups); } mapNewSpawnGroups.add(spawnGroup); } } /** * @param spawn */ public void removeSpawn(SpawnTemplate spawn) { if(spawn.getSpawnGroup().size() > 1) { spawn.getSpawnGroup().getObjects().remove(spawn); return; } List<SpawnGroup> worldSpawns = spawnsByMapId.get(spawn.getWorldId()); if(worldSpawns != null) { worldSpawns.remove(spawn.getSpawnGroup()); } List<SpawnGroup> worldNewSpawns = spawnsByMapIdNew.get(spawn.getWorldId()); if(worldNewSpawns != null) { worldNewSpawns.remove(spawn.getSpawnGroup()); } List<SpawnGroup> spawnsByNpc = spawnsByNpcID.get(spawn.getSpawnGroup().getNpcid()); if(spawnsByNpc != null) { spawnsByNpc.remove(spawn.getSpawnGroup()); } } /** * * Don't use this method from core functionality * Used only while marshalling spawns to a file * * @return the spawnGroups */ public List<SpawnGroup> getSpawnGroups() { if(spawnGroups == null) spawnGroups = new ArrayList<SpawnGroup>(); return spawnGroups; } /** * Used while reloadin of spawns from XML * * @param spawns */ public void setSpawns(List<SpawnGroup> spawns) { this.spawnGroups = spawns; afterUnmarshal(null, null); } }