hawkeye.txt 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. /*TODO:
  2. undo?
  3. */
  4. /*
  5. /hawkeye search <parameters>
  6. Parameters Examples:
  7. p:marvinius,MentorMentos
  8. t:30d,4h,20m
  9. r:10
  10. e:block_break,block_place
  11. */
  12. event.load("block_break");
  13. event.load("block_place");
  14. event.load("block_click");
  15. prefix_hawkeye = "§cHawkeye";
  16. chests_tag = block.getTag("forge:chests/wooden");
  17. wall_signs_tag = block.getTag("minecraft:wall_signs");
  18. standing_signs_tag = block.getTag("minecraft:standing_signs");
  19. stairs_tag = block.getTag("minecraft:stairs");
  20. slabs_tag = block.getTag("minecraft:slabs");
  21. buttons_tag = block.getTag("minecraft:buttons");
  22. face_prop = block.getProperty("face");
  23. facing_prop = block.getProperty("facing");
  24. facing_except_up_prop = block.getProperty("facing_except_up");
  25. horizontal_facing_prop = block.getProperty("horizontal_facing");
  26. half_prop = block.getProperty("half");
  27. stair_shape_prop = block.getProperty("stair_shape");
  28. slab_type_prop = block.getProperty("slab_type");
  29. rotation_prop = block.getProperty("rotation");
  30. chest_type_prop = block.getProperty("chest_type");
  31. extended_prop = block.getProperty("extended");
  32. databank.workerExecute(databank.prepare("CREATE TABLE IF NOT EXISTS hawkeye(id INT NOT NULL PRIMARY KEY, player_id INT NOT NULL, event VARCHAR(25) NOT NULL, world VARCHAR(15) NOT NULL, x INT NOT NULL, y INT NOT NULL, z INT NOT NULL, time BIGINT NOT NULL);"));
  33. databank.workerExecute(databank.prepare("CREATE TABLE IF NOT EXISTS hawkeye_data(id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, hawkeye_id INT NOT NULL, name VARCHAR(20) NOT NULL, value VARCHAR(100) NOT NULL, FOREIGN KEY (hawkeye_id) REFERENCES hawkeye(id) ON DELETE RESTRICT);"));
  34. hawkeye.deleteOlderThanThreeWeeks();
  35. msg("dev", "§bHawkeye §rloaded.");
  36. @wait
  37. wait();
  38. if(event == "block_place") {
  39. item = entity.getEquip(player, "hand");
  40. if(hawkeye.isTool(item)) {
  41. if(!perm.has(player, "hawkeye")) {
  42. perm.no(player, "hawkeye");
  43. goto("wait");
  44. }
  45. cancel = true;
  46. list = hawkeye.getData(null, null, block_loc, 1, null, null, "DESC");
  47. if(list.getSize(list) == 0) {
  48. msg.prefix(player, prefix_hawkeye, "No results found.");
  49. goto("wait");
  50. }
  51. hawkeye.setPlayerList(player, list);
  52. hawkeye.print(player, list, 1);
  53. goto("wait");
  54. }
  55. }
  56. if(event == "block_click") {
  57. item = entity.getEquip(player, "hand");
  58. if(action == "left" && hawkeye.isTool(item)) {
  59. if(!perm.has(player, "hawkeye")) {
  60. perm.no(player, "hawkeye");
  61. goto("wait");
  62. }
  63. cancel = true;
  64. list = hawkeye.getData(null, null, block_loc, 1, null, null, "DESC");
  65. if(list.getSize(list) == 0) {
  66. msg.prefix(player, prefix_hawkeye, "No results found.");
  67. goto("wait");
  68. }
  69. hawkeye.setPlayerList(player, list);
  70. hawkeye.print(player, list, 1);
  71. }
  72. goto("wait");
  73. }
  74. world_name = world.getName(loc.getWorld(block_loc));
  75. if(isSurvWorldName(world_name)) {
  76. if(event == "block_break" || event == "block_place") {
  77. if(!cancel) {
  78. id = hawkeye.getNextId();
  79. hawkeye.addBlockEvent(id, event, player, block_loc);
  80. hawkeye.addBlockDetail(id, "block_type", block_type);
  81. if(block_type == "minecraft:piston" || block_type == "minecraft:sticky_piston") {
  82. hawkeye.addBlockState(id, block_loc, "facing", facing_prop);
  83. hawkeye.addBlockState(id, block_loc, "extended", extended_prop);
  84. }
  85. elseif(block.hasTag(chests_tag, block)) {
  86. hawkeye.addBlockState(id, block_loc, "facing", horizontal_facing_prop);
  87. hawkeye.addBlockState(id, block_loc, "chest", chest_type_prop);
  88. }
  89. elseif(block.hasTag(standing_signs_tag, block)) {
  90. hawkeye.addBlockState(id, block_loc, "rotation", rotation_prop);
  91. }
  92. elseif(block.hasTag(buttons_tag, block)) {
  93. hawkeye.addBlockState(id, block_loc, "facing", horizontal_facing_prop);
  94. hawkeye.addBlockState(id, block_loc, "face", face_prop);
  95. }
  96. elseif(block_type == "minecraft:hopper") {
  97. hawkeye.addBlockState(id, block_loc, "facing", facing_except_up_prop);
  98. }
  99. elseif(block.hasTag(wall_signs_tag, block)) {
  100. hawkeye.addBlockState(id, block_loc, "facing", horizontal_facing_prop);
  101. }
  102. elseif(block.hasTag(slabs_tag, block)) {
  103. hawkeye.addBlockState(id, block_loc, "type", slab_type_prop);
  104. }
  105. elseif(block.hasTag(stairs_tag, block)) {
  106. hawkeye.addBlockState(id, block_loc, "facing", horizontal_facing_prop);
  107. hawkeye.addBlockState(id, block_loc, "half", half_prop);
  108. hawkeye.addBlockState(id, block_loc, "shape", stair_shape_prop);
  109. }
  110. }
  111. }
  112. }
  113. goto("wait");
  114. function hawkeye.addBlockState(id, block_loc, state_name, state_prop) {
  115. state = block.getState(block_loc, state_prop);
  116. if(state != null) {
  117. hawkeye.addBlockDetail(id, state_name, state);
  118. }
  119. }
  120. function hawkeye.addBlockEvent(id, event, player, location) {
  121. stmt = databank.prepare("INSERT INTO hawkeye (id, player_id, event, world, x, y, z, time) VALUES (?,?,?,?,?,?,?,?)");
  122. databank.setInt(stmt, 1, id);
  123. databank.setInt(stmt, 2, player.getId(player));
  124. databank.setString(stmt, 3, event);
  125. databank.setString(stmt, 4, world.getName(loc.getWorld(location)));
  126. databank.setInt(stmt, 5, loc.getX(location));
  127. databank.setInt(stmt, 6, loc.getY(location));
  128. databank.setInt(stmt, 7, loc.getZ(location));
  129. databank.setLong(stmt, 8, time.getMillis());
  130. databank.workerExecute(stmt);
  131. }
  132. function hawkeye.addBlockDetail(hawkeye_id, name, value) {
  133. stmt = databank.prepare("INSERT INTO hawkeye_data (hawkeye_id, name, value) VALUES (?,?,?)");
  134. databank.setInt(stmt, 1, hawkeye_id);
  135. databank.setString(stmt, 2, name);
  136. databank.setString(stmt, 3, value);
  137. databank.workerExecute(stmt);
  138. }
  139. function hawkeye.getNextId() {
  140. id = 0;
  141. stmt = databank.prepare("SELECT MAX(id) FROM hawkeye;");
  142. result = databank.execute(stmt);
  143. if(databank.next(result)) {
  144. id = databank.getInt(result, 1);
  145. }
  146. databank.close(result);
  147. databank.close(stmt);
  148. return id + 1;
  149. }
  150. function hawkeye.deleteOlderThanThreeWeeks() {
  151. three_weeks_before = time.getMillis() - 21 * 24 * 60 * 60 * 1000;
  152. stmt = databank.prepare("DELETE FROM hawkeye_data WHERE hawkeye_id IN(SELECT id FROM hawkeye WHERE time < ?);");
  153. databank.setLong(stmt, 1, three_weeks_before);
  154. databank.workerExecute(stmt);
  155. stmt2 = databank.prepare("DELETE FROM hawkeye WHERE time < ?;");
  156. databank.setLong(stmt2, 1, three_weeks_before);
  157. databank.workerExecute(stmt2);
  158. }
  159. function hawkeye.isTool(item) {
  160. lore = item.getLore(item);
  161. if(list.getSize(lore) > 0) {
  162. return list.getIndex(lore, 0) == "Hawkeye Tool";
  163. }
  164. return false;
  165. }