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,16 @@
1
+ module GameMachine
2
+ module GameSystems
3
+ class LocalEcho < Actor::Base
4
+
5
+ # Used in tests to see if actor got the message
6
+ def self.echo(message)
7
+ end
8
+
9
+ def on_receive(message)
10
+ GameMachine.logger.debug("LocalEcho got #{message}")
11
+ self.class.echo(message)
12
+ sender.tell(message,self)
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,61 @@
1
+ module GameMachine
2
+ module GameSystems
3
+ class ObjectDbProxy < Actor::Base
4
+ include GameMachine::Commands
5
+
6
+ aspect %w(ObjectdbGet Player)
7
+
8
+ # Generic way for a client to save state. We scope the id to the
9
+ # player to prevent hacked clients from writing stuff they shouldn't.
10
+
11
+
12
+ def self.save_entity(entity)
13
+ scoped_id = scope_entity_id(entity.id,entity.player.id)
14
+ entity.set_id(scoped_id)
15
+ entity.set_save(false)
16
+ ref = ObjectDb.find_distributed(entity.get_id)
17
+ ref.tell(MessageLib::ObjectdbPut.new.set_entity(entity))
18
+ entity
19
+ end
20
+
21
+ def self.scope_entity_id(entity_id,player_id)
22
+ "#{player_id}_#{entity_id}"
23
+ end
24
+
25
+ def self.unscope_entity_id(entity_id,player_id)
26
+ unscoped_id = entity_id.sub("#{player_id}_",'')
27
+ end
28
+
29
+ def on_receive(message)
30
+ if message.is_a?(MessageLib::Entity)
31
+ if message.has_objectdb_get
32
+ objectdb_get = message.get_objectdb_get
33
+ entity_id = objectdb_get.get_entity_id
34
+ player_id = objectdb_get.get_player_id
35
+
36
+ response = MessageLib::ObjectdbGetResponse.new
37
+
38
+ # Make request with scoped id
39
+ scoped_id = self.class.scope_entity_id(entity_id,player_id)
40
+ if entity = commands.datastore.get(scoped_id)
41
+
42
+ # Unscope the entity id
43
+ unscoped_id = self.class.unscope_entity_id(entity.id,player_id)
44
+ entity.set_id(unscoped_id)
45
+
46
+ response.set_entity_found(true)
47
+ else
48
+ entity = MessageLib::Entity.new.set_id(entity_id)
49
+ response.set_entity_found(false)
50
+ end
51
+
52
+
53
+ entity.set_objectdb_get_response(response)
54
+ commands.player.send_message(entity,player_id)
55
+ end
56
+ end
57
+ end
58
+
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,20 @@
1
+ module GameMachine
2
+ module GameSystems
3
+ class PrivateChat < Actor::Base
4
+
5
+ def preStart
6
+ message = Subscribe.new.set_topic('private')
7
+ MessageQueuel.find.tell(message,Actor::Ref.new(get_self))
8
+ end
9
+
10
+ def on_receive(message)
11
+ if message.is_a?(ChatMessage)
12
+ send_message(message)
13
+ elsif message.is_a?(JavaLib::DistributedPubSubMediator::SubscribeAck)
14
+ else
15
+ unhandled(message)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,91 @@
1
+ require_relative 'region_settings'
2
+ module GameMachine
3
+ module GameSystems
4
+ class RegionManager < Actor::Base
5
+ include GameMachine::Commands
6
+ include GameMachine::Models
7
+
8
+ attr_reader :regions, :servers
9
+ def post_init(*args)
10
+ @regions = {}
11
+ @servers = {}
12
+ load_from_config
13
+ schedule_message('check_regions',2,:seconds)
14
+ end
15
+
16
+ def check_regions
17
+ unassign_down_servers
18
+ assign_servers
19
+ notify_managers
20
+ end
21
+
22
+ def notify_managers
23
+ regions.each do |name,region|
24
+ if region.manager && region.server
25
+ region.manager.constantize.find_by_address(region.server).tell(region)
26
+ end
27
+ end
28
+ end
29
+
30
+ def load_from_config
31
+ RegionSettings.regions.each do |name,manager|
32
+ unless region = Region.find!(name)
33
+ region = Region.new(
34
+ :id => name,
35
+ :name => name,
36
+ :manager => manager
37
+ )
38
+ region.save!
39
+ end
40
+ regions[name] = region
41
+ if region.server
42
+ servers[region.server] = name
43
+ end
44
+ end
45
+ end
46
+
47
+ def unassign_down_servers
48
+ regions.each do |name,region|
49
+ if region.server
50
+ unless ClusterMonitor.cluster_members.has_key?(region.server)
51
+ GameMachine.logger.warn "Node #{region.server} no longer in cluster, region #{region.name} dissasociated"
52
+ servers.delete(region.server)
53
+ region.server = nil
54
+ region.save!
55
+ end
56
+ end
57
+ end
58
+ end
59
+
60
+ def assign_servers
61
+ regions.each do |name,region|
62
+ if region.server.nil?
63
+ ClusterMonitor.cluster_members.keys.each do |address|
64
+ unless servers.has_key?(address)
65
+ region.server = address
66
+ servers[address] = name
67
+ region.save!
68
+ GameMachine.logger.warn "Region #{region.name} assigned to #{region.server}"
69
+ break
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
75
+
76
+ def on_receive(message)
77
+ if message.is_a?(String)
78
+ if message == 'check_regions'
79
+ check_regions
80
+ else
81
+ regions_msg = MessageLib::Regions.new.set_regions(regions_string)
82
+ entity = MessageLib::Entity.new.set_id(message.player.id).set_regions(regions_msg)
83
+ commands.player.send_message(entity,message.player.id)
84
+ #GameMachine.logger.info "#{self.class.name} sent regions to #{message.player.id}"
85
+ end
86
+ end
87
+ end
88
+
89
+ end
90
+ end
91
+ end
@@ -0,0 +1,94 @@
1
+ module GameMachine
2
+ module GameSystems
3
+ class RegionService < Actor::Base
4
+ include GameMachine::Commands
5
+ include GameMachine::Models
6
+
7
+ attr_reader :regions
8
+
9
+
10
+ def self.regions
11
+ if @regions
12
+ @regions
13
+ else
14
+ @regions = java.util.concurrent.ConcurrentHashMap.new
15
+ end
16
+ end
17
+
18
+ def self.address
19
+ @address
20
+ end
21
+
22
+ def self.address=(address)
23
+ @address = address
24
+ end
25
+
26
+ def self.region
27
+ @region
28
+ end
29
+
30
+ def self.region=(region)
31
+ @region = region
32
+ end
33
+
34
+ def post_init(*args)
35
+ cluster = JavaLib::Cluster.get(getContext.system)
36
+ self.class.address = cluster.self_address.to_string
37
+ load_from_config
38
+ update_regions
39
+ schedule_message('update_regions',10,:seconds)
40
+ end
41
+
42
+ def update_regions
43
+ self.class.regions.keys.each do |name|
44
+ if region = Region.find!(name)
45
+ self.class.regions[name] = region
46
+ if region.server == self.class.address
47
+ self.class.region = name
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ def load_from_config
54
+ RegionSettings.regions.each do |name,manager|
55
+
56
+ # Make sure we set some value here, it will get updated with a valid
57
+ # region in update_regions
58
+ if region = Region.find!(name)
59
+ self.class.regions[name] = region
60
+ else
61
+ self.class.regions[name] = false
62
+ end
63
+ end
64
+ end
65
+
66
+ def server_hostname(server)
67
+ server.sub('akka.tcp://cluster@','').split(':').first
68
+ end
69
+
70
+ def regions_string
71
+ self.class.regions.select{|name,region| region && !region.server.nil?}.map do |name,region|
72
+ "#{region.name}=#{server_hostname(region.server)}"
73
+ end.join('|')
74
+ end
75
+
76
+ def on_receive(message)
77
+ if message.is_a?(String)
78
+ if message == 'update_regions'
79
+ update_regions
80
+ end
81
+ elsif message.is_a?(MessageLib::Entity)
82
+ # TODO fix this, leaving for now until we figure out how complex this needs
83
+ # to be
84
+ if message.id == 'regions'
85
+ regions_msg = MessageLib::Regions.new.set_regions(regions_string)
86
+ entity = MessageLib::Entity.new.set_id(message.player.id).set_regions(regions_msg)
87
+ commands.player.send_message(entity,message.player.id)
88
+ end
89
+ end
90
+
91
+ end
92
+ end
93
+ end
94
+ end
@@ -0,0 +1,13 @@
1
+ require 'settingslogic'
2
+
3
+ module GameMachine
4
+ module GameSystems
5
+ class RegionSettings < Settingslogic
6
+ source File.expand_path(
7
+ ENV['CONFIG_FILE'] || File.join(ENV['APP_ROOT'], "config/regions.yml")
8
+ )
9
+ namespace ENV['GAME_ENV']
10
+
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,14 @@
1
+ module GameMachine
2
+ module GameSystems
3
+ class RemoteEcho < Actor::Base
4
+ include GameMachine::Commands
5
+ aspect %w(EchoTest)
6
+
7
+ def on_receive(message)
8
+ #GameMachine.logger.info "#{self.class.name} #{message}"
9
+ commands.player.send_message(message,message.player.id)
10
+ end
11
+ end
12
+ end
13
+ end
14
+
@@ -0,0 +1,21 @@
1
+ module GameMachine
2
+ module GameSystems
3
+ class StressTest < Actor::Base
4
+ include GameMachine::Commands
5
+
6
+ attr_reader :grid
7
+ def post_init(*args)
8
+ @grid = Grid.default_grid
9
+ end
10
+
11
+ def on_receive(message)
12
+ #GameMachine.logger.info "#{self.class.name} #{message}"
13
+ commands.player.send_message(message,message.player.id)
14
+
15
+ grid.set(message.player.id,2.0,1.0,'all')
16
+ grid.neighbors(1.0,4.0,'all')
17
+ end
18
+ end
19
+ end
20
+ end
21
+
@@ -0,0 +1,60 @@
1
+ module GameMachine
2
+ class Grid
3
+
4
+ class << self
5
+
6
+ def config
7
+ if @config
8
+ return @config
9
+ else
10
+ @config = java.util.concurrent.ConcurrentHashMap.new
11
+ end
12
+ end
13
+
14
+ def update_frequency_for(name)
15
+ config.fetch(name)[:update_frequency]
16
+ end
17
+
18
+ def load_from_config
19
+ Application.config.grids.each do |name,value|
20
+ grid_size,cell_size,update_frequency = value.split(',')
21
+ config[name] = {
22
+ :grid_size => grid_size.to_i,
23
+ :cell_size => cell_size.to_i,
24
+ :update_frequency => update_frequency.to_i
25
+ }
26
+ find_or_create(name)
27
+ end
28
+ end
29
+
30
+ 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
40
+ end
41
+
42
+ def default_grid
43
+ find_or_create('default')
44
+ end
45
+
46
+ 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),
51
+ grid_config.fetch(:cell_size))
52
+ grids.put(name,grid)
53
+ end
54
+
55
+ grids.fetch(name)
56
+ end
57
+ end
58
+
59
+ end
60
+ end
@@ -0,0 +1,31 @@
1
+ module GameMachine
2
+ class GridReplicator < Actor::Base
3
+
4
+ def post_init(*args)
5
+ @paths = {}
6
+ #schedule_update(80)
7
+ end
8
+
9
+ def on_receive(message)
10
+ if message.is_a?(String)
11
+ delta = Grid.default_grid.current_delta
12
+ return if delta.length == 0
13
+ GameMachine::ClusterMonitor.remote_members.keys.each do |address|
14
+ @paths[address] ||= "#{address}#{self.class.local_path(self.class.name)}"
15
+ Actor::Ref.new(@paths[address],self.class.name).tell(delta)
16
+ end
17
+ else
18
+ Grid.default_grid.update_from_delta(message)
19
+ end
20
+
21
+ end
22
+
23
+ def schedule_update(update_interval)
24
+ duration = GameMachine::JavaLib::Duration.create(update_interval, java.util.concurrent.TimeUnit::MILLISECONDS)
25
+ scheduler = get_context.system.scheduler
26
+ dispatcher = get_context.system.dispatcher
27
+ scheduler.schedule(duration, duration, get_self, "replicate_grid", dispatcher, nil)
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,55 @@
1
+
2
+ module GameMachine
3
+ module Handlers
4
+ class Authentication
5
+ AUTHTOKEN = 'authorized'
6
+ AUTHENTICATED_USERS = java.util.concurrent.ConcurrentHashMap.new
7
+
8
+ def self.authenticated?(player)
9
+ if authtoken = AUTHENTICATED_USERS.fetch(player.id,nil)
10
+ return player.authtoken == authtoken
11
+ end
12
+ false
13
+ end
14
+
15
+ def self.unregister_player(player_id)
16
+ AUTHENTICATED_USERS.delete(player_id)
17
+ end
18
+
19
+ def register_player(player_id)
20
+ AUTHENTICATED_USERS[player_id] =
21
+ authtoken_for_player(player_id)
22
+
23
+ end
24
+
25
+ def authtoken_for_player(player_id)
26
+ Application.auth_handler.authtoken_for(player_id)
27
+ end
28
+
29
+ def valid_authtoken?(player)
30
+ return true if public?
31
+ player.authtoken == authtoken_for_player(player.id)
32
+ end
33
+
34
+ def public?
35
+ Application.config.auth_handler == 'GameMachine::AuthHandlers::Public'
36
+ end
37
+
38
+ def authenticate!(player)
39
+ if public?
40
+ AUTHENTICATED_USERS[player.id] = player.authtoken
41
+ return true
42
+ end
43
+ @player = player
44
+ if valid_authtoken?(player)
45
+ register_player(player.id)
46
+ player.set_authenticated(true)
47
+ else
48
+ false
49
+ end
50
+ end
51
+
52
+ end
53
+
54
+ end
55
+ end