001 package org.bukkit.material; 002 003 import org.bukkit.Material; 004 import org.bukkit.block.BlockFace; 005 006 /** 007 * Represents minecart rails. 008 */ 009 public class Rails extends MaterialData { 010 011 public Rails() { 012 super(Material.RAILS); 013 } 014 015 /** 016 * 017 * @deprecated Magic value 018 */ 019 @Deprecated 020 public Rails(final int type) { 021 super(type); 022 } 023 024 public Rails(final Material type) { 025 super(type); 026 } 027 028 /** 029 * 030 * @deprecated Magic value 031 */ 032 @Deprecated 033 public Rails(final int type, final byte data) { 034 super(type, data); 035 } 036 037 /** 038 * 039 * @deprecated Magic value 040 */ 041 @Deprecated 042 public Rails(final Material type, final byte data) { 043 super(type, data); 044 } 045 046 /** 047 * @return the whether this track is set on a slope 048 */ 049 public boolean isOnSlope() { 050 byte d = getConvertedData(); 051 052 return (d == 0x2 || d == 0x3 || d == 0x4 || d == 0x5); 053 } 054 055 /** 056 * @return the whether this track is set as a curve 057 */ 058 public boolean isCurve() { 059 byte d = getConvertedData(); 060 061 return (d == 0x6 || d == 0x7 || d == 0x8 || d == 0x9); 062 } 063 064 /** 065 * @return the direction these tracks are set 066 * <p> 067 * Note that tracks are bidirectional and that the direction returned 068 * is the ascending direction if the track is set on a slope. If it is 069 * set as a curve, the corner of the track is returned. 070 */ 071 public BlockFace getDirection() { 072 byte d = getConvertedData(); 073 074 switch (d) { 075 case 0x0: 076 default: 077 return BlockFace.SOUTH; 078 079 case 0x1: 080 return BlockFace.EAST; 081 082 case 0x2: 083 return BlockFace.EAST; 084 085 case 0x3: 086 return BlockFace.WEST; 087 088 case 0x4: 089 return BlockFace.NORTH; 090 091 case 0x5: 092 return BlockFace.SOUTH; 093 094 case 0x6: 095 return BlockFace.NORTH_WEST; 096 097 case 0x7: 098 return BlockFace.NORTH_EAST; 099 100 case 0x8: 101 return BlockFace.SOUTH_EAST; 102 103 case 0x9: 104 return BlockFace.SOUTH_WEST; 105 } 106 } 107 108 @Override 109 public String toString() { 110 return super.toString() + " facing " + getDirection() + (isCurve() ? " on a curve" : (isOnSlope() ? " on a slope" : "")); 111 } 112 113 /** 114 * Return the data without the extended properties used by {@link 115 * PoweredRail} and {@link DetectorRail}. Overridden in {@link 116 * ExtendedRails} 117 * 118 * @return the data without the extended part 119 * @deprecated Magic value 120 */ 121 @Deprecated 122 protected byte getConvertedData() { 123 return getData(); 124 } 125 126 /** 127 * Set the direction of these tracks 128 * <p> 129 * Note that tracks are bidirectional and that the direction returned is 130 * the ascending direction if the track is set on a slope. If it is set as 131 * a curve, the corner of the track should be supplied. 132 * 133 * @param face the direction the track should be facing 134 * @param isOnSlope whether or not the track should be on a slope 135 */ 136 public void setDirection(BlockFace face, boolean isOnSlope) { 137 switch (face) { 138 case EAST: 139 setData((byte) (isOnSlope ? 0x2 : 0x1)); 140 break; 141 142 case WEST: 143 setData((byte) (isOnSlope ? 0x3 : 0x1)); 144 break; 145 146 case NORTH: 147 setData((byte) (isOnSlope ? 0x4 : 0x0)); 148 break; 149 150 case SOUTH: 151 setData((byte) (isOnSlope ? 0x5 : 0x0)); 152 break; 153 154 case NORTH_WEST: 155 setData((byte) 0x6); 156 break; 157 158 case NORTH_EAST: 159 setData((byte) 0x7); 160 break; 161 162 case SOUTH_EAST: 163 setData((byte) 0x8); 164 break; 165 166 case SOUTH_WEST: 167 setData((byte) 0x9); 168 break; 169 } 170 } 171 172 @Override 173 public Rails clone() { 174 return (Rails) super.clone(); 175 } 176 }