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,2 @@
1
+ require_relative 'default_handlers/team_handler'
2
+ require_relative 'default_handlers/zone_manager'
@@ -0,0 +1,51 @@
1
+
2
+ module GameMachine
3
+ module DefaultHandlers
4
+ class TeamHandler
5
+
6
+ attr_reader :teams
7
+ def initialize
8
+ update_teams
9
+ end
10
+
11
+ def update_teams
12
+ @teams = GameMachine::Models::Teams.find('teams')
13
+ end
14
+
15
+ # Should return a Match object if a match is found, otherwise nil
16
+ def match!(team_name)
17
+ GameMachine.logger.info "match! team_name:#{team_name} teams:#{teams}"
18
+ if team = teams.teams.select {|team| team.name != team_name}.first
19
+ return GameMachine::Models::StartMatch.new(:team_names => [team_name,team.name])
20
+ end
21
+ nil
22
+ end
23
+
24
+ # Called when Game Machine has started the match
25
+ def match_started(match)
26
+
27
+ end
28
+
29
+ # Filter you can apply to the teams list sent to clients
30
+ # You can add whatever extra fields you want to the TeamsRequest
31
+ # class on the client and they will show up here.
32
+ def teams_filter(teams,teams_request)
33
+ teams
34
+ end
35
+
36
+ # return true if member has rights to create team
37
+ def can_create_team?(team_name,member)
38
+ true
39
+ end
40
+
41
+ # return true if member has rights to join team
42
+ def can_add_member?(team_name,member)
43
+ true
44
+ end
45
+
46
+ def destroy_on_owner_leave?
47
+ true
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,30 @@
1
+ # This class is configured in regions.yml, which is a mapping of regions to classes
2
+ # that handle running the region. In this example we use the same class for both
3
+ # of our regions. Our example regions only vary in which npc's are spawned.
4
+ module GameMachine
5
+ module DefaultHandlers
6
+ class ZoneManager < GameMachine::Actor::Base
7
+
8
+ def post_init(*args)
9
+ @region_up = false
10
+ end
11
+
12
+ def start_zone(zone)
13
+ end
14
+
15
+ def on_receive(message)
16
+
17
+ # Region manager pings us every couple of seconds as long as we are alive,
18
+ # it's up to us to determine if we have started the region or not
19
+ if message.is_a?(GameMachine::Models::Region)
20
+ return if @region_up
21
+ @region_up = true
22
+
23
+ zone = message.name
24
+ GameMachine.logger.info "#{self.class.name} Starting region #{zone}"
25
+ start_zone(zone)
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,6 +1,2 @@
1
- require_relative 'endpoints/tcp_handler'
2
- require_relative 'endpoints/udp'
3
- require_relative 'endpoints/tcp'
4
- require_relative 'endpoints/mono_gateway'
5
1
  require_relative 'endpoints/udp_incoming'
6
2
  require_relative 'endpoints/udp_outgoing'
@@ -12,7 +12,7 @@ module GameMachine
12
12
 
13
13
  attr_reader :game_handler, :server, :clients
14
14
  def post_init(*args)
15
- @game_handler = Actor::Base.find(Application.config.game_handler)
15
+ @game_handler = GameMachine::Handlers::Request.find
16
16
  @server = JavaLib::UdpServer.getUdpServer
17
17
  @server_handler = @server.getHandler
18
18
  @auth_handler = Handlers::Authentication.new
@@ -30,7 +30,14 @@ module GameMachine
30
30
 
31
31
  def handle_incoming(message)
32
32
  client_id = client_id_from_message(message)
33
- client_message = MessageLib::ClientMessage.parse_from(message.bytes)
33
+ if message.protocol == 0
34
+ client_message = MessageLib::ClientMessage.parse_from(message.bytes)
35
+ elsif message.protocol == 2
36
+ client_message = message.clientMessage
37
+ else
38
+ raise "Unknown protocol"
39
+ end
40
+
34
41
  client_connection = create_client_connection(
35
42
  client_id,client_message.connection_type
36
43
  )
@@ -57,11 +64,12 @@ module GameMachine
57
64
  client = {
58
65
  :host => message.host,
59
66
  :port => message.port,
67
+ :address => message.address,
60
68
  :ctx => message.ctx,
61
69
  :client_connection => client_connection
62
70
  }
63
71
  self.class.clients[client_message.player.id] = client
64
- create_child(client_connection,client,@server,client_message.player.id)
72
+ create_child(message.protocol,client_connection,client,@server,client_message.player.id)
65
73
  end
66
74
  end
67
75
  end
@@ -73,8 +81,8 @@ module GameMachine
73
81
  GameMachine.logger.error "#{self.class.name} #{e.to_s}"
74
82
  end
75
83
 
