game_machine 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +13 -9
  3. data/config/config.example.yml +8 -1
  4. data/config/game_messages.proto +1 -0
  5. data/config/messages.proto +4 -0
  6. data/games/example/lib/npc.rb +8 -7
  7. data/games/models.rb +3 -0
  8. data/games/models/clan_member.rb +8 -0
  9. data/games/models/clan_profile.rb +9 -0
  10. data/games/models/player.rb +7 -0
  11. data/games/plugins.rb +1 -0
  12. data/games/plugins/team_handler.rb +49 -0
  13. data/games/preload.rb +5 -0
  14. data/java/build.gradle +3 -1
  15. data/java/gradle.properties +1 -1
  16. data/lib/game_machine/actor/base.rb +5 -1
  17. data/lib/game_machine/application.rb +13 -3
  18. data/lib/game_machine/commands/datastore_commands.rb +3 -7
  19. data/lib/game_machine/commands/player_commands.rb +3 -0
  20. data/lib/game_machine/data_store.rb +22 -1
  21. data/lib/game_machine/data_stores/couchbase.rb +18 -1
  22. data/lib/game_machine/endpoints/udp_incoming.rb +0 -1
  23. data/lib/game_machine/game_systems.rb +2 -0
  24. data/lib/game_machine/game_systems/chat.rb +33 -13
  25. data/lib/game_machine/game_systems/chat_manager.rb +24 -3
  26. data/lib/game_machine/game_systems/json_model_persistence.rb +23 -0
  27. data/lib/game_machine/game_systems/region_manager.rb +1 -1
  28. data/lib/game_machine/game_systems/team_manager.rb +421 -0
  29. data/lib/game_machine/handlers/request.rb +4 -0
  30. data/lib/game_machine/model.rb +59 -13
  31. data/lib/game_machine/models.rb +17 -0
  32. data/lib/game_machine/models/create_team.rb +9 -0
  33. data/lib/game_machine/models/destroy_team.rb +8 -0
  34. data/lib/game_machine/models/echo_test.rb +6 -0
  35. data/lib/game_machine/models/end_match.rb +7 -0
  36. data/lib/game_machine/models/find_match.rb +7 -0
  37. data/lib/game_machine/models/join_team.rb +7 -0
  38. data/lib/game_machine/models/leave_team.rb +7 -0
  39. data/lib/game_machine/models/match.rb +9 -0
  40. data/lib/game_machine/models/player_team.rb +9 -0
  41. data/lib/game_machine/models/start_match.rb +8 -0
  42. data/lib/game_machine/models/team.rb +11 -0
  43. data/lib/game_machine/models/team_accept_invite.rb +9 -0
  44. data/lib/game_machine/models/team_invite.rb +8 -0
  45. data/lib/game_machine/models/team_joined.rb +7 -0
  46. data/lib/game_machine/models/team_left.rb +7 -0
  47. data/lib/game_machine/models/teams.rb +7 -0
  48. data/lib/game_machine/models/teams_request.rb +6 -0
  49. data/lib/game_machine/object_db.rb +17 -11
  50. data/lib/game_machine/version.rb +1 -1
  51. data/lib/game_machine/write_behind_cache.rb +1 -1
  52. data/spec/actor/actor_spec.rb +5 -5
  53. data/spec/actor/ref_spec.rb +10 -10
  54. data/spec/client_manager_spec.rb +9 -9
  55. data/spec/commands/chat_commands_spec.rb +1 -1
  56. data/spec/commands/datastore_commands_spec.rb +10 -14
  57. data/spec/commands/navigation_commands_spec.rb +3 -3
  58. data/spec/commands/player_commands_spec.rb +1 -1
  59. data/spec/game_systems/agents/controller_spec.rb +6 -6
  60. data/spec/game_systems/chat_manager_spec.rb +1 -1
  61. data/spec/game_systems/chat_spec.rb +15 -17
  62. data/spec/game_systems/region_manager_spec.rb +31 -21
  63. data/spec/game_systems/team_manager_spec.rb +291 -0
  64. data/spec/grid_spec.rb +11 -1
  65. data/spec/handlers/authentication_spec.rb +1 -10
  66. data/spec/handlers/game_spec.rb +2 -2
  67. data/spec/handlers/request_spec.rb +10 -21
  68. data/spec/hashring_spec.rb +11 -11
  69. data/spec/java_grid_spec.rb +1 -1
  70. data/spec/misc_spec.rb +2 -2
  71. data/spec/model_spec.rb +26 -14
  72. data/spec/write_behind_cache_spec.rb +15 -15
  73. metadata +29 -8
  74. data/lib/game_machine/bot/chat.rb +0 -66
  75. data/lib/game_machine/bot/client.rb +0 -54
  76. data/spec/data_stores/mapdb_spec.rb +0 -46
  77. data/spec/data_stores/redis_spec.rb +0 -44
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 99584a580fcb46287f1510e15f5eeb6c31a0a02d
4
- data.tar.gz: 3969eb2639475bdcd43849b159eb3725a708f862
3
+ metadata.gz: ffff1acfb6c6991f5ec1bf5c1c6e4ad06ef0b588
4
+ data.tar.gz: 32e1d7c2016cd8fe2f1b348b1ef9a01595da26d3
5
5
  SHA512:
