package net.glowstone.entity.objects; import com.flowpowered.network.Message; import net.glowstone.entity.GlowEntity; import net.glowstone.entity.GlowPlayer; import net.glowstone.inventory.GlowInventory; import net.glowstone.net.message.play.entity.SpawnObjectMessage; import net.glowstone.net.message.play.player.InteractEntityMessage; import net.glowstone.util.Position; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.EntityType; import org.bukkit.entity.Minecart; import org.bukkit.entity.minecart.*; import org.bukkit.event.inventory.InventoryType; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; import org.bukkit.material.MaterialData; import org.bukkit.util.Vector; import java.util.Collections; import java.util.List; public abstract class GlowMinecart extends GlowEntity implements Minecart { private final MinecartType type; public GlowMinecart(Location location, MinecartType type) { super(location); this.type = type; } @Override public List<Message> createSpawnMessage() { double x = location.getX(); double y = location.getY(); double z = location.getZ(); int yaw = Position.getIntYaw(location); int pitch = Position.getIntPitch(location); return Collections.singletonList(new SpawnObjectMessage(id, getUniqueId(), 10, x, y, z, pitch, yaw, type.ordinal())); } @Override public boolean entityInteract(GlowPlayer player, InteractEntityMessage message) { if (message.getAction() == InteractEntityMessage.Action.ATTACK.ordinal()) { // todo: damage points if (this instanceof InventoryHolder) { InventoryHolder inv = (InventoryHolder) this; if (inv.getInventory() != null) { for (ItemStack drop : inv.getInventory().getContents()) { if (drop == null || drop.getType() == Material.AIR || drop.getAmount() < 1) { continue; } GlowItem item = world.dropItemNaturally(getLocation(), drop); item.setPickupDelay(30); item.setBias(player); } } } remove(); } return true; } @Override public void _INVALID_setDamage(int i) { } @Override public void setDamage(double v) { } @Override public int _INVALID_getDamage() { return 0; } @Override public double getDamage() { return 0; } @Override public double getMaxSpeed() { return 0; } @Override public void setMaxSpeed(double v) { } @Override public boolean isSlowWhenEmpty() { return false; } @Override public void setSlowWhenEmpty(boolean b) { } @Override public Vector getFlyingVelocityMod() { return null; } @Override public void setFlyingVelocityMod(Vector vector) { } @Override public Vector getDerailedVelocityMod() { return null; } @Override public void setDerailedVelocityMod(Vector vector) { } @Override public void setDisplayBlock(MaterialData materialData) { } @Override public MaterialData getDisplayBlock() { return null; } @Override public void setDisplayBlockOffset(int i) { } @Override public int getDisplayBlockOffset() { return 0; } @Override public Location getOrigin() { return null; } public MinecartType getMinecartType() { return type; } public enum MinecartType { RIDEABLE(Rideable.class, EntityType.MINECART, RideableMinecart.class), CHEST(Storage.class, EntityType.MINECART_CHEST, StorageMinecart.class), FURNACE(Powered.class, EntityType.MINECART_FURNACE, PoweredMinecart.class), TNT(Explosive.class, EntityType.MINECART_TNT, ExplosiveMinecart.class), SPAWNER(Spawner.class, EntityType.MINECART_MOB_SPAWNER, SpawnerMinecart.class), HOPPER(Hopper.class, EntityType.MINECART_HOPPER, HopperMinecart.class), COMMAND(null, EntityType.MINECART_COMMAND, CommandMinecart.class); // todo private final Class<? extends GlowMinecart> clazz; private final EntityType type; private final Class<? extends Minecart> entityClass; MinecartType(Class<? extends GlowMinecart> clazz, EntityType type, Class<? extends Minecart> entityClass) { this.clazz = clazz; this.type = type; this.entityClass = entityClass; } public Class<? extends GlowMinecart> getMinecartClass() { return clazz; } public EntityType getEntityType() { return type; } public Class<? extends Minecart> getEntityClass() { return entityClass; } } public static class Rideable extends GlowMinecart implements RideableMinecart { public Rideable(Location location) { super(location, MinecartType.RIDEABLE); } @Override public boolean entityInteract(GlowPlayer player, InteractEntityMessage message) { super.entityInteract(player, message); if (message.getAction() != InteractEntityMessage.Action.INTERACT.ordinal()) { return false; } if (player.isSneaking()) { return false; } if (isEmpty()) { // todo: fix passengers // setPassenger(player); return true; } return false; } } public static class Storage extends GlowMinecart implements StorageMinecart { private final Inventory inventory; public Storage(Location location) { super(location, MinecartType.CHEST); inventory = new GlowInventory(this, InventoryType.CHEST, InventoryType.CHEST.getDefaultSize(), "Minecart with Chest"); } @Override public boolean entityInteract(GlowPlayer player, InteractEntityMessage message) { super.entityInteract(player, message); if (message.getAction() != InteractEntityMessage.Action.INTERACT.ordinal()) { return false; } if (player.isSneaking()) { return false; } player.openInventory(inventory); return true; } @Override public Inventory getInventory() { return inventory; } } public static class Powered extends GlowMinecart implements PoweredMinecart { public Powered(Location location) { super(location, MinecartType.FURNACE); } } public static class Explosive extends GlowMinecart implements ExplosiveMinecart { public Explosive(Location location) { super(location, MinecartType.TNT); } } public static class Hopper extends GlowMinecart implements HopperMinecart { private boolean enabled = true; private final Inventory inventory; public Hopper(Location location) { super(location, MinecartType.HOPPER); inventory = new GlowInventory(this, InventoryType.HOPPER, InventoryType.HOPPER.getDefaultSize(), "Minecart with Hopper"); } @Override public boolean isEnabled() { return enabled; } @Override public void setEnabled(boolean enabled) { this.enabled = enabled; } @Override public Inventory getInventory() { return inventory; } @Override public boolean entityInteract(GlowPlayer player, InteractEntityMessage message) { super.entityInteract(player, message); if (message.getAction() != InteractEntityMessage.Action.INTERACT.ordinal()) { return false; } if (player.isSneaking()) { return false; } player.openInventory(inventory); return true; } } public static class Spawner extends GlowMinecart implements SpawnerMinecart { public Spawner(Location location) { super(location, MinecartType.SPAWNER); } } }