game_machine 0.0.11 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +12 -1
  3. data/Gemfile.lock +32 -47
  4. data/Rakefile +0 -27
  5. data/bin/bundle_run.sh +1 -0
  6. data/bin/game_machine +29 -27
  7. data/config/cluster.conf +6 -5
  8. data/config/default.conf +164 -0
  9. data/config/game_machine.sql +33 -0
  10. data/config/game_messages.proto +87 -25
  11. data/config/gamecloud.conf +140 -0
  12. data/config/messages.proto +46 -53
  13. data/config/test.conf +149 -0
  14. data/game_machine.gemspec +10 -5
  15. data/games/boot.rb +3 -0
  16. data/games/example/data/game_data.yml +4 -4
  17. data/games/example/lib/aggressive_npc.rb +1 -1
  18. data/games/example/lib/game.rb +1 -2
  19. data/games/example/lib/player_register.rb +1 -1
  20. data/games/routes.rb +9 -0
  21. data/games/tutorial/boot.rb +12 -0
  22. data/games/tutorial/item_manager.rb +256 -0
  23. data/games/tutorial/object_store.rb +55 -0
  24. data/games/tutorial/seed.rb +52 -0
  25. data/games/tutorial/sql_store.rb +30 -0
  26. data/java/project/build.gradle +134 -0
  27. data/java/project/component.erb +719 -0
  28. data/java/{gradle.properties → project/gradle.properties} +1 -1
  29. data/java/project/gradle/wrapper/gradle-wrapper.jar +0 -0
  30. data/java/{gradle → project/gradle}/wrapper/gradle-wrapper.properties +2 -2
  31. data/java/{gradlew → project/gradlew} +0 -0
  32. data/java/{gradlew.bat → project/gradlew.bat} +0 -0
  33. data/java/project/local_lib/AdminUi.jar +0 -0
  34. data/java/{local_lib/protostuff-compiler-1.0.7-jarjar.jar → project/local_lib/protostuff-compiler-1.0.8-jarjar.jar} +0 -0
  35. data/java/project/local_lib/sigar/libsigar-amd64-freebsd-6.so +0 -0
  36. data/java/project/local_lib/sigar/libsigar-amd64-linux.so +0 -0
  37. data/java/project/local_lib/sigar/libsigar-amd64-solaris.so +0 -0
  38. data/java/project/local_lib/sigar/libsigar-ia64-hpux-11.sl +0 -0
  39. data/java/project/local_lib/sigar/libsigar-ia64-linux.so +0 -0
  40. data/java/project/local_lib/sigar/libsigar-pa-hpux-11.sl +0 -0
  41. data/java/project/local_lib/sigar/libsigar-ppc-aix-5.so +0 -0
  42. data/java/project/local_lib/sigar/libsigar-ppc-linux.so +0 -0
  43. data/java/project/local_lib/sigar/libsigar-ppc64-aix-5.so +0 -0
  44. data/java/project/local_lib/sigar/libsigar-ppc64-linux.so +0 -0
  45. data/java/project/local_lib/sigar/libsigar-s390x-linux.so +0 -0
  46. data/java/project/local_lib/sigar/libsigar-sparc-solaris.so +0 -0
  47. data/java/project/local_lib/sigar/libsigar-sparc64-solaris.so +0 -0
  48. data/java/project/local_lib/sigar/libsigar-universal-macosx.dylib +0 -0
  49. data/java/project/local_lib/sigar/libsigar-universal64-macosx.dylib +0 -0
  50. data/java/project/local_lib/sigar/libsigar-x86-freebsd-5.so +0 -0
  51. data/java/project/local_lib/sigar/libsigar-x86-freebsd-6.so +0 -0
  52. data/java/project/local_lib/sigar/libsigar-x86-linux.so +0 -0
  53. data/java/project/local_lib/sigar/libsigar-x86-solaris.so +0 -0
  54. data/java/project/local_lib/sigar/sigar-amd64-winnt.dll +0 -0
  55. data/java/project/local_lib/sigar/sigar-x86-winnt.dll +0 -0
  56. data/java/project/local_lib/sigar/sigar-x86-winnt.lib +0 -0
  57. data/java/project/model.erb +99 -0
  58. data/java/{settings.gradle → project/settings.gradle} +0 -0
  59. data/java/project/src/main/java/com/game_machine/authentication/DefaultAuthenticator.java +28 -0
  60. data/java/project/src/main/java/com/game_machine/authentication/PlayerAuthenticator.java +6 -0
  61. data/java/project/src/main/java/com/game_machine/authentication/PublicAuthenticator.java +20 -0
  62. data/java/{src → project/src}/main/java/com/game_machine/core/ActorFactory.java +0 -0
  63. data/java/{src → project/src}/main/java/com/game_machine/core/ActorUtil.java +13 -0
  64. data/java/project/src/main/java/com/game_machine/core/AuthorizedPlayers.java +23 -0
  65. data/java/project/src/main/java/com/game_machine/core/ClientMessageDecoder.java +36 -0
  66. data/java/project/src/main/java/com/game_machine/core/ClientMessageEncoder.java +19 -0
  67. data/java/project/src/main/java/com/game_machine/core/CloudClient.java +298 -0
  68. data/java/{src → project/src}/main/java/com/game_machine/core/CommandProxy.java +0 -0
  69. data/java/project/src/main/java/com/game_machine/core/Commands.java +20 -0
  70. data/java/project/src/main/java/com/game_machine/core/DatastoreCommands.java +43 -0
  71. data/java/project/src/main/java/com/game_machine/core/DbConnectionPool.java +72 -0
  72. data/java/project/src/main/java/com/game_machine/core/DefaultMovementVerifier.java +56 -0
  73. data/java/{src → project/src}/main/java/com/game_machine/core/EntitySerializer.java +0 -0
  74. data/java/project/src/main/java/com/game_machine/core/EntityTracking.java +119 -0
  75. data/java/{src → project/src}/main/java/com/game_machine/core/EventStreamHandler.java +1 -1
  76. data/java/project/src/main/java/com/game_machine/core/GameActor.java +73 -0
  77. data/java/project/src/main/java/com/game_machine/core/GameMachineLoader.java +43 -0
  78. data/java/project/src/main/java/com/game_machine/core/GameMessageActor.java +44 -0
  79. data/java/project/src/main/java/com/game_machine/core/Grid.java +255 -0
  80. data/java/{src → project/src}/main/java/com/game_machine/core/GridValue.java +0 -0
  81. data/java/project/src/main/java/com/game_machine/core/Hashring.java +66 -0
  82. data/java/{src → project/src}/main/java/com/game_machine/core/IActorFactory.java +0 -0
  83. data/java/project/src/main/java/com/game_machine/core/LocalLinkedBuffer.java +20 -0
  84. data/java/project/src/main/java/com/game_machine/core/MessageGateway.java +120 -0
  85. data/java/project/src/main/java/com/game_machine/core/MessagePersister.java +26 -0
  86. data/java/project/src/main/java/com/game_machine/core/MonoProxy.java +39 -0
  87. data/java/project/src/main/java/com/game_machine/core/MovementVerifier.java +7 -0
  88. data/java/{src → project/src}/main/java/com/game_machine/core/NetMessage.java +10 -6
  89. data/java/project/src/main/java/com/game_machine/core/PersistentMessage.java +9 -0
  90. data/java/project/src/main/java/com/game_machine/core/PlayerCommands.java +31 -0
  91. data/java/project/src/main/java/com/game_machine/core/TcpServer.java +100 -0
  92. data/java/project/src/main/java/com/game_machine/core/TcpServerHandler.java +54 -0
  93. data/java/project/src/main/java/com/game_machine/core/TcpServerInitializer.java +32 -0
  94. data/java/project/src/main/java/com/game_machine/core/UdpClient.java +86 -0
  95. data/java/{src → project/src}/main/java/com/game_machine/core/UdpServer.java +18 -27
  96. data/java/{src → project/src}/main/java/com/game_machine/core/UdpServerHandler.java +23 -26
  97. data/java/project/src/main/java/com/game_machine/core/Vector3.java +159 -0
  98. data/java/project/src/main/java/com/game_machine/orm/models/PlayerItem.java +118 -0
  99. data/java/project/src/main/java/com/game_machine/orm/models/TestObject.java +110 -0
  100. data/java/project/src/main/java/com/game_machine/tutorial/LootGenerator.java +26 -0
  101. data/java/{src → project/src}/main/resources/game_machine.java.stg +3 -1
  102. data/java/project/src/main/resources/logback.properties +13 -0
  103. data/java/project/src/main/resources/logback.xml +76 -0
  104. data/java/{src → project/src}/main/resources/protostuff.properties +0 -0
  105. data/java/src/main/java/game/MyGameActor.java +26 -0
  106. data/lib/game_machine.rb +17 -16
  107. data/lib/game_machine/actor.rb +1 -1
  108. data/lib/game_machine/actor/base.rb +8 -31
  109. data/lib/game_machine/actor/builder.rb +5 -6
  110. data/lib/game_machine/actor/game_actor.rb +55 -0
  111. data/lib/game_machine/actor/reloadable.rb +6 -1
  112. data/lib/game_machine/akka.rb +26 -32
  113. data/lib/game_machine/app_config.rb +39 -26
  114. data/lib/game_machine/application.rb +56 -62
  115. data/lib/game_machine/client_manager.rb +14 -8
  116. data/lib/game_machine/cloud_updater.rb +51 -0
  117. data/lib/game_machine/cluster_monitor.rb +3 -3
  118. data/lib/game_machine/commands.rb +1 -1
  119. data/lib/game_machine/commands/misc_commands.rb +4 -8
  120. data/lib/game_machine/commands/player_commands.rb +8 -0
  121. data/lib/game_machine/console.rb +1 -0
  122. data/lib/game_machine/console/build.rb +57 -24
  123. data/lib/game_machine/console/bundle.rb +95 -0
  124. data/lib/game_machine/console/deploy.rb +30 -0
  125. data/lib/game_machine/console/install.rb +70 -36
  126. data/lib/game_machine/console/server.rb +2 -69
  127. data/lib/game_machine/data_store.rb +111 -15
  128. data/lib/game_machine/data_stores/couchbase.rb +8 -3
  129. data/lib/game_machine/data_stores/gamecloud.rb +93 -0
  130. data/lib/game_machine/data_stores/jdbc.rb +98 -0
  131. data/lib/game_machine/default_handlers.rb +2 -0
  132. data/lib/game_machine/default_handlers/team_handler.rb +51 -0
  133. data/lib/game_machine/default_handlers/zone_manager.rb +30 -0
  134. data/lib/game_machine/endpoints.rb +0 -4
  135. data/lib/game_machine/endpoints/udp_incoming.rb +13 -5
  136. data/lib/game_machine/endpoints/udp_outgoing.rb +15 -9
  137. data/lib/game_machine/game_systems.rb +0 -2
  138. data/lib/game_machine/game_systems/agents/controller.rb +2 -2
  139. data/lib/game_machine/game_systems/entity_tracking.rb +0 -3
  140. data/lib/game_machine/game_systems/region_manager.rb +3 -2
  141. data/lib/game_machine/game_systems/region_service.rb +2 -2
  142. data/lib/game_machine/game_systems/remote_echo.rb +10 -0
  143. data/lib/game_machine/game_systems/team_manager.rb +2 -11
  144. data/lib/game_machine/grid.rb +5 -18
  145. data/lib/game_machine/handlers/authentication.rb +1 -9
  146. data/lib/game_machine/handlers/game.rb +27 -2
  147. data/lib/game_machine/handlers/player_authentication.rb +87 -0
  148. data/lib/game_machine/handlers/request.rb +9 -11
  149. data/lib/game_machine/hocon_config.rb +81 -0
  150. data/lib/game_machine/java_lib.rb +14 -1
  151. data/lib/game_machine/logger.rb +10 -23
  152. data/lib/game_machine/models.rb +1 -0
  153. data/lib/game_machine/mono_server.rb +6 -1
  154. data/lib/game_machine/object_db.rb +12 -6
  155. data/lib/game_machine/protobuf.rb +1 -1
  156. data/lib/game_machine/protobuf/game_messages.rb +13 -3
  157. data/lib/game_machine/protobuf/generate.rb +107 -5
  158. data/lib/game_machine/restart_watcher.rb +1 -1
  159. data/lib/game_machine/routes.rb +23 -0
  160. data/lib/game_machine/scheduler.rb +1 -1
  161. data/lib/game_machine/securerandom.rb +2 -0
  162. data/lib/game_machine/system_stats.rb +28 -7
  163. data/lib/game_machine/version.rb +1 -1
  164. data/lib/game_machine/wavefront_ext.rb +47 -0
  165. data/lib/game_machine/write_behind_cache.rb +24 -9
  166. data/mono/server/Makefile +1 -1
  167. data/mono/server/Newtonsoft.Json.dll +0 -0
  168. data/mono/server/build.bat +1 -1
  169. data/mono/server/callable.cs +9 -0
  170. data/mono/server/echo.cs +17 -0
  171. data/mono/server/message_router.cs +16 -23
  172. data/mono/server/messages.cs +1792 -417
  173. data/mono/server/protobuf-net.dll +0 -0
  174. data/mono/server/server.cs +120 -0
  175. data/mono/server/server.exe +0 -0
  176. data/pathfinding/astar.cpp +149 -0
  177. data/pathfinding/build.sh +6 -0
  178. data/pathfinding/build.txt +16 -0
  179. data/pathfinding/crowd.cpp +194 -0
  180. data/pathfinding/include/astar.h +49 -0
  181. data/pathfinding/include/common.h +5 -0
  182. data/pathfinding/include/crowd.h +43 -0
  183. data/pathfinding/include/micropather.h +511 -0
  184. data/pathfinding/include/navmesh.h +114 -0
  185. data/pathfinding/include/pathfinder.h +24 -0
  186. data/pathfinding/main.cpp +108 -17
  187. data/pathfinding/micropather.cpp +1062 -0
  188. data/pathfinding/navmesh.cpp +408 -0
  189. data/pathfinding/overrides/DetourCrowd.cpp +1446 -0
  190. data/pathfinding/overrides/DetourNavMeshQuery.cpp +3551 -0
  191. data/pathfinding/overrides/DetourNavMeshQuery.h +538 -0
  192. data/pathfinding/pathfinder.cpp +117 -0
  193. data/pathfinding/{bin → premake}/premake4 +0 -0
  194. data/pathfinding/premake/premake4.exe +0 -0
  195. data/pathfinding/premake4.lua +12 -3
  196. data/spec/actor/actor_spec.rb +0 -7
  197. data/spec/client_manager_spec.rb +1 -1
  198. data/spec/couchproxy_spec.rb +38 -0
  199. data/spec/entity_persistence_spec.rb +129 -0
  200. data/spec/game_systems/team_manager_spec.rb +2 -2
  201. data/spec/hashring_spec.rb +17 -39
  202. data/spec/java_grid_spec.rb +0 -2
  203. data/spec/misc_spec.rb +111 -0
  204. data/spec/mono_spec.rb +50 -3
  205. data/spec/reliable_message_spec.rb +38 -0
  206. data/spec/spec_helper.rb +4 -4
  207. data/spec/spec_helper_minimal.rb +10 -0
  208. data/web/app.rb +108 -86
  209. data/web/config/trinidad.yml +1 -0
  210. data/web/views/add_player.erb +25 -0
  211. data/web/views/index.erb +0 -0
  212. data/web/views/layout.erb +48 -0
  213. data/web/views/login.erb +25 -0
  214. data/web/views/players.erb +24 -0
  215. metadata +209 -94
  216. data/config/config.example.yml +0 -100
  217. data/config/regions.example.yml +0 -9
  218. data/games/example/lib/authentication_handler.rb +0 -69
  219. data/games/models.rb +0 -3
  220. data/games/models/clan_member.rb +0 -8
  221. data/games/models/clan_profile.rb +0 -9
  222. data/games/models/player.rb +0 -7
  223. data/games/plugins.rb +0 -1
  224. data/games/plugins/team_handler.rb +0 -49
  225. data/games/preload.rb +0 -13
  226. data/java/.gitignore +0 -1
  227. data/java/build.gradle +0 -95
  228. data/java/component.erb +0 -396
  229. data/java/gradle/wrapper/gradle-wrapper.jar +0 -0
  230. data/java/src/main/java/com/game_machine/core/GameMachineLoader.java +0 -25
  231. data/java/src/main/java/com/game_machine/core/Grid.java +0 -195
  232. data/java/src/main/resources/logback.xml +0 -14
  233. data/java/src/main/resources/logging.properties +0 -3
  234. data/lib/game_machine/actor/mono_actor.rb +0 -89
  235. data/lib/game_machine/auth_handlers/base.rb +0 -21
  236. data/lib/game_machine/auth_handlers/public.rb +0 -34
  237. data/lib/game_machine/endpoints/mono_gateway.rb +0 -87
  238. data/lib/game_machine/endpoints/tcp.rb +0 -51
  239. data/lib/game_machine/endpoints/tcp_handler.rb +0 -75
  240. data/lib/game_machine/endpoints/udp.rb +0 -88
  241. data/lib/game_machine/game_loader.rb +0 -46
  242. data/lib/game_machine/game_systems/region_settings.rb +0 -13
  243. data/lib/game_machine/hashring.rb +0 -48
  244. data/lib/game_machine/settings.rb +0 -11
  245. data/mono/server/actor.cs +0 -37
  246. data/mono/server/iactor.cs +0 -11
  247. data/mono/server/message_util.cs +0 -29
  248. data/mono/server/proxy_client.cs +0 -73
  249. data/mono/server/proxy_server.cs +0 -30
  250. data/mono/server/test_actor.cs +0 -33
  251. data/pathfinding/include/pathfind.h +0 -167
  252. data/pathfinding/pathfind.cpp +0 -174
  253. data/pathfinding/pathfinder.cs +0 -66
  254. data/script/server.sh +0 -109
  255. data/script/watch.sh +0 -11
  256. data/spec/commands/navigation_commands_spec.rb +0 -51
  257. data/spec/game_systems/entity_tracking_spec.rb +0 -64
  258. data/spec/navigation/detour_navmesh_spec.rb +0 -34
  259. data/spec/navigation/detour_path_spec.rb +0 -25
  260. data/spec/udp_server_spec.rb +0 -10
  261. data/web/controllers/auth_controller.rb +0 -19
  262. data/web/controllers/base_controller.rb +0 -16
  263. data/web/controllers/index_controller.rb +0 -7
  264. data/web/controllers/log_controller.rb +0 -47
  265. data/web/controllers/messages_controller.rb +0 -59
  266. data/web/controllers/player_register_controller.rb +0 -15
  267. data/web/views/game_messages.haml +0 -45
  268. data/web/views/index.haml +0 -6
  269. data/web/views/layout.haml +0 -41
  270. data/web/views/logs.haml +0 -32
  271. data/web/views/player_register.haml +0 -22
  272. data/web/views/player_registered.haml +0 -2
  273. data/web/views/register_layout.haml +0 -22
  274. data/web/views/restart.haml +0 -35
