Hello, currently I have a feature where players can throw tnt which spawns a PrimedTNT Entity and throws it where the player is looking. However when the entity explodes I cancel it using the EntityExplodeEvent but you still get a massive amount of knockback. I would prefer the player to just take damage and only move via a vector a little bit instead of getting hit by the tnt and flying really far away from the explosion power. Currently I'm using: Code (Java): @EventHandler(ignoreCancelled = true) public void onEntityExplosion(EntityExplodeEvent e) { if((e.getEntityType() == EntityType.WITHER) || (e.getEntityType() == EntityType.PRIMED_TNT) || (e.getEntityType() == EntityType.MINECART_TNT) || (e.getEntityType() == EntityType.CREEPER)) { double x = e.getEntity().getLocation().getX(); double y = e.getEntity().getLocation().getY(); double z = e.getEntity().getLocation().getZ(); e.getEntity().getWorld().createExplosion(x, y, z, 1.0F, false, false); e.getWorld().playEffect(e.getLocation(), Effect.LARGE_SMOKE, 100); e.setCancelled(true); } } Also for the entity damage by entity event I'm using: Code (Java): @EventHandler(ignoreCancelled = true) public void onEntityDamageByTNT(EntityDamageByEntityEvent e) { if(e.getEntity() != null && e.getCause().equals(DamageCause.ENTITY_EXPLOSION)) { Bukkit.broadcastMessage("[Debug] " + e.getEntity().getName() + " taken damage from " + e.getCause().toString() + ", vector set to 0."); e.getEntity().setVelocity(new Vector(0, 0, 0)); } }
I never cancelled an EntityExplosionEvent event, so I guess that's normal players take knockback. If so, the only way to cancel it is by the way you used, setting manually to all players that took damage 0 velocity.
0,0,0 will just resets his velocity, but I don't understand what you are actually trying to do, which direction are you talking about? The direction the player got knockbacked to?
If you use Paper there was a new event just added EntityKnockbackByEntityEvent. If you don't use Paper, I highly suggest making the switch.
If you want to decrease the power of the velocity just reduce the player's velocity by doing some simple maths, I think that should work and divide by two the amount of knockback the player will receive: Code (Java): Vector v = e.getEntity().getVelocity(); e.getEntity().setVelocity(new Vector(v.getX() / 2, v.getY() / 2, v.getZ() / 2));
Another option would be to delete the entity right before it explodes, then just add some particles and a sound effect. Simply grab where its location was, and calculate a vector based on that subtracted by the actual player's distance, and set it to its reciprocal.