/// <summary> /// Initializes this entity from serialized data. /// </summary> /// <param name="data">Array with serialized data</param> public static Entity CreateFromByteArray(byte[] data) { switch(data[OffsetEntityType]) { case EntityTypes.Player: Player player = new Player(); player.InitializeFromByteArray(ref data); return player; default: throw new UnknownEntityTypeException(data[OffsetEntityType]); } }
internal void SetPlayerConnection(Connection connection, Player player) { // check if there's a previous session active Connection previous = _Clients[player.ID]; if (previous != null) { Console.WriteLine("Disconnecting previous active session for player: " + player.PlayerName); _ClientWaits[player.ID] = new ManualResetEvent(false); ServerToClientProvider.DisconnectingNotification(previous, "New player session has been started"); _Clients.RemoveConnection(player.ID); previous.Disconnect("New player session has been started"); _ClientWaits[player.ID].WaitOne(); } _Clients.SetPlayer(connection, player); }
internal void SetPlayer(long remoteId, Player player) { Connection connection = _RemoteIdConnections[remoteId]; connection.Player = player; _EntityIdConnections[player.ID] = connection; }
internal void SetPlayer(Connection connection, Player player) { SetPlayer(connection.NetConnection.RemoteUniqueIdentifier, player); }
internal static void Draw(this Entity toDraw, Player player) { if (toDraw.ID == player.ID) { // don't draw self return; } Point3D shifted = ClientWorldManager.Instance.TempPoint; shifted.Set(toDraw.Location); // apply possible shift corrections if (player.Location.X - shifted.X > WorldHelper.HalfSizeX) { shifted.X += WorldHelper.SizeX; } else if (shifted.X - player.Location.X > WorldHelper.HalfSizeX) { shifted.X -= WorldHelper.SizeX; } if (player.Location.Z - shifted.Z > WorldHelper.HalfSizeZ) { shifted.Z += WorldHelper.SizeZ; } else if (shifted.Z - player.Location.Z > WorldHelper.HalfSizeZ) { shifted.Z -= WorldHelper.SizeZ; } if (player.Location.GetDistanceSquare(shifted) > ClientWorldManager.Instance.RenderDistance) { // don't draw too distant entities return; } if (toDraw is Player && toDraw.SkinTextureName <= 0) { // attempt to get texture toDraw.SkinTextureName = TextureManager.Instance.GetSkinTextureName(((Player)toDraw).SkinChecksum, true, Gl.GL_QUADS); } // calculate points for drawing Point3D[] boxPoints = new Point3D[] { new Point3D(shifted.X - toDraw.HalfSizeX, shifted.Y, shifted.Z - toDraw.HalfSizeX), new Point3D(shifted.X - toDraw.HalfSizeX, shifted.Y, shifted.Z + toDraw.HalfSizeX), new Point3D(shifted.X + toDraw.HalfSizeX, shifted.Y, shifted.Z - toDraw.HalfSizeX), new Point3D(shifted.X + toDraw.HalfSizeX, shifted.Y, shifted.Z + toDraw.HalfSizeX), }; foreach (Point3D boxPoint in boxPoints) { boxPoint.Rotate(shifted, toDraw.RotationLeft, 0.0f); } float x1a = boxPoints[0].X; float x1b = boxPoints[1].X; float x2a = boxPoints[2].X; float x2b = boxPoints[3].X; float y1 = shifted.Y - toDraw.HalfSizeY; float y2 = shifted.Y + toDraw.HalfSizeY; float z1a = boxPoints[0].Z; float z1b = boxPoints[2].Z; float z2a = boxPoints[1].Z; float z2b = boxPoints[3].Z; // draw the entity if (toDraw.SkinTextureName > 0) { TextureManager.Instance.ChangeTextureForQuads(toDraw.SkinTextureName); // left side Gl.glNormal3f(-1.0f, 0.0f, 0.0f); Gl.glTexCoord2f(0.25f, 0.796296f); Gl.glVertex3f(x1a, y1, z1a); Gl.glTexCoord2f(0.25f, 0.203704f); Gl.glVertex3f(x1a, y2, z1a); Gl.glTexCoord2f(0.0f, 0.203704f); Gl.glVertex3f(x1b, y2, z2a); Gl.glTexCoord2f(0.0f, 0.796296f); Gl.glVertex3f(x1b, y1, z2a); // bottom side Gl.glNormal3f(0.0f, -1.0f, 0.0f); Gl.glTexCoord2f(0.5f, 0.796296f); Gl.glVertex3f(x1a, y1, z1a); Gl.glTexCoord2f(0.25f, 0.796296f); Gl.glVertex3f(x2a, y1, z1b); Gl.glTexCoord2f(0.25f, 1.0f); Gl.glVertex3f(x2b, y1, z2b); Gl.glTexCoord2f(0.5f, 1.0f); Gl.glVertex3f(x1b, y1, z2a); // front side Gl.glNormal3f(0.0f, 0.0f, -1.0f); Gl.glTexCoord2f(0.5f, 0.796296f); Gl.glVertex3f(x1a, y1, z1a); Gl.glTexCoord2f(0.5f, 0.203704f); Gl.glVertex3f(x1a, y2, z1a); Gl.glTexCoord2f(0.25f, 0.203704f); Gl.glVertex3f(x2a, y2, z1b); Gl.glTexCoord2f(0.25f, 0.796296f); Gl.glVertex3f(x2a, y1, z1b); // right side Gl.glNormal3f(1.0f, 0.0f, 0.0f); Gl.glTexCoord2f(0.5f, 0.796296f); Gl.glVertex3f(x2a, y1, z1b); Gl.glTexCoord2f(0.5f, 0.203704f); Gl.glVertex3f(x2a, y2, z1b); Gl.glTexCoord2f(0.75f, 0.203704f); Gl.glVertex3f(x2b, y2, z2b); Gl.glTexCoord2f(0.75f, 0.796296f); Gl.glVertex3f(x2b, y1, z2b); // top side Gl.glNormal3f(0.0f, 1.0f, 0.0f); Gl.glTexCoord2f(0.5f, 0.203704f); Gl.glVertex3f(x1a, y2, z1a); Gl.glTexCoord2f(0.25f, 0.203704f); Gl.glVertex3f(x2a, y2, z1b); Gl.glTexCoord2f(0.25f, 0.0f); Gl.glVertex3f(x2b, y2, z2b); Gl.glTexCoord2f(0.5f, 0.0f); Gl.glVertex3f(x1b, y2, z2a); // back Gl.glNormal3f(0.0f, 0.0f, 1.0f); Gl.glTexCoord2f(0.75f, 0.796296f); Gl.glVertex3f(x1b, y1, z2a); Gl.glTexCoord2f(0.75f, 0.203704f); Gl.glVertex3f(x1b, y2, z2a); Gl.glTexCoord2f(1.0f, 0.203704f); Gl.glVertex3f(x2b, y2, z2b); Gl.glTexCoord2f(1.0f, 0.796296f); Gl.glVertex3f(x2b, y1, z2b); } else { // texture not loaded yet Gl.glDisable(Gl.GL_TEXTURE_2D); // left side Gl.glNormal3f(-1.0f, 0.0f, 0.0f); Gl.glVertex3f(x1a, y1, z1a); Gl.glVertex3f(x1a, y2, z1a); Gl.glVertex3f(x1b, y2, z2a); Gl.glVertex3f(x1b, y1, z2a); // bottom side Gl.glNormal3f(0.0f, -1.0f, 0.0f); Gl.glVertex3f(x1a, y1, z1a); Gl.glVertex3f(x2a, y1, z1b); Gl.glVertex3f(x2b, y1, z2b); Gl.glVertex3f(x1b, y1, z2a); // front side Gl.glNormal3f(0.0f, 0.0f, -1.0f); Gl.glVertex3f(x1a, y1, z1a); Gl.glVertex3f(x1a, y2, z1a); Gl.glVertex3f(x2a, y2, z1b); Gl.glVertex3f(x2a, y1, z1b); // right side Gl.glNormal3f(1.0f, 0.0f, 0.0f); Gl.glVertex3f(x2a, y1, z1b); Gl.glVertex3f(x2a, y2, z1b); Gl.glVertex3f(x2b, y2, z2b); Gl.glVertex3f(x2b, y1, z2b); // top side Gl.glNormal3f(0.0f, 1.0f, 0.0f); Gl.glVertex3f(x1a, y2, z1a); Gl.glVertex3f(x2a, y2, z1b); Gl.glVertex3f(x2b, y2, z2b); Gl.glVertex3f(x1b, y2, z2a); // back Gl.glNormal3f(0.0f, 0.0f, 1.0f); Gl.glVertex3f(x1b, y1, z2a); Gl.glVertex3f(x1b, y2, z2a); Gl.glVertex3f(x2b, y2, z2b); Gl.glVertex3f(x2b, y1, z2b); Gl.glEnable(Gl.GL_TEXTURE_2D); } }