/*
* 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.controllers;
import java.util.Collection;
import java.util.Collections;
import org.apache.log4j.Logger;
import com.aionemu.gameserver.configs.main.CustomConfig;
import com.aionemu.gameserver.dataholders.PortalData;
import com.aionemu.gameserver.model.gameobjects.Creature;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.model.group.PlayerGroup;
import com.aionemu.gameserver.model.templates.portal.ExitPoint;
import com.aionemu.gameserver.model.templates.portal.PortalTemplate;
import com.aionemu.gameserver.network.aion.serverpackets.SM_EMOTION;
import com.aionemu.gameserver.network.aion.serverpackets.SM_USE_OBJECT;
import com.aionemu.gameserver.services.InstanceService;
import com.aionemu.gameserver.utils.PacketSendUtility;
import com.aionemu.gameserver.utils.ThreadPoolManager;
import com.aionemu.gameserver.world.WorldMap;
import com.aionemu.gameserver.world.WorldMapInstance;
import com.google.inject.Inject;
/**
* @author ATracer
*
*/
public class PortalController extends NpcController
{
private static final Logger log = Logger.getLogger(PortalController.class);
@Inject
private PortalData portalData;
@Inject
private InstanceService instanceService;
private PortalTemplate portalTemplate;
@Override
public void setOwner(Creature owner)
{
super.setOwner(owner);
portalTemplate = portalData.getPortalTemplate(owner.getObjectTemplate().getTemplateId());
}
@Override
public void onDialogRequest(final Player player)
{
if(portalTemplate == null)
return;
if(!CustomConfig.ENABLE_INSTANCES)
return;
final int defaultUseTime = 3000;
PacketSendUtility.sendPacket(player, new SM_USE_OBJECT(player.getObjectId(), getOwner().getObjectId(),
defaultUseTime, 1));
PacketSendUtility.broadcastPacket(player, new SM_EMOTION(player, 37, 0, getOwner().getObjectId()), true);
ThreadPoolManager.getInstance().schedule(new Runnable(){
@Override
public void run()
{
PacketSendUtility.sendPacket(player, new SM_USE_OBJECT(player.getObjectId(), getOwner().getObjectId(),
defaultUseTime, 0));
analyzePortation(player);
}
/**
* @param player
*/
private void analyzePortation(final Player player)
{
if(portalTemplate.getRace() != null && !portalTemplate.getRace().equals(player.getCommonData().getRace()))
{
PacketSendUtility.sendMessage(player, "You cannot use this portal because race doesn't match");
return;
}
PlayerGroup group = player.getPlayerGroup();
if(portalTemplate.isGroup() && group != null)
{
WorldMapInstance instance = instanceService.getRegisteredInstance(portalTemplate.getExitPoint()
.getMapId(), group.getGroupId());
// if already registered - just teleport
if(instance != null)
{
transfer(player, instance);
return;
}
portGroup(player);
}
else if(!portalTemplate.isGroup())
{
WorldMapInstance instance = instanceService.getRegisteredInstance(portalTemplate.getExitPoint()
.getMapId(), player.getObjectId());
// if already registered - just teleport
if(instance != null)
{
transfer(player, instance);
return;
}
port(player);
}
}
}, defaultUseTime);
}
/**
* @param player
*/
private void port(Player requester)
{
Collection<Player> players = Collections.singletonList(requester);
if(!checkPlayersLevel(players))
return;
WorldMapInstance instance = null;
int worldId = portalTemplate.getExitPoint().getMapId();
if(portalTemplate.isInstance())
{
instance = instanceService.getNextAvailableInstance(worldId);
instanceService.registerPlayerWithInstance(instance, requester);
}
else
{
WorldMap worldMap = sp.getWorld().getWorldMap(worldId);
if(worldMap == null)
{
log.warn("There is no registered map with id " + worldId);
return;
}
instance = worldMap.getWorldMapInstance();
}
transfer(requester, instance);
}
/**
* @param player
*/
private void portGroup(Player requester)
{
PlayerGroup group = requester.getPlayerGroup();
if(group == null || group.getGroupLeader().getObjectId() != requester.getObjectId())
{
PacketSendUtility.sendMessage(requester, "You are not group leader");
return;
}
Collection<Player> players = group.getMembers();
if(!checkPlayersLevel(players))
return;
WorldMapInstance instance = instanceService.getNextAvailableInstance(portalTemplate.getExitPoint().getMapId());
instanceService.registerGroupWithInstance(instance, group);
for(Player player : players)
{
transfer(player, instance);
}
}
/**
* @param players
*/
private void transfer(Player player, WorldMapInstance instance)
{
ExitPoint exitPoint = portalTemplate.getExitPoint();
sp.getTeleportService().teleportTo(player, exitPoint.getMapId(), instance.getInstanceId(),
exitPoint.getX(), exitPoint.getY(), exitPoint.getZ(), 0);
}
/**
*
* @param players
* @return
*/
private boolean checkPlayersLevel(Collection<Player> players)
{
int minLevel = portalTemplate.getMinLevel();
int maxLevel = portalTemplate.getMaxLevel();
for(Player player : players)
{
int playerLevel = player.getLevel();
if(playerLevel > maxLevel || playerLevel < minLevel)
return false;
}
return true;
}
}