private void Start() { timer = 0f; nextSpawnDelay = GetRandomTime(delay, delayRandomize); LineRenderer boltTemplate = this.GetComponent <LineRenderer>(); //initialize bolts for (int i = 0; i < bolts.Length; i++) { GameObject g = new GameObject("Bolt_" + i.ToString().PadLeft(2, '0')); g.transform.SetParent(transform); g.transform.localPosition = Vector3.zero; g.transform.localRotation = Quaternion.identity; bolts[i] = new Bolt(g, boltTemplate); } Destroy(boltTemplate); this.emitting = this.initOn; if (UFLevel.GetByID(targetID) == null || UFLevel.GetByID(targetID).objectRef == null) { Debug.LogWarning("Bolt emitter " + name + " has no valid target and will be deactivated"); this.gameObject.SetActive(false); } }
private void Trigger() { //sync this trigger press over the network if necessary if (permanent && !permanentTriggered) { permanentTriggered = true; UFLevel.SyncTrigger(ownID); } if (resetsRemaining > 0) { resetsRemaining--; } else if (resetsRemaining == 0) { return; } insideTime = -resetDelay; buttonTime = 0f; foreach (int link in links) { Activate(link); } if (switchRef >= 0) { IDRef swtch = UFLevel.GetByID(switchRef); UFClutter s = swtch.objectRef.GetComponent <UFClutter>(); s.Activate(true); } }
private List <T> GetLinksOfType <T>(IDRef.Type type) where T : Component { List <T> toReturn = new List <T>(); foreach (int link in links) { if (UFLevel.GetByID(link).type == type || type == IDRef.Type.All) { toReturn.Add(UFLevel.GetByID(link).objectRef.GetComponent <T>()); } } return(toReturn); }
private void Trigger(bool positive, IDRef.Type ignoredType = IDRef.Type.None) { if (ignoredType == IDRef.Type.All) { return; } foreach (int link in links) { if (UFLevel.GetByID(link).type != ignoredType) { UFTrigger.Activate(link, positive); } } }
private void Awake() { rb = this.GetComponent <Rigidbody>(); sound = this.GetComponent <AudioSource>(); //extract transforms to be moved by this mover List <Transform> contents = new List <Transform>(); foreach (int link in links) { GameObject g = UFLevel.GetByID(link).objectRef; if (g != null) { contents.Add(g.transform); } } //make sure all contents have (kinematic) rigidbodies this.content = new Rigidbody[contents.Count]; for (int i = 0; i < contents.Count; i++) { Rigidbody rb = contents[i].GetComponent <Rigidbody>(); if (rb == null) { rb = contents[i].gameObject.AddComponent <Rigidbody>(); } rb.isKinematic = true; rb.interpolation = RigidbodyInterpolation.Interpolate; this.content[i] = rb; } //turn off all contained colliders if needed if (noPlayerCollide) { foreach (Transform t in contents) { Collider[] cols = t.GetComponentsInChildren <Collider>(); foreach (Collider c in cols) { if (!c.isTrigger) { c.enabled = false; } } } } }
private void LateUpdate() { //update existing bolts foreach (Bolt bolt in bolts) { if (!bolt.DecayTick()) { Transform boltTarget = UFLevel.GetByID(targetID).objectRef.transform; bolt.Animate(boltTarget, jitter, boltShape); } } //emit new bolts if (emitting) { EmitUpdate(); } }
public override void OnInspectorGUI() { DrawDefaultInspector(); if (UFLevel.singleton != level) { GUILayout.Label("This level is inactive."); } else if (level.idDictionary == null) { GUILayout.Label("ID Dictionary not initialized. "); } else { GUILayout.Label("Number of available IDs: " + level.idDictionary.Count); findID = EditorGUILayout.IntField("Search ID: ", findID); IDRef obj = UFLevel.GetByID(findID); if (obj == null) { GUILayout.Label("Invalid ID"); } else { GUILayout.Label("Found reference type: " + obj.type.ToString()); if (obj.objectRef != null) { GUILayout.Label(obj.objectRef.name); if (GUILayout.Button("Select game object")) { Selection.activeGameObject = obj.objectRef; } } else { GUILayout.Label("Object is not in scene."); } } drawLinks = GUILayout.Toggle(drawLinks, "Draw links"); } }
private static IDRef TryGetObject(int id) { IDRef toReturn = UFLevel.GetByID(id); if (toReturn == null) { Debug.LogWarning("Tried to link to non existant ID: " + id); return(null); } GameObject obj = toReturn.objectRef; if (obj == null) { Debug.LogWarning("Tried to link to ID that is not in the scene: " + toReturn.id + ", of type " + toReturn.type); return(null); } return(toReturn); }
/// <summary> /// Perform effects of this event. /// Returns the type of IDRef that is used up when performing the event, /// these references do not get activated in the usual sense by this /// event type. /// </summary> private IDRef.Type DoEffect(bool positive) { //preperatory variables Transform playerTr = UFLevel.GetPlayer <Transform>(); UFPlayerLife playerLi = UFLevel.GetPlayer <UFPlayerLife>(); UFPlayerMovement playerMo = UFLevel.GetPlayer <UFPlayerMovement>(); AudioSource sound = this.GetComponent <AudioSource>(); //find effect type and do its effects. Return IDRefts that were used up. switch (type) { case UFLevelStructure.Event.EventType.Teleport: foreach (int link in links) { Transform t = UFLevel.GetByID(link).objectRef.transform; t.position = transform.position; t.rotation = transform.rotation; } return(IDRef.Type.None); case UFLevelStructure.Event.EventType.Teleport_Player: playerTr.position = transform.position; playerTr.GetComponent <CharacterController>().Move(Vector3.zero); playerMo.SetRotation(transform.rotation); return(IDRef.Type.None); case UFLevelStructure.Event.EventType.Music_Start: if (sound.clip == null) { Debug.LogWarning("Music event has no audio clip assigned: " + name); } sound.Play(); return(IDRef.Type.None); case UFLevelStructure.Event.EventType.Play_Sound: sound.rolloffMode = AudioRolloffMode.Linear; if (float1 >= 0f) { sound.minDistance = float1; sound.maxDistance = float1 * 2f; sound.spatialBlend = 1f; } else { sound.spatialBlend = 0f; } if (sound.clip == null) { Debug.LogWarning("Play sound event has no audio clip assigned: " + name); } sound.loop = bool1; sound.Play(); if (float2 > 0f && !bool1) { sound.SetScheduledEndTime(float2); } return(IDRef.Type.None); case UFLevelStructure.Event.EventType.Music_Stop: float fadeTime = float1; foreach (UFEvent e in GetEventsOfType(UFLevelStructure.Event.EventType.Music_Start)) { StartCoroutine(e.FadeAudioSource(fadeTime, 0f)); } return(IDRef.Type.None); case UFLevelStructure.Event.EventType.Particle_State: foreach (UFParticleEmitter pem in GetLinksOfType <UFParticleEmitter>(IDRef.Type.ParticleEmitter)) { pem.Activate(positive); } return(IDRef.Type.ParticleEmitter); case UFLevelStructure.Event.EventType.Mover_Pause: foreach (UFMover mov in GetLinksOfType <UFMover>(IDRef.Type.Keyframe)) { mov.Activate(!positive); } return(IDRef.Type.Keyframe); case UFLevelStructure.Event.EventType.Reverse_Mover: bool setForwardIfMoving = int1 != 0; foreach (UFMover mov in GetLinksOfType <UFMover>(IDRef.Type.Keyframe)) { mov.Reverse(setForwardIfMoving); } return(IDRef.Type.Keyframe); case UFLevelStructure.Event.EventType.Modify_Rotating_Mover: bool increase = string1.Equals("Increase"); float factor = increase ? 1f + (float1 / 100f) : 1f - (float1 / 100f); foreach (UFMover mov in GetLinksOfType <UFMover>(IDRef.Type.Keyframe)) { mov.ChangeRotationSpeed(factor); } return(IDRef.Type.Keyframe); case UFLevelStructure.Event.EventType.Explode: float radius = float1; float damage = float2; bool geo = bool1; float dist = (playerTr.position - transform.position).magnitude; if (dist < radius) { playerLi.TakeDamage(damage, UFPlayerLife.DamageType.Explosive, false); } if (geo) { Debug.LogWarning("Explosion " + name + " requested geo mod; this will not work as of now!"); } GameObject explosionPrefab = obj as GameObject; if (explosionPrefab != null) { Vector3 explPos = transform.position; Quaternion explRot = transform.rotation; GameObject explosion = Instantiate(explosionPrefab, explPos, explRot, transform); explosion.transform.localScale = radius * 2f * Vector3.one; } else { Debug.LogWarning("Explosion prefab for event " + name + " was not provided!"); } return(IDRef.Type.None); case UFLevelStructure.Event.EventType.Skybox_State: UFLevel.playerInfo.SetSkyboxRotation(string1, float1); return(IDRef.Type.None); case UFLevelStructure.Event.EventType.Bolt_State: foreach (UFBoltEmitter bem in GetLinksOfType <UFBoltEmitter>(IDRef.Type.BoltEmitter)) { bem.Activate(positive); } return(IDRef.Type.BoltEmitter); case UFLevelStructure.Event.EventType.Push_Region_State: foreach (UFForceRegion pr in GetLinksOfType <UFForceRegion>(IDRef.Type.PushRegion)) { pr.Activate(positive); } return(IDRef.Type.PushRegion); case UFLevelStructure.Event.EventType.Countdown_Begin: UFLevel.singleton.SetCountDown(int1); return(IDRef.Type.None); case UFLevelStructure.Event.EventType.Countdown_End: UFLevel.singleton.SetCountDown(0f); return(IDRef.Type.None); case UFLevelStructure.Event.EventType.Remove_Object: foreach (int link in links) { GameObject g = UFLevel.GetByID(link).objectRef; if (g == null) { Debug.LogWarning("Trying to remove ID ref that does not exist: " + link); } else { g.SetActive(false); } } return(IDRef.Type.All); case UFLevelStructure.Event.EventType.Heal: if (bool1) { UFLevel.GetPlayer <UFPlayerLife>().GainHealth(int1); return(IDRef.Type.None); } else { Debug.LogError("Entity heal not implemented"); return(IDRef.Type.Entity); } case UFLevelStructure.Event.EventType.Set_Gravity: Physics.gravity = float1 * Vector3.down; return(IDRef.Type.None); default: Debug.LogError("Event type " + type + " not implemented"); return(IDRef.Type.None); } }
private string GetInfo(RaycastHit hit) { if (hit.collider == null) { return("Void"); } Transform target = hit.collider.transform; if (target.GetComponent <Collider>().isTrigger) { UFForceRegion force = target.GetComponent <UFForceRegion>(); if (force != null) { switch (force.type) { case UFForceRegion.ForceType.AddVel: return("Push region"); case UFForceRegion.ForceType.Climb: switch (force.soundType) { case UFLevelStructure.ClimbingRegion.ClimbingType.Fence: return("Climbable\nFence"); case UFLevelStructure.ClimbingRegion.ClimbingType.Ladder: return("Ladder"); case UFLevelStructure.ClimbingRegion.ClimbingType.Undefined: return("Climbable"); } break; case UFForceRegion.ForceType.SetVel: return("Jump pad"); } } UFLiquid liquid = target.GetComponent <UFLiquid>(); if (liquid != null) { switch (liquid.type) { case UFLevelStructure.Room.LiquidProperties.LiquidType.Acid: return("Acid"); case UFLevelStructure.Room.LiquidProperties.LiquidType.Lava: return("Lava"); case UFLevelStructure.Room.LiquidProperties.LiquidType.Water: return("Water"); case UFLevelStructure.Room.LiquidProperties.LiquidType.Undefined: return("Unkown\nLiquid"); } } UFTrigger trig = target.GetComponent <UFTrigger>(); if (trig != null) { if (trig.requireUseKey) { if (trig.resetsRemaining == 0) { return("Spent\nButton\nArea"); } else { return("Button\nArea"); } } foreach (int link in trig.links) { IDRef idRef = UFLevel.GetByID(link); switch (idRef.type) { case IDRef.Type.Event: UFEvent eventRef = idRef.objectRef.GetComponent <UFEvent>(); switch (eventRef.type) { case UFLevelStructure.Event.EventType.Continuous_Damage: bool insta = eventRef.int1 <= 0 || eventRef.int1 >= 100; if (insta) { return("Death\nTrigger"); } else { return("Damage\nArea"); } case UFLevelStructure.Event.EventType.Teleport_Player: case UFLevelStructure.Event.EventType.Teleport: return("Teleporter"); } break; } } return("Trigger"); } /* * if(target.GetComponentInParent<UFPlayerInfo>()) * return "Level\nBounds"; */ if (target.GetComponentInParent <MapFinish>()) { return("Finish\nTrigger"); } } else { if (target.name.StartsWith("StaticVisible")) { return("Solid"); } if (target.name.StartsWith("StaticIcy")) { return("Slippery"); } if (target.name.StartsWith("StaticInvisible")) { if (hit.normal.y > .7f) { return("Invisible\nFloor"); } else if (hit.normal.y < -.7f) { return("Invisible\nCeiling"); } else { return("Invisible\nWall"); } } if (target.parent != null) { switch (target.parent.name) { case "Scrollers": return("Scroller"); case "PortalGeometry": return("Illegal\nGeometry"); case "Moving geometry": return("Mover"); } } UFClutter clutter = target.GetComponentInParent <UFClutter>(); if (clutter != null) { if (clutter.isSwitch) { return("Switch"); } else if (clutter.life <= 0f) { return("Solid\nClutter"); } else { return("Destru-\nctible\nClutter"); } } UFDestructible destr = target.GetComponent <UFDestructible>(); if (destr != null) { string life = UFUtils.GetShortFormat(destr.currentLife, 4); string maxLife = UFUtils.GetShortFormat(destr.life, 4); return("Destru-\nctible\n" + life + "/" + maxLife); } if (target.name.ToLower().Contains("help")) { return("Secret\nFix"); } } Debug.Log("Could not recognize target: " + target); return("Unkown"); }