r2mods/ilspy_dump/ror2_csproj/RoR2/InteractableSpawnCard.cs

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;
}
}