76
- def create_child(client_connection,client,server,player_id)
77
- builder = Actor::Builder.new(Endpoints::UdpOutgoing,client_connection,client,server,player_id)
84
+ def create_child(protocol,client_connection,client,server,player_id)
85
+ builder = Actor::Builder.new(Endpoints::UdpOutgoing,client_connection,client,server,player_id,protocol)
78
86
  builder.with_name(player_id).start
79
87
  end
80
88
 
@@ -2,12 +2,13 @@ module GameMachine
2
2
  module Endpoints
3
3
  class UdpOutgoing < Actor::Base
4
4
 
5
- attr_reader :client_connection, :client, :server, :player_id
5
+ attr_reader :protocol, :client_connection, :client, :server, :player_id
6
6
  def post_init(*args)
7
7
  @client_connection = args[0]
8
8
  @client = args[1]
9
9
  @server = args[2]
10
10
  @player_id = args[3]
11
+ @protocol = args[4]
11
12
  send_connected_message
12
13
  GameMachine.logger.info "Player gateway created #{player_id}"
13
14
  end
@@ -24,14 +25,19 @@ module GameMachine
24
25
  end
25
26
 
26
27
  def send_to_client(message)
27
- bytes = message.to_byte_array
28
- server.sendToClient(
29
- bytes,
30
- client[:host],
31
- client[:port],
32
- client[:ctx]
33
- )
34
-
28
+ #GameMachine.logger.info("Sending #{message} out via #{protocol}")
29
+ if protocol == 0
30
+ bytes = message.to_byte_array
31
+ server.sendToClient(
32
+ client[:address],
33
+ bytes,
34
+ client[:ctx]
35
+ )
36
+ else
37
+ client[:ctx].write(message)
38
+ client[:ctx].flush
39
+ JavaLib::UdpServerHandler.countOut.incrementAndGet
40
+ end
35
41
  end
36
42
 
37
43
  def on_receive(message)
@@ -2,8 +2,6 @@
2
2
  require_relative 'game_systems/chat_manager'
3
3
  require_relative 'game_systems/chat'
4
4
  require_relative 'game_systems/chat_topic'
5
- require_relative 'game_systems/entity_loader'
6
- require_relative 'game_systems/entity_tracking'
7
5
  require_relative 'game_systems/local_echo'
8
6
  require_relative 'game_systems/remote_echo'
9
7
  require_relative 'game_systems/stress_test'
@@ -103,8 +103,8 @@ module GameMachine
103
103
  def local_agents
104
104
  {}.tap do |agents|
105
105
  agent_config.agent_names.each do |name|
106
- bucket = Akka.instance.hashring.bucket_for(name)
107
- if bucket == address
106
+ node = Akka.instance.hashring.node_for(name)
107
+ if node == address
108
108
  agents[name] = agent_config.klass_for_name(name)
109
109
  end
110
110
  end
@@ -18,9 +18,6 @@ module GameMachine
18
18
  attr_reader :grid, :extra_params, :aoe_grid
19
19
 
20
20
  def post_init
21
- if handler_klass = Application.config.entity_tracking_handler
22
- @tracking_handler = handler_klass.constantize.new
23
- end
24
21
  @entity_updates = []
25
22
  @grid = Grid.find_or_create('default')
26
23
  @aoe_grid = Grid.find_or_create('aoe')
@@ -1,4 +1,3 @@
1
- require_relative 'region_settings'
2
1
  module GameMachine
3
2
  module GameSystems
4
3
  class RegionManager < Actor::Base
@@ -28,7 +27,9 @@ module GameMachine
28
27
  end
29
28
 
30
29
  def load_from_config
31
- RegionSettings.regions.each do |name,manager|
30
+ Application.config.regions.each do |entry|
31
+ name = entry[0]
32
+ manager = entry[1]
32
33
  unless region = Region.find!(name)
