[server] join game after relogin
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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>;
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)))));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user