/*
* 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.restrictions;
import com.aionemu.gameserver.model.gameobjects.Creature;
import com.aionemu.gameserver.model.gameobjects.Monster;
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.state.CreatureState;
import com.aionemu.gameserver.model.group.PlayerGroup;
import com.aionemu.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE;
import com.aionemu.gameserver.skillengine.effect.EffectId;
import com.aionemu.gameserver.skillengine.model.Skill;
import com.aionemu.gameserver.skillengine.model.SkillType;
import com.aionemu.gameserver.utils.PacketSendUtility;
/**
* @author lord_rex
*
*/
public class PlayerRestrictions extends AbstractRestrictions
{
@Override
public boolean canAffectBySkill(Player player, VisibleObject target)
{
if(((Creature) target).getLifeStats().isAlreadyDead()
&& !player.getCastingSkill().getSkillTemplate().hasResurrectEffect())
{
PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.INVALID_TARGET());
return false;
}
if(player.getEffectController().isAbnormalState(EffectId.CANT_ATTACK_STATE))
return false;
if(player.isInState(CreatureState.RESTING) || player.isInState(CreatureState.PRIVATE_SHOP))
return false;
return true;
}
@Override
public boolean canUseSkill(Player player, Skill skill)
{
// check if is casting to avoid multicast exploit
// TODO cancel skill if other is used
if(player.isCasting())
return false;
if(!player.canAttack())
return false;
if(skill.getSkillTemplate().getType() == SkillType.MAGICAL
&& player.getEffectController().isAbnoramlSet(EffectId.SILENCE))
return false;
if(skill.getSkillTemplate().getType() == SkillType.PHYSICAL
&& player.getEffectController().isAbnoramlSet(EffectId.BLOCKADE))
return false;
return true;
}
@Override
public boolean canInviteToGroup(Player player, Player target)
{
final PlayerGroup group = player.getPlayerGroup();
if(group != null && group.isFull())
{
PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.FULL_GROUP());
return false;
}
else if(group != null && player.getObjectId() != group.getGroupLeader().getObjectId())
{
PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.ONLY_GROUP_LEADER_CAN_INVITE());
return false;
}
else if(target == null)
{
PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.INVITED_PLAYER_OFFLINE());
return false;
}
else if(target.getCommonData().getRace() != player.getCommonData().getRace())
{
PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.CANT_INVITE_OTHER_RACE());
return false;
}
else if(target.sameObjectId(player.getObjectId()))
{
PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.CANNOT_INVITE_YOURSELF());
return false;
}
else if(target.getLifeStats().isAlreadyDead())
{
PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.SELECTED_TARGET_DEAD());
return false;
}
else if(player.getLifeStats().isAlreadyDead())
{
PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.CANNOT_INVITE_BECAUSE_YOU_DEAD());
return false;
}
else if(target.getPlayerGroup() != null)
{
PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.PLAYER_IN_ANOTHER_GROUP(target.getName()));
return false;
}
return true;
}
@Override
public boolean canAttack(Player player, VisibleObject target)
{
if(target == null)
return false;
if(!(target instanceof Creature))
return false;
Creature creature = (Creature) target;
if(creature.getLifeStats().isAlreadyDead())
return false;
if(creature instanceof Monster)
return true;
if(creature instanceof Npc)
{
Npc npc = (Npc) creature;
if(!npc.isAggressiveTo(player.getCommonData().getRace()))
return false;
}
return true;
}
@Override
public boolean canUseWarehouse(Player player)
{
if(player == null || !player.isOnline())
return false;
//TODO retail message to requestor and player
if(player.isTrading())
return false;
return true;
}
@Override
public boolean canTrade(Player player)
{
if(player == null || !player.isOnline())
return false;
//TODO retail message to requestor and player
if(player.isTrading())
return false;
return true;
}
}