6
- metadata.gz: f37531bd3d9207336ecaa0685523ce0be204f3a573b99edb6d1f7e708c7bd269b505f2759f30d0e8a08334757449c6059e14fae7ada16954ea9cb4990776f3cf
7
- data.tar.gz: 5339212baf3d33ecad28a39063359748b5ba94121801330846294e065b83841ffa6803f2e9aa6a2d5e5d4b82931c46575407ec4e146fd9bba7cbb6155e13c5e0
6
+ metadata.gz: e2fa98eec04da15ebd1c057675ca5032878d4959b6eef3b2d1f9dc60fc70d5e05df3b185805c695931d63ea963e982197c8a41983350f457344d18b699d4e5f2
7
+ data.tar.gz: ced35f7f4bc12fae21af3e2ef05dcca6d20692a44ae51133341a5196eb04fd6874e05d523659593df3480ea94e401ecbd9d2d1f56c94a504f5e0df79ba7afc61
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- game_machine (0.0.5)
4
+ game_machine (0.0.10)
5
5
  consistent-hashing
6
6
  ffi
7
7
  haml
@@ -37,14 +37,18 @@ GEM
37
37
  rjack-logback (1.7.0-java)
38
38
  rjack-slf4j (>= 1.6.5, < 1.8)
39
39
  rjack-slf4j (1.7.6.0-java)
40
- rspec (2.14.1)
41
- rspec-core (~> 2.14.0)
42
- rspec-expectations (~> 2.14.0)
43
- rspec-mocks (~> 2.14.0)
44
- rspec-core (2.14.7)
45
- rspec-expectations (2.14.4)
46
- diff-lcs (>= 1.1.3, < 2.0)
47
- rspec-mocks (2.14.4)
40
+ rspec (3.0.0)
41
+ rspec-core (~> 3.0.0)
42
+ rspec-expectations (~> 3.0.0)
43
+ rspec-mocks (~> 3.0.0)
44
+ rspec-core (3.0.2)
45
+ rspec-support (~> 3.0.0)
46
+ rspec-expectations (3.0.2)
47
+ diff-lcs (>= 1.2.0, < 2.0)
48
+ rspec-support (~> 3.0.0)
49
+ rspec-mocks (3.0.2)
50
+ rspec-support (~> 3.0.0)
51
+ rspec-support (3.0.2)
48
52
  settingslogic (2.0.9)
49
53
  sinatra (1.4.5)
50
54
  rack (~> 1.4)
@@ -3,6 +3,9 @@ development:
3
3
  servers:
4
4
  default:
5
5
  environment: development
6
+ # Handles requests for matchmaking and custom filtering for teams.
7
+ # If no team handler is defined defaults are used
8
+ team_handler: Plugins::TeamHandler
6
9
  # Authorization handler. Public allows any authtoken to be used and
