/lib/location_manager.js

https://github.com/GunioRobot/mineflayer · JavaScript · 169 lines · 161 code · 7 blank · 1 comment · 25 complexity · 8e5368514c0b42e8b2a55e23728d5039 MD5 · raw file

  1. mf.include("player_tracker.js");
  2. mf.include("json.js");
  3. var location_manager = {};
  4. (function() {
  5. location_manager.searchLocations = function(name) {
  6. var literal_matches = /\((-?\d+\.?\d*),\s*(-?\d+\.?\d*),\s*(-?\d+\.?\d*)\)/.exec(name);
  7. if (literal_matches !== null) {
  8. literal_matches.shift();
  9. var coords = literal_matches.mapped(function(s) { return parseInt(s); });
  10. var point = new mf.Point(coords[0], coords[1], coords[2]);
  11. return [{"name": "[literal]", "point": point}];
  12. }
  13. function filter_using_comparator(name, comparator) {
  14. var matches = [];
  15. var all_locations = location_manager.allLocations();
  16. for (var i = 0; i < all_locations.length; i++) {
  17. if (comparator(all_locations[i].name, name)) {
  18. matches.push(all_locations[i]);
  19. }
  20. }
  21. return matches;
  22. }
  23. var comparators = [
  24. function(s1, s2) { return s1 === s2; },
  25. function(s1, s2) { return s1.startsWith(s2); },
  26. function(s1, s2) { return s1.contains(s2); },
  27. // and then case-insensitive (for usernames)
  28. function(s1, s2) { return s1.toLowerCase() === s2.toLowerCase(); },
  29. function(s1, s2) { return s1.toLowerCase().startsWith(s2.toLowerCase()); },
  30. function(s1, s2) { return s1.toLowerCase().contains(s2.toLowerCase()); },
  31. ];
  32. var matches;
  33. for (var i = 0; i < comparators.length; i++) {
  34. matches = filter_using_comparator(name, comparators[i]);
  35. if (matches.length !== 0) {
  36. break;
  37. }
  38. }
  39. return matches;
  40. };
  41. location_manager.findUnambiguousLocation = function(location_name, responder_func) {
  42. var search_results = location_manager.searchLocations(location_name);
  43. if (search_results.length === 0) {
  44. responder_func("no point by that name");
  45. return undefined;
  46. } else if (search_results.length > 1) {
  47. responder_func("point name is ambiguous: " + search_results.mapped(function(l) { return l.name; }).join(", "));
  48. return undefined;
  49. }
  50. return search_results[0];
  51. };
  52. location_manager.allLocations = function() {
  53. var locations = [];
  54. for (var name in name_to_location) {
  55. locations.push(name_to_location[name]);
  56. }
  57. var usernames = player_tracker.allPlayers();
  58. for (var i = 0; i < usernames.length; i++) {
  59. var username = usernames[i];
  60. var entity = player_tracker.entityForPlayer(username);
  61. locations.push({"name": username, "point": entity.position});
  62. }
  63. return locations;
  64. };
  65. function thisis(speaker, args, responder_fun) {
  66. var name = args[0];
  67. var entity = player_tracker.entityForPlayer(speaker);
  68. if (entity === undefined) {
  69. responder_fun("sorry, can't see user: " + speaker);
  70. return;
  71. }
  72. var point;
  73. var cursor = entity.position.offset(0, entity.height, 0);
  74. var yaw = entity.yaw, pitch = entity.pitch;
  75. var vector_length = 0.03125;
  76. var x = Math.cos(yaw) * Math.cos(pitch);
  77. var y = Math.sin(yaw) * Math.cos(pitch);
  78. var z = Math.sin(pitch);
  79. var step_delta = new mf.Point(x * vector_length, y * vector_length, z * vector_length);
  80. for (var i = 0; i < 192; i++) {
  81. cursor = cursor.plus(step_delta);
  82. if (mf.isPhysical(mf.blockAt(cursor).type)) {
  83. point = cursor.floored();
  84. break;
  85. }
  86. }
  87. if (point === undefined) {
  88. responder_fun("You're not looking at anything physical!");
  89. return;
  90. }
  91. var old_location = name_to_location[name];
  92. name_to_location[name] = {"point": point, "name": name},
  93. save_database();
  94. var created_or_updated;
  95. if (old_location === undefined) {
  96. created_or_updated = "created";
  97. } else {
  98. created_or_updated = "updated";
  99. }
  100. message = ["location", name, created_or_updated, "at", point].join(" ");
  101. responder_fun(message);
  102. };
  103. function hereis(username, args, responder_func) {
  104. var name = args[0];
  105. var entity = player_tracker.entityForPlayer(username);
  106. if (entity === undefined) {
  107. responder_func("sorry, can't see user: " + username);
  108. return;
  109. }
  110. var point = entity.position;
  111. var old_location = name_to_location[name];
  112. name_to_location[name] = {"point": point, "name": name},
  113. save_database();
  114. var created_or_updated;
  115. if (old_location === undefined) {
  116. created_or_updated = "created";
  117. } else {
  118. created_or_updated = "updated";
  119. }
  120. message = ["location", name, created_or_updated, "at", point].join(" ");
  121. responder_func(message);
  122. };
  123. chat_commands.registerCommand("thisis", thisis, 1);
  124. chat_commands.registerCommand("hereis", hereis, 1);
  125. function forget(username, args, responder_func) {
  126. var name = args[0];
  127. var old_location = name_to_location[name];
  128. delete name_to_location[name];
  129. save_database();
  130. if (old_location !== undefined) {
  131. responder_func("point deleted. was at " + old_location.point);
  132. } else {
  133. responder_func("no point by that name");
  134. }
  135. };
  136. chat_commands.registerCommand("forget", forget, 1);
  137. var name_to_location;
  138. var database_file_name = "locations.json";
  139. function save_database() {
  140. mf.writeFile(database_file_name, json.stringify(name_to_location));
  141. }
  142. function load_database() {
  143. var database_contents = mf.readFile(database_file_name);
  144. if (database_contents !== undefined) {
  145. name_to_location = json.parse(database_contents);
  146. } else {
  147. mf.chat("no locations database found. i will create a new one in this directory.");
  148. name_to_location = {};
  149. }
  150. }
  151. load_database();
  152. chat_commands.registerCommand("reload", function(username, args, responder_func) {
  153. if (args[0] === "locations") {
  154. load_database();
  155. }
  156. }, 1);
  157. chat_commands.registerCommand("save", function(username, args, responder_func) {
  158. if (args[0] === "locations") {
  159. save_database();
  160. }
  161. }, 1);
  162. })();