doors.txt 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. event.load("block_click");
  2. doors = list.new();
  3. orig_value_map = map.new();
  4. doors_tag = block.getTag("minecraft:wooden_doors");
  5. trapdoors_tag = block.getTag("minecraft:wooden_trapdoors");
  6. fencegates_tag = block.getTag("minecraft:fence_gates");
  7. block_sound_category = sound.getCategory("BLOCKS");
  8. open_door_sound = sound.get("block.wooden_door.open");
  9. close_door_sound = sound.get("block.wooden_door.close");
  10. open_trapdoor_sound = sound.get("block.wooden_trapdoor.open");
  11. close_trapdoor_sound = sound.get("block.wooden_trapdoor.close");
  12. open_fencegate_sound = sound.get("block.fence_gate.open");
  13. close_fencegate_sound = sound.get("block.fence_gate.close");
  14. msg.string("dev", "§bDoors §rloaded.");
  15. @main
  16. wait();
  17. loc = entity.getLocation(player);
  18. world_name = world.getName(loc.getWorld(loc));
  19. if(world.isSurvName(world_name)) {
  20. ignoreGoto(event);
  21. }
  22. goto("main");
  23. @block_click
  24. if(block == null) {
  25. goto("main");
  26. }
  27. if (player.isSneaking(player)) {
  28. goto("main");
  29. }
  30. if(block.isAutomaticDoor(block) && action == "RIGHT_CLICK_BLOCK") {
  31. if(cancel) {
  32. goto("main");
  33. }
  34. player_spec = player.getAutoCloseDoor(player);
  35. open_value = block.isOpen(block);
  36. if(block.isDoor(block)) {
  37. goto("door");
  38. }elseif(block.isTrapdoor(block)) {
  39. goto("trapdoor");
  40. }
  41. if(player_spec) {
  42. block_loc = block.getLocation(block);
  43. if(!map.contains(orig_value_map, block_loc)) {
  44. map.add(orig_value_map, block_loc, open_value);
  45. }
  46. list.add(doors, block);
  47. sgoto(60, "closedoor");
  48. }
  49. }
  50. goto("main");
  51. @door
  52. if(!open_value) {
  53. if(player_spec) {
  54. list.add(doors, block);
  55. sgoto(60, "closedoor");
  56. }
  57. }
  58. //Double door
  59. door_block_2 = block.getSecondDoor(block);
  60. if(door_block_2 == null) {
  61. goto("main");
  62. }
  63. open_value_2 = block.isOpen(door_block_2);
  64. if(open_value && open_value_2) {
  65. door.open(door_block_2, false);
  66. } elseif(!open_value && !open_value_2) {
  67. door.open(door_block_2, true);
  68. if(player_spec) {
  69. list.add(doors, door_block_2);
  70. sgoto(60, "closedoor");
  71. }
  72. }
  73. goto("main");
  74. @trapdoor
  75. open_value = block.isOpen(block);
  76. state_facing = block.getDirectionalFace(block);
  77. trapdoors = list.new();
  78. block_loc = block.getLocation(block);
  79. list.add(trapdoors, block_loc);
  80. if(player_spec) {
  81. list.add(doors, block);
  82. if(!map.contains(orig_value_map, block_loc)) {
  83. map.add(orig_value_map, block_loc, open_value);
  84. }
  85. sgoto(60, "closedoor");
  86. }
  87. if(state_facing == "NORTH" || state_facing == "SOUTH") {
  88. trapdoor_loc_2 = loc.mod(block_loc, -1, 0, 0);
  89. trapdoor_loc_3 = loc.mod(block_loc, 1, 0, 0);
  90. if (state_facing == "NORTH") {
  91. opposite_loc = loc.mod(block_loc, 0, 0, -1);
  92. } else {
  93. opposite_loc = loc.mod(block_loc, 0, 0, 1);
  94. }
  95. } elseif(state_facing == "EAST" || state_facing == "WEST") {
  96. trapdoor_loc_2 = loc.mod(block_loc, 0, 0, -1);
  97. trapdoor_loc_3 = loc.mod(block_loc, 0, 0, 1);
  98. if (state_facing == "EAST"){
  99. opposite_loc = loc.mod(block_loc, 1, 0, 0);
  100. } else {
  101. opposite_loc = loc.mod(block_loc, -1, 0, 0);
  102. }
  103. }
  104. block2 = block.get(trapdoor_loc_2);
  105. block3 = block.get(trapdoor_loc_3);
  106. block4 = block.get(opposite_loc);
  107. if (isNeighbouring_Trapdoor(block2, state_facing)) {
  108. list.add(trapdoors, trapdoor_loc_2);
  109. if(player_spec) {
  110. list.add(doors, block2);
  111. if(!map.contains(orig_value_map, trapdoor_loc_2)) {
  112. map.add(orig_value_map, trapdoor_loc_2, open_value);
  113. }
  114. sgoto(60, "closedoor");
  115. }
  116. }
  117. if (isNeighbouring_Trapdoor(block3, state_facing)) {
  118. list.add(trapdoors, trapdoor_loc_3);
  119. if(player_spec) {
  120. list.add(doors, block3);
  121. if(!map.contains(orig_value_map, trapdoor_loc_3)) {
  122. map.add(orig_value_map, trapdoor_loc_3, open_value);
  123. }
  124. sgoto(60, "closedoor");
  125. }
  126. }
  127. if ( isOpposite_Trapdoor(block4, state_facing)){
  128. list.add(trapdoors, opposite_loc);
  129. state_facing2 = block.getDirectionalFace(block4);
  130. if(player_spec) {
  131. list.add(doors, block4);
  132. if(!map.contains(orig_value_map, opposite_loc)) {
  133. map.add(orig_value_map, opposite_loc, open_value);
  134. }
  135. sgoto(60, "closedoor");
  136. }
  137. if(state_facing == "NORTH" || state_facing == "SOUTH") {
  138. ntrapdoor_loc_2 = loc.mod(opposite_loc, -1, 0, 0);
  139. ntrapdoor_loc_3 = loc.mod(opposite_loc, 1, 0, 0);
  140. }elseif(state_facing == "EAST" || state_facing == "WEST") {
  141. ntrapdoor_loc_2 = loc.mod(opposite_loc, 0, 0, -1);
  142. ntrapdoor_loc_3 = loc.mod(opposite_loc, 0, 0, 1);
  143. }
  144. nblock2 = block.get(ntrapdoor_loc_2);
  145. nblock3 = block.get(ntrapdoor_loc_3);
  146. if (isNeighbouring_Trapdoor(nblock2, state_facing2)){
  147. list.add(trapdoors, ntrapdoor_loc_2);
  148. if(player_spec) {
  149. list.add(doors, nblock2);
  150. if(!map.contains(orig_value_map, ntrapdoor_loc_2)) {
  151. map.add(orig_value_map, ntrapdoor_loc_2, open_value);
  152. }
  153. sgoto(60, "closedoor");
  154. }
  155. }
  156. if (isNeighbouring_Trapdoor(nblock3, state_facing2)){
  157. list.add(trapdoors, ntrapdoor_loc_3);
  158. if(player_spec) {
  159. list.add(doors, nblock3);
  160. if(!map.contains(orig_value_map, ntrapdoor_loc_3)) {
  161. map.add(orig_value_map, ntrapdoor_loc_3, open_value);
  162. }
  163. sgoto(60, "closedoor");
  164. }
  165. }
  166. }
  167. door.openlist(trapdoors, open_value);
  168. goto("main");
  169. @closedoor
  170. block = list.getIndex(doors, 0);
  171. list.removeIndex(doors, 0);
  172. if(block.isAutomaticDoor(block)) {
  173. //close door
  174. open_value = block.isOpen(block);
  175. if(block.isDoor(block)) {
  176. if(open_value) {
  177. door.open(block, false);
  178. }
  179. goto("main");
  180. }
  181. //toggle door
  182. door_loc = block.getLocation(block);
  183. orig_value = map.get(orig_value_map, door_loc);
  184. if(orig_value == null) {
  185. goto("main");
  186. }
  187. map.remove(orig_value_map, door_loc);
  188. if(orig_value == open_value) {
  189. goto("main");
  190. }
  191. door.open(block, !open_value);
  192. }
  193. goto("main");
  194. function door.openlist(doors_list, open_value){
  195. list_it = iterator(doors_list);
  196. //msg("dev",text.new(doors_list));
  197. while (hasNext(list_it)){
  198. door_loc = next(list_it);
  199. block2 = block.get(door_loc);
  200. open_value_2 = block.isOpen(block2);
  201. if(open_value && open_value_2) {
  202. door.open(block2, false);
  203. } elseif(!open_value && !open_value_2) {
  204. door.open(block2, true);
  205. }
  206. }
  207. }
  208. function door.open(block, boolean) {
  209. block.setOpen(block, boolean);
  210. //sound
  211. location = block.getLocation(block);
  212. if(boolean) {
  213. if(block.hasTag(block, $doors_tag)) {
  214. sound.spawn(location, $open_door_sound, $block_sound_category);
  215. } elseif(block.hasTag(block, $trapdoors_tag)) {
  216. sound.spawn(location, $open_trapdoor_sound, $block_sound_category);
  217. } elseif(block.hasTag(block, $fencegates_tag)) {
  218. sound.spawn(location, $open_fencegate_sound, $block_sound_category);
  219. }
  220. } else {
  221. if(block.hasTag(block, $doors_tag)) {
  222. sound.spawn(location, $close_door_sound, $block_sound_category);
  223. } elseif(block.hasTag(block, $trapdoors_tag)) {
  224. sound.spawn(location, $close_trapdoor_sound, $block_sound_category);
  225. } elseif(block.hasTag(block, $fencegates_tag)) {
  226. sound.spawn(location, $close_fencegate_sound, $block_sound_category);
  227. }
  228. }
  229. }
  230. function block.getSecondDoor(door_block_1) {
  231. door_loc_1 = block.getLocation(door_block_1);
  232. state_facing = block.getDirectionalFace(door_block_1);
  233. state_hinge = block.getDoorHinge(door_block_1);
  234. if(state_facing == "NORTH") {
  235. if(state_hinge == "RIGHT") {
  236. door_loc_2 = loc.mod(door_loc_1, -1, 0, 0);
  237. } else {
  238. door_loc_2 = loc.mod(door_loc_1, 1, 0, 0);
  239. }
  240. } elseif(state_facing == "EAST") {
  241. if(state_hinge == "RIGHT") {
  242. door_loc_2 = loc.mod(door_loc_1, 0, 0, -1);
  243. } else {
  244. door_loc_2 = loc.mod(door_loc_1, 0, 0, 1);
  245. }
  246. } elseif(state_facing == "SOUTH") {
  247. if(state_hinge == "RIGHT") {
  248. door_loc_2 = loc.mod(door_loc_1, 1, 0, 0);
  249. } else {
  250. door_loc_2 = loc.mod(door_loc_1, -1, 0, 0);
  251. }
  252. } else {
  253. if(state_hinge == "RIGHT") {
  254. door_loc_2 = loc.mod(door_loc_1, 0, 0, 1);
  255. } else {
  256. door_loc_2 = loc.mod(door_loc_1, 0, 0, -1);
  257. }
  258. }
  259. door_block_2 = block.get(door_loc_2);
  260. if(block.hasTag(door_block_2, $doors_tag)) {
  261. if(block.isSameDoorHalf(door_block_1, door_block_2)) {
  262. state_hinge_2 = block.getDoorHinge(door_block_2);
  263. if(state_hinge == "LEFT" && state_hinge_2 == "RIGHT" || state_hinge == "RIGHT" && state_hinge_2 == "LEFT") {
  264. return door_block_2;
  265. }
  266. }
  267. }
  268. return null;
  269. }
  270. function isNeighbouring_Trapdoor(block, state_facing){
  271. if(block.isTrapdoor(block)){
  272. return block.getDirectionalFace(block) == state_facing;
  273. }
  274. return false;
  275. }
  276. function isOpposite_Trapdoor(block, state_facing){
  277. if(!block.isTrapdoor(block)){
  278. return false;
  279. }
  280. state_facing2 = block.getDirectionalFace(block);
  281. if (state_facing == "NORTH" && state_facing2 == "SOUTH" || state_facing == "SOUTH" && state_facing2 == "NORTH"){
  282. return true;
  283. }
  284. if (state_facing == "EAST" && state_facing2 == "WEST" || state_facing == "WEST" && state_facing2 == "EAST"){
  285. return true;
  286. }
  287. return false;
  288. }
  289. function block.isSameDoorHalf(door_block_1, door_block_2) {
  290. state_half = block.getBisectedHalf(door_block_1);
  291. state_half_2 = block.getBisectedHalf(door_block_2);
  292. return state_half == state_half_2;
  293. }
  294. function block.isAutomaticDoor(block) {
  295. return block.hasTag(block, $doors_tag) || block.hasTag(block, $trapdoors_tag) || block.hasTag(block, $fencegates_tag);
  296. }
  297. function block.isDoor(block) {
  298. return block.hasTag(block, $doors_tag);
  299. }
  300. function block.isTrapdoor(block) {
  301. return block.hasTag(block, $trapdoors_tag);
  302. }