Fix spleef breaking blocks in the lobby

This commit is contained in:
Sam 2018-04-19 13:25:33 +01:00 committed by Alexander Meech
parent 6731b5f3ab
commit 5985d5ef99
1 changed files with 54 additions and 79 deletions

View File

@ -1,26 +1,22 @@
package nautilus.game.arcade.game.games.spleef; package nautilus.game.arcade.game.games.spleef;
import java.lang.reflect.Field;
import nautilus.game.arcade.game.games.spleef.kits.*;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Effect; import org.bukkit.Effect;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.craftbukkit.v1_8_R3.entity.CraftArrow;
import org.bukkit.entity.Arrow; import org.bukkit.entity.Arrow;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.entity.Snowball; import org.bukkit.entity.Snowball;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockDamageEvent; import org.bukkit.event.block.BlockDamageEvent;
import org.bukkit.event.entity.ProjectileHitEvent;
import org.bukkit.event.entity.EntityDamageEvent.DamageCause; import org.bukkit.event.entity.EntityDamageEvent.DamageCause;
import org.bukkit.event.entity.ProjectileHitEvent;
import mineplex.core.common.util.F; import mineplex.core.common.util.F;
import mineplex.core.common.util.UtilBlock; import mineplex.core.common.util.UtilBlock;
import mineplex.core.common.util.UtilEnt;
import mineplex.core.common.util.UtilInv; import mineplex.core.common.util.UtilInv;
import mineplex.core.common.util.UtilMath; import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilPlayer; import mineplex.core.common.util.UtilPlayer;
@ -28,16 +24,18 @@ import mineplex.core.itemstack.ItemStackFactory;
import mineplex.core.recharge.Recharge; import mineplex.core.recharge.Recharge;
import mineplex.core.updater.UpdateType; import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent; import mineplex.core.updater.event.UpdateEvent;
import nautilus.game.arcade.ArcadeManager; import nautilus.game.arcade.ArcadeManager;
import nautilus.game.arcade.GameType; import nautilus.game.arcade.GameType;
import nautilus.game.arcade.game.SoloGame; import nautilus.game.arcade.game.SoloGame;
import nautilus.game.arcade.game.games.spleef.kits.KitArcher;
import nautilus.game.arcade.game.games.spleef.kits.KitBrawler;
import nautilus.game.arcade.game.games.spleef.kits.KitSnowballer;
import nautilus.game.arcade.game.modules.compass.CompassModule; import nautilus.game.arcade.game.modules.compass.CompassModule;
import nautilus.game.arcade.kit.Kit; import nautilus.game.arcade.kit.Kit;
import nautilus.game.arcade.managers.chat.ChatStatData; import nautilus.game.arcade.managers.chat.ChatStatData;
import nautilus.game.arcade.stats.SpleefBlockDestroyStatTracker; import nautilus.game.arcade.stats.SpleefBlockDestroyStatTracker;
import net.minecraft.server.v1_8_R3.EntityArrow;
public class Spleef extends SoloGame public class Spleef extends SoloGame
{ {
public Spleef(ArcadeManager manager) public Spleef(ArcadeManager manager)
@ -46,17 +44,17 @@ public class Spleef extends SoloGame
new Kit[] new Kit[]
{ {
new KitSnowballer(manager), new KitSnowballer(manager),
new KitBrawler(manager), new KitBrawler(manager),
new KitArcher(manager) new KitArcher(manager)
}, },
new String[] new String[]
{ {
"Punch blocks to break them!", "Punch blocks to break them!",
"1 Hunger per block smashed!", "1 Hunger per block smashed!",
"Last player alive wins!" "Last player alive wins!"
}); });
this.DamagePvP = false; this.DamagePvP = false;
this.WorldWaterDamage = 4; this.WorldWaterDamage = 4;
@ -84,13 +82,12 @@ public class Spleef extends SoloGame
@EventHandler @EventHandler
public void SnowballDamage(ProjectileHitEvent event) public void SnowballDamage(ProjectileHitEvent event)
{ {
if (!IsLive()) if (!IsLive() || !(event.getEntity() instanceof Snowball))
{
return; return;
}
if (!(event.getEntity() instanceof Snowball)) Snowball ball = (Snowball) event.getEntity();
return;
Snowball ball = (Snowball)event.getEntity();
if (ball.getShooter() == null || !(ball.getShooter() instanceof Player)) if (ball.getShooter() == null || !(ball.getShooter() instanceof Player))
return; return;
@ -123,61 +120,39 @@ public class Spleef extends SoloGame
block = closest; block = closest;
} }
BlockFade(block, (Player)ball.getShooter(), false); BlockFade(block, (Player) ball.getShooter(), false);
} }
@EventHandler @EventHandler
public void ArrowDamage(ProjectileHitEvent event) public void ArrowDamage(ProjectileHitEvent event)
{ {
if (!(event.getEntity() instanceof Arrow)) if (!IsLive() || !(event.getEntity() instanceof Arrow))
{
return; return;
}
final Arrow arrow = (Arrow)event.getEntity(); final Arrow arrow = (Arrow) event.getEntity();
final double velocity = arrow.getVelocity().length(); final double velocity = arrow.getVelocity().length();
if (!(arrow.getShooter() instanceof Player)) if (!(arrow.getShooter() instanceof Player))
return; return;
final Player player = (Player)arrow.getShooter(); final Player player = (Player) arrow.getShooter();
Manager.getPlugin().getServer().getScheduler().scheduleSyncDelayedTask(Manager.getPlugin(), new Runnable() Manager.runSyncLater(() ->
{ {
public void run() Block block = UtilEnt.getHitBlock(arrow);
double radius = 0.5 + velocity / 1.6d;
BlockFade(block, player, false);
for (Block other : UtilBlock.getInRadius(block.getLocation().add(0.5, 0.5, 0.5), radius).keySet())
{ {
try BlockFade(other, player, true);
{
EntityArrow entityArrow = ((CraftArrow)arrow).getHandle();
Field fieldX = EntityArrow.class.getDeclaredField("d");
Field fieldY = EntityArrow.class.getDeclaredField("e");
Field fieldZ = EntityArrow.class.getDeclaredField("f");
fieldX.setAccessible(true);
fieldY.setAccessible(true);
fieldZ.setAccessible(true);
int x = fieldX.getInt(entityArrow);
int y = fieldY.getInt(entityArrow);
int z = fieldZ.getInt(entityArrow);
Block block = arrow.getWorld().getBlockAt(x, y, z);
double radius = 0.5 + velocity/1.6d;
BlockFade(block, player, false);
for (Block other : UtilBlock.getInRadius(block.getLocation().add(0.5, 0.5, 0.5), radius).keySet())
{
BlockFade(other, player, true);
}
arrow.remove();
}
catch (Exception e)
{
e.printStackTrace();
}
} }
arrow.remove();
}, 0); }, 0);
} }
@ -199,7 +174,7 @@ public class Spleef extends SoloGame
//Snowball //Snowball
if (GetKit(event.getPlayer()) instanceof KitSnowballer && event.getBlock().getType() != Material.BEDROCK) if (GetKit(event.getPlayer()) instanceof KitSnowballer && event.getBlock().getType() != Material.BEDROCK)
if (!UtilInv.contains(event.getPlayer(), Material.SNOW_BALL, (byte)0, 16)) if (!UtilInv.contains(event.getPlayer(), Material.SNOW_BALL, (byte) 0, 16))
event.getPlayer().getInventory().addItem(ItemStackFactory.Instance.CreateStack(Material.SNOW_BALL)); event.getPlayer().getInventory().addItem(ItemStackFactory.Instance.CreateStack(Material.SNOW_BALL));
} }
@ -223,11 +198,11 @@ public class Spleef extends SoloGame
{ {
//Greens //Greens
if (block.getData() == 5 || block.getData() == 13) if (block.getData() == 5 || block.getData() == 13)
block.setData((byte)4); block.setData((byte) 4);
//Yellow //Yellow
else if (block.getData() == 4) else if (block.getData() == 4)
block.setData((byte)14); block.setData((byte) 14);
else else
Break(block, player); Break(block, player);
@ -243,7 +218,7 @@ public class Spleef extends SoloGame
else if (block.getTypeId() == 98) else if (block.getTypeId() == 98)
{ {
if (block.getData() == 0 || block.getData() == 1) if (block.getData() == 0 || block.getData() == 1)
block.setData((byte)2); block.setData((byte) 2);
else else
Break(block, player); Break(block, player);
@ -259,10 +234,10 @@ public class Spleef extends SoloGame
else if (block.getTypeId() == 5) else if (block.getTypeId() == 5)
{ {
if (block.getData() == 1) if (block.getData() == 1)
block.setData((byte)0); block.setData((byte) 0);
else if (block.getData() == 0) else if (block.getData() == 0)
block.setData((byte)2); block.setData((byte) 2);
else else
Break(block, player); Break(block, player);