65 lines
2.4 KiB
C#
65 lines
2.4 KiB
C#
using UnityEngine;
|
|
using UnityEngine.Networking;
|
|
|
|
namespace RoR2;
|
|
|
|
[CreateAssetMenu(menuName = "RoR2/SpawnCards/InteractableSpawnCard")]
|
|
public class InteractableSpawnCard : SpawnCard
|
|
{
|
|
[Tooltip("Whether or not to orient the object to the normal of the ground it spawns on.")]
|
|
public bool orientToFloor;
|
|
|
|
[Tooltip("Slightly tweaks the rotation for things like chests and barrels so it looks more natural.")]
|
|
public bool slightlyRandomizeOrientation;
|
|
|
|
public bool skipSpawnWhenSacrificeArtifactEnabled;
|
|
|
|
[Tooltip("When Sacrifice is enabled, this is multiplied by the card's weight")]
|
|
public float weightScalarWhenSacrificeArtifactEnabled = 1f;
|
|
|
|
public bool skipSpawnWhenDevotionArtifactEnabled;
|
|
|
|
[Tooltip("Won't spawn more than this many per stage. If it's negative, there's no cap")]
|
|
public int maxSpawnsPerStage = -1;
|
|
|
|
[Range(0f, 1f)]
|
|
[SerializeField]
|
|
[Tooltip("When playing Primatic Trials, this interactable will have a required check to see if it is supposed to spawn. 0 is will not spawn, 1 will 100% spawn and will be default.")]
|
|
public float prismaticTrialSpawnChance = 1f;
|
|
|
|
private static readonly float floorOffset = 3f;
|
|
|
|
private static readonly float raycastLength = 6f;
|
|
|
|
private static readonly Xoroshiro128Plus rng = new Xoroshiro128Plus(0uL);
|
|
|
|
protected override void Spawn(Vector3 position, Quaternion rotation, DirectorSpawnRequest directorSpawnRequest, ref SpawnResult result)
|
|
{
|
|
ulong nextUlong = directorSpawnRequest.rng.nextUlong;
|
|
rng.ResetSeed(nextUlong);
|
|
if (skipSpawnWhenSacrificeArtifactEnabled && RunArtifactManager.instance.IsArtifactEnabled(RoR2Content.Artifacts.sacrificeArtifactDef))
|
|
{
|
|
return;
|
|
}
|
|
GameObject gameObject = Object.Instantiate(prefab, position, rotation);
|
|
Transform transform = gameObject.transform;
|
|
if (orientToFloor)
|
|
{
|
|
Vector3 up = gameObject.transform.up;
|
|
if (Physics.Raycast(new Ray(position + up * floorOffset, -up), out var hitInfo, raycastLength + floorOffset, LayerIndex.world.mask))
|
|
{
|
|
transform.up = hitInfo.normal;
|
|
}
|
|
}
|
|
transform.Rotate(Vector3.up, rng.RangeFloat(0f, 360f), Space.Self);
|
|
if (slightlyRandomizeOrientation)
|
|
{
|
|
transform.Translate(Vector3.down * 0.3f, Space.Self);
|
|
transform.rotation *= Quaternion.Euler(rng.RangeFloat(-30f, 30f), rng.RangeFloat(-30f, 30f), rng.RangeFloat(-30f, 30f));
|
|
}
|
|
NetworkServer.Spawn(gameObject);
|
|
result.spawnedInstance = gameObject;
|
|
result.success = true;
|
|
}
|
|
}
|