public override void SetupInstance(BSPFile bsp, entity entity, SceneEntities entities) { base.SetupInstance(bsp, entity, entities); if (string.IsNullOrEmpty(this.message)) { Debug.LogError("Can't set skill: message is null or empty"); return; } int value; if (!int.TryParse(this.message, out value)) { Debug.LogError("Can't set skill: invalid message '" + this.message + "'"); return; } if (!Enum.IsDefined(typeof(GameSkill), value)) { Debug.LogError("Can't set skill: invalid GameSkill value '" + value + "'"); return; } var trigger = entity.GetComponent <trigger_setskill>(); trigger.skill = (GameSkill)value; }
public override void SetupInstance(BSPFile bsp, entity entity, SceneEntities entities) { base.SetupInstance(bsp, entity, entities); var door = entity as func_door; SetupTrigger(door); SetupItems(door); SetupMovement(door); }
/// <summary> /// Loads all entities from the provided file. If it already exists will return object. /// </summary> /// <param name="filename">File to load from</param> /// <returns></returns> public static Entity[] LoadSceneEntities(string filename) { Entity[] entities; entityDictionary.TryGetValue(filename, out entities); if (entities == null) { entities = SceneEntities.LoadObject(filename); } return(entities); }
public override void SetupInstance(BSPFile bsp, entity entity, SceneEntities entities) { base.SetupInstance(bsp, entity, entities); if (angle >= 0 && angle < 360) { entity.transform.rotation = Quaternion.AngleAxis(90 - angle, Vector3.up); } else { Debug.LogError("Unexpected angle: " + angle); } }
public override void SetupInstance(BSPFile bsp, entity entity, SceneEntities entities) { base.SetupInstance(bsp, entity, entities); var collider = entity.GetComponent <BoxCollider>(); var colliderSize = this.size; colliderSize.x += 0.4f; colliderSize.y += 0.4f; colliderSize.z += 0.4f; collider.size = colliderSize; }
public virtual void SetupInstance(BSPFile bsp, entity entity, SceneEntities entities) { if (this.target != -1) { var targetName = entities.FindTargetName(this.target); if (targetName == null) { Debug.LogError("Can't find entity with target name: " + this.target); } var target = entity.gameObject.AddComponent <EntityTarget>(); target.targetName = targetName; } var instanceFields = ReflectionUtils.ListFields(entity); var dataFields = ReflectionUtils.ListFields(this); foreach (var name in instanceFields.Keys) { FieldInfo dataField; if (dataFields.TryGetValue(name, out dataField)) { object value = dataField.GetValue(this); if (dataField.GetCustomAttribute <BSPTransformAttribute>() != null) { Type fieldType = dataField.FieldType; if (fieldType == typeof(int)) { value = BSPFile.Scale((int)value); } else if (fieldType == typeof(float)) { value = BSPFile.Scale((float)value); } else if (fieldType == typeof(Vector3)) { value = BSPFile.TransformVector((Vector3)value); } else { throw new NotImplementedException("Unexpected field type: " + fieldType); } } FieldInfo instanceField = instanceFields[name]; instanceField.SetValue(entity, value); } } }
public override void SetupInstance(BSPFile bsp, entity entity, SceneEntities entities) { base.SetupInstance(bsp, entity, entities); if (modelRef != null) { var collider = entity.GetComponent <BoxCollider>(); collider.size = this.size; } if (health > 0) { entity.gameObject.layer = LayerMask.NameToLayer("ShootTrigger"); } }
public override void SetupInstance(BSPFile bsp, entity entity, SceneEntities entities) { base.SetupInstance(bsp, entity, entities); if (this.spawnflags == 1) // not sure what this value means but it might be "crucified" { var rigidBoby = entity.GetComponent <Rigidbody>(); if (rigidBoby != null) { GameObject.DestroyImmediate(rigidBoby); } var collider = entity.GetComponent <BoxCollider>(); if (collider != null) { GameObject.DestroyImmediate(collider); } var zombie = entity as monster_zombie; zombie.crucified = true; } }
static void GenerateLevel(BSPFile bsp, IList <Material> materials) { Level level = GameObject.FindObjectOfType <Level>(); if (level != null) { level.Clear(); } else { GameObject levelObject = new GameObject("Level"); level = levelObject.AddComponent <Level>(); } bool[] used = new bool[bsp.faces.Length]; int modelNum = 0; foreach (var model in bsp.models) { float progress = ((float)++modelNum) / bsp.models.Length; if (EditorUtility.DisplayCancelableProgressBar("Level", "Generating models", progress)) { return; } GenerateModel(bsp, level, model, materials, used); } GameObject entitiesParent = new GameObject("Entities"); entitiesParent.isStatic = true; entitiesParent.transform.parent = level.transform; var groupParentLookup = new Dictionary <string, GameObject>(); var entityList = new SceneEntities(); for (int i = 0; i < bsp.entities.Length; ++i) { float progress = ((float)(i + 1)) / bsp.entities.Length; if (EditorUtility.DisplayCancelableProgressBar("Level", "Generating entities...", progress)) { return; } var entity = bsp.entities[i]; var entityInstance = GenerateEntity(bsp, entity, materials, used); entityList.Add(entity, entityInstance); if (entityInstance != null) { Type entityType = entity.GetType(); var groupAttribute = entityType.GetCustomAttribute <EntityGroupAttribute>(true); if (groupAttribute != null) { var groupName = groupAttribute.group; GameObject groupParent; if (!groupParentLookup.TryGetValue(groupName, out groupParent)) { groupParent = new GameObject(groupName); groupParent.isStatic = entitiesParent.isStatic; groupParent.transform.parent = entitiesParent.transform; groupParentLookup[groupName] = groupParent; } entityInstance.transform.parent = groupParent.transform; } else { entityInstance.transform.parent = entitiesParent.transform; } if (entity.targetname != -1) { entityInstance.AddComponent <EntityTargetName>(); } } } // setup instances for (int i = 0; i < bsp.entities.Length; ++i) { float progress = ((float)(i + 1)) / bsp.entities.Length; if (EditorUtility.DisplayCancelableProgressBar("Level", "Setting up instances...", progress)) { return; } var entityInstance = entityList[i]; if (entityInstance != null) { var entity = bsp.entities[i]; var entityObj = entityInstance.GetSubclassComponent <entity>(); entity.SetupInstance(bsp, entityObj, entityList); } } // setup player start var playerStart = GameObject.FindObjectOfType <info_player_start>(); if (playerStart == null) { Debug.LogError("Can't find player start position"); } level.playerStart = playerStart; var player = GameObject.FindObjectOfType <CharacterController>(); player.transform.position = playerStart.transform.position; // TODO: link doors }