doors.txt 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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) || world.isStoryName(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. player_spec = player.getAutoCloseDoor(player);
  30. open_value = block.isOpen(block);
  31. if(block.hasTag(block, doors_tag)) {
  32. if(!open_value) {
  33. if(player_spec) {
  34. list.add(doors, block);
  35. sgoto(60, "closedoor");
  36. }
  37. }
  38. //Double door
  39. door_block_2 = block.getSecondDoor(block);
  40. if(door_block_2 == null) {
  41. goto("main");
  42. }
  43. open_value_2 = block.isOpen(door_block_2);
  44. if(open_value && open_value_2) {
  45. door.open(door_block_2, false);
  46. } elseif(!open_value && !open_value_2) {
  47. door.open(door_block_2, true);
  48. if(player_spec) {
  49. list.add(doors, door_block_2);
  50. sgoto(60, "closedoor");
  51. }
  52. }
  53. goto("main");
  54. }
  55. if(player_spec) {
  56. block_loc = block.getLocation(block);
  57. if(!map.contains(orig_value_map, block_loc)) {
  58. map.add(orig_value_map, block_loc, open_value);
  59. }
  60. list.add(doors, block);
  61. sgoto(60, "closedoor");
  62. }
  63. }
  64. goto("main");
  65. @closedoor
  66. block = list.getIndex(doors, 0);
  67. list.removeIndex(doors, 0);
  68. if(block.hasTag(block, auto_door_tag)) {
  69. //close door
  70. open_value = block.isOpen(block);
  71. if(block.hasTag(block, doors_tag)) {
  72. if(open_value) {
  73. door.open(block, false);
  74. }
  75. goto("main");
  76. }
  77. //toggle door
  78. door_loc = block.getLocation(block);
  79. orig_value = map.get(orig_value_map, door_loc);
  80. if(orig_value == null) {
  81. goto("main");
  82. }
  83. map.remove(orig_value_map, door_loc);
  84. if(orig_value == open_value) {
  85. goto("main");
  86. }
  87. if(open_value) {
  88. door.open(block, false);
  89. goto("main");
  90. }
  91. door.open(block, true);
  92. }
  93. goto("main");
  94. function door.open(block, boolean) {
  95. block.setOpen(block, boolean);
  96. //sound
  97. location = block.getLocation(block);
  98. if(boolean) {
  99. if(block.hasTag(block, $doors_tag)) {
  100. sound.spawn(location, $open_door_sound, $block_sound_category);
  101. } elseif(block.hasTag(block, $trapdoors_tag)) {
  102. sound.spawn(location, $open_trapdoor_sound, $block_sound_category);
  103. } elseif(block.hasTag(block, $fencegates_tag)) {
  104. sound.spawn(location, $open_fencegate_sound, $block_sound_category);
  105. }
  106. } else {
  107. if(block.hasTag(block, $doors_tag)) {
  108. sound.spawn(location, $close_door_sound, $block_sound_category);
  109. } elseif(block.hasTag(block, $trapdoors_tag)) {
  110. sound.spawn(location, $close_trapdoor_sound, $block_sound_category);
  111. } elseif(block.hasTag(block, $fencegates_tag)) {
  112. sound.spawn(location, $close_fencegate_sound, $block_sound_category);
  113. }
  114. }
  115. }
  116. function block.getSecondDoor(door_block_1) {
  117. door_loc_1 = block.getLocation(door_block_1);
  118. state_facing = block.getDirectionalFace(door_block_1);
  119. state_hinge = block.getDoorHinge(door_block_1);
  120. if(state_facing == "NORTH") {
  121. if(state_hinge == "RIGHT") {
  122. door_loc_2 = loc.mod(door_loc_1, -1, 0, 0);
  123. } else {
  124. door_loc_2 = loc.mod(door_loc_1, 1, 0, 0);
  125. }
  126. } elseif(state_facing == "EAST") {
  127. if(state_hinge == "RIGHT") {
  128. door_loc_2 = loc.mod(door_loc_1, 0, 0, -1);
  129. } else {
  130. door_loc_2 = loc.mod(door_loc_1, 0, 0, 1);
  131. }
  132. } elseif(state_facing == "SOUTH") {
  133. if(state_hinge == "RIGHT") {
  134. door_loc_2 = loc.mod(door_loc_1, 1, 0, 0);
  135. } else {
  136. door_loc_2 = loc.mod(door_loc_1, -1, 0, 0);
  137. }
  138. } else {
  139. if(state_hinge == "RIGHT") {
  140. door_loc_2 = loc.mod(door_loc_1, 0, 0, 1);
  141. } else {
  142. door_loc_2 = loc.mod(door_loc_1, 0, 0, -1);
  143. }
  144. }
  145. door_block_2 = block.get(door_loc_2);
  146. if(block.hasTag(door_block_2, $doors_tag)) {
  147. if(block.isSameDoorHalf(door_block_1, door_block_2)) {
  148. state_hinge_2 = block.getDoorHinge(door_block_2);
  149. if(state_hinge == "LEFT" && state_hinge_2 == "RIGHT" || state_hinge == "RIGHT" && state_hinge_2 == "LEFT") {
  150. return door_block_2;
  151. }
  152. }
  153. }
  154. return null;
  155. }
  156. function block.isSameDoorHalf(door_block_1, door_block_2) {
  157. state_half = block.getBisectedHalf(door_block_1);
  158. state_half_2 = block.getBisectedHalf(door_block_2);
  159. return state_half == state_half_2;
  160. }