@@ -0,0 +1,20 @@
1
+ package com.game_machine.core;
2
+ import GameMachine.Messages.ClientManagerRegister;
3
+ import GameMachine.Messages.Entity;
4
+ import GameMachine.Messages.Player;
5
+ import akka.actor.ActorSelection;
6
+
7
+ public class Commands {
8
+
9
+ public static void clientManagerRegister(String name) {
10
+ ClientManagerRegister register = new ClientManagerRegister();
11
+ register.setRegisterType("actor").setName(name);
12
+ register.setEvents("");
13
+ Entity entity = new Entity();
14
+ entity.setClientManagerRegister(register);
15
+ ActorSelection sel = ActorUtil.getSelectionByName("GameMachine::ClientManager");
16
+ sel.tell(entity, null);
17
+ }
18
+
19
+
20
+ }
@@ -0,0 +1,43 @@
1
+ package com.game_machine.core;
2
+
3
+ import java.util.concurrent.TimeUnit;
4
+
5
+ import scala.concurrent.Await;
6
+ import scala.concurrent.Future;
7
+ import scala.concurrent.duration.Duration;
8
+ import GameMachine.Messages.Entity;
9
+ import GameMachine.Messages.ObjectdbDel;
10
+ import GameMachine.Messages.ObjectdbGet;
11
+ import GameMachine.Messages.ObjectdbPut;
12
+ import akka.actor.ActorSelection;
13
+ import akka.pattern.AskableActorSelection;
14
+ import akka.util.Timeout;
15
+
16
+ public class DatastoreCommands {
17
+
18
+ public static void put(Entity entity) {
19
+ ActorSelection sel = ActorUtil.findDistributed("GameMachine::ObjectDb", entity.id);
20
+ ObjectdbPut put = new ObjectdbPut().setEntity(entity);
21
+ sel.tell(put, null);
22
+ }
23
+
24
+ public static void delete(String id) {
25
+ ActorSelection sel = ActorUtil.findDistributed("GameMachine::ObjectDb", id);
26
+ ObjectdbDel del = new ObjectdbDel().setEntityId(id);
27
+ sel.tell(del, null);
28
+ }
29
+
30
+ public static Entity get(String id, int timeout) {
31
+ ObjectdbGet get = new ObjectdbGet().setEntityId(id);
32
+ ActorSelection sel = ActorUtil.findDistributed("GameMachine::ObjectDb", id);
33
+ Timeout t = new Timeout(Duration.create(timeout, TimeUnit.MILLISECONDS));
34
+ AskableActorSelection askable = new AskableActorSelection(sel);
35
+ Future<Object> future = askable.ask(get,t);
36
+ try {
37
+ Entity result = (Entity) Await.result(future, t.duration());
38
+ return result;
39
+ } catch (Exception e) {
40
+ return null;
41
+ }
42
+ }
43
+ }
@@ -0,0 +1,72 @@
1
+ package com.game_machine.core;
2
+
3
+ import java.sql.Connection;
4
+ import java.sql.SQLException;
5
+ import java.util.concurrent.ConcurrentHashMap;
6
+
7
+ import com.mysql.jdbc.Driver;
8
+ import com.zaxxer.hikari.HikariConfig;
9
+ import com.zaxxer.hikari.HikariDataSource;
10
+
11
+ import org.slf4j.Logger;
12
+ import org.slf4j.LoggerFactory;
13
+
14
+
15
+ public class DbConnectionPool {
16
+ private static final Logger logger = LoggerFactory.getLogger(DbConnectionPool.class);
17
+
18
+ public ConcurrentHashMap<String, HikariDataSource> datasources = new ConcurrentHashMap<String, HikariDataSource>();
19
+
20
+ private DbConnectionPool() {
21
+ }
22
+
23
+ private static class LazyHolder {
24
+ private static final DbConnectionPool INSTANCE = new DbConnectionPool();
25
+ }
26
+
27
+ public static DbConnectionPool getInstance() {
28
+ return LazyHolder.INSTANCE;
29
+ }
30
+
31
+ public Boolean connect(String id, String hostname, int port, String dbname, String ds, String username, String password) throws SQLException {
32
+ if (datasources.containsKey(id)) {
33
+ return true;
34
+ }
35
+
36
+ HikariConfig config = new HikariConfig();
37
+ config.setDataSourceClassName(ds);
38
+ config.addDataSourceProperty("serverName", hostname);
39
+ config.addDataSourceProperty("portNumber", port);
40
+ config.addDataSourceProperty("databaseName", dbname);
41
+ config.addDataSourceProperty("user", username);
42
+ config.addDataSourceProperty("password", password);
43
+ config.setMaximumPoolSize(10);
44
+ config.setIdleTimeout(0);
45
+ config.setLeakDetectionThreshold(10000);
46
+ //config.setAutoCommit(false);
47
+
48
+
49
+ HikariDataSource datasource = new HikariDataSource(config);
50
+
51
+ datasources.put(id, datasource);
52
+ return true;
53
+
54
+ }
55
+
56
+ public HikariDataSource getDataSource(String id) {
57
+ if (datasources.containsKey(id)) {
58
+ return datasources.get(id);
59
+ } else {
60
+ return null;
61
+ }
62
+ }
63
+
64
+ public Connection getConnection(String id) throws SQLException {
65
+ if (datasources.containsKey(id)) {
66
+ return datasources.get(id).getConnection();
67
+ } else {
68
+ return null;
69
+ }
70
+ }
71
+
72
+ }
@@ -0,0 +1,56 @@
1
+ package com.game_machine.core;
2
+
3
+ import java.util.concurrent.ConcurrentHashMap;
4
+
5
+ import GameMachine.Messages.TrackData;
6
+
7
+ public class DefaultMovementVerifier implements MovementVerifier {
8
+
9
+ private ConcurrentHashMap<String, TrackData> trackdatas = new ConcurrentHashMap<String, TrackData>();
10
+ private ConcurrentHashMap<String, Long> lastUpdates = new ConcurrentHashMap<String, Long>();
11
+ private double maxUnitsPerSecond;
12
+
13
+ private double distance(float px, float py, float x, float y) {
14
+ return Math.sqrt(Math.pow(x - px, 2) + Math.pow(y - py, 2));
15
+ }
16
+
17
+ public DefaultMovementVerifier(double maxUnitsPerSecond) {
18
+ this.maxUnitsPerSecond = maxUnitsPerSecond;
19
+ }
20
+
21
+ @Override
22
+ public boolean verify(TrackData trackData) {
23
+ if (!trackdatas.containsKey(trackData.id)) {
24
+ trackdatas.put(trackData.id, trackData);
25
+ lastUpdates.put(trackData.id, System.currentTimeMillis());
26
+ return true;
27
+ }
28
+
29
+ // verify once per second, every update is a waste of cpu
30
+ Long lastUpdate = lastUpdates.get(trackData.id);
31
+ double seconds = (System.currentTimeMillis() - lastUpdate) / 1000;
32
+ if (seconds >= 1.0) {
33
+ TrackData previous = trackdatas.get(trackData.id);
34
+
35
+ // check distance traveled over time (basic speed hack prevention)
36
+ double distance = distance(previous.x,previous.y,trackData.x,trackData.y);
37
+ double unitsPerSecond = distance / seconds;
38
+ if (unitsPerSecond > maxUnitsPerSecond) {
39
+ return false;
40
+ }
41
+
42
+ // TODO check valid movement.
43
+ // using pathfinding, pre calculate every possible move and save it somewhere.
44
+ // At startup load the data and use it to check for valid movement. Can also modify it
45
+ // at runtime if needed.
46
+
47
+ // In addition, check for other objects that occupy the coordinates the player is trying to move to, and
48
+ // deny if they are occupied. Need to look at most cost effective way to do this.
49
+
50
+ trackdatas.put(trackData.id, trackData);
51
+ lastUpdates.put(trackData.id, System.currentTimeMillis());
52
+ }
53
+ return true;
54
+ }
55
+
56
+ }
@@ -0,0 +1,119 @@
1
+ package com.game_machine.core;
2
+
3
+ import java.util.ArrayList;
4
+
5
+ import GameMachine.Messages.ClientManagerEvent;
6
+ import GameMachine.Messages.Entity;
7
+ import GameMachine.Messages.Neighbors;
8
+ import GameMachine.Messages.Player;
9
+ import GameMachine.Messages.TrackData;
10
+ import akka.actor.ActorSelection;
11
+ import akka.actor.UntypedActor;
12
+ import akka.event.Logging;
13
+ import akka.event.LoggingAdapter;
14
+
15
+ public class EntityTracking extends UntypedActor {
16
+
17
+ LoggingAdapter log = Logging.getLogger(getContext().system(), this);
18
+ public static String name = "fastpath_entity_tracking";
19
+
20
+ private Grid aoeGrid;
21
+ private Grid grid;
22
+ private ActorSelection messageGateway;
23
+
24
+ public EntityTracking() {
25
+ messageGateway = ActorUtil.getSelectionByName(MessageGateway.name);
26
+ grid = Grid.find("default");
27
+ aoeGrid = Grid.find("aoe");
28
+ Commands.clientManagerRegister(name);
29
+ }
30
+
31
+ @Override
32
+ public void onReceive(Object message) throws Exception {
33
+
34
+ if (message instanceof Entity) {
35
+ Entity entity = (Entity) message;
36
+
37
+ SendNeighbors(entity);
38
+ setEntityLocation(entity.trackData);
39
+
40
+ } else if (message instanceof ClientManagerEvent) {
41
+ ClientManagerEvent event = (ClientManagerEvent) message;
42
+ if (event.event.equals("disconnected")) {
43
+ removePlayerData(event);
44
+ }
45
+ } else {
46
+ unhandled(message);
47
+ }
48
+
49
+ }
50
+
51
+ private void removePlayerData(ClientManagerEvent event) {
52
+ grid.remove(event.player_id);
53
+ aoeGrid.remove(event.player_id);
54
+ }
55
+
56
+ private void SendNeighbors(Entity entity) {
57
+ Float x = entity.trackData.x;
58
+ Float y = entity.trackData.y;
59
+ if (x == null) {
60
+ x = 0f;
61
+ }
62
+ if (y == null) {
63
+ y = 0f;
64
+ }
65
+
66
+ ArrayList<TrackData> trackDatas = grid.neighbors(x, y,
67
+ entity.trackData.neighborEntityType);
68
+
69
+ if (trackDatas.size() >= 1) {
70
+ toNeighbors(entity.player, trackDatas);
71
+ }
72
+ }
73
+
74
+ private void SendToGateway(Player player, Neighbors neighbors) {
75
+ Entity playerMessage = new Entity();
76
+ playerMessage.setNeighbors(neighbors);
77
+ playerMessage.setPlayer(player);
78
+ playerMessage.setId(player.id);
79
+ messageGateway.tell(playerMessage, getSelf());
80
+ }
81
+
82
+ private void toNeighbors(Player player, ArrayList<TrackData> trackDatas) {
83
+ int count = 0;
84
+ Neighbors neighbors = new Neighbors();
85
+
86
+ for (TrackData trackData : trackDatas) {
87
+ neighbors.addTrackData(trackData);
88
+
89
+ count++;
90
+ if (count >= 30) {
91
+ SendToGateway(player, neighbors);
92
+ count = 0;
93
+ neighbors = new Neighbors();
94
+ }
95
+ }
96
+ SendToGateway(player, neighbors);
97
+ }
98
+
99
+ private void setEntityLocation(TrackData trackData) {
100
+
101
+ // So either protostuff or protobuf-net has a bug where 0 floats come
102
+ // through as null
103
+ // This is *really* annoying must track down
104
+ if (trackData.x == null) {
105
+ trackData.x = 0f;
106
+ }
107
+ if (trackData.y == null) {
108
+ trackData.y = 0f;
109
+ }
110
+ if (trackData.z == null) {
111
+ trackData.z = 0f;
112
+ }
113
+
114
+ // TODO. If set returns false send message to the client letting them know their movement was not allowed
115
+ grid.set(trackData);
116
+ aoeGrid.set(trackData);
117
+ }
118
+
119
+ }
@@ -32,7 +32,7 @@ public class EventStreamHandler extends UntypedActor {
32
32
  public void onReceive(Object message) throws Exception {
33
33
  if (message instanceof DeadLetter) {
34
34
  DeadLetter letter = (DeadLetter) message;
35
- log.info("DeadLetter " + letter.message());
35
+ //log.warning("DeadLetter " + letter.message() + " " + letter.sender().toString() + " " + letter.recipient().toString());
36
36
  // Scala creates bad class names that blow up in jruby and show up in dead letters.
37
37
  //ActorSelection sel = ActorUtil
38
38
  // .getSelectionByName("GameMachine::SystemMonitor");
@@ -0,0 +1,73 @@
1
+ package com.game_machine.core;
2
+
3
+ import java.util.concurrent.ConcurrentHashMap;
4
+
5
+ import GameMachine.Messages.Entity;
6
+ import GameMachine.Messages.GameMessage;
7
+ import GameMachine.Messages.GameMessages;
8
+ import akka.actor.UntypedActor;
9
+
10
+ public class GameActor extends UntypedActor {
11
+
12
+ private static ConcurrentHashMap<String, GameMessage> reliableMessages = new ConcurrentHashMap<String, GameMessage>();
13
+ private static ConcurrentHashMap<String, Integer> reliableMessageStatus = new ConcurrentHashMap<String, Integer>();
14
+
15
+ public String playerId;
16
+ public String messageId;
17
+
18
+ public void setPlayerId(String playerId) {
19
+ this.playerId = playerId;
20
+ }
21
+
22
+ @Override
23
+ public void onReceive(Object message) throws Exception {
24
+
25
+ }
26
+
27
+ public static void removeReliableMessage(String id) {
28
+ if (reliableMessages.containsKey(id)) {
29
+ reliableMessages.remove(id);
30
+ }
31
+
32
+ if (reliableMessageStatus.containsKey(id)) {
33
+ reliableMessageStatus.remove(id);
34
+ }
35
+ }
36
+
37
+ public boolean setReply(GameMessage gameMessage) {
38
+ gameMessage.messageId = this.messageId;
39
+ if (reliableMessageStatus.containsKey(gameMessage.messageId)) {
40
+ reliableMessages.put(gameMessage.messageId, gameMessage);
41
+ reliableMessageStatus.replace(gameMessage.messageId,1);
42
+ sendReply(gameMessage.messageId);
43
+ return true;
44
+ } else {
45
+ return false;
46
+ }
47
+ }
48
+
49
+ private void sendReply(String messageId) {
50
+ GameMessage gameMessage = reliableMessages.get(messageId);
51
+ Entity entity = new Entity();
52
+ entity.setId(messageId);
53
+ entity.setGameMessages(new GameMessages());
54
+ entity.gameMessages.addGameMessage(gameMessage);
55
+ PlayerCommands.sendToPlayer(entity, playerId);
56
+ }
57
+
58
+ public boolean exactlyOnce(GameMessage gameMessage) {
59
+ if (gameMessage.hasMessageId()) {
60
+ if (reliableMessageStatus.containsKey(gameMessage.messageId)) {
61
+ int status = reliableMessageStatus.get(gameMessage.messageId);
62
+ if (status == 1) {
63
+ sendReply(gameMessage.messageId);
64
+ }
65
+ } else {
66
+ reliableMessageStatus.put(gameMessage.messageId, 0);
67
+ this.messageId = gameMessage.messageId;
68
+ return true;
69
+ }
70
+ }
71
+ return false;
72
+ }
73
+ }
@@ -0,0 +1,43 @@
1
+ package com.game_machine.core;
2
+
3
+ import org.slf4j.Logger;
4
+ import org.slf4j.LoggerFactory;
5
+
6
+ import akka.actor.ActorSystem;
7
+ import akka.actor.Props;
8
+ import akka.routing.RoundRobinPool;
9
+
10
+ public class GameMachineLoader {
11
+
12
+
13
+
14
+ @SuppressWarnings("unused")
15
+ private static final Logger log = LoggerFactory.getLogger(GameMachineLoader.class);
16
+ public static final Logger logger = LoggerFactory.getLogger("game_machine");
17
+ private static ActorSystem actorSystem;
18
+
19
+
20
+ public static ActorSystem getActorSystem() {
21
+ return actorSystem;
22
+ }
23
+
24
+ public static void StartMessageGateway() {
25
+ actorSystem.actorOf(new RoundRobinPool(10).props(Props.create(MessageGateway.class)),
26
+ MessageGateway.name);
27
+ }
28
+
29
+ public static void StartEntityTracking() {
30
+ actorSystem.actorOf(new RoundRobinPool(10).props(Props.create(EntityTracking.class)),
31
+ EntityTracking.name);
32
+ }
33
+
34
+ public void run(ActorSystem newActorSystem) {
35
+ Thread.currentThread().setName("game-machine");
36
+ actorSystem = newActorSystem;
37
+ actorSystem.actorOf(Props.create(EventStreamHandler.class), EventStreamHandler.class.getSimpleName());
38
+
39
+ actorSystem.actorOf(new RoundRobinPool(10).props(Props.create(MessagePersister.class)),
40
+ MessagePersister.name);
41
+ }
42
+
43
+ }