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,44 @@
|
|
|
1
|
+
package com.game_machine.core;
|
|
2
|
+
|
|
3
|
+
import GameMachine.Messages.ClientManagerEvent;
|
|
4
|
+
import GameMachine.Messages.GameMessage;
|
|
5
|
+
|
|
6
|
+
public class GameMessageActor extends GameActor {
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
public void onReceive(Object message) throws Exception {
|
|
10
|
+
if (message instanceof GameMessage) {
|
|
11
|
+
GameMessage gameMessage = (GameMessage)message;
|
|
12
|
+
setPlayerId(gameMessage.playerId);
|
|
13
|
+
onGameMessage(gameMessage);
|
|
14
|
+
} else if (message instanceof ClientManagerEvent) {
|
|
15
|
+
ClientManagerEvent clientManagerEvent = (ClientManagerEvent)message;
|
|
16
|
+
if (clientManagerEvent.event.equals("disconnected")) {
|
|
17
|
+
onPlayerDisconnect(clientManagerEvent.player_id);
|
|
18
|
+
}
|
|
19
|
+
} else {
|
|
20
|
+
unhandled(message);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
@Override
|
|
25
|
+
public void preStart() {
|
|
26
|
+
awake();
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public void awake() {
|
|
30
|
+
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public void onGameMessage(GameMessage gameMessage) {
|
|
34
|
+
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public void sendGameMessage(GameMessage gameMessage, String playerId) {
|
|
38
|
+
PlayerCommands.sendGameMessage(gameMessage, playerId);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
private void onPlayerDisconnect(String playerId) {
|
|
42
|
+
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
package com.game_machine.core;
|
|
2
|
+
|
|
3
|
+
import java.util.ArrayList;
|
|
4
|
+
import java.util.HashSet;
|
|
5
|
+
import java.util.Set;
|
|
6
|
+
import java.util.concurrent.ConcurrentHashMap;
|
|
7
|
+
|
|
8
|
+
import GameMachine.Messages.TrackData;
|
|
9
|
+
|
|
10
|
+
public class Grid {
|
|
11
|
+
|
|
12
|
+
private float max;
|
|
13
|
+
private int cellSize = 0;
|
|
14
|
+
private float convFactor;
|
|
15
|
+
private int width;
|
|
16
|
+
private int cellCount;
|
|
17
|
+
|
|
18
|
+
private MovementVerifier movementVerifier;
|
|
19
|
+
|
|
20
|
+
public static ConcurrentHashMap<String, Grid> grids = new ConcurrentHashMap<String, Grid>();
|
|
21
|
+
|
|
22
|
+
private ConcurrentHashMap<String, TrackData> deltaIndex = new ConcurrentHashMap<String, TrackData>();
|
|
23
|
+
private ConcurrentHashMap<String, TrackData> objectIndex = new ConcurrentHashMap<String, TrackData>();
|
|
24
|
+
private ConcurrentHashMap<String, Integer> cellsIndex = new ConcurrentHashMap<String, Integer>();
|
|
25
|
+
private ConcurrentHashMap<Integer, ConcurrentHashMap<String, TrackData>> cells = new ConcurrentHashMap<Integer, ConcurrentHashMap<String, TrackData>>();
|
|
26
|
+
private ConcurrentHashMap<Integer, Set<Integer>> cellsCache = new ConcurrentHashMap<Integer, Set<Integer>>();
|
|
27
|
+
|
|
28
|
+
public static void resetGrids()
|
|
29
|
+
{
|
|
30
|
+
grids = new ConcurrentHashMap<String, Grid>();
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
public static synchronized Grid findOrCreate(String name, int gridSize, int cellSize) {
|
|
34
|
+
if (grids.containsKey(name)) {
|
|
35
|
+
return grids.get(name);
|
|
36
|
+
} else {
|
|
37
|
+
Grid grid = new Grid(gridSize,cellSize);
|
|
38
|
+
grids.put(name, grid);
|
|
39
|
+
return grid;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public static Grid find(String name) {
|
|
44
|
+
if (grids.containsKey(name)) {
|
|
45
|
+
return grids.get(name);
|
|
46
|
+
} else {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public Grid(int max, int cellSize) {
|
|
52
|
+
this.max = max;
|
|
53
|
+
this.cellSize = cellSize;
|
|
54
|
+
this.convFactor = 1.0f / this.cellSize;
|
|
55
|
+
this.width = (int) (this.max / this.cellSize);
|
|
56
|
+
this.cellCount = this.width * this.width;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public void setMovementVerifier(MovementVerifier movementVerifier) {
|
|
60
|
+
this.movementVerifier = movementVerifier;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
public int getWidth() {
|
|
64
|
+
return this.width;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
public int getCellCount() {
|
|
68
|
+
return this.cellCount;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
public Set<Integer> cellsWithinRadius(float x, float y) {
|
|
72
|
+
int cellHash = hash(x, y);
|
|
73
|
+
return cellsWithinRadius(cellHash, x, y);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
public Set<Integer> cellsWithinRadius(int cellHash, float x, float y) {
|
|
77
|
+
int key = cellHash;
|
|
78
|
+
Set<Integer> cells = cellsCache.get(key);
|
|
79
|
+
if (cells != null) {
|
|
80
|
+
return cells;
|
|
81
|
+
}
|
|
82
|
+
cells = new HashSet<Integer>();
|
|
83
|
+
|
|
84
|
+
int offset = this.cellSize;
|
|
85
|
+
|
|
86
|
+
int startX = (int) (x - offset);
|
|
87
|
+
int startY = (int) (y - offset);
|
|
88
|
+
int endX = (int) (x + offset);
|
|
89
|
+
int endY = (int) (y + offset);
|
|
90
|
+
|
|
91
|
+
for (int rowNum = startX; rowNum <= endX; rowNum += this.cellSize) {
|
|
92
|
+
for (int colNum = startY; colNum <= endY; colNum += this.cellSize) {
|
|
93
|
+
if (rowNum >= 0 && colNum >= 0) {
|
|
94
|
+
cells.add(hash(rowNum, colNum));
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
cellsCache.put(key, cells);
|
|
99
|
+
return cells;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
public ArrayList<TrackData> neighbors(float x, float y, String entityType) {
|
|
103
|
+
int myCell = hash(x, y);
|
|
104
|
+
return neighbors(myCell, x, y, entityType);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// This could be optimized more (and gridValuesInCell), but it's simply dwarfed by
|
|
108
|
+
// the overhead of serialization that at this point it's not really worth it.
|
|
109
|
+
// - entityType should be an integer
|
|
110
|
+
// - where we call gridValuesInCell, filter out by entity type there.
|
|
111
|
+
// - and then just concat the return values of gridValuesInCell instead of building
|
|
112
|
+
// result one item at a time
|
|
113
|
+
public ArrayList<TrackData> neighbors(int myCell, float x, float y, String entityType) {
|
|
114
|
+
ArrayList<TrackData> result;
|
|
115
|
+
|
|
116
|
+
TrackData[] gridValues;
|
|
117
|
+
result = new ArrayList<TrackData>();
|
|
118
|
+
Set<Integer> cells = cellsWithinRadius(myCell, x, y);
|
|
119
|
+
for (int cell : cells) {
|
|
120
|
+
gridValues = gridValuesInCell(cell);
|
|
121
|
+
if (gridValues != null) {
|
|
122
|
+
for (TrackData gridValue : gridValues) {
|
|
123
|
+
if (gridValue != null) {
|
|
124
|
+
if (entityType == null) {
|
|
125
|
+
result.add(gridValue);
|
|
126
|
+
} else if (gridValue.entityType.equals(entityType)) {
|
|
127
|
+
result.add(gridValue);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return result;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
public TrackData[] gridValuesInCell(int cell) {
|
|
137
|
+
ConcurrentHashMap<String, TrackData> cellGridValues = cells.get(cell);
|
|
138
|
+
|
|
139
|
+
if (cellGridValues != null) {
|
|
140
|
+
TrackData[] a = new TrackData[cellGridValues.size()];
|
|
141
|
+
cellGridValues.values().toArray(a);
|
|
142
|
+
return a;
|
|
143
|
+
// return cellGridValues.values();
|
|
144
|
+
} else {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
public void updateFromDelta(TrackData[] gridValues) {
|
|
150
|
+
for (TrackData gridValue : gridValues) {
|
|
151
|
+
if (gridValue != null) {
|
|
152
|
+
objectIndex.put(gridValue.id, gridValue);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
public TrackData[] currentDelta() {
|
|
158
|
+
TrackData[] a = new TrackData[deltaIndex.size()];
|
|
159
|
+
deltaIndex.values().toArray(a);
|
|
160
|
+
deltaIndex.clear();
|
|
161
|
+
return a;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
public ArrayList<TrackData> getNeighborsFor(String id, String entityType) {
|
|
165
|
+
TrackData gridValue = get(id);
|
|
166
|
+
if (gridValue == null)
|
|
167
|
+
{
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
return neighbors(gridValue.x, gridValue.y, entityType);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
public TrackData get(String id) {
|
|
174
|
+
return objectIndex.get(id);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
public void remove(String id) {
|
|
178
|
+
TrackData indexValue = objectIndex.get(id);
|
|
179
|
+
if (indexValue != null) {
|
|
180
|
+
int cell = cellsIndex.get(id);
|
|
181
|
+
ConcurrentHashMap<String, TrackData> cellGridValues = cells.get(cell);
|
|
182
|
+
if (cellGridValues != null) {
|
|
183
|
+
cellGridValues.remove(id);
|
|
184
|
+
}
|
|
185
|
+
objectIndex.remove(id);
|
|
186
|
+
cellsIndex.remove(id);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
public Boolean set(String id, float x, float y, float z, String entityType) {
|
|
191
|
+
TrackData trackData = new TrackData();
|
|
192
|
+
trackData.id = id;
|
|
193
|
+
trackData.x = x;
|
|
194
|
+
trackData.y = y;
|
|
195
|
+
trackData.z = z;
|
|
196
|
+
trackData.entityType = entityType;
|
|
197
|
+
return set(trackData);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
public Boolean set(TrackData trackData) {
|
|
201
|
+
|
|
202
|
+
if (trackData.entityType.equals("player")) {
|
|
203
|
+
if (movementVerifier != null) {
|
|
204
|
+
if (!movementVerifier.verify(trackData)) {
|
|
205
|
+
return false;
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
|
|
211
|
+
Boolean hasExisting = false;
|
|
212
|
+
Integer oldCellValue = -1;
|
|
213
|
+
String id = trackData.id;
|
|
214
|
+
|
|
215
|
+
if (objectIndex.containsKey(id)) {
|
|
216
|
+
hasExisting = true;
|
|
217
|
+
oldCellValue = cellsIndex.get(id);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
int cell = hash(trackData.x, trackData.y);
|
|
221
|
+
|
|
222
|
+
if (hasExisting) {
|
|
223
|
+
if (oldCellValue != cell) {
|
|
224
|
+
ConcurrentHashMap<String, TrackData> cellGridValues = cells.get(oldCellValue);
|
|
225
|
+
cellGridValues.remove(id);
|
|
226
|
+
if (cellGridValues.size() == 0) {
|
|
227
|
+
cells.remove(oldCellValue);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
}
|
|
231
|
+
objectIndex.replace(id, trackData);
|
|
232
|
+
cellsIndex.replace(id, cell);
|
|
233
|
+
} else {
|
|
234
|
+
cellsIndex.put(id, cell);
|
|
235
|
+
objectIndex.put(id, trackData);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (!cells.containsKey(cell)) {
|
|
239
|
+
cells.put(cell, new ConcurrentHashMap<String, TrackData>());
|
|
240
|
+
}
|
|
241
|
+
cells.get(cell).put(id, trackData);
|
|
242
|
+
|
|
243
|
+
//deltaIndex.put(id, gridValue);
|
|
244
|
+
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
public int hash2(float x, float y) {
|
|
249
|
+
return (int) (Math.floor(x / this.cellSize) + Math.floor(y / this.cellSize) * width);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
public int hash(float x, float y) {
|
|
253
|
+
return (int) ((x * this.convFactor)) + (int) ((y * this.convFactor)) * this.width;
|
|
254
|
+
}
|
|
255
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
package com.game_machine.core;
|
|
2
|
+
|
|
3
|
+
import java.util.ArrayList;
|
|
4
|
+
import java.util.List;
|
|
5
|
+
import java.util.concurrent.ConcurrentHashMap;
|
|
6
|
+
|
|
7
|
+
import org.slf4j.Logger;
|
|
8
|
+
import org.slf4j.LoggerFactory;
|
|
9
|
+
|
|
10
|
+
import akka.routing.ConsistentHash;
|
|
11
|
+
|
|
12
|
+
public class Hashring {
|
|
13
|
+
|
|
14
|
+
private static final Logger log = LoggerFactory.getLogger(Hashring.class);
|
|
15
|
+
public static ConcurrentHashMap<String, Hashring> hashrings = new ConcurrentHashMap<String, Hashring>();
|
|
16
|
+
|
|
17
|
+
private ConsistentHash<String> hash;
|
|
18
|
+
public String name;
|
|
19
|
+
public List<String> nodes = new ArrayList<String>();
|
|
20
|
+
|
|
21
|
+
public static void dump() {
|
|
22
|
+
for (String key : hashrings.keySet()) {
|
|
23
|
+
Hashring ring = hashrings.get(key);
|
|
24
|
+
log.warn("Ring: "+key);
|
|
25
|
+
for (String node : ring.nodes) {
|
|
26
|
+
log.warn("Node: "+node);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public static void addHashring(String name, Hashring ring) {
|
|
32
|
+
hashrings.put(name, ring);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public static void removeHashring(String name) {
|
|
36
|
+
hashrings.remove(name);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public static Hashring getHashring(String name) {
|
|
40
|
+
return hashrings.get(name);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public Hashring(String name, List<String> nodes, int vnodes) {
|
|
44
|
+
for (String node : nodes) {
|
|
45
|
+
this.nodes.add(node);
|
|
46
|
+
}
|
|
47
|
+
this.name = name;
|
|
48
|
+
hash = ConsistentHash.create(nodes, vnodes);
|
|
49
|
+
addHashring(name,this);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
public void addNode(String node) {
|
|
53
|
+
hash = hash.add(node);
|
|
54
|
+
nodes.add(node);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public void removeNode(String node) {
|
|
58
|
+
hash = hash.remove(node);
|
|
59
|
+
nodes.remove(node);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
public String nodeFor(String key) {
|
|
63
|
+
return hash.nodeFor(key);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
package com.game_machine.core;
|
|
2
|
+
|
|
3
|
+
import static com.dyuproject.protostuff.LinkedBuffer.allocate;
|
|
4
|
+
import com.dyuproject.protostuff.LinkedBuffer;
|
|
5
|
+
|
|
6
|
+
public class LocalLinkedBuffer {
|
|
7
|
+
|
|
8
|
+
static int bufferSize = 2048;
|
|
9
|
+
|
|
10
|
+
private static final ThreadLocal<LinkedBuffer> localBuffer = new ThreadLocal<LinkedBuffer>() {
|
|
11
|
+
@Override
|
|
12
|
+
protected LinkedBuffer initialValue() {
|
|
13
|
+
return allocate(bufferSize);
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
public static LinkedBuffer get() {
|
|
18
|
+
return localBuffer.get();
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
package com.game_machine.core;
|
|
2
|
+
|
|
3
|
+
import java.util.List;
|
|
4
|
+
import java.util.concurrent.ConcurrentHashMap;
|
|
5
|
+
import java.util.concurrent.atomic.AtomicInteger;
|
|
6
|
+
|
|
7
|
+
import GameMachine.Messages.ClientManagerEvent;
|
|
8
|
+
import GameMachine.Messages.ClientMessage;
|
|
9
|
+
import GameMachine.Messages.Entity;
|
|
10
|
+
import GameMachine.Messages.Player;
|
|
11
|
+
import akka.actor.ActorSelection;
|
|
12
|
+
import akka.actor.UntypedActor;
|
|
13
|
+
import akka.event.Logging;
|
|
14
|
+
import akka.event.LoggingAdapter;
|
|
15
|
+
|
|
16
|
+
public class MessageGateway extends UntypedActor {
|
|
17
|
+
|
|
18
|
+
public static AtomicInteger messageCount;
|
|
19
|
+
public static ConcurrentHashMap<String, NetMessage> netMessages = new ConcurrentHashMap<String, NetMessage>();
|
|
20
|
+
public static String name = "message_gateway";
|
|
21
|
+
|
|
22
|
+
LoggingAdapter log = Logging.getLogger(getContext().system(), this);
|
|
23
|
+
private ActorSelection udpIncoming;
|
|
24
|
+
private ActorSelection entityTracking;
|
|
25
|
+
private UdpServer udpServer;
|
|
26
|
+
private Boolean fastpathOnly;
|
|
27
|
+
|
|
28
|
+
public MessageGateway() {
|
|
29
|
+
udpServer = UdpServer.getUdpServer();
|
|
30
|
+
udpIncoming = ActorUtil
|
|
31
|
+
.getSelectionByName("GameMachine::Endpoints::UdpIncoming");
|
|
32
|
+
entityTracking = ActorUtil
|
|
33
|
+
.getSelectionByName("fastpath_entity_tracking");
|
|
34
|
+
Commands.clientManagerRegister(name);
|
|
35
|
+
messageCount = new AtomicInteger();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
@Override
|
|
39
|
+
public void onReceive(Object message) throws Exception {
|
|
40
|
+
|
|
41
|
+
// Incoming message
|
|
42
|
+
if (message instanceof NetMessage) {
|
|
43
|
+
messageCount.incrementAndGet();
|
|
44
|
+
NetMessage netMessage = (NetMessage) message;
|
|
45
|
+
ClientMessage clientMessage;
|
|
46
|
+
|
|
47
|
+
if (netMessage.protocol == NetMessage.UDP) {
|
|
48
|
+
clientMessage = ClientMessage.parseFrom(netMessage.bytes);
|
|
49
|
+
} else if (netMessage.protocol == NetMessage.TCP) {
|
|
50
|
+
clientMessage = netMessage.clientMessage;
|
|
51
|
+
} else {
|
|
52
|
+
clientMessage = null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
if (!netMessages.containsKey(clientMessage.player.id)) {
|
|
56
|
+
netMessages.put(clientMessage.player.id, netMessage);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
List<Entity> entities = clientMessage.getEntityList();
|
|
61
|
+
|
|
62
|
+
if (entities == null) {
|
|
63
|
+
udpIncoming.tell(message, null);
|
|
64
|
+
} else {
|
|
65
|
+
fastpathOnly = true;
|
|
66
|
+
for (Entity entity : clientMessage.getEntityList()) {
|
|
67
|
+
if (entity.hasFastpath()) {
|
|
68
|
+
routeFastpath(clientMessage.player, entity);
|
|
69
|
+
} else {
|
|
70
|
+
fastpathOnly = false;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
if (!fastpathOnly) {
|
|
75
|
+
udpIncoming.tell(message, null);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
// outgoing message
|
|
82
|
+
} else if (message instanceof Entity) {
|
|
83
|
+
Entity entity = (Entity) message;
|
|
84
|
+
NetMessage netMessage = netMessages.get(entity.player.id);
|
|
85
|
+
ClientMessage clientMessage = new ClientMessage();
|
|
86
|
+
clientMessage.addEntity(entity);
|
|
87
|
+
|
|
88
|
+
if (netMessage.protocol == NetMessage.UDP) {
|
|
89
|
+
// ByteBuf bb = clientMessage.toByteBuf();
|
|
90
|
+
// udpServer.sendToClient(bb, netMessage.host, netMessage.port,
|
|
91
|
+
// netMessage.ctx);
|
|
92
|
+
|
|
93
|
+
byte[] bytes = clientMessage.toByteArray();
|
|
94
|
+
udpServer.sendToClient(netMessage.address, bytes,
|
|
95
|
+
netMessage.ctx);
|
|
96
|
+
} else if (netMessage.protocol == NetMessage.TCP) {
|
|
97
|
+
netMessage.ctx.write(clientMessage);
|
|
98
|
+
UdpServerHandler.countOut.getAndIncrement();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
} else if (message instanceof ClientManagerEvent) {
|
|
102
|
+
// log.warning("Message gateway got client manager event");
|
|
103
|
+
ClientManagerEvent event = (ClientManagerEvent) message;
|
|
104
|
+
if (event.event.equals("disconnected")) {
|
|
105
|
+
netMessages.remove(event.player_id);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
private void routeFastpath(Player player, Entity entity) {
|
|
112
|
+
entity.setPlayer(player);
|
|
113
|
+
if (entity.hasTrackData()) {
|
|
114
|
+
entityTracking.tell(entity, getSelf());
|
|
115
|
+
} else {
|
|
116
|
+
log.warning("Unable to find destination for entity id " + entity.id);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
}
|