Refactor Block Lobbers and Bouncing Block

This commit is contained in:
Thanos Paravantis 2016-07-05 14:52:25 +03:00
parent 4789f640b2
commit 3f13c5f518
5 changed files with 132 additions and 90 deletions

View File

@ -72,8 +72,11 @@ public abstract class Challenge implements Listener
protected ChallengeSettings Settings;
protected ChallengeData Data;
protected static final int TICK_MULTIPLIER = 20;
private static final int TITLE_FADE_IN_TICKS = 5;
private static final int TITLE_STAY_TICKS = 40;
private static final int TITLE_FADE_OUT_TICKS = 5;
public Challenge(BawkBawkBattles host, ChallengeType type, String name, String... description)
{
@ -512,6 +515,11 @@ public abstract class Challenge implements Listener
Host.Manager.GetCondition().Factory().Cloak(reason, player, player, 7777, true, false);
}
protected void alert(Player player, String message)
{
UtilTextMiddle.display(null, message, TITLE_FADE_IN_TICKS, TITLE_STAY_TICKS, TITLE_FADE_OUT_TICKS, player);
}
@SuppressWarnings("deprecation")
public void setBlock(Block block, Material type, byte data)
{

View File

@ -36,6 +36,7 @@ import nautilus.game.arcade.game.games.mineware.challenge.ChallengeType;
*/
public class ChallengeAnvilDance extends Challenge
{
private static final int MAP_HEIGHT = 1;
private static final int MAP_SPAWN_SHIFT = 2;
private static final int SMOOTH_BRICK_DATA_RANGE = 3;
@ -84,9 +85,9 @@ public class ChallengeAnvilDance extends Challenge
ArrayList<Location> spawns = new ArrayList<Location>();
int size = getArenaSize() - MAP_SPAWN_SHIFT;
for (Location location : circle(getCenter(), size, 1, true, false, 0))
for (Location location : circle(getCenter(), size, MAP_HEIGHT, true, false, 0))
{
spawns.add(location.add(0.5, 1.1, 0.5));
spawns.add(location.add(0.5, MAP_HEIGHT, 0.5));
}
return spawns;
@ -97,7 +98,7 @@ public class ChallengeAnvilDance extends Challenge
{
_arenaStartSize = getArenaSize();
for (Location location : circle(getCenter(), _arenaStartSize, 1, false, false, 0))
for (Location location : circle(getCenter(), _arenaStartSize, MAP_HEIGHT, false, false, 0))
{
Block block = location.getBlock();
setBlock(block, Material.SMOOTH_BRICK);

View File

@ -32,11 +32,11 @@ import nautilus.game.arcade.game.games.mineware.challenge.ChallengeType;
public class ChallengeArrowRampage extends Challenge
{
private static final int LOCKED_INVENTORY_SLOT = 4;
private static final int ARENA_MIN_SIZE = 9;
private static final int MAP_MIN_SIZE = 9;
private static final int MAP_SPAWN_SHIFT = 2;
private static final int MAP_HEIGHT = 3;
private static final int MAP_HEIGHT = 3;
private static final int MAP_SPAWN_HEIGHT = MAP_HEIGHT + 1;
private static final int HEIGHT_LVL0 = 0;
private static final int HEIGHT_LVL1 = 1;
private static final int HEIGHT_LVL2 = 2;
@ -45,11 +45,11 @@ public class ChallengeArrowRampage extends Challenge
private static final byte WOOL_DATA_LVL1 = 4;
private static final byte WOOL_DATA_LVL2 = 5;
private static final int WOOL_DATA_RANGE_LVL3 = 16;
private static final int JUMP_EFFECT_AMPLIFIER = 2;
private static final int ARROW_EXPLOSION_RADIUS = 3;
private static final int ARROW_HIT_BLOCK_MAX_DISTANCE = 4;
public ChallengeArrowRampage(BawkBawkBattles host)
{
super(
@ -68,7 +68,7 @@ public class ChallengeArrowRampage extends Challenge
public ArrayList<Location> createSpawns()
{
ArrayList<Location> spawns = new ArrayList<Location>();
int size = getArenaSize(ARENA_MIN_SIZE) - MAP_SPAWN_SHIFT;
int size = getArenaSize(MAP_MIN_SIZE) - MAP_SPAWN_SHIFT;
for (int x = -size; x < size; x++)
{
@ -87,7 +87,7 @@ public class ChallengeArrowRampage extends Challenge
@Override
public void createMap()
{
int size = getArenaSize(ARENA_MIN_SIZE);
int size = getArenaSize(MAP_MIN_SIZE);
for (int x = -size; x <= size; x++)
{

View File

@ -36,7 +36,22 @@ import nautilus.game.arcade.game.games.mineware.challenge.ChallengeType;
*/
public class ChallengeBlockLobbers extends Challenge
{
private List<Material> _throwTypes = new ArrayList<>(Arrays.asList(
private static final int MAP_HEIGHT = 1;
private static final int MAP_MIN_SIZE = 11;
private static final int WOOL_DATA_RANGE = 16;
private static final int INVENTORY_HOTBAR_SIZE = 9;
private static final double FALLING_BLOCK_HEIGHT_ADD = 0.4;
private static final double FALLING_BLOCK_VECTOR_MULTIPLY = 1.5;
private static final double FALLING_BLOCK_VECTOR_HEIGHT_ADD = 0.3;
private static final double FALLING_BLOCK_VECTOR_HEIGHT_MAX = 10.0;
private static final float FALLING_BLOCK_HITBOX_GROW = 0.2F;
private static final double KNOCKBACK_VECTOR_MULTIPLY = 0.8;
private static final double KNOCKBACK_VECTOR_HEIGHT_ADD = 0.3;
private static final double KNOCKBACK_VECTOR_HEIGHT_MAX = 0.5;
private static final List<Material> THROW_TYPES = new ArrayList<>(Arrays.asList(
Material.STONE,
Material.COBBLESTONE,
Material.GRASS,
@ -60,9 +75,9 @@ public class ChallengeBlockLobbers extends Challenge
{
ArrayList<Location> spawns = new ArrayList<Location>();
for (Location location : circle(getCenter(), getArenaSize(), 1, false, false, 0))
for (Location location : circle(getCenter(), getArenaSize(), MAP_HEIGHT, false, false, 0))
{
spawns.add(location.add(0.5, 1.1, 0.5));
spawns.add(location.add(0.5, MAP_HEIGHT, 0.5));
}
return spawns;
@ -71,10 +86,10 @@ public class ChallengeBlockLobbers extends Challenge
@Override
public void createMap()
{
for (Location location : circle(getCenter(), getArenaSize(11), 1, false, false, 0))
for (Location location : circle(getCenter(), getArenaSize(MAP_MIN_SIZE), MAP_HEIGHT, false, false, 0))
{
Block block = location.getBlock();
setBlock(block, Material.WOOL, (byte) UtilMath.r(16));
setBlock(block, Material.WOOL, (byte) UtilMath.r(WOOL_DATA_RANGE));
addBlock(block);
}
@ -96,33 +111,22 @@ public class ChallengeBlockLobbers extends Challenge
if (event.getType() != UpdateType.FAST)
return;
for (Player player : getPlayersAlive())
for (Player player : getPlayersIn(true))
{
Material material = UtilMath.randomElement(_throwTypes);
if (Data.isDone(player))
continue;
PlayerInventory inventory = player.getInventory();
Material material = UtilMath.randomElement(THROW_TYPES);
if (inventory.contains(material))
{
for (int i = 0; i < 10; i++)
if (UtilInv.getAmount(player, material) <= INVENTORY_HOTBAR_SIZE)
{
if (inventory.getItem(i) != null)
{
if (inventory.getItem(i).getType() == material)
{
if (inventory.getItem(i).getAmount() < 10)
inventory.addItem(new ItemStack(material));
break;
}
}
inventory.addItem(new ItemStack(material));
}
}
inventory.addItem(new ItemStack(material));
else
{
inventory.addItem(new ItemStack(material));
}
}
}
@ -142,13 +146,12 @@ public class ChallengeBlockLobbers extends Challenge
Material material = player.getItemInHand().getType();
if (!_throwTypes.contains(material))
if (!THROW_TYPES.contains(material))
return;
FallingBlock falling = player.getWorld().spawnFallingBlock(player.getLocation().add(0, 0.4, 0), material, (byte) 0);
UtilAction.velocity(falling, player.getLocation().getDirection(), 1.5, false, 0.0, 0.3, 10.0, true);
Host.Manager.GetProjectile().AddThrow(falling, player, Host, -1, true, false, true, true, 0.2f);
FallingBlock falling = player.getWorld().spawnFallingBlock(player.getLocation().add(0, FALLING_BLOCK_HEIGHT_ADD, 0), material, (byte) 0);
UtilAction.velocity(falling, player.getLocation().getDirection(), FALLING_BLOCK_VECTOR_MULTIPLY, false, 0.0, FALLING_BLOCK_VECTOR_HEIGHT_ADD, FALLING_BLOCK_VECTOR_HEIGHT_MAX, true);
Host.Manager.GetProjectile().AddThrow(falling, player, Host, -1, true, false, true, true, FALLING_BLOCK_HITBOX_GROW);
UtilInv.remove(player, material, (byte) 0, 1);
}
@ -179,8 +182,10 @@ public class ChallengeBlockLobbers extends Challenge
if (!isChallengeValid())
return;
if (_throwTypes.contains(event.getEntity().getItemStack().getType()))
if (THROW_TYPES.contains(event.getEntity().getItemStack().getType()))
{
event.setCancelled(true);
}
}
@Override
@ -201,7 +206,7 @@ public class ChallengeBlockLobbers extends Challenge
if (target.equals(data.getThrower()))
return;
UtilAction.velocity(target, UtilAlg.getTrajectory2d(data.getThrown().getLocation(), target.getLocation()), 0.8, false, 0, 0.3, 0.5, true);
UtilAction.velocity(target, UtilAlg.getTrajectory2d(data.getThrown().getLocation(), target.getLocation()), KNOCKBACK_VECTOR_MULTIPLY, false, 0, KNOCKBACK_VECTOR_HEIGHT_ADD, KNOCKBACK_VECTOR_HEIGHT_MAX, true);
data.getThrown().remove();
}
@ -211,17 +216,17 @@ public class ChallengeBlockLobbers extends Challenge
if (handType == Material.AIR || handType == null)
{
for (int i = 0; i <= 8; i++)
for (int i = 0; i <= INVENTORY_HOTBAR_SIZE; i++)
{
ItemStack current = player.getInventory().getItem(i);
if (current == null)
continue;
if (current.getType() != Material.AIR)
if (current != null && current.getType() != Material.AIR)
{
player.getInventory().setHeldItemSlot(i);
return;
break;
}
}
}

View File

@ -24,7 +24,6 @@ import mineplex.core.common.util.C;
import mineplex.core.common.util.UtilFirework;
import mineplex.core.common.util.UtilMath;
import mineplex.core.common.util.UtilTextBottom;
import mineplex.core.common.util.UtilTextMiddle;
import mineplex.core.recharge.Recharge;
import mineplex.core.updater.UpdateType;
import mineplex.core.updater.event.UpdateEvent;
@ -38,10 +37,34 @@ import nautilus.game.arcade.game.games.mineware.challenge.LogicTracker;
*/
public class ChallengeBouncingBlock extends Challenge implements LogicTracker
{
private static final int SCORE_GOAL = 10;
private static final int MAP_MIN_SIZE = 9;
private static final int MAP_SPAWN_SHIFT = 2;
private static final int MAP_HEIGHT = 1;
private static final byte PLATFORM_BLOCK_DATA = 0;
private static final int JUMP_EFFECT_MULTIPLIER = 6;
private static final double TRAP_SPAWN_CHANCE = 0.2;
private static final byte TRAP_BLOCK_DATA = 14;
private static final int TRAP_SCORE_LOSS_MAX = 2;
private static final int TRAP_SCORE_LOSS_MIN = 1;
private static final float SCORE_SOUND_VOLUME = 0.2F;
private static final float SCORE_SOUND_PITCH = 0.2F;
private static final int SCORE_BLOCK_HEIGHT = 6;
private static final int SCORE_BLOCK_HEIGHT_ADD = 5;
private static final int SCORE_BLOCK_HEIGHT_MAX = SCORE_BLOCK_HEIGHT + SCORE_BLOCK_HEIGHT_ADD;
private static final int SCORE_BLOCK_SPAWN_SHIFT = 2;
private static final int SCORE_BLOCK_BOUND_MULTIPLY = 2;
private static final double SCORE_FIREWORK_LOCATION_ADD = 0.5;
private static final int MILLISECONDS_UNTIL_NEXT_SCORE_LOSS = 300;
private List<Player> _stepTracker = new ArrayList<>();
private List<Block> _blocks = new ArrayList<>();
private Map<Player, Integer> _score = new HashMap<>();
private static int _goal = 10;
public ChallengeBouncingBlock(BawkBawkBattles host)
{
@ -51,7 +74,7 @@ public class ChallengeBouncingBlock extends Challenge implements LogicTracker
"Bouncing Block",
"Jump and punch floating wool blocks.",
"Avoid landing on red wool.",
"First to " + _goal + " wins!");
"First to " + SCORE_GOAL + " wins!");
Settings.setUseMapHeight();
}
@ -60,11 +83,11 @@ public class ChallengeBouncingBlock extends Challenge implements LogicTracker
public ArrayList<Location> createSpawns()
{
ArrayList<Location> spawns = new ArrayList<Location>();
int size = getArenaSize(9) - 2;
int size = getArenaSize(MAP_MIN_SIZE) - MAP_SPAWN_SHIFT;
for (Location location : circle(getCenter(), size, 1, true, false, 0))
for (Location location : circle(getCenter(), size, MAP_HEIGHT, true, false, 0))
{
spawns.add(location.add(0.5, 1.1, 0.5));
spawns.add(location.add(0.5, MAP_HEIGHT, 0.5));
}
return spawns;
@ -73,18 +96,18 @@ public class ChallengeBouncingBlock extends Challenge implements LogicTracker
@Override
public void createMap()
{
for (Location location : circle(getCenter(), getArenaSize(9), 1, false, false, 0))
for (Location location : circle(getCenter(), getArenaSize(MAP_MIN_SIZE), MAP_HEIGHT, false, false, 0))
{
Block block = location.getBlock();
setBlock(block, Material.WOOL);
if (Math.random() < 0.2)
if (Math.random() < TRAP_SPAWN_CHANCE)
{
setData(block, (byte) 14);
setData(block, (byte) TRAP_BLOCK_DATA);
}
else
{
setData(block, (byte) 0);
setData(block, (byte) PLATFORM_BLOCK_DATA);
}
addBlock(block);
@ -98,7 +121,7 @@ public class ChallengeBouncingBlock extends Challenge implements LogicTracker
{
Host.StrictAntiHack = false;
addEffect(PotionEffectType.JUMP, 6);
addEffect(PotionEffectType.JUMP, JUMP_EFFECT_MULTIPLIER);
for (Player player : getPlayersAlive())
{
@ -205,15 +228,14 @@ public class ChallengeBouncingBlock extends Challenge implements LogicTracker
private void hitBlock(Player player, Block block)
{
increment(player, 1);
player.playSound(player.getLocation(), Sound.SUCCESSFUL_HIT, 0.2f, 0.2f);
setBlock(block, Material.AIR);
spawnRandomWool(getArenaSize(9), (UtilMath.r(6) + 5));
player.playSound(player.getLocation(), Sound.SUCCESSFUL_HIT, SCORE_SOUND_VOLUME, SCORE_SOUND_PITCH);
resetBlock(block);
spawnRandomWool();
}
private void checkCompleted(Player player)
{
if (_score.get(player) >= _goal)
if (_score.get(player) >= SCORE_GOAL)
{
setCompleted(player);
UtilTextBottom.display(C.cGreen + C.Bold + "Completed!", player);
@ -227,16 +249,16 @@ public class ChallengeBouncingBlock extends Challenge implements LogicTracker
private boolean canLooseScore(Player player)
{
return Recharge.Instance.use(player, "Movement", 300, false, false) && _score.get(player) > 0;
return Recharge.Instance.use(player, "Score Loss", MILLISECONDS_UNTIL_NEXT_SCORE_LOSS, false, false) && _score.get(player) > 0;
}
private int subtractFromScore(Player player)
{
int amount = 2;
int amount = TRAP_SCORE_LOSS_MAX;
if (_score.get(player) == 1)
{
amount = 1;
amount = TRAP_SCORE_LOSS_MIN;
}
subtract(player, amount);
@ -245,7 +267,7 @@ public class ChallengeBouncingBlock extends Challenge implements LogicTracker
private void showSubtractMessage(Player player, int amount)
{
UtilTextMiddle.display(null, "Score decreased by " + C.cRed + amount + C.Reset + "!", 5, 40, 5, player);
alert(player, "Score decreased by " + C.cRed + amount + C.Reset + "!");
player.playSound(player.getLocation(), Sound.NOTE_BASS, 1.0F, 1.0F);
}
@ -257,33 +279,28 @@ public class ChallengeBouncingBlock extends Challenge implements LogicTracker
}
}
private static final double SCORE_BLOCK_SPAWN_CHANCE = 0.1;
private static final int SCORE_BLOCK_DATA_RANGE = 16;
private void spawnStartingWool()
{
whileLoop: while (_blocks.size() <= Math.ceil(Host.getPlayersWithRemainingLives() / 2) + 1)
whileLoop: while (_blocks.size() <= Settings.getMaxCompletedCount() + 1)
{
for (int x = -getArenaSize(); x <= getArenaSize(); x++)
{
for (int z = -getArenaSize(); z <= getArenaSize(); z++)
{
for (int y = 5; y <= 11; y++)
for (int y = SCORE_BLOCK_HEIGHT; y <= SCORE_BLOCK_HEIGHT_MAX; y++)
{
Block block = getCenter().getBlock().getRelative(x, y, z);
if (block.isEmpty() || block.getType() == null)
{
if (UtilMath.r(50) == 0)
if (Math.random() < SCORE_BLOCK_SPAWN_CHANCE)
{
Byte color = (byte) UtilMath.r(16);
spawnRandomWoolAt(x, y, z);
while (color == 14)
{
color = (byte) UtilMath.r(16);
}
setBlock(block, Material.WOOL, (byte) UtilMath.r(16));
_blocks.add(block);
if (_blocks.size() >= Math.ceil(Host.getPlayersWithRemainingLives() / 2) + 1)
if (_blocks.size() >= Settings.getMaxCompletedCount() + 1)
{
break whileLoop;
}
@ -295,25 +312,30 @@ public class ChallengeBouncingBlock extends Challenge implements LogicTracker
}
}
@SuppressWarnings("deprecation")
private void spawnRandomWool(int size, int height)
private void spawnRandomWool()
{
size = size - 2;
int x = UtilMath.r(size * 2) - size;
int y = height;
int z = UtilMath.r(size * 2) - size;
int size = getArenaSize(MAP_MIN_SIZE) - SCORE_BLOCK_SPAWN_SHIFT;
int x = UtilMath.r(size * SCORE_BLOCK_BOUND_MULTIPLY) - size;
int y = SCORE_BLOCK_HEIGHT + UtilMath.r(SCORE_BLOCK_HEIGHT_ADD);
int z = UtilMath.r(size * SCORE_BLOCK_BOUND_MULTIPLY) - size;
spawnRandomWoolAt(x, y, z);
}
@SuppressWarnings("deprecation")
private void spawnRandomWoolAt(int x, int y, int z)
{
Block b = getCenter().getBlock().getRelative(x, y, z);
Byte color = (byte) UtilMath.r(16);
Byte color = (byte) UtilMath.r(SCORE_BLOCK_DATA_RANGE);
while (color == 14)
while (color == TRAP_BLOCK_DATA)
{
color = (byte) UtilMath.r(16);
color = (byte) UtilMath.r(SCORE_BLOCK_DATA_RANGE);
}
setBlock(b, Material.WOOL, color);
UtilFirework.playFirework(b.getLocation().add(0.5, 0.5, 0.5), Type.BALL, DyeColor.getByWoolData(b.getData()).getColor(), false, false);
UtilFirework.playFirework(b.getLocation().add(SCORE_FIREWORK_LOCATION_ADD, SCORE_FIREWORK_LOCATION_ADD, SCORE_FIREWORK_LOCATION_ADD), Type.BALL, DyeColor.getByWoolData(b.getData()).getColor(), false, false);
_blocks.add(b);
}
@ -323,8 +345,10 @@ public class ChallengeBouncingBlock extends Challenge implements LogicTracker
int score = _score.get(player);
int updatedScore = score + amount;
if (updatedScore <= 10)
if (updatedScore <= SCORE_GOAL)
{
_score.put(player, updatedScore);
}
}
private void subtract(Player player, int amount)
@ -333,9 +357,13 @@ public class ChallengeBouncingBlock extends Challenge implements LogicTracker
int updatedScore = score - amount;
if (updatedScore > 0)
{
_score.put(player, updatedScore);
}
else
{
_score.put(player, 0);
}
}
@Override