/*******************************************************************************
* Copyright 2014 Tobias Welther
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package de.tobiyas.racesandclasses.eventprocessing.eventresolvage.resolvers;
import org.bukkit.Material;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.Projectile;
import org.bukkit.event.Event;
import org.bukkit.event.block.Action;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.entity.EntityTargetEvent;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.inventory.ItemStack;
import de.tobiyas.racesandclasses.eventprocessing.eventresolvage.PlayerAction;
import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayer;
import de.tobiyas.racesandclasses.playermanagement.player.RaCPlayerManager;
import de.tobiyas.racesandclasses.util.bukkit.versioning.compatibility.CompatibilityModifier;
public class EventActionResolver {
/**
* Resolves an action from the event passed.
*
* @param event to resolve
* @param player the player involved
*
* @return the resolved Action
*/
public static PlayerAction resolveAction(Event event, Player player){
RaCPlayer racPlayer = RaCPlayerManager.get().getPlayer(player);
if(event instanceof PlayerInteractEntityEvent){
return PlayerAction.INTERACT_ENTITY;
}
if(event instanceof PlayerInteractEvent){
//check player change spell first
ItemStack itemInHands = ((PlayerInteractEvent) event).getItem();
if(racPlayer.getSpellManager().isWandItem(itemInHands)){
if(((PlayerInteractEvent) event).getAction() == Action.RIGHT_CLICK_BLOCK
|| ((PlayerInteractEvent) event).getAction() == Action.RIGHT_CLICK_AIR){
return PlayerAction.CHANGE_SPELL;
}
if(((PlayerInteractEvent) event).getAction() == Action.LEFT_CLICK_BLOCK
|| ((PlayerInteractEvent) event).getAction() == Action.LEFT_CLICK_AIR){
return PlayerAction.CAST_SPELL;
}
}
//check if player changes Arrow second.
if(itemInHands != null && itemInHands.getType() == Material.BOW){
if(((PlayerInteractEvent) event).getAction() == Action.LEFT_CLICK_BLOCK
|| ((PlayerInteractEvent) event).getAction() == Action.LEFT_CLICK_AIR){
return PlayerAction.CHANGE_ARROW;
}
}
if(((PlayerInteractEvent) event).getAction() == Action.RIGHT_CLICK_BLOCK){
return PlayerAction.INTERACT_BLOCK;
}
if(((PlayerInteractEvent) event).getAction() == Action.LEFT_CLICK_BLOCK){
return PlayerAction.HIT_BLOCK;
}
if(((PlayerInteractEvent) event).getAction() == Action.LEFT_CLICK_AIR){
return PlayerAction.HIT_AIR;
}
if(((PlayerInteractEvent) event).getAction() == Action.RIGHT_CLICK_AIR){
return PlayerAction.INTERACT_AIR;
}
}
if(event instanceof EntityDamageEvent){
if(((EntityDamageEvent) event).getEntity() == player){
return PlayerAction.TAKE_DAMAGE;
}
}
if(event instanceof EntityDamageByEntityEvent){
EntityDamageByEntityEvent damageEvent = (EntityDamageByEntityEvent) event;
if(damageEvent.getDamager() == player){
return PlayerAction.DO_DAMAGE;
}
if(damageEvent.getDamager() instanceof Projectile){
Projectile projectile = (Projectile) damageEvent.getDamager();
LivingEntity shooter = CompatibilityModifier.Shooter.getShooter(projectile);
if(shooter instanceof Player){
return PlayerAction.DO_DAMAGE;
}
}
}
if(event instanceof PlayerMoveEvent){
return PlayerAction.PLAYER_MOVED;
}
if(event instanceof EntityTargetEvent){
if(((EntityTargetEvent) event).getTarget() == player){
return PlayerAction.PLAYER_TARGETED;
}
}
//No player action involved
return PlayerAction.NONE;
}
}