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,35 @@
1
+ module GameMachine
2
+ module Actor
3
+
4
+ class Factory
5
+ include JavaLib::IActorFactory
6
+
7
+ def initialize(klass,args)
8
+ @klass = klass
9
+ @args = args
10
+ end
11
+
12
+ def create
13
+ if @klass.respond_to?(:reload_on_change?)
14
+ if @klass.reload_on_change?
15
+ GameMachine.logger.info "Checking if #{@klass.name} should be reloaded"
16
+ GameMachine::Actor::Reloadable.reload_if_changed(@klass.name)
17
+ @klass = @klass.name.constantize
18
+ end
19
+ end
20
+ actor = @klass.new
21
+ if actor.respond_to?(:initialize_states)
22
+ actor.initialize_states
23
+ end
24
+ if actor.respond_to?(:post_init)
25
+ actor.post_init(*@args)
26
+ end
27
+ actor
28
+ end
29
+
30
+ def self.create
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,89 @@
1
+ require 'base64'
2
+ module GameMachine
3
+ module Actor
4
+ class MonoActor < Base
5
+
6
+ def self.images
7
+ @@images ||= java.util.concurrent.ConcurrentHashMap.new
8
+ end
9
+
10
+ def self.call_mono(message,image,domain,namespace,klass)
11
+ thread_id = JRuby.reference(Thread.current).native_thread.id
12
+ #Mono.attach_current_thread(domain)
13
+ bytes = message.to_byte_array
14
+ byte_string = bytes.to_s
15
+ encoded_bytes = Base64.encode64(byte_string)
16
+ encoded_bytes_size = encoded_bytes.size
17
+ actor_id = thread_id.to_s
18
+ if actor_id == '' or actor_id.nil?
19
+ puts "actor_id invalid #{actor_id}"
20
+ return
21
+ end
22
+
23
+ ns_mem_buf = FFI::MemoryPointer.new(:string, namespace.size)
24
+ ns_mem_buf.put_string(0, namespace)
25
+ klass_mem_buf = FFI::MemoryPointer.new(:string, klass.size)
26
+ klass_mem_buf.put_string(0, klass)
27
+ bytes_mem_buf = FFI::MemoryPointer.new(:string, encoded_bytes_size)
28
+ bytes_mem_buf.put_string(0, encoded_bytes)
29
+ mem_buf = FFI::MemoryPointer.new(:string, actor_id.size)
30
+ mem_buf.put_string(0, actor_id)
31
+
32
+ #puts "ENCODED #{encoded_bytes} = #{encoded_bytes_size}"
33
+ #res = Mono.ftest(@namespace,@klass,actor_id, encoded_bytes, encoded_bytes_size)
34
+ #puts 'before_on_receive'
35
+ res = Mono.on_receive2(domain,image,ns_mem_buf,klass_mem_buf,mem_buf, bytes_mem_buf, encoded_bytes_size)
36
+ #puts 'after_on_receive'
37
+ #res = Mono.on_receive(@mono_object,bytes.to_s,bytes.size)
38
+ if res == 0
39
+ raise "Mono managed code threw exception, restarting actor"
40
+ end
41
+ end
42
+
43
+ def post_init(*args)
44
+ @path = args[0]
45
+ @namespace = args[1]
46
+ @klass = args[2]
47
+ @domain = args[3]
48
+ @image = args[4]
49
+ end
50
+
51
+ def create_mono_object
52
+ @thread_id = JRuby.reference(Thread.current).native_thread.id
53
+ if @path.nil? or @namespace.nil? or @klass.nil?
54
+ raise "Missing post_init args"
55
+ end
56
+ Mono.attach_current_thread(@domain)
57
+ @image = Mono.load_assembly(@domain,@path)
58
+ #@mono_object = Mono.create_object(image,namespace,klass)
59
+ #if @mono_object == 0
60
+ # raise "Mono.create_object failed"
61
+ #end
62
+ end
63
+
64
+ def ensure_image
65
+ thread_id = JRuby.reference(Thread.current).native_thread.id
66
+ image = self.class.images.fetch(thread_id,nil)
67
+ if image.nil?
68
+ Mono.attach_current_thread(@domain)
69
+ image = Mono.load_assembly(@domain,@path)
70
+ self.class.images[thread_id] = image
71
+ end
72
+ image
73
+ end
74
+
75
+ def postStop
76
+ puts 'postStop'
77
+ #Mono.destroy_object(@mono_object)
78
+ end
79
+
80
+ def on_receive(message)
81
+ Mono.attach_current_thread(@domain)
82
+
83
+ self.class.call_mono(message,@image,@domain,@namespace,@klass)
84
+ sender.tell(message,self)
85
+ end
86
+
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,81 @@
1
+ module GameMachine
2
+ module Actor
3
+
4
+ class Ref
5
+
6
+ def initialize(path_or_actor_ref,metric_name=nil)
7
+ @path_or_actor_ref = path_or_actor_ref
8
+ @metric_name = metric_name
9
+ end
10
+
11
+ def send_message(message,options={})
12
+ options = default_options.merge(options)
13
+ sender = sender_for(options[:sender])
14
+
15
+ if options[:blocking]
16
+ ask(message,options[:timeout])
17
+ else
18
+ tell(message,sender)
19
+ true
20
+ end
21
+ end
22
+
23
+ def actor
24
+ @actor ||= @path_or_actor_ref.is_a?(JavaLib::ActorRef) ? @path_or_actor_ref : actor_selection
25
+ end
26
+
27
+ def path
28
+ @path_or_actor_ref.is_a?(String) ? @path_or_actor_ref : nil
29
+ end
30
+
31
+ def tell(message,sender=nil)
32
+ message = convert_if_model(message)
33
+ actor.tell(message,sender_for(sender))
34
+ true
35
+ end
36
+
37
+ def ask(message,timeout)
38
+ message = convert_if_model(message)
39
+ duration = duration_in_ms(timeout)
40
+ t = JavaLib::Timeout.new(duration)
41
+ if actor.is_a?(JavaLib::ActorSelection)
42
+ sel = JavaLib::AskableActorSelection.new(actor)
43
+ future = sel.ask(message,t)
44
+ else
45
+ future = JavaLib::Patterns::ask(actor,message,t)
46
+ end
47
+ JavaLib::Await.result(future, duration)
48
+ rescue Java::JavaUtilConcurrent::TimeoutException => e
49
+ GameMachine.logger.debug("TimeoutException caught in ask (timeout = #{timeout})")
50
+ false
51
+ end
52
+
53
+ private
54
+
55
+ def convert_if_model(message)
56
+ if message.is_a?(GameMachine::Model)
57
+ message.to_entity
58
+ else
59
+ message
60
+ end
61
+ end
62
+
63
+ def duration_in_ms(ms)
64
+ JavaLib::Duration.create(ms, java.util.concurrent.TimeUnit::MILLISECONDS)
65
+ end
66
+
67
+ def sender_for(sender)
68
+ @sender_for ||= sender.is_a?(Actor::Base) ? sender.get_self : sender
69
+ end
70
+
71
+ def default_options
72
+ {:sender => nil, :timeout => 100, :blocking => false}
73
+ end
74
+
75
+ def actor_selection
76
+ Akka.instance.actor_system.actor_selection(@path_or_actor_ref)
77
+ end
78
+
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,98 @@
1
+ require 'set'
2
+ module GameMachine
3
+ module Actor
4
+ class Reloadable
5
+
6
+ class << self
7
+
8
+ def paths
9
+ if @paths
10
+ @paths
11
+ else
12
+ @paths = java.util.concurrent.ConcurrentHashMap.new
13
+ end
14
+ end
15
+
16
+ def registered_actors
17
+ if @registered_actors
18
+ @registered_actors
19
+ else
20
+ @registered_actors = java.util.concurrent.ConcurrentHashMap.new
21
+ end
22
+ end
23
+
24
+ def register(name)
25
+ registered_actors[File.basename(name.underscore)] = name
26
+ end
27
+
28
+ def reload_actor(basename)
29
+ if klassname = registered_actors.fetch(basename,nil)
30
+ Base.find(klassname).tell('reload_because_changed')
31
+ end
32
+ end
33
+
34
+ def update_paths(first_run=false)
35
+ Dir.glob(File.join(GameLoader.games_root,'**','*.rb')).each do |file|
36
+ mtime = File.mtime(file)
37
+ basename = File.basename(file,'.rb')
38
+
39
+ # existing file
40
+ if fileinfo = paths.fetch(basename,nil)
41
+ if mtime != fileinfo[:mtime]
42
+ fileinfo[:changed] = true
43
+ fileinfo[:mtime] = mtime
44
+ GameMachine.logger.info "Game actor #{basename} changed"
45
+ reload_actor(basename)
46
+ end
47
+
48
+ # new file
49
+ else
50
+ File.open(file,'rb') do |f|
51
+ str = f.read
52
+ if str.match(/Actor\:\:Development/)
53
+ fileinfo = {:changed => true, :file => file, :mtime => mtime}
54
+ if first_run
55
+ fileinfo[:changed] = false
56
+ end
57
+ GameMachine.logger.info "Game actor #{basename} added to watch list changed=#{fileinfo[:changed]}"
58
+ paths[basename] = fileinfo
59
+ end
60
+ end
61
+ end
62
+
63
+ end
64
+ end
65
+
66
+ def actor_changed?(name)
67
+ path = File.basename(name.underscore)
68
+ if fileinfo = paths.fetch(path,nil)
69
+ if fileinfo[:changed]
70
+ return true
71
+ end
72
+ end
73
+ false
74
+ end
75
+
76
+ def reload_if_changed(name)
77
+ filename = File.basename(name.underscore)
78
+ if fileinfo = paths.fetch(filename,nil)
79
+ if fileinfo[:changed]
80
+ GameMachine.logger.info "Reloading #{name} (#{fileinfo[:file]})"
81
+ path = fileinfo[:file]
82
+ klassname = name.split('::').last
83
+ module_name = name.sub("::#{klassname}",'')
84
+ module_name.constantize.send(:remove_const,klassname.to_sym)
85
+ load "#{path}"
86
+ fileinfo[:changed] = false
87
+ else
88
+ GameMachine.logger.info "Not reloading #{name} as it has not changed"
89
+ end
90
+ else
91
+ GameMachine.logger.info "#{filename} not found in watch list"
92
+ end
93
+ end
94
+
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,32 @@
1
+ module GameMachine
2
+ module Actor
3
+
4
+ class System
5
+
6
+ attr_reader :name, :actor_system
7
+ def initialize(name,config_str)
8
+ @config_str = config_str
9
+ @name = name
10
+ end
11
+
12
+ def address
13
+ actor_system.to_string
14
+ end
15
+
16
+ def config
17
+ @config ||= JavaLib::ConfigFactory.parseString(@config_str).
18
+ getConfig(name).withFallback(JavaLib::ConfigFactory.load)
19
+ end
20
+
21
+ def create!
22
+ @actor_system ||= JavaLib::ActorSystem.create(name, config)
23
+ end
24
+
25
+ def shutdown!
26
+ actor_system.shutdown
27
+ actor_system.await_termination
28
+ end
29
+
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,98 @@
1
+ require 'singleton'
2
+ module GameMachine
3
+ class Akka
4
+ include Singleton
5
+ extend Forwardable
6
+
7
+ attr_reader :hashring, :address, :app_config
8
+
9
+ def self.address_for(server)
10
+ host = AppConfig.instance.server_config(server).akka_host
11
+ port = AppConfig.instance.server_config(server).akka_port
12
+ "akka.tcp://#{Akka.instance.config_name}@#{host}:#{port}"
13
+ end
14
+
15
+ def initialize!
16
+ @app_config = AppConfig.instance
17
+ @address = self.class.address_for(app_config.config.name)
18
+ @hashring = Hashring.new([@address])
19
+ end
20
+
21
+ def init_cluster!(address)
22
+ @address = address
23
+ @hashring = Hashring.new([address])
24
+ end
25
+
26
+ def cluster?
27
+ app_config.config.cluster ? true : false
28
+ end
29
+
30
+ def actor_system
31
+ @actor_system.actor_system
32
+ end
33
+
34
+ def config_name
35
+ cluster? ? 'cluster' : 'standalone'
36
+ end
37
+
38
+ def akka_config
39
+ cluster? ? akka_cluster_config : akka_server_config
40
+ end
41
+
42
+ def start
43
+ @actor_system = Actor::System.new(config_name,akka_config)
44
+ @actor_system.create!
45
+ JavaLib::GameMachineLoader.new.run(actor_system,Application.config.game_handler)
46
+ #start_camel_extension
47
+ end
48
+
49
+ def stop
50
+ @actor_system.shutdown!
51
+ Actor::Base.reset_hashrings
52
+ end
53
+
54
+ private
55
+
56
+ def set_address(config)
57
+ config.sub!('HOST',app_config.config.akka_host)
58
+ config.sub!('PORT',app_config.config.akka_port.to_s)
59
+ config
60
+ end
61
+
62
+ def set_seeds(config)
63
+ seeds = Application.config.seeds.map do |seed|
64
+ seed_host = app_config.server_config(seed).akka_host
65
+ seed_port = app_config.server_config(seed).akka_port
66
+ "\"akka.tcp://cluster@#{seed_host}:#{seed_port}\""
67
+ end
68
+ config.sub!('SEEDS',seeds.join(','))
69
+ config
70
+ end
71
+
72
+ def akka_cluster_config
73
+ config = load_akka_config('cluster')
74
+ config = set_address(config)
75
+ config = set_seeds(config)
76
+ end
77
+
78
+ def akka_server_config
79
+ config = load_akka_config('standalone')
80
+ config = set_address(config)
81
+ end
82
+
83
+ def load_akka_config(name)
84
+ File.read(File.expand_path(File.join(
85
+ GameMachine.app_root,"config/#{name}.conf")
86
+ )
87
+ )
88
+ end
89
+
90
+ def start_camel_extension
91
+ if app_config.config.http_enabled
92
+ camel = JavaLib::CamelExtension.get(Akka.instance.actor_system)
93
+ camel_context = camel.context
94
+ end
95
+ end
96
+
97
+ end
98
+ end
@@ -0,0 +1,49 @@
1
+ require 'singleton'
2
+ require_relative 'settings'
3
+ module GameMachine
4
+ class AppConfig
5
+ include Singleton
6
+
7
+ attr_reader :config
8
+
9
+ def initialize
10
+ @config = OpenStruct.new
11
+ end
12
+
13
+ def reload
14
+ @config = OpenStruct.new
15
+ load_config
16
+ end
17
+
18
+ def server_config(server)
19
+ Settings.servers.send(server)
20
+ end
21
+
22
+ def set_defaults
23
+ unless config.request_handler_routers
24
+ config.request_handler_routers = 10
25
+ end
26
+ unless config.game_handler_routers
27
+ config.game_handler_routers = 10
28
+ end
29
+ unless config.udp_routers
30
+ config.udp_routers = 10
31
+ end
32
+ end
33
+
34
+ def load_config(name)
35
+ config.name = name
36
+ set_defaults
37
+ load_settings(name)
38
+ end
39
+
40
+ private
41
+
42
+ def load_settings(name)
43
+ Settings.servers.send(name).each do |key,value|
44
+ config.send("#{key}=",value)
45
+ end
46
+ end
47
+
48
+ end
49
+ end