game_machine 0.0.8

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 (273) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +4 -0
  3. data/Gemfile.lock +72 -0
  4. data/Rakefile +38 -0
  5. data/bin/game_machine +79 -0
  6. data/config/cluster.conf +65 -0
  7. data/config/config.example.yml +93 -0
  8. data/config/game_messages.proto +45 -0
  9. data/config/messages.proto +339 -0
  10. data/config/regions.example.yml +9 -0
  11. data/config/standalone.conf +36 -0
  12. data/db/do_not_delete +0 -0
  13. data/game_machine.gemspec +38 -0
  14. data/games/example/boot.rb +6 -0
  15. data/games/example/data/game_data.yml +13 -0
  16. data/games/example/lib/aggressive_npc.rb +176 -0
  17. data/games/example/lib/authentication_handler.rb +69 -0
  18. data/games/example/lib/chatbot.rb +61 -0
  19. data/games/example/lib/combat_controller.rb +145 -0
  20. data/games/example/lib/example_controller.rb +21 -0
  21. data/games/example/lib/game.rb +85 -0
  22. data/games/example/lib/models/attack.rb +9 -0
  23. data/games/example/lib/models/combat_update.rb +11 -0
  24. data/games/example/lib/models/player_command.rb +7 -0
  25. data/games/example/lib/models/user.rb +11 -0
  26. data/games/example/lib/models/vitals.rb +17 -0
  27. data/games/example/lib/npc.rb +111 -0
  28. data/games/example/lib/npc_group.rb +42 -0
  29. data/games/example/lib/npc_movement.rb +116 -0
  30. data/games/example/lib/player_manager.rb +58 -0
  31. data/games/example/lib/player_register.rb +80 -0
  32. data/games/example/lib/tracking_handler.rb +17 -0
  33. data/games/example/lib/zone_manager.rb +57 -0
  34. data/games/preload.rb +8 -0
  35. data/integration_tests/basic_spec.rb +68 -0
  36. data/integration_tests/bot_spec.rb +18 -0
  37. data/integration_tests/chat_spec.rb +45 -0
  38. data/integration_tests/distributed_spec.rb +34 -0
  39. data/integration_tests/entity_tracking_spec.rb +48 -0
  40. data/integration_tests/mono_spec.rb +16 -0
  41. data/integration_tests/objectdb_spec.rb +55 -0
  42. data/integration_tests/tcp_client_spec.rb +71 -0
  43. data/integration_tests/udp_client_spec.rb +61 -0
  44. data/integration_tests/udp_spec.rb +20 -0
  45. data/integration_tests/udt_client_spec.rb +23 -0
  46. data/integration_tests/udt_spec.rb +31 -0
  47. data/java/.gitignore +1 -0
  48. data/java/build.gradle +93 -0
  49. data/java/component.erb +396 -0
  50. data/java/gradle.properties +6 -0
  51. data/java/gradle/wrapper/gradle-wrapper.jar +0 -0
  52. data/java/gradle/wrapper/gradle-wrapper.properties +6 -0
  53. data/java/gradlew +164 -0
  54. data/java/gradlew.bat +90 -0
  55. data/java/local_lib/protostuff-compiler-1.0.7-jarjar.jar +0 -0
  56. data/java/settings.gradle +2 -0
  57. data/java/src/main/java/com/game_machine/core/ActorFactory.java +25 -0
  58. data/java/src/main/java/com/game_machine/core/ActorUtil.java +39 -0
  59. data/java/src/main/java/com/game_machine/core/CommandProxy.java +9 -0
  60. data/java/src/main/java/com/game_machine/core/EntitySerializer.java +66 -0
  61. data/java/src/main/java/com/game_machine/core/EventStreamHandler.java +43 -0
  62. data/java/src/main/java/com/game_machine/core/GameMachineLoader.java +25 -0
  63. data/java/src/main/java/com/game_machine/core/Grid.java +195 -0
  64. data/java/src/main/java/com/game_machine/core/GridValue.java +30 -0
  65. data/java/src/main/java/com/game_machine/core/IActorFactory.java +7 -0
  66. data/java/src/main/java/com/game_machine/core/NetMessage.java +28 -0
  67. data/java/src/main/java/com/game_machine/core/UdpServer.java +97 -0
  68. data/java/src/main/java/com/game_machine/core/UdpServerHandler.java +90 -0
  69. data/java/src/main/resources/game_machine.java.stg +738 -0
  70. data/java/src/main/resources/logback.xml +14 -0
  71. data/java/src/main/resources/logging.properties +3 -0
  72. data/java/src/main/resources/protostuff.properties +7 -0
  73. data/lib/game_machine.rb +85 -0
  74. data/lib/game_machine/actor.rb +7 -0
  75. data/lib/game_machine/actor/base.rb +184 -0
  76. data/lib/game_machine/actor/builder.rb +108 -0
  77. data/lib/game_machine/actor/development.rb +31 -0
  78. data/lib/game_machine/actor/factory.rb +35 -0
  79. data/lib/game_machine/actor/mono_actor.rb +89 -0
  80. data/lib/game_machine/actor/ref.rb +81 -0
  81. data/lib/game_machine/actor/reloadable.rb +98 -0
  82. data/lib/game_machine/actor/system.rb +32 -0
  83. data/lib/game_machine/akka.rb +98 -0
  84. data/lib/game_machine/app_config.rb +49 -0
  85. data/lib/game_machine/application.rb +181 -0
  86. data/lib/game_machine/auth_handlers/base.rb +21 -0
  87. data/lib/game_machine/auth_handlers/public.rb +34 -0
  88. data/lib/game_machine/bot/chat.rb +66 -0
  89. data/lib/game_machine/bot/client.rb +54 -0
  90. data/lib/game_machine/client_manager.rb +204 -0
  91. data/lib/game_machine/clients.rb +4 -0
  92. data/lib/game_machine/clients/client.rb +45 -0
  93. data/lib/game_machine/clients/tcp_client.rb +25 -0
  94. data/lib/game_machine/clients/test_client.rb +151 -0
  95. data/lib/game_machine/clients/udp_client.rb +25 -0
  96. data/lib/game_machine/clients/udt_client.rb +34 -0
  97. data/lib/game_machine/cluster_monitor.rb +115 -0
  98. data/lib/game_machine/commands.rb +23 -0
  99. data/lib/game_machine/commands/base.rb +21 -0
  100. data/lib/game_machine/commands/chat_commands.rb +88 -0
  101. data/lib/game_machine/commands/datastore_commands.rb +60 -0
  102. data/lib/game_machine/commands/grid_commands.rb +35 -0
  103. data/lib/game_machine/commands/message_helper.rb +25 -0
  104. data/lib/game_machine/commands/misc_commands.rb +29 -0
  105. data/lib/game_machine/commands/navigation_commands.rb +24 -0
  106. data/lib/game_machine/commands/player_commands.rb +28 -0
  107. data/lib/game_machine/commands/proxy.rb +16 -0
  108. data/lib/game_machine/console.rb +3 -0
  109. data/lib/game_machine/console/build.rb +74 -0
  110. data/lib/game_machine/console/install.rb +92 -0
  111. data/lib/game_machine/console/server.rb +120 -0
  112. data/lib/game_machine/data_store.rb +52 -0
  113. data/lib/game_machine/data_stores/couchbase.rb +18 -0
  114. data/lib/game_machine/data_stores/mapdb.rb +49 -0
  115. data/lib/game_machine/data_stores/memory.rb +35 -0
  116. data/lib/game_machine/data_stores/redis.rb +46 -0
  117. data/lib/game_machine/endpoints.rb +6 -0
  118. data/lib/game_machine/endpoints/mono_gateway.rb +87 -0
  119. data/lib/game_machine/endpoints/tcp.rb +51 -0
  120. data/lib/game_machine/endpoints/tcp_handler.rb +75 -0
  121. data/lib/game_machine/endpoints/udp.rb +88 -0
  122. data/lib/game_machine/endpoints/udp_incoming.rb +113 -0
  123. data/lib/game_machine/endpoints/udp_outgoing.rb +46 -0
  124. data/lib/game_machine/game_loader.rb +46 -0
  125. data/lib/game_machine/game_systems.rb +14 -0
  126. data/lib/game_machine/game_systems/agents/controller.rb +118 -0
  127. data/lib/game_machine/game_systems/chat.rb +256 -0
  128. data/lib/game_machine/game_systems/chat_manager.rb +108 -0
  129. data/lib/game_machine/game_systems/chat_topic.rb +36 -0
  130. data/lib/game_machine/game_systems/devnull.rb +13 -0
  131. data/lib/game_machine/game_systems/entity_loader.rb +12 -0
  132. data/lib/game_machine/game_systems/entity_tracking.rb +133 -0
  133. data/lib/game_machine/game_systems/local_echo.rb +16 -0
  134. data/lib/game_machine/game_systems/objectdb_proxy.rb +61 -0
  135. data/lib/game_machine/game_systems/private_chat.rb +20 -0
  136. data/lib/game_machine/game_systems/region_manager.rb +91 -0
  137. data/lib/game_machine/game_systems/region_service.rb +94 -0
  138. data/lib/game_machine/game_systems/region_settings.rb +13 -0
  139. data/lib/game_machine/game_systems/remote_echo.rb +14 -0
  140. data/lib/game_machine/game_systems/stress_test.rb +21 -0
  141. data/lib/game_machine/grid.rb +60 -0
  142. data/lib/game_machine/grid_replicator.rb +31 -0
  143. data/lib/game_machine/handlers/authentication.rb +55 -0
  144. data/lib/game_machine/handlers/game.rb +63 -0
  145. data/lib/game_machine/handlers/request.rb +80 -0
  146. data/lib/game_machine/hashring.rb +48 -0
  147. data/lib/game_machine/helpers/game_message.rb +159 -0
  148. data/lib/game_machine/helpers/state_machine.rb +29 -0
  149. data/lib/game_machine/java_lib.rb +51 -0
  150. data/lib/game_machine/logger.rb +39 -0
  151. data/lib/game_machine/message_buffer.rb +58 -0
  152. data/lib/game_machine/message_queue.rb +63 -0
  153. data/lib/game_machine/model.rb +125 -0
  154. data/lib/game_machine/models.rb +3 -0
  155. data/lib/game_machine/models/player_status_update.rb +8 -0
  156. data/lib/game_machine/models/region.rb +9 -0
  157. data/lib/game_machine/mono_server.rb +20 -0
  158. data/lib/game_machine/navigation.rb +4 -0
  159. data/lib/game_machine/navigation/detour.rb +20 -0
  160. data/lib/game_machine/navigation/detour_navmesh.rb +53 -0
  161. data/lib/game_machine/navigation/detour_path.rb +53 -0
  162. data/lib/game_machine/navigation/path.rb +31 -0
  163. data/lib/game_machine/object_db.rb +67 -0
  164. data/lib/game_machine/protobuf.rb +6 -0
  165. data/lib/game_machine/protobuf/game_messages.rb +24 -0
  166. data/lib/game_machine/protobuf/generate.rb +113 -0
  167. data/lib/game_machine/protobuf_extensions/entity_helper.rb +11 -0
  168. data/lib/game_machine/reloadable_monitor.rb +26 -0
  169. data/lib/game_machine/restart_watcher.rb +17 -0
  170. data/lib/game_machine/ruby_extensions/nilclass.rb +10 -0
  171. data/lib/game_machine/ruby_extensions/string.rb +17 -0
  172. data/lib/game_machine/scheduler.rb +23 -0
  173. data/lib/game_machine/securerandom.rb +6 -0
  174. data/lib/game_machine/settings.rb +11 -0
  175. data/lib/game_machine/system_monitor.rb +19 -0
  176. data/lib/game_machine/system_stats.rb +24 -0
  177. data/lib/game_machine/uniqueid.rb +23 -0
  178. data/lib/game_machine/vector.rb +95 -0
  179. data/lib/game_machine/version.rb +3 -0
  180. data/lib/game_machine/write_behind_cache.rb +164 -0
  181. data/mono/bin/csharp/common.xslt +109 -0
  182. data/mono/bin/csharp/csharp.xslt +628 -0
  183. data/mono/bin/csharp/descriptor.proto +533 -0
  184. data/mono/bin/csharp/protobuf-net.dll +0 -0
  185. data/mono/bin/csharp/protobuf-net.pdb +0 -0
  186. data/mono/bin/csharp/protobuf-net.xml +2879 -0
  187. data/mono/bin/csharp/protogen.exe.config +3 -0
  188. data/mono/bin/csharp/protogen.pdb +0 -0
  189. data/mono/bin/csharp/protogen_csharp.exe +0 -0
  190. data/mono/bin/csharp/vb.xslt +745 -0
  191. data/mono/bin/csharp/xml.xslt +26 -0
  192. data/mono/server/Makefile +6 -0
  193. data/mono/server/NLog.config +12 -0
  194. data/mono/server/NLog.dll +0 -0
  195. data/mono/server/actor.cs +37 -0
  196. data/mono/server/build.bat +3 -0
  197. data/mono/server/cscompmgd.dll +0 -0
  198. data/mono/server/iactor.cs +11 -0
  199. data/mono/server/message_router.cs +67 -0
  200. data/mono/server/message_util.cs +29 -0
  201. data/mono/server/messages.cs +1888 -0
  202. data/mono/server/protobuf-net.dll +0 -0
  203. data/mono/server/proxy_client.cs +73 -0
  204. data/mono/server/proxy_server.cs +30 -0
  205. data/mono/server/test_actor.cs +33 -0
  206. data/pathfinding/bin/premake4 +0 -0
  207. data/pathfinding/include/mesh_loader.h +28 -0
  208. data/pathfinding/include/pathfind.h +167 -0
  209. data/pathfinding/main.cpp +39 -0
  210. data/pathfinding/mesh_loader.cpp +108 -0
  211. data/pathfinding/pathfind.cpp +174 -0
  212. data/pathfinding/pathfinder.cs +66 -0
  213. data/pathfinding/premake4.lua +109 -0
  214. data/script/server.sh +109 -0
  215. data/script/watch.sh +11 -0
  216. data/spec/actor/actor_spec.rb +73 -0
  217. data/spec/actor/builder_spec.rb +56 -0
  218. data/spec/actor/ref_spec.rb +83 -0
  219. data/spec/application_spec.rb +7 -0
  220. data/spec/client_manager_spec.rb +171 -0
  221. data/spec/commands/chat_commands_spec.rb +38 -0
  222. data/spec/commands/datastore_commands_spec.rb +91 -0
  223. data/spec/commands/grid_commands_spec.rb +37 -0
  224. data/spec/commands/navigation_commands_spec.rb +51 -0
  225. data/spec/commands/player_commands_spec.rb +48 -0
  226. data/spec/commands_spec.rb +38 -0
  227. data/spec/data_stores/mapdb_spec.rb +46 -0
  228. data/spec/data_stores/redis_spec.rb +44 -0
  229. data/spec/game_systems/agents/controller_spec.rb +84 -0
  230. data/spec/game_systems/agents/test_agent.rb +10 -0
  231. data/spec/game_systems/agents/test_agent_config.rb +29 -0
  232. data/spec/game_systems/chat_manager_spec.rb +66 -0
  233. data/spec/game_systems/chat_spec.rb +187 -0
  234. data/spec/game_systems/entity_tracking_spec.rb +64 -0
  235. data/spec/game_systems/region_manager_spec.rb +138 -0
  236. data/spec/grid_spec.rb +37 -0
  237. data/spec/handlers/authentication_spec.rb +36 -0
  238. data/spec/handlers/game_spec.rb +49 -0
  239. data/spec/handlers/request_spec.rb +65 -0
  240. data/spec/hashring_spec.rb +59 -0
  241. data/spec/integration_helper.rb +120 -0
  242. data/spec/java_grid_spec.rb +89 -0
  243. data/spec/message_buffer_spec.rb +67 -0
  244. data/spec/message_expectations.rb +47 -0
  245. data/spec/message_queue_spec.rb +23 -0
  246. data/spec/misc_spec.rb +71 -0
  247. data/spec/model_spec.rb +103 -0
  248. data/spec/mono_spec.rb +36 -0
  249. data/spec/mono_test.rb +18 -0
  250. data/spec/navigation/detour_navmesh_spec.rb +34 -0
  251. data/spec/navigation/detour_path_spec.rb +25 -0
  252. data/spec/spec_helper.rb +40 -0
  253. data/spec/udp_server_spec.rb +10 -0
  254. data/spec/write_behind_cache_spec.rb +109 -0
  255. data/web/app.rb +131 -0
  256. data/web/config/trinidad.yml +4 -0
  257. data/web/controllers/auth_controller.rb +19 -0
  258. data/web/controllers/base_controller.rb +16 -0
  259. data/web/controllers/index_controller.rb +7 -0
  260. data/web/controllers/log_controller.rb +47 -0
  261. data/web/controllers/messages_controller.rb +59 -0
  262. data/web/controllers/player_register_controller.rb +15 -0
  263. data/web/log/development.log +1339 -0
  264. data/web/tmp/restart.txt +0 -0
  265. data/web/views/game_messages.haml +45 -0
  266. data/web/views/index.haml +6 -0
  267. data/web/views/layout.haml +41 -0
  268. data/web/views/logs.haml +32 -0
  269. data/web/views/player_register.haml +22 -0
  270. data/web/views/player_registered.haml +2 -0
  271. data/web/views/register_layout.haml +22 -0
  272. data/web/views/restart.haml +35 -0
  273. metadata +576 -0