7
10
  # does not check username/password
8
11
  auth_handler: Example::AuthenticationHandler
@@ -35,9 +38,10 @@ development:
35
38
  aoe: 4000, 5, 1
36
39
  local_chat: 4000, 10, 10
37
40
  # Couchbase config
41
+ couchbase_bucket: default
42
+ couchbase_password:
38
43
  couchbase_servers:
39
44
  - http://127.0.0.1:8091/pools
40
- #auth_handler: Example::AuthenticationHandler
41
45
  http_enabled: true
42
46
  http_host: 0.0.0.0
43
47
  http_port: 3000
@@ -58,6 +62,7 @@ development:
58
62
  mono_gateway_port: 8800
59
63
  seed01:
60
64
  environment: development
65
+ team_handler: Plugins::TeamHandler
61
66
  auth_handler: Example::AuthenticationHandler
62
67
  player_register_handler: Example::PlayerRegister
63
68
  player_manager: Example::PlayerManager
@@ -73,6 +78,8 @@ development:
73
78
  default: 4000, 50, 1
74
79
  aoe: 4000, 5, 1
75
80
  local_chat: 4000, 10, 10
81
+ couchbase_bucket: default
82
+ couchbase_password:
76
83
  couchbase_servers:
77
84
  - http://127.0.0.1:8091/pools
78
85
  http_enabled: false
@@ -7,6 +7,7 @@ message TrackExtra {
7
7
  optional float speed = 1;
8
8
  optional float velocity = 2;
9
9
  optional Vector3 direction = 3;
10
+ optional string json = 4;
10
11
  }
11
12
 
