doors.txt 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. event.load("block_click");
  2. doors = list.new();
  3. orig_value_map = map.new();
  4. auto_door_tag = block.getTag("km:auto_door");
  5. doors_tag = block.getTag("minecraft:wooden_doors");
  6. trapdoors_tag = block.getTag("minecraft:wooden_trapdoors");
  7. fencegates_tag = block.getTag("minecraft:fence_gates");
  8. block_sound_category = sound.getCategory("BLOCKS");
  9. open_door_sound = sound.get("BLOCK_WOODEN_DOOR_OPEN");
  10. close_door_sound = sound.get("BLOCK_WOODEN_DOOR_CLOSE");
  11. open_trapdoor_sound = sound.get("BLOCK_WOODEN_TRAPDOOR_OPEN");
  12. close_trapdoor_sound = sound.get("BLOCK_WOODEN_TRAPDOOR_CLOSE");
  13. open_fencegate_sound = sound.get("BLOCK_FENCE_GATE_OPEN");
  14. close_fencegate_sound = sound.get("BLOCK_FENCE_GATE_CLOSE");
  15. msg.string("dev", "§bDoors §rloaded.");
  16. @main
  17. wait();
  18. loc = entity.getLocation(player);
  19. world_name = world.getName(loc.getWorld(loc));
  20. if(world.isSurvName(world_name)) {
  21. ignoreGoto(event);
  22. }
  23. goto("main");
  24. @block_click
  25. if(block == null) {
  26. goto("main");
  27. }
  28. if(block.hasTag(block, auto_door_tag) && action == "RIGHT_CLICK_BLOCK") {
  29. if(cancel) {
  30. goto("main");
  31. }
  32. player_spec = player.getAutoCloseDoor(player);
  33. open_value = block.isOpen(block);
  34. if(block.hasTag(block, doors_tag)) {
  35. if(!open_value) {
  36. if(player_spec) {
  37. list.add(doors, block);
  38. sgoto(60, "closedoor");
  39. }
  40. }
  41. //Double door
  42. door_block_2 = block.getSecondDoor(block);
  43. if(door_block_2 == null) {
  44. goto("main");
  45. }
  46. open_value_2 = block.isOpen(door_block_2);
  47. if(open_value && open_value_2) {
  48. door.open(door_block_2, false);
  49. } elseif(!open_value && !open_value_2) {
  50. door.open(door_block_2, true);
  51. if(player_spec) {
  52. list.add(doors, door_block_2);
  53. sgoto(60, "closedoor");
  54. }
  55. }
  56. goto("main");
  57. }
  58. if(player_spec) {
  59. block_loc = block.getLocation(block);
  60. if(!map.contains(orig_value_map, block_loc)) {
  61. map.add(orig_value_map, block_loc, open_value);
  62. }
  63. list.add(doors, block);
  64. sgoto(60, "closedoor");
  65. }
  66. }
  67. goto("main");
  68. @closedoor
  69. block = list.getIndex(doors, 0);
  70. list.removeIndex(doors, 0);
  71. if(block.hasTag(block, auto_door_tag)) {
  72. //close door
  73. open_value = block.isOpen(block);
  74. if(block.hasTag(block, doors_tag)) {
  75. if(open_value) {
  76. door.open(block, false);
  77. }
  78. goto("main");
  79. }
  80. //toggle door
  81. door_loc = block.getLocation(block);
  82. orig_value = map.get(orig_value_map, door_loc);
  83. if(orig_value == null) {
  84. goto("main");
  85. }
  86. map.remove(orig_value_map, door_loc);
  87. if(orig_value == open_value) {
  88. goto("main");
  89. }
  90. if(open_value) {
  91. door.open(block, false);
  92. goto("main");
  93. }
  94. door.open(block, true);
  95. }
  96. goto("main");
  97. function door.open(block, boolean) {
  98. block.setOpen(block, boolean);
  99. //sound
  100. location = block.getLocation(block);
  101. if(boolean) {
  102. if(block.hasTag(block, $doors_tag)) {
  103. sound.spawn(location, $open_door_sound, $block_sound_category);
  104. } elseif(block.hasTag(block, $trapdoors_tag)) {
  105. sound.spawn(location, $open_trapdoor_sound, $block_sound_category);
  106. } elseif(block.hasTag(block, $fencegates_tag)) {
  107. sound.spawn(location, $open_fencegate_sound, $block_sound_category);
  108. }
  109. } else {
  110. if(block.hasTag(block, $doors_tag)) {
  111. sound.spawn(location, $close_door_sound, $block_sound_category);
  112. } elseif(block.hasTag(block, $trapdoors_tag)) {
  113. sound.spawn(location, $close_trapdoor_sound, $block_sound_category);
  114. } elseif(block.hasTag(block, $fencegates_tag)) {
  115. sound.spawn(location, $close_fencegate_sound, $block_sound_category);
  116. }
  117. }
  118. }
  119. function block.getSecondDoor(door_block_1) {
  120. door_loc_1 = block.getLocation(door_block_1);
  121. state_facing = block.getDirectionalFace(door_block_1);
  122. state_hinge = block.getDoorHinge(door_block_1);
  123. if(state_facing == "NORTH") {
  124. if(state_hinge == "RIGHT") {
  125. door_loc_2 = loc.mod(door_loc_1, -1, 0, 0);
  126. } else {
  127. door_loc_2 = loc.mod(door_loc_1, 1, 0, 0);
  128. }
  129. } elseif(state_facing == "EAST") {
  130. if(state_hinge == "RIGHT") {
  131. door_loc_2 = loc.mod(door_loc_1, 0, 0, -1);
  132. } else {
  133. door_loc_2 = loc.mod(door_loc_1, 0, 0, 1);
  134. }
  135. } elseif(state_facing == "SOUTH") {
  136. if(state_hinge == "RIGHT") {
  137. door_loc_2 = loc.mod(door_loc_1, 1, 0, 0);
  138. } else {
  139. door_loc_2 = loc.mod(door_loc_1, -1, 0, 0);
  140. }
  141. } else {
  142. if(state_hinge == "RIGHT") {
  143. door_loc_2 = loc.mod(door_loc_1, 0, 0, 1);
  144. } else {
  145. door_loc_2 = loc.mod(door_loc_1, 0, 0, -1);
  146. }
  147. }
  148. door_block_2 = block.get(door_loc_2);
  149. if(block.hasTag(door_block_2, $doors_tag)) {
  150. if(block.isSameDoorHalf(door_block_1, door_block_2)) {
  151. state_hinge_2 = block.getDoorHinge(door_block_2);
  152. if(state_hinge == "LEFT" && state_hinge_2 == "RIGHT" || state_hinge == "RIGHT" && state_hinge_2 == "LEFT") {
  153. return door_block_2;
  154. }
  155. }
  156. }
  157. return null;
  158. }
  159. function block.isSameDoorHalf(door_block_1, door_block_2) {
  160. state_half = block.getBisectedHalf(door_block_1);
  161. state_half_2 = block.getBisectedHalf(door_block_2);
  162. return state_half == state_half_2;
  163. }