/// <summary> /// Send to the server a call to spawn monsters /// </summary> /// <param name="roomId"></param> /// <param name="seed"></param> /// <param name="teleport"></param> public void SpawnMonsters(int roomId, int seed, bool teleport) { ClientShareMonstersSpawnMessage shareMonstersSpawnMessage = new ClientShareMonstersSpawnMessage(); shareMonstersSpawnMessage.roomId = roomId; // the room where the monsters are spawned shareMonstersSpawnMessage.playerId = playerId; // the player who spawns the monsters shareMonstersSpawnMessage.seed = seed; shareMonstersSpawnMessage.teleport = teleport; // do I need to teleport the players to me sharingMovements = false; c.ClientSend(shareMonstersSpawnMessage); }
void Update() { if (Input.GetKeyDown(KeyCode.G)) { // Testing seed = Random.Range(0, Int32.MaxValue); dungeonGeneration.Clear(); spawner.SetServer(this); spawner.seed = seed; spawner.ClearMonsters(); dungeonGeneration.Generate(seed); } if (Input.GetKeyDown(KeyCode.K)) { //Testing for (int i = 0; i < spawner.monsters.Length; i++) { if (spawner.monsters[i] != null) { spawner.monsters[i].GetComponent <Monster>().health = 0; } } } if (Input.GetKeyDown(KeyCode.Escape)) { panelsManager.ShowMenuPanel(); } if (Input.GetKeyDown(KeyCode.Space)) { StartShooting(); } if (Input.GetKeyUp(KeyCode.Space)) { StopShooting(); } switch (state) { case GameState.STOP: break; case GameState.START: break; case GameState.GAME: speed = joystick.InputVector * Time.deltaTime * 12; player.animator.SetBool("Walking", false); // Get server player if (speed.magnitude > 0 && !player.died) { //player.transform.position += speed; Rigidbody2D playerRb2D = player.GetComponent <Rigidbody2D>(); playerRb2D.MovePosition(playerRb2D.position + speed); player.SetRotation(joystick.InputVector); player.animator.SetBool("Walking", true); } movementElapsed += Time.deltaTime; // Shooting if (player.shooting) { player.AnimateShooting(player.shootingElapsed); //Debug.Log(player.shootingElapsed); if (player.shootingElapsed >= player.frequency) { player.shootingElapsed = player.shootingElapsed % player.frequency; shootingElapsed = shootingElapsed % player.frequency; ServerShoot(); } } // Movement if (movementElapsed >= GameManager.FREQUENCY) { movementElapsed = movementElapsed % GameManager.FREQUENCY; dungeonGeneration.HighlightRoom(player); if (sharingMovements) { ShareMovements(); } else { sharingMovements = true; } } // Server movement Lerp for (int i = 0; i < nbOfPlayers; i++) { Player playerIndex = players[i].GetComponent <Player>(); Vector2 startClientPos = startPlayersPositions[i]; Vector2 endClientPos = endPlayersPositions[i]; float startClientRot = startPlayersRotations[i]; float endClientRot = endPlayersRotations[i]; float timeStartedLerping = timesStartedLerping[i]; playerIndex.shootingElapsed += Time.deltaTime; if (i != 0) { float lerpPercentage = (Time.time - timeStartedLerping) / GameManager.FREQUENCY; //Debug.Log(string.Format("lerpPercent[{0}] = (time[{1}] - tS[{2}]) / tTRG[{3}]", lerpPercentage, Time.time, timeStartedLerping, GameManager.FREQUENCY)); playerIndex.transform.position = Vector3.Lerp(startClientPos, endClientPos, lerpPercentage); float lerpedRotation = Mathf.LerpAngle(startClientRot, endClientRot, lerpPercentage); playerIndex.SetRotation(lerpedRotation); // If we havent moved then we are not walking if (Vector2.Distance(startClientPos, endClientPos) < 0.1f) { playerIndex.animator.SetBool("Walking", false); } else { playerIndex.animator.SetBool("Walking", true); } if (playerIndex.shooting) { playerIndex.AnimateShooting(playerIndex.shootingElapsed); if (playerIndex.shootingElapsed >= playerIndex.frequency) { playerIndex.shootingElapsed = playerIndex.shootingElapsed % playerIndex.frequency; ClientShoot(i); } } else { playerIndex.StopShooting(); } } } break; } // Server read received messages switch (s.received.type) { case MessageType.NONE: { } break; case MessageType.CLIENT_NEW_PLAYER: { Debug.LogError("Received Start Server from client"); AddPlayer(); SharePlayers(); } break; case MessageType.MOVEMENT: { // Received movement from client MovementMessage mm = (MovementMessage)s.received; //Debug.Log("Movement from " + mm.playerId); lastClientMovement = mm.playerId; startPlayersPositions[lastClientMovement] = players[lastClientMovement].transform.position; startPlayersRotations[lastClientMovement] = players[lastClientMovement].GetComponent <Player>().visorRotation; endPlayersRotations[lastClientMovement] = mm.visorRotation; endPlayersPositions[lastClientMovement] = new Vector3(mm.x, mm.y); players[lastClientMovement].GetComponent <Player>().shooting = mm.shooting; timesStartedLerping[lastClientMovement] = Time.time; } break; case MessageType.CLIENT_GO_TO_NEXT_ROOM: { ClientGoToNextRoomMessage goToNextRoomMessage = (ClientGoToNextRoomMessage)s.received; GoToNextRoom(goToNextRoomMessage.seed); } break; case MessageType.CLIENT_SHARE_MONSTERS_SPAWN: { ClientShareMonstersSpawnMessage shareMonstersSpawnMessage = (ClientShareMonstersSpawnMessage)s.received; //spawner.SpawnMonsters(shareMonstersSpawnMessage.roomId, shareMonstersSpawnMessage.seed); // Teleportation if (shareMonstersSpawnMessage.teleport) { Player player = players[shareMonstersSpawnMessage.playerId].GetComponent <Player>(); Vector2 teleportPosition = dungeonGeneration.GetPositionByPlayerDirection(0, shareMonstersSpawnMessage.roomId, player.GetVisorDirection()); players[0].transform.position = teleportPosition; } ShareSpawnMonsters(shareMonstersSpawnMessage.roomId, shareMonstersSpawnMessage.playerId, shareMonstersSpawnMessage.seed, shareMonstersSpawnMessage.teleport); } break; case MessageType.CLIENT_DIE: { ClientDieMessage clientDieMessage = (ClientDieMessage)s.received; players[clientDieMessage.playerId].GetComponent <Player>().SetDied(); ShareDeath(clientDieMessage.playerId); } break; } s.received.OnRead(); }