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,67 @@
1
+ module GameMachine
2
+ class ObjectDb < Actor::Base
3
+
4
+ class << self
5
+ def dbprocs
6
+ @dbprocs ||= java.util.concurrent.ConcurrentHashMap.new
7
+ end
8
+ end
9
+
10
+ attr_accessor :entities, :store
11
+ def post_init(*args)
12
+ @entities = {}
13
+ @store = DataStore.instance
14
+ end
15
+
16
+ def delete_entity(entity_id)
17
+ entities.delete(entity_id)
18
+ @store.delete(entity_id)
19
+ end
20
+
21
+ def delete_all
22
+ entities = {}
23
+ store.delete_all
24
+ end
25
+
26
+ def set_entity(entity)
27
+ entities[entity.id] = entity
28
+ WriteBehindCache.find_distributed(entity.id).tell(entity)
29
+ end
30
+
31
+ def get_entity(entity_id)
32
+ entity = entities.fetch(entity_id,nil)
33
+ if entity.nil?
34
+ if bytes = store.get(entity_id)
35
+ entity = MessageLib::Entity.parse_from(bytes)
36
+ end
37
+ end
38
+ entity
39
+ end
40
+
41
+ def on_receive(message)
42
+ if message.is_a?(MessageLib::ObjectdbUpdate)
43
+ procname = message.get_update_method.to_sym
44
+ current_entity_id = message.get_current_entity_id
45
+ update_entity = message.get_update_entity
46
+ unless current_entity = get_entity(current_entity_id)
47
+ current_entity = MessageLib::Entity.new.set_id(current_entity_id)
48
+ end
49
+ returned_entity = self.class.dbprocs[procname].call(
50
+ current_entity,update_entity
51
+ )
52
+ set_entity(returned_entity)
53
+ sender.tell(returned_entity || false)
54
+ elsif message.is_a?(MessageLib::ObjectdbPut)
55
+ set_entity(message.get_entity)
56
+ sender.tell(true)
57
+ elsif message.is_a?(MessageLib::ObjectdbGet)
58
+ sender.tell(get_entity(message.get_entity_id) || false)
59
+ elsif message.is_a?(MessageLib::ObjectdbDel)
60
+ delete_entity(message.get_entity_id)
61
+ else
62
+ unhandled(message)
63
+ end
64
+ end
65
+
66
+ end
67
+ end
@@ -0,0 +1,6 @@
1
+
2
+ if ['development','test'].include?(GameMachine.env)
3
+ require_relative '../../java/local_lib/protostuff-compiler-1.0.7-jarjar.jar'
4
+ require_relative 'protobuf/game_messages'
5
+ require_relative 'protobuf/generate'
6
+ end
@@ -0,0 +1,24 @@
1
+ module GameMachine
2
+ module Protobuf
3
+ class GameMessages
4
+
5
+ attr_reader :messages, :starting_field_number
6
+ def initialize(message_file)
7
+ @starting_field_number = 1000
8
+ @messages = IO.readlines(message_file)
9
+ end
10
+
11
+ def create_entity_fields
12
+ [].tap do |fields|
13
+ messages.each do |line|
14
+ if line.match(/^\s*?message\s+?(\w+?)\s+?{/)
15
+ name = $1[0,1].downcase + $1[1..-1]
16
+ fields << "optional #{$1} #{name} = #{starting_field_number};"
17
+ @starting_field_number += 1
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,113 @@
1
+ require 'java'
2
+ require 'pathname'
3
+ require 'erb'
4
+ require 'fileutils'
5
+
6
+ java_import java.lang.System
7
+ java_import com.dyuproject.protostuff.compiler.CachingProtoLoader
8
+ java_import java.io.FileNotFoundException
9
+ java_import com.dyuproject.protostuff.parser.ProtoUtil
10
+
11
+ module GameMachine
12
+ module Protobuf
13
+ class Generate
14
+
15
+ attr_reader :app_root
16
+ def initialize(app_root)
17
+ @app_root = app_root
18
+ end
19
+
20
+ def self.compile(path)
21
+ loader = CachingProtoLoader.new
22
+ file = java.io.File.new(path)
23
+ ProtoUtil.parseProto(file)
24
+ end
25
+
26
+ def erb_template
27
+ File.join(app_root,'java','component.erb')
28
+ end
29
+
30
+ def java_src
31
+ File.join(app_root,'java','src','main','java','GameMachine', 'Messages')
32
+ end
33
+
34
+ def config_path
35
+ File.join(app_root,'config')
36
+ end
37
+
38
+ def write_components(proto)
39
+ messages = proto.getMessages.reject {|message| message.getName == 'Components'}
40
+ FileUtils.mkdir_p(java_src)
41
+ proto.getMessages.each do |message|
42
+ klass = message.getName
43
+ #puts "Message: #{message.getName}"
44
+ out = ERB.new(File.read(erb_template),nil,'-').result(binding)
45
+ src_file = File.join(java_src,"#{message.getName}.java")
46
+ File.open(src_file,'w') {|f| f.write out}
47
+ #message.getFields.each do |field|
48
+ # puts field.getJavaType
49
+ # puts field.toString
50
+ #end
51
+ end
52
+ end
53
+
54
+ def get_type(field)
55
+ if field.getJavaType.to_s == 'int'
56
+ return 'Integer'
57
+ elsif ['boolean','double','float','long'].include?(field.getJavaType.to_s)
58
+ return field.getJavaType.to_s.clone.capitalize
59
+ else
60
+ return field.getJavaType
61
+ end
62
+ end
63
+
64
+ def varname(name)
65
+ name.slice(0,1).downcase + name.slice(1..-1)
66
+ end
67
+
68
+ def classname(name)
69
+ name.slice(0,1).capitalize + name.slice(1..-1)
70
+ end
71
+
72
+ def generate
73
+ game_protofile = File.join(config_path,'game_messages.proto')
74
+ protofile = File.join(config_path,'messages.proto')
75
+
76
+ if File.exists?(game_protofile)
77
+ game_messages = File.read(game_protofile)
78
+ gm = Protobuf::GameMessages.new(game_protofile)
79
+ entity_fields = gm.create_entity_fields
80
+ game_entity_fields = entity_fields.join("\n")
81
+ else
82
+ game_messages = ''
83
+ game_entity_fields = ''
84
+ end
85
+ messages = File.read(protofile)
86
+
87
+ combined_messages = messages.sub('//GAME_MESSAGES',game_messages)
88
+ combined_messages = combined_messages.sub('//GAME_ENTITY_MESSAGES',game_entity_fields)
89
+ combined_messages_protofile = File.join(config_path,'combined_messages.proto')
90
+
91
+ File.open(combined_messages_protofile,'w') {|f| f.write(combined_messages)}
92
+
93
+ # test message defintion validity
94
+ #tmp_dir = File.join('/tmp/proto_test')
95
+ #FileUtils.rm_rf(tmp_dir)
96
+ #FileUtils.mkdir_p(tmp_dir)
97
+ #unless system("protoc #{combined_messages_protofile} --java_out=#{tmp_dir}")
98
+ # return false
99
+ #end
100
+
101
+ # This just stops generating code when it hits an error, but does not
102
+ # throw an exception
103
+ proto = self.class.compile(combined_messages_protofile)
104
+
105
+ write_components(proto)
106
+ #FileUtils.rm(combined_messages_protofile)
107
+ combined_messages
108
+ end
109
+ end
110
+ end
111
+ end
112
+
113
+
@@ -0,0 +1,11 @@
1
+ module GameMachine
2
+ module ProtobufExtensions
3
+ module EntityHelper
4
+ def add_component(component)
5
+ send(:"set#{component.message_name}",component)
6
+ end
7
+ end
8
+ end
9
+ end
10
+
11
+ GameMachine::MessageLib::Entity.send(:include, GameMachine::ProtobufExtensions::EntityHelper)
@@ -0,0 +1,26 @@
1
+ module GameMachine
2
+ class ReloadableMonitor < Actor::Base
3
+
4
+ def post_init(*args)
5
+ @scheduler = get_context.system.scheduler
6
+ @dispatcher = get_context.system.dispatcher
7
+ update_interval = 2000
8
+ schedule_update(update_interval)
9
+ end
10
+
11
+ def update_reloadable
12
+ GameMachine::Actor::Reloadable.update_paths
13
+ end
14
+
15
+ def on_receive(message)
16
+ if message == 'update_reloadable'
17
+ update_reloadable
18
+ end
19
+ end
20
+
21
+ def schedule_update(update_interval)
22
+ duration = JavaLib::Duration.create(update_interval, java.util.concurrent.TimeUnit::MILLISECONDS)
23
+ @scheduler.schedule(duration, duration, get_self, "update_reloadable", @dispatcher, nil)
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,17 @@
1
+ module GameMachine
2
+ class RestartWatcher < Actor::Base
3
+
4
+ def post_init(*args)
5
+ schedule_message('check_restart',1000)
6
+ end
7
+
8
+ def on_receive(message)
9
+ if message == 'check_restart'
10
+ if Console::Server.restart?
11
+ Console::Server.exit!
12
+ end
13
+ end
14
+ end
15
+
16
+ end
17
+ end
@@ -0,0 +1,10 @@
1
+ class NilClass
2
+ # +nil+ is blank:
3
+ #
4
+ # nil.blank? # => true
5
+ #
6
+ # @return [true]
7
+ def blank?
8
+ true
9
+ end
10
+ end
@@ -0,0 +1,17 @@
1
+ class String
2
+ def constantize
3
+ self.split("::").inject(Module) {|acc, val| acc.const_get(val)}
4
+ end
5
+
6
+ def blank?
7
+ self !~ /\S/
8
+ end
9
+
10
+ def underscore
11
+ self.gsub(/::/, '/').
12
+ gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
13
+ gsub(/([a-z\d])([A-Z])/,'\1_\2').
14
+ tr("-", "_").
15
+ downcase
16
+ end
17
+ end
@@ -0,0 +1,23 @@
1
+ module GameMachine
2
+ class Scheduler < Actor::Base
3
+
4
+ def preStart
5
+ scheduler = get_context.system.scheduler
6
+ dispatcher = get_context.system.dispatcher
7
+
8
+ every_second = JavaLib::Duration.create(1, java.util.concurrent.TimeUnit::SECONDS)
9
+ #scheduler.schedule(every_second, every_second, get_self, "every_second", dispatcher, nil)
10
+
11
+ every_10_seconds = JavaLib::Duration.create(10, java.util.concurrent.TimeUnit::SECONDS)
12
+ #scheduler.schedule(every_10_seconds, every_10_seconds, get_self, "every_10_seconds", dispatcher, nil)
13
+ end
14
+
15
+ def on_receive(message)
16
+ if message == 'every_10_seconds'
17
+ #GameMachine.logger.debug "Cluster members #{ClusterMonitor.cluster_members.keys.to_a.inspect}"
18
+ #GameMachine.logger.debug "Hashrings #{Akka.instance.hashring.buckets.inspect}"
19
+ end
20
+ end
21
+ end
22
+ end
23
+
@@ -0,0 +1,6 @@
1
+ require 'securerandom'
2
+ module SecureRandom
3
+ def self.hex(s)
4
+ raise NotImplementedError
5
+ end
6
+ end
@@ -0,0 +1,11 @@
1
+ require 'settingslogic'
2
+
3
+ module GameMachine
4
+ class Settings < Settingslogic
5
+ source File.expand_path(
6
+ ENV['CONFIG_FILE'] || File.join(ENV['APP_ROOT'], "config/config.yml")
7
+ )
8
+ namespace ENV['GAME_ENV']
9
+
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ module GameMachine
2
+ class SystemMonitor < Actor::Base
3
+
4
+ def post_init(*args)
5
+ end
6
+
7
+ def preStart
8
+ #getContext.system.eventStream.subscribe(getSelf, JavaLib::DeadLetter.java_class)
9
+ end
10
+
11
+ def on_receive(message)
12
+ if message.is_a?(JavaLib::DeadLetter)
13
+ #GameMachine.logger.debug("DeadLetter #{message.message}")
14
+ else
15
+ #GameMachine.logger.info("Unrecognized message #{message}")
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,24 @@
1
+ module GameMachine
2
+ class SystemStats < Actor::Base
3
+
4
+ def post_init(*args)
5
+ if getContext.system.name == 'cluster'
6
+ @cluster = JavaLib::Cluster.get(getContext.system)
7
+ end
8
+ schedule_message('update',60,:seconds)
9
+ end
10
+
11
+ def on_receive(message)
12
+ if message.is_a?(String) and message == 'update'
13
+
14
+ Grid.grids.each do |name,grid|
15
+ object_index_size = grid.objectIndex.length
16
+ cellscache_size = grid.cellsCache.length
17
+ cells_size = grid.cells.length
18
+ GameMachine.logger.info "Grid #{name} ondex_size: #{object_index_size} ccache_size: #{cellscache_size} csize: #{cells_size}"
19
+ end
20
+ end
21
+
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,23 @@
1
+
2
+ require 'securerandom'
3
+ require 'digest/md5'
4
+
5
+ module GameMachine
6
+ class Uniqueid
7
+ class << self
8
+ def generate_token(id)
9
+ digest(id + random_salt)
10
+ end
11
+
12
+
13
+ def random_salt
14
+ SecureRandom.urlsafe_base64
15
+ end
16
+
17
+
18
+ def digest(string)
19
+ Digest::MD5.hexdigest string
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,95 @@
1
+ module GameMachine
2
+ class Vector
3
+
4
+ attr_accessor :x, :y, :z
5
+
6
+ def self.from_array(ar)
7
+ new(ar[0],ar[1],ar[2])
8
+ end
9
+
10
+ def self.from(v)
11
+ new(v.x,v.y,v.z)
12
+ end
13
+
14
+ def initialize(x=0.0,y=0.0,z=0.0)
15
+ @x = x
16
+ @y = y
17
+ @z = z
18
+ end
19
+
20
+ def==(v)
21
+ @x == v.x && @y = v.y && @z = v.z
22
+ end
23
+
24
+
25
+ def zero?
26
+ @x == 0 && @y == 0 && z == 0
27
+ end
28
+
29
+ def zero
30
+ @x = 0.0
31
+ @y = 0.0
32
+ @z = 0.0
33
+ end
34
+
35
+ def set(new_x,new_y,new_z)
36
+ @x = new_x
37
+ @y = new_y
38
+ @z = new_z
39
+ end
40
+
41
+ def distance_squared(v)
42
+ dx = @x - v.x
43
+ dy = @y - v.y
44
+ #dz = @z - v.z
45
+ #(dx * dx + dy * dy + dz * dz);
46
+ (dx * dx + dy * dy);
47
+ end
48
+
49
+ def distance(v)
50
+ Math.sqrt(distance_squared(v))
51
+ end
52
+
53
+ def lerp(vector,percent)
54
+ @x = lerp_float(x,vector.x,percent)
55
+ @y = lerp_float(y,vector.y,percent)
56
+ end
57
+
58
+ def lerp_float(start_loc,end_loc,percent)
59
+ start_loc + (percent * (end_loc - start_loc))
60
+ end
61
+
62
+ def interpolate(vector,change_amount)
63
+ @x=(1-change_amount)*@x + change_amount*vector.x
64
+ @y=(1-change_amount)*@y + change_amount*vector.y
65
+ #@z=(1-change_amount)*@z + change_amount*vector.z
66
+ end
67
+
68
+ def -(v1)
69
+ self.class.new( @x - v1.x, @y - v1.y )
70
+ end
71
+
72
+ def self.norm(i)
73
+ r = 0
74
+ length = Math.sqrt(i*i)
75
+ if length != 0
76
+ r = i * (1/length)
77
+ end
78
+ r
79
+ end
80
+
81
+ def normalize
82
+ vector = self.class.new
83
+ length = Math.sqrt(@x*@x + @y*@y)
84
+ if length != 0
85
+ vector.x = @x * (1/length)
86
+ vector.y = @y * (1/length)
87
+ end
88
+ vector
89
+ end
90
+
91
+ def inspect
92
+ "#{x} #{y} #{z}"
93
+ end
94
+ end
95
+ end