/*******************************************************************************
* 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.entity.AnimalTamer;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
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.BlockBreakEvent;
import org.bukkit.event.block.BlockDamageEvent;
import org.bukkit.event.block.BlockEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityEvent;
import org.bukkit.event.entity.EntityTameEvent;
import org.bukkit.event.entity.PlayerLeashEntityEvent;
import org.bukkit.event.entity.ProjectileHitEvent;
import org.bukkit.event.entity.ProjectileLaunchEvent;
import org.bukkit.event.inventory.InventoryEvent;
import org.bukkit.event.inventory.InventoryMoveItemEvent;
import org.bukkit.event.inventory.InventoryPickupItemEvent;
import org.bukkit.event.player.PlayerEvent;
import org.bukkit.event.vehicle.VehicleEnterEvent;
import org.bukkit.event.vehicle.VehicleEntityCollisionEvent;
import org.bukkit.event.vehicle.VehicleEvent;
import org.bukkit.event.vehicle.VehicleExitEvent;
import de.tobiyas.racesandclasses.eventprocessing.events.chatevent.PlayerSendChannelChatMessageEvent;
import de.tobiyas.racesandclasses.eventprocessing.events.holderevent.HolderSelectedEvent;
import de.tobiyas.racesandclasses.eventprocessing.events.leveling.LevelEvent;
import de.tobiyas.racesandclasses.eventprocessing.events.traittrigger.PostTraitTriggerEvent;
import de.tobiyas.racesandclasses.util.bukkit.versioning.CertainVersionChecker;
import de.tobiyas.racesandclasses.util.bukkit.versioning.compatibility.CompatibilityModifier;
public class EventPlayerResolver {
/**
* Resolves a player to the Player wanted
*
* @param event to resolve
* @return
*/
public static Player resolvePlayer(Event event){
//block events like place / break
if(event instanceof BlockEvent){
if(event instanceof BlockPlaceEvent){
return ((BlockPlaceEvent) event).getPlayer();
}
if(event instanceof BlockBreakEvent){
return ((BlockBreakEvent) event).getPlayer();
}
if(event instanceof BlockDamageEvent){
return ((BlockDamageEvent) event).getPlayer();
}
}
//Projectile events.
//We need to get the shooter.
if(event instanceof ProjectileHitEvent){
ProjectileHitEvent launchEvent = (ProjectileHitEvent) event;
LivingEntity shooter = CompatibilityModifier.Shooter.getShooter(launchEvent.getEntity());
if(shooter instanceof Player) return (Player) shooter;
}
if(event instanceof ProjectileLaunchEvent){
ProjectileLaunchEvent launchEvent = (ProjectileLaunchEvent) event;
LivingEntity shooter = CompatibilityModifier.Shooter.getShooter(launchEvent.getEntity());
if(shooter instanceof Player) return (Player) shooter;
}
//check if any projectile
if(event instanceof EntityDamageByEntityEvent){
EntityDamageByEntityEvent damageEvent = (EntityDamageByEntityEvent) event;
Entity damager = damageEvent.getDamager();
if(damager instanceof Player) return (Player) damager;
if(damager instanceof Projectile){
LivingEntity shooter = CompatibilityModifier.Shooter.getShooter((Projectile) damager);
if(shooter != null && shooter instanceof Player){
return (Player) shooter;
}
}
}
if(event instanceof EntityTameEvent){
EntityTameEvent tameEvent = (EntityTameEvent) event;
AnimalTamer owner = tameEvent.getOwner();
if(owner instanceof Player) return (Player) owner;
}
if(event instanceof EntityEvent){
EntityEvent entityEvent = (EntityEvent) event;
if(entityEvent.getEntityType() == EntityType.PLAYER){
return (Player) entityEvent.getEntity();
}
}
if(event instanceof InventoryEvent){
InventoryEvent inventoryEvent = (InventoryEvent) event;
if(inventoryEvent.getInventory().getHolder() instanceof Player){
return (Player) inventoryEvent.getInventory().getHolder();
}
}
if(event instanceof InventoryMoveItemEvent){
InventoryMoveItemEvent inventoryMoveItemEvent = (InventoryMoveItemEvent) event;
if(inventoryMoveItemEvent.getSource().getHolder() instanceof Player){
return (Player) inventoryMoveItemEvent.getSource().getHolder();
}
}
if(event instanceof InventoryPickupItemEvent){
InventoryPickupItemEvent pickupItemEvent = (InventoryPickupItemEvent) event;
if(pickupItemEvent.getInventory().getHolder() instanceof Player){
return (Player) pickupItemEvent.getInventory().getHolder();
}
}
if(event instanceof PlayerEvent){
return ((PlayerEvent) event).getPlayer();
}
if(CertainVersionChecker.isAbove1_6()){
if(event instanceof PlayerLeashEntityEvent){
return ((PlayerLeashEntityEvent) event).getPlayer();
}
}
if(event instanceof PlayerSendChannelChatMessageEvent){
return ((PlayerSendChannelChatMessageEvent) event).getPlayer();
}
if(event instanceof VehicleEvent){
if(event instanceof VehicleEntityCollisionEvent){
VehicleEntityCollisionEvent vecevent = (VehicleEntityCollisionEvent) event;
if(vecevent.getEntity() instanceof Player){
return (Player) vecevent.getEntity();
}
}
if(event instanceof VehicleEnterEvent){
VehicleEnterEvent vehicleEnterEvent = (VehicleEnterEvent) event;
if(vehicleEnterEvent.getEntered() instanceof Player){
return (Player) vehicleEnterEvent.getEntered();
}
}
if(event instanceof VehicleExitEvent){
VehicleExitEvent vehicleExitEvent = (VehicleExitEvent) event;
if(vehicleExitEvent.getExited() instanceof Player){
return (Player) vehicleExitEvent.getExited();
}
}
}
//RaC-Plugin Events:
if(event instanceof LevelEvent){
return ((LevelEvent) event).getPlayer();
}
if(event instanceof HolderSelectedEvent){
return ((HolderSelectedEvent) event).getPlayer();
}
if(event instanceof PlayerSendChannelChatMessageEvent){
return ((PlayerSendChannelChatMessageEvent)event).getPlayer();
}
if(event instanceof PostTraitTriggerEvent){
return null; //This can not be interesting for a Trait.
}
return null;
}
public static boolean isArrowInvolved(Event event) {
//check if any projectile
if(event instanceof EntityDamageByEntityEvent){
EntityDamageByEntityEvent damageEvent = (EntityDamageByEntityEvent) event;
Entity damager = damageEvent.getDamager();
if(damager instanceof Projectile){
LivingEntity shooter = CompatibilityModifier.Shooter.getShooter((Projectile) damager);
if(shooter != null && shooter instanceof Player){
return true;
}
}
}
return false;
}
}