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
|
File without changes
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package com.game_machine.core;
|
|
2
|
+
import GameMachine.Messages.ClientManagerRegister;
|
|
3
|
+
import GameMachine.Messages.Entity;
|
|
4
|
+
import GameMachine.Messages.Player;
|
|
5
|
+
import akka.actor.ActorSelection;
|
|
6
|
+
|
|
7
|
+
public class Commands {
|
|
8
|
+
|
|
9
|
+
public static void clientManagerRegister(String name) {
|
|
10
|
+
ClientManagerRegister register = new ClientManagerRegister();
|
|
11
|
+
register.setRegisterType("actor").setName(name);
|
|
12
|
+
register.setEvents("");
|
|
13
|
+
Entity entity = new Entity();
|
|
14
|
+
entity.setClientManagerRegister(register);
|
|
15
|
+
ActorSelection sel = ActorUtil.getSelectionByName("GameMachine::ClientManager");
|
|
16
|
+
sel.tell(entity, null);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
package com.game_machine.core;
|
|
2
|
+
|
|
3
|
+
import java.util.concurrent.TimeUnit;
|
|
4
|
+
|
|
5
|
+
import scala.concurrent.Await;
|
|
6
|
+
import scala.concurrent.Future;
|
|
7
|
+
import scala.concurrent.duration.Duration;
|
|
8
|
+
import GameMachine.Messages.Entity;
|
|
9
|
+
import GameMachine.Messages.ObjectdbDel;
|
|
10
|
+
import GameMachine.Messages.ObjectdbGet;
|
|
11
|
+
import GameMachine.Messages.ObjectdbPut;
|
|
12
|
+
import akka.actor.ActorSelection;
|
|
13
|
+
import akka.pattern.AskableActorSelection;
|
|
14
|
+
import akka.util.Timeout;
|
|
15
|
+
|
|
16
|
+
public class DatastoreCommands {
|
|
17
|
+
|
|
18
|
+
public static void put(Entity entity) {
|
|
19
|
+
ActorSelection sel = ActorUtil.findDistributed("GameMachine::ObjectDb", entity.id);
|
|
20
|
+
ObjectdbPut put = new ObjectdbPut().setEntity(entity);
|
|
21
|
+
sel.tell(put, null);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public static void delete(String id) {
|
|
25
|
+
ActorSelection sel = ActorUtil.findDistributed("GameMachine::ObjectDb", id);
|
|
26
|
+
ObjectdbDel del = new ObjectdbDel().setEntityId(id);
|
|
27
|
+
sel.tell(del, null);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public static Entity get(String id, int timeout) {
|
|
31
|
+
ObjectdbGet get = new ObjectdbGet().setEntityId(id);
|
|
32
|
+
ActorSelection sel = ActorUtil.findDistributed("GameMachine::ObjectDb", id);
|
|
33
|
+
Timeout t = new Timeout(Duration.create(timeout, TimeUnit.MILLISECONDS));
|
|
34
|
+
AskableActorSelection askable = new AskableActorSelection(sel);
|
|
35
|
+
Future<Object> future = askable.ask(get,t);
|
|
36
|
+
try {
|
|
37
|
+
Entity result = (Entity) Await.result(future, t.duration());
|
|
38
|
+
return result;
|
|
39
|
+
} catch (Exception e) {
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
package com.game_machine.core;
|
|
2
|
+
|
|
3
|
+
import java.sql.Connection;
|
|
4
|
+
import java.sql.SQLException;
|
|
5
|
+
import java.util.concurrent.ConcurrentHashMap;
|
|
6
|
+
|
|
7
|
+
import com.mysql.jdbc.Driver;
|
|
8
|
+
import com.zaxxer.hikari.HikariConfig;
|
|
9
|
+
import com.zaxxer.hikari.HikariDataSource;
|
|
10
|
+
|
|
11
|
+
import org.slf4j.Logger;
|
|
12
|
+
import org.slf4j.LoggerFactory;
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
public class DbConnectionPool {
|
|
16
|
+
private static final Logger logger = LoggerFactory.getLogger(DbConnectionPool.class);
|
|
17
|
+
|
|
18
|
+
public ConcurrentHashMap<String, HikariDataSource> datasources = new ConcurrentHashMap<String, HikariDataSource>();
|
|
19
|
+
|
|
20
|
+
private DbConnectionPool() {
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
private static class LazyHolder {
|
|
24
|
+
private static final DbConnectionPool INSTANCE = new DbConnectionPool();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public static DbConnectionPool getInstance() {
|
|
28
|
+
return LazyHolder.INSTANCE;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public Boolean connect(String id, String hostname, int port, String dbname, String ds, String username, String password) throws SQLException {
|
|
32
|
+
if (datasources.containsKey(id)) {
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
HikariConfig config = new HikariConfig();
|
|
37
|
+
config.setDataSourceClassName(ds);
|
|
38
|
+
config.addDataSourceProperty("serverName", hostname);
|
|
39
|
+
config.addDataSourceProperty("portNumber", port);
|
|
40
|
+
config.addDataSourceProperty("databaseName", dbname);
|
|
41
|
+
config.addDataSourceProperty("user", username);
|
|
42
|
+
config.addDataSourceProperty("password", password);
|
|
43
|
+
config.setMaximumPoolSize(10);
|
|
44
|
+
config.setIdleTimeout(0);
|
|
45
|
+
config.setLeakDetectionThreshold(10000);
|
|
46
|
+
//config.setAutoCommit(false);
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
HikariDataSource datasource = new HikariDataSource(config);
|
|
50
|
+
|
|
51
|
+
datasources.put(id, datasource);
|
|
52
|
+
return true;
|
|
53
|
+
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
public HikariDataSource getDataSource(String id) {
|
|
57
|
+
if (datasources.containsKey(id)) {
|
|
58
|
+
return datasources.get(id);
|
|
59
|
+
} else {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
public Connection getConnection(String id) throws SQLException {
|
|
65
|
+
if (datasources.containsKey(id)) {
|
|
66
|
+
return datasources.get(id).getConnection();
|
|
67
|
+
} else {
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
package com.game_machine.core;
|
|
2
|
+
|
|
3
|
+
import java.util.concurrent.ConcurrentHashMap;
|
|
4
|
+
|
|
5
|
+
import GameMachine.Messages.TrackData;
|
|
6
|
+
|
|
7
|
+
public class DefaultMovementVerifier implements MovementVerifier {
|
|
8
|
+
|
|
9
|
+
private ConcurrentHashMap<String, TrackData> trackdatas = new ConcurrentHashMap<String, TrackData>();
|
|
10
|
+
private ConcurrentHashMap<String, Long> lastUpdates = new ConcurrentHashMap<String, Long>();
|
|
11
|
+
private double maxUnitsPerSecond;
|
|
12
|
+
|
|
13
|
+
private double distance(float px, float py, float x, float y) {
|
|
14
|
+
return Math.sqrt(Math.pow(x - px, 2) + Math.pow(y - py, 2));
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public DefaultMovementVerifier(double maxUnitsPerSecond) {
|
|
18
|
+
this.maxUnitsPerSecond = maxUnitsPerSecond;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@Override
|
|
22
|
+
public boolean verify(TrackData trackData) {
|
|
23
|
+
if (!trackdatas.containsKey(trackData.id)) {
|
|
24
|
+
trackdatas.put(trackData.id, trackData);
|
|
25
|
+
lastUpdates.put(trackData.id, System.currentTimeMillis());
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// verify once per second, every update is a waste of cpu
|
|
30
|
+
Long lastUpdate = lastUpdates.get(trackData.id);
|
|
31
|
+
double seconds = (System.currentTimeMillis() - lastUpdate) / 1000;
|
|
32
|
+
if (seconds >= 1.0) {
|
|
33
|
+
TrackData previous = trackdatas.get(trackData.id);
|
|
34
|
+
|
|
35
|
+
// check distance traveled over time (basic speed hack prevention)
|
|
36
|
+
double distance = distance(previous.x,previous.y,trackData.x,trackData.y);
|
|
37
|
+
double unitsPerSecond = distance / seconds;
|
|
38
|
+
if (unitsPerSecond > maxUnitsPerSecond) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// TODO check valid movement.
|
|
43
|
+
// using pathfinding, pre calculate every possible move and save it somewhere.
|
|
44
|
+
// At startup load the data and use it to check for valid movement. Can also modify it
|
|
45
|
+
// at runtime if needed.
|
|
46
|
+
|
|
47
|
+
// In addition, check for other objects that occupy the coordinates the player is trying to move to, and
|
|
48
|
+
// deny if they are occupied. Need to look at most cost effective way to do this.
|
|
49
|
+
|
|
50
|
+
trackdatas.put(trackData.id, trackData);
|
|
51
|
+
lastUpdates.put(trackData.id, System.currentTimeMillis());
|
|
52
|
+
}
|
|
53
|
+
return true;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
package com.game_machine.core;
|
|
2
|
+
|
|
3
|
+
import java.util.ArrayList;
|
|
4
|
+
|
|
5
|
+
import GameMachine.Messages.ClientManagerEvent;
|
|
6
|
+
import GameMachine.Messages.Entity;
|
|
7
|
+
import GameMachine.Messages.Neighbors;
|
|
8
|
+
import GameMachine.Messages.Player;
|
|
9
|
+
import GameMachine.Messages.TrackData;
|
|
10
|
+
import akka.actor.ActorSelection;
|
|
11
|
+
import akka.actor.UntypedActor;
|
|
12
|
+
import akka.event.Logging;
|
|
13
|
+
import akka.event.LoggingAdapter;
|
|
14
|
+
|
|
15
|
+
public class EntityTracking extends UntypedActor {
|
|
16
|
+
|
|
17
|
+
LoggingAdapter log = Logging.getLogger(getContext().system(), this);
|
|
18
|
+
public static String name = "fastpath_entity_tracking";
|
|
19
|
+
|
|
20
|
+
private Grid aoeGrid;
|
|
21
|
+
private Grid grid;
|
|
22
|
+
private ActorSelection messageGateway;
|
|
23
|
+
|
|
24
|
+
public EntityTracking() {
|
|
25
|
+
messageGateway = ActorUtil.getSelectionByName(MessageGateway.name);
|
|
26
|
+
grid = Grid.find("default");
|
|
27
|
+
aoeGrid = Grid.find("aoe");
|
|
28
|
+
Commands.clientManagerRegister(name);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
@Override
|
|
32
|
+
public void onReceive(Object message) throws Exception {
|
|
33
|
+
|
|
34
|
+
if (message instanceof Entity) {
|
|
35
|
+
Entity entity = (Entity) message;
|
|
36
|
+
|
|
37
|
+
SendNeighbors(entity);
|
|
38
|
+
setEntityLocation(entity.trackData);
|
|
39
|
+
|
|
40
|
+
} else if (message instanceof ClientManagerEvent) {
|
|
41
|
+
ClientManagerEvent event = (ClientManagerEvent) message;
|
|
42
|
+
if (event.event.equals("disconnected")) {
|
|
43
|
+
removePlayerData(event);
|
|
44
|
+
}
|
|
45
|
+
} else {
|
|
46
|
+
unhandled(message);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
private void removePlayerData(ClientManagerEvent event) {
|
|
52
|
+
grid.remove(event.player_id);
|
|
53
|
+
aoeGrid.remove(event.player_id);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
private void SendNeighbors(Entity entity) {
|
|
57
|
+
Float x = entity.trackData.x;
|
|
58
|
+
Float y = entity.trackData.y;
|
|
59
|
+
if (x == null) {
|
|
60
|
+
x = 0f;
|
|
61
|
+
}
|
|
62
|
+
if (y == null) {
|
|
63
|
+
y = 0f;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
ArrayList<TrackData> trackDatas = grid.neighbors(x, y,
|
|
67
|
+
entity.trackData.neighborEntityType);
|
|
68
|
+
|
|
69
|
+
if (trackDatas.size() >= 1) {
|
|
70
|
+
toNeighbors(entity.player, trackDatas);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
private void SendToGateway(Player player, Neighbors neighbors) {
|
|
75
|
+
Entity playerMessage = new Entity();
|
|
76
|
+
playerMessage.setNeighbors(neighbors);
|
|
77
|
+
playerMessage.setPlayer(player);
|
|
78
|
+
playerMessage.setId(player.id);
|
|
79
|
+
messageGateway.tell(playerMessage, getSelf());
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
private void toNeighbors(Player player, ArrayList<TrackData> trackDatas) {
|
|
83
|
+
int count = 0;
|
|
84
|
+
Neighbors neighbors = new Neighbors();
|
|
85
|
+
|
|
86
|
+
for (TrackData trackData : trackDatas) {
|
|
87
|
+
neighbors.addTrackData(trackData);
|
|
88
|
+
|
|
89
|
+
count++;
|
|
90
|
+
if (count >= 30) {
|
|
91
|
+
SendToGateway(player, neighbors);
|
|
92
|
+
count = 0;
|
|
93
|
+
neighbors = new Neighbors();
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
SendToGateway(player, neighbors);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
private void setEntityLocation(TrackData trackData) {
|
|
100
|
+
|
|
101
|
+
// So either protostuff or protobuf-net has a bug where 0 floats come
|
|
102
|
+
// through as null
|
|
103
|
+
// This is *really* annoying must track down
|
|
104
|
+
if (trackData.x == null) {
|
|
105
|
+
trackData.x = 0f;
|
|
106
|
+
}
|
|
107
|
+
if (trackData.y == null) {
|
|
108
|
+
trackData.y = 0f;
|
|
109
|
+
}
|
|
110
|
+
if (trackData.z == null) {
|
|
111
|
+
trackData.z = 0f;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// TODO. If set returns false send message to the client letting them know their movement was not allowed
|
|
115
|
+
grid.set(trackData);
|
|
116
|
+
aoeGrid.set(trackData);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
}
|
|
@@ -32,7 +32,7 @@ public class EventStreamHandler extends UntypedActor {
|
|
|
32
32
|
public void onReceive(Object message) throws Exception {
|
|
33
33
|
if (message instanceof DeadLetter) {
|
|
34
34
|
DeadLetter letter = (DeadLetter) message;
|
|
35
|
-
log.
|
|
35
|
+
//log.warning("DeadLetter " + letter.message() + " " + letter.sender().toString() + " " + letter.recipient().toString());
|
|
36
36
|
// Scala creates bad class names that blow up in jruby and show up in dead letters.
|
|
37
37
|
//ActorSelection sel = ActorUtil
|
|
38
38
|
// .getSelectionByName("GameMachine::SystemMonitor");
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
package com.game_machine.core;
|
|
2
|
+
|
|
3
|
+
import java.util.concurrent.ConcurrentHashMap;
|
|
4
|
+
|
|
5
|
+
import GameMachine.Messages.Entity;
|
|
6
|
+
import GameMachine.Messages.GameMessage;
|
|
7
|
+
import GameMachine.Messages.GameMessages;
|
|
8
|
+
import akka.actor.UntypedActor;
|
|
9
|
+
|
|
10
|
+
public class GameActor extends UntypedActor {
|
|
11
|
+
|
|
12
|
+
private static ConcurrentHashMap<String, GameMessage> reliableMessages = new ConcurrentHashMap<String, GameMessage>();
|
|
13
|
+
private static ConcurrentHashMap<String, Integer> reliableMessageStatus = new ConcurrentHashMap<String, Integer>();
|
|
14
|
+
|
|
15
|
+
public String playerId;
|
|
16
|
+
public String messageId;
|
|
17
|
+
|
|
18
|
+
public void setPlayerId(String playerId) {
|
|
19
|
+
this.playerId = playerId;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
@Override
|
|
23
|
+
public void onReceive(Object message) throws Exception {
|
|
24
|
+
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
public static void removeReliableMessage(String id) {
|
|
28
|
+
if (reliableMessages.containsKey(id)) {
|
|
29
|
+
reliableMessages.remove(id);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
if (reliableMessageStatus.containsKey(id)) {
|
|
33
|
+
reliableMessageStatus.remove(id);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public boolean setReply(GameMessage gameMessage) {
|
|
38
|
+
gameMessage.messageId = this.messageId;
|
|
39
|
+
if (reliableMessageStatus.containsKey(gameMessage.messageId)) {
|
|
40
|
+
reliableMessages.put(gameMessage.messageId, gameMessage);
|
|
41
|
+
reliableMessageStatus.replace(gameMessage.messageId,1);
|
|
42
|
+
sendReply(gameMessage.messageId);
|
|
43
|
+
return true;
|
|
44
|
+
} else {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private void sendReply(String messageId) {
|
|
50
|
+
GameMessage gameMessage = reliableMessages.get(messageId);
|
|
51
|
+
Entity entity = new Entity();
|
|
52
|
+
entity.setId(messageId);
|
|
53
|
+
entity.setGameMessages(new GameMessages());
|
|
54
|
+
entity.gameMessages.addGameMessage(gameMessage);
|
|
55
|
+
PlayerCommands.sendToPlayer(entity, playerId);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
public boolean exactlyOnce(GameMessage gameMessage) {
|
|
59
|
+
if (gameMessage.hasMessageId()) {
|
|
60
|
+
if (reliableMessageStatus.containsKey(gameMessage.messageId)) {
|
|
61
|
+
int status = reliableMessageStatus.get(gameMessage.messageId);
|
|
62
|
+
if (status == 1) {
|
|
63
|
+
sendReply(gameMessage.messageId);
|
|
64
|
+
}
|
|
65
|
+
} else {
|
|
66
|
+
reliableMessageStatus.put(gameMessage.messageId, 0);
|
|
67
|
+
this.messageId = gameMessage.messageId;
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
package com.game_machine.core;
|
|
2
|
+
|
|
3
|
+
import org.slf4j.Logger;
|
|
4
|
+
import org.slf4j.LoggerFactory;
|
|
5
|
+
|
|
6
|
+
import akka.actor.ActorSystem;
|
|
7
|
+
import akka.actor.Props;
|
|
8
|
+
import akka.routing.RoundRobinPool;
|
|
9
|
+
|
|
10
|
+
public class GameMachineLoader {
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
@SuppressWarnings("unused")
|
|
15
|
+
private static final Logger log = LoggerFactory.getLogger(GameMachineLoader.class);
|
|
16
|
+
public static final Logger logger = LoggerFactory.getLogger("game_machine");
|
|
17
|
+
private static ActorSystem actorSystem;
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
public static ActorSystem getActorSystem() {
|
|
21
|
+
return actorSystem;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
public static void StartMessageGateway() {
|
|
25
|
+
actorSystem.actorOf(new RoundRobinPool(10).props(Props.create(MessageGateway.class)),
|
|
26
|
+
MessageGateway.name);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public static void StartEntityTracking() {
|
|
30
|
+
actorSystem.actorOf(new RoundRobinPool(10).props(Props.create(EntityTracking.class)),
|
|
31
|
+
EntityTracking.name);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public void run(ActorSystem newActorSystem) {
|
|
35
|
+
Thread.currentThread().setName("game-machine");
|
|
36
|
+
actorSystem = newActorSystem;
|
|
37
|
+
actorSystem.actorOf(Props.create(EventStreamHandler.class), EventStreamHandler.class.getSimpleName());
|
|
38
|
+
|
|
39
|
+
actorSystem.actorOf(new RoundRobinPool(10).props(Props.create(MessagePersister.class)),
|
|
40
|
+
MessagePersister.name);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
}
|