r2mods/ilspy_dump/ror2_csproj/RoR2/LayerIndex.cs

187 lines
5.1 KiB
C#

using UnityEngine;
namespace RoR2;
public struct LayerIndex
{
public static class CommonMasks
{
public static readonly LayerMask bullet = (int)world.mask | (int)entityPrecise.mask;
public static readonly LayerMask laser = (int)world.mask | (int)characterBodiesOrDefault | (int)entityPrecise.mask;
public static readonly LayerMask interactable = (int)defaultLayer.mask | (int)world.mask | (int)pickups.mask;
public static readonly LayerMask characterBodies = (int)playerBody.mask | (int)enemyBody.mask;
public static readonly LayerMask characterBodiesOrDefault = (int)defaultLayer.mask | (int)characterBodies;
public static readonly LayerMask fakeActorLayers = (int)fakeActor.mask | (int)playerFakeActor.mask;
}
public int intVal;
private static uint assignedLayerMask;
public static readonly LayerIndex invalidLayer;
public static readonly LayerIndex defaultLayer;
public static readonly LayerIndex transparentFX;
public static readonly LayerIndex ignoreRaycast;
public static readonly LayerIndex water;
public static readonly LayerIndex ui;
public static readonly LayerIndex fakeActor;
public static readonly LayerIndex playerFakeActor;
public static readonly LayerIndex noCollision;
public static readonly LayerIndex pickups;
public static readonly LayerIndex world;
public static readonly LayerIndex entityPrecise;
public static readonly LayerIndex debris;
public static readonly LayerIndex projectile;
public static readonly LayerIndex manualRender;
public static readonly LayerIndex collideWithCharacterHullOnly;
public static readonly LayerIndex ragdoll;
public static readonly LayerIndex noDraw;
public static readonly LayerIndex prefabBrush;
public static readonly LayerIndex postProcess;
public static readonly LayerIndex uiWorldSpace;
public static readonly LayerIndex projectileWorldOnly;
public static readonly string modderMessage;
public static readonly LayerIndex playerBody;
public static readonly LayerIndex enemyBody;
public static readonly LayerIndex triggerZone;
public static readonly LayerIndex enemyBarrier;
private static readonly LayerMask[] collisionMasks;
public LayerMask mask => (intVal >= 0) ? (1 << intVal) : intVal;
public LayerMask collisionMask => collisionMasks[intVal];
static LayerIndex()
{
assignedLayerMask = 0u;
invalidLayer = new LayerIndex
{
intVal = -1
};
defaultLayer = GetLayerIndex("Default");
transparentFX = GetLayerIndex("TransparentFX");
ignoreRaycast = GetLayerIndex("Ignore Raycast");
water = GetLayerIndex("Water");
ui = GetLayerIndex("UI");
fakeActor = GetLayerIndex("FakeActor");
playerFakeActor = GetLayerIndex("PlayerFakeActor");
noCollision = GetLayerIndex("NoCollision");
pickups = GetLayerIndex("Pickups");
world = GetLayerIndex("World");
entityPrecise = GetLayerIndex("EntityPrecise");
debris = GetLayerIndex("Debris");
projectile = GetLayerIndex("Projectile");
manualRender = GetLayerIndex("ManualRender");
collideWithCharacterHullOnly = GetLayerIndex("CollideWithCharacterHullOnly");
ragdoll = GetLayerIndex("Ragdoll");
noDraw = GetLayerIndex("NoDraw");
prefabBrush = GetLayerIndex("PrefabBrush");
postProcess = GetLayerIndex("PostProcess");
uiWorldSpace = GetLayerIndex("UI, WorldSpace");
projectileWorldOnly = GetLayerIndex("ProjectileWorldOnly");
modderMessage = "Layers below are used only by console versions.";
playerBody = GetLayerIndex("PlayerBody");
enemyBody = GetLayerIndex("EnemyBody");
triggerZone = GetLayerIndex("TriggerZone");
enemyBarrier = GetLayerIndex("EnemyBarrier");
collisionMasks = CalcCollisionMasks();
for (int i = 0; i < 32; i++)
{
string text = LayerMask.LayerToName(i);
if (text != "" && (assignedLayerMask & (uint)(1 << i)) == 0)
{
Debug.LogWarningFormat("Layer \"{0}\" is defined in this project's \"Tags and Layers\" settings but is not defined in LayerIndex!", text);
}
}
}
private static LayerIndex GetLayerIndex(string layerName)
{
LayerIndex layerIndex = default(LayerIndex);
layerIndex.intVal = LayerMask.NameToLayer(layerName);
LayerIndex result = layerIndex;
if (result.intVal == invalidLayer.intVal)
{
Debug.LogErrorFormat("Layer \"{0}\" is not defined in this project's \"Tags and Layers\" settings.", layerName);
}
else
{
assignedLayerMask |= (uint)(1 << result.intVal);
}
return result;
}
private static LayerMask[] CalcCollisionMasks()
{
LayerMask[] array = new LayerMask[32];
for (int i = 0; i < 32; i++)
{
LayerMask layerMask = default(LayerMask);
for (int j = 0; j < 32; j++)
{
if (!Physics.GetIgnoreLayerCollision(i, j))
{
layerMask = (int)layerMask | (1 << j);
}
}
array[i] = layerMask;
}
return array;
}
public static int GetAppropriateLayerForTeam(TeamIndex teamIndex)
{
switch (teamIndex)
{
case TeamIndex.Player:
return playerBody.intVal;
case TeamIndex.Monster:
case TeamIndex.Lunar:
return enemyBody.intVal;
default:
return defaultLayer.intVal;
}
}
public static LayerIndex GetAppropriateFakeLayerForTeam(TeamIndex teamIndex)
{
if (teamIndex == TeamIndex.Player)
{
return playerFakeActor;
}
return fakeActor;
}
}