private void Dead() { m_MillisPerFrame = 0.07f; frameX = 0;// 7; Position = Player.SpawnPosition(); Velocity = Vector2.Zero; m_Health = MAX_HEALTH; m_Hurt = false; m_Dying = false; m_HurtCounter = 0.0f; // Send UDP pack with new health PacketDefs.PlayerHealthPacket hp = new PacketDefs.PlayerHealthPacket(m_Health); ServerManager.instance.SendUdp(m_ClientId, fastJSON.JSON.ToJSON(hp, PacketDefs.JsonParams())); }
private void CheckCollisions() { // ---- Resolve collision ---- bool contactLeft = false, contactRight = false, contactYbottom = false, contactYtop = false; Vector2 predicted_speed = this.Velocity;; float projectedMoveX, projectedMoveY, originalMoveX, originalMoveY; originalMoveX = predicted_speed.X; originalMoveY = predicted_speed.Y; // This needs to be from the qyadtree foreach (GameObject colTest in GameSimulation.instance.GetObjects()) { if ((colTest.TypeId() == GameObjectType.Wall || colTest.TypeId() == GameObjectType.DestructablePlatform) && colTest.Active) { for (int dir = 0; dir < 4; dir++) { if (dir == UP && predicted_speed.Y > 0) { continue; } if (dir == DOWN && predicted_speed.Y < 0) { continue; } if (dir == LEFT && predicted_speed.X > 0) { continue; } if (dir == RIGHT && predicted_speed.X < 0) { continue; } projectedMoveX = (dir >= LEFT ? predicted_speed.X : 0); projectedMoveY = (dir < LEFT ? predicted_speed.Y : 0); while ((colTest.Bounds().Contains(this.points[dir * 2].X + (int)this.Position.X + (int)projectedMoveX, this.points[dir * 2].Y + (int)this.Position.Y + (int)projectedMoveY) || colTest.Bounds().Contains(this.points[dir * 2 + 1].X + (int)this.Position.X + (int)projectedMoveX, this.points[dir * 2 + 1].Y + (int)this.Position.Y + (int)projectedMoveY))) { if (dir == UP) { projectedMoveY++; } if (dir == DOWN) { projectedMoveY--; } if (dir == LEFT) { projectedMoveX++; } if (dir == RIGHT) { projectedMoveX--; } } if (dir >= LEFT && dir <= RIGHT) { predicted_speed.X = projectedMoveX; } if (dir >= UP && dir <= DOWN) { predicted_speed.Y = projectedMoveY; } } // Resolve contact if (predicted_speed.Y > originalMoveY && originalMoveY < 0) { contactYtop = true; } if (predicted_speed.Y < originalMoveY && originalMoveY > 0) { contactYbottom = true; } if (predicted_speed.X - originalMoveX < -0.01f) { contactRight = true; } if (predicted_speed.X - originalMoveX > 0.01f) { contactLeft = true; } // Resolve collision from contact if (contactYbottom) { this.Velocity.Y = 0; this.Grounded = true; } else if (contactYtop) { this.Velocity.Y = 0; } if (contactLeft || contactRight) { this.Velocity.X = 0; } } else if (colTest.TypeId() == GameObjectType.Exit) { if (this.Bounds().Intersects(colTest.Bounds())) { // Stop updating this object Active = false; // Send Back to previous position this.Position = Player.SpawnPosition(); this.Velocity = Vector2.Zero; GameClient client = ServerManager.instance.GetClient(m_ClientId); if (client != null) { client.inGame = false; // NOTE** This is the only time we want to update the database (when they finish the level) client.localExpCache += 30; // Give this client some experience on database ServerManager.instance.UpdateClientExpDB(client.userName, client.localExpCache); // Send him back to the lobby : TODO Get EXP from DB PacketDefs.UpdateExpPacket flp = new PacketDefs.UpdateExpPacket(client.localExpCache, PacketDefs.ID.OUT_TCP_FinishLevel); ServerManager.instance.SendTcp(client.tcpSocket, fastJSON.JSON.ToJSON(flp, PacketDefs.JsonParams())); if (!GameSimulation.instance.ArePeopleInGame()) { // No one is in-game so clear data GameSimulation.instance.ScheduleClearGameData(); return; } } } } else if (colTest.TypeId() == GameObjectType.GoldSkull) { if (this.Bounds().Intersects(colTest.Bounds()) && colTest.Active) { colTest.Active = false; // Send out a packet here informing them it's deactivated (rather than using standward way and doing it every frame) PacketDefs.PlayerInputUpdatePacket updatePacket = new PacketDefs.PlayerInputUpdatePacket( colTest.UnqId(), colTest.Position.X, colTest.Position.Y, colTest.FrameX(), colTest.FrameY(), colTest.Active); ServerManager.instance.SendAllUdp(fastJSON.JSON.ToJSON( updatePacket, PacketDefs.JsonParams())); // Add exp for collecting skull GameClient client = ServerManager.instance.GetClient(m_ClientId); if (client != null) { client.localExpCache += 10; // Send TCP pack with new exp update, note* only hit the database to increment exp when the level is finished PacketDefs.UpdateExpPacket flp = new PacketDefs.UpdateExpPacket(client.localExpCache, PacketDefs.ID.OUT_TCP_ExpQueery); ServerManager.instance.SendTcp(client.tcpSocket, fastJSON.JSON.ToJSON(flp, PacketDefs.JsonParams())); } } } else if (IsHazard(colTest.TypeId())) { if (!m_Hurt) { if (this.Bounds().Intersects(colTest.Bounds()) && colTest.Active) { //if (Math.Abs(Velocity.X) >= 1.0f) //{ Velocity = new Vector2(-(float)m_Facing * 10, -20); //} //else //{ // Velocity.Y = -30.0f; //} m_Hurt = true; Grounded = true; m_Health -= 1; // Send UDP pack with new health PacketDefs.PlayerHealthPacket hp = new PacketDefs.PlayerHealthPacket(m_Health); ServerManager.instance.SendUdp(m_ClientId, fastJSON.JSON.ToJSON(hp, PacketDefs.JsonParams())); } } } } }