/*
* 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.Iterator;
import com.aionemu.gameserver.model.gameobjects.Creature;
import com.aionemu.gameserver.model.gameobjects.Npc;
import com.aionemu.gameserver.model.gameobjects.VisibleObject;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.model.gameobjects.player.RequestResponseHandler;
import com.aionemu.gameserver.model.templates.spawn.SpawnTemplate;
import com.aionemu.gameserver.network.aion.serverpackets.SM_QUESTION_WINDOW;
import com.aionemu.gameserver.network.aion.serverpackets.SM_RIFT_ANNOUNCE;
import com.aionemu.gameserver.network.aion.serverpackets.SM_RIFT_STATUS;
import com.aionemu.gameserver.spawnengine.RiftSpawnManager.RiftEnum;
import com.aionemu.gameserver.utils.PacketSendUtility;
import com.aionemu.gameserver.world.WorldMapInstance;
import com.google.inject.Inject;
import com.google.inject.assistedinject.Assisted;
import com.google.inject.internal.Nullable;
/**
* @author ATracer
*
*/
public class RiftController extends NpcController
{
private boolean isMaster = false;
private SpawnTemplate slaveSpawnTemplate;
private Npc slave;
private Integer maxEntries;
private Integer maxLevel;
private int usedEntries;
private boolean isAccepting;
private RiftEnum riftTemplate;
/**
* Used to create master rifts or slave rifts (slave == null)
*
* @param slaveSpawnTemplate
*/
@Inject
public RiftController(@Assisted @Nullable Npc slave, @Assisted RiftEnum riftTemplate)
{
this.riftTemplate = riftTemplate;
if(slave != null)//master rift should be created
{
this.slave = slave;
this.slaveSpawnTemplate = slave.getSpawn();
this.maxEntries = riftTemplate.getEntries();
this.maxLevel = riftTemplate.getMaxLevel();
isMaster = true;
isAccepting = true;
}
}
@Override
public void onDialogRequest(Player player)
{
if(!isMaster && !isAccepting)
return;
RequestResponseHandler responseHandler = new RequestResponseHandler(getOwner())
{
@Override
public void acceptRequest(Creature requester, Player responder)
{
if(!isAccepting)
return;
int worldId = slaveSpawnTemplate.getWorldId();
float x = slaveSpawnTemplate.getX();
float y = slaveSpawnTemplate.getY();
float z = slaveSpawnTemplate.getZ();
sp.getTeleportService().teleportTo(responder, worldId, x, y, z, 0);
usedEntries++;
if(usedEntries >= maxEntries)
{
isAccepting = false;
sp.getRespawnService().scheduleDecayTask(getOwner());
sp.getRespawnService().scheduleDecayTask(slave);
}
PacketSendUtility.broadcastPacket(getOwner(),
new SM_RIFT_STATUS(getOwner().getObjectId(), usedEntries, maxEntries, maxLevel));
}
@Override
public void denyRequest(Creature requester, Player responder)
{
//do nothing
}
};
boolean requested = player.getResponseRequester().putRequest(SM_QUESTION_WINDOW.STR_USE_RIFT, responseHandler);
if (requested)
{
PacketSendUtility.sendPacket(player, new SM_QUESTION_WINDOW(SM_QUESTION_WINDOW.STR_USE_RIFT, 0));
}
}
@Override
public void see(VisibleObject object)
{
if(!isMaster)
return;
if(object instanceof Player)
{
PacketSendUtility.sendPacket((Player) object,
new SM_RIFT_STATUS(getOwner().getObjectId(), usedEntries, maxEntries, maxLevel));
}
}
/**
* @param activePlayer
*/
public void sendMessage(Player activePlayer)
{
if(isMaster && getOwner().isSpawned())
PacketSendUtility.sendPacket(activePlayer, new SM_RIFT_ANNOUNCE(riftTemplate.getDestination()));
}
/**
*
*/
public void sendAnnounce()
{
if(isMaster && getOwner().isSpawned())
{
WorldMapInstance worldInstance = getOwner().getPosition().getMapRegion().getParent();
Iterator<Player> playerIterator = worldInstance.playerIterator();
while(playerIterator.hasNext())
{
Player player = playerIterator.next();
if(player.isSpawned())
{
sendMessage(player);
}
}
}
}
}