187 lines
5.1 KiB
C#
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;
|
||
|
}
|
||
|
}
|