12
13
  message Health {
@@ -91,6 +91,10 @@ message ChatMessage {
91
91
  message ChatStatus {
92
92
  }
93
93
 
94
+ message ChatDestroy {
95
+ required string playerId = 1;
96
+ }
97
+
94
98
  message ClientEvent {
95
99
  required string event = 1;
96
100
  required string clientId = 2;
@@ -69,14 +69,9 @@ module Example
69
69
  end
70
70
 
71
71
  def get_players
72
+ @players = {}
72
73
  commands.grid.neighbors(position.x,position.y).each do |player|
73
- if @players[player.id]
74
- @players[player.id][:vector].x = player.x
75
- @players[player.id][:vector].y = player.y
76
- @players[player.id][:vector].z = player.z
77
- else
78
- @players[player.id] = {:id => player.id, :vector => GameMachine::Vector.from(player)}
79
- end
74
+ @players[player.id] = {:id => player.id, :vector => GameMachine::Vector.from(player)}
80
75
  end
81
76
  end
82
77
 
@@ -91,6 +86,12 @@ module Example
91
86
  def pick_random_target
92
87
  @target.x = position.x + rand(-30..30)
93
88
  @target.y = position.y + rand(-30..30)
89
+ if @target.x < 2 || @target.x > 2045
90
+ @target.x = rand(5..2045)
91
+ end
92
+ if @target.y < 2 || @target.y > 2045
93
+ @target.x = rand(5..2045)
94
+ end
94
95
  movement.set_target(@target)
95
96
  end
96
97
 
@@ -0,0 +1,3 @@
1
+ require_relative 'models/clan_member'
2
+ require_relative 'models/clan_profile'
3
+ require_relative 'models/player'
@@ -0,0 +1,8 @@
1
+ module Game
2
+ module Models
3
+ class ClanMember < GameMachine::Model
4
+ attribute :name, String
5
+ attribute :rating, String
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,9 @@
1
+ module Game
2
+ module Models
3
+ class ClanProfile < GameMachine::Model
4
+ attribute :name, String
5
+ attribute :rating, String
6
+ attribute :members, Array
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,7 @@
1
+ module Game
2
+ module Models
3
+ class Player < GameMachine::Model
4
+
5
+ end
6
+ end
7
+ end
@@ -0,0 +1 @@
1
+ require_relative 'plugins/team_handler'
@@ -0,0 +1,49 @@
1
+
2
+ module Plugins
3
+ class TeamHandler
4
+
5
+ attr_reader :teams
6
+ def initialize
7
+ update_teams
8
+ end
9
+
10
+ def update_teams
11
+ @teams = GameMachine::Models::Teams.find('teams')
12
+ end
13
+
14
+ # Should return a Match object if a match is found, otherwise nil
15
+ def match!(team_name)
16
+ GameMachine.logger.info "match! team_name:#{team_name} teams:#{teams}"
17
+ if team = teams.teams.select {|team| team.name != team_name}.first
18
+ return GameMachine::Models::StartMatch.new(:team_names => [team_name,team.name])
19
+ end
20
+ nil
21
+ end
22
+
23
+ # Called when Game Machine has started the match
24
+ def match_started(match)
25
+
26
+ end
27
+
28
+ # Filter you can apply to the teams list sent to clients
29
+ # You can add whatever extra fields you want to the TeamsRequest
30
+ # class on the client and they will show up here.
31
+ def teams_filter(teams,teams_request)
32
+ teams
33
+ end
34
+
35
+ # return true if member has rights to create team
36
+ def can_create_team?(team_name,member)
37
+ true
38
+ end
39
+
40
+ # return true if member has rights to join team
41
+ def can_add_member?(team_name,member)
42
+ true
43
+ end
44
+
45
+ def destroy_on_owner_leave?
46
+ true
47
+ end
48
+ end
49
+ end
@@ -3,6 +3,11 @@
3
3
  # is the place to do it. Examples might be specific handlers, or loading up
4
4
  # static data that needs to be there before the rest of the system starts up.
5
5
 
6
+ # json models that are global accross all games/plugins
7
+ require_relative 'models'
8
+
9
+ # Plugins that extend or work with core Game Machine features
10
+ require_relative 'plugins'
6
11
 
7
12
  # This needs to be loaded before the entity tracking system starts
8
13
  require_relative 'example/lib/tracking_handler'
@@ -45,7 +45,9 @@ dependencies {
45
45
  compile group: 'org.javassist', name: 'javassist', version:'3.17.1-GA'
46
46
  //compile(group: 'io.netty', name: 'netty-all', version:'4.0.11.Final')
47
47
  //compile 'org.apache.camel:camel-jetty:2.10.3'
48
- compile(group: 'couchbase', name: 'couchbase-client', version:'1.1.7')
48
+ //compile(group: 'couchbase', name: 'couchbase-client', version:'1.4.2')
49
+ //compile 'com.basho.riak:riak-client:1.4.4'
50
+ compile 'com.couchbase.client:couchbase-client:1.4.2'
49
51
  compile 'redis.clients:jedis:2.2.1'
50
52
  compile 'org.mapdb:mapdb:1.0.3'
51
53
  compile 'io.netty:netty-testsuite:4.0.20.Final'
@@ -2,5 +2,5 @@
2
2
  version=0.0.1
3
3
 
4
4
  scala_version=2.11
5
- akka_version=2.3.3
5
+ akka_version=2.3.4
6
6
 
@@ -113,7 +113,11 @@ module GameMachine
113
113
  if message.send_to_player
114
114
  message
115
115
  else
116
- message = Model.from_entity(message)
116
+ model = Model.from_entity(message)
117
+ if message.has_player
118
+ model.player_id = message.player.id
119
+ end
120
+ return model
117
121
  end
118
122
  end
119
123
  message
@@ -49,8 +49,12 @@ module GameMachine
49
49
 
50
50
  def start
51
51
  create_grids
52
- game_preload
53
- GameMachine::Actor::Reloadable.update_paths(true)
52
+
53
+ unless GameMachine.env == 'test'
54
+ game_preload
55
+ GameMachine::Actor::Reloadable.update_paths(true)
56
+ end
57
+
54
58
  start_actor_system
55
59
  data_store
56
60
  start_endpoints
@@ -62,7 +66,11 @@ module GameMachine
62
66
  end
63
67
 
64
68
  start_game_systems
65
- GameLoader.new.load_all
69
+
70
+ unless GameMachine.env == 'test'
71
+ GameLoader.new.load_all
72
+ end
73
+
66
74
  auth_handler
67
75
  start_mono
68
76
 
@@ -174,6 +182,8 @@ module GameMachine
174
182
  Actor::Builder.new(GameSystems::RemoteEcho).with_router(JavaLib::RoundRobinRouter,10).start
175
183
  Actor::Builder.new(GameSystems::StressTest).with_router(JavaLib::RoundRobinRouter,10).start
176
184
  Actor::Builder.new(GameSystems::ChatManager).start
185
+ Actor::Builder.new(GameSystems::TeamManager).start
186
+ Actor::Builder.new(GameSystems::JsonModelPersistence).start
177
187
  end
178
188
 
179
189
  end
@@ -25,18 +25,14 @@ module GameMachine
25
25
  end
26
26
 
27
27
  def put!(entity)
28
- store.set(entity.id,entity.to_byte_array)
28
+ store.set(entity.id,entity)
29
29
  end
30
30
 
31
31
  def get!(entity_id)
32
- if bytes = store.get(entity_id)
33
- MessageLib::Entity.parse_from(bytes)
34
- else
35
- nil
36
- end
32
+ store.get(entity_id)
37
33
  end
38
34
 
39
- def del!(entity_id)
35
+ def delete!(entity_id)
40
36
  store.delete(entity_id)
41
37
  end
42
38
 
@@ -4,6 +4,9 @@ module GameMachine
4
4
  include MessageHelper
5
5
 
6
6
  def send_message(message,player_id)
7
+ if player_id.nil?
8
+ raise "player id cannot be nil"
9
+ end
7
10
  if is_entity?(message)
8
11
  entity = message
9
12
  unless entity.has_player
@@ -9,7 +9,7 @@ module GameMachine
9
9
  include Singleton
10
10
  extend Forwardable
11
11
 
12
- def_delegators :@store, :get, :set, :delete, :delete_all, :shutdown, :keys, :dump, :load
12
+ def_delegators :@store, :delete, :delete_all, :shutdown, :keys, :dump, :load
13
13
 
14
14
  attr_reader :store
15
15
  def initialize
@@ -23,6 +23,27 @@ module GameMachine
23
23
  connect
24
24
  end
25
25
 
26
+
27
+ def get(key)
28
+ value = @store.get(key)
29
+ return nil if value.nil?
30
+ if value.is_a?(String)
31
+ MessageLib::Entity.new.set_id(key).set_json_storage(
32
+ MessageLib::JsonStorage.new.set_json(value)
33
+ )
34
+ else
35
+ MessageLib::Entity.parse_from(value)
36
+ end
37
+ end
38
+
39
+ def set(key,value)
40
+ if value.has_json_storage
41
+ @store.set(key,value.json_storage.json)
42
+ else
43
+ @store.set(key,value.to_byte_array)
44
+ end
45
+ end
46
+
26
47
  private
27
48
 
28
49
  def connect
@@ -7,7 +7,24 @@ module GameMachine
7
7
  def_delegators :@client, :get, :set, :delete, :shutdown
8
8
 
9
9
  def connect
10
- @client ||= JavaLib::CouchbaseClient.new(servers, 'default'.to_java_string, ''.to_java_string)
10
+ @client ||= JavaLib::CouchbaseClient.new(builder)
11
+ end
12
+
13
+ def bucket
14
+ Application.config.couchbase_bucket || 'default'
15
+ end
16
+
17
+ def password
18
+ Application.config.couchbase_password || ''
19
+ end
20
+
21
+ def builder
22
+ @builder ||= JavaLib::CouchbaseConnectionFactoryBuilder.new.
23
+ buildCouchbaseConnection(
24
+ servers,
25
+ bucket.to_java_string,
26
+ password.to_java_string
27
+ )
11
28
  end
12
29
 
13
30
  def servers
@@ -60,7 +60,6 @@ module GameMachine
60
60
  :ctx => message.ctx,
61
61
  :client_connection => client_connection
62
62
  }
63
- GameMachine.logger.info "#{client.inspect}"
64
63
  self.class.clients[client_message.player.id] = client
65
64
  create_child(client_connection,client,@server,client_message.player.id)
66
65
  end
@@ -12,3 +12,5 @@ require_relative 'game_systems/objectdb_proxy'
12
12
  require_relative 'game_systems/agents/controller'
13
13
  require_relative 'game_systems/region_manager'
14
14
  require_relative 'game_systems/region_service'
15
+ require_relative 'game_systems/team_manager'
16
+ require_relative 'game_systems/json_model_persistence'
@@ -1,3 +1,4 @@
1
+ require 'digest'
1
2
  module GameMachine
2
3
  module GameSystems
3
4
  class Chat < Actor::Base
@@ -35,6 +36,11 @@ module GameMachine
35
36
  end
36
37
 
37
38
  def on_receive(entity)
39
+ if entity.is_a?(MessageLib::ChatDestroy)
40
+ leave_all_channels
41
+ return
42
+ end
43
+
38
44
  if entity.has_join_chat
39
45
  join_channels(entity.join_chat.get_chat_channel_list)
40
46
  send_status
@@ -73,6 +79,15 @@ module GameMachine
73
79
  end
74
80
  end
75
81
 
82
+ def leave_all_channels
83
+ channels = MessageLib::ChatChannels.new
84
+ @subscriptions.each do |name|
85
+ channel = MessageLib::ChatChannel.new.set_name(name)
86
+ leave_channel(channel)
87
+ end
88
+ get_sender.tell('complete',get_self)
89
+ end
90
+
76
91
  def message_queue
77
92
  MessageQueue.find
78
93
  end
@@ -84,7 +99,8 @@ module GameMachine
84
99
  def create_topic_handler(topic)
85
100
  name = "topic#{chat_id}#{topic}"
86
101
  builder = Actor::Builder.new(GameSystems::ChatTopic,chat_id,registered_as)
87
- ref = builder.with_parent(context).with_name(name).start
102
+ actor_name = Digest::MD5.hexdigest(name)
103
+ ref = builder.with_parent(context).with_name(actor_name).start
88
104
  actor_ref = Actor::Ref.new(ref,GameSystems::ChatTopic.name)
89
105
  @topic_handlers[topic] = actor_ref
90
106
  end
@@ -205,18 +221,22 @@ module GameMachine
205
221
 
206
222
  def leave_channels(chat_channels)
207
223
  chat_channels.each do |channel|
208
- if topic_handler = topic_handler_for(channel.name)
209
- message = MessageLib::Unsubscribe.new.set_topic(channel.name)
210
- message_queue.tell(message,topic_handler_for(channel.name).actor)
211
- @subscriptions.delete_if {|sub| sub == channel.name}
212
- save_subscriptions
213
- remove_subscriber(chat_id,channel.name)
214
- topic_handler.tell(JavaLib::PoisonPill.get_instance)
215
- @topic_handlers.delete(channel.name)
216
- delete_channel_flags(channel.name)
217
- else
218
- GameMachine.logger.info "leave_channel: no topic handler found for #{channel.name}"
219
- end
224
+ leave_channel(channel)
225
+ end
226
+ end
227
+
228
+ def leave_channel(channel)
229
+ if topic_handler = topic_handler_for(channel.name)
230
+ message = MessageLib::Unsubscribe.new.set_topic(channel.name)
231
+ message_queue.tell(message,topic_handler_for(channel.name).actor)
232
+ @subscriptions.delete_if {|sub| sub == channel.name}
233
+ save_subscriptions
234
+ remove_subscriber(chat_id,channel.name)
235
+ topic_handler.tell(JavaLib::PoisonPill.get_instance)
236
+ @topic_handlers.delete(channel.name)
237
+ delete_channel_flags(channel.name)
238
+ else
239
+ GameMachine.logger.info "leave_channel: no topic handler found for #{channel.name}"
220
240
  end
221
241
  end
222
242