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,120 @@
1
+ require 'optparse'
2
+ module GameMachine
3
+ module Console
4
+ class Server
5
+
6
+ attr_reader :options
7
+ def initialize(argv)
8
+ @options = parse_arguments(argv)
9
+ end
10
+
11
+ def check_start_dir
12
+ java_dir = File.join(File.expand_path(Dir.pwd),'java')
13
+ unless File.directory?(java_dir)
14
+ puts "Please run game_machine from your game directory"
15
+ exit 0
16
+ end
17
+ end
18
+
19
+ def set_environment
20
+ ENV['GAME_ENV'] = options[:environment]
21
+ if options[:config]
22
+ ENV['CONFIG_FILE'] = options[:config]
23
+ end
24
+ end
25
+
26
+
27
+ def self.exit!
28
+ clear_restart_file
29
+ System.exit(0)
30
+ end
31
+
32
+ def self.ensure_tmp
33
+ tmp_path = File.join(ENV['APP_ROOT'],'tmp')
34
+ FileUtils.mkdir_p tmp_path
35
+ end
36
+
37
+ def self.restart?
38
+ File.exists?(restart_file)
39
+ end
40
+
41
+ def self.restart!
42
+ FileUtils.touch restart_file
43
+ end
44
+
45
+ def self.clear_restart_file
46
+ if File.exists?(restart_file)
47
+ FileUtils.rm(restart_file)
48
+ end
49
+ end
50
+
51
+ def self.restart_file
52
+ File.join(ENV['APP_ROOT'],'tmp','gm_restart.txt')
53
+ end
54
+
55
+ def self.run_in_loop
56
+ ensure_tmp
57
+ clear_restart_file
58
+
59
+ build_cmd = "jruby bin/game_machine build"
60
+ run_cmd = "jruby bin/game_machine s -r"
61
+ loop do
62
+ system(build_cmd)
63
+ system(run_cmd)
64
+ end
65
+ end
66
+
67
+ def run!
68
+ check_start_dir
69
+
70
+ GameMachine.logger.info "Starting with options = #{options.inspect}"
71
+ GameMachine::Application.initialize!(options[:server],true)
72
+ GameMachine::Application.start
73
+ end
74
+
75
+ def load_server_from_file
76
+ path = File.join(File.expand_path(Dir.pwd),'servername.txt')
77
+ if File.exists?(path)
78
+ return File.read(path).chomp
79
+ else
80
+ nil
81
+ end
82
+ end
83
+
84
+ def parse_arguments(arguments)
85
+ options = {}
86
+
87
+ OptionParser.new do |opt|
88
+ opt.banner = "Usage: game_machine server [options]"
89
+ opt.on('-r', '--restartable', 'If tmp/gm_restart.txt should trigger a restart') { |v| options[:restartable] = v }
90
+ opt.on('-s', '--server=name', String, 'Server name') { |v| options[:server] = v.strip }
91
+ opt.on('-c', '--config=name', String, 'Configuration file') { |v| options[:config] = v.strip }
92
+ opt.on("-e", "--environment=name", String,
93
+ "Specifies the environment to run under (development/production).",
94
+ "Default: development") { |v| options[:environment] = v.strip }
95
+ opt.parse!(arguments)
96
+ end
97
+
98
+ if options.has_key?(:restartable)
99
+ ENV['RESTARTABLE'] = 'true'
100
+ end
101
+
102
+ unless options.has_key?(:environment)
103
+ options[:environment] = 'development'
104
+ end
105
+
106
+ unless options.has_key?(:server)
107
+ options[:server] = 'default'
108
+ end
109
+
110
+ if server = load_server_from_file
111
+ options[:server] = server
112
+ puts "server name #{server} set from servername.txt"
113
+ end
114
+
115
+ options
116
+ end
117
+
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,52 @@
1
+ require 'forwardable'
2
+ require_relative 'data_stores/memory'
3
+ require_relative 'data_stores/couchbase'
4
+ require_relative 'data_stores/mapdb'
5
+ require_relative 'data_stores/redis'
6
+
7
+ module GameMachine
8
+ class DataStore
9
+ include Singleton
10
+ extend Forwardable
11
+
12
+ def_delegators :@store, :get, :set, :delete, :delete_all, :shutdown, :keys, :dump, :load
13
+
14
+ attr_reader :store
15
+ def initialize
16
+ @store_name = Application.config.data_store
17
+ connect
18
+ end
19
+
20
+ def set_store(store_name)
21
+ @store = nil
22
+ @store_name = store_name
23
+ connect
24
+ end
25
+
26
+ private
27
+
28
+ def connect
29
+ raise "already connected" if @store
30
+ send("connect_#{@store_name}")
31
+ end
32
+
33
+ def connect_couchbase
34
+ @store = DataStores::Couchbase.new
35
+ @store.connect
36
+ end
37
+
38
+ def connect_mapdb
39
+ @store = DataStores::Mapdb.new
40
+ @store.connect
41
+ end
42
+
43
+ def connect_redis
44
+ @store = DataStores::Redis.new
45
+ @store.connect
46
+ end
47
+
48
+ def connect_memory
49
+ @store = DataStores::Memory.new
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,18 @@
1
+ require 'forwardable'
2
+ module GameMachine
3
+ module DataStores
4
+ class Couchbase
5
+ extend Forwardable
6
+
7
+ def_delegators :@client, :get, :set, :delete, :shutdown
8
+
9
+ def connect
10
+ @client ||= JavaLib::CouchbaseClient.new(servers, 'default'.to_java_string, ''.to_java_string)
11
+ end
12
+
13
+ def servers
14
+ Application.config.couchbase_servers.map {|server| java.net.URI.new(server)}
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,49 @@
1
+ require 'forwardable'
2
+
3
+ module GameMachine
4
+ module DataStores
5
+ include_package 'org.mapdb'
6
+ class Mapdb
7
+ extend Forwardable
8
+
9
+ def_delegators :@client, :get
10
+
11
+ def shutdown
12
+ @client.close
13
+ end
14
+
15
+ def keys
16
+ @client.keys
17
+ end
18
+
19
+ def dump(path,format=:yaml)
20
+ raise NotImplementedError
21
+ end
22
+
23
+ def load(path,format=:yaml)
24
+ raise NotImplementedError
25
+ end
26
+
27
+ def set(key,value)
28
+ @client.put(key,value)
29
+ @db.commit
30
+ end
31
+
32
+ def dbfile
33
+ File.join(GameMachine.app_root,'db','mapdb.db')
34
+ end
35
+
36
+ def connect
37
+ unless @client
38
+ @db = DataStores::DBMaker.newFileDB(java.io.File.new(dbfile)).
39
+ closeOnJvmShutdown.
40
+ make
41
+ @client = @db.getTreeMap("entities")
42
+ end
43
+ @client
44
+ end
45
+
46
+ end
47
+ end
48
+ end
49
+
@@ -0,0 +1,35 @@
1
+ module GameMachine
2
+ module DataStores
3
+ class Memory
4
+
5
+ def initialize
6
+ @data = {}
7
+ end
8
+
9
+ def set(key,value)
10
+ @data[key] = value
11
+ end
12
+
13
+ def get(key)
14
+ @data.fetch(key,nil)
15
+ end
16
+
17
+ def delete(key)
18
+ @data.delete(key)
19
+ end
20
+
21
+ def delete_all
22
+ @data = {}
23
+ end
24
+
25
+ def shutdown
26
+ end
27
+
28
+ private
29
+
30
+ def connect
31
+ end
32
+
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,46 @@
1
+ require 'forwardable'
2
+ module GameMachine
3
+ module DataStores
4
+ class Redis
5
+ extend Forwardable
6
+
7
+ def connect
8
+ @pool = RedisLib::JedisPool.new(RedisLib::JedisPoolConfig.new, "localhost");
9
+ end
10
+
11
+ def delete(key)
12
+ query(:del,key)
13
+ end
14
+
15
+ def get(key)
16
+ query(:get,key)
17
+ end
18
+
19
+ def set(key,value)
20
+ query(:set,key, value)
21
+ end
22
+
23
+ def query(command,key,value=nil)
24
+ jedis = @pool.get_resource
25
+ case command
26
+ when :get
27
+ jedis.get(key)
28
+ when :set
29
+ res = jedis.set(key,value)
30
+ res == 'OK' ? true : false
31
+ when :del
32
+ res = jedis.del(key)
33
+ res == 1 ? true : false
34
+ end
35
+ rescue RedisLib::JedisConnectionException => e
36
+ @pool.return_broken_resource(jedis)
37
+ ensure
38
+ @pool.return_resource(jedis)
39
+ end
40
+
41
+ def shutdown
42
+ @pool.destroy
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,6 @@
1
+ require_relative 'endpoints/tcp_handler'
2
+ require_relative 'endpoints/udp'
3
+ require_relative 'endpoints/tcp'
4
+ require_relative 'endpoints/mono_gateway'
5
+ require_relative 'endpoints/udp_incoming'
6
+ require_relative 'endpoints/udp_outgoing'
@@ -0,0 +1,87 @@
1
+ module GameMachine
2
+ module Endpoints
3
+ class MonoGateway < Actor::Base
4
+
5
+ def post_init(*args)
6
+ @clients = {}
7
+ @sender = nil
8
+ @socket = nil
9
+ @mono_connected = false
10
+ @last_mono_ping = nil
11
+ end
12
+
13
+ def preStart
14
+ mgr = JavaLib::Udp.get(getContext.system).getManager
15
+ inet = JavaLib::InetSocketAddress.new(
16
+ Application.config.mono_gateway_host,
17
+ Application.config.mono_gateway_port
18
+ )
19
+ mgr.tell( JavaLib::UdpMessage.bind(getSelf,inet), getSelf)
20
+ end
21
+
22
+ def on_receive(message)
23
+ if message.kind_of?(JavaLib::Udp::Bound)
24
+ @socket = getSender
25
+ elsif message.is_a?(MessageLib::Entity)
26
+ handle_outgoing(message)
27
+ elsif message.kind_of?(JavaLib::Udp::Received)
28
+ handle_incoming(message)
29
+ elsif message == JavaLib::UdpMessage::unbind
30
+ @socket.tell(message, get_self)
31
+ elsif message.kind_of?(JavaLib::Udp::Unbound)
32
+ get_context.stop(get_self)
33
+ else
34
+ unhandled(message)
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def handle_outgoing(message)
41
+ if message.has_destination
42
+ if @sender
43
+ byte_string = JavaLib::ByteString.from_array(message.to_byte_array)
44
+ udp_message = JavaLib::UdpMessage.send(byte_string, @sender)
45
+ @socket.tell(udp_message, get_self)
46
+ else
47
+ GameMachine.logger.error "#{self.class.name} cannot send outgoing message (no sender) "
48
+ end
49
+ else
50
+ GameMachine.logger.error "#{self.class.name} destination missing (outgoing)"
51
+ end
52
+ rescue Exception => e
53
+ GameMachine.logger.error "#{self.class.name} #{e.to_s}"
54
+ end
55
+
56
+ def handle_incoming(message)
57
+ @sender = message.sender
58
+ entity = MessageLib::Entity.parse_from(message.data.to_array)
59
+ if entity.id == 'ping'
60
+ unless @mono_connected
61
+ GameMachine.logger.info "Mono server connected"
62
+ end
63
+ @mono_connected = true
64
+ @last_mono_ping = Time.now.to_i
65
+ echo(message)
66
+ elsif entity.has_destination
67
+ destination = entity.destination.sub(/^\//,'')
68
+ destination = destination.gsub('/','::')
69
+ entity.set_destination(nil)
70
+ GameMachine.logger.info "#{self.class.name} incoming to #{destination}"
71
+ Actor::Base.find(destination).tell(entity,get_self)
72
+ else
73
+ GameMachine.logger.error "#{self.class.name} destination missing (incoming)"
74
+ end
75
+ rescue Exception => e
76
+ GameMachine.logger.error "#{self.class.name} #{e.to_s}"
77
+ end
78
+
79
+ def echo(message)
80
+ byte_string = JavaLib::ByteString.from_array(message.data.to_array)
81
+ udp_message = JavaLib::UdpMessage.send(byte_string, message.sender)
82
+ @socket.tell(udp_message,get_self)
83
+ end
84
+
85
+ end
86
+ end
87
+ end
@@ -0,0 +1,51 @@
1
+ module GameMachine
2
+ module Endpoints
3
+ class Tcp < Actor::Base
4
+
5
+ def post_init(*args)
6
+ @clients = {}
7
+ @mgr = nil
8
+ end
9
+
10
+ def preStart
11
+ @mgr = JavaLib::Tcp.get(getContext.system).getManager
12
+ inet = JavaLib::InetSocketAddress.new(
13
+ Application.config.tcp_host,
14
+ Application.config.tcp_port
15
+ )
16
+ @mgr.tell( JavaLib::TcpMessage.bind(getSelf,inet,100), getSelf)
17
+ end
18
+
19
+ def sanitize_address(name)
20
+ name.gsub!('/','')
21
+ name.gsub!('.','')
22
+ name.gsub!(':','_')
23
+ name
24
+ end
25
+
26
+ def on_receive(message)
27
+ if message.is_a?(MessageLib::ClientMessage)
28
+ if handler_ref = @clients.fetch(message.client_connection.id,nil)
29
+ handler_ref.tell(message)
30
+ else
31
+ GameMachine.logger.warn("No handler found for #{message.client_connection}")
32
+ end
33
+ elsif message.kind_of?(JavaLib::Tcp::Bound)
34
+ @mgr.tell(message,get_self)
35
+ elsif message.kind_of?(JavaLib::Tcp::CommandFailed)
36
+ getContext.stop(get_self)
37
+ elsif message.kind_of?(JavaLib::Tcp::Connected)
38
+ @mgr.tell(message,get_self)
39
+ handler_name = sanitize_address(message.remote_address.to_s)
40
+ handler_ref = Actor::Builder.new(TcpHandler,handler_name).with_name(handler_name).start
41
+ @clients[message.remote_address.to_s] = handler_ref
42
+ handler_ref.tell(message,get_sender)
43
+ get_sender.tell(JavaLib::TcpMessage.register(handler_ref), get_self)
44
+ else
45
+ unhandled(message)
46
+ end
47
+ end
48
+
49
+ end
50
+ end
51
+ end