Fix landing detection on cloud fall and improve clouds

This commit is contained in:
Thanos Paravantis 2016-06-06 19:40:54 +03:00
parent b9a6fdee24
commit 7288c4f131

View File

@ -23,7 +23,10 @@ import nautilus.game.arcade.game.games.mineware.challenge.ChallengeType;
public class ChallengeCloudFall extends Challenge public class ChallengeCloudFall extends Challenge
{ {
private int _platformHeight = 85; private int _platformHeight = 85;
private int _obstacleMaxHeight = 75; private int _obstacleMaxHeight = 70;
private Material _landingBlockType = Material.WOOL;
private byte _landingBlockData = 5;
public ChallengeCloudFall(BawkBawkBattles host) public ChallengeCloudFall(BawkBawkBattles host)
{ {
@ -42,7 +45,7 @@ public class ChallengeCloudFall extends Challenge
{ {
ArrayList<Location> spawns = new ArrayList<Location>(); ArrayList<Location> spawns = new ArrayList<Location>();
int size = getArenaSize() - 2; int size = getArenaSize() - 2;
for (Location location : circle(getCenter().add(0, _platformHeight, 0), size, 1, true, false, 0)) for (Location location : circle(getCenter().add(0, _platformHeight, 0), size, 1, true, false, 0))
{ {
spawns.add(location.add(0.5, 1.1, 0.5)); spawns.add(location.add(0.5, 1.1, 0.5));
@ -84,11 +87,61 @@ public class ChallengeCloudFall extends Challenge
if (!isPlayerValid(player)) if (!isPlayerValid(player))
return; return;
if (Math.round(player.getLocation().getY()) == getCenter().getY() + 3) Block below = player.getLocation().getBlock().getRelative(BlockFace.DOWN);
System.out.println(below.getY() + " == " + ((int) getCenter().getY() + 2));
if (below.getY() == (int) getCenter().getY() + 2)
{ {
event.SetCancelled("Fell on Wool"); System.out.println("2");
setCompleted(player);
if (below.isEmpty())
{
System.out.println("3");
Block[] nearby = {
below.getRelative(BlockFace.NORTH),
below.getRelative(BlockFace.EAST),
below.getRelative(BlockFace.SOUTH),
below.getRelative(BlockFace.WEST),
below.getRelative(BlockFace.NORTH_EAST),
below.getRelative(BlockFace.NORTH_WEST),
below.getRelative(BlockFace.SOUTH_EAST),
below.getRelative(BlockFace.SOUTH_WEST)
};
for (Block near : nearby)
{
if (isLandingBlock(near))
{
setCompleted(player);
event.SetCancelled("Fell on wool");
break;
}
}
}
else if (isLandingBlock(below))
{
System.out.println("4");
setCompleted(player);
event.SetCancelled("Fell on wool");
}
else
{
event.AddMod("Fell into another block", 99999);
}
} }
else
{
event.AddMod("Fell into another block", 99999);
}
}
@SuppressWarnings("deprecation")
private boolean isLandingBlock(Block block)
{
return block.getType() == _landingBlockType && block.getData() == _landingBlockData;
} }
private void createBottomMiddleMapPart() private void createBottomMiddleMapPart()
@ -113,7 +166,7 @@ public class ChallengeCloudFall extends Challenge
createLandingWool(block, upperBlock); createLandingWool(block, upperBlock);
addBlock(upperBlock); addBlock(upperBlock);
} }
else if (y > 10 && y < 70 && UtilMath.r(200) == 1) else if (canCreateObstacle(block) && y > 10 && UtilMath.r(200) == 1)
{ {
addBlock(createObstacle(block)); addBlock(createObstacle(block));
} }
@ -154,17 +207,57 @@ public class ChallengeCloudFall extends Challenge
top.setData((byte) 5); top.setData((byte) 5);
} }
private Block[] createObstacle(Block centerBlock) private boolean canCreateObstacle(Block center)
{ {
Block north = centerBlock.getRelative(BlockFace.NORTH); Block[] area = {
Block east = centerBlock.getRelative(BlockFace.EAST); center.getRelative(BlockFace.DOWN),
Block west = centerBlock.getRelative(BlockFace.WEST); center.getRelative(BlockFace.NORTH),
Block south = centerBlock.getRelative(BlockFace.SOUTH); center.getRelative(BlockFace.EAST),
center.getRelative(BlockFace.SOUTH),
center.getRelative(BlockFace.WEST),
center.getRelative(BlockFace.NORTH).getRelative(BlockFace.DOWN),
center.getRelative(BlockFace.EAST).getRelative(BlockFace.DOWN),
center.getRelative(BlockFace.SOUTH).getRelative(BlockFace.DOWN),
center.getRelative(BlockFace.WEST).getRelative(BlockFace.DOWN)
};
north.setType(Material.STAINED_CLAY); boolean available = true;
east.setType(Material.STAINED_CLAY);
west.setType(Material.STAINED_CLAY); for (Block part : area)
south.setType(Material.STAINED_CLAY); {
if (!part.isEmpty())
{
available = false;
break;
}
}
return available && center.isEmpty();
}
@SuppressWarnings("deprecation")
private Block[] createObstacle(Block center)
{
Block north = center.getRelative(BlockFace.NORTH);
Block east = center.getRelative(BlockFace.EAST);
Block south = center.getRelative(BlockFace.SOUTH);
Block west = center.getRelative(BlockFace.WEST);
byte data = 0;
if (Math.random() < 0.3)
{
data = 8;
}
north.setType(Material.WOOL);
north.setData(data);
east.setType(Material.WOOL);
east.setData(data);
south.setType(Material.WOOL);
south.setData(data);
west.setType(Material.WOOL);
west.setData(data);
return new Block[] { north, east, west, south }; return new Block[] { north, east, west, south };
} }