WALL DAMAGE

Added a method of tracking wall damage on entities. This is currently
used only for Airblast and Bloodbending, but includes Airburst as it is,
to my understanding, an array of Airblasts.
This commit is contained in:
Brendan Wilson 2015-02-02 14:37:13 -05:00
parent 20e02b130e
commit e9e07f4270
6 changed files with 203 additions and 134 deletions

View file

@ -1,16 +1,16 @@
package com.projectkorra.ProjectKorra;
import java.util.HashMap;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.entity.Player;
import com.projectkorra.ProjectKorra.Ability.AvatarState;
import com.projectkorra.ProjectKorra.Objects.HorizontalVelocityTracker;
import com.projectkorra.ProjectKorra.chiblocking.ChiComboManager;
import com.projectkorra.ProjectKorra.chiblocking.RapidPunch;
import com.projectkorra.rpg.RPGMethods;
import com.projectkorra.rpg.WorldEvents;
import org.bukkit.Bukkit;
import org.bukkit.World;
import org.bukkit.entity.Player;
import java.util.HashMap;
public class BendingManager implements Runnable {
@ -49,6 +49,7 @@ public class BendingManager implements Runnable {
RapidPunch.startPunchAll();
RevertChecker.revertAirBlocks();
ChiComboManager.handleParalysis();
HorizontalVelocityTracker.updateAll();
handleCooldowns();
} catch (Exception e) {
Methods.stopBending();

View file

@ -0,0 +1,74 @@
package com.projectkorra.ProjectKorra.Objects;
import com.projectkorra.ProjectKorra.ProjectKorra;
import com.projectkorra.ProjectKorra.Utilities.HorizontalVelocityChangeEvent;
import org.bukkit.entity.Entity;
import org.bukkit.util.Vector;
import java.util.concurrent.ConcurrentHashMap;
/**
* Created by Carbogen on 2/2/2015.
*/
public class HorizontalVelocityTracker
{
public static ConcurrentHashMap<Entity, HorizontalVelocityTracker> instances = new ConcurrentHashMap<Entity, HorizontalVelocityTracker>();
private long delay;
private long fireTime;
private Entity entity;
private Entity instigator;
private Vector lastVelocity;
private Vector thisVelocity;
public HorizontalVelocityTracker(Entity e, Entity instigator, long delay)
{
entity = e;
this.instigator = instigator;
fireTime = System.currentTimeMillis();
this.delay = delay;
thisVelocity = e.getVelocity();
this.delay = delay;
update();
instances.put(entity, this);
}
public void update()
{
if(System.currentTimeMillis() < fireTime + delay)
return;
lastVelocity = thisVelocity.clone();
thisVelocity = entity.getVelocity().clone();
Vector diff = thisVelocity.subtract(lastVelocity);
if(entity.isOnGround())
remove();
if((diff.getX() > 1 || diff.getX() < -1)
|| (diff.getZ() > 1 || diff.getZ() < -1))
{
ProjectKorra.plugin.getServer().getPluginManager().callEvent(new HorizontalVelocityChangeEvent(entity, instigator, lastVelocity, thisVelocity, diff));
remove();
return;
}
}
public static void updateAll()
{
for(Entity e : instances.keySet())
instances.get(e).update();
}
public void remove()
{
instances.remove(entity);
}
public static void remove(Entity e)
{
if(instances.containsKey(e))
instances.remove(e);
}
}

View file

@ -1,136 +1,41 @@
package com.projectkorra.ProjectKorra;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import com.projectkorra.ProjectKorra.Ability.AvatarState;
import com.projectkorra.ProjectKorra.ComboManager.ClickType;
import com.projectkorra.ProjectKorra.CustomEvents.PlayerGrappleEvent;
import com.projectkorra.ProjectKorra.Objects.Preset;
import com.projectkorra.ProjectKorra.Utilities.GrapplingHookAPI;
import com.projectkorra.ProjectKorra.Utilities.HorizontalVelocityChangeEvent;
import com.projectkorra.ProjectKorra.airbending.*;
import com.projectkorra.ProjectKorra.chiblocking.*;
import com.projectkorra.ProjectKorra.earthbending.*;
import com.projectkorra.ProjectKorra.earthbending.LavaFlow.AbilityType;
import com.projectkorra.ProjectKorra.firebending.*;
import com.projectkorra.ProjectKorra.firebending.Fireball;
import com.projectkorra.ProjectKorra.waterbending.*;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.Item;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.block.Action;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.event.block.BlockFadeEvent;
import org.bukkit.event.block.BlockFormEvent;
import org.bukkit.event.block.BlockFromToEvent;
import org.bukkit.event.block.BlockIgniteEvent;
import org.bukkit.event.block.BlockPhysicsEvent;
import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityChangeBlockEvent;
import org.bukkit.event.entity.EntityCombustEvent;
import org.bukkit.event.entity.EntityDamageByBlockEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.event.block.*;
import org.bukkit.event.entity.*;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.event.entity.EntityExplodeEvent;
import org.bukkit.event.entity.EntityInteractEvent;
import org.bukkit.event.entity.EntityShootBowEvent;
import org.bukkit.event.entity.EntityTargetEvent;
import org.bukkit.event.entity.EntityTargetLivingEntityEvent;
import org.bukkit.event.entity.EntityTeleportEvent;
import org.bukkit.event.entity.PlayerDeathEvent;
import org.bukkit.event.entity.ProjectileHitEvent;
import org.bukkit.event.entity.ProjectileLaunchEvent;
import org.bukkit.event.entity.SlimeSplitEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.inventory.InventoryType.SlotType;
import org.bukkit.event.player.AsyncPlayerChatEvent;
import org.bukkit.event.player.PlayerAnimationEvent;
import org.bukkit.event.player.PlayerFishEvent;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import org.bukkit.event.player.PlayerToggleFlightEvent;
import org.bukkit.event.player.PlayerToggleSneakEvent;
import org.bukkit.event.player.*;
import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;
import com.projectkorra.ProjectKorra.ComboManager.ClickType;
import com.projectkorra.ProjectKorra.Ability.AvatarState;
import com.projectkorra.ProjectKorra.CustomEvents.PlayerGrappleEvent;
import com.projectkorra.ProjectKorra.Objects.Preset;
import com.projectkorra.ProjectKorra.Utilities.GrapplingHookAPI;
import com.projectkorra.ProjectKorra.airbending.AirBlast;
import com.projectkorra.ProjectKorra.airbending.AirBubble;
import com.projectkorra.ProjectKorra.airbending.AirBurst;
import com.projectkorra.ProjectKorra.airbending.AirScooter;
import com.projectkorra.ProjectKorra.airbending.AirShield;
import com.projectkorra.ProjectKorra.airbending.AirSpout;
import com.projectkorra.ProjectKorra.airbending.AirSuction;
import com.projectkorra.ProjectKorra.airbending.AirSwipe;
import com.projectkorra.ProjectKorra.airbending.FlightAbility;
import com.projectkorra.ProjectKorra.airbending.Suffocate;
import com.projectkorra.ProjectKorra.airbending.Tornado;
import com.projectkorra.ProjectKorra.chiblocking.AcrobatStance;
import com.projectkorra.ProjectKorra.chiblocking.ChiComboManager;
import com.projectkorra.ProjectKorra.chiblocking.ChiPassive;
import com.projectkorra.ProjectKorra.chiblocking.HighJump;
import com.projectkorra.ProjectKorra.chiblocking.Paralyze;
import com.projectkorra.ProjectKorra.chiblocking.QuickStrike;
import com.projectkorra.ProjectKorra.chiblocking.RapidPunch;
import com.projectkorra.ProjectKorra.chiblocking.Smokescreen;
import com.projectkorra.ProjectKorra.chiblocking.SwiftKick;
import com.projectkorra.ProjectKorra.chiblocking.WarriorStance;
import com.projectkorra.ProjectKorra.earthbending.Catapult;
import com.projectkorra.ProjectKorra.earthbending.Collapse;
import com.projectkorra.ProjectKorra.earthbending.CompactColumn;
import com.projectkorra.ProjectKorra.earthbending.EarthArmor;
import com.projectkorra.ProjectKorra.earthbending.EarthBlast;
import com.projectkorra.ProjectKorra.earthbending.EarthColumn;
import com.projectkorra.ProjectKorra.earthbending.EarthGrab;
import com.projectkorra.ProjectKorra.earthbending.EarthPassive;
import com.projectkorra.ProjectKorra.earthbending.EarthSmash;
import com.projectkorra.ProjectKorra.earthbending.EarthTunnel;
import com.projectkorra.ProjectKorra.earthbending.EarthWall;
import com.projectkorra.ProjectKorra.earthbending.Extraction;
import com.projectkorra.ProjectKorra.earthbending.LavaFlow;
import com.projectkorra.ProjectKorra.earthbending.LavaFlow.AbilityType;
import com.projectkorra.ProjectKorra.earthbending.LavaSurge;
import com.projectkorra.ProjectKorra.earthbending.LavaWave;
import com.projectkorra.ProjectKorra.earthbending.MetalClips;
import com.projectkorra.ProjectKorra.earthbending.Shockwave;
import com.projectkorra.ProjectKorra.earthbending.Tremorsense;
import com.projectkorra.ProjectKorra.firebending.ArcOfFire;
import com.projectkorra.ProjectKorra.firebending.Combustion;
import com.projectkorra.ProjectKorra.firebending.Cook;
import com.projectkorra.ProjectKorra.firebending.Enflamed;
import com.projectkorra.ProjectKorra.firebending.Extinguish;
import com.projectkorra.ProjectKorra.firebending.FireBlast;
import com.projectkorra.ProjectKorra.firebending.FireBurst;
import com.projectkorra.ProjectKorra.firebending.FireJet;
import com.projectkorra.ProjectKorra.firebending.FireShield;
import com.projectkorra.ProjectKorra.firebending.FireStream;
import com.projectkorra.ProjectKorra.firebending.Fireball;
import com.projectkorra.ProjectKorra.firebending.Illumination;
import com.projectkorra.ProjectKorra.firebending.Lightning;
import com.projectkorra.ProjectKorra.firebending.RingOfFire;
import com.projectkorra.ProjectKorra.firebending.WallOfFire;
import com.projectkorra.ProjectKorra.waterbending.Bloodbending;
import com.projectkorra.ProjectKorra.waterbending.FreezeMelt;
import com.projectkorra.ProjectKorra.waterbending.IceBlast;
import com.projectkorra.ProjectKorra.waterbending.IceSpike2;
import com.projectkorra.ProjectKorra.waterbending.Melt;
import com.projectkorra.ProjectKorra.waterbending.OctopusForm;
import com.projectkorra.ProjectKorra.waterbending.Torrent;
import com.projectkorra.ProjectKorra.waterbending.WaterManipulation;
import com.projectkorra.ProjectKorra.waterbending.WaterPassive;
import com.projectkorra.ProjectKorra.waterbending.WaterSpout;
import com.projectkorra.ProjectKorra.waterbending.WaterWall;
import com.projectkorra.ProjectKorra.waterbending.WaterWave;
import com.projectkorra.ProjectKorra.waterbending.Wave;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class PKListener implements Listener {
@ -159,6 +64,16 @@ public class PKListener implements Listener {
}
@EventHandler
public void onHorizontalCollision(HorizontalVelocityChangeEvent e)
{
if(e.getEntity() instanceof LivingEntity)
{
((LivingEntity) e.getEntity()).damage(e.getDifference().length() * 2, e.getInstigator());
}
}
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
public void onPlayerGrapple(PlayerGrappleEvent event) {
if (event.isCancelled()) return;

View file

@ -0,0 +1,80 @@
package com.projectkorra.ProjectKorra.Utilities;
import org.bukkit.entity.Entity;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.bukkit.util.Vector;
/**
* Created by Carbogen on 2/2/2015.
*/
public class HorizontalVelocityChangeEvent extends Event implements Cancellable
{
private static final HandlerList handlers = new HandlerList();
private boolean isCancelled;
private Entity entity;
private Entity instigator;
private Vector from;
private Vector to;
private Vector difference;
public HorizontalVelocityChangeEvent(Entity entity, Entity instigator, Vector from, Vector to, Vector difference)
{
this.entity = entity;
this.instigator = instigator;
this.from = from;
this.to = to;
this.difference = difference;
}
public Entity getEntity()
{
return entity;
}
public Entity getInstigator()
{
return instigator;
}
public Vector getFrom()
{
return from;
}
public Vector getTo()
{
return to;
}
public Vector getDifference()
{
return difference;
}
@Override
public HandlerList getHandlers()
{
return handlers;
}
public static HandlerList getHandlerList()
{
return handlers;
}
@Override
public boolean isCancelled()
{
return isCancelled;
}
@Override
public void setCancelled(boolean value)
{
this.isCancelled = value;
}
}

View file

@ -2,6 +2,7 @@ package com.projectkorra.ProjectKorra.airbending;
import com.projectkorra.ProjectKorra.Ability.AvatarState;
import com.projectkorra.ProjectKorra.*;
import com.projectkorra.ProjectKorra.Objects.HorizontalVelocityTracker;
import org.bukkit.Effect;
import org.bukkit.Location;
import org.bukkit.Material;
@ -261,6 +262,7 @@ public class AirBlast {
return;
Methods.setVelocity(entity, velocity);
new HorizontalVelocityTracker(entity, player, 200);
entity.setFallDistance(0);
if (!isUser && entity instanceof Player) {
new Flight((Player) entity, player);

View file

@ -1,23 +1,19 @@
package com.projectkorra.ProjectKorra.waterbending;
import java.util.ArrayList;
import java.util.concurrent.ConcurrentHashMap;
import com.projectkorra.ProjectKorra.Ability.AvatarState;
import com.projectkorra.ProjectKorra.BendingPlayer;
import com.projectkorra.ProjectKorra.Methods;
import com.projectkorra.ProjectKorra.Objects.HorizontalVelocityTracker;
import com.projectkorra.ProjectKorra.ProjectKorra;
import com.projectkorra.ProjectKorra.TempPotionEffect;
import org.bukkit.Location;
import org.bukkit.entity.Creature;
import org.bukkit.entity.Entity;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import org.bukkit.entity.*;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.util.Vector;
import com.projectkorra.ProjectKorra.BendingPlayer;
import com.projectkorra.ProjectKorra.Methods;
import com.projectkorra.ProjectKorra.ProjectKorra;
import com.projectkorra.ProjectKorra.TempPotionEffect;
import com.projectkorra.ProjectKorra.Ability.AvatarState;
import java.util.ArrayList;
import java.util.concurrent.ConcurrentHashMap;
public class Bloodbending {
@ -121,6 +117,7 @@ public class Bloodbending {
Vector vector = new Vector(dx, dy, dz);
vector.normalize();
entity.setVelocity(vector.multiply(factor));
new HorizontalVelocityTracker(entity, player, 200);
}
remove(player);
}