armark1ng

Untitled

May 28th, 2016
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.86 KB | None | 0 0
  1. package com.rs.game.route;
  2.  
  3. /**
  4. * Class, controlling the exit point of a route.
  5. */
  6. public abstract class RouteStrategy {
  7.  
  8. public static final int BLOCK_FLAG_NORTH = 0x1;
  9. public static final int BLOCK_FLAG_EAST = 0x2;
  10. public static final int BLOCK_FLAG_SOUTH = 0x4;
  11. public static final int BLOCK_FLAG_WEST = 0x8;
  12.  
  13. /**
  14. * Whether we can exit at specific x and y.
  15. */
  16. public abstract boolean canExit(int currentX, int currentY, int sizeXY, int[][] clip, int clipBaseX, int clipBaseY);
  17.  
  18. /**
  19. * Get's approximated destination position X.
  20. */
  21. public abstract int getApproxDestinationX();
  22.  
  23. /**
  24. * Get's approximated destination position Y.
  25. */
  26. public abstract int getApproxDestinationY();
  27.  
  28. /**
  29. * Get's approximated destination size X.
  30. */
  31. public abstract int getApproxDestinationSizeX();
  32.  
  33. /**
  34. * Get's approximated destination size Y.
  35. */
  36. public abstract int getApproxDestinationSizeY();
  37.  
  38. /**
  39. * Whether this strategy equals to other object.
  40. */
  41. public abstract boolean equals(Object other);
  42.  
  43.  
  44. /**
  45. * Check's if we can interact wall decoration from current position.
  46. */
  47. protected static boolean checkWallDecorationInteract(int[][] clip, int currentX, int currentY, int sizeXY, int targetX, int targetY, int targetType, int targetRotation) {
  48. // TODO, include additional checks for size's bigger than 1.
  49. if (currentX == targetX && currentY == targetY)
  50. return true;
  51. if (targetType == 6 || targetType == 7) {
  52. if (targetType == 7)
  53. targetRotation = targetRotation + 2 & 0x3;
  54. if (targetRotation == 0) {
  55. if (currentX == (targetX + 1) && currentY == targetY && (clip[currentX][currentY] & Flags.WALLOBJ_WEST) == 0)
  56. return true;
  57. if (currentX == targetX && currentY == (targetY - 1) && (clip[currentX][currentY] & Flags.WALLOBJ_NORTH) == 0)
  58. return true;
  59. }
  60. else if (targetRotation == 1) {
  61. if (currentX == (targetX - 1) && currentY == targetY && (clip[currentX][currentY] & Flags.WALLOBJ_EAST) == 0)
  62. return true;
  63. if (currentX == targetX && currentY == (targetY - 1) && (clip[currentX][currentY] & Flags.WALLOBJ_NORTH) == 0)
  64. return true;
  65. } else if (targetRotation == 2) {
  66. if (currentX == (targetX - 1) && currentY == targetY && (clip[currentX][currentY] & Flags.WALLOBJ_EAST) == 0)
  67. return true;
  68. if (currentX == targetX && currentY == (targetY + 1) && (clip[currentX][currentY] & Flags.WALLOBJ_SOUTH) == 0)
  69. return true;
  70. } else if (targetRotation == 3) {
  71. if (currentX == (targetX + 1) && currentY == targetY && (clip[currentX][currentY] & Flags.WALLOBJ_WEST) == 0)
  72. return true;
  73. if (currentX == targetX && currentY == (targetY + 1) && (clip[currentX][currentY] & Flags.WALLOBJ_SOUTH) == 0)
  74. return true;
  75. }
  76. }
  77. else if (targetType == 8) {
  78. if (currentX == targetX && currentY == (targetY + 1) && (clip[currentX][currentY] & Flags.WALLOBJ_SOUTH) == 0)
  79. return true;
  80. if (currentX == targetX && currentY == (targetY - 1) && (clip[currentX][currentY] & Flags.WALLOBJ_NORTH) == 0)
  81. return true;
  82. if (currentX == (targetX - 1) && currentY == targetY && (clip[currentX][currentY] & Flags.WALLOBJ_EAST) == 0)
  83. return true;
  84. if (currentX == (targetX + 1) && currentY == targetY && (clip[currentX][currentY] & Flags.WALLOBJ_WEST) == 0)
  85. return true;
  86. }
  87. return false;
  88. }
  89.  
  90.  
  91. /**
  92. * Check's if we can interact wall object from current position.
  93. */
  94. protected static boolean checkWallInteract(int[][] clips, int currentX, int currentY, int sizeXY, int targetX, int targetY, int targetType, int targetRotation) {
  95. // TODO refactor
  96. if (sizeXY == 1) {
  97. if (currentX == targetX && currentY == targetY)
  98. return true; // we are inside the object
  99. } else if (targetX >= currentX && targetX <= currentX + sizeXY - 1 && targetY <= targetY + sizeXY - 1)
  100. return true; // we are inside the object bounds , though no y check?
  101. if (sizeXY == 1) {
  102. if (targetType == 0) {
  103. if (targetRotation == 0) {
  104. if (targetX - 1 == currentX && currentY == targetY)
  105. return true;
  106. if (currentX == targetX && targetY + 1 == currentY && (clips[currentX][currentY] & 0x2c0120) == 0)
  107. return true;
  108. if (targetX == currentX && currentY == targetY - 1 && (clips[currentX][currentY] & 0x2c0102) == 0)
  109. return true;
  110. } else if (targetRotation == 1) {
  111. if (currentX == targetX && targetY + 1 == currentY)
  112. return true;
  113. if (currentX == targetX - 1 && targetY == currentY && (clips[currentX][currentY] & 0x2c0108) == 0)
  114. return true;
  115. if (targetX + 1 == currentX && currentY == targetY && (clips[currentX][currentY] & 0x2c0180) == 0)
  116. return true;
  117. } else if (targetRotation == 2) {
  118. if (targetX + 1 == currentX && currentY == targetY)
  119. return true;
  120. if (targetX == currentX && currentY == targetY + 1 && (clips[currentX][currentY] & 0x2c0120) == 0)
  121. return true;
  122. if (targetX == currentX && currentY == targetY - 1 && (clips[currentX][currentY] & 0x2c0102) == 0)
  123. return true;
  124. } else if (targetRotation == 3) {
  125. if (currentX == targetX && targetY - 1 == currentY)
  126. return true;
  127. if (targetX - 1 == currentX && currentY == targetY && (clips[currentX][currentY] & 0x2c0108) == 0)
  128. return true;
  129. if (targetX + 1 == currentX && targetY == currentY && (clips[currentX][currentY] & 0x2c0180) == 0)
  130. return true;
  131. }
  132. }
  133. if (targetType == 2) {
  134. if (targetRotation == 0) {
  135. if (currentX == targetX - 1 && currentY == targetY)
  136. return true;
  137. if (targetX == currentX && targetY + 1 == currentY)
  138. return true;
  139. if (currentX == targetX + 1 && targetY == currentY && (clips[currentX][currentY] & 0x2c0180) == 0)
  140. return true;
  141. if (targetX == currentX && targetY - 1 == currentY && (clips[currentX][currentY] & 0x2c0102) == 0)
  142. return true;
  143. } else if (targetRotation == 1) {
  144. if (targetX - 1 == currentX && targetY == currentY && (clips[currentX][currentY] & 0x2c0108) == 0)
  145. return true;
  146. if (targetX == currentX && targetY + 1 == currentY)
  147. return true;
  148. if (targetX + 1 == currentX && currentY == targetY)
  149. return true;
  150. if (targetX == currentX && currentY == targetY - 1 && (clips[currentX][currentY] & 0x2c0102) == 0)
  151. return true;
  152. } else if (targetRotation == 2) {
  153. if (targetX - 1 == currentX && currentY == targetY && (clips[currentX][currentY] & 0x2c0108) == 0)
  154. return true;
  155. if (currentX == targetX && currentY == targetY + 1 && (clips[currentX][currentY] & 0x2c0120) == 0)
  156. return true;
  157. if (currentX == targetX + 1 && targetY == currentY)
  158. return true;
  159. if (currentX == targetX && targetY - 1 == currentY)
  160. return true;
  161. } else if (targetRotation == 3) {
  162. if (targetX - 1 == currentX && currentY == targetY)
  163. return true;
  164. if (targetX == currentX && targetY + 1 == currentY && (clips[currentX][currentY] & 0x2c0120) == 0)
  165. return true;
  166. if (currentX == targetX + 1 && targetY == currentY && (clips[currentX][currentY] & 0x2c0180) == 0)
  167. return true;
  168. if (currentX == targetX && targetY - 1 == currentY)
  169. return true;
  170. }
  171. }
  172. if (targetType == 9) {
  173. if (targetX == currentX && targetY + 1 == currentY && (clips[currentX][currentY] & 0x20) == 0)
  174. return true;
  175. if (currentX == targetX && targetY - 1 == currentY && (clips[currentX][currentY] & 0x2) == 0)
  176. return true;
  177. if (currentX == targetX - 1 && currentY == targetY && (clips[currentX][currentY] & 0x8) == 0)
  178. return true;
  179. if (currentX == targetX + 1 && currentY == targetY && (clips[currentX][currentY] & 0x80) == 0)
  180. return true;
  181. }
  182. } else {
  183. int i_66_ = currentX + sizeXY - 1;
  184. int i_67_ = sizeXY + currentY - 1;
  185. if (targetType == 0) {
  186. if (targetRotation == 0) {
  187. if (targetX - sizeXY == currentX && targetY >= currentY && targetY <= i_67_)
  188. return true;
  189. if (targetX >= currentX && targetX <= i_66_ && currentY == targetY + 1 && (clips[targetX][currentY] & 0x2c0120) == 0)
  190. return true;
  191. if (targetX >= currentX && targetX <= i_66_ && targetY - sizeXY == currentY && (clips[targetX][i_67_] & 0x2c0102) == 0)
  192. return true;
  193. } else if (targetRotation == 1) {
  194. if (targetX >= currentX && targetX <= i_66_ && targetY + 1 == currentY)
  195. return true;
  196. if (currentX == targetX - sizeXY && targetY >= currentY && targetY <= i_67_ && (clips[i_66_][targetY] & 0x2c0108) == 0)
  197. return true;
  198. if (targetX + 1 == currentX && targetY >= currentY && targetY <= i_67_ && (clips[currentX][targetY] & 0x2c0180) == 0)
  199. return true;
  200. } else if (targetRotation == 2) {
  201. if (targetX + 1 == currentX && targetY >= currentY && targetY <= i_67_)
  202. return true;
  203. if (targetX >= currentX && targetX <= i_66_ && currentY == targetY + 1 && (clips[targetX][currentY] & 0x2c0120) == 0)
  204. return true;
  205. if (targetX >= currentX && targetX <= i_66_ && currentY == targetY - sizeXY && (clips[targetX][i_67_] & 0x2c0102) == 0)
  206. return true;
  207. } else if (targetRotation == 3) {
  208. if (targetX >= currentX && targetX <= i_66_ && targetY - sizeXY == currentY)
  209. return true;
  210. if (currentX == targetX - sizeXY && targetY >= currentY && targetY <= i_67_ && (clips[i_66_][targetY] & 0x2c0108) == 0)
  211. return true;
  212. if (targetX + 1 == currentX && targetY >= currentY && targetY <= i_67_ && (clips[currentX][targetY] & 0x2c0180) == 0)
  213. return true;
  214. }
  215. }
  216. if (targetType == 2) {
  217. if (targetRotation == 0) {
  218. if (targetX - sizeXY == currentX && targetY >= currentY && targetY <= i_67_)
  219. return true;
  220. if (targetX >= currentX && targetX <= i_66_ && targetY + 1 == currentY)
  221. return true;
  222. if (targetX + 1 == currentX && targetY >= currentY && targetY <= i_67_ && (clips[currentX][targetY] & 0x2c0180) == 0)
  223. return true;
  224. if (targetX >= currentX && targetX <= i_66_ && targetY - sizeXY == currentY && (clips[targetX][i_67_] & 0x2c0102) == 0)
  225. return true;
  226. } else if (targetRotation == 1) {
  227. if (currentX == targetX - sizeXY && targetY >= currentY && targetY <= i_67_ && (clips[i_66_][targetY] & 0x2c0108) == 0)
  228. return true;
  229. if (targetX >= currentX && targetX <= i_66_ && currentY == targetY + 1)
  230. return true;
  231. if (targetX + 1 == currentX && targetY >= currentY && targetY <= i_67_)
  232. return true;
  233. if (targetX >= currentX && targetX <= i_66_ && currentY == targetY - sizeXY && (clips[targetX][i_67_] & 0x2c0102) == 0)
  234. return true;
  235. } else if (targetRotation == 2) {
  236. if (currentX == targetX - sizeXY && targetY >= currentY && targetY <= i_67_ && (clips[i_66_][targetY] & 0x2c0108) == 0)
  237. return true;
  238. if (targetX >= currentX && targetX <= i_66_ && targetY + 1 == currentY && (clips[targetX][currentY] & 0x2c0120) == 0)
  239. return true;
  240. if (targetX + 1 == currentX && targetY >= currentY && targetY <= i_67_)
  241. return true;
  242. if (targetX >= currentX && targetX <= i_66_ && currentY == targetY - sizeXY)
  243. return true;
  244. } else if (targetRotation == 3) {
  245. if (targetX - sizeXY == currentX && targetY >= currentY && targetY <= i_67_)
  246. return true;
  247. if (targetX >= currentX && targetX <= i_66_ && currentY == targetY + 1 && (clips[targetX][currentY] & 0x2c0120) == 0)
  248. return true;
  249. if (targetX + 1 == currentX && targetY >= currentY && targetY <= i_67_ && (clips[currentX][targetY] & 0x2c0180) == 0)
  250. return true;
  251. if (targetX >= currentX && targetX <= i_66_ && currentY == targetY - sizeXY)
  252. return true;
  253. }
  254. }
  255. if (targetType == 9) {
  256. if (targetX >= currentX && targetX <= i_66_ && targetY + 1 == currentY && (clips[targetX][currentY] & 0x2c0120) == 0)
  257. return true;
  258. if (targetX >= currentX && targetX <= i_66_ && targetY - sizeXY == currentY && (clips[targetX][i_67_] & 0x2c0102) == 0)
  259. return true;
  260. if (targetX - sizeXY == currentX && targetY >= currentY && targetY <= i_67_ && (clips[i_66_][targetY] & 0x2c0108) == 0)
  261. return true;
  262. if (currentX == targetX + 1 && targetY >= currentY && targetY <= i_67_ && (clips[currentX][targetY] & 0x2c0180) == 0)
  263. return true;
  264. }
  265. }
  266. return false;
  267. }
  268.  
  269. /**
  270. * Check's if we can interact filled rectangular (Might be ground object or npc or player etc) from current position.
  271. */
  272. protected static boolean checkFilledRectangularInteract(int[][] clip, int currentX, int currentY, int sizeX, int sizeY, int targetX, int targetY, int targetSizeX, int targetSizeY, int accessBlockFlag) {
  273. // TODO refactor
  274. int srcEndX = currentX + sizeX;
  275. int srcEndY = currentY + sizeY;
  276. int destEndX = targetX + targetSizeX;
  277. int destEndY = targetY + targetSizeY;
  278. if (destEndX == currentX && (accessBlockFlag & 0x2) == 0) { // can we enter from east ?
  279. int i_12_ = currentY > targetY ? currentY : targetY;
  280. for (int i_13_ = srcEndY < destEndY ? srcEndY : destEndY; i_12_ < i_13_; i_12_++) {
  281. if (((clip[destEndX - 1][i_12_]) & 0x8) == 0)
  282. return true;
  283. }
  284. } else if (srcEndX == targetX && (accessBlockFlag & 0x8) == 0) { // can we enter from west ?
  285. int i_14_ = currentY > targetY ? currentY : targetY;
  286. for (int i_15_ = srcEndY < destEndY ? srcEndY : destEndY; i_14_ < i_15_; i_14_++) {
  287. if (((clip[targetX ][i_14_]) & 0x80) == 0)
  288. return true;
  289. }
  290. } else if (currentY == destEndY && (accessBlockFlag & 0x1) == 0) { // can we enter from north?
  291. int i_16_ = currentX > targetX ? currentX : targetX;
  292. for (int i_17_ = srcEndX < destEndX ? srcEndX : destEndX; i_16_ < i_17_; i_16_++) {
  293. if (((clip[i_16_][destEndY - 1]) & 0x2) == 0)
  294. return true;
  295. }
  296. } else if (targetY == srcEndY && (accessBlockFlag & 0x4) == 0) { // can we enter from south?
  297. int i_18_ = currentX > targetX ? currentX : targetX;
  298. for (int i_19_ = srcEndX < destEndX ? srcEndX : destEndX; i_18_ < i_19_; i_18_++) {
  299. if (((clip[i_18_][targetY]) & 0x20) == 0)
  300. return true;
  301. }
  302. }
  303. return false;
  304. }
  305.  
  306. }
Advertisement
Add Comment
Please, Sign In to add comment