void Awake() { Instance = this; playerThing = GetComponent <PlayerThing>(); centerMessageStyle = new GUIStyle(); centerMessageStyle.font = GuiFont; centerMessageStyle.normal.textColor = new Color(1, .75f, .5f, 1f); centerMessageStyle.fontSize = 20; centerMessageStyle.alignment = TextAnchor.MiddleCenter; whiteGuiStyle = new GUIStyle(); whiteGuiStyle.font = GuiFont; whiteGuiStyle.normal.textColor = new Color(1, 1, 1, .5f); whiteGuiStyle.fontSize = 10; whiteGuiStyle.alignment = TextAnchor.MiddleLeft; ammoGuiStyle = new GUIStyle(); ammoGuiStyle.font = GuiFont; ammoGuiStyle.normal.textColor = new Color(1, .5f, 0, .5f); ammoGuiStyle.fontSize = 10; ammoGuiStyle.alignment = TextAnchor.MiddleRight; healthGuiStyle = new GUIStyle(); healthGuiStyle.font = GuiFont; healthGuiStyle.normal.textColor = new Color(1, 0, 0, .5f); healthGuiStyle.fontSize = 10; healthGuiStyle.alignment = TextAnchor.MiddleLeft; }
void Awake() { controller = GetComponent <CharacterController>(); audioSource = GetComponent <AudioSource>(); playerThing = GetComponent <PlayerThing>(); Instance = this; }
private void Awake() { if (instance == null) { instance = this; DontDestroyOnLoad(this); } else if (instance != this) { Destroy(this); } }
bool CanMeleeRay(float distance) { PlayerThing player = GameManager.Instance.Player[0]; Vector3 from = owner.transform.position + Vector3.up * AttackHeight; Vector3 toPlayer = (player.transform.position - from).normalized; Ray ray = new Ray(from, toPlayer); RaycastHit hit; if (Physics.Raycast(ray, out hit, distance, ~((1 << 9) | (1 << 10) | (1 << 11) | (1 << 12) | (1 << 14)), QueryTriggerInteraction.Ignore)) { return(false); } return(true); }
bool SeePlayerRay(out Ray ray, int attempts = 1) { PlayerThing player = GameManager.Instance.Player[0]; if (player == null) { ray = new Ray(); return(false); } Vector3 eyePos = owner.transform.position + Vector3.up * EyeHeight; Vector3 toPlayer = ((player.transform.position + Random.onUnitSphere * player.RayCastSphereRadius) - eyePos).normalized; ray = new Ray(eyePos, toPlayer); if (Vector3.Dot(owner.transform.forward, toPlayer) < ViewFrustumMin) { return(false); } while (attempts > 0) { RaycastHit hit; if (Physics.Raycast(ray, out hit, SeeDistance, ~((1 << 9) | (1 << 11) | (1 << 14)), QueryTriggerInteraction.Ignore)) { if (hit.collider.GetComponent <PlayerThing>() != null) { return(true); } } toPlayer = ((player.transform.position + Random.onUnitSphere * player.RayCastSphereRadius) - eyePos).normalized; ray = new Ray(eyePos, toPlayer); attempts--; } return(false); }
void OnTriggerEnter(Collider other) { PlayerThing player = other.GetComponent <PlayerThing>(); if (player == null) { return; } bool destroy = false; switch (itemType) { default: break; case ItemType.Bullets: if (PlayerInfo.Instance.Ammo[0] == PlayerInfo.Instance.MaxAmmo[0]) { break; } PlayerInfo.Instance.Ammo[0] += amount; if (PlayerInfo.Instance.Ammo[0] > PlayerInfo.Instance.MaxAmmo[0]) { PlayerInfo.Instance.Ammo[0] = PlayerInfo.Instance.MaxAmmo[0]; } destroy = true; break; case ItemType.Shells: if (PlayerInfo.Instance.Ammo[1] == PlayerInfo.Instance.MaxAmmo[1]) { break; } PlayerInfo.Instance.Ammo[1] += amount; if (PlayerInfo.Instance.Ammo[1] > PlayerInfo.Instance.MaxAmmo[1]) { PlayerInfo.Instance.Ammo[1] = PlayerInfo.Instance.MaxAmmo[1]; } destroy = true; break; case ItemType.Rockets: if (PlayerInfo.Instance.Ammo[2] == PlayerInfo.Instance.MaxAmmo[2]) { break; } PlayerInfo.Instance.Ammo[2] += amount; if (PlayerInfo.Instance.Ammo[2] > PlayerInfo.Instance.MaxAmmo[2]) { PlayerInfo.Instance.Ammo[2] = PlayerInfo.Instance.MaxAmmo[2]; } destroy = true; break; case ItemType.Health: if (bonus) { if (player.hitpoints == PlayerInfo.Instance.MaxBonusHealth) { break; } player.hitpoints += amount; if (player.hitpoints > PlayerInfo.Instance.MaxBonusHealth) { player.hitpoints = PlayerInfo.Instance.MaxBonusHealth; } } else { if (player.hitpoints >= PlayerInfo.Instance.MaxHealth) { break; } player.hitpoints += amount; if (player.hitpoints > PlayerInfo.Instance.MaxHealth) { player.hitpoints = PlayerInfo.Instance.MaxHealth; } } destroy = true; break; case ItemType.Armor: if (bonus) { if (player.armor == PlayerInfo.Instance.MaxBonusArmor) { break; } player.armor += amount; if (player.armor > PlayerInfo.Instance.MaxBonusArmor) { player.armor = PlayerInfo.Instance.MaxBonusArmor; } } else { if (player.armor >= PlayerInfo.Instance.MaxArmor) { break; } player.armor += amount; if (player.armor > PlayerInfo.Instance.MaxArmor) { player.armor = PlayerInfo.Instance.MaxArmor; } } destroy = true; break; case ItemType.Keycard: if (PlayerInfo.Instance.Keycards[givesKeycard]) { break; } PlayerInfo.Instance.Keycards[givesKeycard] = true; //to allow making of skullkeys eventually if (givesKeycard == 0) { PlayerInfo.Instance.bluekeyTexture = TextureLoader.Instance.GetSpriteTexture("BKEYA0"); } if (givesKeycard == 1) { PlayerInfo.Instance.yellowkeyTexture = TextureLoader.Instance.GetSpriteTexture("YKEYA0"); } if (givesKeycard == 2) { PlayerInfo.Instance.redkeyTexture = TextureLoader.Instance.GetSpriteTexture("RKEYA0"); } destroy = true; break; case ItemType.Backpack: PlayerInfo.Instance.MaxAmmo[0] = 400; PlayerInfo.Instance.MaxAmmo[1] = 100; PlayerInfo.Instance.MaxAmmo[2] = 100; PlayerInfo.Instance.Ammo[0] += 10; if (PlayerInfo.Instance.Ammo[0] > PlayerInfo.Instance.MaxAmmo[0]) { PlayerInfo.Instance.Ammo[0] = PlayerInfo.Instance.MaxAmmo[0]; } PlayerInfo.Instance.Ammo[1] += 4; if (PlayerInfo.Instance.Ammo[1] > PlayerInfo.Instance.MaxAmmo[1]) { PlayerInfo.Instance.Ammo[1] = PlayerInfo.Instance.MaxAmmo[1]; } PlayerInfo.Instance.Ammo[2] += 1; if (PlayerInfo.Instance.Ammo[2] > PlayerInfo.Instance.MaxAmmo[2]) { PlayerInfo.Instance.Ammo[2] = PlayerInfo.Instance.MaxAmmo[2]; } destroy = true; break; } if (givesWeapon != -1) { if (givesWeapon >= 0 && givesWeapon < PlayerInfo.Instance.Weapon.Length) { if (!PlayerInfo.Instance.Weapon[givesWeapon]) { PlayerInfo.Instance.Weapon[givesWeapon] = true; PlayerControls.Instance.TrySwapWeapon(givesWeapon); } } destroy = true; } if (destroy) { PlayerInfo.Instance.pickupFlashTime = 1f; if (!string.IsNullOrEmpty(PickupSound)) { GameManager.Create3DSound(transform.position, PickupSound, 1f); } Destroy(gameObject); } }
public override void Tick() { if (!alert) { if (decisionTime > 0f) { decisionTime -= Time.deltaTime; return; } decisionTime = Random.Range(.4f, .6f); int distance = AxMath.WeightedDistance(owner.cell, GameManager.Instance.Player[0].cell); if (distance > SeeDistance) { return; } if (Random.value <= NearSoundChanceSleeping) { if (mc.NearSounds.Length > 0) { if (!mc.audioSource.isPlaying) { mc.audioSource.clip = mc.NearSounds[Random.Range(0, mc.NearSounds.Length)]; mc.audioSource.Play(); } } } if (SeePlayerRay()) { alert = true; decisionTime = 0f; } if (!alert) { return; } } if (painFrame) { mc.moveVector = Vector3.zero; painFrame = false; attackTime = 0f; decisionTime = 0f; return; } if (attackTime > 0f) { attackTime -= Time.deltaTime; Vector3 aimAt = (GameManager.Instance.Player[0].transform.position - mc.transform.position).normalized; //mc.transform.rotation = Quaternion.LookRotation(Vector3.Lerp(mc.transform.forward, new Vector3(aimAt.x, 0, aimAt.z), Time.deltaTime * mc.turnSpeed), Vector3.up); //instantenous rotation towards target mc.transform.rotation = Quaternion.LookRotation(new Vector3(aimAt.x, 0, aimAt.z), Vector3.up); if (attackTime < AttackHappenTime && !attacked) { attacked = true; if (mc.AttackSounds.Length > 0) { GameManager.Create3DSound(mc.transform.position, mc.AttackSounds[Random.Range(0, mc.AttackSounds.Length)], 10f); } PlayerThing player = GameManager.Instance.Player[0]; if (player != null) { //swap layers for a while to avoid hitting self int originalLayer = owner.gameObject.layer; owner.gameObject.layer = 9; for (int i = 0; i < shotCount; i++) { Vector3 eyePos = owner.transform.position + Vector3.up * EyeHeight; Vector3 toPlayer = ((player.transform.position + Random.onUnitSphere * player.RayCastSphereRadius) - eyePos).normalized; toPlayer += Random.insideUnitSphere * attackSpread; toPlayer.Normalize(); Ray ray = new Ray(eyePos, toPlayer); /*GameObject visualLine = new GameObject(); * LineRenderer lr = visualLine.AddComponent<LineRenderer>(); * lr.positionCount = 2; * lr.SetPosition(0, ray.origin); * lr.SetPosition(1, ray.origin + ray.direction * 200); * lr.widthMultiplier = .02f; * visualLine.AddComponent<DestroyAfterTime>();*/ RaycastHit hit; if (Physics.Raycast(ray, out hit, 200, ~((1 << 9) | (1 << 14)), QueryTriggerInteraction.Ignore)) { Damageable target = hit.collider.gameObject.GetComponent <Damageable>(); if (target != null) { target.Damage(Random.Range(DamageMin, DamageMax + 1), DamageType.Generic, owner.gameObject); if (target.Bleed) { GameObject blood = GameObject.Instantiate(GameManager.Instance.BloodDrop); blood.transform.position = hit.point - ray.direction * .2f; } else { GameObject puff = GameObject.Instantiate(GameManager.Instance.BulletPuff); puff.transform.position = hit.point - ray.direction * .2f; } } else { GameObject puff = GameObject.Instantiate(GameManager.Instance.BulletPuff); puff.transform.position = hit.point - ray.direction * .2f; } } } owner.gameObject.layer = originalLayer; } } return; } if (wantDirection != Vector3.zero) { mc.transform.rotation = Quaternion.LookRotation(Vector3.Lerp(mc.transform.forward, wantDirection, Time.deltaTime * mc.turnSpeed), Vector3.up); } if (decisionTime > 0f) { decisionTime -= Time.deltaTime; return; } if (Random.value <= PokeChance) { Ray ray = new Ray(owner.transform.position + Vector3.up, owner.transform.forward); RaycastHit hit; if (Physics.Raycast(ray, out hit, 2, ~((1 << 9) | (1 << 11)), QueryTriggerInteraction.Ignore)) { Pokeable lc = hit.collider.gameObject.GetComponent <Pokeable>(); if (lc != null) { if (lc.AllowMonsters()) { lc.Poke(owner.gameObject); } } } } if (Random.value <= NearSoundChanceAwake) { if (mc.NearSounds.Length > 0) { if (!mc.audioSource.isPlaying) { mc.audioSource.clip = mc.NearSounds[Random.Range(0, mc.NearSounds.Length)]; mc.audioSource.Play(); } } } decisionTime = Random.Range(.4f, .6f); wantDirection = Vector3.zero; bool aggro = false; if (Random.value < AggroChance) { Ray toPlayer; if (SeePlayerRay(out toPlayer)) { wantDirection = new Vector3(toPlayer.direction.x, 0, toPlayer.direction.z); wantMove = false; aggro = true; attacked = false; attackTime = 1f; decisionTime = 0f; mc.InitAttackAnimation(); } } if (!aggro) { float moveRoll = Random.value; if (moveRoll < randomMoveChance) { MoveToRandomNearbyCell(); } else if (moveRoll < closestMoveChance) { if (!MoveToRandomClosestBreath()) { MoveToRandomNearbyCell(); } } else { if (!MoveTowardsBreath()) { if (!MoveToRandomClosestBreath()) { MoveToRandomNearbyCell(); } } } } if (Random.value < IdleChance) { wantMove = false; } if (wantMove) { mc.moveVector.x = 1; } else { mc.moveVector.x = 0; } }
public static void ApplyLinedefBehavior() { Transform holder = new GameObject("DynamicMeshes").transform; holder.transform.SetParent(GameManager.Instance.transform); int index = -1; foreach (Linedef l in linedefs) { index++; if (l.lineType == 0) { continue; } switch (l.lineType) { default: Debug.Log("Linedef " + index + " has unknown type (" + l.lineType + ")"); break; //common door case 1: case 26: //keycard doors case 27: case 28: { if (l.TopFrontObject == null) { break; } if (l.Back == null) { break; } l.Back.Sector.ceilingObject.transform.SetParent(holder); Door1Controller lc = l.TopFrontObject.AddComponent <Door1Controller>(); if (l.lineType == 26) { lc.requiresKeycard = 0; } if (l.lineType == 27) { lc.requiresKeycard = 1; } if (l.lineType == 28) { lc.requiresKeycard = 2; } SlowRepeatableDoorController sc = l.Back.Sector.ceilingObject.GetComponent <SlowRepeatableDoorController>(); if (sc == null) { sc = l.Back.Sector.ceilingObject.AddComponent <SlowRepeatableDoorController>(); } sc.Init(l.Back.Sector); lc.sectorController = sc; l.Back.Sector.Dynamic = true; } break; //single use door, walk trigger case 2: { if (!Sector.TaggedSectors.ContainsKey(l.lineTag)) { break; } List <SlowOneshotDoorController> linked = new List <SlowOneshotDoorController>(); foreach (Sector sector in Sector.TaggedSectors[l.lineTag]) { sector.ceilingObject.transform.SetParent(holder); SlowOneshotDoorController sc = sector.ceilingObject.GetComponent <SlowOneshotDoorController>(); if (sc == null) { sc = sector.ceilingObject.gameObject.AddComponent <SlowOneshotDoorController>(); sc.Init(sector); } linked.Add(sc); sector.Dynamic = true; } BoxCollider mc = Mesher.CreateLineTriggerCollider( l, Mathf.Min(l.Front.Sector.minimumFloorHeight, l.Back.Sector.minimumFloorHeight), Mathf.Max(l.Front.Sector.maximumCeilingHeight, l.Back.Sector.maximumCeilingHeight), "Tag_" + l.lineTag + "_trigger", holder ); if (mc == null) { Debug.LogError("Linedef " + index + " could not create trigger. Type(" + l.lineType + ")"); break; } mc.isTrigger = true; LineTrigger lt = mc.gameObject.AddComponent <LineTrigger>(); lt.TriggerAction = (c) => { PlayerThing player = c.GetComponent <PlayerThing>(); if (player == null) { return; } foreach (SlowOneshotDoorController lc in linked) { if (lc.CurrentState == SlowOneshotDoorController.State.Closed) { lc.CurrentState = SlowOneshotDoorController.State.Opening; } } }; } break; //stairbuilder, walktrigger case 8: { if (!Sector.TaggedSectors.ContainsKey(l.lineTag)) { break; } List <StairbuilderSlow> linked = new List <StairbuilderSlow>(); foreach (Sector sector in Sector.TaggedSectors[l.lineTag]) { sector.floorObject.transform.SetParent(holder); List <Sector> stairSectors = new List <Sector>(); Sector targetSector = sector; int count = 0; bool failed = false; while (!failed) { count++; stairSectors.Add(targetSector); targetSector.Dynamic = true; targetSector.floorObject.transform.SetParent(holder); failed = true; foreach (Sidedef s in targetSector.Sidedefs) { if (s.Line.Back == null) { continue; } if (s.Line.Back.Sector == targetSector) { continue; } if (s.Line.Back.Sector.floorTexture != targetSector.floorTexture) { continue; } if (stairSectors.Contains(s.Line.Back.Sector)) { continue; } targetSector = s.Line.Back.Sector; failed = false; } } StairbuilderSlow sc = sector.floorObject.GetComponent <StairbuilderSlow>(); if (sc == null) { sc = sector.floorObject.gameObject.AddComponent <StairbuilderSlow>(); sc.Init(stairSectors); } linked.Add(sc); } BoxCollider mc = Mesher.CreateLineTriggerCollider( l, Mathf.Min(l.Front.Sector.minimumFloorHeight, l.Back.Sector.minimumFloorHeight), Mathf.Max(l.Front.Sector.maximumCeilingHeight, l.Back.Sector.maximumCeilingHeight), "Tag_" + l.lineTag + "_trigger", holder ); if (mc == null) { Debug.LogError("Linedef " + index + " could not create trigger. Type(" + l.lineType + ")"); break; } mc.isTrigger = true; LineTrigger lt = mc.gameObject.AddComponent <LineTrigger>(); lt.TriggerAction = (c) => { PlayerThing player = c.GetComponent <PlayerThing>(); if (player == null) { return; } foreach (StairbuilderSlow lc in linked) { if (lc.CurrentState == StairbuilderSlow.State.Waiting) { lc.CurrentState = StairbuilderSlow.State.Active; } } }; } break; //donut, switch case 9: { if (!Sector.TaggedSectors.ContainsKey(l.lineTag)) { break; } List <Sector> sectors = Sector.TaggedSectors[l.lineTag]; if (sectors.Count == 0) { break; } sectors[0].floorObject.transform.SetParent(holder); Sector ringSector = null; foreach (Sidedef s in sectors[0].Sidedefs) { if (s.Line.Back == null) { continue; } if (s.Line.Front.Sector == sectors[0]) { ringSector = s.Line.Back.Sector; ringSector.floorObject.transform.SetParent(holder); break; } if (s.Line.Back.Sector == sectors[0]) { ringSector = s.Line.Front.Sector; ringSector.floorObject.transform.SetParent(holder); break; } } if (ringSector == null) { Debug.LogError("MapLoader: Donut9Controller: No ring sector found!"); } Donut9SectorController sc = sectors[0].floorObject.gameObject.AddComponent <Donut9SectorController>(); Donut9LinedefController script = null; if (l.BotFrontObject != null) { script = l.BotFrontObject.AddComponent <Donut9LinedefController>(); } else if (l.MidFrontObject != null) { script = l.MidFrontObject.AddComponent <Donut9LinedefController>(); } if (script != null) { script.sectorController = sc; sc.Init(sectors[0], ringSector); } sectors[0].Dynamic = true; ringSector.Dynamic = true; } break; //level end switch case 11: { if (l.BotFrontObject != null) { End11LinedefController lc = l.BotFrontObject.AddComponent <End11LinedefController>(); lc.CurrentTexture = l.Front.tLow; l.BotFrontObject.transform.SetParent(holder); } else if (l.MidFrontObject != null) { End11LinedefController lc = l.MidFrontObject.AddComponent <End11LinedefController>(); lc.CurrentTexture = l.Front.tMid; l.MidFrontObject.transform.SetParent(holder); } } break; //raise floor to next, one use case 20: { List <Floor20SectorController> linked = new List <Floor20SectorController>(); foreach (Sector sector in Sector.TaggedSectors[l.lineTag]) { sector.floorObject.transform.SetParent(holder); Floor20SectorController sc = sector.floorObject.GetComponent <Floor20SectorController>(); if (sc == null) { sc = sector.floorObject.gameObject.AddComponent <Floor20SectorController>(); sc.Init(sector); } linked.Add(sc); sector.Dynamic = true; } if (l.BotFrontObject != null) { if (index == 1020) { l.BotFrontObject.transform.SetParent(GameManager.Instance.TemporaryObjectsHolder); } Floor20LinedefController lc = l.BotFrontObject.AddComponent <Floor20LinedefController>(); lc.sectorControllers = linked; lc.CurrentTexture = l.Front.tLow; l.BotFrontObject.transform.SetParent(holder); } else if (l.MidFrontObject != null) { Floor20LinedefController lc = l.MidFrontObject.AddComponent <Floor20LinedefController>(); lc.sectorControllers = linked; lc.CurrentTexture = l.Front.tMid; l.MidFrontObject.transform.SetParent(holder); } } break; //single use door, pokeable case 31: { if (l.TopFrontObject == null) { break; } if (l.Back == null) { break; } l.Back.Sector.ceilingObject.transform.SetParent(holder); Door31Controller lc = l.TopFrontObject.AddComponent <Door31Controller>(); SlowOneshotDoorController sc = l.Back.Sector.ceilingObject.GetComponent <SlowOneshotDoorController>(); if (sc == null) { sc = l.Back.Sector.ceilingObject.AddComponent <SlowOneshotDoorController>(); } sc.Init(l.Back.Sector); lc.sectorController = sc; l.Back.Sector.Dynamic = true; } break; //make sectors dark, walktrigger case 35: { if (!Sector.TaggedSectors.ContainsKey(l.lineTag)) { break; } BoxCollider mc = Mesher.CreateLineTriggerCollider( l, Mathf.Min(l.Front.Sector.minimumFloorHeight, l.Back.Sector.minimumFloorHeight), Mathf.Max(l.Front.Sector.maximumCeilingHeight, l.Back.Sector.maximumCeilingHeight), "Tag_" + l.lineTag + "_trigger", holder ); if (mc == null) { Debug.LogError("Linedef " + index + " could not create trigger. Type(" + l.lineType + ")"); break; } mc.isTrigger = true; LineTrigger lt = mc.gameObject.AddComponent <LineTrigger>(); lt.TriggerAction = (c) => { if (c.GetComponent <PlayerThing>() == null) { return; } foreach (Sector sector in Sector.TaggedSectors[l.lineTag]) { sector.brightness = (float)35 / 255f; sector.floorObject.ChangeBrightness(sector.brightness); } }; } break; //single use floor lower, walktrigger case 36: { if (!Sector.TaggedSectors.ContainsKey(l.lineTag)) { break; } List <Floor36Controller> linked = new List <Floor36Controller>(); foreach (Sector sector in Sector.TaggedSectors[l.lineTag]) { sector.floorObject.transform.SetParent(holder); Floor36Controller sc = sector.floorObject.GetComponent <Floor36Controller>(); if (sc == null) { sc = sector.floorObject.gameObject.AddComponent <Floor36Controller>(); sc.Init(sector); } linked.Add(sc); sector.Dynamic = true; } BoxCollider mc = Mesher.CreateLineTriggerCollider( l, Mathf.Min(l.Front.Sector.minimumFloorHeight, l.Back.Sector.minimumFloorHeight), Mathf.Max(l.Front.Sector.maximumCeilingHeight, l.Back.Sector.maximumCeilingHeight), "Tag_" + l.lineTag + "_trigger", holder ); if (mc == null) { Debug.LogError("Linedef " + index + " could not create trigger. Type(" + l.lineType + ")"); break; } mc.isTrigger = true; LineTrigger lt = mc.gameObject.AddComponent <LineTrigger>(); lt.TriggerAction = (c) => { PlayerThing player = c.GetComponent <PlayerThing>(); if (player == null) { return; } foreach (Floor36Controller lc in linked) { if (lc.CurrentState == Floor36Controller.State.AtTop) { lc.CurrentState = Floor36Controller.State.Lowering; } } }; } break; //single use door, shootable case 46: { if (l.TopFrontObject == null) { break; } if (l.Back == null) { break; } l.Back.Sector.ceilingObject.transform.SetParent(GameManager.Instance.transform); Door46Controller lc = l.TopFrontObject.AddComponent <Door46Controller>(); SlowOneshotDoorController sc = l.Back.Sector.ceilingObject.GetComponent <SlowOneshotDoorController>(); if (sc == null) { sc = l.Back.Sector.ceilingObject.AddComponent <SlowOneshotDoorController>(); } sc.Init(l.Back.Sector); lc.sectorController = sc; l.Back.Sector.Dynamic = true; } break; //scroll animation, left case 48: { foreach (GameObject g in l.gameObjects) { if (g != null) { g.AddComponent <ScrollLeftAnimation>(); } } } break; //secret level end switch case 51: { if (l.BotFrontObject != null) { End51LinedefController lc = l.BotFrontObject.AddComponent <End51LinedefController>(); lc.CurrentTexture = l.Front.tLow; l.BotFrontObject.transform.SetParent(holder); } else if (l.MidFrontObject != null) { End51LinedefController lc = l.MidFrontObject.AddComponent <End51LinedefController>(); lc.CurrentTexture = l.Front.tMid; l.MidFrontObject.transform.SetParent(holder); } } break; //common lift, pokeable case 62: { if (!Sector.TaggedSectors.ContainsKey(l.lineTag)) { break; } if (l.BotFrontObject == null) { break; } List <Slow3sLiftController> linked = new List <Slow3sLiftController>(); foreach (Sector sector in Sector.TaggedSectors[l.lineTag]) { sector.floorObject.transform.SetParent(holder); Slow3sLiftController script = sector.floorObject.GetComponent <Slow3sLiftController>(); if (script == null) { script = sector.floorObject.gameObject.AddComponent <Slow3sLiftController>(); script.Init(sector); } linked.Add(script); sector.Dynamic = true; } Lift62Controller lc = l.BotFrontObject.AddComponent <Lift62Controller>(); lc.liftControllers = linked; } break; //repeatable door, switch case 63: { if (!Sector.TaggedSectors.ContainsKey(l.lineTag)) { break; } List <SlowRepeatableDoorController> linked = new List <SlowRepeatableDoorController>(); foreach (Sector sector in Sector.TaggedSectors[l.lineTag]) { sector.ceilingObject.transform.SetParent(holder); SlowRepeatableDoorController sc = sector.ceilingObject.GetComponent <SlowRepeatableDoorController>(); if (sc == null) { sc = sector.ceilingObject.AddComponent <SlowRepeatableDoorController>(); sc.Init(sector); } linked.Add(sc); sector.Dynamic = true; } if (l.BotFrontObject != null) { Door63Controller lc = l.BotFrontObject.AddComponent <Door63Controller>(); lc.sectorControllers = linked; lc.CurrentTexture = l.Front.tLow; l.BotFrontObject.transform.SetParent(holder); } else if (l.MidFrontObject != null) { Door63Controller lc = l.MidFrontObject.AddComponent <Door63Controller>(); lc.sectorControllers = linked; lc.CurrentTexture = l.Front.tMid; l.MidFrontObject.transform.SetParent(holder); } } break; //common lift, walktrigger case 88: { if (!Sector.TaggedSectors.ContainsKey(l.lineTag)) { break; } List <Slow3sLiftController> linked = new List <Slow3sLiftController>(); foreach (Sector sector in Sector.TaggedSectors[l.lineTag]) { sector.floorObject.transform.SetParent(holder); Slow3sLiftController sc = sector.floorObject.GetComponent <Slow3sLiftController>(); if (sc == null) { sc = sector.floorObject.gameObject.AddComponent <Slow3sLiftController>(); sc.Init(sector); } linked.Add(sc); sector.Dynamic = true; } BoxCollider mc = Mesher.CreateLineTriggerCollider( l, Mathf.Min(l.Front.Sector.minimumFloorHeight, l.Back.Sector.minimumFloorHeight), Mathf.Max(l.Front.Sector.maximumCeilingHeight, l.Back.Sector.maximumCeilingHeight), "Tag_" + l.lineTag + "_trigger", holder ); if (mc == null) { Debug.LogError("Linedef " + index + " could not create trigger. Type(" + l.lineType + ")"); break; } mc.isTrigger = true; LineTrigger lt = mc.gameObject.AddComponent <LineTrigger>(); lt.TriggerAction = (c) => { foreach (Slow3sLiftController lc in linked) { if (lc.CurrentState == Slow3sLiftController.State.AtTop) { lc.CurrentState = Slow3sLiftController.State.Lowering; } } }; } break; //repeatable door, walktrigger case 90: { if (!Sector.TaggedSectors.ContainsKey(l.lineTag)) { break; } List <SlowRepeatableDoorController> linked = new List <SlowRepeatableDoorController>(); foreach (Sector sector in Sector.TaggedSectors[l.lineTag]) { sector.ceilingObject.transform.SetParent(holder); SlowRepeatableDoorController sc = sector.ceilingObject.GetComponent <SlowRepeatableDoorController>(); if (sc == null) { sc = sector.ceilingObject.gameObject.AddComponent <SlowRepeatableDoorController>(); sc.Init(sector); } linked.Add(sc); sector.Dynamic = true; } BoxCollider mc = Mesher.CreateLineTriggerCollider( l, Mathf.Min(l.Front.Sector.minimumFloorHeight, l.Back.Sector.minimumFloorHeight), Mathf.Max(l.Front.Sector.maximumCeilingHeight, l.Back.Sector.maximumCeilingHeight), "Tag_" + l.lineTag + "_trigger", holder ); if (mc == null) { Debug.LogError("Linedef " + index + " could not create trigger. Type(" + l.lineType + ")"); break; } mc.isTrigger = true; LineTrigger lt = mc.gameObject.AddComponent <LineTrigger>(); lt.TriggerAction = (c) => { PlayerThing player = c.GetComponent <PlayerThing>(); if (player == null) { return; } foreach (SlowRepeatableDoorController lc in linked) { if (lc.CurrentState == SlowRepeatableDoorController.State.Closed) { lc.CurrentState = SlowRepeatableDoorController.State.Opening; } } }; } break; //single use door, switch case 103: { if (!Sector.TaggedSectors.ContainsKey(l.lineTag)) { break; } List <SlowOneshotDoorController> linked = new List <SlowOneshotDoorController>(); foreach (Sector sector in Sector.TaggedSectors[l.lineTag]) { sector.ceilingObject.transform.SetParent(holder); SlowOneshotDoorController sc = sector.ceilingObject.GetComponent <SlowOneshotDoorController>(); if (sc == null) { sc = sector.ceilingObject.AddComponent <SlowOneshotDoorController>(); sc.Init(sector); } linked.Add(sc); sector.Dynamic = true; } if (l.BotFrontObject != null) { Door103Controller lc = l.BotFrontObject.AddComponent <Door103Controller>(); lc.sectorControllers = linked; lc.CurrentTexture = l.Front.tLow; l.BotFrontObject.transform.SetParent(holder); } else if (l.MidFrontObject != null) { Door103Controller lc = l.MidFrontObject.AddComponent <Door103Controller>(); lc.sectorControllers = linked; lc.CurrentTexture = l.Front.tMid; l.MidFrontObject.transform.SetParent(holder); } } break; } } }