Duplicate this and duplicate that.
This commit is contained in:
		
							parent
							
								
									504e8d16d8
								
							
						
					
					
						commit
						6a1a57ccdc
					
				| @ -8,12 +8,16 @@ import java.util.concurrent.ConcurrentSkipListSet; | ||||
| 
 | ||||
| import org.bukkit.Bukkit; | ||||
| import org.bukkit.GameMode; | ||||
| import org.bukkit.entity.Entity; | ||||
| import org.bukkit.entity.Player; | ||||
| import org.bukkit.event.EventHandler; | ||||
| import org.bukkit.event.EventPriority; | ||||
| import org.bukkit.event.entity.EntityDamageByEntityEvent; | ||||
| import org.bukkit.event.entity.EntityDamageEvent; | ||||
| import org.bukkit.event.entity.PlayerDeathEvent; | ||||
| import org.bukkit.event.entity.EntityDamageEvent.DamageCause; | ||||
| import org.bukkit.event.player.PlayerAnimationEvent; | ||||
| import org.bukkit.event.player.PlayerAnimationType; | ||||
| import org.bukkit.event.player.PlayerChangedWorldEvent; | ||||
| import org.bukkit.event.player.PlayerJoinEvent; | ||||
| import org.bukkit.event.player.PlayerMoveEvent; | ||||
| @ -44,7 +48,9 @@ public class PlayerUtil extends EngineAbstract | ||||
| 	{ | ||||
| 		super.activate(); | ||||
| 		 | ||||
| 		idToDeath.clear(); | ||||
| 		idToDeathEvent.clear(); | ||||
| 		idToDamageEvent.clear(); | ||||
| 		idToArmSwingEvent.clear(); | ||||
| 		 | ||||
| 		joinedPlayerIds.clear(); | ||||
| 		for (Player player : Bukkit.getOnlinePlayers()) | ||||
| @ -61,6 +67,20 @@ public class PlayerUtil extends EngineAbstract | ||||
| 		return MCore.get(); | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public Long getPeriod() | ||||
| 	{ | ||||
| 		return 1L; | ||||
| 	} | ||||
| 	 | ||||
| 	@Override | ||||
| 	public void run() | ||||
| 	{ | ||||
| 		idToDeathEvent.clear(); | ||||
| 		idToDamageEvent.clear(); | ||||
| 		idToArmSwingEvent.clear(); | ||||
| 	} | ||||
| 	 | ||||
| 	// -------------------------------------------- // | ||||
| 	// IS JOINED | ||||
| 	// -------------------------------------------- // | ||||
| @ -160,32 +180,23 @@ public class PlayerUtil extends EngineAbstract | ||||
| 	// Some times when players die the PlayerDeathEvent is fired twice. | ||||
| 	// We want to ignore the extra calls. | ||||
| 	 | ||||
| 	private static Map<UUID, PlayerDeathEvent> idToDeath = new HashMap<UUID, PlayerDeathEvent>(); | ||||
| 	private static Map<UUID, PlayerDeathEvent> idToDeathEvent = new HashMap<UUID, PlayerDeathEvent>(); | ||||
| 	 | ||||
| 	public static boolean isDuplicateDeathEvent(PlayerDeathEvent event) | ||||
| 	{ | ||||
| 		// Prepare the lowercase name ... | ||||
| 		// Get the id ... | ||||
| 		final UUID id = event.getEntity().getUniqueId(); | ||||
| 		 | ||||
| 		// ... take a look at the currently stored event ... | ||||
| 		PlayerDeathEvent current = idToDeath.get(id); | ||||
| 		// ... get current ... | ||||
| 		PlayerDeathEvent current = idToDeathEvent.get(id); | ||||
| 		 | ||||
| 		if (current != null) return !current.equals(event); | ||||
| 		// ... object equality ... | ||||
| 		if (current != null) return current != event; | ||||
| 		 | ||||
| 		// ... otherwise store ...  | ||||
| 		idToDeath.put(id, event); | ||||
| 		// ... store ...  | ||||
| 		idToDeathEvent.put(id, event); | ||||
| 		 | ||||
| 		// ... schedule removal ... | ||||
| 		Bukkit.getScheduler().scheduleSyncDelayedTask(MCore.get(), new Runnable() | ||||
| 		{ | ||||
| 			@Override | ||||
| 			public void run() | ||||
| 			{ | ||||
| 				idToDeath.remove(id); | ||||
| 			} | ||||
| 		}); | ||||
| 		 | ||||
| 		// ... and return the fact that it was not a duplicate. | ||||
| 		// ... and return. | ||||
| 		return false; | ||||
| 	} | ||||
| 	 | ||||
| @ -195,6 +206,75 @@ public class PlayerUtil extends EngineAbstract | ||||
| 		isDuplicateDeathEvent(event); | ||||
| 	} | ||||
| 	 | ||||
| 	// -------------------------------------------- // | ||||
| 	// DUPLICATE DAMAGE EVENT | ||||
| 	// -------------------------------------------- // | ||||
| 	// An entity damage by entity event is considered to be a duplicate if the damager already damaged the damagee this tick. | ||||
| 	 | ||||
| 	private static Map<String, EntityDamageByEntityEvent> idToDamageEvent = new HashMap<String, EntityDamageByEntityEvent>(); | ||||
| 	 | ||||
| 	public static boolean isDuplicateDamageEvent(EntityDamageByEntityEvent event) | ||||
| 	{ | ||||
| 		// Get the id ... | ||||
| 		Entity damager = MUtil.getLiableDamager(event); | ||||
| 		Entity damagee = event.getEntity(); | ||||
| 		if (damager == null) return false; | ||||
| 		if (damagee == null) return false; | ||||
| 		final String id = damager.getUniqueId().toString() + damagee.getUniqueId().toString(); | ||||
| 		 | ||||
| 		// ... get current ... | ||||
| 		EntityDamageByEntityEvent current = idToDamageEvent.get(id); | ||||
| 		 | ||||
| 		// ... object equality ... | ||||
| 		if (current != null) return current != event; | ||||
| 		 | ||||
| 		// ... store ...  | ||||
| 		idToDamageEvent.put(id, event); | ||||
| 		 | ||||
| 		// ... and return. | ||||
| 		return false; | ||||
| 	} | ||||
| 	 | ||||
| 	@EventHandler(priority = EventPriority.LOWEST) | ||||
| 	public void isDuplicateDamageEventLowest(EntityDamageByEntityEvent event) | ||||
| 	{ | ||||
| 		isDuplicateDamageEvent(event); | ||||
| 	} | ||||
| 	 | ||||
| 	// -------------------------------------------- // | ||||
| 	// DUPLICATE ARM SWING | ||||
| 	// -------------------------------------------- // | ||||
| 	// An entity damage by entity event is considered to be a duplicate if the damager already damaged the damagee this tick. | ||||
| 	 | ||||
| 	private static Map<UUID, PlayerAnimationEvent> idToArmSwingEvent = new HashMap<UUID, PlayerAnimationEvent>(); | ||||
| 	 | ||||
| 	public static boolean isDuplicateArmSwingEvent(PlayerAnimationEvent event) | ||||
| 	{ | ||||
| 		// Must be arm swing ... | ||||
| 		if (event.getAnimationType() != PlayerAnimationType.ARM_SWING) return false; | ||||
| 		 | ||||
| 		// Get the id ... | ||||
| 		final UUID id = event.getPlayer().getUniqueId(); | ||||
| 		 | ||||
| 		// ... get current ... | ||||
| 		PlayerAnimationEvent current = idToArmSwingEvent.get(id); | ||||
| 		 | ||||
| 		// ... object equality ... | ||||
| 		if (current != null) return current != event; | ||||
| 		 | ||||
| 		// ... store ...  | ||||
| 		idToArmSwingEvent.put(id, event); | ||||
| 		 | ||||
| 		// ... and return. | ||||
| 		return false; | ||||
| 	} | ||||
| 	 | ||||
| 	@EventHandler(priority = EventPriority.LOWEST) | ||||
| 	public void isDuplicateArmSwingEventLowest(PlayerAnimationEvent event) | ||||
| 	{ | ||||
| 		isDuplicateArmSwingEvent(event); | ||||
| 	} | ||||
| 	 | ||||
| 	// -------------------------------------------- // | ||||
| 	// PACKET | ||||
| 	// -------------------------------------------- // | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user