Configuration for bridges
This commit is contained in:
parent
b35a9582df
commit
15d691370d
@ -37,7 +37,6 @@ import org.bukkit.event.inventory.CraftItemEvent;
|
||||
import org.bukkit.event.inventory.PrepareItemCraftEvent;
|
||||
import org.bukkit.event.player.PlayerBucketEmptyEvent;
|
||||
import org.bukkit.event.player.PlayerBucketFillEvent;
|
||||
import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
||||
import org.bukkit.event.player.PlayerInteractEvent;
|
||||
import org.bukkit.event.player.PlayerPickupItemEvent;
|
||||
import org.bukkit.inventory.CraftingInventory;
|
||||
@ -70,12 +69,15 @@ import mineplex.minecraft.game.core.damage.CustomDamageEvent;
|
||||
import nautilus.game.arcade.ArcadeManager;
|
||||
import nautilus.game.arcade.GameType;
|
||||
import nautilus.game.arcade.events.GameStateChangeEvent;
|
||||
import nautilus.game.arcade.game.DebugCommand;
|
||||
import nautilus.game.arcade.game.Game;
|
||||
import nautilus.game.arcade.game.GameTeam;
|
||||
import nautilus.game.arcade.game.TeamGame;
|
||||
import nautilus.game.arcade.game.games.bridge.animation.BridgeAnimation;
|
||||
import nautilus.game.arcade.game.games.bridge.animation.BridgeAnimationType;
|
||||
import nautilus.game.arcade.game.games.bridge.animation.CustomBridgeAnimation;
|
||||
import nautilus.game.arcade.game.games.bridge.animation.custom.CustomBridgeAnimation;
|
||||
import nautilus.game.arcade.game.games.bridge.animation.custom.RadiusCustomBridgeAnimation;
|
||||
import nautilus.game.arcade.game.games.bridge.animation.custom.RandomCustomBridgeAnimation;
|
||||
import nautilus.game.arcade.game.games.bridge.kits.KitApple;
|
||||
import nautilus.game.arcade.game.games.bridge.kits.KitArcher;
|
||||
import nautilus.game.arcade.game.games.bridge.kits.KitBerserker;
|
||||
@ -114,11 +116,14 @@ public class Bridge extends TeamGame implements OreObsfucation
|
||||
*/
|
||||
private static final int WORLD_BORDER_PREPARE_TICKS = 20;
|
||||
|
||||
private static final String CUSTOM_BRIDGE_KEY = "TYPE";
|
||||
|
||||
//Bridge
|
||||
private long _bridgeTime = BRIDGE_TIME;
|
||||
private boolean _bridgesDown = false;
|
||||
private BridgeAnimation _animation;
|
||||
|
||||
private CustomBridgeAnimation[] _customAnimations;
|
||||
|
||||
private HashSet<BridgePart> _bridgeParts = new HashSet<BridgePart>();
|
||||
|
||||
//Animals
|
||||
@ -249,6 +254,11 @@ public class Bridge extends TeamGame implements OreObsfucation
|
||||
_tournament = true;
|
||||
}
|
||||
|
||||
_customAnimations = new CustomBridgeAnimation[] {
|
||||
new RandomCustomBridgeAnimation(this),
|
||||
new RadiusCustomBridgeAnimation(this)
|
||||
};
|
||||
|
||||
new CompassModule()
|
||||
.setGiveCompassToAlive(true)
|
||||
.register(this);
|
||||
@ -269,6 +279,34 @@ public class Bridge extends TeamGame implements OreObsfucation
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
registerDebugCommand(new DebugCommand("bridge", Rank.ADMIN)
|
||||
{
|
||||
|
||||
@Override
|
||||
public void Execute(Player caller, String[] args)
|
||||
{
|
||||
caller.sendMessage(F.main("Debug", "Spawning the bridges."));
|
||||
_bridgeTime = 3000;
|
||||
}
|
||||
});
|
||||
|
||||
registerDebugCommand(new DebugCommand("bridgeinfo", getArcadeManager().getGameCommandRank())
|
||||
{
|
||||
|
||||
@Override
|
||||
public void Execute(Player caller, String[] args)
|
||||
{
|
||||
if (_animation == null || !(_animation instanceof CustomBridgeAnimation))
|
||||
{
|
||||
caller.sendMessage(F.main("Debug", "The bridge animation for this map isn't a custom one."));
|
||||
return;
|
||||
}
|
||||
|
||||
caller.sendMessage(F.main("Debug", "Bridge Info:"));
|
||||
caller.sendMessage(_animation.toString());
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
@ -354,15 +392,41 @@ public class Bridge extends TeamGame implements OreObsfucation
|
||||
}
|
||||
|
||||
_animation = type.createInstance(this);
|
||||
_animation.onParse();
|
||||
break;
|
||||
}
|
||||
|
||||
// If none of the premade ones are usable then we need a custom one!
|
||||
if (_animation == null)
|
||||
{
|
||||
_animation = new CustomBridgeAnimation(this);
|
||||
_animation.onParse();
|
||||
locationLoop : for (String key : WorldData.GetAllCustomLocs().keySet())
|
||||
{
|
||||
if (!key.startsWith(CUSTOM_BRIDGE_KEY))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
String[] split = key.split(" ");
|
||||
|
||||
if (split.length < 2)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
String subKey = split[1];
|
||||
|
||||
for (CustomBridgeAnimation animation : _customAnimations)
|
||||
{
|
||||
if (animation.getTypeKey().equalsIgnoreCase(subKey))
|
||||
{
|
||||
_animation = animation;
|
||||
break locationLoop;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
_animation.onParse();
|
||||
|
||||
ParseChests();
|
||||
|
||||
ParseOre(WorldData.GetCustomLocs("73")); // Red
|
||||
@ -727,7 +791,7 @@ public class Bridge extends TeamGame implements OreObsfucation
|
||||
|
||||
for (Player player : GetPlayers(true))
|
||||
{
|
||||
borderModule.setSize(player, 1000);
|
||||
borderModule.setSize(player, 10000);
|
||||
}
|
||||
|
||||
Manager.GetExplosion().SetLiquidDamage(true);
|
||||
@ -1713,16 +1777,6 @@ public class Bridge extends TeamGame implements OreObsfucation
|
||||
else
|
||||
return 12;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void debug(PlayerCommandPreprocessEvent event)
|
||||
{
|
||||
if (Manager.GetClients().hasRank(event.getPlayer(), Rank.ADMIN) && event.getMessage().contains("/oretoggle"))
|
||||
_ore.ToggleVisibility();
|
||||
|
||||
if (Manager.GetClients().hasRank(event.getPlayer(), Rank.ADMIN) && event.getMessage().contains("/bridge"))
|
||||
_bridgeTime = 3000;
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
public void disableIceForm(BlockFormEvent event)
|
||||
|
@ -1,153 +0,0 @@
|
||||
package nautilus.game.arcade.game.games.bridge.animation;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.block.Block;
|
||||
|
||||
import mineplex.core.blockrestore.BlockRestore;
|
||||
import mineplex.core.common.util.UtilBlock;
|
||||
import mineplex.core.common.util.UtilMath;
|
||||
import mineplex.core.common.util.UtilParticle;
|
||||
import mineplex.core.common.util.UtilParticle.ParticleType;
|
||||
import mineplex.core.common.util.UtilParticle.ViewDist;
|
||||
import mineplex.core.updater.UpdateType;
|
||||
import nautilus.game.arcade.game.games.bridge.Bridge;
|
||||
|
||||
public class CustomBridgeAnimation extends BridgeAnimation
|
||||
{
|
||||
|
||||
private static final String REGION_KEY = "BRIDGE";
|
||||
private static final String BRIDGE_DATA_KEY = "CUSTOM_BRIDGE";
|
||||
private static final double RATE = 0.5;
|
||||
|
||||
private final BlockRestore _restore;
|
||||
private final Map<Location, Double> _bridgeBlocks;
|
||||
|
||||
private int[] _blockIds;
|
||||
|
||||
private double _maxDistance;
|
||||
private double _minDistance;
|
||||
|
||||
public CustomBridgeAnimation(Bridge bridge)
|
||||
{
|
||||
super(bridge);
|
||||
|
||||
_restore = bridge.getArcadeManager().GetBlockRestore();
|
||||
_bridgeBlocks = new HashMap<>(AVERAGE_BRIDGE_BLOCKS);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onParse()
|
||||
{
|
||||
_maxDistance = 0;
|
||||
|
||||
for (String key : _worldData.GetAllCustomLocs().keySet())
|
||||
{
|
||||
if (!key.startsWith(BRIDGE_DATA_KEY))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
String[] split = key.split(" ");
|
||||
int[] blockIds = new int[split.length - 1];
|
||||
|
||||
for (int i = 1; i < split.length; i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
blockIds[i - 1] = Integer.parseInt(split[i]);
|
||||
}
|
||||
catch (NumberFormatException e)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
_blockIds = blockIds;
|
||||
}
|
||||
|
||||
for (String key : _worldData.GetAllCustomLocs().keySet())
|
||||
{
|
||||
if (!key.startsWith(REGION_KEY))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
List<Location> locations = _worldData.GetCustomLocs(key);
|
||||
|
||||
if (locations.size() < 2)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
for (Block block : UtilBlock.getInBoundingBox(locations.get(0), locations.get(1)))
|
||||
{
|
||||
boolean shouldAdd = false;
|
||||
|
||||
for (int id : _blockIds)
|
||||
{
|
||||
if (block.getTypeId() == id)
|
||||
{
|
||||
shouldAdd = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!shouldAdd)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
double dist = UtilMath.offset2d(block.getLocation(), _bridge.GetSpectatorLocation());
|
||||
|
||||
if (dist > _maxDistance)
|
||||
{
|
||||
_maxDistance = dist;
|
||||
}
|
||||
|
||||
_restore.add(block, Material.AIR.getId(), (byte) 0, Integer.MAX_VALUE);
|
||||
_bridgeBlocks.put(block.getLocation(), dist);
|
||||
}
|
||||
}
|
||||
|
||||
_minDistance = _maxDistance;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUpdate(UpdateType type)
|
||||
{
|
||||
if (type != UpdateType.FAST)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_minDistance -= RATE;
|
||||
|
||||
Iterator<Location> iterator = _bridgeBlocks.keySet().iterator();
|
||||
|
||||
while (iterator.hasNext())
|
||||
{
|
||||
Location location = iterator.next();
|
||||
double dist = _bridgeBlocks.get(location);
|
||||
|
||||
if (dist > _minDistance)
|
||||
{
|
||||
Block block = location.getBlock();
|
||||
|
||||
_restore.restore(block);
|
||||
UtilParticle.PlayParticleToAll(ParticleType.FIREWORKS_SPARK, block.getLocation().add(0.5, 1.5, 0.5), 0.25F, 0.25F, 0.25F, 0.05F, 5, ViewDist.NORMAL);
|
||||
|
||||
location.getWorld().playSound(location, Sound.ZOMBIE_UNFECT, 1.5F, 1);
|
||||
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -108,7 +108,7 @@ public class WoodBridgeAnimation extends BridgeAnimation
|
||||
}
|
||||
}
|
||||
|
||||
if (toDo.size() == 0)
|
||||
if (toDo.isEmpty())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
@ -0,0 +1,246 @@
|
||||
package nautilus.game.arcade.game.games.bridge.animation.custom;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import org.bukkit.Effect;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.Block;
|
||||
|
||||
import mineplex.core.blockrestore.BlockRestore;
|
||||
import mineplex.core.common.util.UtilBlock;
|
||||
import mineplex.core.common.util.UtilMath;
|
||||
import mineplex.core.common.util.UtilParticle;
|
||||
import mineplex.core.common.util.UtilParticle.ParticleType;
|
||||
import mineplex.core.common.util.UtilParticle.ViewDist;
|
||||
import nautilus.game.arcade.game.games.bridge.Bridge;
|
||||
import nautilus.game.arcade.game.games.bridge.animation.BridgeAnimation;
|
||||
|
||||
public abstract class CustomBridgeAnimation extends BridgeAnimation
|
||||
{
|
||||
|
||||
private static final String BLOCK_IDS_KEY = "BLOCK_IDS";
|
||||
private static final String RATE_KEY = "RATE";
|
||||
private static final String PARTICLE_KEY = "PARTICLE";
|
||||
private static final String SOUND_KEY = "SOUND";
|
||||
private static final String REGION_KEY = "BRIDGE";
|
||||
|
||||
protected final BlockRestore _restore;
|
||||
|
||||
private final String _typeKey;
|
||||
protected final Map<Location, Double> _bridgeBlocks;
|
||||
|
||||
// Configuration
|
||||
protected List<Integer> _blockIds;
|
||||
protected int _rate;
|
||||
protected ParticleType _particle;
|
||||
|
||||
// Sound
|
||||
protected Sound _sound;
|
||||
protected float _pitch;
|
||||
|
||||
protected double _maxDistance;
|
||||
|
||||
public CustomBridgeAnimation(Bridge bridge, String typeKey)
|
||||
{
|
||||
super(bridge);
|
||||
|
||||
_restore = bridge.getArcadeManager().GetBlockRestore();
|
||||
|
||||
_typeKey = typeKey;
|
||||
_bridgeBlocks = new HashMap<>(AVERAGE_BRIDGE_BLOCKS);
|
||||
|
||||
// Defaults
|
||||
// Wood, Logs, Fences
|
||||
_blockIds = Arrays.asList(5, 17, 85);
|
||||
_rate = 1;
|
||||
_particle = ParticleType.BLOCK_DUST;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onParse()
|
||||
{
|
||||
List<Integer> blockIds = new ArrayList<>();
|
||||
|
||||
for (String key : _worldData.GetAllCustomLocs().keySet())
|
||||
{
|
||||
String[] split = key.split(" ");
|
||||
String subKey = split[0];
|
||||
|
||||
if (split.length < 2)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
switch (subKey)
|
||||
{
|
||||
|
||||
case BLOCK_IDS_KEY:
|
||||
// Set the block ids that the animation will use
|
||||
|
||||
for (int i = 1; i < split.length; i++)
|
||||
{
|
||||
try
|
||||
{
|
||||
blockIds.add(Integer.parseInt(split[i]));
|
||||
}
|
||||
catch (NumberFormatException e)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case RATE_KEY:
|
||||
// Set the rate at which the animation will run at
|
||||
|
||||
try
|
||||
{
|
||||
_rate = Integer.parseInt(split[1]);
|
||||
}
|
||||
catch (NumberFormatException e)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case PARTICLE_KEY:
|
||||
// Set which type of particle will be displayed when a block
|
||||
// spawns
|
||||
|
||||
try
|
||||
{
|
||||
_particle = ParticleType.valueOf(split[1]);
|
||||
}
|
||||
catch (IllegalArgumentException e)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case SOUND_KEY:
|
||||
// Set the sound and pitch that will be played when a block
|
||||
// spawns
|
||||
|
||||
if (split.length < 3)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
_sound = Sound.valueOf(split[1]);
|
||||
}
|
||||
catch (IllegalArgumentException e)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
_pitch = Float.parseFloat(split[2]);
|
||||
}
|
||||
catch (NumberFormatException e)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Set configuration values
|
||||
_blockIds = blockIds;
|
||||
|
||||
// Save all blocks in a big map.
|
||||
for (String key : _worldData.GetAllCustomLocs().keySet())
|
||||
{
|
||||
if (!key.startsWith(REGION_KEY))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
List<Location> locations = _worldData.GetCustomLocs(key);
|
||||
|
||||
if (locations.size() < 2)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
for (Block block : UtilBlock.getInBoundingBox(locations.get(0), locations.get(1)))
|
||||
{
|
||||
if (!_blockIds.contains(block.getTypeId()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
double dist = UtilMath.offset2d(block.getLocation(), _bridge.GetSpectatorLocation());
|
||||
|
||||
if (dist > _maxDistance)
|
||||
{
|
||||
_maxDistance = dist;
|
||||
}
|
||||
|
||||
_restore.add(block, Material.AIR.getId(), (byte) 0, Integer.MAX_VALUE);
|
||||
_bridgeBlocks.put(block.getLocation(), dist);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void onBlockSet(Block block)
|
||||
{
|
||||
World world = _worldData.World;
|
||||
Location location = block.getLocation().add(0.5, 0.5, 0.5);
|
||||
|
||||
if (_particle != null)
|
||||
{
|
||||
if (_particle == ParticleType.BLOCK_DUST)
|
||||
{
|
||||
world.playEffect(location, Effect.STEP_SOUND, block.getType(), block.getData());
|
||||
}
|
||||
else
|
||||
{
|
||||
UtilParticle.PlayParticleToAll(_particle, block.getLocation(), 0.5F, 0.5F, 0.5F, 0.5F, 5, ViewDist.NORMAL);
|
||||
}
|
||||
}
|
||||
|
||||
if (_sound != null)
|
||||
{
|
||||
world.playSound(location, _sound, 1, _pitch);
|
||||
}
|
||||
}
|
||||
|
||||
public final String getTypeKey()
|
||||
{
|
||||
return _typeKey;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
StringBuilder builder = new StringBuilder();
|
||||
|
||||
builder.append("Type: " + _typeKey).append("\n");
|
||||
builder.append("Bridge Blocks: " + _bridgeBlocks.size()).append("\n");
|
||||
builder.append("Block Ids: " + _blockIds).append("\n");
|
||||
builder.append("Rate: " + _rate).append("\n");
|
||||
builder.append("Particle: " + (_particle == null ? "Null" : _particle.getFriendlyName())).append("\n");
|
||||
builder.append("Sound: " + (_sound == null ? "Null" : _sound.toString() + " Pitch: " + _pitch)).append("\n");
|
||||
builder.append("Max Distance: " + _maxDistance).append("\n");
|
||||
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,58 @@
|
||||
package nautilus.game.arcade.game.games.bridge.animation.custom;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.Block;
|
||||
|
||||
import mineplex.core.updater.UpdateType;
|
||||
import nautilus.game.arcade.game.games.bridge.Bridge;
|
||||
|
||||
public class RadiusCustomBridgeAnimation extends CustomBridgeAnimation
|
||||
{
|
||||
|
||||
private double _minDistance;
|
||||
|
||||
public RadiusCustomBridgeAnimation(Bridge bridge)
|
||||
{
|
||||
super(bridge, "RADIUS");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onParse()
|
||||
{
|
||||
super.onParse();
|
||||
|
||||
_minDistance = _maxDistance;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUpdate(UpdateType type)
|
||||
{
|
||||
if (type != UpdateType.FAST)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_minDistance -= _rate;
|
||||
|
||||
Iterator<Location> iterator = _bridgeBlocks.keySet().iterator();
|
||||
|
||||
while (iterator.hasNext())
|
||||
{
|
||||
Location location = iterator.next();
|
||||
double dist = _bridgeBlocks.get(location);
|
||||
|
||||
if (dist > _minDistance)
|
||||
{
|
||||
Block block = location.getBlock();
|
||||
|
||||
_restore.restore(block);
|
||||
onBlockSet(block);
|
||||
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,44 @@
|
||||
package nautilus.game.arcade.game.games.bridge.animation.custom;
|
||||
|
||||
import java.util.Iterator;
|
||||
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.block.Block;
|
||||
|
||||
import mineplex.core.updater.UpdateType;
|
||||
import nautilus.game.arcade.game.games.bridge.Bridge;
|
||||
|
||||
public class RandomCustomBridgeAnimation extends CustomBridgeAnimation
|
||||
{
|
||||
|
||||
public RandomCustomBridgeAnimation(Bridge bridge)
|
||||
{
|
||||
super(bridge, "RANDOM");
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onUpdate(UpdateType type)
|
||||
{
|
||||
if (type != UpdateType.TICK)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Iterator<Location> iterator = _bridgeBlocks.keySet().iterator();
|
||||
int i = 0;
|
||||
|
||||
while (iterator.hasNext() && i < _rate)
|
||||
{
|
||||
i++;
|
||||
Location location = iterator.next();
|
||||
|
||||
Block block = location.getBlock();
|
||||
|
||||
_restore.restore(block);
|
||||
onBlockSet(block);
|
||||
|
||||
iterator.remove();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
Loading…
Reference in New Issue
Block a user