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,4 @@
1
+ require_relative 'clients/client'
2
+ require_relative 'clients/udt_client'
3
+ require_relative 'clients/tcp_client'
4
+ require_relative 'clients/udp_client'
@@ -0,0 +1,45 @@
1
+ require 'socket'
2
+ require "uri"
3
+
4
+ module GameMachine
5
+ module Clients
6
+ class Client
7
+
8
+ def initialize(server)
9
+ @host = Settings.servers.send(server).udp_host
10
+ @port = Settings.servers.send(server).udp_port
11
+ @socket = UDPSocket.new
12
+ @socket.connect(@host,@port)
13
+ end
14
+
15
+ def send_message(message)
16
+ @socket.send(String.from_java_bytes(message),@host,@port)
17
+ end
18
+
19
+ def receive_message
20
+ @socket.recvfrom(1024)[0]
21
+ end
22
+
23
+ def self.http_post(path,data)
24
+ uri = URI.parse("http://localhost:8080#{path}")
25
+ response = Net::HTTP.post_form(uri, data)
26
+ response.body
27
+ end
28
+
29
+ def self.connect_udt
30
+ address = JavaLib::InetSocketAddress.new(Settings.servers.seed01.udt_host, Settings.servers.seed01.udt_port)
31
+ s = JavaLib::SocketUDT.new(JavaLib::TypeUDT::DATAGRAM)
32
+ s.setBlocking(true)
33
+ s.connect(address)
34
+ s
35
+ end
36
+
37
+ def self.send_udt(s,bytes)
38
+ s.send(bytes)
39
+ array = Java::byte[4096].new
40
+ l = s.receive(array)
41
+ JavaLib::Arrays.copy_of_range(array,0,l)
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,25 @@
1
+ require 'socket'
2
+ require "uri"
3
+
4
+ module GameMachine
5
+ module Clients
6
+ class TcpClient
7
+
8
+ def initialize(host,port)
9
+ @host = host
10
+ @port = port
11
+ @socket = TCPSocket.open(@host,@port)
12
+ end
13
+
14
+ def send_message(message)
15
+ @socket.send(message,0)
16
+ #@socket.send(String.from_java_bytes(message))
17
+ end
18
+
19
+ def receive_message
20
+ @socket.recvfrom(1024)[0]
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,151 @@
1
+ module GameMachine
2
+ module Clients
3
+ class TestClientProxy
4
+
5
+ include RSpec::Matchers
6
+ attr_reader :config
7
+
8
+ def initialize(name,client)
9
+ @data = java.util.concurrent.ConcurrentHashMap.new
10
+ @data[:name] = name
11
+ @data[:client] = client
12
+ @data[:actual] = []
13
+ end
14
+
15
+ def ctx=(ctx)
16
+ @data[:ctx] = ctx
17
+ end
18
+
19
+ def ctx
20
+ @data[:ctx]
21
+ end
22
+
23
+ def actual=(actual)
24
+ @data[:actual] = actual
25
+ end
26
+
27
+ def actual
28
+ @data[:actual]
29
+ end
30
+
31
+ def client
32
+ @data[:client]
33
+ end
34
+
35
+ def name
36
+ @data[:name]
37
+ end
38
+
39
+ def wait_for_ctx
40
+ loop do
41
+ @data[:ctx] = TestClient.find(name).ask('ctx',20)
42
+ return if @data[:ctx]
43
+ end
44
+ end
45
+
46
+ def ref
47
+ TestClient.find(name)
48
+ end
49
+
50
+ def stop
51
+ ref.tell('stop')
52
+ client.shutdown
53
+ end
54
+
55
+ def send_to_server(client_message)
56
+ client.send_to_server(client_message.to_byte_array,ctx)
57
+ end
58
+
59
+ def do_expect(found,not_found,component)
60
+ unless found
61
+ found = not_found
62
+ end
63
+ expect(found).to eq(component)
64
+ actual.clear
65
+ end
66
+
67
+ def clear
68
+ actual.clear
69
+ end
70
+
71
+ def entity_with_component(component,wait=0.100,&blk)
72
+ found = false
73
+ 10.times do
74
+ actual.each do |entity|
75
+ if entity.component_names.include?(component)
76
+ yield entity if block_given?
77
+ found = entity
78
+ end
79
+ end
80
+ return found if found
81
+ sleep wait
82
+ end
83
+ found
84
+ end
85
+
86
+ def should_receive_component(component,wait=0.20, &blk)
87
+ actual ||= []
88
+ blk.call
89
+ called = false
90
+ found = nil
91
+ not_found = []
92
+ 10.times do
93
+ not_found = []
94
+ actual.each do |entity|
95
+ if entity.component_names.include?(component)
96
+ called = true
97
+ found = component
98
+ else
99
+ not_found += entity.component_names
100
+ end
101
+ end
102
+ if called
103
+ do_expect(found,not_found,component)
104
+ return
105
+ end
106
+ sleep wait
107
+ end
108
+ end
109
+ end
110
+
111
+
112
+ class TestClient < Actor::Base
113
+
114
+ class << self
115
+ def start(name,port)
116
+ client = UdtClient.start(name,'localhost',port)
117
+ proxy = TestClientProxy.new(name,client)
118
+ Actor::Builder.new(self,name,port,proxy).with_name(name).start
119
+ proxy.wait_for_ctx
120
+ proxy
121
+ end
122
+ end
123
+
124
+
125
+ def post_init(*args)
126
+ @name = args[0]
127
+ @port = args[1]
128
+ @proxy = args[2]
129
+ @ctx = nil
130
+ end
131
+
132
+ def on_receive(message)
133
+ if message.is_a?(JavaLib::DefaultChannelHandlerContext)
134
+ @ctx = message
135
+ elsif message == 'ctx'
136
+ sender.tell(@ctx) if @ctx
137
+ elsif message == 'stop'
138
+ context.stop
139
+ else
140
+ @proxy.actual ||= []
141
+ client_message = ClientMessage.parse_from(message.bytes)
142
+ client_message.get_entity_list.each do |entity|
143
+ GameMachine.logger.info "GOT #{entity.component_names.join(' | ')}"
144
+ @proxy.actual << entity
145
+ end
146
+ end
147
+ end
148
+ end
149
+
150
+ end
151
+ end
@@ -0,0 +1,25 @@
1
+ require 'socket'
2
+ require "uri"
3
+
4
+ module GameMachine
5
+ module Clients
6
+ class UdpClient
7
+
8
+ def initialize(server)
9
+ @host = Settings.servers.send(server).udp_host
10
+ @port = Settings.servers.send(server).udp_port
11
+ @socket = UDPSocket.new
12
+ @socket.connect(@host,@port)
13
+ end
14
+
15
+ def send_message(message)
16
+ @socket.send(message,@host,@port)
17
+ end
18
+
19
+ def receive_message
20
+ @socket.recvfrom(1024)[0]
21
+ end
22
+
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,34 @@
1
+ module GameMachine
2
+ module Clients
3
+ class UdtClient
4
+
5
+ def initialize(server)
6
+ @host = Settings.servers.send(server).udt.host
7
+ @port = Settings.servers.send(server).udt.port
8
+ end
9
+
10
+ def disconnect
11
+ @socket.close
12
+ end
13
+
14
+ def connect
15
+ address = JavaLib::InetSocketAddress.new(@host, @port)
16
+ @socket = JavaLib::SocketUDT.new(JavaLib::TypeUDT::DATAGRAM)
17
+ @socket.setBlocking(true)
18
+ @socket.connect(address)
19
+ @socket
20
+ end
21
+
22
+ def send_message(bytes)
23
+ @socket.send(bytes)
24
+ end
25
+
26
+ def receive(timeout=0.100)
27
+ array = Java::byte[4096].new
28
+ res = @socket.receive(array)
29
+ JavaLib::Arrays.copy_of_range(array,0,res)
30
+ end
31
+ end
32
+ end
33
+ end
34
+
@@ -0,0 +1,115 @@
1
+ module GameMachine
2
+ class ClusterMonitor < Actor::Base
3
+
4
+ def self.cluster_members
5
+ if @cluster_members
6
+ @cluster_members
7
+ else
8
+ @cluster_members = java.util.concurrent.ConcurrentHashMap.new
9
+ end
10
+ end
11
+
12
+ def self.remote_members
13
+ if @remote_members
14
+ @remote_members
15
+ else
16
+ @remote_members = java.util.concurrent.ConcurrentHashMap.new
17
+ end
18
+ end
19
+
20
+ def self.add_cluster_member(address,member)
21
+ cluster_members[address] = member
22
+ end
23
+
24
+ def self.remove_cluster_member(address)
25
+ cluster_members.delete(address)
26
+ end
27
+
28
+ def self.remove_remote_member(address)
29
+ remote_members.delete(address)
30
+ end
31
+
32
+ def self.add_remote_member(address,member)
33
+ remote_members[address] = member
34
+ end
35
+
36
+ def preStart
37
+ if getContext.system.name == 'cluster'
38
+ @cluster = JavaLib::Cluster.get(getContext.system)
39
+ Akka.instance.init_cluster!(@cluster.self_address.to_string)
40
+ @cluster.subscribe(getSelf,
41
+ JavaLib::ClusterEvent::MemberEvent.java_class,
42
+ JavaLib::ClusterEvent::UnreachableMember.java_class)
43
+ GameMachine.logger.info "Cluster address #{@cluster.self_address.to_string}"
44
+ end
45
+ @observers = []
46
+ @notify_on_up_observers = []
47
+ @notify_on_down_observers = []
48
+ end
49
+
50
+ def notify_member_up
51
+ @notify_on_up_observers.each {|i| i[1].tell(i[0],get_self)}
52
+ end
53
+
54
+ def notify_member_down
55
+ @notify_on_down_observers.each {|i| i[1].tell(i[0],get_self)}
56
+ end
57
+
58
+ def notify_observers
59
+ @observers.each {|observer| observer.tell('cluster_update',get_self)}
60
+ end
61
+
62
+ def on_receive(message)
63
+ if message.is_a?(String)
64
+ if message == 'register_observer'
65
+ @observers << sender
66
+ elsif message == 'notify_on_up'
67
+ @notify_on_up_observers << [message,sender]
68
+ elsif message == 'notify_on_down'
69
+ @notify_on_down_observers << [message,sender]
70
+ end
71
+ elsif message.is_a?(JavaLib::ClusterEvent::SeenChanged)
72
+
73
+ elsif message.is_a?(JavaLib::ClusterEvent::MemberRemoved)
74
+ address = message.member.address.to_string
75
+ Akka.instance.hashring.remove_bucket(address)
76
+ self.class.remove_cluster_member(address)
77
+ self.class.remove_remote_member(address)
78
+
79
+ notify_observers
80
+ notify_member_down
81
+
82
+ GameMachine.logger.info "MemberRemoved #{address}"
83
+ elsif message.is_a?(JavaLib::ClusterEvent::MemberUp)
84
+ address = message.member.address.to_string
85
+ self.class.add_cluster_member(address,message.member)
86
+ Akka.instance.hashring.add_bucket(address)
87
+
88
+ unless address == @cluster.self_address.to_string
89
+ self.class.add_remote_member(address,message.member)
90
+ end
91
+
92
+ notify_member_up
93
+ notify_observers
94
+ GameMachine.logger.info "MemberUp #{address}"
95
+ elsif message.is_a?(JavaLib::ClusterEvent::ClusterMetricsChanged)
96
+
97
+ elsif message.is_a?(JavaLib::ClusterEvent::CurrentClusterState)
98
+ message.get_members.each do |member|
99
+ address = member.address.to_string
100
+ self.class.add_cluster_member(address,member)
101
+ Akka.instance.hashring.add_bucket(address)
102
+ unless address == @cluster.self_address.to_string
103
+ self.class.add_remote_member(address,member)
104
+ end
105
+ end
106
+
107
+ notify_observers
108
+
109
+ else
110
+ #GameMachine.logger.info("Unrecognized message #{message}")
111
+ end
112
+ end
113
+ end
114
+ end
115
+
@@ -0,0 +1,23 @@
1
+ require_relative 'commands/message_helper'
2
+ require_relative 'commands/datastore_commands'
3
+ require_relative 'commands/chat_commands'
4
+ require_relative 'commands/player_commands'
5
+ require_relative 'commands/grid_commands'
6
+ require_relative 'commands/misc_commands'
7
+ require_relative 'commands/proxy'
8
+ require_relative 'commands/base'
9
+
10
+ if Config::CONFIG['target_os'] == 'linux'
11
+ require_relative 'commands/navigation_commands'
12
+ end
13
+
14
+ module GameMachine
15
+ module Commands
16
+
17
+ def commands
18
+ @commands ||= Base.new
19
+ end
20
+
21
+ end
22
+ end
23
+
@@ -0,0 +1,21 @@
1
+ module GameMachine
2
+ module Commands
3
+ class Base
4
+
5
+ attr_reader :player, :grid, :chat, :datastore, :navigation, :misc
6
+
7
+ def self.commands
8
+ @commands ||= new
9
+ end
10
+
11
+ def initialize
12
+ @player = PlayerCommands.new
13
+ @grid = GridCommands.new
14
+ @chat = ChatCommands.new
15
+ @datastore = DatastoreCommands.new
16
+ @misc = MiscCommands.new
17
+ #@navigation = NavigationCommands.new
18
+ end
19
+ end
20
+ end
21
+ end