public void ClearSpaceMarking() { if (mCollisionMap == null) { return; } if (!useCollisionMap) { return; } mCollisionMap.RemoveMarking(uniqueCollisionIdentity); }
public override void Activate(GameObject caster) { base.Activate(caster); // Find a walkable tile nearby that is empty and move there immediately, then play an effect. CollisionMap collisionMap = GameObject.FindObjectOfType<CollisionMap>(); int x = Mathf.RoundToInt(Game.instance.avatar.transform.position.x); int y = Mathf.RoundToInt(Game.instance.avatar.transform.position.z); y = -y; List<Vector2Int> viablePositions = new List<Vector2Int>(); for (int xOffset = -13; xOffset <= 13; ++xOffset) { for (int yOffset = -13; yOffset <= 13; ++yOffset) { int testX = x + xOffset; int testY = y + yOffset; if (testX >= 0 && testY >= 0 && testX < collisionMap.width && testY < collisionMap.height && collisionMap.SpaceMarking(testX, testY) == 0) { viablePositions.Add(new Vector2Int(testX, testY)); } } } if (viablePositions.Count == 0) return; Vector2Int pos = viablePositions.Sample(); collisionMap.RemoveMarking(Game.instance.avatar.commonComponents.simpleMovement.uniqueCollisionIdentity); collisionMap.MarkSpace(pos.x, pos.y, Game.instance.avatar.GetComponent<SimpleMovement>().uniqueCollisionIdentity); Game.instance.avatar.transform.position = new Vector3(pos.x, 0, -pos.y); Game.instance.avatar.follower.transform.position = Game.instance.avatar.transform.position + new Vector3(-0.25f, 0f, 0.25f); GameObject effect = PrefabManager.instance.InstantiatePrefabByName("CFX2_WWExplosion_C"); effect.transform.position = Game.instance.avatar.transform.position; effect.AddComponent<DestroyAfterTimeElapsed>().time = 2f; Game.instance.soundManager.PlaySound("teleport"); }
private void TeleportIfPossible() { CollisionMap collisionMap = Game.instance.levelGenerator.collisionMap; List <Vector2Int> viablePositions = collisionMap.EmptyPositionsNearPosition(mTeleportTarget, 1); if (viablePositions.Count == 0) { return; } Vector2Int newTarget = viablePositions.Find(i => (i.x == mTeleportTarget.x && i.y == mTeleportTarget.y + 1)); if (newTarget.x != 0 || newTarget.y != 0) { mTeleportTarget = newTarget; } else { mTeleportTarget = viablePositions[0]; } Vector2Int currentPos = MapCoordinateHelper.WorldToMapCoords(transform.position); if (!collisionMap.RemoveMarking(commonComponents.simpleMovement.uniqueCollisionIdentity)) { Debug.LogError("CM error in PlayerController"); } collisionMap.MarkSpace(mTeleportTarget.x, mTeleportTarget.y, commonComponents.simpleMovement.uniqueCollisionIdentity); Game.instance.avatar.transform.position = MapCoordinateHelper.MapToWorldCoords(mTeleportTarget); Game.instance.avatar.follower.transform.position = Game.instance.avatar.transform.position + new Vector3(-0.25f, 0f, 0.25f); GameObject effect = PrefabManager.instance.InstantiatePrefabByName("CFX2_WWExplosion_C"); effect.transform.position = Game.instance.avatar.transform.position; effect.AddComponent <DestroyAfterTimeElapsed>().time = 2f; }
public void Teleport(bool playerCentric = false) { teleportTimer = teleportCooldown; CollisionMap collisionMap = GameObject.FindObjectOfType <CollisionMap>(); Vector2Int pos = MapCoordinateHelper.WorldToMapCoords(transform.position); if (playerCentric) { pos = MapCoordinateHelper.WorldToMapCoords(Game.instance.avatar.transform.position); } List <Vector2Int> viablePositions = new List <Vector2Int>(); for (int xOffset = -teleportMaxDistance; xOffset <= teleportMaxDistance; ++xOffset) { for (int yOffset = -teleportMaxDistance; yOffset <= teleportMaxDistance; ++yOffset) { if (playerCentric) { if (xOffset != 0 && yOffset != 0) { continue; } } int teleDist = Mathf.Abs(xOffset) + Mathf.Abs(yOffset); if (teleDist < teleportMinDistance || teleDist > teleportMaxDistance) { continue; } int testX = pos.x + xOffset; int testY = pos.y + yOffset; if (testX >= 0 && testY >= 0 && testX < collisionMap.width && testY < collisionMap.height && collisionMap.SpaceMarking(testX, testY) == 0) { viablePositions.Add(new Vector2Int(testX, testY)); } } } if (viablePositions.Count == 0) { return; } Vector2Int targetPos = viablePositions.Sample(); collisionMap.RemoveMarking(GetComponent <SimpleMovement>().uniqueCollisionIdentity); collisionMap.MarkSpace(targetPos.x, targetPos.y, GetComponent <SimpleMovement>().uniqueCollisionIdentity); Vector3 previousPosition = transform.position; transform.position = new Vector3(targetPos.x, 0, -targetPos.y); GameObject effect = PrefabManager.instance.InstantiatePrefabByName("CFX2_WWExplosion_C"); effect.transform.position = previousPosition; effect.AddComponent <DestroyAfterTimeElapsed>().time = 2f; effect.transform.localScale = Vector3.one * 0.75f; Speedup(effect); GameObject effect2 = PrefabManager.instance.InstantiatePrefabByName("CFX2_WWExplosion_C"); effect2.transform.position = transform.position; effect2.AddComponent <DestroyAfterTimeElapsed>().time = 2f; effect2.transform.localScale = Vector3.one * 0.75f; Speedup(effect2); Game.instance.soundManager.PlaySound("teleport"); }