public void HitMonster(ref DataStreamReader reader) { var message = new HitMonsterMessage(); message.DeserializeObject(ref reader); dataHolder.game.cRoom.roomData.monsterHP -= message.damageDealt; Debug.Log("Hitting monster..."); if (dataHolder.game.cRoom.roomData.monsterHP <= 0) { dataHolder.game.cRoom.roomData.containsMonster = false; } dataHolder.game.cRoom.UpdateHPText(); dataHolder.game.cRoom.UpdateRoom(); }
/// <summary> /// Send to all clients when a monster gets hit. /// </summary> private void SendHitMonster(int dmg) { Client activeClient; inverseActiveDictionary.TryGetValue(currentActivePlayer, out activeClient); var message = new HitMonsterMessage() { PlayerID = activeClient.PlayerID, DamageDealt = (ushort)dmg }; foreach (Client c in clientList) { server.SendMessage(message, c.Connection); } }
public void HandleAttackRequest(AttackRequestMessage message, int connectID) { PlayerData playerData = serverDataHolder.players.Find(x => x.playerIndex == connectID); RoomData currentRoom = serverDataHolder.rooms[playerData.roomID[0], playerData.roomID[1]]; //monster adds player to target list Monster monster = serverDataHolder.activeMonsters.Find(x => x.roomID == playerData.roomID); if (!monster.targetPlayers.Contains(playerData.playerIndex)) { monster.targetPlayers.Add(playerData.playerIndex); } //check treasure even has ammount if (currentRoom.containsMonster == false) { //if not then send request denied RequestDenied(message, connectID); return; } //then update data in room currentRoom.monsterHP -= 6; if (currentRoom.monsterHP <= 0) { currentRoom.containsMonster = false; serverDataHolder.activeMonsters.Remove(serverDataHolder.activeMonsters.Find(x => x.roomID == playerData.roomID)); } //send hit message back to all players in room List <int> ids = serverDataHolder.GetOtherPlayerIDsInSameRoom(playerData); ids.Add(connectID); HitMonsterMessage hitMessage = new HitMonsterMessage() { PlayerID = connectID, damageDealt = 6 }; foreach (int id in ids) { SendMessage(hitMessage, connections[serverDataHolder.players.Find(x => x.playerIndex == id).playerIndex]); } NextPlayerTurn(); }
void Update() { networkJobHandle.Complete(); for (int i = 0; i < connections.Length; ++i) { if (!connections[i].IsCreated) { connections.RemoveAtSwapBack(i); --i; } } NetworkConnection c; while ((c = networkDriver.Accept()) != default) { if (GameHasStarted) { MakeRequestDeniedMessage(c, 0); c.Disconnect(networkDriver); return; } if (connections.Length > 4) { MakeRequestDeniedMessage(c, 1); c.Disconnect(networkDriver); return; } //Accepted Connection connections.Add(c); var colour = (Color32)UnityEngine.Random.ColorHSV(); var welcomeMessage = new WelcomeMessage { PlayerID = playerID, Colour = ((uint)colour.r << 24) | ((uint)colour.g << 16) | ((uint)colour.b << 8) | colour.a }; PlayerManager.Instance.Players.Add(new Players(playerID, "", welcomeMessage.Colour)); playerID++; NetworkManager.SendMessage(networkDriver, welcomeMessage, c); } 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: var noneMessage = NetworkManager.ReadMessage <StayAliveMessage>(reader, ServerMessageQueue); NetworkManager.SendMessage(networkDriver, noneMessage, connections[i]); break; case MessageHeader.MessageType.SetName: SetNameMessage setNameMessage = NetworkManager.ReadMessage <SetNameMessage>(reader, ServerMessageQueue) as SetNameMessage; PlayerManager.Instance.Players[i].clientName = setNameMessage.Name; var newPlayerMessage = new NewPlayerMessage() { PlayerID = PlayerManager.Instance.Players[i].playerID, PlayerColor = PlayerManager.Instance.Players[i].clientColor, PlayerName = setNameMessage.Name }; //looping through all the connections to send the new player message for (int j = 0; j < connections.Length; j++) { if (j != i) { NetworkManager.SendMessage(networkDriver, newPlayerMessage, connections[j]); var connectedPlayersMessage = new NewPlayerMessage() { PlayerID = PlayerManager.Instance.Players[j].playerID, PlayerColor = PlayerManager.Instance.Players[j].clientColor, PlayerName = PlayerManager.Instance.Players[j].clientName }; NetworkManager.SendMessage(networkDriver, connectedPlayersMessage, connections[i]); } } break; case MessageHeader.MessageType.PlayerLeft: PlayerLeftMessage leftMessage = NetworkManager.ReadMessage <PlayerLeftMessage>(reader, ServerMessageQueue) as PlayerLeftMessage; leftMessage.playerLeftID = (uint)i; for (int j = 0; j < connections.Length; j++) { if (leftMessage.playerLeftID != PlayerManager.Instance.Players[i].playerID) { NetworkManager.SendMessage(networkDriver, leftMessage, connections[i]); } } connections[i] = default; break; case MessageHeader.MessageType.MoveRequest: var moveRequest = NetworkManager.ReadMessage <MoveRequest>(reader, ServerMessageQueue); Debug.Log("MoveRequest"); if (CheckTileContent(i, TileContent.Monster) || CheckTileContent(i, TileContent.Both)) { MakeRequestDeniedMessage(i, 2); SendNewRoomInfo(); return; } MakeLeaveRoomMessage(i); PlayerManager.Instance.MovePlayer(moveRequest, i); MakeEnterRoommessage(i); SendNewRoomInfo(); MonsterTurn(); NewTurnMessage(); break; case MessageHeader.MessageType.AttackRequest: var request = NetworkManager.ReadMessage <AttackRequestMessage>(reader, serverMessagesQueue); Debug.Log(DebugTileContent(i)); if (!CheckTileContent(i, TileContent.Monster) && !CheckTileContent(i, TileContent.Both)) { Debug.Log(CheckTileContent(i, TileContent.Monster)); Debug.Log(CheckTileContent(i, TileContent.Both)); MakeRequestDeniedMessage(i, 4); SendNewRoomInfo(); return; } if (CheckTileContent(i, TileContent.Monster)) { SetTileContent(i, TileContent.None); } if (CheckTileContent(i, TileContent.Both)) { SetTileContent(i, TileContent.Treasure); } var message = new HitMonsterMessage(); NetworkManager.SendMessage(networkDriver, message, connections[i]); SendNewRoomInfo(); NewTurnMessage(); MonsterTurn(); break; case MessageHeader.MessageType.DefendRequest: NetworkManager.ReadMessage <DefendRequestMessage>(reader, serverMessagesQueue); PlayerManager.Instance.Players[i].DefendOneTurn = true; var playerDefendMessage = new PlayerDefendsMessage() { PlayerID = PlayerManager.Instance.Players[i].playerID }; Debug.Log(connections.Length); for (int j = 0; j < connections.Length; j++) { NetworkManager.SendMessage(networkDriver, playerDefendMessage, connections[j]); } SendNewRoomInfo(); NewTurnMessage(); MonsterTurn(); break; case MessageHeader.MessageType.ObtainTreasureRequest: NetworkManager.ReadMessage <ClaimTreasureRequestMessage>(reader, serverMessagesQueue); if (!CheckTileContent(i, TileContent.Treasure) && !CheckTileContent(i, TileContent.Both)) { MakeRequestDeniedMessage(i, 5); SendNewRoomInfo(); return; } if (CheckTileContent(i, TileContent.Both)) { MakeRequestDeniedMessage(i, 6); SendNewRoomInfo(); return; } Dictionary <Players, uint> players = PlayerManager.Instance.ClaimTreasureDivideItForPlayers(i); uint amount; int SendedItem = 0; foreach (KeyValuePair <Players, uint> item in players) { amount = item.Value; ObtainTreasureMessage obtainTreasure = new ObtainTreasureMessage() { Amount = (ushort)amount }; for (int j = 0; j < PlayerManager.Instance.Players.Count; j++) { if (PlayerManager.Instance.Players[j].playerID == item.Key.playerID) { NetworkManager.SendMessage(networkDriver, obtainTreasure, connections[j]); SendedItem++; } } } SetTileContent(i, TileContent.None); SendNewRoomInfo(); MonsterTurn(); NewTurnMessage(); break; case MessageHeader.MessageType.LeaveDungeonRequest: NetworkManager.ReadMessage <LeaveDungeonRequest>(reader, serverMessagesQueue); PlayerManager.Instance.PlayersWhoLeft.Add(PlayerManager.Instance.Players[i]); PlayerLeftDungeonMessage playerLeftDungeonMessage = new PlayerLeftDungeonMessage() { playerID = i }; PlayerManager.Instance.Players.RemoveAt(i); for (int j = 0; j < connections.Length; j++) { if (i != j) { NetworkManager.SendMessage(networkDriver, playerLeftDungeonMessage, connections[j]); } } if (PlayerManager.Instance.Players.Count < 1) { EndGameMessage endGameMessage = new EndGameMessage(); for (int j = 0; j < PlayerManager.Instance.PlayersWhoLeft.Count; j++) { endGameMessage.playerID.Add(PlayerManager.Instance.PlayersWhoLeft[j].playerID); endGameMessage.highScorePairs.Add((ushort)PlayerManager.Instance.PlayersWhoLeft[j].treasureAmount); NetworkManager.SendMessage(networkDriver, endGameMessage, connections[j]); connections[j].Disconnect(networkDriver); } } else { MonsterTurn(); SendNewRoomInfo(); NewTurnMessage(); } break; } } else if (cmd == NetworkEvent.Type.Disconnect) { PlayerLeftMessage leftMessage = new PlayerLeftMessage(); leftMessage.playerLeftID = (uint)i; for (int j = 0; j < connections.Length; j++) { if (leftMessage.playerLeftID != PlayerManager.Instance.Players[j].playerID) { NetworkManager.SendMessage(networkDriver, leftMessage, connections[j]); } } Debug.Log("Client disconnected"); connections[i] = default; } } } networkJobHandle = networkDriver.ScheduleUpdate(); ProcessMessagesQueue(); }