[server] join game after relogin

This commit is contained in:
2019-06-10 16:12:08 +03:00
parent caab6ba3a3
commit 94b3a94cbb
10 changed files with 71 additions and 31 deletions

View File

@@ -0,0 +1,14 @@
package ru.m.display;
import flash.display.DisplayObject;
import flash.display.DisplayObjectContainer;
class DisplayObjectContainerExtender {
public static function removeChildSafety(self:DisplayObjectContainer, child:DisplayObject):DisplayObject {
if (self.contains(child)) {
return self.removeChild(child);
}
return null;
}
}

View File

@@ -22,8 +22,8 @@ class NetworkGame extends Game {
} }
private function onGameEventProto(game:GameEventResponse):Void { private function onGameEventProto(game:GameEventResponse):Void {
var time = game.time; var time = game.event.time;
var eventStr = game.event; var eventStr = game.event.event;
var event:GameEvent = Unserializer.run(eventStr); var event:GameEvent = Unserializer.run(eventStr);
gameEventSignal.emit(event); gameEventSignal.emit(event);
} }

View File

@@ -1,5 +1,6 @@
package ru.m.tankz.network; package ru.m.tankz.network;
import ru.m.tankz.proto.game.GameEventProto;
import ru.m.tankz.proto.room.SlotProto; import ru.m.tankz.proto.room.SlotProto;
import ru.m.tankz.proto.room.SlotRequest; import ru.m.tankz.proto.room.SlotRequest;
import haxe.Serializer; import haxe.Serializer;
@@ -106,9 +107,11 @@ class NetworkManager {
} }
public function action(tankId:Int, action:TankAction):Void { public function action(tankId:Int, action:TankAction):Void {
connection.send(new Request().setGameEvent(new GameEventRequest().setTime(0).setEvent( connection.send(new Request().setGameEvent(new GameEventRequest().setEvent(
Serializer.run(GameEvent.ACTION(tankId, action)) new GameEventProto().setTime(0).setEvent(
))); Serializer.run(GameEvent.ACTION(tankId, action))
)))
);
} }
private function connect():Void { private function connect():Void {

View File

@@ -21,6 +21,7 @@ import ru.m.tankz.render.item.EagleRenderItem;
import ru.m.tankz.render.item.IRenderItem; import ru.m.tankz.render.item.IRenderItem;
import ru.m.tankz.render.item.TankRenderItem; import ru.m.tankz.render.item.TankRenderItem;
import ru.m.tankz.Type; import ru.m.tankz.Type;
using ru.m.display.DisplayObjectContainerExtender;
class Render extends SpriteView implements IRender { class Render extends SpriteView implements IRender {
@@ -237,7 +238,7 @@ class Render extends SpriteView implements IRender {
return animate.play().then(function(animate:Animate):Void { return animate.play().then(function(animate:Animate):Void {
// ToDo: clean animates on reset // ToDo: clean animates on reset
if (upperLayer.contains(animate)) { if (upperLayer.contains(animate)) {
upperLayer.removeChild(animate); upperLayer.removeChildSafety(animate);
} }
animate.dispose(); animate.dispose();
}); });
@@ -252,6 +253,6 @@ class Render extends SpriteView implements IRender {
view.x = point.x - view.width / 2; view.x = point.x - view.width / 2;
view.y = point.y - view.height / 2; view.y = point.y - view.height / 2;
upperLayer.addChild(view.content); upperLayer.addChild(view.content);
Timer.delay(function() upperLayer.removeChild(view.content), 1000); Timer.delay(function() upperLayer.removeChildSafety(view.content), 1000);
} }
} }

View File

@@ -1,3 +1,8 @@
syntax = "proto3"; syntax = "proto3";
package ru.m.tankz.proto.game; package ru.m.tankz.proto.game;
message GameEventProto {
int32 time = 1;
string event = 2;
}

View File

@@ -25,13 +25,11 @@ message LogoutRequest {}
message LogoutResponse {} message LogoutResponse {}
message GameEventRequest { message GameEventRequest {
int32 time = 1; ru.m.tankz.proto.game.GameEventProto event = 1;
string event = 2;
} }
message GameEventResponse { message GameEventResponse {
int32 time = 1; ru.m.tankz.proto.game.GameEventProto event = 1;
string event = 2;
} }
message Request { message Request {

View File

@@ -1,14 +1,13 @@
package ru.m.tankz.server.game; package ru.m.tankz.server.game;
import ru.m.tankz.config.Config.PlayerControl;
import ru.m.tankz.proto.room.RoomSlotProto;
import ru.m.tankz.proto.room.SlotProto;
import ru.m.tankz.proto.room.RoomProto;
import ru.m.tankz.game.GameEvent; import ru.m.tankz.game.GameEvent;
import ru.m.tankz.game.IGame.GameListener; import ru.m.tankz.game.IGame.GameListener;
import ru.m.tankz.game.IGame; import ru.m.tankz.game.IGame;
import ru.m.tankz.proto.core.GameProto; import ru.m.tankz.proto.core.GameProto;
import ru.m.tankz.proto.core.UserProto; import ru.m.tankz.proto.core.UserProto;
import ru.m.tankz.proto.room.RoomProto;
import ru.m.tankz.proto.room.RoomSlotProto;
import ru.m.tankz.proto.room.SlotProto;
import ru.m.tankz.server.game.IGameManager; import ru.m.tankz.server.game.IGameManager;
class _GameListener implements GameListener { class _GameListener implements GameListener {

View File

@@ -23,6 +23,7 @@ interface IGameManager {
public var games(default, null):Array<ServerGame>; public var games(default, null):Array<ServerGame>;
public var gamesById(default, null):Map<Int, ServerGame>; public var gamesById(default, null):Map<Int, ServerGame>;
public var gamesByCreator(default, null):Map<String, ServerGame>; public var gamesByCreator(default, null):Map<String, ServerGame>;
public var gamesByUser(default, null):Map<String, ServerGame>;
private var createSignal(default, null):Signal<ServerGame>; private var createSignal(default, null):Signal<ServerGame>;
private var changeSignal(default, null):Signal2<ServerGame, GameChange>; private var changeSignal(default, null):Signal2<ServerGame, GameChange>;

View File

@@ -28,12 +28,23 @@ class ServerGame extends GameRunner {
return room.game.id; return room.game.id;
} }
public function contains(user:UserProto):Bool {
for (slot in room.slots) {
if (slot.hasUser() && slot.user.uuid == user.uuid) {
return true;
}
}
return false;
}
public function join(user:UserProto):Void { public function join(user:UserProto):Void {
leave(user); if (!contains(user)) {
room.users.push(user); room.users.push(user);
}
} }
public function slot(user:UserProto, slot:SlotProto):Void { public function slot(user:UserProto, slot:SlotProto):Void {
join(user);
for (s in room.slots) { for (s in room.slots) {
if (s.hasUser() && s.user.uuid == user.uuid) { if (s.hasUser() && s.user.uuid == user.uuid) {
s.clearUser(); s.clearUser();
@@ -73,6 +84,7 @@ class ServerGame extends GameRunner {
var result = []; var result = [];
result.push(EventUtil.buildBricksSpawn(engine.map)); result.push(EventUtil.buildBricksSpawn(engine.map));
result = result.concat(EventUtil.buildCellsDestroyed(engine.map)); result = result.concat(EventUtil.buildCellsDestroyed(engine.map));
result.push(START(state));
for (entity in engine.entities) { for (entity in engine.entities) {
switch EntityTypeResolver.of(entity) { switch EntityTypeResolver.of(entity) {
case EAGLE(eagle): result.push(EventUtil.buildEagleSpawn(eagle)); case EAGLE(eagle): result.push(EventUtil.buildEagleSpawn(eagle));
@@ -82,7 +94,6 @@ class ServerGame extends GameRunner {
case CELL(_): case CELL(_):
} }
} }
result.push(START(state));
return result; return result;
} }
} }

View File

@@ -1,5 +1,6 @@
package ru.m.tankz.server.session; package ru.m.tankz.server.session;
import ru.m.tankz.proto.game.GameEventProto;
import com.hurlant.crypto.extra.UUID; import com.hurlant.crypto.extra.UUID;
import com.hurlant.crypto.prng.Random; import com.hurlant.crypto.prng.Random;
import haxe.Serializer; import haxe.Serializer;
@@ -57,15 +58,26 @@ class GameSession extends ProtoSession<Response, Request> implements GameManager
} }
} }
private function logout():Void { private function logout(leave:Bool = true):Void {
gameId = -1; gameId = -1;
gameManager.disconnect(this); gameManager.disconnect(this);
if (user != null) { if (user != null && leave) {
gameManager.leave(user); gameManager.leave(user);
user = null; user = null;
} }
} }
private function join(gameId:Int, restore:Bool):Void {
this.gameId = gameId;
gameManager.join(gameId, user);
var game = gameManager.gamesById[gameId];
if (restore && game.room.game.started) {
for (event in game.restore()) {
send(new Response().setGameEvent(new GameEventResponse().setEvent(new GameEventProto().setTime(0).setEvent(Serializer.run(event)))));
}
}
}
override private function onRequest(request:Request):Void { override private function onRequest(request:Request):Void {
#if proto_debug L.d(TAG, '$tag onRequest: ${request}'); #end #if proto_debug L.d(TAG, '$tag onRequest: ${request}'); #end
try { try {
@@ -79,6 +91,9 @@ class GameSession extends ProtoSession<Response, Request> implements GameManager
.setName(request.login.name); .setName(request.login.name);
gameManager.connect(this); gameManager.connect(this);
send(new Response().setLogin(new LoginResponse().setUser(user))); send(new Response().setLogin(new LoginResponse().setUser(user)));
if (gameManager.gamesByUser.exists(user.uuid)) {
join(gameManager.gamesByUser[user.uuid].id, false);
}
// logout // logout
} else if (request.hasLogout()) { } else if (request.hasLogout()) {
logout(); logout();
@@ -90,14 +105,7 @@ class GameSession extends ProtoSession<Response, Request> implements GameManager
gameId = game.id; gameId = game.id;
send(new Response().setRoom(new RoomResponse().setRoom(game.room))); send(new Response().setRoom(new RoomResponse().setRoom(game.room)));
} else if (request.room.hasJoin()) { } else if (request.room.hasJoin()) {
gameId = request.room.join.gameId; join(request.room.join.gameId, request.room.join.restore);
gameManager.join(gameId, user);
var game = gameManager.gamesById[gameId];
if (request.room.join.restore && game.room.game.started) {
for (event in game.restore()) {
send(new Response().setGameEvent(new GameEventResponse().setTime(0).setEvent(Serializer.run(event))));
}
}
} else if (request.room.hasLeave()) { } else if (request.room.hasLeave()) {
gameManager.leave(user); gameManager.leave(user);
} else if (request.room.hasSlot()) { } else if (request.room.hasSlot()) {
@@ -113,7 +121,7 @@ class GameSession extends ProtoSession<Response, Request> implements GameManager
} }
} else if (request.hasGameEvent()) { } else if (request.hasGameEvent()) {
if (gameManager.gamesById.exists(gameId)) { if (gameManager.gamesById.exists(gameId)) {
var event:GameEvent = Unserializer.run(request.gameEvent.event); var event:GameEvent = Unserializer.run(request.gameEvent.event.event);
gameManager.gamesById[gameId].gameEventSignal.emit(event); gameManager.gamesById[gameId].gameEventSignal.emit(event);
} }
} }
@@ -125,7 +133,7 @@ class GameSession extends ProtoSession<Response, Request> implements GameManager
override public function disconnect():Void { override public function disconnect():Void {
L.d(TAG, '$tag disconnect'); L.d(TAG, '$tag disconnect');
logout(); logout(false);
super.disconnect(); super.disconnect();
} }
@@ -165,7 +173,7 @@ class GameSession extends ProtoSession<Response, Request> implements GameManager
public function onEvent(game:ServerGame, event:GameEvent):Void { public function onEvent(game:ServerGame, event:GameEvent):Void {
if (gameId == game.id) { if (gameId == game.id) {
send(new Response().setGameEvent(new GameEventResponse().setTime(0).setEvent(Serializer.run(event)))); send(new Response().setGameEvent(new GameEventResponse().setEvent(new GameEventProto().setTime(0).setEvent(Serializer.run(event)))));
} }
} }
} }