public void SendMoveRequest(DirectionEnum Enum) { var moveRequest = new MoverequestMessage(); moveRequest.Direction = (byte)Enum; SendMessage(moveRequest); }
private bool HandleMoveRequest(MoverequestMessage message, int connectID) { PlayerData playerData = serverDataHolder.players.Find(x => x.playerIndex == connectID); RoomData currentRoom = serverDataHolder.rooms[playerData.roomID[0], playerData.roomID[1]]; int[] nextRoom = serverDataHolder.GetNextRoomID(currentRoom, message.Direction); bool monsterActive = currentRoom.containsMonster && currentRoom.monsterHP > 0; //check if player can move to that direction and if the monster in current room is killed or doesnt exist if (nextRoom == null || monsterActive) { //handle requestdenied message Debug.LogWarning("Request denied"); return(false); } //if so update dataholder of server serverDataHolder.players.Find(x => x.playerIndex == connectID).roomID = nextRoom; //send room info to cplayer RoomInfoMessage newRoomMessage = serverDataHolder.GetRoomMessage(connectID); SendMessage(newRoomMessage, connections[connectID]); //send leavmessage to players who are in the previous room List <int> idsInPreviousRoom = serverDataHolder.GetPlayerIDsRoom(currentRoom); foreach (int id in idsInPreviousRoom) { if (id != connectID) { //Debug.Log("player # " + connectID + " leaves room where player # " + id + " resides "); PlayerLeftRoom(connectID, id); } } //send enter message to player who are in the next room. List <int> idsInNewRoom = serverDataHolder.GetPlayerIDsRoom(serverDataHolder.rooms[nextRoom[0], nextRoom[1]]); foreach (int id in idsInNewRoom) { if (id != connectID) { //Debug.Log("player # " + connectID + " enter room where player # " + id + " resides "); PlayerJoinedRoom(connectID, id); } } return(true); }
void Update() { networkJobHandle.Complete(); for (int i = 0; i < connections.Length; ++i) { if (!connections[i].IsCreated) { connections.RemoveAtSwapBack(i); --i; } } NetworkConnection newConnection; while ((newConnection = networkDriver.Accept()) != default) { if (connections.Length >= 4) { return; } connections.Add(newConnection); //Debug.Log("Accepted new connection"); //new player data is set //Color col = Random.ColorHSV(); Color col = ColorExtensions.colors[(ColorExtensions.RandomStartIndex + newConnection.InternalId) % ColorExtensions.colors.Length]; col.a = 1; var colour = (Color32)col; var playerID = newConnection.InternalId; var welcomeMessage = new WelcomeMessage { PlayerID = playerID, Colour = ((uint)colour.r << 24) | ((uint)colour.g << 16) | ((uint)colour.b << 8) | colour.a }; SendMessage(welcomeMessage, newConnection); //save it to list PlayerData newData = new PlayerData(); newData.color = colour; newData.playerIndex = playerID; if (serverDataHolder.players == null) { serverDataHolder.players = new List <PlayerData>(); } serverDataHolder.players.Add(newData); //Debug.Log("server data holder players count: " + serverDataHolder.players.Count); } DataStreamReader reader; for (int i = 0; i < connections.Length; ++i) { if (!connections[i].IsCreated) { continue; } NetworkEvent.Type cmd; while ((cmd = networkDriver.PopEventForConnection(connections[i], out reader)) != NetworkEvent.Type.Empty) { if (cmd == NetworkEvent.Type.Data) { var messageType = (MessageHeader.MessageType)reader.ReadUShort(); switch (messageType) { case MessageHeader.MessageType.none: StayAlive(i); break; case MessageHeader.MessageType.newPlayer: break; case MessageHeader.MessageType.welcome: break; case MessageHeader.MessageType.setName: var message = new SetNameMessage(); message.DeserializeObject(ref reader); messagesQueue.Enqueue(message); PlayerData newPlayerData = GetPlayerData(connections[i]); newPlayerData.name = message.Name; NewPlayerJoined(connections[i]); break; case MessageHeader.MessageType.playerLeft: break; case MessageHeader.MessageType.moveRequest: var moveRequest = new MoverequestMessage(); moveRequest.DeserializeObject(ref reader); //messagesQueue.Enqueue(moveRequest); bool canmove = HandleMoveRequest(moveRequest, i); if (canmove) { NextPlayerTurn(); } break; case MessageHeader.MessageType.claimTreasureRequest: var treasureRquest = new ClaimTreasureRequestMessage(); treasureRquest.DeserializeObject(ref reader); HandleTreasureClaim(treasureRquest, i); break; case MessageHeader.MessageType.leaveDungeonRequest: var leaveDungeonRequest = new LeavesDungeonRequestMessage(); leaveDungeonRequest.DeserializeObject(ref reader); HandleLeaveDungeonRequest(leaveDungeonRequest, i); break; case MessageHeader.MessageType.defendRequest: var defendRequest = new DefendRequestMessage(); defendRequest.DeserializeObject(ref reader); HandleDefendRequest(defendRequest, i); break; case MessageHeader.MessageType.attackRequest: var attackRequest = new AttackRequestMessage(); attackRequest.DeserializeObject(ref reader); HandleAttackRequest(attackRequest, i); break; default: break; } } else if (cmd == NetworkEvent.Type.Disconnect) { PlayerLeftMessage playerLeftMessage = new PlayerLeftMessage { PlayerLeftID = i }; SendMessageToAll(playerLeftMessage); Debug.Log("Client disconnected"); connections[i] = default; } } } networkJobHandle = networkDriver.ScheduleUpdate(); ProcessMessagesQueue(); }