game_machine 0.0.11 → 1.0.2
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.
- checksums.yaml +4 -4
- data/Gemfile +12 -1
- data/Gemfile.lock +32 -47
- data/Rakefile +0 -27
- data/bin/bundle_run.sh +1 -0
- data/bin/game_machine +29 -27
- data/config/cluster.conf +6 -5
- data/config/default.conf +164 -0
- data/config/game_machine.sql +33 -0
- data/config/game_messages.proto +87 -25
- data/config/gamecloud.conf +140 -0
- data/config/messages.proto +46 -53
- data/config/test.conf +149 -0
- data/game_machine.gemspec +10 -5
- data/games/boot.rb +3 -0
- data/games/example/data/game_data.yml +4 -4
- data/games/example/lib/aggressive_npc.rb +1 -1
- data/games/example/lib/game.rb +1 -2
- data/games/example/lib/player_register.rb +1 -1
- data/games/routes.rb +9 -0
- data/games/tutorial/boot.rb +12 -0
- data/games/tutorial/item_manager.rb +256 -0
- data/games/tutorial/object_store.rb +55 -0
- data/games/tutorial/seed.rb +52 -0
- data/games/tutorial/sql_store.rb +30 -0
- data/java/project/build.gradle +134 -0
- data/java/project/component.erb +719 -0
- data/java/{gradle.properties → project/gradle.properties} +1 -1
- data/java/project/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/java/{gradle → project/gradle}/wrapper/gradle-wrapper.properties +2 -2
- data/java/{gradlew → project/gradlew} +0 -0
- data/java/{gradlew.bat → project/gradlew.bat} +0 -0
- data/java/project/local_lib/AdminUi.jar +0 -0
- data/java/{local_lib/protostuff-compiler-1.0.7-jarjar.jar → project/local_lib/protostuff-compiler-1.0.8-jarjar.jar} +0 -0
- data/java/project/local_lib/sigar/libsigar-amd64-freebsd-6.so +0 -0
- data/java/project/local_lib/sigar/libsigar-amd64-linux.so +0 -0
- data/java/project/local_lib/sigar/libsigar-amd64-solaris.so +0 -0
- data/java/project/local_lib/sigar/libsigar-ia64-hpux-11.sl +0 -0
- data/java/project/local_lib/sigar/libsigar-ia64-linux.so +0 -0
- data/java/project/local_lib/sigar/libsigar-pa-hpux-11.sl +0 -0
- data/java/project/local_lib/sigar/libsigar-ppc-aix-5.so +0 -0
- data/java/project/local_lib/sigar/libsigar-ppc-linux.so +0 -0
- data/java/project/local_lib/sigar/libsigar-ppc64-aix-5.so +0 -0
- data/java/project/local_lib/sigar/libsigar-ppc64-linux.so +0 -0
- data/java/project/local_lib/sigar/libsigar-s390x-linux.so +0 -0
- data/java/project/local_lib/sigar/libsigar-sparc-solaris.so +0 -0
- data/java/project/local_lib/sigar/libsigar-sparc64-solaris.so +0 -0
- data/java/project/local_lib/sigar/libsigar-universal-macosx.dylib +0 -0
- data/java/project/local_lib/sigar/libsigar-universal64-macosx.dylib +0 -0
- data/java/project/local_lib/sigar/libsigar-x86-freebsd-5.so +0 -0
- data/java/project/local_lib/sigar/libsigar-x86-freebsd-6.so +0 -0
- data/java/project/local_lib/sigar/libsigar-x86-linux.so +0 -0
- data/java/project/local_lib/sigar/libsigar-x86-solaris.so +0 -0
- data/java/project/local_lib/sigar/sigar-amd64-winnt.dll +0 -0
- data/java/project/local_lib/sigar/sigar-x86-winnt.dll +0 -0
- data/java/project/local_lib/sigar/sigar-x86-winnt.lib +0 -0
- data/java/project/model.erb +99 -0
- data/java/{settings.gradle → project/settings.gradle} +0 -0
- data/java/project/src/main/java/com/game_machine/authentication/DefaultAuthenticator.java +28 -0
- data/java/project/src/main/java/com/game_machine/authentication/PlayerAuthenticator.java +6 -0
- data/java/project/src/main/java/com/game_machine/authentication/PublicAuthenticator.java +20 -0
- data/java/{src → project/src}/main/java/com/game_machine/core/ActorFactory.java +0 -0
- data/java/{src → project/src}/main/java/com/game_machine/core/ActorUtil.java +13 -0
- data/java/project/src/main/java/com/game_machine/core/AuthorizedPlayers.java +23 -0
- data/java/project/src/main/java/com/game_machine/core/ClientMessageDecoder.java +36 -0
- data/java/project/src/main/java/com/game_machine/core/ClientMessageEncoder.java +19 -0
- data/java/project/src/main/java/com/game_machine/core/CloudClient.java +298 -0
- data/java/{src → project/src}/main/java/com/game_machine/core/CommandProxy.java +0 -0
- data/java/project/src/main/java/com/game_machine/core/Commands.java +20 -0
- data/java/project/src/main/java/com/game_machine/core/DatastoreCommands.java +43 -0
- data/java/project/src/main/java/com/game_machine/core/DbConnectionPool.java +72 -0
- data/java/project/src/main/java/com/game_machine/core/DefaultMovementVerifier.java +56 -0
- data/java/{src → project/src}/main/java/com/game_machine/core/EntitySerializer.java +0 -0
- data/java/project/src/main/java/com/game_machine/core/EntityTracking.java +119 -0
- data/java/{src → project/src}/main/java/com/game_machine/core/EventStreamHandler.java +1 -1
- data/java/project/src/main/java/com/game_machine/core/GameActor.java +73 -0
- data/java/project/src/main/java/com/game_machine/core/GameMachineLoader.java +43 -0
- data/java/project/src/main/java/com/game_machine/core/GameMessageActor.java +44 -0
- data/java/project/src/main/java/com/game_machine/core/Grid.java +255 -0
- data/java/{src → project/src}/main/java/com/game_machine/core/GridValue.java +0 -0
- data/java/project/src/main/java/com/game_machine/core/Hashring.java +66 -0
- data/java/{src → project/src}/main/java/com/game_machine/core/IActorFactory.java +0 -0
- data/java/project/src/main/java/com/game_machine/core/LocalLinkedBuffer.java +20 -0
- data/java/project/src/main/java/com/game_machine/core/MessageGateway.java +120 -0
- data/java/project/src/main/java/com/game_machine/core/MessagePersister.java +26 -0
- data/java/project/src/main/java/com/game_machine/core/MonoProxy.java +39 -0
- data/java/project/src/main/java/com/game_machine/core/MovementVerifier.java +7 -0
- data/java/{src → project/src}/main/java/com/game_machine/core/NetMessage.java +10 -6
- data/java/project/src/main/java/com/game_machine/core/PersistentMessage.java +9 -0
- data/java/project/src/main/java/com/game_machine/core/PlayerCommands.java +31 -0
- data/java/project/src/main/java/com/game_machine/core/TcpServer.java +100 -0
- data/java/project/src/main/java/com/game_machine/core/TcpServerHandler.java +54 -0
- data/java/project/src/main/java/com/game_machine/core/TcpServerInitializer.java +32 -0
- data/java/project/src/main/java/com/game_machine/core/UdpClient.java +86 -0
- data/java/{src → project/src}/main/java/com/game_machine/core/UdpServer.java +18 -27
- data/java/{src → project/src}/main/java/com/game_machine/core/UdpServerHandler.java +23 -26
- data/java/project/src/main/java/com/game_machine/core/Vector3.java +159 -0
- data/java/project/src/main/java/com/game_machine/orm/models/PlayerItem.java +118 -0
- data/java/project/src/main/java/com/game_machine/orm/models/TestObject.java +110 -0
- data/java/project/src/main/java/com/game_machine/tutorial/LootGenerator.java +26 -0
- data/java/{src → project/src}/main/resources/game_machine.java.stg +3 -1
- data/java/project/src/main/resources/logback.properties +13 -0
- data/java/project/src/main/resources/logback.xml +76 -0
- data/java/{src → project/src}/main/resources/protostuff.properties +0 -0
- data/java/src/main/java/game/MyGameActor.java +26 -0
- data/lib/game_machine.rb +17 -16
- data/lib/game_machine/actor.rb +1 -1
- data/lib/game_machine/actor/base.rb +8 -31
- data/lib/game_machine/actor/builder.rb +5 -6
- data/lib/game_machine/actor/game_actor.rb +55 -0
- data/lib/game_machine/actor/reloadable.rb +6 -1
- data/lib/game_machine/akka.rb +26 -32
- data/lib/game_machine/app_config.rb +39 -26
- data/lib/game_machine/application.rb +56 -62
- data/lib/game_machine/client_manager.rb +14 -8
- data/lib/game_machine/cloud_updater.rb +51 -0
- data/lib/game_machine/cluster_monitor.rb +3 -3
- data/lib/game_machine/commands.rb +1 -1
- data/lib/game_machine/commands/misc_commands.rb +4 -8
- data/lib/game_machine/commands/player_commands.rb +8 -0
- data/lib/game_machine/console.rb +1 -0
- data/lib/game_machine/console/build.rb +57 -24
- data/lib/game_machine/console/bundle.rb +95 -0
- data/lib/game_machine/console/deploy.rb +30 -0
- data/lib/game_machine/console/install.rb +70 -36
- data/lib/game_machine/console/server.rb +2 -69
- data/lib/game_machine/data_store.rb +111 -15
- data/lib/game_machine/data_stores/couchbase.rb +8 -3
- data/lib/game_machine/data_stores/gamecloud.rb +93 -0
- data/lib/game_machine/data_stores/jdbc.rb +98 -0
- data/lib/game_machine/default_handlers.rb +2 -0
- data/lib/game_machine/default_handlers/team_handler.rb +51 -0
- data/lib/game_machine/default_handlers/zone_manager.rb +30 -0
- data/lib/game_machine/endpoints.rb +0 -4
- data/lib/game_machine/endpoints/udp_incoming.rb +13 -5
- data/lib/game_machine/endpoints/udp_outgoing.rb +15 -9
- data/lib/game_machine/game_systems.rb +0 -2
- data/lib/game_machine/game_systems/agents/controller.rb +2 -2
- data/lib/game_machine/game_systems/entity_tracking.rb +0 -3
- data/lib/game_machine/game_systems/region_manager.rb +3 -2
- data/lib/game_machine/game_systems/region_service.rb +2 -2
- data/lib/game_machine/game_systems/remote_echo.rb +10 -0
- data/lib/game_machine/game_systems/team_manager.rb +2 -11
- data/lib/game_machine/grid.rb +5 -18
- data/lib/game_machine/handlers/authentication.rb +1 -9
- data/lib/game_machine/handlers/game.rb +27 -2
- data/lib/game_machine/handlers/player_authentication.rb +87 -0
- data/lib/game_machine/handlers/request.rb +9 -11
- data/lib/game_machine/hocon_config.rb +81 -0
- data/lib/game_machine/java_lib.rb +14 -1
- data/lib/game_machine/logger.rb +10 -23
- data/lib/game_machine/models.rb +1 -0
- data/lib/game_machine/mono_server.rb +6 -1
- data/lib/game_machine/object_db.rb +12 -6
- data/lib/game_machine/protobuf.rb +1 -1
- data/lib/game_machine/protobuf/game_messages.rb +13 -3
- data/lib/game_machine/protobuf/generate.rb +107 -5
- data/lib/game_machine/restart_watcher.rb +1 -1
- data/lib/game_machine/routes.rb +23 -0
- data/lib/game_machine/scheduler.rb +1 -1
- data/lib/game_machine/securerandom.rb +2 -0
- data/lib/game_machine/system_stats.rb +28 -7
- data/lib/game_machine/version.rb +1 -1
- data/lib/game_machine/wavefront_ext.rb +47 -0
- data/lib/game_machine/write_behind_cache.rb +24 -9
- data/mono/server/Makefile +1 -1
- data/mono/server/Newtonsoft.Json.dll +0 -0
- data/mono/server/build.bat +1 -1
- data/mono/server/callable.cs +9 -0
- data/mono/server/echo.cs +17 -0
- data/mono/server/message_router.cs +16 -23
- data/mono/server/messages.cs +1792 -417
- data/mono/server/protobuf-net.dll +0 -0
- data/mono/server/server.cs +120 -0
- data/mono/server/server.exe +0 -0
- data/pathfinding/astar.cpp +149 -0
- data/pathfinding/build.sh +6 -0
- data/pathfinding/build.txt +16 -0
- data/pathfinding/crowd.cpp +194 -0
- data/pathfinding/include/astar.h +49 -0
- data/pathfinding/include/common.h +5 -0
- data/pathfinding/include/crowd.h +43 -0
- data/pathfinding/include/micropather.h +511 -0
- data/pathfinding/include/navmesh.h +114 -0
- data/pathfinding/include/pathfinder.h +24 -0
- data/pathfinding/main.cpp +108 -17
- data/pathfinding/micropather.cpp +1062 -0
- data/pathfinding/navmesh.cpp +408 -0
- data/pathfinding/overrides/DetourCrowd.cpp +1446 -0
- data/pathfinding/overrides/DetourNavMeshQuery.cpp +3551 -0
- data/pathfinding/overrides/DetourNavMeshQuery.h +538 -0
- data/pathfinding/pathfinder.cpp +117 -0
- data/pathfinding/{bin → premake}/premake4 +0 -0
- data/pathfinding/premake/premake4.exe +0 -0
- data/pathfinding/premake4.lua +12 -3
- data/spec/actor/actor_spec.rb +0 -7
- data/spec/client_manager_spec.rb +1 -1
- data/spec/couchproxy_spec.rb +38 -0
- data/spec/entity_persistence_spec.rb +129 -0
- data/spec/game_systems/team_manager_spec.rb +2 -2
- data/spec/hashring_spec.rb +17 -39
- data/spec/java_grid_spec.rb +0 -2
- data/spec/misc_spec.rb +111 -0
- data/spec/mono_spec.rb +50 -3
- data/spec/reliable_message_spec.rb +38 -0
- data/spec/spec_helper.rb +4 -4
- data/spec/spec_helper_minimal.rb +10 -0
- data/web/app.rb +108 -86
- data/web/config/trinidad.yml +1 -0
- data/web/views/add_player.erb +25 -0
- data/web/views/index.erb +0 -0
- data/web/views/layout.erb +48 -0
- data/web/views/login.erb +25 -0
- data/web/views/players.erb +24 -0
- metadata +209 -94
- data/config/config.example.yml +0 -100
- data/config/regions.example.yml +0 -9
- data/games/example/lib/authentication_handler.rb +0 -69
- data/games/models.rb +0 -3
- data/games/models/clan_member.rb +0 -8
- data/games/models/clan_profile.rb +0 -9
- data/games/models/player.rb +0 -7
- data/games/plugins.rb +0 -1
- data/games/plugins/team_handler.rb +0 -49
- data/games/preload.rb +0 -13
- data/java/.gitignore +0 -1
- data/java/build.gradle +0 -95
- data/java/component.erb +0 -396
- data/java/gradle/wrapper/gradle-wrapper.jar +0 -0
- data/java/src/main/java/com/game_machine/core/GameMachineLoader.java +0 -25
- data/java/src/main/java/com/game_machine/core/Grid.java +0 -195
- data/java/src/main/resources/logback.xml +0 -14
- data/java/src/main/resources/logging.properties +0 -3
- data/lib/game_machine/actor/mono_actor.rb +0 -89
- data/lib/game_machine/auth_handlers/base.rb +0 -21
- data/lib/game_machine/auth_handlers/public.rb +0 -34
- data/lib/game_machine/endpoints/mono_gateway.rb +0 -87
- data/lib/game_machine/endpoints/tcp.rb +0 -51
- data/lib/game_machine/endpoints/tcp_handler.rb +0 -75
- data/lib/game_machine/endpoints/udp.rb +0 -88
- data/lib/game_machine/game_loader.rb +0 -46
- data/lib/game_machine/game_systems/region_settings.rb +0 -13
- data/lib/game_machine/hashring.rb +0 -48
- data/lib/game_machine/settings.rb +0 -11
- data/mono/server/actor.cs +0 -37
- data/mono/server/iactor.cs +0 -11
- data/mono/server/message_util.cs +0 -29
- data/mono/server/proxy_client.cs +0 -73
- data/mono/server/proxy_server.cs +0 -30
- data/mono/server/test_actor.cs +0 -33
- data/pathfinding/include/pathfind.h +0 -167
- data/pathfinding/pathfind.cpp +0 -174
- data/pathfinding/pathfinder.cs +0 -66
- data/script/server.sh +0 -109
- data/script/watch.sh +0 -11
- data/spec/commands/navigation_commands_spec.rb +0 -51
- data/spec/game_systems/entity_tracking_spec.rb +0 -64
- data/spec/navigation/detour_navmesh_spec.rb +0 -34
- data/spec/navigation/detour_path_spec.rb +0 -25
- data/spec/udp_server_spec.rb +0 -10
- data/web/controllers/auth_controller.rb +0 -19
- data/web/controllers/base_controller.rb +0 -16
- data/web/controllers/index_controller.rb +0 -7
- data/web/controllers/log_controller.rb +0 -47
- data/web/controllers/messages_controller.rb +0 -59
- data/web/controllers/player_register_controller.rb +0 -15
- data/web/views/game_messages.haml +0 -45
- data/web/views/index.haml +0 -6
- data/web/views/layout.haml +0 -41
- data/web/views/logs.haml +0 -32
- data/web/views/player_register.haml +0 -22
- data/web/views/player_registered.haml +0 -2
- data/web/views/register_layout.haml +0 -22
- data/web/views/restart.haml +0 -35
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
|
|
2
|
+
module GameMachine
|
|
3
|
+
module DefaultHandlers
|
|
4
|
+
class TeamHandler
|
|
5
|
+
|
|
6
|
+
attr_reader :teams
|
|
7
|
+
def initialize
|
|
8
|
+
update_teams
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def update_teams
|
|
12
|
+
@teams = GameMachine::Models::Teams.find('teams')
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Should return a Match object if a match is found, otherwise nil
|
|
16
|
+
def match!(team_name)
|
|
17
|
+
GameMachine.logger.info "match! team_name:#{team_name} teams:#{teams}"
|
|
18
|
+
if team = teams.teams.select {|team| team.name != team_name}.first
|
|
19
|
+
return GameMachine::Models::StartMatch.new(:team_names => [team_name,team.name])
|
|
20
|
+
end
|
|
21
|
+
nil
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Called when Game Machine has started the match
|
|
25
|
+
def match_started(match)
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Filter you can apply to the teams list sent to clients
|
|
30
|
+
# You can add whatever extra fields you want to the TeamsRequest
|
|
31
|
+
# class on the client and they will show up here.
|
|
32
|
+
def teams_filter(teams,teams_request)
|
|
33
|
+
teams
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# return true if member has rights to create team
|
|
37
|
+
def can_create_team?(team_name,member)
|
|
38
|
+
true
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# return true if member has rights to join team
|
|
42
|
+
def can_add_member?(team_name,member)
|
|
43
|
+
true
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def destroy_on_owner_leave?
|
|
47
|
+
true
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# This class is configured in regions.yml, which is a mapping of regions to classes
|
|
2
|
+
# that handle running the region. In this example we use the same class for both
|
|
3
|
+
# of our regions. Our example regions only vary in which npc's are spawned.
|
|
4
|
+
module GameMachine
|
|
5
|
+
module DefaultHandlers
|
|
6
|
+
class ZoneManager < GameMachine::Actor::Base
|
|
7
|
+
|
|
8
|
+
def post_init(*args)
|
|
9
|
+
@region_up = false
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def start_zone(zone)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def on_receive(message)
|
|
16
|
+
|
|
17
|
+
# Region manager pings us every couple of seconds as long as we are alive,
|
|
18
|
+
# it's up to us to determine if we have started the region or not
|
|
19
|
+
if message.is_a?(GameMachine::Models::Region)
|
|
20
|
+
return if @region_up
|
|
21
|
+
@region_up = true
|
|
22
|
+
|
|
23
|
+
zone = message.name
|
|
24
|
+
GameMachine.logger.info "#{self.class.name} Starting region #{zone}"
|
|
25
|
+
start_zone(zone)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -12,7 +12,7 @@ module GameMachine
|
|
|
12
12
|
|
|
13
13
|
attr_reader :game_handler, :server, :clients
|
|
14
14
|
def post_init(*args)
|
|
15
|
-
@game_handler =
|
|
15
|
+
@game_handler = GameMachine::Handlers::Request.find
|
|
16
16
|
@server = JavaLib::UdpServer.getUdpServer
|
|
17
17
|
@server_handler = @server.getHandler
|
|
18
18
|
@auth_handler = Handlers::Authentication.new
|
|
@@ -30,7 +30,14 @@ module GameMachine
|
|
|
30
30
|
|
|
31
31
|
def handle_incoming(message)
|
|
32
32
|
client_id = client_id_from_message(message)
|
|
33
|
-
|
|
33
|
+
if message.protocol == 0
|
|
34
|
+
client_message = MessageLib::ClientMessage.parse_from(message.bytes)
|
|
35
|
+
elsif message.protocol == 2
|
|
36
|
+
client_message = message.clientMessage
|
|
37
|
+
else
|
|
38
|
+
raise "Unknown protocol"
|
|
39
|
+
end
|
|
40
|
+
|
|
34
41
|
client_connection = create_client_connection(
|
|
35
42
|
client_id,client_message.connection_type
|
|
36
43
|
)
|
|
@@ -57,11 +64,12 @@ module GameMachine
|
|
|
57
64
|
client = {
|
|
58
65
|
:host => message.host,
|
|
59
66
|
:port => message.port,
|
|
67
|
+
:address => message.address,
|
|
60
68
|
:ctx => message.ctx,
|
|
61
69
|
:client_connection => client_connection
|
|
62
70
|
}
|
|
63
71
|
self.class.clients[client_message.player.id] = client
|
|
64
|
-
create_child(client_connection,client,@server,client_message.player.id)
|
|
72
|
+
create_child(message.protocol,client_connection,client,@server,client_message.player.id)
|
|
65
73
|
end
|
|
66
74
|
end
|
|
67
75
|
end
|
|
@@ -73,8 +81,8 @@ module GameMachine
|
|
|
73
81
|
GameMachine.logger.error "#{self.class.name} #{e.to_s}"
|
|
74
82
|
end
|
|
75
83
|
|
|
76
|
-
def create_child(client_connection,client,server,player_id)
|
|
77
|
-
builder = Actor::Builder.new(Endpoints::UdpOutgoing,client_connection,client,server,player_id)
|
|
84
|
+
def create_child(protocol,client_connection,client,server,player_id)
|
|
85
|
+
builder = Actor::Builder.new(Endpoints::UdpOutgoing,client_connection,client,server,player_id,protocol)
|
|
78
86
|
builder.with_name(player_id).start
|
|
79
87
|
end
|
|
80
88
|
|
|
@@ -2,12 +2,13 @@ module GameMachine
|
|
|
2
2
|
module Endpoints
|
|
3
3
|
class UdpOutgoing < Actor::Base
|
|
4
4
|
|
|
5
|
-
attr_reader :client_connection, :client, :server, :player_id
|
|
5
|
+
attr_reader :protocol, :client_connection, :client, :server, :player_id
|
|
6
6
|
def post_init(*args)
|
|
7
7
|
@client_connection = args[0]
|
|
8
8
|
@client = args[1]
|
|
9
9
|
@server = args[2]
|
|
10
10
|
@player_id = args[3]
|
|
11
|
+
@protocol = args[4]
|
|
11
12
|
send_connected_message
|
|
12
13
|
GameMachine.logger.info "Player gateway created #{player_id}"
|
|
13
14
|
end
|
|
@@ -24,14 +25,19 @@ module GameMachine
|
|
|
24
25
|
end
|
|
25
26
|
|
|
26
27
|
def send_to_client(message)
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
bytes
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
28
|
+
#GameMachine.logger.info("Sending #{message} out via #{protocol}")
|
|
29
|
+
if protocol == 0
|
|
30
|
+
bytes = message.to_byte_array
|
|
31
|
+
server.sendToClient(
|
|
32
|
+
client[:address],
|
|
33
|
+
bytes,
|
|
34
|
+
client[:ctx]
|
|
35
|
+
)
|
|
36
|
+
else
|
|
37
|
+
client[:ctx].write(message)
|
|
38
|
+
client[:ctx].flush
|
|
39
|
+
JavaLib::UdpServerHandler.countOut.incrementAndGet
|
|
40
|
+
end
|
|
35
41
|
end
|
|
36
42
|
|
|
37
43
|
def on_receive(message)
|
|
@@ -2,8 +2,6 @@
|
|
|
2
2
|
require_relative 'game_systems/chat_manager'
|
|
3
3
|
require_relative 'game_systems/chat'
|
|
4
4
|
require_relative 'game_systems/chat_topic'
|
|
5
|
-
require_relative 'game_systems/entity_loader'
|
|
6
|
-
require_relative 'game_systems/entity_tracking'
|
|
7
5
|
require_relative 'game_systems/local_echo'
|
|
8
6
|
require_relative 'game_systems/remote_echo'
|
|
9
7
|
require_relative 'game_systems/stress_test'
|
|
@@ -103,8 +103,8 @@ module GameMachine
|
|
|
103
103
|
def local_agents
|
|
104
104
|
{}.tap do |agents|
|
|
105
105
|
agent_config.agent_names.each do |name|
|
|
106
|
-
|
|
107
|
-
if
|
|
106
|
+
node = Akka.instance.hashring.node_for(name)
|
|
107
|
+
if node == address
|
|
108
108
|
agents[name] = agent_config.klass_for_name(name)
|
|
109
109
|
end
|
|
110
110
|
end
|
|
@@ -18,9 +18,6 @@ module GameMachine
|
|
|
18
18
|
attr_reader :grid, :extra_params, :aoe_grid
|
|
19
19
|
|
|
20
20
|
def post_init
|
|
21
|
-
if handler_klass = Application.config.entity_tracking_handler
|
|
22
|
-
@tracking_handler = handler_klass.constantize.new
|
|
23
|
-
end
|
|
24
21
|
@entity_updates = []
|
|
25
22
|
@grid = Grid.find_or_create('default')
|
|
26
23
|
@aoe_grid = Grid.find_or_create('aoe')
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
require_relative 'region_settings'
|
|
2
1
|
module GameMachine
|
|
3
2
|
module GameSystems
|
|
4
3
|
class RegionManager < Actor::Base
|
|
@@ -28,7 +27,9 @@ module GameMachine
|
|
|
28
27
|
end
|
|
29
28
|
|
|
30
29
|
def load_from_config
|
|
31
|
-
|
|
30
|
+
Application.config.regions.each do |entry|
|
|
31
|
+
name = entry[0]
|
|
32
|
+
manager = entry[1]
|
|
32
33
|
unless region = Region.find!(name)
|
|
33
34
|
region = Region.new(
|
|
34
35
|
:id => name,
|
|
@@ -51,8 +51,8 @@ module GameMachine
|
|
|
51
51
|
end
|
|
52
52
|
|
|
53
53
|
def load_from_config
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
Application.config.regions.each do |entry|
|
|
55
|
+
name = entry[0]
|
|
56
56
|
# Make sure we set some value here, it will get updated with a valid
|
|
57
57
|
# region in update_regions
|
|
58
58
|
if region = Region.find!(name)
|
|
@@ -4,7 +4,17 @@ module GameMachine
|
|
|
4
4
|
include GameMachine::Commands
|
|
5
5
|
aspect %w(EchoTest)
|
|
6
6
|
|
|
7
|
+
def post_init(*args)
|
|
8
|
+
chars = [*('a'..'z'),*('0'..'9')].flatten
|
|
9
|
+
str = Array.new(400) {|i| chars.sample}.join
|
|
10
|
+
@test_message = MessageLib::Entity.new.set_id(str)
|
|
11
|
+
#schedule_message('test',10)
|
|
12
|
+
end
|
|
13
|
+
|
|
7
14
|
def on_receive(message)
|
|
15
|
+
if message.is_a?(String) && message == 'test'
|
|
16
|
+
return
|
|
17
|
+
end
|
|
8
18
|
#GameMachine.logger.info "#{self.class.name} #{message}"
|
|
9
19
|
commands.player.send_message(message,message.player.id)
|
|
10
20
|
end
|
|
@@ -6,9 +6,7 @@ module GameMachine
|
|
|
6
6
|
|
|
7
7
|
attr_reader :team_handler
|
|
8
8
|
def post_init(*args)
|
|
9
|
-
|
|
10
|
-
@team_handler = Application.config.team_handler.constantize.new
|
|
11
|
-
end
|
|
9
|
+
@team_handler = Application.config.handlers.team.constantize.new
|
|
12
10
|
define_update_procs
|
|
13
11
|
commands.misc.client_manager_register(self.class.name)
|
|
14
12
|
end
|
|
@@ -85,37 +83,30 @@ module GameMachine
|
|
|
85
83
|
end
|
|
86
84
|
|
|
87
85
|
def can_add_member?(team_name,player_id)
|
|
88
|
-
return true unless team_handler
|
|
89
86
|
team_handler.can_add_member?(team_name, player_id)
|
|
90
87
|
end
|
|
91
88
|
|
|
92
89
|
def can_create_team?(team_name,player_id)
|
|
93
|
-
return true unless team_handler
|
|
94
90
|
team_handler.can_create_team?(team_name, player_id)
|
|
95
91
|
end
|
|
96
92
|
|
|
97
93
|
def handler_update_teams
|
|
98
|
-
return true unless team_handler
|
|
99
94
|
team_handler.update_teams
|
|
100
95
|
end
|
|
101
96
|
|
|
102
97
|
def destroy_on_owner_leave?
|
|
103
|
-
return true unless team_handler
|
|
104
98
|
team_handler.destroy_on_owner_leave?
|
|
105
99
|
end
|
|
106
100
|
|
|
107
101
|
def handler_teams_filter(teams,teams_request)
|
|
108
|
-
return teams unless team_handler
|
|
109
102
|
team_handler.teams_filter(teams,teams_request)
|
|
110
103
|
end
|
|
111
104
|
|
|
112
105
|
def handler_find_match(team_name)
|
|
113
|
-
return true unless team_handler
|
|
114
106
|
team_handler.match!(team_name)
|
|
115
107
|
end
|
|
116
108
|
|
|
117
109
|
def handler_match_started(match)
|
|
118
|
-
return true unless team_handler
|
|
119
110
|
team_handler.match_started(match)
|
|
120
111
|
end
|
|
121
112
|
|
|
@@ -309,7 +300,7 @@ module GameMachine
|
|
|
309
300
|
return
|
|
310
301
|
end
|
|
311
302
|
|
|
312
|
-
server = Akka.instance.hashring.
|
|
303
|
+
server = Akka.instance.hashring.node_for(match_id)
|
|
313
304
|
server = server.sub('akka.tcp://cluster@','').split(':').first
|
|
314
305
|
|
|
315
306
|
match = Match.new(
|
data/lib/game_machine/grid.rb
CHANGED
|
@@ -16,7 +16,8 @@ module GameMachine
|
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
def load_from_config
|
|
19
|
-
|
|
19
|
+
['default','local_chat','aoe'].each do |name|
|
|
20
|
+
value = Application.config.grids.send(name.to_sym)
|
|
20
21
|
grid_size,cell_size,update_frequency = value.split(',')
|
|
21
22
|
config[name] = {
|
|
22
23
|
:grid_size => grid_size.to_i,
|
|
@@ -28,15 +29,7 @@ module GameMachine
|
|
|
28
29
|
end
|
|
29
30
|
|
|
30
31
|
def reset_grids
|
|
31
|
-
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
def grids
|
|
35
|
-
if @grids
|
|
36
|
-
return @grids
|
|
37
|
-
else
|
|
38
|
-
reset_grids
|
|
39
|
-
end
|
|
32
|
+
JavaLib::Grid.reset_grids
|
|
40
33
|
end
|
|
41
34
|
|
|
42
35
|
def default_grid
|
|
@@ -44,15 +37,9 @@ module GameMachine
|
|
|
44
37
|
end
|
|
45
38
|
|
|
46
39
|
def find_or_create(name)
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
grid_config = config.fetch(name)
|
|
50
|
-
grid = JavaLib::Grid.new(grid_config.fetch(:grid_size),
|
|
40
|
+
grid_config = config.fetch(name)
|
|
41
|
+
JavaLib::Grid.find_or_create(name,grid_config.fetch(:grid_size),
|
|
51
42
|
grid_config.fetch(:cell_size))
|
|
52
|
-
grids.put(name,grid)
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
grids.fetch(name)
|
|
56
43
|
end
|
|
57
44
|
end
|
|
58
45
|
|
|
@@ -23,23 +23,15 @@ module GameMachine
|
|
|
23
23
|
end
|
|
24
24
|
|
|
25
25
|
def authtoken_for_player(player_id)
|
|
26
|
-
|
|
26
|
+
Handlers::PlayerAuthentication.instance.authtoken_for(player_id)
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
def valid_authtoken?(player)
|
|
30
|
-
return true if public?
|
|
31
30
|
player.authtoken == authtoken_for_player(player.id)
|
|
32
31
|
end
|
|
33
32
|
|
|
34
|
-
def public?
|
|
35
|
-
Application.config.auth_handler == 'GameMachine::AuthHandlers::Public'
|
|
36
|
-
end
|
|
37
33
|
|
|
38
34
|
def authenticate!(player)
|
|
39
|
-
if public?
|
|
40
|
-
AUTHENTICATED_USERS[player.id] = player.authtoken
|
|
41
|
-
return true
|
|
42
|
-
end
|
|
43
35
|
@player = player
|
|
44
36
|
if valid_authtoken?(player)
|
|
45
37
|
register_player(player.id)
|
|
@@ -3,8 +3,9 @@ module GameMachine
|
|
|
3
3
|
class Game < Actor::Base
|
|
4
4
|
include Commands
|
|
5
5
|
|
|
6
|
-
attr_reader :destinations
|
|
6
|
+
attr_reader :destinations, :game_message_routes
|
|
7
7
|
def post_init(*args)
|
|
8
|
+
@game_message_routes = Routes.instance.game_message_routes
|
|
8
9
|
@destinations = {}
|
|
9
10
|
end
|
|
10
11
|
|
|
@@ -27,6 +28,30 @@ module GameMachine
|
|
|
27
28
|
entity = GameSystems::ObjectDbProxy.save_entity(entity)
|
|
28
29
|
end
|
|
29
30
|
|
|
31
|
+
if entity.has_game_messages
|
|
32
|
+
entity.game_messages.get_game_message_list.each do |game_message|
|
|
33
|
+
if game_message.has_destination_id
|
|
34
|
+
destination = game_message.destination_id
|
|
35
|
+
elsif game_message.has_destination
|
|
36
|
+
destination = game_message.destination
|
|
37
|
+
else
|
|
38
|
+
GameMachine.logger.warn "Unable to find destination for game message, skipping"
|
|
39
|
+
next
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
if route = game_message_routes.fetch(destination)
|
|
43
|
+
game_message.set_player_id(entity.player.id)
|
|
44
|
+
if route[:distributed]
|
|
45
|
+
Actor::Base.find_distributed(entity.player.id,route[:to]).tell(game_message)
|
|
46
|
+
else
|
|
47
|
+
Actor::Base.find(route[:to]).tell(game_message)
|
|
48
|
+
end
|
|
49
|
+
else
|
|
50
|
+
GameMachine.logger.warn "No route for destination #{destination}"
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
30
55
|
if entity.has_destination
|
|
31
56
|
unless actor_ref = destinations.fetch(entity.destination,nil)
|
|
32
57
|
destination = entity.destination.gsub('/','::')
|
|
@@ -39,7 +64,7 @@ module GameMachine
|
|
|
39
64
|
next
|
|
40
65
|
end
|
|
41
66
|
|
|
42
|
-
#
|
|
67
|
+
# DEPRECATED - convert to named routes as we do for game messages
|
|
43
68
|
component_names = entity.component_names
|
|
44
69
|
GameMachine.logger.debug("Dispatch: #{entity} #{component_names.to_a.inspect}")
|
|
45
70
|
next if component_names.empty?
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
|
|
2
|
+
# This class is set in the configuration.
|
|
3
|
+
|
|
4
|
+
# This is a simple implementation that works together with the built in
|
|
5
|
+
# user registration and login via http. User data is stored in the object database.
|
|
6
|
+
|
|
7
|
+
# The minimum necessary to implement is the authtoken_for method. That method can
|
|
8
|
+
# block as it is only called once when the client first connects and is cached
|
|
9
|
+
# internally after that. So you could make an external http call for example.
|
|
10
|
+
require 'digest/md5'
|
|
11
|
+
module GameMachine
|
|
12
|
+
module Handlers
|
|
13
|
+
class PlayerAuthentication
|
|
14
|
+
include Singleton
|
|
15
|
+
include Models
|
|
16
|
+
|
|
17
|
+
attr_reader :authclass
|
|
18
|
+
def initialize
|
|
19
|
+
@sessions = {}
|
|
20
|
+
java_import "#{AppConfig.instance.config.handlers.auth}"
|
|
21
|
+
@authclass = AppConfig.instance.config.handlers.auth.split('.').last.constantize
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def public?
|
|
25
|
+
AppConfig.instance.config.handlers.auth == "com.game_machine.authentication.PublicAuthenticator"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def get_player(username)
|
|
29
|
+
if public?
|
|
30
|
+
MessageLib::Player.new.set_id(username)
|
|
31
|
+
else
|
|
32
|
+
MessageLib::Player.store_get('players',username,2000)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Returns true if authorized, false if not
|
|
37
|
+
def authorize(username,password)
|
|
38
|
+
GameMachine.logger.info "authorize: #{username}"
|
|
39
|
+
if player = get_player(username)
|
|
40
|
+
authenticator = authclass.new(player)
|
|
41
|
+
if authenticator.authenticate(password)
|
|
42
|
+
@sessions[username] = authtoken(username,password)
|
|
43
|
+
player.set_authtoken(@sessions[username])
|
|
44
|
+
player.store_set('players')
|
|
45
|
+
return @sessions[username]
|
|
46
|
+
else
|
|
47
|
+
GameMachine.logger.info "player: #{player.id} password does not match"
|
|
48
|
+
false
|
|
49
|
+
end
|
|
50
|
+
else
|
|
51
|
+
GameMachine.logger.info "player: #{username} not found"
|
|
52
|
+
false
|
|
53
|
+
end
|
|
54
|
+
false
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Returns a session token for a logged in user. This must be a string and
|
|
58
|
+
# should not be too long, as it gets sent with every message.
|
|
59
|
+
def authtoken_for(username)
|
|
60
|
+
if authtoken = @sessions.fetch(username,nil)
|
|
61
|
+
return authtoken
|
|
62
|
+
|
|
63
|
+
# user authenticated on different server, we have to look up their authtoken
|
|
64
|
+
# and save it in the local sessions hash
|
|
65
|
+
elsif player = get_player(username)
|
|
66
|
+
if authtoken = player.authtoken
|
|
67
|
+
@sessions[username] = authtoken
|
|
68
|
+
return authtoken
|
|
69
|
+
else
|
|
70
|
+
GameMachine.logger.info "Authoken for #{username} is nil"
|
|
71
|
+
nil
|
|
72
|
+
end
|
|
73
|
+
else
|
|
74
|
+
GameMachine.logger.info "User #{username} not found"
|
|
75
|
+
nil
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
private
|
|
80
|
+
|
|
81
|
+
def authtoken(username,password)
|
|
82
|
+
Digest::MD5.hexdigest("#{username}#{password}#{rand(10000)}")
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|