public void Show(IStructureSupport ghost, IStructureSupport support, Collider supportCol, float offsetWithSupport) { Transform transform = (ghost as MonoBehaviour).transform; Transform transform2 = (support as MonoBehaviour).transform; if (support is WallChunkArchitect) { if (this._showHorizontalGrid) { WallChunkArchitect wallChunkArchitect = (WallChunkArchitect)support; Vector3 position = transform2.position; position.y = support.GetLevel() + offsetWithSupport; this._horizontal.position = position; this._horizontal.rotation = Quaternion.LookRotation(transform2.forward); this._horizontal.localScale = new Vector3(1f, 1f, Vector3.Distance(wallChunkArchitect.P1, wallChunkArchitect.P2)); this._horizontalMat.mainTextureScale = new Vector2(6.25f, 5f * this._horizontal.localScale.z); this._horizontal.gameObject.SetActive(true); } if (this._showVerticalGrid) { Vector3 position2 = transform.position; position2.y = support.GetLevel(); this._edge1.position = position2; int count = ghost.GetMultiPointsPositions(true).Count; if (count > 0) { Vector3 forward = ghost.GetMultiPointsPositions(true).Last <Vector3>() - position2; forward.y = 0f; this._edge1.rotation = Quaternion.LookRotation(forward); } else { this._edge1.rotation = this._horizontal.rotation; } this._edge1.gameObject.SetActive(true); if (count > 1) { this._edge2.position = position2; Vector3 forward2 = ghost.GetMultiPointsPositions(true).First <Vector3>() - position2; forward2.y = 0f; this._edge2.rotation = Quaternion.LookRotation(forward2); this._edge2.gameObject.SetActive(true); } else { this._edge2.gameObject.SetActive(false); } } } }
private void InitSupport(IStructureSupport support) { List <Vector3> multiPointsPositions = support.GetMultiPointsPositions(true); if (multiPointsPositions != null && multiPointsPositions.Count > 1) { if (!this._autofillmode && this._canScriptToggleAutofillmode && this._multiPointsPositions.Count == 0) { this._autofillmode = true; } this.CurrentSupport = support; this.UpdateAutoFill(false); } }
private bool IsPlayerPositionValid(Vector3 testPos, IStructureSupport floor, IStructureSupport ceiling) { return(testPos.y > floor.GetLevel() && testPos.y < ceiling.GetLevel() && MathEx.IsPointInPolygon(testPos, floor.GetMultiPointsPositions(true)) && MathEx.IsPointInPolygon(testPos, ceiling.GetMultiPointsPositions(true))); }
private void SpawnRepairTrigger() { if (this._repairTrigger || !this._canBeRepaired) { return; } if (BoltNetwork.isRunning && base.entity && base.entity.isAttached && base.entity.isOwner) { base.state.repairTrigger = true; } this._repairTrigger = UnityEngine.Object.Instantiate <BuildingRepair>(Prefabs.Instance.BuildingRepairTriggerPrefab); this._repairTrigger._target = this; this._repairTrigger.transform.parent = base.transform; IStructureSupport structureSupport = (IStructureSupport)base.GetComponent(typeof(IStructureSupport)); if (structureSupport != null) { if (structureSupport is WallChunkArchitect) { WallChunkArchitect wallChunkArchitect = (WallChunkArchitect)structureSupport; this._repairTrigger.transform.position = Vector3.Lerp(wallChunkArchitect.P1, wallChunkArchitect.P2, 0.5f) + base.transform.right + base.transform.TransformDirection(this._repairTriggerOffset); this._repairTrigger.transform.rotation = Quaternion.LookRotation(base.transform.right); } else { this._repairTrigger.transform.position = MultipointUtils.CenterOf(structureSupport.GetMultiPointsPositions(true)) + base.transform.TransformDirection(this._repairTriggerOffset); } } else { this._repairTrigger.transform.position = base.transform.position + base.transform.TransformDirection(this._repairTriggerOffset); } }
protected virtual IEnumerator OnDeserialized() { if (!this._initialized) { this._initialized = true; if (this._forceWasBuilt) { this._wasBuilt = true; } if (this._p1 == Vector3.zero) { this._p1 = base.transform.position; } if (this._p2 == Vector3.zero) { PrefabIdentifier pi = base.GetComponent <PrefabIdentifier>(); if (pi && !pi.Components.Contains(base.GetType().FullName)) { pi.Components.Add(base.GetType().FullName); } Transform parentStructure = base.transform.parent; while (parentStructure && parentStructure.parent) { parentStructure = parentStructure.parent; yield return(null); } IStructureSupport support = (!base.transform.parent) ? null : base.transform.parent.GetComponent <IStructureSupport>(); if (support != null) { this.CurrentSupport = support; List <Vector3> multiPointsPositions = support.GetMultiPointsPositions(true); if (multiPointsPositions != null && multiPointsPositions.Count > 1) { Vector3 p = this._p1; p.y = multiPointsPositions[0].y; int num = -1; int i; for (i = 1; i < multiPointsPositions.Count; i++) { Vector3 a = MathEx.ProjectPointOnLineSegment(multiPointsPositions[i], multiPointsPositions[i - 1], p); float num2 = Vector3.Distance(a, p); if (num2 < 0.025f) { if (Vector3.Dot(multiPointsPositions[i] - multiPointsPositions[i - 1], base.transform.forward) > 0.98f) { num = i - 1; break; } if (Vector3.Dot(multiPointsPositions[i] - multiPointsPositions[(i + 1) % multiPointsPositions.Count], base.transform.forward) > 0.98f) { num = (i - 1) % multiPointsPositions.Count; break; } } } if (num > -1) { Vector3 a2 = multiPointsPositions[i] - multiPointsPositions[num]; float magnitude = Vector3.Scale(a2, new Vector3(1f, 0f, 1f)).magnitude; int num3 = Mathf.CeilToInt(magnitude / this._architect.MaxSegmentHorizontalLength); float d = magnitude / (float)num3; this._p2 = this._p1 + base.transform.forward * d; } } } if (this._p2 == Vector3.zero) { this._p2 = this._p1 + base.transform.forward * this._architect.MaxSegmentHorizontalLength * 0.95f; } } if (this._height == 0f) { this._height = 5f; } if (this._multiPointsPositions == null) { this._multiPointsPositions = new List <Vector3> { this._p1, this._p2 }; this._multiPointsPositionsCount = 2; } else if (this._multiPointsPositionsCount == 0) { this._multiPointsPositionsCount = this._multiPointsPositions.Skip(1).IndexOf(this._multiPointsPositions[0]); if (this._multiPointsPositionsCount < 0) { this._multiPointsPositionsCount = this._multiPointsPositions.Count; } else { this._multiPointsPositionsCount += 2; } } if (this._multiPointsPositions.Count > this._multiPointsPositionsCount) { this._multiPointsPositions.RemoveRange(this._multiPointsPositionsCount, this._multiPointsPositions.Count - this._multiPointsPositionsCount); } if (this._wasBuilt) { this.CreateStructure(false); this._wallRoot.transform.parent = base.transform; } else { this.CreateStructure(false); base.StartCoroutine(this.OnPlaced()); } } yield break; }