Mulligan coding x2
This commit is contained in:
parent
9f9c82474e
commit
a7052548e5
@ -44,6 +44,10 @@ public class GameConnection extends Thread {
|
|||||||
if( room.isEmpty() ||
|
if( room.isEmpty() ||
|
||||||
!room.get().getPassword().equals(handshake.getPassword()) ||
|
!room.get().getPassword().equals(handshake.getPassword()) ||
|
||||||
!room.get().getPlayers().stream().anyMatch(p -> p.getUserId().longValue() == handshake.getClientHandle()) ) {
|
!room.get().getPlayers().stream().anyMatch(p -> p.getUserId().longValue() == handshake.getClientHandle()) ) {
|
||||||
|
log.error("Handshake error details: room={}; password_equals={}; containsPlayer={}", room.isEmpty(),
|
||||||
|
room.get().getPassword().equals(handshake.getPassword()),
|
||||||
|
room.get().getPlayers().stream().anyMatch(p -> p.getUserId().longValue() == handshake.getClientHandle()));
|
||||||
|
log.error("Handshake error pwd: client={}; orig={}", handshake.getPassword(), room.get().getPassword());
|
||||||
log.error("Handshake failed!");
|
log.error("Handshake failed!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,12 @@
|
|||||||
package com.alterdekim.hearthhack.component;
|
package com.alterdekim.hearthhack.component;
|
||||||
|
|
||||||
|
import com.alterdekim.hearthhack.component.interfaces.OnRoomFullCallback;
|
||||||
import com.alterdekim.hearthhack.config.ObjectConfig;
|
import com.alterdekim.hearthhack.config.ObjectConfig;
|
||||||
import com.alterdekim.hearthhack.dto.RoomPlayerDTO;
|
import com.alterdekim.hearthhack.dto.RoomPlayerDTO;
|
||||||
import com.alterdekim.hearthhack.service.RoomService;
|
import com.alterdekim.hearthhack.service.RoomService;
|
||||||
import com.alterdekim.hearthhack.service.UserService;
|
import com.alterdekim.hearthhack.service.UserService;
|
||||||
import jakarta.annotation.PostConstruct;
|
import jakarta.annotation.PostConstruct;
|
||||||
|
import lombok.Getter;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
@ -29,7 +31,10 @@ public class GamePool {
|
|||||||
|
|
||||||
private final ConcurrentHashMap<Long, GameRoom> games = new ConcurrentHashMap<>();
|
private final ConcurrentHashMap<Long, GameRoom> games = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
private static final int PLAYERS_COUNT = 1; // TODO: MAKE 2 PLAYERS FOR PRODUCTION
|
@Getter
|
||||||
|
private final ConcurrentHashMap<Long, OnRoomFullCallback> callbacks = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
|
public static final int PLAYERS_COUNT = 2; // TODO: MAKE 2 PLAYERS FOR PRODUCTION
|
||||||
|
|
||||||
@Scheduled(fixedRate = 200)
|
@Scheduled(fixedRate = 200)
|
||||||
private void refreshRooms() {
|
private void refreshRooms() {
|
||||||
@ -40,8 +45,12 @@ public class GamePool {
|
|||||||
List<RoomPlayerDTO> players = r.getPlayers();
|
List<RoomPlayerDTO> players = r.getPlayers();
|
||||||
log.info("Put room by id: {}", r.getId());
|
log.info("Put room by id: {}", r.getId());
|
||||||
games.put(r.getId(), new GameRoom(players, userService, r.getRoomPassword(), config));
|
games.put(r.getId(), new GameRoom(players, userService, r.getRoomPassword(), config));
|
||||||
|
players.stream()
|
||||||
|
.filter(p -> callbacks.containsKey(p.getUserId()))
|
||||||
|
.forEach(p -> callbacks.get(p.getUserId()).onRoomFull());
|
||||||
roomService.removeRoom(r.getId());
|
roomService.removeRoom(r.getId());
|
||||||
});
|
});
|
||||||
|
// TODO: move gamemaster thread stuff here
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostConstruct
|
@PostConstruct
|
||||||
|
@ -245,7 +245,9 @@ public class GameRoom extends Thread implements IGameRoom {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void createGameEntity() {
|
public void createGameEntity() {
|
||||||
|
// TODO: rewrite board generation, and send each packet not via broadcast, but via target send.
|
||||||
log.info("create Game Entity");
|
log.info("create Game Entity");
|
||||||
|
for( RoomPlayerDTO player : this.players ) {
|
||||||
PegasusGame.PowerHistory powerHistory = PegasusGame.PowerHistory.newBuilder()
|
PegasusGame.PowerHistory powerHistory = PegasusGame.PowerHistory.newBuilder()
|
||||||
.addList(PegasusGame.PowerHistoryData.newBuilder()
|
.addList(PegasusGame.PowerHistoryData.newBuilder()
|
||||||
.setCreateGame(PegasusGame.PowerHistoryCreateGame.newBuilder()
|
.setCreateGame(PegasusGame.PowerHistoryCreateGame.newBuilder()
|
||||||
@ -284,28 +286,32 @@ public class GameRoom extends Thread implements IGameRoom {
|
|||||||
.setValue(TagStep.BEGIN_MULLIGAN.ordinal()) // 12
|
.setValue(TagStep.BEGIN_MULLIGAN.ordinal()) // 12
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
.addAllPlayers(createPlayersEntity())
|
.addAllPlayers(createPlayersEntity(player))
|
||||||
)
|
)
|
||||||
).build();
|
).build();
|
||||||
|
|
||||||
this.broadcast(new PegasusPacket(19, 0, powerHistory.toByteArray()));
|
this.send(player.getUserId(), new PegasusPacket(19, 0, powerHistory.toByteArray()));
|
||||||
|
}
|
||||||
|
|
||||||
this.nextGlobalState();
|
this.nextGlobalState();
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<PegasusGame.Player> createPlayersEntity() {
|
public List<PegasusGame.Player> createPlayersEntity(RoomPlayerDTO player) {
|
||||||
log.info("create Players entities");
|
log.info("create Players entities");
|
||||||
List<PegasusGame.Player> pls = new ArrayList<>();
|
List<PegasusGame.Player> pls = new ArrayList<>();
|
||||||
|
List<RoomPlayerDTO> rel_players = new ArrayList<>(Collections.singletonList(player));
|
||||||
|
players.stream().filter(p -> p.getUserId().longValue() != p.getUserId().longValue()).forEach(rel_players::add);
|
||||||
for( int i = 2, pi = 0; i < 4; i++, pi++ ) {
|
for( int i = 2, pi = 0; i < 4; i++, pi++ ) {
|
||||||
final PegasusGame.Entity.Builder entity = PegasusGame.Entity.newBuilder().setId(i == 2 ? 3 : 2);
|
final PegasusGame.Entity.Builder entity = PegasusGame.Entity.newBuilder().setId(i == 2 ? 3 : 2);
|
||||||
|
|
||||||
if( pi < this.players.size() ) {
|
if( pi < rel_players.size() ) {
|
||||||
players.get(pi).setController(i == 2 ? 2 : 1);
|
rel_players.get(pi).setController(i == 2 ? 2 : 1);
|
||||||
GameDeck gd = new GameDeck();
|
GameDeck gd = new GameDeck();
|
||||||
userService.getDeckContentForDeckId(players.get(pi).getUserId(), players.get(pi).getDeckId())
|
userService.getDeckContentForDeckId(rel_players.get(pi).getUserId(), rel_players.get(pi).getDeckId())
|
||||||
.stream()
|
.stream()
|
||||||
.map(d -> card2Entity(d.getAssetId()).get())
|
.map(d -> card2Entity(d.getAssetId()).get())
|
||||||
.forEach(gd::addCard);
|
.forEach(gd::addCard);
|
||||||
decks.put(players.get(pi).getUserId(), gd);
|
decks.put(rel_players.get(pi).getUserId(), gd);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( i == 2 ) {
|
if( i == 2 ) {
|
||||||
@ -403,7 +409,7 @@ public class GameRoom extends Thread implements IGameRoom {
|
|||||||
PegasusGame.Player.newBuilder()
|
PegasusGame.Player.newBuilder()
|
||||||
.setId(i)
|
.setId(i)
|
||||||
.setGameAccountId(bnets.get(i-2))
|
.setGameAccountId(bnets.get(i-2))
|
||||||
.setCardBack(pi < this.players.size() ? userService.getCardBackById(players.get(pi).getUserId()).getBackId() : 0)
|
.setCardBack(pi < rel_players.size() ? userService.getCardBackById(rel_players.get(pi).getUserId()).getBackId() : 0)
|
||||||
.setEntity(entity)
|
.setEntity(entity)
|
||||||
.build()
|
.build()
|
||||||
);
|
);
|
||||||
@ -414,86 +420,19 @@ public class GameRoom extends Thread implements IGameRoom {
|
|||||||
@Override
|
@Override
|
||||||
public void createDeckEntities() {
|
public void createDeckEntities() {
|
||||||
log.info("create Deck Entities");
|
log.info("create Deck Entities");
|
||||||
// sugar for debug with 1 player. Must be erased after debug.
|
this.players.forEach(this::generateDeck);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void generateDeck(RoomPlayerDTO p1) {
|
||||||
PegasusGame.PowerHistory.Builder pw = PegasusGame.PowerHistory.newBuilder();
|
PegasusGame.PowerHistory.Builder pw = PegasusGame.PowerHistory.newBuilder();
|
||||||
|
|
||||||
for(int i = 0; i < 26; i++, this.entity_id++) {
|
List<RoomPlayerDTO> rel_players = new ArrayList<>(Collections.singletonList(p1));
|
||||||
pw.addList(PegasusGame.PowerHistoryData.newBuilder()
|
players.stream().filter(p -> p.getUserId().longValue() != p.getUserId().longValue()).forEach(rel_players::add);
|
||||||
.setFullEntity(PegasusGame.PowerHistoryEntity.newBuilder()
|
|
||||||
.setEntity(this.entity_id)
|
|
||||||
.setName("")
|
|
||||||
.addTags(PegasusGame.Tag.newBuilder()
|
|
||||||
.setName(GameTag.ENTITY_ID.getValue())
|
|
||||||
.setValue(this.entity_id)
|
|
||||||
)
|
|
||||||
.addTags(PegasusGame.Tag.newBuilder()
|
|
||||||
.setName(GameTag.CONTROLLER.getValue())
|
|
||||||
.setValue(1)
|
|
||||||
)
|
|
||||||
.addTags(PegasusGame.Tag.newBuilder()
|
|
||||||
.setName(GameTag.ZONE.getValue())
|
|
||||||
.setValue(TagZone.DECK.ordinal())
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
for(int i = 1; i <= 5; i++, this.entity_id++) {
|
for( RoomPlayerDTO player : rel_players ) {
|
||||||
pw.addList(PegasusGame.PowerHistoryData.newBuilder()
|
|
||||||
.setFullEntity(PegasusGame.PowerHistoryEntity.newBuilder()
|
|
||||||
.setEntity(this.entity_id)
|
|
||||||
.setName("")
|
|
||||||
.addTags(PegasusGame.Tag.newBuilder()
|
|
||||||
.setName(GameTag.ENTITY_ID.getValue())
|
|
||||||
.setValue(this.entity_id)
|
|
||||||
)
|
|
||||||
.addTags(PegasusGame.Tag.newBuilder()
|
|
||||||
.setName(GameTag.CONTROLLER.getValue())
|
|
||||||
.setValue(1)
|
|
||||||
)
|
|
||||||
.addTags(PegasusGame.Tag.newBuilder()
|
|
||||||
.setName(GameTag.ZONE_POSITION.getValue())
|
|
||||||
.setValue(i)
|
|
||||||
)
|
|
||||||
.addTags(PegasusGame.Tag.newBuilder()
|
|
||||||
.setName(GameTag.ZONE.getValue())
|
|
||||||
.setValue(TagZone.HAND.ordinal())
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<PegasusGame.PowerHistoryEntity.Builder> ens = List.of(
|
|
||||||
card2Entity("TB_SPT_Boss").get(),
|
|
||||||
card2Entity("CS1h_001").get()
|
|
||||||
);
|
|
||||||
//this.hero_p1 = this.entity_id;
|
|
||||||
for(int i = 0; i < 2; i++, this.entity_id++) {
|
|
||||||
pw.addList(PegasusGame.PowerHistoryData.newBuilder()
|
|
||||||
.setFullEntity(ens.get(i)
|
|
||||||
.setEntity(this.entity_id)
|
|
||||||
.addTags(PegasusGame.Tag.newBuilder()
|
|
||||||
.setName(GameTag.ENTITY_ID.getValue())
|
|
||||||
.setValue(this.entity_id)
|
|
||||||
)
|
|
||||||
.addTags(PegasusGame.Tag.newBuilder()
|
|
||||||
.setName(GameTag.CONTROLLER.getValue())
|
|
||||||
.setValue(1)
|
|
||||||
)
|
|
||||||
.addTags(PegasusGame.Tag.newBuilder()
|
|
||||||
.setName(GameTag.ZONE.getValue())
|
|
||||||
.setValue(TagZone.PLAY.ordinal())
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// other player
|
|
||||||
for( RoomPlayerDTO player : this.players ) {
|
|
||||||
int di = 0;
|
int di = 0;
|
||||||
for (int i = 0; i < 26; i++, this.entity_id++, di++) {
|
for (int i = 0; i < 26; i++, this.entity_id++, di++) {
|
||||||
PegasusGame.PowerHistoryEntity.Builder b = di < this.decks.get(player.getUserId()).getSize() ? this.decks.get(player.getUserId()).getCard(di) : PegasusGame.PowerHistoryEntity.newBuilder();
|
PegasusGame.PowerHistoryEntity.Builder b = di < this.decks.get(player.getUserId()).getSize() ? this.decks.get(player.getUserId()).getCard(di) : PegasusGame.PowerHistoryEntity.newBuilder();
|
||||||
log.info("bBuilder: {}", b.getName());
|
|
||||||
pw.addList(PegasusGame.PowerHistoryData.newBuilder()
|
pw.addList(PegasusGame.PowerHistoryData.newBuilder()
|
||||||
.setFullEntity(b
|
.setFullEntity(b
|
||||||
.setEntity(this.entity_id)
|
.setEntity(this.entity_id)
|
||||||
@ -516,7 +455,6 @@ public class GameRoom extends Thread implements IGameRoom {
|
|||||||
|
|
||||||
for (int i = 1; i <= 3; i++, this.entity_id++, di++) {
|
for (int i = 1; i <= 3; i++, this.entity_id++, di++) {
|
||||||
PegasusGame.PowerHistoryEntity.Builder b = di < this.decks.get(player.getUserId()).getSize() ? this.decks.get(player.getUserId()).getCard(di) : PegasusGame.PowerHistoryEntity.newBuilder();
|
PegasusGame.PowerHistoryEntity.Builder b = di < this.decks.get(player.getUserId()).getSize() ? this.decks.get(player.getUserId()).getCard(di) : PegasusGame.PowerHistoryEntity.newBuilder();
|
||||||
log.info("HAND: {}; {}; {}; {}", b, di < this.decks.get(player.getUserId()).getSize(), di, this.decks.get(player.getUserId()).getSize());
|
|
||||||
pw.addList(PegasusGame.PowerHistoryData.newBuilder()
|
pw.addList(PegasusGame.PowerHistoryData.newBuilder()
|
||||||
.setFullEntity(b
|
.setFullEntity(b
|
||||||
.setEntity(this.entity_id)
|
.setEntity(this.entity_id)
|
||||||
@ -568,7 +506,7 @@ public class GameRoom extends Thread implements IGameRoom {
|
|||||||
this.entity_id++;
|
this.entity_id++;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.broadcast(new PegasusPacket(19, 0, pw.build().toByteArray()));
|
this.send(p1.getUserId(), new PegasusPacket(19, 0, pw.build().toByteArray()));
|
||||||
|
|
||||||
this.nextGlobalState();
|
this.nextGlobalState();
|
||||||
}
|
}
|
||||||
@ -576,10 +514,16 @@ public class GameRoom extends Thread implements IGameRoom {
|
|||||||
@Override
|
@Override
|
||||||
public void createPlayerHeroEntity() {
|
public void createPlayerHeroEntity() {
|
||||||
log.info("Player hero entity");
|
log.info("Player hero entity");
|
||||||
|
this.players.forEach(this::generateHeroes);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void generateHeroes(RoomPlayerDTO p1) {
|
||||||
PegasusGame.PowerHistory.Builder pw = PegasusGame.PowerHistory.newBuilder();
|
PegasusGame.PowerHistory.Builder pw = PegasusGame.PowerHistory.newBuilder();
|
||||||
|
|
||||||
for(RoomPlayerDTO player : players) {
|
List<RoomPlayerDTO> rel_players = new ArrayList<>(Collections.singletonList(p1));
|
||||||
|
players.stream().filter(p -> p.getUserId().longValue() != p.getUserId().longValue()).forEach(rel_players::add);
|
||||||
|
|
||||||
|
for(RoomPlayerDTO player : rel_players) {
|
||||||
Optional<Deck> deck = userService.getDecksForUser(player.getUserId())
|
Optional<Deck> deck = userService.getDecksForUser(player.getUserId())
|
||||||
.stream()
|
.stream()
|
||||||
.filter(d -> d.getId().longValue() == player.getDeckId().longValue())
|
.filter(d -> d.getId().longValue() == player.getDeckId().longValue())
|
||||||
@ -646,7 +590,7 @@ public class GameRoom extends Thread implements IGameRoom {
|
|||||||
.setChoiceType(1)
|
.setChoiceType(1)
|
||||||
.setCountMin(0)
|
.setCountMin(0)
|
||||||
.setCountMax(3)
|
.setCountMax(3)
|
||||||
.addAllEntities(decks.get(players.get(0).getUserId())
|
.addAllEntities(decks.get(rel_players.get(0).getUserId())
|
||||||
.getHandCards()
|
.getHandCards()
|
||||||
.stream()
|
.stream()
|
||||||
.map(PegasusGame.PowerHistoryEntity.Builder::getEntity)
|
.map(PegasusGame.PowerHistoryEntity.Builder::getEntity)
|
||||||
@ -656,9 +600,9 @@ public class GameRoom extends Thread implements IGameRoom {
|
|||||||
.setPlayerId(2)
|
.setPlayerId(2)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
this.broadcast(new PegasusPacket( 17, 0, entityChoices.toByteArray()));
|
this.send(p1.getUserId(), new PegasusPacket( 17, 0, entityChoices.toByteArray()));
|
||||||
|
|
||||||
this.broadcast(new PegasusPacket(19, 0, pw.build().toByteArray()));
|
this.send(p1.getUserId(), new PegasusPacket(19, 0, pw.build().toByteArray()));
|
||||||
|
|
||||||
this.entity_id++;
|
this.entity_id++;
|
||||||
|
|
||||||
@ -689,6 +633,10 @@ public class GameRoom extends Thread implements IGameRoom {
|
|||||||
this.players.forEach(p -> this.outcomeQueue.add(new OutcomeGamePacket(p.getUserId(), packet)));
|
this.players.forEach(p -> this.outcomeQueue.add(new OutcomeGamePacket(p.getUserId(), packet)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void send(Long playerId, PegasusPacket packet) {
|
||||||
|
this.outcomeQueue.add(new OutcomeGamePacket(playerId, packet));
|
||||||
|
}
|
||||||
|
|
||||||
private void nextGlobalState() {
|
private void nextGlobalState() {
|
||||||
this.globalState = GameState.next(this.globalState);
|
this.globalState = GameState.next(this.globalState);
|
||||||
}
|
}
|
||||||
|
@ -39,6 +39,9 @@ public class TcpConnection extends Thread {
|
|||||||
@Getter
|
@Getter
|
||||||
private final RoomService roomService;
|
private final RoomService roomService;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
private final GamePool gamePool;
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
private Long userId;
|
private Long userId;
|
||||||
|
@ -40,6 +40,9 @@ public class TcpServer extends ReflectionLoader<Processor> {
|
|||||||
@Autowired
|
@Autowired
|
||||||
private RoomService roomService;
|
private RoomService roomService;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private GamePool gamePool;
|
||||||
|
|
||||||
@Scheduled(fixedDelay = 5000)
|
@Scheduled(fixedDelay = 5000)
|
||||||
private void start() {
|
private void start() {
|
||||||
try {
|
try {
|
||||||
@ -59,7 +62,7 @@ public class TcpServer extends ReflectionLoader<Processor> {
|
|||||||
|
|
||||||
while(true) {
|
while(true) {
|
||||||
SSLSocket s = (SSLSocket) serverSocket.accept();
|
SSLSocket s = (SSLSocket) serverSocket.accept();
|
||||||
TcpConnection c = new TcpConnection(s, this.getParsers(), dbfConfig, userService, roomService);
|
TcpConnection c = new TcpConnection(s, this.getParsers(), dbfConfig, userService, roomService, gamePool);
|
||||||
connections.add(c);
|
connections.add(c);
|
||||||
c.start();
|
c.start();
|
||||||
log.info("New Connection Established From {}", s.getInetAddress().toString());
|
log.info("New Connection Established From {}", s.getInetAddress().toString());
|
||||||
|
@ -0,0 +1,5 @@
|
|||||||
|
package com.alterdekim.hearthhack.component.interfaces;
|
||||||
|
|
||||||
|
public interface OnRoomFullCallback {
|
||||||
|
void onRoomFull();
|
||||||
|
}
|
@ -2,14 +2,19 @@ package com.alterdekim.hearthhack.component.processor;
|
|||||||
|
|
||||||
import com.alterdekim.Protocol;
|
import com.alterdekim.Protocol;
|
||||||
import com.alterdekim.hearthhack.component.TcpConnection;
|
import com.alterdekim.hearthhack.component.TcpConnection;
|
||||||
|
import com.alterdekim.hearthhack.component.interfaces.OnRoomFullCallback;
|
||||||
import com.alterdekim.hearthhack.dto.RoomDTO;
|
import com.alterdekim.hearthhack.dto.RoomDTO;
|
||||||
import com.alterdekim.hearthhack.util.BattleNetPacket;
|
import com.alterdekim.hearthhack.util.BattleNetPacket;
|
||||||
import com.alterdekim.hearthhack.util.GameType;
|
import com.alterdekim.hearthhack.util.GameType;
|
||||||
import com.google.protobuf.ByteString;
|
import com.google.protobuf.ByteString;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.RequiredArgsConstructor;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
|
import static com.alterdekim.hearthhack.component.GamePool.PLAYERS_COUNT;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class GameMasterProcessor extends Processor {
|
public class GameMasterProcessor extends Processor {
|
||||||
|
|
||||||
@ -21,7 +26,7 @@ public class GameMasterProcessor extends Processor {
|
|||||||
// FindGameRequest FindGameResponse game_master
|
// FindGameRequest FindGameResponse game_master
|
||||||
// GameType
|
// GameType
|
||||||
Protocol.FindGameRequest gameRequest = Protocol.FindGameRequest.parseFrom(packet.getBody());
|
Protocol.FindGameRequest gameRequest = Protocol.FindGameRequest.parseFrom(packet.getBody());
|
||||||
log.info("FindGameRequest: {}", gameRequest);
|
//log.info("FindGameRequest: {}", gameRequest);
|
||||||
Protocol.Attribute a = gameRequest.getProperties().getCreationAttributesList().stream()
|
Protocol.Attribute a = gameRequest.getProperties().getCreationAttributesList().stream()
|
||||||
.filter(p -> p.hasName() && p.getName().equals("type"))
|
.filter(p -> p.hasName() && p.getName().equals("type"))
|
||||||
.findFirst()
|
.findFirst()
|
||||||
@ -62,8 +67,11 @@ public class GameMasterProcessor extends Processor {
|
|||||||
conn.send(new BattleNetPacket(header, notification.toByteArray()));
|
conn.send(new BattleNetPacket(header, notification.toByteArray()));
|
||||||
|
|
||||||
|
|
||||||
String pwd = UUID.randomUUID().toString();
|
final String uuid = UUID.randomUUID().toString();
|
||||||
Long roomId = conn.getRoomService().createRoom(new RoomDTO(pwd)); // TODO: make 1 player rooms check.
|
|
||||||
|
Long roomId = conn.getRoomService().findRoomWithPlayer().orElse(conn.getRoomService().createRoom(new RoomDTO(uuid))); // TODO: make 1 player rooms check.
|
||||||
|
log.info("Got roomID (join/create): {}", roomId);
|
||||||
|
final String pwd = conn.getRoomService().findById(roomId).orElse(new RoomDTO(uuid)).getRoomPassword();
|
||||||
conn.getRoomService().joinRoom(roomId, conn.getUserId(),
|
conn.getRoomService().joinRoom(roomId, conn.getUserId(),
|
||||||
gameRequest.getPlayerList().get(0)
|
gameRequest.getPlayerList().get(0)
|
||||||
.getAttributeList()
|
.getAttributeList()
|
||||||
@ -75,8 +83,10 @@ public class GameMasterProcessor extends Processor {
|
|||||||
.getIntValue()
|
.getIntValue()
|
||||||
); // TODO: make 1 player rooms check.
|
); // TODO: make 1 player rooms check.
|
||||||
|
|
||||||
Thread.sleep(1000L);
|
conn.getGamePool().getCallbacks().put(conn.getUserId(), new OnRoomFullCallback() {
|
||||||
|
@Override
|
||||||
|
public void onRoomFull() {
|
||||||
|
try {
|
||||||
Protocol.Notification n1 = Protocol.Notification.newBuilder()
|
Protocol.Notification n1 = Protocol.Notification.newBuilder()
|
||||||
.setType("G_RESULT")
|
.setType("G_RESULT")
|
||||||
.setSenderId(Protocol.EntityId.newBuilder()
|
.setSenderId(Protocol.EntityId.newBuilder()
|
||||||
@ -98,7 +108,7 @@ public class GameMasterProcessor extends Processor {
|
|||||||
Protocol.Variant.newBuilder()
|
Protocol.Variant.newBuilder()
|
||||||
.setMessageValue(
|
.setMessageValue(
|
||||||
Protocol.GameHandle.newBuilder()
|
Protocol.GameHandle.newBuilder()
|
||||||
.setFactoryId( (143637261465044426L * 100L) + 14L )
|
.setFactoryId((143637261465044426L * 100L) + 14L)
|
||||||
.setGameId(Protocol.EntityId.newBuilder()
|
.setGameId(Protocol.EntityId.newBuilder()
|
||||||
.setHigh(432345578572981998L)
|
.setHigh(432345578572981998L)
|
||||||
.setLow((123678367967794400L * 100L) + 12L))
|
.setLow((123678367967794400L * 100L) + 12L))
|
||||||
@ -156,7 +166,7 @@ public class GameMasterProcessor extends Processor {
|
|||||||
)
|
)
|
||||||
).build();
|
).build();
|
||||||
|
|
||||||
header = Protocol.Header.newBuilder()
|
Protocol.Header header = Protocol.Header.newBuilder()
|
||||||
.setServiceId(4)
|
.setServiceId(4)
|
||||||
.setMethodId(1)
|
.setMethodId(1)
|
||||||
.setSize(n1.getSerializedSize())
|
.setSize(n1.getSerializedSize())
|
||||||
@ -166,6 +176,11 @@ public class GameMasterProcessor extends Processor {
|
|||||||
.build();
|
.build();
|
||||||
|
|
||||||
conn.send(new BattleNetPacket(header, n1.toByteArray()));
|
conn.send(new BattleNetPacket(header, n1.toByteArray()));
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("GameMasterCallback: {}", e.getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -3,6 +3,7 @@ package com.alterdekim.hearthhack.service;
|
|||||||
import com.alterdekim.hearthhack.dto.RoomDTO;
|
import com.alterdekim.hearthhack.dto.RoomDTO;
|
||||||
import com.alterdekim.hearthhack.dto.RoomPlayerDTO;
|
import com.alterdekim.hearthhack.dto.RoomPlayerDTO;
|
||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -12,6 +13,9 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
import java.util.concurrent.ConcurrentMap;
|
import java.util.concurrent.ConcurrentMap;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static com.alterdekim.hearthhack.component.GamePool.PLAYERS_COUNT;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
@Service
|
@Service
|
||||||
public class RoomService implements IService {
|
public class RoomService implements IService {
|
||||||
|
|
||||||
@ -56,4 +60,12 @@ public class RoomService implements IService {
|
|||||||
r.getPlayers().add(new RoomPlayerDTO(userId, deckId));
|
r.getPlayers().add(new RoomPlayerDTO(userId, deckId));
|
||||||
map.put(roomId, r);
|
map.put(roomId, r);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Optional<Long> findRoomWithPlayer() {
|
||||||
|
return this.map.values()
|
||||||
|
.stream()
|
||||||
|
.filter(r -> !r.getPlayers().isEmpty() && r.getPlayers().size() < PLAYERS_COUNT)
|
||||||
|
.map(RoomDTO::getId)
|
||||||
|
.findFirst();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user