/// <summary> /// Internal method for parsing chosen entities. /// </summary> protected void LoadEntities(Quake3Level q3lvl) { Vector3 origin = new Vector3(); float angle = 0; bool isPlayerStart = false; string[] entities = q3lvl.Entities.Split('\n'); for(int i = 0; i < entities.Length; i++) { // Remove whitespace and quotes. entities[i] = entities[i].Trim().Replace("\"", ""); if(entities[i].Length == 0) continue; string[] paramList = entities[i].Split(' '); if(paramList[0] == "origin") { float[] vector = new float[3]; for (int v = 0; v < 3; v++) vector[v] = StringConverter.ParseFloat(paramList[v + 1]); q3lvl.TransformVector(vector); origin = new Vector3(vector[0], vector[1], vector[2]); } if(paramList[0] == "angle") angle = StringConverter.ParseFloat(paramList[1]); if((paramList[0] == "classname") && (paramList[1] == "info_player_deathmatch")) isPlayerStart = true; if(paramList[0] == "}") { if(isPlayerStart) { ViewPoint vp = new ViewPoint(); vp.position = origin; if (q3lvl.Options.setYAxisUp) vp.orientation = Quaternion.FromAngleAxis(MathUtil.DegreesToRadians(angle), Vector3.UnitY); else vp.orientation = Quaternion.FromAngleAxis(MathUtil.DegreesToRadians(angle), Vector3.UnitZ); playerStarts.Add(vp); } isPlayerStart = false; } } }