33
34
  region = Region.new(
34
35
  :id => name,
@@ -51,8 +51,8 @@ module GameMachine
51
51
  end
52
52
 
53
53
  def load_from_config
54
- RegionSettings.regions.each do |name,manager|
55
-
54
+ Application.config.regions.each do |entry|
55
+ name = entry[0]
56
56
  # Make sure we set some value here, it will get updated with a valid
57
57
  # region in update_regions
58
58
  if region = Region.find!(name)
@@ -4,7 +4,17 @@ module GameMachine
4
4
  include GameMachine::Commands
5
5
  aspect %w(EchoTest)
6
6
 
7
+ def post_init(*args)
8
+ chars = [*('a'..'z'),*('0'..'9')].flatten
9
+ str = Array.new(400) {|i| chars.sample}.join
10
+ @test_message = MessageLib::Entity.new.set_id(str)
11
+ #schedule_message('test',10)
12
+ end
13
+
7
14
  def on_receive(message)
15
+ if message.is_a?(String) && message == 'test'
16
+ return
17
+ end
8
18
  #GameMachine.logger.info "#{self.class.name} #{message}"
9
19
  commands.player.send_message(message,message.player.id)
10
20
  end
@@ -6,9 +6,7 @@ module GameMachine
6
6
 
7
7
  attr_reader :team_handler
8
8
  def post_init(*args)
9
- if Application.config.team_handler
10
- @team_handler = Application.config.team_handler.constantize.new
11
- end
9
+ @team_handler = Application.config.handlers.team.constantize.new
12
10
  define_update_procs
13
11
  commands.misc.client_manager_register(self.class.name)
14
12
  end
@@ -85,37 +83,30 @@ module GameMachine
85
83
  end
86
84
 
87
85
  def can_add_member?(team_name,player_id)
88
- return true unless team_handler
89
86
  team_handler.can_add_member?(team_name, player_id)
90
87
  end
91
88
 
92
89
  def can_create_team?(team_name,player_id)
93
- return true unless team_handler
94
90
  team_handler.can_create_team?(team_name, player_id)
95
91
  end
96
92
 
97
93
  def handler_update_teams
98
- return true unless team_handler
99
94
  team_handler.update_teams
100
95
  end
101
96
 
102
97
  def destroy_on_owner_leave?
103
- return true unless team_handler
104
98
  team_handler.destroy_on_owner_leave?
105
99
  end
106
100
 
107
101
  def handler_teams_filter(teams,teams_request)
108
- return teams unless team_handler
109
102
  team_handler.teams_filter(teams,teams_request)
110
103
  end
111
104
 
112
105
  def handler_find_match(team_name)
113
- return true unless team_handler
114
106
  team_handler.match!(team_name)
115
107
  end
116
108
 
117
109
  def handler_match_started(match)
118
- return true unless team_handler
119
110
  team_handler.match_started(match)
120
111
  end
121
112
 
@@ -309,7 +300,7 @@ module GameMachine
309
300
  return
310
301
  end
311
302
 
312
- server = Akka.instance.hashring.bucket_for(match_id)
303
+ server = Akka.instance.hashring.node_for(match_id)
313
304
  server = server.sub('akka.tcp://cluster@','').split(':').first
314
305
 
315
306
  match = Match.new(
@@ -16,7 +16,8 @@ module GameMachine
16
16
  end
17
17
 
18
18
  def load_from_config
19
- Application.config.grids.each do |name,value|
19
+ ['default','local_chat','aoe'].each do |name|
20
+ value = Application.config.grids.send(name.to_sym)
20
21
  grid_size,cell_size,update_frequency = value.split(',')
21
22
  config[name] = {
22
23
  :grid_size => grid_size.to_i,
@@ -28,15 +29,7 @@ module GameMachine
28
29
  end
29
30
 
30
31
  def reset_grids
31
- @grids = java.util.concurrent.ConcurrentHashMap.new
32
- end
33
-
34
- def grids
35
- if @grids
36
- return @grids
37
- else
38
- reset_grids
39
- end
32
+ JavaLib::Grid.reset_grids
40
33
  end
41
34
 
42
35
  def default_grid
@@ -44,15 +37,9 @@ module GameMachine
44
37
  end
45
38
 
46
39
  def find_or_create(name)
47
- unless grids.containsKey(name)
48
- GameMachine.logger.info "CREATING GRID #{name}"
49
- grid_config = config.fetch(name)
50
- grid = JavaLib::Grid.new(grid_config.fetch(:grid_size),
40
+ grid_config = config.fetch(name)
41
+ JavaLib::Grid.find_or_create(name,grid_config.fetch(:grid_size),
51
42
  grid_config.fetch(:cell_size))
52
- grids.put(name,grid)
53
- end
54
-
55
- grids.fetch(name)
56
43
  end
57
44
  end
58
45
 
@@ -23,23 +23,15 @@ module GameMachine
23
23
  end
24
24
 
25
25
  def authtoken_for_player(player_id)
26
- Application.auth_handler.authtoken_for(player_id)
26
+ Handlers::PlayerAuthentication.instance.authtoken_for(player_id)
27
27
  end
28
28
 
29
29
  def valid_authtoken?(player)
30
- return true if public?
31
30
  player.authtoken == authtoken_for_player(player.id)
32
31
  end
33
32
 
34
- def public?
35
- Application.config.auth_handler == 'GameMachine::AuthHandlers::Public'
36
- end
37
33
 
38
34
  def authenticate!(player)
39
- if public?
40
- AUTHENTICATED_USERS[player.id] = player.authtoken
41
- return true
42
- end
43
35
  @player = player
44
36
  if valid_authtoken?(player)
45
37
  register_player(player.id)
@@ -3,8 +3,9 @@ module GameMachine
3
3
  class Game < Actor::Base
4
4
  include Commands
5
5
 
6
- attr_reader :destinations
6
+ attr_reader :destinations, :game_message_routes
7
7
  def post_init(*args)
8
+ @game_message_routes = Routes.instance.game_message_routes
8
9
  @destinations = {}
9
10
  end
10
11
 
@@ -27,6 +28,30 @@ module GameMachine
27
28
  entity = GameSystems::ObjectDbProxy.save_entity(entity)
28
29
  end
29
30
 
31
+ if entity.has_game_messages
32
+ entity.game_messages.get_game_message_list.each do |game_message|
33
+ if game_message.has_destination_id
34
+ destination = game_message.destination_id
35
+ elsif game_message.has_destination
36
+ destination = game_message.destination
37
+ else
38
+ GameMachine.logger.warn "Unable to find destination for game message, skipping"
39
+ next
40
+ end
41
+
42
+ if route = game_message_routes.fetch(destination)
43
+ game_message.set_player_id(entity.player.id)
44
+ if route[:distributed]
45
+ Actor::Base.find_distributed(entity.player.id,route[:to]).tell(game_message)
46
+ else
47
+ Actor::Base.find(route[:to]).tell(game_message)
48
+ end
49
+ else
50
+ GameMachine.logger.warn "No route for destination #{destination}"
51
+ end
52
+ end
53
+ end
54
+
30
55
  if entity.has_destination
31
56
  unless actor_ref = destinations.fetch(entity.destination,nil)
32
57
  destination = entity.destination.gsub('/','::')
@@ -39,7 +64,7 @@ module GameMachine
39
64
  next
40
65
  end
41
66
 
42
- # TODO: Optimize this
67
+ # DEPRECATED - convert to named routes as we do for game messages
43
68
  component_names = entity.component_names
44
69
  GameMachine.logger.debug("Dispatch: #{entity} #{component_names.to_a.inspect}")
45
70
  next if component_names.empty?
@@ -0,0 +1,87 @@
1
+
2
+ # This class is set in the configuration.
3
+
4
+ # This is a simple implementation that works together with the built in
5
+ # user registration and login via http. User data is stored in the object database.
6
+
7
+ # The minimum necessary to implement is the authtoken_for method. That method can
8
+ # block as it is only called once when the client first connects and is cached
9
+ # internally after that. So you could make an external http call for example.
10
+ require 'digest/md5'
11
+ module GameMachine
12
+ module Handlers
13
+ class PlayerAuthentication
14
+ include Singleton
15
+ include Models
16
+
17
+ attr_reader :authclass
18
+ def initialize
19
+ @sessions = {}
20
+ java_import "#{AppConfig.instance.config.handlers.auth}"
21
+ @authclass = AppConfig.instance.config.handlers.auth.split('.').last.constantize
22
+ end
23
+
24
+ def public?
25
+ AppConfig.instance.config.handlers.auth == "com.game_machine.authentication.PublicAuthenticator"
26
+ end
27
+
28
+ def get_player(username)
29
+ if public?
30
+ MessageLib::Player.new.set_id(username)
31
+ else
32
+ MessageLib::Player.store_get('players',username,2000)
33
+ end
34
+ end
35
+
36
+ # Returns true if authorized, false if not
37
+ def authorize(username,password)
38
+ GameMachine.logger.info "authorize: #{username}"
39
+ if player = get_player(username)
40
+ authenticator = authclass.new(player)
41
+ if authenticator.authenticate(password)
42
+ @sessions[username] = authtoken(username,password)
43
+ player.set_authtoken(@sessions[username])
44
+ player.store_set('players')
45
+ return @sessions[username]
46
+ else
47
+ GameMachine.logger.info "player: #{player.id} password does not match"
48
+ false
49
+ end
50
+ else
51
+ GameMachine.logger.info "player: #{username} not found"
52
+ false
53
+ end
54
+ false
55
+ end
56
+
57
+ # Returns a session token for a logged in user. This must be a string and
58
+ # should not be too long, as it gets sent with every message.
59
+ def authtoken_for(username)
60
+ if authtoken = @sessions.fetch(username,nil)
61
+ return authtoken
62
+
63
+ # user authenticated on different server, we have to look up their authtoken
64
+ # and save it in the local sessions hash
65
+ elsif player = get_player(username)
66
+ if authtoken = player.authtoken
67
+ @sessions[username] = authtoken
68
+ return authtoken
69
+ else
70
+ GameMachine.logger.info "Authoken for #{username} is nil"
71
+ nil
72
+ end
73
+ else
74
+ GameMachine.logger.info "User #{username} not found"
75
+ nil
76
+ end
77
+ end
78
+
79
+ private
80
+
81
+ def authtoken(username,password)
82
+ Digest::MD5.hexdigest("#{username}#{password}#{rand(10000)}")
83
+ end
84
+ end
85
+ end
86
+ end
87
+