@@ -0,0 +1,75 @@
1
+ module GameMachine
2
+ module Endpoints
3
+ class TcpHandler < Actor::Base
4
+
5
+ attr_reader :game_handler
6
+ def post_init(*args)
7
+ @game_handler = Application.config.game_handler
8
+ @name = args.first
9
+ @con_ref = nil
10
+ @client_id = nil
11
+ @message_buffer = MessageBuffer.new
12
+ end
13
+
14
+ def on_receive(message)
15
+ if message.kind_of?(JavaLib::Tcp::ConnectionClosed)
16
+ client_message = client_disconnect_message(@client_id)
17
+ Actor::Base.find(game_handler).tell(client_message,get_self)
18
+ get_context.stop(get_self)
19
+ elsif message.kind_of?(JavaLib::Tcp::Received)
20
+ handle_incoming(message)
21
+ elsif message.is_a?(MessageLib::ClientMessage)
22
+ handle_outgoing(message)
23
+ elsif message.kind_of?(JavaLib::Tcp::Connected)
24
+ @con_ref = get_sender
25
+ @client_id = message.remote_address.to_s
26
+ else
27
+ unhandled(message)
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def client_connection(client_id)
34
+ MessageLib::ClientConnection.new.set_id(client_id).
35
+ set_gateway(@name).set_server(Application.config.name)
36
+ end
37
+
38
+ def client_disconnect_message(client_id)
39
+ MessageLib::ClientMessage.new.set_client_disconnect(
40
+ MessageLib::ClientDisconnect.new.set_client_connection(
41
+ MessageLib::ClientConnection.new.set_id(client_id).set_gateway(@name)
42
+ )
43
+ )
44
+ end
45
+
46
+ def handle_outgoing(message)
47
+ byte_string = JavaLib::ByteString.from_array(message.to_byte_array)
48
+ tcp_message = JavaLib::TcpMessage.write(byte_string)
49
+ @con_ref.tell(tcp_message, get_self)
50
+ rescue Exception => e
51
+ GameMachine.logger.error "#{self.class.name} #{e.to_s}"
52
+ end
53
+
54
+ def handle_incoming(message)
55
+ @message_buffer.add_bytes(message.data.to_array)
56
+ @message_buffer.messages.each do |message_bytes|
57
+ client_message = create_client_message(
58
+ message_bytes,@client_id
59
+ )
60
+ Actor::Base.find(game_handler).tell(client_message,get_self)
61
+ end
62
+ rescue Exception => e
63
+ GameMachine.logger.error "TcpHandler.handle_incoming: #{@name} #{e.to_s}"
64
+ end
65
+
66
+ def create_client_message(data,client_id)
67
+ MessageLib::ClientMessage.parse_from(data).set_client_connection(
68
+ MessageLib::ClientConnection.new.set_id(client_id).set_gateway(@name).
69
+ set_server(Application.config.name)
70
+ )
71
+ end
72
+
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,88 @@
1
+ module GameMachine
2
+ module Endpoints
3
+ class Udp < Actor::Base
4
+
5
+ # TODO lookup inactive clients, and send a client_disconnected
6
+ # message to the request handler. Currently clients that do not
7
+ # send a logout get left in the world
8
+ attr_reader :game_handler
9
+ def post_init(*args)
10
+ @game_handler = Application.config.game_handler
11
+ @clients = {}
12
+ @socket = nil
13
+ end
14
+
15
+ def preStart
16
+ mgr = JavaLib::Udp.get(getContext.system).getManager
17
+ inet = JavaLib::InetSocketAddress.new(
18
+ Application.config.udp_host,
19
+ Application.config.udp_port
20
+ )
21
+ mgr.tell( JavaLib::UdpMessage.bind(getSelf,inet), getSelf)
22
+ end
23
+
24
+ def on_receive(message)
25
+ if message.kind_of?(JavaLib::Udp::Bound)
26
+ @socket = getSender
27
+ elsif message.is_a?(MessageLib::ClientMessage)
28
+ handle_outgoing(message)
29
+ elsif message.kind_of?(JavaLib::Udp::Received)
30
+ echo(message)
31
+ return
32
+ handle_incoming(message)
33
+ elsif message == JavaLib::UdpMessage::unbind
34
+ @socket.tell(message, get_self)
35
+ elsif message.kind_of?(JavaLib::Udp::Unbound)
36
+ get_context.stop(get_self)
37
+ else
38
+ unhandled(message)
39
+ end
40
+ end
41
+
42
+ private
43
+
44
+ def handle_outgoing(message)
45
+ sender = @clients.fetch(message.client_connection.id)
46
+ byte_string = JavaLib::ByteString.from_array(message.to_byte_array)
47
+ udp_message = JavaLib::UdpMessage.send(byte_string, sender)
48
+ @socket.tell(udp_message, get_self)
49
+ rescue Exception => e
50
+ GameMachine.logger.error "#{self.class.name} #{e.to_s}"
51
+ end
52
+
53
+ def handle_incoming(message)
54
+ client_id = message.sender.to_s
55
+ unless @clients.has_key?(client_id)
56
+ @clients[client_id] = message.sender
57
+ end
58
+
59
+ client_message = create_client_message(
60
+ message.data.to_array,client_id
61
+ )
62
+ Actor::Base.find(game_handler).send_message(
63
+ client_message, :sender => get_self
64
+ )
65
+ rescue Exception => e
66
+ GameMachine.logger.error "#{self.class.name} #{e.to_s}"
67
+ end
68
+
69
+ def client_connection(client_id)
70
+ MessageLib::ClientConnection.new.set_id(client_id).
71
+ set_gateway(self.class.name).set_server(Application.config.name)
72
+ end
73
+
74
+ def create_client_message(data,client_id)
75
+ MessageLib::ClientMessage.parse_from(data).set_client_connection(
76
+ client_connection(client_id)
77
+ )
78
+ end
79
+
80
+ def echo(message)
81
+ byte_string = JavaLib::ByteString.from_array(message.data.to_array)
82
+ udp_message = JavaLib::UdpMessage.send(byte_string, message.sender)
83
+ @socket.tell(udp_message,get_self)
84
+ end
85
+
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,113 @@
1
+ module GameMachine
2
+ module Endpoints
3
+ class UdpIncoming < Actor::Base
4
+
5
+ def self.clients
6
+ if @clients
7
+ @clients
8
+ else
9
+ @clients = java.util.concurrent.ConcurrentHashMap.new
10
+ end
11
+ end
12
+
13
+ attr_reader :game_handler, :server, :clients
14
+ def post_init(*args)
15
+ @game_handler = Actor::Base.find(Application.config.game_handler)
16
+ @server = JavaLib::UdpServer.getUdpServer
17
+ @server_handler = @server.getHandler
18
+ @auth_handler = Handlers::Authentication.new
19
+ end
20
+
21
+ def on_receive(message)
22
+ if message.is_a?(JavaLib::NetMessage)
23
+ handle_incoming(message)
24
+ end
25
+ end
26
+
27
+ def client_id_from_message(message)
28
+ "#{message.host}:#{message.port}"
29
+ end
30
+
31
+ def handle_incoming(message)
32
+ client_id = client_id_from_message(message)
33
+ client_message = MessageLib::ClientMessage.parse_from(message.bytes)
34
+ client_connection = create_client_connection(
35
+ client_id,client_message.connection_type
36
+ )
37
+ client_message.set_client_connection(client_connection)
38
+
39
+ # Ensure we kill the player gateway actor on logout or on new connection
40
+ if client_message.has_player_logout || client_message.has_player_connect
41
+
42
+ # Ensure valid authtoken before doing anything
43
+ unless @auth_handler.valid_authtoken?(client_message.player)
44
+ if client_message.has_player_logout
45
+ GameMachine.logger.info "Unauthenticated client #{client_message.player.id} attempting to logout"
46
+ elsif client_message.has_player_connect
47
+ GameMachine.logger.info "Unauthenticated client #{client_message.player.id} attempting to login"
48
+ end
49
+ return
50
+ end
51
+
52
+ destroy_child(client_message.player.id)
53
+ self.class.clients.delete(client_message.player.id)
54
+
55
+ if client_message.has_player_connect
56
+ unless self.class.clients.has_key?(client_message.player.id)
57
+ client = {
58
+ :host => message.host,
59
+ :port => message.port,
60
+ :ctx => message.ctx,
61
+ :client_connection => client_connection
62
+ }
63
+ GameMachine.logger.info "#{client.inspect}"
64
+ self.class.clients[client_message.player.id] = client
65
+ create_child(client_connection,client,@server,client_message.player.id)
66
+ end
67
+ end
68
+ end
69
+
70
+ game_handler.send_message(
71
+ client_message, :sender => get_self
72
+ )
73
+ rescue Exception => e
74
+ GameMachine.logger.error "#{self.class.name} #{e.to_s}"
75
+ end
76
+
77
+ def create_child(client_connection,client,server,player_id)
78
+ builder = Actor::Builder.new(Endpoints::UdpOutgoing,client_connection,client,server,player_id)
79
+ builder.with_name(player_id).start
80
+ end
81
+
82
+ def destroy_child(player_id)
83
+ Actor::Base.find(player_id).tell(JavaLib::PoisonPill.get_instance)
84
+ GameMachine.logger.info "Player gateway sent poison pill to #{player_id}"
85
+ end
86
+
87
+ # region and cluster connections are for when you have
88
+ # dedicated region servers. If you do not the connection type can be
89
+ # left out by the client and it will default to combined.
90
+ def client_connection_type(connection_type)
91
+ if connection_type.nil?
92
+ 'combined'
93
+ else
94
+ if connection_type == 1
95
+ 'region'
96
+ elsif connection_type == 2
97
+ 'cluster'
98
+ else
99
+ 'combined'
100
+ end
101
+ end
102
+ end
103
+
104
+ def create_client_connection(client_id,connection_type)
105
+ MessageLib::ClientConnection.new.set_id(client_id).
106
+ set_gateway(self.class.name).
107
+ set_server(Application.config.name).
108
+ set_type(client_connection_type(connection_type))
109
+ end
110
+
111
+ end
112
+ end
113
+ end
@@ -0,0 +1,46 @@
1
+ module GameMachine
2
+ module Endpoints
3
+ class UdpOutgoing < Actor::Base
4
+
5
+ attr_reader :client_connection, :client, :server, :player_id
6
+ def post_init(*args)
7
+ @client_connection = args[0]
8
+ @client = args[1]
9
+ @server = args[2]
10
+ @player_id = args[3]
11
+ send_connected_message
12
+ GameMachine.logger.info "Player gateway created #{player_id}"
13
+ end
14
+
15
+ def send_connected_message
16
+ client_message = create_client_message
17
+ client_message.set_player_connected(MessageLib::PlayerConnected.new)
18
+ send_to_client(client_message)
19
+ end
20
+
21
+ def create_client_message
22
+ client_message = MessageLib::ClientMessage.new
23
+ client_message.set_client_connection(client_connection)
24
+ end
25
+
26
+ 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
+
35
+ end
36
+
37
+ def on_receive(message)
38
+ #GameMachine.logger.info "Sending message to player"
39
+ client_message = create_client_message
40
+ message.set_send_to_player(false)
41
+ client_message.add_entity(message)
42
+ send_to_client(client_message)
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,46 @@
1
+ require 'pathname'
2
+ module GameMachine
3
+ class GameLoader
4
+
5
+ class << self
6
+
7
+ def games_root
8
+ File.join(GameMachine.app_root,'/games')
9
+ end
10
+ end
11
+
12
+
13
+ def game_dirs
14
+ Pathname.glob("#{self.class.games_root}/*/")
15
+ end
16
+
17
+ def load_from_dir(dir)
18
+ bootfile = File.join(dir,'boot.rb')
19
+ if File.exists?(bootfile)
20
+ load_game(bootfile)
21
+ GameMachine.logger.info "#{bootfile} loaded"
22
+ GameMachine.stdout "#{bootfile} loaded"
23
+ else
24
+ GameMachine.logger.info "#{bootfile} not found"
25
+ GameMachine.stdout "#{bootfile} not found"
26
+ end
27
+ end
28
+
29
+ def load_all
30
+ return if GameMachine.env == 'test'
31
+ game_dirs.each do |game_dir|
32
+ load_from_dir(game_dir)
33
+ end
34
+ end
35
+
36
+ def start_player_manager
37
+ if klass = Application.config.player_manager
38
+ Actor::Builder.new(klass.constantize).start
39
+ end
40
+ end
41
+
42
+ def load_game(bootfile)
43
+ require bootfile
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,14 @@
1
+
2
+ require_relative 'game_systems/chat_manager'
3
+ require_relative 'game_systems/chat'
4
+ require_relative 'game_systems/chat_topic'
5
+ require_relative 'game_systems/entity_loader'
6
+ require_relative 'game_systems/entity_tracking'
7
+ require_relative 'game_systems/local_echo'
8
+ require_relative 'game_systems/remote_echo'
9
+ require_relative 'game_systems/stress_test'
10
+ require_relative 'game_systems/devnull'
11
+ require_relative 'game_systems/objectdb_proxy'
12
+ require_relative 'game_systems/agents/controller'
13
+ require_relative 'game_systems/region_manager'
14
+ require_relative 'game_systems/region_service'
@@ -0,0 +1,118 @@
1
+ module GameMachine
2
+ module GameSystems
3
+ module Agents
4
+
5
+ class Controller < Actor::Base
6
+
7
+ attr_reader :agent_config, :current_agents, :address, :children
8
+ def post_init(*args)
9
+ @agent_config = args.first
10
+ @agent_config.load!
11
+ @address = local_address
12
+ @current_agents = local_agents
13
+ @children = {}
14
+ create_agents(current_agents)
15
+ schedule_message('agent_tick',100)
16
+ schedule_message('check_config',10000)
17
+ ClusterMonitor.find.tell('register_observer',get_self)
18
+ end
19
+
20
+ def on_receive(message)
21
+
22
+ if message.is_a?(String)
23
+ if message == 'agent_tick'
24
+ @children.each do |name,actor_ref|
25
+ actor_ref.tell('update',get_self)
26
+ end
27
+ elsif message == 'check_config'
28
+ if agent_config.reload?
29
+ agent_config.load!
30
+ update_agents
31
+ end
32
+ elsif message == 'cluster_update'
33
+ update_agents
34
+ end
35
+ end
36
+ end
37
+
38
+ def update_agents
39
+ agents_to_create = {}
40
+ agents_to_destroy = {}
41
+ updated_agents = local_agents
42
+
43
+ # agents no longer under our control
44
+ current_agents.each do |name,klass|
45
+ unless updated_agents.has_key?(name)
46
+ agents_to_destroy[name] = klass
47
+ end
48
+ end
49
+
50
+ # new agents that need creating
51
+ updated_agents.each do |name,klass|
52
+ unless current_agents.has_key?(name)
53
+ agents_to_create[name] = klass
54
+ end
55
+ end
56
+
57
+ @current_agents = updated_agents
58
+ destroy_agents(agents_to_destroy)
59
+ create_agents(agents_to_create)
60
+ end
61
+
62
+ def destroy_agents(agents)
63
+ agents.map {|agent_name,klass| destroy_child(agent_name)}
64
+ end
65
+
66
+ def create_agents(agents)
67
+ agents.map {|agent_name,klass| create_child(agent_name,klass)}
68
+ end
69
+
70
+ def destroy_child(agent_name)
71
+ if @children.has_key?(agent_name)
72
+ tell_child(agent_name,JavaLib::PoisonPill.get_instance)
73
+ @children.delete(agent_name)
74
+ GameMachine.logger.info "Agent #{agent_name} killed"
75
+ else
76
+ GameMachine.logger.info "Agent #{agent_name} not found, unable to kill"
77
+ end
78
+ end
79
+
80
+ def create_child(agent_name,klass_name)
81
+ klass = klass_name.constantize
82
+ name = child_name(agent_name)
83
+ builder = Actor::Builder.new(klass,agent_name)
84
+ child = builder.with_parent(context).with_name(name).start
85
+ @children[agent_name] = Actor::Ref.new(child,klass.name)
86
+ GameMachine.logger.info "Agent #{agent_name} created"
87
+ end
88
+
89
+ def tell_child(agent_name,message)
90
+ name = child_name(agent_name)
91
+ @children[agent_name].tell(message,nil)
92
+ end
93
+
94
+ def child_name(agent_name)
95
+ "agent_#{agent_name}"
96
+ end
97
+
98
+ def local_address
99
+ name = AppConfig.instance.config.name
100
+ Akka.address_for(name)
101
+ end
102
+
103
+ def local_agents
104
+ {}.tap do |agents|
105
+ agent_config.agent_names.each do |name|
106
+ bucket = Akka.instance.hashring.bucket_for(name)
107
+ if bucket == address
108
+ agents[name] = agent_config.klass_for_name(name)
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+ end
115
+
116
+ end
117
+ end
118
+ end