void UpdateBirds(NativeWebSocket.WebSocket ws, string data) { var birdInfo = JsonConvert.DeserializeObject <BirdInfo>(data); Bird bird; if (Game.i.deadBirds.Contains(birdInfo.birdId)) { return; } BirdSpot spot = BirdSpot.GetSpotWithID(birdInfo.spotId); if (spot == null) { Debug.LogError("Found no spot with id " + birdInfo.spotId + ". Spots are (" + string.Join(", ", BirdSpot.spots.Select(o => o.id)) + ")"); return; } if ((bird = Game.i.Birds.Find(o => o.id == birdInfo.birdId)) == null) { bird = UnityEngine.Object.Instantiate(Game.i.birdPrefab).GetComponent <Bird>(); bird.id = birdInfo.birdId; bird.currentSpot = spot; bird.RefreshFromSpot(); Game.i.Birds.Add(bird); } else if (birdInfo.isFlying) { bird.FlyTo(BirdSpot.GetSpotWithID(birdInfo.spotId)); return; } if (birdInfo.isHeartbeat) { bird.Heartbeat(); return; } if (birdInfo.isFlapping) { bird.Flap(); return; } if (birdInfo.isHop) { bird.Hop(); return; } if (birdInfo.isPickingGrain) { bird.PickGrain(); return; } }
void InitializeState(NativeWebSocket.WebSocket ws, string data) { var state = JsonConvert.DeserializeObject <GameState>(data); BirdSpot.ClearAll(); Game.i.KillBowls(); Game.i.DestroyAllPlayers(); Game.i.deadBirds.Clear(); foreach (var client in state.clients) { var splitRot = client.rotation.Split(' '); Debug.Log("Spawning client " + client.id + " (observer? " + client.isObserver + ")"); if (client.isObserver) { return; } Game.i.SpawnPlayer( client.id, new Vector3(client.position.x, client.position.y, client.position.z), new Quaternion(Convert.ToSingle(splitRot[0]), Convert.ToSingle(splitRot[1]), Convert.ToSingle(splitRot[2]), Convert.ToSingle(splitRot[3])), isLocal: client.isYou ); } foreach (var spot in state.birdSpots) { Debug.Log("Loading bird spot " + spot.id); var realSpot = BirdSpot.GetUnusedSpot(); realSpot.id = spot.id; realSpot.transform.position = new Vector3(spot.position.x, spot.position.y, spot.position.z); realSpot.isRestingSpot = spot.isSafe; } foreach (var score in state.scores) { Game.i.SetScore(Convert.ToInt32(score.Key), Convert.ToInt32(score.Value)); } Debug.Log("Sending ACK"); ws.SendText(PROTOCOL_ACKNOWLEDGE_STATE + (Game.i.IsMobile ? "observer" : "")); }
IEnumerator Coroutine_FlyTo(BirdSpot spot) { isFlying = true; currentSpot = spot; float time = 0f; float delta = 1 / 60f; Vector3 startPosition = this.transform.position; while (Vector3.Distance(this.transform.position, spot.transform.position) > 0.04f) { transform.LookAt(spot.transform.position); this.transform.position = Vector3.Lerp(startPosition, spot.transform.position, time); time += delta / flightTime; yield return(new WaitForSeconds(delta)); } RefreshFromSpot(); isFlying = false; }
public void FlyTo(BirdSpot spot) { lastUpdate = DateTime.Now; StartCoroutine(Coroutine_FlyTo(spot)); }